Commit 82e6ae0f 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 e9db7b8e
...@@ -4410,6 +4410,31 @@ WHERE a = 230; ...@@ -4410,6 +4410,31 @@ 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.
CREATE TABLE t1 (a INT, b INT); CREATE TABLE t1 (a INT, b INT);
INSERT INTO t1 VALUES (2,22),(1,11),(2,22); INSERT INTO t1 VALUES (2,22),(1,11),(2,22);
......
...@@ -3368,6 +3368,32 @@ WHERE a = 230; ...@@ -3368,6 +3368,32 @@ 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.
# #
......
...@@ -1622,6 +1622,11 @@ JOIN::reinit() ...@@ -1622,6 +1622,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