|
|
|
@ -3,7 +3,7 @@ use strict; |
|
|
|
|
use warnings; |
|
|
|
|
use PostgresNode; |
|
|
|
|
use TestLib; |
|
|
|
|
use Test::More tests => 4; |
|
|
|
|
use Test::More tests => 6; |
|
|
|
|
|
|
|
|
|
# Initialize publisher node |
|
|
|
|
my $node_publisher = get_new_node('publisher'); |
|
|
|
@ -81,6 +81,8 @@ BEGIN |
|
|
|
|
ELSE |
|
|
|
|
RETURN NULL; |
|
|
|
|
END IF; |
|
|
|
|
ELSIF (TG_OP = 'UPDATE') THEN |
|
|
|
|
RETURN NULL; |
|
|
|
|
ELSE |
|
|
|
|
RAISE WARNING 'Unknown action'; |
|
|
|
|
RETURN NULL; |
|
|
|
@ -88,7 +90,7 @@ BEGIN |
|
|
|
|
END; |
|
|
|
|
\$\$ LANGUAGE plpgsql; |
|
|
|
|
CREATE TRIGGER filter_basic_dml_trg |
|
|
|
|
BEFORE INSERT ON tab_fk_ref |
|
|
|
|
BEFORE INSERT OR UPDATE OF bid ON tab_fk_ref |
|
|
|
|
FOR EACH ROW EXECUTE PROCEDURE filter_basic_dml_fn(); |
|
|
|
|
ALTER TABLE tab_fk_ref ENABLE REPLICA TRIGGER filter_basic_dml_trg; |
|
|
|
|
}); |
|
|
|
@ -99,10 +101,32 @@ $node_publisher->safe_psql('postgres', |
|
|
|
|
|
|
|
|
|
$node_publisher->wait_for_catchup('tap_sub'); |
|
|
|
|
|
|
|
|
|
# The row should be skipped on subscriber |
|
|
|
|
# The trigger should cause the insert to be skipped on subscriber |
|
|
|
|
$result = $node_subscriber->safe_psql('postgres', |
|
|
|
|
"SELECT count(*), min(bid), max(bid) FROM tab_fk_ref;"); |
|
|
|
|
is($result, qq(2|1|2), 'check replica insert trigger applied on subscriber'); |
|
|
|
|
|
|
|
|
|
# Update data |
|
|
|
|
$node_publisher->safe_psql('postgres', |
|
|
|
|
"UPDATE tab_fk_ref SET bid = 2 WHERE bid = 1;"); |
|
|
|
|
|
|
|
|
|
$node_publisher->wait_for_catchup('tap_sub'); |
|
|
|
|
|
|
|
|
|
# The trigger should cause the update to be skipped on subscriber |
|
|
|
|
$result = $node_subscriber->safe_psql('postgres', |
|
|
|
|
"SELECT count(*), min(bid), max(bid) FROM tab_fk_ref;"); |
|
|
|
|
is($result, qq(2|1|2), 'check replica trigger applied on subscriber'); |
|
|
|
|
is($result, qq(2|1|2), 'check replica update column trigger applied on subscriber'); |
|
|
|
|
|
|
|
|
|
# Update on a column not specified in the trigger, but it will trigger |
|
|
|
|
# anyway because logical replication ships all columns in an update. |
|
|
|
|
$node_publisher->safe_psql('postgres', |
|
|
|
|
"UPDATE tab_fk_ref SET id = 6 WHERE id = 1;"); |
|
|
|
|
|
|
|
|
|
$node_publisher->wait_for_catchup('tap_sub'); |
|
|
|
|
|
|
|
|
|
$result = $node_subscriber->safe_psql('postgres', |
|
|
|
|
"SELECT count(*), min(id), max(id) FROM tab_fk_ref;"); |
|
|
|
|
is($result, qq(2|1|2), 'check column trigger applied on even for other column'); |
|
|
|
|
|
|
|
|
|
$node_subscriber->stop('fast'); |
|
|
|
|
$node_publisher->stop('fast'); |
|
|
|
|