• unknown's avatar
    Fix LP BUG#718763 · adce16f9
    unknown authored
    Analysis:
    The reason for the crash was that the inner subquery was executed
    via a scan on a final temporary table applied after all other
    operations. This final operation is implemented by changing the
    contents of the JOIN object of the subquery to represent a table
    scan over the temp table. At the same time query optimization of
    the outer subquery required evaluation of the inner subquery, which
    happened before the actual EXPLAIN. The evaluation left the JOIN
    object of the inner subquery in the changed state, where it represented
    a table scan over a temp table, and EXPLAIN crashed because the temp
    table is not associated with any table reference (TABLE_LIST object).
    The reason the JOIN was not restored was because its saving/restoration
    was controlled by the join->select_lex->uncacheable flag, which was
    not set in the case of materialization.
    
    Solution:
    In the methods Item_in_subselect::[single | row]_value_transformer() set:
        select_lex->uncacheable|= UNCACHEABLE_EXPLAIN;
    In addition, for symmetry, change:
        master_unit->uncacheable|= UNCACHEABLE_EXPLAIN;
    instead of UNCACHEABLE_DEPENDENT because if a subquery was not
    dependent initially, the changed methods do not change this
    fact. The subquery may later become correlated if it is transformed
    to an EXISTS query, but it may stay uncorrelated if executed via
    materialization.
    adce16f9
subselect4.test 18.3 KB