From 53622d66d239da9a42ce2af29e9bc020041989a0 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Sat, 17 Jan 1998 05:01:34 +0000
Subject: [PATCH] Gram.y cleanup.

---
 src/backend/parser/gram.y | 75 +++++++++++++++++++++++++++++++++------
 1 file changed, 65 insertions(+), 10 deletions(-)

diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index a13a07aa2ce..0f43799d38b 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.92 1998/01/17 04:53:16 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.93 1998/01/17 05:01:34 momjian Exp $
  *
  * HISTORY
  *	  AUTHOR			DATE			MAJOR EVENT
@@ -63,6 +63,7 @@ extern List *parsetree;
 
 static char *xlateSqlType(char *);
 static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
+static Node *makeRowExpr(char *opr, List *largs, List *rargs);
 void mapTargetColumns(List *source, List *target);
 static List *makeConstantList( A_Const *node);
 static char *FlattenStringList(List *list);
@@ -2882,7 +2883,6 @@ row_expr: '(' row_descriptor ')' IN '(' SubSelect ')'
 					n->subselect = $7;
 					$$ = (Node *)n;
 				}
-/* We accept all Operators? */
 		| '(' row_descriptor ')' Op '(' SubSelect ')'
 				{
 					SubLink *n = makeNode(SubLink);
@@ -2892,17 +2892,10 @@ row_expr: '(' row_descriptor ')' IN '(' SubSelect ')'
 					n->subselect = $6;
 					$$ = (Node *)n;
 				}
-/* Do we need this?
 		| '(' row_descriptor ')' Op '(' row_descriptor ')'
 				{
-					SubLink *n = makeNode(SubLink);
-					n->lefthand = $2;
-					n->subLinkType = OPER_SUBLINK;
-					n->oper = lcons($4, NIL);
-					n->subselect = $6;
-					$$ = (Node *)n;
+					$$ = makeRowExpr($4, $2, $6);
 				}
-*/
 		;
 
 row_descriptor:  row_list ',' a_expr
@@ -3841,6 +3834,68 @@ makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr)
 	return (Node *)a;
 }
 
+/* makeRowExpr()
+ * Generate separate operator nodes for a single row descriptor expression.
+ * Perhaps this should go deeper in the parser someday... - thomas 1997-12-22
+ */
+static Node *
+makeRowExpr(char *opr, List *largs, List *rargs)
+{
+	Node *expr = NULL;
+	Node *larg, *rarg;
+
+	if (length(largs) != length(rargs))
+		elog(ERROR,"Unequal number of entries in row expression");
+
+	if (lnext(largs) != NIL)
+		expr = makeRowExpr(opr,lnext(largs),lnext(rargs));
+
+	larg = lfirst(largs);
+	rarg = lfirst(rargs);
+
+	if ((strcmp(opr, "=") == 0)
+	 || (strcmp(opr, "<") == 0)
+	 || (strcmp(opr, "<=") == 0)
+	 || (strcmp(opr, ">") == 0)
+	 || (strcmp(opr, ">=") == 0))
+	{
+		if (expr == NULL)
+			expr = makeA_Expr(OP, opr, larg, rarg);
+		else
+			expr = makeA_Expr(AND, NULL, expr, makeA_Expr(OP, opr, larg, rarg));
+	}
+	else if (strcmp(opr, "<>") == 0)
+	{
+		if (expr == NULL)
+			expr = makeA_Expr(OP, opr, larg, rarg);
+		else
+			expr = makeA_Expr(OR, NULL, expr, makeA_Expr(OP, opr, larg, rarg));
+	}
+	else
+	{
+		elog(ERROR,"Operator '%s' not implemented for row expressions",opr);
+	}
+
+#if FALSE
+	while ((largs != NIL) && (rargs != NIL))
+	{
+		larg = lfirst(largs);
+		rarg = lfirst(rargs);
+
+		if (expr == NULL)
+			expr = makeA_Expr(OP, opr, larg, rarg);
+		else
+			expr = makeA_Expr(AND, NULL, expr, makeA_Expr(OP, opr, larg, rarg));
+
+		largs = lnext(largs);
+		rargs = lnext(rargs);
+	}
+	pprint(expr);
+#endif
+
+	return expr;
+}
+
 void
 mapTargetColumns(List *src, List *dst)
 {
-- 
GitLab