Fill in extraUpdatedCols in logical replication
authorPeter Eisentraut
Mon, 17 Feb 2020 14:19:58 +0000 (15:19 +0100)
committerPeter Eisentraut
Mon, 17 Feb 2020 14:20:57 +0000 (15:20 +0100)
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

src/backend/parser/analyze.c
src/backend/replication/logical/worker.c
src/include/parser/analyze.h

index 748bebffc17e734622da973f87acdbdcebb64068..6676412842be5ddae4a3ca3c7c7ae9cf9877fdef 100644 (file)
@@ -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;
 }
 
 /*
index 7a5471f95cb5448e3da0f22603c86dcdeccfb45f..ad4a732fd204440627e7610cd54a6bb00abf3204 100644 (file)
@@ -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"
@@ -737,6 +738,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);
 
index d6a467a57287e01289cfa7a54d9fecbc3ab12ef0..9d09a0214197db0648f7555be1b553645223b5ad 100644 (file)
@@ -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 */