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

Commit5f3cec7

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 parent19cefeb commit5f3cec7

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
@@ -977,7 +977,6 @@ function_parse_error_transpose(const char *prosrc)
977977
{
978978
intorigerrposition;
979979
intnewerrposition;
980-
constchar*queryText;
981980

982981
/*
983982
* Nothing to do unless we are dealing with a syntax error that has a
@@ -995,11 +994,22 @@ function_parse_error_transpose(const char *prosrc)
995994
}
996995

997996
/* We can get the original query text from the active portal (hack...) */
998-
Assert(ActivePortal&&ActivePortal->status==PORTAL_ACTIVE);
999-
queryText=ActivePortal->sourceText;
997+
if (ActivePortal&&ActivePortal->status==PORTAL_ACTIVE)
998+
{
999+
constchar*queryText=ActivePortal->sourceText;
10001000

1001-
/* Try to locate the prosrc in the original text */
1002-
newerrposition=match_prosrc_to_query(prosrc,queryText,origerrposition);
1001+
/* Try to locate the prosrc in the original text */
1002+
newerrposition=match_prosrc_to_query(prosrc,queryText,
1003+
origerrposition);
1004+
}
1005+
else
1006+
{
1007+
/*
1008+
* Quietly give up if no ActivePortal. This is an unusual situation
1009+
* but it can happen in, e.g., logical replication workers.
1010+
*/
1011+
newerrposition=-1;
1012+
}
10031013

10041014
if (newerrposition>0)
10051015
{

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp