From 5768d57013eefa5f744963996a73c1ab5a15e388 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 15 Aug 2006 16:57:46 +0400 Subject: [PATCH 1/4] Fix for BUG#21247: im_instance_conf.imtest fails on trees with test-1 in their name. The problem was that IM-tests contained grep-statements with too wide patterns. The fix is to make these patterns more restrictive. Only IM-tests have been fixed, no code has been touched. mysql-test/t/im_instance_conf.imtest: Use more restrictive pattern. mysql-test/t/im_options.imtest: Use more restrictive pattern. --- mysql-test/t/im_instance_conf.imtest | 54 ++++++++++++++-------------- mysql-test/t/im_options.imtest | 48 ++++++++++++------------- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/mysql-test/t/im_instance_conf.imtest b/mysql-test/t/im_instance_conf.imtest index 3d254b16ca5..abd22c1ba9d 100644 --- a/mysql-test/t/im_instance_conf.imtest +++ b/mysql-test/t/im_instance_conf.imtest @@ -37,7 +37,7 @@ # Check that the configuration file contains only instances that we expect. --echo -------------------------------------------------------------------- ---exec grep server_id $MYSQLTEST_VARDIR/im.cnf; +--exec grep '^server_id\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- # Check that mysqld1 is reported as running. @@ -79,7 +79,7 @@ CREATE INSTANCE mysqld3 SHOW INSTANCES; --echo -------------------------------------------------------------------- ---exec grep server_id $MYSQLTEST_VARDIR/im.cnf ; +--exec grep '^server_id\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- # Check that CREATE INSTANCE fails for existing instance. Let's all three @@ -101,7 +101,7 @@ CREATE INSTANCE mysqld3; # - without values; --echo -------------------------------------------------------------------- ---exec grep nonguarded $MYSQLTEST_VARDIR/im.cnf; +--exec grep '^nonguarded\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- CREATE INSTANCE mysqld4 @@ -112,15 +112,15 @@ CREATE INSTANCE mysqld4 SHOW INSTANCES; --echo -------------------------------------------------------------------- ---exec grep nonguarded $MYSQLTEST_VARDIR/im.cnf; +--exec grep '^nonguarded\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- # - with value; --echo -------------------------------------------------------------------- ---exec grep test-A $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^test-A\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- ---exec grep test-B $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^test-B\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- CREATE INSTANCE mysqld5 @@ -132,9 +132,9 @@ CREATE INSTANCE mysqld5 SHOW INSTANCES; --echo -------------------------------------------------------------------- ---exec grep test-A $MYSQLTEST_VARDIR/im.cnf; +--exec grep '^test-A\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- ---exec grep test-B $MYSQLTEST_VARDIR/im.cnf; +--exec grep '^test-B\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- # Check that CREATE INSTANCE parses options and handles grammar errors @@ -144,7 +144,7 @@ SHOW INSTANCES; # - check handling of extra spaces; --echo -------------------------------------------------------------------- ---exec grep test-C $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^test-C\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- CREATE INSTANCE mysqld6 @@ -156,17 +156,17 @@ CREATE INSTANCE mysqld6 SHOW INSTANCES; --echo -------------------------------------------------------------------- ---exec grep test-C1 $MYSQLTEST_VARDIR/im.cnf; +--exec grep '^test-C1\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- ---exec grep test-C2 $MYSQLTEST_VARDIR/im.cnf; +--exec grep '^test-C2\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- # - check handling of grammar error; --echo -------------------------------------------------------------------- ---exec grep test-D $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^test-D\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- ---exec grep test-E $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^test-E\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- --error ER_SYNTAX_ERROR @@ -182,21 +182,21 @@ CREATE INSTANCE mysqld8 test-F = ; SHOW INSTANCES; --echo -------------------------------------------------------------------- ---exec grep test-D $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^test-D\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- ---exec grep test-E $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^test-E\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- # - check parsing of string option values --echo -------------------------------------------------------------------- ---exec grep test-1 $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^test-1\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- ---exec grep test-2 $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^test-2\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- ---exec grep test-3 $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^test-3\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- ---exec grep test-4 $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^test-4\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- CREATE INSTANCE mysqld9 @@ -233,21 +233,21 @@ CREATE INSTANCE mysqld13 test-bad=' \ '; SHOW INSTANCES; --echo -------------------------------------------------------------------- ---exec grep test-1 $MYSQLTEST_VARDIR/im.cnf; +--exec grep '^test-1\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- ---exec grep test-2 $MYSQLTEST_VARDIR/im.cnf; +--exec grep '^test-2\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- ---exec grep test-3 $MYSQLTEST_VARDIR/im.cnf; +--exec grep '^test-3\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- ---exec grep test-4 $MYSQLTEST_VARDIR/im.cnf; +--exec grep '^test-4\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- ---exec grep test-5 $MYSQLTEST_VARDIR/im.cnf; +--exec grep '^test-5\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- ---exec grep test-6 $MYSQLTEST_VARDIR/im.cnf; +--exec grep '^test-6\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- ---exec grep test-7 $MYSQLTEST_VARDIR/im.cnf; +--exec grep '^test-7\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- ---exec grep test-bad $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^test-bad\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- diff --git a/mysql-test/t/im_options.imtest b/mysql-test/t/im_options.imtest index 55bd29c9ee1..fbead0b290c 100644 --- a/mysql-test/t/im_options.imtest +++ b/mysql-test/t/im_options.imtest @@ -43,7 +43,7 @@ # - check the configuration file; --echo -------------------------------------------------------------------- ---exec grep server_id $MYSQLTEST_VARDIR/im.cnf ; +--exec grep '^server_id\>' $MYSQLTEST_VARDIR/im.cnf ; --echo -------------------------------------------------------------------- # - check the running instances. @@ -133,25 +133,25 @@ UNSET mysqld2.server_id = 11; SET mysqld2.aaa, mysqld3.bbb, mysqld2.ccc = 0010, mysqld3.ddd = 0020; --echo -------------------------------------------------------------------- ---exec grep aaa $MYSQLTEST_VARDIR/im.cnf ; +--exec grep '^aaa\>' $MYSQLTEST_VARDIR/im.cnf ; --echo -------------------------------------------------------------------- ---exec grep bbb $MYSQLTEST_VARDIR/im.cnf ; +--exec grep '^bbb\>' $MYSQLTEST_VARDIR/im.cnf ; --echo -------------------------------------------------------------------- ---exec grep ccc $MYSQLTEST_VARDIR/im.cnf ; +--exec grep '^ccc\>' $MYSQLTEST_VARDIR/im.cnf ; --echo -------------------------------------------------------------------- ---exec grep ddd $MYSQLTEST_VARDIR/im.cnf ; +--exec grep '^ddd\>' $MYSQLTEST_VARDIR/im.cnf ; --echo -------------------------------------------------------------------- UNSET mysqld2.aaa, mysqld3.bbb, mysqld2.ccc, mysqld3.ddd; --echo -------------------------------------------------------------------- ---exec grep aaa $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^aaa\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- ---exec grep bbb $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^bbb\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- ---exec grep ccc $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^ccc\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- ---exec grep ddd $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^ddd\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- # - check that if some instance name is invalid or the active is active, @@ -161,22 +161,22 @@ UNSET mysqld2.aaa, mysqld3.bbb, mysqld2.ccc, mysqld3.ddd; SET mysqld2.aaa, mysqld3.bbb, mysqld.ccc = 0010; --echo -------------------------------------------------------------------- ---exec grep aaa $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^aaa\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- ---exec grep bbb $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^bbb\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- ---exec grep ccc $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^ccc\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- --error 3015 # ER_INSTANCE_IS_ACTIVE SET mysqld2.aaa, mysqld3.bbb, mysqld1.ccc = 0010; --echo -------------------------------------------------------------------- ---exec grep aaa $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^aaa\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- ---exec grep bbb $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^bbb\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- ---exec grep ccc $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^ccc\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- # - check that if some instance name is invalid or the active is active, @@ -186,14 +186,14 @@ SET mysqld2.aaa, mysqld3.bbb, mysqld1.ccc = 0010; UNSET mysqld2.server_id, mysqld3.server_id, mysqld.ccc; --echo -------------------------------------------------------------------- ---exec grep server_id $MYSQLTEST_VARDIR/im.cnf; +--exec grep '^server_id\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- --error 3015 # ER_INSTANCE_IS_ACTIVE UNSET mysqld2.server_id, mysqld3.server_id, mysqld1.ccc; --echo -------------------------------------------------------------------- ---exec grep server_id $MYSQLTEST_VARDIR/im.cnf; +--exec grep '^server_id\>' $MYSQLTEST_VARDIR/im.cnf; --echo -------------------------------------------------------------------- DROP INSTANCE mysqld3; @@ -207,21 +207,21 @@ SET mysqld2 . server_id = 222 ; SET mysqld2 . server_id = 222 , mysqld2 . aaa , mysqld2 . bbb ; --echo -------------------------------------------------------------------- ---exec grep server_id $MYSQLTEST_VARDIR/im.cnf ; +--exec grep '^server_id\>' $MYSQLTEST_VARDIR/im.cnf ; --echo -------------------------------------------------------------------- ---exec grep aaa $MYSQLTEST_VARDIR/im.cnf ; +--exec grep '^aaa\>' $MYSQLTEST_VARDIR/im.cnf ; --echo -------------------------------------------------------------------- ---exec grep bbb $MYSQLTEST_VARDIR/im.cnf ; +--exec grep '^bbb\>' $MYSQLTEST_VARDIR/im.cnf ; --echo -------------------------------------------------------------------- UNSET mysqld2 . aaa , mysqld2 . bbb ; --echo -------------------------------------------------------------------- ---exec grep server_id $MYSQLTEST_VARDIR/im.cnf ; +--exec grep '^server_id\>' $MYSQLTEST_VARDIR/im.cnf ; --echo -------------------------------------------------------------------- ---exec grep aaa $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^aaa\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- ---exec grep bbb $MYSQLTEST_VARDIR/im.cnf || true; +--exec grep '^bbb\>' $MYSQLTEST_VARDIR/im.cnf || true; --echo -------------------------------------------------------------------- ########################################################################### @@ -235,7 +235,7 @@ UNSET mysqld2 . aaa , mysqld2 . bbb ; # server_id=SERVER_ID for mysqld2); --echo -------------------------------------------------------------------- ---exec grep server_id $MYSQLTEST_VARDIR/im.cnf ; +--exec grep '^server_id\>' $MYSQLTEST_VARDIR/im.cnf ; --echo -------------------------------------------------------------------- # - (for mysqld1) check that the running instance has not been affected: From 728a924c66d90aa78d49a36a20b578b41e9bd4d4 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 17 Aug 2006 18:13:45 +0200 Subject: [PATCH 2/4] Cleanup patch. There is an existing macros for initializing LEX_STRINGs with constant strings -> C_STRING_WITH_LEN. Change existing code to use it. (char *) STRING_WITH_LEN -> C_STRING_WITH_LEN sql/handler.cc: There is an existing macros for initializing LEX_STRINGs with constant strings -> C_STRING_WITH_LEN. Change existing code to use it. (char *) STRING_WITH_LEN -> C_STRING_WITH_LEN sql/item.cc: There is an existing macros for initializing LEX_STRINGs with constant strings -> C_STRING_WITH_LEN. Change existing code to use it. (char *) STRING_WITH_LEN -> C_STRING_WITH_LEN sql/mysql_priv.h: There is an existing macros for initializing LEX_STRINGs with constant strings -> C_STRING_WITH_LEN. Change existing code to use it. (char *) STRING_WITH_LEN -> C_STRING_WITH_LEN sql/sql_acl.cc: There is an existing macros for initializing LEX_STRINGs with constant strings -> C_STRING_WITH_LEN. Change existing code to use it. (char *) STRING_WITH_LEN -> C_STRING_WITH_LEN sql/sql_error.cc: There is an existing macros for initializing LEX_STRINGs with constant strings -> C_STRING_WITH_LEN. Change existing code to use it. (char *) STRING_WITH_LEN -> C_STRING_WITH_LEN sql/sql_error.h: There is an existing macros for initializing LEX_STRINGs with constant strings -> C_STRING_WITH_LEN. Change existing code to use it. (char *) STRING_WITH_LEN -> C_STRING_WITH_LEN sql/sql_lex.h: There is an existing macros for initializing LEX_STRINGs with constant strings -> C_STRING_WITH_LEN. Change existing code to use it. (char *) STRING_WITH_LEN -> C_STRING_WITH_LEN sql/sql_parse.cc: There is an existing macros for initializing LEX_STRINGs with constant strings -> C_STRING_WITH_LEN. Change existing code to use it. (char *) STRING_WITH_LEN -> C_STRING_WITH_LEN sql/sql_partition.cc: There is an existing macros for initializing LEX_STRINGs with constant strings -> C_STRING_WITH_LEN. Change existing code to use it. (char *) STRING_WITH_LEN -> C_STRING_WITH_LEN sql/sql_plugin.cc: There is an existing macros for initializing LEX_STRINGs with constant strings -> C_STRING_WITH_LEN. Change existing code to use it. (char *) STRING_WITH_LEN -> C_STRING_WITH_LEN sql/sql_show.cc: There is an existing macros for initializing LEX_STRINGs with constant strings -> C_STRING_WITH_LEN. Change existing code to use it. (char *) STRING_WITH_LEN -> C_STRING_WITH_LEN sql/sql_trigger.cc: There is an existing macros for initializing LEX_STRINGs with constant strings -> C_STRING_WITH_LEN. Change existing code to use it. (char *) STRING_WITH_LEN -> C_STRING_WITH_LEN sql/sql_view.cc: There is an existing macros for initializing LEX_STRINGs with constant strings -> C_STRING_WITH_LEN. Change existing code to use it. (char *) STRING_WITH_LEN -> C_STRING_WITH_LEN sql/tztime.cc: There is an existing macros for initializing LEX_STRINGs with constant strings -> C_STRING_WITH_LEN. Change existing code to use it. (char *) STRING_WITH_LEN -> C_STRING_WITH_LEN --- sql/handler.cc | 10 ++-- sql/item.cc | 2 +- sql/mysql_priv.h | 2 +- sql/sql_acl.cc | 126 +++++++++++++++++++++---------------------- sql/sql_error.cc | 10 ++-- sql/sql_error.h | 2 +- sql/sql_lex.h | 10 ++-- sql/sql_parse.cc | 70 ++++++++++++------------ sql/sql_partition.cc | 12 ++--- sql/sql_plugin.cc | 6 +-- sql/sql_show.cc | 10 ++-- sql/sql_trigger.cc | 24 ++++----- sql/sql_view.cc | 26 ++++----- sql/tztime.cc | 10 ++-- 14 files changed, 160 insertions(+), 160 deletions(-) diff --git a/sql/handler.cc b/sql/handler.cc index fbccfe7fa46..e1fb8e07a05 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -72,11 +72,11 @@ ulong savepoint_alloc_size= 0; static const LEX_STRING sys_table_aliases[]= { - {(char*)STRING_WITH_LEN("INNOBASE")}, {(char*)STRING_WITH_LEN("INNODB")}, - {(char*)STRING_WITH_LEN("NDB")}, {(char*)STRING_WITH_LEN("NDBCLUSTER")}, - {(char*)STRING_WITH_LEN("BDB")}, {(char*)STRING_WITH_LEN("BERKELEYDB")}, - {(char*)STRING_WITH_LEN("HEAP")}, {(char*)STRING_WITH_LEN("MEMORY")}, - {(char*)STRING_WITH_LEN("MERGE")}, {(char*)STRING_WITH_LEN("MRG_MYISAM")}, + { C_STRING_WITH_LEN("INNOBASE") }, { C_STRING_WITH_LEN("INNODB") }, + { C_STRING_WITH_LEN("NDB") }, { C_STRING_WITH_LEN("NDBCLUSTER") }, + { C_STRING_WITH_LEN("BDB") }, { C_STRING_WITH_LEN("BERKELEYDB") }, + { C_STRING_WITH_LEN("HEAP") }, { C_STRING_WITH_LEN("MEMORY") }, + { C_STRING_WITH_LEN("MERGE") }, { C_STRING_WITH_LEN("MRG_MYISAM")}, {NullS, 0} }; diff --git a/sql/item.cc b/sql/item.cc index 1afe25b1990..4d6dc8ae754 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1004,7 +1004,7 @@ bool Item_splocal::set_value(THD *thd, sp_rcontext *ctx, Item **it) *****************************************************************************/ Item_case_expr::Item_case_expr(int case_expr_id) - :Item_sp_variable((char *) STRING_WITH_LEN("case_expr")), + :Item_sp_variable( C_STRING_WITH_LEN("case_expr")), m_case_expr_id(case_expr_id) { } diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index a9ecbb23a27..651b0405842 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -1479,7 +1479,7 @@ extern char *mysql_data_home,server_version[SERVER_VERSION_LENGTH], def_ft_boolean_syntax[sizeof(ft_boolean_syntax)]; #define mysql_tmpdir (my_tmpdir(&mysql_tmpdir_list)) extern MY_TMPDIR mysql_tmpdir_list; -extern LEX_STRING command_name[]; +extern const LEX_STRING command_name[]; extern const char *first_keyword, *my_localhost, *delayed_user, *binary_keyword; extern const char **errmesg; /* Error messages */ extern const char *myisam_recover_options_str; diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 966d0f88ca3..402cfc4de60 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -36,114 +36,114 @@ time_t mysql_db_table_last_check= 0L; TABLE_FIELD_W_TYPE mysql_db_table_fields[MYSQL_DB_FIELD_COUNT] = { { - {(char *) STRING_WITH_LEN("Host")}, - {(char *) STRING_WITH_LEN("char(60)")}, + { C_STRING_WITH_LEN("Host") }, + { C_STRING_WITH_LEN("char(60)") }, {NULL, 0} }, { - {(char *) STRING_WITH_LEN("Db")}, - {(char *) STRING_WITH_LEN("char(64)")}, + { C_STRING_WITH_LEN("Db") }, + { C_STRING_WITH_LEN("char(64)") }, {NULL, 0} }, { - {(char *) STRING_WITH_LEN("User")}, - {(char *) STRING_WITH_LEN("char(16)")}, + { C_STRING_WITH_LEN("User") }, + { C_STRING_WITH_LEN("char(16)") }, {NULL, 0} }, { - {(char *) STRING_WITH_LEN("Select_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Select_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Insert_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Insert_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Update_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Update_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Delete_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Delete_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Create_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Create_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Drop_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Drop_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Grant_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Grant_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("References_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("References_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Index_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Index_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Alter_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Alter_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Create_tmp_table_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Create_tmp_table_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Lock_tables_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Lock_tables_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Create_view_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Create_view_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Show_view_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Show_view_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Create_routine_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Create_routine_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Alter_routine_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Alter_routine_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Execute_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Execute_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Event_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Event_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } }, { - {(char *) STRING_WITH_LEN("Trigger_priv")}, - {(char *) STRING_WITH_LEN("enum('N','Y')")}, - {(char *) STRING_WITH_LEN("utf8")} + { C_STRING_WITH_LEN("Trigger_priv") }, + { C_STRING_WITH_LEN("enum('N','Y')") }, + { C_STRING_WITH_LEN("utf8") } } }; diff --git a/sql/sql_error.cc b/sql/sql_error.cc index 58763881ecf..9a9a9784df3 100644 --- a/sql/sql_error.cc +++ b/sql/sql_error.cc @@ -212,12 +212,12 @@ void push_warning_printf(THD *thd, MYSQL_ERROR::enum_warning_level level, TRUE Error sending data to client */ -LEX_STRING warning_level_names[]= +const LEX_STRING warning_level_names[]= { - {(char*) STRING_WITH_LEN("Note")}, - {(char*) STRING_WITH_LEN("Warning")}, - {(char*) STRING_WITH_LEN("Error")}, - {(char*) STRING_WITH_LEN("?")} + { C_STRING_WITH_LEN("Note") }, + { C_STRING_WITH_LEN("Warning") }, + { C_STRING_WITH_LEN("Error") }, + { C_STRING_WITH_LEN("?") } }; bool mysqld_show_warnings(THD *thd, ulong levels_to_show) diff --git a/sql/sql_error.h b/sql/sql_error.h index b5cac24d894..f4a7b14ba1a 100644 --- a/sql/sql_error.h +++ b/sql/sql_error.h @@ -41,4 +41,4 @@ void push_warning_printf(THD *thd, MYSQL_ERROR::enum_warning_level level, void mysql_reset_errors(THD *thd, bool force); bool mysqld_show_warnings(THD *thd, ulong levels_to_show); -extern LEX_STRING warning_level_names[]; +extern const LEX_STRING warning_level_names[]; diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 55dc6cb55a4..5c0a88542b8 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -149,11 +149,11 @@ enum enum_sp_data_access const LEX_STRING sp_data_access_name[]= { - { (char*) STRING_WITH_LEN("") }, - { (char*) STRING_WITH_LEN("CONTAINS SQL") }, - { (char*) STRING_WITH_LEN("NO SQL") }, - { (char*) STRING_WITH_LEN("READS SQL DATA") }, - { (char*) STRING_WITH_LEN("MODIFIES SQL DATA") } + { C_STRING_WITH_LEN("") }, + { C_STRING_WITH_LEN("CONTAINS SQL") }, + { C_STRING_WITH_LEN("NO SQL") }, + { C_STRING_WITH_LEN("READS SQL DATA") }, + { C_STRING_WITH_LEN("MODIFIES SQL DATA") } }; #define DERIVED_SUBQUERY 1 diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 1af80f2c4b0..b5154d60ed2 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -72,38 +72,38 @@ static bool execute_sqlcom_select(THD *thd, TABLE_LIST *all_tables); const char *any_db="*any*"; // Special symbol for check_access -LEX_STRING command_name[]={ - (char *)STRING_WITH_LEN("Sleep"), - (char *)STRING_WITH_LEN("Quit"), - (char *)STRING_WITH_LEN("Init DB"), - (char *)STRING_WITH_LEN("Query"), - (char *)STRING_WITH_LEN("Field List"), - (char *)STRING_WITH_LEN("Create DB"), - (char *)STRING_WITH_LEN("Drop DB"), - (char *)STRING_WITH_LEN("Refresh"), - (char *)STRING_WITH_LEN("Shutdown"), - (char *)STRING_WITH_LEN("Statistics"), - (char *)STRING_WITH_LEN("Processlist"), - (char *)STRING_WITH_LEN("Connect"), - (char *)STRING_WITH_LEN("Kill"), - (char *)STRING_WITH_LEN("Debug"), - (char *)STRING_WITH_LEN("Ping"), - (char *)STRING_WITH_LEN("Time"), - (char *)STRING_WITH_LEN("Delayed insert"), - (char *)STRING_WITH_LEN("Change user"), - (char *)STRING_WITH_LEN("Binlog Dump"), - (char *)STRING_WITH_LEN("Table Dump"), - (char *)STRING_WITH_LEN("Connect Out"), - (char *)STRING_WITH_LEN("Register Slave"), - (char *)STRING_WITH_LEN("Prepare"), - (char *)STRING_WITH_LEN("Execute"), - (char *)STRING_WITH_LEN("Long Data"), - (char *)STRING_WITH_LEN("Close stmt"), - (char *)STRING_WITH_LEN("Reset stmt"), - (char *)STRING_WITH_LEN("Set option"), - (char *)STRING_WITH_LEN("Fetch"), - (char *)STRING_WITH_LEN("Daemon"), - (char *)STRING_WITH_LEN("Error") // Last command number +const LEX_STRING command_name[]={ + C_STRING_WITH_LEN("Sleep"), + C_STRING_WITH_LEN("Quit"), + C_STRING_WITH_LEN("Init DB"), + C_STRING_WITH_LEN("Query"), + C_STRING_WITH_LEN("Field List"), + C_STRING_WITH_LEN("Create DB"), + C_STRING_WITH_LEN("Drop DB"), + C_STRING_WITH_LEN("Refresh"), + C_STRING_WITH_LEN("Shutdown"), + C_STRING_WITH_LEN("Statistics"), + C_STRING_WITH_LEN("Processlist"), + C_STRING_WITH_LEN("Connect"), + C_STRING_WITH_LEN("Kill"), + C_STRING_WITH_LEN("Debug"), + C_STRING_WITH_LEN("Ping"), + C_STRING_WITH_LEN("Time"), + C_STRING_WITH_LEN("Delayed insert"), + C_STRING_WITH_LEN("Change user"), + C_STRING_WITH_LEN("Binlog Dump"), + C_STRING_WITH_LEN("Table Dump"), + C_STRING_WITH_LEN("Connect Out"), + C_STRING_WITH_LEN("Register Slave"), + C_STRING_WITH_LEN("Prepare"), + C_STRING_WITH_LEN("Execute"), + C_STRING_WITH_LEN("Long Data"), + C_STRING_WITH_LEN("Close stmt"), + C_STRING_WITH_LEN("Reset stmt"), + C_STRING_WITH_LEN("Set option"), + C_STRING_WITH_LEN("Fetch"), + C_STRING_WITH_LEN("Daemon"), + C_STRING_WITH_LEN("Error") // Last command number }; const char *xa_state_names[]={ @@ -4940,9 +4940,9 @@ end_with_restore_list: { String buff; const LEX_STRING command[3]= - {{(char *)STRING_WITH_LEN("CREATE ")}, - {(char *)STRING_WITH_LEN("ALTER ")}, - {(char *)STRING_WITH_LEN("CREATE OR REPLACE ")}}; + {{ C_STRING_WITH_LEN("CREATE ") }, + { C_STRING_WITH_LEN("ALTER ") }, + { C_STRING_WITH_LEN("CREATE OR REPLACE ") }}; thd->clear_error(); buff.append(command[thd->lex->create_view_mode].str, diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 73091c0994e..69a345bf2a4 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -46,12 +46,12 @@ */ const LEX_STRING partition_keywords[]= { - { (char *) STRING_WITH_LEN("HASH") }, - { (char *) STRING_WITH_LEN("RANGE") }, - { (char *) STRING_WITH_LEN("LIST") }, - { (char *) STRING_WITH_LEN("KEY") }, - { (char *) STRING_WITH_LEN("MAXVALUE") }, - { (char *) STRING_WITH_LEN("LINEAR ") } + { C_STRING_WITH_LEN("HASH") }, + { C_STRING_WITH_LEN("RANGE") }, + { C_STRING_WITH_LEN("LIST") }, + { C_STRING_WITH_LEN("KEY") }, + { C_STRING_WITH_LEN("MAXVALUE") }, + { C_STRING_WITH_LEN("LINEAR ") } }; static const char *part_str= "PARTITION"; static const char *sub_str= "SUB"; diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index f7205470abd..8dc00908fc5 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -25,9 +25,9 @@ char *opt_plugin_dir_ptr; char opt_plugin_dir[FN_REFLEN]; const LEX_STRING plugin_type_names[MYSQL_MAX_PLUGIN_TYPE_NUM]= { - { (char *)STRING_WITH_LEN("UDF") }, - { (char *)STRING_WITH_LEN("STORAGE ENGINE") }, - { (char *)STRING_WITH_LEN("FTPARSER") } + { C_STRING_WITH_LEN("UDF") }, + { C_STRING_WITH_LEN("STORAGE ENGINE") }, + { C_STRING_WITH_LEN("FTPARSER") } }; plugin_type_init plugin_type_initialize[MYSQL_MAX_PLUGIN_TYPE_NUM]= diff --git a/sql/sql_show.cc b/sql/sql_show.cc index bf09f516499..530315b507b 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -2159,7 +2159,7 @@ LEX_STRING *make_lex_string(THD *thd, LEX_STRING *lex_str, /* INFORMATION_SCHEMA name */ -LEX_STRING information_schema_name= {(char*)"information_schema", 18}; +LEX_STRING information_schema_name= { C_STRING_WITH_LEN("information_schema")}; /* This is only used internally, but we need it here as a forward reference */ extern ST_SCHEMA_TABLE schema_tables[]; @@ -3189,10 +3189,10 @@ static my_bool iter_schema_engines(THD *thd, st_plugin_int *plugin, if (!(wild && wild[0] && wild_case_compare(scs, plugin->name.str,wild))) { - LEX_STRING state[2]= {{(char*) STRING_WITH_LEN("ENABLED")}, - {(char*) STRING_WITH_LEN("DISABLED")}}; - LEX_STRING yesno[2]= {{(char*) STRING_WITH_LEN("NO")}, - {(char*) STRING_WITH_LEN("YES")}}; + LEX_STRING state[2]= {{ C_STRING_WITH_LEN("ENABLED") }, + { C_STRING_WITH_LEN("DISABLED") }}; + LEX_STRING yesno[2]= {{ C_STRING_WITH_LEN("NO") }, + { C_STRING_WITH_LEN("YES") }}; LEX_STRING *tmp; restore_record(table, s->default_values); diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index 1837372c6c4..e990b7bc86d 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -22,7 +22,7 @@ #include "parse_file.h" static const LEX_STRING triggers_file_type= - {(char *) STRING_WITH_LEN("TRIGGERS")}; + { C_STRING_WITH_LEN("TRIGGERS") }; const char * const triggers_file_ext= ".TRG"; @@ -35,17 +35,17 @@ const char * const triggers_file_ext= ".TRG"; static File_option triggers_file_parameters[]= { { - {(char *) STRING_WITH_LEN("triggers") }, + { C_STRING_WITH_LEN("triggers") }, offsetof(class Table_triggers_list, definitions_list), FILE_OPTIONS_STRLIST }, { - {(char *) STRING_WITH_LEN("sql_modes") }, + { C_STRING_WITH_LEN("sql_modes") }, offsetof(class Table_triggers_list, definition_modes_list), FILE_OPTIONS_ULLLIST }, { - {(char *) STRING_WITH_LEN("definers") }, + { C_STRING_WITH_LEN("definers") }, offsetof(class Table_triggers_list, definers_list), FILE_OPTIONS_STRLIST }, @@ -54,7 +54,7 @@ static File_option triggers_file_parameters[]= File_option sql_modes_parameters= { - {(char*) STRING_WITH_LEN("sql_modes") }, + { C_STRING_WITH_LEN("sql_modes") }, offsetof(class Table_triggers_list, definition_modes_list), FILE_OPTIONS_ULLLIST }; @@ -78,14 +78,14 @@ struct st_trigname }; static const LEX_STRING trigname_file_type= - {(char *) STRING_WITH_LEN("TRIGGERNAME")}; + { C_STRING_WITH_LEN("TRIGGERNAME") }; const char * const trigname_file_ext= ".TRN"; static File_option trigname_file_parameters[]= { { - {(char *) STRING_WITH_LEN("trigger_table")}, + { C_STRING_WITH_LEN("trigger_table")}, offsetof(struct st_trigname, trigger_table), FILE_OPTIONS_ESTRING }, @@ -95,15 +95,15 @@ static File_option trigname_file_parameters[]= const LEX_STRING trg_action_time_type_names[]= { - { (char *) STRING_WITH_LEN("BEFORE") }, - { (char *) STRING_WITH_LEN("AFTER") } + { C_STRING_WITH_LEN("BEFORE") }, + { C_STRING_WITH_LEN("AFTER") } }; const LEX_STRING trg_event_type_names[]= { - { (char *) STRING_WITH_LEN("INSERT") }, - { (char *) STRING_WITH_LEN("UPDATE") }, - { (char *) STRING_WITH_LEN("DELETE") } + { C_STRING_WITH_LEN("INSERT") }, + { C_STRING_WITH_LEN("UPDATE") }, + { C_STRING_WITH_LEN("DELETE") } }; diff --git a/sql/sql_view.cc b/sql/sql_view.cc index 09a199b2738..66258fca945 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -25,7 +25,7 @@ #define MD5_BUFF_LENGTH 33 -const LEX_STRING view_type= { (char*) STRING_WITH_LEN("VIEW") }; +const LEX_STRING view_type= { C_STRING_WITH_LEN("VIEW") }; static int mysql_register_view(THD *thd, TABLE_LIST *view, enum_view_create_mode mode); @@ -579,40 +579,40 @@ static const int num_view_backups= 3; parse() */ static File_option view_parameters[]= -{{{(char*) STRING_WITH_LEN("query")}, +{{{ C_STRING_WITH_LEN("query")}, offsetof(TABLE_LIST, query), FILE_OPTIONS_ESTRING}, - {{(char*) STRING_WITH_LEN("md5")}, + {{ C_STRING_WITH_LEN("md5")}, offsetof(TABLE_LIST, md5), FILE_OPTIONS_STRING}, - {{(char*) STRING_WITH_LEN("updatable")}, + {{ C_STRING_WITH_LEN("updatable")}, offsetof(TABLE_LIST, updatable_view), FILE_OPTIONS_ULONGLONG}, - {{(char*) STRING_WITH_LEN("algorithm")}, + {{ C_STRING_WITH_LEN("algorithm")}, offsetof(TABLE_LIST, algorithm), FILE_OPTIONS_ULONGLONG}, - {{(char*) STRING_WITH_LEN("definer_user")}, + {{ C_STRING_WITH_LEN("definer_user")}, offsetof(TABLE_LIST, definer.user), FILE_OPTIONS_STRING}, - {{(char*) STRING_WITH_LEN("definer_host")}, + {{ C_STRING_WITH_LEN("definer_host")}, offsetof(TABLE_LIST, definer.host), FILE_OPTIONS_STRING}, - {{(char*) STRING_WITH_LEN("suid")}, + {{ C_STRING_WITH_LEN("suid")}, offsetof(TABLE_LIST, view_suid), FILE_OPTIONS_ULONGLONG}, - {{(char*) STRING_WITH_LEN("with_check_option")}, + {{ C_STRING_WITH_LEN("with_check_option")}, offsetof(TABLE_LIST, with_check), FILE_OPTIONS_ULONGLONG}, - {{(char*) STRING_WITH_LEN("revision")}, + {{ C_STRING_WITH_LEN("revision")}, offsetof(TABLE_LIST, revision), FILE_OPTIONS_REV}, - {{(char*) STRING_WITH_LEN("timestamp")}, + {{ C_STRING_WITH_LEN("timestamp")}, offsetof(TABLE_LIST, timestamp), FILE_OPTIONS_TIMESTAMP}, - {{(char*)STRING_WITH_LEN("create-version")}, + {{ C_STRING_WITH_LEN("create-version")}, offsetof(TABLE_LIST, file_version), FILE_OPTIONS_ULONGLONG}, - {{(char*) STRING_WITH_LEN("source")}, + {{ C_STRING_WITH_LEN("source")}, offsetof(TABLE_LIST, source), FILE_OPTIONS_ESTRING}, {{NullS, 0}, 0, diff --git a/sql/tztime.cc b/sql/tztime.cc index 4f6542bd043..a1bcf25bb51 100644 --- a/sql/tztime.cc +++ b/sql/tztime.cc @@ -1389,15 +1389,15 @@ static bool time_zone_tables_exist= 1; static const LEX_STRING tz_tables_names[MY_TZ_TABLES_COUNT]= { - {(char *) STRING_WITH_LEN("time_zone_name")}, - {(char *) STRING_WITH_LEN("time_zone")}, - {(char *) STRING_WITH_LEN("time_zone_transition_type")}, - {(char *) STRING_WITH_LEN("time_zone_transition")} + { C_STRING_WITH_LEN("time_zone_name")}, + { C_STRING_WITH_LEN("time_zone")}, + { C_STRING_WITH_LEN("time_zone_transition_type")}, + { C_STRING_WITH_LEN("time_zone_transition")} }; /* Name of database to which those tables belong. */ -static const LEX_STRING tz_tables_db_name= {(char *) STRING_WITH_LEN("mysql")}; +static const LEX_STRING tz_tables_db_name= { C_STRING_WITH_LEN("mysql")}; class Tz_names_entry: public Sql_alloc From 8daf4e8373b9fc3def33e2146445cd1600cbc084 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 21 Aug 2006 12:18:59 +0400 Subject: [PATCH 3/4] Fix for bug#21216 "Simultaneous DROP TABLE and SHOW OPEN TABLES causes server to crash". Crash caused by assertion failure happened when one ran SHOW OPEN TABLES while concurrently doing DROP TABLE (or RENAME TABLE, CREATE TABLE LIKE or any other command that takes name-lock) in other connection. For non-debug version of server problem exposed itself as wrong output of SHOW OPEN TABLES statement (it was missing name-locked tables). Finally in 5.1 both debug and non-debug versions simply crashed in this situation due to NULL-pointer dereference. This problem was caused by the fact that table placeholders which were added to table cache in order to obtain name-lock had TABLE_SHARE::table_name set to 0. Therefore they broke assumption that this member is non-0 for all tables in table cache which was checked by assert in list_open_tables() (in 5.1 this function simply relies on it). The fix simply sets this member for such placeholders to appropriate value making this assumption true again. This patch also includes test for similar bug 12212 "Crash that happens during removing of database name from cache" reappeared in 5.1 as bug 19403. mysql-test/r/drop.result: Added test for bug#21216 "Simultaneous DROP TABLE and SHOW OPEN TABLES causes server to crash" and bug#12212/19403 "Crash that happens during removing of database name from cache". mysql-test/t/drop.test: Added test for bug#21216 "Simultaneous DROP TABLE and SHOW OPEN TABLES causes server to crash" and bug#12212/19403 "Crash that happens during removing of database name from cache". sql/lock.cc: lock_table_name(): Our code assumes that TABLE_SHARE::table_name for objects in table cache is non-NULL (for example look at assertion in list_open_tables()). This was not true for table placeholders that were added to table cache for name-locking. So let us set this member for such placeholders. --- mysql-test/r/drop.result | 13 +++++++++++++ mysql-test/t/drop.test | 41 ++++++++++++++++++++++++++++++++++++++++ sql/lock.cc | 7 +++++-- 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/drop.result b/mysql-test/r/drop.result index 979e5d48871..d122dabc4ec 100644 --- a/mysql-test/r/drop.result +++ b/mysql-test/r/drop.result @@ -72,3 +72,16 @@ show tables; Tables_in_test t1 drop table t1; +drop database if exists mysqltest; +drop table if exists t1; +create table t1 (i int); +lock tables t1 read; +create database mysqltest; + drop table t1; +show open tables; + drop database mysqltest; +select 1; +1 +1 +unlock tables; +End of 5.0 tests diff --git a/mysql-test/t/drop.test b/mysql-test/t/drop.test index 7cd943d46da..a1451773e90 100644 --- a/mysql-test/t/drop.test +++ b/mysql-test/t/drop.test @@ -81,3 +81,44 @@ show tables; drop table t1; # End of 4.1 tests + + +# +# Test for bug#21216 "Simultaneous DROP TABLE and SHOW OPEN TABLES causes +# server to crash". Crash (caused by failed assertion in 5.0 or by null +# pointer dereference in 5.1) happened when one ran SHOW OPEN TABLES +# while concurrently doing DROP TABLE (or RENAME TABLE, CREATE TABLE LIKE +# or any other command that takes name-lock) in other connection. +# +# Also includes test for similar bug#12212 "Crash that happens during +# removing of database name from cache" reappeared in 5.1 as bug#19403 +# In its case crash happened when one concurrently executed DROP DATABASE +# and one of name-locking command. +# +--disable_warnings +drop database if exists mysqltest; +drop table if exists t1; +--enable_warnings +create table t1 (i int); +lock tables t1 read; +create database mysqltest; +connect (addconroot1, localhost, root,,); +--send drop table t1 +connect (addconroot2, localhost, root,,); +# Server should not crash in any of the following statements +--disable_result_log +show open tables; +--enable_result_log +--send drop database mysqltest +connection default; +select 1; +unlock tables; +connection addconroot1; +--reap +connection addconroot2; +--reap +disconnect addconroot1; +disconnect addconroot2; +connection default; + +--echo End of 5.0 tests diff --git a/sql/lock.cc b/sql/lock.cc index 97a080c5634..90ddcc957a2 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -854,6 +854,7 @@ int lock_table_name(THD *thd, TABLE_LIST *table_list) TABLE *table; char key[MAX_DBKEY_LENGTH]; char *db= table_list->db; + int table_in_key_offset; uint key_length; HASH_SEARCH_STATE state; DBUG_ENTER("lock_table_name"); @@ -861,8 +862,9 @@ int lock_table_name(THD *thd, TABLE_LIST *table_list) safe_mutex_assert_owner(&LOCK_open); - key_length=(uint) (strmov(strmov(key,db)+1,table_list->table_name) - -key)+ 1; + table_in_key_offset= strmov(key, db) - key + 1; + key_length= (uint)(strmov(key + table_in_key_offset, table_list->table_name) + - key) + 1; /* Only insert the table if we haven't insert it already */ @@ -883,6 +885,7 @@ int lock_table_name(THD *thd, TABLE_LIST *table_list) table->s= &table->share_not_to_be_used; memcpy((table->s->table_cache_key= (char*) (table+1)), key, key_length); table->s->db= table->s->table_cache_key; + table->s->table_name= table->s->table_cache_key + table_in_key_offset; table->s->key_length=key_length; table->in_use=thd; table->locked_by_name=1; From 992aceaf71fec15cef86d31550e1f7428bbbb8e9 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 21 Aug 2006 19:02:11 +0400 Subject: [PATCH 4/4] Fix for bug#19403/12212 "Crash that happens during removing of database name from cache" and #21216 "Simultaneous DROP TABLE and SHOW OPEN TABLES causes server to crash". Crash happened when one ran DROP DATABASE or SHOW OPEN TABLES statements while concurrently doing DROP TABLE (or RENAME TABLE, CREATE TABLE LIKE or any other command that takes name-lock) in other connection. This problem was caused by the fact that table placeholders which were added to table cache in order to obtain name-lock on table had TABLE_SHARE::db and table_name set to 0. Therefore they broke assumption that these members are non-0 for all tables in table cache on which some of our code relies. The fix sets these members for such placeholders to appropriate value making this assumption true again. As attempt to avoid such problems in future we introduce auxiliary TABLE_SHARE::set_table_cache_key() methods which should be used when one wants to set TABLE_SHARE::table_cache_key and which ensure that TABLE_SHARE::table_name/db are set properly. Test cases for these bugs were added to 5.0 test-suite (with 5.0-specific fix for bug #21216). sql/lock.cc: Our code assumes that TABLE_SHARE::table_name/db for objects in table cache is set properly (and is non-NULL). For example look in list_open_tables() and remove_db_from_cache(). This was not true for table placeholders that were added to table cache for name-locking. Changed lock_table_name() to preserve this assumption (now it uses TABLE_SHARE::set_table_cache_key() to set all three table_cache_key/db/table_name members at once). Also now we use my_multi_malloc() to allocate memory for TABLE and TABLE_SHARE objects instead of using my_malloc() + summing sizes as it automatically provides proper alignment for memory allocated. sql/sql_base.cc: Now we use TABLE_SHARE::set_table_cache_key() auxiliary methods to set TABLE_SHARE::table_cache_key/db/table_name members at once. We also use multi_alloc_root() instead of alloc_root() for allocating memory for several objects as it is less error prone. Finally, we also got rid of unused code in reopen_name_locked_table(). sql/sql_select.cc: Got rid of redundant code. TABLE_SHARE::db/table_cache_key are both set to empty string by the call to init_tmp_table_share() routine. sql/table.cc: Now alloc_table_share() uses auxiliary TABLE_SHARE::set_table_cache_key() method to properly set TABLE_SHARE::table_cache_key/db/table_name members. Also now we use multi_alloc_root() instead of alloc_root() for allocating memory for several objects as it is more clear/less error-prone. sql/table.h: Added comment about importance of apropriate setting of TABLE_SHARE::table_name/db/table_cache_key for tables in table cache. Introduced two auxiliary TABLE_SHARE::set_table_cache_key() methods which allow to set these three members at once. --- sql/lock.cc | 21 ++++++++------- sql/sql_base.cc | 41 ++++++++---------------------- sql/sql_select.cc | 2 -- sql/table.cc | 20 ++++++--------- sql/table.h | 65 ++++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 95 insertions(+), 54 deletions(-) diff --git a/sql/lock.cc b/sql/lock.cc index 8e75ea42f7d..06f538a2a03 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -874,6 +874,8 @@ end: int lock_table_name(THD *thd, TABLE_LIST *table_list, bool check_in_use) { TABLE *table; + TABLE_SHARE *share; + char *key_buff; char key[MAX_DBKEY_LENGTH]; char *db= table_list->db; uint key_length; @@ -903,17 +905,18 @@ int lock_table_name(THD *thd, TABLE_LIST *table_list, bool check_in_use) } /* Create a table entry with the right key and with an old refresh version - Note that we must use my_malloc() here as this is freed by the table - cache + Note that we must use my_multi_malloc() here as this is freed by the + table cache */ - if (!(table= (TABLE*) my_malloc(sizeof(*table)+ sizeof(TABLE_SHARE)+ - key_length, MYF(MY_WME | MY_ZEROFILL)))) + if (!my_multi_malloc(MYF(MY_WME | MY_ZEROFILL), + &table, sizeof(*table), + &share, sizeof(*share), + &key_buff, key_length, + NULL)) DBUG_RETURN(-1); - table->s= (TABLE_SHARE*) (table+1); - memcpy((table->s->table_cache_key.str= (char*) (table->s+1)), key, - key_length); - table->s->table_cache_key.length= key_length; - table->s->tmp_table= INTERNAL_TMP_TABLE; // for intern_close_table + table->s= share; + share->set_table_cache_key(key_buff, key, key_length); + share->tmp_table= INTERNAL_TMP_TABLE; // for intern_close_table table->in_use= thd; table->locked_by_name=1; table_list->table=table; diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 1c733e3c12d..32a622c7401 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -634,6 +634,7 @@ TABLE_SHARE *get_cached_table_share(const char *db, const char *table_name) static void close_handle_and_leave_table_as_lock(TABLE *table) { TABLE_SHARE *share, *old_share= table->s; + char *key_buff; MEM_ROOT *mem_root= &table->mem_root; DBUG_ENTER("close_handle_and_leave_table_as_lock"); @@ -642,20 +643,14 @@ static void close_handle_and_leave_table_as_lock(TABLE *table) This has to be done to ensure that the table share is removed from the table defintion cache as soon as the last instance is removed */ - if ((share= (TABLE_SHARE*) alloc_root(mem_root, sizeof(*share)))) + if (multi_alloc_root(mem_root, + &share, sizeof(*share), + &key_buff, old_share->table_cache_key.length, + NULL)) { bzero((char*) share, sizeof(*share)); - share->db.str= memdup_root(mem_root, old_share->db.str, - old_share->db.length+1); - share->db.length= old_share->db.length; - share->table_name.str= memdup_root(mem_root, - old_share->table_name.str, - old_share->table_name.length+1); - share->table_name.length= old_share->table_name.length; - share->table_cache_key.str= memdup_root(mem_root, - old_share->table_cache_key.str, - old_share->table_cache_key.length); - share->table_cache_key.length= old_share->table_cache_key.length; + share->set_table_cache_key(key_buff, old_share->table_cache_key.str, + old_share->table_cache_key.length); share->tmp_table= INTERNAL_TMP_TABLE; // for intern_close_table() } @@ -1603,28 +1598,18 @@ bool rename_temporary_table(THD* thd, TABLE *table, const char *db, const char *table_name) { char *key; + uint key_length; TABLE_SHARE *share= table->s; TABLE_LIST table_list; - uint db_length, table_length; DBUG_ENTER("rename_temporary_table"); - if (!(key=(char*) alloc_root(&share->mem_root, - (uint) (db_length= strlen(db))+ - (uint) (table_length= strlen(table_name))+6+4))) + if (!(key=(char*) alloc_root(&share->mem_root, MAX_DBKEY_LENGTH))) DBUG_RETURN(1); /* purecov: inspected */ table_list.db= (char*) db; table_list.table_name= (char*) table_name; - share->db.str= share->table_cache_key.str= key; - share->db.length= db_length; - share->table_cache_key.length= create_table_def_key(thd, key, - &table_list, 1); - /* - Here we use the fact that table_name is stored as the second component - in the 'key' (after db_name), where components are separated with \0 - */ - share->table_name.str= key+db_length+1; - share->table_name.length= table_length; + key_length= create_table_def_key(thd, key, &table_list, 1); + share->set_table_cache_key(key, key_length); DBUG_RETURN(0); } @@ -1749,10 +1734,7 @@ bool reopen_name_locked_table(THD* thd, TABLE_LIST* table_list) { TABLE *table= table_list->table; TABLE_SHARE *share; - char *db= table_list->db; char *table_name= table_list->table_name; - char key[MAX_DBKEY_LENGTH]; - uint key_length; TABLE orig_table; DBUG_ENTER("reopen_name_locked_table"); @@ -1762,7 +1744,6 @@ bool reopen_name_locked_table(THD* thd, TABLE_LIST* table_list) DBUG_RETURN(TRUE); orig_table= *table; - key_length=(uint) (strmov(strmov(key,db)+1,table_name)-key)+1; if (open_unireg_entry(thd, table, table_list, table_name, table->s->table_cache_key.str, diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 7eda55c6a3f..a882f0b066d 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -8645,8 +8645,6 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, share->primary_key= MAX_KEY; // Indicate no primary key share->keys_for_keyread.init(); share->keys_in_use.init(); - /* For easier error reporting */ - share->table_cache_key= share->db; /* Calculate which type of fields we will store in the temporary table */ diff --git a/sql/table.cc b/sql/table.cc index f0a864287b0..179cfb2be14 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -93,6 +93,7 @@ TABLE_SHARE *alloc_table_share(TABLE_LIST *table_list, char *key, { MEM_ROOT mem_root; TABLE_SHARE *share; + char *key_buff, *path_buff; char path[FN_REFLEN]; uint path_length; DBUG_ENTER("alloc_table_share"); @@ -103,22 +104,17 @@ TABLE_SHARE *alloc_table_share(TABLE_LIST *table_list, char *key, table_list->db, table_list->table_name, "", 0); init_sql_alloc(&mem_root, TABLE_ALLOC_BLOCK_SIZE, 0); - if ((share= (TABLE_SHARE*) alloc_root(&mem_root, - sizeof(*share) + key_length + - path_length +1))) + if (multi_alloc_root(&mem_root, + &share, sizeof(*share), + &key_buff, key_length, + &path_buff, path_length + 1, + NULL)) { bzero((char*) share, sizeof(*share)); - share->table_cache_key.str= (char*) (share+1); - share->table_cache_key.length= key_length; - memcpy(share->table_cache_key.str, key, key_length); - /* Use the fact the key is db/0/table_name/0 */ - share->db.str= share->table_cache_key.str; - share->db.length= strlen(share->db.str); - share->table_name.str= share->db.str + share->db.length + 1; - share->table_name.length= strlen(share->table_name.str); + share->set_table_cache_key(key_buff, key, key_length); - share->path.str= share->table_cache_key.str+ key_length; + share->path.str= path_buff; share->path.length= path_length; strmov(share->path.str, path); share->normalized_path.str= share->path.str; diff --git a/sql/table.h b/sql/table.h index 7675c27823b..c13a23468ae 100644 --- a/sql/table.h +++ b/sql/table.h @@ -138,7 +138,16 @@ typedef struct st_table_share CHARSET_INFO *table_charset; /* Default charset of string fields */ MY_BITMAP all_set; - /* A pair "database_name\0table_name\0", widely used as simply a db name */ + /* + Key which is used for looking-up table in table cache and in the list + of thread's temporary tables. Has the form of: + "database_name\0table_name\0" + optional part for temporary tables. + + Note that all three 'table_cache_key', 'db' and 'table_name' members + must be set (and be non-zero) for tables in table cache. They also + should correspond to each other. + To ensure this one can use set_table_cache() methods. + */ LEX_STRING table_cache_key; LEX_STRING db; /* Pointer to db */ LEX_STRING table_name; /* Table name (for open) */ @@ -223,6 +232,60 @@ typedef struct st_table_share uint part_state_len; handlerton *default_part_db_type; #endif + + + /* + Set share's table cache key and update its db and table name appropriately. + + SYNOPSIS + set_table_cache_key() + key_buff Buffer with already built table cache key to be + referenced from share. + key_length Key length. + + NOTES + Since 'key_buff' buffer will be referenced from share it should has same + life-time as share itself. + This method automatically ensures that TABLE_SHARE::table_name/db have + appropriate values by using table cache key as their source. + */ + + void set_table_cache_key(char *key_buff, uint key_length) + { + table_cache_key.str= key_buff; + table_cache_key.length= key_length; + /* + Let us use the fact that the key is "db/0/table_name/0" + optional + part for temporary tables. + */ + db.str= table_cache_key.str; + db.length= strlen(db.str); + table_name.str= db.str + db.length + 1; + table_name.length= strlen(table_name.str); + } + + + /* + Set share's table cache key and update its db and table name appropriately. + + SYNOPSIS + set_table_cache_key() + key_buff Buffer to be used as storage for table cache key + (should be at least key_length bytes). + key Value for table cache key. + key_length Key length. + + NOTE + Since 'key_buff' buffer will be used as storage for table cache key + it should has same life-time as share itself. + */ + + void set_table_cache_key(char *key_buff, const char *key, uint key_length) + { + memcpy(key_buff, key, key_length); + set_table_cache_key(key_buff, key_length); + } + } TABLE_SHARE;