]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem with using stat4 samples of type text when estimating the rows visited...
authordan <dan@noemail.net>
Sat, 28 Jun 2014 15:26:10 +0000 (15:26 +0000)
committerdan <dan@noemail.net>
Sat, 28 Jun 2014 15:26:10 +0000 (15:26 +0000)
FossilOrigin-Name: dfb09db6d412f3bc2a71bda393813783580dbad1

manifest
manifest.uuid
src/vdbemem.c
src/where.c
test/skipscan5.test

index 620657f6c1d0be3a38e600006130c98f9c80856b..624fcba2febac055b4a315e0ec138d4992b0acad 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Change\sthe\sVDBE\sto\sexport\sthe\ssqlite3MemCompare()\sroutine\sand\sthus\sfree\nwhere.c\sfrom\sthe\sdependency\son\svdbeInt.h.
-D 2014-06-28T14:28:06.405
+C Fix\sa\sproblem\swith\susing\sstat4\ssamples\sof\stype\stext\swhen\sestimating\sthe\srows\svisited\sby\sa\srange-query/skip-scan\sloop.
+D 2014-06-28T15:26:10.708
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in b03432313a3aad96c706f8164fb9f5307eaf19f5
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -289,14 +289,14 @@ F src/vdbeInt.h 5df5e9afe9b7839cd17256220fc4f7af84b8b1cd
 F src/vdbeapi.c 0ed6053f947edd0b30f64ce5aeb811872a3450a4
 F src/vdbeaux.c e493f38758c4b8f4ca2007cf6a700bd405d192f3
 F src/vdbeblob.c 9205ce9d3b064d9600f8418a897fc88b5687d9ac
-F src/vdbemem.c 3f191d4113805e3c5e875b732c44c9d98bac0595
+F src/vdbemem.c 8228bc32622716d26ffd902ceca7b31690744fef
 F src/vdbesort.c 44441d73b08b3a638dcdb725afffb87c6574ad27
 F src/vdbetrace.c 6f52bc0c51e144b7efdcfb2a8f771167a8816767
 F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd
 F src/wal.c 264df50a1b33124130b23180ded2e2c5663c652a
 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
 F src/walker.c 11edb74d587bc87b33ca96a5173e3ec1b8389e45
-F src/where.c 1f448161f1d9ec8cb68e2a8eb2e4a9756a877f69
+F src/where.c 84659c308426b20be4efada82a06a26dd6b8545e
 F src/whereInt.h 929c1349b5355fd44f22cee5c14d72b3329c58a6
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
@@ -829,7 +829,7 @@ F test/shrink.test 8c70f62b6e8eb4d54533de6d65bd06b1b9a17868
 F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329
 F test/skipscan1.test 28c7faa41a0d7265040ecb0a0abd90c0904270b2
 F test/skipscan2.test d1d1450952b7275f0b0a3a981f0230532743951a
-F test/skipscan5.test 7eb78ace4e7145fb5005d47a8f837701d7027b85
+F test/skipscan5.test 4b83d803bb17bf922569ce8c3637d0558d6abc83
 F test/soak.test 0b5b6375c9f4110c828070b826b3b4b0bb65cd5f
 F test/softheap1.test 40562fe6cac6d9827b7b42b86d45aedf12c15e24
 F test/sort.test 0e4456e729e5a92a625907c63dcdedfbe72c5dc5
@@ -1182,7 +1182,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 6af219d1b83ec54b3fb4ad4e6216d9ad9ea0fc70
-R 0d122ee9efb300dc8d78b79e592143bf
-U drh
-Z 93fe23c37a7fe2b9652da5b4873aa7c3
+P d186d1ac3c47f0d814636c4b8386a6065a294750
+R 737af1ae1f9d5e706af49b9d72dc98eb
+U dan
+Z c44a7d177df302c14a246c1d5d1d90b5
index 172499a5478a13f8a0211117c8aa8412b6e895e6..f498e3b5e9c4e4c5e113ac77eee727453692f16c 100644 (file)
@@ -1 +1 @@
-d186d1ac3c47f0d814636c4b8386a6065a294750
\ No newline at end of file
+dfb09db6d412f3bc2a71bda393813783580dbad1
\ No newline at end of file
index 634c881f2f4989f4a317a699e1ecc37f8424889d..7e5c912f394302e6e1597b6a1501b944fdda260c 100644 (file)
@@ -1301,6 +1301,7 @@ int sqlite3Stat4Column(
     }
 
     iHdr = getVarint32(&a[iHdr], t);
+    pMem->enc = ENC(db);
     sqlite3VdbeSerialGet(&a[iField], t, pMem);
   }
 
index e431e9413efffaf2312b364b00eacc15bdbe992b..7610c20f9bb8981da9f60e570302aad725c8dde2 100644 (file)
@@ -2091,7 +2091,7 @@ static int whereRangeSkipScanEst(
       pLoop->nOut -= nAdjust;
       *pbDone = 1;
       WHERETRACE(0x10, ("range skip-scan regions: %u..%u  adjust=%d est=%d\n",
-                           (u32)nLower, (u32)nUpper, nAdjust*-1, pLoop->nOut));
+                           nLower, nUpper, nAdjust*-1, pLoop->nOut));
     }
 
   }else{
index b374302f83801178cd469a8e156c7774e8c5db8d..6cf35f26a7c5e9d039f8cbd78a6ebee81f92823a 100644 (file)
@@ -92,4 +92,60 @@ do_eqp_test 1.11 {
   0 0 0 {SCAN TABLE t1}
 }
 
+#-------------------------------------------------------------------------
+# Test that range-query/skip-scan estimation works with text values.
+# And on UTF-16 databases when there is no UTF-16 collation sequence
+# available.
+
+proc test_collate {enc lhs rhs} {
+  string compare $lhs $rhs
+}
+
+foreach {tn dbenc coll} {
+  1 UTF-8   { add_test_collate db 0 0 1 }
+  2 UTF-16  { add_test_collate db 1 0 0 }
+  3 UTF-8   { add_test_collate db 0 1 0 }
+} {
+  reset_db
+  eval $coll
+
+  do_execsql_test 2.$tn.1 " PRAGMA encoding = '$dbenc' "
+  do_execsql_test 2.$tn.2 {
+    CREATE TABLE t2(a TEXT, b TEXT, c TEXT COLLATE test_collate, d TEXT);
+    CREATE INDEX i2 ON t2(a, b, c);
+  }
+
+  set vocab(d) { :) }
+  set vocab(c) { a b c d e f g h i j k l m n o p q r s t }
+  set vocab(b) { one two three }
+  set vocab(a) { sql }
+
+  do_test 2.$tn.3 {
+    for {set i 0} {$i < 100} {incr i} {
+      foreach var {a b c d} { 
+        set $var [lindex $vocab($var) [expr $i % [llength $vocab($var)]]]
+      }
+      execsql { INSERT INTO t2 VALUES($a, $b, $c, $d) }
+    }
+    execsql ANALYZE
+  } {}
+
+  foreach {tn2 q res} {
+    1 { c BETWEEN 'd' AND 'e' }       {/*ANY(a) AND ANY(b) AND c>? AND c<?*/}
+    2 { c BETWEEN 'b' AND 'r' }       {/*SCAN TABLE t2*/}
+    3 { c > 'q' }                     {/*ANY(a) AND ANY(b) AND c>?*/}
+    4 { c > 'e' }                     {/*SCAN TABLE t2*/}
+    5 { c < 'q' }                     {/*SCAN TABLE t2*/}
+    4 { c < 'e' }                     {/*ANY(a) AND ANY(b) AND c<?*/}
+  } {
+    set sql "EXPLAIN QUERY PLAN SELECT * FROM t2 WHERE $q" 
+    do_execsql_test 2.$tn.$tn2 $sql $res
+  }
+
+}
+
 finish_test
+
+
+
+