• Rex's avatar
    MDEV-31279 Crash when lateral derived is guaranteed to return no rows · b4712242
    Rex authored
    Consider this query
    SELECT t1.* FROM t1, (SELECT t2.b FROM t2 WHERE NOT EXISTS
    (SELECT 1 FROM t3) GROUP BY b) sq where sq.b = t1.a;
    
    If SELECT 1 FROM t3 is expensive, for example t3 has >
    thd->variables.expensive_subquery_limit, first evaluation is deferred to
    mysql_derived_fill().  There it is noted that, in the above case
     NOT EXISTS (SELECT 1 FROM t3) is constant and false.
    
    This causes the join variable zero_result_cause to be set to
    "Impossible WHERE noticed after reading const tables" and the handler
    for this join is never "opened" via handler::ha_open.
    
    When mysql_derived_fill() is called for the next group of results, this
    unopened handler is not taken into account.
    
    reviewed by Igor Babaev (igor@mariadb.com)
    b4712242
sql_derived.cc 52.8 KB