88 * Portions Copyright (c) 1994, Regents of the University of California
99 *
1010 * IDENTIFICATION
11- * $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.120 2005/06/2010:29:36 teodor Exp $
11+ * $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.121 2005/06/2015:22:37 teodor Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
@@ -317,17 +317,10 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate) {
317317newitup = gistSplit (state -> r ,state -> stack -> buffer ,itvec ,& tlen ,& dist ,giststate );
318318
319319if ( !state -> r -> rd_istemp ) {
320- OffsetNumber noffs = 0 ,offs [MAXALIGN (sizeof (OffsetNumber ) ) /sizeof (OffsetNumber ) ];
321320XLogRecPtr recptr ;
322321XLogRecData * rdata ;
323322
324- if (state -> stack -> todelete ) {
325- offs [0 ]= state -> stack -> childoffnum ;
326- noffs = 1 ;
327- }
328-
329323rdata = formSplitRdata (state -> r -> rd_node ,state -> stack -> blkno ,
330- offs ,noffs ,state -> itup ,state -> ituplen ,
331324& (state -> key ),state -> path ,state -> pathlen ,dist );
332325
333326START_CRIT_SECTION ();
@@ -716,31 +709,27 @@ gistSplit(Relation r,
716709/* write on disk (may need another split) */
717710if (gistnospace (right ,rvectup ,v .spl_nright ))
718711{
719- int i ;
720- SplitedPageLayout * d ,* origd = * dist ;
721-
722712nlen = v .spl_nright ;
723713newtup = gistSplit (r ,rightbuf ,rvectup ,& nlen ,dist ,giststate );
724- /* XLOG stuff */
725- d = * dist ;
726- /* translate offsetnumbers to our */
727- while (d && d != origd ) {
728- for (i = 0 ;i < d -> block .num ;i ++ )
729- d -> list [i ]= v .spl_right [d -> list [i ]- 1 ];
730- d = d -> next ;
731- }
732714ReleaseBuffer (rightbuf );
733715}
734716else
735717{
736718OffsetNumber l ;
719+ char * ptr ;
737720
738721l = gistfillbuffer (r ,right ,rvectup ,v .spl_nright ,FirstOffsetNumber );
739722/* XLOG stuff */
740723ROTATEDIST (* dist );
741724(* dist )-> block .blkno = BufferGetBlockNumber (rightbuf );
742725(* dist )-> block .num = v .spl_nright ;
743- (* dist )-> list = v .spl_right ;
726+ (* dist )-> list = (IndexTupleData * )palloc (BLCKSZ );
727+ ptr = (char * ) ( (* dist )-> list );
728+ for (i = 0 ;i < v .spl_nright ;i ++ ) {
729+ memcpy (ptr ,rvectup [i ],IndexTupleSize (rvectup [i ] ) );
730+ ptr += IndexTupleSize (rvectup [i ] );
731+ }
732+ (* dist )-> lenlist = ptr - ( (char * ) ( (* dist )-> list ) );
744733(* dist )-> buffer = rightbuf ;
745734
746735nlen = 1 ;
@@ -754,39 +743,34 @@ gistSplit(Relation r,
754743{
755744int llen = v .spl_nleft ;
756745IndexTuple * lntup ;
757- int i ;
758- SplitedPageLayout * d ,* origd = * dist ;
759746
760747lntup = gistSplit (r ,leftbuf ,lvectup ,& llen ,dist ,giststate );
761-
762- /* XLOG stuff */
763- d = * dist ;
764- /* translate offsetnumbers to our */
765- while (d && d != origd ) {
766- for (i = 0 ;i < d -> block .num ;i ++ )
767- d -> list [i ]= v .spl_left [d -> list [i ]- 1 ];
768- d = d -> next ;
769- }
770-
771748ReleaseBuffer (leftbuf );
772749
773750newtup = gistjoinvector (newtup ,& nlen ,lntup ,llen );
774751}
775752else
776753{
777754OffsetNumber l ;
755+ char * ptr ;
778756
779757l = gistfillbuffer (r ,left ,lvectup ,v .spl_nleft ,FirstOffsetNumber );
780- if (BufferGetBlockNumber (buffer )!= GIST_ROOT_BLKNO )
781- PageRestoreTempPage (left ,p );
782-
783758/* XLOG stuff */
784759ROTATEDIST (* dist );
785760(* dist )-> block .blkno = BufferGetBlockNumber (leftbuf );
786761(* dist )-> block .num = v .spl_nleft ;
787- (* dist )-> list = v .spl_left ;
762+ (* dist )-> list = (IndexTupleData * )palloc (BLCKSZ );
763+ ptr = (char * ) ( (* dist )-> list );
764+ for (i = 0 ;i < v .spl_nleft ;i ++ ) {
765+ memcpy (ptr ,lvectup [i ],IndexTupleSize (lvectup [i ] ) );
766+ ptr += IndexTupleSize (lvectup [i ] );
767+ }
768+ (* dist )-> lenlist = ptr - ( (char * ) ( (* dist )-> list ) );
788769(* dist )-> buffer = leftbuf ;
789770
771+ if (BufferGetBlockNumber (buffer )!= GIST_ROOT_BLKNO )
772+ PageRestoreTempPage (left ,p );
773+
790774nlen += 1 ;
791775newtup = (IndexTuple * )repalloc (newtup ,sizeof (IndexTuple )* nlen );
792776newtup [nlen - 1 ]= (v .spl_leftvalid ) ?gistFormTuple (giststate ,r ,v .spl_lattr ,v .spl_lattrsize ,v .spl_lisnull )