]> granicus.if.org Git - postgresql/commitdiff
Added BETWEEN and IN to grammar. Map != to <>.
authorBruce Momjian <bruce@momjian.us>
Sat, 30 Nov 1996 03:38:09 +0000 (03:38 +0000)
committerBruce Momjian <bruce@momjian.us>
Sat, 30 Nov 1996 03:38:09 +0000 (03:38 +0000)
src/backend/parser/gram.y
src/backend/parser/keywords.c
src/backend/parser/scan.l

index 677d08a0358f0d25c6b259707447c54948fd8cbf..8889bb456ecec1d77cde61ac386f18ca110e9327 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.19 1996/11/29 15:56:18 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.20 1996/11/30 03:38:05 momjian Exp $
  *
  * HISTORY
  *    AUTHOR           DATE            MAJOR EVENT
@@ -46,7 +46,7 @@
 
 static char saved_relname[NAMEDATALEN];  /* need this for complex attributes */
 static bool QueryIsRule = FALSE;
-
+static Node *saved_In_Expr;
 extern List *parsetree;
 
 /*
@@ -57,7 +57,7 @@ extern List *parsetree;
 /*#define __YYSCLASS*/
 
 static char *xlateSqlType(char *);
-static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
+static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
 
 /* old versions of flex define this as a macro */
 #if defined(yywrap)
@@ -127,8 +127,8 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
        oper_argtypes, OptStmtList, OptStmtBlock, opt_column_list, columnList,
        sort_clause, sortby_list, index_params, 
        name_list, from_clause, from_list, opt_array_bounds, nest_array_bounds,
-       expr_list, attrs, res_target_list, res_target_list2, def_list,
-       opt_indirection, group_clause, groupby_list, explain_options
+       expr_list, attrs, res_target_list, res_target_list2,
+       def_list, opt_indirection, group_clause, groupby_list, explain_options
 
 %type <boolean>        opt_inh_star, opt_binary, opt_instead, opt_with_copy, index_opt_unique
 
@@ -145,7 +145,8 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
 %type <coldef> columnDef
 %type <defelt> def_elem
 %type <node>   def_arg, columnElem, where_clause, 
-               a_expr, AexprConst, having_clause, groupby
+               a_expr, AexprConst, in_expr_nodes, not_in_expr_nodes,
+               having_clause, groupby
 %type <value>  NumConst
 %type <attr>   event_object, attr
 %type <sortby> sortby
@@ -169,10 +170,10 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
 
 /* Keywords */
 %token ABORT_TRANS, ACL, ADD, AFTER, AGGREGATE, ALL, ALTER, AND, APPEND,
-       ARCHIVE, ARCH_STORE, AS, ASC, BACKWARD, BEFORE, BEGIN_TRANS, BINARY,
-       BY, CAST, CHANGE, CLOSE, CLUSTER, COLUMN, COMMIT, COPY, CREATE, CURRENT,
-       CURSOR, DATABASE, DECLARE, DELETE, DELIMITERS, DESC, DISTINCT, DO,
-       DROP, END_TRANS,
+       ARCHIVE, ARCH_STORE, AS, ASC, BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN,
+       BINARY, BY, CAST, CHANGE, CLOSE, CLUSTER, COLUMN, COMMIT, COPY, CREATE,
+       CURRENT, CURSOR, DATABASE, DECLARE, DELETE, DELIMITERS, DESC, DISTINCT,
+       DO, DROP, END_TRANS,
        EXTEND, FETCH, FOR, FORWARD, FROM, FUNCTION, GRANT, GROUP, 
        HAVING, HEAVY, IN, INDEX, INHERITS, INSERT, INSTEAD, INTO, IS,
        ISNULL, LANGUAGE, LIGHT, LISTEN, LOAD, MERGE, MOVE, NEW, 
@@ -199,6 +200,8 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
 %right NOT
 %right         '='
 %nonassoc LIKE
+%nonassoc BETWEEN
+%nonassoc IN
 %nonassoc Op
 %nonassoc NOTNULL
 %nonassoc ISNULL
@@ -1813,6 +1816,20 @@ a_expr:  attr opt_indirection
                {   $$ = makeA_Expr(NOTNULL, NULL, $1, NULL); }
        | a_expr IS NOT PNULL
                {   $$ = makeA_Expr(NOTNULL, NULL, $1, NULL); }
+       | a_expr BETWEEN AexprConst AND AexprConst
+               {   $$ = makeA_Expr(AND, NULL,
+                       makeA_Expr(OP, ">=", $1, $3),
+                       makeA_Expr(OP, "<=", $1,$5));
+               }
+       | a_expr NOT BETWEEN AexprConst AND AexprConst
+               {   $$ = makeA_Expr(OR, NULL,
+                       makeA_Expr(OP, "<", $1, $4),
+                       makeA_Expr(OP, ">", $1, $6));
+               }
+       | a_expr IN { saved_In_Expr = $1; } '(' in_expr_nodes ')'
+               {   $$ = $5; }
+       | a_expr NOT IN { saved_In_Expr = $1; } '(' not_in_expr_nodes ')'
+               {   $$ = $6; }
        | a_expr AND a_expr
                {   $$ = makeA_Expr(AND, NULL, $1, $3); }
        | a_expr OR a_expr
@@ -1838,13 +1855,29 @@ opt_indirection:  '[' a_expr ']' opt_indirection
        | /* EMPTY */                   
                {   $$ = NIL; }
        ;
-
+   
 expr_list: a_expr
                { $$ = lcons($1, NIL); }
        |  expr_list ',' a_expr
                { $$ = lappend($1, $3); }
        ;
 
+in_expr_nodes: AexprConst
+               {   $$ = makeA_Expr(OP, "=", saved_In_Expr, $1); }
+       |  in_expr_nodes ',' AexprConst
+               {   $$ = makeA_Expr(OR, NULL, $1,
+                       makeA_Expr(OP, "=", saved_In_Expr, $3));
+               }
+       ;
+
+not_in_expr_nodes: AexprConst
+               {   $$ = makeA_Expr(OP, "<>", saved_In_Expr, $1); }
+       |  not_in_expr_nodes ',' AexprConst
+               {   $$ = makeA_Expr(AND, NULL, $1,
+                       makeA_Expr(OP, "<>", saved_In_Expr, $3));
+               }
+       ;
+
 attr:  relation_name '.' attrs
                {
                    $$ = makeNode(Attr);
@@ -2085,10 +2118,10 @@ Pnull:  PNULL;
 
 %%
 
-static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr)
+static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr)
 {
     A_Expr *a = makeNode(A_Expr);
-    a->oper = op;
+    a->oper = oper;
     a->opname = opname;
     a->lexpr = lexpr;
     a->rexpr = rexpr;
@@ -2114,7 +2147,8 @@ void parser_init(Oid *typev, int nargs)
 {
     QueryIsRule = false;
     saved_relname[0]= '\0';
-
+    saved_In_Expr = NULL;
+    
     param_type_init(typev, nargs);
 }
 
index 8c90f12fd82ba16cfbe4fa8bd79782c39f8c657f..8f6ab83bc57691be36db6c968bcee75efe2955f6 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.4 1996/11/13 20:49:04 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.5 1996/11/30 03:38:07 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -48,6 +48,7 @@ static ScanKeyword ScanKeywords[] = {
        { "backward",           BACKWARD        },
        { "before",             BEFORE          },
        { "begin",              BEGIN_TRANS     },
+       { "between",            BETWEEN         },
        { "binary",             BINARY          },
        { "by",                 BY              },
        { "cast",               CAST            },
index 3fba67a70cfad31dc6b6165c454d289536dc9acb..df824124671cea5e749a4d6ad6f6c9482fab52dc 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.4 1996/11/11 04:54:45 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.5 1996/11/30 03:38:09 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -97,7 +97,10 @@ other                .
 {self}         { return (yytext[0]);   }
 
 {operator}     {
-                       yylval.str = pstrdup((char*)yytext);
+                       if (strcmp((char*)yytext,"!=") == 0)
+                           yylval.str = pstrdup("<>"); /* compatability */
+                       else
+                           yylval.str = pstrdup((char*)yytext);
                        return (Op);
                }
 {param}                {       yylval.ival = atoi((char*)&yytext[1]);