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);

Reply via email to