]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the autoindex2.test testing module.
authordrh <drh@noemail.net>
Tue, 17 Jun 2014 13:23:36 +0000 (13:23 +0000)
committerdrh <drh@noemail.net>
Tue, 17 Jun 2014 13:23:36 +0000 (13:23 +0000)
FossilOrigin-Name: ffe3fea47b8ba8ec4557f68243ef3ef5aac00dfd

manifest
manifest.uuid
test/autoindex2.test [new file with mode: 0644]

index 374e71d7ac2a19b56bdaa687b658a5b85a048d4b..49473453ec2aa1e3d5216d65ac9479e3ec192e99 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C A\sdifferent\sapproach\sto\sthe\sautoindex\sproblem\sthat\sdeletes\squery-planner\scode\nrather\sthan\sadding\sit.
-D 2014-06-17T12:33:55.348
+C Add\sthe\sautoindex2.test\stesting\smodule.
+D 2014-06-17T13:23:36.416
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in ed5e4aae4799f724699d5509fac2977786414dbb
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -335,6 +335,7 @@ F test/auth2.test c3b415b76c033bedb81292118fb7c01f5f10cbcd
 F test/auth3.test a4755e6a2a2fea547ffe63c874eb569e60a28eb5
 F test/autoinc.test c58912526998a39e11f66b533e23cfabea7f25b7
 F test/autoindex1.test 762ff3f8e25d852aae55c6462ca166a80c0cde61
+F test/autoindex2.test 60d2fc6f38364308ce73a9beb01b47ded38697de
 F test/autovacuum.test 941892505d2c0f410a0cb5970dfa1c7c4e5f6e74
 F test/autovacuum_ioerr2.test 8a367b224183ad801e0e24dcb7d1501f45f244b4
 F test/avtrans.test 0252654f4295ddda3b2cce0e894812259e655a85
@@ -1177,7 +1178,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 36d67e1dd2b4f4c22d02f3c3b8d372074de5523a
-R f31fb5c411bc798b3e39eb24696f39dc
+P f270fb6e9e0b5e77f918081962008c6195ab1e36
+R 4590197fe44138640af30c15c42aaab1
 U drh
-Z d63276e1ce6bb05efdbf1c4b12bc995b
+Z c2b8b2abeb08d5199560396ab0f820e5
index 142b9c98b5aed6051173ebaa193fed3432961574..843a903c192953dc5d82934220e46f680810093e 100644 (file)
@@ -1 +1 @@
-f270fb6e9e0b5e77f918081962008c6195ab1e36
\ No newline at end of file
+ffe3fea47b8ba8ec4557f68243ef3ef5aac00dfd
\ No newline at end of file
diff --git a/test/autoindex2.test b/test/autoindex2.test
new file mode 100644 (file)
index 0000000..f4da416
--- /dev/null
@@ -0,0 +1,271 @@
+# 2014-06-17
+#
+# 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.
+#
+#*************************************************************************
+#
+# This file implements regression tests for SQLite library.  The
+# focus of this script is testing automatic index creation logic.
+#
+# This file contains a single real-world test case that was giving
+# suboptimal performance because of over-use of automatic indexes.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+
+do_execsql_test autoindex2-100 {
+  CREATE TABLE t1(
+    t1_id largeint,
+    did char(9),
+    ptime largeint,
+    exbyte char(4),
+    pe_id int,
+    field_id int,
+    mass float,
+    param10 float,
+    param11 float,
+    exmass float,
+    deviation float,
+    trange float,
+    vstatus int,
+    commit_status int,
+    formula char(329),
+    tier int DEFAULT 2,
+    ssid int DEFAULT 0,
+    last_operation largeint DEFAULT 0,
+    admin_uuid int DEFAULT 0,
+    previous_value float,
+    job_id largeint,
+    last_t1 largeint DEFAULT 0,
+    data_t1 int,
+    previous_date largeint DEFAULT 0,
+    flg8 int DEFAULT 1,
+    failed_fields char(100)
+  );
+  CREATE INDEX t1x0 on t1 (t1_id);
+  CREATE INDEX t1x1 on t1 (ptime, vstatus);
+  CREATE INDEX t1x2 on t1 (did, ssid, ptime, vstatus, exbyte, t1_id);
+  CREATE INDEX t1x3 on t1 (job_id);
+  
+  CREATE TABLE t2(
+    did char(9),
+    client_did char(30),
+    description char(49),
+    uid int,
+    tzid int,
+    privilege int,
+    param2 int,
+    type char(30),
+    subtype char(32),
+    dparam1 char(7) DEFAULT '',
+    param5 char(3) DEFAULT '',
+    notional float DEFAULT 0.000000,
+    create_time largeint,
+    sample_time largeint DEFAULT 0,
+    param6 largeint,
+    frequency int,
+    expiration largeint,
+    uw_status int,
+    next_sample largeint,
+    last_sample largeint,
+    reserve1 char(29) DEFAULT '',
+    reserve2 char(29) DEFAULT '',
+    reserve3 char(29) DEFAULT '',
+    bxcdr char(19) DEFAULT 'XY',
+    ssid int DEFAULT 1,
+    last_t1_id largeint,
+    reserve4 char(29) DEFAULT '',
+    reserve5 char(29) DEFAULT '',
+    param12 int DEFAULT 0,
+    long_did char(100) DEFAULT '',
+    gr_code int DEFAULT 0,
+    drx char(100) DEFAULT '',
+    parent_id char(9) DEFAULT '',
+    param13 int DEFAULT 0,
+    position float DEFAULT 1.000000,
+    client_did3 char(100) DEFAULT '',
+    client_did4 char(100) DEFAULT '',
+    dlib_id char(9) DEFAULT ''
+  );
+  CREATE INDEX t2x0 on t2 (did);
+  CREATE INDEX t2x1 on t2 (client_did);
+  CREATE INDEX t2x2 on t2 (long_did);
+  CREATE INDEX t2x3 on t2 (uid);
+  CREATE INDEX t2x4 on t2 (param2);
+  CREATE INDEX t2x5 on t2 (type);
+  CREATE INDEX t2x6 on t2 (subtype);
+  CREATE INDEX t2x7 on t2 (last_sample);
+  CREATE INDEX t2x8 on t2 (param6);
+  CREATE INDEX t2x9 on t2 (frequency);
+  CREATE INDEX t2x10 on t2 (privilege);
+  CREATE INDEX t2x11 on t2 (sample_time);
+  CREATE INDEX t2x12 on t2 (notional);
+  CREATE INDEX t2x13 on t2 (tzid);
+  CREATE INDEX t2x14 on t2 (gr_code);
+  CREATE INDEX t2x15 on t2 (parent_id);
+  
+  CREATE TABLE t3(
+    uid int,
+    param3 int,
+    uuid int,
+    acc_id int,
+    cust_num int,
+    numerix_id int,
+    pfy char(29),
+    param4 char(29),
+    param15 int DEFAULT 0,
+    flg7 int DEFAULT 0,
+    param21 int DEFAULT 0,
+    bxcdr char(2) DEFAULT 'PC',
+    c31 int DEFAULT 0,
+    c33 int DEFAULT 0,
+    c35 int DEFAULT 0,
+    c37 int,
+    mgr_uuid int,
+    back_up_uuid int,
+    priv_mars int DEFAULT 0,
+    is_qc int DEFAULT 0,
+    c41 int DEFAULT 0,
+    deleted int DEFAULT 0,
+    c47 int DEFAULT 1
+  );
+  CREATE INDEX t3x0 on t3 (uid);
+  CREATE INDEX t3x1 on t3 (param3);
+  CREATE INDEX t3x2 on t3 (uuid);
+  CREATE INDEX t3x3 on t3 (acc_id);
+  CREATE INDEX t3x4 on t3 (param4);
+  CREATE INDEX t3x5 on t3 (pfy);
+  CREATE INDEX t3x6 on t3 (is_qc);
+  SELECT count(*) FROM sqlite_master;
+} {30}
+do_execsql_test autoindex2-110 {
+  ANALYZE sqlite_master;
+  INSERT INTO sqlite_stat1 VALUES('t1','t1x3','10747267 260');
+  INSERT INTO sqlite_stat1 VALUES('t1','t1x2','10747267 121 113 2 2 2 1');
+  INSERT INTO sqlite_stat1 VALUES('t1','t1x1','10747267 50 40');
+  INSERT INTO sqlite_stat1 VALUES('t1','t1x0','10747267 1');
+  INSERT INTO sqlite_stat1 VALUES('t2','t2x15','39667 253');
+  INSERT INTO sqlite_stat1 VALUES('t2','t2x14','39667 19834');
+  INSERT INTO sqlite_stat1 VALUES('t2','t2x13','39667 13223');
+  INSERT INTO sqlite_stat1 VALUES('t2','t2x12','39667 7');
+  INSERT INTO sqlite_stat1 VALUES('t2','t2x11','39667 17');
+  INSERT INTO sqlite_stat1 VALUES('t2','t2x10','39667 19834');
+  INSERT INTO sqlite_stat1 VALUES('t2','t2x9','39667 7934');
+  INSERT INTO sqlite_stat1 VALUES('t2','t2x8','39667 11');
+  INSERT INTO sqlite_stat1 VALUES('t2','t2x7','39667 5');
+  INSERT INTO sqlite_stat1 VALUES('t2','t2x6','39667 242');
+  INSERT INTO sqlite_stat1 VALUES('t2','t2x5','39667 1984');
+  INSERT INTO sqlite_stat1 VALUES('t2','t2x4','39667 4408');
+  INSERT INTO sqlite_stat1 VALUES('t2','t2x3','39667 81');
+  INSERT INTO sqlite_stat1 VALUES('t2','t2x2','39667 551');
+  INSERT INTO sqlite_stat1 VALUES('t2','t2x1','39667 2');
+  INSERT INTO sqlite_stat1 VALUES('t2','t2x0','39667 1');
+  INSERT INTO sqlite_stat1 VALUES('t3','t3x6','569 285');
+  INSERT INTO sqlite_stat1 VALUES('t3','t3x5','569 2');
+  INSERT INTO sqlite_stat1 VALUES('t3','t3x4','569 2');
+  INSERT INTO sqlite_stat1 VALUES('t3','t3x3','569 5');
+  INSERT INTO sqlite_stat1 VALUES('t3','t3x2','569 3');
+  INSERT INTO sqlite_stat1 VALUES('t3','t3x1','569 6');
+  INSERT INTO sqlite_stat1 VALUES('t3','t3x0','569 1');
+  ANALYZE sqlite_master;
+} {}
+do_execsql_test autoindex2-120 {
+  EXPLAIN QUERY PLAN
+  SELECT
+     t1_id,
+     t1.did,
+     param2,
+     param3,
+     t1.ptime,
+     t1.trange,
+     t1.exmass,
+     t1.mass,
+     t1.vstatus,
+     type,
+     subtype,
+     t1.deviation,
+     t1.formula,
+     dparam1,
+     reserve1,
+     reserve2,
+     param4,
+     t1.last_operation,
+     t1.admin_uuid,
+     t1.previous_value,
+     t1.job_id,
+     client_did, 
+     t1.last_t1,
+     t1.data_t1,
+     t1.previous_date,
+     param5,
+     param6,
+     mgr_uuid
+  FROM
+     t1,
+     t2,
+     t3
+  WHERE
+     t1.ptime > 1393520400
+     AND param3<>9001
+     AND t3.flg7 = 1
+     AND t1.did = t2.did
+     AND t2.uid = t3.uid
+  ORDER BY t1.ptime desc LIMIT 500;
+} {0 0 0 {SEARCH TABLE t1 USING INDEX t1x1 (ptime>?)} 0 1 1 {SEARCH TABLE t2 USING INDEX t2x0 (did=?)} 0 2 2 {SEARCH TABLE t3 USING INDEX t3x0 (uid=?)}}
+#
+# ^^^--- Before being fixed, the above was using an automatic covering
+# on t3 and reordering the tables so that t3 was in the outer loop and
+# implementing the ORDER BY clause using a B-Tree.
+
+do_execsql_test autoindex2-120 {
+  EXPLAIN QUERY PLAN
+  SELECT
+     t1_id,
+     t1.did,
+     param2,
+     param3,
+     t1.ptime,
+     t1.trange,
+     t1.exmass,
+     t1.mass,
+     t1.vstatus,
+     type,
+     subtype,
+     t1.deviation,
+     t1.formula,
+     dparam1,
+     reserve1,
+     reserve2,
+     param4,
+     t1.last_operation,
+     t1.admin_uuid,
+     t1.previous_value,
+     t1.job_id,
+     client_did, 
+     t1.last_t1,
+     t1.data_t1,
+     t1.previous_date,
+     param5,
+     param6,
+     mgr_uuid
+  FROM
+     t3,
+     t2,
+     t1
+  WHERE
+     t1.ptime > 1393520400
+     AND param3<>9001
+     AND t3.flg7 = 1
+     AND t1.did = t2.did
+     AND t2.uid = t3.uid
+  ORDER BY t1.ptime desc LIMIT 500;
+} {0 0 2 {SEARCH TABLE t1 USING INDEX t1x1 (ptime>?)} 0 1 1 {SEARCH TABLE t2 USING INDEX t2x0 (did=?)} 0 2 0 {SEARCH TABLE t3 USING INDEX t3x0 (uid=?)}}
+
+finish_test