@@ -176,6 +176,8 @@ static void processCASbits(int cas_bits, int location, const char *constrType,
176
176
bool *deferrable,bool *initdeferred,bool *not_valid,
177
177
bool *no_inherit,core_yyscan_t yyscanner);
178
178
static Node *makeRecursiveViewSelect (char *relname, List *aliases, Node *query);
179
+ static SelectStmt *makeElementSubselect (Node *of,const char *aliasname,
180
+ Node *clause,int location);
179
181
180
182
%}
181
183
@@ -580,7 +582,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
580
582
DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DESC
581
583
DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P DOUBLE_P DROP
582
584
583
- EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
585
+ EACHELEMENT ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
584
586
EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
585
587
EXTENSION EXTERNAL EXTRACT
586
588
@@ -624,7 +626,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
624
626
RESET RESTART RESTRICT RETURNING RETURNS REVOKE RIGHT ROLE ROLLBACK ROLLUP
625
627
ROW ROWS RULE
626
628
627
- SAVEPOINT SCHEMA SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE SEQUENCES
629
+ SATISFIES SAVEPOINT SCHEMA SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE SEQUENCES
628
630
SERIALIZABLE SERVER SESSION SESSION_USER SET SETS SETOF SHARE SHOW
629
631
SIMILAR SIMPLE SKIP SMALLINT SNAPSHOT SOME SQL_P STABLE STANDALONE_P START
630
632
STATEMENT STATISTICS STDIN STDOUT STORAGE STRICT_P STRIP_P SUBSTRING
@@ -724,6 +726,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
724
726
%left JOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
725
727
/* kluge to keep xml_whitespace_option from causing shift/reduce conflicts*/
726
728
%right PRESERVE STRIP_P
729
+ %right ELEMENT
730
+ %nonassoc ANY
727
731
728
732
%%
729
733
@@ -12056,6 +12060,30 @@ c_expr:columnref{ $$ = $1; }
12056
12060
g->location =@1 ;
12057
12061
$$ = (Node *)g;
12058
12062
}
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
+ }
12059
12087
;
12060
12088
12061
12089
func_application :func_name ' (' ' )'
@@ -13644,6 +13672,7 @@ unreserved_keyword:
13644
13672
| DOUBLE_P
13645
13673
| DROP
13646
13674
| EACH
13675
+ | ELEMENT
13647
13676
| ENABLE_P
13648
13677
| ENCODING
13649
13678
| ENCRYPTED
@@ -13773,6 +13802,7 @@ unreserved_keyword:
13773
13802
| ROLLUP
13774
13803
| ROWS
13775
13804
| RULE
13805
+ | SATISFIES
13776
13806
| SAVEPOINT
13777
13807
| SCHEMA
13778
13808
| SCROLL
@@ -14829,6 +14859,29 @@ makeRecursiveViewSelect(char *relname, List *aliases, Node *query)
14829
14859
return (Node *) s;
14830
14860
}
14831
14861
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
+
14832
14885
/* parser_init()
14833
14886
* Initialize to parse one query string
14834
14887
*/