100 lines
2.5 KiB
Perl
100 lines
2.5 KiB
Perl
|
|
# Copyright (c) 2021-2023, PostgreSQL Global Development Group
|
|
|
|
# Test generated columns
|
|
use strict;
|
|
use warnings;
|
|
use PostgreSQL::Test::Cluster;
|
|
use PostgreSQL::Test::Utils;
|
|
use Test::More;
|
|
|
|
# setup
|
|
|
|
my $node_publisher = PostgreSQL::Test::Cluster->new('publisher');
|
|
$node_publisher->init(allows_streaming => 'logical');
|
|
$node_publisher->start;
|
|
|
|
my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber');
|
|
$node_subscriber->init(allows_streaming => 'logical');
|
|
$node_subscriber->start;
|
|
|
|
my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres';
|
|
|
|
$node_publisher->safe_psql('postgres',
|
|
"CREATE TABLE tab1 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED)"
|
|
);
|
|
|
|
$node_subscriber->safe_psql('postgres',
|
|
"CREATE TABLE tab1 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 22) STORED, c int)"
|
|
);
|
|
|
|
# data for initial sync
|
|
|
|
$node_publisher->safe_psql('postgres',
|
|
"INSERT INTO tab1 (a) VALUES (1), (2), (3)");
|
|
|
|
$node_publisher->safe_psql('postgres',
|
|
"CREATE PUBLICATION pub1 FOR ALL TABLES");
|
|
$node_subscriber->safe_psql('postgres',
|
|
"CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub1"
|
|
);
|
|
|
|
# Wait for initial sync of all subscriptions
|
|
$node_subscriber->wait_for_subscription_sync;
|
|
|
|
my $result = $node_subscriber->safe_psql('postgres', "SELECT a, b FROM tab1");
|
|
is( $result, qq(1|22
|
|
2|44
|
|
3|66), 'generated columns initial sync');
|
|
|
|
# data to replicate
|
|
|
|
$node_publisher->safe_psql('postgres', "INSERT INTO tab1 VALUES (4), (5)");
|
|
|
|
$node_publisher->safe_psql('postgres', "UPDATE tab1 SET a = 6 WHERE a = 5");
|
|
|
|
$node_publisher->wait_for_catchup('sub1');
|
|
|
|
$result = $node_subscriber->safe_psql('postgres', "SELECT * FROM tab1");
|
|
is( $result, qq(1|22|
|
|
2|44|
|
|
3|66|
|
|
4|88|
|
|
6|132|), 'generated columns replicated');
|
|
|
|
# try it with a subscriber-side trigger
|
|
|
|
$node_subscriber->safe_psql(
|
|
'postgres', q{
|
|
CREATE FUNCTION tab1_trigger_func() RETURNS trigger
|
|
LANGUAGE plpgsql AS $$
|
|
BEGIN
|
|
NEW.c := NEW.a + 10;
|
|
RETURN NEW;
|
|
END $$;
|
|
|
|
CREATE TRIGGER test1 BEFORE INSERT OR UPDATE ON tab1
|
|
FOR EACH ROW
|
|
EXECUTE PROCEDURE tab1_trigger_func();
|
|
|
|
ALTER TABLE tab1 ENABLE REPLICA TRIGGER test1;
|
|
});
|
|
|
|
$node_publisher->safe_psql('postgres', "INSERT INTO tab1 VALUES (7), (8)");
|
|
|
|
$node_publisher->safe_psql('postgres', "UPDATE tab1 SET a = 9 WHERE a = 7");
|
|
|
|
$node_publisher->wait_for_catchup('sub1');
|
|
|
|
$result =
|
|
$node_subscriber->safe_psql('postgres', "SELECT * FROM tab1 ORDER BY 1");
|
|
is( $result, qq(1|22|
|
|
2|44|
|
|
3|66|
|
|
4|88|
|
|
6|132|
|
|
8|176|18
|
|
9|198|19), 'generated columns replicated with trigger');
|
|
|
|
done_testing();
|