From 526678dc7c19ecf6a26f4dbb70f73441ab2de817 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Sun, 5 Apr 2026 14:11:08 +0300 Subject: [PATCH v3 1/3] Avoid syscache lookup while building a WAIT FOR tuple descriptor Use TupleDescInitBuiltinEntry instead of TupleDescInitEntry when building the result tuple descriptor for the WAIT FOR command. This avoids a syscache access that could re-establish a catalog snapshot after we've explicitly released all snapshots before the wait. Discussion: https://postgr.es/m/CABPTF7U%2BSUnJX_woQYGe%3D%3DR9Oz%2B-V6X0VO2stBLPGfJmH_LEhw%40mail.gmail.com Author: Xuneng Zhou Reviewed-by: Alexander Korotkov --- src/backend/commands/wait.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/backend/commands/wait.c b/src/backend/commands/wait.c index e64e3be6285..85fcd463b4c 100644 --- a/src/backend/commands/wait.c +++ b/src/backend/commands/wait.c @@ -335,10 +335,17 @@ WaitStmtResultDesc(WaitStmt *stmt) { TupleDesc tupdesc; - /* Need a tuple descriptor representing a single TEXT column */ + /* + * Need a tuple descriptor representing a single TEXT column. + * + * We use TupleDescInitBuiltinEntry instead of TupleDescInitEntry to avoid + * syscache access. This is important because WaitStmtResultDesc may be + * called after snapshots have been released, and we must not re-establish + * a catalog snapshot which could cause recovery conflicts on a standby. + */ tupdesc = CreateTemplateTupleDesc(1); - TupleDescInitEntry(tupdesc, (AttrNumber) 1, "status", - TEXTOID, -1, 0); + TupleDescInitBuiltinEntry(tupdesc, (AttrNumber) 1, "status", + TEXTOID, -1, 0); TupleDescFinalize(tupdesc); return tupdesc; } -- 2.39.5 (Apple Git-154)