Skip to content

Commit 801f2ae

Browse files
committed
PartitionRouter supports AFTER STATEMENT triggers
1 parent 2ee5d31 commit 801f2ae

File tree

5 files changed

+249
-38
lines changed

5 files changed

+249
-38
lines changed

expected/pathman_update_triggers.out

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,76 @@ begin
2222
return new;
2323
end if; end;
2424
$$ language plpgsql;
25+
/* Enable our precious custom node */
26+
set pg_pathman.enable_partitionrouter = t;
27+
/*
28+
* Statement level triggers
29+
*/
30+
create trigger bus before update ON test_update_triggers.test
31+
execute procedure test_update_triggers.test_trigger ();
32+
create trigger bds before delete ON test_update_triggers.test
33+
execute procedure test_update_triggers.test_trigger ();
34+
create trigger bis before insert ON test_update_triggers.test
35+
execute procedure test_update_triggers.test_trigger ();
36+
create trigger aus after update ON test_update_triggers.test
37+
execute procedure test_update_triggers.test_trigger ();
38+
create trigger ads after delete ON test_update_triggers.test
39+
execute procedure test_update_triggers.test_trigger ();
40+
create trigger ais after insert ON test_update_triggers.test
41+
execute procedure test_update_triggers.test_trigger ();
42+
create trigger bus before update ON test_update_triggers.test_1
43+
execute procedure test_update_triggers.test_trigger ();
44+
create trigger bds before delete ON test_update_triggers.test_1
45+
execute procedure test_update_triggers.test_trigger ();
46+
create trigger bis before insert ON test_update_triggers.test_1
47+
execute procedure test_update_triggers.test_trigger ();
48+
create trigger aus after update ON test_update_triggers.test_1
49+
execute procedure test_update_triggers.test_trigger ();
50+
create trigger ads after delete ON test_update_triggers.test_1
51+
execute procedure test_update_triggers.test_trigger ();
52+
create trigger ais after insert ON test_update_triggers.test_1
53+
execute procedure test_update_triggers.test_trigger ();
54+
create trigger bus before update ON test_update_triggers.test_2
55+
execute procedure test_update_triggers.test_trigger ();
56+
create trigger bds before delete ON test_update_triggers.test_2
57+
execute procedure test_update_triggers.test_trigger ();
58+
create trigger bis before insert ON test_update_triggers.test_2
59+
execute procedure test_update_triggers.test_trigger ();
60+
create trigger aus after update ON test_update_triggers.test_2
61+
execute procedure test_update_triggers.test_trigger ();
62+
create trigger ads after delete ON test_update_triggers.test_2
63+
execute procedure test_update_triggers.test_trigger ();
64+
create trigger ais after insert ON test_update_triggers.test_2
65+
execute procedure test_update_triggers.test_trigger ();
66+
/* multiple values */
67+
insert into test_update_triggers.test select generate_series(1, 200);
68+
NOTICE: BEFORE INSERT STATEMENT (test)
69+
NOTICE: AFTER INSERT STATEMENT (test)
70+
update test_update_triggers.test set val = val + 1;
71+
NOTICE: BEFORE UPDATE STATEMENT (test)
72+
NOTICE: AFTER UPDATE STATEMENT (test)
73+
update test_update_triggers.test set val = val + 1;
74+
NOTICE: BEFORE UPDATE STATEMENT (test)
75+
NOTICE: AFTER UPDATE STATEMENT (test)
76+
update test_update_triggers.test set val = val + 1;
77+
NOTICE: BEFORE UPDATE STATEMENT (test)
78+
NOTICE: AFTER UPDATE STATEMENT (test)
79+
update test_update_triggers.test set val = val + 1;
80+
NOTICE: BEFORE UPDATE STATEMENT (test)
81+
NOTICE: AFTER UPDATE STATEMENT (test)
82+
update test_update_triggers.test set val = val + 1;
83+
NOTICE: BEFORE UPDATE STATEMENT (test)
84+
NOTICE: AFTER UPDATE STATEMENT (test)
85+
select count(distinct val) from test_update_triggers.test;
86+
count
87+
-------
88+
200
89+
(1 row)
90+
91+
truncate test_update_triggers.test;
92+
/*
93+
* Row level triggers
94+
*/
2595
create trigger bu before update ON test_update_triggers.test_1
2696
for each row execute procedure test_update_triggers.test_trigger ();
2797
create trigger bd before delete ON test_update_triggers.test_1
@@ -46,56 +116,74 @@ create trigger ad after delete ON test_update_triggers.test_2
46116
for each row execute procedure test_update_triggers.test_trigger ();
47117
create trigger ai after insert ON test_update_triggers.test_2
48118
for each row execute procedure test_update_triggers.test_trigger ();
119+
/* single value */
49120
insert into test_update_triggers.test values (1);
121+
NOTICE: BEFORE INSERT STATEMENT (test)
50122
NOTICE: BEFORE INSERT ROW (test_1)
51123
NOTICE: AFTER INSERT ROW (test_1)
52-
set pg_pathman.enable_partitionrouter = t;
124+
NOTICE: AFTER INSERT STATEMENT (test)
53125
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
126+
NOTICE: BEFORE UPDATE STATEMENT (test)
54127
NOTICE: BEFORE UPDATE ROW (test_1)
55128
NOTICE: AFTER UPDATE ROW (test_1)
129+
NOTICE: AFTER UPDATE STATEMENT (test)
56130
val | tableoid
57131
-----+-----------------------------
58132
2 | test_update_triggers.test_1
59133
(1 row)
60134

61135
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
136+
NOTICE: BEFORE UPDATE STATEMENT (test)
62137
NOTICE: BEFORE UPDATE ROW (test_1)
63138
NOTICE: BEFORE DELETE ROW (test_1)
64139
NOTICE: BEFORE INSERT ROW (test_2)
65140
NOTICE: AFTER DELETE ROW (test_1)
66141
NOTICE: AFTER INSERT ROW (test_2)
142+
NOTICE: AFTER UPDATE STATEMENT (test)
67143
val | tableoid
68144
-----+-----------------------------
69145
3 | test_update_triggers.test_2
70146
(1 row)
71147

72148
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
149+
NOTICE: BEFORE UPDATE STATEMENT (test)
73150
NOTICE: BEFORE UPDATE ROW (test_2)
74151
NOTICE: AFTER UPDATE ROW (test_2)
152+
NOTICE: AFTER UPDATE STATEMENT (test)
75153
val | tableoid
76154
-----+-----------------------------
77155
4 | test_update_triggers.test_2
78156
(1 row)
79157

80158
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
159+
NOTICE: BEFORE UPDATE STATEMENT (test)
81160
NOTICE: BEFORE UPDATE ROW (test_2)
82161
NOTICE: BEFORE DELETE ROW (test_2)
83162
NOTICE: BEFORE INSERT ROW (test_1)
84163
NOTICE: AFTER DELETE ROW (test_2)
85164
NOTICE: AFTER INSERT ROW (test_1)
165+
NOTICE: AFTER UPDATE STATEMENT (test)
86166
val | tableoid
87167
-----+-----------------------------
88168
5 | test_update_triggers.test_1
89169
(1 row)
90170

91171
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
172+
NOTICE: BEFORE UPDATE STATEMENT (test)
92173
NOTICE: BEFORE UPDATE ROW (test_1)
93174
NOTICE: AFTER UPDATE ROW (test_1)
175+
NOTICE: AFTER UPDATE STATEMENT (test)
94176
val | tableoid
95177
-----+-----------------------------
96178
6 | test_update_triggers.test_1
97179
(1 row)
98180

181+
select count(distinct val) from test_update_triggers.test;
182+
count
183+
-------
184+
1
185+
(1 row)
186+
99187
DROP SCHEMA test_update_triggers CASCADE;
100188
NOTICE: drop cascades to 4 other objects
101189
DROP EXTENSION pg_pathman CASCADE;

sql/pathman_update_triggers.sql

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,79 @@ begin
2525
$$ language plpgsql;
2626

2727

28+
/* Enable our precious custom node */
29+
set pg_pathman.enable_partitionrouter = t;
30+
31+
32+
/*
33+
* Statement level triggers
34+
*/
35+
36+
create trigger bus before update ON test_update_triggers.test
37+
execute procedure test_update_triggers.test_trigger ();
38+
create trigger bds before delete ON test_update_triggers.test
39+
execute procedure test_update_triggers.test_trigger ();
40+
create trigger bis before insert ON test_update_triggers.test
41+
execute procedure test_update_triggers.test_trigger ();
42+
43+
44+
create trigger aus after update ON test_update_triggers.test
45+
execute procedure test_update_triggers.test_trigger ();
46+
create trigger ads after delete ON test_update_triggers.test
47+
execute procedure test_update_triggers.test_trigger ();
48+
create trigger ais after insert ON test_update_triggers.test
49+
execute procedure test_update_triggers.test_trigger ();
50+
51+
52+
create trigger bus before update ON test_update_triggers.test_1
53+
execute procedure test_update_triggers.test_trigger ();
54+
create trigger bds before delete ON test_update_triggers.test_1
55+
execute procedure test_update_triggers.test_trigger ();
56+
create trigger bis before insert ON test_update_triggers.test_1
57+
execute procedure test_update_triggers.test_trigger ();
58+
59+
create trigger aus after update ON test_update_triggers.test_1
60+
execute procedure test_update_triggers.test_trigger ();
61+
create trigger ads after delete ON test_update_triggers.test_1
62+
execute procedure test_update_triggers.test_trigger ();
63+
create trigger ais after insert ON test_update_triggers.test_1
64+
execute procedure test_update_triggers.test_trigger ();
65+
66+
67+
create trigger bus before update ON test_update_triggers.test_2
68+
execute procedure test_update_triggers.test_trigger ();
69+
create trigger bds before delete ON test_update_triggers.test_2
70+
execute procedure test_update_triggers.test_trigger ();
71+
create trigger bis before insert ON test_update_triggers.test_2
72+
execute procedure test_update_triggers.test_trigger ();
73+
74+
create trigger aus after update ON test_update_triggers.test_2
75+
execute procedure test_update_triggers.test_trigger ();
76+
create trigger ads after delete ON test_update_triggers.test_2
77+
execute procedure test_update_triggers.test_trigger ();
78+
create trigger ais after insert ON test_update_triggers.test_2
79+
execute procedure test_update_triggers.test_trigger ();
80+
81+
82+
/* multiple values */
83+
insert into test_update_triggers.test select generate_series(1, 200);
84+
85+
update test_update_triggers.test set val = val + 1;
86+
update test_update_triggers.test set val = val + 1;
87+
update test_update_triggers.test set val = val + 1;
88+
update test_update_triggers.test set val = val + 1;
89+
update test_update_triggers.test set val = val + 1;
90+
91+
select count(distinct val) from test_update_triggers.test;
92+
93+
94+
truncate test_update_triggers.test;
95+
96+
97+
/*
98+
* Row level triggers
99+
*/
100+
28101
create trigger bu before update ON test_update_triggers.test_1
29102
for each row execute procedure test_update_triggers.test_trigger ();
30103
create trigger bd before delete ON test_update_triggers.test_1
@@ -55,15 +128,16 @@ create trigger ai after insert ON test_update_triggers.test_2
55128
for each row execute procedure test_update_triggers.test_trigger ();
56129

57130

131+
/* single value */
58132
insert into test_update_triggers.test values (1);
59133

60-
set pg_pathman.enable_partitionrouter = t;
61134
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
62135
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
63136
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
64137
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
65138
update test_update_triggers.test set val = val + 1 returning *, tableoid::regclass;
66139

140+
select count(distinct val) from test_update_triggers.test;
67141

68142

69143
DROP SCHEMA test_update_triggers CASCADE;

src/include/partition_router.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,18 @@ typedef struct PartitionRouterState
3535
JunkFilter *junkfilter; /* 'ctid' extraction facility */
3636
ResultRelInfo *current_rri;
3737

38+
/* Machinery required for EvalPlanQual */
3839
EPQState epqstate;
3940
int epqparam;
4041

41-
ModifyTableState *mt_state; /* need this for a GREAT deal of hackery */
42-
TupleTableSlot *saved_slot;
42+
/* Preserved slot from last call */
43+
bool yielded;
44+
TupleTableSlot *yielded_slot;
45+
46+
/* Need these for a GREAT deal of hackery */
47+
ModifyTableState *mt_state;
48+
bool update_stmt_triggers,
49+
insert_stmt_triggers;
4350
} PartitionRouterState;
4451

4552

src/partition_filter.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -801,8 +801,7 @@ partition_filter_end(CustomScanState *node)
801801
void
802802
partition_filter_rescan(CustomScanState *node)
803803
{
804-
Assert(list_length(node->custom_ps) == 1);
805-
ExecReScan((PlanState *) linitial(node->custom_ps));
804+
elog(ERROR, "partition_filter_rescan is not implemented");
806805
}
807806

808807
void

0 commit comments

Comments
 (0)