From 8a9aadfbccd44a6bfa9d113b7f49acb451852eca Mon Sep 17 00:00:00 2001 From: John Gemignani Date: Mon, 26 Feb 2024 17:21:22 -0800 Subject: [PATCH] Fix List Comprehension shift/reduce grammar issue. Fixed the List Comprehension shift/reduce grammar issue by creating a new keyword, FROM, to replace IN. Updated the sql and regression tests to align with the changes. --- regress/expected/list_comprehension.out | 162 +++++++++++------------ regress/sql/list_comprehension.sql | 164 ++++++++++++------------ src/backend/parser/cypher_gram.y | 7 +- src/include/parser/cypher_kwlist.h | 3 +- 4 files changed, 169 insertions(+), 167 deletions(-) diff --git a/regress/expected/list_comprehension.out b/regress/expected/list_comprehension.out index 8b7a64531..fed78b73b 100644 --- a/regress/expected/list_comprehension.out +++ b/regress/expected/list_comprehension.out @@ -43,73 +43,73 @@ SELECT * from cypher('list_comprehension', $$ CREATE (u {list: []}) RETURN u $$) {"id": 281474976710659, "label": "", "properties": {"list": []}}::vertex (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2)] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2)] $$) AS (result agtype); result --------------------------------------------------------- [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2)][2] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2)][2] $$) AS (result agtype); result -------- 5 (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2)][1..4] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2)][1..4] $$) AS (result agtype); result ----------- [3, 5, 7] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) WHERE u % 3 = 0] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) WHERE u % 3 = 0] $$) AS (result agtype); result -------------------- [3, 9, 15, 21, 27] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) WHERE u % 3 = 0][2] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) WHERE u % 3 = 0][2] $$) AS (result agtype); result -------- 15 (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) WHERE u % 3 = 0][0..4] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) WHERE u % 3 = 0][0..4] $$) AS (result agtype); result ---------------- [3, 9, 15, 21] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) WHERE u % 3 = 0 | u^2 ] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) WHERE u % 3 = 0 | u^2 ] $$) AS (result agtype); result ---------------------------------- [9.0, 81.0, 225.0, 441.0, 729.0] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) WHERE u % 3 = 0 | u^2 ][3] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) WHERE u % 3 = 0 | u^2 ][3] $$) AS (result agtype); result -------- 441.0 (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) WHERE u % 3 = 0 | u^2 ][1..5] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) WHERE u % 3 = 0 | u^2 ][1..5] $$) AS (result agtype); result ----------------------------- [81.0, 225.0, 441.0, 729.0] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) | u^2 ] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) | u^2 ] $$) AS (result agtype); result ---------------------------------------------------------------------------------------------------- [1.0, 9.0, 25.0, 49.0, 81.0, 121.0, 169.0, 225.0, 289.0, 361.0, 441.0, 529.0, 625.0, 729.0, 841.0] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) | u^2 ][0] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) | u^2 ][0] $$) AS (result agtype); result -------- 1.0 (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) | u^2 ][0..2] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) | u^2 ][0..2] $$) AS (result agtype); result ------------ [1.0, 9.0] @@ -123,7 +123,7 @@ SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN (u) $$) AS (resul {"id": 281474976710659, "label": "", "properties": {"list": []}}::vertex (3 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH () RETURN [i IN range(0, 20, 2) WHERE i % 3 = 0 ] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH () RETURN [i FROM range(0, 20, 2) WHERE i % 3 = 0 ] $$) AS (result agtype); result ---------------- [0, 6, 12, 18] @@ -131,7 +131,7 @@ SELECT * FROM cypher('list_comprehension', $$ MATCH () RETURN [i IN range(0, 20, [0, 6, 12, 18] (3 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH () RETURN [i IN range(0, 20, 2) WHERE i % 3 = 0 | i^2 ] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH () RETURN [i FROM range(0, 20, 2) WHERE i % 3 = 0 | i^2 ] $$) AS (result agtype); result --------------------------- [0.0, 36.0, 144.0, 324.0] @@ -139,7 +139,7 @@ SELECT * FROM cypher('list_comprehension', $$ MATCH () RETURN [i IN range(0, 20, [0.0, 36.0, 144.0, 324.0] (3 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN range(0, 20, 2) WHERE i % 3 = 0 | i^2 ] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i FROM range(0, 20, 2) WHERE i % 3 = 0 | i^2 ] $$) AS (result agtype); result --------------------------- [0.0, 36.0, 144.0, 324.0] @@ -147,7 +147,7 @@ SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN range(0, 20 [0.0, 36.0, 144.0, 324.0] (3 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH p=() RETURN [i IN range(0, 20, 2) WHERE i % 3 = 0 | i^2 ] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH p=() RETURN [i FROM range(0, 20, 2) WHERE i % 3 = 0 | i^2 ] $$) AS (result agtype); result --------------------------- [0.0, 36.0, 144.0, 324.0] @@ -155,7 +155,7 @@ SELECT * FROM cypher('list_comprehension', $$ MATCH p=() RETURN [i IN range(0, 2 [0.0, 36.0, 144.0, 324.0] (3 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH p=(u) RETURN [i IN range(0, 20, 2) WHERE i % 3 = 0 | i^2 ] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH p=(u) RETURN [i FROM range(0, 20, 2) WHERE i % 3 = 0 | i^2 ] $$) AS (result agtype); result --------------------------- [0.0, 36.0, 144.0, 324.0] @@ -163,7 +163,7 @@ SELECT * FROM cypher('list_comprehension', $$ MATCH p=(u) RETURN [i IN range(0, [0.0, 36.0, 144.0, 324.0] (3 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN u.list] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i FROM u.list] $$) AS (result agtype); result ------------------------- [1, 3, 5, 7, 9, 11, 13] @@ -171,35 +171,35 @@ SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN u.list] $$) [0, 2, 4, 6, 8, 10, 12] (3 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN u.list WHERE i % 3 = 0] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i FROM u.list WHERE i % 3 = 0] $$) AS (result agtype); result ------------ [0, 6, 12] [3, 9] (2 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN u.list WHERE i % 3 = 0 | i/3] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i FROM u.list WHERE i % 3 = 0 | i/3] $$) AS (result agtype); result ----------- [0, 2, 4] [1, 3] (2 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN u.list WHERE i % 3 = 0 | i/3][1] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i FROM u.list WHERE i % 3 = 0 | i/3][1] $$) AS (result agtype); result -------- 2 3 (2 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN u.list WHERE i % 3 = 0 | i/3][0..2] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i FROM u.list WHERE i % 3 = 0 | i/3][0..2] $$) AS (result agtype); result -------- [0, 2] [1, 3] (2 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN u.list WHERE i % 3 = 0 | i/3][0..2][1] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i FROM u.list WHERE i % 3 = 0 | i/3][0..2][1] $$) AS (result agtype); result -------- 2 @@ -207,96 +207,96 @@ SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN u.list WHER (2 rows) -- Nested cases -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3]]] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3]]] $$) AS (result agtype); result ----------- [1, 2, 3] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [i IN [1,2,3]]]] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [i FROM [1,2,3]]]] $$) AS (result agtype); result ----------- [1, 2, 3] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3] WHERE i>1]] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3] WHERE i>1]] $$) AS (result agtype); result -------- [2, 3] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3]] WHERE i>1] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3]] WHERE i>1] $$) AS (result agtype); result -------- [2, 3] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3] WHERE i>1] WHERE i>2] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3] WHERE i>1] WHERE i>2] $$) AS (result agtype); result -------- [3] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3] WHERE i>1 | i^2]] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3] WHERE i>1 | i^2]] $$) AS (result agtype); result ------------ [4.0, 9.0] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3]] WHERE i>1 | i^2] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3]] WHERE i>1 | i^2] $$) AS (result agtype); result ------------ [4.0, 9.0] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3] WHERE i>1] WHERE i>2 | i^2] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3] WHERE i>1] WHERE i>2 | i^2] $$) AS (result agtype); result -------- [9.0] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3] WHERE i>1 | i^2] WHERE i>4] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3] WHERE i>1 | i^2] WHERE i>4] $$) AS (result agtype); result -------- [9.0] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3] WHERE i>1 | i^2] WHERE i>4 | i^2] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3] WHERE i>1 | i^2] WHERE i>4 | i^2] $$) AS (result agtype); result -------- [81.0] (1 row) -- List comprehension inside where and property constraints -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list=[i IN range(0,12,2)] RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list=[i FROM range(0,12,2)] RETURN u $$) AS (result agtype); result ----------------------------------------------------------------------------------------------- {"id": 281474976710657, "label": "", "properties": {"list": [0, 2, 4, 6, 8, 10, 12]}}::vertex (1 row) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list=[i IN range(1,13,2)] RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list=[i FROM range(1,13,2)] RETURN u $$) AS (result agtype); result ----------------------------------------------------------------------------------------------- {"id": 281474976710658, "label": "", "properties": {"list": [1, 3, 5, 7, 9, 11, 13]}}::vertex (1 row) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list=[i IN range(0,12,2) WHERE i>4] RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list=[i FROM range(0,12,2) WHERE i>4] RETURN u $$) AS (result agtype); result -------- (0 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list=[i IN range(1,13,2) WHERE i>4 | i^1] RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list=[i FROM range(1,13,2) WHERE i>4 | i^1] RETURN u $$) AS (result agtype); result -------- (0 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list@>[i IN range(0,6,2)] RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list@>[i FROM range(0,6,2)] RETURN u $$) AS (result agtype); result ----------------------------------------------------------------------------------------------- {"id": 281474976710657, "label": "", "properties": {"list": [0, 2, 4, 6, 8, 10, 12]}}::vertex (1 row) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) MATCH (v) WHERE v.list=[i IN u.list] RETURN v $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) MATCH (v) WHERE v.list=[i FROM u.list] RETURN v $$) AS (result agtype); result ----------------------------------------------------------------------------------------------- {"id": 281474976710659, "label": "", "properties": {"list": []}}::vertex @@ -304,30 +304,30 @@ SELECT * FROM cypher('list_comprehension', $$ MATCH (u) MATCH (v) WHERE v.list=[ {"id": 281474976710658, "label": "", "properties": {"list": [1, 3, 5, 7, 9, 11, 13]}}::vertex (3 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u {list:[i IN range(0,12,2)]}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u {list:[i FROM range(0,12,2)]}) RETURN u $$) AS (result agtype); result ----------------------------------------------------------------------------------------------- {"id": 281474976710657, "label": "", "properties": {"list": [0, 2, 4, 6, 8, 10, 12]}}::vertex (1 row) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u {list:[i IN range(1,13,2)]}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u {list:[i FROM range(1,13,2)]}) RETURN u $$) AS (result agtype); result ----------------------------------------------------------------------------------------------- {"id": 281474976710658, "label": "", "properties": {"list": [1, 3, 5, 7, 9, 11, 13]}}::vertex (1 row) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u {list:[i IN range(0,12,2) WHERE i>4]}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u {list:[i FROM range(0,12,2) WHERE i>4]}) RETURN u $$) AS (result agtype); result ----------------------------------------------------------------------------------------------- {"id": 281474976710657, "label": "", "properties": {"list": [0, 2, 4, 6, 8, 10, 12]}}::vertex (1 row) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u {list:[i IN range(1,13,2) WHERE i>4 | i^1]}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u {list:[i FROM range(1,13,2) WHERE i>4 | i^1]}) RETURN u $$) AS (result agtype); result -------- (0 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) MATCH (v {list:[i IN u.list]}) RETURN v $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) MATCH (v {list:[i FROM u.list]}) RETURN v $$) AS (result agtype); result ----------------------------------------------------------------------------------------------- {"id": 281474976710658, "label": "", "properties": {"list": [1, 3, 5, 7, 9, 11, 13]}}::vertex @@ -337,45 +337,45 @@ SELECT * FROM cypher('list_comprehension', $$ MATCH (u) MATCH (v {list:[i IN u.l {"id": 281474976710658, "label": "", "properties": {"list": [1, 3, 5, 7, 9, 11, 13]}}::vertex (5 rows) -SELECT * FROM cypher('list_comprehension', $$ CREATE (u {list:[i IN range(12,24,2)]}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ CREATE (u {list:[i FROM range(12,24,2)]}) RETURN u $$) AS (result agtype); result ---------------------------------------------------------------------------------------------------- {"id": 281474976710660, "label": "", "properties": {"list": [12, 14, 16, 18, 20, 22, 24]}}::vertex (1 row) -SELECT * FROM cypher('list_comprehension', $$ CREATE (u {list:[i IN range(0,12,2) WHERE i>4]}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ CREATE (u {list:[i FROM range(0,12,2) WHERE i>4]}) RETURN u $$) AS (result agtype); result -------------------------------------------------------------------------------------- {"id": 281474976710661, "label": "", "properties": {"list": [6, 8, 10, 12]}}::vertex (1 row) -SELECT * FROM cypher('list_comprehension', $$ CREATE (u {list:[i IN range(1,13,2) WHERE i>4 | i^2]}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ CREATE (u {list:[i FROM range(1,13,2) WHERE i>4 | i^2]}) RETURN u $$) AS (result agtype); result -------------------------------------------------------------------------------------------------------- {"id": 281474976710662, "label": "", "properties": {"list": [25.0, 49.0, 81.0, 121.0, 169.0]}}::vertex (1 row) -SELECT * FROM cypher('list_comprehension', $$ WITH [u IN [1,2,3]] AS a CREATE (u {list:a}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ WITH [u FROM [1,2,3]] AS a CREATE (u {list:a}) RETURN u $$) AS (result agtype); result --------------------------------------------------------------------------------- {"id": 281474976710663, "label": "", "properties": {"list": [1, 2, 3]}}::vertex (1 row) -- List comprehension in the WITH WHERE clause -SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u IN [0, 2, 4, 6, 8, 10, 12]] RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u FROM [0, 2, 4, 6, 8, 10, 12]] RETURN u $$) AS (u agtype); u ----------------------------------------------------------------------------------------------- {"id": 281474976710657, "label": "", "properties": {"list": [0, 2, 4, 6, 8, 10, 12]}}::vertex (1 row) -SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u IN [0, 2, 4, 6, 8, 10, 12]] OR size(u.list) = 0 RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u FROM [0, 2, 4, 6, 8, 10, 12]] OR size(u.list) = 0 RETURN u $$) AS (u agtype); u ----------------------------------------------------------------------------------------------- {"id": 281474976710659, "label": "", "properties": {"list": []}}::vertex {"id": 281474976710657, "label": "", "properties": {"list": [0, 2, 4, 6, 8, 10, 12]}}::vertex (2 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u IN [0, 2, 4, 6, 8, 10, 12]] OR size(u.list)::bool RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u FROM [0, 2, 4, 6, 8, 10, 12]] OR size(u.list)::bool RETURN u $$) AS (u agtype); u -------------------------------------------------------------------------------------------------------- {"id": 281474976710658, "label": "", "properties": {"list": [1, 3, 5, 7, 9, 11, 13]}}::vertex @@ -386,7 +386,7 @@ SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u {"id": 281474976710663, "label": "", "properties": {"list": [1, 2, 3]}}::vertex (6 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u IN [0, 2, 4, 6, 8, 10, 12]] OR NOT size(u.list)::bool RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u FROM [0, 2, 4, 6, 8, 10, 12]] OR NOT size(u.list)::bool RETURN u $$) AS (u agtype); u ----------------------------------------------------------------------------------------------- {"id": 281474976710659, "label": "", "properties": {"list": []}}::vertex @@ -398,32 +398,32 @@ SELECT * FROM cypher('list_comprehension', $$ CREATE(u:csm_match {list: ['abc', --- (0 rows) -SELECT * FROM cypher('list_comprehension', $$ MATCH(u: csm_match) WITH u WHERE [u IN u.list][0] STARTS WITH "ab" RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u: csm_match) WITH u WHERE [u FROM u.list][0] STARTS WITH "ab" RETURN u $$) AS (u agtype); u ------------------------------------------------------------------------------------------------------ {"id": 844424930131969, "label": "csm_match", "properties": {"list": ["abc", "def", "ghi"]}}::vertex (1 row) -SELECT * FROM cypher('list_comprehension', $$ WITH [1, 2, 3] AS u WHERE u = [u IN [1, 2, 3]] RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ WITH [1, 2, 3] AS u WHERE u = [u FROM [1, 2, 3]] RETURN u $$) AS (u agtype); u ----------- [1, 2, 3] (1 row) -SELECT * FROM cypher('list_comprehension', $$ WITH 1 AS u WHERE u = [u IN [1, 2, 3]][0] RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ WITH 1 AS u WHERE u = [u FROM [1, 2, 3]][0] RETURN u $$) AS (u agtype); u --- 1 (1 row) -SELECT * FROM cypher('list_comprehension', $$ WITH ['abc', 'defgh'] AS u WHERE [v In u][1] STARTS WITH 'de' RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ WITH ['abc', 'defgh'] AS u WHERE [v FROM u][1] STARTS WITH 'de' RETURN u $$) AS (u agtype); u ------------------ ["abc", "defgh"] (1 row) -- List comprehension in UNWIND -SELECT * FROM cypher('list_comprehension', $$ UNWIND [u IN [1, 2, 3]] AS u RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ UNWIND [u FROM [1, 2, 3]] AS u RETURN u $$) AS (u agtype); u --- 1 @@ -431,7 +431,7 @@ SELECT * FROM cypher('list_comprehension', $$ UNWIND [u IN [1, 2, 3]] AS u RETUR 3 (3 rows) -SELECT * FROM cypher('list_comprehension', $$ UNWIND [u IN [1, 2, 3] WHERE u > 1 | u*2] AS u RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ UNWIND [u FROM [1, 2, 3] WHERE u > 1 | u*2] AS u RETURN u $$) AS (u agtype); u --- 4 @@ -444,25 +444,25 @@ ERROR: Invalid use of aggregation in this context LINE 1: ...ist_comprehension', $$ WITH [1, 2, 3] AS u UNWIND collect(u)... ^ -- List comprehension in SET -SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) SET u.a = [u IN range(0, 5)] RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) SET u.a = [u FROM range(0, 5)] RETURN u $$) AS (u agtype); u ------------------------------------------------------------------------------------------------------------------------ {"id": 281474976710657, "label": "", "properties": {"a": [0, 1, 2, 3, 4, 5], "list": [0, 2, 4, 6, 8, 10, 12]}}::vertex (1 row) -SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) SET u.a = [u IN []] RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) SET u.a = [u FROM []] RETURN u $$) AS (u agtype); u -------------------------------------------------------------------------------------------------------- {"id": 281474976710657, "label": "", "properties": {"a": [], "list": [0, 2, 4, 6, 8, 10, 12]}}::vertex (1 row) -SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) SET u += {b: [u IN range(0, 5)]} RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) SET u += {b: [u FROM range(0, 5)]} RETURN u $$) AS (u agtype); u --------------------------------------------------------------------------------------------------------------------------------- {"id": 281474976710657, "label": "", "properties": {"a": [], "b": [0, 1, 2, 3, 4, 5], "list": [0, 2, 4, 6, 8, 10, 12]}}::vertex (1 row) -SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) WITh u, collect(u.list) AS v SET u += {b: [u IN range(0, 5)]} SET u.c = [u IN v[0]] RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) WITh u, collect(u.list) AS v SET u += {b: [u FROM range(0, 5)]} SET u.c = [u FROM v[0]] RETURN u $$) AS (u agtype); u --------------------------------------------------------------------------------------------------------------------------------------------------------------- {"id": 281474976710657, "label": "", "properties": {"a": [], "b": [0, 1, 2, 3, 4, 5], "c": [0, 2, 4, 6, 8, 10, 12], "list": [0, 2, 4, 6, 8, 10, 12]}}::vertex @@ -474,102 +474,102 @@ ERROR: Invalid use of aggregation in this context LINE 1: ..., $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) SET u.c = coll... ^ -- Known issue -SELECT * FROM cypher('list_comprehension', $$ MERGE (u {list:[i IN [1,2,3]]}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MERGE (u {list:[i FROM [1,2,3]]}) RETURN u $$) AS (result agtype); ERROR: Aggref found in non-Agg plan node -- List comprehension variable scoping -SELECT * FROM cypher('list_comprehension', $$ WITH 1 AS m, [m IN [1, 2, 3]] AS n RETURN [m IN [1, 2, 3]] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ WITH 1 AS m, [m FROM [1, 2, 3]] AS n RETURN [m FROM [1, 2, 3]] $$) AS (result agtype); result ----------- [1, 2, 3] (1 row) -SELECT * FROM cypher('list_comprehension', $$ WITH 1 AS m RETURN [m IN [1, 2, 3]], m $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ WITH 1 AS m RETURN [m FROM [1, 2, 3]], m $$) AS (result agtype, result2 agtype); result | result2 -----------+--------- [1, 2, 3] | 1 (1 row) -SELECT * FROM cypher('list_comprehension', $$ WITH [m IN [1,2,3]] AS m RETURN [m IN [1, 2, 3]], m $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ WITH [m FROM [1,2,3]] AS m RETURN [m FROM [1, 2, 3]], m $$) AS (result agtype, result2 agtype); result | result2 -----------+----------- [1, 2, 3] | [1, 2, 3] (1 row) -SELECT * FROM cypher('list_comprehension', $$ CREATE n=()-[:edge]->() RETURN [n IN nodes(n)] $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ CREATE n=()-[:edge]->() RETURN [n FROM nodes(n)] $$) AS (u agtype); u ---------------------------------------------------------------------------------------------------------------------------------- [{"id": 281474976710664, "label": "", "properties": {}}::vertex, {"id": 281474976710665, "label": "", "properties": {}}::vertex] (1 row) -- Multiple list comprehensions in RETURN and WITH clause -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [1,2,3]], [u IN [1,2,3]] $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [1,2,3]], [u FROM [1,2,3]] $$) AS (result agtype, result2 agtype); result | result2 -----------+----------- [1, 2, 3] | [1, 2, 3] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [1,2,3] WHERE u>1], [u IN [1,2,3] WHERE u>2] $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [1,2,3] WHERE u>1], [u FROM [1,2,3] WHERE u>2] $$) AS (result agtype, result2 agtype); result | result2 --------+--------- [2, 3] | [3] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [1,2,3] WHERE u>1 | u^3], [u IN [1,2,3] WHERE u>2 | u^3] $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [1,2,3] WHERE u>1 | u^3], [u FROM [1,2,3] WHERE u>2 | u^3] $$) AS (result agtype, result2 agtype); result | result2 -------------+--------- [8.0, 27.0] | [27.0] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [1,2,3]] AS u, [u IN [1,2,3]] AS i $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [1,2,3]] AS u, [u FROM [1,2,3]] AS i $$) AS (result agtype, result2 agtype); result | result2 -----------+----------- [1, 2, 3] | [1, 2, 3] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [1,2,3] WHERE u>1] AS u, [u IN [1,2,3] WHERE u>2] AS i $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [1,2,3] WHERE u>1] AS u, [u FROM [1,2,3] WHERE u>2] AS i $$) AS (result agtype, result2 agtype); result | result2 --------+--------- [2, 3] | [3] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [1,2,3] WHERE u>1 | u^3] AS u, [u IN [1,2,3] WHERE u>2 | u^3] AS i $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [1,2,3] WHERE u>1 | u^3] AS u, [u FROM [1,2,3] WHERE u>2 | u^3] AS i $$) AS (result agtype, result2 agtype); result | result2 -------------+--------- [8.0, 27.0] | [27.0] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [u IN [1,2,3]]], [u IN [u IN [1,2,3]]] $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [u FROM [1,2,3]]], [u FROM [u FROM [1,2,3]]] $$) AS (result agtype, result2 agtype); result | result2 -----------+----------- [1, 2, 3] | [1, 2, 3] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [u IN [1,2,3] WHERE u>1] WHERE u>2], [u IN [u IN [1,2,3] WHERE u>1] WHERE u>2] $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [u FROM [1,2,3] WHERE u>1] WHERE u>2], [u FROM [u FROM [1,2,3] WHERE u>1] WHERE u>2] $$) AS (result agtype, result2 agtype); result | result2 --------+--------- [3] | [3] (1 row) -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [u IN [1,2,3] WHERE u>1] WHERE u>2 | u^3], [u IN [u IN [1,2,3] WHERE u>1] WHERE u>2 | u^3] $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [u FROM [1,2,3] WHERE u>1] WHERE u>2 | u^3], [u FROM [u FROM [1,2,3] WHERE u>1] WHERE u>2 | u^3] $$) AS (result agtype, result2 agtype); result | result2 --------+--------- [27.0] | [27.0] (1 row) -SELECT * FROM cypher('list_comprehension', $$ WITH [u IN [1,2,3]] AS u, [u IN [1,2,3]] AS i RETURN u, i $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ WITH [u FROM [1,2,3]] AS u, [u FROM [1,2,3]] AS i RETURN u, i $$) AS (result agtype, result2 agtype); result | result2 -----------+----------- [1, 2, 3] | [1, 2, 3] (1 row) -- Should error out -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN range(0, 10, 2)],i $$) AS (result agtype, i agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM range(0, 10, 2)],i $$) AS (result agtype, i agtype); ERROR: could not find rte for i -LINE 1: ..._comprehension', $$ RETURN [i IN range(0, 10, 2)],i $$) AS (... +LINE 1: ...omprehension', $$ RETURN [i FROM range(0, 10, 2)],i $$) AS (... ^ -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN range(0, 10, 2) WHERE i>5 | i^2], i $$) AS (result agtype, i agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM range(0, 10, 2) WHERE i>5 | i^2], i $$) AS (result agtype, i agtype); ERROR: could not find rte for i -LINE 1: ...$$ RETURN [i IN range(0, 10, 2) WHERE i>5 | i^2], i $$) AS (... +LINE 1: ... RETURN [i FROM range(0, 10, 2) WHERE i>5 | i^2], i $$) AS (... ^ SELECT * FROM drop_graph('list_comprehension', true); NOTICE: drop cascades to 4 other objects diff --git a/regress/sql/list_comprehension.sql b/regress/sql/list_comprehension.sql index b4596e55c..bbaf0d52d 100644 --- a/regress/sql/list_comprehension.sql +++ b/regress/sql/list_comprehension.sql @@ -26,123 +26,123 @@ SELECT * from cypher('list_comprehension', $$ CREATE (u {list: [0, 2, 4, 6, 8, 1 SELECT * from cypher('list_comprehension', $$ CREATE (u {list: [1, 3, 5, 7, 9, 11, 13]}) RETURN u $$) AS (result agtype); SELECT * from cypher('list_comprehension', $$ CREATE (u {list: []}) RETURN u $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2)] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2)][2] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2)][1..4] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2)] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2)][2] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2)][1..4] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) WHERE u % 3 = 0] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) WHERE u % 3 = 0][2] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) WHERE u % 3 = 0][0..4] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) WHERE u % 3 = 0] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) WHERE u % 3 = 0][2] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) WHERE u % 3 = 0][0..4] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) WHERE u % 3 = 0 | u^2 ] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) WHERE u % 3 = 0 | u^2 ][3] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) WHERE u % 3 = 0 | u^2 ][1..5] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) WHERE u % 3 = 0 | u^2 ] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) WHERE u % 3 = 0 | u^2 ][3] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) WHERE u % 3 = 0 | u^2 ][1..5] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) | u^2 ] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) | u^2 ][0] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN range(1, 30, 2) | u^2 ][0..2] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) | u^2 ] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) | u^2 ][0] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM range(1, 30, 2) | u^2 ][0..2] $$) AS (result agtype); SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN (u) $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH () RETURN [i IN range(0, 20, 2) WHERE i % 3 = 0 ] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH () RETURN [i IN range(0, 20, 2) WHERE i % 3 = 0 | i^2 ] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN range(0, 20, 2) WHERE i % 3 = 0 | i^2 ] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH p=() RETURN [i IN range(0, 20, 2) WHERE i % 3 = 0 | i^2 ] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH p=(u) RETURN [i IN range(0, 20, 2) WHERE i % 3 = 0 | i^2 ] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN u.list] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN u.list WHERE i % 3 = 0] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN u.list WHERE i % 3 = 0 | i/3] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN u.list WHERE i % 3 = 0 | i/3][1] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN u.list WHERE i % 3 = 0 | i/3][0..2] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i IN u.list WHERE i % 3 = 0 | i/3][0..2][1] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH () RETURN [i FROM range(0, 20, 2) WHERE i % 3 = 0 ] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH () RETURN [i FROM range(0, 20, 2) WHERE i % 3 = 0 | i^2 ] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i FROM range(0, 20, 2) WHERE i % 3 = 0 | i^2 ] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH p=() RETURN [i FROM range(0, 20, 2) WHERE i % 3 = 0 | i^2 ] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH p=(u) RETURN [i FROM range(0, 20, 2) WHERE i % 3 = 0 | i^2 ] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i FROM u.list] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i FROM u.list WHERE i % 3 = 0] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i FROM u.list WHERE i % 3 = 0 | i/3] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i FROM u.list WHERE i % 3 = 0 | i/3][1] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i FROM u.list WHERE i % 3 = 0 | i/3][0..2] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) RETURN [i FROM u.list WHERE i % 3 = 0 | i/3][0..2][1] $$) AS (result agtype); -- Nested cases -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3]]] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [i IN [1,2,3]]]] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3]]] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [i FROM [1,2,3]]]] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3] WHERE i>1]] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3]] WHERE i>1] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3] WHERE i>1] WHERE i>2] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3] WHERE i>1]] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3]] WHERE i>1] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3] WHERE i>1] WHERE i>2] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3] WHERE i>1 | i^2]] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3]] WHERE i>1 | i^2] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3] WHERE i>1] WHERE i>2 | i^2] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3] WHERE i>1 | i^2] WHERE i>4] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN [i IN [1,2,3] WHERE i>1 | i^2] WHERE i>4 | i^2] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3] WHERE i>1 | i^2]] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3]] WHERE i>1 | i^2] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3] WHERE i>1] WHERE i>2 | i^2] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3] WHERE i>1 | i^2] WHERE i>4] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM [i FROM [1,2,3] WHERE i>1 | i^2] WHERE i>4 | i^2] $$) AS (result agtype); -- List comprehension inside where and property constraints -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list=[i IN range(0,12,2)] RETURN u $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list=[i IN range(1,13,2)] RETURN u $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list=[i IN range(0,12,2) WHERE i>4] RETURN u $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list=[i IN range(1,13,2) WHERE i>4 | i^1] RETURN u $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list@>[i IN range(0,6,2)] RETURN u $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) MATCH (v) WHERE v.list=[i IN u.list] RETURN v $$) AS (result agtype); - -SELECT * FROM cypher('list_comprehension', $$ MATCH (u {list:[i IN range(0,12,2)]}) RETURN u $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH (u {list:[i IN range(1,13,2)]}) RETURN u $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH (u {list:[i IN range(0,12,2) WHERE i>4]}) RETURN u $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH (u {list:[i IN range(1,13,2) WHERE i>4 | i^1]}) RETURN u $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH (u) MATCH (v {list:[i IN u.list]}) RETURN v $$) AS (result agtype); - -SELECT * FROM cypher('list_comprehension', $$ CREATE (u {list:[i IN range(12,24,2)]}) RETURN u $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ CREATE (u {list:[i IN range(0,12,2) WHERE i>4]}) RETURN u $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ CREATE (u {list:[i IN range(1,13,2) WHERE i>4 | i^2]}) RETURN u $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ WITH [u IN [1,2,3]] AS a CREATE (u {list:a}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list=[i FROM range(0,12,2)] RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list=[i FROM range(1,13,2)] RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list=[i FROM range(0,12,2) WHERE i>4] RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list=[i FROM range(1,13,2) WHERE i>4 | i^1] RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) WHERE u.list@>[i FROM range(0,6,2)] RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) MATCH (v) WHERE v.list=[i FROM u.list] RETURN v $$) AS (result agtype); + +SELECT * FROM cypher('list_comprehension', $$ MATCH (u {list:[i FROM range(0,12,2)]}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u {list:[i FROM range(1,13,2)]}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u {list:[i FROM range(0,12,2) WHERE i>4]}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u {list:[i FROM range(1,13,2) WHERE i>4 | i^1]}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH (u) MATCH (v {list:[i FROM u.list]}) RETURN v $$) AS (result agtype); + +SELECT * FROM cypher('list_comprehension', $$ CREATE (u {list:[i FROM range(12,24,2)]}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ CREATE (u {list:[i FROM range(0,12,2) WHERE i>4]}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ CREATE (u {list:[i FROM range(1,13,2) WHERE i>4 | i^2]}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ WITH [u FROM [1,2,3]] AS a CREATE (u {list:a}) RETURN u $$) AS (result agtype); -- List comprehension in the WITH WHERE clause -SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u IN [0, 2, 4, 6, 8, 10, 12]] RETURN u $$) AS (u agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u IN [0, 2, 4, 6, 8, 10, 12]] OR size(u.list) = 0 RETURN u $$) AS (u agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u IN [0, 2, 4, 6, 8, 10, 12]] OR size(u.list)::bool RETURN u $$) AS (u agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u IN [0, 2, 4, 6, 8, 10, 12]] OR NOT size(u.list)::bool RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u FROM [0, 2, 4, 6, 8, 10, 12]] RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u FROM [0, 2, 4, 6, 8, 10, 12]] OR size(u.list) = 0 RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u FROM [0, 2, 4, 6, 8, 10, 12]] OR size(u.list)::bool RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u) WITH u WHERE u.list = [u FROM [0, 2, 4, 6, 8, 10, 12]] OR NOT size(u.list)::bool RETURN u $$) AS (u agtype); SELECT * FROM cypher('list_comprehension', $$ CREATE(u:csm_match {list: ['abc', 'def', 'ghi']}) $$) AS (u agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH(u: csm_match) WITH u WHERE [u IN u.list][0] STARTS WITH "ab" RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u: csm_match) WITH u WHERE [u FROM u.list][0] STARTS WITH "ab" RETURN u $$) AS (u agtype); -SELECT * FROM cypher('list_comprehension', $$ WITH [1, 2, 3] AS u WHERE u = [u IN [1, 2, 3]] RETURN u $$) AS (u agtype); -SELECT * FROM cypher('list_comprehension', $$ WITH 1 AS u WHERE u = [u IN [1, 2, 3]][0] RETURN u $$) AS (u agtype); -SELECT * FROM cypher('list_comprehension', $$ WITH ['abc', 'defgh'] AS u WHERE [v In u][1] STARTS WITH 'de' RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ WITH [1, 2, 3] AS u WHERE u = [u FROM [1, 2, 3]] RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ WITH 1 AS u WHERE u = [u FROM [1, 2, 3]][0] RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ WITH ['abc', 'defgh'] AS u WHERE [v FROM u][1] STARTS WITH 'de' RETURN u $$) AS (u agtype); -- List comprehension in UNWIND -SELECT * FROM cypher('list_comprehension', $$ UNWIND [u IN [1, 2, 3]] AS u RETURN u $$) AS (u agtype); -SELECT * FROM cypher('list_comprehension', $$ UNWIND [u IN [1, 2, 3] WHERE u > 1 | u*2] AS u RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ UNWIND [u FROM [1, 2, 3]] AS u RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ UNWIND [u FROM [1, 2, 3] WHERE u > 1 | u*2] AS u RETURN u $$) AS (u agtype); -- invalid use of aggregation in UNWIND SELECT * FROM cypher('list_comprehension', $$ WITH [1, 2, 3] AS u UNWIND collect(u) AS v RETURN v $$) AS (u agtype); -- List comprehension in SET -SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) SET u.a = [u IN range(0, 5)] RETURN u $$) AS (u agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) SET u.a = [u IN []] RETURN u $$) AS (u agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) SET u += {b: [u IN range(0, 5)]} RETURN u $$) AS (u agtype); -SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) WITh u, collect(u.list) AS v SET u += {b: [u IN range(0, 5)]} SET u.c = [u IN v[0]] RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) SET u.a = [u FROM range(0, 5)] RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) SET u.a = [u FROM []] RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) SET u += {b: [u FROM range(0, 5)]} RETURN u $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) WITh u, collect(u.list) AS v SET u += {b: [u FROM range(0, 5)]} SET u.c = [u FROM v[0]] RETURN u $$) AS (u agtype); -- invalid use of aggregation in SET SELECT * FROM cypher('list_comprehension', $$ MATCH(u {list: [0, 2, 4, 6, 8, 10, 12]}) SET u.c = collect(u.list) RETURN u $$) AS (u agtype); -- Known issue -SELECT * FROM cypher('list_comprehension', $$ MERGE (u {list:[i IN [1,2,3]]}) RETURN u $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ MERGE (u {list:[i FROM [1,2,3]]}) RETURN u $$) AS (result agtype); -- List comprehension variable scoping -SELECT * FROM cypher('list_comprehension', $$ WITH 1 AS m, [m IN [1, 2, 3]] AS n RETURN [m IN [1, 2, 3]] $$) AS (result agtype); -SELECT * FROM cypher('list_comprehension', $$ WITH 1 AS m RETURN [m IN [1, 2, 3]], m $$) AS (result agtype, result2 agtype); -SELECT * FROM cypher('list_comprehension', $$ WITH [m IN [1,2,3]] AS m RETURN [m IN [1, 2, 3]], m $$) AS (result agtype, result2 agtype); -SELECT * FROM cypher('list_comprehension', $$ CREATE n=()-[:edge]->() RETURN [n IN nodes(n)] $$) AS (u agtype); +SELECT * FROM cypher('list_comprehension', $$ WITH 1 AS m, [m FROM [1, 2, 3]] AS n RETURN [m FROM [1, 2, 3]] $$) AS (result agtype); +SELECT * FROM cypher('list_comprehension', $$ WITH 1 AS m RETURN [m FROM [1, 2, 3]], m $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ WITH [m FROM [1,2,3]] AS m RETURN [m FROM [1, 2, 3]], m $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ CREATE n=()-[:edge]->() RETURN [n FROM nodes(n)] $$) AS (u agtype); -- Multiple list comprehensions in RETURN and WITH clause -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [1,2,3]], [u IN [1,2,3]] $$) AS (result agtype, result2 agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [1,2,3] WHERE u>1], [u IN [1,2,3] WHERE u>2] $$) AS (result agtype, result2 agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [1,2,3] WHERE u>1 | u^3], [u IN [1,2,3] WHERE u>2 | u^3] $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [1,2,3]], [u FROM [1,2,3]] $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [1,2,3] WHERE u>1], [u FROM [1,2,3] WHERE u>2] $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [1,2,3] WHERE u>1 | u^3], [u FROM [1,2,3] WHERE u>2 | u^3] $$) AS (result agtype, result2 agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [1,2,3]] AS u, [u IN [1,2,3]] AS i $$) AS (result agtype, result2 agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [1,2,3] WHERE u>1] AS u, [u IN [1,2,3] WHERE u>2] AS i $$) AS (result agtype, result2 agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [1,2,3] WHERE u>1 | u^3] AS u, [u IN [1,2,3] WHERE u>2 | u^3] AS i $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [1,2,3]] AS u, [u FROM [1,2,3]] AS i $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [1,2,3] WHERE u>1] AS u, [u FROM [1,2,3] WHERE u>2] AS i $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [1,2,3] WHERE u>1 | u^3] AS u, [u FROM [1,2,3] WHERE u>2 | u^3] AS i $$) AS (result agtype, result2 agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [u IN [1,2,3]]], [u IN [u IN [1,2,3]]] $$) AS (result agtype, result2 agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [u IN [1,2,3] WHERE u>1] WHERE u>2], [u IN [u IN [1,2,3] WHERE u>1] WHERE u>2] $$) AS (result agtype, result2 agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [u IN [u IN [1,2,3] WHERE u>1] WHERE u>2 | u^3], [u IN [u IN [1,2,3] WHERE u>1] WHERE u>2 | u^3] $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [u FROM [1,2,3]]], [u FROM [u FROM [1,2,3]]] $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [u FROM [1,2,3] WHERE u>1] WHERE u>2], [u FROM [u FROM [1,2,3] WHERE u>1] WHERE u>2] $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [u FROM [u FROM [1,2,3] WHERE u>1] WHERE u>2 | u^3], [u FROM [u FROM [1,2,3] WHERE u>1] WHERE u>2 | u^3] $$) AS (result agtype, result2 agtype); -SELECT * FROM cypher('list_comprehension', $$ WITH [u IN [1,2,3]] AS u, [u IN [1,2,3]] AS i RETURN u, i $$) AS (result agtype, result2 agtype); +SELECT * FROM cypher('list_comprehension', $$ WITH [u FROM [1,2,3]] AS u, [u FROM [1,2,3]] AS i RETURN u, i $$) AS (result agtype, result2 agtype); -- Should error out -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN range(0, 10, 2)],i $$) AS (result agtype, i agtype); -SELECT * FROM cypher('list_comprehension', $$ RETURN [i IN range(0, 10, 2) WHERE i>5 | i^2], i $$) AS (result agtype, i agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM range(0, 10, 2)],i $$) AS (result agtype, i agtype); +SELECT * FROM cypher('list_comprehension', $$ RETURN [i FROM range(0, 10, 2) WHERE i>5 | i^2], i $$) AS (result agtype, i agtype); -SELECT * FROM drop_graph('list_comprehension', true); \ No newline at end of file +SELECT * FROM drop_graph('list_comprehension', true); diff --git a/src/backend/parser/cypher_gram.y b/src/backend/parser/cypher_gram.y index 673e06836..119d875f4 100644 --- a/src/backend/parser/cypher_gram.y +++ b/src/backend/parser/cypher_gram.y @@ -77,7 +77,7 @@ CALL CASE COALESCE CONTAINS CREATE DELETE DESC DESCENDING DETACH DISTINCT ELSE END_P ENDS EXISTS EXPLAIN - FALSE_P + FALSE_P FROM IN IS LIMIT MATCH MERGE @@ -1990,7 +1990,7 @@ expr_case_default: ; list_comprehension: - var_name IN expr where_opt mapping_expr_opt + var_name FROM expr where_opt mapping_expr_opt { $$ = build_list_comprehension_node($1, $3, $4, $5, @1, @3, @4, @5); @@ -2104,6 +2104,7 @@ safe_keywords: | ENDS { $$ = pnstrdup($1, 4); } | EXISTS { $$ = pnstrdup($1, 6); } | EXPLAIN { $$ = pnstrdup($1, 7); } + | FROM { $$ = pnstrdup($1, 4); } | IN { $$ = pnstrdup($1, 2); } | IS { $$ = pnstrdup($1, 2); } | LIMIT { $$ = pnstrdup($1, 6); } @@ -3015,4 +3016,4 @@ static Node *build_list_comprehension_node(char *var_name, Node *expr, /* return the UNWIND node */ return (Node *)unwind; -} \ No newline at end of file +} diff --git a/src/include/parser/cypher_kwlist.h b/src/include/parser/cypher_kwlist.h index d15a0e34a..d4dccf8d5 100644 --- a/src/include/parser/cypher_kwlist.h +++ b/src/include/parser/cypher_kwlist.h @@ -21,6 +21,7 @@ PG_KEYWORD("ends", ENDS, RESERVED_KEYWORD) PG_KEYWORD("exists", EXISTS, RESERVED_KEYWORD) PG_KEYWORD("explain", EXPLAIN, RESERVED_KEYWORD) PG_KEYWORD("false", FALSE_P, RESERVED_KEYWORD) +PG_KEYWORD("from", FROM, RESERVED_KEYWORD) PG_KEYWORD("in", IN, RESERVED_KEYWORD) PG_KEYWORD("is", IS, RESERVED_KEYWORD) PG_KEYWORD("limit", LIMIT, RESERVED_KEYWORD) @@ -45,4 +46,4 @@ PG_KEYWORD("when", WHEN, RESERVED_KEYWORD) PG_KEYWORD("where", WHERE, RESERVED_KEYWORD) PG_KEYWORD("with", WITH, RESERVED_KEYWORD) PG_KEYWORD("xor", XOR, RESERVED_KEYWORD) -PG_KEYWORD("yield", YIELD, RESERVED_KEYWORD) \ No newline at end of file +PG_KEYWORD("yield", YIELD, RESERVED_KEYWORD)