@@ -431,7 +431,8 @@ findInLeafPage(RumBtree btree, Page page, OffsetNumber *offset,
431
431
*/
432
432
for (i = 0 ; i < RumDataLeafIndexCount ; i ++ )
433
433
{
434
- RumDataLeafItemIndex * index = & RumPageGetIndexes (page )[i ];
434
+ RumDataLeafItemIndex * index = RumPageGetIndexes (page ) + i ;
435
+
435
436
if (index -> offsetNumer == InvalidOffsetNumber )
436
437
break ;
437
438
@@ -1196,11 +1197,62 @@ updateItemIndexes(Page page, OffsetNumber attnum, RumState *rumstate)
1196
1197
}
1197
1198
/* Update freespace of page */
1198
1199
RumPageGetOpaque (page )-> freespace = RumDataPageFreeSpacePre (page , ptr );
1199
- /* Adjust pd_lower */
1200
+ /* Adjust pd_lower and pd_upper */
1200
1201
((PageHeader ) page )-> pd_lower = ptr - page ;
1202
+ ((PageHeader ) page )-> pd_upper = ((char * )RumPageGetIndexes (page )) - page ;
1203
+
1201
1204
return iptr ;
1202
1205
}
1203
1206
1207
+ void
1208
+ checkLeafDataPage (RumState * rumstate , AttrNumber attnum , Page page )
1209
+ {
1210
+ Offset maxoff , i ;
1211
+ char * ptr ;
1212
+ ItemPointerData iptr ;
1213
+ RumDataLeafItemIndex * index , * previndex = NULL ;
1214
+
1215
+ if (!(RumPageGetOpaque (page )-> flags & RUM_DATA ))
1216
+ return ;
1217
+
1218
+ maxoff = RumPageGetOpaque (page )-> maxoff ;
1219
+ ptr = RumDataPageGetData (page );
1220
+ iptr .ip_blkid .bi_lo = 0 ;
1221
+ iptr .ip_blkid .bi_hi = 0 ;
1222
+ iptr .ip_posid = 0 ;
1223
+
1224
+ Assert (RumPageGetOpaque (page )-> flags & RUM_LEAF );
1225
+
1226
+ for (i = FirstOffsetNumber ; i <= maxoff ; i ++ )
1227
+ ptr = rumDataPageLeafRead (ptr , attnum , & iptr , NULL , NULL , rumstate );
1228
+
1229
+ Assert ((char * )RumPageGetIndexes (page ) == page + ((PageHeader )page )-> pd_upper );
1230
+
1231
+ for (i = 0 ; i < RumDataLeafIndexCount ; i ++ )
1232
+ {
1233
+ index = RumPageGetIndexes (page ) + i ;
1234
+
1235
+ if (index -> offsetNumer == InvalidOffsetNumber )
1236
+ break ;
1237
+
1238
+ Assert (index -> pageOffset < ((PageHeader )page )-> pd_lower );
1239
+
1240
+ if (previndex )
1241
+ {
1242
+ Assert (previndex -> offsetNumer < index -> offsetNumer );
1243
+ Assert (previndex -> pageOffset < index -> pageOffset );
1244
+ Assert (rumCompareItemPointers (& index -> iptr , & previndex -> iptr ) > 0 );
1245
+ }
1246
+
1247
+ if (i != RumDataLeafIndexCount - 1 )
1248
+ {
1249
+ iptr = index -> iptr ;
1250
+ rumDataPageLeafRead (RumDataPageGetData (page ) + index -> pageOffset ,
1251
+ attnum , & iptr , NULL , NULL , rumstate );
1252
+ }
1253
+ }
1254
+ }
1255
+
1204
1256
/*
1205
1257
* Fills new root by right bound values from child.
1206
1258
* Also called from rumxlog, should not use btree
0 commit comments