Skip to content
  • Ole John Aske's avatar
    89d1cab3
    Fix for bug#16202425 INCORRECT LOGIC USED TO FIND OUTER JOINS IN AQP (ABSTRACT QUERY PLAN) · 89d1cab3
    Ole John Aske authored
    The AQP module contain the member function ::get_join_type('predecessor')
    which is intended to return whether 'this' table and its 'predecessor'
    table is related with an inner or outer join.
    
    We had implemented this logic by using the nested 'embedding' structures
    in the TABLE_LIST. As MySQL 5.6 seems to have extended the usage of the
    'embedding' to also be used as part of subquery optimization, this code
    is now broken. (And it might even have been broken prior to 5.6...)
    Currently this materializes as crashing RQG tests in our clone
    mysql-5.6-cluster which fails on 
      'DBUG_ASSERT(child_embedding->outer_join != 0);'.
    
    I assume this to be due to 5.6 extending the usage of 'embedding' to not
    only be used as part of inner/outer join nests.
    
    This fix reimplements ::get_join_type() to instead use the
    'first_inner' and 'last_inner' member fields to determine the
    join type between two tables. This seems to also more closely resembles
    how the join types are determined internally in the optimizer.
    89d1cab3
    Fix for bug#16202425 INCORRECT LOGIC USED TO FIND OUTER JOINS IN AQP (ABSTRACT QUERY PLAN)
    Ole John Aske authored
    The AQP module contain the member function ::get_join_type('predecessor')
    which is intended to return whether 'this' table and its 'predecessor'
    table is related with an inner or outer join.
    
    We had implemented this logic by using the nested 'embedding' structures
    in the TABLE_LIST. As MySQL 5.6 seems to have extended the usage of the
    'embedding' to also be used as part of subquery optimization, this code
    is now broken. (And it might even have been broken prior to 5.6...)
    Currently this materializes as crashing RQG tests in our clone
    mysql-5.6-cluster which fails on 
      'DBUG_ASSERT(child_embedding->outer_join != 0);'.
    
    I assume this to be due to 5.6 extending the usage of 'embedding' to not
    only be used as part of inner/outer join nests.
    
    This fix reimplements ::get_join_type() to instead use the
    'first_inner' and 'last_inner' member fields to determine the
    join type between two tables. This seems to also more closely resembles
    how the join types are determined internally in the optimizer.
Loading