mariadb/mysql-test/t/negation_elimination.test
Sergey Petrunya 2c28412e2e Port of code for: (part of testcase is in mysql-test/t/subquery*.test and will be ported separately)
Bug#11766642: crash in Item_field::register_field_in_read_map 
              with view

(Former 59793)

Prior to the refactoring in this patch, Item_cond_xor behaved 
partially as an Item_cond and partially as an Item_func. The
reasoning behind this was that XOR is currently not optimized
(thus should be Item_func instead of Item_cond), but it was 
planned optimize it in the future (thus, made Item_cond anyway 
to ease optimization later). 

Even though Item_cond inherits from Item_func, there are 
differences between these two. One difference is that the 
arguments are stored differently. Item_cond stores them in a 
list while Item_func store them in an args[]. 

BUG no 45221 was caused by Item_cond_xor storing arguments in 
the list while users of the objects would look for them in 
args[]. The fix back then was to store the arguments in both 
locations.

In this bug, Item_cond_xor initially gets two Item_field 
arguments. These are stored in the list inherited from 
Item_cond and in args[] inherited from Item_func. During
resolution, find_field_in_view() replaces the Item_fields 
stored in the list with Item_direct_view_refs, but args[] 
still points to the unresolved Item_fields. This shows that 
the fix for 45221 was incorrect.

The refactoring performed in this patch removes the confusion
by making the XOR item an Item_func period. A neg_transformer() 
is also implemented for Item_func_xor to improve performance 
when negating XOR expressions. An XOR is negated by negating 
one of the operands.
2011-07-11 23:48:35 +04:00

103 lines
3.9 KiB
Text

#
# Test negation elimination
#
--disable_warnings
drop table if exists t1;
--enable_warnings
create table t1 (a int, key (a));
insert into t1 values (NULL), (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
(10), (11), (12), (13), (14), (15), (16), (17), (18), (19);
explain select * from t1 where not(not(a));
select * from t1 where not(not(a));
explain select * from t1 where not(not(not(a > 10)));
select * from t1 where not(not(not(a > 10)));
explain select * from t1 where not(not(not(a < 5) and not(a > 10)));
select * from t1 where not(not(not(a < 5) and not(a > 10)));
explain select * from t1 where not(a = 10);
select * from t1 where not(a = 10);
explain select * from t1 where not(a != 10);
select * from t1 where not(a != 1);
explain select * from t1 where not(a < 10);
select * from t1 where not(a < 10);
explain select * from t1 where not(a >= 10);
select * from t1 where not(a >= 10);
explain select * from t1 where not(a > 10);
select * from t1 where not(a > 10);
explain select * from t1 where not(a <= 10);
select * from t1 where not(a <= 10);
explain select * from t1 where not(a is null);
select * from t1 where not(a is null);
explain select * from t1 where not(a is not null);
select * from t1 where not(a is not null);
explain select * from t1 where not(a < 5 or a > 15);
select * from t1 where not(a < 5 or a > 15);
explain select * from t1 where not(a < 15 and a > 5);
select * from t1 where not(a < 15 and a > 5);
explain select * from t1 where a = 2 or not(a < 10);
select * from t1 where a = 2 or not(a < 10);
explain select * from t1 where a > 5 and not(a > 10);
select * from t1 where a > 5 and not(a > 10);
explain select * from t1 where a > 5 xor a < 10;
select * from t1 where a > 5 xor a < 10;
explain select * from t1 where a = 2 or not(a < 5 or a > 15);
select * from t1 where a = 2 or not(a < 5 or a > 15);
explain select * from t1 where a = 7 or not(a < 15 and a > 5);
select * from t1 where a = 7 or not(a < 15 and a > 5);
explain select * from t1 where NULL or not(a < 15 and a > 5);
select * from t1 where NULL or not(a < 15 and a > 5);
explain select * from t1 where not(NULL and a > 5);
select * from t1 where not(NULL and a > 5);
explain select * from t1 where not(NULL or a);
select * from t1 where not(NULL or a);
explain select * from t1 where not(NULL and a);
select * from t1 where not(NULL and a);
explain select * from t1 where not((a < 5 or a < 10) and (not(a > 16) or a > 17));
select * from t1 where not((a < 5 or a < 10) and (not(a > 16) or a > 17));
explain select * from t1 where not((a < 5 and a < 10) and (not(a > 16) or a > 17));
select * from t1 where not((a < 5 and a < 10) and (not(a > 16) or a > 17));
explain select * from t1 where ((a between 5 and 15) and (not(a like 10)));
select * from t1 where ((a between 5 and 15) and (not(a like 10)));
--echo # XOR (Note: XOR is negated by negating one of the operands)
--echo # Should return 6,7
SELECT * FROM t1 WHERE ((a > 5) XOR (a > 7));
--echo # Should return 0..5,8..19
SELECT * FROM t1 WHERE ((NOT (a > 5)) XOR (a > 7));
SELECT * FROM t1 WHERE ((a > 5) XOR (NOT (a > 7)));
SELECT * FROM t1 WHERE NOT ((a > 5) XOR (a > 7));
--echo # Should return 6,7
SELECT * FROM t1 WHERE NOT ((NOT (a > 5)) XOR (a > 7));
SELECT * FROM t1 WHERE NOT ((a > 5) XOR (NOT (a > 7)));
--echo # Should return 0..5,8..19
SELECT * FROM t1 WHERE NOT ((NOT (a > 5)) XOR (NOT (a > 7)));
--echo # Should have empty result
SELECT * FROM t1 WHERE (NULL XOR (a > 7));
SELECT * FROM t1 WHERE NOT (NULL XOR (a > 7));
--echo # Should be simplified to "...WHERE (a XOR a)
EXPLAIN EXTENDED SELECT * FROM t1 WHERE NOT ((NOT a) XOR (a));
--echo # Should be simplified to "...WHERE (a XOR a)
EXPLAIN EXTENDED SELECT * FROM t1 WHERE NOT (a XOR (NOT a));
--echo # End XOR
delete from t1 where a > 3;
select a, not(not(a)) from t1;
explain extended select a, not(not(a)), not(a <= 2 and not(a)), not(a not like "1"), not (a not in (1,2)), not(a != 2) from t1 where not(not(a)) having not(not(a));
drop table t1;
# End of 4.1 tests