OSDN Git Service

Fix some poor decisions about sizing of trigger-related memory contexts.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 2 Aug 2001 15:59:28 +0000 (15:59 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 2 Aug 2001 15:59:28 +0000 (15:59 +0000)
src/backend/commands/trigger.c

index c6e15fa..833d787 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.93 2001/06/22 19:16:21 wieck Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.94 2001/08/02 15:59:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1499,7 +1499,7 @@ deferredTriggerInvokeEvents(bool immediate_only)
        per_tuple_context =
                AllocSetContextCreate(CurrentMemoryContext,
                                                          "DeferredTriggerTupleContext",
-                                                         0,
+                                                         ALLOCSET_DEFAULT_MINSIZE,
                                                          ALLOCSET_DEFAULT_INITSIZE,
                                                          ALLOCSET_DEFAULT_MAXSIZE);
 
@@ -1594,9 +1594,13 @@ deferredTriggerInvokeEvents(bool immediate_only)
 void
 DeferredTriggerInit(void)
 {
+       /*
+        * Since this context will never be reset, give it a minsize of 0.
+        * This avoids using any memory if the session never stores anything.
+        */
        deftrig_gcxt = AllocSetContextCreate(TopMemoryContext,
                                                                                 "DeferredTriggerSession",
-                                                                                ALLOCSET_DEFAULT_MINSIZE,
+                                                                                0,
                                                                                 ALLOCSET_DEFAULT_INITSIZE,
                                                                                 ALLOCSET_DEFAULT_MAXSIZE);
 }
@@ -1623,11 +1627,12 @@ DeferredTriggerBeginXact(void)
 
        /*
         * Create the per transaction memory context and copy all states from
-        * the per session context to here.
+        * the per session context to here.  Set the minsize to 0 to avoid
+        * wasting memory if there is no deferred trigger data.
         */
        deftrig_cxt = AllocSetContextCreate(TopTransactionContext,
                                                                                "DeferredTriggerXact",
-                                                                               ALLOCSET_DEFAULT_MINSIZE,
+                                                                               0,
                                                                                ALLOCSET_DEFAULT_INITSIZE,
                                                                                ALLOCSET_DEFAULT_MAXSIZE);
        oldcxt = MemoryContextSwitchTo(deftrig_cxt);
@@ -1911,7 +1916,6 @@ DeferredTriggerSetState(ConstraintsSetStmt *stmt)
 
        if (!IsTransactionBlock())
        {
-
                /*
                 * Outside of a transaction block set the trigger states of
                 * individual triggers on session level.
@@ -1949,7 +1953,6 @@ DeferredTriggerSetState(ConstraintsSetStmt *stmt)
        }
        else
        {
-
                /*
                 * Inside of a transaction block set the trigger states of
                 * individual triggers on transaction level.