]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Enhance IN processing to allow efficient use of indices with numeric affinities.
authordrh <drh@noemail.net>
Tue, 18 Sep 2012 19:29:06 +0000 (19:29 +0000)
committerdrh <drh@noemail.net>
Tue, 18 Sep 2012 19:29:06 +0000 (19:29 +0000)
Add test cases for IN processing that would have spotted the error in the
[2be661a48023f4] check-in.

FossilOrigin-Name: 5ded9b68388f4024425c11f09b03529ac89454ce

manifest
manifest.uuid
src/expr.c
test/in5.test [new file with mode: 0644]

index 469e571c7750628cd48b903e017bf302fa8cccd4..1295a95098e59d5f82dde2458a60795f74ff2496 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Enhancements\sto\sthe\scomments\son\ssqlite3FindInIndex().\s\sNo\scode\schanges.
-D 2012-09-18T17:08:33.701
+C Enhance\sIN\sprocessing\sto\sallow\sefficient\suse\sof\sindices\swith\snumeric\saffinities.\nAdd\stest\scases\sfor\sIN\sprocessing\sthat\swould\shave\sspotted\sthe\serror\sin\sthe\n[2be661a48023f4]\scheck-in.
+D 2012-09-18T19:29:06.434
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 5f4f26109f9d80829122e0e09f9cda008fa065fb
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -130,7 +130,7 @@ F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
 F src/ctime.c 72a70dcfda75d3a1f81041ce4573e7afddcd8e4e
 F src/date.c 067a81c9942c497aafd2c260e13add8a7d0c7dd4
 F src/delete.c 335f36750dc6ac88d580aa36a6487459be9889de
-F src/expr.c f0fc0101879ac92d145f625811f34f647b767f71
+F src/expr.c bfed2f8ad9272aa1dd759dcae4310959b5b4c741
 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
 F src/fkey.c c82a04e7a92bb728f9ab972b76590403283be2af
 F src/func.c cbb90dc84b22eea25caf39528d342279e61b8898
@@ -519,6 +519,7 @@ F test/in.test 5941096407d8c133b9eff15bd3e666624b6cbde3
 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75
 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0
 F test/in4.test 64f3cc1acde1b9161ccdd8e5bde3daefdb5b2617
+F test/in5.test 99f9a40af01711b06d2d614ecfe96129f334fba3
 F test/incrblob.test 26fde912a1e0aff158b3a84ef3b265f046aad3be
 F test/incrblob2.test edc3a96e557bd61fb39acc8d2edd43371fbbaa19
 F test/incrblob3.test aedbb35ea1b6450c33b98f2b6ed98e5020be8dc7
@@ -1014,7 +1015,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
 F tool/win/sqlite.vsix 67d8a99aceb56384a81b3f30d6c71743146d2cc9
-P 030013ff0c7af5f146a64f9ede31297ff003e0c4
-R 52fabcd4dbff22d0436068b591f13147
+P b1a4c394995eb90b3fb43ab204704bda03799303
+R da249403d2133608cefd8edfe45e399b
 U drh
-Z 0c0f749b44c88277a286b4f0b71de6ea
+Z 42a764f0a55cecb2c00b9d26b3eb328f
index 9a4110e2ab9e5029ad4e55b7a1605eacd44f9a78..40511d00796e567a0030f00333c73fdd5a7990a0 100644 (file)
@@ -1 +1 @@
-b1a4c394995eb90b3fb43ab204704bda03799303
\ No newline at end of file
+5ded9b68388f4024425c11f09b03529ac89454ce
\ No newline at end of file
index 36dec2c846d18bc9d4c0a2a692235a91a1233f10..23a15c4dc90f87db994317eb62f2cfa114a78a2f 100644 (file)
@@ -1542,8 +1542,7 @@ int sqlite3FindInIndex(Parse *pParse, Expr *pX, int *prNotFound){
       ** comparison is the same as the affinity of the column. If
       ** it is not, it is not possible to use any index.
       */
-      char aff = comparisonAffinity(pX);
-      int affinity_ok = (pTab->aCol[iCol].affinity==aff||aff==SQLITE_AFF_NONE);
+      int affinity_ok = sqlite3IndexAffinityOk(pX, pTab->aCol[iCol].affinity);
 
       for(pIdx=pTab->pIndex; pIdx && eType==0 && affinity_ok; pIdx=pIdx->pNext){
         if( (pIdx->aiColumn[0]==iCol)
diff --git a/test/in5.test b/test/in5.test
new file mode 100644 (file)
index 0000000..8a43b8d
--- /dev/null
@@ -0,0 +1,138 @@
+# 2012 September 18
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+do_test in5-1.1 {
+  execsql {
+    CREATE TABLE t1x(x INTEGER PRIMARY KEY);
+    INSERT INTO t1x VALUES(1),(3),(5),(7),(9);
+    CREATE TABLE t1y(y INTEGER UNIQUE);
+    INSERT INTO t1y VALUES(2),(4),(6),(8);
+    CREATE TABLE t1z(z TEXT UNIQUE);
+    INSERT INTO t1z VALUES('a'),('c'),('e'),('g');
+    CREATE TABLE t2(a INTEGER, b INTEGER, c TEXT, d TEXT);
+    INSERT INTO t2 VALUES(1,2,'a','12a'),(1,2,'b','12b'),
+                         (2,3,'g','23g'),(3,5,'c','35c'),
+                         (4,6,'h','46h'),(5,6,'e','56e');
+    CREATE TABLE t3x AS SELECT x FROM t1x;
+    CREATE TABLE t3y AS SELECT y FROM t1y;
+    CREATE TABLE t3z AS SELECT z FROM t1z;
+    SELECT d FROM t2 WHERE a IN t1x AND b IN t1y AND c IN t1z ORDER BY c;
+  }
+} {12a 56e}
+do_test in5-1.2 {
+  execsql {
+    SELECT d FROM t2 WHERE a IN t1y AND b IN t1x AND c IN t1z ORDER BY d;
+  }
+} {23g}
+do_test in5-1.3 {
+  execsql {
+    SELECT d FROM t2 WHERE a IN t3x AND b IN t3y AND c IN t3z ORDER BY d;
+  }
+} {12a 56e}
+
+
+do_test in5-2.1 {
+  execsql {
+    CREATE INDEX t2abc ON t2(a,b,c);
+    SELECT d FROM t2 WHERE a IN t1x AND b IN t1y AND c IN t1z ORDER BY d;
+  }
+} {12a 56e}
+do_test in5-2.2 {
+  execsql {
+    SELECT d FROM t2 WHERE a IN t1y AND b IN t1x AND c IN t1z ORDER BY d;
+  }
+} {23g}
+do_test in5-2.3 {
+  regexp {OpenEphemeral} [db eval {
+    EXPLAIN SELECT d FROM t2 WHERE a IN t1x AND b IN t1y AND c IN t1z
+  }]
+} {0}
+do_test in5-2.4 {
+  execsql {
+    SELECT d FROM t2 WHERE a IN t3x AND b IN t3y AND c IN t3z ORDER BY d;
+  }
+} {12a 56e}
+do_test in5-2.5.1 {
+  regexp {OpenEphemeral} [db eval {
+    EXPLAIN SELECT d FROM t2 WHERE a IN t3x AND b IN t1y AND c IN t1z
+  }]
+} {1}
+do_test in5-2.5.2 {
+  regexp {OpenEphemeral} [db eval {
+    EXPLAIN SELECT d FROM t2 WHERE a IN t1x AND b IN t3y AND c IN t1z
+  }]
+} {1}
+do_test in5-2.5.3 {
+  regexp {OpenEphemeral} [db eval {
+    EXPLAIN SELECT d FROM t2 WHERE a IN t1x AND b IN t1y AND c IN t3z
+  }]
+} {1}
+
+do_test in5-3.1 {
+  execsql {
+    DROP INDEX t2abc;
+    CREATE INDEX t2ab ON t2(a,b);
+    SELECT d FROM t2 WHERE a IN t1x AND b IN t1y AND c IN t1z ORDER BY d;
+  }
+} {12a 56e}
+do_test in5-3.2 {
+  execsql {
+    SELECT d FROM t2 WHERE a IN t1y AND b IN t1x AND c IN t1z ORDER BY d;
+  }
+} {23g}
+do_test in5-3.3 {
+  regexp {OpenEphemeral} [db eval {
+    EXPLAIN SELECT d FROM t2 WHERE a IN t1x AND b IN t1y AND c IN t1z
+  }]
+} {0}
+
+do_test in5-4.1 {
+  execsql {
+    DROP INDEX t2ab;
+    CREATE INDEX t2abcd ON t2(a,b,c,d);
+    SELECT d FROM t2 WHERE a IN t1x AND b IN t1y AND c IN t1z ORDER BY d;
+  }
+} {12a 56e}
+do_test in5-4.2 {
+  execsql {
+    SELECT d FROM t2 WHERE a IN t1y AND b IN t1x AND c IN t1z ORDER BY d;
+  }
+} {23g}
+do_test in5-4.3 {
+  regexp {OpenEphemeral} [db eval {
+    EXPLAIN SELECT d FROM t2 WHERE a IN t1x AND b IN t1y AND c IN t1z
+  }]
+} {0}
+
+
+do_test in5-5.1 {
+  execsql {
+    DROP INDEX t2abcd;
+    CREATE INDEX t2cbad ON t2(c,b,a,d);
+    SELECT d FROM t2 WHERE a IN t1x AND b IN t1y AND c IN t1z ORDER BY d;
+  }
+} {12a 56e}
+do_test in5-5.2 {
+  execsql {
+    SELECT d FROM t2 WHERE a IN t1y AND b IN t1x AND c IN t1z ORDER BY d;
+  }
+} {23g}
+do_test in5-5.3 {
+  regexp {OpenEphemeral} [db eval {
+    EXPLAIN SELECT d FROM t2 WHERE a IN t1x AND b IN t1y AND c IN t1z
+  }]
+} {0}
+
+finish_test