Commit 723ffdb3 authored by Julius Goryavsky's avatar Julius Goryavsky Committed by Marko Mäkelä

MDEV-9519: After-merge fix for 10.3

parent 446b3ebd
...@@ -3407,6 +3407,13 @@ int handler::update_auto_increment() ...@@ -3407,6 +3407,13 @@ int handler::update_auto_increment()
thd->count_cuted_fields= save_count_cuted_fields; thd->count_cuted_fields= save_count_cuted_fields;
if (unlikely(tmp)) // Out of range value in store if (unlikely(tmp)) // Out of range value in store
{
/*
First, test if the query was aborted due to strict mode constraints
or new field value greater than maximum integer value:
*/
if (thd->killed == KILL_BAD_DATA ||
nr > table->next_number_field->get_max_int_value())
{ {
/* /*
It's better to return an error here than getting a confusing It's better to return an error here than getting a confusing
...@@ -3414,6 +3421,21 @@ int handler::update_auto_increment() ...@@ -3414,6 +3421,21 @@ int handler::update_auto_increment()
*/ */
result= HA_ERR_AUTOINC_ERANGE; 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) if (append)
{ {
auto_inc_interval_for_cur_row.replace(nr, nb_reserved_values, auto_inc_interval_for_cur_row.replace(nr, nb_reserved_values,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment