]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the ability to use indices when a range contraint is bounded on
authordrh <drh@noemail.net>
Fri, 21 Jan 2011 14:37:04 +0000 (14:37 +0000)
committerdrh <drh@noemail.net>
Fri, 21 Jan 2011 14:37:04 +0000 (14:37 +0000)
the lower end by NULL.

FossilOrigin-Name: f73a167b434fadcbbd15e3891c4b7f4f87f6363c

manifest
manifest.uuid
src/vdbemem.c
src/where.c

index ab69287cda739795a3fb660db8a6f2296651c2d1..bb09b610c7e1cba13241786e0dcb8cfd4e0b8447 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,8 +1,8 @@
 -----BEGIN PGP SIGNED MESSAGE-----
 Hash: SHA1
 
-C Update\sANALYZE\stest\scases\sto\scheck\sout\sthe\suse\sof\shistograms\sfor\sequality\nconstraints.
-D 2011-01-20T20:36:13.223
+C Add\sthe\sability\sto\suse\sindices\swhen\sa\srange\scontraint\sis\sbounded\son\nthe\slower\send\sby\sNULL.
+D 2011-01-21T14:37:04.663
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in de6498556d536ae60bb8bb10e8c1ba011448658c
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -237,13 +237,13 @@ F src/vdbeInt.h 6e6f28e9bccc6c703dca1372fd661c57b5c15fb0
 F src/vdbeapi.c 69c82283ab2b64c0c37a07799d771d4058330743
 F src/vdbeaux.c 33448d23b857654dd69ed2103611f5c733606f68
 F src/vdbeblob.c 18955f0ee6b133cd08e1592010cb9a6b11e9984c
-F src/vdbemem.c 411649a35686f54268ccabeda175322c4697f5a6
+F src/vdbemem.c c011228c6fb1b5df924e4584765b16bde863c9c6
 F src/vdbetrace.c 864cef96919323482ebd9986f2132435115e9cc2
 F src/vtab.c b297e8fa656ab5e66244ab15680d68db0adbec30
 F src/wal.c dbca424f71678f663a286ab2a98f947af1d412a7
 F src/wal.h c1aac6593a0b02b15dc625987e619edeab39292e
 F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f
-F src/where.c 068ecc5195578aed083a4314e572de9979a489e5
+F src/where.c cf219a4275cf430d0e7df9d2db04e9ba29702f8e
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
 F test/all.test 51756962d522e474338e9b2ebb26e7364d4aa125
@@ -900,14 +900,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P 6bfc5c69eb22938972bbf4e60179952dc215f770
-R 2f06d09a87a4d54539d7aa2af234aaef
+P c7b59afaf0c0bf85dbaf0a122cc8d65fca93680f
+R 07d2f363ee58370384294fd182ee30ff
 U drh
-Z 7d948c493671d8082107f9a1879413d8
+Z 32ed47abc5f3838cb9feba0ba8b99416
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.6 (GNU/Linux)
 
-iD8DBQFNOJzAoxKgR168RlERAtM4AJwMzXlyhMoDKbExZY4UcDKSjGIdkwCcDJv7
-Vr+PmfFc04BsuQfthFYbAv4=
-=9ci9
+iD8DBQFNOZoToxKgR168RlERAkh6AJ4kec2vRcpVEtGIXoGz4TjpsHbYigCeMtj1
+RYqs8Oaohb8CL1KIU7eSI9Q=
+=lXJE
 -----END PGP SIGNATURE-----
index d7ce1c3e85a751a2489f38864d442b27b318f293..a9f1839b77449a74522a2d7e303d17c95920261b 100644 (file)
@@ -1 +1 @@
-c7b59afaf0c0bf85dbaf0a122cc8d65fca93680f
\ No newline at end of file
+f73a167b434fadcbbd15e3891c4b7f4f87f6363c
\ No newline at end of file
index 4831d806585367e73a3f9feecfcc897930649b47..aae8dbb65242a4bb3493b574d2322d124c898f71 100644 (file)
@@ -1082,6 +1082,8 @@ int sqlite3ValueFromExpr(
       pVal->r = (double)-1 * pVal->r;
       sqlite3ValueApplyAffinity(pVal, affinity, enc);
     }
+  }else if( op==TK_NULL ){
+    pVal = sqlite3ValueNew(db);
   }
 #ifndef SQLITE_OMIT_BLOB_LITERAL
   else if( op==TK_BLOB ){
index 048ab940a3f038779aca21ef8cae709f8a2b3c92..57552a4cba5ef6b260d7fe2ec90d3f8bb51aa980 100644 (file)
@@ -2245,6 +2245,11 @@ static int whereRangeRegion(
           if( aSample[i].u.r>=r ) break;
         }
       }
+    }else if( eType==SQLITE_NULL ){
+      i = 0;
+      if( roundUp ){
+        while( i<SQLITE_INDEX_SAMPLES && aSample[i].eType==SQLITE_NULL ) i++;
+      }
     }else{ 
       sqlite3 *db = pParse->db;
       CollSeq *pColl;
@@ -2433,6 +2438,7 @@ static int whereRangeScanEst(
         rc = whereRangeRegion(pParse, p, pLowerVal, roundUpLower, &iLower);
       }
     }
+    WHERETRACE(("range scan regions: %d..%d\n", iLower, iUpper));
 
     iEst = iUpper - iLower;
     testcase( iEst==SQLITE_INDEX_SAMPLES );
@@ -2471,6 +2477,11 @@ range_est_fallback:
 **
 ** Write the estimated row count into *pnRow.  If unable to make
 ** an estimate, leave *pnRow unchanged.
+**
+** This routine can fail if it is unable to load a collating sequence
+** required for string comparison, or if unable to allocate memory
+** for a UTF conversion required for comparison.  The error is stored
+** in the pParse structure.
 */
 void whereEqScanEst(
   Parse *pParse,       /* Parsing & code generating context */
@@ -2493,6 +2504,7 @@ void whereEqScanEst(
   if( rc ) goto whereEqScanEst_cancel;
   rc = whereRangeRegion(pParse, p, pRhs, 1, &iUpper);
   if( rc ) goto whereEqScanEst_cancel;
+  WHERETRACE(("equality scan regions: %d..%d\n", iLower, iUpper));
   if( iLower>=iUpper ){
     nRowEst = p->aiRowEst[0]/(SQLITE_INDEX_SAMPLES*2);
     if( nRowEst<*pnRow ) *pnRow = nRowEst;
@@ -2687,9 +2699,11 @@ static void bestBtreeIndex(
         Expr *pExpr = pTerm->pExpr;
         wsFlags |= WHERE_COLUMN_IN;
         if( ExprHasProperty(pExpr, EP_xIsSelect) ){
+          /* "x IN (SELECT ...)":  Assume the SELECT returns 25 rows */
           nInMul *= 25;
           bInEst = 1;
         }else if( ALWAYS(pExpr->x.pList) ){
+          /* "x IN (value, value, ...)" */
           nInMul *= pExpr->x.pList->nExpr + 1;
         }
       }else if( pTerm->eOperator & WO_ISNULL ){
@@ -2767,8 +2781,8 @@ static void bestBtreeIndex(
     }
 
     /*
-    ** Estimate the number of rows of output.  For an IN operator,
-    ** do not let the estimate exceed half the rows in the table.
+    ** Estimate the number of rows of output.  For an "x IN (SELECT...)"
+    ** constraint, do not let the estimate exceed half the rows in the table.
     */
     nRow = (double)(aiRowEst[nEq] * nInMul);
     if( bInEst && nRow*2>aiRowEst[0] ){