From e2159f384268e01282af60515582943bf595ba7b Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 22 May 2005 22:30:20 +0000 Subject: Teach the planner to remove SubqueryScan nodes from the plan if they aren't doing anything useful (ie, neither selection nor projection). Also, extend to SubqueryScan the hacks already in place to avoid unnecessary ExecProject calls when the result would just be the same tuple the subquery already delivered. This saves some overhead in UNION and other set operations, as well as avoiding overhead for unflatten-able subqueries. Per example from Sokolov Yura. --- src/include/optimizer/clauses.h | 11 ++++++++--- src/include/optimizer/planmain.h | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) (limited to 'src/include/optimizer') diff --git a/src/include/optimizer/clauses.h b/src/include/optimizer/clauses.h index b2ec17ef405..ae5ab79f987 100644 --- a/src/include/optimizer/clauses.h +++ b/src/include/optimizer/clauses.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/optimizer/clauses.h,v 1.78 2005/01/28 19:34:28 tgl Exp $ + * $PostgreSQL: pgsql/src/include/optimizer/clauses.h,v 1.79 2005/05/22 22:30:20 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -87,9 +87,14 @@ extern Node *expression_tree_mutator(Node *node, Node *(*mutator) (), #define QTW_DONT_COPY_QUERY 0x04 /* do not copy top Query */ extern bool query_tree_walker(Query *query, bool (*walker) (), - void *context, int flags); + void *context, int flags); extern Query *query_tree_mutator(Query *query, Node *(*mutator) (), - void *context, int flags); + void *context, int flags); + +extern bool range_table_walker(List *rtable, bool (*walker) (), + void *context, int flags); +extern List *range_table_mutator(List *rtable, Node *(*mutator) (), + void *context, int flags); extern bool query_or_expression_tree_walker(Node *node, bool (*walker) (), void *context, int flags); diff --git a/src/include/optimizer/planmain.h b/src/include/optimizer/planmain.h index 129439ddec8..bb27bf01d57 100644 --- a/src/include/optimizer/planmain.h +++ b/src/include/optimizer/planmain.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/optimizer/planmain.h,v 1.84 2005/04/25 02:14:48 tgl Exp $ + * $PostgreSQL: pgsql/src/include/optimizer/planmain.h,v 1.85 2005/05/22 22:30:20 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -74,7 +74,7 @@ extern void process_implied_equality(Query *root, /* * prototypes for plan/setrefs.c */ -extern void set_plan_references(Plan *plan, List *rtable); +extern Plan *set_plan_references(Plan *plan, List *rtable); extern void fix_opfuncids(Node *node); extern void set_opfuncid(OpExpr *opexpr); -- cgit v1.2.3