mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
mysql-5.1-bugteam->mysql-trunk-merge
This commit is contained in:
@ -2745,31 +2745,53 @@ make_join_statistics(JOIN *join, TABLE_LIST *tables_arg, COND *conds,
|
||||
/*
|
||||
Build transitive closure for relation 'to be dependent on'.
|
||||
This will speed up the plan search for many cases with outer joins,
|
||||
as well as allow us to catch illegal cross references/
|
||||
as well as allow us to catch illegal cross references.
|
||||
Warshall's algorithm is used to build the transitive closure.
|
||||
As we use bitmaps to represent the relation the complexity
|
||||
of the algorithm is O((number of tables)^2).
|
||||
As we may restart the outer loop upto 'table_count' times, the
|
||||
complexity of the algorithm is O((number of tables)^3).
|
||||
However, most of the iterations will be shortcircuited when
|
||||
there are no pedendencies to propogate.
|
||||
*/
|
||||
for (i= 0, s= stat ; i < table_count ; i++, s++)
|
||||
for (i= 0 ; i < table_count ; i++)
|
||||
{
|
||||
for (uint j= 0 ; j < table_count ; j++)
|
||||
uint j;
|
||||
table= stat[i].table;
|
||||
|
||||
if (!table->reginfo.join_tab->dependent)
|
||||
continue;
|
||||
|
||||
/* Add my dependencies to other tables depending on me */
|
||||
for (j= 0, s= stat ; j < table_count ; j++, s++)
|
||||
{
|
||||
table= stat[j].table;
|
||||
if (s->dependent & table->map)
|
||||
{
|
||||
table_map was_dependent= s->dependent;
|
||||
s->dependent |= table->reginfo.join_tab->dependent;
|
||||
/*
|
||||
If we change dependencies for a table we already have
|
||||
processed: Redo dependency propagation from this table.
|
||||
*/
|
||||
if (i > j && s->dependent != was_dependent)
|
||||
{
|
||||
i = j-1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (outer_join & s->table->map)
|
||||
s->table->maybe_null= 1;
|
||||
}
|
||||
/* Catch illegal cross references for outer joins */
|
||||
|
||||
for (i= 0, s= stat ; i < table_count ; i++, s++)
|
||||
{
|
||||
/* Catch illegal cross references for outer joins */
|
||||
if (s->dependent & s->table->map)
|
||||
{
|
||||
join->tables=0; // Don't use join->table
|
||||
my_message(ER_WRONG_OUTER_JOIN, ER(ER_WRONG_OUTER_JOIN), MYF(0));
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (outer_join & s->table->map)
|
||||
s->table->maybe_null= 1;
|
||||
s->key_dependent= s->dependent;
|
||||
}
|
||||
}
|
||||
@ -8822,6 +8844,7 @@ simplify_joins(JOIN *join, List<TABLE_LIST> *join_list, COND *conds, bool top)
|
||||
NESTED_JOIN *nested_join;
|
||||
TABLE_LIST *prev_table= 0;
|
||||
List_iterator<TABLE_LIST> li(*join_list);
|
||||
bool straight_join= test(join->select_options & SELECT_STRAIGHT_JOIN);
|
||||
DBUG_ENTER("simplify_joins");
|
||||
|
||||
/*
|
||||
@ -8932,7 +8955,7 @@ simplify_joins(JOIN *join, List<TABLE_LIST> *join_list, COND *conds, bool top)
|
||||
if (prev_table)
|
||||
{
|
||||
/* The order of tables is reverse: prev_table follows table */
|
||||
if (prev_table->straight)
|
||||
if (prev_table->straight || straight_join)
|
||||
prev_table->dep_tables|= used_tables;
|
||||
if (prev_table->on_expr)
|
||||
{
|
||||
|
Reference in New Issue
Block a user