• mithun's avatar
    Bug #18167356: EXPLAIN W/ EXISTS(SELECT* UNION SELECT*) · 3d6d85b4
    mithun authored
                   WHERE ONE OF SELECT* IS DISTINCT FAILS.
    ISSUE:
    ------
    There are 2 issues related to explain union.
    1. If we have subquery with union of selects. And, one of
       the select need temp table to materialize its results
       then it will replace its query structure with a simple
       select from temporary table. Trying to display new
       internal temporary table scan resulted in crash. But to
       display the query plan, we should save the original
       query structure.
    2. Multiple execution of prepared explain statement which
       have union of subqueries resulted in crash. If we have
       constant subqueries, fake select used in union operation
       will be evaluated once before using it for explain.
       During first execution we have set fake select options to
       SELECT_DESCRIBE, but did not reset after the explain.
       Hence during next execution of prepared statement during
       first time evaluation of fake select we had our select
       options as SELECT_DESCRIBE this resulted in improperly
       initialized data structures and crash.
    
    SOLUTION:
    ---------
    1. If called by explain now we save the original query
       structure. And this will be used for displaying.
    2. Reset the fake select options after it is called for
       explain of union.
    
    sql/sql_select.cc:
      Reset the fake select options after it is called for explain of union
    sql/sql_union.cc:
      If called by explain but not from select_describe and we
      need a temp table, then we create a temp join to preserve
      original query structure.
    3d6d85b4
sql_select.cc 577 KB