mirror of
https://github.com/postgres/postgres.git
synced 2026-10-23 13:29:09 +03:00
Prohibit locking clauses on GRAPH_TABLE
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
This commit is contained in:
@@ -4002,6 +4002,15 @@ transformLockingClause(ParseState *pstate, Query *qry, LockingClause *lc,
|
|||||||
LCS_asString(lc->strength)),
|
LCS_asString(lc->strength)),
|
||||||
parser_errposition(pstate, thisrel->location)));
|
parser_errposition(pstate, thisrel->location)));
|
||||||
break;
|
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 */
|
/* Shouldn't be possible to see RTE_RESULT here */
|
||||||
|
|
||||||
|
|||||||
@@ -1106,4 +1106,17 @@ SELECT src.vname, count(*) FROM v1 AS src
|
|||||||
v13 | 1
|
v13 | 1
|
||||||
(3 rows)
|
(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
|
-- leave the objects behind for pg_upgrade/pg_dump tests
|
||||||
|
|||||||
@@ -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)
|
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;
|
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
|
-- leave the objects behind for pg_upgrade/pg_dump tests
|
||||||
|
|||||||
Reference in New Issue
Block a user