From 5b8a965408f172c5b00d5a1351cec32cd9645edf Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 17 Nov 2005 16:20:12 +0300 Subject: [PATCH] A fix and a test case for Bug#13524 "lock timeout gives incorrect warning on open cursor" sql/sql_prepare.cc: A fix for Bug#13524 "lock timeout gives incorrect warning on open cursor": reset the connection for next command before performing a cursor fetch (add an omitted line). tests/mysql_client_test.c: A test case for Bug#13524 "lock timeout gives incorrect warning on open cursor" --- sql/sql_prepare.cc | 1 + tests/mysql_client_test.c | 63 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index ced862170ec..c7145e3aabc 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -2312,6 +2312,7 @@ void mysql_stmt_fetch(THD *thd, char *packet, uint packet_length) Server_side_cursor *cursor; DBUG_ENTER("mysql_stmt_fetch"); + mysql_reset_thd_for_next_command(thd); statistic_increment(thd->status_var.com_stmt_fetch, &LOCK_status); if (!(stmt= find_prepared_statement(thd, stmt_id, "mysql_stmt_fetch"))) DBUG_VOID_RETURN; diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index b065a0dfa03..e0f3fd91e5c 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -14419,7 +14419,7 @@ static void test_bug14210() myquery(rc); } -/* Bug#13488 */ +/* Bug#13488: wrong column metadata when fetching from cursor */ static void test_bug13488() { @@ -14487,6 +14487,66 @@ static void test_bug13488() myquery(rc); } +/* + Bug#13524: warnings of a previous command are not reset when fetching + from a cursor. +*/ + +static void test_bug13524() +{ + MYSQL_STMT *stmt; + int rc; + unsigned int warning_count; + const ulong type= CURSOR_TYPE_READ_ONLY; + const char *query= "select * from t1"; + + myheader("test_bug13524"); + + rc= mysql_query(mysql, "drop table if exists t1, t2"); + myquery(rc); + rc= mysql_query(mysql, "create table t1 (a int not null primary key)"); + myquery(rc); + rc= mysql_query(mysql, "insert into t1 values (1), (2), (3), (4)"); + myquery(rc); + + stmt= mysql_stmt_init(mysql); + rc= mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (const void*) &type); + check_execute(stmt, rc); + + rc= mysql_stmt_prepare(stmt, query, strlen(query)); + check_execute(stmt, rc); + + rc= mysql_stmt_execute(stmt); + check_execute(stmt, rc); + + rc= mysql_stmt_fetch(stmt); + check_execute(stmt, rc); + + warning_count= mysql_warning_count(mysql); + DIE_UNLESS(warning_count == 0); + + /* Check that DROP TABLE produced a warning (no such table) */ + rc= mysql_query(mysql, "drop table if exists t2"); + myquery(rc); + warning_count= mysql_warning_count(mysql); + DIE_UNLESS(warning_count == 1); + + /* + Check that fetch from a cursor cleared the warning from the previous + command. + */ + rc= mysql_stmt_fetch(stmt); + check_execute(stmt, rc); + warning_count= mysql_warning_count(mysql); + DIE_UNLESS(warning_count == 0); + + /* Cleanup */ + mysql_stmt_close(stmt); + rc= mysql_query(mysql, "drop table t1"); + myquery(rc); +} + + /* Read and parse arguments and MySQL options from my.cnf */ @@ -14744,6 +14804,7 @@ static struct my_tests_st my_tests[]= { { "test_bug12243", test_bug12243 }, { "test_bug14210", test_bug14210 }, { "test_bug13488", test_bug13488 }, + { "test_bug13524", test_bug13524 }, { 0, 0 } };