summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mysql.h2
-rw-r--r--libmysql/libmysql.c5
-rw-r--r--sql-common/client.c2
-rw-r--r--tests/mysql_client_test.c44
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 }
};