This is an automated email from the ASF dual-hosted git repository.
jgemignani pushed a commit to branch PG12
in repository https://gitbox.apache.org/repos/asf/age.git
The following commit(s) were added to refs/heads/PG12 by this push:
new bcc6c372 Fix update_entity_tuple to use correct CommandId (#769)
bcc6c372 is described below
commit bcc6c372e0b7ec59e19906d59ef8ac6004e9e53a
Author: Muhammad Taha Naveed <[email protected]>
AuthorDate: Tue Mar 28 05:42:54 2023 +0500
Fix update_entity_tuple to use correct CommandId (#769)
- Replaced estate->es_output_cid with getCurrentCommandId(true) in
update_entity_tuple to use the correct CommandId for error checks.
- Added regression tests.
---
regress/expected/cypher_set.out | 63 +++++++++++++++++++++++++++++++++++++++
regress/sql/cypher_set.sql | 41 +++++++++++++++++++++++++
src/backend/executor/cypher_set.c | 9 +++---
3 files changed, 109 insertions(+), 4 deletions(-)
diff --git a/regress/expected/cypher_set.out b/regress/expected/cypher_set.out
index 99954c31..c6eaa693 100644
--- a/regress/expected/cypher_set.out
+++ b/regress/expected/cypher_set.out
@@ -165,6 +165,29 @@ $$) AS (a agtype);
{"id": 844424930131970, "label": "v", "properties": {"a": 0, "i": 50, "j": 5,
"y": 50, "z": 99}}::vertex
(1 row)
+SELECT * FROM cypher('cypher_set', $$
+ MATCH (n {j: 5})
+ SET n.y = 53
+ SET n.y = 50
+ SET n.z = 99
+ SET n.arr = [n.y, n.z]
+ RETURN n
+$$) AS (a agtype);
+ a
+---------------------------------------------------------------------------------------------------------------------------
+ {"id": 844424930131970, "label": "v", "properties": {"a": 0, "i": 50, "j": 5,
"y": 50, "z": 99, "arr": [50, 99]}}::vertex
+(1 row)
+
+SELECT * FROM cypher('cypher_set', $$
+ MATCH (n {j: 5})
+ REMOVE n.arr
+ RETURN n
+$$) AS (a agtype);
+ a
+----------------------------------------------------------------------------------------------------------
+ {"id": 844424930131970, "label": "v", "properties": {"a": 0, "i": 50, "j": 5,
"y": 50, "z": 99}}::vertex
+(1 row)
+
SELECT * FROM cypher('cypher_set', $$
MATCH (n {j: 5})
RETURN n
@@ -221,6 +244,46 @@ $$) AS (a agtype);
{"id": 844424930131970, "label": "v", "properties": {"a": 0, "i": 50, "j": 5,
"y": 2, "z": 99}}::vertex
(2 rows)
+-- Test that SET works with nodes(path) and relationships(path)
+SELECT * FROM cypher('cypher_set', $$
+ MATCH p=(n)-[e:e {j:34}]->()
+ WITH nodes(p) AS ns
+ WITH ns[0] AS n
+ SET n.k = 99
+ SET n.k = 999
+ RETURN n
+$$) AS (a agtype);
+ a
+-------------------------------------------------------------------------------------------------------------------
+ {"id": 281474976710658, "label": "", "properties": {"k": 999, "y": 1}}::vertex
+ {"id": 844424930131970, "label": "v", "properties": {"a": 0, "i": 50, "j": 5,
"k": 999, "y": 2, "z": 99}}::vertex
+(2 rows)
+
+SELECT * FROM cypher('cypher_set', $$
+ MATCH p=(n)-[e:e {j:34}]->()
+ WITH relationships(p) AS rs
+ WITH rs[0] AS r
+ SET r.l = 99
+ SET r.l = 999
+ RETURN r
+$$) AS (a agtype);
+ a
+--------------------------------------------------------------------------------------------------------------------------------------------------
+ {"id": 1125899906842630, "label": "e", "end_id": 281474976710659, "start_id":
281474976710658, "properties": {"j": 34, "l": 999, "y": 99}}::edge
+ {"id": 1125899906842629, "label": "e", "end_id": 844424930131970, "start_id":
844424930131970, "properties": {"j": 34, "l": 999}}::edge
+(2 rows)
+
+SELECT * FROM cypher('cypher_set', $$
+ MATCH p=(n)-[e:e {j:34}]->()
+ REMOVE n.k, e.l
+ RETURN p
+$$) AS (a agtype);
+
a
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ [{"id": 281474976710658, "label": "", "properties": {"y": 1}}::vertex, {"id":
1125899906842630, "label": "e", "end_id": 281474976710659, "start_id":
281474976710658, "properties": {"j": 34, "y": 99}}::edge, {"id":
281474976710659, "label": "", "properties": {"y": 2}}::vertex]::path
+ [{"id": 844424930131970, "label": "v", "properties": {"a": 0, "i": 50, "j":
5, "y": 2, "z": 99}}::vertex, {"id": 1125899906842629, "label": "e", "end_id":
844424930131970, "start_id": 844424930131970, "properties": {"j": 34}}::edge,
{"id": 844424930131970, "label": "v", "properties": {"a": 0, "i": 50, "j": 5,
"y": 2, "z": 99}}::vertex]::path
+(2 rows)
+
SELECT * FROM cypher('cypher_set', $$MATCH (n)-[]->(n) SET n.y = 99 RETURN
n$$) AS (a agtype);
a
----------------------------------------------------------------------------------------------------------
diff --git a/regress/sql/cypher_set.sql b/regress/sql/cypher_set.sql
index a2b36a0a..2b1354ed 100644
--- a/regress/sql/cypher_set.sql
+++ b/regress/sql/cypher_set.sql
@@ -58,6 +58,21 @@ SELECT * FROM cypher('cypher_set', $$
RETURN n
$$) AS (a agtype);
+SELECT * FROM cypher('cypher_set', $$
+ MATCH (n {j: 5})
+ SET n.y = 53
+ SET n.y = 50
+ SET n.z = 99
+ SET n.arr = [n.y, n.z]
+ RETURN n
+$$) AS (a agtype);
+
+SELECT * FROM cypher('cypher_set', $$
+ MATCH (n {j: 5})
+ REMOVE n.arr
+ RETURN n
+$$) AS (a agtype);
+
SELECT * FROM cypher('cypher_set', $$
MATCH (n {j: 5})
RETURN n
@@ -92,6 +107,32 @@ SELECT * FROM cypher('cypher_set', $$
RETURN n
$$) AS (a agtype);
+-- Test that SET works with nodes(path) and relationships(path)
+
+SELECT * FROM cypher('cypher_set', $$
+ MATCH p=(n)-[e:e {j:34}]->()
+ WITH nodes(p) AS ns
+ WITH ns[0] AS n
+ SET n.k = 99
+ SET n.k = 999
+ RETURN n
+$$) AS (a agtype);
+
+SELECT * FROM cypher('cypher_set', $$
+ MATCH p=(n)-[e:e {j:34}]->()
+ WITH relationships(p) AS rs
+ WITH rs[0] AS r
+ SET r.l = 99
+ SET r.l = 999
+ RETURN r
+$$) AS (a agtype);
+
+SELECT * FROM cypher('cypher_set', $$
+ MATCH p=(n)-[e:e {j:34}]->()
+ REMOVE n.k, e.l
+ RETURN p
+$$) AS (a agtype);
+
SELECT * FROM cypher('cypher_set', $$MATCH (n)-[]->(n) SET n.y = 99 RETURN
n$$) AS (a agtype);
SELECT * FROM cypher('cypher_set', $$MATCH (n) MATCH (n)-[]->(m) SET n.t = 150
RETURN n$$) AS (a agtype);
diff --git a/src/backend/executor/cypher_set.c
b/src/backend/executor/cypher_set.c
index ea9f0bc6..3fb98602 100644
--- a/src/backend/executor/cypher_set.c
+++ b/src/backend/executor/cypher_set.c
@@ -114,6 +114,7 @@ static HeapTuple update_entity_tuple(ResultRelInfo
*resultRelInfo,
bool update_indexes;
TM_Result result;
+ CommandId cid = GetCurrentCommandId(true);
ResultRelInfo *saved_resultRelInfo = estate->es_result_relation_info;
estate->es_result_relation_info = resultRelInfo;
@@ -139,7 +140,7 @@ static HeapTuple update_entity_tuple(ResultRelInfo
*resultRelInfo,
result = table_tuple_update(resultRelInfo->ri_RelationDesc,
&tuple->t_self, elemTupleSlot,
- GetCurrentCommandId(true),
+ cid,
//estate->es_output_cid,
estate->es_snapshot,// NULL,
estate->es_crosscheck_snapshot,
@@ -148,7 +149,7 @@ static HeapTuple update_entity_tuple(ResultRelInfo
*resultRelInfo,
if (result == TM_SelfModified)
{
- if (hufd.cmax != estate->es_output_cid)
+ if (hufd.cmax != cid)
{
ereport(ERROR,
(errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION),
@@ -173,11 +174,11 @@ static HeapTuple update_entity_tuple(ResultRelInfo
*resultRelInfo,
ExecInsertIndexTuples(elemTupleSlot, estate, false, NULL, NIL);
}
- ExecCloseIndices(resultRelInfo);
+ ExecCloseIndices(resultRelInfo);
}
else if (lock_result == TM_SelfModified)
{
- if (hufd.cmax != estate->es_output_cid)
+ if (hufd.cmax != cid)
{
ereport(ERROR,
(errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION),