]> granicus.if.org Git - postgresql/commitdiff
Bug: backend crashes in btbeginscan()->btrescan()->_bt_orderkeys()
authorVadim B. Mikheev <vadim4o@yahoo.com>
Mon, 5 May 1997 03:41:19 +0000 (03:41 +0000)
committerVadim B. Mikheev <vadim4o@yahoo.com>
Mon, 5 May 1997 03:41:19 +0000 (03:41 +0000)
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.

src/backend/access/nbtree/nbtree.c
src/backend/access/nbtree/nbtsearch.c

index 512f2b087989ad121b589612cdc90570325aee5c..b672901f8db7dd945c3ff36c313ec33a883ae0f5 100644 (file)
@@ -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;
     }
 
 }
index bbab9b5e3919561c9721db027d74b9ace645d4bf..fec73924b95b311e481ba1738490915f0ef718b3 100644 (file)
@@ -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);
     
     /*