1
0
mirror of https://github.com/MariaDB/server.git synced 2025-09-13 13:47:59 +03:00
Commit Graph

3 Commits

Author SHA1 Message Date
Monty
fe1f4ca8ce MDEV-30486 Table is not eliminated in bb-11.0
Some tables where not eliminated when they could have been.
This was caused because HA_KEYREAD_ONLY is not set anymore for InnoDB
clustered index and the elimination code was depending on
field->part_of_key_not_clustered which was not set if HA_KEYREAD_ONLY
is not present.

Fixed by moving out field->part_of_key and
field->part_of_key_not_clustered from under HA_KEYREAD_ONLY (which
they should never have been part of).

Other things:
- Fixed a bug in make_join_select() that caused range to be used when
  there where elminiated or constant tables present (Caused wrong
  change of plans in join_outer_innodb.test). This also affected
  show_explain.test and subselct_sj_mat.test where wrong 'range's where
  replaced with index scans.

Reviewer: Sergei Petrunia <sergey@mariadb.com>
2023-02-10 12:59:37 +02:00
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