@@ -39,7 +39,8 @@ typedef struct
3939 */
4040static BlockNumber
4141createPostingTree (RumState * rumstate ,OffsetNumber attnum ,Relation index ,
42- ItemPointerData * items ,Datum * addInfo ,bool * addInfoIsNull ,uint32 nitems )
42+ ItemPointerData * items ,
43+ Datum * addInfo ,bool * addInfoIsNull ,uint32 nitems )
4344{
4445BlockNumber blkno ;
4546Buffer buffer = RumNewBuffer (index );
@@ -64,7 +65,7 @@ createPostingTree(RumState *rumstate, OffsetNumber attnum, Relation index,
6465if (i > 0 )
6566prev_iptr = items [i - 1 ];
6667ptr = rumPlaceToDataPageLeaf (ptr ,attnum ,& items [i ],addInfo [i ],
67- addInfoIsNull [i ],& prev_iptr ,rumstate );
68+ addInfoIsNull [i ],& prev_iptr ,rumstate );
6869}
6970freespace = RumDataPageFreeSpacePre (page ,ptr );
7071Assert (freespace >=0 );
@@ -150,14 +151,18 @@ RumFormTuple(RumState *rumstate,
150151if (nipd > 0 )
151152{
152153newsize = rumCheckPlaceToDataPageLeaf (attnum ,& ipd [0 ],addInfo [0 ],
153- addInfoIsNull [0 ],& nullItemPointer ,rumstate ,newsize );
154+ addInfoIsNull [0 ],
155+ & nullItemPointer ,
156+ rumstate ,newsize );
154157for (i = 1 ;i < nipd ;i ++ )
155158{
156159newsize = rumCheckPlaceToDataPageLeaf (attnum ,& ipd [i ],addInfo [i ],
157- addInfoIsNull [i ],& ipd [i - 1 ],rumstate ,newsize );
160+ addInfoIsNull [i ],& ipd [i - 1 ],
161+ rumstate ,newsize );
158162}
159163}
160164
165+
161166if (category != RUM_CAT_NORM_KEY )
162167{
163168Assert (IndexTupleHasNulls (itup ));
@@ -198,12 +203,18 @@ RumFormTuple(RumState *rumstate,
198203{
199204char * ptr = RumGetPosting (itup );
200205ptr = rumPlaceToDataPageLeaf (ptr ,attnum ,& ipd [0 ],addInfo [0 ],
201- addInfoIsNull [0 ],& nullItemPointer ,rumstate );
206+ addInfoIsNull [0 ],& nullItemPointer ,
207+ rumstate );
202208for (i = 1 ;i < nipd ;i ++ )
203209{
204210ptr = rumPlaceToDataPageLeaf (ptr ,attnum ,& ipd [i ],addInfo [i ],
205- addInfoIsNull [i ],& ipd [i - 1 ],rumstate );
211+ addInfoIsNull [i ],& ipd [i - 1 ],
212+ rumstate );
206213}
214+
215+ Assert (MAXALIGN ((ptr - ((char * )itup ))+
216+ ((category == RUM_CAT_NORM_KEY ) ?0 :sizeof (RumNullCategory )))
217+ == newsize );
207218}
208219
209220/*
@@ -214,6 +225,7 @@ RumFormTuple(RumState *rumstate,
214225Assert (IndexTupleHasNulls (itup ));
215226RumSetNullCategory (itup ,rumstate ,category );
216227}
228+
217229return itup ;
218230}
219231
@@ -341,20 +353,24 @@ buildFreshLeafTuple(RumState *rumstate,
341353do
342354{
343355size = rumCheckPlaceToDataPageLeaf (attnum ,& items [itemsCount ],
344- addInfo [itemsCount ],addInfoIsNull [itemsCount ],& prevIptr ,
345- rumstate ,size );
356+ addInfo [itemsCount ],
357+ addInfoIsNull [itemsCount ],
358+ & prevIptr ,rumstate ,size );
346359prevIptr = items [itemsCount ];
347360itemsCount ++ ;
348361}
349362while (itemsCount < nitem && size < RumDataPageSize );
350- itemsCount -- ;
363+
364+ if (size >=RumDataPageSize )
365+ itemsCount -- ;
351366
352367
353368/*
354369 * Build posting-tree-only result tuple. We do this first so as to
355370 * fail quickly if the key is too big.
356371 */
357- res = RumFormTuple (rumstate ,attnum ,key ,category ,NULL ,NULL ,NULL ,0 , true);
372+ res = RumFormTuple (rumstate ,attnum ,key ,category ,
373+ NULL ,NULL ,NULL ,0 , true);
358374
359375/*
360376 * Initialize posting tree with as many TIDs as will fit on the first
@@ -377,7 +393,8 @@ buildFreshLeafTuple(RumState *rumstate,
377393{
378394RumPostingTreeScan * gdi ;
379395
380- gdi = rumPrepareScanPostingTree (rumstate -> index ,postingRoot , FALSE,attnum ,rumstate );
396+ gdi = rumPrepareScanPostingTree (rumstate -> index ,postingRoot , FALSE,
397+ attnum ,rumstate );
381398gdi -> btree .isBuild = (buildStats != NULL );
382399
383400rumInsertItemPointers (rumstate ,
@@ -457,25 +474,29 @@ rumEntryInsert(RumState *rumstate,
457474freeRumBtreeStack (stack );
458475
459476/* insert into posting tree */
460- gdi = rumPrepareScanPostingTree (rumstate -> index ,rootPostingTree , FALSE,attnum ,rumstate );
477+ gdi = rumPrepareScanPostingTree (rumstate -> index ,rootPostingTree ,
478+ FALSE,attnum ,rumstate );
461479gdi -> btree .isBuild = (buildStats != NULL );
462- rumInsertItemPointers (rumstate ,attnum ,gdi ,items ,addInfo ,addInfoIsNull ,nitem ,buildStats );
480+ rumInsertItemPointers (rumstate ,attnum ,gdi ,items ,addInfo ,
481+ addInfoIsNull ,nitem ,buildStats );
463482pfree (gdi );
464483
465484return ;
466485}
467486
468487/* modify an existing leaf entry */
469488itup = addItemPointersToLeafTuple (rumstate ,itup ,
470- items ,addInfo ,addInfoIsNull ,nitem ,buildStats );
489+ items ,addInfo ,addInfoIsNull ,nitem ,
490+ buildStats );
471491
472492btree .isDelete = TRUE;
473493}
474494else
475495{
476496/* no match, so construct a new leaf entry */
477497itup = buildFreshLeafTuple (rumstate ,attnum ,key ,category ,
478- items ,addInfo ,addInfoIsNull ,nitem ,buildStats );
498+ items ,addInfo ,addInfoIsNull ,nitem ,
499+ buildStats );
479500}
480501
481502/* Insert the new or modified leaf tuple */