Re: [PATCH] Fix hashed ScalarArrayOp semantics for NULL LHS with non-strict comparators
David Rowley <dgrowleyml@gmail.com>
From: David Rowley <dgrowleyml@gmail.com>
To: Chengpeng Yan <chengpeng_yan@outlook.com>
Cc: PostgreSQL-development <pgsql-hackers@postgresql.org>,
cca5507 <cca5507@qq.com>, Tom Lane <tgl@sss.pgh.pa.us>
Date: 2026-04-22T23:33:28Z
Lists: pgsql-hackers
Attachments
- v3-0001-Fix-incorrect-logic-for-hashed-IN-NOT-IN-with-non.patch (application/octet-stream) patch v3-0001
On Mon, 20 Apr 2026 at 18:17, Chengpeng Yan <chengpeng_yan@outlook.com> wrote: > It may also be > possible to cache the NULL-LHS outcome once per expression, since the > RHS array is constant in the hashed SAOP case, which might help reduce > the cost of that fallback. Yeah, it doesn't make sense to repeatedly perform a linear search over the array to check if NULL matches anything in the array. Let's just do that once when we build the hash table and reuse that cached value whenever we see a NULL. We can skip that step with strict functions since we'll short-circuit earlier. A patch for that is attached. > ChangAo's example also seems to expose a separate correctness issue. If > the comparator can return NULL even for non-NULL inputs, then a lookup > hit seems sufficient, but a miss is no longer enough to distinguish > FALSE for IN / TRUE for NOT IN from NULL. IMO it's unrealistic to assume we can do anything sane with an equality function that always returns NULL. > A conservative fix there would again be a linear fallback after miss, > which should recover the right semantics, but that case does seem much > more performance-sensitive. I really doubt it's worth troubling over that. If we did want to do something, then it would be more efficient to probe the hash table directly after we insert a Datum and verify we can find it again. If we can't find any value we just inserted, mark the entire table as broken and have it so we check for that and do a linear search. David
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix incorrect logic for hashed IN / NOT IN with non-strict operators
- 109de35b705c 14.23 landed
- 622f8b53014e 15.18 landed
- a2a0060d5d8f 16.14 landed
- 3fda3e12f41b 17.10 landed
- 035c520db866 18.4 landed
- 94219a73f79d 19 (unreleased) landed