Description:
The code snippet below (the last function in a larger list) fails.
// set the statement parameters for row-wise binding
sql_retcode = SQLSetStmtAttr(sql_statement_handle,
SQL_ATTR_ROW_BIND_TYPE,
(SQLPOINTER)result_row_struct_size,
0);
When the function returns, sql_retcode is set to SQL_ERROR. No additional information is available from SQLGetDiagRec. This snippet works with ODBC connector v3.51.12.0. The ODBC trace follows:
tclsh85 14d4-13ec ENTER SQLAllocHandle
SQLSMALLINT 1 <SQL_HANDLE_ENV>
SQLHANDLE 00000000
SQLHANDLE * 0122DD68
tclsh85 14d4-13ec EXIT SQLAllocHandle with return code 0 (SQL_SU
CCESS)
SQLSMALLINT 1 <SQL_HANDLE_ENV>
SQLHANDLE 00000000
SQLHANDLE * 0x0122DD68 ( 0x01271788)
tclsh85 14d4-13ec ENTER SQLSetEnvAttr
SQLHENV 01271788
SQLINTEGER 200 <SQL_ATTR_ODBC_VERSION>
SQLPOINTER 0x00000003
SQLINTEGER 0
tclsh85 14d4-13ec EXIT SQLSetEnvAttr with return code 0 (SQL_SUC
CESS)
SQLHENV 01271788
SQLINTEGER 200 <SQL_ATTR_ODBC_VERSION>
SQLPOINTER 0x00000003 (BADMEM)
SQLINTEGER 0
tclsh85 14d4-13ec ENTER SQLAllocHandle
SQLSMALLINT 2 <SQL_HANDLE_DBC>
SQLHANDLE 01271788
SQLHANDLE * 0012F068
tclsh85 14d4-13ec EXIT SQLAllocHandle with return code 0 (SQL_SU
CCESS)
SQLSMALLINT 2 <SQL_HANDLE_DBC>
SQLHANDLE 01271788
SQLHANDLE * 0x0012F068 ( 0x01271830)
tclsh85 14d4-13ec ENTER SQLConnectW
HDBC 01271830
WCHAR * 0x01271938 [ -3] "cms_core_db_v5\ 0"
SWORD -3
WCHAR * 0x74329A38 [ -3] "******\ 0"
SWORD -3
WCHAR * 0x74329A38 [ -3] "******\ 0"
SWORD -3
tclsh85 14d4-13ec EXIT SQLConnectW with return code 0 (SQL_SUCCE
SS)
HDBC 01271830
WCHAR * 0x01271938 [ -3] "cms_core_db_v5\ 0"
SWORD -3
WCHAR * 0x74329A38 [ -3] "******\ 0"
SWORD -3
WCHAR * 0x74329A38 [ -3] "******\ 0"
SWORD -3
tclsh85 14d4-13ec ENTER SQLAllocHandle
SQLSMALLINT 3 <SQL_HANDLE_STMT>
SQLHANDLE 01271830
SQLHANDLE * 0012F05C
tclsh85 14d4-13ec EXIT SQLAllocHandle with return code 0 (SQL_SU
CCESS)
SQLSMALLINT 3 <SQL_HANDLE_STMT>
SQLHANDLE 01271830
SQLHANDLE * 0x0012F05C ( 0x01271e00)
tclsh85 14d4-13ec ENTER SQLBindParameter
HSTMT 01271E00
UWORD 1
SWORD 1 <SQL_PARAM_INPUT>
SWORD 1 <SQL_C_CHAR>
SWORD 12 <SQL_VARCHAR>
SQLULEN 45
SWORD 0
PTR 0x0012F090
SQLLEN 9
SQLLEN * 0x0012EFDC
tclsh85 14d4-13ec EXIT SQLBindParameter with return code 0 (SQL_
SUCCESS)
HSTMT 01271E00
UWORD 1
SWORD 1 <SQL_PARAM_INPUT>
SWORD 1 <SQL_C_CHAR>
SWORD 12 <SQL_VARCHAR>
SQLULEN 45
SWORD 0
PTR 0x0012F090
SQLLEN 9
SQLLEN * 0x0012EFDC (-3)
tclsh85 14d4-13ec ENTER SQLExecDirect
HSTMT 01271E00
UCHAR * 0x00FD52F8 [ -3] "SELECT `core_configur
ation`.`name`, `core_configuration`.`value` FROM `core_configuration` LEFT JOIN
(`managers`) ON (`managers`.`manager_id` = `core_configuration`.`manager_id`) WH
ERE `managers`.`name` = ?\ 0"
SDWORD -3
tclsh85 14d4-13ec EXIT SQLExecDirect with return code 0 (SQL_SUC
CESS)
HSTMT 01271E00
UCHAR * 0x00FD52F8 [ -3] "SELECT `core_configur
ation`.`name`, `core_configuration`.`value` FROM `core_configuration` LEFT JOIN
(`managers`) ON (`managers`.`manager_id` = `core_configuration`.`manager_id`) WH
ERE `managers`.`name` = ?\ 0"
SDWORD -3
tclsh85 14d4-13ec ENTER SQLSetStmtAttr
SQLHSTMT 01271E00
SQLINTEGER 5 <SQL_ATTR_ROW_BIND_TYPE>
SQLPOINTER 0x00000208
SQLINTEGER 0
tclsh85 14d4-13ec EXIT SQLSetStmtAttr with return code -1 (SQL_E
RROR)
SQLHSTMT 01271E00
SQLINTEGER 5 <SQL_ATTR_ROW_BIND_TYPE>
SQLPOINTER 0x00000208
SQLINTEGER 0
tclsh85 14d4-13ec ENTER SQLGetDiagRecW
SQLSMALLINT 3
SQLHANDLE 01271E00
SQLSMALLINT 1
SQLWCHAR * 0x0012EC50 (NYI)
SQLINTEGER * 0x0012EF80
SQLWCHAR * 0x012723B8 (NYI)
SQLSMALLINT 512
SQLSMALLINT * 0x0012ED68
tclsh85 14d4-13ec EXIT SQLGetDiagRecW with return code 100 (SQL_
NO_DATA_FOUND)
SQLSMALLINT 3
SQLHANDLE 01271E00
SQLSMALLINT 1
SQLWCHAR * 0x0012EC50 (NYI)
SQLINTEGER * 0x0012EF80
SQLWCHAR * 0x012723B8 (NYI)
SQLSMALLINT 512
SQLSMALLINT * 0x0012ED68
How to repeat:
Call SQLSetStmtAttr with a statement handle and SQL_ATTR_ROW_BIND_TYPE.
Suggested fix:
SQLSetStmtAttr should accept the SQL_ATTR_ROW_BIND_TYPE attribute and set the row binding type accordingly. Or, if this function is not supported, useful error information should be returned by SQLGetDiagRec.