commit bfaa02ac7a7cbeb793747be71962a7799c60c21c Author: Anton A. Melnikov Date: Sun Oct 9 11:56:20 2022 +0300 Fix logical replica crash if there was an error in a user function. diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c index a9fe45e347..1e8f1b1097 100644 --- a/src/backend/catalog/pg_proc.c +++ b/src/backend/catalog/pg_proc.c @@ -36,6 +36,7 @@ #include "parser/parse_coerce.h" #include "parser/parse_type.h" #include "pgstat.h" +#include "replication/logicalworker.h" #include "rewrite/rewriteHandler.h" #include "tcop/pquery.h" #include "tcop/tcopprot.h" @@ -1034,12 +1035,20 @@ function_parse_error_transpose(const char *prosrc) return false; } - /* We can get the original query text from the active portal (hack...) */ - Assert(ActivePortal && ActivePortal->status == PORTAL_ACTIVE); - queryText = ActivePortal->sourceText; + /* + * In the logical replication worker there is no way to restore original + * query text from the logical replication message. There is only 'zipped' + * query equivalent to the original text. + */ + if (!IsLogicalWorker()) + { + /* We can get the original query text from the active portal (hack...) */ + Assert(ActivePortal && ActivePortal->status == PORTAL_ACTIVE); + queryText = ActivePortal->sourceText; - /* Try to locate the prosrc in the original text */ - newerrposition = match_prosrc_to_query(prosrc, queryText, origerrposition); + /* Try to locate the prosrc in the original text */ + newerrposition = match_prosrc_to_query(prosrc, queryText, origerrposition); + } if (newerrposition > 0) {