]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Try to optimize LIKE and GLOB operators when RHS contains no wildcard.
authordrh <drh@noemail.net>
Thu, 22 Jul 2010 12:33:57 +0000 (12:33 +0000)
committerdrh <drh@noemail.net>
Thu, 22 Jul 2010 12:33:57 +0000 (12:33 +0000)
Ticket [e090183531fc274747]

FossilOrigin-Name: 613a87d62fd1f8526d53136efae5adae91824bcf

manifest
manifest.uuid
src/where.c
test/analyze3.test
test/like.test

index d59b2f25b3ae6c58b25341d7b84f7029f0b93e4f..88ff0e3b30d2195efce85e56f41f60031372868c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,8 +1,8 @@
 -----BEGIN PGP SIGNED MESSAGE-----
 Hash: SHA1
 
-C Tweaks\sto\sthe\svirtual\stable\sdocumentation\scontained\sin\scomments\sof\ssqlite3.h.\nNo\schanges\sto\sactual\scode.
-D 2010-07-22T11:40:34
+C Try\sto\soptimize\sLIKE\sand\sGLOB\soperators\swhen\sRHS\scontains\sno\swildcard.\nTicket\s[e090183531fc274747]
+D 2010-07-22T12:33:57
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in ec08dc838fd8110fe24c92e5130bcd91cbb1ff2e
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -233,7 +233,7 @@ F src/vtab.c a0f8a40274e4261696ef57aa806de2776ab72cda
 F src/wal.c 0925601f3299c2941a67c9cfff41ee710f70ca82
 F src/wal.h 906c85760598b18584921fe08008435aa4eeeeb2
 F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f
-F src/where.c 903a7828a0a7de03b5d0f1b5eff222d8d5b138f1
+F src/where.c 3ba8350d5a379ca8e22495bc1f65b5bbca1f18a5
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
 F test/all.test 6745008c144bd2956d58864d21f7b304689c1cce
@@ -244,7 +244,7 @@ F test/alter4.test 9386ffd1e9c7245f43eca412b2058d747509cc1f
 F test/altermalloc.test e81ac9657ed25c6c5bb09bebfa5a047cd8e4acfc
 F test/analyze.test bf692e7db414f268a136bade16c03a1bdbb9240c
 F test/analyze2.test 59dac6c399c0c5d1a90a11ee7cc606743fb6db93
-F test/analyze3.test 506203875258ffd8ffa879b9c3c5432022d2b6d8
+F test/analyze3.test 535bf0762f49fa96885efe8568738276c2204a2a
 F test/async.test ad4ba51b77cd118911a3fe1356b0809da9c108c3
 F test/async2.test bf5e2ca2c96763b4cba3d016249ad7259a5603b6
 F test/async3.test 93edaa9122f498e56ea98c36c72abc407f4fb11e
@@ -479,7 +479,7 @@ F test/jrnlmode3.test cfcdb12b90e640a23b92785a002d96c0624c8710
 F test/keyword1.test a2400977a2e4fde43bf33754c2929fda34dbca05
 F test/lastinsert.test 474d519c68cb79d07ecae56a763aa7f322c72f51
 F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200
-F test/like.test 4b594af9eddfd01018df1e9b1d18721aff619fa7
+F test/like.test 1048b39d3bcb0bd116d6a457919a48245c8a5711
 F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da
 F test/limit.test 2db7b3b34fb925b8e847d583d2eb67531d0ce67e
 F test/loadext.test 0393ce12d9616aa87597dd0ec88181de181f6db0
@@ -840,14 +840,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P b36b105eab6fd3195f4bfba6cb5cda0f063b7460
-R 49569c3fd825d76a4d3c437f67a4e29e
+P f5866d4723460e80814b8599e0b84ff4a924da6f
+R 49b64e8669411efcd75f08b06ee92d3f
 U drh
-Z 1e846dd14c5e4b7b2a4e9b36e0335e29
+Z 2fdd8f32952e23324d244fc4f334dd66
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.6 (GNU/Linux)
 
-iD8DBQFMSC41oxKgR168RlERAvgpAJ0bdRAr4fv+g+Tf5xbTOmRdNhaCLQCbBTe8
-EMRyonOpV9dCdr+RpWJl7G8=
-=MacA
+iD8DBQFMSDq6oxKgR168RlERArWNAJ45OYwaaRvdYeTtmBggQzReNzUYEQCdFJzy
+Vz7BIHIzGqjb389iZZfW0OQ=
+=tFz/
 -----END PGP SIGNATURE-----
index 661dc3bf3900fc6300825784da1233f622197b52..21b46a6c7ff952ffdd29dfe2d315f94938eda181 100644 (file)
@@ -1 +1 @@
-f5866d4723460e80814b8599e0b84ff4a924da6f
\ No newline at end of file
+613a87d62fd1f8526d53136efae5adae91824bcf
\ No newline at end of file
index b2f75eacda2ab69a93aa972045fb9d49bdc40105..4b2857a2b1dd3ab594c06f5441d45b1328176102 100644 (file)
@@ -689,9 +689,9 @@ static int isLikeOrGlob(
     while( (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2] ){
       cnt++;
     }
-    if( cnt!=0 && c!=0 && 255!=(u8)z[cnt-1] ){
+    if( cnt!=0 && 255!=(u8)z[cnt-1] ){
       Expr *pPrefix;
-      *pisComplete = z[cnt]==wc[0] && z[cnt+1]==0;
+      *pisComplete = c==wc[0] && z[cnt+1]==0;
       pPrefix = sqlite3Expr(db, TK_STRING, z);
       if( pPrefix ) pPrefix->u.zToken[cnt] = 0;
       *ppPrefix = pPrefix;
index 438ecd7b2b71218f35acb1eed873cbd68fab6c64..6fc70d99c5c2f246a5a9342f06c7c5d91abbe005 100644 (file)
@@ -268,6 +268,22 @@ do_test analyze3-2.5 {
   set like "%a"
   sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like }
 } {999 999 100}
+do_test analyze3-2.6 {
+  set like "a"
+  sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like }
+} {101 0 0}
+do_test analyze3-2.7 {
+  set like "ab"
+  sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like }
+} {11 0 0}
+do_test analyze3-2.8 {
+  set like "abc"
+  sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like }
+} {2 0 1}
+do_test analyze3-2.9 {
+  set like "a_c"
+  sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like }
+} {101 0 10}
 
 
 #-------------------------------------------------------------------------
index a2de6866b5cc09ace6c21ea0ab4b7f357b9a6066..b0920452561016f4d9b6b16e41e191313e61bfa1 100644 (file)
@@ -194,6 +194,31 @@ do_test like-3.4 {
   set sqlite_like_count
 } 0
 
+# The LIKE optimization still works when the RHS is a string with no
+# wildcard.  Ticket [e090183531fc2747]
+#
+do_test like-3.4.2 {
+  queryplan {
+    SELECT x FROM t1 WHERE x LIKE 'a' ORDER BY 1;
+  }
+} {a nosort {} i1}
+do_test like-3.4.3 {
+  queryplan {
+    SELECT x FROM t1 WHERE x LIKE 'ab' ORDER BY 1;
+  }
+} {ab nosort {} i1}
+do_test like-3.4.4 {
+  queryplan {
+    SELECT x FROM t1 WHERE x LIKE 'abcd' ORDER BY 1;
+  }
+} {abcd nosort {} i1}
+do_test like-3.4.5 {
+  queryplan {
+    SELECT x FROM t1 WHERE x LIKE 'abcde' ORDER BY 1;
+  }
+} {nosort {} i1}
+
+
 # Partial optimization when the pattern does not end in '%'
 #
 do_test like-3.5 {
@@ -309,6 +334,26 @@ do_test like-3.24 {
   set sqlite_like_count
 } 6
 
+# GLOB optimization when there is no wildcard.  Ticket [e090183531fc2747]
+#
+do_test like-3.25 {
+  queryplan {
+    SELECT x FROM t1 WHERE x GLOB 'a' ORDER BY 1;
+  }
+} {a nosort {} i1}
+do_test like-3.26 {
+  queryplan {
+    SELECT x FROM t1 WHERE x GLOB 'abcd' ORDER BY 1;
+  }
+} {abcd nosort {} i1}
+do_test like-3.27 {
+  queryplan {
+    SELECT x FROM t1 WHERE x GLOB 'abcde' ORDER BY 1;
+  }
+} {nosort {} i1}
+
+
+
 # No optimization if the LHS of the LIKE is not a column name or
 # if the RHS is not a string.
 #