aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/optimizer/plan/subselect.c18
-rw-r--r--src/tools/backend/index.html2
2 files changed, 14 insertions, 6 deletions
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index 040c6732ccc..b5e4b1d8c84 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -404,12 +404,20 @@ SS_process_sublinks(Node *expr)
((Expr *) expr)->args = (List *)
SS_process_sublinks((Node *) ((Expr *) expr)->args);
else if (IsA(expr, SubLink))/* got it! */
- {
- lfirst(((Expr *) lfirst(((SubLink *)expr)->oper))->args) =
- lfirst(((SubLink *)expr)->lefthand);
-
+ {
+ /* Hack to make sure expr->oper->args points to the same VAR node
+ * as expr->lefthand does. Needed for subselects in the havingQual
+ * when used on views.
+ * Otherwise aggregate functions will fail later on (at execution
+ * time!) Reason: The rewite System makes several copies of the
+ * VAR nodes and in this case it should not do so :-( */
+ if(expr->lefthand != NULL)
+ {
+ lfirst(((Expr *) lfirst(((SubLink *)expr)->oper))->args) =
+ lfirst(((SubLink *)expr)->lefthand);
+ }
expr = _make_subplan((SubLink *) expr);
- }
+ }
return (expr);
}
diff --git a/src/tools/backend/index.html b/src/tools/backend/index.html
index 300061deae1..e1538affc41 100644
--- a/src/tools/backend/index.html
+++ b/src/tools/backend/index.html
@@ -78,7 +78,7 @@ queries, like <I>INSERT</I> and <I>UPDATE,</I> specify the columns
modified by the query. These column references are converted to <A
HREF="../../include/nodes/primnodes.h">Resdom</A> entries, which are
placed in <A HREF="../../include/nodes/parsenodes.h">target list
-entries,</I> and linked together to make up the <I>target list</I> of
+entries,</A> and linked together to make up the <I>target list</I> of
the query. The target list is stored in Query.targetList, which is
generated by <A
HREF="../../backend/parser/parse_target.c">transformTargetList().</A><P>