mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Marginal hack to merge adjacent ReleaseBuffer/ReadBuffer calls into
ReleaseAndReadBuffer during GIST index searches. We already did this in btree and rtree, might as well do it here too.
This commit is contained in:
		@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * Portions Copyright (c) 1994, Regents of the University of California
 | 
					 * Portions Copyright (c) 1994, Regents of the University of California
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * IDENTIFICATION
 | 
					 * IDENTIFICATION
 | 
				
			||||||
 *	  $PostgreSQL: pgsql/src/backend/access/gist/gistget.c,v 1.43 2004/12/31 21:59:10 pgsql Exp $
 | 
					 *	  $PostgreSQL: pgsql/src/backend/access/gist/gistget.c,v 1.44 2005/02/05 19:38:58 tgl Exp $
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *-------------------------------------------------------------------------
 | 
					 *-------------------------------------------------------------------------
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -60,10 +60,11 @@ gistfirst(IndexScanDesc s, ScanDirection dir)
 | 
				
			|||||||
	BlockNumber blk;
 | 
						BlockNumber blk;
 | 
				
			||||||
	IndexTuple	it;
 | 
						IndexTuple	it;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						so = (GISTScanOpaque) s->opaque;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	b = ReadBuffer(s->indexRelation, GISTP_ROOT);
 | 
						b = ReadBuffer(s->indexRelation, GISTP_ROOT);
 | 
				
			||||||
	p = BufferGetPage(b);
 | 
						p = BufferGetPage(b);
 | 
				
			||||||
	po = (GISTPageOpaque) PageGetSpecialPointer(p);
 | 
						po = (GISTPageOpaque) PageGetSpecialPointer(p);
 | 
				
			||||||
	so = (GISTScanOpaque) s->opaque;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (;;)
 | 
						for (;;)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -75,12 +76,14 @@ gistfirst(IndexScanDesc s, ScanDirection dir)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		while (n < FirstOffsetNumber || n > maxoff)
 | 
							while (n < FirstOffsetNumber || n > maxoff)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			ReleaseBuffer(b);
 | 
					 | 
				
			||||||
			if (so->s_stack == NULL)
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			stk = so->s_stack;
 | 
								stk = so->s_stack;
 | 
				
			||||||
			b = ReadBuffer(s->indexRelation, stk->gs_blk);
 | 
								if (stk == NULL)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									ReleaseBuffer(b);
 | 
				
			||||||
 | 
									return false;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								b = ReleaseAndReadBuffer(b, s->indexRelation, stk->gs_blk);
 | 
				
			||||||
			p = BufferGetPage(b);
 | 
								p = BufferGetPage(b);
 | 
				
			||||||
			po = (GISTPageOpaque) PageGetSpecialPointer(p);
 | 
								po = (GISTPageOpaque) PageGetSpecialPointer(p);
 | 
				
			||||||
			maxoff = PageGetMaxOffsetNumber(p);
 | 
								maxoff = PageGetMaxOffsetNumber(p);
 | 
				
			||||||
@@ -89,6 +92,7 @@ gistfirst(IndexScanDesc s, ScanDirection dir)
 | 
				
			|||||||
				n = OffsetNumberPrev(stk->gs_child);
 | 
									n = OffsetNumberPrev(stk->gs_child);
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				n = OffsetNumberNext(stk->gs_child);
 | 
									n = OffsetNumberNext(stk->gs_child);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			so->s_stack = stk->gs_parent;
 | 
								so->s_stack = stk->gs_parent;
 | 
				
			||||||
			pfree(stk);
 | 
								pfree(stk);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -116,8 +120,7 @@ gistfirst(IndexScanDesc s, ScanDirection dir)
 | 
				
			|||||||
			it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n));
 | 
								it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n));
 | 
				
			||||||
			blk = ItemPointerGetBlockNumber(&(it->t_tid));
 | 
								blk = ItemPointerGetBlockNumber(&(it->t_tid));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			ReleaseBuffer(b);
 | 
								b = ReleaseAndReadBuffer(b, s->indexRelation, blk);
 | 
				
			||||||
			b = ReadBuffer(s->indexRelation, blk);
 | 
					 | 
				
			||||||
			p = BufferGetPage(b);
 | 
								p = BufferGetPage(b);
 | 
				
			||||||
			po = (GISTPageOpaque) PageGetSpecialPointer(p);
 | 
								po = (GISTPageOpaque) PageGetSpecialPointer(p);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -137,6 +140,8 @@ gistnext(IndexScanDesc s, ScanDirection dir)
 | 
				
			|||||||
	BlockNumber blk;
 | 
						BlockNumber blk;
 | 
				
			||||||
	IndexTuple	it;
 | 
						IndexTuple	it;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						so = (GISTScanOpaque) s->opaque;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	blk = ItemPointerGetBlockNumber(&(s->currentItemData));
 | 
						blk = ItemPointerGetBlockNumber(&(s->currentItemData));
 | 
				
			||||||
	n = ItemPointerGetOffsetNumber(&(s->currentItemData));
 | 
						n = ItemPointerGetOffsetNumber(&(s->currentItemData));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -148,7 +153,6 @@ gistnext(IndexScanDesc s, ScanDirection dir)
 | 
				
			|||||||
	b = ReadBuffer(s->indexRelation, blk);
 | 
						b = ReadBuffer(s->indexRelation, blk);
 | 
				
			||||||
	p = BufferGetPage(b);
 | 
						p = BufferGetPage(b);
 | 
				
			||||||
	po = (GISTPageOpaque) PageGetSpecialPointer(p);
 | 
						po = (GISTPageOpaque) PageGetSpecialPointer(p);
 | 
				
			||||||
	so = (GISTScanOpaque) s->opaque;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (;;)
 | 
						for (;;)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -157,20 +161,23 @@ gistnext(IndexScanDesc s, ScanDirection dir)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		while (n < FirstOffsetNumber || n > maxoff)
 | 
							while (n < FirstOffsetNumber || n > maxoff)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			ReleaseBuffer(b);
 | 
					 | 
				
			||||||
			if (so->s_stack == NULL)
 | 
					 | 
				
			||||||
				return false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			stk = so->s_stack;
 | 
								stk = so->s_stack;
 | 
				
			||||||
			b = ReadBuffer(s->indexRelation, stk->gs_blk);
 | 
								if (stk == NULL)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									ReleaseBuffer(b);
 | 
				
			||||||
 | 
									return false;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								b = ReleaseAndReadBuffer(b, s->indexRelation, stk->gs_blk);
 | 
				
			||||||
			p = BufferGetPage(b);
 | 
								p = BufferGetPage(b);
 | 
				
			||||||
			maxoff = PageGetMaxOffsetNumber(p);
 | 
					 | 
				
			||||||
			po = (GISTPageOpaque) PageGetSpecialPointer(p);
 | 
								po = (GISTPageOpaque) PageGetSpecialPointer(p);
 | 
				
			||||||
 | 
								maxoff = PageGetMaxOffsetNumber(p);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (ScanDirectionIsBackward(dir))
 | 
								if (ScanDirectionIsBackward(dir))
 | 
				
			||||||
				n = OffsetNumberPrev(stk->gs_child);
 | 
									n = OffsetNumberPrev(stk->gs_child);
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				n = OffsetNumberNext(stk->gs_child);
 | 
									n = OffsetNumberNext(stk->gs_child);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			so->s_stack = stk->gs_parent;
 | 
								so->s_stack = stk->gs_parent;
 | 
				
			||||||
			pfree(stk);
 | 
								pfree(stk);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -198,8 +205,7 @@ gistnext(IndexScanDesc s, ScanDirection dir)
 | 
				
			|||||||
			it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n));
 | 
								it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n));
 | 
				
			||||||
			blk = ItemPointerGetBlockNumber(&(it->t_tid));
 | 
								blk = ItemPointerGetBlockNumber(&(it->t_tid));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			ReleaseBuffer(b);
 | 
								b = ReleaseAndReadBuffer(b, s->indexRelation, blk);
 | 
				
			||||||
			b = ReadBuffer(s->indexRelation, blk);
 | 
					 | 
				
			||||||
			p = BufferGetPage(b);
 | 
								p = BufferGetPage(b);
 | 
				
			||||||
			po = (GISTPageOpaque) PageGetSpecialPointer(p);
 | 
								po = (GISTPageOpaque) PageGetSpecialPointer(p);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user