mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
Merge MySQL->MariaDB
* Finished Monty and Jani's merge * Some InnoDB tests still fail (because it's old xtradb code run against newer testsuite). They are expected to go after mergning with the latest xtradb.
This commit is contained in:
@@ -918,6 +918,9 @@ bool fix_fields_part_func(THD *thd, Item* func_expr, TABLE *table,
|
||||
Set-up the TABLE_LIST object to be a list with a single table
|
||||
Set the object to zero to create NULL pointers and set alias
|
||||
and real name to table name and get database name from file name.
|
||||
TODO: Consider generalizing or refactoring Lex::add_table_to_list() so
|
||||
it can be used in all places where we create TABLE_LIST objects.
|
||||
Also consider creating appropriate constructors for TABLE_LIST.
|
||||
*/
|
||||
|
||||
bzero((void*)&tables, sizeof(TABLE_LIST));
|
||||
@@ -925,6 +928,13 @@ bool fix_fields_part_func(THD *thd, Item* func_expr, TABLE *table,
|
||||
tables.table= table;
|
||||
tables.next_local= 0;
|
||||
tables.next_name_resolution_table= 0;
|
||||
/*
|
||||
Cache the table in Item_fields. All the tables can be cached except
|
||||
the trigger pseudo table.
|
||||
*/
|
||||
tables.cacheable_table= TRUE;
|
||||
context= thd->lex->current_context();
|
||||
tables.select_lex= context->select_lex;
|
||||
strmov(db_name_string, table->s->normalized_path.str);
|
||||
dir_length= dirname_length(db_name_string);
|
||||
db_name_string[dir_length - 1]= 0;
|
||||
@@ -932,7 +942,6 @@ bool fix_fields_part_func(THD *thd, Item* func_expr, TABLE *table,
|
||||
db_name= &db_name_string[home_dir_length];
|
||||
tables.db= db_name;
|
||||
|
||||
context= thd->lex->current_context();
|
||||
table->map= 1; //To ensure correct calculation of const item
|
||||
table->get_fields_in_item_tree= TRUE;
|
||||
save_table_list= context->table_list;
|
||||
@@ -964,8 +973,9 @@ bool fix_fields_part_func(THD *thd, Item* func_expr, TABLE *table,
|
||||
|
||||
save_use_only_table_context= thd->lex->use_only_table_context;
|
||||
thd->lex->use_only_table_context= TRUE;
|
||||
thd->lex->current_select->cur_pos_in_select_list= UNDEF_POS;
|
||||
|
||||
error= func_expr->fix_fields(thd, (Item**)0);
|
||||
error= func_expr->fix_fields(thd, (Item**)&func_expr);
|
||||
|
||||
thd->lex->use_only_table_context= save_use_only_table_context;
|
||||
|
||||
@@ -2937,7 +2947,8 @@ uint32 get_partition_id_range_for_endpoint(partition_info *part_info,
|
||||
the maximum value is in the current partition.
|
||||
*/
|
||||
if (part_func_value > bound ||
|
||||
(part_func_value == bound && !part_info->defined_max_value))
|
||||
(part_func_value == bound &&
|
||||
(!part_info->defined_max_value || loc_part_id < max_partition)))
|
||||
loc_part_id++;
|
||||
}
|
||||
else
|
||||
@@ -3813,8 +3824,13 @@ bool mysql_unpack_partition(THD *thd,
|
||||
Item_field objects.
|
||||
This is not a nice solution since if the parser uses current_select
|
||||
for anything else it will corrupt the current LEX object.
|
||||
Also, we need to make sure there even is a select -- if the statement
|
||||
was a "USE ...", current_select will be NULL, but we may still end up
|
||||
here if we try to log to a partitioned table. This is currently
|
||||
unsupported, but should still fail rather than crash!
|
||||
*/
|
||||
thd->lex->current_select= old_lex->current_select;
|
||||
if (!(thd->lex->current_select= old_lex->current_select))
|
||||
goto end;
|
||||
/*
|
||||
All Items created is put into a free list on the THD object. This list
|
||||
is used to free all Item objects after completing a query. We don't
|
||||
@@ -5089,7 +5105,7 @@ static bool mysql_change_partitions(ALTER_PARTITION_PARAM_TYPE *lpt)
|
||||
handler *file= lpt->table->file;
|
||||
DBUG_ENTER("mysql_change_partitions");
|
||||
|
||||
build_table_filename(path, sizeof(path), lpt->db, lpt->table_name, "", 0);
|
||||
build_table_filename(path, sizeof(path) - 1, lpt->db, lpt->table_name, "", 0);
|
||||
if ((error= file->ha_change_partitions(lpt->create_info, path, &lpt->copied,
|
||||
&lpt->deleted, lpt->pack_frm_data,
|
||||
lpt->pack_frm_len)))
|
||||
@@ -5129,7 +5145,7 @@ static bool mysql_rename_partitions(ALTER_PARTITION_PARAM_TYPE *lpt)
|
||||
int error;
|
||||
DBUG_ENTER("mysql_rename_partitions");
|
||||
|
||||
build_table_filename(path, sizeof(path), lpt->db, lpt->table_name, "", 0);
|
||||
build_table_filename(path, sizeof(path) - 1, lpt->db, lpt->table_name, "", 0);
|
||||
if ((error= lpt->table->file->ha_rename_partitions(path)))
|
||||
{
|
||||
if (error != 1)
|
||||
@@ -5170,7 +5186,7 @@ static bool mysql_drop_partitions(ALTER_PARTITION_PARAM_TYPE *lpt)
|
||||
int error;
|
||||
DBUG_ENTER("mysql_drop_partitions");
|
||||
|
||||
build_table_filename(path, sizeof(path), lpt->db, lpt->table_name, "", 0);
|
||||
build_table_filename(path, sizeof(path) - 1, lpt->db, lpt->table_name, "", 0);
|
||||
if ((error= lpt->table->file->ha_drop_partitions(path)))
|
||||
{
|
||||
lpt->table->file->print_error(error, MYF(0));
|
||||
@@ -5515,10 +5531,10 @@ static bool write_log_drop_shadow_frm(ALTER_PARTITION_PARAM_TYPE *lpt)
|
||||
partition_info *part_info= lpt->part_info;
|
||||
DDL_LOG_MEMORY_ENTRY *log_entry;
|
||||
DDL_LOG_MEMORY_ENTRY *exec_log_entry= NULL;
|
||||
char shadow_path[FN_REFLEN];
|
||||
char shadow_path[FN_REFLEN + 1];
|
||||
DBUG_ENTER("write_log_drop_shadow_frm");
|
||||
|
||||
build_table_shadow_filename(shadow_path, sizeof(shadow_path), lpt);
|
||||
build_table_shadow_filename(shadow_path, sizeof(shadow_path) - 1, lpt);
|
||||
pthread_mutex_lock(&LOCK_gdl);
|
||||
if (write_log_replace_delete_frm(lpt, 0UL, NULL,
|
||||
(const char*)shadow_path, FALSE))
|
||||
@@ -5558,15 +5574,15 @@ static bool write_log_rename_frm(ALTER_PARTITION_PARAM_TYPE *lpt)
|
||||
partition_info *part_info= lpt->part_info;
|
||||
DDL_LOG_MEMORY_ENTRY *log_entry;
|
||||
DDL_LOG_MEMORY_ENTRY *exec_log_entry= part_info->exec_log_entry;
|
||||
char path[FN_REFLEN];
|
||||
char shadow_path[FN_REFLEN];
|
||||
char path[FN_REFLEN + 1];
|
||||
char shadow_path[FN_REFLEN + 1];
|
||||
DDL_LOG_MEMORY_ENTRY *old_first_log_entry= part_info->first_log_entry;
|
||||
DBUG_ENTER("write_log_rename_frm");
|
||||
|
||||
part_info->first_log_entry= NULL;
|
||||
build_table_filename(path, sizeof(path), lpt->db,
|
||||
build_table_filename(path, sizeof(path) - 1, lpt->db,
|
||||
lpt->table_name, "", 0);
|
||||
build_table_shadow_filename(shadow_path, sizeof(shadow_path), lpt);
|
||||
build_table_shadow_filename(shadow_path, sizeof(shadow_path) - 1, lpt);
|
||||
pthread_mutex_lock(&LOCK_gdl);
|
||||
if (write_log_replace_delete_frm(lpt, 0UL, shadow_path, path, TRUE))
|
||||
goto error;
|
||||
@@ -5609,16 +5625,16 @@ static bool write_log_drop_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
|
||||
partition_info *part_info= lpt->part_info;
|
||||
DDL_LOG_MEMORY_ENTRY *log_entry;
|
||||
DDL_LOG_MEMORY_ENTRY *exec_log_entry= part_info->exec_log_entry;
|
||||
char tmp_path[FN_REFLEN];
|
||||
char path[FN_REFLEN];
|
||||
char tmp_path[FN_REFLEN + 1];
|
||||
char path[FN_REFLEN + 1];
|
||||
uint next_entry= 0;
|
||||
DDL_LOG_MEMORY_ENTRY *old_first_log_entry= part_info->first_log_entry;
|
||||
DBUG_ENTER("write_log_drop_partition");
|
||||
|
||||
part_info->first_log_entry= NULL;
|
||||
build_table_filename(path, sizeof(path), lpt->db,
|
||||
build_table_filename(path, sizeof(path) - 1, lpt->db,
|
||||
lpt->table_name, "", 0);
|
||||
build_table_filename(tmp_path, sizeof(tmp_path), lpt->db,
|
||||
build_table_filename(tmp_path, sizeof(tmp_path) - 1, lpt->db,
|
||||
lpt->table_name, "#", 0);
|
||||
pthread_mutex_lock(&LOCK_gdl);
|
||||
if (write_log_dropped_partitions(lpt, &next_entry, (const char*)path,
|
||||
@@ -5668,14 +5684,14 @@ static bool write_log_add_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
|
||||
partition_info *part_info= lpt->part_info;
|
||||
DDL_LOG_MEMORY_ENTRY *log_entry;
|
||||
DDL_LOG_MEMORY_ENTRY *exec_log_entry= NULL;
|
||||
char tmp_path[FN_REFLEN];
|
||||
char path[FN_REFLEN];
|
||||
char tmp_path[FN_REFLEN + 1];
|
||||
char path[FN_REFLEN + 1];
|
||||
uint next_entry= 0;
|
||||
DBUG_ENTER("write_log_add_change_partition");
|
||||
|
||||
build_table_filename(path, sizeof(path), lpt->db,
|
||||
build_table_filename(path, sizeof(path) - 1, lpt->db,
|
||||
lpt->table_name, "", 0);
|
||||
build_table_filename(tmp_path, sizeof(tmp_path), lpt->db,
|
||||
build_table_filename(tmp_path, sizeof(tmp_path) - 1, lpt->db,
|
||||
lpt->table_name, "#", 0);
|
||||
pthread_mutex_lock(&LOCK_gdl);
|
||||
if (write_log_dropped_partitions(lpt, &next_entry, (const char*)path,
|
||||
@@ -5722,16 +5738,16 @@ static bool write_log_final_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
|
||||
partition_info *part_info= lpt->part_info;
|
||||
DDL_LOG_MEMORY_ENTRY *log_entry;
|
||||
DDL_LOG_MEMORY_ENTRY *exec_log_entry= part_info->exec_log_entry;
|
||||
char path[FN_REFLEN];
|
||||
char shadow_path[FN_REFLEN];
|
||||
char path[FN_REFLEN + 1];
|
||||
char shadow_path[FN_REFLEN + 1];
|
||||
DDL_LOG_MEMORY_ENTRY *old_first_log_entry= part_info->first_log_entry;
|
||||
uint next_entry= 0;
|
||||
DBUG_ENTER("write_log_final_change_partition");
|
||||
|
||||
part_info->first_log_entry= NULL;
|
||||
build_table_filename(path, sizeof(path), lpt->db,
|
||||
build_table_filename(path, sizeof(path) - 1, lpt->db,
|
||||
lpt->table_name, "", 0);
|
||||
build_table_shadow_filename(shadow_path, sizeof(shadow_path), lpt);
|
||||
build_table_shadow_filename(shadow_path, sizeof(shadow_path) - 1, lpt);
|
||||
pthread_mutex_lock(&LOCK_gdl);
|
||||
if (write_log_dropped_partitions(lpt, &next_entry, (const char*)path,
|
||||
lpt->alter_info->flags & ALTER_REORGANIZE_PARTITION))
|
||||
|
Reference in New Issue
Block a user