summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/drop.result13
-rw-r--r--mysql-test/t/drop.test41
-rw-r--r--mysql-test/t/im_instance_conf.imtest54
-rw-r--r--mysql-test/t/im_options.imtest48
-rw-r--r--sql/handler.cc8
-rw-r--r--sql/item.cc2
-rw-r--r--sql/lock.cc21
-rw-r--r--sql/mysql_priv.h2
-rw-r--r--sql/sql_acl.cc126
-rw-r--r--sql/sql_base.cc41
-rw-r--r--sql/sql_error.cc10
-rw-r--r--sql/sql_error.h2
-rw-r--r--sql/sql_lex.h10
-rw-r--r--sql/sql_parse.cc70
-rw-r--r--sql/sql_partition.cc12
-rw-r--r--sql/sql_plugin.cc6
-rw-r--r--sql/sql_select.cc2
-rw-r--r--sql/sql_show.cc10
-rw-r--r--sql/sql_trigger.cc24
-rw-r--r--sql/sql_view.cc26
-rw-r--r--sql/table.cc20
-rw-r--r--sql/table.h65
-rw-r--r--sql/tztime.cc10
23 files changed, 359 insertions, 264 deletions
diff --git a/mysql-test/r/drop.result b/mysql-test/r/drop.result
index fb8c4fb9b37..53b2ea8c84a 100644
--- a/mysql-test/r/drop.result
+++ b/mysql-test/r/drop.result
@@ -74,3 +74,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/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:
diff --git a/sql/handler.cc b/sql/handler.cc
index d67acf69d14..cb0f6ee323f 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -72,10 +72,10 @@ 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("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("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 6e661afbd91..be15bd528bb 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/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/mysql_priv.h b/sql/mysql_priv.h
index 7de6f6d04e0..5253326797f 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -1477,7 +1477,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 c36302c8d26..a6679f99ba2 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_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_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 9f6df9861e2..7e78a674b35 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 9217c147143..63de7bb1930 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[]={
@@ -4924,9 +4924,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 f1c8e099441..49ca738ae7f 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_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<Item> &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/sql_show.cc b/sql/sql_show.cc
index fd0c0e7be11..52c1f3a4312 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -2171,7 +2171,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[];
@@ -3212,10 +3212,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 217ce239b4f..a49e9d67a00 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 9b551d624cf..7bbd6c553a0 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);
@@ -581,40 +581,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/table.cc b/sql/table.cc
index dec4901807d..7afeb466f8e 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 d8a9eb4dfa9..3fb7222cb0d 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;
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