summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2019-12-05 13:35:12 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2019-12-05 13:35:12 +0200
commit72573dc5055c018a8d3920b0f11cae70c96ae00c (patch)
tree615283858efd69049621adc8f74eaebda1ed539e
parent65a76ca13f0a92cc129c6c17de5b3bcdb6bfe619 (diff)
downloadmariadb-git-72573dc5055c018a8d3920b0f11cae70c96ae00c.tar.gz
Cleanup: Revert some sql/ changes
We do add get_purge_table() without proper interface.
-rw-r--r--sql/sql_class.cc17
-rw-r--r--storage/innobase/dict/dict0dict.cc38
-rw-r--r--storage/innobase/handler/ha_innodb.cc18
-rw-r--r--storage/innobase/include/dict0dict.h14
4 files changed, 55 insertions, 32 deletions
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index a4582b6b678..a898f97eee7 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -4726,17 +4726,17 @@ extern "C" void thd_create_random_password(MYSQL_THD thd,
To make sure no table stays open for long, this helper allows the thread to
have only one table open at any given time.
*/
-TABLE *open_purge_table(THD *thd, const char *db,
- const char *tb)
+TABLE *open_purge_table(THD *thd, const char *db, size_t dblen,
+ const char *tb, size_t tblen)
{
DBUG_ENTER("open_purge_table");
DBUG_ASSERT(thd->open_tables == NULL);
DBUG_ASSERT(thd->locked_tables_mode < LTM_PRELOCKED);
- Open_table_context ot_ctx(thd, MYSQL_OPEN_HAS_MDL_LOCK);
+ Open_table_context ot_ctx(thd, 0);
TABLE_LIST *tl= (TABLE_LIST*)thd->alloc(sizeof(TABLE_LIST));
- LEX_CSTRING db_name= {db, strlen(db) };
- LEX_CSTRING table_name= { tb, strlen(tb) };
+ LEX_CSTRING db_name= {db, dblen };
+ LEX_CSTRING table_name= { tb, tblen };
tl->init_one_table(&db_name, &table_name, 0, TL_READ);
tl->i_s_requested_object= OPEN_TABLE_ONLY;
@@ -4767,13 +4767,12 @@ TABLE *get_purge_table(THD *thd)
But only when virtual columns are involved, otherwise InnoDB
does not need an open TABLE.
*/
-TABLE *find_fk_open_table(THD *thd, const char *db,
- const char *table)
+TABLE *find_fk_open_table(THD *thd, const char *db, size_t db_len,
+ const char *table, size_t table_len)
{
for (TABLE *t= thd->open_tables; t; t= t->next)
{
- if (t->s->db.length == strlen(db) &&
- t->s->table_name.length == strlen(table) &&
+ if (t->s->db.length == db_len && t->s->table_name.length == table_len &&
!strcmp(t->s->db.str, db) && !strcmp(t->s->table_name.str, table) &&
t->pos_in_table_list->prelocking_placeholder == TABLE_LIST::PRELOCK_FK)
return t;
diff --git a/storage/innobase/dict/dict0dict.cc b/storage/innobase/dict/dict0dict.cc
index c17399d194d..2d8f78ba2db 100644
--- a/storage/innobase/dict/dict0dict.cc
+++ b/storage/innobase/dict/dict0dict.cc
@@ -733,13 +733,16 @@ dict_index_get_nth_field_pos(
}
/** Parse the table file name into table name and database name.
-@param[in] tbl_name InnoDB table name
-@param[in,out] mysql_db_name database name buffer
-@param[in,out] mysql_tbl_name table name buffer
+@param[in] tbl_name InnoDB table name
+@param[in,out] mysql_db_name database name buffer
+@param[in,out] mysql_tbl_name table name buffer
+@param[out] db_name_len database name length
+@param[out] tbl_name_len table name length
@return true if the table name is parse properly. */
-bool dict_parse_tbl_name(const char* tbl_name,
+bool dict_parse_tbl_name(const char *tbl_name,
char (&mysql_db_name)[NAME_LEN + 1],
- char (&mysql_tbl_name)[NAME_LEN + 1])
+ char (&mysql_tbl_name)[NAME_LEN + 1],
+ size_t *db_name_len, size_t *tbl_name_len)
{
const size_t db_len= dict_get_db_name_len(tbl_name);
char db_buf[MAX_DATABASE_NAME_LEN + 1];
@@ -755,6 +758,9 @@ bool dict_parse_tbl_name(const char* tbl_name,
memcpy(tbl_buf, tbl_name + db_len + 1, tbl_len);
tbl_buf[tbl_len]= 0;
+ *db_name_len= db_len;
+ *tbl_name_len= tbl_len;
+
filename_to_tablename(db_buf, mysql_db_name,
MAX_DATABASE_NAME_LEN + 1, true);
@@ -790,7 +796,7 @@ dict_acquire_mdl_shared(dict_table_t *table,
if (!table || !mdl)
return table;
- ulint db_len= dict_get_db_name_len(table->name.m_name);
+ size_t db_len= dict_get_db_name_len(table->name.m_name);
if (db_len == 0)
return table; /* InnoDB system tables are not covered by MDL */
@@ -802,9 +808,11 @@ dict_acquire_mdl_shared(dict_table_t *table,
table_id_t table_id= table->id;
char db_buf[NAME_LEN + 1], db_buf1[NAME_LEN + 1];
char tbl_buf[NAME_LEN + 1], tbl_buf1[NAME_LEN + 1];
+ size_t tbl_len;
bool unaccessible= false;
- if (!dict_parse_tbl_name(table->name.m_name, db_buf, tbl_buf))
+ if (!dict_parse_tbl_name(table->name.m_name, db_buf, tbl_buf,
+ &db_len, &tbl_len))
/* Intermediate table starts with #sql */
return table;
@@ -860,11 +868,16 @@ is_unaccessible:
if (!fil_table_accessible(table))
goto is_unaccessible;
- dict_parse_tbl_name(table->name.m_name, db_buf1, tbl_buf1);
+ size_t db1_len, tbl1_len;
+
+ dict_parse_tbl_name(table->name.m_name, db_buf1, tbl_buf1,
+ &db1_len, &tbl1_len);
if (*mdl)
{
- if (!strcmp(db_buf, db_buf1) && !strcmp(tbl_buf, tbl_buf1))
+ if (db_len == db1_len && tbl_len == tbl1_len &&
+ !memcmp(db_buf, db_buf1, db_len) &&
+ !memcmp(tbl_buf, tbl_buf1, tbl_len))
return table;
/* The table was renamed. Release MDL for the old name and
@@ -873,8 +886,11 @@ is_unaccessible:
*mdl= nullptr;
}
- strcpy(tbl_buf, tbl_buf1);
- strcpy(db_buf, db_buf1);
+ db_len= db1_len;
+ tbl_len= tbl1_len;
+
+ memcpy(tbl_buf, tbl_buf1, tbl_len + 1);
+ memcpy(db_buf, db_buf1, db_len + 1);
goto retry;
}
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index df9523b95d8..37edb0a3762 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -122,14 +122,14 @@ extern "C" void thd_mark_transaction_to_rollback(MYSQL_THD thd, bool all);
unsigned long long thd_get_query_id(const MYSQL_THD thd);
void thd_clear_error(MYSQL_THD thd);
-TABLE *find_fk_open_table(THD *thd, const char *db,
- const char *table);
+TABLE *find_fk_open_table(THD *thd, const char *db, size_t db_len,
+ const char *table, size_t table_len);
MYSQL_THD create_background_thd();
void destroy_background_thd(MYSQL_THD thd);
void reset_thd(MYSQL_THD thd);
-TABLE *open_purge_table(THD *thd, const char *db,
- const char *tb);
TABLE *get_purge_table(THD *thd);
+TABLE *open_purge_table(THD *thd, const char *db, size_t dblen,
+ const char *tb, size_t tblen);
void close_thread_tables(THD* thd);
#ifdef MYSQL_DYNAMIC_PLUGIN
@@ -20654,16 +20654,20 @@ static TABLE* innodb_find_table_for_vc(THD* thd, dict_table_t* table)
char db_buf[NAME_LEN + 1];
char tbl_buf[NAME_LEN + 1];
+ ulint db_buf_len, tbl_buf_len;
- if (!dict_parse_tbl_name(table->name.m_name, db_buf, tbl_buf)) {
+ if (!dict_parse_tbl_name(table->name.m_name, db_buf, tbl_buf,
+ &db_buf_len, &tbl_buf_len)) {
return NULL;
}
if (bg_thread) {
- return open_purge_table(thd, db_buf, tbl_buf);
+ return open_purge_table(thd, db_buf, db_buf_len,
+ tbl_buf, tbl_buf_len);
}
- mysql_table = find_fk_open_table(thd, db_buf, tbl_buf);
+ mysql_table = find_fk_open_table(thd, db_buf, db_buf_len,
+ tbl_buf, tbl_buf_len);
table->vc_templ->mysql_table = mysql_table;
table->vc_templ->mysql_table_query_id = thd_get_query_id(thd);
return mysql_table;
diff --git a/storage/innobase/include/dict0dict.h b/storage/innobase/include/dict0dict.h
index eed00a58269..5fdc9ccfe0a 100644
--- a/storage/innobase/include/dict0dict.h
+++ b/storage/innobase/include/dict0dict.h
@@ -119,13 +119,17 @@ enum dict_table_op_t {
/** Parse the table file name into table name and database name.
-@param[in] tbl_name InnoDB table name
-@param[in,out] mysql_db_name database name buffer
-@param[in,out] mysql_tbl_name table name buffer
+@param[in] tbl_name InnoDB table name
+@param[in,out] mysql_db_name database name buffer
+@param[in,out] mysql_tbl_name table name buffer
+@param[out] db_name_len database name length
+@param[out] tbl_name_len table name length
@return true if the table name is parse properly. */
-bool dict_parse_tbl_name(const char* tbl_name,
+bool dict_parse_tbl_name(const char *tbl_name,
char (&mysql_db_name)[NAME_LEN + 1],
- char (&mysql_tbl_name)[NAME_LEN + 1]);
+ char (&mysql_tbl_name)[NAME_LEN + 1],
+ size_t *db_name_len, size_t *tbl_name_len)
+ MY_ATTRIBUTE((nonnull));
/** Acquire MDL shared for the table name.
@tparam trylock whether to use non-blocking operation