]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix the ORDER BY optimization logic so that it will do a block-sort on
authordrh <drh@noemail.net>
Sat, 22 Mar 2014 00:27:14 +0000 (00:27 +0000)
committerdrh <drh@noemail.net>
Sat, 22 Mar 2014 00:27:14 +0000 (00:27 +0000)
a partial DESC ORDER BY.  This enhancement uncovered a memory leak in
pushUntoSorter() which is also fixed.

FossilOrigin-Name: c36f74611cf17ad2ff198a2ac2054d7ab451a72c

manifest
manifest.uuid
src/select.c
src/where.c

index 5abb89ba80893ec051c8a24e61ad80bf6a7bef47..eca837d2110635e4a825be43454d83677287782f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sthe\sability\sto\suse\sindices\sfor\sthe\sfirst\sfew\sterms\sof\san\sORDER\sBY\sclause,\nthen\ssort\sin\sbatches\sto\shandle\sthe\slater\sterms.
-D 2014-03-21T20:58:42.176
+C Fix\sthe\sORDER\sBY\soptimization\slogic\sso\sthat\sit\swill\sdo\sa\sblock-sort\son\na\spartial\sDESC\sORDER\sBY.\s\sThis\senhancement\suncovered\sa\smemory\sleak\sin\npushUntoSorter()\swhich\sis\salso\sfixed.
+D 2014-03-22T00:27:14.500
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -217,7 +217,7 @@ F src/printf.c e5a0005f8b3de21f85da6a709d2fbee76775bf4b
 F src/random.c d10c1f85b6709ca97278428fd5db5bbb9c74eece
 F src/resolve.c 273d5f47c4e2c05b2d3d2bffeda939551ab59e66
 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0
-F src/select.c 633c56adeb382173d01016bea9e04e4dac54dfbc
+F src/select.c 89bfc2228c6dda5200040d3c61a67a7fc815a24e
 F src/shell.c cee9f46f2688a261601b1fd3d7f4b3cddf9b5cdf
 F src/sqlite.h.in a2ef671f92747a5a1c8a47bad5c585a8dd9eca80
 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
@@ -291,7 +291,7 @@ F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd
 F src/wal.c 76e7fc6de229bea8b30bb2539110f03a494dc3a8
 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
 F src/walker.c 11edb74d587bc87b33ca96a5173e3ec1b8389e45
-F src/where.c f394453e4960462e62671158199f060ac956f8bc
+F src/where.c da8ec216f14af617505799b0b4e52c73dda7a5ca
 F src/whereInt.h 2564055b440e44ebec8b47f237bbccae6719b7af
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
@@ -1157,7 +1157,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
-P 45d8cc678d128f1dda6469864215a8ed9de4366a 71e9ae72c272dc86720b2bfe719f57de437c400b
-R 3371108f475a5908c384cc490e83cfb1
+P fa06a6fed9f48322d9b89721799ba12c46efa898
+R c7b944946040f3192afd04e740c2e57c
 U drh
-Z 76333cbbd5592a854905d3a7e7bd7626
+Z 5cc077b206326620cdb0818e6e6de660
index 4099c22d6662bc0b61e0da0042323e8af77d11bd..a151346c9aecfd9202df1f7e82ee60c4751b7259 100644 (file)
@@ -1 +1 @@
-fa06a6fed9f48322d9b89721799ba12c46efa898
\ No newline at end of file
+c36f74611cf17ad2ff198a2ac2054d7ab451a72c
\ No newline at end of file
index fe65e2909a4e0e137f3306fc8ec6441cef826185..77ca0de8cc3de51b8f5ec34a77739157910ebf64 100644 (file)
@@ -488,6 +488,7 @@ static void pushOntoSorter(
     addrFirst = sqlite3VdbeAddOp1(v, OP_IfNot, regBase+nExpr); VdbeCoverage(v);
     sqlite3VdbeAddOp3(v, OP_Compare, regPrevKey, regBase, pSort->nOBSat);
     pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex);
+    if( pParse->db->mallocFailed ) return;
     pOp->p2 = nKey + 1;
     sqlite3VdbeChangeP4(v, -1, (char*)pOp->p4.pKeyInfo, P4_KEYINFO);
     pOp->p4.pKeyInfo = keyInfoFromExprList(pParse, pSort->pOrderBy, nOBSat, 1);
index 03066043d4c766392b3952f7a44b105d91a54eb7..15084f099ab50800abd6a335a945370f9f966a7c 100644 (file)
@@ -4872,23 +4872,23 @@ static i8 wherePathSatisfiesOrderBy(
           isMatch = 1;
           break;
         }
+        if( isMatch && (pWInfo->wctrlFlags & WHERE_GROUPBY)==0 ){
+          /* Make sure the sort order is compatible in an ORDER BY clause.
+          ** Sort order is irrelevant for a GROUP BY clause. */
+          if( revSet ){
+            if( (rev ^ revIdx)!=pOrderBy->a[i].sortOrder ) isMatch = 0;
+          }else{
+            rev = revIdx ^ pOrderBy->a[i].sortOrder;
+            if( rev ) *pRevMask |= MASKBIT(iLoop);
+            revSet = 1;
+          }
+        }
         if( isMatch ){
           if( iColumn<0 ){
             testcase( distinctColumns==0 );
             distinctColumns = 1;
           }
           obSat |= MASKBIT(i);
-          if( (pWInfo->wctrlFlags & WHERE_GROUPBY)==0 ){
-            /* Make sure the sort order is compatible in an ORDER BY clause.
-            ** Sort order is irrelevant for a GROUP BY clause. */
-            if( revSet ){
-              if( (rev ^ revIdx)!=pOrderBy->a[i].sortOrder ) return 0;
-            }else{
-              rev = revIdx ^ pOrderBy->a[i].sortOrder;
-              if( rev ) *pRevMask |= MASKBIT(iLoop);
-              revSet = 1;
-            }
-          }
         }else{
           /* No match found */
           if( j==0 || j<nKeyCol ){