• unknown's avatar
    Fixed LP BUG#675981 · 0a31c4ff
    unknown authored
    Cause:
    The optimize() phase for the subquery selected to use join buffering via setting
    JOIN_TAB::next_select= sub_select_cache in make_join_readinfo, however, the call
    to check_join_cache_usage() from make_join_readinfo didn't create the corresponding
    JOIN_CACHE_BNL object because of the condition:
        if ((options & SELECT_DESCRIBE) ||
            (((tab->cache= new JOIN_CACHE_BNL(join, tab, prev_cache))) &&
             !tab->cache->init()))
    Since EXPLAIN for subqueries runs regular execution, the constant predicates that
    were delayed to be evaluated at the exec() phase, were evaluated during EXPLAIN.
    As a result the outer JOIN::exec called JOIN::exec for the subquery, while the
    subquery execution plan was no properly created, which resulted in an failed ASSERT.
    
    Fix:
    The patch blocks evaluation of constant expensive conditions during EXPLAIN. Notice
    that these conditions are "constant" with respect to the outer query, thus in
    general they could be arbitrarily expensive, which may result in very slow EXPLAINs.
    0a31c4ff
subselect4.test 12 KB