From 128d827d4bd4334bb0370a52790b3ec0f41eed57 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Fri, 24 Jul 1998 04:03:10 +0000
Subject: [PATCH] I'm sorry, but I think I introduced a little bug with my last
 patch. Everyone using an [NOT] EXISTS subquery will have noticed that
 already.

The bug is in "subselect.c" in the function "SS_process_sublinks()".

Here the whole function as it *SHOULD BE*:

Stephan
---
 src/backend/optimizer/plan/subselect.c | 18 +++++++++++++-----
 src/tools/backend/index.html           |  2 +-
 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>
-- 
GitLab