]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improved ORDER BY optimization for WITHOUT ROWID tables.
authordrh <drh@noemail.net>
Wed, 6 Nov 2013 12:56:04 +0000 (12:56 +0000)
committerdrh <drh@noemail.net>
Wed, 6 Nov 2013 12:56:04 +0000 (12:56 +0000)
FossilOrigin-Name: 8f1709ff2d52d5ceca3da6a2a4e06da204d9e65a

manifest
manifest.uuid
src/where.c
test/orderby5.test

index adf429bd38bd16796e7fa86a68002d97ab13f78a..1d0989efe57f953bf32bfdef15a40fcf7ae3ae80 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Disable\sthe\sOR\soptimization\sfor\sWITHOUT\sROWID\stables,\ssince\sit\srelies\son\nthe\suse\sof\srowids.
-D 2013-11-06T12:05:57.372
+C Improved\sORDER\sBY\soptimization\sfor\sWITHOUT\sROWID\stables.
+D 2013-11-06T12:56:04.047
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -292,7 +292,7 @@ F src/vtab.c 5a423b042eb1402ef77697d03d6a67378d97bc8d
 F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4
 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
 F src/walker.c e9e593d5bb798c3e67fc3893dfe7055c9e7d8d74
-F src/where.c 1df23d22ea530d384a3deb77af552a64af39334f
+F src/where.c ce16448190ba44d79749e83ffd8058cd5f104781
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6
@@ -717,7 +717,7 @@ F test/orderby1.test 9b524aff9147288da43a6d7ddfdcff47fa2303c6
 F test/orderby2.test bc11009f7cd99d96b1b11e57b199b00633eb5b04
 F test/orderby3.test 8619d06a3debdcd80a27c0fdea5c40b468854b99
 F test/orderby4.test 4d39bfbaaa3ae64d026ca2ff166353d2edca4ba4
-F test/orderby5.test 02eca502a0f97c77ce383b0dfa17e99c6a107b8d
+F test/orderby5.test 0eb82d5890c3f3d0563966560cfdc984ea69e30c
 F test/oserror.test 50417780d0e0d7cd23cf12a8277bb44024765df3
 F test/pager1.test 1acbdb14c5952a72dd43129cabdbf69aaa3ed1fa
 F test/pager2.test 67b8f40ae98112bcdba1f2b2d03ea83266418c71
@@ -1134,7 +1134,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
-P 427612efc169c8ebe94a8b586d7abd0fcd43d0d0
-R 05a5a0a384486e31eb5a4b75f73a71ca
+P 6055dad2ba2f9256b1f2d0a9e32ca00f1b81b0cf
+R 5d33ef338e308554e8ff41606713ec29
 U drh
-Z bc0884f74e17c4194dbca32799c70173
+Z 4259ceef2368d05bf56ed248162d9e14
index cca085518a04d1587af98695ebe3e7e06b0e531e..5d43f3d923b8702276e09eebf843669df0812339 100644 (file)
@@ -1 +1 @@
-6055dad2ba2f9256b1f2d0a9e32ca00f1b81b0cf
\ No newline at end of file
+8f1709ff2d52d5ceca3da6a2a4e06da204d9e65a
\ No newline at end of file
index 782372459348b1db8b71a8c8d9100838eea38aed..966aa8785d433b0714340daf545ed9a4f144b0e7 100644 (file)
@@ -5024,7 +5024,8 @@ static int wherePathSatisfiesOrderBy(
   u8 isOrderDistinct;   /* All prior WhereLoops are order-distinct */
   u8 distinctColumns;   /* True if the loop has UNIQUE NOT NULL columns */
   u8 isMatch;           /* iColumn matches a term of the ORDER BY clause */
-  u16 nKeyCol;          /* Number of columns in pIndex */
+  u16 nKeyCol;          /* Number of key columns in pIndex */
+  u16 nColumn;          /* Total number of ordered columns in the index */
   u16 nOrderBy;         /* Number terms in the ORDER BY clause */
   int iLoop;            /* Index of WhereLoop in pPath being processed */
   int i, j;             /* Loop counters */
@@ -5117,10 +5118,14 @@ static int wherePathSatisfiesOrderBy(
       if( pLoop->wsFlags & WHERE_IPK ){
         pIndex = 0;
         nKeyCol = 0;
+        nColumn = 1;
       }else if( (pIndex = pLoop->u.btree.pIndex)==0 || pIndex->bUnordered ){
         return 0;
       }else{
         nKeyCol = pIndex->nKeyCol;
+        nColumn = pIndex->nColumn;
+        assert( nColumn==nKeyCol+1 || !HasRowid(pIndex->pTable) );
+        assert( pIndex->aiColumn[nColumn-1]==(-1) || !HasRowid(pIndex->pTable));
         isOrderDistinct = pIndex->onError!=OE_None;
       }
 
@@ -5129,7 +5134,7 @@ static int wherePathSatisfiesOrderBy(
       */
       rev = revSet = 0;
       distinctColumns = 0;
-      for(j=0; j<=nKeyCol; j++){
+      for(j=0; j<nColumn; j++){
         u8 bOnce;   /* True to run the ORDER BY search loop */
 
         /* Skip over == and IS NULL terms */
@@ -5146,20 +5151,17 @@ static int wherePathSatisfiesOrderBy(
         /* Get the column number in the table (iColumn) and sort order
         ** (revIdx) for the j-th column of the index.
         */
-        if( j<nKeyCol ){
-          /* Normal index columns */
+        if( pIndex ){
           iColumn = pIndex->aiColumn[j];
           revIdx = pIndex->aSortOrder[j];
           if( iColumn==pIndex->pTable->iPKey ) iColumn = -1;
         }else{
-          /* The ROWID column at the end */
-          assert( j==nKeyCol );
           iColumn = -1;
           revIdx = 0;
         }
 
         /* An unconstrained column that might be NULL means that this
-        ** WhereLoop is not well-ordered 
+        ** WhereLoop is not well-ordered
         */
         if( isOrderDistinct
          && iColumn>=0
index 5bae5db7175a8bfb1f8ad608b7a34a7408d95915..6da0dd4e761cc6cf363ce862664020bb4b8681ba 100644 (file)
@@ -94,4 +94,19 @@ do_execsql_test 2.7 {
 } {/B-TREE/}
 
 
+do_execsql_test 3.0 {
+  CREATE TABLE t3(a INTEGER PRIMARY KEY, b, c, d, e, f);
+  CREATE INDEX t3bcde ON t3(b, c, d, e);
+  EXPLAIN QUERY PLAN
+  SELECT a FROM t3 WHERE b=2 AND c=3 ORDER BY d DESC, e DESC, b, c, a DESC;
+} {~/B-TREE/}
+do_execsql_test 3.1 {
+  DROP TABLE t3;
+  CREATE TABLE t3(a INTEGER PRIMARY KEY, b, c, d, e, f) WITHOUT rowid;
+  CREATE INDEX t3bcde ON t3(b, c, d, e);
+  EXPLAIN QUERY PLAN
+  SELECT a FROM t3 WHERE b=2 AND c=3 ORDER BY d DESC, e DESC, b, c, a DESC;
+} {~/B-TREE/}
+
+
 finish_test