]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix problems with reverse order sorting and indexes in the LIKE optimization.
authordrh <drh@noemail.net>
Sat, 7 Mar 2015 02:51:59 +0000 (02:51 +0000)
committerdrh <drh@noemail.net>
Sat, 7 Mar 2015 02:51:59 +0000 (02:51 +0000)
FossilOrigin-Name: 564b8fe79475d7584a21078e6098840b8ce6a6e1

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

index 5043d98fbb52cfe9d6d936a320439926303b7d13..5835e728b1143e40115347392711bb0c0cb6b098 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Refactor\ssome\sjump\sopcodes\sin\sthe\sVDBE.\s\sAdd\sJumpZeroIncr\sand\sDecrJumpZero.\nFix\sthe\sLIKE\soptimization\sto\swork\swith\sDESC\ssort\sorder.
-D 2015-03-07T00:57:37.923
+C Fix\sproblems\swith\sreverse\sorder\ssorting\sand\sindexes\sin\sthe\sLIKE\soptimization.
+D 2015-03-07T02:51:59.332
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 2f643d6968dfc0b82d2e546a0525a39079f9e928
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -307,7 +307,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb
 F src/wal.c 39303f2c9db02a4e422cd8eb2c8760420c6a51fe
 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804
-F src/where.c 7c646a15d0d17850e10319aa31662d5ab61c69af
+F src/where.c efa0cef9fdf1c7f15e1f22d8e0a26d989c5fd947
 F src/whereInt.h cbe4aa57326998d89e7698ca65bb7c28541d483c
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
@@ -691,7 +691,7 @@ F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63
 F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200
 F test/like.test 4f2a71d36a536233727f71995fef900756705e56
 F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da
-F test/like3.test f6fa86d6a81d95bd796c46b0e2ba7444669bdd7e
+F test/like3.test 2fd1fd45cf7169093206e0d1d848e616df98ed46
 F test/limit.test 0c99a27a87b14c646a9d583c7c89fd06c352663e
 F test/loadext.test 648cb95f324d1775c54a55c12271b2d1156b633b
 F test/loadext2.test 0408380b57adca04004247179837a18e866a74f7
@@ -1241,7 +1241,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 6b993bd54035b67f4d84941e3f444ca79b7feee1
-R f90848042fe53f442912e9f9b75887d2
+P 26cb5145bf52f8c3fffa8c69b6c24aee4d974883
+R 26c030dedce138311a8813ea74e14352
 U drh
-Z ceb5f3bff4db8044ae0448ec360f04b2
+Z 2f44b5f1b4f68b861174549cabd12bcf
index 35dc95ffeed7da8813a4ea68699175a546795302..bc078d5c070fc4af9b65cb0583855c25887a3c54 100644 (file)
@@ -1 +1 @@
-26cb5145bf52f8c3fffa8c69b6c24aee4d974883
\ No newline at end of file
+564b8fe79475d7584a21078e6098840b8ce6a6e1
\ No newline at end of file
index ece403dfaa70ec667fd7cdca5bf19d2684071ebf..ed7febf3cb7ad7877ce8f223b93a013cfbc064fc 100644 (file)
@@ -3370,7 +3370,11 @@ static Bitmask codeOneLoopStart(
        && (pRangeEnd->wtFlags & TERM_LIKEOPT)!=0
       ){
         pLevel->iLikeRepCntr = ++pParse->nMem;
-        sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLikeRepCntr);
+        testcase( bRev );
+        testcase( pIdx->aSortOrder[nEq]==SQLITE_SO_DESC );
+        sqlite3VdbeAddOp2(v, OP_Integer,
+                          bRev ^ (pIdx->aSortOrder[nEq]==SQLITE_SO_DESC),
+                          pLevel->iLikeRepCntr);
         VdbeComment((v, "LIKE loop counter"));
         pLevel->addrLikeRep = sqlite3VdbeCurrentAddr(v);
       }
@@ -3401,9 +3405,11 @@ static Bitmask codeOneLoopStart(
     ){
       SWAP(WhereTerm *, pRangeEnd, pRangeStart);
       SWAP(u8, bSeekPastNull, bStopAtNull);
+#if 0
       if( pLevel->addrLikeRep ){
         sqlite3VdbeChangeP1(v, pLevel->addrLikeRep-1, 1);
       }
+#endif
     }
 
     testcase( pRangeStart && (pRangeStart->eOperator & WO_LE)!=0 );
@@ -6682,9 +6688,13 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){
       sqlite3VdbeJumpHere(v, pLevel->addrSkip-2);
     }
     if( pLevel->addrLikeRep ){
-      sqlite3VdbeAddOp2(v,
-           pLevel->op==OP_Prev ? OP_DecrJumpZero : OP_JumpZeroIncr,
-           pLevel->iLikeRepCntr, pLevel->addrLikeRep);
+      int op;
+      if( sqlite3VdbeGetOp(v, pLevel->addrLikeRep-1)->p1 ){
+        op = OP_DecrJumpZero;
+      }else{
+        op = OP_JumpZeroIncr;
+      }
+      sqlite3VdbeAddOp2(v, op, pLevel->iLikeRepCntr, pLevel->addrLikeRep);
       VdbeCoverage(v);
     }
     if( pLevel->iLeftJoin ){
index 7ca45f88c2adc1495f54d59f82f269d763bf8666..d3603637478d783f964f5fdee347c6574a33d883 100644 (file)
@@ -69,6 +69,32 @@ do_execsql_test like3-3.1 {
 do_execsql_test like3-3.1ck {
   SELECT quote(x) FROM t3 WHERE x LIKE 'ab%' ORDER BY +x DESC;
 } {X'616265' X'616264' X'616263' 'abe' 'abd' 'abc'}
+do_execsql_test like3-3.2 {
+  SELECT quote(x) FROM t3 WHERE x LIKE 'ab%' ORDER BY x ASC;
+} {'abc' 'abd' 'abe' X'616263' X'616264' X'616265'}
+do_execsql_test like3-3.2ck {
+  SELECT quote(x) FROM t3 WHERE x LIKE 'ab%' ORDER BY +x ASC;
+} {'abc' 'abd' 'abe' X'616263' X'616264' X'616265'}
+
+do_execsql_test like3-4.0 {
+  CREATE TABLE t4(x TEXT COLLATE nocase);
+  CREATE INDEX t4x ON t4(x DESC);
+  INSERT INTO t4(x) SELECT x FROM t3;
+  SELECT quote(x) FROM t4 WHERE x LIKE 'ab%' ORDER BY x;
+} {'abc' 'abd' 'abe' X'616263' X'616264' X'616265'}
+do_execsql_test like3-4.1 {
+  SELECT quote(x) FROM t4 WHERE x LIKE 'ab%' ORDER BY x DESC;
+} {X'616265' X'616264' X'616263' 'abe' 'abd' 'abc'}
+do_execsql_test like3-4.1ck {
+  SELECT quote(x) FROM t4 WHERE x LIKE 'ab%' ORDER BY +x DESC;
+} {X'616265' X'616264' X'616263' 'abe' 'abd' 'abc'}
+do_execsql_test like3-4.2 {
+  SELECT quote(x) FROM t4 WHERE x LIKE 'ab%' ORDER BY x ASC;
+} {'abc' 'abd' 'abe' X'616263' X'616264' X'616265'}
+do_execsql_test like3-4.2ck {
+  SELECT quote(x) FROM t4 WHERE x LIKE 'ab%' ORDER BY +x ASC;
+} {'abc' 'abd' 'abe' X'616263' X'616264' X'616265'}
+
 
 
 finish_test