From: drh Date: Thu, 22 Jul 2010 12:33:57 +0000 (+0000) Subject: Try to optimize LIKE and GLOB operators when RHS contains no wildcard. X-Git-Tag: version-3.7.2~104 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=93ee23cc03bd0027953e91907b70f3ae0f5e5f55;p=thirdparty%2Fsqlite.git Try to optimize LIKE and GLOB operators when RHS contains no wildcard. Ticket [e090183531fc274747] FossilOrigin-Name: 613a87d62fd1f8526d53136efae5adae91824bcf --- diff --git a/manifest b/manifest index d59b2f25b3..88ff0e3b30 100644 --- 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----- diff --git a/manifest.uuid b/manifest.uuid index 661dc3bf39..21b46a6c7f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f5866d4723460e80814b8599e0b84ff4a924da6f \ No newline at end of file +613a87d62fd1f8526d53136efae5adae91824bcf \ No newline at end of file diff --git a/src/where.c b/src/where.c index b2f75eacda..4b2857a2b1 100644 --- a/src/where.c +++ b/src/where.c @@ -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; diff --git a/test/analyze3.test b/test/analyze3.test index 438ecd7b2b..6fc70d99c5 100644 --- a/test/analyze3.test +++ b/test/analyze3.test @@ -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} #------------------------------------------------------------------------- diff --git a/test/like.test b/test/like.test index a2de6866b5..b092045256 100644 --- a/test/like.test +++ b/test/like.test @@ -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. #