Details
Description
Equal field propagation does not work well in a number of cases.
Trailing garbage in string literals
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (a DATE);
INSERT INTO t1 VALUES ('2001-01-01');
SELECT * FROM t1 WHERE HEX(a) !='323030312D30312D3031';
returns empty set.
Now If I make the condition even stronger:
SELECT * FROM t1 WHERE HEX(a)!='323030312D30312D3031' AND a='2001-01-01x';
it erroneously returns one row:
+------------+ | a | +------------+ | 2001-01-01 | +------------+
Trailing fractional digits in string literals
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (a TIME);
INSERT INTO t1 VALUES ('00:00:00');
SELECT * FROM t1 WHERE LENGTH(a)!=8;
returns empty set.
Now if I make the condition even stronger:
SELECT a, LENGTH(a) FROM t1 WHERE LENGTH(a)!=8 AND a='00:00:00.000000';
it erroneously returns one row:
+----------+-----------+ | a | LENGTH(a) | +----------+-----------+ | 00:00:00 | 8 | +----------+-----------+
Trailing fractional digits in temporal literals
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (a TIME);
INSERT INTO t1 VALUES ('00:00:00');
SELECT * FROM t1 WHERE LENGTH(a)!=8;
SELECT * FROM t1 WHERE LENGTH(a)!=8 AND a=TIME'00:00:00.000000';
The first SELECT query returns empty set, the second SELECT query erroneously returns one row.
Leading spaces in string literals
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (a DATE);
INSERT INTO t1 VALUES ('2001-01-01');
SELECT * FROM t1 WHERE LENGTH(a)=11;
SELECT * FROM t1 WHERE LENGTH(a)=11 AND a=' 2001-01-01';
The first query correctly returns empty set, the second query erroneously returns one row.
Numeric format in string literals
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (a DATE);
INSERT INTO t1 VALUES ('2001-01-01');
SELECT * FROM t1 WHERE LENGTH(a)=8;
SELECT * FROM t1 WHERE LENGTH(a)=8 AND a='20010101';
The first query correctly returns empty set, the second query erroneously returns one row.
Gliffy Diagrams
Attachments
Issue Links
- blocks
-
MDEV-8728 Fix a number of problems in equal field and equal expression propagation
-
- Closed
-
Activity
- All
- Comments
- Work Log
- History
- Activity
- Transitions
After the fix, this script in MariaDB
DROP TABLE IF EXISTS t1; CREATE TABLE t1 (a TIME); INSERT INTO t1 VALUES ('00:00:00'); SELECT * FROM t1 WHERE LENGTH(a)!=8; SELECT a, LENGTH(a) FROM t1 WHERE LENGTH(a)!=8 AND a='00:00:00.000000'; EXPLAIN EXTENDED SELECT a, LENGTH(a) FROM t1 WHERE LENGTH(a)!=8 AND a='00:00:00.000000'; SHOW WARNINGS;returns
MySQL-5.7.8 does not support propagation in the same query: