diff --git a/src/backend/executor/execCurrent.c b/src/backend/executor/execCurrent.c index f89319fcd8..0d5f09402b 100644 --- a/src/backend/executor/execCurrent.c +++ b/src/backend/executor/execCurrent.c @@ -326,7 +326,6 @@ search_plan_tree(PlanState *node, Oid table_oid, case T_BitmapHeapScanState: case T_TidScanState: case T_ForeignScanState: - case T_CustomScanState: { ScanState *sstate = (ScanState *) node; @@ -335,6 +334,39 @@ search_plan_tree(PlanState *node, Oid table_oid, break; } + + /* + * Custom scan nodes can be leaf nodes or inner nodes and therfore need special treatment. + */ + case T_CustomScanState: + { + CustomScanState *css = castNode(CustomScanState, node); + ScanState *sstate = (ScanState *) node; + + if (sstate->ss_currentRelation == NULL) /* inner node */ + { + ListCell *lc; + + foreach (lc, sstate->custom_ps) + { + ScanState *elem = search_plan_tree((PlanState *)lfirst(lc), table_oid, pending_rescan); + + if (!elem) + continue; + if (result) + return NULL; /* multiple matches */ + result = elem; + } + } + else /* leaf node */ + { + if (RelationGetRelid(sstate->ss_currentRelation) == table_oid) + result = sstate; + } + + break; + } + /* * For Append, we must look through the members; watch out for * multiple matches (possible if it was from UNION ALL)