maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #09077
Re: [Commits] be25be4: MDEV-8827 Duplicate key with auto increment
Ok to push.
On Mon, Nov 30, 2015 at 6:45 PM, <serg@xxxxxxxxxxx> wrote:
> revision-id: be25be4b1aaf65593d67498c2f30a99fd254ea15
> (mariadb-10.1.8-71-gbe25be4)
> parent(s): cf8cb9ebd810a46154f99a73045b53a6913b6eb6
> committer: Sergei Golubchik
> timestamp: 2015-11-30 17:45:23 +0100
> message:
>
> MDEV-8827 Duplicate key with auto increment
>
> fix innodb auto-increment handling
> three bugs:
> 1. innobase_next_autoinc treated the case of current<offset incorrectly
> 2. ha_innobase::get_auto_increment didn't recalculate current when
> increment changed
> 3. ha_innobase::get_auto_increment didn't pass offset down to
> innobase_next_autoinc
>
> ---
> mysql-test/suite/innodb/r/innodb-autoinc.result | 16 ++++++++++++++--
> mysql-test/suite/innodb/t/innodb-autoinc.test | 3 ++-
> storage/innobase/handler/ha_innodb.cc | 16 +++++++---------
> storage/xtradb/handler/ha_innodb.cc | 16 +++++++---------
> 4 files changed, 30 insertions(+), 21 deletions(-)
>
> diff --git a/mysql-test/suite/innodb/r/innodb-autoinc.result
> b/mysql-test/suite/innodb/r/innodb-autoinc.result
> index 6ac8bb5..ddca468 100644
> --- a/mysql-test/suite/innodb/r/innodb-autoinc.result
> +++ b/mysql-test/suite/innodb/r/innodb-autoinc.result
> @@ -567,7 +567,7 @@ Variable_name Value
> auto_increment_increment 65535
> auto_increment_offset 65535
> INSERT INTO t1 VALUES (NULL),(NULL);
> -ERROR 22003: Out of range value for column 'c1' at row 1
> +ERROR HY000: Failed to read auto-increment value from storage engine
> SELECT * FROM t1;
> c1
> 1
> @@ -641,6 +641,18 @@ PRIMARY KEY (m)) ENGINE = InnoDB;
> INSERT INTO t2 (n,o) VALUES
> (1 , 'true'), (1 , 'false'), (2 , 'true'), (2 , 'false'), (3 , 'true'),
> (3 , 'false'), (4 , 'true'), (4 , 'false'), (5 , 'true'), (5 , 'false');
> +SELECT * FROM t2;
> +m n o
> +1 1 TRUE
> +2 1 FALSE
> +3 2 TRUE
> +4 2 FALSE
> +5 3 TRUE
> +6 3 FALSE
> +7 4 TRUE
> +8 4 FALSE
> +9 5 TRUE
> +10 5 FALSE
> SHOW CREATE TABLE t2;
> Table Create Table
> t2 CREATE TABLE `t2` (
> @@ -648,7 +660,7 @@ t2 CREATE TABLE `t2` (
> `n` int(10) unsigned NOT NULL,
> `o` enum('FALSE','TRUE') DEFAULT NULL,
> PRIMARY KEY (`m`)
> -) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=latin1
> +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1
> INSERT INTO t1 (b,c) SELECT n,o FROM t2 ;
> SHOW CREATE TABLE t1;
> Table Create Table
> diff --git a/mysql-test/suite/innodb/t/innodb-autoinc.test
> b/mysql-test/suite/innodb/t/innodb-autoinc.test
> index ab708e8..dd4c4ae 100644
> --- a/mysql-test/suite/innodb/t/innodb-autoinc.test
> +++ b/mysql-test/suite/innodb/t/innodb-autoinc.test
> @@ -349,7 +349,7 @@ INSERT INTO t1 VALUES (18446744073709551610); #-- 2^64
> - 2
> SELECT * FROM t1;
> SET @@SESSION.AUTO_INCREMENT_INCREMENT=1152921504606846976,
> @@SESSION.AUTO_INCREMENT_OFFSET=1152921504606846976;
> SHOW VARIABLES LIKE "auto_inc%";
> ---error 167
> +--error 1467
> INSERT INTO t1 VALUES (NULL),(NULL);
> SELECT * FROM t1;
> DROP TABLE t1;
> @@ -401,6 +401,7 @@ CREATE TABLE t2 (
> INSERT INTO t2 (n,o) VALUES
> (1 , 'true'), (1 , 'false'), (2 , 'true'), (2 , 'false'), (3 , 'true'),
> (3 , 'false'), (4 , 'true'), (4 , 'false'), (5 , 'true'), (5 , 'false');
> +SELECT * FROM t2;
> SHOW CREATE TABLE t2;
> INSERT INTO t1 (b,c) SELECT n,o FROM t2 ;
> SHOW CREATE TABLE t1;
> diff --git a/storage/innobase/handler/ha_innodb.cc
> b/storage/innobase/handler/ha_innodb.cc
> index daa649a..bf86071 100644
> --- a/storage/innobase/handler/ha_innodb.cc
> +++ b/storage/innobase/handler/ha_innodb.cc
> @@ -2283,10 +2283,11 @@ innobase_next_autoinc(
> if (next_value == 0) {
> ulonglong next;
>
> - if (current > offset) {
> + if (current >= offset) {
> next = (current - offset) / step;
> } else {
> - next = (offset - current) / step;
> + next = 0;
> + block -= step;
> }
>
> ut_a(max_value > next);
> @@ -15542,10 +15543,7 @@ ha_innobase::get_auto_increment(
>
> current = *first_value;
>
> - /* If the increment step of the auto increment column
> - decreases then it is not affecting the immediate
> - next value in the series. */
> - if (prebuilt->autoinc_increment > increment) {
> + if (prebuilt->autoinc_increment != increment) {
>
> WSREP_DEBUG("autoinc decrease: %llu -> %llu\n"
> "THD: %ld, current: %llu, autoinc:
> %llu",
> @@ -15553,13 +15551,13 @@ ha_innobase::get_auto_increment(
> increment,
> thd_get_thread_id(ha_thd()),
> current, autoinc);
> - if (!wsrep_on(ha_thd()))
> + if (!wsrep_auto_increment_control ||
> !wsrep_on(ha_thd()))
> {
> - current = autoinc - prebuilt->autoinc_increment;
> + current = autoinc -
> prebuilt->autoinc_increment;
> }
>
> current = innobase_next_autoinc(
> - current, 1, increment, 1, col_max_value);
> + current, 1, increment, offset,
> col_max_value);
>
> dict_table_autoinc_initialize(prebuilt->table,
> current);
>
> diff --git a/storage/xtradb/handler/ha_innodb.cc
> b/storage/xtradb/handler/ha_innodb.cc
> index 4aa5457..6659989 100644
> --- a/storage/xtradb/handler/ha_innodb.cc
> +++ b/storage/xtradb/handler/ha_innodb.cc
> @@ -2556,10 +2556,11 @@ innobase_next_autoinc(
> if (next_value == 0) {
> ulonglong next;
>
> - if (current > offset) {
> + if (current >= offset) {
> next = (current - offset) / step;
> } else {
> - next = (offset - current) / step;
> + next = 0;
> + block -= step;
> }
>
> ut_a(max_value > next);
> @@ -16178,10 +16179,7 @@ ha_innobase::get_auto_increment(
>
> current = *first_value;
>
> - /* If the increment step of the auto increment column
> - decreases then it is not affecting the immediate
> - next value in the series. */
> - if (prebuilt->autoinc_increment > increment) {
> + if (prebuilt->autoinc_increment != increment) {
>
> WSREP_DEBUG("autoinc decrease: %llu -> %llu\n"
> "THD: %ld, current: %llu, autoinc:
> %llu",
> @@ -16189,13 +16187,13 @@ ha_innobase::get_auto_increment(
> increment,
> thd_get_thread_id(ha_thd()),
> current, autoinc);
> - if (!wsrep_on(ha_thd()))
> + if (!wsrep_auto_increment_control ||
> !wsrep_on(ha_thd()))
> {
> - current = autoinc - prebuilt->autoinc_increment;
> + current = autoinc -
> prebuilt->autoinc_increment;
> }
>
> current = innobase_next_autoinc(
> - current, 1, increment, 1, col_max_value);
> + current, 1, increment, offset,
> col_max_value);
>
> dict_table_autoinc_initialize(prebuilt->table,
> current);
>
> _______________________________________________
> commits mailing list
> commits@xxxxxxxxxxx
> https://lists.askmonty.org/cgi-bin/mailman/listinfo/commits