diff options
Diffstat (limited to 'src/backend/access/heap/hio.c')
-rw-r--r-- | src/backend/access/heap/hio.c | 229 |
1 files changed, 115 insertions, 114 deletions
diff --git a/src/backend/access/heap/hio.c b/src/backend/access/heap/hio.c index f172a404708..0854b69bf0b 100644 --- a/src/backend/access/heap/hio.c +++ b/src/backend/access/heap/hio.c @@ -1,13 +1,13 @@ /*------------------------------------------------------------------------- * * hio.c-- - * POSTGRES heap access method input/output code. + * POSTGRES heap access method input/output code. * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * $Id: hio.c,v 1.9 1996/11/05 09:53:02 scrappy Exp $ + * $Id: hio.c,v 1.10 1997/09/07 04:38:11 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -21,64 +21,65 @@ /* * amputunique - place tuple at tid - * Currently on errors, calls elog. Perhaps should return -1? - * Possible errors include the addition of a tuple to the page - * between the time the linep is chosen and the page is L_UP'd. + * Currently on errors, calls elog. Perhaps should return -1? + * Possible errors include the addition of a tuple to the page + * between the time the linep is chosen and the page is L_UP'd. * - * This should be coordinated with the B-tree code. - * Probably needs to have an amdelunique to allow for - * internal index records to be deleted and reordered as needed. - * For the heap AM, this should never be needed. + * This should be coordinated with the B-tree code. + * Probably needs to have an amdelunique to allow for + * internal index records to be deleted and reordered as needed. + * For the heap AM, this should never be needed. */ void RelationPutHeapTuple(Relation relation, - BlockNumber blockIndex, - HeapTuple tuple) + BlockNumber blockIndex, + HeapTuple tuple) { - Buffer buffer; - Page pageHeader; - BlockNumber numberOfBlocks; - OffsetNumber offnum; - unsigned int len; - ItemId itemId; - Item item; - - /* ---------------- - * increment access statistics - * ---------------- - */ - IncrHeapAccessStat(local_RelationPutHeapTuple); - IncrHeapAccessStat(global_RelationPutHeapTuple); - - Assert(RelationIsValid(relation)); - Assert(HeapTupleIsValid(tuple)); - - numberOfBlocks = RelationGetNumberOfBlocks(relation); - Assert(blockIndex < numberOfBlocks); - - buffer = ReadBuffer(relation, blockIndex); + Buffer buffer; + Page pageHeader; + BlockNumber numberOfBlocks; + OffsetNumber offnum; + unsigned int len; + ItemId itemId; + Item item; + + /* ---------------- + * increment access statistics + * ---------------- + */ + IncrHeapAccessStat(local_RelationPutHeapTuple); + IncrHeapAccessStat(global_RelationPutHeapTuple); + + Assert(RelationIsValid(relation)); + Assert(HeapTupleIsValid(tuple)); + + numberOfBlocks = RelationGetNumberOfBlocks(relation); + Assert(blockIndex < numberOfBlocks); + + buffer = ReadBuffer(relation, blockIndex); #ifndef NO_BUFFERISVALID - if (!BufferIsValid(buffer)) { - elog(WARN, "RelationPutHeapTuple: no buffer for %ld in %s", - blockIndex, &relation->rd_rel->relname); - } + if (!BufferIsValid(buffer)) + { + elog(WARN, "RelationPutHeapTuple: no buffer for %ld in %s", + blockIndex, &relation->rd_rel->relname); + } #endif - - pageHeader = (Page)BufferGetPage(buffer); - len = (unsigned)DOUBLEALIGN(tuple->t_len); /* be conservative */ - Assert((int)len <= PageGetFreeSpace(pageHeader)); - - offnum = PageAddItem((Page)pageHeader, (Item)tuple, - tuple->t_len, InvalidOffsetNumber, LP_USED); - - itemId = PageGetItemId((Page)pageHeader, offnum); - item = PageGetItem((Page)pageHeader, itemId); - - ItemPointerSet(&((HeapTuple)item)->t_ctid, blockIndex, offnum); - - WriteBuffer(buffer); - /* return an accurate tuple */ - ItemPointerSet(&tuple->t_ctid, blockIndex, offnum); + + pageHeader = (Page) BufferGetPage(buffer); + len = (unsigned) DOUBLEALIGN(tuple->t_len); /* be conservative */ + Assert((int) len <= PageGetFreeSpace(pageHeader)); + + offnum = PageAddItem((Page) pageHeader, (Item) tuple, + tuple->t_len, InvalidOffsetNumber, LP_USED); + + itemId = PageGetItemId((Page) pageHeader, offnum); + item = PageGetItem((Page) pageHeader, itemId); + + ItemPointerSet(&((HeapTuple) item)->t_ctid, blockIndex, offnum); + + WriteBuffer(buffer); + /* return an accurate tuple */ + ItemPointerSet(&tuple->t_ctid, blockIndex, offnum); } /* @@ -91,7 +92,7 @@ RelationPutHeapTuple(Relation relation, * Eventually, we should cache the number of blocks in a relation somewhere. * Until that time, this code will have to do an lseek to determine the number * of blocks in a relation. - * + * * This code should ideally do at most 4 semops, 1 lseek, and possibly 1 write * to do an append; it's possible to eliminate 2 of the semops if we do direct * buffer stuff (!); the lseek and the write can go if we get @@ -107,70 +108,70 @@ RelationPutHeapTuple(Relation relation, void RelationPutHeapTupleAtEnd(Relation relation, HeapTuple tuple) { - Buffer buffer; - Page pageHeader; - BlockNumber lastblock; - OffsetNumber offnum; - unsigned int len; - ItemId itemId; - Item item; - - Assert(RelationIsValid(relation)); - Assert(HeapTupleIsValid(tuple)); - - /* - * XXX This does an lseek - VERY expensive - but at the moment it - * is the only way to accurately determine how many blocks are in - * a relation. A good optimization would be to get this to actually - * work properly. - */ - - lastblock = RelationGetNumberOfBlocks(relation); - - if (lastblock == 0) + Buffer buffer; + Page pageHeader; + BlockNumber lastblock; + OffsetNumber offnum; + unsigned int len; + ItemId itemId; + Item item; + + Assert(RelationIsValid(relation)); + Assert(HeapTupleIsValid(tuple)); + + /* + * XXX This does an lseek - VERY expensive - but at the moment it is + * the only way to accurately determine how many blocks are in a + * relation. A good optimization would be to get this to actually + * work properly. + */ + + lastblock = RelationGetNumberOfBlocks(relation); + + if (lastblock == 0) { - buffer = ReadBuffer(relation, lastblock); - pageHeader = (Page)BufferGetPage(buffer); - if (PageIsNew((PageHeader) pageHeader)) + buffer = ReadBuffer(relation, lastblock); + pageHeader = (Page) BufferGetPage(buffer); + if (PageIsNew((PageHeader) pageHeader)) { - buffer = ReleaseAndReadBuffer(buffer, relation, P_NEW); - pageHeader = (Page)BufferGetPage(buffer); - PageInit(pageHeader, BufferGetPageSize(buffer), 0); + buffer = ReleaseAndReadBuffer(buffer, relation, P_NEW); + pageHeader = (Page) BufferGetPage(buffer); + PageInit(pageHeader, BufferGetPageSize(buffer), 0); } } - else - buffer = ReadBuffer(relation, lastblock - 1); - - pageHeader = (Page)BufferGetPage(buffer); - len = (unsigned)DOUBLEALIGN(tuple->t_len); /* be conservative */ - - /* - * Note that this is true if the above returned a bogus page, which - * it will do for a completely empty relation. - */ - - if (len > PageGetFreeSpace(pageHeader)) + else + buffer = ReadBuffer(relation, lastblock - 1); + + pageHeader = (Page) BufferGetPage(buffer); + len = (unsigned) DOUBLEALIGN(tuple->t_len); /* be conservative */ + + /* + * Note that this is true if the above returned a bogus page, which it + * will do for a completely empty relation. + */ + + if (len > PageGetFreeSpace(pageHeader)) { - buffer = ReleaseAndReadBuffer(buffer, relation, P_NEW); - pageHeader = (Page)BufferGetPage(buffer); - PageInit(pageHeader, BufferGetPageSize(buffer), 0); - - if (len > PageGetFreeSpace(pageHeader)) - elog(WARN, "Tuple is too big: size %d", len); + buffer = ReleaseAndReadBuffer(buffer, relation, P_NEW); + pageHeader = (Page) BufferGetPage(buffer); + PageInit(pageHeader, BufferGetPageSize(buffer), 0); + + if (len > PageGetFreeSpace(pageHeader)) + elog(WARN, "Tuple is too big: size %d", len); } - - offnum = PageAddItem((Page)pageHeader, (Item)tuple, - tuple->t_len, InvalidOffsetNumber, LP_USED); - - itemId = PageGetItemId((Page)pageHeader, offnum); - item = PageGetItem((Page)pageHeader, itemId); - - lastblock = BufferGetBlockNumber(buffer); - - ItemPointerSet(&((HeapTuple)item)->t_ctid, lastblock, offnum); - - /* return an accurate tuple */ - ItemPointerSet(&tuple->t_ctid, lastblock, offnum); - - WriteBuffer(buffer); + + offnum = PageAddItem((Page) pageHeader, (Item) tuple, + tuple->t_len, InvalidOffsetNumber, LP_USED); + + itemId = PageGetItemId((Page) pageHeader, offnum); + item = PageGetItem((Page) pageHeader, itemId); + + lastblock = BufferGetBlockNumber(buffer); + + ItemPointerSet(&((HeapTuple) item)->t_ctid, lastblock, offnum); + + /* return an accurate tuple */ + ItemPointerSet(&tuple->t_ctid, lastblock, offnum); + + WriteBuffer(buffer); } |