@@ -905,9 +905,18 @@ dataPlaceToPage(RumBtree btree, Page page, OffsetNumber off)
905905if (stopAppend )
906906/* there is no free space on page */
907907break ;
908- else
908+ else if ( RumPageRightMost ( page ))
909909/* force insertion of new item */
910910cmp = 1 ;
911+ else if ((cmp = compareRumKey (btree -> rumstate ,btree -> entryAttnum ,
912+ RumDataPageGetRightBound (page ),
913+ btree -> items + btree -> curitem )) >=0 )
914+ {
915+ /* force insertion of new item */
916+ }
917+ else
918+ /* new items should be inserted on next page */
919+ break ;
911920}
912921else if (off <=maxoff )
913922{
@@ -930,10 +939,7 @@ dataPlaceToPage(RumBtree btree, Page page, OffsetNumber off)
930939copyItemEmpty = true;
931940
932941if (cmp == 0 )
933- {
934942btree -> curitem ++ ;
935- insertCount ++ ;
936- }
937943}
938944else /* if (cmp > 0) */
939945{
@@ -957,8 +963,8 @@ dataPlaceToPage(RumBtree btree, Page page, OffsetNumber off)
957963
958964Assert (ptr - oldptr == newItemSize );
959965iptr = btree -> items [btree -> curitem ].iptr ;
960- btree -> curitem ++ ;
961966freespace -= newItemSize ;
967+ btree -> curitem ++ ;
962968insertCount ++ ;
963969}
964970else
@@ -970,7 +976,6 @@ dataPlaceToPage(RumBtree btree, Page page, OffsetNumber off)
970976Assert (RumDataPageFreeSpacePre (page ,ptr ) >=0 );
971977}
972978
973- Assert (insertCount > 0 );
974979RumPageGetOpaque (page )-> maxoff += insertCount ;
975980
976981/* Update indexes in the end of page */
@@ -1209,7 +1214,6 @@ dataSplitPageInternal(RumBtree btree, Buffer lbuf, Buffer rbuf,
12091214OffsetNumber maxoff = RumPageGetOpaque (newlPage )-> maxoff ;
12101215Size pageSize = PageGetPageSize (newlPage );
12111216Size freeSpace ;
1212- uint32 nCopied = 1 ;
12131217
12141218static char vector [2 * BLCKSZ ];
12151219
@@ -1220,36 +1224,13 @@ dataSplitPageInternal(RumBtree btree, Buffer lbuf, Buffer rbuf,
12201224memcpy (vector ,RumDataPageGetItem (newlPage ,FirstOffsetNumber ),
12211225maxoff * sizeofitem );
12221226
1223- if (RumPageIsLeaf (newlPage )&& RumPageRightMost (newlPage )&&
1224- off > RumPageGetOpaque (newlPage )-> maxoff )
1225- {
1226- nCopied = 0 ;
1227- while (btree -> curitem < btree -> nitem &&
1228- maxoff * sizeof (ItemPointerData )< 2 * (freeSpace - sizeof (ItemPointerData )))
1229- {
1230- memcpy (vector + maxoff * sizeof (ItemPointerData ),
1231- & btree -> items [btree -> curitem ].iptr ,
1232- sizeof (ItemPointerData ));
1233- maxoff ++ ;
1234- nCopied ++ ;
1235- btree -> curitem ++ ;
1236- }
1237- }
1238- else
1239- {
1240- ptr = vector + (off - 1 )* sizeofitem ;
1241- if (maxoff + 1 - off != 0 )
1242- memmove (ptr + sizeofitem ,ptr , (maxoff - off + 1 )* sizeofitem );
1243- if (RumPageIsLeaf (newlPage ))
1244- {
1245- memcpy (ptr ,& btree -> items [btree -> curitem ].iptr ,sizeofitem );
1246- btree -> curitem ++ ;
1247- }
1248- else
1249- memcpy (ptr ,& (btree -> pitem ),sizeofitem );
1227+ Assert (!RumPageIsLeaf (newlPage ));
1228+ ptr = vector + (off - 1 )* sizeofitem ;
1229+ if (maxoff + 1 - off != 0 )
1230+ memmove (ptr + sizeofitem ,ptr , (maxoff - off + 1 )* sizeofitem );
1231+ memcpy (ptr ,& (btree -> pitem ),sizeofitem );
12501232
1251- maxoff ++ ;
1252- }
1233+ maxoff ++ ;
12531234
12541235/*
12551236 * we suppose that during index creation table scaned from begin to end,