@@ -249,58 +249,66 @@ smergegettuple(IndexScanDesc scan, ScanDirection dir)
249
249
// printf("CurrentLevel: %d\n", so->currlevel);
250
250
if (so -> bt_rel != NULL ) {
251
251
index_close (so -> bt_rel , AccessShareLock );
252
- pfree (so -> bt_rel );
252
+ // pfree(so->bt_rel);
253
253
so -> bt_rel = NULL ;
254
254
}
255
255
256
- while ((so -> currlevel == -1 || so -> currpos >= metadata -> levels [so -> currlevel ]) && so -> currlevel < metadata -> N ) {
256
+ while (so -> currlevel < metadata -> N && (so -> currlevel == -1 || so -> currpos >= metadata -> levels [so -> currlevel ])) {
257
257
so -> currpos = 0 ;
258
258
so -> currlevel ++ ;
259
259
}
260
260
261
- res = (so -> currlevel == metadata -> N );
262
-
263
- if (!res ) {
261
+ if ((so -> currlevel < metadata -> N )) {
264
262
bt_oid = metadata -> tree [so -> currlevel ][so -> currpos ];
265
263
so -> currpos ++ ;
264
+ }
265
+ else if (so -> currlevel == metadata -> N ){
266
+ if (metadata -> root != InvalidOid ) {
267
+ bt_oid = metadata -> root ;
268
+ so -> currlevel ++ ;
269
+ }
270
+ else {
271
+ res = false;
272
+ break ;
273
+ }
274
+ }
275
+ else {
276
+ res = false;
277
+ break ;
278
+ }
266
279
267
- // printf("Opening Btree: %d\n", bt_oid);
268
- so -> bt_rel = index_open (bt_oid , AccessShareLock );
269
- so -> bt_isd = btbeginscan (so -> bt_rel , scan -> numberOfKeys , scan -> numberOfOrderBys );
280
+ // printf("Opening Btree: %d\n", bt_oid);
281
+ so -> bt_rel = index_open (bt_oid , AccessShareLock );
282
+ so -> bt_isd = btbeginscan (so -> bt_rel , scan -> numberOfKeys , scan -> numberOfOrderBys );
270
283
271
- bt_scan = so -> bt_isd ;
284
+ bt_scan = so -> bt_isd ;
272
285
273
- bt_scan -> heapRelation = scan -> heapRelation ;
274
- bt_scan -> xs_snapshot = scan -> xs_snapshot ;
286
+ bt_scan -> heapRelation = scan -> heapRelation ;
287
+ bt_scan -> xs_snapshot = scan -> xs_snapshot ;
275
288
276
- /* Release any held pin on a heap page */
277
- if (BufferIsValid (bt_scan -> xs_cbuf ))
278
- {
279
- ReleaseBuffer (bt_scan -> xs_cbuf );
280
- bt_scan -> xs_cbuf = InvalidBuffer ;
281
- }
289
+ /* Release any held pin on a heap page */
290
+ if (BufferIsValid (bt_scan -> xs_cbuf ))
291
+ {
292
+ ReleaseBuffer (bt_scan -> xs_cbuf );
293
+ bt_scan -> xs_cbuf = InvalidBuffer ;
294
+ }
282
295
283
- bt_scan -> xs_continue_hot = false;
296
+ bt_scan -> xs_continue_hot = false;
284
297
285
- bt_scan -> kill_prior_tuple = false; /* for safety */
298
+ bt_scan -> kill_prior_tuple = false; /* for safety */
286
299
287
300
288
- btrescan (so -> bt_isd , scan -> keyData , scan -> numberOfKeys , scan -> orderByData , scan -> numberOfOrderBys );
301
+ btrescan (so -> bt_isd , scan -> keyData , scan -> numberOfKeys , scan -> orderByData , scan -> numberOfOrderBys );
289
302
290
- bt_scan -> xs_cbuf = scan -> xs_cbuf ;
303
+ bt_scan -> xs_cbuf = scan -> xs_cbuf ;
291
304
292
- res = btgettuple (so -> bt_isd , dir );
293
- // printf("btgettuple returns %d\n", res);
305
+ res = btgettuple (so -> bt_isd , dir );
306
+ // printf("btgettuple returns %d\n", res);
294
307
295
- scan -> xs_ctup = bt_scan -> xs_ctup ;
308
+ scan -> xs_ctup = bt_scan -> xs_ctup ;
296
309
297
- scan -> xs_itup = bt_scan -> xs_itup ;
298
- scan -> xs_itupdesc = bt_scan -> xs_itupdesc ;
299
- }
300
- else {
301
- res = false;
302
- break ;
303
- }
310
+ scan -> xs_itup = bt_scan -> xs_itup ;
311
+ scan -> xs_itupdesc = bt_scan -> xs_itupdesc ;
304
312
// printf("Debug: btgettuple returns %d\n", res);
305
313
}
306
314
0 commit comments