• igor@rurik.mysql.com's avatar
    subselect.result, subselect.test: · d3fa2453
    igor@rurik.mysql.com authored
      Added test cases for bug #7351.
    item_cmpfunc.cc:
      Fixed bug #7351: incorrect result for a query with a
      subquery returning empty set.
      If in the predicate v IN (SELECT a FROM t WHERE cond)
      v is null, then the result of the predicate is either
      INKNOWN or FALSE. It is FALSE if the subquery returns
      an empty set.
    item_subselect.cc:
      Fixed bug #7351: incorrect result for a query with a
      subquery returning empty set.
      The problem was due to not a quite legal transformation
      for 'IN' subqueries. A subquery containing a predicate
      of the form
      v IN (SELECT a FROM t WHERE cond)
      was transformed into
      EXISTS(SELECT a FROM t WHERE cond AND (a=v OR a IS NULL)).
      Yet, this transformation is valid only if v is not null.
      If v is null, then, in the case when
      (SELECT a FROM t WHERE cond) returns an empty set the value
      of the predicate is FALSE, otherwise the result of the
      predicate is INKNOWN.
      The fix resolves this problem by changing the result
      of the transformation to
      EXISTS(SELECT a FROM t WHERE cond AND (v IS NULL OR (a=v OR a IS NULL)))
      in the case when v is nullable.
      The new transformation prevents applying the lookup
      optimization for IN subqueries. To make it still
      applicable we have to introduce guarded access methods.
    d3fa2453
item_cmpfunc.cc 63.5 KB