From e091fd06217aae30cf73697156b22bc66c382445 Mon Sep 17 00:00:00 2001
From: Bob <bob@example.com>
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

