• Sergei Petrunia's avatar
    MDEV-25636: Bug report: abortion in sql/sql_parse.cc:6294 · 3a525694
    Sergei Petrunia authored
    The asserion failure was caused by this query
    
      select /*id=1*/ from t1
      where
       col= ( select /*id=2*/ from ... where corr_cond1
              union
              select /*id=4*/ from ... where corr_cond2)
    
    Here,
    - select with id=2 was correlated due to corr_cond1.
    - select with id=4 was initially correlated due to corr_cond2, but then
      the optimizer optimized away the correlation, making the select with id=4
      uncorrelated.
    
    However, since select with id=2 remained correlated, the execution had to
    re-compute the whole UNION. When it tried to execute select with id=4, it
    hit an assertion  (join buffer already free'd).
    
    This is because select with id=4 has freed its execution structures after
    it has been executed once. The select is uncorrelated, so it did not expect
    it would need to be executed for the second time.
    
    Fixed this by adding this logic in
    st_select_lex::optimize_unflattened_subqueries():
    
      If a member of a UNION is correlated, mark all its members as
      correlated, so that they are prepared to be executed multiple times.
    3a525694
union_innodb.result 1.08 KB