]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Prohibit locking clauses on GRAPH_TABLE
authorPeter Eisentraut <peter@eisentraut.org>
Thu, 9 Jul 2026 08:10:07 +0000 (10:10 +0200)
committerPeter Eisentraut <peter@eisentraut.org>
Thu, 9 Jul 2026 08:14:08 +0000 (10:14 +0200)
Specifying a locking clause (FOR UPDATE/SHARE) that names a
GRAPH_TABLE alias currently results in an unhelpful "unrecognized RTE
type: 8" error.  This commit explicitly prohibits specifying a locking
clause on a GRAPH_TABLE alias, raising a more user-friendly error
instead.

(Locking clause support for GRAPH_TABLE could be added as a separate
feature in the future.)

Author: SATYANARAYANA NARLAPURAM <satyanarlapuram@gmail.com>
Author: Ayush Tiwari <ayushtiwari.slg01@gmail.com>
Reviewed-by: Ashutosh Bapat <ashutosh.bapat.oss@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/CAHg%2BQDcE9wp6nOEC3SCRQ90nrCO%3DQF%2BOZq1MG8Qc6hnusmogqw%40mail.gmail.com

src/backend/parser/analyze.c
src/test/regress/expected/graph_table.out
src/test/regress/sql/graph_table.sql

index 739ea13d5db01c21631deaf99e21203c6c7f117e..ea97d236ea8179a03bc29c1450d255d14207632d 100644 (file)
@@ -4002,6 +4002,15 @@ transformLockingClause(ParseState *pstate, Query *qry, LockingClause *lc,
                                                                                        LCS_asString(lc->strength)),
                                                                         parser_errposition(pstate, thisrel->location)));
                                                        break;
+                                               case RTE_GRAPH_TABLE:
+                                                       ereport(ERROR,
+                                                                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                                                       /*------
+                                                         translator: %s is a SQL row locking clause such as FOR UPDATE */
+                                                                        errmsg("%s cannot be applied to GRAPH_TABLE",
+                                                                                       LCS_asString(lc->strength)),
+                                                                        parser_errposition(pstate, thisrel->location)));
+                                                       break;
 
                                                        /* Shouldn't be possible to see RTE_RESULT here */
 
index a3d78a7ac43f867fd54d50f8409664f3b9bb2205..46566b2e32f682ece464fe5e42c3a31c2978ad48 100644 (file)
@@ -1106,4 +1106,17 @@ SELECT src.vname, count(*) FROM v1 AS src
  v13   |     1
 (3 rows)
 
+-- Locking clause on GRAPH_TABLE
+SELECT * FROM GRAPH_TABLE (g1 MATCH (src IS vl1) COLUMNS (src.vname)) gt FOR UPDATE OF gt;  -- not supported
+ERROR:  FOR UPDATE cannot be applied to GRAPH_TABLE
+LINE 1: ...MATCH (src IS vl1) COLUMNS (src.vname)) gt FOR UPDATE OF gt;
+                                                                    ^
+SELECT * FROM GRAPH_TABLE (g1 MATCH (src IS vl1) COLUMNS (src.vname)) gt FOR UPDATE;  -- ignored
+ vname 
+-------
+ v11
+ v12
+ v13
+(3 rows)
+
 -- leave the objects behind for pg_upgrade/pg_dump tests
index 6aacc2d4aa53df56a6bf1ae30f6ba14649a52846..3fb0e50ddb29dbb9f215c8e8eb90094a68bc7501 100644 (file)
@@ -619,4 +619,8 @@ SELECT src.vname, count(*) FROM v1 AS src
   HAVING count(*) >= (SELECT count(*) FROM GRAPH_TABLE (g1 MATCH (a IS vl1 | vl2) COLUMNS (a.vname AS n)) WHERE n = src.vname)
   ORDER BY vname;
 
+-- Locking clause on GRAPH_TABLE
+SELECT * FROM GRAPH_TABLE (g1 MATCH (src IS vl1) COLUMNS (src.vname)) gt FOR UPDATE OF gt;  -- not supported
+SELECT * FROM GRAPH_TABLE (g1 MATCH (src IS vl1) COLUMNS (src.vname)) gt FOR UPDATE;  -- ignored
+
 -- leave the objects behind for pg_upgrade/pg_dump tests