diff options
author | Teodor Sigaev <teodor@sigaev.ru> | 2006-05-10 09:19:54 +0000 |
---|---|---|
committer | Teodor Sigaev <teodor@sigaev.ru> | 2006-05-10 09:19:54 +0000 |
commit | 10dd8df68e6c826186b9900b703051b46ccd6b31 (patch) | |
tree | 3fc1063bedf9bb467c87ad204fd8b68805402404 /src/backend/access/gist/gistutil.c | |
parent | 12049d343e1aba53b74c68d3f739707343a5e301 (diff) | |
download | postgresql-10dd8df68e6c826186b9900b703051b46ccd6b31.tar.gz |
Reduce size of critical section and remove call of user-defined functions in
insertion and deletion, modify gistSplit() to do not use buffers.
TODO: gistvacuumcleanup and XLOG
Diffstat (limited to 'src/backend/access/gist/gistutil.c')
-rw-r--r-- | src/backend/access/gist/gistutil.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/src/backend/access/gist/gistutil.c b/src/backend/access/gist/gistutil.c index bf0a090ff8..d5d6405100 100644 --- a/src/backend/access/gist/gistutil.c +++ b/src/backend/access/gist/gistutil.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gist/gistutil.c,v 1.10 2006/03/05 15:58:20 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gistutil.c,v 1.11 2006/05/10 09:19:54 teodor Exp $ *------------------------------------------------------------------------- */ #include "postgres.h" @@ -81,15 +81,31 @@ gistfillbuffer(Relation r, Page page, IndexTuple *itup, * Check space for itup vector on page */ bool -gistnospace(Page page, IndexTuple *itvec, int len) +gistnospace(Page page, IndexTuple *itvec, int len, OffsetNumber todelete) { - unsigned int size = 0; + unsigned int size = 0, deleted = 0; int i; for (i = 0; i < len; i++) size += IndexTupleSize(itvec[i]) + sizeof(ItemIdData); - return (PageGetFreeSpace(page) < size); + if ( todelete != InvalidOffsetNumber ) { + IndexTuple itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, todelete)); + deleted = IndexTupleSize(itup) + sizeof(ItemIdData); + } + + return (PageGetFreeSpace(page) + deleted < size); +} + +bool +gistfitpage(IndexTuple *itvec, int len) { + int i; + Size size=0; + + for(i=0;i<len;i++) + size += IndexTupleSize(itvec[i]) + sizeof(ItemIdData); + + return (size <= GiSTPageSize); } /* @@ -107,7 +123,7 @@ gistextractbuffer(Buffer buffer, int *len /* out */ ) *len = maxoff; itvec = palloc(sizeof(IndexTuple) * maxoff); for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i)) - itvec[i - 1] = (IndexTuple) PageGetItem(p, PageGetItemId(p, i)); + itvec[i - FirstOffsetNumber] = (IndexTuple) PageGetItem(p, PageGetItemId(p, i)); return itvec; } |