Skip to content

Commit 59ce652

Browse files
committed
more tests for PartitionRouter, add FIXME
1 parent a26243f commit 59ce652

File tree

4 files changed

+182
-0
lines changed

4 files changed

+182
-0
lines changed

Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ REGRESS = pathman_array_qual \
5555
pathman_runtime_nodes \
5656
pathman_subpartitions \
5757
pathman_update_node \
58+
pathman_update_triggers \
5859
pathman_upd_del \
5960
pathman_utility_stmt \
6061
pathman_views

expected/pathman_update_triggers.out

+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
\set VERBOSITY terse
2+
SET search_path = 'public';
3+
CREATE EXTENSION pg_pathman;
4+
CREATE SCHEMA test_update_triggers;
5+
create table test_update_triggers.test (val int not null);
6+
select create_hash_partitions('test_update_triggers.test', 'val', 2,
7+
partition_names := array[
8+
'test_update_triggers.test_1',
9+
'test_update_triggers.test_2']);
10+
create_hash_partitions
11+
------------------------
12+
2
13+
(1 row)
14+
15+
create or replace function test_update_triggers.test_trigger() returns trigger as $$
16+
begin
17+
raise notice '%', format('%s %s %s (%s)', TG_WHEN, TG_OP, TG_LEVEL, TG_TABLE_NAME);
18+
19+
if TG_OP::text = 'DELETE'::text then
20+
return old;
21+
else
22+
return new;
23+
end if; end;
24+
$$ language plpgsql;
25+
create trigger bu before update ON test_update_triggers.test_1
26+
for each row execute procedure test_update_triggers.test_trigger ();
27+
create trigger bd before delete ON test_update_triggers.test_1
28+
for each row execute procedure test_update_triggers.test_trigger ();
29+
create trigger bi before insert ON test_update_triggers.test_1
30+
for each row execute procedure test_update_triggers.test_trigger ();
31+
create trigger au after update ON test_update_triggers.test_1
32+
for each row execute procedure test_update_triggers.test_trigger ();
33+
create trigger ad after delete ON test_update_triggers.test_1
34+
for each row execute procedure test_update_triggers.test_trigger ();
35+
create trigger ai after insert ON test_update_triggers.test_1
36+
for each row execute procedure test_update_triggers.test_trigger ();
37+
create trigger bu before update ON test_update_triggers.test_2
38+
for each row execute procedure test_update_triggers.test_trigger ();
39+
create trigger bd before delete ON test_update_triggers.test_2
40+
for each row execute procedure test_update_triggers.test_trigger ();
41+
create trigger bi before insert ON test_update_triggers.test_2
42+
for each row execute procedure test_update_triggers.test_trigger ();
43+
create trigger au after update ON test_update_triggers.test_2
44+
for each row execute procedure test_update_triggers.test_trigger ();
45+
create trigger ad after delete ON test_update_triggers.test_2
46+
for each row execute procedure test_update_triggers.test_trigger ();
47+
create trigger ai after insert ON test_update_triggers.test_2
48+
for each row execute procedure test_update_triggers.test_trigger ();
49+
insert into test_update_triggers.test values (1);
50+
NOTICE: BEFORE INSERT ROW (test_1)
51+
NOTICE: AFTER INSERT ROW (test_1)
52+
set pg_pathman.enable_partitionrouter = t;
53+
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
54+
NOTICE: BEFORE UPDATE ROW (test_1)
55+
NOTICE: BEFORE DELETE ROW (test_1)
56+
NOTICE: BEFORE INSERT ROW (test_1)
57+
NOTICE: AFTER DELETE ROW (test_1)
58+
NOTICE: AFTER INSERT ROW (test_1)
59+
val | tableoid
60+
-----+-----------------------------
61+
2 | test_update_triggers.test_1
62+
(1 row)
63+
64+
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
65+
NOTICE: BEFORE UPDATE ROW (test_1)
66+
NOTICE: BEFORE DELETE ROW (test_1)
67+
NOTICE: BEFORE INSERT ROW (test_2)
68+
NOTICE: AFTER DELETE ROW (test_1)
69+
NOTICE: AFTER INSERT ROW (test_2)
70+
val | tableoid
71+
-----+-----------------------------
72+
3 | test_update_triggers.test_2
73+
(1 row)
74+
75+
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
76+
NOTICE: BEFORE UPDATE ROW (test_2)
77+
NOTICE: BEFORE DELETE ROW (test_2)
78+
NOTICE: BEFORE INSERT ROW (test_2)
79+
NOTICE: AFTER DELETE ROW (test_2)
80+
NOTICE: AFTER INSERT ROW (test_2)
81+
val | tableoid
82+
-----+-----------------------------
83+
4 | test_update_triggers.test_2
84+
(1 row)
85+
86+
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
87+
NOTICE: BEFORE UPDATE ROW (test_2)
88+
NOTICE: BEFORE DELETE ROW (test_2)
89+
NOTICE: BEFORE INSERT ROW (test_1)
90+
NOTICE: AFTER DELETE ROW (test_2)
91+
NOTICE: AFTER INSERT ROW (test_1)
92+
val | tableoid
93+
-----+-----------------------------
94+
5 | test_update_triggers.test_1
95+
(1 row)
96+
97+
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
98+
NOTICE: BEFORE UPDATE ROW (test_1)
99+
NOTICE: BEFORE DELETE ROW (test_1)
100+
NOTICE: BEFORE INSERT ROW (test_1)
101+
NOTICE: AFTER DELETE ROW (test_1)
102+
NOTICE: AFTER INSERT ROW (test_1)
103+
val | tableoid
104+
-----+-----------------------------
105+
6 | test_update_triggers.test_1
106+
(1 row)
107+
108+
DROP SCHEMA test_update_triggers CASCADE;
109+
NOTICE: drop cascades to 4 other objects
110+
DROP EXTENSION pg_pathman CASCADE;

sql/pathman_update_triggers.sql

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
\set VERBOSITY terse
2+
3+
SET search_path = 'public';
4+
CREATE EXTENSION pg_pathman;
5+
CREATE SCHEMA test_update_triggers;
6+
7+
8+
9+
create table test_update_triggers.test (val int not null);
10+
select create_hash_partitions('test_update_triggers.test', 'val', 2,
11+
partition_names := array[
12+
'test_update_triggers.test_1',
13+
'test_update_triggers.test_2']);
14+
15+
16+
create or replace function test_update_triggers.test_trigger() returns trigger as $$
17+
begin
18+
raise notice '%', format('%s %s %s (%s)', TG_WHEN, TG_OP, TG_LEVEL, TG_TABLE_NAME);
19+
20+
if TG_OP::text = 'DELETE'::text then
21+
return old;
22+
else
23+
return new;
24+
end if; end;
25+
$$ language plpgsql;
26+
27+
28+
create trigger bu before update ON test_update_triggers.test_1
29+
for each row execute procedure test_update_triggers.test_trigger ();
30+
create trigger bd before delete ON test_update_triggers.test_1
31+
for each row execute procedure test_update_triggers.test_trigger ();
32+
create trigger bi before insert ON test_update_triggers.test_1
33+
for each row execute procedure test_update_triggers.test_trigger ();
34+
35+
create trigger au after update ON test_update_triggers.test_1
36+
for each row execute procedure test_update_triggers.test_trigger ();
37+
create trigger ad after delete ON test_update_triggers.test_1
38+
for each row execute procedure test_update_triggers.test_trigger ();
39+
create trigger ai after insert ON test_update_triggers.test_1
40+
for each row execute procedure test_update_triggers.test_trigger ();
41+
42+
43+
create trigger bu before update ON test_update_triggers.test_2
44+
for each row execute procedure test_update_triggers.test_trigger ();
45+
create trigger bd before delete ON test_update_triggers.test_2
46+
for each row execute procedure test_update_triggers.test_trigger ();
47+
create trigger bi before insert ON test_update_triggers.test_2
48+
for each row execute procedure test_update_triggers.test_trigger ();
49+
50+
create trigger au after update ON test_update_triggers.test_2
51+
for each row execute procedure test_update_triggers.test_trigger ();
52+
create trigger ad after delete ON test_update_triggers.test_2
53+
for each row execute procedure test_update_triggers.test_trigger ();
54+
create trigger ai after insert ON test_update_triggers.test_2
55+
for each row execute procedure test_update_triggers.test_trigger ();
56+
57+
58+
insert into test_update_triggers.test values (1);
59+
60+
set pg_pathman.enable_partitionrouter = t;
61+
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
62+
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
63+
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
64+
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
65+
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
66+
67+
68+
69+
DROP SCHEMA test_update_triggers CASCADE;
70+
DROP EXTENSION pg_pathman CASCADE;

src/hooks.c

+1
Original file line numberDiff line numberDiff line change
@@ -978,6 +978,7 @@ pathman_executor_hook(QueryDesc *queryDesc,
978978

979979
PlanState *state = (PlanState *) queryDesc->planstate;
980980

981+
/* FIXME: we should modify ALL ModifyTable nodes! They might be hidden deeper. */
981982
if (IsA(state, ModifyTableState))
982983
{
983984
ModifyTableState *mt_state = (ModifyTableState *) state;

0 commit comments

Comments
 (0)