Skip to content

Commit

Permalink
[ODBC-56]Fix of wrong calculation of StLen ptr in case of columnwise …
Browse files Browse the repository at this point in the history
…binding.

Change in 2 tests in relative and in dyn_cursor to cover this case.
Also similar bugs was fixed in other places, mostly affecting all sorts
of position commands
  • Loading branch information
lawrinn committed Sep 27, 2016
1 parent d55d432 commit 1889f32
Show file tree
Hide file tree
Showing 6 changed files with 468 additions and 468 deletions.
12 changes: 7 additions & 5 deletions ma_statement.c
Original file line number Diff line number Diff line change
Expand Up @@ -800,7 +800,7 @@ SQLRETURN MADB_GetOutParams(MADB_Stmt *Stmt, int CurrentOffset)
ApdRecord= MADB_DescGetInternalRecord(Stmt->Apd, i, MADB_DESC_READ);
Bind[ParameterNr].buffer= GetBindOffset(Stmt->Apd, ApdRecord, ApdRecord->DataPtr, CurrentOffset, ApdRecord->OctetLength);
if (ApdRecord->OctetLengthPtr)
Bind[ParameterNr].length= (ulong *)GetBindOffset(Stmt->Apd, ApdRecord, ApdRecord->OctetLengthPtr, CurrentOffset, ApdRecord->OctetLength);
Bind[ParameterNr].length= (ulong *)GetBindOffset(Stmt->Apd, ApdRecord, ApdRecord->OctetLengthPtr, CurrentOffset, sizeof(SQLLEN));
Bind[ParameterNr].buffer_length= (unsigned long)ApdRecord->OctetLength;
Bind[ParameterNr].buffer_type= Stmt->stmt->params[i].buffer_type;
ParameterNr++;
Expand Down Expand Up @@ -1649,7 +1649,7 @@ SQLRETURN MADB_FixFetchedValues(MADB_Stmt *Stmt, int RowNumber, MYSQL_ROWS *Save
if ((ArdRec= MADB_DescGetInternalRecord(Stmt->Ard, i, MADB_DESC_READ)) && ArdRec->inUse)
{
/* set indicator and dataptr */
IndicatorPtr= (SQLLEN *)GetBindOffset(Stmt->Ard, ArdRec, ArdRec->OctetLengthPtr, RowNumber, ArdRec->OctetLength);
IndicatorPtr= (SQLLEN *)GetBindOffset(Stmt->Ard, ArdRec, ArdRec->OctetLengthPtr, RowNumber, sizeof(SQLLEN));
DataPtr= (SQLLEN *)GetBindOffset(Stmt->Ard, ArdRec, ArdRec->DataPtr, RowNumber, ArdRec->OctetLength);

/* clear IndicatorPtr */
Expand Down Expand Up @@ -3818,7 +3818,8 @@ SQLRETURN MADB_StmtSetPos(MADB_Stmt *Stmt, SQLSETPOSIROW RowNumber, SQLUSMALLINT
{
MADB_DescRecord *Rec= MADB_DescGetInternalRecord(Stmt->Ard, column, MADB_DESC_READ),
*ApdRec= NULL;
SQLLEN *IndicatorPtr= (SQLLEN *)GetBindOffset(Stmt->Ard, Rec, Rec->IndicatorPtr, MAX(0, Stmt->DaeRowNumber-1), Rec->OctetLength);
SQLLEN *IndicatorPtr= (SQLLEN *)GetBindOffset(Stmt->Ard, Rec, Rec->IndicatorPtr,
Stmt->DaeRowNumber > 1 ?Stmt->DaeRowNumber - 1 : 0, sizeof(SQLLEN)/*Rec->OctetLength*/);

ApdRec= MADB_DescGetInternalRecord(Stmt->DaeStmt->Apd, param, MADB_DESC_READ);
ApdRec->DefaultValue= MADB_GetDefaultColumnValue(Stmt->DaeStmt->DefaultsResult,
Expand Down Expand Up @@ -3927,7 +3928,7 @@ SQLRETURN MADB_StmtSetPos(MADB_Stmt *Stmt, SQLSETPOSIROW RowNumber, SQLUSMALLINT

/* TODO: shouldn't here be IndicatorPtr? */
if (Rec->OctetLengthPtr)
LengthPtr= GetBindOffset(Stmt->Ard, Rec, Rec->OctetLengthPtr, Stmt->DaeRowNumber - 1, Rec->OctetLength);
LengthPtr= GetBindOffset(Stmt->Ard, Rec, Rec->OctetLengthPtr, Stmt->DaeRowNumber > 1 ? Stmt->DaeRowNumber - 1 : 0, sizeof(SQLLEN)/*Rec->OctetLength*/);
if (!Rec->inUse ||
(LengthPtr && *LengthPtr == SQL_COLUMN_IGNORE))
{
Expand Down Expand Up @@ -3958,7 +3959,8 @@ SQLRETURN MADB_StmtSetPos(MADB_Stmt *Stmt, SQLSETPOSIROW RowNumber, SQLUSMALLINT
if (!GetDefault)
{
Stmt->DaeStmt->Methods->BindParam(Stmt->DaeStmt, param + 1, SQL_PARAM_INPUT, Rec->ConciseType, Rec->Type, Rec->DisplaySize, Rec->Scale,
GetBindOffset(Stmt->Ard, Rec, Rec->DataPtr, Stmt->DaeRowNumber - 1, Rec->OctetLength), Rec->OctetLength, LengthPtr);
GetBindOffset(Stmt->Ard, Rec, Rec->DataPtr, Stmt->DaeRowNumber > 1 ? Stmt->DaeRowNumber -1 : 0, Rec->OctetLength),
Rec->OctetLength, LengthPtr);
}
if (PARAM_IS_DAE(LengthPtr) && !DAE_DONE(Stmt->DaeStmt))
{
Expand Down
6 changes: 4 additions & 2 deletions ma_string.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,8 @@ my_bool MADB_DynStrUpdateSet(MADB_Stmt *Stmt, DYNAMIC_STRING *DynString)
SQLLEN *IndicatorPtr= NULL;
Record= MADB_DescGetInternalRecord(Stmt->Ard, i, MADB_DESC_READ);
if (Record->IndicatorPtr)
IndicatorPtr= (SQLLEN *)GetBindOffset(Stmt->Ard, Record, Record->IndicatorPtr, MAX(0, Stmt->DaeRowNumber-1), Record->OctetLength);
IndicatorPtr= (SQLLEN *)GetBindOffset(Stmt->Ard, Record, Record->IndicatorPtr, Stmt->DaeRowNumber > 1 ? Stmt->DaeRowNumber-1 : 0,
sizeof(SQLLEN)/*Record->OctetLength*/);
if ((IndicatorPtr && *IndicatorPtr == SQL_COLUMN_IGNORE) || !Record->inUse)
{
IgnoredColumns++;
Expand Down Expand Up @@ -149,7 +150,8 @@ my_bool MADB_DynStrInsertSet(MADB_Stmt *Stmt, DYNAMIC_STRING *DynString)
SQLINTEGER *IndicatorPtr= NULL;
Record= MADB_DescGetInternalRecord(Stmt->Ard, i, MADB_DESC_READ);
if (Record->IndicatorPtr)
IndicatorPtr= (SQLINTEGER *)GetBindOffset(Stmt->Ard, Record, Record->IndicatorPtr, MAX(0, Stmt->DaeRowNumber-1), Record->OctetLength);
IndicatorPtr= (SQLINTEGER *)GetBindOffset(Stmt->Ard, Record, Record->IndicatorPtr, Stmt->DaeRowNumber > 1 ? Stmt->DaeRowNumber - 1 : 0,
sizeof(SQLLEN)/*Record->OctetLength*/);

/* We prepare query only once, different paramsets may have different SQL_COLUMN_IGNORE */
/*if (IndicatorPtr && *IndicatorPtr == SQL_COLUMN_IGNORE)
Expand Down
1 change: 1 addition & 0 deletions test/bulk.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ ODBC_TEST(t_bulk_insert_nts)
return OK;
}

/* TODO: As of now this test is useless */
ODBC_TEST(t_bulk_insert_test)
{
char a[2][30]= {"Name 1", "Name 23"};
Expand Down
5 changes: 3 additions & 2 deletions test/cursor.c
Original file line number Diff line number Diff line change
Expand Up @@ -3107,8 +3107,9 @@ ODBC_TEST(t_dae_setpos_insert)
{
SQLPOINTER holder= (SQLPOINTER) 0xcfcdcecc;
SQLPOINTER paramptr;
SQLLEN offset= 0;
t_dae_row data[2];
SQLLEN offset= 0;
t_dae_row data[2];

memset(data, 0, 2 * sizeof(t_dae_row));
data[1].x= 20;
data[1].z= 40;
Expand Down
120 changes: 64 additions & 56 deletions test/dyn_cursor.c
Original file line number Diff line number Diff line change
Expand Up @@ -427,6 +427,14 @@ ODBC_TEST(my_position1)

CHECK_STMT_RC(Stmt, SQLFetchScroll(Stmt, SQL_FETCH_ABSOLUTE, 4));

/* Small piece to test ODBC-56 */
is_num(nlen[0], 6);
is_num(nlen[1], 6);
is_num(nlen[2], 6);
is_num(nrow[0], nrow[1]);
is_num(nrow[0], nrow[2]);
is_num(nrow[2], sizeof(SQLINTEGER));

nData[0]= 888;
nData[1]= 999;
nrow[1]= SQL_COLUMN_IGNORE;
Expand Down Expand Up @@ -555,74 +563,74 @@ ODBC_TEST(my_zero_irow_update)
/* IROW VALUE - 0 - DELETE */
ODBC_TEST(my_zero_irow_delete)
{
SQLRETURN rc;
SQLLEN nlen[15]= {0}, nrow[15]= {0};
char szData[15][15]={0};
SQLINTEGER nData[15];
SQLRETURN rc;
SQLLEN nlen[15]= {0}, nrow[15]= {0};
char szData[15][15]={0};
SQLINTEGER nData[15];

OK_SIMPLE_STMT(Stmt, "drop table if exists my_zero_irow");
OK_SIMPLE_STMT(Stmt, "create table my_zero_irow(col1 int, col2 varchar(30))");
OK_SIMPLE_STMT(Stmt, "insert into my_zero_irow values(1,'MySQL1')");
OK_SIMPLE_STMT(Stmt, "insert into my_zero_irow values(2,'MySQL2')");
OK_SIMPLE_STMT(Stmt, "insert into my_zero_irow values(3,'MySQL3')");
OK_SIMPLE_STMT(Stmt, "insert into my_zero_irow values(4,'MySQL4')");
OK_SIMPLE_STMT(Stmt, "insert into my_zero_irow values(5,'MySQL5')");
OK_SIMPLE_STMT(Stmt, "insert into my_zero_irow values(6,'MySQL6')");
OK_SIMPLE_STMT(Stmt, "drop table if exists my_zero_irow");
OK_SIMPLE_STMT(Stmt, "create table my_zero_irow(col1 int, col2 varchar(30))");
OK_SIMPLE_STMT(Stmt, "insert into my_zero_irow values(1,'MySQL1')");
OK_SIMPLE_STMT(Stmt, "insert into my_zero_irow values(2,'MySQL2')");
OK_SIMPLE_STMT(Stmt, "insert into my_zero_irow values(3,'MySQL3')");
OK_SIMPLE_STMT(Stmt, "insert into my_zero_irow values(4,'MySQL4')");
OK_SIMPLE_STMT(Stmt, "insert into my_zero_irow values(5,'MySQL5')");
OK_SIMPLE_STMT(Stmt, "insert into my_zero_irow values(6,'MySQL6')");


rc = SQLFreeStmt(Stmt,SQL_CLOSE);
CHECK_STMT_RC(Stmt,rc);
rc = SQLFreeStmt(Stmt,SQL_CLOSE);
CHECK_STMT_RC(Stmt,rc);

rc = SQLSetStmtAttr(Stmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_DYNAMIC, 0);
CHECK_STMT_RC(Stmt, rc);
rc = SQLSetStmtAttr(Stmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_DYNAMIC, 0);
CHECK_STMT_RC(Stmt, rc);

rc = SQLSetStmtAttr(Stmt, SQL_ATTR_CONCURRENCY ,(SQLPOINTER)SQL_CONCUR_ROWVER , 0);
CHECK_STMT_RC(Stmt, rc);
rc = SQLSetStmtAttr(Stmt, SQL_ATTR_CONCURRENCY ,(SQLPOINTER)SQL_CONCUR_ROWVER , 0);
CHECK_STMT_RC(Stmt, rc);

rc = SQLSetStmtAttr(Stmt, SQL_ATTR_ROW_ARRAY_SIZE ,(SQLPOINTER)3 , 0);
CHECK_STMT_RC(Stmt, rc);
rc = SQLSetStmtAttr(Stmt, SQL_ATTR_ROW_ARRAY_SIZE ,(SQLPOINTER)3 , 0);
CHECK_STMT_RC(Stmt, rc);

OK_SIMPLE_STMT(Stmt,"select * from my_zero_irow");
CHECK_STMT_RC(Stmt,rc);
OK_SIMPLE_STMT(Stmt,"select * from my_zero_irow");
CHECK_STMT_RC(Stmt,rc);

rc = SQLBindCol(Stmt,1,SQL_C_LONG,&nData,0,nrow);
CHECK_STMT_RC(Stmt,rc);
rc = SQLBindCol(Stmt,1,SQL_C_LONG,&nData,0,nrow);
CHECK_STMT_RC(Stmt,rc);

rc = SQLBindCol(Stmt,2,SQL_C_CHAR,szData,sizeof(szData[0]),nlen);
CHECK_STMT_RC(Stmt,rc);
rc = SQLBindCol(Stmt,2,SQL_C_CHAR,szData,sizeof(szData[0]),nlen);
CHECK_STMT_RC(Stmt,rc);

rc = SQLFetchScroll(Stmt,SQL_FETCH_ABSOLUTE,2);
CHECK_STMT_RC(Stmt,rc);
rc = SQLFetchScroll(Stmt,SQL_FETCH_ABSOLUTE,2);
CHECK_STMT_RC(Stmt,rc);

rc = SQLSetPos(Stmt,0,SQL_DELETE,SQL_LOCK_NO_CHANGE);
CHECK_STMT_RC(Stmt,rc);
rc = SQLSetPos(Stmt,0,SQL_DELETE,SQL_LOCK_NO_CHANGE);
CHECK_STMT_RC(Stmt,rc);

rc = SQLFreeStmt(Stmt,SQL_CLOSE);
CHECK_STMT_RC(Stmt,rc);
rc = SQLFreeStmt(Stmt,SQL_CLOSE);
CHECK_STMT_RC(Stmt,rc);

OK_SIMPLE_STMT(Stmt, "select * from my_zero_irow");
OK_SIMPLE_STMT(Stmt, "select * from my_zero_irow");

rc = SQLFetchScroll(Stmt,SQL_FETCH_ABSOLUTE,1);
CHECK_STMT_RC(Stmt,rc);
rc = SQLFetchScroll(Stmt,SQL_FETCH_ABSOLUTE,1);
CHECK_STMT_RC(Stmt,rc);

is_num(nData[0], 1);
IS_STR(szData[0], "MySQL1", 7);
is_num(nData[1], 5);
IS_STR(szData[1], "MySQL5", 7);
is_num(nData[2], 6);
IS_STR(szData[2], "MySQL6", 7);
is_num(nData[0], 1);
IS_STR(szData[0], "MySQL1", 7);
is_num(nData[1], 5);
IS_STR(szData[1], "MySQL5", 7);
is_num(nData[2], 6);
IS_STR(szData[2], "MySQL6", 7);

rc = SQLFetchScroll(Stmt,SQL_FETCH_NEXT,1);
FAIL_IF(rc!=SQL_NO_DATA_FOUND, "no data found expected");
rc = SQLFetchScroll(Stmt,SQL_FETCH_NEXT,1);
FAIL_IF(rc!=SQL_NO_DATA_FOUND, "no data found expected");

rc = SQLFreeStmt(Stmt,SQL_UNBIND);
CHECK_STMT_RC(Stmt,rc);
rc = SQLFreeStmt(Stmt,SQL_UNBIND);
CHECK_STMT_RC(Stmt,rc);

rc = SQLFreeStmt(Stmt,SQL_CLOSE);
CHECK_STMT_RC(Stmt,rc);
rc = SQLFreeStmt(Stmt,SQL_CLOSE);
CHECK_STMT_RC(Stmt,rc);

rc = SQLSetStmtAttr(Stmt, SQL_ATTR_ROW_ARRAY_SIZE ,(SQLPOINTER)1 , 0);
CHECK_STMT_RC(Stmt, rc);
rc = SQLSetStmtAttr(Stmt, SQL_ATTR_ROW_ARRAY_SIZE ,(SQLPOINTER)1 , 0);
CHECK_STMT_RC(Stmt, rc);

OK_SIMPLE_STMT(Stmt, "DROP TABLE IF EXISTS my_zero_irow");

Expand Down Expand Up @@ -724,13 +732,13 @@ ODBC_TEST(my_dynamic_cursor)

MA_ODBC_TESTS my_tests[]=
{
{my_dynamic_pos_cursor, "my_dynamic_pos_cursor", NORMAL},
{my_dynamic_pos_cursor1, "my_dynamic_pos_cursor1", NORMAL},
{my_position, "my_position", NORMAL},
{my_position1, "my_position1", KNOWN_FAILURE},
{my_zero_irow_update, "my_zero_irow_update", KNOWN_FAILURE},
{my_zero_irow_delete, "my_zero_irow_delete", NORMAL},
{my_dynamic_cursor, "my_dynamic_cursor", NORMAL},
{my_dynamic_pos_cursor, "my_dynamic_pos_cursor", NORMAL},
{my_dynamic_pos_cursor1, "my_dynamic_pos_cursor1", NORMAL},
{my_position, "my_position", NORMAL},
{ my_position1, "my_position1", NORMAL },
{ my_zero_irow_update, "my_zero_irow_update", NORMAL },
{my_zero_irow_delete, "my_zero_irow_delete", NORMAL},
{my_dynamic_cursor, "my_dynamic_cursor", NORMAL},
{NULL, NULL}
};

Expand Down
Loading

0 comments on commit 1889f32

Please sign in to comment.