mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fixed bug mdev-4274.
This bug was the result of incompleteness of the patch for bug mdev-4177. When an OR condition is simplified to a single conjunct it is merged into the embedding AND condition. Multiple equalities are also merged, and any field item involved in those equality should acquire a pointer to a the multiple equality formed by this merge.
This commit is contained in:
@ -5049,6 +5049,7 @@ SELECT 1 FROM t1 GROUP BY 1;
|
||||
1
|
||||
1
|
||||
drop table t1;
|
||||
set sql_buffer_result= 0;
|
||||
End of 5.1 tests
|
||||
#
|
||||
# BUG#776274: substitution of a single row table
|
||||
@ -5132,4 +5133,38 @@ AND Time_zone_id = Time_zone_id
|
||||
OR Time_zone_id <> Time_zone_id )
|
||||
AND Use_leap_seconds <> 'N';
|
||||
Time_zone_id Use_leap_seconds
|
||||
#
|
||||
# Bug mdev-4274: result of simplification of OR badly merged
|
||||
# into embedding AND
|
||||
#
|
||||
CREATE TABLE t1 (a int, b int, INDEX idx(b)) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (8,8);
|
||||
CREATE TABLE t2 (c int, INDEX idx(c)) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (8), (9);
|
||||
EXPLAIN EXTENDED
|
||||
SELECT * FROM t1 INNER JOIN t2 ON ( c = a )
|
||||
WHERE 1 IS NULL OR b < 33 AND b = c;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 system idx NULL NULL NULL 1 100.00
|
||||
1 SIMPLE t2 ref idx idx 5 const 1 100.00 Using index
|
||||
Warnings:
|
||||
Note 1003 select 8 AS `a`,8 AS `b`,`test`.`t2`.`c` AS `c` from `test`.`t1` join `test`.`t2` where ((`test`.`t2`.`c` = 8) and (8 < 33))
|
||||
SELECT * FROM t1 INNER JOIN t2 ON ( c = a )
|
||||
WHERE 1 IS NULL OR b < 33 AND b = c;
|
||||
a b c
|
||||
8 8 8
|
||||
DROP TABLE t1,t2;
|
||||
#
|
||||
# Bug mdev-4413: another manifestations of bug mdev-2474
|
||||
# (valgrind complains)
|
||||
#
|
||||
CREATE TABLE t1 (a int, b int) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (7,1);
|
||||
CREATE TABLE t2 (c int) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (0), (8);
|
||||
SELECT * FROM t1, t2
|
||||
WHERE c = a AND
|
||||
( 0 OR ( b BETWEEN 45 AND 300 OR a > 45 AND a < 100 ) AND b = c );
|
||||
a b c
|
||||
DROP TABLE t1, t2;
|
||||
End of 5.3 tests
|
||||
|
@ -5060,6 +5060,7 @@ SELECT 1 FROM t1 GROUP BY 1;
|
||||
1
|
||||
1
|
||||
drop table t1;
|
||||
set sql_buffer_result= 0;
|
||||
End of 5.1 tests
|
||||
#
|
||||
# BUG#776274: substitution of a single row table
|
||||
@ -5143,6 +5144,40 @@ AND Time_zone_id = Time_zone_id
|
||||
OR Time_zone_id <> Time_zone_id )
|
||||
AND Use_leap_seconds <> 'N';
|
||||
Time_zone_id Use_leap_seconds
|
||||
#
|
||||
# Bug mdev-4274: result of simplification of OR badly merged
|
||||
# into embedding AND
|
||||
#
|
||||
CREATE TABLE t1 (a int, b int, INDEX idx(b)) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (8,8);
|
||||
CREATE TABLE t2 (c int, INDEX idx(c)) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (8), (9);
|
||||
EXPLAIN EXTENDED
|
||||
SELECT * FROM t1 INNER JOIN t2 ON ( c = a )
|
||||
WHERE 1 IS NULL OR b < 33 AND b = c;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 system idx NULL NULL NULL 1 100.00
|
||||
1 SIMPLE t2 ref idx idx 5 const 1 100.00 Using index
|
||||
Warnings:
|
||||
Note 1003 select 8 AS `a`,8 AS `b`,`test`.`t2`.`c` AS `c` from `test`.`t1` join `test`.`t2` where ((`test`.`t2`.`c` = 8) and (8 < 33))
|
||||
SELECT * FROM t1 INNER JOIN t2 ON ( c = a )
|
||||
WHERE 1 IS NULL OR b < 33 AND b = c;
|
||||
a b c
|
||||
8 8 8
|
||||
DROP TABLE t1,t2;
|
||||
#
|
||||
# Bug mdev-4413: another manifestations of bug mdev-2474
|
||||
# (valgrind complains)
|
||||
#
|
||||
CREATE TABLE t1 (a int, b int) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (7,1);
|
||||
CREATE TABLE t2 (c int) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (0), (8);
|
||||
SELECT * FROM t1, t2
|
||||
WHERE c = a AND
|
||||
( 0 OR ( b BETWEEN 45 AND 300 OR a > 45 AND a < 100 ) AND b = c );
|
||||
a b c
|
||||
DROP TABLE t1, t2;
|
||||
End of 5.3 tests
|
||||
set join_cache_level=default;
|
||||
show variables like 'join_cache_level';
|
||||
|
@ -5049,6 +5049,7 @@ SELECT 1 FROM t1 GROUP BY 1;
|
||||
1
|
||||
1
|
||||
drop table t1;
|
||||
set sql_buffer_result= 0;
|
||||
End of 5.1 tests
|
||||
#
|
||||
# BUG#776274: substitution of a single row table
|
||||
@ -5132,4 +5133,38 @@ AND Time_zone_id = Time_zone_id
|
||||
OR Time_zone_id <> Time_zone_id )
|
||||
AND Use_leap_seconds <> 'N';
|
||||
Time_zone_id Use_leap_seconds
|
||||
#
|
||||
# Bug mdev-4274: result of simplification of OR badly merged
|
||||
# into embedding AND
|
||||
#
|
||||
CREATE TABLE t1 (a int, b int, INDEX idx(b)) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (8,8);
|
||||
CREATE TABLE t2 (c int, INDEX idx(c)) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (8), (9);
|
||||
EXPLAIN EXTENDED
|
||||
SELECT * FROM t1 INNER JOIN t2 ON ( c = a )
|
||||
WHERE 1 IS NULL OR b < 33 AND b = c;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 system idx NULL NULL NULL 1 100.00
|
||||
1 SIMPLE t2 ref idx idx 5 const 1 100.00 Using index
|
||||
Warnings:
|
||||
Note 1003 select 8 AS `a`,8 AS `b`,`test`.`t2`.`c` AS `c` from `test`.`t1` join `test`.`t2` where ((`test`.`t2`.`c` = 8) and (8 < 33))
|
||||
SELECT * FROM t1 INNER JOIN t2 ON ( c = a )
|
||||
WHERE 1 IS NULL OR b < 33 AND b = c;
|
||||
a b c
|
||||
8 8 8
|
||||
DROP TABLE t1,t2;
|
||||
#
|
||||
# Bug mdev-4413: another manifestations of bug mdev-2474
|
||||
# (valgrind complains)
|
||||
#
|
||||
CREATE TABLE t1 (a int, b int) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (7,1);
|
||||
CREATE TABLE t2 (c int) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (0), (8);
|
||||
SELECT * FROM t1, t2
|
||||
WHERE c = a AND
|
||||
( 0 OR ( b BETWEEN 45 AND 300 OR a > 45 AND a < 100 ) AND b = c );
|
||||
a b c
|
||||
DROP TABLE t1, t2;
|
||||
End of 5.3 tests
|
||||
|
@ -1380,7 +1380,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||
2 MATERIALIZED t3 hash_ALL NULL #hash#$hj 5 test.t2.i2 3 100.00 Using where; Using join buffer (flat, BNLH join)
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`i1` AS `i1` from `test`.`t1` semi join (`test`.`t2` join `test`.`t3`) where ((`test`.`t3`.`i3` = `test`.`t2`.`i2`) and (`test`.`t1`.`i1` = `test`.`t2`.`i2`) and (`test`.`t3`.`i3` > 0))
|
||||
Note 1003 select `test`.`t1`.`i1` AS `i1` from `test`.`t1` semi join (`test`.`t2` join `test`.`t3`) where ((`test`.`t3`.`i3` = `test`.`t2`.`i2`) and (`test`.`t1`.`i1` = `test`.`t2`.`i2`) and (`test`.`t2`.`i2` > 0))
|
||||
SELECT * FROM t1
|
||||
WHERE i1 IN (SELECT i3 FROM t2, t3 WHERE i3 > 0 AND i3 = i2 OR 1=2);
|
||||
i1
|
||||
|
@ -4241,6 +4241,7 @@ SELECT f1 FROM t1 GROUP BY 1;
|
||||
SELECT f1 FROM t1 GROUP BY '123' = 'abc';
|
||||
SELECT 1 FROM t1 GROUP BY 1;
|
||||
drop table t1;
|
||||
set sql_buffer_result= 0;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
||||
@ -4305,4 +4306,40 @@ WHERE ( NOT (Use_leap_seconds <= Use_leap_seconds AND Time_zone_id != 1)
|
||||
OR Time_zone_id <> Time_zone_id )
|
||||
AND Use_leap_seconds <> 'N';
|
||||
|
||||
--echo #
|
||||
--echo # Bug mdev-4274: result of simplification of OR badly merged
|
||||
--echo # into embedding AND
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a int, b int, INDEX idx(b)) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (8,8);
|
||||
|
||||
CREATE TABLE t2 (c int, INDEX idx(c)) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (8), (9);
|
||||
|
||||
EXPLAIN EXTENDED
|
||||
SELECT * FROM t1 INNER JOIN t2 ON ( c = a )
|
||||
WHERE 1 IS NULL OR b < 33 AND b = c;
|
||||
SELECT * FROM t1 INNER JOIN t2 ON ( c = a )
|
||||
WHERE 1 IS NULL OR b < 33 AND b = c;
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # Bug mdev-4413: another manifestations of bug mdev-2474
|
||||
--echo # (valgrind complains)
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a int, b int) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (7,1);
|
||||
|
||||
CREATE TABLE t2 (c int) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (0), (8);
|
||||
|
||||
SELECT * FROM t1, t2
|
||||
WHERE c = a AND
|
||||
( 0 OR ( b BETWEEN 45 AND 300 OR a > 45 AND a < 100 ) AND b = c );
|
||||
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo End of 5.3 tests
|
||||
|
@ -13195,7 +13195,24 @@ remove_eq_conds(THD *thd, COND *cond, Item::cond_result *cond_value)
|
||||
if (new_item_and_list->is_empty())
|
||||
li.remove();
|
||||
else
|
||||
li.replace(*new_item_and_list);
|
||||
{
|
||||
Item *list_item;
|
||||
Item *new_list_item;
|
||||
List_iterator<Item> it(*new_item_and_list);
|
||||
while ((list_item= it++))
|
||||
{
|
||||
uchar* is_subst_valid= (uchar *) Item::ANY_SUBST;
|
||||
new_list_item=
|
||||
list_item->compile(&Item::subst_argument_checker,
|
||||
&is_subst_valid,
|
||||
&Item::equal_fields_propagator,
|
||||
(uchar *) &cond_and->cond_equal);
|
||||
if (new_list_item != list_item)
|
||||
it.replace(new_list_item);
|
||||
new_list_item->update_used_tables();
|
||||
}
|
||||
li.replace(*new_item_and_list);
|
||||
}
|
||||
cond_and_list->concat((List<Item>*) cond_equal_items);
|
||||
}
|
||||
else if (new_item->type() == Item::FUNC_ITEM &&
|
||||
|
Reference in New Issue
Block a user