diff --git a/mysql-test/suite/versioning/r/alter.result b/mysql-test/suite/versioning/r/alter.result index 1c1f304441475db934c13bf9204a1817d493d1d5..3edca01bd6841ceaec6dff8daa77bb9706eef3ac 100644 --- a/mysql-test/suite/versioning/r/alter.result +++ b/mysql-test/suite/versioning/r/alter.result @@ -405,32 +405,13 @@ 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; -call verify_vtq; -No A B C D -select * from t for system_time all; -a b -1 -1 -2 -2 -3 1 -insert into t values (4, NULL); -select * from t for system_time all; -a b -1 -1 -2 -2 -3 1 -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; -insert into t values (1), (2), (3); -delete from t where a<3; alter table t add b int not null unique; ERROR 23000: Duplicate entry '...' for key 'b' alter table t add b int auto_increment unique; -ERROR 42000: Table '#sql-temporary' uses an extension that doesn't exist in this MariaDB version +ERROR 42000: Table 'test/t' uses an extension that doesn't exist in this MariaDB version alter table t add b int auto_increment null unique; +call verify_vtq; +No A B C D select * from t; a b 3 1 @@ -446,35 +427,20 @@ a b 2 NULL 3 1 4 2 -create or replace table t (a int) with system versioning engine=innodb; -insert into t values (1), (2), (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; -call verify_vtq; -No A B C D -select * from t for system_time all; -a b -1 -1 -2 -2 -3 1 -insert into t values (4, NULL); -select * from t for system_time all; -a b -1 -1 -2 -2 -3 1 -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; insert into t values (1), (2), (3); delete from t where a<3; -alter table t add b tinyint auto_increment null unique; +alter table t add b int not null unique; +ERROR 23000: Duplicate entry '...' for key 'b' +alter table t add b int auto_increment unique; +ERROR 42000: Table '#sql-temporary' uses an extension that doesn't exist in this MariaDB version +alter table t add b int auto_increment null unique; +select * from t; +a b +3 1 select * from t for system_time all; a b 1 NULL diff --git a/mysql-test/suite/versioning/t/alter.test b/mysql-test/suite/versioning/t/alter.test index 7176a704ebcfe79f0c7268d9704bf9f169276914..5e4d389f5a0313a58fbca49f5ffe87b836540452 100644 --- a/mysql-test/suite/versioning/t/alter.test +++ b/mysql-test/suite/versioning/t/alter.test @@ -209,10 +209,16 @@ create or replace table t (a int) with system versioning engine=innodb; insert into t values (1), (2), (3); delete from t where a<3; call verify_vtq; +--replace_regex /'0-[- 0-9.:]+'/'...'/ +--error ER_DUP_ENTRY +alter table t add b int not null unique; +--error ER_UNSUPPORTED_EXTENSION alter table t add b int auto_increment unique; +alter table t add b int auto_increment null unique; call verify_vtq; +select * from t; select * from t for system_time all; -insert into t values (4, NULL); +insert into t values (4, 0); select * from t for system_time all; call verify_vtq; @@ -231,27 +237,6 @@ select * from t for system_time all; insert into t values (4, 0); select * from t for system_time all; -create or replace table t (a int) with system versioning engine=innodb; -insert into t values (1), (2), (3); -delete from t where a<3; -call verify_vtq; -alter table t add b tinyint auto_increment unique; -call verify_vtq; -select * from t for system_time all; -insert into t values (4, NULL); -select * from t for system_time all; -call verify_vtq; - -create or replace table t (a int) with system versioning; -insert into t values (1), (2), (3); -delete from t where a<3; -# kvm-deb-trusty-ppc64le fails with "Out of range value for column 'b' at row 3" ---error 0,ER_WARN_DATA_OUT_OF_RANGE -alter table t add b tinyint auto_increment null unique; -select * from t for system_time all; -insert into t values (4, 0); -select * from t for system_time all; - create or replace table t ( a int, sys_trx_start bigint(20) unsigned generated always as row start, diff --git a/sql/handler.cc b/sql/handler.cc index a38113e826206e868a0272a84ac3f0dda2ce34c6..9ad866d92deebd9da8005d441c8e5789c50e240a 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -3071,8 +3071,8 @@ int handler::update_auto_increment() table->next_number_field->set_null(); DBUG_RETURN(0); } + table->next_number_field->set_notnull(); } - table->next_number_field->set_notnull(); } /* diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc index 7dd153253696292f0ef920e1eb62b0d489071ca9..3515e59d30a18cdcb4c0e7c8fca993b9b899acce 100644 --- a/storage/innobase/row/row0merge.cc +++ b/storage/innobase/row/row0merge.cc @@ -1742,9 +1742,9 @@ row_merge_read_clustered_index( double curr_progress = 0.0; ib_uint64_t read_rows = 0; ib_uint64_t table_total_rows = 0; - ulonglong historic_auto_decrement = 0xffffffffffffffff; char new_sys_trx_start[8]; char new_sys_trx_end[8]; + byte any_autoinc_data[8] = {0}; DBUG_ENTER("row_merge_read_clustered_index"); @@ -2253,9 +2253,26 @@ row_merge_read_clustered_index( = dfield->is_version_historical_end(); } - const dfield_t* dfield; + dfield_t* dfield; dfield = dtuple_get_nth_field(row, add_autoinc); + + if (new_table->versioned()) { + if (historical_row) { + if (dfield_get_type(dfield)->prtype & DATA_NOT_NULL) { + err = DB_UNSUPPORTED; + my_error(ER_UNSUPPORTED_EXTENSION, MYF(0), + old_table->name); + goto func_exit; + } + dfield_set_null(dfield); + } else { + // set not null + ulint len = dfield_get_type(dfield)->len; + dfield_set_data(dfield, any_autoinc_data, len); + } + } + if (dfield_is_null(dfield)) { goto write_buffers; } @@ -2273,12 +2290,7 @@ row_merge_read_clustered_index( goto func_exit; } - ulonglong value; - if (likely(!historical_row)) { - value = sequence++; - } else { - value = historic_auto_decrement--; - } + ulonglong value = sequence++; switch (dtype_get_mtype(dtype)) { case DATA_INT: {