diff options
author | Monty <monty@mariadb.org> | 2022-06-15 23:49:09 +0300 |
---|---|---|
committer | Monty <monty@mariadb.org> | 2022-06-16 00:12:11 +0300 |
commit | 674842bee0a564a2d94e99c4e1319a716aa10aa9 (patch) | |
tree | dc1371820ac7210ef63cfe43a56723bf3d7e6641 /sql/sql_select.cc | |
parent | 27309fc6b0833d7a74baab4afaeef1dcb14307c8 (diff) | |
download | mariadb-git-674842bee0a564a2d94e99c4e1319a716aa10aa9.tar.gz |
MDEV-28858 Wrong result with table elimination combined with not_null_range_scan
The bug was that build_notnull_conds_for_range_scans() did not take into
account the join_tab is not yet sorted with constant tables first.
Fixed the bug by testing explicitely if a table is a const table.
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r-- | sql/sql_select.cc | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc index b4e3a547773..cedf640e4ad 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -29573,11 +29573,12 @@ bool build_notnull_conds_for_range_scans(JOIN *join, Item *cond, DBUG_ENTER("build_notnull_conds_for_range_scans"); - for (JOIN_TAB *s= join->join_tab + join->const_tables ; + for (JOIN_TAB *s= join->join_tab; s < join->join_tab + join->table_count ; s++) { /* Clear all needed bitmaps to mark found fields */ - if (allowed & s->table->map) + if ((allowed & s->table->map) && + !(s->table->map && join->const_table_map)) bitmap_clear_all(&s->table->tmp_set); } @@ -29592,17 +29593,18 @@ bool build_notnull_conds_for_range_scans(JOIN *join, Item *cond, For each table t from 'allowed' build a conjunction of NOT NULL predicates constructed for all found fields if they are included in some indexes. If the construction of the conjunction succeeds attach the formula to - t->table->notnull_cond. The condition will be used to look for complementary - range scans. + t->table->notnull_cond. The condition will be used to look for + complementary range scans. */ - for (JOIN_TAB *s= join->join_tab + join->const_tables ; + for (JOIN_TAB *s= join->join_tab ; s < join->join_tab + join->table_count ; s++) { TABLE *tab= s->table; List<Item> notnull_list; Item *notnull_cond= 0; - if (!(allowed & tab->map)) + if (!(allowed & tab->map) || + (s->table->map && join->const_table_map)) continue; for (Field** field_ptr= tab->field; *field_ptr; field_ptr++) |