diff options
Diffstat (limited to 'sql/sql_alter.cc')
-rw-r--r-- | sql/sql_alter.cc | 59 |
1 files changed, 31 insertions, 28 deletions
diff --git a/sql/sql_alter.cc b/sql/sql_alter.cc index 3d1e4c0fa65..2cc6504d2f3 100644 --- a/sql/sql_alter.cc +++ b/sql/sql_alter.cc @@ -86,8 +86,8 @@ bool Alter_info::set_requested_lock(const LEX_CSTRING *str) Alter_table_ctx::Alter_table_ctx() : datetime_field(NULL), error_if_not_empty(false), tables_opened(0), - db(NULL), table_name(NULL), alias(NULL), - new_db(NULL), new_name(NULL), new_alias(NULL), + db(null_clex_str), table_name(null_clex_str), alias(null_clex_str), + new_db(null_clex_str), new_name(null_clex_str), new_alias(null_clex_str), fk_error_if_delete_row(false), fk_error_id(NULL), fk_error_table(NULL) #ifdef DBUG_ASSERT_EXISTS @@ -103,11 +103,11 @@ Alter_table_ctx::Alter_table_ctx() Alter_table_ctx::Alter_table_ctx(THD *thd, TABLE_LIST *table_list, uint tables_opened_arg, - const char *new_db_arg, - const char *new_name_arg) + const LEX_CSTRING *new_db_arg, + const LEX_CSTRING *new_name_arg) : datetime_field(NULL), error_if_not_empty(false), tables_opened(tables_opened_arg), - new_db(new_db_arg), new_name(new_name_arg), + new_db(*new_db_arg), new_name(*new_name_arg), fk_error_if_delete_row(false), fk_error_id(NULL), fk_error_table(NULL) #ifdef DBUG_ASSERT_EXISTS @@ -123,29 +123,31 @@ Alter_table_ctx::Alter_table_ctx(THD *thd, TABLE_LIST *table_list, table_name= table_list->table_name; alias= (lower_case_table_names == 2) ? table_list->alias : table_name; - if (!new_db || !my_strcasecmp(table_alias_charset, new_db, db)) + if (!new_db.str || !my_strcasecmp(table_alias_charset, new_db.str, db.str)) new_db= db; - if (new_name) + if (new_name.str) { - DBUG_PRINT("info", ("new_db.new_name: '%s'.'%s'", new_db, new_name)); + DBUG_PRINT("info", ("new_db.new_name: '%s'.'%s'", new_db.str, new_name.str)); - if (lower_case_table_names == 1) // Convert new_name/new_alias to lower case + if (lower_case_table_names == 1) // Convert new_name/new_alias to lower { - my_casedn_str(files_charset_info, (char*) new_name); + new_name.length= my_casedn_str(files_charset_info, (char*) new_name.str); new_alias= new_name; } else if (lower_case_table_names == 2) // Convert new_name to lower case { - new_alias= new_alias_buff; - strmov(new_alias_buff, new_name); - my_casedn_str(files_charset_info, (char*) new_name); + new_alias.str= new_alias_buff; + new_alias.length= new_name.length; + strmov(new_alias_buff, new_name.str); + new_name.length= my_casedn_str(files_charset_info, (char*) new_name.str); + } else new_alias= new_name; // LCTN=0 => case sensitive + case preserving if (!is_database_changed() && - !my_strcasecmp(table_alias_charset, new_name, table_name)) + !my_strcasecmp(table_alias_charset, new_name.str, table_name.str)) { /* Source and destination table names are equal: @@ -161,22 +163,23 @@ Alter_table_ctx::Alter_table_ctx(THD *thd, TABLE_LIST *table_list, new_name= table_name; } - my_snprintf(tmp_name, sizeof(tmp_name), "%s-%lx_%llx", tmp_file_prefix, - current_pid, thd->thread_id); + tmp_name.str= tmp_name_buff; + tmp_name.length= my_snprintf(tmp_name_buff, sizeof(tmp_name_buff), "%s-%lx_%llx", + tmp_file_prefix, current_pid, thd->thread_id); /* Safety fix for InnoDB */ if (lower_case_table_names) - my_casedn_str(files_charset_info, tmp_name); + tmp_name.length= my_casedn_str(files_charset_info, tmp_name_buff); if (table_list->table->s->tmp_table == NO_TMP_TABLE) { - build_table_filename(path, sizeof(path) - 1, db, table_name, "", 0); + build_table_filename(path, sizeof(path) - 1, db.str, table_name.str, "", 0); - build_table_filename(new_path, sizeof(new_path) - 1, new_db, new_name, "", 0); + build_table_filename(new_path, sizeof(new_path) - 1, new_db.str, new_name.str, "", 0); build_table_filename(new_filename, sizeof(new_filename) - 1, - new_db, new_name, reg_ext, 0); + new_db.str, new_name.str, reg_ext, 0); - build_table_filename(tmp_path, sizeof(tmp_path) - 1, new_db, tmp_name, "", + build_table_filename(tmp_path, sizeof(tmp_path) - 1, new_db.str, tmp_name.str, "", FN_IS_TMP); } else @@ -227,14 +230,14 @@ bool Sql_cmd_alter_table::execute(THD *thd) priv_needed|= DROP_ACL; /* Must be set in the parser */ - DBUG_ASSERT(select_lex->db); + DBUG_ASSERT(select_lex->db.str); DBUG_ASSERT(!(alter_info.flags & Alter_info::ALTER_EXCHANGE_PARTITION)); DBUG_ASSERT(!(alter_info.flags & Alter_info::ALTER_ADMIN_PARTITION)); - if (check_access(thd, priv_needed, first_table->db, + if (check_access(thd, priv_needed, first_table->db.str, &first_table->grant.privilege, &first_table->grant.m_internal, 0, 0) || - check_access(thd, INSERT_ACL | CREATE_ACL, select_lex->db, + check_access(thd, INSERT_ACL | CREATE_ACL, select_lex->db.str, &priv, NULL, /* Don't use first_tab->grant with sel_lex->db */ 0, 0)) @@ -291,7 +294,7 @@ bool Sql_cmd_alter_table::execute(THD *thd) // Rename of table TABLE_LIST tmp_table; memset(&tmp_table, 0, sizeof(tmp_table)); - tmp_table.table_name= lex->name.str; + tmp_table.table_name= lex->name; tmp_table.db= select_lex->db; tmp_table.grant.privilege= priv; if (check_grant(thd, INSERT_ACL | CREATE_ACL, &tmp_table, FALSE, @@ -316,13 +319,13 @@ bool Sql_cmd_alter_table::execute(THD *thd) if ((!thd->is_current_stmt_binlog_format_row() || !thd->find_temporary_table(first_table))) { - WSREP_TO_ISOLATION_BEGIN(((lex->name.str) ? select_lex->db : NULL), + WSREP_TO_ISOLATION_BEGIN(((lex->name.str) ? select_lex->db.str : NULL), ((lex->name.str) ? lex->name.str : NULL), first_table); } #endif /* WITH_WSREP */ - result= mysql_alter_table(thd, select_lex->db, lex->name.str, + result= mysql_alter_table(thd, &select_lex->db, &lex->name, &create_info, first_table, &alter_info, @@ -346,7 +349,7 @@ bool Sql_cmd_discard_import_tablespace::execute(THD *thd) /* first table of first SELECT_LEX */ TABLE_LIST *table_list= (TABLE_LIST*) select_lex->table_list.first; - if (check_access(thd, ALTER_ACL, table_list->db, + if (check_access(thd, ALTER_ACL, table_list->db.str, &table_list->grant.privilege, &table_list->grant.m_internal, 0, 0)) |