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 c6e15fa7af8f19550e3d98bb450a2d62470fa1bb..833d7876974c3fc6200080a64e894f7211326bf3 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.