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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy