mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
SQL,IB: add auto_inc copy mode fix [#347]
Related to #212. Extra update of sys_trx_start removed [#87].
This commit is contained in:
@@ -466,10 +466,18 @@ Table Create Table
|
|||||||
t CREATE TABLE `t` (
|
t CREATE TABLE `t` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
|
call verify_vtq;
|
||||||
|
No A B C D
|
||||||
create or replace table t (a int) with system versioning engine=innodb;
|
create or replace table t (a int) with system versioning engine=innodb;
|
||||||
insert into t values (1), (2), (3);
|
insert into t values (1), (2), (3);
|
||||||
delete from t where a<3;
|
delete from t where a<3;
|
||||||
|
call verify_vtq;
|
||||||
|
No A B C D
|
||||||
|
1 1 1 1 1
|
||||||
|
2 1 1 1 1
|
||||||
alter table t add b int auto_increment unique;
|
alter table t add b int auto_increment unique;
|
||||||
|
call verify_vtq;
|
||||||
|
No A B C D
|
||||||
select * from t for system_time all;
|
select * from t for system_time all;
|
||||||
a b
|
a b
|
||||||
1 -1
|
1 -1
|
||||||
@@ -482,6 +490,9 @@ a b
|
|||||||
2 -2
|
2 -2
|
||||||
3 1
|
3 1
|
||||||
4 2
|
4 2
|
||||||
|
call verify_vtq;
|
||||||
|
No A B C D
|
||||||
|
1 1 1 1 1
|
||||||
create or replace table t (a int) with system versioning;
|
create or replace table t (a int) with system versioning;
|
||||||
insert into t values (1), (2), (3);
|
insert into t values (1), (2), (3);
|
||||||
delete from t where a<3;
|
delete from t where a<3;
|
||||||
@@ -501,7 +512,13 @@ a b
|
|||||||
create or replace table t (a int) with system versioning engine=innodb;
|
create or replace table t (a int) with system versioning engine=innodb;
|
||||||
insert into t values (1), (2), (3);
|
insert into t values (1), (2), (3);
|
||||||
delete from t where a<3;
|
delete from t where a<3;
|
||||||
|
call verify_vtq;
|
||||||
|
No A B C D
|
||||||
|
1 1 1 1 1
|
||||||
|
2 1 1 1 1
|
||||||
alter table t add b tinyint auto_increment unique;
|
alter table t add b tinyint auto_increment unique;
|
||||||
|
call verify_vtq;
|
||||||
|
No A B C D
|
||||||
select * from t for system_time all;
|
select * from t for system_time all;
|
||||||
a b
|
a b
|
||||||
1 -1
|
1 -1
|
||||||
@@ -514,6 +531,9 @@ a b
|
|||||||
2 -2
|
2 -2
|
||||||
3 1
|
3 1
|
||||||
4 2
|
4 2
|
||||||
|
call verify_vtq;
|
||||||
|
No A B C D
|
||||||
|
1 1 1 1 1
|
||||||
create or replace table t (a int) with system versioning;
|
create or replace table t (a int) with system versioning;
|
||||||
insert into t values (1), (2), (3);
|
insert into t values (1), (2), (3);
|
||||||
delete from t where a<3;
|
delete from t where a<3;
|
||||||
@@ -610,15 +630,6 @@ call verify_vtq;
|
|||||||
No A B C D
|
No A B C D
|
||||||
1 1 1 1 1
|
1 1 1 1 1
|
||||||
2 1 1 1 1
|
2 1 1 1 1
|
||||||
3 1 1 1 1
|
|
||||||
4 1 1 1 1
|
|
||||||
5 1 1 1 1
|
|
||||||
6 1 1 1 1
|
|
||||||
7 1 1 1 1
|
|
||||||
8 1 1 1 1
|
|
||||||
9 1 1 1 1
|
|
||||||
10 1 1 1 1
|
|
||||||
11 1 1 1 1
|
|
||||||
drop table t;
|
drop table t;
|
||||||
drop procedure verify_vtq;
|
drop procedure verify_vtq;
|
||||||
drop procedure innodb_verify_vtq;
|
drop procedure innodb_verify_vtq;
|
||||||
|
@@ -194,14 +194,18 @@ select * from t for system_time all;
|
|||||||
|
|
||||||
alter table t drop system versioning, algorithm=copy;
|
alter table t drop system versioning, algorithm=copy;
|
||||||
show create table t;
|
show create table t;
|
||||||
|
call verify_vtq;
|
||||||
|
|
||||||
create or replace table t (a int) with system versioning engine=innodb;
|
create or replace table t (a int) with system versioning engine=innodb;
|
||||||
insert into t values (1), (2), (3);
|
insert into t values (1), (2), (3);
|
||||||
delete from t where a<3;
|
delete from t where a<3;
|
||||||
|
call verify_vtq;
|
||||||
alter table t add b int auto_increment unique;
|
alter table t add b int auto_increment unique;
|
||||||
|
call verify_vtq;
|
||||||
select * from t for system_time all;
|
select * from t for system_time all;
|
||||||
insert into t values (4, NULL);
|
insert into t values (4, NULL);
|
||||||
select * from t for system_time all;
|
select * from t for system_time all;
|
||||||
|
call verify_vtq;
|
||||||
|
|
||||||
create or replace table t (a int) with system versioning;
|
create or replace table t (a int) with system versioning;
|
||||||
insert into t values (1), (2), (3);
|
insert into t values (1), (2), (3);
|
||||||
@@ -214,10 +218,13 @@ select * from t for system_time all;
|
|||||||
create or replace table t (a int) with system versioning engine=innodb;
|
create or replace table t (a int) with system versioning engine=innodb;
|
||||||
insert into t values (1), (2), (3);
|
insert into t values (1), (2), (3);
|
||||||
delete from t where a<3;
|
delete from t where a<3;
|
||||||
|
call verify_vtq;
|
||||||
alter table t add b tinyint auto_increment unique;
|
alter table t add b tinyint auto_increment unique;
|
||||||
|
call verify_vtq;
|
||||||
select * from t for system_time all;
|
select * from t for system_time all;
|
||||||
insert into t values (4, NULL);
|
insert into t values (4, NULL);
|
||||||
select * from t for system_time all;
|
select * from t for system_time all;
|
||||||
|
call verify_vtq;
|
||||||
|
|
||||||
create or replace table t (a int) with system versioning;
|
create or replace table t (a int) with system versioning;
|
||||||
insert into t values (1), (2), (3);
|
insert into t values (1), (2), (3);
|
||||||
|
@@ -3036,7 +3036,7 @@ int handler::update_auto_increment()
|
|||||||
DBUG_ENTER("handler::update_auto_increment");
|
DBUG_ENTER("handler::update_auto_increment");
|
||||||
|
|
||||||
// System Versioning: handle ALTER ADD COLUMN AUTO_INCREMENT
|
// System Versioning: handle ALTER ADD COLUMN AUTO_INCREMENT
|
||||||
if (thd->lex->sql_command == SQLCOM_ALTER_TABLE && table->versioned_by_sql())
|
if (thd->lex->sql_command == SQLCOM_ALTER_TABLE && table->versioned())
|
||||||
{
|
{
|
||||||
Field *end= table->vers_end_field();
|
Field *end= table->vers_end_field();
|
||||||
DBUG_ASSERT(end);
|
DBUG_ASSERT(end);
|
||||||
|
@@ -10180,14 +10180,9 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to,
|
|||||||
if (keep_versioned && to->versioned_by_engine() &&
|
if (keep_versioned && to->versioned_by_engine() &&
|
||||||
thd->variables.vers_alter_history != VERS_ALTER_HISTORY_SURVIVE)
|
thd->variables.vers_alter_history != VERS_ALTER_HISTORY_SURVIVE)
|
||||||
{
|
{
|
||||||
to->s->versioned= false;
|
to->vers_write= false;
|
||||||
}
|
}
|
||||||
error= to->file->ha_write_row(to->record[0]);
|
error= to->file->ha_write_row(to->record[0]);
|
||||||
if (keep_versioned && to->versioned_by_engine() &&
|
|
||||||
thd->variables.vers_alter_history != VERS_ALTER_HISTORY_SURVIVE)
|
|
||||||
{
|
|
||||||
to->s->versioned= true;
|
|
||||||
}
|
|
||||||
to->auto_increment_field_not_null= FALSE;
|
to->auto_increment_field_not_null= FALSE;
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
|
@@ -3216,9 +3216,13 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share,
|
|||||||
*fptr++ = outparam->field[i];
|
*fptr++ = outparam->field[i];
|
||||||
}
|
}
|
||||||
(*fptr)= 0; // End marker
|
(*fptr)= 0; // End marker
|
||||||
|
outparam->vers_write= true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
outparam->non_generated_field= NULL;
|
outparam->non_generated_field= NULL;
|
||||||
|
outparam->vers_write= false;
|
||||||
|
}
|
||||||
|
|
||||||
if (share->found_next_number_field)
|
if (share->found_next_number_field)
|
||||||
outparam->found_next_number_field=
|
outparam->found_next_number_field=
|
||||||
|
@@ -1505,6 +1505,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
System Versioning support
|
System Versioning support
|
||||||
*/
|
*/
|
||||||
|
bool vers_write;
|
||||||
|
|
||||||
bool versioned() const
|
bool versioned() const
|
||||||
{
|
{
|
||||||
@@ -1512,6 +1513,12 @@ public:
|
|||||||
return s->versioned;
|
return s->versioned;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool versioned_write() const
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(versioned() || !vers_write);
|
||||||
|
return vers_write;
|
||||||
|
}
|
||||||
|
|
||||||
/* Versioned by SQL layer */
|
/* Versioned by SQL layer */
|
||||||
bool versioned_by_sql() const
|
bool versioned_by_sql() const
|
||||||
{
|
{
|
||||||
|
@@ -186,9 +186,9 @@ VTMD_table::update(THD *thd, const char* archive_name)
|
|||||||
vtmd.table->mark_columns_needed_for_update(); // not needed?
|
vtmd.table->mark_columns_needed_for_update(); // not needed?
|
||||||
if (archive_name)
|
if (archive_name)
|
||||||
{
|
{
|
||||||
vtmd.table->s->versioned= false;
|
vtmd.table->vers_write= false;
|
||||||
error= vtmd.table->file->ha_update_row(vtmd.table->record[1], vtmd.table->record[0]);
|
error= vtmd.table->file->ha_update_row(vtmd.table->record[1], vtmd.table->record[0]);
|
||||||
vtmd.table->s->versioned= true;
|
vtmd.table->vers_write= true;
|
||||||
|
|
||||||
if (!error)
|
if (!error)
|
||||||
{
|
{
|
||||||
@@ -220,9 +220,9 @@ VTMD_table::update(THD *thd, const char* archive_name)
|
|||||||
store_record(vtmd.table, record[1]);
|
store_record(vtmd.table, record[1]);
|
||||||
vtmd.table->field[FLD_ARCHIVE_NAME]->store(archive_name, an_len, table_alias_charset);
|
vtmd.table->field[FLD_ARCHIVE_NAME]->store(archive_name, an_len, table_alias_charset);
|
||||||
vtmd.table->field[FLD_ARCHIVE_NAME]->set_notnull();
|
vtmd.table->field[FLD_ARCHIVE_NAME]->set_notnull();
|
||||||
vtmd.table->s->versioned= false;
|
vtmd.table->vers_write= false;
|
||||||
error= vtmd.table->file->ha_update_row(vtmd.table->record[1], vtmd.table->record[0]);
|
error= vtmd.table->file->ha_update_row(vtmd.table->record[1], vtmd.table->record[0]);
|
||||||
vtmd.table->s->versioned= true;
|
vtmd.table->vers_write= true;
|
||||||
if (error)
|
if (error)
|
||||||
goto err;
|
goto err;
|
||||||
sys_trx_end= (ulonglong) vtmd.table->vers_start_field()->val_int();
|
sys_trx_end= (ulonglong) vtmd.table->vers_start_field()->val_int();
|
||||||
|
@@ -8369,7 +8369,7 @@ no_commit:
|
|||||||
|
|
||||||
innobase_srv_conc_enter_innodb(m_prebuilt);
|
innobase_srv_conc_enter_innodb(m_prebuilt);
|
||||||
|
|
||||||
vers_set_fields = (table->versioned() &&
|
vers_set_fields = (table->versioned_write() &&
|
||||||
(sql_command != SQLCOM_CREATE_TABLE || table->s->vtmd))
|
(sql_command != SQLCOM_CREATE_TABLE || table->s->vtmd))
|
||||||
?
|
?
|
||||||
ROW_INS_VERSIONED :
|
ROW_INS_VERSIONED :
|
||||||
@@ -9179,7 +9179,7 @@ ha_innobase::update_row(
|
|||||||
|
|
||||||
innobase_srv_conc_enter_innodb(m_prebuilt);
|
innobase_srv_conc_enter_innodb(m_prebuilt);
|
||||||
|
|
||||||
if (!table->versioned())
|
if (!table->versioned_write())
|
||||||
m_prebuilt->upd_node->versioned = false;
|
m_prebuilt->upd_node->versioned = false;
|
||||||
|
|
||||||
if (m_prebuilt->upd_node->versioned) {
|
if (m_prebuilt->upd_node->versioned) {
|
||||||
@@ -9317,7 +9317,7 @@ ha_innobase::delete_row(
|
|||||||
innobase_srv_conc_enter_innodb(m_prebuilt);
|
innobase_srv_conc_enter_innodb(m_prebuilt);
|
||||||
|
|
||||||
bool vers_set_fields =
|
bool vers_set_fields =
|
||||||
table->versioned() &&
|
table->versioned_write() &&
|
||||||
table->vers_end_field()->is_max();
|
table->vers_end_field()->is_max();
|
||||||
|
|
||||||
error = row_update_for_mysql(m_prebuilt, vers_set_fields);
|
error = row_update_for_mysql(m_prebuilt, vers_set_fields);
|
||||||
|
@@ -2304,21 +2304,7 @@ end_of_index:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (old_table->versioned()) {
|
if (old_table->versioned()) {
|
||||||
if (new_table->versioned() && !drop_historical) {
|
if (!new_table->versioned() || drop_historical) {
|
||||||
dfield_t *end = dtuple_get_nth_field(
|
|
||||||
row, new_table->vers_end);
|
|
||||||
byte *data = static_cast<byte *>(
|
|
||||||
dfield_get_data(end));
|
|
||||||
ut_ad(data);
|
|
||||||
if (mach_read_from_8(data) == TRX_ID_MAX) {
|
|
||||||
dfield_t *start = dtuple_get_nth_field(
|
|
||||||
row, new_table->vers_start);
|
|
||||||
void *data = dfield_get_data(start);
|
|
||||||
ut_ad(data);
|
|
||||||
mach_write_to_8(data, trx->id);
|
|
||||||
trx->vers_update_trt= true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const dict_col_t *col =
|
const dict_col_t *col =
|
||||||
&old_table->cols
|
&old_table->cols
|
||||||
[old_table->vers_end];
|
[old_table->vers_end];
|
||||||
|
Reference in New Issue
Block a user