summaryrefslogtreecommitdiff
path: root/sql/handler.cc
diff options
context:
space:
mode:
authorJan Lindström <jan.lindstrom@mariadb.com>2019-02-28 09:29:19 +0200
committerJan Lindström <jan.lindstrom@mariadb.com>2019-02-28 09:29:19 +0200
commit5a87e3ee874d04325bc6f106c9862c96a6a35172 (patch)
tree8bbfc5faa85a5e11576df07141b092c43857f4e7 /sql/handler.cc
parent243f829c1c772c1b8e9e0717fbf5839e84244559 (diff)
downloadmariadb-git-5a87e3ee874d04325bc6f106c9862c96a6a35172.tar.gz
Revert offending part of MDEV-9519: Data corruption will happen on the Galera cluster size change
This will allow test binlog.binlog_stm_binlog to pass more often. Note that this is not a real fix to that test failure.
Diffstat (limited to 'sql/handler.cc')
-rw-r--r--sql/handler.cc38
1 files changed, 25 insertions, 13 deletions
diff --git a/sql/handler.cc b/sql/handler.cc
index ba3f7f3e16a..f307b3895bc 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -3016,7 +3016,7 @@ int handler::update_auto_increment()
bool append= FALSE;
THD *thd= table->in_use;
struct system_variables *variables= &thd->variables;
- int tmp;
+ int result=0, tmp;
enum enum_check_fields save_count_cuted_fields;
DBUG_ENTER("handler::update_auto_increment");
@@ -3152,18 +3152,27 @@ int handler::update_auto_increment()
*/
if (thd->killed == KILL_BAD_DATA ||
nr > table->next_number_field->get_max_int_value())
- DBUG_RETURN(HA_ERR_AUTOINC_ERANGE);
- /*
- Field refused this value (overflow) and truncated it, use the result
- of the truncation (which is going to be inserted); however we try to
- decrease it to honour auto_increment_* variables.
- That will shift the left bound of the reserved interval, we don't
- bother shifting the right bound (anyway any other value from this
- interval will cause a duplicate key).
- */
- nr= prev_insert_id(table->next_number_field->val_int(), variables);
- if (unlikely(table->next_number_field->store((longlong)nr, TRUE)))
- nr= table->next_number_field->val_int();
+ {
+ /*
+ It's better to return an error here than getting a confusing
+ 'duplicate key error' later.
+ */
+ result= HA_ERR_AUTOINC_ERANGE;
+ }
+ else
+ {
+ /*
+ Field refused this value (overflow) and truncated it, use the result
+ of the truncation (which is going to be inserted); however we try to
+ decrease it to honour auto_increment_* variables.
+ That will shift the left bound of the reserved interval, we don't
+ bother shifting the right bound (anyway any other value from this
+ interval will cause a duplicate key).
+ */
+ nr= prev_insert_id(table->next_number_field->val_int(), variables);
+ if (unlikely(table->next_number_field->store((longlong)nr, TRUE)))
+ nr= table->next_number_field->val_int();
+ }
}
if (append)
{
@@ -3188,6 +3197,9 @@ int handler::update_auto_increment()
*/
insert_id_for_cur_row= nr;
+ if (result) // overflow
+ DBUG_RETURN(result);
+
/*
Set next insert id to point to next auto-increment value to be able to
handle multi-row statements.