mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
BUG#919878: Assertion `!eliminated_tables...
- In MySQL 5.5, print_join() was re-worked to print "FROM dual" when all tables are constant. This change didn't work together with table elimination.
This commit is contained in:
@@ -588,4 +588,23 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using where; Using index
|
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using where; Using index
|
||||||
drop view v1;
|
drop view v1;
|
||||||
DROP TABLE t1,t2,t3;
|
DROP TABLE t1,t2,t3;
|
||||||
|
#
|
||||||
|
# BUG#919878: Assertion `!eliminated_tables...
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 ( a INT );
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
CREATE TABLE t2
|
||||||
|
( b INT, UNIQUE INDEX(b) );
|
||||||
|
INSERT INTO t2 VALUES (1),(2);
|
||||||
|
EXPLAIN EXTENDED
|
||||||
|
SELECT * FROM t2
|
||||||
|
WHERE b IN (
|
||||||
|
SELECT SUM(a) FROM t1 LEFT JOIN t2 ON b=a
|
||||||
|
);
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 PRIMARY t2 index NULL b 5 NULL 2 100.00 Using where; Using index
|
||||||
|
2 DEPENDENT SUBQUERY t1 system NULL NULL NULL NULL 1 100.00
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t2`.`b` AS `b` from `test`.`t2` where <expr_cache><`test`.`t2`.`b`>(<in_optimizer>(`test`.`t2`.`b`,<exists>(select sum(1) from dual where 1 having (<cache>(`test`.`t2`.`b`) = <ref_null_helper>(sum(1))))))
|
||||||
|
DROP TABLE t1,t2;
|
||||||
SET optimizer_switch=@save_optimizer_switch;
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
|
@@ -521,4 +521,22 @@ EXPLAIN SELECT alias1.* FROM t3 LEFT JOIN v1 as alias1 ON ( t3.a = alias1.b );
|
|||||||
drop view v1;
|
drop view v1;
|
||||||
DROP TABLE t1,t2,t3;
|
DROP TABLE t1,t2,t3;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # BUG#919878: Assertion `!eliminated_tables...
|
||||||
|
--echo #
|
||||||
|
CREATE TABLE t1 ( a INT );
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
|
||||||
|
CREATE TABLE t2
|
||||||
|
( b INT, UNIQUE INDEX(b) );
|
||||||
|
INSERT INTO t2 VALUES (1),(2);
|
||||||
|
|
||||||
|
EXPLAIN EXTENDED
|
||||||
|
SELECT * FROM t2
|
||||||
|
WHERE b IN (
|
||||||
|
SELECT SUM(a) FROM t1 LEFT JOIN t2 ON b=a
|
||||||
|
);
|
||||||
|
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
SET optimizer_switch=@save_optimizer_switch;
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
|
@@ -21442,6 +21442,8 @@ static void print_table_array(THD *thd,
|
|||||||
(curr->nested_join && !(curr->nested_join->used_tables &
|
(curr->nested_join && !(curr->nested_join->used_tables &
|
||||||
~eliminated_tables))))
|
~eliminated_tables))))
|
||||||
{
|
{
|
||||||
|
/* as of 5.5, print_join doesnt put eliminated elements into array */
|
||||||
|
DBUG_ASSERT(0);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -21467,6 +21469,21 @@ static void print_table_array(THD *thd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Check if the passed table is
|
||||||
|
- a base table which was eliminated, or
|
||||||
|
- a join nest which only contained eliminated tables (and so was eliminated,
|
||||||
|
too)
|
||||||
|
*/
|
||||||
|
|
||||||
|
static bool is_eliminated_table(table_map eliminated_tables, TABLE_LIST *tbl)
|
||||||
|
{
|
||||||
|
return eliminated_tables &&
|
||||||
|
((tbl->table && (tbl->table->map & eliminated_tables)) ||
|
||||||
|
(tbl->nested_join && !(tbl->nested_join->used_tables &
|
||||||
|
~eliminated_tables)));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Print joins from the FROM clause.
|
Print joins from the FROM clause.
|
||||||
|
|
||||||
@@ -21488,8 +21505,14 @@ static void print_join(THD *thd,
|
|||||||
uint non_const_tables= 0;
|
uint non_const_tables= 0;
|
||||||
|
|
||||||
for (TABLE_LIST *t= ti++; t ; t= ti++)
|
for (TABLE_LIST *t= ti++; t ; t= ti++)
|
||||||
if (!t->optimized_away)
|
{
|
||||||
|
/*
|
||||||
|
See comment in print_table_array() about the second part of the
|
||||||
|
condition
|
||||||
|
*/
|
||||||
|
if (!t->optimized_away && !is_eliminated_table(eliminated_tables, t))
|
||||||
non_const_tables++;
|
non_const_tables++;
|
||||||
|
}
|
||||||
if (!non_const_tables)
|
if (!non_const_tables)
|
||||||
{
|
{
|
||||||
str->append(STRING_WITH_LEN("dual"));
|
str->append(STRING_WITH_LEN("dual"));
|
||||||
@@ -21504,7 +21527,7 @@ static void print_join(THD *thd,
|
|||||||
TABLE_LIST *tmp, **t= table + (non_const_tables - 1);
|
TABLE_LIST *tmp, **t= table + (non_const_tables - 1);
|
||||||
while ((tmp= ti++))
|
while ((tmp= ti++))
|
||||||
{
|
{
|
||||||
if (tmp->optimized_away)
|
if (tmp->optimized_away || is_eliminated_table(eliminated_tables, tmp))
|
||||||
continue;
|
continue;
|
||||||
*t--= tmp;
|
*t--= tmp;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user