Skip to content

Commit 003fb02

Browse files
committed
base, conflict isnt solved yet
1 parent 55c0da3 commit 003fb02

File tree

2 files changed

+57
-2
lines changed

2 files changed

+57
-2
lines changed

src/backend/parser/gram.y

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ static void processCASbits(int cas_bits, int location, const char *constrType,
176176
bool *deferrable, bool *initdeferred, bool *not_valid,
177177
bool *no_inherit, core_yyscan_t yyscanner);
178178
static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
179+
static SelectStmt * makeElementSubselect(Node *of, const char *aliasname,
180+
Node *clause, int location);
179181

180182
%}
181183

@@ -580,7 +582,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
580582
DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DESC
581583
DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P DOUBLE_P DROP
582584

583-
EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
585+
EACH ELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
584586
EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
585587
EXTENSION EXTERNAL EXTRACT
586588

@@ -624,7 +626,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
624626
RESET RESTART RESTRICT RETURNING RETURNS REVOKE RIGHT ROLE ROLLBACK ROLLUP
625627
ROW ROWS RULE
626628

627-
SAVEPOINT SCHEMA SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE SEQUENCES
629+
SATISFIES SAVEPOINT SCHEMA SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE SEQUENCES
628630
SERIALIZABLE SERVER SESSION SESSION_USER SET SETS SETOF SHARE SHOW
629631
SIMILAR SIMPLE SKIP SMALLINT SNAPSHOT SOME SQL_P STABLE STANDALONE_P START
630632
STATEMENT STATISTICS STDIN STDOUT STORAGE STRICT_P STRIP_P SUBSTRING
@@ -724,6 +726,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
724726
%left JOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
725727
/* kluge to keep xml_whitespace_option from causing shift/reduce conflicts */
726728
%right PRESERVE STRIP_P
729+
%right ELEMENT
730+
%nonassoc ANY
727731

728732
%%
729733

@@ -12056,6 +12060,30 @@ c_expr: columnref { $$ = $1; }
1205612060
g->location = @1;
1205712061
$$ = (Node *)g;
1205812062
}
12063+
| ANY ELEMENT OF a_expr AS ColId SATISFIES '(' a_expr ')'
12064+
{
12065+
SubLink *n = makeNode(SubLink);
12066+
12067+
n->subLinkType = EXISTS_SUBLINK;
12068+
n->subLinkId = 0;
12069+
n->testexpr = NULL;
12070+
n->operName = NIL;
12071+
n->subselect = (Node*)makeElementSubselect($4, $6, $9, @1);
12072+
n->location = @1;
12073+
$$ = (Node *)n;
12074+
}
12075+
| EACH ELEMENT OF a_expr AS ColId SATISFIES '(' a_expr ')'
12076+
{
12077+
SubLink *n = makeNode(SubLink);
12078+
12079+
n->subLinkType = EXISTS_SUBLINK;
12080+
n->subLinkId = 0;
12081+
n->testexpr = NULL;
12082+
n->operName = NIL;
12083+
n->subselect = (Node*)makeElementSubselect($4, $6, makeNotExpr($9, @1), @1);
12084+
n->location = @1;
12085+
$$ = makeNotExpr((Node *)n, @1);;
12086+
}
1205912087
;
1206012088

1206112089
func_application: func_name '(' ')'
@@ -13644,6 +13672,7 @@ unreserved_keyword:
1364413672
| DOUBLE_P
1364513673
| DROP
1364613674
| EACH
13675+
| ELEMENT
1364713676
| ENABLE_P
1364813677
| ENCODING
1364913678
| ENCRYPTED
@@ -13773,6 +13802,7 @@ unreserved_keyword:
1377313802
| ROLLUP
1377413803
| ROWS
1377513804
| RULE
13805+
| SATISFIES
1377613806
| SAVEPOINT
1377713807
| SCHEMA
1377813808
| SCROLL
@@ -14829,6 +14859,29 @@ makeRecursiveViewSelect(char *relname, List *aliases, Node *query)
1482914859
return (Node *) s;
1483014860
}
1483114861

14862+
static SelectStmt *
14863+
makeElementSubselect(Node *of, const char *aliasname, Node *clause, int location)
14864+
{
14865+
ResTarget *target = makeNode(ResTarget);
14866+
FuncCall *func_call;
14867+
RangeFunction *table_ref = makeNode(RangeFunction);
14868+
SelectStmt *subselect = makeNode(SelectStmt);
14869+
14870+
target->val = (Node*)makeIntConst(1, location);
14871+
target->location = location;
14872+
14873+
func_call = makeFuncCall(SystemFuncName("unnest"), list_make1(of), location);
14874+
14875+
table_ref->functions = list_make1(list_make2(func_call, NIL));
14876+
table_ref->alias = makeAlias(aliasname, NIL);
14877+
14878+
subselect->targetList = list_make1(target);
14879+
subselect->fromClause = list_make1(table_ref); /* unnest(of) as aliasname */
14880+
subselect->whereClause = clause;
14881+
14882+
return subselect;
14883+
}
14884+
1483214885
/* parser_init()
1483314886
* Initialize to parse one query string
1483414887
*/

src/include/parser/kwlist.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)
136136
PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)
137137
PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)
138138
PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)
139+
PG_KEYWORD("element", ELEMENT, UNRESERVED_KEYWORD)
139140
PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)
140141
PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)
141142
PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)
@@ -331,6 +332,7 @@ PG_KEYWORD("rollup", ROLLUP, UNRESERVED_KEYWORD)
331332
PG_KEYWORD("row", ROW, COL_NAME_KEYWORD)
332333
PG_KEYWORD("rows", ROWS, UNRESERVED_KEYWORD)
333334
PG_KEYWORD("rule", RULE, UNRESERVED_KEYWORD)
335+
PG_KEYWORD("satisfies", SATISFIES, UNRESERVED_KEYWORD)
334336
PG_KEYWORD("savepoint", SAVEPOINT, UNRESERVED_KEYWORD)
335337
PG_KEYWORD("schema", SCHEMA, UNRESERVED_KEYWORD)
336338
PG_KEYWORD("scroll", SCROLL, UNRESERVED_KEYWORD)

0 commit comments

Comments
 (0)