Commit af52a0e5 authored by Aleksey Midenkov's avatar Aleksey Midenkov

MDEV-24690 Dropping primary key column from versioned table always fails with 1072

Exclude system-invisible key-parts from MDEV-11114 (04b288ae)
restriction.
parent b9d1c657
...@@ -693,3 +693,45 @@ delete from t1; ...@@ -693,3 +693,45 @@ delete from t1;
set statement system_versioning_alter_history=keep for set statement system_versioning_alter_history=keep for
alter table t1 drop system versioning, modify column a tinyint; alter table t1 drop system versioning, modify column a tinyint;
drop table t1; drop table t1;
#
# MDEV-24690 Dropping primary key column from versioned table always fails with 1072
#
create table t1 (a int, b int primary key) with system versioning;
alter table t1 drop column b;
create or replace table t1 (
a int, b int primary key,
row_start timestamp(6) as row start,
row_end timestamp(6) as row end,
period for system_time(row_start, row_end)
) with system versioning;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL,
`b` int(11) NOT NULL,
`row_start` timestamp(6) GENERATED ALWAYS AS ROW START,
`row_end` timestamp(6) GENERATED ALWAYS AS ROW END,
PRIMARY KEY (`b`,`row_end`),
PERIOD FOR SYSTEM_TIME (`row_start`, `row_end`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
alter table t1 drop column b;
ERROR 42000: Key column 'b' doesn't exist in table
create or replace table t1 (
a int, b int primary key,
row_start timestamp(6) as row start invisible,
row_end timestamp(6) as row end invisible,
period for system_time(row_start, row_end)
) with system versioning;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL,
`b` int(11) NOT NULL,
`row_start` timestamp(6) GENERATED ALWAYS AS ROW START INVISIBLE,
`row_end` timestamp(6) GENERATED ALWAYS AS ROW END INVISIBLE,
PRIMARY KEY (`b`,`row_end`),
PERIOD FOR SYSTEM_TIME (`row_start`, `row_end`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
alter table t1 drop column b;
ERROR 42000: Key column 'b' doesn't exist in table
drop table t1;
...@@ -592,3 +592,32 @@ alter table t1 drop system versioning, modify column a tinyint; ...@@ -592,3 +592,32 @@ alter table t1 drop system versioning, modify column a tinyint;
# cleanup # cleanup
drop table t1; drop table t1;
--echo #
--echo # MDEV-24690 Dropping primary key column from versioned table always fails with 1072
--echo #
create table t1 (a int, b int primary key) with system versioning;
alter table t1 drop column b;
create or replace table t1 (
a int, b int primary key,
row_start timestamp(6) as row start,
row_end timestamp(6) as row end,
period for system_time(row_start, row_end)
) with system versioning;
show create table t1;
--error ER_KEY_COLUMN_DOES_NOT_EXITS
alter table t1 drop column b;
create or replace table t1 (
a int, b int primary key,
row_start timestamp(6) as row start invisible,
row_end timestamp(6) as row end invisible,
period for system_time(row_start, row_end)
) with system versioning;
show create table t1;
--error ER_KEY_COLUMN_DOES_NOT_EXITS
alter table t1 drop column b;
# cleanup
drop table t1;
...@@ -8375,6 +8375,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, ...@@ -8375,6 +8375,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
} }
const char *dropped_key_part= NULL; const char *dropped_key_part= NULL;
bool user_keyparts= false; // some user-defined keyparts left
KEY_PART_INFO *key_part= key_info->key_part; KEY_PART_INFO *key_part= key_info->key_part;
key_parts.empty(); key_parts.empty();
bool delete_index_stat= FALSE; bool delete_index_stat= FALSE;
...@@ -8450,6 +8451,8 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, ...@@ -8450,6 +8451,8 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
key_parts.push_back(new (thd->mem_root) Key_part_spec(&cfield->field_name, key_parts.push_back(new (thd->mem_root) Key_part_spec(&cfield->field_name,
key_part_length, true), key_part_length, true),
thd->mem_root); thd->mem_root);
if (cfield->invisible < INVISIBLE_SYSTEM)
user_keyparts= true;
} }
if (table->s->tmp_table == NO_TMP_TABLE) if (table->s->tmp_table == NO_TMP_TABLE)
{ {
...@@ -8493,7 +8496,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, ...@@ -8493,7 +8496,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
key_type= Key::PRIMARY; key_type= Key::PRIMARY;
else else
key_type= Key::UNIQUE; key_type= Key::UNIQUE;
if (dropped_key_part) if (dropped_key_part && user_keyparts)
{ {
my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), dropped_key_part); my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), dropped_key_part);
goto err; goto err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment