Skip to content

Commit 2d7aacb

Browse files
committed
Added BETWEEN and IN to grammar. Map != to <>.
1 parent a3d773a commit 2d7aacb

File tree

3 files changed

+55
-17
lines changed

3 files changed

+55
-17
lines changed

src/backend/parser/gram.y

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
*
1212
* IDENTIFICATION
13-
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.19 1996/11/29 15:56:18 momjian Exp $
13+
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.20 1996/11/30 03:38:05 momjian Exp $
1414
*
1515
* HISTORY
1616
* AUTHOR DATE MAJOR EVENT
@@ -46,7 +46,7 @@
4646

4747
static char saved_relname[NAMEDATALEN]; /* need this for complex attributes */
4848
static bool QueryIsRule = FALSE;
49-
49+
static Node *saved_In_Expr;
5050
extern List *parsetree;
5151

5252
/*
@@ -57,7 +57,7 @@ extern List *parsetree;
5757
/*#define __YYSCLASS*/
5858

5959
static char *xlateSqlType(char *);
60-
static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
60+
static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
6161

6262
/* old versions of flex define this as a macro */
6363
#if defined(yywrap)
@@ -127,8 +127,8 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
127127
oper_argtypes, OptStmtList, OptStmtBlock, opt_column_list, columnList,
128128
sort_clause, sortby_list, index_params,
129129
name_list, from_clause, from_list, opt_array_bounds, nest_array_bounds,
130-
expr_list, attrs, res_target_list, res_target_list2, def_list,
131-
opt_indirection, group_clause, groupby_list, explain_options
130+
expr_list, attrs, res_target_list, res_target_list2,
131+
def_list, opt_indirection, group_clause, groupby_list, explain_options
132132

133133
%type <boolean> opt_inh_star, opt_binary, opt_instead, opt_with_copy, index_opt_unique
134134

@@ -145,7 +145,8 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
145145
%type <coldef> columnDef
146146
%type <defelt> def_elem
147147
%type <node> def_arg, columnElem, where_clause,
148-
a_expr, AexprConst, having_clause, groupby
148+
a_expr, AexprConst, in_expr_nodes, not_in_expr_nodes,
149+
having_clause, groupby
149150
%type <value> NumConst
150151
%type <attr> event_object, attr
151152
%type <sortby> sortby
@@ -169,10 +170,10 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
169170

170171
/* Keywords */
171172
%token ABORT_TRANS, ACL, ADD, AFTER, AGGREGATE, ALL, ALTER, AND, APPEND,
172-
ARCHIVE, ARCH_STORE, AS, ASC, BACKWARD, BEFORE, BEGIN_TRANS, BINARY,
173-
BY, CAST, CHANGE, CLOSE, CLUSTER, COLUMN, COMMIT, COPY, CREATE, CURRENT,
174-
CURSOR, DATABASE, DECLARE, DELETE, DELIMITERS, DESC, DISTINCT, DO,
175-
DROP, END_TRANS,
173+
ARCHIVE, ARCH_STORE, AS, ASC, BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN,
174+
BINARY, BY, CAST, CHANGE, CLOSE, CLUSTER, COLUMN, COMMIT, COPY, CREATE,
175+
CURRENT, CURSOR, DATABASE, DECLARE, DELETE, DELIMITERS, DESC, DISTINCT,
176+
DO, DROP, END_TRANS,
176177
EXTEND, FETCH, FOR, FORWARD, FROM, FUNCTION, GRANT, GROUP,
177178
HAVING, HEAVY, IN, INDEX, INHERITS, INSERT, INSTEAD, INTO, IS,
178179
ISNULL, LANGUAGE, LIGHT, LISTEN, LOAD, MERGE, MOVE, NEW,
@@ -199,6 +200,8 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
199200
%right NOT
200201
%right '='
201202
%nonassoc LIKE
203+
%nonassoc BETWEEN
204+
%nonassoc IN
202205
%nonassoc Op
203206
%nonassoc NOTNULL
204207
%nonassoc ISNULL
@@ -1813,6 +1816,20 @@ a_expr: attr opt_indirection
18131816
{ $$ = makeA_Expr(NOTNULL, NULL, $1, NULL); }
18141817
| a_expr IS NOT PNULL
18151818
{ $$ = makeA_Expr(NOTNULL, NULL, $1, NULL); }
1819+
| a_expr BETWEEN AexprConst AND AexprConst
1820+
{ $$ = makeA_Expr(AND, NULL,
1821+
makeA_Expr(OP, ">=", $1, $3),
1822+
makeA_Expr(OP, "<=", $1,$5));
1823+
}
1824+
| a_expr NOT BETWEEN AexprConst AND AexprConst
1825+
{ $$ = makeA_Expr(OR, NULL,
1826+
makeA_Expr(OP, "<", $1, $4),
1827+
makeA_Expr(OP, ">", $1, $6));
1828+
}
1829+
| a_expr IN { saved_In_Expr = $1; } '(' in_expr_nodes ')'
1830+
{ $$ = $5; }
1831+
| a_expr NOT IN { saved_In_Expr = $1; } '(' not_in_expr_nodes ')'
1832+
{ $$ = $6; }
18161833
| a_expr AND a_expr
18171834
{ $$ = makeA_Expr(AND, NULL, $1, $3); }
18181835
| a_expr OR a_expr
@@ -1838,13 +1855,29 @@ opt_indirection: '[' a_expr ']' opt_indirection
18381855
| /* EMPTY */
18391856
{ $$ = NIL; }
18401857
;
1841-
1858+
18421859
expr_list: a_expr
18431860
{ $$ = lcons($1, NIL); }
18441861
| expr_list ',' a_expr
18451862
{ $$ = lappend($1, $3); }
18461863
;
18471864

1865+
in_expr_nodes: AexprConst
1866+
{ $$ = makeA_Expr(OP, "=", saved_In_Expr, $1); }
1867+
| in_expr_nodes ',' AexprConst
1868+
{ $$ = makeA_Expr(OR, NULL, $1,
1869+
makeA_Expr(OP, "=", saved_In_Expr, $3));
1870+
}
1871+
;
1872+
1873+
not_in_expr_nodes: AexprConst
1874+
{ $$ = makeA_Expr(OP, "<>", saved_In_Expr, $1); }
1875+
| not_in_expr_nodes ',' AexprConst
1876+
{ $$ = makeA_Expr(AND, NULL, $1,
1877+
makeA_Expr(OP, "<>", saved_In_Expr, $3));
1878+
}
1879+
;
1880+
18481881
attr: relation_name '.' attrs
18491882
{
18501883
$$ = makeNode(Attr);
@@ -2085,10 +2118,10 @@ Pnull: PNULL;
20852118

20862119
%%
20872120

2088-
static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr)
2121+
static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr)
20892122
{
20902123
A_Expr *a = makeNode(A_Expr);
2091-
a->oper = op;
2124+
a->oper = oper;
20922125
a->opname = opname;
20932126
a->lexpr = lexpr;
20942127
a->rexpr = rexpr;
@@ -2114,7 +2147,8 @@ void parser_init(Oid *typev, int nargs)
21142147
{
21152148
QueryIsRule = false;
21162149
saved_relname[0]= '\0';
2117-
2150+
saved_In_Expr = NULL;
2151+
21182152
param_type_init(typev, nargs);
21192153
}
21202154

src/backend/parser/keywords.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.4 1996/11/13 20:49:04 scrappy Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.5 1996/11/30 03:38:07 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -48,6 +48,7 @@ static ScanKeyword ScanKeywords[] = {
4848
{ "backward", BACKWARD },
4949
{ "before", BEFORE },
5050
{ "begin", BEGIN_TRANS },
51+
{ "between", BETWEEN },
5152
{ "binary", BINARY },
5253
{ "by", BY },
5354
{ "cast", CAST },

src/backend/parser/scan.l

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.4 1996/11/11 04:54:45 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.5 1996/11/30 03:38:09 momjian Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -97,7 +97,10 @@ other .
9797
{self} { return (yytext[0]); }
9898

9999
{operator} {
100-
yylval.str = pstrdup((char*)yytext);
100+
if (strcmp((char*)yytext,"!=") == 0)
101+
yylval.str = pstrdup("<>"); /* compatability */
102+
else
103+
yylval.str = pstrdup((char*)yytext);
101104
return (Op);
102105
}
103106
{param} { yylval.ival = atoi((char*)&yytext[1]);

0 commit comments

Comments
 (0)