• Gleb Shchepa's avatar
    Bug #39069: <row constructor> IN <table-subquery> seriously · 334e249f
    Gleb Shchepa authored
                messed up
    
    "ROW(...) IN (SELECT ... FROM DUAL)" always returned TRUE.
    
    Item_in_subselect::row_value_transformer rewrites "ROW(...)
    IN SELECT" conditions into the "EXISTS (SELECT ... HAVING ...)"
    form.
    For a subquery from the DUAL pseudotable resulting HAVING
    condition is an expression on constant values, so further
    transformation with optimize_cond() eliminates this HAVING
    condition and resets JOIN::having to NULL.
    Then JOIN::exec treated that NULL as an always-true-HAVING
    and that caused a bug.
    
    To distinguish an optimized out "HAVING TRUE" clause from
    "HAVING FALSE" we already have the JOIN::having_value flag.
    However, JOIN::exec() ignored JOIN::having_value as described
    above as if it always set to COND_TRUE.
    
    The JOIN::exec method has been modified to take into account
    the value of the JOIN::having_value field.
    
    
    mysql-test/r/subselect3.result:
      Added test case for bug #39069.
    mysql-test/t/subselect3.test:
      Added test case for bug #39069.
    sql/sql_select.cc:
      Bug #39069: <row constructor> IN <table-subquery> seriously
                  messed up
      
      The JOIN::exec method has been modified to take into account
      the value of the JOIN::having_value field.
    334e249f
sql_select.cc 502 KB