Commit graph

2 commits

Author SHA1 Message Date
Monty
7d1df207c4 MDEV-30373 Wrong result with range access
This issue was caused by the bug fix for
MDEV-30325 Wrong result upon range query using index condition

The bug could happen in the case of several overlapping key ranges
with OR
2023-01-11 18:12:40 +02:00
Monty
494acc1938 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.
2023-01-05 11:19:35 +02:00