]> granicus.if.org Git - postgresql/commitdiff
Fix local/remote attribute mix-up in logical replication
authorPeter Eisentraut <peter_e@gmx.net>
Mon, 7 Aug 2017 14:49:08 +0000 (10:49 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Mon, 7 Aug 2017 14:49:08 +0000 (10:49 -0400)
This would lead to failures if local and remote tables have a different
column order.  The tests previously didn't catch that because they only
tested the initial data copy.  So add another test that exercises the
apply worker.

Author: Petr Jelinek <petr.jelinek@2ndquadrant.com>

src/backend/replication/logical/worker.c
src/test/subscription/t/001_rep_changes.pl

index 0d48dfa4947182e688eaba02749f0a67946f3a4e..7c2df576457958697c23010086d02cbf781f9b03 100644 (file)
@@ -402,7 +402,8 @@ slot_modify_cstrings(TupleTableSlot *slot, LogicalRepRelMapEntry *rel,
                        errarg.attnum = remoteattnum;
 
                        getTypeInputInfo(att->atttypid, &typinput, &typioparam);
-                       slot->tts_values[i] = OidInputFunctionCall(typinput, values[i],
+                       slot->tts_values[i] = OidInputFunctionCall(typinput,
+                                                                                                          values[remoteattnum],
                                                                                                           typioparam,
                                                                                                           att->atttypmod);
                        slot->tts_isnull[i] = false;
index a63c67984844332f5ffa6a563068a334b2add1ab..268808da7dad6e26eb6d34e18ae8c69fa3e01aa3 100644 (file)
@@ -89,6 +89,8 @@ $node_publisher->safe_psql('postgres',
 $node_publisher->safe_psql('postgres', "DELETE FROM tab_rep WHERE a > 20");
 $node_publisher->safe_psql('postgres', "UPDATE tab_rep SET a = -a");
 
+$node_publisher->safe_psql('postgres', "INSERT INTO tab_mixed VALUES (2, 'bar')");
+
 $node_publisher->poll_query_until('postgres', $caughtup_query)
   or die "Timed out while waiting for subscriber to catch up";
 
@@ -102,7 +104,8 @@ is($result, qq(20|-20|-1), 'check replicated changes on subscriber');
 
 $result = $node_subscriber->safe_psql('postgres',
        "SELECT c, b, a FROM tab_mixed");
-is($result, qq(|foo|1), 'check replicated changes with different column order');
+is($result, qq(|foo|1
+|bar|2), 'check replicated changes with different column order');
 
 # insert some duplicate rows
 $node_publisher->safe_psql('postgres',