diff --git a/ma_connection.c b/ma_connection.c index 7c877c92..9cb6c265 100644 --- a/ma_connection.c +++ b/ma_connection.c @@ -17,6 +17,7 @@ 51 Franklin St., Fifth Floor, Boston, MA 02110, USA *************************************************************************************/ #include +#include extern const char* DefaultPluginLocation; static const char* utf8mb3 = "utf8mb3"; diff --git a/ma_odbc.h b/ma_odbc.h index 7fa7edc1..9ad633ff 100644 --- a/ma_odbc.h +++ b/ma_odbc.h @@ -1,5 +1,5 @@ /************************************************************************************ - Copyright (C) 2013,2022 MariaDB Corporation AB + Copyright (C) 2013,2023 MariaDB Corporation AB This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -19,7 +19,7 @@ #ifndef _ma_odbc_h_ #define _ma_odbc_h_ -#include +#include "ma_odbc_version.h" #ifdef _WIN32 # include "ma_platform_win32.h" @@ -69,29 +69,6 @@ typedef struct SQLRETURN ReturnValue; } MADB_Error; -typedef struct -{ - SQLPOINTER TargetValuePtr; - SQLLEN BufferLength; - SQLLEN Utf8BufferLength; - SQLLEN *StrLen_or_Ind; - void *InternalBuffer; /* used for conversion */ - SQLUINTEGER TargetType; -} MADB_ColBind; - -typedef struct -{ - SQLSMALLINT InputOutputType; - SQLSMALLINT ValueType; - SQLSMALLINT ParameterType; - SQLULEN ColumnSize; - SQLSMALLINT DecimalDigits; - SQLPOINTER ParameterValuePtr; - SQLLEN BufferLength; - SQLLEN *StrLen_or_IndPtr; - void *InternalBuffer; /* used for conversion */ -} MADB_ParmBind; - typedef struct { /* Header */ @@ -108,34 +85,32 @@ typedef struct typedef struct { - SQLUSMALLINT *RowOperationPtr; - SQLULEN *RowOffsetPtr; - /*MADB_ColBind *ColumnBind;*/ - MYSQL_BIND *Bind; - SQLLEN dummy; - SQLUINTEGER BindSize; /* size of each structure if using * Row-wise Binding */ - SQLSMALLINT Allocated; + SQLUSMALLINT *RowOperationPtr; + SQLULEN *RowOffsetPtr; + MYSQL_BIND *Bind; + SQLLEN dummy; + SQLUINTEGER BindSize; /* size of each structure if using * Row-wise Binding */ + SQLSMALLINT Allocated; } MADB_Ard; typedef struct { - SQLUSMALLINT *ParamOperationPtr; - SQLULEN *ParamOffsetPtr; - /*MADB_ParmBind *ParamBind;*/ - MYSQL_BIND *Bind; - SQLLEN ParamsetSize; - SQLUINTEGER ParamBindType; - SQLSMALLINT Allocated; + SQLUSMALLINT *ParamOperationPtr; + SQLULEN *ParamOffsetPtr; + MYSQL_BIND *Bind; + SQLLEN ParamsetSize; + SQLUINTEGER ParamBindType; + SQLSMALLINT Allocated; } MADB_Apd; typedef struct { MADB_Stmt* stmt; - SQLULEN* RowsFetched; - SQLUSMALLINT* RowStatusArray; + SQLULEN* RowsFetched; + SQLUSMALLINT* RowStatusArray; MYSQL_FIELD* Fields; - SQLUINTEGER FieldCount; - SQLSMALLINT Allocated; + SQLUINTEGER FieldCount; + SQLSMALLINT Allocated; } MADB_Ird; typedef struct @@ -147,7 +122,6 @@ typedef struct SQLULEN *ParamProcessedPtr; /* SQLParamOptions */ #endif /* ODBCVER */ SQLUSMALLINT *ParamStatusPtr; - /*MADB_ParmBind* Parameters;*/ SQLSMALLINT Allocated; } MADB_Ipd; @@ -464,7 +438,7 @@ void CloseClientCharset(Client_Charset *cc); #include #include #include -#include +#include "ma_string.h" #include #include #include diff --git a/test/basic.c b/test/basic.c index 07c5715d..0b11e18a 100644 --- a/test/basic.c +++ b/test/basic.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. - 2013, 2017 MariaDB Corporation AB + 2013, 2023 MariaDB Corporation AB The MySQL Connector/ODBC is licensed under the terms of the GPLv2 , like most @@ -299,7 +299,7 @@ ODBC_TEST(t_disconnect) SQLHSTMT hstmt; rc= SQLAllocHandle(SQL_HANDLE_DBC, Env, &hdbc1); - CHECK_ENV_RC(Env, rc); + CHECK_ENV_RC(Env, rc); rc= SQLConnectW(hdbc1, wdsn, SQL_NTS, wuid, SQL_NTS, wpwd, SQL_NTS); CHECK_DBC_RC(hdbc1, rc); @@ -919,7 +919,6 @@ ODBC_TEST(t_describe_nulti) ODBC_Connect(&henv1, &hdbc1, &hstmt1); - OK_SIMPLE_STMT(hstmt1, "DROP TABLE IF EXISTS t1"); OK_SIMPLE_STMT(hstmt1, "CREATE TABLE t1 (columnX VARCHAR(255))"); @@ -1642,6 +1641,7 @@ ODBC_TEST(t_odbc139) CHECK_DBC_RC(Hdbc, SQLSetConnectAttr(Hdbc, SQL_ATTR_CURRENT_CATALOG, (SQLPOINTER)"test", 4)); Hstmt= DoConnect(Hdbc, FALSE, NULL, NULL, NULL, 0, NULL, &Compression, NULL, NULL); + FAIL_IF(Hstmt == NULL, "Connection with compression failed"); Thread= CreateThread(NULL, 0, FireQueryInThread, Hstmt, 0, NULL); WaitRc= WaitForSingleObject(Thread, 1500); @@ -1789,6 +1789,7 @@ ODBC_TEST(t_odbc377) { SQLHDBC Hdbc; SQLHSTMT Hstmt; + SQLCHAR Sqlstate[6]; CHECK_ENV_RC(Env, SQLAllocConnect(Env, &Hdbc)); @@ -1811,13 +1812,21 @@ ODBC_TEST(t_odbc377) CHECK_STMT_RC(Hstmt, SQLSetStmtAttr(Hstmt, SQL_ATTR_QUERY_TIMEOUT, (SQLPOINTER)1, 0)); EXPECT_STMT(Hstmt, SQLExecDirect(Hstmt, "SELECT SLEEP(2)", SQL_NTS), SQL_ERROR); - CHECK_SQLSTATE_EX(Hstmt, SQL_HANDLE_STMT, "70100"); + CHECK_STMT_RC(Hstmt, SQLGetDiagRec(SQL_HANDLE_STMT, Hstmt, 1, Sqlstate, NULL, NULL, 0, NULL)); + if (strncmp(Sqlstate, "70100", 6) != 0 && strncmp(Sqlstate, "HY018", 6) != 0) + { + FAIL_IF(1, "Unexpected SQL State"); + } CHECK_STMT_RC(Stmt, SQLFreeStmt(Stmt, SQL_CLOSE)); /* Verifying the same(i.e. query timeout works) for the case of prepare + execute */ CHECK_STMT_RC(Hstmt, SQLPrepare(Hstmt, "SELECT SLEEP(2)", SQL_NTS)); EXPECT_STMT(Hstmt, SQLExecute(Hstmt), SQL_ERROR); - CHECK_SQLSTATE_EX(Hstmt, SQL_HANDLE_STMT, "70100"); + CHECK_STMT_RC(Hstmt, SQLGetDiagRec(SQL_HANDLE_STMT, Hstmt, 1, Sqlstate, NULL, NULL, 0, NULL)); + if (strncmp(Sqlstate, "70100", 6) != 0 && strncmp(Sqlstate, "HY018", 6) != 0) + { + FAIL_IF(1, "Unexpected SQL State"); + } CHECK_STMT_RC(Hstmt, SQLFreeStmt(Hstmt, SQL_DROP)); CHECK_DBC_RC(Hdbc, SQLDisconnect(Hdbc)); diff --git a/test/cursor.c b/test/cursor.c index b22a9037..3d427c53 100644 --- a/test/cursor.c +++ b/test/cursor.c @@ -308,7 +308,7 @@ ODBC_TEST(t_setpos_del_all) CHECK_STMT_RC(Stmt, SQLSetCursorName(Stmt, (SQLCHAR *)"venu", SQL_NTS)); - CHECK_STMT_RC(Stmt, SQLSetStmtOption(Stmt, SQL_ROWSET_SIZE, 4)); + CHECK_STMT_RC(Stmt, SQLSetStmtAttr(Stmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)4, 0)); OK_SIMPLE_STMT(Stmt, "SELECT * FROM t_setpos_del_all ORDER BY a ASC"); @@ -344,7 +344,7 @@ ODBC_TEST(t_setpos_del_all) CHECK_STMT_RC(Stmt, SQLFreeStmt(Stmt, SQL_CLOSE)); - CHECK_STMT_RC(Stmt, SQLSetStmtOption(Stmt, SQL_ROWSET_SIZE, 1)); + CHECK_STMT_RC(Stmt, SQLSetStmtAttr(Stmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)1, 0)); OK_SIMPLE_STMT(Stmt, "DROP TABLE IF EXISTS t_setpos_del_all"); @@ -719,11 +719,11 @@ ODBC_TEST(t_pos_datetime_delete1) SQLSetStmtAttr(Stmt, SQL_ATTR_CONCURRENCY, (SQLPOINTER) SQL_CONCUR_ROWVER, 0); SQLSetStmtAttr(Stmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) SQL_CURSOR_DYNAMIC, 0); - SQLSetStmtOption(Stmt,SQL_SIMULATE_CURSOR,SQL_SC_NON_UNIQUE); + SQLSetStmtAttr(Stmt, SQL_SIMULATE_CURSOR, (SQLPOINTER) SQL_SC_NON_UNIQUE, 0); SQLSetStmtAttr(hstmt1, SQL_ATTR_CONCURRENCY, (SQLPOINTER) SQL_CONCUR_ROWVER, 0); SQLSetStmtAttr(hstmt1, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) SQL_CURSOR_DYNAMIC, 0); - SQLSetStmtOption(hstmt1,SQL_SIMULATE_CURSOR,SQL_SC_NON_UNIQUE); + SQLSetStmtAttr(hstmt1, SQL_SIMULATE_CURSOR, (SQLPOINTER) SQL_SC_NON_UNIQUE, 0); rc = SQLSetCursorName(Stmt, (SQLCHAR *)"venu_cur",8); CHECK_STMT_RC(Stmt,rc); @@ -897,7 +897,7 @@ ODBC_TEST(t_acc_crash) CHECK_STMT_RC(Stmt, SQLFreeStmt(Stmt, SQL_CLOSE)); CHECK_STMT_RC(Stmt, SQLSetStmtAttr(Stmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_STATIC, 0)); - CHECK_STMT_RC(Stmt, SQLSetStmtOption(Stmt, SQL_ROWSET_SIZE, 1)); + CHECK_STMT_RC(Stmt, SQLSetStmtAttr(Stmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)1, 0)); OK_SIMPLE_STMT(Stmt, "SELECT * FROM t_acc_crash ORDER BY a ASC"); @@ -2030,8 +2030,7 @@ ODBC_TEST(t_setpos_upd_bug1) rc = SQLExtendedFetch(Stmt,SQL_FETCH_FIRST,0,NULL,&rgfRowStatus); CHECK_STMT_RC(Stmt,rc); - rc = SQLSetStmtOption(Stmt,SQL_QUERY_TIMEOUT,30); - CHECK_STMT_RC(Stmt,rc); + CHECK_STMT_RC(Stmt, SQLSetStmtAttr(Stmt, SQL_QUERY_TIMEOUT, (SQLPOINTER)30, 0)); strcpy((char *)fname , "updated"); strcpy((char *)lname , "updated01234567890"); @@ -2754,7 +2753,7 @@ ODBC_TEST(t_bug32420) CHECK_STMT_RC(hstmt1, SQLFreeStmt(hstmt1, SQL_CLOSE)); - CHECK_STMT_RC(hstmt1, SQLSetStmtOption(hstmt1, SQL_ROWSET_SIZE, 4)); + CHECK_STMT_RC(hstmt1, SQLSetStmtAttr(hstmt1, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)4, 0)); OK_SIMPLE_STMT(hstmt1, "SELECT * FROM bug32420"); CHECK_STMT_RC(hstmt1, SQLBindCol(hstmt1, 1, SQL_C_LONG, nData, 0, NULL)); @@ -2841,7 +2840,7 @@ ODBC_TEST(t_bug32420) CHECK_STMT_RC(hstmt1, SQLFreeStmt(hstmt1, SQL_CLOSE)); - CHECK_STMT_RC(hstmt1, SQLSetStmtOption(hstmt1, SQL_ROWSET_SIZE, 4)); + CHECK_STMT_RC(hstmt1, SQLSetStmtAttr(hstmt1, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)4, 0)); OK_SIMPLE_STMT(hstmt1, "SELECT * FROM bug32420"); CHECK_STMT_RC(hstmt1, SQLBindCol(hstmt1, 1, SQL_C_LONG, nData, 0, NULL)); diff --git a/test/info.c b/test/info.c index 11458d47..5ab328e3 100644 --- a/test/info.c +++ b/test/info.c @@ -761,7 +761,7 @@ ODBC_TEST(odbc143) /** Test of connect attributes that used to be treated as wrong data type. - SQL_ATTR_TXN_ISOLATION aslo had issue, but it is already cared of by other test + SQL_ATTR_TXN_ISOLATION also had issue, but it is already cared of by other test */ ODBC_TEST(odbc317) { @@ -775,13 +775,15 @@ ODBC_TEST(odbc317) /* We ourselves kinda return ODBC(TODO: need to check why), but all other DM's return DRIVER. iODBC 3.52.12 used to do that toTODO: need to check why. The test is anyway about using correct data type for the attribute */ if (iOdbc() && DmMinVersion(3, 52, 13)) { +#pragma warning(disable:4995) +#pragma warning(push) is_num(lenAttr, SQL_CUR_USE_ODBC); +#pragma warning(pop) } else { is_num(lenAttr, SQL_CUR_USE_DRIVER); } - return OK; } @@ -830,6 +832,28 @@ ODBC_TEST(odbc326) return OK; } +/* Some apps use 1212 attribute */ +ODBC_TEST(odbc313) +{ + SQLLEN attr1212= 0; + SQLRETURN rc= SQL_SUCCESS; + + OK_SIMPLE_STMT(Stmt, "DROP TABLE IF EXISTS t_odbc313"); + OK_SIMPLE_STMT(Stmt, "CREATE TABLE t_odbc313 ( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, a INT NOT NULL)"); + + OK_SIMPLE_STMT(Stmt, "SELECT id, a FROM t_odbc313"); + rc= SQLColAttribute(Stmt, 1, 1212, NULL, 0, NULL, &attr1212); + FAIL_IF(rc != SQL_SUCCESS, "Only SQL_SUCCESS is expected"); + is_num(attr1212, SQL_TRUE); + rc= SQLColAttribute(Stmt, 2, 1212, NULL, 0, NULL, &attr1212); + FAIL_IF(rc != SQL_SUCCESS, "Only SQL_SUCCESS is expected"); + is_num(attr1212, SQL_FALSE); + CHECK_STMT_RC(Stmt, SQLFreeStmt(Stmt, SQL_CLOSE)); + + OK_SIMPLE_STMT(Stmt, "DROP TABLE t_odbc313"); + return OK; +} + MA_ODBC_TESTS my_tests[]= { @@ -855,6 +879,7 @@ MA_ODBC_TESTS my_tests[]= { odbc143, "odbc143_odbc160_ANSI_QUOTES", NORMAL }, { odbc317, "odbc317_conattributes", NORMAL }, { odbc326, "odbc326", NORMAL }, + { odbc313, "odbc313", NORMAL }, { NULL, NULL } }; diff --git a/test/multistatement.c b/test/multistatement.c index d9adb3b6..d2e21da9 100644 --- a/test/multistatement.c +++ b/test/multistatement.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. - 2013, 2019 MariaDB Corporation AB + 2013, 2023 MariaDB Corporation AB The MySQL Connector/ODBC is licensed under the terms of the GPLv2 , like most @@ -79,19 +79,16 @@ ODBC_TEST(test_multi_on_off) ODBC_TEST(test_params) { - int i, j; + int i, j; OK_SIMPLE_STMT(Stmt, "DROP TABLE IF EXISTS t1; CREATE TABLE t1(a int)"); - OK_SIMPLE_STMT(Stmt, "DROP TABLE IF EXISTS t2; CREATE TABLE t2(a int)"); CHECK_STMT_RC(Stmt, SQLPrepare(Stmt, (SQLCHAR*)"INSERT INTO t1 VALUES (?), (?)", SQL_NTS)); CHECK_STMT_RC(Stmt, SQLBindParameter(Stmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 10, 0, &i, 0, NULL)); - CHECK_STMT_RC(Stmt, SQLBindParameter(Stmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 10, 0, &j, 0, NULL)); - for (i=0; i < 100; i++) { j= i + 100; @@ -99,7 +96,6 @@ ODBC_TEST(test_params) while (SQLMoreResults(Stmt) == SQL_SUCCESS); } - return OK; } @@ -108,15 +104,12 @@ ODBC_TEST(test_params_last_count_smaller) int i, j, k; OK_SIMPLE_STMT(Stmt, "DROP TABLE IF EXISTS t1; CREATE TABLE t1(a int, b int)"); - OK_SIMPLE_STMT(Stmt, "DROP TABLE IF EXISTS t2; CREATE TABLE t2(a int)"); CHECK_STMT_RC(Stmt, SQLPrepare(Stmt, (SQLCHAR*)"INSERT INTO t1 VALUES (?,?); INSERT INTO t2 VALUES (?)", SQL_NTS)); CHECK_STMT_RC(Stmt, SQLBindParameter(Stmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 10, 0, &i, 0, NULL)); - CHECK_STMT_RC(Stmt, SQLBindParameter(Stmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 10, 0, &j, 0, NULL)); - CHECK_STMT_RC(Stmt, SQLBindParameter(Stmt, 3, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 10, 0, &k, 0, NULL)); for (i=0; i < 100; i++) @@ -546,8 +539,8 @@ ODBC_TEST(t_odbc177) ODBC_TEST(t_odbc169) { - SQLCHAR Query[][80]= {"SELECT 1 Col1; SELECT * from t_odbc169", "SELECT * FROM t_odbc169 ORDER BY col1 DESC; SELECT col3, col2 from t_odbc169", - "INSERT INTO t_odbc169 VALUES(8, 7, 'Row #4');SELECT * from t_odbc169"}; + SQLCHAR Query[][80]= {"SELECT 1 Col1; SELECT * FROM t_odbc169", "SELECT * FROM t_odbc169 ORDER BY col1 DESC; SELECT col3, col2 FROM t_odbc169", + "INSERT INTO t_odbc169 VALUES(8, 7, 'Row #4');SELECT * FROM t_odbc169"}; char Expected[][3][7]={ {"1", "", "" }, /* RS 1*/ {"1", "2", "Row 1"}, /* RS 2*/ {"3", "4", "Row 2"}, @@ -568,14 +561,12 @@ ODBC_TEST(t_odbc169) unsigned int i, RsIndex= 0, ExpectedRows[]= {1, 3, 3, 3, 0, 4}; SQLLEN Rows, ExpRowCount[]= {0, 0, 0, 0, 1, 0}; SQLSMALLINT ColumnsCount, expCols[]= {1, 3, 3, 2, 0, 3}; - SQLRETURN rc; + SQLRETURN rc= SQL_SUCCESS; SQLSMALLINT Column, Row= 0; SQLCHAR ColumnData[MAX_ROW_DATA_LEN]={ 0 }; OK_SIMPLE_STMT(Stmt, "DROP TABLE IF EXISTS t_odbc169"); - OK_SIMPLE_STMT(Stmt, "CREATE TABLE t_odbc169(col1 INT, col2 INT, col3 varchar(32) not null)"); - OK_SIMPLE_STMT(Stmt, "INSERT INTO t_odbc169 VALUES(1, 2, 'Row 1'),(3, 4, 'Row 2'), (5, 6, 'Row 3')"); for (i= 0; i < sizeof(Query)/sizeof(Query[0]); ++i) @@ -667,12 +658,12 @@ ODBC_TEST(test_autocommit) SQLCHAR tracked[256]; CHECK_ENV_RC(Env, SQLAllocConnect(Env, &Dbc)); - CHECK_DBC_RC(Dbc, SQLSetConnectOption(Dbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_ON)); + CHECK_DBC_RC(Dbc, SQLSetConnectAttr(Dbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_ON, 0)); /* First testing with multistatements off */ Stmt = DoConnect(Dbc, FALSE, NULL, NULL, NULL, 0, NULL, &noMsOptions, NULL, "INITSTMT={SELECT 1}"); FAIL_IF(Stmt == NULL, "Connection error"); - CHECK_DBC_RC(Dbc, SQLGetConnectOption(Dbc, SQL_AUTOCOMMIT, (SQLPOINTER)&ac)); + CHECK_DBC_RC(Dbc, SQLGetConnectAttr(Dbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)&ac, sizeof(SQLUINTEGER), NULL)); is_num(ac, SQL_AUTOCOMMIT_ON); OK_SIMPLE_STMT(Stmt, "SELECT @@autocommit"); CHECK_STMT_RC(Stmt, SQLFetch(Stmt)); @@ -681,12 +672,12 @@ ODBC_TEST(test_autocommit) CHECK_STMT_RC(Stmt, SQLFreeStmt(Stmt, SQL_DROP)); CHECK_DBC_RC(Dbc, SQLDisconnect(Dbc)); - CHECK_DBC_RC(Dbc, SQLSetConnectOption(Dbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF)); + CHECK_DBC_RC(Dbc, SQLSetConnectAttr(Dbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0)); Stmt = DoConnect(Dbc, FALSE, NULL, NULL, NULL, 0, NULL, NULL, NULL, "INITSTMT={SELECT 1}"); FAIL_IF(Stmt == NULL, "Connection error"); - CHECK_DBC_RC(Dbc, SQLGetConnectOption(Dbc, SQL_AUTOCOMMIT, (SQLPOINTER)&ac)); + CHECK_DBC_RC(Dbc, SQLGetConnectAttr(Dbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)&ac, 0, NULL)); is_num(ac, SQL_AUTOCOMMIT_OFF); OK_SIMPLE_STMT(Stmt, "SELECT @@autocommit"); CHECK_STMT_RC(Stmt, SQLFetch(Stmt)); @@ -700,18 +691,21 @@ ODBC_TEST(test_autocommit) CHECK_STMT_RC(Stmt, SQLFreeStmt(Stmt, SQL_CLOSE)); OK_SIMPLE_STMT(Stmt, "SET autocommit=1;"); - CHECK_DBC_RC(Dbc, SQLGetConnectOption(Dbc, SQL_AUTOCOMMIT, (SQLPOINTER)&ac)); + CHECK_DBC_RC(Dbc, SQLGetConnectAttr(Dbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)&ac, 0, NULL)); is_num(ac, SQL_AUTOCOMMIT_ON); } CHECK_STMT_RC(Stmt, SQLFreeStmt(Stmt, SQL_DROP)); CHECK_DBC_RC(Dbc, SQLDisconnect(Dbc)); - +// Leaving couple of deprecated function calls to test them +#pragma warning(disable: 4996) +#pragma warning(push) CHECK_DBC_RC(Dbc, SQLSetConnectOption(Dbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_ON)); Stmt = DoConnect(Dbc, FALSE, NULL, NULL, NULL, 0, NULL, NULL, NULL, "INITSTMT={SELECT 1}"); FAIL_IF(Stmt == NULL, "Connection error"); CHECK_DBC_RC(Dbc, SQLGetConnectOption(Dbc, SQL_AUTOCOMMIT, (SQLPOINTER)&ac)); +#pragma warning(pop) is_num(ac, SQL_AUTOCOMMIT_ON); OK_SIMPLE_STMT(Stmt, "SELECT @@autocommit"); CHECK_STMT_RC(Stmt, SQLFetch(Stmt)); @@ -726,8 +720,7 @@ ODBC_TEST(test_autocommit) ODBC_TEST(t_odbc375) { - SQLSMALLINT ColumnCount; - const SQLCHAR *Query= "SELECT 1; SELECT(SELECT ENGINE FROM INFORMATION_SCHEMA.ENGINES); SELECT 2"; + SQLCHAR *Query= "SELECT 1; SELECT(SELECT ENGINE FROM INFORMATION_SCHEMA.ENGINES); SELECT 2"; EXPECT_STMT(Stmt, SQLExecDirect(Stmt, Query, SQL_NTS), SQL_ERROR); CHECK_STMT_RC(Stmt, SQLFreeStmt(Stmt, SQL_CLOSE)); diff --git a/test/prepare.c b/test/prepare.c index e9c58edf..5e40e37e 100644 --- a/test/prepare.c +++ b/test/prepare.c @@ -1011,9 +1011,7 @@ ODBC_TEST(t_acc_update) rc = SQLFreeStmt(Stmt,SQL_CLOSE); mystmt(Stmt,rc); - - rc = SQLSetConnectOption(Connection,SQL_AUTOCOMMIT,0L); - CHECK_DBC_RC(Connection,rc); + CHECK_DBC_RC(Connection, SQLSetConnectAttr(Connection, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0)); rc = SQLAllocStmt(Connection,&hstmt1); CHECK_DBC_RC(Connection,rc); @@ -1039,8 +1037,7 @@ ODBC_TEST(t_acc_update) rc = SQLTransact(NULL,Connection,0); CHECK_DBC_RC(Connection,rc); - rc = SQLSetConnectOption(Connection,SQL_AUTOCOMMIT,1L); - CHECK_DBC_RC(Connection,rc); + CHECK_DBC_RC(Connection, SQLSetConnectAttr(Connection, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_ON, 0)); OK_SIMPLE_STMT(Stmt, "DROP TABLE IF EXISTS t_acc_update"); @@ -1059,11 +1056,14 @@ ODBC_TEST(t_bug29871) OK_SIMPLE_STMT(Stmt, "CREATE TABLE t_bug29871 (a INT)"); /* The bug is related to calling deprecated SQLSetParam */ +#pragma warning(disable:4996) +#pragma warning(push) CHECK_STMT_RC(Stmt, SQLSetParam(Stmt, 1, SQL_C_CHAR, SQL_INTEGER, 10, 0, param, 0)); OK_SIMPLE_STMT(Stmt, "INSERT INTO t_bug29871 VALUES (?)"); CHECK_STMT_RC(Stmt, SQLSetParam(Stmt, 1, SQL_C_CHAR, SQL_INTEGER, 10, 0, param, 0)); +#pragma warning(pop) OK_SIMPLE_STMT(Stmt, "SELECT * FROM t_bug29871 WHERE a=?"); CHECK_STMT_RC(Stmt, SQLFetch(Stmt)); is_num(my_fetch_int(Stmt, 1), 1); diff --git a/test/result2.c b/test/result2.c index 30693208..78435a71 100644 --- a/test/result2.c +++ b/test/result2.c @@ -52,7 +52,7 @@ ODBC_TEST(t_bug32420) CHECK_STMT_RC(hstmt1, SQLFreeStmt(hstmt1, SQL_CLOSE)); - CHECK_STMT_RC(hstmt1, SQLSetStmtOption(hstmt1, SQL_ROWSET_SIZE, 4)); + CHECK_STMT_RC(hstmt1, SQLSetStmtAttr(hstmt1, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)4, 0)); OK_SIMPLE_STMT(hstmt1, "SELECT * FROM bug32420 order by 1"); CHECK_STMT_RC(hstmt1, SQLBindCol(hstmt1, 1, SQL_C_LONG, nData, 0, NULL)); diff --git a/test/tap.h b/test/tap.h index 2c0c4ba7..d84118f5 100644 --- a/test/tap.h +++ b/test/tap.h @@ -45,6 +45,7 @@ char* strcasestr(const char* HayStack, const char* Needle) # include # include # include +# include # include "ma_conv_charset.h" /* Mimicking of VS' _snprintf */ @@ -645,10 +646,10 @@ do {\ #define FAIL_IF(expr,message)\ if (expr)\ - {\ + {\ fprintf(stdout, "%s (File: %s Line: %d)\n", message, __FILE__, __LINE__);\ return FAIL;\ - } + } #define IS(A) if (!(A)) { diag("Error in %s:%d", __FILE__, __LINE__); return FAIL; } #define IS_STR_EX(A,B,C,D) do {const char *loc_a=(const char *)(A), *loc_b=(const char *)(B);\ diff --git a/test/tran.c b/test/tran.c index 650418b9..05f17e1c 100644 --- a/test/tran.c +++ b/test/tran.c @@ -110,7 +110,7 @@ ODBC_TEST(t_tran) OK_SIMPLE_STMT(Stmt, "DROP TABLE IF EXISTS t_tran"); OK_SIMPLE_STMT(Stmt, "CREATE TABLE t_tran (a INT, b VARCHAR(30)) ENGINE=InnoDB"); - CHECK_DBC_RC(Connection, SQLSetConnectOption(Connection, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF)); + CHECK_DBC_RC(Connection, SQLSetConnectAttr(Connection, SQL_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0)); OK_SIMPLE_STMT(Stmt, "INSERT INTO t_tran VALUES (10, 'venu')"); CHECK_STMT_RC(Stmt, SQLTransact(NULL, Connection, SQL_COMMIT)); @@ -127,7 +127,7 @@ ODBC_TEST(t_tran) CHECK_STMT_RC(Stmt, SQLFreeStmt(Stmt, SQL_CLOSE)); - CHECK_DBC_RC(Connection, SQLSetConnectOption(Connection, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_ON)); + CHECK_DBC_RC(Connection, SQLSetConnectAttr(Connection, SQL_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_ON, 0)); OK_SIMPLE_STMT(Stmt, "DROP TABLE IF EXISTS t_tran");