mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-26453 Assertion `0' failed in row_upd_sec_index_entry & corruption
Long UNIQUE HASH index silently creates virtual column index, which should be impossible for base columns featuring AUTO_INCREMENT. Fix: add a relevant check; add new vcol type for a prettier error message.
This commit is contained in:
@ -288,3 +288,17 @@ Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_par
|
|||||||
t2 0 a 1 a A NULL NULL NULL YES HASH
|
t2 0 a 1 a A NULL NULL NULL YES HASH
|
||||||
t2 0 a 2 b A NULL NULL NULL YES HASH
|
t2 0 a 2 b A NULL NULL NULL YES HASH
|
||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
|
#
|
||||||
|
# MDEV-26453 Assertion `0' failed in row_upd_sec_index_entry & corruption
|
||||||
|
#
|
||||||
|
CREATE TABLE t (c INT AUTO_INCREMENT KEY, UNIQUE USING HASH(c));
|
||||||
|
ERROR HY000: Function or expression 'AUTO_INCREMENT' cannot be used in the USING HASH clause of `c`
|
||||||
|
CREATE TABLE t (c INT AUTO_INCREMENT KEY);
|
||||||
|
CREATE UNIQUE INDEX i USING HASH ON t (c);
|
||||||
|
ERROR HY000: Function or expression 'AUTO_INCREMENT' cannot be used in the USING HASH clause of `c`
|
||||||
|
INSERT INTO t VALUES (0);
|
||||||
|
SELECT * FROM t;
|
||||||
|
c
|
||||||
|
1
|
||||||
|
DELETE FROM t;
|
||||||
|
DROP TABLE t;
|
||||||
|
@ -368,3 +368,19 @@ show index from t2;
|
|||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-26453 Assertion `0' failed in row_upd_sec_index_entry & corruption
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED
|
||||||
|
CREATE TABLE t (c INT AUTO_INCREMENT KEY, UNIQUE USING HASH(c));
|
||||||
|
|
||||||
|
CREATE TABLE t (c INT AUTO_INCREMENT KEY);
|
||||||
|
--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED
|
||||||
|
CREATE UNIQUE INDEX i USING HASH ON t (c);
|
||||||
|
INSERT INTO t VALUES (0);
|
||||||
|
SELECT * FROM t;
|
||||||
|
DELETE FROM t;
|
||||||
|
|
||||||
|
DROP TABLE t;
|
||||||
|
@ -475,6 +475,7 @@ enum enum_vcol_info_type
|
|||||||
{
|
{
|
||||||
VCOL_GENERATED_VIRTUAL, VCOL_GENERATED_STORED,
|
VCOL_GENERATED_VIRTUAL, VCOL_GENERATED_STORED,
|
||||||
VCOL_DEFAULT, VCOL_CHECK_FIELD, VCOL_CHECK_TABLE,
|
VCOL_DEFAULT, VCOL_CHECK_FIELD, VCOL_CHECK_TABLE,
|
||||||
|
VCOL_USING_HASH,
|
||||||
/* Additional types should be added here */
|
/* Additional types should be added here */
|
||||||
/* Following is the highest value last */
|
/* Following is the highest value last */
|
||||||
VCOL_TYPE_NONE = 127 // Since the 0 value is already in use
|
VCOL_TYPE_NONE = 127 // Since the 0 value is already in use
|
||||||
@ -492,6 +493,8 @@ static inline const char *vcol_type_name(enum_vcol_info_type type)
|
|||||||
case VCOL_CHECK_FIELD:
|
case VCOL_CHECK_FIELD:
|
||||||
case VCOL_CHECK_TABLE:
|
case VCOL_CHECK_TABLE:
|
||||||
return "CHECK";
|
return "CHECK";
|
||||||
|
case VCOL_USING_HASH:
|
||||||
|
return "USING HASH";
|
||||||
case VCOL_TYPE_NONE:
|
case VCOL_TYPE_NONE:
|
||||||
return "UNTYPED";
|
return "UNTYPED";
|
||||||
}
|
}
|
||||||
|
@ -1065,6 +1065,8 @@ static void mysql57_calculate_null_position(TABLE_SHARE *share,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool fix_and_check_vcol_expr(THD *thd, TABLE *table,
|
||||||
|
Virtual_column_info *vcol);
|
||||||
|
|
||||||
/** Parse TABLE_SHARE::vcol_defs
|
/** Parse TABLE_SHARE::vcol_defs
|
||||||
|
|
||||||
@ -1256,6 +1258,9 @@ bool parse_vcol_defs(THD *thd, MEM_ROOT *mem_root, TABLE *table,
|
|||||||
Virtual_column_info *v= new (mem_root) Virtual_column_info();
|
Virtual_column_info *v= new (mem_root) Virtual_column_info();
|
||||||
field->vcol_info= v;
|
field->vcol_info= v;
|
||||||
field->vcol_info->expr= hash_item;
|
field->vcol_info->expr= hash_item;
|
||||||
|
field->vcol_info->set_vcol_type(VCOL_USING_HASH);
|
||||||
|
if (fix_and_check_vcol_expr(thd, table, v))
|
||||||
|
goto end;
|
||||||
key->user_defined_key_parts= key->ext_key_parts= key->usable_key_parts= 1;
|
key->user_defined_key_parts= key->ext_key_parts= key->usable_key_parts= 1;
|
||||||
key->key_part+= parts;
|
key->key_part+= parts;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user