Bug #23853 SQLGetDiagRec - Crashes application
Submitted: 1 Nov 2006 18:43 Modified: 2 Nov 2006 16:30
Reporter: Manoranjan Moorthy Email Updates:
Status: Not a Bug Impact on me:
None 
Category:Connector / ODBC Severity:S3 (Non-critical)
Version:3.51.12.00 OS:Windows (MS Windows 2000 -SP4)
Assigned to: CPU Architecture:Any

[1 Nov 2006 18:43] Manoranjan Moorthy
Description:
Environment is as follows.
1. MDAC version - 2.70.9001.0
2. MySQL server version - mysql  Ver 14.12 Distrib 5.0.24, for Win32 (ia32)
3. ODBC driver manager - version 3.520.9002.0

When MySQL server is not running and when I execute the 
following code, the application crashes after SQLGetDiagRec().

Follows is the output after execution. Please note that SQL STATE is
empty.

**********
SqlState-,NativeError=2003, Msg=[MySQL][ODBC 3.51 Driver]Can't connect to MySQL
server on 'localhost' (10061), MsgLen=77
**********

This works when compiled with ANSI version. (No unicode defined).

Also I am looking for information on how to get myodbc3d.dll to get
connector traces.

Your help is greatly appreciated.

-Mano

ODBC driver trace when fail happens.
====================================
MessageTester   16b4-16b0	ENTER SQLAllocHandle 
		SQLSMALLINT                  1 <SQL_HANDLE_ENV>
		SQLHANDLE           00000000
		SQLHANDLE *         0012FF28

MessageTester   16b4-16b0	EXIT  SQLAllocHandle  with return code 0 (SQL_SUCCESS)
		SQLSMALLINT                  1 <SQL_HANDLE_ENV>
		SQLHANDLE           00000000
		SQLHANDLE *         0x0012FF28 ( 0x00d11540)

MessageTester   16b4-16b0	ENTER SQLSetEnvAttr 
		SQLHENV             00D11540
		SQLINTEGER                 200 <SQL_ATTR_ODBC_VERSION>
		SQLPOINTER          0x00000003
		SQLINTEGER                   0 

MessageTester   16b4-16b0	EXIT  SQLSetEnvAttr  with return code 0 (SQL_SUCCESS)
		SQLHENV             00D11540
		SQLINTEGER                 200 <SQL_ATTR_ODBC_VERSION>
		SQLPOINTER          0x00000003 (BADMEM)
		SQLINTEGER                   0 

MessageTester   16b4-16b0	ENTER SQLAllocHandle 
		SQLSMALLINT                  2 <SQL_HANDLE_DBC>
		SQLHANDLE           00D11540
		SQLHANDLE *         0012FF24

MessageTester   16b4-16b0	EXIT  SQLAllocHandle  with return code 0 (SQL_SUCCESS)
		SQLSMALLINT                  2 <SQL_HANDLE_DBC>
		SQLHANDLE           00D11540
		SQLHANDLE *         0x0012FF24 ( 0x00d115e8)

MessageTester   16b4-16b0	ENTER SQLConnectW 
		HDBC                00D115E8
		WCHAR *             0x0042D038 [      -3] "MySqlODBC\ 0"
		SWORD                       -3 
		WCHAR *             0x0023592C [      -3] "******\ 0"
		SWORD                       -3 
		WCHAR *             0x0023592C [      -3] "******\ 0"
		SWORD                       -3 

MessageTester   16b4-16b0	EXIT  SQLConnectW  with return code -1 (SQL_ERROR)
		HDBC                00D115E8
		WCHAR *             0x0042D038 [      -3] "MySqlODBC\ 0"
		SWORD                       -3 
		WCHAR *             0x0023592C [      -3] "******\ 0"
		SWORD                       -3 
		WCHAR *             0x0023592C [      -3] "******\ 0"
		SWORD                       -3 

		DIAG [HYT00] [MySQL][ODBC 3.51 Driver]Can't connect to MySQL server on 'localhost' (10061) (2003) 

MessageTester   16b4-16b0	ENTER SQLGetDiagRecW 
		SQLSMALLINT                  2 
		SQLHANDLE           00D115E8
		SQLSMALLINT                  1 
		SQLWCHAR *          0x0012F688 (NYI) 
 		SQLINTEGER *        0x0012F284
		SQLWCHAR *          0x0012F288 (NYI) 
 		SQLSMALLINT               1024 
		SQLSMALLINT *       0x0012F27C

MessageTester   16b4-16b0	EXIT  SQLGetDiagRecW  with return code 0 (SQL_SUCCESS)
		SQLSMALLINT                  2 
		SQLHANDLE           00D115E8
		SQLSMALLINT                  1 
		SQLWCHAR *          0x0012F688 (NYI) 
 		SQLINTEGER *        0x0012F284 (2003)
		SQLWCHAR *          0x0012F288 (NYI) 
 		SQLSMALLINT               1024 
		SQLSMALLINT *       0x0012F27C (77)

 

How to repeat:
- Do not start MySQL server.

Follows is the test code snippet I used.

void test_proc()
{
SQLHENV env_hdl;
SQLHDBC conn_hdl;
SQLHSTMT stmt_hdl;
SQLRETURN sql_rc;

TCHAR *szServerName = L"MySqlODBC";
TCHAR *szUserName = L"root";
TCHAR *szPassword = L"test";
TCHAR szStatement[1024];

//allocate handles for env, conn and statement
sql_rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env_hdl);
sql_rc = SQLSetEnvAttr(env_hdl, SQL_ATTR_ODBC_VERSION, (void*) SQL_OV_ODBC3, 0);
sql_rc = SQLAllocHandle(SQL_HANDLE_DBC, env_hdl, &conn_hdl);
		
sql_rc = SQLConnect(conn_hdl, (SQLTCHAR *)szServerName, SQL_NTSL,
			  (SQLTCHAR *)szUserName, SQL_NTSL,
			  (SQLTCHAR *)szPassword, SQL_NTSL);

if( sql_rc != SQL_SUCCESS )
{
  ProcessError(SQL_HANDLE_DBC,conn_hdl);	
}

sql_rc = SQLFreeHandle (SQL_HANDLE_STMT, stmt_hdl);
sql_rc = SQLDisconnect(conn_hdl);	
sql_rc = SQLFreeHandle (SQL_HANDLE_DBC, conn_hdl);
sql_rc = SQLFreeHandle (SQL_HANDLE_ENV, env_hdl);

}

void ProcessError(SQLSMALLINT     handleType,
     SQLHANDLE     hndl)
{
   SQLTCHAR       SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
   SQLINTEGER    NativeError;
   SQLSMALLINT   i, MsgLen;
   SQLRETURN     rc;
   	
   rc = SQLGetDiagRec(handleType, hndl, 1, SqlState, &NativeError,
			Msg, sizeof(Msg), &MsgLen);
	
  _tprintf(L"SqlState-%s,NativeError=%d, Msg=%s, MsgLen=%d\n",						SqlState,NativeError,Msg,MsgLen);
}
[1 Nov 2006 18:45] Manoranjan Moorthy
odbc driver trace

Attachment: odbc_tosend.log (application/octet-stream, text), 2.74 KiB.

[2 Nov 2006 16:30] Tonci Grgin
Hi Manoranjan and thanks for your report. We have two problems here.

1) Application crash: Please remove sql_rc = SQLFreeHandle (SQL_HANDLE_STMT, stmt_hdl); line since you didn't allocate any statements.
2) Using UNICODE DSN on Windows with SQLConnect() doesn't work! We tried several drivers, none connects (even MS ones). However, on Linux, using unixODBC, everything works. So this is the problem of Win DM. As a workaround, you should use SQLConnectW() function and all will work.