Index: third_party/sqlite/sqlite-src-3080704/test/autoindex2.test |
diff --git a/third_party/sqlite/sqlite-src-3080704/test/autoindex2.test b/third_party/sqlite/sqlite-src-3080704/test/autoindex2.test |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f4da416745ce33b04dcebd47416bfb19ec3bd4c3 |
--- /dev/null |
+++ b/third_party/sqlite/sqlite-src-3080704/test/autoindex2.test |
@@ -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 |