From b8233b38da3e7cbb7ae37f866ee8e6f96bad014e Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 29 Jun 2023 16:24:50 +0200 Subject: [PATCH] cleanup: put db/table_name into Alter_info also, prefer Lex_table_name and Lex_ident over LEX_CSTRING --- sql/field.h | 2 +- sql/item.h | 12 ++++----- sql/sql_alter.h | 1 + sql/sql_class.h | 2 +- sql/sql_partition.cc | 34 ++++++++++++------------ sql/sql_partition.h | 6 +---- sql/sql_table.cc | 61 +++++++++++++++++++++----------------------- sql/sql_table.h | 14 +++------- sql/table.cc | 13 +++++----- 9 files changed, 68 insertions(+), 77 deletions(-) diff --git a/sql/field.h b/sql/field.h index 99e73fcc282..804394c58a6 100644 --- a/sql/field.h +++ b/sql/field.h @@ -5234,7 +5234,7 @@ class Column_definition: public Sql_alloc, const Type_handler *field_type() const; // Prevent using this Compression_method *compression_method_ptr; public: - LEX_CSTRING field_name; + Lex_ident field_name; LEX_CSTRING comment; // Comment for field enum enum_column_versioning { diff --git a/sql/item.h b/sql/item.h index e73d4f61b89..d0f44f7218e 100644 --- a/sql/item.h +++ b/sql/item.h @@ -3332,17 +3332,17 @@ protected: updated during fix_fields() to values from Field object and life-time of those is shorter than life-time of Item_field. */ - LEX_CSTRING orig_db_name; - LEX_CSTRING orig_table_name; - LEX_CSTRING orig_field_name; + Lex_table_name orig_db_name; + Lex_table_name orig_table_name; + Lex_ident orig_field_name; void undeclared_spvar_error() const; public: Name_resolution_context *context; - LEX_CSTRING db_name; - LEX_CSTRING table_name; - LEX_CSTRING field_name; + Lex_table_name db_name; + Lex_table_name table_name; + Lex_ident field_name; /* NOTE: came from TABLE::alias_name_used and this is only a hint! See comment for TABLE::alias_name_used. diff --git a/sql/sql_alter.h b/sql/sql_alter.h index 99c6b83ba33..77c74d77f8f 100644 --- a/sql/sql_alter.h +++ b/sql/sql_alter.h @@ -84,6 +84,7 @@ public: ALTER_TABLE_LOCK_EXCLUSIVE }; + Lex_table_name db, table_name; // Columns and keys to be dropped. List drop_list; diff --git a/sql/sql_class.h b/sql/sql_class.h index b58a8f28ac0..65185b7f4b3 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -313,7 +313,7 @@ typedef struct st_copy_info { class Key_part_spec :public Sql_alloc { public: - LEX_CSTRING field_name; + Lex_ident field_name; uint length; bool generated; Key_part_spec(const LEX_CSTRING *name, uint len, bool gen= false) diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index f004981bd2a..30e54ba5f44 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -6032,7 +6032,8 @@ static bool mysql_change_partitions(ALTER_PARTITION_PARAM_TYPE *lpt) THD *thd= lpt->thd; DBUG_ENTER("mysql_change_partitions"); - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); if(mysql_trans_prepare_alter_copy_data(thd)) DBUG_RETURN(TRUE); @@ -6080,7 +6081,8 @@ static bool mysql_rename_partitions(ALTER_PARTITION_PARAM_TYPE *lpt) int error; DBUG_ENTER("mysql_rename_partitions"); - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); if (unlikely((error= lpt->table->file->ha_rename_partitions(path)))) { if (error != 1) @@ -6124,7 +6126,8 @@ static bool mysql_drop_partitions(ALTER_PARTITION_PARAM_TYPE *lpt) lpt->table->s->table_name.str, MDL_EXCLUSIVE)); - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); if ((error= lpt->table->file->ha_drop_partitions(path))) { lpt->table->file->print_error(error, MYF(0)); @@ -6511,7 +6514,8 @@ static bool write_log_rename_frm(ALTER_PARTITION_PARAM_TYPE *lpt) DBUG_ENTER("write_log_rename_frm"); part_info->first_log_entry= NULL; - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); build_table_shadow_filename(shadow_path, sizeof(shadow_path) - 1, lpt); mysql_mutex_lock(&LOCK_gdl); if (write_log_replace_delete_frm(lpt, 0UL, shadow_path, path, TRUE)) @@ -6562,7 +6566,8 @@ static bool write_log_drop_partition(ALTER_PARTITION_PARAM_TYPE *lpt) DBUG_ENTER("write_log_drop_partition"); part_info->first_log_entry= NULL; - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); build_table_shadow_filename(tmp_path, sizeof(tmp_path) - 1, lpt); mysql_mutex_lock(&LOCK_gdl); if (write_log_dropped_partitions(lpt, &next_entry, (const char*)path, @@ -6620,7 +6625,8 @@ static bool write_log_add_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt) DBUG_ASSERT(old_first_log_entry); DBUG_ENTER("write_log_add_change_partition"); - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); build_table_shadow_filename(tmp_path, sizeof(tmp_path) - 1, lpt); mysql_mutex_lock(&LOCK_gdl); @@ -6688,7 +6694,8 @@ static bool write_log_final_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt) Replace the revert operations with forced retry operations. */ part_info->first_log_entry= NULL; - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); build_table_shadow_filename(shadow_path, sizeof(shadow_path) - 1, lpt); mysql_mutex_lock(&LOCK_gdl); if (write_log_changed_partitions(lpt, &next_entry, (const char*)path)) @@ -6874,8 +6881,8 @@ static void handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt, Better to do that here, than leave the cleaning up to others. Acquire EXCLUSIVE mdl lock if not already acquired. */ - if (!thd->mdl_context.is_lock_owner(MDL_key::TABLE, lpt->db.str, - lpt->table_name.str, + if (!thd->mdl_context.is_lock_owner(MDL_key::TABLE, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, MDL_EXCLUSIVE) && wait_while_table_is_used(thd, table, HA_EXTRA_FORCE_REOPEN)) { @@ -7069,14 +7076,11 @@ static void downgrade_mdl_if_lock_tables_mode(THD *thd, MDL_ticket *ticket, uint fast_alter_partition_table(THD *thd, TABLE *table, Alter_info *alter_info, HA_CREATE_INFO *create_info, - TABLE_LIST *table_list, - const LEX_CSTRING *db, - const LEX_CSTRING *table_name) + TABLE_LIST *table_list) { /* Set-up struct used to write frm files */ partition_info *part_info; - ALTER_PARTITION_PARAM_TYPE lpt_obj; - ALTER_PARTITION_PARAM_TYPE *lpt= &lpt_obj; + ALTER_PARTITION_PARAM_TYPE lpt_obj, *lpt= &lpt_obj; bool action_completed= FALSE; bool frm_install= FALSE; MDL_ticket *mdl_ticket= table->mdl_ticket; @@ -7095,8 +7099,6 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, lpt->table= table; lpt->key_info_buffer= 0; lpt->key_count= 0; - lpt->db= *db; - lpt->table_name= *table_name; lpt->copied= 0; lpt->deleted= 0; lpt->pack_frm_data= NULL; diff --git a/sql/sql_partition.h b/sql/sql_partition.h index 58ba82dcd9f..3cdefa034c8 100644 --- a/sql/sql_partition.h +++ b/sql/sql_partition.h @@ -57,8 +57,6 @@ typedef struct st_lock_param_type Alter_info *alter_info; TABLE *table; KEY *key_info_buffer; - LEX_CSTRING db; - LEX_CSTRING table_name; uchar *pack_frm_data; uint key_count; uint db_options; @@ -255,9 +253,7 @@ typedef int (*get_partitions_in_range_iter)(partition_info *part_info, uint fast_alter_partition_table(THD *thd, TABLE *table, Alter_info *alter_info, HA_CREATE_INFO *create_info, - TABLE_LIST *table_list, - const LEX_CSTRING *db, - const LEX_CSTRING *table_name); + TABLE_LIST *table_list); bool set_part_state(Alter_info *alter_info, partition_info *tab_part_info, enum partition_state part_state); uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info, diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 401d8278fd4..144ea9fe8a8 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -79,9 +79,7 @@ static int copy_data_between_tables(THD *, TABLE *,TABLE *, Alter_table_ctx *); static int append_system_key_parts(THD *, HA_CREATE_INFO *, Key *); static int mysql_prepare_create_table(THD *, HA_CREATE_INFO *, Alter_info *, - uint *, handler *, KEY **, uint *, int, - const LEX_CSTRING db, - const LEX_CSTRING table_name); + uint *, handler *, KEY **, uint *, int); static uint blob_length_by_type(enum_field_types type); static bool fix_constraints_names(THD *, List *, const HA_CREATE_INFO *); @@ -1765,9 +1763,9 @@ uint build_table_shadow_filename(char *buff, size_t bufflen, { char tmp_name[FN_REFLEN]; my_snprintf(tmp_name, sizeof (tmp_name), "%s-shadow-%lx-%s", tmp_file_prefix, - (ulong) current_thd->thread_id, lpt->table_name.str); - return build_table_filename(buff, bufflen, lpt->db.str, tmp_name, "", - FN_IS_TMP); + (ulong) current_thd->thread_id, lpt->alter_info->table_name.str); + return build_table_filename(buff, bufflen, lpt->alter_info->db.str, tmp_name, + "", FN_IS_TMP); } @@ -1826,7 +1824,7 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) if (mysql_prepare_create_table(lpt->thd, lpt->create_info, lpt->alter_info, &lpt->db_options, lpt->table->file, &lpt->key_info_buffer, &lpt->key_count, - C_ALTER_TABLE, lpt->db, lpt->table_name)) + C_ALTER_TABLE)) { DBUG_RETURN(TRUE); } @@ -1846,7 +1844,7 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) #endif /* Write shadow frm file */ lpt->create_info->table_options= lpt->db_options; - LEX_CUSTRING frm= build_frm_image(lpt->thd, lpt->table_name, + LEX_CUSTRING frm= build_frm_image(lpt->thd, lpt->alter_info->table_name, lpt->create_info, lpt->alter_info->create_list, lpt->key_count, lpt->key_info_buffer, @@ -1857,7 +1855,8 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) goto end; } - int error= writefile(shadow_frm_name, lpt->db.str, lpt->table_name.str, + int error= writefile(shadow_frm_name, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, lpt->create_info->tmp_table(), frm.str, frm.length); my_free(const_cast(frm.str)); @@ -1879,8 +1878,8 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) /* Build frm file name */ - build_table_filename(path, sizeof(path) - 1, lpt->db.str, - lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); strxnmov(frm_name, sizeof(frm_name), path, reg_ext, NullS); /* When we are changing to use new frm file we need to ensure that we @@ -3556,8 +3555,7 @@ static int mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, Alter_info *alter_info, uint *db_options, handler *file, KEY **key_info_buffer, - uint *key_count, int create_table_mode, - const LEX_CSTRING db, const LEX_CSTRING table_name) + uint *key_count, int create_table_mode) { const char *key_name; Create_field *sql_field,*dup_field; @@ -4454,7 +4452,7 @@ without_overlaps_err: create_info->null_bits= null_fields; /* Check fields. */ - Item::Check_table_name_prm walk_prm(db, table_name); + Item::Check_table_name_prm walk_prm(alter_info->db, alter_info->table_name); it.rewind(); while ((sql_field=it++)) { @@ -4858,9 +4856,7 @@ static int append_system_key_parts(THD *thd, HA_CREATE_INFO *create_info, return result; } -handler *mysql_create_frm_image(THD *thd, const LEX_CSTRING &db, - const LEX_CSTRING &table_name, - HA_CREATE_INFO *create_info, +handler *mysql_create_frm_image(THD *thd, HA_CREATE_INFO *create_info, Alter_info *alter_info, int create_table_mode, KEY **key_info, uint *key_count, LEX_CUSTRING *frm) @@ -4875,7 +4871,7 @@ handler *mysql_create_frm_image(THD *thd, const LEX_CSTRING &db, DBUG_RETURN(NULL); } - set_table_default_charset(thd, create_info, db); + set_table_default_charset(thd, create_info, alter_info->db); db_options= create_info->table_options_with_row_type(); @@ -4996,7 +4992,7 @@ handler *mysql_create_frm_image(THD *thd, const LEX_CSTRING &db, if (part_info->vers_info && !create_info->versioned()) { - my_error(ER_VERS_NOT_VERSIONED, MYF(0), table_name.str); + my_error(ER_VERS_NOT_VERSIONED, MYF(0), alter_info->table_name.str); goto err; } @@ -5094,14 +5090,12 @@ handler *mysql_create_frm_image(THD *thd, const LEX_CSTRING &db, #endif if (mysql_prepare_create_table(thd, create_info, alter_info, &db_options, - file, key_info, key_count, - create_table_mode, db, table_name)) + file, key_info, key_count, create_table_mode)) goto err; create_info->table_options=db_options; - *frm= build_frm_image(thd, table_name, create_info, - alter_info->create_list, *key_count, - *key_info, file); + *frm= build_frm_image(thd, alter_info->table_name, create_info, + alter_info->create_list, *key_count, *key_info, file); if (frm->str) DBUG_RETURN(file); @@ -5373,9 +5367,10 @@ int create_table_impl(THD *thd, const LEX_CSTRING &orig_db, } else { - file= mysql_create_frm_image(thd, orig_db, orig_table_name, create_info, - alter_info, create_table_mode, key_info, - key_count, frm); + alter_info->db= orig_db; + alter_info->table_name= orig_table_name; + file= mysql_create_frm_image(thd, create_info, alter_info, + create_table_mode, key_info, key_count, frm); /* TODO: remove this check of thd->is_error() (now it intercept errors in some val_*() methoids and bring some single place to @@ -7725,13 +7720,15 @@ bool mysql_compare_tables(TABLE *table, Alter_info *alter_info, uint db_options= 0; /* not used */ KEY *key_info_buffer= NULL; + tmp_alter_info.db= table->s->db; + tmp_alter_info.table_name= table->s->table_name; + /* Create the prepared information. */ int create_table_mode= table->s->tmp_table == NO_TMP_TABLE ? C_ORDINARY_CREATE : C_ALTER_TABLE; if (mysql_prepare_create_table(thd, create_info, &tmp_alter_info, &db_options, table->file, &key_info_buffer, - &key_count, create_table_mode, - table->s->db, table->s->table_name)) + &key_count, create_table_mode)) DBUG_RETURN(1); /* Some very basic checks. */ @@ -10640,10 +10637,10 @@ do_continue:; } // In-place execution of ALTER TABLE for partitioning. + alter_info->db= alter_ctx.db; + alter_info->table_name= alter_ctx.table_name; DBUG_RETURN(fast_alter_partition_table(thd, table, alter_info, - create_info, table_list, - &alter_ctx.db, - &alter_ctx.table_name)); + create_info, table_list)); } #endif diff --git a/sql/sql_table.h b/sql/sql_table.h index 7dafe86e897..137405f8079 100644 --- a/sql/sql_table.h +++ b/sql/sql_table.h @@ -198,18 +198,12 @@ int mysql_create_table_no_lock(THD *thd, Table_specification_st *create_info, Alter_info *alter_info, bool *is_trans, int create_table_mode, TABLE_LIST *table); -handler *mysql_create_frm_image(THD *thd, - const LEX_CSTRING &db, - const LEX_CSTRING &table_name, - HA_CREATE_INFO *create_info, - Alter_info *alter_info, - int create_table_mode, - KEY **key_info, - uint *key_count, +handler *mysql_create_frm_image(THD *thd, HA_CREATE_INFO *create_info, + Alter_info *alter_info, int create_table_mode, + KEY **key_info, uint *key_count, LEX_CUSTRING *frm); -int mysql_discard_or_import_tablespace(THD *thd, - TABLE_LIST *table_list, +int mysql_discard_or_import_tablespace(THD *thd, TABLE_LIST *table_list, bool discard); bool mysql_prepare_alter_table(THD *thd, TABLE *table, diff --git a/sql/table.cc b/sql/table.cc index 7e5db62d4dd..921cf41f514 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -3411,17 +3411,18 @@ int TABLE_SHARE::init_from_sql_statement_string(THD *thd, bool write, sql_unusable_for_discovery(thd, hton, sql_copy)))) goto ret; - thd->lex->create_info.db_type= hton; + tmp_lex.create_info.db_type= hton; #ifdef WITH_PARTITION_STORAGE_ENGINE thd->work_part_info= 0; // For partitioning #endif if (tabledef_version.str) - thd->lex->create_info.tabledef_version= tabledef_version; + tmp_lex.create_info.tabledef_version= tabledef_version; - promote_first_timestamp_column(&thd->lex->alter_info.create_list); - file= mysql_create_frm_image(thd, db, table_name, - &thd->lex->create_info, &thd->lex->alter_info, + tmp_lex.alter_info.db= db; + tmp_lex.alter_info.table_name= table_name; + promote_first_timestamp_column(&tmp_lex.alter_info.create_list); + file= mysql_create_frm_image(thd, &tmp_lex.create_info, &tmp_lex.alter_info, C_ORDINARY_CREATE, &unused1, &unused2, &frm); error|= file == 0; delete file; @@ -3435,7 +3436,7 @@ int TABLE_SHARE::init_from_sql_statement_string(THD *thd, bool write, ret: my_free(const_cast(frm.str)); - lex_end(thd->lex); + lex_end(&tmp_lex); thd->reset_db(&db_backup); thd->lex= old_lex; reenable_binlog(thd);