diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2019-12-05 13:35:12 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2019-12-05 13:35:12 +0200 |
commit | 72573dc5055c018a8d3920b0f11cae70c96ae00c (patch) | |
tree | 615283858efd69049621adc8f74eaebda1ed539e | |
parent | 65a76ca13f0a92cc129c6c17de5b3bcdb6bfe619 (diff) | |
download | mariadb-git-72573dc5055c018a8d3920b0f11cae70c96ae00c.tar.gz |
Cleanup: Revert some sql/ changes
We do add get_purge_table() without proper interface.
-rw-r--r-- | sql/sql_class.cc | 17 | ||||
-rw-r--r-- | storage/innobase/dict/dict0dict.cc | 38 | ||||
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 18 | ||||
-rw-r--r-- | storage/innobase/include/dict0dict.h | 14 |
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 |