diff options
| author | Amit Kapila | 2024-10-30 07:06:26 +0000 |
|---|---|---|
| committer | Amit Kapila | 2024-10-30 07:06:26 +0000 |
| commit | 745217a051a9341e8c577ea59a87665d331d4af0 (patch) | |
| tree | 84dc2a406947b44ebbe9d71214fd024a83413a32 /src/test/subscription | |
| parent | f22e436bff779fee4e1ce49733ba5791d4634fb1 (diff) | |
Replicate generated columns when specified in the column list.
This commit allows logical replication to publish and replicate generated
columns when explicitly listed in the column list. We also ensured that
the generated columns were copied during the initial tablesync when they
were published.
We will allow to replicate generated columns even when they are not
specified in the column list (via a new publication option) in a separate
commit.
The motivation of this work is to allow replication for cases where the
client doesn't have generated columns. For example, the case where one is
trying to replicate data from Postgres to the non-Postgres database.
Author: Shubham Khanna, Vignesh C, Hou Zhijie
Reviewed-by: Peter Smith, Hayato Kuroda, Shlok Kyal, Amit Kapila
Discussion: https://postgr.es/m/B80D17B2-2C8E-4C7D-87F2-E5B4BE3C069E@gmail.com
Diffstat (limited to 'src/test/subscription')
| -rw-r--r-- | src/test/subscription/t/031_column_list.pl | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/src/test/subscription/t/031_column_list.pl b/src/test/subscription/t/031_column_list.pl index 9a97fa50203..e54861b599d 100644 --- a/src/test/subscription/t/031_column_list.pl +++ b/src/test/subscription/t/031_column_list.pl @@ -1202,9 +1202,10 @@ $result = $node_publisher->safe_psql( is( $result, qq(t t), 'check the number of columns in the old tuple'); -# TEST: Generated and dropped columns are not considered for the column list. -# So, the publication having a column list except for those columns and a -# publication without any column (aka all columns as part of the columns +# TEST: Dropped columns are not considered for the column list, and generated +# columns are not replicated if they are not explicitly included in the column +# list. So, the publication having a column list except for those columns and a +# publication without any column list (aka all columns as part of the columns # list) are considered to have the same column list. $node_publisher->safe_psql( 'postgres', qq( @@ -1275,6 +1276,40 @@ ok( $stderr =~ qr/cannot use different column lists for table "public.test_mix_1" in different publications/, 'different column lists detected'); +# TEST: Generated columns are considered for the column list. +$node_publisher->safe_psql( + 'postgres', qq( + CREATE TABLE test_gen (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a + 1) STORED); + INSERT INTO test_gen VALUES (0); + CREATE PUBLICATION pub_gen FOR TABLE test_gen (a, b); +)); + +$node_subscriber->safe_psql( + 'postgres', qq( + CREATE TABLE test_gen (a int PRIMARY KEY, b int); + CREATE SUBSCRIPTION sub_gen CONNECTION '$publisher_connstr' PUBLICATION pub_gen; +)); + +$node_subscriber->wait_for_subscription_sync; + +is( $node_subscriber->safe_psql( + 'postgres', "SELECT * FROM test_gen ORDER BY a"), + qq(0|1), + 'initial replication with generated columns in column list'); + +$node_publisher->safe_psql( + 'postgres', qq( + INSERT INTO test_gen VALUES (1); +)); + +$node_publisher->wait_for_catchup('sub_gen'); + +is( $node_subscriber->safe_psql( + 'postgres', "SELECT * FROM test_gen ORDER BY a"), + qq(0|1 +1|2), + 'replication with generated columns in column list'); + # TEST: If the column list is changed after creating the subscription, we # should catch the error reported by walsender. |
