diff options
-rw-r--r-- | include/mysql.h | 2 | ||||
-rw-r--r-- | libmysql/libmysql.c | 5 | ||||
-rw-r--r-- | sql-common/client.c | 2 | ||||
-rw-r--r-- | tests/mysql_client_test.c | 44 |
4 files changed, 49 insertions, 4 deletions
diff --git a/include/mysql.h b/include/mysql.h index ab61fe694d9..0949937814c 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -381,7 +381,7 @@ unsigned int STDCALL mysql_warning_count(MYSQL *mysql); const char * STDCALL mysql_info(MYSQL *mysql); unsigned long STDCALL mysql_thread_id(MYSQL *mysql); const char * STDCALL mysql_character_set_name(MYSQL *mysql); -int STDCALL mysql_set_character_set(MYSQL *mysql, char *csname); +int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname); MYSQL * STDCALL mysql_init(MYSQL *mysql); my_bool STDCALL mysql_ssl_set(MYSQL *mysql, const char *key, diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index d80b2ef0e39..e5681edd3d8 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -1510,7 +1510,7 @@ const char * STDCALL mysql_character_set_name(MYSQL *mysql) } -int STDCALL mysql_set_character_set(MYSQL *mysql, char *cs_name) +int STDCALL mysql_set_character_set(MYSQL *mysql, const char *cs_name) { struct charset_info_st *cs; const char *save_csdir= charsets_dir; @@ -1518,7 +1518,8 @@ int STDCALL mysql_set_character_set(MYSQL *mysql, char *cs_name) if (mysql->options.charset_dir) charsets_dir= mysql->options.charset_dir; - if ((cs= get_charset_by_csname(cs_name, MY_CS_PRIMARY, MYF(0)))) + if (strlen(cs_name) < MY_CS_NAME_SIZE && + (cs= get_charset_by_csname(cs_name, MY_CS_PRIMARY, MYF(0)))) { char buff[MY_CS_NAME_SIZE + 10]; charsets_dir= save_csdir; diff --git a/sql-common/client.c b/sql-common/client.c index c25e0e3de8f..860db63c531 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -755,7 +755,7 @@ static void cli_flush_use_result(MYSQL *mysql) { if (protocol_41(mysql)) { - char *pos= (char*) mysql->net.read_pos; + char *pos= (char*) mysql->net.read_pos + 1; mysql->warning_count=uint2korr(pos); pos+=2; mysql->server_status=uint2korr(pos); pos+=2; } diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index 1470c762602..139595a5471 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -11751,6 +11751,49 @@ static void test_bug11183() myquery(rc); } +static void test_bug12001() +{ + MYSQL *mysql_local; + MYSQL_RES *result; + const char *query= "DROP TABLE IF EXISTS test_table;" + "CREATE TABLE test_table(id INT);" + "INSERT INTO test_table VALUES(10);" + "UPDATE test_table SET id=20 WHERE id=10;" + "SELECT * FROM test_table;" + "INSERT INTO non_existent_table VALUES(11);"; + int rc, res; + + myheader("test_bug12001"); + + if (!(mysql_local= mysql_init(NULL))) + { + fprintf(stdout, "\n mysql_init() failed"); + exit(1); + } + + /* Create connection that supports multi statements */ + if (!mysql_real_connect(mysql_local, opt_host, opt_user, + opt_password, current_db, opt_port, + opt_unix_socket, CLIENT_MULTI_STATEMENTS | CLIENT_MULTI_RESULTS)) { + fprintf(stdout, "\n mysql_real_connect() failed"); + exit(1); + } + + rc= mysql_query(mysql_local, query); + myquery(rc); + + do { + if (mysql_field_count(mysql_local) && (result= mysql_use_result(mysql_local))) { + mysql_free_result(result); + } + } while (!(res= mysql_next_result(mysql_local))); + + rc= mysql_query(mysql_local, "DROP TABLE IF EXISTS test_table"); + myquery(rc); + + mysql_close(mysql_local); + DIE_UNLESS(res==1); +} /* Read and parse arguments and MySQL options from my.cnf @@ -11968,6 +12011,7 @@ static struct my_tests_st my_tests[]= { { "test_bug8378", test_bug8378 }, { "test_bug9735", test_bug9735 }, { "test_bug11183", test_bug11183 }, + { "test_bug12001", test_bug12001 }, { 0, 0 } }; |