Loading client/mysqltest.c +21 −4 Original line number Diff line number Diff line Loading @@ -724,6 +724,20 @@ void close_connections() } void close_statements() { struct st_connection *con; DBUG_ENTER("close_statements"); for (con= connections; con < next_con; con++) { if (con->stmt) mysql_stmt_close(con->stmt); con->stmt= 0; } DBUG_VOID_RETURN; } void close_files() { DBUG_ENTER("close_files"); Loading Loading @@ -2907,6 +2921,10 @@ void do_close_connection(struct st_command *command) } } #endif if (next_con->stmt) mysql_stmt_close(next_con->stmt); next_con->stmt= 0; mysql_close(&con->mysql); if (con->util_mysql) mysql_close(con->util_mysql); Loading Loading @@ -5112,10 +5130,7 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command, */ var_set_errno(mysql_stmt_errno(stmt)); #ifndef BUG15518_FIXED mysql_stmt_close(stmt); cur_con->stmt= NULL; #endif DBUG_VOID_RETURN; } Loading Loading @@ -5902,6 +5917,8 @@ int main(int argc, char **argv) break; case Q_DISABLE_PS_PROTOCOL: ps_protocol_enabled= 0; /* Close any open statements */ close_statements(); break; case Q_ENABLE_PS_PROTOCOL: ps_protocol_enabled= ps_protocol; Loading libmysql/libmysql.c +11 −3 Original line number Diff line number Diff line Loading @@ -2042,6 +2042,13 @@ mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, ulong length) DBUG_RETURN(1); } /* Reset the last error in any case: that would clear the statement if the previous prepare failed. */ stmt->last_errno= 0; stmt->last_error[0]= '\0'; if ((int) stmt->state > (int) MYSQL_STMT_INIT_DONE) { /* This is second prepare with another statement */ Loading @@ -2055,23 +2062,24 @@ mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, ulong length) */ stmt->bind_param_done= stmt->bind_result_done= FALSE; stmt->param_count= stmt->field_count= 0; stmt->last_errno= 0; stmt->last_error[0]= '\0'; free_root(&stmt->mem_root, MYF(MY_KEEP_PREALLOC)); int4store(buff, stmt->stmt_id); /* Close statement in server If there was a 'use' result from another statement, or from mysql_use_result it won't be freed in mysql_stmt_free_result and we should get 'Commands out of sync' here. */ stmt->state= MYSQL_STMT_INIT_DONE; if (stmt_command(mysql, COM_STMT_CLOSE, buff, 4, stmt)) { set_stmt_errmsg(stmt, mysql->net.last_error, mysql->net.last_errno, mysql->net.sqlstate); DBUG_RETURN(1); } stmt->state= MYSQL_STMT_INIT_DONE; } if (stmt_command(mysql, COM_STMT_PREPARE, query, length, stmt)) Loading tests/mysql_client_test.c +85 −8 Original line number Diff line number Diff line Loading @@ -11013,7 +11013,7 @@ static void test_view() rc= mysql_stmt_execute(stmt); check_execute(stmt, rc); rc= my_process_stmt_result(stmt); assert(1 == rc); DIE_UNLESS(1 == rc); } mysql_stmt_close(stmt); Loading Loading @@ -11056,7 +11056,7 @@ static void test_view_where() rc= mysql_stmt_execute(stmt); check_execute(stmt, rc); rc= my_process_stmt_result(stmt); assert(4 == rc); DIE_UNLESS(4 == rc); } mysql_stmt_close(stmt); Loading Loading @@ -11139,7 +11139,7 @@ static void test_view_2where() rc= mysql_stmt_execute(stmt); check_execute(stmt, rc); rc= my_process_stmt_result(stmt); assert(0 == rc); DIE_UNLESS(0 == rc); mysql_stmt_close(stmt); Loading Loading @@ -11192,7 +11192,7 @@ static void test_view_star() rc= mysql_stmt_execute(stmt); check_execute(stmt, rc); rc= my_process_stmt_result(stmt); assert(0 == rc); DIE_UNLESS(0 == rc); } mysql_stmt_close(stmt); Loading Loading @@ -11255,7 +11255,7 @@ static void test_view_insert() rc= mysql_stmt_execute(select_stmt); check_execute(select_stmt, rc); rowcount= (int)my_process_stmt_result(select_stmt); assert((i+1) == rowcount); DIE_UNLESS((i+1) == rowcount); } mysql_stmt_close(insert_stmt); mysql_stmt_close(select_stmt); Loading Loading @@ -11296,7 +11296,7 @@ static void test_left_join_view() rc= mysql_stmt_execute(stmt); check_execute(stmt, rc); rc= my_process_stmt_result(stmt); assert(3 == rc); DIE_UNLESS(3 == rc); } mysql_stmt_close(stmt); Loading Loading @@ -11372,7 +11372,7 @@ static void test_view_insert_fields() rc= mysql_stmt_execute(stmt); check_execute(stmt, rc); rc= my_process_stmt_result(stmt); assert(1 == rc); DIE_UNLESS(1 == rc); mysql_stmt_close(stmt); rc= mysql_query(mysql, "DROP VIEW v1"); Loading Loading @@ -12850,6 +12850,82 @@ static void test_bug7990() DIE_UNLESS(!mysql_errno(mysql)); } /* Bug #15518 - Reusing a stmt that has failed during prepare does not clear error */ static void test_bug15518() { MYSQL_STMT *stmt; MYSQL* mysql1; int rc; myheader("test_bug15518"); mysql1= mysql_init(NULL); if (!mysql_real_connect(mysql1, opt_host, opt_user, opt_password, opt_db ? opt_db : "test", opt_port, opt_unix_socket, CLIENT_MULTI_STATEMENTS)) { fprintf(stderr, "Failed to connect to the database\n"); DIE_UNLESS(0); } stmt= mysql_stmt_init(mysql1); /* The prepare of foo should fail with errno 1064 since it's not a valid query */ rc= mysql_stmt_prepare(stmt, "foo", 3); if (!opt_silent) fprintf(stdout, "rc: %d, mysql_stmt_errno: %d, mysql_errno: %d\n", rc, mysql_stmt_errno(stmt), mysql_errno(mysql1)); DIE_UNLESS(rc && mysql_stmt_errno(stmt) && mysql_errno(mysql1)); /* Use the same stmt and reprepare with another query that suceeds */ rc= mysql_stmt_prepare(stmt, "SHOW STATUS", 12); if (!opt_silent) fprintf(stdout, "rc: %d, mysql_stmt_errno: %d, mysql_errno: %d\n", rc, mysql_stmt_errno(stmt), mysql_errno(mysql1)); DIE_UNLESS(!rc || mysql_stmt_errno(stmt) || mysql_errno(mysql1)); mysql_stmt_close(stmt); DIE_UNLESS(!mysql_errno(mysql1)); /* part2, when connection to server has been closed after first prepare */ stmt= mysql_stmt_init(mysql1); rc= mysql_stmt_prepare(stmt, "foo", 3); if (!opt_silent) fprintf(stdout, "rc: %d, mysql_stmt_errno: %d, mysql_errno: %d\n", rc, mysql_stmt_errno(stmt), mysql_errno(mysql1)); DIE_UNLESS(rc && mysql_stmt_errno(stmt) && mysql_errno(mysql1)); /* Close connection to server */ mysql_close(mysql1); /* Use the same stmt and reprepare with another query that suceeds. The prepare should fail with error 2013 since connection to server has been closed. */ rc= mysql_stmt_prepare(stmt, "SHOW STATUS", 12); if (!opt_silent) fprintf(stdout, "rc: %d, mysql_stmt_errno: %d\n", rc, mysql_stmt_errno(stmt)); DIE_UNLESS(rc && mysql_stmt_errno(stmt)); mysql_stmt_close(stmt); DIE_UNLESS(mysql_errno(mysql1)); } static void test_view_sp_list_fields() { Loading Loading @@ -15008,7 +15084,7 @@ static void test_bug17667() } else { assert(0==1); DIE_UNLESS(0==1); } } Loading Loading @@ -15732,6 +15808,7 @@ static struct my_tests_st my_tests[]= { { "test_bug15752", test_bug15752 }, { "test_bug21206", test_bug21206 }, { "test_bug21726", test_bug21726 }, { "test_bug15518", test_bug15518 }, { "test_bug23383", test_bug23383 }, { "test_bug21635", test_bug21635 }, { 0, 0 } Loading Loading
client/mysqltest.c +21 −4 Original line number Diff line number Diff line Loading @@ -724,6 +724,20 @@ void close_connections() } void close_statements() { struct st_connection *con; DBUG_ENTER("close_statements"); for (con= connections; con < next_con; con++) { if (con->stmt) mysql_stmt_close(con->stmt); con->stmt= 0; } DBUG_VOID_RETURN; } void close_files() { DBUG_ENTER("close_files"); Loading Loading @@ -2907,6 +2921,10 @@ void do_close_connection(struct st_command *command) } } #endif if (next_con->stmt) mysql_stmt_close(next_con->stmt); next_con->stmt= 0; mysql_close(&con->mysql); if (con->util_mysql) mysql_close(con->util_mysql); Loading Loading @@ -5112,10 +5130,7 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command, */ var_set_errno(mysql_stmt_errno(stmt)); #ifndef BUG15518_FIXED mysql_stmt_close(stmt); cur_con->stmt= NULL; #endif DBUG_VOID_RETURN; } Loading Loading @@ -5902,6 +5917,8 @@ int main(int argc, char **argv) break; case Q_DISABLE_PS_PROTOCOL: ps_protocol_enabled= 0; /* Close any open statements */ close_statements(); break; case Q_ENABLE_PS_PROTOCOL: ps_protocol_enabled= ps_protocol; Loading
libmysql/libmysql.c +11 −3 Original line number Diff line number Diff line Loading @@ -2042,6 +2042,13 @@ mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, ulong length) DBUG_RETURN(1); } /* Reset the last error in any case: that would clear the statement if the previous prepare failed. */ stmt->last_errno= 0; stmt->last_error[0]= '\0'; if ((int) stmt->state > (int) MYSQL_STMT_INIT_DONE) { /* This is second prepare with another statement */ Loading @@ -2055,23 +2062,24 @@ mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, ulong length) */ stmt->bind_param_done= stmt->bind_result_done= FALSE; stmt->param_count= stmt->field_count= 0; stmt->last_errno= 0; stmt->last_error[0]= '\0'; free_root(&stmt->mem_root, MYF(MY_KEEP_PREALLOC)); int4store(buff, stmt->stmt_id); /* Close statement in server If there was a 'use' result from another statement, or from mysql_use_result it won't be freed in mysql_stmt_free_result and we should get 'Commands out of sync' here. */ stmt->state= MYSQL_STMT_INIT_DONE; if (stmt_command(mysql, COM_STMT_CLOSE, buff, 4, stmt)) { set_stmt_errmsg(stmt, mysql->net.last_error, mysql->net.last_errno, mysql->net.sqlstate); DBUG_RETURN(1); } stmt->state= MYSQL_STMT_INIT_DONE; } if (stmt_command(mysql, COM_STMT_PREPARE, query, length, stmt)) Loading
tests/mysql_client_test.c +85 −8 Original line number Diff line number Diff line Loading @@ -11013,7 +11013,7 @@ static void test_view() rc= mysql_stmt_execute(stmt); check_execute(stmt, rc); rc= my_process_stmt_result(stmt); assert(1 == rc); DIE_UNLESS(1 == rc); } mysql_stmt_close(stmt); Loading Loading @@ -11056,7 +11056,7 @@ static void test_view_where() rc= mysql_stmt_execute(stmt); check_execute(stmt, rc); rc= my_process_stmt_result(stmt); assert(4 == rc); DIE_UNLESS(4 == rc); } mysql_stmt_close(stmt); Loading Loading @@ -11139,7 +11139,7 @@ static void test_view_2where() rc= mysql_stmt_execute(stmt); check_execute(stmt, rc); rc= my_process_stmt_result(stmt); assert(0 == rc); DIE_UNLESS(0 == rc); mysql_stmt_close(stmt); Loading Loading @@ -11192,7 +11192,7 @@ static void test_view_star() rc= mysql_stmt_execute(stmt); check_execute(stmt, rc); rc= my_process_stmt_result(stmt); assert(0 == rc); DIE_UNLESS(0 == rc); } mysql_stmt_close(stmt); Loading Loading @@ -11255,7 +11255,7 @@ static void test_view_insert() rc= mysql_stmt_execute(select_stmt); check_execute(select_stmt, rc); rowcount= (int)my_process_stmt_result(select_stmt); assert((i+1) == rowcount); DIE_UNLESS((i+1) == rowcount); } mysql_stmt_close(insert_stmt); mysql_stmt_close(select_stmt); Loading Loading @@ -11296,7 +11296,7 @@ static void test_left_join_view() rc= mysql_stmt_execute(stmt); check_execute(stmt, rc); rc= my_process_stmt_result(stmt); assert(3 == rc); DIE_UNLESS(3 == rc); } mysql_stmt_close(stmt); Loading Loading @@ -11372,7 +11372,7 @@ static void test_view_insert_fields() rc= mysql_stmt_execute(stmt); check_execute(stmt, rc); rc= my_process_stmt_result(stmt); assert(1 == rc); DIE_UNLESS(1 == rc); mysql_stmt_close(stmt); rc= mysql_query(mysql, "DROP VIEW v1"); Loading Loading @@ -12850,6 +12850,82 @@ static void test_bug7990() DIE_UNLESS(!mysql_errno(mysql)); } /* Bug #15518 - Reusing a stmt that has failed during prepare does not clear error */ static void test_bug15518() { MYSQL_STMT *stmt; MYSQL* mysql1; int rc; myheader("test_bug15518"); mysql1= mysql_init(NULL); if (!mysql_real_connect(mysql1, opt_host, opt_user, opt_password, opt_db ? opt_db : "test", opt_port, opt_unix_socket, CLIENT_MULTI_STATEMENTS)) { fprintf(stderr, "Failed to connect to the database\n"); DIE_UNLESS(0); } stmt= mysql_stmt_init(mysql1); /* The prepare of foo should fail with errno 1064 since it's not a valid query */ rc= mysql_stmt_prepare(stmt, "foo", 3); if (!opt_silent) fprintf(stdout, "rc: %d, mysql_stmt_errno: %d, mysql_errno: %d\n", rc, mysql_stmt_errno(stmt), mysql_errno(mysql1)); DIE_UNLESS(rc && mysql_stmt_errno(stmt) && mysql_errno(mysql1)); /* Use the same stmt and reprepare with another query that suceeds */ rc= mysql_stmt_prepare(stmt, "SHOW STATUS", 12); if (!opt_silent) fprintf(stdout, "rc: %d, mysql_stmt_errno: %d, mysql_errno: %d\n", rc, mysql_stmt_errno(stmt), mysql_errno(mysql1)); DIE_UNLESS(!rc || mysql_stmt_errno(stmt) || mysql_errno(mysql1)); mysql_stmt_close(stmt); DIE_UNLESS(!mysql_errno(mysql1)); /* part2, when connection to server has been closed after first prepare */ stmt= mysql_stmt_init(mysql1); rc= mysql_stmt_prepare(stmt, "foo", 3); if (!opt_silent) fprintf(stdout, "rc: %d, mysql_stmt_errno: %d, mysql_errno: %d\n", rc, mysql_stmt_errno(stmt), mysql_errno(mysql1)); DIE_UNLESS(rc && mysql_stmt_errno(stmt) && mysql_errno(mysql1)); /* Close connection to server */ mysql_close(mysql1); /* Use the same stmt and reprepare with another query that suceeds. The prepare should fail with error 2013 since connection to server has been closed. */ rc= mysql_stmt_prepare(stmt, "SHOW STATUS", 12); if (!opt_silent) fprintf(stdout, "rc: %d, mysql_stmt_errno: %d\n", rc, mysql_stmt_errno(stmt)); DIE_UNLESS(rc && mysql_stmt_errno(stmt)); mysql_stmt_close(stmt); DIE_UNLESS(mysql_errno(mysql1)); } static void test_view_sp_list_fields() { Loading Loading @@ -15008,7 +15084,7 @@ static void test_bug17667() } else { assert(0==1); DIE_UNLESS(0==1); } } Loading Loading @@ -15732,6 +15808,7 @@ static struct my_tests_st my_tests[]= { { "test_bug15752", test_bug15752 }, { "test_bug21206", test_bug21206 }, { "test_bug21726", test_bug21726 }, { "test_bug15518", test_bug15518 }, { "test_bug23383", test_bug23383 }, { "test_bug21635", test_bug21635 }, { 0, 0 } Loading