summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Midenkov <midenok@gmail.com>2020-05-29 11:45:19 +0300
committerAleksey Midenkov <midenok@gmail.com>2020-05-29 11:45:19 +0300
commit57f7b4866f1347ebf3ee67fe61de3871e56e23cc (patch)
tree458e73627087c589987e3b13f57f9ee288c02e24
parent278facee7c7a028d642f3b5f23a42bcf099d86f3 (diff)
downloadmariadb-git-57f7b4866f1347ebf3ee67fe61de3871e56e23cc.tar.gz
MDEV-16937 Strict SQL with system versioned tables causes issues (10.4)
Respect system fields in NO_ZERO_DATE mode. This is the subject for refactoring in MDEV-19597 Conflict resolution from 7d5223310789f967106d86ce193ef31b315ecff0
-rw-r--r--mysql-test/suite/federated/federatedx_versioning.result4
-rw-r--r--mysql-test/suite/federated/federatedx_versioning.test2
-rw-r--r--mysql-test/suite/versioning/common.inc4
-rw-r--r--mysql-test/suite/versioning/engines.combinations5
-rw-r--r--mysql-test/suite/versioning/r/select.result6
-rw-r--r--mysql-test/suite/versioning/r/select2,trx_id.rdiff4
-rw-r--r--mysql-test/suite/versioning/r/select2.result10
-rw-r--r--mysql-test/suite/versioning/r/sysvars.result4
-rw-r--r--mysql-test/suite/versioning/r/view.result2
-rw-r--r--mysql-test/suite/versioning/t/select.test10
-rw-r--r--mysql-test/suite/versioning/t/select2.test10
-rw-r--r--mysql-test/suite/versioning/t/sysvars.test4
-rw-r--r--mysql-test/suite/versioning/t/view.test2
-rw-r--r--sql/field.cc7
-rw-r--r--sql/sql_table.cc1
-rw-r--r--sql/table.cc2
-rw-r--r--sql/unireg.cc7
-rw-r--r--storage/federatedx/ha_federatedx.cc17
18 files changed, 68 insertions, 33 deletions
diff --git a/mysql-test/suite/federated/federatedx_versioning.result b/mysql-test/suite/federated/federatedx_versioning.result
index abf2658d2e2..be3b578e839 100644
--- a/mysql-test/suite/federated/federatedx_versioning.result
+++ b/mysql-test/suite/federated/federatedx_versioning.result
@@ -9,8 +9,8 @@ show create table tf;
Table Create Table
tf CREATE TABLE `tf` (
`x` int(11) DEFAULT NULL,
- `row_start` SYS_TYPE NOT NULL INVISIBLE DEFAULT 0,
- `row_end` SYS_TYPE NOT NULL INVISIBLE DEFAULT 0
+ `row_start` SYS_TYPE INVISIBLE DEFAULT '1971-01-01 00:00:00.000000',
+ `row_end` SYS_TYPE INVISIBLE DEFAULT '1971-01-01 00:00:00.000000'
) ENGINE=FEDERATED DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:MASTER_MYPORT/test/t1'
# INSERT
insert into t1 values (1);
diff --git a/mysql-test/suite/federated/federatedx_versioning.test b/mysql-test/suite/federated/federatedx_versioning.test
index e8db8ef9e2a..6c3247cea55 100644
--- a/mysql-test/suite/federated/federatedx_versioning.test
+++ b/mysql-test/suite/federated/federatedx_versioning.test
@@ -12,7 +12,7 @@ eval create or replace table t1 (
with system versioning;
--replace_result $MASTER_MYPORT MASTER_MYPORT
eval create or replace table tf engine=FEDERATED connection='mysql://root@127.0.0.1:$MASTER_MYPORT/test/t1';
---replace_result $MASTER_MYPORT MASTER_MYPORT $sys_datatype_expl SYS_TYPE "'0000-00-00 00:00:00.000000'" 0
+--replace_result $MASTER_MYPORT MASTER_MYPORT $sys_datatype_expl SYS_TYPE 19710101000000 "'1971-01-01 00:00:00.000000'" " NOT NULL" ""
show create table tf;
--echo # INSERT
insert into t1 values (1);
diff --git a/mysql-test/suite/versioning/common.inc b/mysql-test/suite/versioning/common.inc
index 355b571e5a0..efb081a02e4 100644
--- a/mysql-test/suite/versioning/common.inc
+++ b/mysql-test/suite/versioning/common.inc
@@ -50,6 +50,10 @@ if ($MTR_COMBINATION_MYISAM)
{
--let $MTR_COMBINATION_TIMESTAMP= 1
}
+if ($MTR_COMBINATION_TRADITIONAL)
+{
+ --let $MTR_COMBINATION_TIMESTAMP= 1
+}
if ($MTR_COMBINATION_HEAP)
{
--let $MTR_COMBINATION_TIMESTAMP= 1
diff --git a/mysql-test/suite/versioning/engines.combinations b/mysql-test/suite/versioning/engines.combinations
index 26b5bab23f1..57e2af6cd06 100644
--- a/mysql-test/suite/versioning/engines.combinations
+++ b/mysql-test/suite/versioning/engines.combinations
@@ -7,5 +7,10 @@ default-storage-engine=innodb
[myisam]
default-storage-engine=myisam
+[traditional]
+default-storage-engine=myisam
+sql-mode=traditional
+
[heap]
default-storage-engine=memory
+
diff --git a/mysql-test/suite/versioning/r/select.result b/mysql-test/suite/versioning/r/select.result
index 36d738f57b7..a969c16bad4 100644
--- a/mysql-test/suite/versioning/r/select.result
+++ b/mysql-test/suite/versioning/r/select.result
@@ -45,7 +45,7 @@ ASOF_x y
7 107
8 108
9 109
-select x as FROMTO_x, y from t1 for system_time from timestamp '0-0-0 0:0:0' to timestamp @t1;
+select x as FROMTO_x, y from t1 for system_time from timestamp '1970-01-01 00:00:00' to timestamp @t1;
FROMTO_x y
0 100
1 101
@@ -57,7 +57,7 @@ FROMTO_x y
7 107
8 108
9 109
-select x as BETWAND_x, y from t1 for system_time between timestamp '0-0-0 0:0:0' and timestamp @t1;
+select x as BETWAND_x, y from t1 for system_time between timestamp '1970-01-01 00:00:00' and timestamp @t1;
BETWAND_x y
0 100
1 101
@@ -284,7 +284,7 @@ a b
select * from (select * from (select * from t1 cross join t2) as tmp1) as tmp2;
a b
1 2
-select * from (select * from t1 cross join t2 for system_time as of timestamp ('0-0-0')) as tmp;
+select * from (select * from t1 cross join t2 for system_time as of timestamp ('1970-01-01 00:00:00')) as tmp;
a b
create or replace table t1(a1 int) with system versioning;
create or replace table t2(a2 int) with system versioning;
diff --git a/mysql-test/suite/versioning/r/select2,trx_id.rdiff b/mysql-test/suite/versioning/r/select2,trx_id.rdiff
index d23eb5afbc0..4075b1b0f28 100644
--- a/mysql-test/suite/versioning/r/select2,trx_id.rdiff
+++ b/mysql-test/suite/versioning/r/select2,trx_id.rdiff
@@ -22,7 +22,7 @@
7 107
8 108
9 109
--select x as FROMTO2_x, y from t1 for system_time from '0-0-0 0:0:0' to @t1;
+-select x as FROMTO2_x, y from t1 for system_time from '1970-01-01 00:00' to @t1;
+select x as FROMTO2_x, y from t1 for system_time from @x0 to @x1;
FROMTO2_x y
0 100
@@ -31,7 +31,7 @@
7 107
8 108
9 109
--select x as BETWAND2_x, y from t1 for system_time between timestamp '0-0-0 0:0:0' and timestamp @t1;
+-select x as BETWAND2_x, y from t1 for system_time between timestamp '1970-01-01 00:00' and timestamp @t1;
+select x as BETWAND2_x, y from t1 for system_time between transaction @x0 and transaction @x1;
BETWAND2_x y
0 100
diff --git a/mysql-test/suite/versioning/r/select2.result b/mysql-test/suite/versioning/r/select2.result
index 22388359885..a2642b319ee 100644
--- a/mysql-test/suite/versioning/r/select2.result
+++ b/mysql-test/suite/versioning/r/select2.result
@@ -48,7 +48,7 @@ ASOF_x y
7 107
8 108
9 109
-select x as FROMTO_x, y from t1 for system_time from '0-0-0 0:0:0' to timestamp @t1;
+select x as FROMTO_x, y from t1 for system_time from '1970-01-01 00:00' to timestamp @t1;
FROMTO_x y
0 100
1 101
@@ -60,7 +60,7 @@ FROMTO_x y
7 107
8 108
9 109
-select x as BETWAND_x, y from t1 for system_time between '0-0-0 0:0:0' and timestamp @t1;
+select x as BETWAND_x, y from t1 for system_time between '1970-01-01 00:00' and timestamp @t1;
BETWAND_x y
0 100
1 101
@@ -98,7 +98,7 @@ ASOF2_x y
7 107
8 108
9 109
-select x as FROMTO2_x, y from t1 for system_time from '0-0-0 0:0:0' to @t1;
+select x as FROMTO2_x, y from t1 for system_time from '1970-01-01 00:00' to @t1;
FROMTO2_x y
0 100
1 101
@@ -110,7 +110,7 @@ FROMTO2_x y
7 107
8 108
9 109
-select x as BETWAND2_x, y from t1 for system_time between timestamp '0-0-0 0:0:0' and timestamp @t1;
+select x as BETWAND2_x, y from t1 for system_time between timestamp '1970-01-01 00:00' and timestamp @t1;
BETWAND2_x y
0 100
1 101
@@ -275,7 +275,7 @@ a b
select * from (select * from (select * from t1 cross join t2) as tmp1) as tmp2;
a b
1 2
-select * from (select * from t1 cross join t2 for system_time as of timestamp ('0-0-0')) as tmp;
+select * from (select * from t1 cross join t2 for system_time as of timestamp ('1970-01-01 00:00')) as tmp;
a b
create or replace table t1(a1 int) with system versioning;
create or replace table t2(a2 int) with system versioning;
diff --git a/mysql-test/suite/versioning/r/sysvars.result b/mysql-test/suite/versioning/r/sysvars.result
index 165458ef170..93d99273a40 100644
--- a/mysql-test/suite/versioning/r/sysvars.result
+++ b/mysql-test/suite/versioning/r/sysvars.result
@@ -134,11 +134,11 @@ select * from t for system_time all;
a
2
1
-select * from t for system_time from '0-0-0' to current_timestamp(6);
+select * from t for system_time from '1970-01-01 00:00' to current_timestamp(6);
a
2
1
-select * from t for system_time between '0-0-0' and current_timestamp(6);
+select * from t for system_time between '1970-01-01 00:00' and current_timestamp(6);
a
2
1
diff --git a/mysql-test/suite/versioning/r/view.result b/mysql-test/suite/versioning/r/view.result
index 3b3fe580af4..e9e74899790 100644
--- a/mysql-test/suite/versioning/r/view.result
+++ b/mysql-test/suite/versioning/r/view.result
@@ -79,7 +79,7 @@ create or replace view vt12 as select * from t1 cross join t2;
select * from vt12;
a b
1 2
-create or replace view vt12 as select * from t1 for system_time as of timestamp ('0-0-0') cross join t2;
+create or replace view vt12 as select * from t1 for system_time as of timestamp ('1970-01-01 00:00') cross join t2;
select * from vt12;
a b
# VIEW improvements [tempesta-tech/mariadb#183]
diff --git a/mysql-test/suite/versioning/t/select.test b/mysql-test/suite/versioning/t/select.test
index 00e67ed85a6..a250a60770e 100644
--- a/mysql-test/suite/versioning/t/select.test
+++ b/mysql-test/suite/versioning/t/select.test
@@ -48,8 +48,8 @@ if ($MTR_COMBINATION_TRX_ID)
select x, y from t1;
select x as ASOF_x, y from t1 for system_time as of timestamp @t0;
-select x as FROMTO_x, y from t1 for system_time from timestamp '0-0-0 0:0:0' to timestamp @t1;
-select x as BETWAND_x, y from t1 for system_time between timestamp '0-0-0 0:0:0' and timestamp @t1;
+select x as FROMTO_x, y from t1 for system_time from timestamp '1970-01-01 00:00:00' to timestamp @t1;
+select x as BETWAND_x, y from t1 for system_time between timestamp '1970-01-01 00:00:00' and timestamp @t1;
select x as ALL_x, y from t1 for system_time all;
--disable_query_log
@@ -62,8 +62,8 @@ if ($MTR_COMBINATION_TRX_ID)
if ($MTR_COMBINATION_TIMESTAMP)
{
select x as ASOF2_x, y from t1 for system_time as of @t0;
- select x as FROMTO2_x, y from t1 for system_time from timestamp '0-0-0 0:0:0' to timestamp @t1;
- select x as BETWAND2_x, y from t1 for system_time between timestamp '0-0-0 0:0:0' and timestamp @t1;
+ select x as FROMTO2_x, y from t1 for system_time from timestamp '1970-01-01 00:00:00' to timestamp @t1;
+ select x as BETWAND2_x, y from t1 for system_time between timestamp '1970-01-01 00:00:00' and timestamp @t1;
}
--enable_query_log
@@ -186,7 +186,7 @@ insert into t1 values (1);
insert into t2 values (2);
select * from (select * from t1 cross join t2) as tmp;
select * from (select * from (select * from t1 cross join t2) as tmp1) as tmp2;
-select * from (select * from t1 cross join t2 for system_time as of timestamp ('0-0-0')) as tmp;
+select * from (select * from t1 cross join t2 for system_time as of timestamp ('1970-01-01 00:00:00')) as tmp;
create or replace table t1(a1 int) with system versioning;
create or replace table t2(a2 int) with system versioning;
diff --git a/mysql-test/suite/versioning/t/select2.test b/mysql-test/suite/versioning/t/select2.test
index d1b73fa799b..75c8165886f 100644
--- a/mysql-test/suite/versioning/t/select2.test
+++ b/mysql-test/suite/versioning/t/select2.test
@@ -36,8 +36,8 @@ if($MTR_COMBINATION_TRX_ID) {
select x, y from t1;
select x as ASOF_x, y from t1 for system_time as of timestamp @t0;
-select x as FROMTO_x, y from t1 for system_time from '0-0-0 0:0:0' to timestamp @t1;
-select x as BETWAND_x, y from t1 for system_time between '0-0-0 0:0:0' and timestamp @t1;
+select x as FROMTO_x, y from t1 for system_time from '1970-01-01 00:00' to timestamp @t1;
+select x as BETWAND_x, y from t1 for system_time between '1970-01-01 00:00' and timestamp @t1;
select x as ALL_x, y from t1 for system_time all;
if($MTR_COMBINATION_TRX_ID) {
@@ -47,8 +47,8 @@ if($MTR_COMBINATION_TRX_ID) {
}
if(!$MTR_COMBINATION_TRX_ID) {
select x as ASOF2_x, y from t1 for system_time as of @t0;
- select x as FROMTO2_x, y from t1 for system_time from '0-0-0 0:0:0' to @t1;
- select x as BETWAND2_x, y from t1 for system_time between timestamp '0-0-0 0:0:0' and timestamp @t1;
+ select x as FROMTO2_x, y from t1 for system_time from '1970-01-01 00:00' to @t1;
+ select x as BETWAND2_x, y from t1 for system_time between timestamp '1970-01-01 00:00' and timestamp @t1;
}
drop table t1;
@@ -165,7 +165,7 @@ insert into t1 values (1);
insert into t2 values (2);
select * from (select * from t1 cross join t2) as tmp;
select * from (select * from (select * from t1 cross join t2) as tmp1) as tmp2;
-select * from (select * from t1 cross join t2 for system_time as of timestamp ('0-0-0')) as tmp;
+select * from (select * from t1 cross join t2 for system_time as of timestamp ('1970-01-01 00:00')) as tmp;
create or replace table t1(a1 int) with system versioning;
create or replace table t2(a2 int) with system versioning;
diff --git a/mysql-test/suite/versioning/t/sysvars.test b/mysql-test/suite/versioning/t/sysvars.test
index e82a116f30e..ef5d97ad262 100644
--- a/mysql-test/suite/versioning/t/sysvars.test
+++ b/mysql-test/suite/versioning/t/sysvars.test
@@ -97,8 +97,8 @@ select * from t for system_time all;
select * from t;
select * from t for system_time as of timestamp current_timestamp(6);
select * from t for system_time all;
-select * from t for system_time from '0-0-0' to current_timestamp(6);
-select * from t for system_time between '0-0-0' and current_timestamp(6);
+select * from t for system_time from '1970-01-01 00:00' to current_timestamp(6);
+select * from t for system_time between '1970-01-01 00:00' and current_timestamp(6);
show status like "Feature_system_versioning";
diff --git a/mysql-test/suite/versioning/t/view.test b/mysql-test/suite/versioning/t/view.test
index 288f1eb6e21..37676a7fb50 100644
--- a/mysql-test/suite/versioning/t/view.test
+++ b/mysql-test/suite/versioning/t/view.test
@@ -65,7 +65,7 @@ insert into t1 values (1);
insert into t2 values (2);
create or replace view vt12 as select * from t1 cross join t2;
select * from vt12;
-create or replace view vt12 as select * from t1 for system_time as of timestamp ('0-0-0') cross join t2;
+create or replace view vt12 as select * from t1 for system_time as of timestamp ('1970-01-01 00:00') cross join t2;
select * from vt12;
--echo # VIEW improvements [tempesta-tech/mariadb#183]
diff --git a/sql/field.cc b/sql/field.cc
index 0a8fdc3d3f5..a7cfca6d819 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -11265,6 +11265,13 @@ bool Field::save_in_field_default_value(bool view_error_processing)
{
THD *thd= table->in_use;
+ /*
+ TODO: MDEV-19597 Refactor TABLE::vers_update_fields() via stored virtual columns
+ This condition will go away as well as other conditions with vers_sys_field().
+ */
+ if (vers_sys_field())
+ return false;
+
if (unlikely(flags & NO_DEFAULT_VALUE_FLAG &&
real_type() != MYSQL_TYPE_ENUM))
{
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 7c59c37734e..ff6c2873dfc 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -4262,6 +4262,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
if (thd->variables.sql_mode & MODE_NO_ZERO_DATE &&
!sql_field->default_value && !sql_field->vcol_info &&
+ !sql_field->vers_sys_field() &&
sql_field->is_timestamp_type() &&
!opt_explicit_defaults_for_timestamp &&
(sql_field->flags & NOT_NULL_FLAG) &&
diff --git a/sql/table.cc b/sql/table.cc
index d90099835c0..92dfa59e648 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -8686,7 +8686,7 @@ bool TABLE::validate_default_values_of_unset_fields(THD *thd) const
for (Field **fld= field; *fld; fld++)
{
if (!bitmap_is_set(write_set, (*fld)->field_index) &&
- !((*fld)->flags & NO_DEFAULT_VALUE_FLAG))
+ !((*fld)->flags & (NO_DEFAULT_VALUE_FLAG | VERS_SYSTEM_FIELD)))
{
if (!(*fld)->is_null_in_record(s->default_values) &&
(*fld)->validate_value_in_record_with_warn(thd, s->default_values) &&
diff --git a/sql/unireg.cc b/sql/unireg.cc
index f646d62d221..2b162e9a374 100644
--- a/sql/unireg.cc
+++ b/sql/unireg.cc
@@ -991,9 +991,10 @@ static bool pack_fields(uchar **buff_arg, List<Create_field> &create_fields,
static bool make_empty_rec_store_default(THD *thd, Field *regfield,
- Virtual_column_info *default_value)
+ Create_field *field)
{
- if (default_value && !default_value->flags)
+ Virtual_column_info *default_value= field->default_value;
+ if (!field->vers_sys_field() && default_value && !default_value->flags)
{
Item *expr= default_value->expr;
// may be already fixed if ALTER TABLE
@@ -1075,7 +1076,7 @@ static bool make_empty_rec(THD *thd, uchar *buff, uint table_options,
!f_bit_as_char(field->pack_flag))
null_count+= field->length & 7;
- error= make_empty_rec_store_default(thd, regfield, field->default_value);
+ error= make_empty_rec_store_default(thd, regfield, field);
delete regfield; // Avoid memory leaks
if (error)
goto err;
diff --git a/storage/federatedx/ha_federatedx.cc b/storage/federatedx/ha_federatedx.cc
index 49101447dda..3c2b4cdc25b 100644
--- a/storage/federatedx/ha_federatedx.cc
+++ b/storage/federatedx/ha_federatedx.cc
@@ -3620,6 +3620,9 @@ int ha_federatedx::discover_assisted(handlerton *hton, THD* thd,
char buf[1024];
String query(buf, sizeof(buf), cs);
static LEX_CSTRING cut_clause={STRING_WITH_LEN(" WITH SYSTEM VERSIONING")};
+ static LEX_CSTRING cut_start={STRING_WITH_LEN("GENERATED ALWAYS AS ROW START")};
+ static LEX_CSTRING cut_end={STRING_WITH_LEN("GENERATED ALWAYS AS ROW END")};
+ static LEX_CSTRING set_ts={STRING_WITH_LEN("DEFAULT TIMESTAMP'1971-01-01 00:00:00'")};
int cut_offset;
MYSQL_RES *res;
MYSQL_ROW rdata;
@@ -3658,7 +3661,21 @@ int ha_federatedx::discover_assisted(handlerton *hton, THD* thd,
cut_offset= (int)query.length() - (int)cut_clause.length;
if (cut_offset > 0 && !memcmp(query.ptr() + cut_offset,
cut_clause.str, cut_clause.length))
+ {
query.length(cut_offset);
+ const char *ptr= strstr(query.ptr(), cut_start.str);
+ if (ptr)
+ {
+ query.replace((uint32) (ptr - query.ptr()), (uint32) cut_start.length,
+ set_ts.str, (uint32) set_ts.length);
+ }
+ ptr= strstr(query.ptr(), cut_end.str);
+ if (ptr)
+ {
+ query.replace((uint32) (ptr - query.ptr()), (uint32) cut_end.length,
+ set_ts.str, (uint32) set_ts.length);
+ }
+ }
query.append(STRING_WITH_LEN(" CONNECTION='"), cs);
query.append_for_single_quote(table_s->connect_string.str,
table_s->connect_string.length);