~maria-captains/maria/mysql-6.0-testing2

Viewing all changes in revision 2820.

  • Committer: Sergey Petrunya
  • Date: 2009-07-29 16:18:49 UTC
  • Revision ID: psergey@askmonty.org-20090729161849-ynumr03ety244ueu
Apply Evgen's fix: 

Bug#45174: Incorrectly applied equality propagation caused wrong result
on a query with a materialized semi-join.

Equality propagation is done after query execution plan is chosen. It
substitutes fields from tables being retrieved later for fields from tables
being retrieved earlier. Materialized semi-joins are exception to this rule.
For field which belongs to a table within a materialized semi-join, we can
only pick fields from the same semi-join.

Example: suppose we have a join order:

   ot1 ot2  SJ-Mat(it1  it2  it3)  ot3

and equality ot2.col = it1.col = it2.col
If we're looking for best substitute for 'it2.col', we should pick it1.col
and not ot2.col.

For a field that is not in a materialized semi-join we must pick a field
that's not embedded in a materialized semi-join.

Example: suppose we have a join order:

    SJ-Mat(it1  it2)  ot1  ot2

and equality ot2.col = ot1.col = it2.col
If we're looking for best substitute for 'ot2.col', we should pick ot1.col
and not it2.col, because when we run a join between ot1 and ot2
execution of SJ-Mat(...) has already finished and we can't rely on the value
of it*.*.

Now the Item_equal::get_first function accepts as a parameter a field being
substituted and checks whether it belongs to a materialized semi-join.
Depending on the check result a field to substitute for or  NULL is returned.

The is_sj_materialization_strategy method is added to the JOIN_TAB class to
check whether JOIN_TAB belongs to a materialized semi-join.

expand all expand all

Show diffs side-by-side

added added

removed removed

Lines of Context: