0001-Add-the-missing-RTE_GRAPH_TABLE-case-to-transformLoc.patch
application/octet-stream
Filename: 0001-Add-the-missing-RTE_GRAPH_TABLE-case-to-transformLoc.patch
Type: application/octet-stream
Part: 0
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