mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Improve planner to drop constant-NULL inputs of AND/OR where it's legal.
In general we can't discard constant-NULL inputs, since they could change the result of the AND/OR to be NULL. But at top level of WHERE, we do not need to distinguish a NULL result from a FALSE result, so it's okay to treat NULL as FALSE and then simplify AND/OR accordingly. This is a very ancient oversight, but in 9.2 and later it can lead to failure to optimize queries that previous releases did optimize, as a result of more aggressive parameter substitution rules making it possible to reduce more subexpressions to NULL constants. This is the root cause of bug #10171 from Arnold Scheffler. We could alternatively have fixed that by teaching orclauses.c to ignore constant-NULL OR arms, but it seems better to get rid of them globally. I resisted the temptation to back-patch this change into all active branches, but it seems appropriate to back-patch as far as 9.2 so that there will not be performance regressions of the kind shown in this bug.
This commit is contained in:
@@ -2741,3 +2741,14 @@ ORDER BY thousand;
|
||||
1 | 1001
|
||||
(2 rows)
|
||||
|
||||
--
|
||||
-- Check elimination of constant-NULL subexpressions
|
||||
--
|
||||
explain (costs off)
|
||||
select * from tenk1 where (thousand, tenthous) in ((1,1001), (null,null));
|
||||
QUERY PLAN
|
||||
------------------------------------------------------
|
||||
Index Scan using tenk1_thous_tenthous on tenk1
|
||||
Index Cond: ((thousand = 1) AND (tenthous = 1001))
|
||||
(2 rows)
|
||||
|
||||
|
@@ -915,3 +915,10 @@ ORDER BY thousand;
|
||||
SELECT thousand, tenthous FROM tenk1
|
||||
WHERE thousand < 2 AND tenthous IN (1001,3000)
|
||||
ORDER BY thousand;
|
||||
|
||||
--
|
||||
-- Check elimination of constant-NULL subexpressions
|
||||
--
|
||||
|
||||
explain (costs off)
|
||||
select * from tenk1 where (thousand, tenthous) in ((1,1001), (null,null));
|
||||
|
Reference in New Issue
Block a user