From d2fa5f8cfc9bf660b9bdfc288d97e7394124f015 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Sun, 16 Dec 2018 17:57:47 +1100 Subject: [PATCH] MDEV-8553: Impossible where for a!=a, aa For a table column `a`, the above expressions logically equate to false in all cases. With this patch the optimizer knows about this and queries like: SELECT * FROM t1 WHERE a!=a no longer need to evaluate a!=a for every row. The same applies if the expression was `aa` An `EXPLAIN SELECT COOUNT(*) FROM t1 WHERE aa +# +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2),(3); +EXPLAIN SELECT * FROM t1 WHERE a!=a; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE +SELECT COUNT(*) FROM t1 WHERE a!=a; +COUNT(*) +0 +EXPLAIN SELECT * FROM t1 WHERE a>a; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE +SELECT COUNT(*) FROM t1 WHERE a>a; +COUNT(*) +0 +EXPLAIN SELECT COUNT(*) FROM t1 WHERE aa; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE +SELECT COUNT(*) FROM t1 WHERE a>a; +COUNT(*) +0 +EXPLAIN SELECT COUNT(*) FROM t1 WHERE aa-1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using where +SELECT COUNT(*) FROM t1 WHERE a>a-1; +COUNT(*) +3 +EXPLAIN SELECT COUNT(*) FROM t1 WHERE a200; DROP TABLE t1; +--echo # +--echo # MDEV-8554 Expect "Impossible WHERE" for never true values like a!=a, aa +--echo # + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2),(3); + +EXPLAIN SELECT * FROM t1 WHERE a!=a; +SELECT COUNT(*) FROM t1 WHERE a!=a; +EXPLAIN SELECT * FROM t1 WHERE a>a; +SELECT COUNT(*) FROM t1 WHERE a>a; +EXPLAIN SELECT COUNT(*) FROM t1 WHERE aa; +SELECT COUNT(*) FROM t1 WHERE a>a; +EXPLAIN SELECT COUNT(*) FROM t1 WHERE aa-1; +SELECT COUNT(*) FROM t1 WHERE a>a-1; +EXPLAIN SELECT COUNT(*) FROM t1 WHERE aeq(args[1], true)) { - if (!args[0]->maybe_null || functype() == Item_func::EQUAL_FUNC) + if (*cond_value == Item::COND_FALSE || + !args[0]->maybe_null || functype() == Item_func::EQUAL_FUNC) return (COND*) 0; // Compare of identical items } }