mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-24690 Dropping primary key column from versioned table always fails with 1072
Exclude system-invisible key-parts from MDEV-11114 (04b288ae
)
restriction.
This commit is contained in:
@ -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;
|
|||||||
|
|
||||||
# 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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user