diff options
Diffstat (limited to 'mysql-test/main/negation_elimination.test')
-rw-r--r-- | mysql-test/main/negation_elimination.test | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/mysql-test/main/negation_elimination.test b/mysql-test/main/negation_elimination.test new file mode 100644 index 00000000..312be8cc --- /dev/null +++ b/mysql-test/main/negation_elimination.test @@ -0,0 +1,103 @@ +# +# 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 |