summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Midenkov <midenok@gmail.com>2019-03-20 20:45:54 +0300
committerAleksey Midenkov <midenok@gmail.com>2019-08-11 12:32:08 +0300
commit638e78853f8d7c0e2c1cf580f3847c5789f165e1 (patch)
tree1b4141a1583d75eb56be85f3e8826758f2363896
parent5851e668d7a0d51034c7d74779c39ef0f7b8d002 (diff)
downloadmariadb-git-638e78853f8d7c0e2c1cf580f3847c5789f165e1.tar.gz
MDEV-18862 Unfortunate error message upon attempt to drop system versioning
Special case for DROP PERIOD when system fields are implicit.
-rw-r--r--mysql-test/suite/versioning/r/alter.result13
-rw-r--r--mysql-test/suite/versioning/t/alter.test14
-rw-r--r--sql/share/errmsg-utf8.txt2
-rw-r--r--sql/sql_table.cc15
4 files changed, 42 insertions, 2 deletions
diff --git a/mysql-test/suite/versioning/r/alter.result b/mysql-test/suite/versioning/r/alter.result
index d272d53f407..0c79e6d4a39 100644
--- a/mysql-test/suite/versioning/r/alter.result
+++ b/mysql-test/suite/versioning/r/alter.result
@@ -616,5 +616,18 @@ Warning 1906 The value specified for generated column 'e' in table 't1' has been
Warning 1906 The value specified for generated column 'e' in table 't1' has been ignored
alter table t1 force;
set sql_mode= default;
+#
+# MDEV-18862 Unfortunate error message upon attempt to drop system versioning
+#
+set system_versioning_alter_history= keep;
+create or replace table t1 (x int) with system versioning;
+alter table t1 drop column `row_start`, drop column `row_end`, drop period for system_time, drop system versioning;
+ERROR HY000: No 'PERIOD FOR SYSTEM_TIME' in system-versioned `t1`
+alter table t1 drop period for system_time;
+ERROR HY000: No 'PERIOD FOR SYSTEM_TIME' in system-versioned `t1`
+alter table t1 drop column `row_start`, drop column `row_end`, drop system versioning;
+ERROR 42000: Can't DROP COLUMN `row_start`; check that it exists
+alter table t1 drop column `row_end`;
+ERROR 42000: Can't DROP COLUMN `row_end`; check that it exists
drop database test;
create database test;
diff --git a/mysql-test/suite/versioning/t/alter.test b/mysql-test/suite/versioning/t/alter.test
index f11eee59641..ea699104eac 100644
--- a/mysql-test/suite/versioning/t/alter.test
+++ b/mysql-test/suite/versioning/t/alter.test
@@ -514,5 +514,19 @@ update t1 set e= 1;
alter table t1 force;
set sql_mode= default;
+--echo #
+--echo # MDEV-18862 Unfortunate error message upon attempt to drop system versioning
+--echo #
+set system_versioning_alter_history= keep;
+create or replace table t1 (x int) with system versioning;
+--error ER_VERS_NO_PERIOD
+alter table t1 drop column `row_start`, drop column `row_end`, drop period for system_time, drop system versioning;
+--error ER_VERS_NO_PERIOD
+alter table t1 drop period for system_time;
+--error ER_CANT_DROP_FIELD_OR_KEY
+alter table t1 drop column `row_start`, drop column `row_end`, drop system versioning;
+--error ER_CANT_DROP_FIELD_OR_KEY
+alter table t1 drop column `row_end`;
+
drop database test;
create database test;
diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt
index 99af1c60287..39198912fbe 100644
--- a/sql/share/errmsg-utf8.txt
+++ b/sql/share/errmsg-utf8.txt
@@ -7898,3 +7898,5 @@ ER_KEY_DOESNT_SUPPORT
eng "%s index %`s does not support this operation"
ER_ALTER_OPERATION_TABLE_OPTIONS_NEED_REBUILD
eng "Changing table options requires the table to be rebuilt"
+ER_VERS_NO_PERIOD
+ eng "No 'PERIOD FOR SYSTEM_TIME' in system-versioned %`s"
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 62f7a7c4952..a615dd9f1ed 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -7833,6 +7833,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
KEY *key_info=table->key_info;
bool rc= TRUE;
bool modified_primary_key= FALSE;
+ bool vers_system_invisible= false;
Create_field *def;
Field **f_ptr,*field;
MY_BITMAP *dropped_fields= NULL; // if it's NULL - no dropped fields
@@ -7941,7 +7942,11 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
bitmap_set_bit(dropped_fields, field->field_index);
continue;
}
-
+ if (field->invisible == INVISIBLE_SYSTEM &&
+ field->flags & VERS_SYSTEM_FIELD)
+ {
+ vers_system_invisible= true;
+ }
/* invisible versioning column is dropped automatically on DROP SYSTEM VERSIONING */
if (!drop && field->invisible >= INVISIBLE_SYSTEM &&
field->flags & VERS_SYSTEM_FIELD &&
@@ -8059,7 +8064,8 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
dropped_sys_vers_fields &= VERS_SYSTEM_FIELD;
if ((dropped_sys_vers_fields ||
alter_info->flags & ALTER_DROP_PERIOD) &&
- dropped_sys_vers_fields != VERS_SYSTEM_FIELD)
+ dropped_sys_vers_fields != VERS_SYSTEM_FIELD &&
+ !vers_system_invisible)
{
StringBuffer<NAME_LEN*3> tmp;
append_drop_column(thd, dropped_sys_vers_fields & VERS_SYS_START_FLAG,
@@ -8069,6 +8075,11 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
my_error(ER_MISSING, MYF(0), table->s->table_name.str, tmp.c_ptr());
goto err;
}
+ else if (alter_info->flags & ALTER_DROP_PERIOD && vers_system_invisible)
+ {
+ my_error(ER_VERS_NO_PERIOD, MYF(0), table->s->table_name.str);
+ goto err;
+ }
alter_info->flags &= ~(ALTER_DROP_PERIOD | ALTER_ADD_PERIOD);
def_it.rewind();
while ((def=def_it++)) // Add new columns