diff options
Diffstat (limited to 'src/backend/access/nbtree/nbtpage.c')
| -rw-r--r-- | src/backend/access/nbtree/nbtpage.c | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c index 0cace9d360..daff4e6bdd 100644 --- a/src/backend/access/nbtree/nbtpage.c +++ b/src/backend/access/nbtree/nbtpage.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtpage.c,v 1.19 1999/03/28 20:31:57 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtpage.c,v 1.20 1999/04/22 08:19:59 vadim Exp $ * * NOTES * Postgres btree pages look like ordinary relation pages. The opaque @@ -494,24 +494,37 @@ _bt_getstackbuf(Relation rel, BTStack stack, int access) opaque = (BTPageOpaque) PageGetSpecialPointer(page); maxoff = PageGetMaxOffsetNumber(page); - if (maxoff >= stack->bts_offset) + if (stack->bts_offset == InvalidOffsetNumber || + maxoff >= stack->bts_offset) { - itemid = PageGetItemId(page, stack->bts_offset); - item = (BTItem) PageGetItem(page, itemid); - - /* if the item is where we left it, we're done */ - if (BTItemSame(item, stack->bts_btitem)) + /* + * _bt_insertonpg set bts_offset to InvalidOffsetNumber + * in the case of concurrent ROOT page split + */ + if (stack->bts_offset == InvalidOffsetNumber) { - pfree(stack->bts_btitem); - item_nbytes = ItemIdGetLength(itemid); - item_save = (BTItem) palloc(item_nbytes); - memmove((char *) item_save, (char *) item, item_nbytes); - stack->bts_btitem = item_save; - return buf; + i = P_RIGHTMOST(opaque) ? P_HIKEY : P_FIRSTKEY; + } + else + { + itemid = PageGetItemId(page, stack->bts_offset); + item = (BTItem) PageGetItem(page, itemid); + + /* if the item is where we left it, we're done */ + if (BTItemSame(item, stack->bts_btitem)) + { + pfree(stack->bts_btitem); + item_nbytes = ItemIdGetLength(itemid); + item_save = (BTItem) palloc(item_nbytes); + memmove((char *) item_save, (char *) item, item_nbytes); + stack->bts_btitem = item_save; + return buf; + } + i = OffsetNumberNext(stack->bts_offset); } /* if the item has just moved right on this page, we're done */ - for (i = OffsetNumberNext(stack->bts_offset); + for ( ; i <= maxoff; i = OffsetNumberNext(i)) { |
