diff options
author | Vadim B. Mikheev <vadim4o@yahoo.com> | 1997-05-05 03:41:19 +0000 |
---|---|---|
committer | Vadim B. Mikheev <vadim4o@yahoo.com> | 1997-05-05 03:41:19 +0000 |
commit | c3b51e0d676cd75c7db87dc0ea3da6fb96653871 (patch) | |
tree | f7ac521285f54407a6780acc07912b703a23c335 /src/backend/access/nbtree/nbtsearch.c | |
parent | 917abdd140de6ee39c96207a63453eb38be14a6e (diff) | |
download | postgresql-c3b51e0d676cd75c7db87dc0ea3da6fb96653871.tar.gz postgresql-c3b51e0d676cd75c7db87dc0ea3da6fb96653871.zip |
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.
Diffstat (limited to 'src/backend/access/nbtree/nbtsearch.c')
-rw-r--r-- | src/backend/access/nbtree/nbtsearch.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/src/backend/access/nbtree/nbtsearch.c b/src/backend/access/nbtree/nbtsearch.c index bbab9b5e391..fec73924b95 100644 --- a/src/backend/access/nbtree/nbtsearch.c +++ b/src/backend/access/nbtree/nbtsearch.c @@ -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); /* |