1
0
mirror of https://github.com/mariadb-corporation/mariadb-connector-c.git synced 2025-08-08 14:02:17 +03:00

CONC-667: Fix statement handling when unbuffered results are pending.

Resetting a statement will result in an error, if another (different)
statement has a pending unbuffered result set (CR_COMMANDS_OUT_OF_SYNC).

Freeing a statement result set will return an error, if the statement
has no result set or was not executed (CR_STMT_NO_RESULT).
This commit is contained in:
Georg Richter
2024-03-23 12:27:55 +01:00
parent 4a1c5ef53b
commit b64282a9dd
4 changed files with 64 additions and 2 deletions

View File

@@ -1613,6 +1613,12 @@ unsigned int STDCALL mysql_stmt_field_count(MYSQL_STMT *stmt)
my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt)
{
if (stmt->state < MYSQL_STMT_EXECUTED || !stmt->field_count)
{
stmt_set_error(stmt, CR_STMT_NO_RESULT, SQLSTATE_UNKNOWN, 0);
return 1;
}
return madb_reset_stmt(stmt, MADB_RESET_LONGDATA | MADB_RESET_STORED |
MADB_RESET_BUFFER | MADB_RESET_ERROR);
}
@@ -2198,6 +2204,19 @@ static my_bool madb_reset_stmt(MYSQL_STMT *stmt, unsigned int flags)
{
MYSQL *mysql= stmt->mysql;
my_bool ret= 0;
LIST *li_stmt= mysql->stmts;
/* CONC-667: If an other statement has a pending result set, we
need to return an error */
for (;li_stmt;li_stmt= li_stmt->next)
{
MYSQL_STMT *s= (MYSQL_STMT *)li_stmt->data;
if (s != stmt && s->state == MYSQL_STMT_WAITING_USE_OR_STORE)
{
stmt_set_error(stmt, CR_COMMANDS_OUT_OF_SYNC, SQLSTATE_UNKNOWN, 0);
return 1;
}
}
if (!stmt->mysql)
{
@@ -2297,7 +2316,8 @@ static my_bool mysql_stmt_internal_reset(MYSQL_STMT *stmt, my_bool is_close)
stmt->fetch_row_func == stmt_unbuffered_fetch)
flags|= MADB_RESET_BUFFER;
ret= madb_reset_stmt(stmt, flags);
if (ret= madb_reset_stmt(stmt, flags))
return ret;
if (stmt->stmt_id)
{