Commit b72f2789 authored by Georgi Kodinov's avatar Georgi Kodinov

Bug #48709: Assertion failed in sql_select.cc:11782:

 int join_read_key(JOIN_TAB*)

The eq_ref access method TABLE_REF (accessed through 
JOIN_TAB) to save state and to track if this is the 
first row it finds or not.
This state was not reset on subquery re-execution
causing an assert.

Fixed by resetting the state before the subquery 
re-execution.
parent efc5e0a8
...@@ -4502,4 +4502,29 @@ WHERE a = 230; ...@@ -4502,4 +4502,29 @@ WHERE a = 230;
MAX(b) (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b) MAX(b) (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
NULL 0 NULL 0
DROP TABLE t1, st1, st2; DROP TABLE t1, st1, st2;
#
# Bug #48709: Assertion failed in sql_select.cc:11782:
# int join_read_key(JOIN_TAB*)
#
CREATE TABLE t1 (pk int PRIMARY KEY, int_key int);
INSERT INTO t1 VALUES (10,1), (14,1);
CREATE TABLE t2 (pk int PRIMARY KEY, int_key int);
INSERT INTO t2 VALUES (3,3), (5,NULL), (7,3);
# should have eq_ref for t1
EXPLAIN
SELECT * FROM t2 outr
WHERE outr.int_key NOT IN (SELECT t1.pk FROM t1, t2)
ORDER BY outr.pk;
id select_type table type possible_keys key key_len ref rows Extra
x x outr ALL x x x x x x
x x t1 eq_ref x x x x x x
x x t2 index x x x x x x
# should not crash on debug binaries
SELECT * FROM t2 outr
WHERE outr.int_key NOT IN (SELECT t1.pk FROM t1, t2)
ORDER BY outr.pk;
pk int_key
3 3
7 3
DROP TABLE t1,t2;
End of 5.0 tests. End of 5.0 tests.
...@@ -3481,4 +3481,30 @@ WHERE a = 230; ...@@ -3481,4 +3481,30 @@ WHERE a = 230;
DROP TABLE t1, st1, st2; DROP TABLE t1, st1, st2;
--echo #
--echo # Bug #48709: Assertion failed in sql_select.cc:11782:
--echo # int join_read_key(JOIN_TAB*)
--echo #
CREATE TABLE t1 (pk int PRIMARY KEY, int_key int);
INSERT INTO t1 VALUES (10,1), (14,1);
CREATE TABLE t2 (pk int PRIMARY KEY, int_key int);
INSERT INTO t2 VALUES (3,3), (5,NULL), (7,3);
--echo # should have eq_ref for t1
--replace_column 1 x 2 x 5 x 6 x 7 x 8 x 9 x 10 x
EXPLAIN
SELECT * FROM t2 outr
WHERE outr.int_key NOT IN (SELECT t1.pk FROM t1, t2)
ORDER BY outr.pk;
--echo # should not crash on debug binaries
SELECT * FROM t2 outr
WHERE outr.int_key NOT IN (SELECT t1.pk FROM t1, t2)
ORDER BY outr.pk;
DROP TABLE t1,t2;
--echo End of 5.0 tests. --echo End of 5.0 tests.
...@@ -1553,6 +1553,11 @@ JOIN::reinit() ...@@ -1553,6 +1553,11 @@ JOIN::reinit()
if (join_tab_save) if (join_tab_save)
memcpy(join_tab, join_tab_save, sizeof(JOIN_TAB) * tables); memcpy(join_tab, join_tab_save, sizeof(JOIN_TAB) * tables);
/* need to reset ref access state (see join_read_key) */
if (join_tab)
for (uint i= 0; i < tables; i++)
join_tab[i].ref.key_err= TRUE;
if (tmp_join) if (tmp_join)
restore_tmp(); restore_tmp();
......
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