I am unsure wether it is right to send such an uncalled-for patch, but seeing as this is such a simple thing that can be quite useful (large volumes of data), I thought it could be useful.
(apply with patch -p0 from the root distro directory)
Cheers - Jorge Pereira
*** src/backend/utils/misc/guc.c.orig 2004-05-19 18:52:08.718580424 +0100 --- src/backend/utils/misc/guc.c 2004-05-19 18:50:46.162130912 +0100 *************** *** 131,136 **** --- 131,140 ---- int log_min_duration_statement = -1; + /* Control disabling of triggers (BS,AS,BR and AR) and constraints (useful on mass insert from dumps)*/ + bool disable_constraints; + bool disable_triggers; + /* * These variables are all dummies that don't do anything, except in some *** src/backend/executor/execMain.c.orig 2004-05-19 18:53:14.251617888 +0100 --- src/backend/executor/execMain.c 2004-05-19 18:53:19.501819736 +0100 *************** *** 90,95 **** --- 90,99 ---- evalPlanQual *priorepq); static void EvalPlanQualStop(evalPlanQual *epq); + + extern bool disable_constraints; + extern bool disable_triggers; + /* end of local decls */ *************** *** 1063,1068 **** --- 1067,1073 ---- /* * Process BEFORE EACH STATEMENT triggers */ + if ( !disable_triggers ) switch (operation) { case CMD_UPDATE: *************** *** 1281,1286 **** --- 1286,1292 ---- /* * Process AFTER EACH STATEMENT triggers */ + if ( !disable_triggers ) switch (operation) { case CMD_UPDATE: *************** *** 1379,1385 **** resultRelationDesc = resultRelInfo->ri_RelationDesc; /* BEFORE ROW INSERT Triggers */ ! if (resultRelInfo->ri_TrigDesc && resultRelInfo->ri_TrigDesc->n_before_row[TRIGGER_EVENT_INSERT] > 0) { HeapTuple newtuple; --- 1385,1391 ---- resultRelationDesc = resultRelInfo->ri_RelationDesc; /* BEFORE ROW INSERT Triggers */ ! if ( !disable_triggers && resultRelInfo->ri_TrigDesc && resultRelInfo->ri_TrigDesc->n_before_row[TRIGGER_EVENT_INSERT] > 0) { HeapTuple newtuple; *************** *** 1405,1411 **** /* * Check the constraints of the tuple */ ! if (resultRelationDesc->rd_att->constr) ExecConstraints(resultRelInfo, slot, estate); /* --- 1411,1417 ---- /* * Check the constraints of the tuple */ ! if ( !disable_constraints && resultRelationDesc->rd_att->constr ) ExecConstraints(resultRelInfo, slot, estate); /* *************** *** 1431,1437 **** ExecInsertIndexTuples(slot, &(tuple->t_self), estate, false); /* AFTER ROW INSERT Triggers */ ! ExecARInsertTriggers(estate, resultRelInfo, tuple); } /* ---------------------------------------------------------------- --- 1437,1444 ---- ExecInsertIndexTuples(slot, &(tuple->t_self), estate, false); /* AFTER ROW INSERT Triggers */ ! if ( !disable_triggers ) ! ExecARInsertTriggers(estate, resultRelInfo, tuple); } /* ---------------------------------------------------------------- *************** *** 1458,1464 **** resultRelationDesc = resultRelInfo->ri_RelationDesc; /* BEFORE ROW DELETE Triggers */ ! if (resultRelInfo->ri_TrigDesc && resultRelInfo->ri_TrigDesc->n_before_row[TRIGGER_EVENT_DELETE] > 0) { bool dodelete; --- 1465,1471 ---- resultRelationDesc = resultRelInfo->ri_RelationDesc; /* BEFORE ROW DELETE Triggers */ ! if ( !disable_triggers && resultRelInfo->ri_TrigDesc && resultRelInfo->ri_TrigDesc->n_before_row[TRIGGER_EVENT_DELETE] > 0) { bool dodelete; *************** *** 1525,1531 **** */ /* AFTER ROW DELETE Triggers */ ! ExecARDeleteTriggers(estate, resultRelInfo, tupleid); } /* ---------------------------------------------------------------- --- 1532,1539 ---- */ /* AFTER ROW DELETE Triggers */ ! if ( !disable_triggers ) ! ExecARDeleteTriggers(estate, resultRelInfo, tupleid); } /* ---------------------------------------------------------------- *************** *** 1569,1575 **** resultRelationDesc = resultRelInfo->ri_RelationDesc; /* BEFORE ROW UPDATE Triggers */ ! if (resultRelInfo->ri_TrigDesc && resultRelInfo->ri_TrigDesc->n_before_row[TRIGGER_EVENT_UPDATE] > 0) { HeapTuple newtuple; --- 1577,1583 ---- resultRelationDesc = resultRelInfo->ri_RelationDesc; /* BEFORE ROW UPDATE Triggers */ ! if ( !disable_triggers && resultRelInfo->ri_TrigDesc && resultRelInfo->ri_TrigDesc->n_before_row[TRIGGER_EVENT_UPDATE] > 0) { HeapTuple newtuple; *************** *** 1604,1610 **** * there's no need to do them again.) */ lreplace:; ! if (resultRelationDesc->rd_att->constr) ExecConstraints(resultRelInfo, slot, estate); /* --- 1612,1618 ---- * there's no need to do them again.) */ lreplace:; ! if ( !disable_constraints && resultRelationDesc->rd_att->constr ) ExecConstraints(resultRelInfo, slot, estate); /* *************** *** 1678,1684 **** ExecInsertIndexTuples(slot, &(tuple->t_self), estate, false); /* AFTER ROW UPDATE Triggers */ ! ExecARUpdateTriggers(estate, resultRelInfo, tupleid, tuple); } static const char * --- 1686,1693 ---- ExecInsertIndexTuples(slot, &(tuple->t_self), estate, false); /* AFTER ROW UPDATE Triggers */ ! if ( !disable_triggers ) ! ExecARUpdateTriggers(estate, resultRelInfo, tupleid, tuple); } static const char *
---------------------------(end of broadcast)--------------------------- TIP 5: Have you checked our extensive FAQ?
http://www.postgresql.org/docs/faqs/FAQ.html