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)
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