From: Peter Eisentraut Date: Mon, 17 Feb 2020 14:19:58 +0000 (+0100) Subject: Fill in extraUpdatedCols in logical replication X-Git-Tag: REL_12_3~149 X-Git-Url: http://git.postgresql.org/gitweb/static/session/%7B%7Bsession.id%7D%7D-%7B%7Bsession.title%7Cslugify%7D%7D?a=commitdiff_plain;h=4a97f647ddbc79af2fb91727d4a2502ce667d0fd;p=postgresql-pgindent.git Fill in extraUpdatedCols in logical replication The extraUpdatedCols field of the target RTE records which generated columns are affected by an update. This is used in a variety of places, including per-column triggers and foreign data wrappers. When an update was initiated by a logical replication subscription, this field was not filled in, so such an update would not affect generated columns in a way that is consistent with normal updates. To fix, factor out some code from analyze.c to fill in extraUpdatedCols in the logical replication worker as well. Reviewed-by: Pavel Stehule Discussion: https://www.postgresql.org/message-id/flat/b05e781a-fa16-6b52-6738-761181204567@2ndquadrant.com --- diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 345a8e6197..ecd6a8bae7 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -2346,10 +2346,18 @@ transformUpdateTargetList(ParseState *pstate, List *origTlist) if (orig_tl != NULL) elog(ERROR, "UPDATE target count mismatch --- internal error"); - /* - * Record in extraUpdatedCols generated columns referencing updated base - * columns. - */ + fill_extraUpdatedCols(target_rte, tupdesc); + + return tlist; +} + +/* + * Record in extraUpdatedCols generated columns referencing updated base + * columns. + */ +void +fill_extraUpdatedCols(RangeTblEntry *target_rte, TupleDesc tupdesc) +{ if (tupdesc->constr && tupdesc->constr->has_generated_stored) { @@ -2371,8 +2379,6 @@ transformUpdateTargetList(ParseState *pstate, List *origTlist) defval.adnum - FirstLowInvalidHeapAttributeNumber); } } - - return tlist; } /* diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index a038412639..790a28fc77 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -42,6 +42,7 @@ #include "miscadmin.h" #include "nodes/makefuncs.h" #include "optimizer/optimizer.h" +#include "parser/analyze.h" #include "parser/parse_relation.h" #include "pgstat.h" #include "postmaster/bgworker.h" @@ -736,6 +737,8 @@ apply_handle_update(StringInfo s) i + 1 - FirstLowInvalidHeapAttributeNumber); } + fill_extraUpdatedCols(target_rte, RelationGetDescr(rel->localrel)); + PushActiveSnapshot(GetTransactionSnapshot()); ExecOpenIndices(estate->es_result_relation_info, false); diff --git a/src/include/parser/analyze.h b/src/include/parser/analyze.h index cb1d96bc35..b3bad97164 100644 --- a/src/include/parser/analyze.h +++ b/src/include/parser/analyze.h @@ -46,4 +46,6 @@ extern void applyLockingClause(Query *qry, Index rtindex, extern List *BuildOnConflictExcludedTargetlist(Relation targetrel, Index exclRelIndex); +extern void fill_extraUpdatedCols(RangeTblEntry *target_rte, TupleDesc tupdesc); + #endif /* ANALYZE_H */