diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-11-23 17:21:04 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-11-23 17:21:04 +0000 |
commit | 19ff959bff054574be094e9633b69fc65c6c6a3c (patch) | |
tree | 4cfa22ee402e237c0286c5f83abb2ab528ae1b8a /src/backend/rewrite/rewriteManip.c | |
parent | baa6b22fcb831490c11506b6ec140d75fe8fff81 (diff) | |
download | postgresql-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.c | 24 |
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; } |