Commit ef13c12c authored by Ramil Kalimullin's avatar Ramil Kalimullin
Browse files

Fix for bug#38821: Assert table->auto_increment_field_not_null failed

in open_table()

Problem: repeating "CREATE... ( AUTOINCREMENT) ... SELECT" may lead to
an assertion failure.

Fix: reset table->auto_increment_field_not_null after each record 
writing.
parent 0e3bc47f
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -1546,4 +1546,15 @@ SHOW INDEX FROM t1;
Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment
t1	1	c1	1	c1	A	NULL	NULL	NULL	YES	BTREE	
DROP TABLE t1;
CREATE TABLE t1 (a INTEGER AUTO_INCREMENT PRIMARY KEY, b INTEGER NOT NULL);
INSERT IGNORE INTO t1 (b) VALUES (5);
CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY)
SELECT a FROM t1;
CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY)
SELECT a FROM t1;
ERROR 23000: Duplicate entry '1' for key 1
CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY)
SELECT a FROM t1;
ERROR 23000: Duplicate entry '1' for key 1
DROP TABLE t1, t2;
End of 5.0 tests
+18 −0
Original line number Diff line number Diff line
@@ -1172,4 +1172,22 @@ SHOW INDEX FROM t1;
DROP TABLE t1;


#
# Bug#38821: Assert table->auto_increment_field_not_null failed in open_table()
#
CREATE TABLE t1 (a INTEGER AUTO_INCREMENT PRIMARY KEY, b INTEGER NOT NULL);
INSERT IGNORE INTO t1 (b) VALUES (5);

CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY)
  SELECT a FROM t1;
--error 1062
CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY)
  SELECT a FROM t1;
--error 1062
CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY)
  SELECT a FROM t1;

DROP TABLE t1, t2;


--echo End of 5.0 tests
+5 −1
Original line number Diff line number Diff line
@@ -2897,7 +2897,11 @@ bool select_insert::send_data(List<Item> &values)
      DBUG_RETURN(1);
    }
  }
  if (!(error= write_record(thd, table, &info)))
  
  error= write_record(thd, table, &info);
  table->auto_increment_field_not_null= FALSE;
  
  if (!error)
  {
    if (table->triggers || info.handle_duplicates == DUP_UPDATE)
    {