Commit 826f615f authored by Sergei Golubchik's avatar Sergei Golubchik

MDEV-14788 System versioning cannot be based on local timestamps, as it is now

followup to be81b00c
Fix updates and deletes too
parent 6a8cf407
...@@ -353,6 +353,12 @@ a ...@@ -353,6 +353,12 @@ a
select * from t1 for system_time as of sysdate(6); select * from t1 for system_time as of sysdate(6);
a a
1 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 # MDEV-14871 Server crashes in fill_record / fill_record_n_invoke_before_triggers upon inserting into versioned table with trigger
# #
......
...@@ -616,12 +616,10 @@ No A B C D ...@@ -616,12 +616,10 @@ No A B C D
2 1 1 1 1 2 1 1 1 1
3 1 1 1 1 3 1 1 1 1
### Issue #365, bug 7 (duplicate of historical row) ### Issue #365, bug 7 (duplicate of historical row)
set timestamp= 1000000019;
create or replace table t1 (a int primary key, b int) create or replace table t1 (a int primary key, b int)
with system versioning engine myisam; with system versioning engine myisam;
insert into t1 (a) values (1); insert into t1 (a) values (1);
update t1 set b= 2; replace t1 values (1,2),(1,3),(2,4);
insert into t1 (a) values (1) on duplicate key update a= 2; ERROR 23000: Duplicate entry '1-YYYY-MM-DD hh:mm:ss.uuuuuu' for key 'PRIMARY'
ERROR 23000: Duplicate entry '1-2001-09-09 01:46:59.000000' for key 'PRIMARY'
drop database test; drop database test;
create database test; create database test;
...@@ -251,6 +251,10 @@ set @a=sysdate(6); ...@@ -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 now(6);
select * from t1 for system_time as of sysdate(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 #
--echo # MDEV-14871 Server crashes in fill_record / fill_record_n_invoke_before_triggers upon inserting into versioned table with trigger --echo # MDEV-14871 Server crashes in fill_record / fill_record_n_invoke_before_triggers upon inserting into versioned table with trigger
......
...@@ -277,13 +277,12 @@ call test_07('bigint unsigned', 'innodb', 'vtq_commit_ts(sys_trx_end)'); ...@@ -277,13 +277,12 @@ call test_07('bigint unsigned', 'innodb', 'vtq_commit_ts(sys_trx_end)');
call verify_vtq; call verify_vtq;
--echo ### Issue #365, bug 7 (duplicate of historical row) --echo ### Issue #365, bug 7 (duplicate of historical row)
set timestamp= 1000000019;
create or replace table t1 (a int primary key, b int) create or replace table t1 (a int primary key, b int)
with system versioning engine myisam; with system versioning engine myisam;
insert into t1 (a) values (1); 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 --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; drop database test;
create database test; create database test;
...@@ -253,7 +253,7 @@ int TABLE::delete_row() ...@@ -253,7 +253,7 @@ int TABLE::delete_row()
return file->ha_delete_row(record[0]); return file->ha_delete_row(record[0]);
store_record(this, record[1]); store_record(this, record[1]);
vers_end_field()->set_time(); vers_update_end();
return file->ha_update_row(record[1], record[0]); return file->ha_update_row(record[1], record[0]);
} }
......
...@@ -1638,8 +1638,7 @@ int vers_insert_history_row(TABLE *table) ...@@ -1638,8 +1638,7 @@ int vers_insert_history_row(TABLE *table)
restore_record(table,record[1]); restore_record(table,record[1]);
// Set Sys_end to now() // Set Sys_end to now()
if (table->vers_end_field()->set_time()) table->vers_update_end();
DBUG_ASSERT(0);
return table->file->ha_write_row(table->record[0]); return table->file->ha_write_row(table->record[0]);
} }
...@@ -1971,11 +1970,7 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info) ...@@ -1971,11 +1970,7 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
DBUG_ASSERT(table->insert_values); DBUG_ASSERT(table->insert_values);
store_record(table,insert_values); store_record(table,insert_values);
restore_record(table,record[1]); restore_record(table,record[1]);
if (table->vers_end_field()->set_time()) table->vers_update_end();
{
error= 1;
goto err;
}
error= table->file->ha_update_row(table->record[1], error= table->file->ha_update_row(table->record[1],
table->record[0]); table->record[0]);
restore_record(table,insert_values); restore_record(table,insert_values);
......
...@@ -7800,6 +7800,15 @@ void TABLE::vers_update_fields() ...@@ -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 bool TABLE_LIST::vers_vtmd_name(String& out) const
{ {
static const char *vtmd_suffix= "_vtmd"; static const char *vtmd_suffix= "_vtmd";
......
...@@ -1588,6 +1588,7 @@ struct TABLE ...@@ -1588,6 +1588,7 @@ struct TABLE
int delete_row(); int delete_row();
void vers_update_fields(); void vers_update_fields();
void vers_update_end();
/** Number of additional fields used in versioned tables */ /** Number of additional fields used in versioned tables */
#define VERSIONING_FIELDS 2 #define VERSIONING_FIELDS 2
......
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