]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Disable the LIKE optimization if the affinity of the LHS column is
authordrh <drh@noemail.net>
Sun, 7 Jun 2009 23:45:10 +0000 (23:45 +0000)
committerdrh <drh@noemail.net>
Sun, 7 Jun 2009 23:45:10 +0000 (23:45 +0000)
not TEXT.  Ticket #3901. (CVS 6727)

FossilOrigin-Name: a255c645c46ae03b65f862858fe57e462076e1fc

manifest
manifest.uuid
src/where.c
test/like.test
test/where7.test
test/where8.test

index f38c620c8b860e9c7f5b4f8c21b30bf256d1661e..836423ee9835c6e2903a27e729c787b33c6c55c8 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Update\sthe\serror\smessage\son\sone\sof\sthe\scorruption\stests\sto\saccount\sfor\sthe\sfact\nthat\swe\sare\sfinding\sthe\scorruption\ssooner.\s(CVS\s6726)
-D 2009-06-06T19:21:13
+C Disable\sthe\sLIKE\soptimization\sif\sthe\saffinity\sof\sthe\sLHS\scolumn\sis\nnot\sTEXT.\s\sTicket\s#3901.\s(CVS\s6727)
+D 2009-06-07T23:45:11
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 8b8fb7823264331210cddf103831816c286ba446
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -212,7 +212,7 @@ F src/vdbeblob.c c25d7e7bc6d5917feeb17270bd275fa771f26e5c
 F src/vdbemem.c 05183d46094aa99b8f8350e5761b9369dbef35a8
 F src/vtab.c e2f4c92df7d06330b151448718c4724742ff444b
 F src/walker.c ec4b9742a4077ef80346e2f9aaf0f44c2d95087a
-F src/where.c c6dda6e349e83de5da471704841791ecacaf87ca
+F src/where.c 01b8d4733f177f047014c0b391b4ecbcc867dfd8
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
 F test/all.test 14165b3e32715b700b5f0cbf8f6e3833dda0be45
@@ -431,7 +431,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 22f7857f9d7da7ff5061ded8806c43a6271109fc
+F test/like.test 4b594af9eddfd01018df1e9b1d18721aff619fa7
 F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da
 F test/limit.test 2db7b3b34fb925b8e847d583d2eb67531d0ce67e
 F test/loadext.test 0393ce12d9616aa87597dd0ec88181de181f6db0
@@ -702,8 +702,8 @@ F test/where3.test 97d3936e6a443b968f1a61cdcc0f673252000e94
 F test/where4.test e9b9e2f2f98f00379e6031db6a6fca29bae782a2
 F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2
 F test/where6.test 42c4373595f4409d9c6a9987b4a60000ad664faf
-F test/where7.test 42d5e19c88234bfd110e01dd890a449a8ecb24fa
-F test/where8.test d403734801f8ec1a306222a94a111a641a28bee6
+F test/where7.test b6e84b472a024e45c6dbdadc52bbcab3fcc8d0e1
+F test/where8.test 4839a0a1447e178a9a0725c5136fb963445e7708
 F test/where8m.test da346596e19d54f0aba35ebade032a7c47d79739
 F test/where9.test be19e1a92f80985c1a121b4678bf7d2123eaa623
 F test/whereA.test 522469ca013ff97c81b5367e730042290889a061
@@ -733,7 +733,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl 672f81d693a03f80f5ae60bfefacd8a349e76746
-P 4d129bee696f3a537f7ea5501a387012fc08c27e
-R 0886867af8335377b414a641e43ab0d1
+P ba9848e7b89df1fb6bf6db2b9d66cd3ffce375df
+R 81cd2c4f24010387a42ab7914dcb3be9
 U drh
-Z 92acfcf11caa462c7de054705c7ddd22
+Z e83d06023b0c10acd9b2d2194fc4e200
index 586ac5ba53a73b6e0c9f4648bb0343e391b3d29c..54d8584f6361fd2e39ad2716202cfc0e4ec06333 100644 (file)
@@ -1 +1 @@
-ba9848e7b89df1fb6bf6db2b9d66cd3ffce375df
\ No newline at end of file
+a255c645c46ae03b65f862858fe57e462076e1fc
\ No newline at end of file
index 0fe0df06e4f0bbf87552175b267f12b4f4686c6d..e545861dfcc428817abd5c28ae920a993cf68f23 100644 (file)
@@ -16,7 +16,7 @@
 ** so is applicable.  Because this module is responsible for selecting
 ** indices, you might also think of this module as the "query optimizer".
 **
-** $Id: where.c,v 1.401 2009/06/06 15:17:28 drh Exp $
+** $Id: where.c,v 1.402 2009/06/07 23:45:11 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -654,17 +654,15 @@ static int isLikeOrGlob(
   }
   pColl = sqlite3ExprCollSeq(pParse, pLeft);
   assert( pColl!=0 || pLeft->iColumn==-1 );
-  if( pColl==0 ){
-    /* No collation is defined for the ROWID.  Use the default. */
-    pColl = db->pDfltColl;
-  }
+  if( pColl==0 ) return 0;
   if( (pColl->type!=SQLITE_COLL_BINARY || *pnoCase) &&
       (pColl->type!=SQLITE_COLL_NOCASE || !*pnoCase) ){
     return 0;
   }
+  if( sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT ) return 0;
   z = pRight->u.zToken;
   cnt = 0;
-  if( z ){
+  if( ALWAYS(z) ){
     while( (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2] ){
       cnt++;
     }
index cd766079ff2310ed1132780f21c59592d06ba3e9..a2de6866b5cc09ace6c21ea0ab4b7f357b9a6066 100644 (file)
@@ -13,7 +13,7 @@
 # in particular the optimizations that occur to help those operators
 # run faster.
 #
-# $Id: like.test,v 1.12 2009/01/09 21:41:17 drh Exp $
+# $Id: like.test,v 1.13 2009/06/07 23:45:11 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -357,7 +357,7 @@ do_test like-5.2 {
 } 12
 do_test like-5.3 {
   execsql {
-    CREATE TABLE t2(x COLLATE NOCASE);
+    CREATE TABLE t2(x TEXT COLLATE NOCASE);
     INSERT INTO t2 SELECT * FROM t1;
     CREATE INDEX i2 ON t2(x COLLATE NOCASE);
   }
@@ -476,7 +476,7 @@ do_test like-5.24 {
 do_test like-5.25 {
   queryplan {
     PRAGMA case_sensitive_like=on;
-    CREATE TABLE t3(x);
+    CREATE TABLE t3(x TEXT);
     CREATE INDEX i3 ON t3(x);
     INSERT INTO t3 VALUES('ZZ-upper-upper');
     INSERT INTO t3 VALUES('zZ-lower-upper');
@@ -519,9 +519,9 @@ do_test like-6.1 {
 
 do_test like-7.1 {
   execsql {
-    SELECT * FROM t1 WHERE rowid GLOB '1*';
+    SELECT rowid, * FROM t1 WHERE rowid GLOB '1*' ORDER BY rowid;
   }
-} {a}
+} {1 a 10 ABC 11 CDE 12 {ABC abc xyz}}
 
 # ticket #3345.
 #
@@ -630,5 +630,108 @@ ifcapable like_opt {
   }
 }
 
+# Do an SQL statement.  Append the search count to the end of the result.
+#
+proc count sql {
+  set ::sqlite_search_count 0
+  set ::sqlite_like_count 0
+  return [concat [execsql $sql] scan $::sqlite_search_count \
+           like $::sqlite_like_count]
+}
+
+# The LIKE and GLOB optimizations do not work on columns with
+# affinity other than TEXT.
+# Ticket #3901
+#
+do_test like-10.1 {
+  db close
+  sqlite3 db test.db
+  execsql {
+    CREATE TABLE t10(
+      a INTEGER PRIMARY KEY,
+      b INTEGER COLLATE nocase UNIQUE,
+      c NUMBER COLLATE nocase UNIQUE,
+      d BLOB COLLATE nocase UNIQUE,
+      e COLLATE nocase UNIQUE,
+      f TEXT COLLATE nocase UNIQUE
+    );
+    INSERT INTO t10 VALUES(1,1,1,1,1,1);
+    INSERT INTO t10 VALUES(12,12,12,12,12,12);
+    INSERT INTO t10 VALUES(123,123,123,123,123,123);
+    INSERT INTO t10 VALUES(234,234,234,234,234,234);
+    INSERT INTO t10 VALUES(345,345,345,345,345,345);
+    INSERT INTO t10 VALUES(45,45,45,45,45,45);
+  }
+  count {
+    SELECT a FROM t10 WHERE b LIKE '12%' ORDER BY a;
+  }
+} {12 123 scan 5 like 6}
+do_test like-10.2 {
+  count {
+    SELECT a FROM t10 WHERE c LIKE '12%' ORDER BY a;
+  }
+} {12 123 scan 5 like 6}
+do_test like-10.3 {
+  count {
+    SELECT a FROM t10 WHERE d LIKE '12%' ORDER BY a;
+  }
+} {12 123 scan 5 like 6}
+do_test like-10.4 {
+  count {
+    SELECT a FROM t10 WHERE e LIKE '12%' ORDER BY a;
+  }
+} {12 123 scan 5 like 6}
+do_test like-10.5 {
+  count {
+    SELECT a FROM t10 WHERE f LIKE '12%' ORDER BY a;
+  }
+} {12 123 scan 3 like 0}
+do_test like-10.6 {
+  count {
+    SELECT a FROM t10 WHERE a LIKE '12%' ORDER BY a;
+  }
+} {12 123 scan 5 like 6}
+do_test like-10.10 {
+  execsql {
+    CREATE TABLE t10b(
+      a INTEGER PRIMARY KEY,
+      b INTEGER UNIQUE,
+      c NUMBER UNIQUE,
+      d BLOB UNIQUE,
+      e UNIQUE,
+      f TEXT UNIQUE
+    );
+    INSERT INTO t10b SELECT * FROM t10;
+  }
+  count {
+    SELECT a FROM t10b WHERE b GLOB '12*' ORDER BY a;
+  }
+} {12 123 scan 5 like 6}
+do_test like-10.11 {
+  count {
+    SELECT a FROM t10b WHERE c GLOB '12*' ORDER BY a;
+  }
+} {12 123 scan 5 like 6}
+do_test like-10.12 {
+  count {
+    SELECT a FROM t10b WHERE d GLOB '12*' ORDER BY a;
+  }
+} {12 123 scan 5 like 6}
+do_test like-10.13 {
+  count {
+    SELECT a FROM t10b WHERE e GLOB '12*' ORDER BY a;
+  }
+} {12 123 scan 5 like 6}
+do_test like-10.14 {
+  count {
+    SELECT a FROM t10b WHERE f GLOB '12*' ORDER BY a;
+  }
+} {12 123 scan 3 like 0}
+do_test like-10.15 {
+  count {
+    SELECT a FROM t10b WHERE a GLOB '12*' ORDER BY a;
+  }
+} {12 123 scan 5 like 6}
+
 
 finish_test
index d9c64a705dc750da2f4556e4fba0ae04fd9d7f53..2c145ac6789527068518bc981660a75188782a62 100644 (file)
@@ -11,7 +11,7 @@
 # This file implements regression tests for SQLite library.  The
 # focus of this file is testing the multi-index OR clause optimizer.
 #
-# $Id: where7.test,v 1.8 2009/04/21 09:02:47 danielk1977 Exp $
+# $Id: where7.test,v 1.9 2009/06/07 23:45:11 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -181,7 +181,7 @@ do_test where7-1.32 {
 
 do_test where7-2.1 {
   db eval {
-    CREATE TABLE t2(a INTEGER PRIMARY KEY,b,c,d,e,f,g);
+    CREATE TABLE t2(a INTEGER PRIMARY KEY,b,c,d,e,f TEXT,g);
     INSERT INTO t2 VALUES(1,11,1001,1.001,100.1,'bcdefghij','yxwvuts');
     INSERT INTO t2 VALUES(2,22,1001,2.002,100.1,'cdefghijk','yxwvuts');
     INSERT INTO t2 VALUES(3,33,1001,3.0029999999999997,100.1,'defghijkl','xwvutsr');
@@ -288,7 +288,7 @@ do_test where7-2.1 {
     CREATE INDEX t2e ON t2(e);
     CREATE INDEX t2f ON t2(f);
     CREATE INDEX t2g ON t2(g);
-    CREATE TABLE t3(a INTEGER PRIMARY KEY,b,c,d,e,f,g);
+    CREATE TABLE t3(a INTEGER PRIMARY KEY,b,c,d,e,f TEXT,g);
     INSERT INTO t3 SELECT * FROM t2;
     CREATE INDEX t3b ON t3(b,c);
     CREATE INDEX t3c ON t3(c,e);
index 3b4b964b9560be3e96bebffb418c0151b4153cda..9167bad193fe9609f5a0f6283b09c35720c6b1a0 100644 (file)
@@ -12,7 +12,7 @@
 # is testing of where.c. More specifically, the focus is the optimization
 # of WHERE clauses that feature the OR operator.
 #
-# $Id: where8.test,v 1.7 2009/06/05 17:09:12 drh Exp $
+# $Id: where8.test,v 1.8 2009/06/07 23:45:11 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -40,7 +40,7 @@ proc execsql_status2 {sql {db db}} {
 
 do_test where8-1.1 {
   execsql {
-    CREATE TABLE t1(a, b, c);
+    CREATE TABLE t1(a, b TEXT, c);
     CREATE INDEX i1 ON t1(a);
     CREATE INDEX i2 ON t1(b);