Skip to content

Commit 5896a49

Browse files
committed
MDEV-19130 Assertion failed in handler::update_auto_increment
add store/restore_auto_increment in period portion insert/update functions
1 parent c2ac0ce commit 5896a49

File tree

6 files changed

+75
-1
lines changed

6 files changed

+75
-1
lines changed

mysql-test/suite/period/r/delete.result

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,3 +368,23 @@ drop procedure sp;
368368
drop table t,t2,t3,log_tbl;
369369
drop view v;
370370
drop procedure log;
371+
# MDEV-19130 Assertion
372+
# `next_insert_id >= auto_inc_interval_for_cur_row.minimum()'
373+
# failed in handler::update_auto_increment after error 167
374+
create or replace table t (f tinyint auto_increment null,
375+
s timestamp, e timestamp,
376+
period for app(s,e), key(f, s));
377+
insert into t (s,e) values
378+
('2021-08-22 10:28:43', '2023-09-17 00:00:00'),
379+
('2019-05-09 21:45:24', '2020-04-22 14:38:49');
380+
insert into t (s,e) select s,e from t;
381+
insert into t (s,e) select s,e from t;
382+
insert into t (s,e) select s,e from t;
383+
insert into t (s,e) values ('2015-07-07 00:00:00','2020-03-11 08:48:52');
384+
insert into t (s,e) select s,e from t;
385+
insert into t (s,e) select s,e from t;
386+
insert into t select * from t;
387+
ERROR 22003: Out of range value for column 'f' at row ROW
388+
delete ignore from t
389+
for portion of app from '2015-07-07 00:00:00' to '2020-03-11 08:48:52';
390+
drop table t;

mysql-test/suite/period/r/update.result

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,3 +281,14 @@ create table t1 (s date, e date, period for app(s,e), f varchar(8)) engine=aria
281281
insert into t1 values ('2024-05-13','2026-03-25','foo');
282282
update t1 for portion of app from '2024-04-02' to '2026-03-15' set f = 'bar';
283283
drop table t1;
284+
# MDEV-19130 Assertion
285+
# `next_insert_id >= auto_inc_interval_for_cur_row.minimum()'
286+
# failed in handler::update_auto_increment after error 167
287+
create table t1 (id int auto_increment, f int, s datetime, e datetime, period for p(s,e), primary key(id));
288+
insert into t1 (s,e) values ('1994-01-06','2004-11-30'),('1994-06-21','1997-06-20');
289+
update ignore t1 set id = 2429681664;
290+
Warnings:
291+
Warning 1264 Out of range value for column 'id' at row 1
292+
Warning 1264 Out of range value for column 'id' at row 2
293+
update ignore t1 for portion of p from '1995-07-06' to '2009-01-12' set f = 1;
294+
drop table t1;

mysql-test/suite/period/t/delete.test

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,34 @@ call sp;
194194
drop table t1;
195195
drop procedure sp;
196196

197-
198197
drop table t,t2,t3,log_tbl;
199198
drop view v;
200199
drop procedure log;
200+
201+
--echo # MDEV-19130 Assertion
202+
--echo # `next_insert_id >= auto_inc_interval_for_cur_row.minimum()'
203+
--echo # failed in handler::update_auto_increment after error 167
204+
205+
create or replace table t (f tinyint auto_increment null,
206+
s timestamp, e timestamp,
207+
period for app(s,e), key(f, s));
208+
insert into t (s,e) values
209+
('2021-08-22 10:28:43', '2023-09-17 00:00:00'),
210+
('2019-05-09 21:45:24', '2020-04-22 14:38:49');
211+
insert into t (s,e) select s,e from t;
212+
insert into t (s,e) select s,e from t;
213+
insert into t (s,e) select s,e from t;
214+
insert into t (s,e) values ('2015-07-07 00:00:00','2020-03-11 08:48:52');
215+
insert into t (s,e) select s,e from t;
216+
insert into t (s,e) select s,e from t;
217+
218+
--replace_regex /row \d+/row ROW/
219+
--error HA_ERR_AUTOINC_ERANGE
220+
insert into t select * from t;
221+
222+
--disable_warnings
223+
delete ignore from t
224+
for portion of app from '2015-07-07 00:00:00' to '2020-03-11 08:48:52';
225+
--enable_warnings
226+
227+
drop table t;

mysql-test/suite/period/t/update.test

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,3 +173,13 @@ update t1 for portion of app from '2024-04-02' to '2026-03-15' set f = 'bar';
173173

174174
# cleanup
175175
drop table t1;
176+
177+
--echo # MDEV-19130 Assertion
178+
--echo # `next_insert_id >= auto_inc_interval_for_cur_row.minimum()'
179+
--echo # failed in handler::update_auto_increment after error 167
180+
create table t1 (id int auto_increment, f int, s datetime, e datetime, period for p(s,e), primary key(id));
181+
insert into t1 (s,e) values ('1994-01-06','2004-11-30'),('1994-06-21','1997-06-20');
182+
update ignore t1 set id = 2429681664;
183+
update ignore t1 for portion of p from '1995-07-06' to '2009-01-12' set f = 1;
184+
185+
drop table t1;

sql/sql_delete.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ int update_portion_of_time(THD *thd, TABLE *table,
260260
uint dst_fieldno= lcond ? table->s->period.end_fieldno
261261
: table->s->period.start_fieldno;
262262

263+
table->file->store_auto_increment();
263264
store_record(table, record[1]);
264265
if (likely(!res))
265266
res= src->save_in_field(table->field[dst_fieldno], true);
@@ -274,6 +275,8 @@ int update_portion_of_time(THD *thd, TABLE *table,
274275
res= table->triggers->process_triggers(thd, TRG_EVENT_INSERT,
275276
TRG_ACTION_AFTER, true);
276277
restore_record(table, record[1]);
278+
if (res)
279+
table->file->restore_auto_increment();
277280

278281
if (likely(!res) && lcond && rcond)
279282
res= table->period_make_insert(period_conds.end.item,

sql/table.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8499,6 +8499,7 @@ int TABLE::period_make_insert(Item *src, Field *dst)
84998499
{
85008500
THD *thd= in_use;
85018501

8502+
file->store_auto_increment();
85028503
store_record(this, record[1]);
85038504
int res= src->save_in_field(dst, true);
85048505

@@ -8517,6 +8518,8 @@ int TABLE::period_make_insert(Item *src, Field *dst)
85178518
TRG_ACTION_AFTER, true);
85188519

85198520
restore_record(this, record[1]);
8521+
if (res)
8522+
file->restore_auto_increment();
85208523
return res;
85218524
}
85228525

0 commit comments

Comments
 (0)