• Martin Hansson's avatar
    Bug#51070: Query with a NOT IN subquery predicate returns a wrong result set · 0f52cbdb
    Martin Hansson authored
          
    The EXISTS transformation has additional switches to catch the known corner
    cases that appear when transforming an IN predicate into EXISTS. Guarded
    conditions are used which are deactivated when a NULL value is seen in the
    outer expression's row. When the inner query block supplies NULL values,
    however, they are filtered out because no distinction is made between the
    guarded conditions; guarded NOT x IS NULL conditions in the HAVING clause that
    filter out NULL values cannot be de-activated in isolation from those that
    match values or from the outer expression or NULL's.
    
    The above problem is handled by making the guarded conditions remember whether
    they have rejected a NULL value or not, and index access methods are taking
    this into account as well. 
    
    The bug consisted of 
    
    1) Not resetting the property for every nested loop iteration on the inner
       query's result.
    
    2) Not propagating the NULL result properly from inner query to IN optimizer.
    
    3) A hack that may or may not have been needed at some point. According to a
       comment it was aimed to fix #2 by returning NULL when FALSE was actually
       the result. This caused failures when #2 was properly fixed. The hack is
       now removed.
    
    The fix resolves all three points.
    0f52cbdb
subselect4.result 5.36 KB