• Igor Babaev's avatar
    Fixed bug mdev-4172. · ed7671d5
    Igor Babaev authored
    This bug in the legacy code could manifest itself in queries with
    semi-join materialized subqueries.
    When a subquery is materialized all conditions that are imposed
    only on the columns belonging to the tables from the subquery 
    are taken into account.The code responsible for subquery optimizations
    that employes subquery materialization  makes sure to remove these
    conditions from the WHERE conditions of the query obtained after
    it has transformed the original query into a query with a semi-join.
    If the condition to be removed is an equality condition it could
    be added to ON expressions and/or conditions from disjunctive branches
    (parts of OR conditions) in an attempt to generate better access keys
    to the tables of the query. Such equalities are supposed to be removed
    later from all the formulas where they have been added to.
    However, erroneously, this was not done in some cases when an ON
    expression and/or a disjunctive part of the OR condition could
    be converted into one multiple equality. As a result some equality
    predicates over columns belonging to the tables of the materialized
    subquery remained in the ON condition and/or the a disjunctive 
    part of the OR condition, and the excuter later, when trying to
    evaluate them, returned wrong answers as the values of the fields
    from these equalities were not valid.  
    This happened because any standalone multiple equality (a multiple
    equality that are not ANDed with any other predicates) lacked
    the information about equality predicates inherited from upper
    levels (in particular, inherited from the WHERE condition).
    The fix adds a reference to such information to any standalone
    multiple equality. 
    ed7671d5
item_cmpfunc.cc 153 KB