On 12/20/19 1:01 AM, Ranier Vilela wrote:> First case:
src \ backend \ executor \ nodeSubplan.c (line 507)
if (node-> hashtable)
node-> hastable is assigned with NULL at line 498, so the test will
always fail.
Second case:
Here the case is similar, but worse.
src \ backend \ executor \ nodeSubplan.c (line 535)
if (node-> hashnulls)
ResetTupleHashTable (node-> hashtable);
These two look like likely bugs. It looks like the code will always
create new hash tables despite commit
https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=356687bd825e5ca7230d43c1bffe7a59ad2e77bd
intending to reset them if they already exist.
Additionally it looks like the code would reset the wrong hash table in
the second place if the bug was fixed.
I have attached a patch.
Third case:
\ src \ backend \ utils \ cache \ relcache.c (line 5190)
if (relation-> rd_pubactions)
It will never be executed, because if relation-> rd_pubactions is true,
the function returns on line 5154.
I have not looked into this one in detail, but the free at line 5192
looks like potentially dead code.
Andreas
diff --git a/src/backend/executor/nodeSubplan.c b/src/backend/executor/nodeSubplan.c
index 2c364bdd23..840f4033ac 100644
--- a/src/backend/executor/nodeSubplan.c
+++ b/src/backend/executor/nodeSubplan.c
@@ -495,8 +495,6 @@ buildSubPlanHash(SubPlanState *node, ExprContext *econtext)
* need to store subplan output rows that contain NULL.
*/
MemoryContextReset(node->hashtablecxt);
- node->hashtable = NULL;
- node->hashnulls = NULL;
node->havehashrows = false;
node->havenullrows = false;
@@ -533,7 +531,7 @@ buildSubPlanHash(SubPlanState *node, ExprContext *econtext)
}
if (node->hashnulls)
- ResetTupleHashTable(node->hashtable);
+ ResetTupleHashTable(node->hashnulls);
else
node->hashnulls = BuildTupleHashTableExt(node->parent,
node->descRight,
@@ -549,6 +547,8 @@ buildSubPlanHash(SubPlanState *node, ExprContext *econtext)
node->hashtempcxt,
false);
}
+ else
+ node->hashnulls = NULL;
/*
* We are probably in a short-lived expression-evaluation context. Switch