• Igor Babaev's avatar
    Fixed bug mdev-4177 · d434d79a
    Igor Babaev authored
    The function remove_eq_cond removes the parts of a disjunction
    for which it has been proved that they are always true. In the
    result of this removal the disjunction may be converted into a 
    formula without OR that must be merged into the the AND formula
    that contains the disjunction.
    The merging of two AND conditions must take into account the
    multiple equalities that may be part of each of them.
    These multiple equality must be merged and become part of the
    and object built as the result of the merge of the AND conditions.
    Erroneously the function remove_eq_cond lacked the code that 
    would merge multiple equalities of the merged AND conditions.
    This could lead to confusing situations when at the same AND 
    level there were two multiple equalities with common members
    and the list of equal items contained only some of these 
    multiple equalities.
    This, in its turn, could lead to an incorrect work of the
    function substitute_for_best_equal_field when it tried to optimize
    ref accesses. This resulted in forming invalid TABLE_REF objects
    that were used to build look-up keys when materialized subqueries
    were exploited.
       
    d434d79a
item_cmpfunc.cc 155 KB