aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authordan <dan@noemail.net>2013-09-02 18:58:11 +0000
committerdan <dan@noemail.net>2013-09-02 18:58:11 +0000
commitb49d1047c6efccc83d5986ed5f07b1372ab0e88c (patch)
tree3d57cd237361f71563d52b4000d868893dc58d41 /test
parent84f48296faace4671b517664c486560194f64eca (diff)
downloadsqlite-b49d1047c6efccc83d5986ed5f07b1372ab0e88c.tar.gz
sqlite-b49d1047c6efccc83d5986ed5f07b1372ab0e88c.zip
Further stat4 related tests.
FossilOrigin-Name: 0a702c4b4c35fdbcb62e3ab88b9e57d7ea0052a8
Diffstat (limited to 'test')
-rw-r--r--test/analyze9.test211
-rw-r--r--test/permutations.test8
2 files changed, 219 insertions, 0 deletions
diff --git a/test/analyze9.test b/test/analyze9.test
index 415d69a56..777e462fd 100644
--- a/test/analyze9.test
+++ b/test/analyze9.test
@@ -705,5 +705,216 @@ do_test 14.3.1 {
} {}
check_stat4 14.3.2
+do_test 14.4.1 {
+ execsql {DELETE FROM t1}
+ for {set i 1} {$i < 160} {incr i} {
+ set b [expr $i % 10]
+ if {$b==0 || $b==2} {set b 1}
+ execsql { INSERT INTO t1 VALUES($i/10,$b,$i,$i) }
+ }
+} {}
+check_stat4 14.4.2
+db func lrange lrange
+db func lindex lindex
+do_execsql_test 14.4.3 {
+ SELECT lrange(test_decode(sample), 0, 1) AS s FROM sqlite_stat4
+ WHERE lindex(s, 1)=='1' ORDER BY rowid
+} {
+ {0 1} {1 1} {2 1} {3 1}
+ {4 1} {5 1} {6 1} {7 1}
+ {8 1} {9 1} {10 1} {11 1}
+ {12 1} {13 1} {14 1} {15 1}
+}
+
+#-------------------------------------------------------------------------
+# Test that nothing untoward happens if the stat4 table contains entries
+# for indexes that do not exist. Or NULL values in the idx column.
+# Or NULL values in any of the other columns.
+#
+drop_all_tables
+do_execsql_test 15.1 {
+ CREATE TABLE x1(a, b, UNIQUE(a, b));
+ INSERT INTO x1 VALUES(1, 2);
+ INSERT INTO x1 VALUES(3, 4);
+ INSERT INTO x1 VALUES(5, 6);
+ ANALYZE;
+ INSERT INTO sqlite_stat4 VALUES(NULL, NULL, NULL, NULL, NULL, NULL);
+}
+db close
+sqlite3 db test.db
+do_execsql_test 15.2 { SELECT * FROM x1 } {1 2 3 4 5 6}
+
+do_execsql_test 15.3 {
+ INSERT INTO sqlite_stat4 VALUES(42, 42, 42, 42, 42, 42);
+}
+db close
+sqlite3 db test.db
+do_execsql_test 15.4 { SELECT * FROM x1 } {1 2 3 4 5 6}
+
+do_execsql_test 15.5 {
+ UPDATE sqlite_stat1 SET stat = NULL;
+}
+db close
+sqlite3 db test.db
+do_execsql_test 15.6 { SELECT * FROM x1 } {1 2 3 4 5 6}
+
+do_execsql_test 15.7 {
+ ANALYZE;
+ UPDATE sqlite_stat1 SET tbl = 'no such tbl';
+}
+db close
+sqlite3 db test.db
+do_execsql_test 15.8 { SELECT * FROM x1 } {1 2 3 4 5 6}
+
+do_execsql_test 15.9 {
+ ANALYZE;
+ UPDATE sqlite_stat4 SET neq = NULL, nlt=NULL, ndlt=NULL;
+}
+db close
+sqlite3 db test.db
+do_execsql_test 15.10 { SELECT * FROM x1 } {1 2 3 4 5 6}
+
+# This is just for coverage....
+do_execsql_test 15.11 {
+ ANALYZE;
+ UPDATE sqlite_stat1 SET stat = stat || ' unordered';
+}
+db close
+sqlite3 db test.db
+do_execsql_test 15.12 { SELECT * FROM x1 } {1 2 3 4 5 6}
+
+#-------------------------------------------------------------------------
+# Test that allocations used for sqlite_stat4 samples are included in
+# the quantity returned by SQLITE_DBSTATUS_SCHEMA_USED.
+#
+set one [string repeat x 1000]
+set two [string repeat x 2000]
+do_test 16.1 {
+ reset_db
+ execsql {
+ CREATE TABLE t1(a, UNIQUE(a));
+ INSERT INTO t1 VALUES($one);
+ ANALYZE;
+ }
+ set nByte [lindex [sqlite3_db_status db SCHEMA_USED 0] 1]
+
+ reset_db
+ execsql {
+ CREATE TABLE t1(a, UNIQUE(a));
+ INSERT INTO t1 VALUES($two);
+ ANALYZE;
+ }
+ set nByte2 [lindex [sqlite3_db_status db SCHEMA_USED 0] 1]
+
+ expr {$nByte2 > $nByte+950 && $nByte2 < $nByte+1050}
+} {1}
+
+#-------------------------------------------------------------------------
+# Test that stat4 data may be used with partial indexes.
+#
+do_test 17.1 {
+ reset_db
+ execsql {
+ CREATE TABLE t1(a, b, c, d);
+ CREATE INDEX i1 ON t1(a, b) WHERE d IS NOT NULL;
+ INSERT INTO t1 VALUES(-1, -1, -1, NULL);
+ INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
+ INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
+ INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
+ INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
+ INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
+ INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1;
+ }
+
+ for {set i 0} {$i < 32} {incr i} {
+ if {$i<8} {set b 0} else { set b $i }
+ execsql { INSERT INTO t1 VALUES($i%2, $b, $i/2, 'abc') }
+ }
+ execsql {ANALYZE main.t1}
+} {}
+
+do_catchsql_test 17.1.2 {
+ ANALYZE temp.t1;
+} {1 {no such table: temp.t1}}
+
+do_eqp_test 17.2 {
+ SELECT * FROM t1 WHERE d IS NOT NULL AND a=0 AND b=10 AND c=10;
+} {/USING INDEX i1/}
+do_eqp_test 17.3 {
+ SELECT * FROM t1 WHERE d IS NOT NULL AND a=0 AND b=0 AND c=10;
+} {/USING INDEX i1/}
+
+do_execsql_test 17.4 {
+ CREATE INDEX i2 ON t1(c);
+ ANALYZE main.i2;
+}
+do_eqp_test 17.5 {
+ SELECT * FROM t1 WHERE d IS NOT NULL AND a=0 AND b=10 AND c=10;
+} {/USING INDEX i1/}
+do_eqp_test 17.6 {
+ SELECT * FROM t1 WHERE d IS NOT NULL AND a=0 AND b=0 AND c=10;
+} {/USING INDEX i2/}
+
+#-------------------------------------------------------------------------
+#
+do_test 18.1 {
+ reset_db
+ execsql {
+ CREATE TABLE t1(a, b);
+ CREATE INDEX i1 ON t1(a, b);
+ }
+ for {set i 0} {$i < 9} {incr i} {
+ execsql {
+ INSERT INTO t1 VALUES($i, 0);
+ INSERT INTO t1 VALUES($i, 0);
+ INSERT INTO t1 VALUES($i, 0);
+ INSERT INTO t1 VALUES($i, 0);
+ INSERT INTO t1 VALUES($i, 0);
+ INSERT INTO t1 VALUES($i, 0);
+ INSERT INTO t1 VALUES($i, 0);
+ INSERT INTO t1 VALUES($i, 0);
+ INSERT INTO t1 VALUES($i, 0);
+ INSERT INTO t1 VALUES($i, 0);
+ INSERT INTO t1 VALUES($i, 0);
+ INSERT INTO t1 VALUES($i, 0);
+ INSERT INTO t1 VALUES($i, 0);
+ INSERT INTO t1 VALUES($i, 0);
+ INSERT INTO t1 VALUES($i, 0);
+ }
+ }
+ execsql ANALYZE
+ execsql { SELECT count(*) FROM sqlite_stat4 }
+} {9}
+
+#-------------------------------------------------------------------------
+# For coverage.
+#
+ifcapable view {
+ do_test 19.1 {
+ reset_db
+ execsql {
+ CREATE TABLE t1(x, y);
+ CREATE INDEX i1 ON t1(x, y);
+ CREATE VIEW v1 AS SELECT * FROM t1;
+ ANALYZE;
+ }
+ } {}
+}
+ifcapable auth {
+ proc authproc {op args} {
+ if {$op == "SQLITE_ANALYZE"} { return "SQLITE_DENY" }
+ return "SQLITE_OK"
+ }
+ do_test 19.2 {
+ reset_db
+ db auth authproc
+ execsql {
+ CREATE TABLE t1(x, y);
+ CREATE VIEW v1 AS SELECT * FROM t1;
+ }
+ catchsql ANALYZE
+ } {1 {not authorized}}
+}
+
finish_test
diff --git a/test/permutations.test b/test/permutations.test
index 755565f1d..b9033932d 100644
--- a/test/permutations.test
+++ b/test/permutations.test
@@ -311,6 +311,14 @@ test_suite "coverage-pager" -description {
walfault.test walbak.test journal2.test tkt-9d68c883.test
}
+test_suite "coverage-analyze" -description {
+ Coverage tests for file analyze.c.
+} -files {
+ analyze3.test analyze4.test analyze5.test analyze6.test
+ analyze7.test analyze8.test analyze9.test analyzeA.test
+ analyze.test mallocA.test
+}
+
lappend ::testsuitelist xxx
#-------------------------------------------------------------------------