From 0addf4216de010def6627beee45594fd5a00e10e Mon Sep 17 00:00:00 2001
From: Satya Narlapuram <satyanarlapuram@gmail.com>
Date: Thu, 7 May 2026 04:18:54 +0000
Subject: [PATCH] Add the missing RTE_GRAPH_TABLE case to
 transformLockingClause()

Without it, FOR UPDATE/SHARE/NO KEY UPDATE/KEY SHARE on a GRAPH_TABLE
alias falls through to the default "unrecognized RTE type" elog.
---
 src/backend/parser/analyze.c              |  9 +++++++++
 src/test/regress/expected/graph_table.out | 16 ++++++++++++++++
 src/test/regress/sql/graph_table.sql      |  5 +++++
 3 files changed, 30 insertions(+)

diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index ffcf25a6be..d0c5c128e7 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -4005,6 +4005,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 a GRAPH_TABLE",
+											LCS_asString(lc->strength)),
+									 parser_errposition(pstate, thisrel->location)));
+							break;
 
 							/* Shouldn't be possible to see RTE_RESULT here */
 
diff --git a/src/test/regress/expected/graph_table.out b/src/test/regress/expected/graph_table.out
index 067190a690..7f28b9f90c 100644
--- a/src/test/regress/expected/graph_table.out
+++ b/src/test/regress/expected/graph_table.out
@@ -1065,4 +1065,20 @@ SELECT v1.vname, gt.aname
  v13   | v13
 (3 rows)
 
+SELECT * FROM GRAPH_TABLE (g1 MATCH (a IS vl1) COLUMNS (a.vname)) gt FOR UPDATE OF gt;
+ERROR:  FOR UPDATE cannot be applied to a GRAPH_TABLE
+LINE 1: ...(g1 MATCH (a IS vl1) COLUMNS (a.vname)) gt FOR UPDATE OF gt;
+                                                                    ^
+SELECT * FROM GRAPH_TABLE (g1 MATCH (a IS vl1) COLUMNS (a.vname)) gt FOR SHARE OF gt;
+ERROR:  FOR SHARE cannot be applied to a GRAPH_TABLE
+LINE 1: ... (g1 MATCH (a IS vl1) COLUMNS (a.vname)) gt FOR SHARE OF gt;
+                                                                    ^
+SELECT * FROM GRAPH_TABLE (g1 MATCH (a IS vl1) COLUMNS (a.vname)) gt FOR NO KEY UPDATE OF gt;
+ERROR:  FOR NO KEY UPDATE cannot be applied to a GRAPH_TABLE
+LINE 1: ...CH (a IS vl1) COLUMNS (a.vname)) gt FOR NO KEY UPDATE OF gt;
+                                                                    ^
+SELECT * FROM GRAPH_TABLE (g1 MATCH (a IS vl1) COLUMNS (a.vname)) gt FOR KEY SHARE OF gt;
+ERROR:  FOR KEY SHARE cannot be applied to a GRAPH_TABLE
+LINE 1: ... MATCH (a IS vl1) COLUMNS (a.vname)) gt FOR KEY SHARE OF gt;
+                                                                    ^
 -- leave the objects behind for pg_upgrade/pg_dump tests
diff --git a/src/test/regress/sql/graph_table.sql b/src/test/regress/sql/graph_table.sql
index 7655b904c9..fcdbbf036a 100644
--- a/src/test/regress/sql/graph_table.sql
+++ b/src/test/regress/sql/graph_table.sql
@@ -604,4 +604,9 @@ SELECT v1.vname, gt.aname
   FROM v1, GRAPH_TABLE (g1 MATCH (a WHERE a.vprop1 = v1.vprop1) COLUMNS (a.vname AS aname)) gt
   ORDER BY 1, 2;
 
+SELECT * FROM GRAPH_TABLE (g1 MATCH (a IS vl1) COLUMNS (a.vname)) gt FOR UPDATE OF gt;
+SELECT * FROM GRAPH_TABLE (g1 MATCH (a IS vl1) COLUMNS (a.vname)) gt FOR SHARE OF gt;
+SELECT * FROM GRAPH_TABLE (g1 MATCH (a IS vl1) COLUMNS (a.vname)) gt FOR NO KEY UPDATE OF gt;
+SELECT * FROM GRAPH_TABLE (g1 MATCH (a IS vl1) COLUMNS (a.vname)) gt FOR KEY SHARE OF gt;
+
 -- leave the objects behind for pg_upgrade/pg_dump tests
-- 
2.43.0

