mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-35236 Assertion `(mem_root->flags & 4) == 0' failed in safe_lexcstrdup_root
followup for MDEV-35092
This commit is contained in:
@@ -141,6 +141,9 @@ execute stmt;
|
|||||||
Warnings:
|
Warnings:
|
||||||
Note 1091 Can't DROP INDEX `v`; check that it exists
|
Note 1091 Can't DROP INDEX `v`; check that it exists
|
||||||
execute stmt;
|
execute stmt;
|
||||||
|
prepare stmt from 'alter table t drop index if exists v, add vector (v)';
|
||||||
|
execute stmt;
|
||||||
|
execute stmt;
|
||||||
show create table t;
|
show create table t;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t CREATE TABLE `t` (
|
t CREATE TABLE `t` (
|
||||||
|
@@ -112,6 +112,9 @@ create table t (a int, v vector(10) not null);
|
|||||||
prepare stmt from 'alter table t drop index if exists v, add vector (v) max_edges_per_node=10';
|
prepare stmt from 'alter table t drop index if exists v, add vector (v) max_edges_per_node=10';
|
||||||
execute stmt;
|
execute stmt;
|
||||||
execute stmt;
|
execute stmt;
|
||||||
|
prepare stmt from 'alter table t drop index if exists v, add vector (v)';
|
||||||
|
execute stmt;
|
||||||
|
execute stmt;
|
||||||
show create table t;
|
show create table t;
|
||||||
drop table t;
|
drop table t;
|
||||||
set mhnsw_distance_function= default;
|
set mhnsw_distance_function= default;
|
||||||
|
@@ -51,7 +51,7 @@ void engine_option_value::link(engine_option_value **start,
|
|||||||
if (opt)
|
if (opt)
|
||||||
{
|
{
|
||||||
opt->value= Value(); /* remove previous value */
|
opt->value= Value(); /* remove previous value */
|
||||||
opt->parsed= TRUE; /* and don't issue warnings for it anymore */
|
opt->parsed= TRUE; /* and don't issue warnings for it anymore */
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
Add this option to the end of the list
|
Add this option to the end of the list
|
||||||
@@ -226,9 +226,11 @@ static const size_t ha_option_type_sizeof[]=
|
|||||||
|
|
||||||
bool extend_option_list(THD* thd, st_plugin_int *plugin, bool create,
|
bool extend_option_list(THD* thd, st_plugin_int *plugin, bool create,
|
||||||
engine_option_value **option_list,
|
engine_option_value **option_list,
|
||||||
ha_create_table_option *rules, MEM_ROOT *root)
|
ha_create_table_option *rules)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("extend_option_list");
|
DBUG_ENTER("extend_option_list");
|
||||||
|
MEM_ROOT *root= thd->mem_root;
|
||||||
|
bool extended= false;
|
||||||
|
|
||||||
for (ha_create_table_option *opt= rules; rules && opt->name; opt++)
|
for (ha_create_table_option *opt= rules; rules && opt->name; opt++)
|
||||||
{
|
{
|
||||||
@@ -262,6 +264,12 @@ bool extend_option_list(THD* thd, st_plugin_int *plugin, bool create,
|
|||||||
{
|
{
|
||||||
engine_option_value *val= new (root) engine_option_value(name,
|
engine_option_value *val= new (root) engine_option_value(name,
|
||||||
value, opt->type != HA_OPTION_TYPE_ULL);
|
value, opt->type != HA_OPTION_TYPE_ULL);
|
||||||
|
if (!extended)
|
||||||
|
{
|
||||||
|
void *pos= *option_list ? &(last->next) : option_list;
|
||||||
|
thd->register_item_tree_change((Item**)pos);
|
||||||
|
extended= true;
|
||||||
|
}
|
||||||
val->link(option_list, &last);
|
val->link(option_list, &last);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -844,4 +852,3 @@ bool is_engine_option_known(engine_option_value *opt,
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -118,14 +118,14 @@ bool parse_option_list(THD* thd, void *option_struct,
|
|||||||
|
|
||||||
bool extend_option_list(THD* thd, st_plugin_int *plugin, bool create,
|
bool extend_option_list(THD* thd, st_plugin_int *plugin, bool create,
|
||||||
engine_option_value **option_list,
|
engine_option_value **option_list,
|
||||||
ha_create_table_option *rules, MEM_ROOT *root);
|
ha_create_table_option *rules);
|
||||||
|
|
||||||
static inline bool extend_option_list(THD* thd, handlerton *hton, bool create,
|
static inline bool extend_option_list(THD* thd, handlerton *hton, bool create,
|
||||||
engine_option_value **option_list,
|
engine_option_value **option_list,
|
||||||
ha_create_table_option *rules, MEM_ROOT *root)
|
ha_create_table_option *rules)
|
||||||
{
|
{
|
||||||
return extend_option_list(thd, hton2plugin[hton->slot], create, option_list,
|
return extend_option_list(thd, hton2plugin[hton->slot], create, option_list,
|
||||||
rules, root);
|
rules);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool engine_table_options_frm_read(const uchar *buff, size_t length,
|
bool engine_table_options_frm_read(const uchar *buff, size_t length,
|
||||||
|
@@ -4811,14 +4811,19 @@ public:
|
|||||||
return !stmt_arena->is_conventional();
|
return !stmt_arena->is_conventional();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void register_item_tree_change(Item **place)
|
||||||
|
{
|
||||||
|
/* TODO: check for OOM condition here */
|
||||||
|
if (is_item_tree_change_register_required())
|
||||||
|
nocheck_register_item_tree_change(place, *place, mem_root);
|
||||||
|
}
|
||||||
|
|
||||||
void change_item_tree(Item **place, Item *new_value)
|
void change_item_tree(Item **place, Item *new_value)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("THD::change_item_tree");
|
DBUG_ENTER("THD::change_item_tree");
|
||||||
DBUG_PRINT("enter", ("Register: %p (%p) <- %p",
|
DBUG_PRINT("enter", ("Register: %p (%p) <- %p",
|
||||||
*place, place, new_value));
|
*place, place, new_value));
|
||||||
/* TODO: check for OOM condition here */
|
register_item_tree_change(place);
|
||||||
if (is_item_tree_change_register_required())
|
|
||||||
nocheck_register_item_tree_change(place, *place, mem_root);
|
|
||||||
*place= new_value;
|
*place= new_value;
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
@@ -3006,8 +3006,7 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
auto_increment++;
|
auto_increment++;
|
||||||
extend_option_list(thd, create_info->db_type, !sql_field->field,
|
extend_option_list(thd, create_info->db_type, !sql_field->field,
|
||||||
&sql_field->option_list,
|
&sql_field->option_list,
|
||||||
create_info->db_type->field_options,
|
create_info->db_type->field_options);
|
||||||
thd->stmt_arena->mem_root);
|
|
||||||
if (parse_option_list(thd, &sql_field->option_struct,
|
if (parse_option_list(thd, &sql_field->option_struct,
|
||||||
&sql_field->option_list,
|
&sql_field->option_list,
|
||||||
create_info->db_type->field_options, FALSE,
|
create_info->db_type->field_options, FALSE,
|
||||||
@@ -3295,7 +3294,7 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
key_info->algorithm= key->key_create_info.algorithm;
|
key_info->algorithm= key->key_create_info.algorithm;
|
||||||
key_info->option_list= key->option_list;
|
key_info->option_list= key->option_list;
|
||||||
extend_option_list(thd, index_plugin, !key->old, &key_info->option_list,
|
extend_option_list(thd, index_plugin, !key->old, &key_info->option_list,
|
||||||
index_options, thd->stmt_arena->mem_root);
|
index_options);
|
||||||
if (parse_option_list(thd, &key_info->option_struct, &key_info->option_list,
|
if (parse_option_list(thd, &key_info->option_struct, &key_info->option_list,
|
||||||
index_options, FALSE, thd->mem_root))
|
index_options, FALSE, thd->mem_root))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
@@ -3891,10 +3890,8 @@ without_overlaps_err:
|
|||||||
ER_THD(thd, ER_UNKNOWN_OPTION), "transactional");
|
ER_THD(thd, ER_UNKNOWN_OPTION), "transactional");
|
||||||
|
|
||||||
extend_option_list(thd, file->partition_ht(),
|
extend_option_list(thd, file->partition_ht(),
|
||||||
create_table_mode > C_ALTER_TABLE,
|
!thd->lex->create_like() && create_table_mode > C_ALTER_TABLE,
|
||||||
&create_info->option_list,
|
&create_info->option_list, file->partition_ht()->table_options);
|
||||||
file->partition_ht()->table_options,
|
|
||||||
thd->stmt_arena->mem_root);
|
|
||||||
if (parse_option_list(thd, &create_info->option_struct,
|
if (parse_option_list(thd, &create_info->option_struct,
|
||||||
&create_info->option_list,
|
&create_info->option_list,
|
||||||
file->partition_ht()->table_options, FALSE,
|
file->partition_ht()->table_options, FALSE,
|
||||||
|
Reference in New Issue
Block a user