mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-14788 System versioning cannot be based on local timestamps, as it is now
followup to be81b00c84
Fix updates and deletes too
This commit is contained in:
@ -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
|
|||||||
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);
|
|||||||
|
|
||||||
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)');
|
|||||||
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()
|
|||||||
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)
|
|||||||
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)
|
|||||||
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()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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 @@ public:
|
|||||||
|
|
||||||
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
|
||||||
|
Reference in New Issue
Block a user