• Igor Babaev's avatar
    Fixed LP bug #939009. · 841a74a4
    Igor Babaev authored
    The result of materialization of the right part of an IN subquery predicate
    is placed into a temporary table. Each row of the materialized table is
    distinct. A unique key over all fields of the temporary table is defined and
    created. It allows to perform key look-ups into the table.
    The table created for a materialized subquery can be accessed by key as
    any other table. The function best_access-path search for the best access
    to join a table to a given partial join. With some where conditions this
    function considers a possibility of a ref_or_null access. If such access
    employs the unique key on the temporary table then when estimating
    the cost this access the function tries to use the array rec_per_key. Yet,
    such array is not built for this unique key. This causes a crash of the server.
    
    Rows returned by the subquery that contain nulls don't have to be placed
    into temporary table, as they cannot be match any row produced by the
    left part of the subquery predicate. So all fields of the temporary table
    can be defined as non-nullable. In this case any ref_or_null access
    to the temporary table does not make any sense and it does not make sense
    to estimate such an access.
    
    The fix makes sure that the temporary table for a materialized IN subquery
    is defined with columns that are all non-nullable. The also ensures that 
    any row with nulls returned by the subquery is not placed into the
    temporary table.  
    841a74a4
sql_class.cc 126 KB