mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-04 00:02:52 -05:00 
			
		
		
		
	Avoid unnecessary palloc overhead in _bt_first(). The temporary
scankeys arrays that it needs can never have more than INDEX_MAX_KEYS entries, so it's reasonable to just allocate them as fixed-size local arrays, and save the cost of palloc/pfree. Not a huge savings, but a cycle saved is a cycle earned ...
This commit is contained in:
		
							parent
							
								
									fc654583ab
								
							
						
					
					
						commit
						d961a56899
					
				@ -8,7 +8,7 @@
 | 
			
		||||
 * Portions Copyright (c) 1994, Regents of the University of California
 | 
			
		||||
 *
 | 
			
		||||
 * IDENTIFICATION
 | 
			
		||||
 *	  $PostgreSQL: pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.92 2005/06/13 23:14:48 tgl Exp $
 | 
			
		||||
 *	  $PostgreSQL: pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.93 2005/06/19 22:41:00 tgl Exp $
 | 
			
		||||
 *
 | 
			
		||||
 *-------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
@ -495,8 +495,8 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
 | 
			
		||||
	bool		nextkey;
 | 
			
		||||
	bool		goback;
 | 
			
		||||
	bool		continuescan;
 | 
			
		||||
	ScanKey		scankeys;
 | 
			
		||||
	ScanKey    *startKeys = NULL;
 | 
			
		||||
	ScanKey		startKeys[INDEX_MAX_KEYS];
 | 
			
		||||
	ScanKeyData	scankeys[INDEX_MAX_KEYS];
 | 
			
		||||
	int			keysCount = 0;
 | 
			
		||||
	int			i;
 | 
			
		||||
	StrategyNumber strat_total;
 | 
			
		||||
@ -552,8 +552,6 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
 | 
			
		||||
		ScanKey		chosen;
 | 
			
		||||
		ScanKey		cur;
 | 
			
		||||
 | 
			
		||||
		startKeys = (ScanKey *) palloc(so->numberOfKeys * sizeof(ScanKey));
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * chosen is the so-far-chosen key for the current attribute, if
 | 
			
		||||
		 * any. We don't cast the decision in stone until we reach keys
 | 
			
		||||
@ -636,18 +634,14 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
 | 
			
		||||
	 * scan from there.
 | 
			
		||||
	 */
 | 
			
		||||
	if (keysCount == 0)
 | 
			
		||||
	{
 | 
			
		||||
		if (startKeys)
 | 
			
		||||
			pfree(startKeys);
 | 
			
		||||
		return _bt_endpoint(scan, dir);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * We want to start the scan somewhere within the index.  Set up a
 | 
			
		||||
	 * 3-way-comparison scankey we can use to search for the boundary
 | 
			
		||||
	 * point we identified above.
 | 
			
		||||
	 */
 | 
			
		||||
	scankeys = (ScanKey) palloc(keysCount * sizeof(ScanKeyData));
 | 
			
		||||
	Assert(keysCount <= INDEX_MAX_KEYS);
 | 
			
		||||
	for (i = 0; i < keysCount; i++)
 | 
			
		||||
	{
 | 
			
		||||
		ScanKey		cur = startKeys[i];
 | 
			
		||||
@ -657,12 +651,7 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
 | 
			
		||||
		 * code later
 | 
			
		||||
		 */
 | 
			
		||||
		if (cur->sk_flags & SK_ISNULL)
 | 
			
		||||
		{
 | 
			
		||||
			pfree(startKeys);
 | 
			
		||||
			pfree(scankeys);
 | 
			
		||||
			elog(ERROR, "btree doesn't support is(not)null, yet");
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * If scankey operator is of default subtype, we can use the
 | 
			
		||||
@ -699,8 +688,6 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pfree(startKeys);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Examine the selected initial-positioning strategy to determine
 | 
			
		||||
	 * exactly where we need to start the scan, and set flag variables to
 | 
			
		||||
@ -809,7 +796,6 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
 | 
			
		||||
		/* Only get here if index is completely empty */
 | 
			
		||||
		ItemPointerSetInvalid(current);
 | 
			
		||||
		so->btso_curbuf = InvalidBuffer;
 | 
			
		||||
		pfree(scankeys);
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -823,9 +809,6 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
 | 
			
		||||
	blkno = BufferGetBlockNumber(buf);
 | 
			
		||||
	ItemPointerSet(current, blkno, offnum);
 | 
			
		||||
 | 
			
		||||
	/* done with manufactured scankey, now */
 | 
			
		||||
	pfree(scankeys);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * If nextkey = false, we are positioned at the first item >= scan
 | 
			
		||||
	 * key, or possibly at the end of a page on which all the existing
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user