0003-Remove-support-for-colon-in-is-label-express.patch.nocfbot
text/plain
Filename: 0003-Remove-support-for-colon-in-is-label-express.patch.nocfbot
Type: text/plain
Part: 2
From e8830a0cc1bf15c819ca7235767513b759eeb5e5 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
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 @@ <title>Graph Patterns</title>
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
- <literal>IS <replaceable>labelname</replaceable></literal> or equivalently
- <literal>:<replaceable>labelname</replaceable></literal>. For example,
- this would match all vertices with the label <literal>person</literal>:
+ search for elements with a certain label. This is written by <literal>IS
+ <replaceable>labelname</replaceable></literal>. For example, this would
+ match all vertices with the label <literal>person</literal>:
<programlisting>
(IS person)
</programlisting>
- or
-<programlisting>
-(:person)
-</programlisting>
- (From now on, we will just use the colon syntax, for simplicity. But it
- helps to read it as <quote>is</quote> for understanding.) The next
+ The next
example would match a vertex with the label <literal>person</literal>
connected to a vertex with the label <literal>account</literal> connected
by an edge with the label <literal>has</literal>.
<programlisting>
-(:person)-[:has]->(:account)
+(IS person)-[IS has]->(IS account)
</programlisting>
Multiple labels can also be matched, using <quote>or</quote> semantics:
<programlisting>
-(:person)-[:has]->(:account|creditcard)
+(IS person)-[IS has]->(IS account|creditcard)
</programlisting>
</para>
@@ -2890,11 +2884,11 @@ <title>Graph Patterns</title>
Recall that edges are directed. The other direction is also possible in a
path pattern, for example:
<programlisting>
-(:account)<-[:has]-(:person)
+(IS account)<-[IS has]-(IS person)
</programlisting>
It is also possible to match both directions:
<programlisting>
-(:person)-[:is_friend_of]-(:person)
+(IS person)-[IS is_friend_of]-(IS person)
</programlisting>
This has a meaning of <quote>or</quote>: An edge in either direction would
match.
@@ -2905,9 +2899,9 @@ <title>Graph Patterns</title>
then happens on the vertices.) For these cases, an abbreviated edge
pattern syntax is available that omits the brackets, for example:
<programlisting>
-(:person)->(:account)
-(:acount)<-(:person)
-(:person)-(:person)
+(IS person)->(IS account)
+(IS account)<-(IS person)
+(IS person)-(IS person)
</programlisting>
As is often the case, abbreviated syntax can make expressions more compact
but also sometimes harder to understand.
@@ -2922,13 +2916,13 @@ <title>Graph Patterns</title>
For example (assuming appropriate definitions of the property graph as
well as the underlying tables):
<programlisting>
-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)
</programlisting>
<literal>WHERE</literal> clauses can be used inside element patterns to
filter matches:
<programlisting>
-(:person)-[:has]->(a:account WHERE a.type = 'savings')
+(IS person)-[IS has]->(a IS account WHERE a.type = 'savings')
</programlisting>
</para>
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