From e8830a0cc1bf15c819ca7235767513b759eeb5e5 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 17 Dec 2025 09:37:46 +0100 Subject: [PATCH 3/3] Remove support for colon in 'is label' expression --- .../expected/pg_overexplain.out | 2 +- contrib/pg_overexplain/sql/pg_overexplain.sql | 2 +- doc/src/sgml/queries.sgml | 32 ++++++++----------- src/backend/catalog/sql_features.txt | 2 +- src/backend/parser/gram.y | 1 - src/test/regress/expected/graph_table.out | 10 +++--- src/test/regress/expected/graph_table_rls.out | 4 +-- src/test/regress/expected/privileges.out | 22 ++++++------- src/test/regress/sql/graph_table.sql | 10 +++--- src/test/regress/sql/graph_table_rls.sql | 4 +-- src/test/regress/sql/privileges.sql | 22 ++++++------- 11 files changed, 52 insertions(+), 59 deletions(-) diff --git a/contrib/pg_overexplain/expected/pg_overexplain.out b/contrib/pg_overexplain/expected/pg_overexplain.out index 2b120315a7f..643629296e6 100644 --- a/contrib/pg_overexplain/expected/pg_overexplain.out +++ b/contrib/pg_overexplain/expected/pg_overexplain.out @@ -497,7 +497,7 @@ VERTEX TABLES brassica KEY(name) DEFAULT LABEL LABEL vegetables ); EXPLAIN (RANGE_TABLE, COSTS OFF) -SELECT * FROM GRAPH_TABLE (vegetables_graph MATCH (v1:vegetables) WHERE v1.genus = 'daucus' COLUMNS (v1.name)); +SELECT * FROM GRAPH_TABLE (vegetables_graph MATCH (v1 IS vegetables) WHERE v1.genus = 'daucus' COLUMNS (v1.name)); QUERY PLAN ---------------------------------------------- Append diff --git a/contrib/pg_overexplain/sql/pg_overexplain.sql b/contrib/pg_overexplain/sql/pg_overexplain.sql index 2d1d0f4ac95..0eb18be76b6 100644 --- a/contrib/pg_overexplain/sql/pg_overexplain.sql +++ b/contrib/pg_overexplain/sql/pg_overexplain.sql @@ -120,4 +120,4 @@ CREATE PROPERTY GRAPH vegetables_graph ); EXPLAIN (RANGE_TABLE, COSTS OFF) -SELECT * FROM GRAPH_TABLE (vegetables_graph MATCH (v1:vegetables) WHERE v1.genus = 'daucus' COLUMNS (v1.name)); +SELECT * FROM GRAPH_TABLE (vegetables_graph MATCH (v1 IS vegetables) WHERE v1.genus = 'daucus' COLUMNS (v1.name)); diff --git a/doc/src/sgml/queries.sgml b/doc/src/sgml/queries.sgml index fccf049cb35..ec4ca01cd16 100644 --- a/doc/src/sgml/queries.sgml +++ b/doc/src/sgml/queries.sgml @@ -2861,28 +2861,22 @@ Graph Patterns for elements (vertices and edges) that have certain characteristics. These characteristics are written in between the parentheses or brackets. (This is also called an element pattern filler.) Typically, we would - search for elements with a certain label. This is written either by - IS labelname or equivalently - :labelname. For example, - this would match all vertices with the label person: + search for elements with a certain label. This is written by IS + labelname. For example, this would + match all vertices with the label person: (IS person) - or - -(:person) - - (From now on, we will just use the colon syntax, for simplicity. But it - helps to read it as is for understanding.) The next + The next example would match a vertex with the label person connected to a vertex with the label account connected by an edge with the label has. -(:person)-[:has]->(:account) +(IS person)-[IS has]->(IS account) Multiple labels can also be matched, using or semantics: -(:person)-[:has]->(:account|creditcard) +(IS person)-[IS has]->(IS account|creditcard) @@ -2890,11 +2884,11 @@ Graph Patterns Recall that edges are directed. The other direction is also possible in a path pattern, for example: -(:account)<-[:has]-(:person) +(IS account)<-[IS has]-(IS person) It is also possible to match both directions: -(:person)-[:is_friend_of]-(:person) +(IS person)-[IS is_friend_of]-(IS person) This has a meaning of or: An edge in either direction would match. @@ -2905,9 +2899,9 @@ Graph Patterns then happens on the vertices.) For these cases, an abbreviated edge pattern syntax is available that omits the brackets, for example: -(:person)->(:account) -(:acount)<-(:person) -(:person)-(:person) +(IS person)->(IS account) +(IS account)<-(IS person) +(IS person)-(IS person) As is often the case, abbreviated syntax can make expressions more compact but also sometimes harder to understand. @@ -2922,13 +2916,13 @@ Graph Patterns For example (assuming appropriate definitions of the property graph as well as the underlying tables): -GRAPH_TABLE (mygraph MATCH (p:person)-[h:has]->(a:account) +GRAPH_TABLE (mygraph MATCH (p IS person)-[h IS has]->(a IS account) COLUMNS (p.name AS person_name, h.since AS has_account_since, a.num AS account_number) WHERE clauses can be used inside element patterns to filter matches: -(:person)-[:has]->(a:account WHERE a.type = 'savings') +(IS person)-[IS has]->(a IS account WHERE a.type = 'savings') diff --git a/src/backend/catalog/sql_features.txt b/src/backend/catalog/sql_features.txt index 7cbaf492d23..626054cbcef 100644 --- a/src/backend/catalog/sql_features.txt +++ b/src/backend/catalog/sql_features.txt @@ -417,7 +417,7 @@ G803 MATCHNUM function NO G810 IS BOUND predicate NO G811 IS BOUND predicate: AS option NO G820 BINDING_COUNT NO -G830 Colon in 'is label' expression YES +G830 Colon in 'is label' expression NO G840 Path-ordered aggregates NO G850 SQL/PGQ Information Schema views YES G860 GET DIAGNOSTICS enhancements for SQL-property graphs NO diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 0cad56576f0..b1171a315fb 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -18073,7 +18073,6 @@ opt_colid: opt_is_label_expression: IS label_expression { $$ = $2; } - | ':' label_expression { $$ = $2; } | /*EMPTY*/ { $$ = NULL; } ; diff --git a/src/test/regress/expected/graph_table.out b/src/test/regress/expected/graph_table.out index ecac6096720..a4df7464d79 100644 --- a/src/test/regress/expected/graph_table.out +++ b/src/test/regress/expected/graph_table.out @@ -157,7 +157,7 @@ SELECT * FROM GRAPH_TABLE (myshop MATCH (c IS customers WHERE c.address = 'US')- customer1 (1 row) -SELECT * FROM GRAPH_TABLE (myshop MATCH (c:customers)-[co:customer_orders]->(o:orders WHERE o.ordered_when = date '2024-01-02') COLUMNS (c.name, c.address)); +SELECT * FROM GRAPH_TABLE (myshop MATCH (c IS customers)-[co IS customer_orders]->(o IS orders WHERE o.ordered_when = date '2024-01-02') COLUMNS (c.name, c.address)); name | address -----------+--------- customer2 | CA @@ -430,7 +430,7 @@ SELECT vn FROM all_vertices EXCEPT (SELECT svn FROM all_connected_vertices UNION (2 rows) -- query all connections using a label shared by vertices and edges -SELECT sn, cn, dn FROM GRAPH_TABLE (g1 MATCH (src : l1)-[conn : l1]->(dest : l1) COLUMNS (src.elname AS sn, conn.elname AS cn, dest.elname AS dn)); +SELECT sn, cn, dn FROM GRAPH_TABLE (g1 MATCH (src IS l1)-[conn IS l1]->(dest IS l1) COLUMNS (src.elname AS sn, conn.elname AS cn, dest.elname AS dn)); sn | cn | dn -----+------+----- v12 | e122 | v21 @@ -636,7 +636,7 @@ CREATE PROPERTY GRAPH g2 DESTINATION KEY (src_id) REFERENCES v3 (id) LABEL l1 PROPERTIES ('g2.' || ename COLLATE "C" AS elname) ); -SELECT sn, cn, dn FROM GRAPH_TABLE (g2 MATCH (src : l1)-[conn : l1]->(dest : l1) COLUMNS (src.elname AS sn, conn.elname AS cn, dest.elname AS dn)) ORDER BY 1, 2, 3; +SELECT sn, cn, dn FROM GRAPH_TABLE (g2 MATCH (src IS l1)-[conn IS l1]->(dest IS l1) COLUMNS (src.elname AS sn, conn.elname AS cn, dest.elname AS dn)) ORDER BY 1, 2, 3; sn | cn | dn --------+---------+-------- g2.v11 | g2.e121 | g2.v22 @@ -669,7 +669,7 @@ SELECT * FROM GRAPH_TABLE (g2 MATCH (a)-[b]->(a)-[b]->(a) COLUMNS (a.elname AS s -- prepared statements, any changes to the property graph should be reflected in -- the already prepared statements -PREPARE cyclestmt AS SELECT * FROM GRAPH_TABLE (g1 MATCH (a:l1)->(b:l1)->(c:l1) WHERE a.elname = c.elname COLUMNS (a.elname AS self, b.elname AS through)) ORDER BY self, through; +PREPARE cyclestmt AS SELECT * FROM GRAPH_TABLE (g1 MATCH (a IS l1)->(b IS l1)->(c IS l1) WHERE a.elname = c.elname COLUMNS (a.elname AS self, b.elname AS through)) ORDER BY self, through; EXECUTE cyclestmt; self | through ------+--------- @@ -743,7 +743,7 @@ ALTER PROPERTY GRAPH g1 DESTINATION KEY (src_id) REFERENCES v3 (id) LABEL l2 PROPERTIES (ename AS elname) ); -PREPARE loopstmt AS SELECT * FROM GRAPH_TABLE (g1 MATCH (a)-[e:l2]->(a) COLUMNS (e.elname AS loop)) ORDER BY loop COLLATE "C" ASC; +PREPARE loopstmt AS SELECT * FROM GRAPH_TABLE (g1 MATCH (a)-[e IS l2]->(a) COLUMNS (e.elname AS loop)) ORDER BY loop COLLATE "C" ASC; EXECUTE loopstmt; loop ------ diff --git a/src/test/regress/expected/graph_table_rls.out b/src/test/regress/expected/graph_table_rls.out index e52beeeabd1..5cbd69dab7b 100644 --- a/src/test/regress/expected/graph_table_rls.out +++ b/src/test/regress/expected/graph_table_rls.out @@ -96,7 +96,7 @@ SET row_security TO ON; -- to RLS policies, session user or RLS settings. PREPARE graph_rls_query AS SELECT * FROM GRAPH_TABLE (cabinet - MATCH (u : users)-[a : accessed]->(d : document) + MATCH (u IS users)-[a IS accessed]->(d IS document) WHERE f_leak(d.dtitle) COLUMNS (u.pguser, a.aid, d.dtitle, d.dlevel)) ORDER BY 1, 2, 3, 4; @@ -630,7 +630,7 @@ SET row_security TO ON; -- Create a policy on document that references document itself via GRAPH_TABLE CREATE POLICY pr ON document TO regress_graph_rls_dave USING (EXISTS (SELECT 1 FROM GRAPH_TABLE (cabinet - MATCH (u : users)-[a : accessed]->(d : document) + MATCH (u IS users)-[a IS accessed]->(d IS document) WHERE u.pguser = current_user COLUMNS (a.aid)))); SET SESSION AUTHORIZATION regress_graph_rls_dave; diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out index 828357ab451..2114b1e354e 100644 --- a/src/test/regress/expected/privileges.out +++ b/src/test/regress/expected/privileges.out @@ -3090,49 +3090,49 @@ create property graph ptg1 default label label ltv properties (col1 as ltvk)); -- select privileges on property graph as well as table -select * from graph_table (ptg1 match ( : atest5) COLUMNS (1 as value)) limit 0; -- ok +select * from graph_table (ptg1 match (is atest5) COLUMNS (1 as value)) limit 0; -- ok value ------- (0 rows) grant select on ptg1 to regress_priv_user2; set session role regress_priv_user2; -select * from graph_table (ptg1 match ( : atest1) COLUMNS (1 as value)) limit 0; -- ok +select * from graph_table (ptg1 match (is atest1) COLUMNS (1 as value)) limit 0; -- ok value ------- (0 rows) -- select privileges on property graph but not table -select * from graph_table (ptg1 match ( : atest5) COLUMNS (1 as value)) limit 0; -- fails +select * from graph_table (ptg1 match (is atest5) COLUMNS (1 as value)) limit 0; -- fails ERROR: permission denied for table atest5 -select * from graph_table (ptg1 match ( : lttc) COLUMNS (1 as value)) limit 0; -- fails +select * from graph_table (ptg1 match (is lttc) COLUMNS (1 as value)) limit 0; -- fails ERROR: permission denied for table atest5 set session role regress_priv_user3; -- select privileges on table but not property graph -select * from graph_table (ptg1 match ( : atest1) COLUMNS (1 as value)) limit 0; -- fails +select * from graph_table (ptg1 match (is atest1) COLUMNS (1 as value)) limit 0; -- fails ERROR: permission denied for property graph ptg1 -- select privileges on neither -select * from graph_table (ptg1 match ( : atest5) COLUMNS (1 as value)) limit 0; -- fails +select * from graph_table (ptg1 match (is atest5) COLUMNS (1 as value)) limit 0; -- fails ERROR: permission denied for property graph ptg1 -- column privileges set session role regress_priv_user1; -select * from graph_table (ptg1 match (v : lttc) COLUMNS (v.lttck)) limit 0; -- ok +select * from graph_table (ptg1 match (v is lttc) COLUMNS (v.lttck)) limit 0; -- ok lttck ------- (0 rows) grant select on ptg1 to regress_priv_user4; set session role regress_priv_user4; -select * from graph_table (ptg1 match (a : atest5) COLUMNS (a.four)) limit 0; -- ok +select * from graph_table (ptg1 match (a is atest5) COLUMNS (a.four)) limit 0; -- ok four ------ (0 rows) -select * from graph_table (ptg1 match (v : lttc) COLUMNS (v.lttck)) limit 0; -- fail +select * from graph_table (ptg1 match (v is lttc) COLUMNS (v.lttck)) limit 0; -- fail ERROR: permission denied for table atest5 -- access property graph through security definer view set session role regress_priv_user4; -create view atpgv1 as select * from graph_table (ptg1 match ( : atest1) COLUMNS (1 as value)) limit 0; +create view atpgv1 as select * from graph_table (ptg1 match (is atest1) COLUMNS (1 as value)) limit 0; grant select on atpgv1 to regress_priv_user3; select * from atpgv1; -- ok value @@ -3146,7 +3146,7 @@ select * from atpgv1; -- ok (0 rows) set session role regress_priv_user4; -create view atpgv2 as select * from graph_table (ptg1 match (v : ltv) COLUMNS (v.ltvk)) limit 0; +create view atpgv2 as select * from graph_table (ptg1 match (v is ltv) COLUMNS (v.ltvk)) limit 0; -- though the session user is the owner of the view and also has access to the -- property graph, it does not have access to a table referenced in the graph -- pattern diff --git a/src/test/regress/sql/graph_table.sql b/src/test/regress/sql/graph_table.sql index 412da394aab..7521c3e5c1d 100644 --- a/src/test/regress/sql/graph_table.sql +++ b/src/test/regress/sql/graph_table.sql @@ -133,7 +133,7 @@ CREATE PROPERTY GRAPH myshop SELECT * FROM GRAPH_TABLE (myshop MATCH (c IS customers WHERE c.address = 'US')-[IS customer_orders]->(o IS orders) COLUMNS (c.name)); -- graph element specification without label or variable SELECT * FROM GRAPH_TABLE (myshop MATCH (c IS customers WHERE c.address = 'US')-[]->(o IS orders) COLUMNS (c.name AS customer_name)); -SELECT * FROM GRAPH_TABLE (myshop MATCH (c:customers)-[co:customer_orders]->(o:orders WHERE o.ordered_when = date '2024-01-02') COLUMNS (c.name, c.address)); +SELECT * FROM GRAPH_TABLE (myshop MATCH (c IS customers)-[co IS customer_orders]->(o IS orders WHERE o.ordered_when = date '2024-01-02') COLUMNS (c.name, c.address)); SELECT * FROM GRAPH_TABLE (myshop MATCH (o IS orders)-[IS customer_orders]->(c IS customers) COLUMNS (c.name, o.ordered_when)); SELECT * FROM GRAPH_TABLE (myshop MATCH (o IS orders)<-[IS customer_orders]-(c IS customers) COLUMNS (c.name, o.ordered_when)); -- spaces around pattern operators @@ -292,7 +292,7 @@ CREATE PROPERTY GRAPH g1 all_vertices AS (SELECT vn FROM GRAPH_TABLE (g1 MATCH (vertex) COLUMNS (vertex.vname AS vn))) SELECT vn FROM all_vertices EXCEPT (SELECT svn FROM all_connected_vertices UNION SELECT dvn FROM all_connected_vertices); -- query all connections using a label shared by vertices and edges -SELECT sn, cn, dn FROM GRAPH_TABLE (g1 MATCH (src : l1)-[conn : l1]->(dest : l1) COLUMNS (src.elname AS sn, conn.elname AS cn, dest.elname AS dn)); +SELECT sn, cn, dn FROM GRAPH_TABLE (g1 MATCH (src IS l1)-[conn IS l1]->(dest IS l1) COLUMNS (src.elname AS sn, conn.elname AS cn, dest.elname AS dn)); -- Tests for cyclic path patterns CREATE TABLE e2_1 ( @@ -405,14 +405,14 @@ CREATE PROPERTY GRAPH g2 DESTINATION KEY (src_id) REFERENCES v3 (id) LABEL l1 PROPERTIES ('g2.' || ename COLLATE "C" AS elname) ); -SELECT sn, cn, dn FROM GRAPH_TABLE (g2 MATCH (src : l1)-[conn : l1]->(dest : l1) COLUMNS (src.elname AS sn, conn.elname AS cn, dest.elname AS dn)) ORDER BY 1, 2, 3; +SELECT sn, cn, dn FROM GRAPH_TABLE (g2 MATCH (src IS l1)-[conn IS l1]->(dest IS l1) COLUMNS (src.elname AS sn, conn.elname AS cn, dest.elname AS dn)) ORDER BY 1, 2, 3; SELECT * FROM GRAPH_TABLE (g2 MATCH (a)-[b WHERE b.elname > 'g2.E331']->(a)-[b]->(a) COLUMNS (a.elname AS self, b.elname AS loop_name)); SELECT * FROM GRAPH_TABLE (g2 MATCH (a)-[b]->(a)-[b]->(a) WHERE b.elname > 'g2.E331' COLUMNS (a.elname AS self, b.elname AS loop_name)); SELECT * FROM GRAPH_TABLE (g2 MATCH (a)-[b]->(a)-[b]->(a) COLUMNS (a.elname AS self, b.elname AS loop_name)) WHERE loop_name > 'g2.E331'; -- prepared statements, any changes to the property graph should be reflected in -- the already prepared statements -PREPARE cyclestmt AS SELECT * FROM GRAPH_TABLE (g1 MATCH (a:l1)->(b:l1)->(c:l1) WHERE a.elname = c.elname COLUMNS (a.elname AS self, b.elname AS through)) ORDER BY self, through; +PREPARE cyclestmt AS SELECT * FROM GRAPH_TABLE (g1 MATCH (a IS l1)->(b IS l1)->(c IS l1) WHERE a.elname = c.elname COLUMNS (a.elname AS self, b.elname AS through)) ORDER BY self, through; EXECUTE cyclestmt; ALTER PROPERTY GRAPH g1 DROP EDGE TABLES (e3_2, e3_3); EXECUTE cyclestmt; @@ -436,7 +436,7 @@ CREATE PROPERTY GRAPH g2 DESTINATION KEY (src_id) REFERENCES v3 (id) LABEL l2 PROPERTIES (ename AS elname) ); -PREPARE loopstmt AS SELECT * FROM GRAPH_TABLE (g1 MATCH (a)-[e:l2]->(a) COLUMNS (e.elname AS loop)) ORDER BY loop COLLATE "C" ASC; +PREPARE loopstmt AS SELECT * FROM GRAPH_TABLE (g1 MATCH (a)-[e IS l2]->(a) COLUMNS (e.elname AS loop)) ORDER BY loop COLLATE "C" ASC; EXECUTE loopstmt; ALTER PROPERTY GRAPH g1 ALTER EDGE TABLE e3_3 ALTER LABEL l2 DROP PROPERTIES (elname); EXECUTE loopstmt; -- error diff --git a/src/test/regress/sql/graph_table_rls.sql b/src/test/regress/sql/graph_table_rls.sql index 3644b6e192f..044bc27ce9f 100644 --- a/src/test/regress/sql/graph_table_rls.sql +++ b/src/test/regress/sql/graph_table_rls.sql @@ -112,7 +112,7 @@ CREATE POLICY p4 ON document_people AS PERMISSIVE TO regress_graph_rls_group2 -- to RLS policies, session user or RLS settings. PREPARE graph_rls_query AS SELECT * FROM GRAPH_TABLE (cabinet - MATCH (u : users)-[a : accessed]->(d : document) + MATCH (u IS users)-[a IS accessed]->(d IS document) WHERE f_leak(d.dtitle) COLUMNS (u.pguser, a.aid, d.dtitle, d.dlevel)) ORDER BY 1, 2, 3, 4; @@ -312,7 +312,7 @@ CREATE PROPERTY GRAPH cabinet -- Create a policy on document that references document itself via GRAPH_TABLE CREATE POLICY pr ON document TO regress_graph_rls_dave USING (EXISTS (SELECT 1 FROM GRAPH_TABLE (cabinet - MATCH (u : users)-[a : accessed]->(d : document) + MATCH (u IS users)-[a IS accessed]->(d IS document) WHERE u.pguser = current_user COLUMNS (a.aid)))); SET SESSION AUTHORIZATION regress_graph_rls_dave; diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql index f3a438d2732..c7fdfb691ae 100644 --- a/src/test/regress/sql/privileges.sql +++ b/src/test/regress/sql/privileges.sql @@ -1815,34 +1815,34 @@ CREATE SCHEMA testns; default label label ltv properties (col1 as ltvk)); -- select privileges on property graph as well as table -select * from graph_table (ptg1 match ( : atest5) COLUMNS (1 as value)) limit 0; -- ok +select * from graph_table (ptg1 match (is atest5) COLUMNS (1 as value)) limit 0; -- ok grant select on ptg1 to regress_priv_user2; set session role regress_priv_user2; -select * from graph_table (ptg1 match ( : atest1) COLUMNS (1 as value)) limit 0; -- ok +select * from graph_table (ptg1 match (is atest1) COLUMNS (1 as value)) limit 0; -- ok -- select privileges on property graph but not table -select * from graph_table (ptg1 match ( : atest5) COLUMNS (1 as value)) limit 0; -- fails -select * from graph_table (ptg1 match ( : lttc) COLUMNS (1 as value)) limit 0; -- fails +select * from graph_table (ptg1 match (is atest5) COLUMNS (1 as value)) limit 0; -- fails +select * from graph_table (ptg1 match (is lttc) COLUMNS (1 as value)) limit 0; -- fails set session role regress_priv_user3; -- select privileges on table but not property graph -select * from graph_table (ptg1 match ( : atest1) COLUMNS (1 as value)) limit 0; -- fails +select * from graph_table (ptg1 match (is atest1) COLUMNS (1 as value)) limit 0; -- fails -- select privileges on neither -select * from graph_table (ptg1 match ( : atest5) COLUMNS (1 as value)) limit 0; -- fails +select * from graph_table (ptg1 match (is atest5) COLUMNS (1 as value)) limit 0; -- fails -- column privileges set session role regress_priv_user1; -select * from graph_table (ptg1 match (v : lttc) COLUMNS (v.lttck)) limit 0; -- ok +select * from graph_table (ptg1 match (v is lttc) COLUMNS (v.lttck)) limit 0; -- ok grant select on ptg1 to regress_priv_user4; set session role regress_priv_user4; -select * from graph_table (ptg1 match (a : atest5) COLUMNS (a.four)) limit 0; -- ok -select * from graph_table (ptg1 match (v : lttc) COLUMNS (v.lttck)) limit 0; -- fail +select * from graph_table (ptg1 match (a is atest5) COLUMNS (a.four)) limit 0; -- ok +select * from graph_table (ptg1 match (v is lttc) COLUMNS (v.lttck)) limit 0; -- fail -- access property graph through security definer view set session role regress_priv_user4; -create view atpgv1 as select * from graph_table (ptg1 match ( : atest1) COLUMNS (1 as value)) limit 0; +create view atpgv1 as select * from graph_table (ptg1 match (is atest1) COLUMNS (1 as value)) limit 0; grant select on atpgv1 to regress_priv_user3; select * from atpgv1; -- ok set session role regress_priv_user3; select * from atpgv1; -- ok set session role regress_priv_user4; -create view atpgv2 as select * from graph_table (ptg1 match (v : ltv) COLUMNS (v.ltvk)) limit 0; +create view atpgv2 as select * from graph_table (ptg1 match (v is ltv) COLUMNS (v.ltvk)) limit 0; -- though the session user is the owner of the view and also has access to the -- property graph, it does not have access to a table referenced in the graph -- pattern -- 2.52.0