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

Commitd9ffccf

Browse files
committed
Avoid crash after function syntax error in a replication worker.
If a syntax error occurred in a SQL-language or PL/pgSQL-languageCREATE FUNCTION or DO command executed in a logical replication worker,we'd suffer a null pointer dereference or assertion failure. Thatseems like a rather contrived case, but nonetheless worth fixing.The cause is that function_parse_error_transpose assumes it must beexecuting within the context of a Portal, but logical/worker.cdoesn't create a Portal since it's not running the standard executor.We can just back off the hard Assert check and make it fail gracefullyif there's not an ActivePortal. (I have a feeling that the aggressivecheck here was my fault originally, probably because I wasn't sure ifthe case would always hold and wanted to find out. Well, now we know.)The hazard seems to exist in all branches that have logical replication,so back-patch to v10.Maxim Orlov, Anton Melnikov, Masahiko Sawada, Tom LaneDiscussion:https://postgr.es/m/b570c367-ba38-95f3-f62d-5f59b9808226@inbox.ruDiscussion:https://postgr.es/m/adf0452f-8c6b-7def-d35e-ab516c80088e@inbox.ru
1 parent5ecf836 commitd9ffccf

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

‎src/backend/catalog/pg_proc.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -990,7 +990,6 @@ function_parse_error_transpose(const char *prosrc)
990990
{
991991
intorigerrposition;
992992
intnewerrposition;
993-
constchar*queryText;
994993

995994
/*
996995
* Nothing to do unless we are dealing with a syntax error that has a
@@ -1008,11 +1007,22 @@ function_parse_error_transpose(const char *prosrc)
10081007
}
10091008

10101009
/* We can get the original query text from the active portal (hack...) */
1011-
Assert(ActivePortal&&ActivePortal->status==PORTAL_ACTIVE);
1012-
queryText=ActivePortal->sourceText;
1010+
if (ActivePortal&&ActivePortal->status==PORTAL_ACTIVE)
1011+
{
1012+
constchar*queryText=ActivePortal->sourceText;
10131013

1014-
/* Try to locate the prosrc in the original text */
1015-
newerrposition=match_prosrc_to_query(prosrc,queryText,origerrposition);
1014+
/* Try to locate the prosrc in the original text */
1015+
newerrposition=match_prosrc_to_query(prosrc,queryText,
1016+
origerrposition);
1017+
}
1018+
else
1019+
{
1020+
/*
1021+
* Quietly give up if no ActivePortal. This is an unusual situation
1022+
* but it can happen in, e.g., logical replication workers.
1023+
*/
1024+
newerrposition=-1;
1025+
}
10161026

10171027
if (newerrposition>0)
10181028
{

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp