Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commite06cc02

Browse files
committed
Disallow LISTEN in background workers.
It's possible to execute user-defined SQL in some background processes;for example, logical replication workers can fire triggers. This opensthe possibility that someone would try to execute LISTEN in such acontext. But since only regular backends ever callProcessNotifyInterrupt, no messages would actually be received, andthus the registered listener would simply prevent the message queuefrom being cleaned. Eventually NOTIFY would stop working, which is bad.Perhaps someday somebody will invent infrastructure to make listeningin a background worker actually useful. In the meantime, forbid it.Back-patch to v13, which is where we introduced the MyBackendTypevariable. It'd be a lot harder to implement the check without that,and it doesn't seem worth the trouble.Discussion:https://postgr.es/m/153243441449.1404.2274116228506175596@wrigleys.postgresql.org
1 parent63f2877 commite06cc02

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed

‎src/backend/tcop/utility.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,23 @@ standard_ProcessUtility(PlannedStmt *pstmt,
787787
ListenStmt*stmt= (ListenStmt*)parsetree;
788788

789789
CheckRestrictedOperation("LISTEN");
790+
791+
/*
792+
* We don't allow LISTEN in background processes, as there is
793+
* no mechanism for them to collect NOTIFY messages, so they'd
794+
* just block cleanout of the async SLRU indefinitely.
795+
* (Authors of custom background workers could bypass this
796+
* restriction by calling Async_Listen directly, but then it's
797+
* on them to provide some mechanism to process the message
798+
* queue.) Note there seems no reason to forbid UNLISTEN.
799+
*/
800+
if (MyBackendType!=B_BACKEND)
801+
ereport(ERROR,
802+
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
803+
/* translator: %s is name of a SQL command, eg LISTEN */
804+
errmsg("cannot execute %s within a background process",
805+
"LISTEN")));
806+
790807
Async_Listen(stmt->conditionname);
791808
}
792809
break;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp