Commit 2d7aacb0 authored by Bruce Momjian's avatar Bruce Momjian

Added BETWEEN and IN to grammar. Map != to <>.

parent a3d773a6
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * 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 * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
static char saved_relname[NAMEDATALEN]; /* need this for complex attributes */ static char saved_relname[NAMEDATALEN]; /* need this for complex attributes */
static bool QueryIsRule = FALSE; static bool QueryIsRule = FALSE;
static Node *saved_In_Expr;
extern List *parsetree; extern List *parsetree;
/* /*
...@@ -57,7 +57,7 @@ extern List *parsetree; ...@@ -57,7 +57,7 @@ extern List *parsetree;
/*#define __YYSCLASS*/ /*#define __YYSCLASS*/
static char *xlateSqlType(char *); 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 */ /* old versions of flex define this as a macro */
#if defined(yywrap) #if defined(yywrap)
...@@ -127,8 +127,8 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr); ...@@ -127,8 +127,8 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
oper_argtypes, OptStmtList, OptStmtBlock, opt_column_list, columnList, oper_argtypes, OptStmtList, OptStmtBlock, opt_column_list, columnList,
sort_clause, sortby_list, index_params, sort_clause, sortby_list, index_params,
name_list, from_clause, from_list, opt_array_bounds, nest_array_bounds, name_list, from_clause, from_list, opt_array_bounds, nest_array_bounds,
expr_list, attrs, res_target_list, res_target_list2, def_list, expr_list, attrs, res_target_list, res_target_list2,
opt_indirection, group_clause, groupby_list, explain_options 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 %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); ...@@ -145,7 +145,8 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
%type <coldef> columnDef %type <coldef> columnDef
%type <defelt> def_elem %type <defelt> def_elem
%type <node> def_arg, columnElem, where_clause, %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 <value> NumConst
%type <attr> event_object, attr %type <attr> event_object, attr
%type <sortby> sortby %type <sortby> sortby
...@@ -169,10 +170,10 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr); ...@@ -169,10 +170,10 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
/* Keywords */ /* Keywords */
%token ABORT_TRANS, ACL, ADD, AFTER, AGGREGATE, ALL, ALTER, AND, APPEND, %token ABORT_TRANS, ACL, ADD, AFTER, AGGREGATE, ALL, ALTER, AND, APPEND,
ARCHIVE, ARCH_STORE, AS, ASC, BACKWARD, BEFORE, BEGIN_TRANS, BINARY, ARCHIVE, ARCH_STORE, AS, ASC, BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN,
BY, CAST, CHANGE, CLOSE, CLUSTER, COLUMN, COMMIT, COPY, CREATE, CURRENT, BINARY, BY, CAST, CHANGE, CLOSE, CLUSTER, COLUMN, COMMIT, COPY, CREATE,
CURSOR, DATABASE, DECLARE, DELETE, DELIMITERS, DESC, DISTINCT, DO, CURRENT, CURSOR, DATABASE, DECLARE, DELETE, DELIMITERS, DESC, DISTINCT,
DROP, END_TRANS, DO, DROP, END_TRANS,
EXTEND, FETCH, FOR, FORWARD, FROM, FUNCTION, GRANT, GROUP, EXTEND, FETCH, FOR, FORWARD, FROM, FUNCTION, GRANT, GROUP,
HAVING, HEAVY, IN, INDEX, INHERITS, INSERT, INSTEAD, INTO, IS, HAVING, HEAVY, IN, INDEX, INHERITS, INSERT, INSTEAD, INTO, IS,
ISNULL, LANGUAGE, LIGHT, LISTEN, LOAD, MERGE, MOVE, NEW, ISNULL, LANGUAGE, LIGHT, LISTEN, LOAD, MERGE, MOVE, NEW,
...@@ -199,6 +200,8 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr); ...@@ -199,6 +200,8 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
%right NOT %right NOT
%right '=' %right '='
%nonassoc LIKE %nonassoc LIKE
%nonassoc BETWEEN
%nonassoc IN
%nonassoc Op %nonassoc Op
%nonassoc NOTNULL %nonassoc NOTNULL
%nonassoc ISNULL %nonassoc ISNULL
...@@ -1813,6 +1816,20 @@ a_expr: attr opt_indirection ...@@ -1813,6 +1816,20 @@ a_expr: attr opt_indirection
{ $$ = makeA_Expr(NOTNULL, NULL, $1, NULL); } { $$ = makeA_Expr(NOTNULL, NULL, $1, NULL); }
| a_expr IS NOT PNULL | a_expr IS NOT PNULL
{ $$ = makeA_Expr(NOTNULL, NULL, $1, NULL); } { $$ = 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 | a_expr AND a_expr
{ $$ = makeA_Expr(AND, NULL, $1, $3); } { $$ = makeA_Expr(AND, NULL, $1, $3); }
| a_expr OR a_expr | a_expr OR a_expr
...@@ -1838,13 +1855,29 @@ opt_indirection: '[' a_expr ']' opt_indirection ...@@ -1838,13 +1855,29 @@ opt_indirection: '[' a_expr ']' opt_indirection
| /* EMPTY */ | /* EMPTY */
{ $$ = NIL; } { $$ = NIL; }
; ;
expr_list: a_expr expr_list: a_expr
{ $$ = lcons($1, NIL); } { $$ = lcons($1, NIL); }
| expr_list ',' a_expr | expr_list ',' a_expr
{ $$ = lappend($1, $3); } { $$ = 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 attr: relation_name '.' attrs
{ {
$$ = makeNode(Attr); $$ = makeNode(Attr);
...@@ -2085,10 +2118,10 @@ Pnull: PNULL; ...@@ -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_Expr *a = makeNode(A_Expr);
a->oper = op; a->oper = oper;
a->opname = opname; a->opname = opname;
a->lexpr = lexpr; a->lexpr = lexpr;
a->rexpr = rexpr; a->rexpr = rexpr;
...@@ -2114,7 +2147,8 @@ void parser_init(Oid *typev, int nargs) ...@@ -2114,7 +2147,8 @@ void parser_init(Oid *typev, int nargs)
{ {
QueryIsRule = false; QueryIsRule = false;
saved_relname[0]= '\0'; saved_relname[0]= '\0';
saved_In_Expr = NULL;
param_type_init(typev, nargs); param_type_init(typev, nargs);
} }
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * 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[] = { ...@@ -48,6 +48,7 @@ static ScanKeyword ScanKeywords[] = {
{ "backward", BACKWARD }, { "backward", BACKWARD },
{ "before", BEFORE }, { "before", BEFORE },
{ "begin", BEGIN_TRANS }, { "begin", BEGIN_TRANS },
{ "between", BETWEEN },
{ "binary", BINARY }, { "binary", BINARY },
{ "by", BY }, { "by", BY },
{ "cast", CAST }, { "cast", CAST },
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 . ...@@ -97,7 +97,10 @@ other .
{self} { return (yytext[0]); } {self} { return (yytext[0]); }
{operator} { {operator} {
yylval.str = pstrdup((char*)yytext); if (strcmp((char*)yytext,"!=") == 0)
yylval.str = pstrdup("<>"); /* compatability */
else
yylval.str = pstrdup((char*)yytext);
return (Op); return (Op);
} }
{param} { yylval.ival = atoi((char*)&yytext[1]); {param} { yylval.ival = atoi((char*)&yytext[1]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment