diff options
Diffstat (limited to 'src/backend/executor/nodeSubplan.c')
-rw-r--r-- | src/backend/executor/nodeSubplan.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/backend/executor/nodeSubplan.c b/src/backend/executor/nodeSubplan.c index d615b78373d..b501fc4f037 100644 --- a/src/backend/executor/nodeSubplan.c +++ b/src/backend/executor/nodeSubplan.c @@ -46,7 +46,8 @@ static Datum ExecScanSubPlan(SubPlanState *node, ExprContext *econtext, bool *isNull); static void buildSubPlanHash(SubPlanState *node, ExprContext *econtext); -static bool findPartialMatch(TupleHashTable hashtable, TupleTableSlot *slot); +static bool findPartialMatch(TupleHashTable hashtable, TupleTableSlot *slot, + FmgrInfo *eqfunctions); static bool slotAllNulls(TupleTableSlot *slot); static bool slotNoNulls(TupleTableSlot *slot); @@ -153,7 +154,7 @@ ExecHashSubPlan(SubPlanState *node, return BoolGetDatum(true); } if (node->havenullrows && - findPartialMatch(node->hashnulls, slot)) + findPartialMatch(node->hashnulls, slot, node->cur_eq_funcs)) { ExecClearTuple(slot); *isNull = true; @@ -186,14 +187,14 @@ ExecHashSubPlan(SubPlanState *node, } /* Scan partly-null table first, since more likely to get a match */ if (node->havenullrows && - findPartialMatch(node->hashnulls, slot)) + findPartialMatch(node->hashnulls, slot, node->cur_eq_funcs)) { ExecClearTuple(slot); *isNull = true; return BoolGetDatum(false); } if (node->havehashrows && - findPartialMatch(node->hashtable, slot)) + findPartialMatch(node->hashtable, slot, node->cur_eq_funcs)) { ExecClearTuple(slot); *isNull = true; @@ -573,9 +574,13 @@ buildSubPlanHash(SubPlanState *node, ExprContext *econtext) * We have to scan the whole hashtable; we can't usefully use hashkeys * to guide probing, since we might get partial matches on tuples with * hashkeys quite unrelated to what we'd get from the given tuple. + * + * Caller must provide the equality functions to use, since in cross-type + * cases these are different from the hashtable's internal functions. */ static bool -findPartialMatch(TupleHashTable hashtable, TupleTableSlot *slot) +findPartialMatch(TupleHashTable hashtable, TupleTableSlot *slot, + FmgrInfo *eqfunctions) { int numCols = hashtable->numCols; AttrNumber *keyColIdx = hashtable->keyColIdx; @@ -588,7 +593,7 @@ findPartialMatch(TupleHashTable hashtable, TupleTableSlot *slot) ExecStoreMinimalTuple(entry->firstTuple, hashtable->tableslot, false); if (!execTuplesUnequal(slot, hashtable->tableslot, numCols, keyColIdx, - hashtable->cur_eq_funcs, + eqfunctions, hashtable->tempcxt)) { TermTupleHashIterator(&hashiter); |