88 * Portions Copyright (c) 1994, Regents of the University of California
99 *
1010 * IDENTIFICATION
11- * $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.4 2005/06/28 15:51:00 teodor Exp $
11+ * $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.5 2005/06/29 14:06:14 teodor Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
@@ -52,7 +52,7 @@ gistVacuumUpdate( GistVacuum *gv, BlockNumber blkno, bool needunion ) {
5252int lenaddon = 4 ,curlenaddon = 0 ,ntodelete = 0 ;
5353IndexTuple idxtuple ,* addon = NULL ;
5454bool needwrite = false;
55- OffsetNumber * todelete = NULL ;
55+ OffsetNumber todelete [ BLCKSZ / SizeOfIptrData ] ;
5656ItemPointerData * completed = NULL ;
5757int ncompleted = 0 ,lencompleted = 16 ;
5858
@@ -67,7 +67,6 @@ gistVacuumUpdate( GistVacuum *gv, BlockNumber blkno, bool needunion ) {
6767GistClearTuplesDeleted (page );
6868}
6969}else {
70- todelete = (OffsetNumber * )palloc (MAXALIGN (sizeof (OffsetNumber )* (maxoff + 1 )) );
7170completed = (ItemPointerData * )palloc (sizeof (ItemPointerData )* lencompleted );
7271addon = (IndexTuple * )palloc (sizeof (IndexTuple )* lenaddon );
7372
@@ -143,16 +142,14 @@ gistVacuumUpdate( GistVacuum *gv, BlockNumber blkno, bool needunion ) {
143142XLogRecPtr recptr ;
144143XLogRecData * rdata ;
145144ItemPointerData key ;/* set key for incomplete insert */
145+ char * xlinfo ;
146146
147147ItemPointerSet (& key ,blkno ,TUPLE_IS_VALID );
148148
149- oldCtx = MemoryContextSwitchTo (gv -> opCtx );
150-
151149rdata = formSplitRdata (gv -> index -> rd_node ,blkno ,
152150& key ,dist );
151+ xlinfo = rdata -> data ;
153152
154- MemoryContextSwitchTo (oldCtx );
155-
156153START_CRIT_SECTION ();
157154
158155recptr = XLogInsert (RM_GIST_ID ,XLOG_GIST_PAGE_SPLIT ,rdata );
@@ -164,6 +161,8 @@ gistVacuumUpdate( GistVacuum *gv, BlockNumber blkno, bool needunion ) {
164161}
165162
166163END_CRIT_SECTION ();
164+ pfree (xlinfo );
165+ pfree (rdata );
167166}else {
168167ptr = dist ;
169168while (ptr ) {
@@ -267,7 +266,6 @@ gistVacuumUpdate( GistVacuum *gv, BlockNumber blkno, bool needunion ) {
267266for (i = 0 ;i < curlenaddon ;i ++ )
268267pfree (addon [i ] );
269268if (addon )pfree (addon );
270- if (todelete )pfree (todelete );
271269if (completed )pfree (completed );
272270return res ;
273271}
@@ -442,7 +440,7 @@ gistbulkdelete(PG_FUNCTION_ARGS) {
442440page = (Page )BufferGetPage (buffer );
443441
444442if (GistPageIsLeaf (page ) ) {
445- OffsetNumber * todelete = NULL ;
443+ OffsetNumber todelete [ BLCKSZ / SizeOfIptrData ] ;
446444int ntodelete = 0 ;
447445
448446LockBuffer (buffer ,GIST_UNLOCK );
@@ -462,7 +460,6 @@ gistbulkdelete(PG_FUNCTION_ARGS) {
462460pushStackIfSplited (page ,stack );
463461
464462maxoff = PageGetMaxOffsetNumber (page );
465- todelete = (OffsetNumber * )palloc (MAXALIGN (sizeof (OffsetNumber )* (maxoff + 1 )) );
466463
467464for (i = FirstOffsetNumber ;i <=maxoff ;i = OffsetNumberNext (i )) {
468465iid = PageGetItemId (page ,i );
@@ -502,8 +499,6 @@ gistbulkdelete(PG_FUNCTION_ARGS) {
502499PageSetLSN (page ,XLogRecPtrForTemp );
503500WriteNoReleaseBuffer (buffer );
504501}
505-
506- pfree (todelete );
507502}else {
508503/* check for split proceeded after look at parent */
509504pushStackIfSplited (page ,stack );