Skip to content

Commit 0d897d9

Browse files
committed
Support All a_expr and b_expr
1 parent f3bb1c2 commit 0d897d9

File tree

4 files changed

+125
-38
lines changed

4 files changed

+125
-38
lines changed

regress/expected/new_cypher.out

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,9 +229,11 @@ SELECT '"Hello"'::gtype = '"Hello"'::gtype;
229229
(1 row)
230230

231231
SELECT '{"Hello": "World"}'::gtype <@ '"Hello"'::gtype;
232-
ERROR: syntax error at or near "<@"
233-
LINE 1: SELECT '{"Hello": "World"}'::gtype <@ '"Hello"'::gtype;
234-
^
232+
?column?
233+
----------
234+
f
235+
(1 row)
236+
235237
SELECT 'Hello' LIKE 'Hello';
236238
?column?
237239
----------
@@ -522,6 +524,14 @@ SELECT ROW (1, 2, 3, 4);
522524
(1,2,3,4)
523525
(1 row)
524526

527+
SELECT *
528+
FROM tbl1
529+
WHERE i = SOME (SELECT j FROM tbl2);
530+
i
531+
---
532+
2
533+
(1 row)
534+
525535
DROP GRAPH new_cypher CASCADE;
526536
NOTICE: drop cascades to 2 other objects
527537
DETAIL: drop cascades to table new_cypher._ag_label_vertex

regress/sql/new_cypher.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,5 +202,9 @@ SELECT ARRAY [1, 2, 3, 4];
202202
SELECT (1, 2, 3, 4);
203203
SELECT ROW (1, 2, 3, 4);
204204

205+
SELECT *
206+
FROM tbl1
207+
WHERE i = SOME (SELECT j FROM tbl2);
208+
205209
DROP GRAPH new_cypher CASCADE;
206210
DROP GRAPH new_cypher_2 CASCADE;

src/backend/parser/cypher_gram.y

Lines changed: 104 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ static Node *makeOrExpr(Node *lexpr, Node *rexpr, int location);
9999
static Node *makeNotExpr(Node *expr, int location);
100100
static Node *makeAConst(Value *v, int location);
101101
static Node *makeAArrayExpr(List *elements, int location);
102+
static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args, int location);
102103

103104
#define parser_yyerror(msg) scanner_yyerror(msg, yyscanner)
104105
#define parser_errposition(pos) scanner_errposition(pos, yyscanner)
@@ -151,7 +152,7 @@ static Node *makeAArrayExpr(List *elements, int location);
151152
%token NOT_EQ LT_EQ GT_EQ DOT_DOT TYPECAST PLUS_EQ
152153

153154
/* keywords in alphabetical order */
154-
%token <keyword> ALL AND ANY ARRAY AS ASC ASCENDING ASYMMETRIC
155+
%token <keyword> ALL AND ANY ARRAY AS ASC ASCENDING ASYMMETRIC AT
155156

156157
BETWEEN BOTH BY
157158

@@ -160,7 +161,7 @@ static Node *makeAArrayExpr(List *elements, int location);
160161
CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA CURRENT_TIME
161162
CURRENT_TIMESTAMP CURRENT_USER
162163

163-
DATE DECADE DEFAULT DELETE DESC DESCENDING DETACH DISTINCT DROP
164+
DATE DECADE DEFAULT DELETE DESC DESCENDING DETACH DISTINCT DOCUMENT_P DROP
164165

165166
ELSE END_P ENDS ESCAPE EXCEPT EXCLUDE EXISTS EXTENSION EXTRACT
166167

@@ -177,7 +178,7 @@ static Node *makeAArrayExpr(List *elements, int location);
177178

178179
MATCH MERGE
179180

180-
NATURAL NFC NFD NFKC NFKD NO NORMALIZE NOT NOTNULL NULL_P NULLIF NULLS_LA
181+
NATURAL NFC NFD NFKC NFKD NO NORMALIZE NORMALIZED NOT NOTNULL NULL_P NULLIF NULLS_LA
181182

182183
ON ONLY OPTIONAL OTHERS OR ORDER OUTER OVER OVERLAPS OVERLAY
183184

@@ -189,7 +190,7 @@ static Node *makeAArrayExpr(List *elements, int location);
189190

190191
TABLE TEMP TEMPORARY TIME TIES THEN TIMESTAMP TO TRAILING TREAT TRIM TRUE_P
191192

192-
UNBOUNDED UNION UNKNOWN UNLOGGED UPDATE UNWIND USE USER USING
193+
UNBOUNDED UNION UNIQUE UNKNOWN UNLOGGED UPDATE UNWIND USE USER USING
193194

194195
VALUES VARIADIC VERSION_P
195196

@@ -334,7 +335,10 @@ static Node *makeAArrayExpr(List *elements, int location);
334335
any_name attrs opt_class
335336
var_list
336337

337-
%type <list> func_name
338+
%type <list> func_name qual_Op qual_all_Op subquery_Op
339+
%type <string> all_Op MathOp
340+
341+
%type <integer> sub_type
338342

339343
%type <defelt> def_elem reloption_elem
340344
%type <string> Sconst
@@ -1224,6 +1228,56 @@ explicit_row: ROW '(' expr_list ')' { $$ = $3; }
12241228
implicit_row: '(' expr_list ',' a_expr ')' { $$ = lappend($2, $4); }
12251229
;
12261230

1231+
sub_type: ANY { $$ = ANY_SUBLINK; }
1232+
| SOME { $$ = ANY_SUBLINK; }
1233+
| ALL { $$ = ALL_SUBLINK; }
1234+
;
1235+
1236+
all_Op: OPERATOR { $$ = $1; }
1237+
| MathOp { $$ = $1; }
1238+
;
1239+
1240+
MathOp: '+' { $$ = "+"; }
1241+
| '-' { $$ = "-"; }
1242+
| '*' { $$ = "*"; }
1243+
| '/' { $$ = "/"; }
1244+
| '%' { $$ = "%"; }
1245+
| '^' { $$ = "^"; }
1246+
| '<' { $$ = "<"; }
1247+
| '>' { $$ = ">"; }
1248+
| '=' { $$ = "="; }
1249+
| LT_EQ { $$ = "<="; }
1250+
| GT_EQ { $$ = ">="; }
1251+
| NOT_EQ { $$ = "<>"; }
1252+
;
1253+
1254+
qual_Op: OPERATOR
1255+
{ $$ = list_make1(makeString($1)); }
1256+
//| OPERATOR '(' any_operator ')'
1257+
// { $$ = $3; }
1258+
;
1259+
1260+
qual_all_Op:
1261+
all_Op
1262+
{ $$ = list_make1(makeString($1)); }
1263+
//| OPERATOR '(' any_operator ')'
1264+
// { $$ = $3; }
1265+
;
1266+
1267+
subquery_Op:
1268+
all_Op
1269+
{ $$ = list_make1(makeString($1)); }
1270+
//| OPERATOR '(' any_operator ')'
1271+
// { $$ = $3; }
1272+
| LIKE
1273+
{ $$ = list_make1(makeString("~~")); }
1274+
| NOT LIKE
1275+
{ $$ = list_make1(makeString("!~~")); }
1276+
| ILIKE
1277+
{ $$ = list_make1(makeString("~~*")); }
1278+
| NOT ILIKE
1279+
{ $$ = list_make1(makeString("!~~*")); }
1280+
12271281
/*****************************************************************************
12281282
*
12291283
* QUERY:
@@ -2808,21 +2862,21 @@ opt_slice_bound:
28082862
a_expr: c_expr { $$ = $1; }
28092863
| a_expr TYPECAST Typename
28102864
{ $$ = makeTypeCast($1, $3, @2); }
2811-
/*| a_expr COLLATE any_name
2865+
| a_expr COLLATE any_name
28122866
{
28132867
CollateClause *n = makeNode(CollateClause);
28142868
n->arg = $1;
28152869
n->collname = $3;
28162870
n->location = @2;
28172871
$$ = (Node *) n;
28182872
}
2819-
| a_expr AT TIME ZONE a_expr %prec AT
2873+
| a_expr AT TIME ZONE a_expr //%prec AT
28202874
{
28212875
$$ = (Node *) makeFuncCall(SystemFuncName("timezone"),
28222876
list_make2($5, $1),
28232877
COERCE_SQL_SYNTAX,
28242878
@2);
2825-
}*/
2879+
}
28262880
| '+' a_expr // %prec ;
28272881
{ $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); }
28282882
| '-' a_expr // %prec UMINUS
@@ -2851,12 +2905,10 @@ a_expr: c_expr { $$ = $1; }
28512905
{ $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $3, @2); }
28522906
| a_expr NOT_EQ a_expr
28532907
{ $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<>", $1, $3, @2); }
2854-
/*
2855-
| a_expr OPERATOR a_expr // %prec Op
2908+
| a_expr qual_Op a_expr %prec OPERATOR
28562909
{ $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3, @2); }
2857-
| OPERATOR a_expr // %prec Op
2910+
| qual_Op a_expr %prec OPERATOR
28582911
{ $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2, @1); }
2859-
*/
28602912
| a_expr AND a_expr
28612913
{ $$ = makeAndExpr($1, $3, @2); }
28622914
| a_expr OR a_expr
@@ -2987,23 +3039,21 @@ a_expr: c_expr { $$ = $1; }
29873039
n->location = @2;
29883040
$$ = (Node *)n;
29893041
}
2990-
/*| row OVERLAPS row
3042+
| row OVERLAPS row
29913043
{
29923044
if (list_length($1) != 2)
29933045
ereport(ERROR,
29943046
(errcode(ERRCODE_SYNTAX_ERROR),
2995-
errmsg("wrong number of parameters on left side of OVERLAPS expression"),
2996-
parser_errposition(@1)));
3047+
errmsg("wrong number of parameters on left side of OVERLAPS expression")));
29973048
if (list_length($3) != 2)
29983049
ereport(ERROR,
29993050
(errcode(ERRCODE_SYNTAX_ERROR),
3000-
errmsg("wrong number of parameters on right side of OVERLAPS expression"),
3001-
parser_errposition(@3)));
3051+
errmsg("wrong number of parameters on right side of OVERLAPS expression")));
30023052
$$ = (Node *) makeFuncCall(SystemFuncName("overlaps"),
30033053
list_concat($1, $3),
30043054
COERCE_SQL_SYNTAX,
30053055
@2);
3006-
}*/
3056+
}
30073057
| a_expr IS TRUE_P %prec IS
30083058
{
30093059
BooleanTest *b = makeNode(BooleanTest);
@@ -3125,8 +3175,8 @@ a_expr: c_expr { $$ = $1; }
31253175
{
31263176
$$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "<>", $1, $4, @2);
31273177
}
3128-
}/*
3129-
| a_expr subquery_Op sub_type select_with_parens %prec Op
3178+
}
3179+
| a_expr subquery_Op sub_type select_with_parens %prec OPERATOR
31303180
{
31313181
SubLink *n = makeNode(SubLink);
31323182
n->subLinkType = $3;
@@ -3137,7 +3187,7 @@ a_expr: c_expr { $$ = $1; }
31373187
n->location = @2;
31383188
$$ = (Node *)n;
31393189
}
3140-
| a_expr subquery_Op sub_type '(' a_expr ')' %prec Op
3190+
| a_expr subquery_Op sub_type '(' a_expr ')' %prec OPERATOR
31413191
{
31423192
if ($3 == ANY_SUBLINK)
31433193
$$ = (Node *) makeA_Expr(AEXPR_OP_ANY, $2, $1, $5, @2);
@@ -3148,8 +3198,7 @@ a_expr: c_expr { $$ = $1; }
31483198
{
31493199
ereport(ERROR,
31503200
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3151-
errmsg("UNIQUE predicate is not yet implemented"),
3152-
parser_errposition(@1)));
3201+
errmsg("UNIQUE predicate is not yet implemented")));
31533202
}
31543203
| a_expr IS DOCUMENT_P %prec IS
31553204
{
@@ -3198,7 +3247,7 @@ a_expr: c_expr { $$ = $1; }
31983247
SetToDefault *n = makeNode(SetToDefault);
31993248
n->location = @1;
32003249
$$ = (Node *)n;
3201-
}*/
3250+
}
32023251
;
32033252

32043253

@@ -3246,10 +3295,10 @@ b_expr: c_expr
32463295
{ $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $3, @2); }
32473296
| b_expr NOT_EQ b_expr
32483297
{ $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<>", $1, $3, @2); }
3249-
/*| b_expr qual_Op b_expr %prec Op
3298+
| b_expr qual_Op b_expr %prec OPERATOR
32503299
{ $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3, @2); }
3251-
| qual_Op b_expr %prec Op
3252-
{ $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2, @1); }*/
3300+
| qual_Op b_expr %prec OPERATOR
3301+
{ $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2, @1); }
32533302
| b_expr IS DISTINCT FROM b_expr %prec IS
32543303
{
32553304
$$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5, @2);
@@ -3258,7 +3307,7 @@ b_expr: c_expr
32583307
{
32593308
$$ = (Node *) makeSimpleA_Expr(AEXPR_NOT_DISTINCT, "=", $1, $6, @2);
32603309
}
3261-
/*| b_expr IS DOCUMENT_P %prec IS
3310+
| b_expr IS DOCUMENT_P %prec IS
32623311
{
32633312
$$ = makeXmlExpr(IS_DOCUMENT, NULL, NIL,
32643313
list_make1($1), @2);
@@ -3268,7 +3317,7 @@ b_expr: c_expr
32683317
$$ = makeNotExpr(makeXmlExpr(IS_DOCUMENT, NULL, NIL,
32693318
list_make1($1), @2),
32703319
@2);
3271-
}*/
3320+
}
32723321
;
32733322

32743323
/*
@@ -6127,8 +6176,7 @@ insertSelectOptions(SelectStmt *stmt,
61276176
if (stmt->sortClause)
61286177
ereport(ERROR,
61296178
(errcode(ERRCODE_SYNTAX_ERROR),
6130-
errmsg("multiple ORDER BY clauses not allowed"),
6131-
parser_errposition(exprLocation((Node *) sortClause))));
6179+
errmsg("multiple ORDER BY clauses not allowed")));
61326180
stmt->sortClause = sortClause;
61336181
}
61346182
/* We can handle multiple locking clauses, though */
@@ -6138,17 +6186,15 @@ insertSelectOptions(SelectStmt *stmt,
61386186
if (stmt->limitOffset)
61396187
ereport(ERROR,
61406188
(errcode(ERRCODE_SYNTAX_ERROR),
6141-
errmsg("multiple OFFSET clauses not allowed"),
6142-
parser_errposition(exprLocation(limitClause->limitOffset))));
6189+
errmsg("multiple OFFSET clauses not allowed")));
61436190
stmt->limitOffset = limitClause->limitOffset;
61446191
}
61456192
if (limitClause && limitClause->limitCount)
61466193
{
61476194
if (stmt->limitCount)
61486195
ereport(ERROR,
61496196
(errcode(ERRCODE_SYNTAX_ERROR),
6150-
errmsg("multiple LIMIT clauses not allowed"),
6151-
parser_errposition(exprLocation(limitClause->limitCount))));
6197+
errmsg("multiple LIMIT clauses not allowed")));
61526198
stmt->limitCount = limitClause->limitCount;
61536199
}
61546200
if (limitClause && limitClause->limitOption != LIMIT_OPTION_DEFAULT)
@@ -6362,3 +6408,26 @@ makeAArrayExpr(List *elements, int location)
63626408
n->location = location;
63636409
return (Node *) n;
63646410
}
6411+
6412+
6413+
static Node *
6414+
makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args,
6415+
int location)
6416+
{
6417+
XmlExpr *x = makeNode(XmlExpr);
6418+
6419+
x->op = op;
6420+
x->name = name;
6421+
/*
6422+
* named_args is a list of ResTarget; it'll be split apart into separate
6423+
* expression and name lists in transformXmlExpr().
6424+
*/
6425+
x->named_args = named_args;
6426+
x->arg_names = NIL;
6427+
x->args = args;
6428+
/* xmloption, if relevant, must be filled in by caller */
6429+
/* type and typmod will be filled in during parse analysis */
6430+
x->type = InvalidOid; /* marks the node as not analyzed */
6431+
x->location = location;
6432+
return (Node *) x;
6433+
}

src/include/parser/cypher_kwlist.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ PG_KEYWORD("as", AS, RESERVED_KEYWORD)
66
PG_KEYWORD("asc", ASC, RESERVED_KEYWORD)
77
PG_KEYWORD("ascending", ASCENDING, RESERVED_KEYWORD)
88
PG_KEYWORD("asymmetric", ASYMMETRIC, RESERVED_KEYWORD)
9+
PG_KEYWORD("at", AT, RESERVED_KEYWORD)
910
PG_KEYWORD("between", BETWEEN, RESERVED_KEYWORD)
1011
PG_KEYWORD("both", BOTH, RESERVED_KEYWORD)
1112
PG_KEYWORD("by", BY, RESERVED_KEYWORD)
@@ -35,6 +36,7 @@ PG_KEYWORD("desc", DESC, RESERVED_KEYWORD)
3536
PG_KEYWORD("descending", DESCENDING, RESERVED_KEYWORD)
3637
PG_KEYWORD("detach", DETACH, RESERVED_KEYWORD)
3738
PG_KEYWORD("distinct", DISTINCT, RESERVED_KEYWORD)
39+
PG_KEYWORD("document", DOCUMENT_P, RESERVED_KEYWORD)
3840
PG_KEYWORD("drop", DROP, RESERVED_KEYWORD)
3941
PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
4042
PG_KEYWORD("end", END_P, RESERVED_KEYWORD)
@@ -89,6 +91,7 @@ PG_KEYWORD("nfkc", NFKC, UNRESERVED_KEYWORD)
8991
PG_KEYWORD("nfkd", NFKD, UNRESERVED_KEYWORD)
9092
PG_KEYWORD("no", NO, RESERVED_KEYWORD)
9193
PG_KEYWORD("normalize", NORMALIZE, RESERVED_KEYWORD)
94+
PG_KEYWORD("normalized", NORMALIZED, RESERVED_KEYWORD)
9295
PG_KEYWORD("not", NOT, RESERVED_KEYWORD)
9396
PG_KEYWORD("notnull", NOTNULL, RESERVED_KEYWORD)
9497
PG_KEYWORD("null", NULL_P, RESERVED_KEYWORD)
@@ -141,6 +144,7 @@ PG_KEYWORD("trim", TRIM, RESERVED_KEYWORD)
141144
PG_KEYWORD("true", TRUE_P, RESERVED_KEYWORD)
142145
PG_KEYWORD("unbounded", UNBOUNDED, RESERVED_KEYWORD)
143146
PG_KEYWORD("union", UNION, RESERVED_KEYWORD)
147+
PG_KEYWORD("unique", UNIQUE, RESERVED_KEYWORD)
144148
PG_KEYWORD("unknown", UNKNOWN, RESERVED_KEYWORD)
145149
PG_KEYWORD("unlogged", UNLOGGED, RESERVED_KEYWORD)
146150
PG_KEYWORD("unwind", UNWIND, RESERVED_KEYWORD)

0 commit comments

Comments
 (0)