Skip to content

Commit a4656b3

Browse files
committed
anyelements works for arrays
1 parent 003fb02 commit a4656b3

File tree

4 files changed

+59
-9
lines changed

4 files changed

+59
-9
lines changed

src/backend/parser/gram.y

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -659,9 +659,9 @@ static SelectStmt * makeElementSubselect(Node *of, const char *aliasname,
659659
* NOT_LA exists so that productions such as NOT LIKE can be given the same
660660
* precedence as LIKE; otherwise they'd effectively have the same precedence
661661
* as NOT, at least with respect to their left-hand subexpression.
662-
* NULLS_LA and WITH_LA are needed to make the grammar LALR(1).
662+
* NULLS_LA, WITH_LA and ANY_EL are needed to make the grammar LALR(1).
663663
*/
664-
%token NOT_LA NULLS_LA WITH_LA
664+
%token NOT_LA NULLS_LA WITH_LA ANY_EL
665665

666666

667667
/* Precedence: lowest to highest */
@@ -726,8 +726,6 @@ static SelectStmt * makeElementSubselect(Node *of, const char *aliasname,
726726
%left JOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
727727
/* kluge to keep xml_whitespace_option from causing shift/reduce conflicts */
728728
%right PRESERVE STRIP_P
729-
%right ELEMENT
730-
%nonassoc ANY
731729

732730
%%
733731

@@ -12060,7 +12058,7 @@ c_expr: columnref { $$ = $1; }
1206012058
g->location = @1;
1206112059
$$ = (Node *)g;
1206212060
}
12063-
| ANY ELEMENT OF a_expr AS ColId SATISFIES '(' a_expr ')'
12061+
| ANY_EL ELEMENT OF b_expr AS ColId SATISFIES '(' a_expr ')'
1206412062
{
1206512063
SubLink *n = makeNode(SubLink);
1206612064

@@ -12072,7 +12070,7 @@ c_expr: columnref { $$ = $1; }
1207212070
n->location = @1;
1207312071
$$ = (Node *)n;
1207412072
}
12075-
| EACH ELEMENT OF a_expr AS ColId SATISFIES '(' a_expr ')'
12073+
| EACH ELEMENT OF b_expr AS ColId SATISFIES '(' a_expr ')'
1207612074
{
1207712075
SubLink *n = makeNode(SubLink);
1207812076

src/backend/parser/parser.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,15 +107,16 @@ base_yylex(YYSTYPE *lvalp, YYLTYPE *llocp, core_yyscan_t yyscanner)
107107
*/
108108
switch (cur_token)
109109
{
110+
case ANY:
110111
case NOT:
111112
cur_token_length = 3;
112113
break;
113-
case NULLS_P:
114-
cur_token_length = 5;
115-
break;
116114
case WITH:
117115
cur_token_length = 4;
118116
break;
117+
case NULLS_P:
118+
cur_token_length = 5;
119+
break;
119120
default:
120121
return cur_token;
121122
}
@@ -189,6 +190,10 @@ base_yylex(YYSTYPE *lvalp, YYLTYPE *llocp, core_yyscan_t yyscanner)
189190
break;
190191
}
191192
break;
193+
case ANY:
194+
if (next_token == ELEMENT)
195+
cur_token = ANY_EL;
196+
break;
192197
}
193198

194199
return cur_token;

src/test/regress/expected/arrays.out

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -943,6 +943,47 @@ SELECT * FROM array_op_test WHERE t <@ '{}' ORDER BY seqno;
943943
101 | {} | {}
944944
(1 row)
945945

946+
--each/any element
947+
SELECT * FROM array_op_test WHERE ANY ELEMENT OF t AS e SATISFIES (e = 'AAAAAAAAAAAAAAAAA764') ORDER BY seqno;
948+
seqno | i | t
949+
-------+--------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------
950+
11 | {41,86,74,48,22,74,47,50} | {AAAAAAAA9523,AAAAAAAAAAAA37562,AAAAAAAAAAAAAAAA14047,AAAAAAAAAAA46154,AAAA41702,AAAAAAAAAAAAAAAAA764,AAAAA62737,39557}
951+
23 | {40,90,5,38,72,40,30,10,43,55} | {A6053,AAAAAAAAAAA6119,AA44673,AAAAAAAAAAAAAAAAA764,AA17009,AAAAA17383,AAAAA70514,AAAAA33250,AAAAA95309,AAAAAAAAAAAA37562}
952+
52 | {89,0} | {AAAAAAAAAAAAAAAAAA47955,AAAAAAA48038,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAA73084,AAAAA70466,AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA46154,AA66862}
953+
95 | {47,77} | {AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA74076,AAAAAAAAAA18107,AAAAA40681,AAAAAAAAAAAAAAA35875,AAAAA60038,AAAAAAA56483}
954+
(4 rows)
955+
956+
SELECT * FROM array_op_test WHERE ANY ELEMENT OF i AS e SATISFIES (e = 11) ORDER BY seqno;
957+
seqno | i | t
958+
-------+--------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------
959+
3 | {37,64,95,43,3,41,13,30,11,43} | {AAAAAAAAAA48845,AAAAA75968,AAAAA95309,AAA54451,AAAAAAAAAA22292,AAAAAAA99836,A96617,AA17009,AAAAAAAAAAAAAA95246}
960+
16 | {14,63,85,11} | {AAAAAA66777}
961+
22 | {11,6,56,62,53,30} | {AAAAAAAA72908}
962+
25 | {31,1,10,11,27,79,38} | {AAAAAAAAAAAAAAAAAA59334,45449}
963+
37 | {53,11,81,39,3,78,58,64,74} | {AAAAAAAAAAAAAAAAAAA17075,AAAAAAA66161,AAAAAAAA23648,AAAAAAAAAAAAAA10611}
964+
63 | {11,4,61,87} | {AAAAAAAAA27249,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAA13198,AAA20874,39557,51533,AAAAAAAAAAA53908,AAAAAAAAAAAAAA96505,AAAAAAAA78938}
965+
84 | {11,83,35,13,96,94} | {AAAAA95309,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAAA24183}
966+
93 | {11} | {AAAAAAAAAAA176,AAAAAAAAAAAAAA8666,AAAAAAAAAAAAAAA453,AAAAAAAAAAAAA85723,A68938,AAAAAAAAAAAAA9821,AAAAAAA48038,AAAAAAAAAAAAAAAAA59387,AA99927,AAAAA17383}
967+
(8 rows)
968+
969+
SELECT * FROM array_op_test WHERE EACH ELEMENT OF t AS e SATISFIES (e = 'AAAAAA66777') ORDER BY seqno;
970+
seqno | i | t
971+
-------+---------------+---------------
972+
16 | {14,63,85,11} | {AAAAAA66777}
973+
101 | {} | {}
974+
102 | {NULL} | {NULL}
975+
103 | |
976+
(4 rows)
977+
978+
SELECT * FROM array_op_test WHERE EACH ELEMENT OF i AS e SATISFIES (e = 11) ORDER BY seqno;
979+
seqno | i | t
980+
-------+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------
981+
93 | {11} | {AAAAAAAAAAA176,AAAAAAAAAAAAAA8666,AAAAAAAAAAAAAAA453,AAAAAAAAAAAAA85723,A68938,AAAAAAAAAAAAA9821,AAAAAAA48038,AAAAAAAAAAAAAAAAA59387,AA99927,AAAAA17383}
982+
101 | {} | {}
983+
102 | {NULL} | {NULL}
984+
103 | |
985+
(4 rows)
986+
946987
-- array casts
947988
SELECT ARRAY[1,2,3]::text[]::int[]::float8[] AS "{1,2,3}";
948989
{1,2,3}

src/test/regress/sql/arrays.sql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,12 @@ SELECT * FROM array_op_test WHERE t @> '{}' ORDER BY seqno;
260260
SELECT * FROM array_op_test WHERE t && '{}' ORDER BY seqno;
261261
SELECT * FROM array_op_test WHERE t <@ '{}' ORDER BY seqno;
262262

263+
--each/any element
264+
SELECT * FROM array_op_test WHERE ANY ELEMENT OF t AS e SATISFIES (e = 'AAAAAAAAAAAAAAAAA764') ORDER BY seqno;
265+
SELECT * FROM array_op_test WHERE ANY ELEMENT OF i AS e SATISFIES (e = 11) ORDER BY seqno;
266+
SELECT * FROM array_op_test WHERE EACH ELEMENT OF t AS e SATISFIES (e = 'AAAAAA66777') ORDER BY seqno;
267+
SELECT * FROM array_op_test WHERE EACH ELEMENT OF i AS e SATISFIES (e = 11) ORDER BY seqno;
268+
263269
-- array casts
264270
SELECT ARRAY[1,2,3]::text[]::int[]::float8[] AS "{1,2,3}";
265271
SELECT ARRAY[1,2,3]::text[]::int[]::float8[] is of (float8[]) as "TRUE";

0 commit comments

Comments
 (0)