8
8
* Portions Copyright (c) 1994, Regents of the University of California
9
9
*
10
10
* 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 $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
@@ -317,17 +317,10 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate) {
317
317
newitup = gistSplit (state -> r ,state -> stack -> buffer ,itvec ,& tlen ,& dist ,giststate );
318
318
319
319
if ( !state -> r -> rd_istemp ) {
320
- OffsetNumber noffs = 0 ,offs [MAXALIGN (sizeof (OffsetNumber ) ) /sizeof (OffsetNumber ) ];
321
320
XLogRecPtr recptr ;
322
321
XLogRecData * rdata ;
323
322
324
- if (state -> stack -> todelete ) {
325
- offs [0 ]= state -> stack -> childoffnum ;
326
- noffs = 1 ;
327
- }
328
-
329
323
rdata = formSplitRdata (state -> r -> rd_node ,state -> stack -> blkno ,
330
- offs ,noffs ,state -> itup ,state -> ituplen ,
331
324
& (state -> key ),state -> path ,state -> pathlen ,dist );
332
325
333
326
START_CRIT_SECTION ();
@@ -716,31 +709,27 @@ gistSplit(Relation r,
716
709
/* write on disk (may need another split) */
717
710
if (gistnospace (right ,rvectup ,v .spl_nright ))
718
711
{
719
- int i ;
720
- SplitedPageLayout * d ,* origd = * dist ;
721
-
722
712
nlen = v .spl_nright ;
723
713
newtup = 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
- }
732
714
ReleaseBuffer (rightbuf );
733
715
}
734
716
else
735
717
{
736
718
OffsetNumber l ;
719
+ char * ptr ;
737
720
738
721
l = gistfillbuffer (r ,right ,rvectup ,v .spl_nright ,FirstOffsetNumber );
739
722
/* XLOG stuff */
740
723
ROTATEDIST (* dist );
741
724
(* dist )-> block .blkno = BufferGetBlockNumber (rightbuf );
742
725
(* 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 ) );
744
733
(* dist )-> buffer = rightbuf ;
745
734
746
735
nlen = 1 ;
@@ -754,39 +743,34 @@ gistSplit(Relation r,
754
743
{
755
744
int llen = v .spl_nleft ;
756
745
IndexTuple * lntup ;
757
- int i ;
758
- SplitedPageLayout * d ,* origd = * dist ;
759
746
760
747
lntup = 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
-
771
748
ReleaseBuffer (leftbuf );
772
749
773
750
newtup = gistjoinvector (newtup ,& nlen ,lntup ,llen );
774
751
}
775
752
else
776
753
{
777
754
OffsetNumber l ;
755
+ char * ptr ;
778
756
779
757
l = gistfillbuffer (r ,left ,lvectup ,v .spl_nleft ,FirstOffsetNumber );
780
- if (BufferGetBlockNumber (buffer )!= GIST_ROOT_BLKNO )
781
- PageRestoreTempPage (left ,p );
782
-
783
758
/* XLOG stuff */
784
759
ROTATEDIST (* dist );
785
760
(* dist )-> block .blkno = BufferGetBlockNumber (leftbuf );
786
761
(* 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 ) );
788
769
(* dist )-> buffer = leftbuf ;
789
770
771
+ if (BufferGetBlockNumber (buffer )!= GIST_ROOT_BLKNO )
772
+ PageRestoreTempPage (left ,p );
773
+
790
774
nlen += 1 ;
791
775
newtup = (IndexTuple * )repalloc (newtup ,sizeof (IndexTuple )* nlen );
792
776
newtup [nlen - 1 ]= (v .spl_leftvalid ) ?gistFormTuple (giststate ,r ,v .spl_lattr ,v .spl_lattrsize ,v .spl_lisnull )