- case T_SeqScan:
- ((SeqScan *) plan)->scanrelid += rtoffset;
- adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
- adjust_expr_varnos((Node *) plan->qual, rtoffset);
- break;
- case T_IndexScan:
- ((IndexScan *) plan)->scan.scanrelid += rtoffset;
- adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
- adjust_expr_varnos((Node *) plan->qual, rtoffset);
- adjust_expr_varnos((Node *) ((IndexScan *) plan)->indexqual,
- rtoffset);
- adjust_expr_varnos((Node *) ((IndexScan *) plan)->indexqualorig,
- rtoffset);
- break;
- case T_BitmapIndexScan:
- ((BitmapIndexScan *) plan)->scan.scanrelid += rtoffset;
- /* no need to fix targetlist and qual */
- Assert(plan->targetlist == NIL);
- Assert(plan->qual == NIL);
- adjust_expr_varnos((Node *) ((BitmapIndexScan *) plan)->indexqual,
- rtoffset);
- adjust_expr_varnos((Node *) ((BitmapIndexScan *) plan)->indexqualorig,
- rtoffset);
- break;
- case T_BitmapHeapScan:
- ((BitmapHeapScan *) plan)->scan.scanrelid += rtoffset;
- adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
- adjust_expr_varnos((Node *) plan->qual, rtoffset);
- adjust_expr_varnos((Node *) ((BitmapHeapScan *) plan)->bitmapqualorig,
- rtoffset);
- break;
- case T_TidScan:
- ((TidScan *) plan)->scan.scanrelid += rtoffset;
- adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
- adjust_expr_varnos((Node *) plan->qual, rtoffset);
- adjust_expr_varnos((Node *) ((TidScan *) plan)->tidquals,
- rtoffset);
- break;
- case T_SubqueryScan:
- ((SubqueryScan *) plan)->scan.scanrelid += rtoffset;
- adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
- adjust_expr_varnos((Node *) plan->qual, rtoffset);
- /* we should not recurse into the subquery! */
- break;
- case T_FunctionScan:
- ((FunctionScan *) plan)->scan.scanrelid += rtoffset;
- adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
- adjust_expr_varnos((Node *) plan->qual, rtoffset);
- /* rte was already fixed by set_subqueryscan_references */
- break;
- case T_ValuesScan:
- ((ValuesScan *) plan)->scan.scanrelid += rtoffset;
- adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
- adjust_expr_varnos((Node *) plan->qual, rtoffset);
- /* rte was already fixed by set_subqueryscan_references */
- break;
- case T_NestLoop:
- adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
- adjust_expr_varnos((Node *) plan->qual, rtoffset);
- adjust_expr_varnos((Node *) ((Join *) plan)->joinqual, rtoffset);
- break;
- case T_MergeJoin:
- adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
- adjust_expr_varnos((Node *) plan->qual, rtoffset);
- adjust_expr_varnos((Node *) ((Join *) plan)->joinqual, rtoffset);
- adjust_expr_varnos((Node *) ((MergeJoin *) plan)->mergeclauses,
- rtoffset);
- break;
- case T_HashJoin:
- adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
- adjust_expr_varnos((Node *) plan->qual, rtoffset);
- adjust_expr_varnos((Node *) ((Join *) plan)->joinqual, rtoffset);
- adjust_expr_varnos((Node *) ((HashJoin *) plan)->hashclauses,
- rtoffset);
- break;
- case T_Hash:
- case T_Material:
- case T_Sort:
- case T_Unique:
- case T_SetOp:
-
- /*
- * Even though the targetlist won't be used by the executor, we
- * fix it up for possible use by EXPLAIN (not to mention ease of
- * debugging --- wrong varnos are very confusing).
- */
- adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
- Assert(plan->qual == NIL);
- break;
- case T_Limit:
-
- /*
- * Like the plan types above, Limit doesn't evaluate its tlist or
- * quals. It does have live expressions for limit/offset,
- * however.
- */
- adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
- Assert(plan->qual == NIL);
- adjust_expr_varnos(((Limit *) plan)->limitOffset, rtoffset);
- adjust_expr_varnos(((Limit *) plan)->limitCount, rtoffset);
- break;
- case T_Agg:
- case T_Group:
- adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
- adjust_expr_varnos((Node *) plan->qual, rtoffset);
- break;
- case T_Result:
- adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
- adjust_expr_varnos((Node *) plan->qual, rtoffset);
- adjust_expr_varnos(((Result *) plan)->resconstantqual, rtoffset);
- break;
- case T_Append:
- adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
- Assert(plan->qual == NIL);
- foreach(l, ((Append *) plan)->appendplans)
- adjust_plan_varnos((Plan *) lfirst(l), rtoffset);
- break;
- case T_BitmapAnd:
- /* BitmapAnd works like Append, but has no tlist */
- Assert(plan->targetlist == NIL);
- Assert(plan->qual == NIL);
- foreach(l, ((BitmapAnd *) plan)->bitmapplans)
- adjust_plan_varnos((Plan *) lfirst(l), rtoffset);
- break;
- case T_BitmapOr:
- /* BitmapOr works like Append, but has no tlist */
- Assert(plan->targetlist == NIL);
- Assert(plan->qual == NIL);
- foreach(l, ((BitmapOr *) plan)->bitmapplans)
- adjust_plan_varnos((Plan *) lfirst(l), rtoffset);
- break;
- default:
- elog(ERROR, "unrecognized node type: %d",
- (int) nodeTag(plan));
- break;
+ record_plan_function_dependency(glob,
+ ((Aggref *) node)->aggfnoid);
+ }
+ else if (IsA(node, WindowFunc))
+ {
+ record_plan_function_dependency(glob,
+ ((WindowFunc *) node)->winfnoid);
+ }
+ else if (IsA(node, FuncExpr))
+ {
+ record_plan_function_dependency(glob,
+ ((FuncExpr *) node)->funcid);
+ }
+ else if (IsA(node, OpExpr))
+ {
+ set_opfuncid((OpExpr *) node);
+ record_plan_function_dependency(glob,
+ ((OpExpr *) node)->opfuncid);
+ }
+ else if (IsA(node, DistinctExpr))
+ {
+ set_opfuncid((OpExpr *) node); /* rely on struct equivalence */
+ record_plan_function_dependency(glob,
+ ((DistinctExpr *) node)->opfuncid);
+ }
+ else if (IsA(node, NullIfExpr))
+ {
+ set_opfuncid((OpExpr *) node); /* rely on struct equivalence */
+ record_plan_function_dependency(glob,
+ ((NullIfExpr *) node)->opfuncid);
+ }
+ else if (IsA(node, ScalarArrayOpExpr))
+ {
+ set_sa_opfuncid((ScalarArrayOpExpr *) node);
+ record_plan_function_dependency(glob,
+ ((ScalarArrayOpExpr *) node)->opfuncid);
+ }
+ else if (IsA(node, ArrayCoerceExpr))
+ {
+ if (OidIsValid(((ArrayCoerceExpr *) node)->elemfuncid))
+ record_plan_function_dependency(glob,
+ ((ArrayCoerceExpr *) node)->elemfuncid);