1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-01 03:47:19 +03:00

Changed database, tablename and alias to be LEX_CSTRING

This was done in, among other things:
- thd->db and thd->db_length
- TABLE_LIST tablename, db, alias and schema_name
- Audit plugin database name
- lex->db
- All db and table names in Alter_table_ctx
- st_select_lex db

Other things:
- Changed a lot of functions to take const LEX_CSTRING* as argument
  for db, table_name and alias. See init_one_table() as an example.
- Changed some function arguments from LEX_CSTRING to const LEX_CSTRING
- Changed some lists from LEX_STRING to LEX_CSTRING
- threads_mysql.result changed because process list_db wasn't always
  correctly updated
- New append_identifier() function that takes LEX_CSTRING* as arguments
- Added new element tmp_buff to Alter_table_ctx to separate temp name
  handling from temporary space
- Ensure we store the length after my_casedn_str() of table/db names
- Removed not used version of rename_table_in_stat_tables()
- Changed Natural_join_column::table_name and db_name() to never return
  NULL (used for print)
- thd->get_db() now returns db as a printable string (thd->db.str or "")
This commit is contained in:
Monty
2018-01-07 18:03:44 +02:00
parent 921c5e9314
commit a7e352b54d
145 changed files with 2361 additions and 2407 deletions

View File

@ -1475,6 +1475,75 @@ void THD::change_user(void)
sp_cache_clear(&sp_func_cache);
}
/**
Change default database
@note This is coded to have as few instructions as possible under
LOCK_thd_data
*/
bool THD::set_db(const LEX_CSTRING *new_db)
{
bool result= 0;
/*
Acquiring mutex LOCK_thd_data as we either free the memory allocated
for the database and reallocating the memory for the new db or memcpy
the new_db to the db.
*/
/* Do not reallocate memory if current chunk is big enough. */
if (db.str && new_db->str && db.length >= new_db->length)
{
mysql_mutex_lock(&LOCK_thd_data);
db.length= new_db->length;
memcpy((char*) db.str, new_db->str, new_db->length+1);
mysql_mutex_unlock(&LOCK_thd_data);
}
else
{
const char *org_db= db.str;
const char *tmp= NULL;
if (new_db->str)
{
if (!(tmp= my_strndup(new_db->str, new_db->length, MYF(MY_WME | ME_FATALERROR))))
result= 1;
}
mysql_mutex_lock(&LOCK_thd_data);
db.str= tmp;
db.length= tmp ? new_db->length : 0;
mysql_mutex_unlock(&LOCK_thd_data);
my_free((char*) org_db);
}
PSI_CALL_set_thread_db(db.str, (int) db.length);
return result;
}
/**
Set the current database
@param new_db a pointer to the new database name.
@param new_db_len length of the new database name.
@note This operation just sets {db, db_length}. Switching the current
database usually involves other actions, like switching other database
attributes including security context. In the future, this operation
will be made private and more convenient interface will be provided.
*/
void THD::reset_db(const LEX_CSTRING *new_db)
{
if (new_db->str != db.str || new_db->length != db.length)
{
if (db.str != 0)
DBUG_PRINT("QQ", ("Overwriting: %p", db.str));
mysql_mutex_lock(&LOCK_thd_data);
db= *new_db;
mysql_mutex_unlock(&LOCK_thd_data);
PSI_CALL_set_thread_db(db.str, (int) db.length);
}
}
/* Do operations that may take a long time */
@ -1553,8 +1622,8 @@ void THD::cleanup(void)
void THD::free_connection()
{
DBUG_ASSERT(free_connection_done == 0);
my_free(db);
db= NULL;
my_free((char*) db.str);
db= null_clex_str;
#ifndef EMBEDDED_LIBRARY
if (net.vio)
vio_delete(net.vio);
@ -3043,8 +3112,7 @@ static File create_file(THD *thd, char *path, sql_exchange *exchange,
if (!dirname_length(exchange->file_name))
{
strxnmov(path, FN_REFLEN-1, mysql_real_data_home, thd->db ? thd->db : "",
NullS);
strxnmov(path, FN_REFLEN-1, mysql_real_data_home, thd->get_db(), NullS);
(void) fn_format(path, exchange->file_name, path, "", option);
}
else
@ -3737,10 +3805,9 @@ Statement::Statement(LEX *lex_arg, MEM_ROOT *mem_root_arg,
id(id_arg),
mark_used_columns(MARK_COLUMNS_READ),
lex(lex_arg),
db(NULL),
db_length(0)
db(null_clex_str)
{
name.str= NULL;
name= null_clex_str;
}
@ -4077,7 +4144,7 @@ bool
select_materialize_with_stats::
create_result_table(THD *thd_arg, List<Item> *column_types,
bool is_union_distinct, ulonglong options,
const char *table_alias, bool bit_fields_as_long,
const LEX_CSTRING *table_alias, bool bit_fields_as_long,
bool create_table,
bool keep_row_order,
uint hidden)
@ -4088,7 +4155,7 @@ create_result_table(THD *thd_arg, List<Item> *column_types,
if (! (table= create_tmp_table(thd_arg, &tmp_table_param, *column_types,
(ORDER*) 0, is_union_distinct, 1,
options, HA_POS_ERROR, (char*) table_alias,
options, HA_POS_ERROR, table_alias,
!create_table, keep_row_order)))
return TRUE;
@ -4663,8 +4730,10 @@ TABLE *open_purge_table(THD *thd, const char *db, size_t dblen,
Open_table_context ot_ctx(thd, 0);
TABLE_LIST *tl= (TABLE_LIST*)thd->alloc(sizeof(TABLE_LIST));
LEX_CSTRING db_name= {db, dblen };
LEX_CSTRING table_name= { tb, tblen };
tl->init_one_table(db, dblen, tb, tblen, tb, TL_READ);
tl->init_one_table(&db_name, &table_name, 0, TL_READ);
tl->i_s_requested_object= OPEN_TABLE_ONLY;
bool error= open_table(thd, tl, &ot_ctx);
@ -5057,7 +5126,7 @@ extern "C" void thd_mark_transaction_to_rollback(MYSQL_THD thd, bool all)
extern "C" bool thd_binlog_filter_ok(const MYSQL_THD thd)
{
return binlog_filter->db_ok(thd->db);
return binlog_filter->db_ok(thd->db.str);
}
/*
@ -5959,7 +6028,7 @@ int THD::decide_logging_format(TABLE_LIST *tables)
*/
if (mysql_bin_log.is_open() && (variables.option_bits & OPTION_BIN_LOG) &&
!(wsrep_binlog_format() == BINLOG_FORMAT_STMT &&
!binlog_filter->db_ok(db)))
!binlog_filter->db_ok(db.str)))
{
if (is_bulk_op())
@ -6062,7 +6131,7 @@ int THD::decide_logging_format(TABLE_LIST *tables)
handler::Table_flags const flags= table->table->file->ha_table_flags();
DBUG_PRINT("info", ("table: %s; ha_table_flags: 0x%llx",
table->table_name, flags));
table->table_name.str, flags));
if (table->table->s->no_replicate)
{
@ -6366,7 +6435,7 @@ int THD::decide_logging_format(TABLE_LIST *tables)
if (table->table->file->ht->db_type == DB_TYPE_BLACKHOLE_DB &&
table->lock_type >= TL_WRITE_ALLOW_WRITE)
{
table_names.append(table->table_name);
table_names.append(&table->table_name);
table_names.append(",");
}
}
@ -6398,7 +6467,7 @@ int THD::decide_logging_format(TABLE_LIST *tables)
mysql_bin_log.is_open(),
(variables.option_bits & OPTION_BIN_LOG),
(uint) wsrep_binlog_format(),
binlog_filter->db_ok(db)));
binlog_filter->db_ok(db.str)));
#endif
DBUG_RETURN(0);