After trying to do some custom dumping/restoring, and having to resort to the awful trick of changing the trigger counts on the catalog (the stuff pg_dump adds), decided to add a couple little variables to control disabling constraints and triggers. Added them to guc.c so that they show up in the SET/SHOW list, and added checks accordingly (always at top level, to avoid unnecessary function calls and loops). Variables are 'disable_constraints' and 'disable_triggers' and they are "false" by default.

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

Reply via email to