Commit ce191026 authored by bell@sanja.is.com.ua's avatar bell@sanja.is.com.ua

fixed join_nested test independence of environment

spaces at line end in fresh definitions removed
fixed printing of nested joins (BUG#4352)
parent 24a8dc23
This diff is collapsed.
--disable_warnings
DROP TABLE IF EXISTS t0,t1,t2,t3,t4,t5,t6,t7,t8,t9; DROP TABLE IF EXISTS t0,t1,t2,t3,t4,t5,t6,t7,t8,t9;
--enable_warnings
CREATE TABLE t0 (a int, b int, c int); CREATE TABLE t0 (a int, b int, c int);
CREATE TABLE t1 (a int, b int, c int); CREATE TABLE t1 (a int, b int, c int);
...@@ -49,7 +50,7 @@ SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b ...@@ -49,7 +50,7 @@ SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
(t3, t4) (t3, t4)
ON t3.a=1 AND t2.b=t4.b; ON t3.a=1 AND t2.b=t4.b;
EXPLAIN EXPLAIN EXTENDED
SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
FROM t2 FROM t2
LEFT JOIN LEFT JOIN
...@@ -83,7 +84,7 @@ SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,t5.a,t5.b ...@@ -83,7 +84,7 @@ SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,t5.a,t5.b
(t3, t4, t5) (t3, t4, t5)
ON t2.b=t4.b; ON t2.b=t4.b;
EXPLAIN EXPLAIN EXTENDED
SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,t5.a,t5.b SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,t5.a,t5.b
FROM t2 FROM t2
LEFT JOIN LEFT JOIN
...@@ -98,7 +99,7 @@ SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,t5.a,t5.b ...@@ -98,7 +99,7 @@ SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,t5.a,t5.b
ON t2.b=t4.b ON t2.b=t4.b
WHERE t3.a>1 OR t3.c IS NULL; WHERE t3.a>1 OR t3.c IS NULL;
EXPLAIN EXPLAIN EXTENDED
SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,t5.a,t5.b SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,t5.a,t5.b
FROM t2 FROM t2
LEFT JOIN LEFT JOIN
...@@ -127,7 +128,7 @@ SELECT t6.a,t6.b,t7.a,t7.b ...@@ -127,7 +128,7 @@ SELECT t6.a,t6.b,t7.a,t7.b
SELECT t8.a,t8.b SELECT t8.a,t8.b
FROM t8; FROM t8;
EXPLAIN EXPLAIN EXTENDED
SELECT t6.a,t6.b,t7.a,t7.b,t8.a,t8.b SELECT t6.a,t6.b,t7.a,t7.b,t8.a,t8.b
FROM t6, FROM t6,
t7 t7
...@@ -267,7 +268,7 @@ SELECT t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b, ...@@ -267,7 +268,7 @@ SELECT t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
SELECT t0.a,t0.b SELECT t0.a,t0.b
FROM t0; FROM t0;
EXPLAIN EXPLAIN EXTENDED
SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b, SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b
FROM t0,t1 FROM t0,t1
...@@ -322,7 +323,7 @@ SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b, ...@@ -322,7 +323,7 @@ SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
t0.b=t1.b AND t0.b=t1.b AND
(t2.a >= 4 OR t2.c IS NULL); (t2.a >= 4 OR t2.c IS NULL);
EXPLAIN EXPLAIN EXTENDED
SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b, SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b
FROM t0,t1 FROM t0,t1
...@@ -459,7 +460,7 @@ SELECT t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b ...@@ -459,7 +460,7 @@ SELECT t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
CREATE INDEX idx_b ON t2(b); CREATE INDEX idx_b ON t2(b);
EXPLAIN EXPLAIN EXTENDED
SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
FROM t3,t4 FROM t3,t4
LEFT JOIN LEFT JOIN
...@@ -472,7 +473,7 @@ SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b ...@@ -472,7 +473,7 @@ SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
(t1,t2) (t1,t2)
ON t3.a=1 AND t3.b=t2.b AND t2.b=t4.b; ON t3.a=1 AND t3.b=t2.b AND t2.b=t4.b;
EXPLAIN EXPLAIN EXTENDED
SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b, SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b
FROM t0,t1 FROM t0,t1
...@@ -512,7 +513,7 @@ SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b, ...@@ -512,7 +513,7 @@ SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
CREATE INDEX idx_b ON t4(b); CREATE INDEX idx_b ON t4(b);
CREATE INDEX idx_b ON t5(b); CREATE INDEX idx_b ON t5(b);
EXPLAIN EXPLAIN EXTENDED
SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b, SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b
FROM t0,t1 FROM t0,t1
...@@ -551,7 +552,7 @@ SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b, ...@@ -551,7 +552,7 @@ SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
CREATE INDEX idx_b ON t8(b); CREATE INDEX idx_b ON t8(b);
EXPLAIN EXPLAIN EXTENDED
SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b, SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b
FROM t0,t1 FROM t0,t1
...@@ -591,7 +592,7 @@ SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b, ...@@ -591,7 +592,7 @@ SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
CREATE INDEX idx_b ON t1(b); CREATE INDEX idx_b ON t1(b);
CREATE INDEX idx_a ON t0(a); CREATE INDEX idx_a ON t0(a);
EXPLAIN EXPLAIN EXTENDED
SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b, SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b
FROM t0,t1 FROM t0,t1
......
...@@ -417,7 +417,7 @@ public: ...@@ -417,7 +417,7 @@ public:
List<Item_func_match> ftfunc_list_alloc; List<Item_func_match> ftfunc_list_alloc;
JOIN *join; /* after JOIN::prepare it is pointer to corresponding JOIN */ JOIN *join; /* after JOIN::prepare it is pointer to corresponding JOIN */
List<TABLE_LIST> top_join_list; /* join list of the top level */ List<TABLE_LIST> top_join_list; /* join list of the top level */
List<TABLE_LIST> *join_list; /* list for the currently parsed join */ List<TABLE_LIST> *join_list; /* list for the currently parsed join */
TABLE_LIST *embedding; /* table embedding to the above list */ TABLE_LIST *embedding; /* table embedding to the above list */
const char *type; /* type of select for EXPLAIN */ const char *type; /* type of select for EXPLAIN */
......
...@@ -11178,6 +11178,92 @@ int mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result) ...@@ -11178,6 +11178,92 @@ int mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result)
} }
/*
Print joins from the FROM clause
SYNOPSIS
print_join()
thd thread handler
str string where table should bbe printed
tables list of tables in join
*/
static void print_join(THD *thd, String *str, List<TABLE_LIST> *tables)
{
/* List is reversed => we should reverse it before using */
List_iterator_fast<TABLE_LIST> ti(*tables);
TABLE_LIST **table= (TABLE_LIST **)thd->alloc(sizeof(TABLE_LIST*) *
tables->elements);
if (table == 0)
return; // out of memory
for (TABLE_LIST **t= table + (tables->elements - 1); t >= table; t--)
*t= ti++;
DBUG_ASSERT(tables->elements >= 1);
TABLE_LIST *prev= *table;
prev->print(thd, str);
TABLE_LIST **end= table + tables->elements;
for(TABLE_LIST **tbl= table + 1; tbl < end; tbl++)
{
TABLE_LIST *curr= *tbl;
if (prev->outer_join & JOIN_TYPE_RIGHT)
str->append(" right join ", 12);
else if (curr->outer_join & JOIN_TYPE_LEFT)
str->append(" left join ", 11);
else if (curr->straight)
str->append(" straight_join ", 15);
else
str->append(" join ", 6);
curr->print(thd, str);
if (curr->on_expr)
{
str->append(" on(", 4);
curr->on_expr->print(str);
str->append(')');
}
prev= curr;
}
}
/*
Print table as it should be in join list
SYNOPSIS
st_table_list::print();
str string where table should bbe printed
*/
void st_table_list::print(THD *thd, String *str)
{
if (nested_join)
{
str->append('(');
print_join(thd, str, &nested_join->join_list);
str->append(')');
}
else if (derived)
{
str->append('(');
derived->print(str);
str->append(") ", 2);
str->append(alias);
}
else
{
str->append(db);
str->append('.');
str->append(real_name);
if (my_strcasecmp(table_alias_charset, real_name, alias))
{
str->append(' ');
str->append(alias);
}
}
}
void st_select_lex::print(THD *thd, String *str) void st_select_lex::print(THD *thd, String *str)
{ {
if (!thd) if (!thd)
...@@ -11226,92 +11312,8 @@ void st_select_lex::print(THD *thd, String *str) ...@@ -11226,92 +11312,8 @@ void st_select_lex::print(THD *thd, String *str)
if (table_list.elements) if (table_list.elements)
{ {
str->append(" from ", 6); str->append(" from ", 6);
for (TABLE_LIST *table= (TABLE_LIST *) table_list.first; /* go through join tree */
table; print_join(thd, str, &top_join_list);
table= table->next)
{
TABLE_LIST *embedded=table;
TABLE_LIST *embedding= table->embedding;
while (embedding)
{
TABLE_LIST *next;
NESTED_JOIN *nested_join= table->embedding->nested_join;
List_iterator_fast<TABLE_LIST> it(nested_join->join_list);
TABLE_LIST *tab= it++;
while ((next= it++))
tab= next;
if (tab != embedded)
break;
str->append('(');
if (embedded->outer_join & JOIN_TYPE_RIGHT)
str->append(" right join ", 12);
else if (embedded->outer_join & JOIN_TYPE_LEFT)
str->append(" left join ", 11);
else if (embedded->straight)
str->append(" straight_join ", 15);
else
str->append(" join ", 6);
embedded= embedding;
embedding= embedding->embedding;
}
if (table->derived)
{
str->append('(');
table->derived->print(str);
str->append(") ");
str->append(table->alias);
}
else
{
str->append(table->db);
str->append('.');
str->append(table->real_name);
if (my_strcasecmp(table_alias_charset, table->real_name, table->alias))
{
str->append(' ');
str->append(table->alias);
}
}
if (table->on_expr)
{
str->append(" on(", 4);
table->on_expr->print(str);
str->append(')');
}
TABLE_LIST *next_table;
if ((next_table= table->next))
{
if (next_table->outer_join & JOIN_TYPE_RIGHT)
str->append(" right join ", 12);
else if (next_table->outer_join & JOIN_TYPE_LEFT)
str->append(" left join ", 11);
else if (next_table->straight)
str->append(" straight_join ", 15);
else
str->append(" join ", 6);
}
embedded=table;
embedding= table->embedding;
while (embedding)
{
NESTED_JOIN *nested_join= table->embedding->nested_join;
if (nested_join->join_list.head() != embedded)
break;
str->append(')');
if (embedding->on_expr)
{
str->append(" on(", 4);
embedding->on_expr->print(str);
str->append(')');
}
embedded= embedding;
embedding= embedding->embedding;
}
}
} }
// Where // Where
......
...@@ -173,11 +173,11 @@ typedef struct st_table_list ...@@ -173,11 +173,11 @@ typedef struct st_table_list
{ {
struct st_table_list *next; struct st_table_list *next;
char *db, *alias, *real_name; char *db, *alias, *real_name;
char *option; /* Used by cache index */ char *option; /* Used by cache index */
Item *on_expr; /* Used with outer join */ Item *on_expr; /* Used with outer join */
struct st_table_list *natural_join; /* natural join on this table*/ struct st_table_list *natural_join; /* natural join on this table*/
/* ... join ... USE INDEX ... IGNORE INDEX */ /* ... join ... USE INDEX ... IGNORE INDEX */
List<String> *use_index, *ignore_index; List<String> *use_index, *ignore_index;
TABLE *table; /* opened table */ TABLE *table; /* opened table */
st_table_list *table_list; /* pointer to node of list of all tables */ st_table_list *table_list; /* pointer to node of list of all tables */
class st_select_lex_unit *derived; /* SELECT_LEX_UNIT of derived table */ class st_select_lex_unit *derived; /* SELECT_LEX_UNIT of derived table */
...@@ -191,24 +191,26 @@ typedef struct st_table_list ...@@ -191,24 +191,26 @@ typedef struct st_table_list
bool force_index; /* prefer index over table scan */ bool force_index; /* prefer index over table scan */
bool ignore_leaves; /* preload only non-leaf nodes */ bool ignore_leaves; /* preload only non-leaf nodes */
table_map dep_tables; /* tables the table depends on */ table_map dep_tables; /* tables the table depends on */
table_map on_expr_dep_tables; /* tables on expression depends on */ table_map on_expr_dep_tables; /* tables on expression depends on */
struct st_nested_join *nested_join; /* if the element is a nested join */ struct st_nested_join *nested_join; /* if the element is a nested join */
st_table_list *embedding; /* nested join containing the table */ st_table_list *embedding; /* nested join containing the table */
List<struct st_table_list> *join_list;/* join list the table belongs to */ List<struct st_table_list> *join_list;/* join list the table belongs to */
bool cacheable_table; /* stop PS caching */ bool cacheable_table; /* stop PS caching */
/* used in multi-upd privelege check */ /* used in multi-upd privelege check */
bool table_in_update_from_clause; bool table_in_update_from_clause;
void print(THD *thd, String *str);
} TABLE_LIST; } TABLE_LIST;
typedef struct st_nested_join typedef struct st_nested_join
{ {
List<TABLE_LIST> join_list; /* list of elements in the nested join */ List<TABLE_LIST> join_list; /* list of elements in the nested join */
table_map used_tables; /* bitmap of tables in the nested join */ table_map used_tables; /* bitmap of tables in the nested join */
table_map not_null_tables; /* tables that rejects nulls */ table_map not_null_tables; /* tables that rejects nulls */
struct st_join_table *first_nested;/* the first nested table in the plan */ struct st_join_table *first_nested;/* the first nested table in the plan */
uint counter; /* to count tables in the nested join */ uint counter; /* to count tables in the nested join */
} NESTED_JOIN; } NESTED_JOIN;
typedef struct st_changed_table_list typedef struct st_changed_table_list
{ {
struct st_changed_table_list *next; struct st_changed_table_list *next;
......
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