Skip to content

Commit 576cf3c

Browse files
committed
ODBC-476 Testcase for the issue with workaround in order not to fail
1 parent f225422 commit 576cf3c

File tree

1 file changed

+63
-3
lines changed

1 file changed

+63
-3
lines changed

test/dyn_cursor.c

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
3-
2013, 2022 MariaDB Corporation AB
3+
2013, 2025 MariaDB Corporation plc
44
55
The MySQL Connector/ODBC is licensed under the terms of the GPLv2
66
<http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most
@@ -753,15 +753,75 @@ ODBC_TEST(my_dynamic_cursor)
753753
return OK;
754754
}
755755

756+
757+
ODBC_TEST(odbc476)
758+
{
759+
SQLLEN nlen[15]= { 0 }, nrow[15]= { 0 };
760+
char szData[15][15]= { 0 };
761+
SQLINTEGER nData[15];
762+
763+
if (ForwardOnly == TRUE && NoCache == TRUE)
764+
{
765+
skip("The test cannot be run if FORWARDONLY and NOCACHE options are selected");
766+
}
767+
OK_SIMPLE_STMT(Stmt, "DROP TABLE IF EXISTS t_odbc476");
768+
769+
OK_SIMPLE_STMT(Stmt, "CREATE TABLE t_odbc476 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,"
770+
"string_null VARCHAR(255), int32_null INT, INDEX idx_string_null(string_null))");
771+
OK_SIMPLE_STMT(Stmt, "INSERT INTO t_odbc476 VALUES(1,'name 3', 3)");
772+
OK_SIMPLE_STMT(Stmt, "INSERT INTO t_odbc476 VALUES(2,'name 5', 5)");
773+
OK_SIMPLE_STMT(Stmt, "INSERT INTO t_odbc476 VALUES(3,'name 9', 9)");
774+
OK_SIMPLE_STMT(Stmt, "INSERT INTO t_odbc476 VALUES(4,'name 3', 32)");
775+
776+
CHECK_STMT_RC(Stmt, SQLFreeStmt(Stmt, SQL_CLOSE));
777+
CHECK_STMT_RC(Stmt, SQLSetStmtAttr(Stmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_DYNAMIC, 0));
778+
CHECK_STMT_RC(Stmt, SQLSetStmtAttr(Stmt, SQL_ATTR_CONCURRENCY, (SQLPOINTER)SQL_CONCUR_LOCK, 0));
779+
780+
// To repeat issue it has to be SELECT string_null
781+
OK_SIMPLE_STMT(Stmt, "SELECT id, string_null FROM t_odbc476 "
782+
"WHERE string_null='name 3' OR string_null='name 5'");
783+
784+
CHECK_STMT_RC(Stmt, SQLFetchScroll(Stmt, SQL_FETCH_ABSOLUTE, 1));
785+
// This fails with "can't build index" if id field or all fields are not selected
786+
CHECK_STMT_RC(Stmt, SQLSetPos(Stmt, 0, SQL_DELETE, SQL_LOCK_NO_CHANGE));
787+
788+
CHECK_STMT_RC(Stmt, SQLFreeStmt(Stmt, SQL_CLOSE));
789+
790+
OK_SIMPLE_STMT(Stmt, "SELECT * FROM t_odbc476 ORDER BY id");
791+
CHECK_STMT_RC(Stmt, SQLSetStmtAttr(Stmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)3, 0));
792+
CHECK_STMT_RC(Stmt, SQLBindCol(Stmt, 1, SQL_C_LONG, &nData, 0, nrow));
793+
CHECK_STMT_RC(Stmt, SQLBindCol(Stmt, 2, SQL_C_CHAR, szData, sizeof(szData[0]), nlen));
794+
CHECK_STMT_RC(Stmt, SQLFetchScroll(Stmt, SQL_FETCH_ABSOLUTE, 1));
795+
796+
is_num(nData[0], 2);
797+
IS_STR(szData[0], "name 5", 7);
798+
is_num(nData[1], 3);
799+
IS_STR(szData[1], "name 9", 7);
800+
is_num(nData[2], 4);
801+
IS_STR(szData[2], "name 3", 7);
802+
803+
FAIL_IF(SQLFetchScroll(Stmt, SQL_FETCH_NEXT, 1) != SQL_NO_DATA_FOUND, "no data found expected");
804+
805+
CHECK_STMT_RC(Stmt, SQLFreeStmt(Stmt, SQL_UNBIND));
806+
CHECK_STMT_RC(Stmt, SQLFreeStmt(Stmt, SQL_CLOSE));
807+
CHECK_STMT_RC(Stmt, SQLSetStmtAttr(Stmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)1, 0));
808+
809+
OK_SIMPLE_STMT(Stmt, "DROP TABLE t_odbc476");
810+
811+
return OK;
812+
}
813+
814+
756815
MA_ODBC_TESTS my_tests[]=
757816
{
758817
{my_dynamic_pos_cursor, "my_dynamic_pos_cursor", NORMAL},
759818
{my_dynamic_pos_cursor1, "my_dynamic_pos_cursor1", NORMAL},
760819
{my_position, "my_position", NORMAL},
761-
{ my_position1, "my_position1", NORMAL },
762-
{ my_zero_irow_update, "my_zero_irow_update", NORMAL },
820+
{my_position1, "my_position1", NORMAL },
821+
{my_zero_irow_update, "my_zero_irow_update", NORMAL },
763822
{my_zero_irow_delete, "my_zero_irow_delete", NORMAL},
764823
{my_dynamic_cursor, "my_dynamic_cursor", NORMAL},
824+
{odbc476, "odbc476-not-enough-info", NORMAL},
765825
{NULL, NULL}
766826
};
767827

0 commit comments

Comments
 (0)