Bug#44653: Server crash noticed when executing random queries with partitions.
When opening a table, it is imperative that the flag TABLE::auto_increment_field_not_null be false. But if an error occured during the creation of a table (e.g. the table exists already) with an auto_increment column and a BEFORE trigger that used the INSERT ... SELECT construct, the flag was not reset until after error checking. Thus if an error occured, select_insert::send_data() returned immediately and it was not reset (see * in pseudocode below). Crash happened if the table was opened again. Fixed by resetting the flag after error checking. nested-loops_join(): for each row in SELECT table { select_insert::send_data(): if a values is supplied for AUTO_INCREMENT column table->auto_increment_field_not_null= TRUE else table->auto_increment_field_not_null= FALSE if (error) return 1; * if (table->auto_increment_field_not_null == FALSE) ... table->auto_increment_field_not_null == FALSE } <-- table returned to table cache and later retrieved by open_table: open_table(): assert(table->auto_increment_field_not_null)
This commit is contained in:
parent
a141a6375a
commit
2cc1134c2c
@ -2073,4 +2073,18 @@ select @a, @b;
|
||||
drop trigger trg1;
|
||||
drop trigger trg2;
|
||||
drop table t1, t2;
|
||||
CREATE TABLE t1 ( a INT, b INT );
|
||||
CREATE TABLE t2 ( a INT AUTO_INCREMENT KEY, b INT );
|
||||
INSERT INTO t1 (a) VALUES (1);
|
||||
CREATE TRIGGER tr1
|
||||
BEFORE INSERT ON t2
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE a_nonextisting_table SET a = 1;
|
||||
END//
|
||||
CREATE TABLE IF NOT EXISTS t2 ( a INT, b INT ) SELECT a, b FROM t1;
|
||||
ERROR 42S02: Table 'test.a_nonextisting_table' doesn't exist
|
||||
SELECT * FROM t2;
|
||||
a b
|
||||
DROP TABLE t1, t2;
|
||||
End of 5.1 tests.
|
||||
|
@ -2370,4 +2370,30 @@ drop trigger trg1;
|
||||
drop trigger trg2;
|
||||
drop table t1, t2;
|
||||
|
||||
#
|
||||
# Bug#44653: Server crash noticed when executing random queries with partitions.
|
||||
#
|
||||
CREATE TABLE t1 ( a INT, b INT );
|
||||
CREATE TABLE t2 ( a INT AUTO_INCREMENT KEY, b INT );
|
||||
|
||||
INSERT INTO t1 (a) VALUES (1);
|
||||
|
||||
delimiter //;
|
||||
CREATE TRIGGER tr1
|
||||
BEFORE INSERT ON t2
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE a_nonextisting_table SET a = 1;
|
||||
END//
|
||||
delimiter ;//
|
||||
|
||||
--disable_abort_on_error
|
||||
CREATE TABLE IF NOT EXISTS t2 ( a INT, b INT ) SELECT a, b FROM t1;
|
||||
--enable_abort_on_error
|
||||
|
||||
# Caused failed assertion
|
||||
SELECT * FROM t2;
|
||||
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo End of 5.1 tests.
|
||||
|
@ -3100,7 +3100,10 @@ bool select_insert::send_data(List<Item> &values)
|
||||
store_values(values);
|
||||
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
|
||||
if (thd->is_error())
|
||||
{
|
||||
table->auto_increment_field_not_null= FALSE;
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
if (table_list) // Not CREATE ... SELECT
|
||||
{
|
||||
switch (table_list->view_check_option(thd, info.ignore)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user