Skip to content

Commit 1bcb666

Browse files
committed
don't call parent's triggers on children (this does not work with foreign keys anyway)
1 parent ddde0e9 commit 1bcb666

File tree

3 files changed

+10
-111
lines changed

3 files changed

+10
-111
lines changed

src/partition_filter.c

Lines changed: 10 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,9 @@ partition_filter_exec(CustomScanState *node)
232232
ResetExprContext(econtext);
233233

234234
/* Replace parent table with a suitable partition */
235+
old_cxt = MemoryContextSwitchTo(estate->es_query_cxt);
235236
estate->es_result_relation_info = getResultRelInfo(selected_partid, state);
237+
MemoryContextSwitchTo(old_cxt);
236238

237239
return slot;
238240
}
@@ -285,24 +287,16 @@ getResultRelInfo(Oid partid, PartitionFilterState *state)
285287
#define CopyToResultRelInfo(field_name) \
286288
( resultRelInfo->field_name = state->savedRelInfo->field_name )
287289

288-
#define ResizeTriggerField(field_name, field_type) \
289-
do { \
290-
if (resultRelInfo->field_name) \
291-
pfree(resultRelInfo->field_name); \
292-
resultRelInfo->field_name = (field_type *) \
293-
palloc0(resultRelInfo->ri_TrigDesc->numtriggers * sizeof(field_type)); \
294-
} while (0)
295-
296-
ResultRelInfoHolder *resultRelInfoHandle;
290+
ResultRelInfoHolder *resultRelInfoHolder;
297291
bool found;
298292

299-
resultRelInfoHandle = hash_search(state->result_rels_table,
293+
resultRelInfoHolder = hash_search(state->result_rels_table,
300294
(const void *) &partid,
301295
HASH_ENTER, &found);
302296

297+
/* If not found, create & cache new ResultRelInfo */
303298
if (!found)
304299
{
305-
bool grown_up;
306300
ResultRelInfo *resultRelInfo = (ResultRelInfo *) palloc(sizeof(ResultRelInfo));
307301

308302
InitResultRelInfo(resultRelInfo,
@@ -312,24 +306,6 @@ getResultRelInfo(Oid partid, PartitionFilterState *state)
312306

313307
ExecOpenIndices(resultRelInfo, state->onConflictAction != ONCONFLICT_NONE);
314308

315-
resultRelInfo->ri_TrigDesc = append_trigger_descs(resultRelInfo->ri_TrigDesc,
316-
state->savedRelInfo->ri_TrigDesc,
317-
&grown_up);
318-
if (grown_up)
319-
{
320-
ResizeTriggerField(ri_TrigFunctions, FmgrInfo);
321-
ResizeTriggerField(ri_TrigWhenExprs, List *);
322-
323-
if (resultRelInfo->ri_TrigInstrument)
324-
{
325-
pfree(resultRelInfo->ri_TrigInstrument);
326-
327-
resultRelInfo->ri_TrigInstrument =
328-
InstrAlloc(resultRelInfo->ri_TrigDesc->numtriggers,
329-
state->css.ss.ps.state->es_instrument);
330-
}
331-
}
332-
333309
/* Copy necessary fields from saved ResultRelInfo */
334310
CopyToResultRelInfo(ri_WithCheckOptions);
335311
CopyToResultRelInfo(ri_WithCheckOptionExprs);
@@ -341,14 +317,15 @@ getResultRelInfo(Oid partid, PartitionFilterState *state)
341317
/* ri_ConstraintExprs will be initialized by ExecRelCheck() */
342318
resultRelInfo->ri_ConstraintExprs = NULL;
343319

344-
resultRelInfoHandle->partid = partid;
345-
resultRelInfoHandle->resultRelInfo = resultRelInfo;
346-
347320
/* Make 'range table index' point to the parent relation */
348321
resultRelInfo->ri_RangeTableIndex = state->savedRelInfo->ri_RangeTableIndex;
322+
323+
/* Now fill the ResultRelInfo holder */
324+
resultRelInfoHolder->partid = partid;
325+
resultRelInfoHolder->resultRelInfo = resultRelInfo;
349326
}
350327

351-
return resultRelInfoHandle->resultRelInfo;
328+
return resultRelInfoHolder->resultRelInfo;
352329
}
353330

354331
/*

src/utils.c

Lines changed: 0 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -279,81 +279,6 @@ check_rinfo_for_partitioned_attr(List *rinfo, Index varno, AttrNumber varattno)
279279
return false;
280280
}
281281

282-
/*
283-
* Append trigger info contained in 'more' to 'src', both remain unmodified.
284-
*
285-
* This allows us to execute some of main table's triggers on children.
286-
* See ExecInsert() for more details.
287-
*/
288-
TriggerDesc *
289-
append_trigger_descs(TriggerDesc *src, TriggerDesc *more, bool *grown_up)
290-
{
291-
#define CopyToTriggerDesc(bool_field_name) \
292-
( new_desc->bool_field_name |= (src->bool_field_name || more->bool_field_name) )
293-
294-
TriggerDesc *new_desc = (TriggerDesc *) palloc0(sizeof(TriggerDesc));
295-
Trigger *cur_trigger;
296-
int i;
297-
298-
/* Quick choices */
299-
if (!src && !more)
300-
{
301-
*grown_up = false;
302-
return NULL;
303-
}
304-
else if (!src)
305-
{
306-
*grown_up = true; /* expand space for new triggers */
307-
return more;
308-
}
309-
else if (!more)
310-
{
311-
*grown_up = false; /* no new triggers will be added */
312-
return src;
313-
}
314-
315-
*grown_up = true;
316-
new_desc->numtriggers = src->numtriggers + more->numtriggers;
317-
new_desc->triggers = (Trigger *) palloc(new_desc->numtriggers * sizeof(Trigger));
318-
319-
cur_trigger = new_desc->triggers;
320-
321-
/* Copy triggers from 'a' */
322-
for (i = 0; i < src->numtriggers; i++)
323-
memcpy(cur_trigger++, &(src->triggers[i]), sizeof(Trigger));
324-
325-
/* Copy triggers from 'b' */
326-
for (i = 0; i < more->numtriggers; i++)
327-
memcpy(cur_trigger++, &(more->triggers[i]), sizeof(Trigger));
328-
329-
/* Copy insert bool flags */
330-
CopyToTriggerDesc(trig_insert_before_row);
331-
CopyToTriggerDesc(trig_insert_after_row);
332-
CopyToTriggerDesc(trig_insert_instead_row);
333-
CopyToTriggerDesc(trig_insert_before_statement);
334-
CopyToTriggerDesc(trig_insert_after_statement);
335-
336-
/* Copy update bool flags */
337-
CopyToTriggerDesc(trig_update_before_row);
338-
CopyToTriggerDesc(trig_update_after_row);
339-
CopyToTriggerDesc(trig_update_instead_row);
340-
CopyToTriggerDesc(trig_update_before_statement);
341-
CopyToTriggerDesc(trig_update_after_statement);
342-
343-
/* Copy delete bool flags */
344-
CopyToTriggerDesc(trig_delete_before_row);
345-
CopyToTriggerDesc(trig_delete_after_row);
346-
CopyToTriggerDesc(trig_delete_instead_row);
347-
CopyToTriggerDesc(trig_delete_before_statement);
348-
CopyToTriggerDesc(trig_delete_after_statement);
349-
350-
/* Copy truncate bool flags */
351-
CopyToTriggerDesc(trig_truncate_before_statement);
352-
CopyToTriggerDesc(trig_truncate_after_statement);
353-
354-
return new_desc;
355-
}
356-
357282
/*
358283
* Get BTORDER_PROC for two types described by Oids
359284
*/

src/utils.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,6 @@ List * build_index_tlist(PlannerInfo *root,
3636
IndexOptInfo *index,
3737
Relation heapRelation);
3838
void change_varnos(Node *node, Oid old_varno, Oid new_varno);
39-
TriggerDesc * append_trigger_descs(TriggerDesc *src,
40-
TriggerDesc *more,
41-
bool *grown_up);
4239

4340
/*
4441
* Rowmark processing.

0 commit comments

Comments
 (0)