mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 10:30:33 +03:00 
			
		
		
		
	Bug: backend crashes in btbeginscan()->btrescan()->_bt_orderkeys()
when btree used in innerscan with run-time key which value passed by pointer. Fix: keys ordering stuff moved to _bt_first(). Pointed by Thomas Lockhart.
This commit is contained in:
		| @@ -8,7 +8,7 @@ | ||||
|  * | ||||
|  * | ||||
|  * IDENTIFICATION | ||||
|  *    $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.18 1997/04/18 03:37:53 vadim Exp $ | ||||
|  *    $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.19 1997/05/05 03:41:17 vadim Exp $ | ||||
|  * | ||||
|  * NOTES | ||||
|  *    This file contains only the public interface routines. | ||||
| @@ -410,7 +410,6 @@ btrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey) | ||||
| { | ||||
|     ItemPointer iptr; | ||||
|     BTScanOpaque so; | ||||
|     StrategyNumber strat; | ||||
|      | ||||
|     so = (BTScanOpaque) scan->opaque; | ||||
|      | ||||
| @@ -439,10 +438,11 @@ btrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey) | ||||
| 	scan->flags = 0x0; | ||||
|     } | ||||
|      | ||||
|     /* reset the scan key */ | ||||
|     /*  | ||||
|      * Reset the scan keys. Note that keys ordering stuff | ||||
|      * moved to _bt_first.	- vadim 05/05/97 | ||||
|      */ | ||||
|     so->numberOfKeys = scan->numberOfKeys; | ||||
|     so->numberOfFirstKeys = 0;		/* may be changed by _bt_orderkeys */ | ||||
|     so->qual_ok = 1;			/* may be changed by _bt_orderkeys */ | ||||
|     if (scan->numberOfKeys > 0) { | ||||
| 	memmove(scan->keyData, | ||||
| 		scankey, | ||||
| @@ -450,21 +450,6 @@ btrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey) | ||||
| 	memmove(so->keyData, | ||||
| 		scankey, | ||||
| 		so->numberOfKeys * sizeof(ScanKeyData)); | ||||
| 	/* order the keys in the qualification */ | ||||
| 	_bt_orderkeys(scan->relation, so); | ||||
|     } | ||||
|      | ||||
|     /* finally, be sure that the scan exploits the tree order */ | ||||
|     scan->scanFromEnd = false; | ||||
|     if ( so->numberOfKeys > 0 ) { | ||||
| 	strat = _bt_getstrat(scan->relation, 1 /* XXX */, | ||||
| 			     so->keyData[0].sk_procedure); | ||||
| 	 | ||||
| 	if (strat == BTLessStrategyNumber | ||||
| 	    || strat == BTLessEqualStrategyNumber) | ||||
| 	    scan->scanFromEnd = true; | ||||
|     } else { | ||||
| 	scan->scanFromEnd = true; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  * | ||||
|  * | ||||
|  * IDENTIFICATION | ||||
|  *    $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.18 1997/04/24 15:46:44 vadim Exp $ | ||||
|  *    $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.19 1997/05/05 03:41:19 vadim Exp $ | ||||
|  * | ||||
|  *------------------------------------------------------------------------- | ||||
|  */ | ||||
| @@ -751,16 +751,38 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) | ||||
|     ScanKeyData skdata; | ||||
|     Size keysok; | ||||
|      | ||||
|     rel = scan->relation; | ||||
|     so = (BTScanOpaque) scan->opaque; | ||||
|     if ( so->qual_ok == 0 )		/* may be set by _bt_orderkeys */ | ||||
|      | ||||
|     /*  | ||||
|      * Order the keys in the qualification and be sure | ||||
|      * that the scan exploits the tree order. | ||||
|      */ | ||||
|     so->numberOfFirstKeys = 0;		/* may be changed by _bt_orderkeys */ | ||||
|     so->qual_ok = 1;			/* may be changed by _bt_orderkeys */ | ||||
|     scan->scanFromEnd = false; | ||||
|     if ( so->numberOfKeys > 0 ) | ||||
|     { | ||||
|     	_bt_orderkeys(rel, so); | ||||
|     	 | ||||
| 	strat = _bt_getstrat(rel, 1, so->keyData[0].sk_procedure); | ||||
|  | ||||
| 	/* NOTE: it assumes ForwardScanDirection */ | ||||
| 	if ( strat == BTLessStrategyNumber ||  | ||||
| 		strat == BTLessEqualStrategyNumber ) | ||||
| 	    scan->scanFromEnd = true; | ||||
|     } | ||||
|     else | ||||
|     	scan->scanFromEnd = true; | ||||
|  | ||||
|     if ( so->qual_ok == 0 ) | ||||
|     	return ((RetrieveIndexResult) NULL); | ||||
|      | ||||
|     /* if we just need to walk down one edge of the tree, do that */ | ||||
|     if (scan->scanFromEnd) | ||||
| 	return (_bt_endpoint(scan, dir)); | ||||
|      | ||||
|     rel = scan->relation; | ||||
|     itupdesc = RelationGetTupleDescriptor(scan->relation); | ||||
|     itupdesc = RelationGetTupleDescriptor(rel); | ||||
|     current = &(scan->currentItemData); | ||||
|      | ||||
|     /* | ||||
|   | ||||
		Reference in New Issue
	
	Block a user