This is an automated email from the ASF dual-hosted git repository.
jgemignani pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/age.git
The following commit(s) were added to refs/heads/master by this push:
new 27d43750 Fix issue #876 - column reference "_age_default_alias_0" is
ambiguous (#931)
27d43750 is described below
commit 27d437506e7e1c15c8a3d11228fa85ab1b77e8e4
Author: Muhammad Taha Naveed <[email protected]>
AuthorDate: Thu Jun 1 20:19:03 2023 +0500
Fix issue #876 - column reference "_age_default_alias_0" is ambiguous (#931)
- The problem was with get_next_default_alias function which was not
generating unique aliases.
- Every clause transformed as a subquery has its own cpstate which is
being freed after it is tranformed. The root cpstate is the one that
has the default_alias_number initialized. So we need to reach the
root cpstate to get the next correct default alias number.
- This change also fixed some previously incorrect results.
- Added additional regression tests.
---
regress/expected/cypher_match.out | 24 ++++++++++++++++---
regress/expected/cypher_merge.out | 43 ++++++++++++++++++----------------
regress/sql/cypher_match.sql | 4 ++++
regress/sql/cypher_merge.sql | 1 -
src/backend/parser/cypher_parse_node.c | 13 ++++++++++
5 files changed, 61 insertions(+), 24 deletions(-)
diff --git a/regress/expected/cypher_match.out
b/regress/expected/cypher_match.out
index 1f97ef49..da5e4512 100644
--- a/regress/expected/cypher_match.out
+++ b/regress/expected/cypher_match.out
@@ -1931,7 +1931,9 @@ SELECT * FROM cypher('cypher_match', $$
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
{"id": 4785074604081153, "label": "knows", "end_id": 281474976710666,
"start_id": 281474976710661, "properties": {"years": 3, "relationship":
"friends"}}::edge
{"id": 4785074604081153, "label": "knows", "end_id": 281474976710666,
"start_id": 281474976710661, "properties": {"years": 3, "relationship":
"friends"}}::edge
-(2 rows)
+ {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666,
"start_id": 281474976710661, "properties": {"years": 3, "relationship":
"friends"}}::edge
+ {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666,
"start_id": 281474976710661, "properties": {"years": 3, "relationship":
"friends"}}::edge
+(4 rows)
SELECT * FROM cypher('cypher_match', $$
MATCH ()-[r {years:3, relationship: "friends"}]-() RETURN r $$) as (r
agtype);
@@ -1947,7 +1949,9 @@ SELECT * FROM cypher('cypher_match', $$
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
{"id": 4785074604081153, "label": "knows", "end_id": 281474976710666,
"start_id": 281474976710661, "properties": {"years": 3, "relationship":
"friends"}}::edge
{"id": 4785074604081153, "label": "knows", "end_id": 281474976710666,
"start_id": 281474976710661, "properties": {"years": 3, "relationship":
"friends"}}::edge
-(2 rows)
+ {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666,
"start_id": 281474976710661, "properties": {"years": 3, "relationship":
"friends"}}::edge
+ {"id": 4785074604081153, "label": "knows", "end_id": 281474976710666,
"start_id": 281474976710661, "properties": {"years": 3, "relationship":
"friends"}}::edge
+(4 rows)
--mismatch year #, should return nothing
SELECT * FROM cypher('cypher_match', $$
@@ -1962,7 +1966,9 @@ SELECT * FROM cypher('cypher_match', $$
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
{"id": 4785074604081154, "label": "knows", "end_id": 281474976710666,
"start_id": 281474976710659, "properties": {"years": 4, "relationship":
"enemies"}}::edge
{"id": 4785074604081154, "label": "knows", "end_id": 281474976710666,
"start_id": 281474976710659, "properties": {"years": 4, "relationship":
"enemies"}}::edge
-(2 rows)
+ {"id": 4785074604081154, "label": "knows", "end_id": 281474976710666,
"start_id": 281474976710659, "properties": {"years": 4, "relationship":
"enemies"}}::edge
+ {"id": 4785074604081154, "label": "knows", "end_id": 281474976710666,
"start_id": 281474976710659, "properties": {"years": 4, "relationship":
"enemies"}}::edge
+(4 rows)
SELECT * FROM cypher('cypher_match', $$
MATCH ()-[r {relationship:"enemies"}]-() MATCH ()-[r
{relationship:"friends"}]-() RETURN r $$) as (r agtype);
@@ -2101,6 +2107,18 @@ SELECT * FROM cypher('cypher_match', $$ MATCH
(_age_default_whatever) RETURN 0 $
ERROR: _age_default_ is only for internal use
LINE 1: SELECT * FROM cypher('cypher_match', $$ MATCH (_age_default_...
^
+-- issue 876
+SELECT * FROM cypher('cypher_match', $$ MATCH ({name: "Dave"}) MATCH ({name:
"Dave"}) MATCH ({name: "Dave"}) RETURN 0 $$) as (a agtype);
+ a
+---
+ 0
+(1 row)
+
+SELECT * FROM cypher('cypher_match', $$MATCH ({n0:0}) MATCH ()-[]->() MATCH
({n1:0})-[]-() RETURN 0 AS n2$$) as (a agtype);
+ a
+---
+(0 rows)
+
--
-- self referencing property constraints (issue #898)
--
diff --git a/regress/expected/cypher_merge.out
b/regress/expected/cypher_merge.out
index f2bc0696..c4310ef6 100644
--- a/regress/expected/cypher_merge.out
+++ b/regress/expected/cypher_merge.out
@@ -496,17 +496,20 @@ SELECT * FROM cypher('cypher_merge', $$MATCH (n) DETACH
DELETE n $$) AS (a agtyp
/*
* test 17:
- * XXX: Incorrect Output. To FIX
*/
--test query
SELECT * FROM cypher('cypher_merge', $$CREATE (n) MERGE (n)-[:e]->() $$) AS (a
agtype);
-ERROR: end_id() argument must resolve to a scalar value
---validate created correctly
-SELECT * FROM cypher('cypher_merge', $$MATCH p=()-[:e]->() RETURN p$$) AS (p
agtype);
- p
+ a
---
(0 rows)
+--validate created correctly
+SELECT * FROM cypher('cypher_merge', $$MATCH p=()-[:e]->() RETURN p$$) AS (p
agtype);
+
p
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ [{"id": 281474976710689, "label": "", "properties": {}}::vertex, {"id":
844424930131982, "label": "e", "end_id": 281474976710690, "start_id":
281474976710689, "properties": {}}::edge, {"id": 281474976710690, "label": "",
"properties": {}}::vertex]::path
+(1 row)
+
--clean up
SELECT * FROM cypher('cypher_merge', $$MATCH (n) DETACH DELETE n $$) AS (a
agtype);
a
@@ -526,7 +529,7 @@ SELECT * FROM cypher('cypher_merge', $$CREATE (n {i : 1})
SET n.i = 2 MERGE ({i:
SELECT * FROM cypher('cypher_merge', $$MATCH (a) RETURN a$$) AS (a agtype);
a
----------------------------------------------------------------------
- {"id": 281474976710690, "label": "", "properties": {"i": 2}}::vertex
+ {"id": 281474976710691, "label": "", "properties": {"i": 2}}::vertex
(1 row)
--clean up
@@ -548,7 +551,7 @@ SELECT * FROM cypher('cypher_merge', $$CREATE (n {i : 1})
SET n.i = 2 WITH n as
SELECT * FROM cypher('cypher_merge', $$MATCH (a) RETURN a$$) AS (a agtype);
a
----------------------------------------------------------------------
- {"id": 281474976710691, "label": "", "properties": {"i": 2}}::vertex
+ {"id": 281474976710692, "label": "", "properties": {"i": 2}}::vertex
(1 row)
--clean up
@@ -576,7 +579,7 @@ SELECT * FROM cypher('cypher_merge', $$MATCH (n {i : 1})
SET n.i = 2 WITH n as a
SELECT * FROM cypher('cypher_merge', $$MATCH (a) RETURN a$$) AS (a agtype);
a
----------------------------------------------------------------------
- {"id": 281474976710692, "label": "", "properties": {"i": 2}}::vertex
+ {"id": 281474976710693, "label": "", "properties": {"i": 2}}::vertex
(1 row)
--clean up
@@ -601,7 +604,7 @@ ERROR: vertex assigned to variable n was deleted
SELECT * FROM cypher('cypher_merge', $$MATCH (a) RETURN a$$) AS (a agtype);
a
----------------------------------------------------------------------
- {"id": 281474976710693, "label": "", "properties": {"i": 1}}::vertex
+ {"id": 281474976710694, "label": "", "properties": {"i": 1}}::vertex
(1 row)
--clean up
@@ -679,7 +682,7 @@ SELECT * FROM cypher('cypher_merge', $$MERGE ()-[:e]-()$$)
AS (a agtype);
SELECT * FROM cypher('cypher_merge', $$MATCH p=()-[]->() RETURN p$$) AS (a
agtype);
a
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- [{"id": 281474976710694, "label": "", "properties": {}}::vertex, {"id":
844424930131982, "label": "e", "end_id": 281474976710695, "start_id":
281474976710694, "properties": {}}::edge, {"id": 281474976710695, "label": "",
"properties": {}}::vertex]::path
+ [{"id": 281474976710695, "label": "", "properties": {}}::vertex, {"id":
844424930131983, "label": "e", "end_id": 281474976710696, "start_id":
281474976710695, "properties": {}}::edge, {"id": 281474976710696, "label": "",
"properties": {}}::vertex]::path
(1 row)
--clean up
@@ -694,14 +697,14 @@ SELECT * FROM cypher('cypher_merge', $$MATCH (n) DETACH
DELETE n $$) AS (a agtyp
SELECT * FROM cypher('cypher_merge', $$MERGE (a) RETURN a$$) AS (a agtype);
a
----------------------------------------------------------------
- {"id": 281474976710696, "label": "", "properties": {}}::vertex
+ {"id": 281474976710697, "label": "", "properties": {}}::vertex
(1 row)
--validate
SELECT * FROM cypher('cypher_merge', $$MATCH (a) RETURN a$$) AS (a agtype);
a
----------------------------------------------------------------
- {"id": 281474976710696, "label": "", "properties": {}}::vertex
+ {"id": 281474976710697, "label": "", "properties": {}}::vertex
(1 row)
--clean up
@@ -716,14 +719,14 @@ SELECT * FROM cypher('cypher_merge', $$MATCH (n) DETACH
DELETE n $$) AS (a agtyp
SELECT * FROM cypher('cypher_merge', $$MERGE p=()-[:e]-() RETURN p$$) AS (a
agtype);
a
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- [{"id": 281474976710697, "label": "", "properties": {}}::vertex, {"id":
844424930131983, "label": "e", "end_id": 281474976710698, "start_id":
281474976710697, "properties": {}}::edge, {"id": 281474976710698, "label": "",
"properties": {}}::vertex]::path
+ [{"id": 281474976710698, "label": "", "properties": {}}::vertex, {"id":
844424930131984, "label": "e", "end_id": 281474976710699, "start_id":
281474976710698, "properties": {}}::edge, {"id": 281474976710699, "label": "",
"properties": {}}::vertex]::path
(1 row)
--validate
SELECT * FROM cypher('cypher_merge', $$MATCH p=()-[]->() RETURN p$$) AS (a
agtype);
a
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- [{"id": 281474976710697, "label": "", "properties": {}}::vertex, {"id":
844424930131983, "label": "e", "end_id": 281474976710698, "start_id":
281474976710697, "properties": {}}::edge, {"id": 281474976710698, "label": "",
"properties": {}}::vertex]::path
+ [{"id": 281474976710698, "label": "", "properties": {}}::vertex, {"id":
844424930131984, "label": "e", "end_id": 281474976710699, "start_id":
281474976710698, "properties": {}}::edge, {"id": 281474976710699, "label": "",
"properties": {}}::vertex]::path
(1 row)
--clean up
@@ -738,14 +741,14 @@ SELECT * FROM cypher('cypher_merge', $$MATCH (n) DETACH
DELETE n $$) AS (a agtyp
SELECT * FROM cypher('cypher_merge', $$MERGE (a)-[:e]-(b) RETURN a$$) AS (a
agtype);
a
----------------------------------------------------------------
- {"id": 281474976710699, "label": "", "properties": {}}::vertex
+ {"id": 281474976710700, "label": "", "properties": {}}::vertex
(1 row)
--validate
SELECT * FROM cypher('cypher_merge', $$MATCH p=()-[]->() RETURN p$$) AS (a
agtype);
a
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- [{"id": 281474976710699, "label": "", "properties": {}}::vertex, {"id":
844424930131984, "label": "e", "end_id": 281474976710700, "start_id":
281474976710699, "properties": {}}::edge, {"id": 281474976710700, "label": "",
"properties": {}}::vertex]::path
+ [{"id": 281474976710700, "label": "", "properties": {}}::vertex, {"id":
844424930131985, "label": "e", "end_id": 281474976710701, "start_id":
281474976710700, "properties": {}}::edge, {"id": 281474976710701, "label": "",
"properties": {}}::vertex]::path
(1 row)
--clean up
@@ -760,14 +763,14 @@ SELECT * FROM cypher('cypher_merge', $$MATCH (n) DETACH
DELETE n $$) AS (a agtyp
SELECT * FROM cypher('cypher_merge', $$CREATE p=()-[:e]->() RETURN p$$) AS (a
agtype);
a
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- [{"id": 281474976710701, "label": "", "properties": {}}::vertex, {"id":
844424930131985, "label": "e", "end_id": 281474976710702, "start_id":
281474976710701, "properties": {}}::edge, {"id": 281474976710702, "label": "",
"properties": {}}::vertex]::path
+ [{"id": 281474976710702, "label": "", "properties": {}}::vertex, {"id":
844424930131986, "label": "e", "end_id": 281474976710703, "start_id":
281474976710702, "properties": {}}::edge, {"id": 281474976710703, "label": "",
"properties": {}}::vertex]::path
(1 row)
SELECT * FROM cypher('cypher_merge', $$MERGE p=()-[:e]-() RETURN p$$) AS (a
agtype);
a
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- [{"id": 281474976710701, "label": "", "properties": {}}::vertex, {"id":
844424930131985, "label": "e", "end_id": 281474976710702, "start_id":
281474976710701, "properties": {}}::edge, {"id": 281474976710702, "label": "",
"properties": {}}::vertex]::path
- [{"id": 281474976710702, "label": "", "properties": {}}::vertex, {"id":
844424930131985, "label": "e", "end_id": 281474976710702, "start_id":
281474976710701, "properties": {}}::edge, {"id": 281474976710701, "label": "",
"properties": {}}::vertex]::path
+ [{"id": 281474976710702, "label": "", "properties": {}}::vertex, {"id":
844424930131986, "label": "e", "end_id": 281474976710703, "start_id":
281474976710702, "properties": {}}::edge, {"id": 281474976710703, "label": "",
"properties": {}}::vertex]::path
+ [{"id": 281474976710703, "label": "", "properties": {}}::vertex, {"id":
844424930131986, "label": "e", "end_id": 281474976710703, "start_id":
281474976710702, "properties": {}}::edge, {"id": 281474976710702, "label": "",
"properties": {}}::vertex]::path
(2 rows)
--clean up
@@ -812,7 +815,7 @@ ERROR: Existing variable m cannot be NULL in MERGE clause
SELECT * FROM cypher('cypher_merge', $$MATCH (n) RETURN n$$) AS (a agtype);
a
----------------------------------------------------------------
- {"id": 281474976710703, "label": "", "properties": {}}::vertex
+ {"id": 281474976710704, "label": "", "properties": {}}::vertex
(1 row)
--
diff --git a/regress/sql/cypher_match.sql b/regress/sql/cypher_match.sql
index 6829d16f..ffd55461 100644
--- a/regress/sql/cypher_match.sql
+++ b/regress/sql/cypher_match.sql
@@ -960,6 +960,10 @@ SELECT * FROM cypher('cypher_match', $$ MATCH
(_age_default_) RETURN _age_defaul
SELECT * FROM cypher('cypher_match', $$ MATCH (_age_default_a) RETURN
_age_default_a $$) as (a agtype);
SELECT * FROM cypher('cypher_match', $$ MATCH (_age_default_whatever) RETURN 0
$$) as (a agtype);
+-- issue 876
+SELECT * FROM cypher('cypher_match', $$ MATCH ({name: "Dave"}) MATCH ({name:
"Dave"}) MATCH ({name: "Dave"}) RETURN 0 $$) as (a agtype);
+SELECT * FROM cypher('cypher_match', $$MATCH ({n0:0}) MATCH ()-[]->() MATCH
({n1:0})-[]-() RETURN 0 AS n2$$) as (a agtype);
+
--
-- self referencing property constraints (issue #898)
--
diff --git a/regress/sql/cypher_merge.sql b/regress/sql/cypher_merge.sql
index df0666ff..9d04364f 100644
--- a/regress/sql/cypher_merge.sql
+++ b/regress/sql/cypher_merge.sql
@@ -278,7 +278,6 @@ SELECT * FROM cypher('cypher_merge', $$MATCH (n) DETACH
DELETE n $$) AS (a agtyp
/*
* test 17:
- * XXX: Incorrect Output. To FIX
*/
--test query
diff --git a/src/backend/parser/cypher_parse_node.c
b/src/backend/parser/cypher_parse_node.c
index 269dd3c8..d0d2cade 100644
--- a/src/backend/parser/cypher_parse_node.c
+++ b/src/backend/parser/cypher_parse_node.c
@@ -131,9 +131,22 @@ RangeTblEntry *find_rte(cypher_parsestate *cpstate, char
*varname)
*/
char *get_next_default_alias(cypher_parsestate *cpstate)
{
+ ParseState *pstate = (ParseState *)cpstate;
+ cypher_parsestate *parent_cpstate = (cypher_parsestate
*)pstate->parentParseState;
char *alias_name;
int nlen = 0;
+ /*
+ * Every clause transformed as a subquery has its own cpstate which is
being
+ * freed after it is tranformed. The root cpstate is the one that has the
+ * default alias number initialized. So we need to reach the root cpstate
to
+ * get the next correct default alias number.
+ */
+ if (parent_cpstate)
+ {
+ return get_next_default_alias(parent_cpstate);
+ }
+
/* get the length of the combinded string */
nlen = snprintf(NULL, 0, "%s%d", AGE_DEFAULT_ALIAS_PREFIX,
cpstate->default_alias_num);