Skip to content

Commit

Permalink
Fix of few tests in blob.c and bulk.c
Browse files Browse the repository at this point in the history
For some reason iOdbc on OSX maps SQLBindParameter to SQLBindParam,
while would be natural to do the other way around(and that's what I see
in their source, actually). Thus need to pass buffer length in length
pointer
  • Loading branch information
lawrinn committed Jan 23, 2019
1 parent 45e4669 commit 6dd7bc4
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 60 deletions.
109 changes: 50 additions & 59 deletions test/blob.c
Expand Up @@ -595,82 +595,73 @@ ODBC_TEST(t_text_fetch)
{
SQLRETURN rc;
SQLINTEGER i;
SQLLEN row_count, length;
SQLLEN row_count, length, ParamLength[]= {255, TEST_ODBC_TEXT_LEN/2, TEST_ODBC_TEXT_LEN/1.5, TEST_ODBC_TEXT_LEN-1};
SQLCHAR data[TEST_ODBC_TEXT_LEN+1];

OK_SIMPLE_STMT(Stmt, "DROP TABLE IF EXISTS t_text_fetch");
OK_SIMPLE_STMT(Stmt, "CREATE TABLE t_text_fetch(t1 tinytext,"
"t2 text, t3 mediumtext, t4 longtext)");
"t2 text, t3 mediumtext, t4 longtext)");

CHECK_STMT_RC(Stmt,
SQLPrepare(Stmt,
(SQLCHAR *)"insert into t_text_fetch values(?,?,?,?)",
SQL_NTS));
CHECK_STMT_RC(Stmt,
SQLPrepare(Stmt,
(SQLCHAR *)"insert into t_text_fetch values(?,?,?,?)",
SQL_NTS));

rc = SQLBindParameter(Stmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,
0,0,(char *)data, 255, NULL);
CHECK_STMT_RC(Stmt, rc);
CHECK_STMT_RC(Stmt, SQLBindParameter(Stmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 0, 0, (char *)data, 255, iOdbc() ? &ParamLength[0] : NULL));

rc = SQLBindParameter(Stmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,
0,0,(char *)data, TEST_ODBC_TEXT_LEN/2, NULL);
CHECK_STMT_RC(Stmt, rc);
CHECK_STMT_RC(Stmt, SQLBindParameter(Stmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 0, 0, (char *)data, TEST_ODBC_TEXT_LEN/2, iOdbc() ? &ParamLength[1] : NULL));

CHECK_STMT_RC(Stmt, SQLBindParameter(Stmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 0, 0, (char *)data, (SQLINTEGER)(TEST_ODBC_TEXT_LEN/1.5), iOdbc() ? &ParamLength[2] : NULL));

CHECK_STMT_RC(Stmt, SQLBindParameter(Stmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 0, 0, (char *)data, TEST_ODBC_TEXT_LEN-1, iOdbc() ? &ParamLength[3] : NULL));

rc = SQLBindParameter(Stmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,
0,0,(char *)data,
(SQLINTEGER)(TEST_ODBC_TEXT_LEN/1.5), NULL);
CHECK_STMT_RC(Stmt, rc);
memset(data,'A',TEST_ODBC_TEXT_LEN);
data[TEST_ODBC_TEXT_LEN]='\0';

rc = SQLBindParameter(Stmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,
0,0,(char *)data, TEST_ODBC_TEXT_LEN-1, NULL);
for (i=0; i < 10; i++)
{
rc = SQLExecute(Stmt);
CHECK_STMT_RC(Stmt, rc);
}

memset(data,'A',TEST_ODBC_TEXT_LEN);
data[TEST_ODBC_TEXT_LEN]='\0';
SQLFreeStmt(Stmt, SQL_RESET_PARAMS);
SQLFreeStmt(Stmt, SQL_CLOSE);

for (i=0; i < 10; i++)
{
rc = SQLExecute(Stmt);
OK_SIMPLE_STMT(Stmt, "SELECT * FROM t_text_fetch");

row_count= 0;
rc = SQLFetch(Stmt);
while (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{
printf("# row '%ld' (lengths:", row_count);
rc = SQLGetData(Stmt,1,SQL_C_CHAR,(char *)data,TEST_ODBC_TEXT_LEN,&length);
CHECK_STMT_RC(Stmt, rc);
}
printf("%ld", length);
FAIL_IF(length != 255, "assert");

SQLFreeStmt(Stmt, SQL_RESET_PARAMS);
SQLFreeStmt(Stmt, SQL_CLOSE);
rc = SQLGetData(Stmt,2,SQL_C_CHAR,(char *)data,TEST_ODBC_TEXT_LEN,&length);
CHECK_STMT_RC(Stmt, rc);
printf(",%ld", length);
FAIL_IF(length != TEST_ODBC_TEXT_LEN/2, "assert");

OK_SIMPLE_STMT(Stmt, "SELECT * FROM t_text_fetch");
rc = SQLGetData(Stmt,3,SQL_C_CHAR,(char *)data,TEST_ODBC_TEXT_LEN,&length);
CHECK_STMT_RC(Stmt, rc);
printf(",%ld", length);
FAIL_IF(length != (SQLINTEGER)(TEST_ODBC_TEXT_LEN/1.5), "assert");

row_count= 0;
rc = SQLFetch(Stmt);
while (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{
printf("# row '%ld' (lengths:", row_count);
rc = SQLGetData(Stmt,1,SQL_C_CHAR,(char *)data,TEST_ODBC_TEXT_LEN,&length);
CHECK_STMT_RC(Stmt, rc);
printf("%ld", length);
FAIL_IF(length != 255, "assert");

rc = SQLGetData(Stmt,2,SQL_C_CHAR,(char *)data,TEST_ODBC_TEXT_LEN,&length);
CHECK_STMT_RC(Stmt, rc);
printf(",%ld", length);
FAIL_IF(length != TEST_ODBC_TEXT_LEN/2, "assert");

rc = SQLGetData(Stmt,3,SQL_C_CHAR,(char *)data,TEST_ODBC_TEXT_LEN,&length);
CHECK_STMT_RC(Stmt, rc);
printf(",%ld", length);
FAIL_IF(length != (SQLINTEGER)(TEST_ODBC_TEXT_LEN/1.5), "assert");

rc = SQLGetData(Stmt,4,SQL_C_CHAR,(char *)data,TEST_ODBC_TEXT_LEN,&length);
CHECK_STMT_RC(Stmt, rc);
printf(",%ld)\n", length);
FAIL_IF(length != TEST_ODBC_TEXT_LEN-1, "assert");
row_count++;

rc = SQLFetch(Stmt);
}
diag("total rows: %ld", row_count);
FAIL_IF(row_count != i, "assert");
rc = SQLGetData(Stmt,4,SQL_C_CHAR,(char *)data,TEST_ODBC_TEXT_LEN,&length);
CHECK_STMT_RC(Stmt, rc);
printf(",%ld)\n", length);
FAIL_IF(length != TEST_ODBC_TEXT_LEN-1, "assert");
row_count++;

SQLFreeStmt(Stmt, SQL_UNBIND);
SQLFreeStmt(Stmt, SQL_CLOSE);
rc = SQLFetch(Stmt);
}
diag("total rows: %ld", row_count);
FAIL_IF(row_count != i, "assert");

SQLFreeStmt(Stmt, SQL_UNBIND);
SQLFreeStmt(Stmt, SQL_CLOSE);

OK_SIMPLE_STMT(Stmt, "DROP TABLE t_text_fetch");

Expand Down
9 changes: 8 additions & 1 deletion test/bulk.c
Expand Up @@ -533,7 +533,10 @@ ODBC_TEST(t_bulk_delete)
CHECK_STMT_RC(Stmt, SQLSetStmtAttr(Stmt, SQL_ATTR_PARAMSET_SIZE,
(SQLPOINTER)3, 0));
CHECK_STMT_RC(Stmt, SQLBindParameter(Stmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, a, 0, id_ind));
CHECK_STMT_RC(Stmt, SQLBindParameter(Stmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, insert_val, 7, val_indicator));
CHECK_STMT_RC(Stmt, SQLBindParameter(Stmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, insert_val, sizeof(insert_val[0]), val_indicator));

/* Needed for crazy iODBC on OS X */
is_num(iOdbcSetParamBufferSize(Stmt, 2, sizeof(insert_val[0])), OK);

OK_SIMPLE_STMT(Stmt, "INSERT INTO t_bulk_delete VALUES(?, ?)");

Expand Down Expand Up @@ -586,6 +589,10 @@ ODBC_TEST(t_odbc149)
CHECK_STMT_RC(Stmt, SQLBindParameter(Stmt, 4, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_BINARY, 0, 0, b, sizeof(b[0]), bLen));
CHECK_STMT_RC(Stmt, SQLBindParameter(Stmt, 5, SQL_PARAM_INPUT, SQL_C_WCHAR, SQL_WCHAR, 0, 0, w, sizeof(w[0]), cInd));

is_num(iOdbcSetParamBufferSize(Stmt, 3, sizeof(c[0])), OK);
is_num(iOdbcSetParamBufferSize(Stmt, 4, sizeof(b[0])), OK);
is_num(iOdbcSetParamBufferSize(Stmt, 5, sizeof(w[0])), OK);

memset(Val, 0, sizeof(Val));
Val[0].year= 2017;
Val[0].month= 6;
Expand Down
15 changes: 15 additions & 0 deletions test/tap.h
Expand Up @@ -1309,4 +1309,19 @@ int GetDefaultCharType(int WType, BOOL isAnsiConnection)

return WType;
}

/* Needed for crazy iODBC on OS X */
int iOdbcSetParamBufferSize(SQLHSTMT hStmt, SQLUSMALLINT ParamIdx, SQLLEN BufferSize)
{
#ifdef __APPLE__
if (iOdbc())
{
SQLHDESC Apd;

CHECK_STMT_RC(hStmt, SQLGetStmtAttr(hStmt, SQL_ATTR_APP_PARAM_DESC, &Apd, SQL_IS_POINTER, NULL));
CHECK_DESC_RC(Apd, SQLSetDescField(Apd, ParamIdx, SQL_DESC_OCTET_LENGTH, (SQLPOINTER)BufferSize, SQL_IS_INTEGER));
}
#endif
return OK;
}
#endif /* #ifndef _tap_h_ */

0 comments on commit 6dd7bc4

Please sign in to comment.