summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorSergey Petrunya <psergey@askmonty.org>2012-02-21 01:08:22 +0400
committerSergey Petrunya <psergey@askmonty.org>2012-02-21 01:08:22 +0400
commit00995935628c9e865ee545422871363be75812b8 (patch)
tree1a7eae1b65138def45df8859be000ccd1fb82678 /sql
parent150f2385381082af6c7ea1dcad08ecc9f3417b7d (diff)
downloadmariadb-git-00995935628c9e865ee545422871363be75812b8.tar.gz
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.
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_select.cc27
1 files changed, 25 insertions, 2 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 5e483c2d359..9a085ec6314 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -21442,6 +21442,8 @@ static void print_table_array(THD *thd,
(curr->nested_join && !(curr->nested_join->used_tables &
~eliminated_tables))))
{
+ /* as of 5.5, print_join doesnt put eliminated elements into array */
+ DBUG_ASSERT(0);
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.
@@ -21488,8 +21505,14 @@ static void print_join(THD *thd,
uint non_const_tables= 0;
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++;
+ }
if (!non_const_tables)
{
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);
while ((tmp= ti++))
{
- if (tmp->optimized_away)
+ if (tmp->optimized_away || is_eliminated_table(eliminated_tables, tmp))
continue;
*t--= tmp;
}