]> granicus.if.org Git - postgresql/commitdiff
Gram.y cleanup.
authorBruce Momjian <bruce@momjian.us>
Sat, 17 Jan 1998 05:01:34 +0000 (05:01 +0000)
committerBruce Momjian <bruce@momjian.us>
Sat, 17 Jan 1998 05:01:34 +0000 (05:01 +0000)
src/backend/parser/gram.y

index a13a07aa2ce0234edc30501ffe064d4b6417c02f..0f43799d38b60cc6274ca71730c375e9412c30f9 100644 (file)
@@ -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)
 {