summaryrefslogtreecommitdiff
path: root/sql/sql_base.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_base.cc')
-rw-r--r--sql/sql_base.cc239
1 files changed, 118 insertions, 121 deletions
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index bd2bc54efb4..df5e947efa2 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -244,8 +244,9 @@ struct list_open_tables_arg
static my_bool list_open_tables_callback(TDC_element *element,
list_open_tables_arg *arg)
{
- char *db= (char*) element->m_key;
- char *table_name= (char*) element->m_key + strlen((char*) element->m_key) + 1;
+ const char *db= (char*) element->m_key;
+ uint db_length= strlen(db);
+ const char *table_name= db + db_length + 1;
if (arg->db && my_strcasecmp(system_charset_info, arg->db, db))
return FALSE;
@@ -253,8 +254,10 @@ static my_bool list_open_tables_callback(TDC_element *element,
return FALSE;
/* Check if user has SELECT privilege for any column in the table */
- arg->table_list.db= db;
- arg->table_list.table_name= table_name;
+ arg->table_list.db.str= db;
+ arg->table_list.db.length= db_length;
+ arg->table_list.table_name.str= table_name;
+ arg->table_list.table_name.length= strlen(table_name);
arg->table_list.grant.privilege= 0;
if (check_table_access(arg->thd, SELECT_ACL, &arg->table_list, TRUE, 1, TRUE))
@@ -381,8 +384,8 @@ bool close_cached_tables(THD *thd, TABLE_LIST *tables,
for (TABLE_LIST *table= tables; table; table= table->next_local)
{
/* tdc_remove_table() also sets TABLE_SHARE::version to 0. */
- found|= tdc_remove_table(thd, TDC_RT_REMOVE_UNUSED, table->db,
- table->table_name, TRUE);
+ found|= tdc_remove_table(thd, TDC_RT_REMOVE_UNUSED, table->db.str,
+ table->table_name.str, TRUE);
}
if (!found)
wait_for_refresh=0; // Nothing to wait for
@@ -412,8 +415,8 @@ bool close_cached_tables(THD *thd, TABLE_LIST *tables,
table_list= table_list->next_global)
{
/* A check that the table was locked for write is done by the caller. */
- TABLE *table= find_table_for_mdl_upgrade(thd, table_list->db,
- table_list->table_name, TRUE);
+ TABLE *table= find_table_for_mdl_upgrade(thd, table_list->db.str,
+ table_list->table_name.str, TRUE);
/* May return NULL if this table has already been closed via an alias. */
if (! table)
@@ -463,7 +466,7 @@ bool close_cached_tables(THD *thd, TABLE_LIST *tables,
{
if (thd->killed)
break;
- if (tdc_wait_for_old_version(thd, table->db, table->table_name, timeout,
+ if (tdc_wait_for_old_version(thd, table->db.str, table->table_name.str, timeout,
MDL_wait_for_subgraph::DEADLOCK_WEIGHT_DDL,
refresh_version))
{
@@ -530,9 +533,9 @@ static my_bool close_cached_connection_tables_callback(
/* close_cached_tables() only uses these elements */
if (!(tmp= (TABLE_LIST*) alloc_root(arg->thd->mem_root, sizeof(TABLE_LIST))) ||
- !(tmp->db= strdup_root(arg->thd->mem_root, element->share->db.str)) ||
- !(tmp->table_name= strdup_root(arg->thd->mem_root,
- element->share->table_name.str)))
+ !(arg->thd->make_lex_string(&tmp->db, element->share->db.str, element->share->db.length)) ||
+ !(arg->thd->make_lex_string(&tmp->table_name, element->share->table_name.str,
+ element->share->table_name.length)))
{
mysql_mutex_unlock(&element->LOCK_table_share);
return TRUE;
@@ -919,8 +922,7 @@ void close_thread_table(THD *thd, TABLE **table_ptr)
table_name Table name
NOTES:
- This is called by find_table_in_local_list() and
- find_table_in_global_list().
+ This is called by find_table_in_global_list().
RETURN VALUES
NULL Table not found
@@ -929,13 +931,13 @@ void close_thread_table(THD *thd, TABLE **table_ptr)
TABLE_LIST *find_table_in_list(TABLE_LIST *table,
TABLE_LIST *TABLE_LIST::*link,
- const char *db_name,
- const char *table_name)
+ const LEX_CSTRING *db_name,
+ const LEX_CSTRING *table_name)
{
for (; table; table= table->*link )
{
- if (strcmp(table->db, db_name) == 0 &&
- strcmp(table->table_name, table_name) == 0)
+ if (cmp(&table->db, db_name) == 0 &&
+ cmp(&table->table_name, table_name) == 0)
break;
}
return table;
@@ -980,9 +982,9 @@ TABLE_LIST* find_dup_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list,
bool check_alias)
{
TABLE_LIST *res;
- const char *d_name, *t_name, *t_alias;
+ LEX_CSTRING *d_name, *t_name, *t_alias;
DBUG_ENTER("find_dup_table");
- DBUG_PRINT("enter", ("table alias: %s", table->alias));
+ DBUG_PRINT("enter", ("table alias: %s", table->alias.str));
/*
If this function called for query which update table (INSERT/UPDATE/...)
@@ -1006,12 +1008,12 @@ TABLE_LIST* find_dup_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list,
*/
DBUG_ASSERT(table);
}
- d_name= table->db;
- t_name= table->table_name;
- t_alias= table->alias;
+ d_name= &table->db;
+ t_name= &table->table_name;
+ t_alias= &table->alias;
retry:
- DBUG_PRINT("info", ("real table: %s.%s", d_name, t_name));
+ DBUG_PRINT("info", ("real table: %s.%s", d_name->str, t_name->str));
for (TABLE_LIST *tl= table_list;;)
{
if (tl &&
@@ -1039,7 +1041,7 @@ retry:
/* Skip if table alias does not match. */
if (check_alias)
{
- if (my_strcasecmp(table_alias_charset, t_alias, res->alias))
+ if (my_strcasecmp(table_alias_charset, t_alias->str, res->alias.str))
goto next;
}
@@ -1177,21 +1179,21 @@ void update_non_unique_table_error(TABLE_LIST *update,
if (update->view == duplicate->view)
my_error(!strncmp(operation, "INSERT", 6) ?
ER_NON_INSERTABLE_TABLE : ER_NON_UPDATABLE_TABLE, MYF(0),
- update->alias, operation);
+ update->alias.str, operation);
else
my_error(ER_VIEW_PREVENT_UPDATE, MYF(0),
- (duplicate->view ? duplicate->alias : update->alias),
- operation, update->alias);
+ (duplicate->view ? duplicate->alias.str : update->alias.str),
+ operation, update->alias.str);
return;
}
if (duplicate->view)
{
- my_error(ER_VIEW_PREVENT_UPDATE, MYF(0), duplicate->alias, operation,
- update->alias);
+ my_error(ER_VIEW_PREVENT_UPDATE, MYF(0), duplicate->alias.str, operation,
+ update->alias.str);
return;
}
}
- my_error(ER_UPDATE_TABLE_USED, MYF(0), update->alias, operation);
+ my_error(ER_UPDATE_TABLE_USED, MYF(0), update->alias.str, operation);
}
@@ -1256,8 +1258,8 @@ bool wait_while_table_is_used(THD *thd, TABLE *table,
prelocked mode, e.g. if we do CREATE TABLE .. SELECT f1();
*/
-void drop_open_table(THD *thd, TABLE *table, const char *db_name,
- const char *table_name)
+void drop_open_table(THD *thd, TABLE *table, const LEX_CSTRING *db_name,
+ const LEX_CSTRING *table_name)
{
DBUG_ENTER("drop_open_table");
if (table->s->tmp_table)
@@ -1270,7 +1272,7 @@ void drop_open_table(THD *thd, TABLE *table, const char *db_name,
table->file->extra(HA_EXTRA_PREPARE_FOR_DROP);
close_thread_table(thd, &thd->open_tables);
/* Remove the table share from the table cache. */
- tdc_remove_table(thd, TDC_RT_REMOVE_ALL, db_name, table_name,
+ tdc_remove_table(thd, TDC_RT_REMOVE_ALL, db_name->str, table_name->str,
FALSE);
/* Remove the table from the storage engine and rm the .frm. */
quick_rm_table(thd, table_type, db_name, table_name, 0);
@@ -1507,7 +1509,7 @@ bool open_table(THD *thd, TABLE_LIST *table_list, Open_table_context *ot_ctx)
TABLE *table;
const char *key;
uint key_length;
- const char *alias= table_list->alias;
+ const char *alias= table_list->alias.str;
uint flags= ot_ctx->get_flags();
MDL_ticket *mdl_ticket;
TABLE_SHARE *share;
@@ -1628,13 +1630,13 @@ bool open_table(THD *thd, TABLE_LIST *table_list, Open_table_context *ot_ctx)
to deadlocks) it should be disallowed.
*/
if (thd->mdl_context.is_lock_owner(MDL_key::TABLE,
- table_list->db,
- table_list->table_name,
+ table_list->db.str,
+ table_list->table_name.str,
MDL_SHARED))
{
char path[FN_REFLEN + 1];
build_table_filename(path, sizeof(path) - 1,
- table_list->db, table_list->table_name, reg_ext, 0);
+ table_list->db.str, table_list->table_name.str, reg_ext, 0);
/*
Note that we can't be 100% sure that it is a view since it's
possible that we either simply have not found unused TABLE
@@ -1669,7 +1671,7 @@ bool open_table(THD *thd, TABLE_LIST *table_list, Open_table_context *ot_ctx)
locked tables list was created.
*/
if (thd->locked_tables_mode == LTM_PRELOCKED)
- my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db, table_list->alias);
+ my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db.str, table_list->alias.str);
else
my_error(ER_TABLE_NOT_LOCKED, MYF(0), alias);
DBUG_RETURN(TRUE);
@@ -1755,7 +1757,7 @@ bool open_table(THD *thd, TABLE_LIST *table_list, Open_table_context *ot_ctx)
if (table_list->open_strategy == TABLE_LIST::OPEN_IF_EXISTS)
{
- if (!ha_table_exists(thd, table_list->db, table_list->table_name))
+ if (!ha_table_exists(thd, &table_list->db, &table_list->table_name))
DBUG_RETURN(FALSE);
}
else if (table_list->open_strategy == TABLE_LIST::OPEN_STUB)
@@ -1818,7 +1820,8 @@ retry_share:
}
if (table_list->sequence)
{
- my_error(ER_NOT_SEQUENCE, MYF(0), table_list->db, table_list->alias);
+ my_error(ER_NOT_SEQUENCE, MYF(0), table_list->db.str,
+ table_list->alias.str);
goto err_lock;
}
/*
@@ -1865,8 +1868,8 @@ retry_share:
bool wait_result;
thd->push_internal_handler(&mdl_deadlock_handler);
- wait_result= tdc_wait_for_old_version(thd, table_list->db,
- table_list->table_name,
+ wait_result= tdc_wait_for_old_version(thd, table_list->db.str,
+ table_list->table_name.str,
ot_ctx->get_timeout(),
mdl_ticket->get_deadlock_weight());
thd->pop_internal_handler();
@@ -1914,7 +1917,7 @@ retry_share:
if (!(table=(TABLE*) my_malloc(sizeof(*table),MYF(MY_WME))))
goto err_lock;
- error= open_table_from_share(thd, share, alias,
+ error= open_table_from_share(thd, share, &table_list->alias,
HA_OPEN_KEYFILE | HA_TRY_READ_ONLY,
EXTRA_RECORD,
thd->open_options, table, FALSE,
@@ -1983,7 +1986,7 @@ retry_share:
#endif
if (table_list->sequence && table->s->table_type != TABLE_TYPE_SEQUENCE)
{
- my_error(ER_NOT_SEQUENCE, MYF(0), table_list->db, table_list->alias);
+ my_error(ER_NOT_SEQUENCE, MYF(0), table_list->db.str, table_list->alias.str);
DBUG_RETURN(true);
}
@@ -2111,28 +2114,30 @@ Locked_tables_list::init_locked_tables(THD *thd)
table= table->next, m_locked_tables_count++)
{
TABLE_LIST *src_table_list= table->pos_in_table_list;
- char *db, *table_name, *alias;
- size_t db_len= table->s->db.length;
- size_t table_name_len= table->s->table_name.length;
- size_t alias_len= table->alias.length();
+ LEX_CSTRING db, table_name, alias;
+
+ db.length= table->s->db.length;
+ table_name.length= table->s->table_name.length;
+ alias.length= table->alias.length();
TABLE_LIST *dst_table_list;
if (! multi_alloc_root(&m_locked_tables_root,
&dst_table_list, sizeof(*dst_table_list),
- &db, db_len + 1,
- &table_name, table_name_len + 1,
- &alias, alias_len + 1,
+ &db.str, (size_t) db.length + 1,
+ &table_name.str, (size_t) table_name.length + 1,
+ &alias.str, (size_t) alias.length + 1,
NullS))
{
reset();
return TRUE;
}
- memcpy(db, table->s->db.str, db_len + 1);
- memcpy(table_name, table->s->table_name.str, table_name_len + 1);
- strmake(alias, table->alias.ptr(), alias_len);
- dst_table_list->init_one_table(db, db_len, table_name, table_name_len,
- alias, table->reginfo.lock_type);
+ memcpy((char*) db.str, table->s->db.str, db.length + 1);
+ memcpy((char*) table_name.str, table->s->table_name.str,
+ table_name.length + 1);
+ memcpy((char*) alias.str, table->alias.c_ptr(), alias.length + 1);
+ dst_table_list->init_one_table(&db, &table_name,
+ &alias, table->reginfo.lock_type);
dst_table_list->table= table;
dst_table_list->mdl_request.ticket= src_table_list->mdl_request.ticket;
@@ -2467,7 +2472,7 @@ bool Locked_tables_list::restore_lock(THD *thd, TABLE_LIST *dst_table_list,
{
MYSQL_LOCK *merged_lock;
DBUG_ENTER("restore_lock");
- DBUG_ASSERT(!strcmp(dst_table_list->table_name, table->s->table_name.str));
+ DBUG_ASSERT(!strcmp(dst_table_list->table_name.str, table->s->table_name.str));
/* Ensure we have the memory to add the table back */
if (!(merged_lock= mysql_lock_merge(thd->lock, lock)))
@@ -2696,8 +2701,8 @@ ret:
static bool open_table_entry_fini(THD *thd, TABLE_SHARE *share, TABLE *entry)
{
- if (Table_triggers_list::check_n_load(thd, share->db.str,
- share->table_name.str, entry, 0))
+ if (Table_triggers_list::check_n_load(thd, &share->db,
+ &share->table_name, entry, 0))
return TRUE;
/*
@@ -2714,10 +2719,9 @@ static bool open_table_entry_fini(THD *thd, TABLE_SHARE *share, TABLE *entry)
query.length(0);
query.append("DELETE FROM ");
- append_identifier(thd, &query, share->db.str, share->db.length);
+ append_identifier(thd, &query, &share->db);
query.append(".");
- append_identifier(thd, &query, share->table_name.str,
- share->table_name.length);
+ append_identifier(thd, &query, &share->table_name);
/*
we bypass thd->binlog_query() here,
@@ -2753,7 +2757,7 @@ static bool auto_repair_table(THD *thd, TABLE_LIST *table_list)
DBUG_ASSERT(! share->is_view);
- if (open_table_from_share(thd, share, table_list->alias,
+ if (open_table_from_share(thd, share, &table_list->alias,
HA_OPEN_KEYFILE | HA_TRY_READ_ONLY,
EXTRA_RECORD,
ha_open_options | HA_OPEN_FOR_REPAIR,
@@ -2778,7 +2782,7 @@ static bool auto_repair_table(THD *thd, TABLE_LIST *table_list)
tdc_release_share(share);
/* Remove the repaired share from the table cache. */
tdc_remove_table(thd, TDC_RT_REMOVE_ALL,
- table_list->db, table_list->table_name,
+ table_list->db.str, table_list->table_name.str,
FALSE);
end_free:
my_free(entry);
@@ -2881,10 +2885,7 @@ request_backoff_action(enum_open_table_action action_arg,
m_failed_table= (TABLE_LIST*) m_thd->alloc(sizeof(TABLE_LIST));
if (m_failed_table == NULL)
return TRUE;
- m_failed_table->init_one_table(table->db, table->db_length,
- table->table_name,
- table->table_name_length,
- table->alias, TL_WRITE);
+ m_failed_table->init_one_table(&table->db, &table->table_name, &table->alias, TL_WRITE);
m_failed_table->open_strategy= table->open_strategy;
m_failed_table->mdl_request.set_type(MDL_EXCLUSIVE);
}
@@ -2953,8 +2954,8 @@ Open_table_context::recover_from_failed_open()
get_timeout(), 0)))
break;
- tdc_remove_table(m_thd, TDC_RT_REMOVE_ALL, m_failed_table->db,
- m_failed_table->table_name, FALSE);
+ tdc_remove_table(m_thd, TDC_RT_REMOVE_ALL, m_failed_table->db.str,
+ m_failed_table->table_name.str, FALSE);
m_thd->get_stmt_da()->clear_warning_info(m_thd->query_id);
m_thd->clear_error(); // Clear error message
@@ -2989,8 +2990,8 @@ Open_table_context::recover_from_failed_open()
get_timeout(), 0)))
break;
- tdc_remove_table(m_thd, TDC_RT_REMOVE_ALL, m_failed_table->db,
- m_failed_table->table_name, FALSE);
+ tdc_remove_table(m_thd, TDC_RT_REMOVE_ALL, m_failed_table->db.str,
+ m_failed_table->table_name.str, FALSE);
result= auto_repair_table(m_thd, m_failed_table);
/*
@@ -3310,10 +3311,8 @@ open_and_process_table(THD *thd, LEX *lex, TABLE_LIST *tables,
obtain proper metadata locks and do other necessary steps like
stored routine processing.
*/
- tables->db= tables->view_db.str;
- tables->db_length= tables->view_db.length;
- tables->table_name= tables->view_name.str;
- tables->table_name_length= tables->view_name.length;
+ tables->db= tables->view_db;
+ tables->table_name= tables->view_name;
}
else if (tables->select_lex)
{
@@ -3370,7 +3369,7 @@ open_and_process_table(THD *thd, LEX *lex, TABLE_LIST *tables,
goto end;
}
DBUG_PRINT("tcache", ("opening table: '%s'.'%s' item: %p",
- tables->db, tables->table_name, tables)); //psergey: invalid read of size 1 here
+ tables->db.str, tables->table_name.str, tables));
(*counter)++;
/*
@@ -3386,7 +3385,7 @@ open_and_process_table(THD *thd, LEX *lex, TABLE_LIST *tables,
DBUG_ASSERT(is_temporary_table(tables) || tables->table->s->sequence);
if (tables->sequence && tables->table->s->table_type != TABLE_TYPE_SEQUENCE)
{
- my_error(ER_NOT_SEQUENCE, MYF(0), tables->db, tables->alias);
+ my_error(ER_NOT_SEQUENCE, MYF(0), tables->db.str, tables->alias.str);
DBUG_RETURN(true);
}
}
@@ -3489,7 +3488,7 @@ open_and_process_table(THD *thd, LEX *lex, TABLE_LIST *tables,
if (! ot_ctx->can_recover_from_failed_open() && safe_to_ignore_table)
{
DBUG_PRINT("info", ("open_table: ignoring table '%s'.'%s'",
- tables->db, tables->alias));
+ tables->db.str, tables->alias.str));
error= FALSE;
}
goto end;
@@ -3712,7 +3711,7 @@ lock_table_names(THD *thd, const DDL_options_st &options,
MDL_request *schema_request= new (thd->mem_root) MDL_request;
if (schema_request == NULL)
DBUG_RETURN(TRUE);
- schema_request->init(MDL_key::SCHEMA, table->db, "",
+ schema_request->init(MDL_key::SCHEMA, table->db.str, "",
MDL_INTENTION_EXCLUSIVE,
MDL_TRANSACTION);
mdl_requests.push_front(schema_request);
@@ -3763,17 +3762,17 @@ lock_table_names(THD *thd, const DDL_options_st &options,
We come here in the case of lock timeout when executing CREATE TABLE.
Verify that table does exist (it usually does, as we got a lock conflict)
*/
- if (ha_table_exists(thd, tables_start->db, tables_start->table_name))
+ if (ha_table_exists(thd, &tables_start->db, &tables_start->table_name))
{
if (options.if_not_exists())
{
push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE,
ER_TABLE_EXISTS_ERROR,
ER_THD(thd, ER_TABLE_EXISTS_ERROR),
- tables_start->table_name);
+ tables_start->table_name.str);
}
else
- my_error(ER_TABLE_EXISTS_ERROR, MYF(0), tables_start->table_name);
+ my_error(ER_TABLE_EXISTS_ERROR, MYF(0), tables_start->table_name.str);
DBUG_RETURN(TRUE);
}
/*
@@ -3847,7 +3846,7 @@ open_tables_check_upgradable_mdl(THD *thd, TABLE_LIST *tables_start,
Note that find_table_for_mdl_upgrade() will report an error if
no suitable ticket is found.
*/
- if (!find_table_for_mdl_upgrade(thd, table->db, table->table_name, false))
+ if (!find_table_for_mdl_upgrade(thd, table->db.str, table->table_name.str, false))
return TRUE;
}
@@ -4163,7 +4162,7 @@ restart:
(*start)->table &&
(*start)->table->file->ht == myisam_hton &&
wsrep_thd_exec_mode(thd) == LOCAL_STATE &&
- !is_stat_table((*start)->db, (*start)->alias) &&
+ !is_stat_table(&(*start)->db, &(*start)->alias) &&
thd->get_command() != COM_STMT_PREPARE &&
((thd->lex->sql_command == SQLCOM_INSERT ||
thd->lex->sql_command == SQLCOM_INSERT_SELECT ||
@@ -4252,8 +4251,8 @@ static bool table_already_fk_prelocked(TABLE_LIST *tl, LEX_CSTRING *db,
{
if (tl->lock_type >= lock_type &&
tl->prelocking_placeholder == TABLE_LIST::PRELOCK_FK &&
- strcmp(tl->db, db->str) == 0 &&
- strcmp(tl->table_name, table->str) == 0)
+ strcmp(tl->db.str, db->str) == 0 &&
+ strcmp(tl->table_name.str, table->str) == 0)
return true;
}
return false;
@@ -4265,7 +4264,7 @@ static bool internal_table_exists(TABLE_LIST *global_list,
{
do
{
- if (global_list->table_name == table_name)
+ if (global_list->table_name.str == table_name)
return 1;
} while ((global_list= global_list->next_global));
return 0;
@@ -4284,16 +4283,14 @@ add_internal_tables(THD *thd, Query_tables_list *prelocking_ctx,
Skip table if already in the list. Can happen with prepared statements
*/
if (tables->next_local &&
- internal_table_exists(global_table_list, tables->table_name))
+ internal_table_exists(global_table_list, tables->table_name.str))
continue;
TABLE_LIST *tl= (TABLE_LIST *) thd->alloc(sizeof(TABLE_LIST));
if (!tl)
return TRUE;
- tl->init_one_table_for_prelocking(tables->db,
- strlen(tables->db),
- tables->table_name,
- strlen(tables->table_name),
+ tl->init_one_table_for_prelocking(&tables->db,
+ &tables->table_name,
NULL, tables->lock_type,
TABLE_LIST::PRELOCK_NONE,
0, 0,
@@ -4389,10 +4386,8 @@ handle_table(THD *thd, Query_tables_list *prelocking_ctx,
continue;
TABLE_LIST *tl= (TABLE_LIST *) thd->alloc(sizeof(TABLE_LIST));
- tl->init_one_table_for_prelocking(fk->foreign_db->str,
- fk->foreign_db->length,
- fk->foreign_table->str,
- fk->foreign_table->length,
+ tl->init_one_table_for_prelocking(fk->foreign_db,
+ fk->foreign_table,
NULL, lock_type,
TABLE_LIST::PRELOCK_FK,
table_list->belong_to_view, op,
@@ -5436,7 +5431,7 @@ find_field_in_view(THD *thd, TABLE_LIST *table_list,
DBUG_ENTER("find_field_in_view");
DBUG_PRINT("enter",
("view: '%s', field name: '%s', item name: '%s', ref %p",
- table_list->alias, name, item_name, ref));
+ table_list->alias.str, name, item_name, ref));
Field_iterator_view field_it;
field_it.set(table_list);
Query_arena *arena= 0, backup;
@@ -5704,6 +5699,7 @@ find_field_in_table(THD *thd, TABLE *table, const char *name, uint length,
item_name [in] name of item if it will be created (VIEW)
db_name [in] optional database name that qualifies the
table_name [in] optional table name that qualifies the field
+ 0 for non-qualified field in natural joins
ref [in/out] if 'name' is resolved to a view field, ref
is set to point to the found view field
check_privileges [in] check privileges
@@ -5747,12 +5743,12 @@ find_field_in_table_ref(THD *thd, TABLE_LIST *table_list,
{
Field *fld;
DBUG_ENTER("find_field_in_table_ref");
- DBUG_ASSERT(table_list->alias);
+ DBUG_ASSERT(table_list->alias.str);
DBUG_ASSERT(name);
DBUG_ASSERT(item_name);
DBUG_PRINT("enter",
("table: '%s' field name: '%s' item name: '%s' ref %p",
- table_list->alias, name, item_name, ref));
+ table_list->alias.str, name, item_name, ref));
/*
Check that the table and database that qualify the current field name
@@ -5768,9 +5764,13 @@ find_field_in_table_ref(THD *thd, TABLE_LIST *table_list,
inside the view, but we want to search directly in the view columns
which are represented as a 'field_translation'.
- TODO: Ensure that table_name, db_name and tables->db always points to
- something !
+ tables->db.str may be 0 if we are preparing a statement
+ db_name is 0 if item doesn't have a db name
+ table_name is 0 if item doesn't have a specified table_name
*/
+ if (db_name && !db_name[0])
+ db_name= 0; // Simpler test later
+
if (/* Exclude nested joins. */
(!table_list->nested_join ||
/* Include merge views and information schema tables. */
@@ -5780,12 +5780,12 @@ find_field_in_table_ref(THD *thd, TABLE_LIST *table_list,
to search.
*/
table_name && table_name[0] &&
- (my_strcasecmp(table_alias_charset, table_list->alias, table_name) ||
- (db_name && db_name[0] && (!table_list->db || !table_list->db[0])) ||
- (db_name && db_name[0] && table_list->db && table_list->db[0] &&
+ (my_strcasecmp(table_alias_charset, table_list->alias.str, table_name) ||
+ (db_name && (!table_list->db.str || !table_list->db.str[0])) ||
+ (db_name && table_list->db.str && table_list->db.str[0] &&
(table_list->schema_table ?
- my_strcasecmp(system_charset_info, db_name, table_list->db) :
- strcmp(db_name, table_list->db)))))
+ my_strcasecmp(system_charset_info, db_name, table_list->db.str) :
+ strcmp(db_name, table_list->db.str)))))
DBUG_RETURN(0);
/*
@@ -6549,7 +6549,7 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2,
DBUG_ENTER("mark_common_columns");
DBUG_PRINT("info", ("operand_1: %s operand_2: %s",
- table_ref_1->alias, table_ref_2->alias));
+ table_ref_1->alias.str, table_ref_2->alias.str));
*found_using_fields= 0;
arena= thd->activate_stmt_arena_if_needed(&backup);
@@ -6570,7 +6570,7 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2,
is_using_column_1= using_fields &&
test_if_string_in_list(field_name_1->str, using_fields);
DBUG_PRINT ("info", ("field_name_1=%s.%s",
- nj_col_1->table_name() ? nj_col_1->table_name() : "",
+ nj_col_1->safe_table_name(),
field_name_1->str));
/*
@@ -6589,8 +6589,7 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2,
goto err;
cur_field_name_2= cur_nj_col_2->name();
DBUG_PRINT ("info", ("cur_field_name_2=%s.%s",
- cur_nj_col_2->table_name() ?
- cur_nj_col_2->table_name() : "",
+ cur_nj_col_2->safe_table_name(),
cur_field_name_2->str));
/*
@@ -6700,11 +6699,9 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2,
nj_col_1->is_common= nj_col_2->is_common= TRUE;
DBUG_PRINT ("info", ("%s.%s and %s.%s are common",
- nj_col_1->table_name() ?
- nj_col_1->table_name() : "",
+ nj_col_1->safe_table_name(),
nj_col_1->name()->str,
- nj_col_2->table_name() ?
- nj_col_2->table_name() : "",
+ nj_col_2->safe_table_name(),
nj_col_2->name()->str));
if (field_1)
@@ -7624,7 +7621,7 @@ bool get_key_map_from_key_list(key_map *map, TABLE *table,
0)
{
my_error(ER_KEY_DOES_NOT_EXITS, MYF(0), name->c_ptr(),
- table->pos_in_table_list->alias);
+ table->pos_in_table_list->alias.str);
map->set_all();
return 1;
}
@@ -7695,8 +7692,8 @@ insert_fields(THD *thd, Name_resolution_context *context, const char *db_name,
DBUG_ASSERT(tables->is_leaf_for_name_resolution());
if ((table_name && my_strcasecmp(table_alias_charset, table_name,
- tables->alias)) ||
- (db_name && strcmp(tables->db,db_name)))
+ tables->alias.str)) ||
+ (db_name && strcmp(tables->db.str, db_name)))
continue;
#ifndef NO_EMBEDDED_ACCESS_CHECKS
@@ -7875,13 +7872,13 @@ insert_fields(THD *thd, Name_resolution_context *context, const char *db_name,
*/
if (!table_name)
my_error(ER_NO_TABLES_USED, MYF(0));
- else if (!db_name && !thd->db)
+ else if (!db_name && !thd->db.str)
my_error(ER_NO_DB_ERROR, MYF(0));
else
{
char name[FN_REFLEN];
my_snprintf(name, sizeof(name), "%s.%s",
- db_name ? db_name : thd->db, table_name);
+ db_name ? db_name : thd->get_db(), table_name);
my_error(ER_BAD_TABLE_ERROR, MYF(0), name);
}