aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/util/clauses.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/util/clauses.c')
-rw-r--r--src/backend/optimizer/util/clauses.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
index d00867d6480..b3d50433564 100644
--- a/src/backend/optimizer/util/clauses.c
+++ b/src/backend/optimizer/util/clauses.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.91 2001/11/05 17:46:26 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.92 2001/12/10 22:54:12 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -47,6 +47,7 @@ typedef struct
static bool contain_agg_clause_walker(Node *node, void *context);
static bool pull_agg_clause_walker(Node *node, List **listptr);
+static bool contain_iter_clause_walker(Node *node, void *context);
static bool contain_subplans_walker(Node *node, void *context);
static bool pull_subplans_walker(Node *node, List **listptr);
static bool check_subplans_for_ungrouped_vars_walker(Node *node,
@@ -451,6 +452,39 @@ pull_agg_clause_walker(Node *node, List **listptr)
/*****************************************************************************
+ * Iter clause manipulation
+ *****************************************************************************/
+
+/*
+ * contain_iter_clause
+ * Recursively search for Iter nodes within a clause.
+ *
+ * Returns true if any Iter found.
+ *
+ * XXX Iter is a crock. It'd be better to look directly at each function
+ * or operator to see if it can return a set. However, that would require
+ * a lot of extra cycles as things presently stand. The return-type info
+ * for function and operator nodes should be extended to include whether
+ * the return is a set.
+ */
+bool
+contain_iter_clause(Node *clause)
+{
+ return contain_iter_clause_walker(clause, NULL);
+}
+
+static bool
+contain_iter_clause_walker(Node *node, void *context)
+{
+ if (node == NULL)
+ return false;
+ if (IsA(node, Iter))
+ return true; /* abort the tree traversal and return
+ * true */
+ return expression_tree_walker(node, contain_iter_clause_walker, context);
+}
+
+/*****************************************************************************
* Subplan clause manipulation
*****************************************************************************/