From 051b4210e3cb3f3a9ec7cd5ab4503b48f279ab48 Mon Sep 17 00:00:00 2001
From: "Vadim B. Mikheev" <vadim4o@yahoo.com>
Date: Tue, 22 Apr 1997 03:32:38 +0000
Subject: [PATCH] Fix for Hash and arrays

---
 src/backend/executor/execQual.c         |  7 +++++--
 src/backend/executor/nodeHash.c         |  6 ++++--
 src/backend/optimizer/plan/createplan.c | 10 ++++++++--
 3 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c
index 7e9d6f0bace..9d943368a34 100644
--- a/src/backend/executor/execQual.c
+++ b/src/backend/executor/execQual.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.10 1997/01/10 20:17:31 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.11 1997/04/22 03:32:35 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -98,7 +98,6 @@ ExecEvalArrayRef(ArrayRef *arrayRef,
     int 	*lIndex;
     char *dataPtr;
     
-    execConstByVal = arrayRef->refelembyval;
     *isNull       =	false; 
     array_scanner =	(ArrayType*)ExecEvalExpr(arrayRef->refexpr,
 					     econtext,
@@ -138,6 +137,8 @@ ExecEvalArrayRef(ArrayRef *arrayRef,
 				      assgnexpr, econtext,
 				      isNull, &dummy);
 	if (*isNull) return (Datum)NULL;
+    	execConstByVal = arrayRef->refelembyval;
+    	execConstLen = arrayRef->refelemlength;
 	if (lIndex == NULL)
 	    return (Datum) array_set(array_scanner, i, upper.indx, dataPtr, 
 				     arrayRef->refelembyval,
@@ -149,6 +150,8 @@ ExecEvalArrayRef(ArrayRef *arrayRef,
 				   arrayRef->refelembyval,
 				   arrayRef->refelemlength, isNull);
     }
+    execConstByVal = arrayRef->refelembyval;
+    execConstLen = arrayRef->refelemlength;
     if (lIndex == NULL) 
 	return (Datum) array_ref(array_scanner, i, upper.indx,
 				 arrayRef->refelembyval,
diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c
index e3b004c0a29..c71c3a3f440 100644
--- a/src/backend/executor/nodeHash.c
+++ b/src/backend/executor/nodeHash.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/executor/nodeHash.c,v 1.7 1996/11/06 06:47:40 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/executor/nodeHash.c,v 1.8 1997/04/22 03:32:38 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -536,8 +536,10 @@ ExecHashGetBucket(HashJoinTable hashtable,
     /* ----------------
      *	Get the join attribute value of the tuple
      * ----------------
+     * ...It's quick hack - use ExecEvalExpr instead of ExecEvalVar:
+     * hashkey may be T_ArrayRef, not just T_Var.	- vadim 04/22/97
      */
-    keyval = ExecEvalVar(hashkey, econtext, &isNull);
+    keyval = ExecEvalExpr((Node*)hashkey, econtext, &isNull, NULL);
     
     /*
      * keyval could be null, so we better point it to something
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index 2783e3917f4..c56cc61c805 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.9 1997/03/18 18:40:05 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.10 1997/04/22 03:30:36 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -734,10 +734,16 @@ switch_outer(List *clauses)
     Expr *temp = NULL;
     List *i = NIL;
     Expr *clause;
+    Node *op;
 
     foreach(i,clauses) {
 	clause = lfirst(i);
-	if(var_is_outer(get_rightop(clause))) {
+	op = (Node*)get_rightop(clause);
+	if ( IsA (op, ArrayRef) )
+	    op = ((ArrayRef*)op)->refexpr;
+	Assert ( IsA (op, Var) );
+	if ( var_is_outer ((Var*)op) )
+	{
 	    temp = make_clause(clause->opType, clause->oper,
 			       lcons(get_rightop(clause),
 				    lcons(get_leftop(clause),
-- 
GitLab