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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy