Skip to content

Commit 72be7be

Browse files
committed
Get the WITH_LA Token Supported
1 parent 087c283 commit 72be7be

File tree

3 files changed

+53
-31
lines changed

3 files changed

+53
-31
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ src/include/parser/cypher_kwlist_d.h: src/include/parser/cypher_kwlist.h $(GEN_K
126126

127127
src/include/parser/cypher_gram_def.h: src/backend/parser/cypher_gram.c
128128

129-
src/backend/parser/cypher_gram.c: BISONFLAGS += --defines=src/include/parser/cypher_gram_def.h
129+
src/backend/parser/cypher_gram.c: BISONFLAGS += --defines=src/include/parser/cypher_gram_def.h
130130

131131
src/backend/parser/cypher_parser.o: src/backend/parser/cypher_gram.c
132132
src/backend/parser/cypher_keywords.o: src/backend/parser/cypher_gram.c

src/backend/parser/cypher_gram.y

+39-28
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
240240

241241
MATERIALIZED MATCH MAPPING MAXVALUE MERGE METHOD MINVALUE MINUTE_P MONTH_P MODE MOVE
242242

243-
NAME_P NAMES NATIONAL NATURAL NCHAR NEXT NEW NFC NFD NFKC NFKD NO NONE NORMALIZE NORMALIZED NOT NOTHING NOTNULL NOWAIT NULL_P NULLIF NULLS_LA NUMERIC
243+
NAME_P NAMES NATIONAL NATURAL NCHAR NEXT NEW NFC NFD NFKC NFKD NO NONE NORMALIZE NORMALIZED NOT NOTHING NOTNULL NOWAIT NULL_P NULLIF NUMERIC
244244
NOTIFY
245245

246246
OBJECT_P OPERATOR_P OF OFF OFFSET OIDS ON ONLY OPTION OPTIONS OPTIONAL OTHERS OR ORDINALITY OLD ORDER OUT_P OUTER OVER OVERRIDING OVERLAPS OVERLAY OWNED OWNER
@@ -735,26 +735,28 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
735735
%type <list> hash_partbound
736736
%type <defelt> hash_partbound_elem
737737

738+
%token NOT_LA NULLS_LA WITH_LA
739+
738740
/* precedence: lowest to highest */
739-
%nonassoc SET /* see relation_expr_opt_alias */
740-
%left UNION INTERSECT EXCEPT
741-
%left OR
741+
%nonassoc SET /* see relation_expr_opt_alias */
742+
%left UNION EXCEPT
743+
%left INTERSECT
744+
%left OR XOR
742745
%left AND
743-
%left XOR
744746
%right NOT
745-
%nonassoc IS ISNULL NOTNULL /* IS sets precedence for IS NULL, etc */
746-
%nonassoc '=' NOT_EQ '<' LT_EQ '>' GT_EQ '~' '!'
747-
%nonassoc IN BETWEEN LIKE ILIKE
748-
%nonassoc CONTAINS ENDS EQ_TILDE STARTS SIMILAR
747+
%nonassoc IS ISNULL NOTNULL /* IS sets precedence for IS NULL, etc */
748+
%nonassoc '<' '>' '=' NOT_EQ LT_EQ GT_EQ
749+
%nonassoc BETWEEN IN LIKE ILIKE SIMILAR
749750
%nonassoc ESCAPE
750-
%nonassoc UNBOUNDED /* ideally would have same precedence as IDENT */
751-
%nonassoc IDENTIFIER PARTITION RANGE ROWS GROUPS PRECEDING FOLLOWING CUBE ROLLUP
752-
753-
%left OPERATOR RIGHT_ARROW COLON_EQUALS OPERATOR_P
751+
%nonassoc UNBOUNDED /* ideally would have same precedence as IDENT */
752+
%nonassoc IDENTIFIER PARTITION RANGE ROWS GROUPS PRECEDING FOLLOWING CUBE ROLLUP
753+
%left OPERATOR RIGHT_ARROW OPERATOR_P
754754
%left '+' '-'
755755
%left '*' '/' '%'
756-
%left '^' '&' '|'
757-
756+
%left '^'
757+
/* Unary Operators */
758+
%left AT /* sets precedence for AT TIME ZONE */
759+
%left COLLATE
758760
%right UNARY_MINUS
759761
%left '[' ']'
760762
%left '(' ')'
@@ -898,10 +900,10 @@ stmtmulti: stmtmulti ';' stmt
898900
* query
899901
*/
900902
stmt:
901-
cypher_stmt { $$ = (Node *)$1; }
902-
| CreateGraphStmt
903-
| DropGraphStmt
904-
| UseGraphStmt
903+
cypher_stmt { $$ = (Node *)$1; }
904+
| CreateGraphStmt
905+
| DropGraphStmt
906+
| UseGraphStmt
905907
| TransactionStmtLegacy
906908
| AlterEventTrigStmt
907909
| AlterCollationStmt
@@ -1307,6 +1309,13 @@ with_clause:
13071309
$$->recursive = false;
13081310
$$->location = @1;
13091311
}
1312+
| WITH_LA cte_list
1313+
{
1314+
$$ = makeNode(WithClause);
1315+
$$->ctes = $2;
1316+
$$->recursive = false;
1317+
$$->location = @1;
1318+
}
13101319
| WITH RECURSIVE cte_list
13111320
{
13121321
$$ = makeNode(WithClause);
@@ -4219,7 +4228,7 @@ single_query:
42194228
;
42204229

42214230
cypher_query_start:
4222-
create
4231+
create
42234232
| match
42244233
| CYPHER with { $$ = $2; }
42254234
| merge
@@ -4237,10 +4246,10 @@ cypher_query_body:
42374246
{
42384247
$$ = lappend($1, $2);
42394248
}
4240-
| // Empty
4241-
{
4249+
// | // Empty
4250+
/*{
42424251
$$ = NIL;
4243-
}
4252+
}*/
42444253
;
42454254

42464255
clause:
@@ -6446,6 +6455,7 @@ AlterTSConfigurationStmt:
64466455

64476456
/* Use this if TIME or ORDINALITY after WITH should be taken as an identifier */
64486457
any_with: WITH
6458+
| WITH_LA
64496459
;
64506460

64516461

@@ -10968,6 +10978,7 @@ CreateRoleStmt:
1096810978
;
1096910979

1097010980
opt_with: WITH
10981+
| WITH_LA
1097110982
| /*EMPTY*/
1097210983
;
1097310984

@@ -13220,7 +13231,7 @@ opt_col_def_list: AS '(' TableFuncElementList ')' { $$ = $3; }
1322013231
| /*EMPTY*/ { $$ = NIL; }
1322113232
;
1322213233

13223-
opt_ordinality: WITH ORDINALITY { $$ = true; }
13234+
opt_ordinality: WITH_LA ORDINALITY { $$ = true; }
1322413235
| /*EMPTY*/ { $$ = false; }
1322513236
;
1322613237

@@ -15399,7 +15410,7 @@ ConstInterval:
1539915410
;
1540015411

1540115412
opt_timezone:
15402-
WITH TIME ZONE { $$ = true; }
15413+
WITH_LA TIME ZONE { $$ = true; }
1540315414
| WITHOUT TIME ZONE { $$ = false; }
1540415415
| /*EMPTY*/ { $$ = false; }
1540515416
;
@@ -15813,7 +15824,7 @@ unreserved_keyword:
1581315824
| NOTHING
1581415825
| NOTIFY
1581515826
| NOWAIT
15816-
| NULLS_LA
15827+
//| NULLS_LA
1581715828
| OBJECT_P
1581815829
| OF
1581915830
| OFF
@@ -16304,7 +16315,7 @@ bare_label_keyword:
1630416315
| NOWAIT
1630516316
| NULL_P
1630616317
| NULLIF
16307-
| NULLS_LA
16318+
//| NULLS_LA
1630816319
| NUMERIC
1630916320
| OBJECT_P
1631016321
| OF
@@ -17073,7 +17084,7 @@ cypher_a_expr:
1707317084
{
1707417085
$$ = (Node *)makeSimpleA_Expr(AEXPR_OP, "~", $1, $3, @2);
1707517086
}
17076-
| cypher_a_expr '[' cypher_a_expr ']' %prec UMINUS
17087+
| cypher_a_expr '[' cypher_a_expr ']' %prec UNARY_MINUS
1707717088
{
1707817089
A_Indices *i;
1707917090

src/backend/parser/cypher_parser.c

+13-2
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ int cypher_yylex(YYSTYPE *lvalp, YYLTYPE *llocp, ag_scanner_t scanner, ag_yy_ext
282282
OPERATOR,
283283
RIGHT_ARROW,
284284
PLUS_EQ,
285-
INET
285+
INET,
286286
};
287287
// ag_yy_extra *extra = ag_yyget_extra(scanner);
288288
ag_token token;
@@ -399,6 +399,17 @@ int cypher_yylex(YYSTYPE *lvalp, YYLTYPE *llocp, ag_scanner_t scanner, ag_yy_ext
399399
*/
400400
lvalp->keyword = GetScanKeyword(kwnum, &CypherKeyword);
401401
*llocp = token.location;
402+
if (CypherKeywordTokens[kwnum] == WITH) {
403+
ag_token next_token = ag_scanner_next_token(scanner);
404+
extra->lookahead_token = next_token;
405+
extra->have_lookahead = true;
406+
if (next_token.type == AG_TOKEN_IDENTIFIER)
407+
truncate_identifier(next_token.value.s, strlen(next_token.value.s), true);
408+
if (next_token.type == AG_TOKEN_IDENTIFIER && (!strcmp("time", next_token.value.s) || !strcmp("ordinality", next_token.value.s)))
409+
{
410+
return WITH_LA;
411+
}
412+
}
402413
return CypherKeywordTokens[kwnum];
403414
}
404415

@@ -451,7 +462,7 @@ List *parse_cypher(const char *s)
451462
cypher_yy_extra extra;
452463
int yyresult;
453464

454-
scanner = ag_scanner_create(s, &CypherKeyword, &CypherKeywordTokens);
465+
scanner = ag_scanner_create(pstrdup(s), &CypherKeyword, &CypherKeywordTokens);
455466
extra.result = NIL;
456467

457468
yyresult = cypher_yyparse(scanner, &extra);

0 commit comments

Comments
 (0)