From e091fd06217aae30cf73697156b22bc66c382445 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 15 Mar 2026 01:19:05 +0000 Subject: [PATCH 3/5] Use NULL key as empty in nodeMemoize.c MemoizeKey *key is describeed as Hash key for hash table lookups But it is not as one would expect. MemoizeHash_hash computes hash from tb->private_data ignoring the key Similarly Memoize_equal doesn't use key2, and uses probeslot from tb->private_data. At line 545 memoize_insert(mstate->hashtable, NULL, found); if not found we hold a pointer to an entry still empty in the simplehash, until we assign it a key (line 561) --- src/backend/executor/nodeMemoize.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/backend/executor/nodeMemoize.c b/src/backend/executor/nodeMemoize.c index fdca97d742..44154ad25a 100644 --- a/src/backend/executor/nodeMemoize.c +++ b/src/backend/executor/nodeMemoize.c @@ -143,6 +143,9 @@ static bool MemoizeHash_equal(struct memoize_hash *tb, #define SH_KEY key #define SH_HASH_KEY(tb, key) MemoizeHash_hash(tb, key) #define SH_EQUAL(tb, a, b) MemoizeHash_equal(tb, a, b) +#define SH_ENTRY_EMPTY(entry) ((entry)->key == NULL) +#define SH_MAKE_EMPTY(entry) ((entry)->key = NULL) +#define SH_MAKE_IN_USE(entry) ((void)0) #define SH_SCOPE static inline #define SH_STORE_HASH #define SH_GET_HASH(tb, a) a->hash -- 2.34.1