diff options
Diffstat (limited to 'src/backend/optimizer/plan/setrefs.c')
-rw-r--r-- | src/backend/optimizer/plan/setrefs.c | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index 5081f9c3401..c76d67b93e5 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.86 2002/12/14 00:17:55 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.87 2003/01/10 21:08:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -42,6 +42,7 @@ typedef struct static void fix_expr_references(Plan *plan, Node *node); static bool fix_expr_references_walker(Node *node, void *context); +static void mark_qual_expressions(List *quals); static void set_join_references(Join *join, List *rtable); static void set_uppernode_references(Plan *plan, Index subvarno); static Node *join_references_mutator(Node *node, @@ -88,10 +89,12 @@ set_plan_references(Plan *plan, List *rtable) case T_SeqScan: fix_expr_references(plan, (Node *) plan->targetlist); fix_expr_references(plan, (Node *) plan->qual); + mark_qual_expressions(plan->qual); break; case T_IndexScan: fix_expr_references(plan, (Node *) plan->targetlist); fix_expr_references(plan, (Node *) plan->qual); + mark_qual_expressions(plan->qual); fix_expr_references(plan, (Node *) ((IndexScan *) plan)->indxqual); fix_expr_references(plan, @@ -100,6 +103,7 @@ set_plan_references(Plan *plan, List *rtable) case T_TidScan: fix_expr_references(plan, (Node *) plan->targetlist); fix_expr_references(plan, (Node *) plan->qual); + mark_qual_expressions(plan->qual); fix_expr_references(plan, (Node *) ((TidScan *) plan)->tideval); break; @@ -114,6 +118,7 @@ set_plan_references(Plan *plan, List *rtable) */ fix_expr_references(plan, (Node *) plan->targetlist); fix_expr_references(plan, (Node *) plan->qual); + mark_qual_expressions(plan->qual); /* Recurse into subplan too */ rte = rt_fetch(((SubqueryScan *) plan)->scan.scanrelid, @@ -129,6 +134,7 @@ set_plan_references(Plan *plan, List *rtable) fix_expr_references(plan, (Node *) plan->targetlist); fix_expr_references(plan, (Node *) plan->qual); + mark_qual_expressions(plan->qual); rte = rt_fetch(((FunctionScan *) plan)->scan.scanrelid, rtable); Assert(rte->rtekind == RTE_FUNCTION); @@ -139,13 +145,17 @@ set_plan_references(Plan *plan, List *rtable) set_join_references((Join *) plan, rtable); fix_expr_references(plan, (Node *) plan->targetlist); fix_expr_references(plan, (Node *) plan->qual); + mark_qual_expressions(plan->qual); fix_expr_references(plan, (Node *) ((Join *) plan)->joinqual); + mark_qual_expressions(((Join *) plan)->joinqual); break; case T_MergeJoin: set_join_references((Join *) plan, rtable); fix_expr_references(plan, (Node *) plan->targetlist); fix_expr_references(plan, (Node *) plan->qual); + mark_qual_expressions(plan->qual); fix_expr_references(plan, (Node *) ((Join *) plan)->joinqual); + mark_qual_expressions(((Join *) plan)->joinqual); fix_expr_references(plan, (Node *) ((MergeJoin *) plan)->mergeclauses); break; @@ -153,7 +163,9 @@ set_plan_references(Plan *plan, List *rtable) set_join_references((Join *) plan, rtable); fix_expr_references(plan, (Node *) plan->targetlist); fix_expr_references(plan, (Node *) plan->qual); + mark_qual_expressions(plan->qual); fix_expr_references(plan, (Node *) ((Join *) plan)->joinqual); + mark_qual_expressions(((Join *) plan)->joinqual); fix_expr_references(plan, (Node *) ((HashJoin *) plan)->hashclauses); break; @@ -180,6 +192,7 @@ set_plan_references(Plan *plan, List *rtable) set_uppernode_references(plan, (Index) 0); fix_expr_references(plan, (Node *) plan->targetlist); fix_expr_references(plan, (Node *) plan->qual); + mark_qual_expressions(plan->qual); break; case T_Result: @@ -193,7 +206,9 @@ set_plan_references(Plan *plan, List *rtable) set_uppernode_references(plan, (Index) OUTER); fix_expr_references(plan, (Node *) plan->targetlist); fix_expr_references(plan, (Node *) plan->qual); + mark_qual_expressions(plan->qual); fix_expr_references(plan, ((Result *) plan)->resconstantqual); + mark_qual_expressions((List *) ((Result *) plan)->resconstantqual); break; case T_Append: @@ -269,6 +284,28 @@ fix_expr_references_walker(Node *node, void *context) } /* + * mark_qual_expressions + * Do final cleanup on qualifier expressions (not targetlists!) + * + * SubPlans appearing at the top level of a qual expression are marked + * to indicate that they need not distinguish UNKNOWN (null) from FALSE + * results; this can save processing time in some cases. + */ +static void +mark_qual_expressions(List *quals) +{ + List *qual; + + foreach(qual, quals) + { + Node *node = lfirst(qual); + + if (IsA(node, SubPlan)) + ((SubPlan *) node)->unknownEqFalse = true; + } +} + +/* * set_join_references * Modifies the target list of a join node to reference its subplans, * by setting the varnos to OUTER or INNER and setting attno values to the |