diff options
-rw-r--r-- | mysql-test/suite/versioning/r/insert.result | 6 | ||||
-rw-r--r-- | mysql-test/suite/versioning/r/update.result | 6 | ||||
-rw-r--r-- | mysql-test/suite/versioning/t/insert.test | 4 | ||||
-rw-r--r-- | mysql-test/suite/versioning/t/update.test | 5 | ||||
-rw-r--r-- | sql/sql_delete.cc | 2 | ||||
-rw-r--r-- | sql/sql_insert.cc | 9 | ||||
-rw-r--r-- | sql/table.cc | 9 | ||||
-rw-r--r-- | sql/table.h | 1 |
8 files changed, 27 insertions, 15 deletions
diff --git a/mysql-test/suite/versioning/r/insert.result b/mysql-test/suite/versioning/r/insert.result index e99d45011d5..0c9718c106b 100644 --- a/mysql-test/suite/versioning/r/insert.result +++ b/mysql-test/suite/versioning/r/insert.result @@ -353,6 +353,12 @@ a select * from t1 for system_time as of sysdate(6); a 1 +update t1 set a=2; +delete from t1; +select *, row_start > @a, row_end > @a from t1 for system_time all; +a row_start > @a row_end > @a +1 0 1 +2 1 1 # # MDEV-14871 Server crashes in fill_record / fill_record_n_invoke_before_triggers upon inserting into versioned table with trigger # diff --git a/mysql-test/suite/versioning/r/update.result b/mysql-test/suite/versioning/r/update.result index 08be6825b7f..e0daf1d6588 100644 --- a/mysql-test/suite/versioning/r/update.result +++ b/mysql-test/suite/versioning/r/update.result @@ -616,12 +616,10 @@ No A B C D 2 1 1 1 1 3 1 1 1 1 ### Issue #365, bug 7 (duplicate of historical row) -set timestamp= 1000000019; create or replace table t1 (a int primary key, b int) with system versioning engine myisam; insert into t1 (a) values (1); -update t1 set b= 2; -insert into t1 (a) values (1) on duplicate key update a= 2; -ERROR 23000: Duplicate entry '1-2001-09-09 01:46:59.000000' for key 'PRIMARY' +replace t1 values (1,2),(1,3),(2,4); +ERROR 23000: Duplicate entry '1-YYYY-MM-DD hh:mm:ss.uuuuuu' for key 'PRIMARY' drop database test; create database test; diff --git a/mysql-test/suite/versioning/t/insert.test b/mysql-test/suite/versioning/t/insert.test index f70ba344b13..482f0dd77ce 100644 --- a/mysql-test/suite/versioning/t/insert.test +++ b/mysql-test/suite/versioning/t/insert.test @@ -251,6 +251,10 @@ set @a=sysdate(6); select * from t1 for system_time as of now(6); select * from t1 for system_time as of sysdate(6); +update t1 set a=2; +delete from t1; +--sorted_result +select *, row_start > @a, row_end > @a from t1 for system_time all; --echo # --echo # MDEV-14871 Server crashes in fill_record / fill_record_n_invoke_before_triggers upon inserting into versioned table with trigger diff --git a/mysql-test/suite/versioning/t/update.test b/mysql-test/suite/versioning/t/update.test index bda908f4b54..60f20705276 100644 --- a/mysql-test/suite/versioning/t/update.test +++ b/mysql-test/suite/versioning/t/update.test @@ -277,13 +277,12 @@ call test_07('bigint unsigned', 'innodb', 'vtq_commit_ts(sys_trx_end)'); call verify_vtq; --echo ### Issue #365, bug 7 (duplicate of historical row) -set timestamp= 1000000019; create or replace table t1 (a int primary key, b int) with system versioning engine myisam; insert into t1 (a) values (1); -update t1 set b= 2; +--replace_regex /'1-[- .\d:]+'/'1-YYYY-MM-DD hh:mm:ss.uuuuuu'/ --error ER_DUP_ENTRY -insert into t1 (a) values (1) on duplicate key update a= 2; +replace t1 values (1,2),(1,3),(2,4); drop database test; create database test; diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index a382fdb7c03..14d04dcc2ad 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -253,7 +253,7 @@ int TABLE::delete_row() return file->ha_delete_row(record[0]); store_record(this, record[1]); - vers_end_field()->set_time(); + vers_update_end(); return file->ha_update_row(record[1], record[0]); } diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 203838dac10..cb46b4847bd 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1638,8 +1638,7 @@ int vers_insert_history_row(TABLE *table) restore_record(table,record[1]); // Set Sys_end to now() - if (table->vers_end_field()->set_time()) - DBUG_ASSERT(0); + table->vers_update_end(); return table->file->ha_write_row(table->record[0]); } @@ -1971,11 +1970,7 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info) DBUG_ASSERT(table->insert_values); store_record(table,insert_values); restore_record(table,record[1]); - if (table->vers_end_field()->set_time()) - { - error= 1; - goto err; - } + table->vers_update_end(); error= table->file->ha_update_row(table->record[1], table->record[0]); restore_record(table,insert_values); diff --git a/sql/table.cc b/sql/table.cc index 5a87acd4ed4..cd635d32b71 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -7800,6 +7800,15 @@ void TABLE::vers_update_fields() } +void TABLE::vers_update_end() +{ + vers_end_field()->set_notnull(); + if (vers_end_field()->store_timestamp(in_use->system_time, + in_use->system_time_sec_part)) + DBUG_ASSERT(0); +} + + bool TABLE_LIST::vers_vtmd_name(String& out) const { static const char *vtmd_suffix= "_vtmd"; diff --git a/sql/table.h b/sql/table.h index 71858be6229..3882bfad279 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1588,6 +1588,7 @@ public: int delete_row(); void vers_update_fields(); + void vers_update_end(); /** Number of additional fields used in versioned tables */ #define VERSIONING_FIELDS 2 |