/* Bug 48699 - c/ODBC cuts BINARY parameter after encountering first 00 */ DECLARE_TEST(t_bug48699) { #define ROWS_TO_INSERT 3 typedef struct DataBinding { SQLCHAR bData[5]; } DATA_BINDING; SQLCHAR buff[50]; DATA_BINDING dataBinding[ROWS_TO_INSERT]; SQLUSMALLINT paramStatusArray[ROWS_TO_INSERT]; SQLLEN paramLengthPtr[ROWS_TO_INSERT]= {5, 5, 5}; SQLULEN paramsProcessed= 0; ok_stmt(hstmt, SQLExecDirect(hstmt, "DROP TABLE IF EXISTS bug48699", SQL_NTS)); ok_stmt(hstmt, SQLExecDirect(hstmt, "CREATE TABLE bug48699 (id int "\ "primary key auto_increment,"\ "bData binary(5) NULL)", SQL_NTS)); ok_stmt(hstmt, SQLSetStmtAttr(hstmt, SQL_ATTR_PARAM_BIND_TYPE, sizeof(DATA_BINDING), 0)); ok_stmt(hstmt, SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMSET_SIZE, ROWS_TO_INSERT, 0)); ok_stmt(hstmt, SQLSetStmtAttr(hstmt, SQL_ATTR_PARAM_STATUS_PTR, paramStatusArray, 0)); ok_stmt(hstmt, SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMS_PROCESSED_PTR, ¶msProcessed, 0)); ok_stmt(hstmt, SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_BINARY, sizeof(DATA_BINDING), 0, dataBinding[0].bData, 5, paramLengthPtr)); memcpy(dataBinding[0].bData, "\x01\x80\x00\x80\x00", 5); memcpy(dataBinding[1].bData, "\x02\x80\x00\x80\x00", 5); memcpy(dataBinding[2].bData, "\x03\x80\x00\x80\x00", 5); ok_stmt(hstmt, SQLExecDirect(hstmt, "INSERT INTO bug48699 (bData) " \ "VALUES (?)", SQL_NTS)); /* Paramset size must be set to 1 or all other queries will run severaltimes */ ok_stmt(hstmt, SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMSET_SIZE, 1, 0)); ok_stmt(hstmt, SQLExecDirect(hstmt, "SELECT hex(bData) FROM bug48699 ORDER BY ID", SQL_NTS)); ok_stmt(hstmt, SQLFetch(hstmt)); is_str(my_fetch_str(hstmt, buff, 1), "0180008000", 10); ok_stmt(hstmt, SQLFetch(hstmt)); is_str(my_fetch_str(hstmt, buff, 1), "0280008000", 10); ok_stmt(hstmt, SQLFetch(hstmt)); is_str(my_fetch_str(hstmt, buff, 1), "0380008000", 10); /* Clean-up */ ok_stmt(hstmt, SQLFreeStmt(hstmt, SQL_CLOSE)); ok_stmt(hstmt, SQLExecDirect(hstmt, "DROP TABLE IF EXISTS bug48699", SQL_NTS)); return OK; }