• unknown's avatar
    Bug#21904 (parser problem when using IN with a double "(())") · a1e20e04
    unknown authored
    Before this fix, a IN predicate of the form: "IN (( subselect ))", with two
    parenthesis, would be evaluated as a single row subselect: if the subselect
    returns more that 1 row, the statement would fail.
    
    The SQL:2003 standard defines a special exception in the specification,
    and mandates that this particular form of IN predicate shall be equivalent
    to "IN ( subselect )", which involves a table subquery and works with more
    than 1 row.
    
    This fix implements "IN (( subselect ))", "IN ((( subselect )))" etc
    as per the SQL:2003 requirement.
    
    All the details related to the implementation of this change have been
    commented in the code, and the relevant sections of the SQL:2003 spec
    are given for reference, so they are not repeated here.
    
    Having access to the spec is a requirement to review in depth this patch.
    
    
    mysql-test/r/subselect.result:
      Implement IN predicate special exceptions with subselects.
    mysql-test/t/subselect.test:
      Implement IN predicate special exceptions with subselects.
    sql/item_subselect.cc:
      Implement IN predicate special exceptions with subselects.
    sql/item_subselect.h:
      Implement IN predicate special exceptions with subselects.
    sql/sql_yacc.yy:
      Implement IN predicate special exceptions with subselects, cleanup.
    a1e20e04
item_subselect.h 15.2 KB