merge
This commit is contained in:
commit
fc74c4d9e5
@ -5760,6 +5760,89 @@ bool ha_partition::get_error_message(int error, String *buf)
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
MODULE handler characteristics
|
MODULE handler characteristics
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
/**
|
||||||
|
alter_table_flags must be on handler/table level, not on hton level
|
||||||
|
due to the ha_partition hton does not know what the underlying hton is.
|
||||||
|
*/
|
||||||
|
uint ha_partition::alter_table_flags(uint flags)
|
||||||
|
{
|
||||||
|
DBUG_ENTER("ha_partition::alter_table_flags");
|
||||||
|
DBUG_RETURN(ht->alter_table_flags(flags) |
|
||||||
|
m_file[0]->alter_table_flags(flags));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
check if copy of data is needed in alter table.
|
||||||
|
*/
|
||||||
|
bool ha_partition::check_if_incompatible_data(HA_CREATE_INFO *create_info,
|
||||||
|
uint table_changes)
|
||||||
|
{
|
||||||
|
handler **file;
|
||||||
|
bool ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
The check for any partitioning related changes have already been done
|
||||||
|
in mysql_alter_table (by fix_partition_func), so it is only up to
|
||||||
|
the underlying handlers.
|
||||||
|
*/
|
||||||
|
for (file= m_file; *file; file++)
|
||||||
|
if ((ret= (*file)->check_if_incompatible_data(create_info,
|
||||||
|
table_changes)) !=
|
||||||
|
COMPATIBLE_DATA_YES)
|
||||||
|
break;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Support of fast or online add/drop index
|
||||||
|
*/
|
||||||
|
int ha_partition::add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys)
|
||||||
|
{
|
||||||
|
handler **file;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
There has already been a check in fix_partition_func in mysql_alter_table
|
||||||
|
before this call, which checks for unique/primary key violations of the
|
||||||
|
partitioning function. So no need for extra check here.
|
||||||
|
*/
|
||||||
|
for (file= m_file; *file; file++)
|
||||||
|
if ((ret= (*file)->add_index(table_arg, key_info, num_of_keys)))
|
||||||
|
break;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ha_partition::prepare_drop_index(TABLE *table_arg, uint *key_num,
|
||||||
|
uint num_of_keys)
|
||||||
|
{
|
||||||
|
handler **file;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
DROP INDEX does not affect partitioning.
|
||||||
|
*/
|
||||||
|
for (file= m_file; *file; file++)
|
||||||
|
if ((ret= (*file)->prepare_drop_index(table_arg, key_num, num_of_keys)))
|
||||||
|
break;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ha_partition::final_drop_index(TABLE *table_arg)
|
||||||
|
{
|
||||||
|
handler **file;
|
||||||
|
int ret= HA_ERR_WRONG_COMMAND;
|
||||||
|
|
||||||
|
for (file= m_file; *file; file++)
|
||||||
|
if ((ret= (*file)->final_drop_index(table_arg)))
|
||||||
|
break;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If frm_error() is called then we will use this to to find out what file
|
If frm_error() is called then we will use this to to find out what file
|
||||||
extensions exist for the storage engine. This is also used by the default
|
extensions exist for the storage engine. This is also used by the default
|
||||||
|
@ -224,6 +224,8 @@ public:
|
|||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
virtual void change_table_ptr(TABLE *table_arg, TABLE_SHARE *share);
|
virtual void change_table_ptr(TABLE *table_arg, TABLE_SHARE *share);
|
||||||
|
virtual bool check_if_incompatible_data(HA_CREATE_INFO *create_info,
|
||||||
|
uint table_changes);
|
||||||
private:
|
private:
|
||||||
int prepare_for_rename();
|
int prepare_for_rename();
|
||||||
int copy_partitions(ulonglong * const copied, ulonglong * const deleted);
|
int copy_partitions(ulonglong * const copied, ulonglong * const deleted);
|
||||||
@ -774,6 +776,11 @@ public:
|
|||||||
return m_file[0]->index_flags(inx, part, all_parts);
|
return m_file[0]->index_flags(inx, part, all_parts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
wrapper function for handlerton alter_table_flags, since
|
||||||
|
the ha_partition_hton cannot know all its capabilities
|
||||||
|
*/
|
||||||
|
virtual uint alter_table_flags(uint flags);
|
||||||
/*
|
/*
|
||||||
extensions of table handler files
|
extensions of table handler files
|
||||||
*/
|
*/
|
||||||
@ -949,13 +956,14 @@ public:
|
|||||||
-------------------------------------------------------------------------
|
-------------------------------------------------------------------------
|
||||||
MODULE on-line ALTER TABLE
|
MODULE on-line ALTER TABLE
|
||||||
-------------------------------------------------------------------------
|
-------------------------------------------------------------------------
|
||||||
These methods are in the handler interface but never used (yet)
|
These methods are in the handler interface. (used by innodb-plugin)
|
||||||
They are to be used by on-line alter table add/drop index:
|
They are used for on-line/fast alter table add/drop index:
|
||||||
-------------------------------------------------------------------------
|
-------------------------------------------------------------------------
|
||||||
virtual ulong index_ddl_flags(KEY *wanted_index) const
|
|
||||||
virtual int add_index(TABLE *table_arg,KEY *key_info,uint num_of_keys);
|
|
||||||
virtual int drop_index(TABLE *table_arg,uint *key_num,uint num_of_keys);
|
|
||||||
*/
|
*/
|
||||||
|
virtual int add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys);
|
||||||
|
virtual int prepare_drop_index(TABLE *table_arg, uint *key_num,
|
||||||
|
uint num_of_keys);
|
||||||
|
virtual int final_drop_index(TABLE *table_arg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
-------------------------------------------------------------------------
|
-------------------------------------------------------------------------
|
||||||
|
@ -4251,8 +4251,7 @@ uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info,
|
|||||||
alter_info->no_parts= curr_part_no - new_part_no;
|
alter_info->no_parts= curr_part_no - new_part_no;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (table->s->db_type()->alter_table_flags &&
|
if (!(flags= table->file->alter_table_flags(alter_info->flags)))
|
||||||
(!(flags= table->s->db_type()->alter_table_flags(alter_info->flags))))
|
|
||||||
{
|
{
|
||||||
my_error(ER_PARTITION_FUNCTION_FAILURE, MYF(0));
|
my_error(ER_PARTITION_FUNCTION_FAILURE, MYF(0));
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
|
@ -6454,8 +6454,7 @@ view_err:
|
|||||||
uint *idx_p;
|
uint *idx_p;
|
||||||
uint *idx_end_p;
|
uint *idx_end_p;
|
||||||
|
|
||||||
if (table->s->db_type()->alter_table_flags)
|
alter_flags= table->file->alter_table_flags(alter_info->flags);
|
||||||
alter_flags= table->s->db_type()->alter_table_flags(alter_info->flags);
|
|
||||||
DBUG_PRINT("info", ("alter_flags: %lu", alter_flags));
|
DBUG_PRINT("info", ("alter_flags: %lu", alter_flags));
|
||||||
/* Check dropped indexes. */
|
/* Check dropped indexes. */
|
||||||
for (idx_p= index_drop_buffer, idx_end_p= idx_p + index_drop_count;
|
for (idx_p= index_drop_buffer, idx_end_p= idx_p + index_drop_count;
|
||||||
@ -6725,7 +6724,6 @@ view_err:
|
|||||||
/* Copy the data if necessary. */
|
/* Copy the data if necessary. */
|
||||||
thd->count_cuted_fields= CHECK_FIELD_WARN; // calc cuted fields
|
thd->count_cuted_fields= CHECK_FIELD_WARN; // calc cuted fields
|
||||||
thd->cuted_fields=0L;
|
thd->cuted_fields=0L;
|
||||||
thd_proc_info(thd, "copy to tmp table");
|
|
||||||
copied=deleted=0;
|
copied=deleted=0;
|
||||||
/*
|
/*
|
||||||
We do not copy data for MERGE tables. Only the children have data.
|
We do not copy data for MERGE tables. Only the children have data.
|
||||||
@ -6736,6 +6734,7 @@ view_err:
|
|||||||
/* We don't want update TIMESTAMP fields during ALTER TABLE. */
|
/* We don't want update TIMESTAMP fields during ALTER TABLE. */
|
||||||
new_table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
|
new_table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
|
||||||
new_table->next_number_field=new_table->found_next_number_field;
|
new_table->next_number_field=new_table->found_next_number_field;
|
||||||
|
thd_proc_info(thd, "copy to tmp table");
|
||||||
error= copy_data_between_tables(table, new_table,
|
error= copy_data_between_tables(table, new_table,
|
||||||
alter_info->create_list, ignore,
|
alter_info->create_list, ignore,
|
||||||
order_num, order, &copied, &deleted,
|
order_num, order, &copied, &deleted,
|
||||||
@ -6747,6 +6746,7 @@ view_err:
|
|||||||
VOID(pthread_mutex_lock(&LOCK_open));
|
VOID(pthread_mutex_lock(&LOCK_open));
|
||||||
wait_while_table_is_used(thd, table, HA_EXTRA_FORCE_REOPEN);
|
wait_while_table_is_used(thd, table, HA_EXTRA_FORCE_REOPEN);
|
||||||
VOID(pthread_mutex_unlock(&LOCK_open));
|
VOID(pthread_mutex_unlock(&LOCK_open));
|
||||||
|
thd_proc_info(thd, "manage keys");
|
||||||
alter_table_manage_keys(table, table->file->indexes_are_disabled(),
|
alter_table_manage_keys(table, table->file->indexes_are_disabled(),
|
||||||
alter_info->keys_onoff);
|
alter_info->keys_onoff);
|
||||||
error= ha_autocommit_or_rollback(thd, 0);
|
error= ha_autocommit_or_rollback(thd, 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user