Commit 735de9ea authored by Alexey Kopytov's avatar Alexey Kopytov

Bug #50335: Assertion `!(order->used & map)' in eq_ref_table

 
The problem was in an incorrect debug assertion. The expression 
used in the failing assertion states that when finding 
references matching ORDER BY expressions, there can be only one 
reference to a single table. But that does not make any sense, 
all test cases for this bug are valid examples with multiple 
identical WHERE expressions referencing the same table which
are also present in the ORDER BY list. 
 
Fixed by removing the failing assertion. We also have to take 
care of the 'found' counter so that we count multiple 
references only once. We rely on this fact later in 
eq_ref_table(). 
parent a341ec74
...@@ -1145,3 +1145,14 @@ NULL ...@@ -1145,3 +1145,14 @@ NULL
NULL NULL
1 1
DROP TABLE t1, t2, mm1; DROP TABLE t1, t2, mm1;
#
# Bug #50335: Assertion `!(order->used & map)' in eq_ref_table
#
CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL, PRIMARY KEY (a,b));
INSERT INTO t1 VALUES (0,0), (1,1);
SELECT * FROM t1 STRAIGHT_JOIN t1 t2 ON t1.a=t2.a AND t1.a=t2.b ORDER BY t2.a, t1.a;
a b a b
0 0 0 0
1 1 1 1
DROP TABLE t1;
End of 5.1 tests
...@@ -816,3 +816,16 @@ CREATE TABLE mm1(a CHAR(9),b INT,KEY(b),KEY(a)) ...@@ -816,3 +816,16 @@ CREATE TABLE mm1(a CHAR(9),b INT,KEY(b),KEY(a))
ENGINE=MERGE UNION=(t1,t2); ENGINE=MERGE UNION=(t1,t2);
SELECT t1.a FROM mm1,t1; SELECT t1.a FROM mm1,t1;
DROP TABLE t1, t2, mm1; DROP TABLE t1, t2, mm1;
--echo #
--echo # Bug #50335: Assertion `!(order->used & map)' in eq_ref_table
--echo #
CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL, PRIMARY KEY (a,b));
INSERT INTO t1 VALUES (0,0), (1,1);
SELECT * FROM t1 STRAIGHT_JOIN t1 t2 ON t1.a=t2.a AND t1.a=t2.b ORDER BY t2.a, t1.a;
DROP TABLE t1;
--echo End of 5.1 tests
...@@ -7027,10 +7027,12 @@ eq_ref_table(JOIN *join, ORDER *start_order, JOIN_TAB *tab) ...@@ -7027,10 +7027,12 @@ eq_ref_table(JOIN *join, ORDER *start_order, JOIN_TAB *tab)
break; break;
} }
if (order) if (order)
{
if (!(order->used & map))
{ {
found++; found++;
DBUG_ASSERT(!(order->used & map)); order->used|= map;
order->used|=map; }
continue; // Used in ORDER BY continue; // Used in ORDER BY
} }
if (!only_eq_ref_tables(join,start_order, (*ref_item)->used_tables())) if (!only_eq_ref_tables(join,start_order, (*ref_item)->used_tables()))
......
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