v1-0001-Reduce-planning-time-for-large-NOT-IN-lists-conta.patch
text/x-patch
Filename: v1-0001-Reduce-planning-time-for-large-NOT-IN-lists-conta.patch
Type: text/x-patch
Part: 0
Patch
Format: format-patch
Series: patch v1-0001
Subject: Reduce planning time for large NOT IN lists containing NULL
| File | + | − |
|---|---|---|
| src/backend/utils/adt/selfuncs.c | 3 | 0 |
From 86914f44a37b3c9afbd18b333eb5c451f41ce65b Mon Sep 17 00:00:00 2001 From: Ilia Evdokimov <ilya.evdokimov@tantorlabs.ru> Date: Wed, 18 Feb 2026 17:06:35 +0300 Subject: [PATCH v1] Reduce planning time for large NOT IN lists containing NULL For x <> ALL (...) / x NOT IN (...), the presence of a NULL element makes the selectivity 0.0. The planner currently still iterates over all elements and computes per-element selectivity, even though the final result is known. Add an early NULL check for constant arrays and immediately return 0.0 under ALL semantics. This reduces planning time for large NOT IN / <> ALL lists without changing semantics. --- src/backend/utils/adt/selfuncs.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 29fec655593..a0b57bd57aa 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -2025,6 +2025,9 @@ scalararraysel(PlannerInfo *root, elmlen, elmbyval, elmalign, &elem_values, &elem_nulls, &num_elems); + if (!useOr && memchr(elem_nulls, true, num_elems) != NULL) + return (Selectivity) 0.0; + /* * For generic operators, we assume the probability of success is * independent for each array element. But for "= ANY" or "<> ALL", -- 2.34.1