Skip to content

Commit

Permalink
Fix for CONC-566:
Browse files Browse the repository at this point in the history
If cursor type is set to read only, and SERVER_STATUS_CURSOR_EXISTS
flag was not set in the server_status of EOF packet, the assumption
was made that a single result set will follow which will be stored
by a call to mysql_stmt_store_result().

As the example in the bug report shows, this is not always the case,
since a stored procedure call might also unset the CURSOR flag and
will always return multiple result sets. In this case it will be
handled now as "normal" unbuffered result set.
  • Loading branch information
9EOR9 committed Sep 25, 2021
1 parent b991723 commit 4b9379b
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 1 deletion.
3 changes: 2 additions & 1 deletion libmariadb/mariadb_stmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1961,7 +1961,8 @@ int stmt_read_execute_response(MYSQL_STMT *stmt)
/* Only cursor read */
stmt->default_rset_handler = _mysql_stmt_use_result;

} else if (stmt->flags & CURSOR_TYPE_READ_ONLY)
} else if (stmt->flags & CURSOR_TYPE_READ_ONLY &&
!(stmt->upsert_status.server_status & SERVER_MORE_RESULTS_EXIST))
{
/*
We have asked for CURSOR but got no cursor, because the condition
Expand Down
27 changes: 27 additions & 0 deletions unittest/libmariadb/ps_bugs.c
Original file line number Diff line number Diff line change
Expand Up @@ -5319,7 +5319,34 @@ static int test_conc512(MYSQL *mysql)
return OK;
}

static int test_conc566(MYSQL *mysql)
{
int rc;
MYSQL_STMT *stmt = mysql_stmt_init(mysql);
unsigned long cursor = CURSOR_TYPE_READ_ONLY;
const char* query= "call sp()";

rc= mysql_query(mysql,"drop procedure if exists sp");
check_mysql_rc(rc, mysql);

rc= mysql_query(mysql,"create procedure sp() select 1");
check_mysql_rc(rc, mysql);

rc= mysql_stmt_prepare(stmt,query,-1);
check_stmt_rc(rc, stmt);

rc= mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, &cursor);
check_stmt_rc(rc, stmt);

rc= mysql_stmt_execute(stmt);
check_stmt_rc(rc, stmt);

mysql_stmt_close(stmt);
return OK;
}

struct my_tests_st my_tests[] = {
{"test_conc566", test_conc566, TEST_CONNECTION_DEFAULT, 0, NULL, NULL},
{"test_conc512", test_conc512, TEST_CONNECTION_DEFAULT, 0, NULL, NULL},
{"test_conc504", test_conc504, TEST_CONNECTION_DEFAULT, 0, NULL, NULL},
{"test_returning", test_returning, TEST_CONNECTION_DEFAULT, 0, NULL, NULL},
Expand Down

0 comments on commit 4b9379b

Please sign in to comment.