aboutsummaryrefslogtreecommitdiff
path: root/src/backend/rewrite/rewriteManip.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-11-23 17:21:04 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-11-23 17:21:04 +0000
commit19ff959bff054574be094e9633b69fc65c6c6a3c (patch)
tree4cfa22ee402e237c0286c5f83abb2ab528ae1b8a /src/backend/rewrite/rewriteManip.c
parentbaa6b22fcb831490c11506b6ec140d75fe8fff81 (diff)
downloadpostgresql-19ff959bff054574be094e9633b69fc65c6c6a3c.tar.gz
postgresql-19ff959bff054574be094e9633b69fc65c6c6a3c.zip
Fix problems with rewriter failing to set Query.hasSubLinks when inserting
a SubLink expression into a rule query. Pre-8.1 we essentially did this unconditionally; 8.1 tries to do it only when needed, but was missing a couple of cases. Per report from Kyle Bateman. Add some regression test cases covering this area.
Diffstat (limited to 'src/backend/rewrite/rewriteManip.c')
-rw-r--r--src/backend/rewrite/rewriteManip.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/backend/rewrite/rewriteManip.c b/src/backend/rewrite/rewriteManip.c
index dbdd62c3e15..3f7af865775 100644
--- a/src/backend/rewrite/rewriteManip.c
+++ b/src/backend/rewrite/rewriteManip.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/rewrite/rewriteManip.c,v 1.93 2005/11/22 18:17:19 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/rewrite/rewriteManip.c,v 1.94 2005/11/23 17:21:03 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -930,6 +930,7 @@ ResolveNew(Node *node, int target_varno, int sublevels_up,
RangeTblEntry *target_rte,
List *targetlist, int event, int update_varno)
{
+ Node *result;
ResolveNew_context context;
context.target_varno = target_varno;
@@ -944,8 +945,21 @@ ResolveNew(Node *node, int target_varno, int sublevels_up,
* Must be prepared to start with a Query or a bare expression tree; if
* it's a Query, we don't want to increment sublevels_up.
*/
- return query_or_expression_tree_mutator(node,
- ResolveNew_mutator,
- (void *) &context,
- 0);
+ result = query_or_expression_tree_mutator(node,
+ ResolveNew_mutator,
+ (void *) &context,
+ 0);
+
+ if (context.inserted_sublink)
+ {
+ if (IsA(result, Query))
+ ((Query *) result)->hasSubLinks = true;
+ /*
+ * Note: if we're called on a non-Query node then it's the caller's
+ * responsibility to update hasSubLinks in the ancestor Query.
+ * This is pretty fragile and perhaps should be rethought ...
+ */
+ }
+
+ return result;
}