10
10
*
11
11
*
12
12
* 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 $
14
14
*
15
15
* HISTORY
16
16
* AUTHORDATEMAJOR EVENT
46
46
47
47
static char saved_relname[NAMEDATALEN]; /* need this for complex attributes */
48
48
static bool QueryIsRule = FALSE;
49
-
49
+ static Node *saved_In_Expr;
50
50
extern List *parsetree;
51
51
52
52
/*
@@ -57,7 +57,7 @@ extern List *parsetree;
57
57
/*#define __YYSCLASS*/
58
58
59
59
static char *xlateSqlType(char *);
60
- static Node *makeA_Expr(intop , char *opname, Node *lexpr, Node *rexpr);
60
+ static Node *makeA_Expr(intoper , char *opname, Node *lexpr, Node *rexpr);
61
61
62
62
/* old versions of flex define this as a macro */
63
63
#if defined(yywrap)
@@ -127,8 +127,8 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
127
127
oper_argtypes, OptStmtList, OptStmtBlock, opt_column_list, columnList,
128
128
sort_clause, sortby_list, index_params,
129
129
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
132
132
133
133
%type <boolean>opt_inh_star, opt_binary, opt_instead, opt_with_copy, index_opt_unique
134
134
@@ -145,7 +145,8 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
145
145
%type <coldef>columnDef
146
146
%type <defelt>def_elem
147
147
%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
149
150
%type <value>NumConst
150
151
%type <attr>event_object, attr
151
152
%type <sortby>sortby
@@ -169,10 +170,10 @@ static Node *makeA_Expr(int op, char *opname, Node *lexpr, Node *rexpr);
169
170
170
171
/* Keywords */
171
172
%tokenABORT_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,
176
177
EXTEND, FETCH, FOR, FORWARD, FROM, FUNCTION, GRANT, GROUP,
177
178
HAVING, HEAVY, IN, INDEX, INHERITS, INSERT, INSTEAD, INTO, IS,
178
179
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
200
%rightNOT
200
201
%right '='
201
202
%nonassoc LIKE
203
+ %nonassoc BETWEEN
204
+ %nonassoc IN
202
205
%nonassoc Op
203
206
%nonassoc NOTNULL
204
207
%nonassoc ISNULL
@@ -1813,6 +1816,20 @@ a_expr: attr opt_indirection
1813
1816
{ $$ = makeA_Expr(NOTNULL, NULL, $1, NULL); }
1814
1817
| a_expr IS NOT PNULL
1815
1818
{ $$ = 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; }
1816
1833
| a_expr AND a_expr
1817
1834
{ $$ = makeA_Expr(AND, NULL, $1, $3); }
1818
1835
| a_expr OR a_expr
@@ -1838,13 +1855,29 @@ opt_indirection: '[' a_expr ']' opt_indirection
1838
1855
| /* EMPTY */
1839
1856
{ $$ = NIL; }
1840
1857
;
1841
-
1858
+
1842
1859
expr_list: a_expr
1843
1860
{ $$ = lcons($1, NIL); }
1844
1861
| expr_list ',' a_expr
1845
1862
{ $$ = lappend($1, $3); }
1846
1863
;
1847
1864
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
+
1848
1881
attr: relation_name '.' attrs
1849
1882
{
1850
1883
$$ = makeNode(Attr);
@@ -2085,10 +2118,10 @@ Pnull:PNULL;
2085
2118
2086
2119
%%
2087
2120
2088
- static Node *makeA_Expr(intop , char *opname, Node *lexpr, Node *rexpr)
2121
+ static Node *makeA_Expr(intoper , char *opname, Node *lexpr, Node *rexpr)
2089
2122
{
2090
2123
A_Expr *a = makeNode(A_Expr);
2091
- a->oper =op ;
2124
+ a->oper =oper ;
2092
2125
a->opname = opname;
2093
2126
a->lexpr = lexpr;
2094
2127
a->rexpr = rexpr;
@@ -2114,7 +2147,8 @@ void parser_init(Oid *typev, int nargs)
2114
2147
{
2115
2148
QueryIsRule = false;
2116
2149
saved_relname[0]= '\0';
2117
-
2150
+ saved_In_Expr = NULL;
2151
+
2118
2152
param_type_init(typev, nargs);
2119
2153
}
2120
2154