• Monty's avatar
    MDEV-30325 Wrong result upon range query using index condition wrong result... · 494acc19
    Monty authored
    MDEV-30325 Wrong result upon range query using index condition wrong result upon range query using index condition
    
    This was caused by a bug in key_or() when SEL_ARG* key1 has been cloned
    and is overlapping with SEL_ARG *key2
    
    Cloning of SEL_ARG's happens only in very special cases, which is why this
    bug has remained undetected for years.
    
    It happend in the following query:
    
    SELECT COUNT(*) FROM lineitem force index
    (i_l_orderkey_quantity,i_l_shipdate) WHERE
    l_shipdate < '1994-01-01' AND l_orderkey < 800 OR
    l_quantity > 3 AND l_orderkey NOT IN ( 157, 1444 );
    
    Because there are two different indexes that can be used and the code for
    IN causes a 'tree_or', which causes all SEL_ARG's to be cloned.
    
    Other things:
    - While checking the code, I found a bug in SEL_ARG::SEL_ARG(SEL_ARG &arg)
     - This was incrementing next_key_part->use_count as part of creating a
       copy of an existing SEL_ARG.
       This is however not enough as the 'reverse operation' when the copy is
       not needed is 'key2_cpy.increment_use_count(-1)', which does something
       completely different.
       Fixed by calling increment_use_count(1) in SEL_ARG::SEL_ARG.
    494acc19
opt_range.cc 531 KB