From 05425053c8a84423c7567ed6135f25e931755b2b Mon Sep 17 00:00:00 2001 From: Lawrin Novitsky Date: Fri, 2 Dec 2016 14:11:54 +0100 Subject: [PATCH] Refined a bit multi-statement query detection - it allows now have semicolon at the end of single statement. Resetting rs columns number before preparing query. Changed few testcases in error.c to make outup more informative --- ma_helper.c | 4 +++- ma_statement.c | 3 ++- test/error.c | 26 ++++++++++++++++++-------- test/tap.h | 4 ++-- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/ma_helper.c b/ma_helper.c index 08113fe3..49eaa717 100644 --- a/ma_helper.c +++ b/ma_helper.c @@ -37,7 +37,9 @@ void CloseMultiStatements(MADB_Stmt *Stmt) /* Required, but not sufficient condition */ BOOL QueryIsPossiblyMultistmt(char *queryStr) { - if (strchr(queryStr, ';')) + char *semicolon_pos= strchr(queryStr, ';'); + /* String supposed to come here trimmed. Checking that semicolon is not last char in the string */ + if (semicolon_pos != NULL && semicolon_pos < queryStr + strlen(queryStr) - 1) { /* CREATE PROCEDURE uses semicolons but is not supported in prepared statement protocol */ diff --git a/ma_statement.c b/ma_statement.c index ebc41d23..98832d6d 100644 --- a/ma_statement.c +++ b/ma_statement.c @@ -407,6 +407,7 @@ void MADB_StmtReset(MADB_Stmt *Stmt) case MADB_SS_PREPARED: ResetMetadata(&Stmt->metadata, NULL); Stmt->PositionedCursor= NULL; + Stmt->Ird->Header.Count= 0; case MADB_SS_EMULATED: MADB_FREE(Stmt->NativeSql); @@ -979,7 +980,7 @@ SQLRETURN MADB_StmtExecute(MADB_Stmt *Stmt, BOOL ExecDirect) mysql_stmt_close(Stmt->stmt); } Stmt->stmt= Stmt->MultiStmts[StatementNr]; - Stmt->ParamCount= Stmt->MultiStmts[StatementNr]->param_count; + Stmt->ParamCount= (SQLSMALLINT)mysql_stmt_param_count(Stmt->stmt); Stmt->RebindParams= TRUE; } /* Convert and bind parameters */ diff --git a/test/error.c b/test/error.c index da57c7c2..7c52e26b 100644 --- a/test/error.c +++ b/test/error.c @@ -237,9 +237,10 @@ ODBC_TEST(t_bug3456) CHECK_STMT_RC(Stmt, SQLExecDirect(Stmt, (SQLCHAR *)buf, SQL_NTS)); /* Now check that the connection killed returns the right SQLSTATE */ - ERR_SIMPLE_STMT(Stmt2, "SELECT connection_id()"); + EXPECT_STMT(Stmt2, SQLExecDirect(Stmt2, "SELECT connection_id()", SQL_NTS), SQL_ERROR); + CHECK_SQLSTATE(Stmt2, "08S01"); - return check_sqlstate(Stmt2, "08S01"); + return OK; } @@ -315,7 +316,9 @@ ODBC_TEST(bind_notenoughparam1) CHECK_STMT_RC(Stmt, SQLBindParameter(Stmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &i, 0, NULL)); FAIL_IF(SQLExecute(Stmt)!= SQL_ERROR, "error expected"); - return check_sqlstate(Stmt, "07002"); + CHECK_SQLSTATE(Stmt, "07002"); + + return OK; } @@ -337,7 +340,9 @@ ODBC_TEST(bind_notenoughparam2) CHECK_STMT_RC(Stmt, SQLBindParameter(Stmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &i, 0, NULL)); FAIL_IF(SQLExecute(Stmt)!= SQL_ERROR, "error expected"); - return check_sqlstate(Stmt, "07002"); + CHECK_SQLSTATE(Stmt, "07002"); + + return OK; } @@ -356,7 +361,9 @@ ODBC_TEST(getdata_need_nullind) /* now that it's an error */ FAIL_IF(SQLGetData(Stmt, 2, SQL_C_LONG, &i, 0, NULL) != SQL_ERROR, "Error expected"); - return check_sqlstate(Stmt, "22002"); + CHECK_SQLSTATE(Stmt, "22002"); + + return OK; } @@ -424,7 +431,9 @@ ODBC_TEST(sqlerror) ODBC_TEST(t_bug27158) { ERR_SIMPLE_STMT(Stmt, "{ CALL test.does_not_exist }"); - return check_sqlstate(Stmt, "42000"); + CHECK_SQLSTATE(Stmt, "42000"); + + return OK; } @@ -437,8 +446,9 @@ ODBC_TEST(t_bug13542600) CHECK_STMT_RC(Stmt, SQLBindCol(Stmt, 2, SQL_C_LONG, &i, 0, NULL)); FAIL_IF(SQLFetch(Stmt)!= SQL_ERROR, "error expected"); + CHECK_SQLSTATE(Stmt, "22002"); - return check_sqlstate(Stmt, "22002"); + return OK; } @@ -603,7 +613,7 @@ MA_ODBC_TESTS my_tests[]= {t_odbc2_error, "t_odbc2_error"}, {t_diagrec, "t_diagrec"}, {t_warning, "t_warning"}, - {t_bug3456, "t_bug3456"}, + {t_bug3456, "t_bug3456_fails_due_to_conc_bug"}, {t_bug16224, "t_bug16224"}, {bind_invalidcol, "bind_invalidcol"}, {bind_notenoughparam1, "bind_notenoughparam1"}, diff --git a/test/tap.h b/test/tap.h index 04df3e90..ed2bd88c 100644 --- a/test/tap.h +++ b/test/tap.h @@ -631,11 +631,11 @@ SQLHANDLE DoConnect(SQLHANDLE *Connection, SQLSMALLINT Length; /* my_options |= 4; */ /* To enable debug */ - _snprintf(DSNString, 1024, "DSN=%s;UID=%s;PWD=%s;PORT=%u;DATABASE=%s;OPTION=%ul;SERVER=%s;%s", dsn ? dsn : (const char*)my_dsn, + _snprintf(DSNString, 1024, "DSN=%s;UID=%s;PWD=%s;PORT=%u;DATABASE=%s;OPTION=%u;SERVER=%s;%s", dsn ? dsn : (const char*)my_dsn, uid ? uid : (const char*)my_uid, pwd ? pwd : (const char*)my_pwd, port ? port : my_port, schema ? schema : (const char*)my_schema, options ? *options : my_options, server ? server : (const char*)my_servername, add_parameters ? add_parameters : ""); - diag("DSN=%s;UID=%s;PWD=%s;PORT=%u;DATABASE=%s;OPTION=%ul;SERVER=%s;%s", dsn ? dsn : (const char*)my_dsn, + diag("DSN=%s;UID=%s;PWD=%s;PORT=%u;DATABASE=%s;OPTION=%u;SERVER=%s;%s", dsn ? dsn : (const char*)my_dsn, uid ? uid : (const char*)my_uid, "********", port ? port : my_port, schema ? schema : (const char*)my_schema, options ? *options : my_options, server ? server : (const char*)my_servername, add_parameters ? add_parameters : "");