mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +02:00
Fix bug lp:858038
Analysis: The cause of the bug was the changed meaning of subselect_partial_match_engine::has_covering_null_row. Previously it meant that there is row with NULLs in all nullable fields of the materialized subquery table. Later it was changed to mean a row with NULLs in all fields of this table. At the same time there was a shortcut in subselect_rowid_merge_engine::partial_match() that detected a special case where: - there is no match in any of the columns with NULLs, and - there is no NULL-only row that covers all columns with NULLs. With the change in the meaning of has_covering_null_row, the condition that detected this special case was incomplete. This resulted in an incorrect FALSE, when the result was a partial match. Solution: Expand the condition that detected the special case with the correct test for the existence of a row with NULL values in all columns that contain NULLs (a kind of parially covering NULL-row).
This commit is contained in:
parent
a140719707
commit
ada0850c04
3 changed files with 58 additions and 1 deletions
|
|
@ -385,3 +385,26 @@ WHERE t3.b > ALL (
|
|||
|
||||
set @@optimizer_switch='default';
|
||||
drop table t3, t4, t5;
|
||||
|
||||
--echo #
|
||||
--echo # LP BUG#858038 The result of a query with NOT IN subquery depends on the state of the optimizer switch
|
||||
--echo #
|
||||
|
||||
create table t1 (c1 char(2) not null, c2 char(2));
|
||||
create table t2 (c3 char(2), c4 char(2));
|
||||
|
||||
insert into t1 values ('a1', 'b1');
|
||||
insert into t1 values ('a2', 'b2');
|
||||
|
||||
insert into t2 values ('x1', 'y1');
|
||||
insert into t2 values ('a2', null);
|
||||
|
||||
set @@optimizer_switch='in_to_exists=off,materialization=on,partial_match_rowid_merge=off,partial_match_table_scan=on';
|
||||
explain select * from t1 where c1 = 'a2' and (c1, c2) not in (select * from t2);
|
||||
select * from t1 where c1 = 'a2' and (c1, c2) not in (select * from t2);
|
||||
|
||||
set @@optimizer_switch='in_to_exists=off,materialization=on,partial_match_rowid_merge=on,partial_match_table_scan=off';
|
||||
explain select * from t1 where c1 = 'a2' and (c1, c2) not in (select * from t2);
|
||||
select * from t1 where c1 = 'a2' and (c1, c2) not in (select * from t2);
|
||||
|
||||
drop table t1, t2;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue