5.6.33
This commit is contained in:
parent
b4f97a1499
commit
094f140c9a
@ -108,6 +108,7 @@ UNIV_INTERN mysql_pfs_key_t fts_pll_tokenize_mutex_key;
|
|||||||
/** variable to record innodb_fts_internal_tbl_name for information
|
/** variable to record innodb_fts_internal_tbl_name for information
|
||||||
schema table INNODB_FTS_INSERTED etc. */
|
schema table INNODB_FTS_INSERTED etc. */
|
||||||
UNIV_INTERN char* fts_internal_tbl_name = NULL;
|
UNIV_INTERN char* fts_internal_tbl_name = NULL;
|
||||||
|
UNIV_INTERN char* fts_internal_tbl_name2 = NULL;
|
||||||
|
|
||||||
/** InnoDB default stopword list:
|
/** InnoDB default stopword list:
|
||||||
There are different versions of stopwords, the stop words listed
|
There are different versions of stopwords, the stop words listed
|
||||||
@ -6569,6 +6570,36 @@ fts_check_corrupt_index(
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Get parent table name if it's a fts aux table
|
||||||
|
@param[in] aux_table_name aux table name
|
||||||
|
@param[in] aux_table_len aux table length
|
||||||
|
@return parent table name, or NULL */
|
||||||
|
char*
|
||||||
|
fts_get_parent_table_name(
|
||||||
|
const char* aux_table_name,
|
||||||
|
ulint aux_table_len)
|
||||||
|
{
|
||||||
|
fts_aux_table_t aux_table;
|
||||||
|
char* parent_table_name = NULL;
|
||||||
|
|
||||||
|
if (fts_is_aux_table_name(&aux_table, aux_table_name, aux_table_len)) {
|
||||||
|
dict_table_t* parent_table;
|
||||||
|
|
||||||
|
parent_table = dict_table_open_on_id(
|
||||||
|
aux_table.parent_id, TRUE, DICT_TABLE_OP_NORMAL);
|
||||||
|
|
||||||
|
if (parent_table != NULL) {
|
||||||
|
parent_table_name = mem_strdupl(
|
||||||
|
parent_table->name,
|
||||||
|
strlen(parent_table->name));
|
||||||
|
|
||||||
|
dict_table_close(parent_table, TRUE, FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(parent_table_name);
|
||||||
|
}
|
||||||
|
|
||||||
/** Check the validity of the parent table.
|
/** Check the validity of the parent table.
|
||||||
@param[in] aux_table auxiliary table
|
@param[in] aux_table auxiliary table
|
||||||
@return true if it is a valid table or false if it is not */
|
@return true if it is a valid table or false if it is not */
|
||||||
|
@ -14505,7 +14505,12 @@ innodb_internal_table_update(
|
|||||||
my_free(old);
|
my_free(old);
|
||||||
}
|
}
|
||||||
|
|
||||||
fts_internal_tbl_name = *(char**) var_ptr;
|
fts_internal_tbl_name2 = *(char**) var_ptr;
|
||||||
|
if (fts_internal_tbl_name2 == NULL) {
|
||||||
|
fts_internal_tbl_name = const_cast<char*>("default");
|
||||||
|
} else {
|
||||||
|
fts_internal_tbl_name = fts_internal_tbl_name2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************//**
|
/****************************************************************//**
|
||||||
@ -16253,7 +16258,7 @@ static MYSQL_SYSVAR_BOOL(disable_sort_file_cache, srv_disable_sort_file_cache,
|
|||||||
"Whether to disable OS system file cache for sort I/O",
|
"Whether to disable OS system file cache for sort I/O",
|
||||||
NULL, NULL, FALSE);
|
NULL, NULL, FALSE);
|
||||||
|
|
||||||
static MYSQL_SYSVAR_STR(ft_aux_table, fts_internal_tbl_name,
|
static MYSQL_SYSVAR_STR(ft_aux_table, fts_internal_tbl_name2,
|
||||||
PLUGIN_VAR_NOCMDARG,
|
PLUGIN_VAR_NOCMDARG,
|
||||||
"FTS internal auxiliary table to be checked",
|
"FTS internal auxiliary table to be checked",
|
||||||
innodb_internal_table_validate,
|
innodb_internal_table_validate,
|
||||||
|
@ -201,7 +201,10 @@ innobase_need_rebuild(
|
|||||||
/*==================*/
|
/*==================*/
|
||||||
const Alter_inplace_info* ha_alter_info)
|
const Alter_inplace_info* ha_alter_info)
|
||||||
{
|
{
|
||||||
if (ha_alter_info->handler_flags
|
Alter_inplace_info::HA_ALTER_FLAGS alter_inplace_flags =
|
||||||
|
ha_alter_info->handler_flags & ~(INNOBASE_INPLACE_IGNORE);
|
||||||
|
|
||||||
|
if (alter_inplace_flags
|
||||||
== Alter_inplace_info::CHANGE_CREATE_OPTION
|
== Alter_inplace_info::CHANGE_CREATE_OPTION
|
||||||
&& !(ha_alter_info->create_info->used_fields
|
&& !(ha_alter_info->create_info->used_fields
|
||||||
& (HA_CREATE_USED_ROW_FORMAT
|
& (HA_CREATE_USED_ROW_FORMAT
|
||||||
@ -3760,7 +3763,7 @@ err_exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!(ha_alter_info->handler_flags & INNOBASE_ALTER_DATA)
|
if (!(ha_alter_info->handler_flags & INNOBASE_ALTER_DATA)
|
||||||
|| (ha_alter_info->handler_flags
|
|| ((ha_alter_info->handler_flags & ~INNOBASE_INPLACE_IGNORE)
|
||||||
== Alter_inplace_info::CHANGE_CREATE_OPTION
|
== Alter_inplace_info::CHANGE_CREATE_OPTION
|
||||||
&& !innobase_need_rebuild(ha_alter_info))) {
|
&& !innobase_need_rebuild(ha_alter_info))) {
|
||||||
|
|
||||||
@ -3926,7 +3929,7 @@ ok_exit:
|
|||||||
DBUG_RETURN(false);
|
DBUG_RETURN(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ha_alter_info->handler_flags
|
if ((ha_alter_info->handler_flags & ~INNOBASE_INPLACE_IGNORE)
|
||||||
== Alter_inplace_info::CHANGE_CREATE_OPTION
|
== Alter_inplace_info::CHANGE_CREATE_OPTION
|
||||||
&& !innobase_need_rebuild(ha_alter_info)) {
|
&& !innobase_need_rebuild(ha_alter_info)) {
|
||||||
goto ok_exit;
|
goto ok_exit;
|
||||||
|
@ -4038,6 +4038,8 @@ i_s_fts_config_fill(
|
|||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEBUG_SYNC_C("i_s_fts_config_fille_check");
|
||||||
|
|
||||||
fields = table->field;
|
fields = table->field;
|
||||||
|
|
||||||
/* Prevent DDL to drop fts aux tables. */
|
/* Prevent DDL to drop fts aux tables. */
|
||||||
|
@ -375,6 +375,7 @@ extern bool fts_need_sync;
|
|||||||
/** Variable specifying the table that has Fulltext index to display its
|
/** Variable specifying the table that has Fulltext index to display its
|
||||||
content through information schema table */
|
content through information schema table */
|
||||||
extern char* fts_internal_tbl_name;
|
extern char* fts_internal_tbl_name;
|
||||||
|
extern char* fts_internal_tbl_name2;
|
||||||
|
|
||||||
#define fts_que_graph_free(graph) \
|
#define fts_que_graph_free(graph) \
|
||||||
do { \
|
do { \
|
||||||
@ -823,6 +824,15 @@ void
|
|||||||
fts_drop_orphaned_tables(void);
|
fts_drop_orphaned_tables(void);
|
||||||
/*==========================*/
|
/*==========================*/
|
||||||
|
|
||||||
|
/* Get parent table name if it's a fts aux table
|
||||||
|
@param[in] aux_table_name aux table name
|
||||||
|
@param[in] aux_table_len aux table length
|
||||||
|
@return parent table name, or NULL */
|
||||||
|
char*
|
||||||
|
fts_get_parent_table_name(
|
||||||
|
const char* aux_table_name,
|
||||||
|
ulint aux_table_len);
|
||||||
|
|
||||||
/******************************************************************//**
|
/******************************************************************//**
|
||||||
Since we do a horizontal split on the index table, we need to drop
|
Since we do a horizontal split on the index table, we need to drop
|
||||||
all the split tables.
|
all the split tables.
|
||||||
|
@ -613,7 +613,7 @@ row_log_table_delete(
|
|||||||
&old_pk_extra_size);
|
&old_pk_extra_size);
|
||||||
ut_ad(old_pk_extra_size < 0x100);
|
ut_ad(old_pk_extra_size < 0x100);
|
||||||
|
|
||||||
mrec_size = 4 + old_pk_size;
|
mrec_size = 6 + old_pk_size;
|
||||||
|
|
||||||
/* Log enough prefix of the BLOB unless both the
|
/* Log enough prefix of the BLOB unless both the
|
||||||
old and new table are in COMPACT or REDUNDANT format,
|
old and new table are in COMPACT or REDUNDANT format,
|
||||||
@ -643,8 +643,8 @@ row_log_table_delete(
|
|||||||
*b++ = static_cast<byte>(old_pk_extra_size);
|
*b++ = static_cast<byte>(old_pk_extra_size);
|
||||||
|
|
||||||
/* Log the size of external prefix we saved */
|
/* Log the size of external prefix we saved */
|
||||||
mach_write_to_2(b, ext_size);
|
mach_write_to_4(b, ext_size);
|
||||||
b += 2;
|
b += 4;
|
||||||
|
|
||||||
rec_convert_dtuple_to_temp(
|
rec_convert_dtuple_to_temp(
|
||||||
b + old_pk_extra_size, new_index,
|
b + old_pk_extra_size, new_index,
|
||||||
@ -2268,14 +2268,14 @@ row_log_table_apply_op(
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ROW_T_DELETE:
|
case ROW_T_DELETE:
|
||||||
/* 1 (extra_size) + 2 (ext_size) + at least 1 (payload) */
|
/* 1 (extra_size) + 4 (ext_size) + at least 1 (payload) */
|
||||||
if (mrec + 4 >= mrec_end) {
|
if (mrec + 6 >= mrec_end) {
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
extra_size = *mrec++;
|
extra_size = *mrec++;
|
||||||
ext_size = mach_read_from_2(mrec);
|
ext_size = mach_read_from_4(mrec);
|
||||||
mrec += 2;
|
mrec += 4;
|
||||||
ut_ad(mrec < mrec_end);
|
ut_ad(mrec < mrec_end);
|
||||||
|
|
||||||
/* We assume extra_size < 0x100 for the PRIMARY KEY prefix.
|
/* We assume extra_size < 0x100 for the PRIMARY KEY prefix.
|
||||||
|
@ -2676,6 +2676,10 @@ loop:
|
|||||||
return(n_tables + n_tables_dropped);
|
return(n_tables + n_tables_dropped);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DBUG_EXECUTE_IF("row_drop_tables_in_background_sleep",
|
||||||
|
os_thread_sleep(5000000);
|
||||||
|
);
|
||||||
|
|
||||||
table = dict_table_open_on_name(drop->table_name, FALSE, FALSE,
|
table = dict_table_open_on_name(drop->table_name, FALSE, FALSE,
|
||||||
DICT_ERR_IGNORE_NONE);
|
DICT_ERR_IGNORE_NONE);
|
||||||
|
|
||||||
@ -2686,6 +2690,16 @@ loop:
|
|||||||
goto already_dropped;
|
goto already_dropped;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!table->to_be_dropped) {
|
||||||
|
/* There is a scenario: the old table is dropped
|
||||||
|
just after it's added into drop list, and new
|
||||||
|
table with the same name is created, then we try
|
||||||
|
to drop the new table in background. */
|
||||||
|
dict_table_close(table, FALSE, FALSE);
|
||||||
|
|
||||||
|
goto already_dropped;
|
||||||
|
}
|
||||||
|
|
||||||
ut_a(!table->can_be_evicted);
|
ut_a(!table->can_be_evicted);
|
||||||
|
|
||||||
dict_table_close(table, FALSE, FALSE);
|
dict_table_close(table, FALSE, FALSE);
|
||||||
@ -3945,6 +3959,13 @@ row_drop_table_for_mysql(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DBUG_EXECUTE_IF("row_drop_table_add_to_background",
|
||||||
|
row_add_table_to_background_drop_list(table->name);
|
||||||
|
err = DB_SUCCESS;
|
||||||
|
goto funct_exit;
|
||||||
|
);
|
||||||
|
|
||||||
/* TODO: could we replace the counter n_foreign_key_checks_running
|
/* TODO: could we replace the counter n_foreign_key_checks_running
|
||||||
with lock checks on the table? Acquire here an exclusive lock on the
|
with lock checks on the table? Acquire here an exclusive lock on the
|
||||||
table, and rewrite lock0lock.cc and the lock wait in srv0srv.cc so that
|
table, and rewrite lock0lock.cc and the lock wait in srv0srv.cc so that
|
||||||
@ -4561,6 +4582,19 @@ loop:
|
|||||||
row_mysql_lock_data_dictionary(trx);
|
row_mysql_lock_data_dictionary(trx);
|
||||||
|
|
||||||
while ((table_name = dict_get_first_table_name_in_db(name))) {
|
while ((table_name = dict_get_first_table_name_in_db(name))) {
|
||||||
|
/* Drop parent table if it is a fts aux table, to
|
||||||
|
avoid accessing dropped fts aux tables in information
|
||||||
|
scheam when parent table still exists.
|
||||||
|
Note: Drop parent table will drop fts aux tables. */
|
||||||
|
char* parent_table_name;
|
||||||
|
parent_table_name = fts_get_parent_table_name(
|
||||||
|
table_name, strlen(table_name));
|
||||||
|
|
||||||
|
if (parent_table_name != NULL) {
|
||||||
|
mem_free(table_name);
|
||||||
|
table_name = parent_table_name;
|
||||||
|
}
|
||||||
|
|
||||||
ut_a(memcmp(table_name, name, namelen) == 0);
|
ut_a(memcmp(table_name, name, namelen) == 0);
|
||||||
|
|
||||||
table = dict_table_open_on_name(
|
table = dict_table_open_on_name(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user