Skip to content

Commit e32f4c6

Browse files
committed
some triggers (excluding BEFORE\AFTER stmt) on parent table can be executed on partitions
1 parent 04d5ed2 commit e32f4c6

File tree

3 files changed

+104
-1
lines changed

3 files changed

+104
-1
lines changed

src/partition_filter.c

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "partition_filter.h"
2+
#include "utils.h"
23
#include "utils/guc.h"
34
#include "nodes/nodeFuncs.h"
45

@@ -220,6 +221,15 @@ getResultRelInfo(Oid partid, PartitionFilterState *state)
220221
#define CopyToResultRelInfo(field_name) \
221222
( resultRelInfo->field_name = state->savedRelInfo->field_name )
222223

224+
#define ResizeTriggerField(field_name, field_type) \
225+
do { \
226+
if (resultRelInfo->field_name) \
227+
pfree(resultRelInfo->field_name); \
228+
/* palloc0() is necessary here */ \
229+
resultRelInfo->field_name = (field_type *) \
230+
palloc0(resultRelInfo->ri_TrigDesc->numtriggers * sizeof(field_type)); \
231+
} while (0)
232+
223233
ResultRelInfoHandle *resultRelInfoHandle;
224234
bool found;
225235

@@ -229,14 +239,34 @@ getResultRelInfo(Oid partid, PartitionFilterState *state)
229239

230240
if (!found)
231241
{
232-
ResultRelInfo *resultRelInfo = (ResultRelInfo *) palloc(sizeof(ResultRelInfo));
242+
bool grown_up;
243+
ResultRelInfo *resultRelInfo = (ResultRelInfo *) palloc(sizeof(ResultRelInfo));
244+
233245
InitResultRelInfo(resultRelInfo,
234246
heap_open(partid, RowExclusiveLock),
235247
0,
236248
state->css.ss.ps.state->es_instrument);
237249

238250
ExecOpenIndices(resultRelInfo, state->onConflictAction != ONCONFLICT_NONE);
239251

252+
resultRelInfo->ri_TrigDesc = append_trigger_descs(resultRelInfo->ri_TrigDesc,
253+
state->savedRelInfo->ri_TrigDesc,
254+
&grown_up);
255+
if (grown_up)
256+
{
257+
ResizeTriggerField(ri_TrigFunctions, FmgrInfo);
258+
ResizeTriggerField(ri_TrigWhenExprs, List *);
259+
260+
if (resultRelInfo->ri_TrigInstrument)
261+
{
262+
pfree(resultRelInfo->ri_TrigInstrument);
263+
264+
resultRelInfo->ri_TrigInstrument =
265+
InstrAlloc(resultRelInfo->ri_TrigDesc->numtriggers,
266+
state->css.ss.ps.state->es_instrument);
267+
}
268+
}
269+
240270
/* Copy necessary fields from saved ResultRelInfo */
241271
CopyToResultRelInfo(ri_WithCheckOptions);
242272
CopyToResultRelInfo(ri_WithCheckOptionExprs);

src/utils.c

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,3 +141,72 @@ check_rinfo_for_partitioned_attr(List *rinfo, Index varno, AttrNumber varattno)
141141

142142
return false;
143143
}
144+
145+
TriggerDesc *
146+
append_trigger_descs(TriggerDesc *src, TriggerDesc *more, bool *grown_up)
147+
{
148+
#define CopyToTriggerDesc(bool_field_name) \
149+
( new_desc->bool_field_name |= (src->bool_field_name || more->bool_field_name) )
150+
151+
TriggerDesc *new_desc = (TriggerDesc *) palloc0(sizeof(TriggerDesc));
152+
Trigger *cur_trigger;
153+
int i;
154+
155+
/* Quick choices */
156+
if (!src && !more)
157+
{
158+
*grown_up = false;
159+
return NULL;
160+
}
161+
else if (!src)
162+
{
163+
*grown_up = true; /* expand space for new triggers */
164+
return more;
165+
}
166+
else if (!more)
167+
{
168+
*grown_up = false; /* no new triggers will be added */
169+
return src;
170+
}
171+
172+
*grown_up = true;
173+
new_desc->numtriggers = src->numtriggers + more->numtriggers;
174+
new_desc->triggers = palloc(new_desc->numtriggers * sizeof(Trigger));
175+
176+
cur_trigger = new_desc->triggers;
177+
178+
/* Copy triggers from 'a' */
179+
for (i = 0; i < src->numtriggers; i++)
180+
memcpy(cur_trigger++, &(src->triggers[i]), sizeof(Trigger));
181+
182+
/* Copy triggers from 'b' */
183+
for (i = 0; i < more->numtriggers; i++)
184+
memcpy(cur_trigger++, &(more->triggers[i]), sizeof(Trigger));
185+
186+
/* Copy insert bool flags */
187+
CopyToTriggerDesc(trig_insert_before_row);
188+
CopyToTriggerDesc(trig_insert_after_row);
189+
CopyToTriggerDesc(trig_insert_instead_row);
190+
CopyToTriggerDesc(trig_insert_before_statement);
191+
CopyToTriggerDesc(trig_insert_after_statement);
192+
193+
/* Copy update bool flags */
194+
CopyToTriggerDesc(trig_update_before_row);
195+
CopyToTriggerDesc(trig_update_after_row);
196+
CopyToTriggerDesc(trig_update_instead_row);
197+
CopyToTriggerDesc(trig_update_before_statement);
198+
CopyToTriggerDesc(trig_update_after_statement);
199+
200+
/* Copy delete bool flags */
201+
CopyToTriggerDesc(trig_delete_before_row);
202+
CopyToTriggerDesc(trig_delete_after_row);
203+
CopyToTriggerDesc(trig_delete_instead_row);
204+
CopyToTriggerDesc(trig_delete_before_statement);
205+
CopyToTriggerDesc(trig_delete_after_statement);
206+
207+
/* Copy truncate bool flags */
208+
CopyToTriggerDesc(trig_truncate_before_statement);
209+
CopyToTriggerDesc(trig_truncate_after_statement);
210+
211+
return new_desc;
212+
}

src/utils.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,8 @@ bool check_rinfo_for_partitioned_attr(List *rinfo,
3131
Index varno,
3232
AttrNumber varattno);
3333

34+
TriggerDesc * append_trigger_descs(TriggerDesc *src,
35+
TriggerDesc *more,
36+
bool *grown_up);
37+
3438
#endif

0 commit comments

Comments
 (0)