1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-29 08:01:23 +03:00

Modifications to test cases to account for new EXPLAIN QUERY PLAN output.

FossilOrigin-Name: 30904ef8412348464e893e9e1551ef22cad24a3e
This commit is contained in:
dan
2010-11-11 10:36:25 +00:00
parent 22c6a595b1
commit 47eb16d4ce
14 changed files with 455 additions and 412 deletions

View File

@ -1,5 +1,5 @@
C Merge\swith\slatest\strunk\schanges. C Modifications\sto\stest\scases\sto\saccount\sfor\snew\sEXPLAIN\sQUERY\sPLAN\soutput.
D 2010-11-09T17:49:40 D 2010-11-11T10:36:26
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in e7a59672eaeb04408d1fa8501618d7501a3c5e39 F Makefile.in e7a59672eaeb04408d1fa8501618d7501a3c5e39
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@ -264,7 +264,7 @@ F test/auth.test 26cc6f219580191539bf335abe03e55e49310846
F test/auth2.test 270baddc8b9c273682760cffba6739d907bd2882 F test/auth2.test 270baddc8b9c273682760cffba6739d907bd2882
F test/auth3.test a4755e6a2a2fea547ffe63c874eb569e60a28eb5 F test/auth3.test a4755e6a2a2fea547ffe63c874eb569e60a28eb5
F test/autoinc.test 85ef3180a737e6580086a018c09c6f1a52759b46 F test/autoinc.test 85ef3180a737e6580086a018c09c6f1a52759b46
F test/autoindex1.test 744ad86deb6d323236dad23364fbd6465bddb7cd F test/autoindex1.test 4400c3e123c25b83d48974ad612c4d2e9e6fa940
F test/autovacuum.test bb7c0885e6f8f1d633045de48f2b66082162766d F test/autovacuum.test bb7c0885e6f8f1d633045de48f2b66082162766d
F test/autovacuum_ioerr2.test 598b0663074d3673a9c1bc9a16e80971313bafe6 F test/autovacuum_ioerr2.test 598b0663074d3673a9c1bc9a16e80971313bafe6
F test/avtrans.test 0252654f4295ddda3b2cce0e894812259e655a85 F test/avtrans.test 0252654f4295ddda3b2cce0e894812259e655a85
@ -350,10 +350,10 @@ F test/descidx2.test 9f1a0c83fd57f8667c82310ca21b30a350888b5d
F test/descidx3.test fe720e8b37d59f4cef808b0bf4e1b391c2e56b6f F test/descidx3.test fe720e8b37d59f4cef808b0bf4e1b391c2e56b6f
F test/diskfull.test 0cede7ef9d8f415d9d3944005c76be7589bb5ebb F test/diskfull.test 0cede7ef9d8f415d9d3944005c76be7589bb5ebb
F test/distinctagg.test 1a6ef9c87a58669438fc771450d7a72577417376 F test/distinctagg.test 1a6ef9c87a58669438fc771450d7a72577417376
F test/e_createtable.test 049dcbd95e66bc3255338db30b375b825d894f7a F test/e_createtable.test 0aa5dadca80684d6f497d706ac69112019f6704b
F test/e_delete.test 55d868b647acc091c261a10b9b0cb0ab660a6acb F test/e_delete.test 55d868b647acc091c261a10b9b0cb0ab660a6acb
F test/e_expr.test 4e004d1f5187d4bbc9ca3d55660a8d164dd59f4e F test/e_expr.test 4e004d1f5187d4bbc9ca3d55660a8d164dd59f4e
F test/e_fkey.test 6721a741c6499b3ab7e5385923233343c8f1ad05 F test/e_fkey.test 64e69327091444471a14f854b2e297c5039c47ab
F test/e_fts3.test 75bb0aee26384ef586165e21018a17f7cd843469 F test/e_fts3.test 75bb0aee26384ef586165e21018a17f7cd843469
F test/e_insert.test 7390c2da39f16a134dc9a439144768c727757d2c F test/e_insert.test 7390c2da39f16a134dc9a439144768c727757d2c
F test/e_reindex.test a064f0878b8f848fbca38f1f61f82f15a3000c64 F test/e_reindex.test a064f0878b8f848fbca38f1f61f82f15a3000c64
@ -365,7 +365,7 @@ F test/enc.test e54531cd6bf941ee6760be041dff19a104c7acea
F test/enc2.test 6d91a5286f59add0cfcbb2d0da913b76f2242398 F test/enc2.test 6d91a5286f59add0cfcbb2d0da913b76f2242398
F test/enc3.test 5c550d59ff31dccdba5d1a02ae11c7047d77c041 F test/enc3.test 5c550d59ff31dccdba5d1a02ae11c7047d77c041
F test/enc4.test 4b575ef09e0eff896e73bd24076f96c2aa6a42de F test/enc4.test 4b575ef09e0eff896e73bd24076f96c2aa6a42de
F test/eqp.test a63c03a35c335738ceac83cd5bf05ce622b65619 F test/eqp.test b573765656ce6488b9ca579baaa27c4600e3ec00
F test/eval.test bc269c365ba877554948441e91ad5373f9f91be3 F test/eval.test bc269c365ba877554948441e91ad5373f9f91be3
F test/exclusive.test 53e1841b422e554cecf0160f937c473d6d0e3062 F test/exclusive.test 53e1841b422e554cecf0160f937c473d6d0e3062
F test/exclusive2.test 76e63c05349cb70d09d60b99d2ae625525ff5155 F test/exclusive2.test 76e63c05349cb70d09d60b99d2ae625525ff5155
@ -444,7 +444,7 @@ F test/fts3expr.test 5e745b2b6348499d9ef8d59015de3182072c564c
F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a
F test/fts3fault.test 2c8c26f9002be900056b63996a2891a043775f7b F test/fts3fault.test 2c8c26f9002be900056b63996a2891a043775f7b
F test/fts3malloc.test 9c8cc3f885bb4dfc66d0460c52f68f45e4710d1b F test/fts3malloc.test 9c8cc3f885bb4dfc66d0460c52f68f45e4710d1b
F test/fts3matchinfo.test 5ded93253526033c662ec49c696e936da4e8885d F test/fts3matchinfo.test 211b04434926bce9cc2b3cc5f58725affefe5165
F test/fts3near.test 2e318ee434d32babd27c167142e2b94ddbab4844 F test/fts3near.test 2e318ee434d32babd27c167142e2b94ddbab4844
F test/fts3query.test 724a662dbbec4e9dbef66a1389588aa29aeb9b27 F test/fts3query.test 724a662dbbec4e9dbef66a1389588aa29aeb9b27
F test/fts3rnd.test 707533ce943f490443ce5e696236bb1675a37635 F test/fts3rnd.test 707533ce943f490443ce5e696236bb1675a37635
@ -476,7 +476,7 @@ F test/incrvacuum_ioerr.test 57d2f5777ab13fa03b87b262a4ea1bad5cfc0291
F test/index.test df7c00c6edd9504ab71c83a9514f1c5ca0fa54d8 F test/index.test df7c00c6edd9504ab71c83a9514f1c5ca0fa54d8
F test/index2.test ee83c6b5e3173a3d7137140d945d9a5d4fdfb9d6 F test/index2.test ee83c6b5e3173a3d7137140d945d9a5d4fdfb9d6
F test/index3.test 423a25c789fc8cc51aaf2a4370bbdde2d9e9eed7 F test/index3.test 423a25c789fc8cc51aaf2a4370bbdde2d9e9eed7
F test/indexedby.test 5a1180602f2e72c481467bd4cae05dae5dc36f47 F test/indexedby.test cd78133723657b02d113670791a899e400ec170c
F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7
F test/insert.test aef273dd1cee84cc92407469e6bd1b3cdcb76908 F test/insert.test aef273dd1cee84cc92407469e6bd1b3cdcb76908
F test/insert2.test 4f3a04d168c728ed5ec2c88842e772606c7ce435 F test/insert2.test 4f3a04d168c728ed5ec2c88842e772606c7ce435
@ -656,7 +656,7 @@ F test/tclsqlite.test 8c154101e704170c2be10f137a5499ac2c6da8d3
F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c
F test/temptable.test f42121a0d29a62f00f93274464164177ab1cc24a F test/temptable.test f42121a0d29a62f00f93274464164177ab1cc24a
F test/temptrigger.test b0273db072ce5f37cf19140ceb1f0d524bbe9f05 F test/temptrigger.test b0273db072ce5f37cf19140ceb1f0d524bbe9f05
F test/tester.tcl fa48313dcf20f9c6def1af485e284e29100d709e F test/tester.tcl 8c26ecddb981aba189edad7ca1e6d780306ccca4
F test/thread001.test a3e6a7254d1cb057836cb3145b60c10bf5b7e60f F test/thread001.test a3e6a7254d1cb057836cb3145b60c10bf5b7e60f
F test/thread002.test afd20095e6e845b405df4f2c920cb93301ca69db F test/thread002.test afd20095e6e845b405df4f2c920cb93301ca69db
F test/thread003.test b824d4f52b870ae39fc5bae4d8070eca73085dca F test/thread003.test b824d4f52b870ae39fc5bae4d8070eca73085dca
@ -679,7 +679,7 @@ F test/tkt-3fe897352e.test 10de1a67bd5c66b238a4c96abe55531b37bb4f00
F test/tkt-4a03edc4c8.test 2865e4edbc075b954daa82f8da7cc973033ec76e F test/tkt-4a03edc4c8.test 2865e4edbc075b954daa82f8da7cc973033ec76e
F test/tkt-5e10420e8d.test 904d1687b3c06d43e5b3555bbcf6802e7c0ffd84 F test/tkt-5e10420e8d.test 904d1687b3c06d43e5b3555bbcf6802e7c0ffd84
F test/tkt-5ee23731f.test 3581260f2a71e51db94e1506ba6b0f7311d002a9 F test/tkt-5ee23731f.test 3581260f2a71e51db94e1506ba6b0f7311d002a9
F test/tkt-78e04e52ea.test fb5430c675e708f5cbafdf3e7e5593da5145a527 F test/tkt-78e04e52ea.test 567dcb06c6c2885d0e5430d2ed3ec9bb563cc2b7
F test/tkt-80e031a00f.test 9a154173461a4dbe2de49cda73963e04842d52f7 F test/tkt-80e031a00f.test 9a154173461a4dbe2de49cda73963e04842d52f7
F test/tkt-8454a207b9.test c583a9f814a82a2b5ba95207f55001c9f0cd816c F test/tkt-8454a207b9.test c583a9f814a82a2b5ba95207f55001c9f0cd816c
F test/tkt-94c04eaadb.test be5ea61cb04dfdc047d19b5c5a9e75fa3da67a7f F test/tkt-94c04eaadb.test be5ea61cb04dfdc047d19b5c5a9e75fa3da67a7f
@ -740,7 +740,7 @@ F test/tkt3346.test 6f67c3ed7db94dfc5df4f5f0b63809a1f611e01a
F test/tkt3357.test 77c37c6482b526fe89941ce951c22d011f5922ed F test/tkt3357.test 77c37c6482b526fe89941ce951c22d011f5922ed
F test/tkt3419.test 1bbf36d7ea03b638c15804251287c2391f5c1f6b F test/tkt3419.test 1bbf36d7ea03b638c15804251287c2391f5c1f6b
F test/tkt3424.test 61f831bd2b071bd128fa5d00fbda57e656ca5812 F test/tkt3424.test 61f831bd2b071bd128fa5d00fbda57e656ca5812
F test/tkt3442.test 89d7b41a4ec4d9d9b40ab8575d648579fb13cb4f F test/tkt3442.test b88362e90270f4c7c35eb27d529e9d68c185747b
F test/tkt3457.test edbf54b05cbe5165f00192becbd621038f1615e4 F test/tkt3457.test edbf54b05cbe5165f00192becbd621038f1615e4
F test/tkt3461.test 228ea328a5a21e8663f80ee3d212a6ad92549a19 F test/tkt3461.test 228ea328a5a21e8663f80ee3d212a6ad92549a19
F test/tkt3493.test 1686cbde85f8721fc1bdc0ee72f2ef2f63139218 F test/tkt3493.test 1686cbde85f8721fc1bdc0ee72f2ef2f63139218
@ -842,14 +842,14 @@ F test/walslow.test d21625e2e99e11c032ce949e8a94661576548933
F test/walthread.test a25a393c068a2b42b44333fa3fdaae9072f1617c F test/walthread.test a25a393c068a2b42b44333fa3fdaae9072f1617c
F test/where.test de337a3fe0a459ec7c93db16a519657a90552330 F test/where.test de337a3fe0a459ec7c93db16a519657a90552330
F test/where2.test 43d4becaf5a5df854e6c21d624a1cb84c6904554 F test/where2.test 43d4becaf5a5df854e6c21d624a1cb84c6904554
F test/where3.test 3a72db38e8804b210e9f72001ea16830fea74b4b F test/where3.test 6fc33631b7350b2c4066f835d4f994149ddd0a1d
F test/where4.test e9b9e2f2f98f00379e6031db6a6fca29bae782a2 F test/where4.test e9b9e2f2f98f00379e6031db6a6fca29bae782a2
F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2 F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2
F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b
F test/where7.test 221fd05b26be4529647c72ef7de5df646482c675 F test/where7.test 23ad8b8bee5f2feb3f0118b09fe9ef5fcfa5a944
F test/where8.test a6c740fd286d7883e274e17b6230a9d672a7ab1f F test/where8.test a6c740fd286d7883e274e17b6230a9d672a7ab1f
F test/where8m.test da346596e19d54f0aba35ebade032a7c47d79739 F test/where8m.test da346596e19d54f0aba35ebade032a7c47d79739
F test/where9.test be19e1a92f80985c1a121b4678bf7d2123eaa623 F test/where9.test 2fa750f5f38375f4553b629d76d4dd903224150e
F test/whereA.test 24c234263c8fe358f079d5e57d884fb569d2da0a F test/whereA.test 24c234263c8fe358f079d5e57d884fb569d2da0a
F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5 F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5
F test/wherelimit.test 5e9fd41e79bb2b2d588ed999d641d9c965619b31 F test/wherelimit.test 5e9fd41e79bb2b2d588ed999d641d9c965619b31
@ -886,7 +886,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
P 925f35c535396603e13bb12e9a361072e2c2c223 07da0a0beffda324d28fd2768c542ff69d4dbff2 P 4b5c93bc7c43c80962ddae65c58037bf5977b94b
R 98f45325ff5bf8617f39993671305af2 R abe563ec3b08e8fc639bf3759f538194
U dan U dan
Z 311ea247f8fb626376cb7304b92a0778 Z ed52cc8c7203a66253060e18a9474729

View File

@ -1 +1 @@
4b5c93bc7c43c80962ddae65c58037bf5977b94b 30904ef8412348464e893e9e1551ef22cad24a3e

View File

@ -140,30 +140,36 @@ do_test autoindex1-401 {
# Make sure automatic indices are not created for the RHS of an IN expression # Make sure automatic indices are not created for the RHS of an IN expression
# that is not a correlated subquery. # that is not a correlated subquery.
# #
do_test autoindex1-500 { do_execsql_test autoindex1-500 {
db eval { CREATE TABLE t501(a INTEGER PRIMARY KEY, b);
CREATE TABLE t501(a INTEGER PRIMARY KEY, b); CREATE TABLE t502(x INTEGER PRIMARY KEY, y);
CREATE TABLE t502(x INTEGER PRIMARY KEY, y); EXPLAIN QUERY PLAN
EXPLAIN QUERY PLAN SELECT b FROM t501
SELECT b FROM t501 WHERE t501.a IN (SELECT x FROM t502 WHERE y=?);
WHERE t501.a IN (SELECT x FROM t502 WHERE y=?); } {
} 0 0 0 {SCAN TABLE t501 BY INTEGER PRIMARY KEY (rowid=?) (~25 rows)}
} {0 0 {TABLE t501 USING PRIMARY KEY} 0 0 {TABLE t502}} 0 0 0 {EXECUTE LIST SUBQUERY 1}
do_test autoindex1-501 { 1 0 0 {SCAN TABLE t502 (~100000 rows)}
db eval { }
EXPLAIN QUERY PLAN do_execsql_test autoindex1-501 {
SELECT b FROM t501 EXPLAIN QUERY PLAN
WHERE t501.a IN (SELECT x FROM t502 WHERE y=t501.b); SELECT b FROM t501
} WHERE t501.a IN (SELECT x FROM t502 WHERE y=t501.b);
} {0 0 {TABLE t501} 0 0 {TABLE t502 WITH AUTOMATIC INDEX}} } {
do_test autoindex1-502 { 0 0 0 {SCAN TABLE t501 (~500000 rows)}
db eval { 0 0 0 {EXECUTE CORRELATED LIST SUBQUERY 1}
EXPLAIN QUERY PLAN 1 0 0 {SCAN TABLE t502 BY AUTOMATIC COVERING INDEX (y=?) (~7 rows)}
SELECT b FROM t501 }
WHERE t501.a=123 do_execsql_test autoindex1-502 {
AND t501.a IN (SELECT x FROM t502 WHERE y=t501.b); EXPLAIN QUERY PLAN
} SELECT b FROM t501
} {0 0 {TABLE t501 USING PRIMARY KEY} 0 0 {TABLE t502}} WHERE t501.a=123
AND t501.a IN (SELECT x FROM t502 WHERE y=t501.b);
} {
0 0 0 {SCAN TABLE t501 BY INTEGER PRIMARY KEY (rowid=?) (~1 rows)}
0 0 0 {EXECUTE CORRELATED LIST SUBQUERY 1}
1 0 0 {SCAN TABLE t502 (~100000 rows)}
}
# The following code checks a performance regression reported on the # The following code checks a performance regression reported on the
@ -172,69 +178,74 @@ do_test autoindex1-502 {
# automatic index was being created for the emphemeral table when it was # automatic index was being created for the emphemeral table when it was
# used as part of a join. # used as part of a join.
# #
do_test autoindex1-600 { do_execsql_test autoindex1-600 {
db eval { CREATE TABLE flock_owner(
CREATE TABLE flock_owner( owner_rec_id INTEGER CONSTRAINT flock_owner_key PRIMARY KEY,
owner_rec_id INTEGER CONSTRAINT flock_owner_key PRIMARY KEY, flock_no VARCHAR(6) NOT NULL REFERENCES flock (flock_no),
flock_no VARCHAR(6) NOT NULL REFERENCES flock (flock_no), owner_person_id INTEGER NOT NULL REFERENCES person (person_id),
owner_person_id INTEGER NOT NULL REFERENCES person (person_id), owner_change_date TEXT, last_changed TEXT NOT NULL,
owner_change_date TEXT, last_changed TEXT NOT NULL, CONSTRAINT fo_owner_date UNIQUE (flock_no, owner_change_date)
CONSTRAINT fo_owner_date UNIQUE (flock_no, owner_change_date) );
); CREATE TABLE sheep (
CREATE TABLE sheep ( Sheep_No char(7) NOT NULL,
Sheep_No char(7) NOT NULL, Date_of_Birth char(8),
Date_of_Birth char(8), Sort_DoB text,
Sort_DoB text, Flock_Book_Vol char(2),
Flock_Book_Vol char(2), Breeder_No char(6),
Breeder_No char(6), Breeder_Person integer,
Breeder_Person integer, Originating_Flock char(6),
Originating_Flock char(6), Registering_Flock char(6),
Registering_Flock char(6), Tag_Prefix char(9),
Tag_Prefix char(9), Tag_No char(15),
Tag_No char(15), Sort_Tag_No integer,
Sort_Tag_No integer, Breeders_Temp_Tag char(15),
Breeders_Temp_Tag char(15), Sex char(1),
Sex char(1), Sheep_Name char(32),
Sheep_Name char(32), Sire_No char(7),
Sire_No char(7), Dam_No char(7),
Dam_No char(7), Register_Code char(1),
Register_Code char(1), Colour char(48),
Colour char(48), Colour_Code char(2),
Colour_Code char(2), Pattern_Code char(8),
Pattern_Code char(8), Horns char(1),
Horns char(1), Litter_Size char(1),
Litter_Size char(1), Coeff_of_Inbreeding real,
Coeff_of_Inbreeding real, Date_of_Registration text,
Date_of_Registration text, Date_Last_Changed text,
Date_Last_Changed text, UNIQUE(Sheep_No));
UNIQUE(Sheep_No)); CREATE INDEX fo_flock_no_index
CREATE INDEX fo_flock_no_index ON flock_owner (flock_no);
ON flock_owner (flock_no); CREATE INDEX fo_owner_change_date_index
CREATE INDEX fo_owner_change_date_index ON flock_owner (owner_change_date);
ON flock_owner (owner_change_date); CREATE INDEX fo_owner_person_id_index
CREATE INDEX fo_owner_person_id_index ON flock_owner (owner_person_id);
ON flock_owner (owner_person_id); CREATE INDEX sheep_org_flock_index
CREATE INDEX sheep_org_flock_index ON sheep (originating_flock);
ON sheep (originating_flock); CREATE INDEX sheep_reg_flock_index
CREATE INDEX sheep_reg_flock_index ON sheep (registering_flock);
ON sheep (registering_flock); EXPLAIN QUERY PLAN
EXPLAIN QUERY PLAN SELECT x.sheep_no, x.registering_flock, x.date_of_registration
SELECT x.sheep_no, x.registering_flock, x.date_of_registration FROM sheep x LEFT JOIN
FROM sheep x LEFT JOIN (SELECT s.sheep_no, prev.flock_no, prev.owner_person_id,
(SELECT s.sheep_no, prev.flock_no, prev.owner_person_id, s.date_of_registration, prev.owner_change_date
s.date_of_registration, prev.owner_change_date FROM sheep s JOIN flock_owner prev ON s.registering_flock =
FROM sheep s JOIN flock_owner prev ON s.registering_flock = prev.flock_no
prev.flock_no AND (prev.owner_change_date <= s.date_of_registration || ' 00:00:00')
AND (prev.owner_change_date <= s.date_of_registration || ' 00:00:00') WHERE NOT EXISTS
WHERE NOT EXISTS (SELECT 'x' FROM flock_owner later
(SELECT 'x' FROM flock_owner later WHERE prev.flock_no = later.flock_no
WHERE prev.flock_no = later.flock_no AND later.owner_change_date > prev.owner_change_date
AND later.owner_change_date > prev.owner_change_date AND later.owner_change_date <= s.date_of_registration||' 00:00:00')
AND later.owner_change_date <= s.date_of_registration||' 00:00:00') ) y ON x.sheep_no = y.sheep_no
) y ON x.sheep_no = y.sheep_no WHERE y.sheep_no IS NULL
WHERE y.sheep_no IS NULL ORDER BY x.registering_flock;
ORDER BY x.registering_flock; } {
} 1 0 0 {SCAN TABLE sheep AS s (~1000000 rows)}
} {0 0 {TABLE sheep AS s} 1 1 {TABLE flock_owner AS prev WITH INDEX sqlite_autoindex_flock_owner_1} 0 0 {TABLE flock_owner AS later WITH INDEX sqlite_autoindex_flock_owner_1} 0 0 {TABLE sheep AS x WITH INDEX sheep_reg_flock_index ORDER BY} 1 1 {TABLE AS y WITH AUTOMATIC INDEX}} 1 1 1 {SCAN TABLE flock_owner AS prev BY INDEX sqlite_autoindex_flock_owner_1 (flock_no=? AND flock_no<?) (~2 rows)}
1 0 0 {EXECUTE CORRELATED SCALAR SUBQUERY 2}
2 0 0 {SCAN TABLE flock_owner AS later BY COVERING INDEX sqlite_autoindex_flock_owner_1 (flock_no=? AND flock_no>? AND flock_no<?) (~1 rows)}
0 0 0 {SCAN TABLE sheep AS x BY INDEX sheep_reg_flock_index (~1000000 rows)}
0 1 1 {SCAN SUBQUERY 1 AS y BY AUTOMATIC COVERING INDEX (sheep_no=?) (~7 rows)}
}
finish_test finish_test

View File

@ -1373,13 +1373,13 @@ do_execsql_test 4.10.0 {
} }
do_createtable_tests 4.10 { do_createtable_tests 4.10 {
1 "EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b = 5" 1 "EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b = 5"
{0 0 {TABLE t1 WITH INDEX sqlite_autoindex_t1_1}} {0 0 0 {SCAN TABLE t1 BY INDEX sqlite_autoindex_t1_1 (b=?) (~1 rows)}}
2 "EXPLAIN QUERY PLAN SELECT * FROM t2 ORDER BY b, c" 2 "EXPLAIN QUERY PLAN SELECT * FROM t2 ORDER BY b, c"
{0 0 {TABLE t2 WITH INDEX sqlite_autoindex_t2_1 ORDER BY}} {0 0 0 {SCAN TABLE t2 BY INDEX sqlite_autoindex_t2_1 (~1000000 rows)}}
3 "EXPLAIN QUERY PLAN SELECT * FROM t2 WHERE b=10 AND c>10" 3 "EXPLAIN QUERY PLAN SELECT * FROM t2 WHERE b=10 AND c>10"
{0 0 {TABLE t2 WITH INDEX sqlite_autoindex_t2_1}} {0 0 0 {SCAN TABLE t2 BY INDEX sqlite_autoindex_t2_1 (b=? AND b>?) (~3 rows)}}
} }
# EVIDENCE-OF: R-45493-35653 A CHECK constraint may be attached to a # EVIDENCE-OF: R-45493-35653 A CHECK constraint may be attached to a

View File

@ -968,19 +968,21 @@ do_test e_fkey-25.1 {
); );
} }
} {} } {}
do_test e_fkey-25.2 { do_execsql_test e_fkey-25.2 {
execsql { PRAGMA foreign_keys = OFF;
PRAGMA foreign_keys = OFF; EXPLAIN QUERY PLAN DELETE FROM artist WHERE 1;
EXPLAIN QUERY PLAN DELETE FROM artist WHERE 1; EXPLAIN QUERY PLAN SELECT rowid FROM track WHERE trackartist = ?;
EXPLAIN QUERY PLAN SELECT rowid FROM track WHERE trackartist = ?; } {
} 0 0 0 {SCAN TABLE artist (~1000000 rows)}
} {0 0 {TABLE artist} 0 0 {TABLE track}} 0 0 0 {SCAN TABLE track (~100000 rows)}
do_test e_fkey-25.3 { }
execsql { do_execsql_test e_fkey-25.3 {
PRAGMA foreign_keys = ON; PRAGMA foreign_keys = ON;
EXPLAIN QUERY PLAN DELETE FROM artist WHERE 1; EXPLAIN QUERY PLAN DELETE FROM artist WHERE 1;
} } {
} {0 0 {TABLE artist} 0 0 {TABLE track}} 0 0 0 {SCAN TABLE artist (~1000000 rows)}
0 0 0 {SCAN TABLE track (~100000 rows)}
}
do_test e_fkey-25.4 { do_test e_fkey-25.4 {
execsql { execsql {
INSERT INTO artist VALUES(5, 'artist 5'); INSERT INTO artist VALUES(5, 'artist 5');
@ -1093,19 +1095,19 @@ do_test e_fkey-27.1 {
do_test e_fkey-27.2 { do_test e_fkey-27.2 {
eqp { INSERT INTO artist VALUES(?, ?) } eqp { INSERT INTO artist VALUES(?, ?) }
} {} } {}
do_test e_fkey-27.3 { do_execsql_test e_fkey-27.3 {
eqp { UPDATE artist SET artistid = ?, artistname = ? } EXPLAIN QUERY PLAN UPDATE artist SET artistid = ?, artistname = ?
} [list \ } {
0 0 {TABLE artist} \ 0 0 0 {SCAN TABLE artist (~1000000 rows)}
0 0 {TABLE track WITH INDEX trackindex} \ 0 0 0 {SCAN TABLE track BY COVERING INDEX trackindex (trackartist=?) (~10 rows)}
0 0 {TABLE track WITH INDEX trackindex} 0 0 0 {SCAN TABLE track BY COVERING INDEX trackindex (trackartist=?) (~10 rows)}
] }
do_test e_fkey-27.4 { do_execsql_test e_fkey-27.4 {
eqp { DELETE FROM artist } EXPLAIN QUERY PLAN DELETE FROM artist
} [list \ } {
0 0 {TABLE artist} \ 0 0 0 {SCAN TABLE artist (~1000000 rows)}
0 0 {TABLE track WITH INDEX trackindex} 0 0 0 {SCAN TABLE track BY COVERING INDEX trackindex (trackartist=?) (~10 rows)}
] }
########################################################################### ###########################################################################

View File

@ -188,6 +188,28 @@ det 3.2.2 {
0 0 0 {USE TEMP B-TREE FOR ORDER BY} 0 0 0 {USE TEMP B-TREE FOR ORDER BY}
} }
det 3.3.1 {
SELECT * FROM t1 WHERE y IN (SELECT y FROM t2)
} {
0 0 0 {SCAN TABLE t1 (~100000 rows)}
0 0 0 {EXECUTE LIST SUBQUERY 1}
1 0 0 {SCAN TABLE t2 (~1000000 rows)}
}
det 3.3.2 {
SELECT * FROM t1 WHERE y IN (SELECT y FROM t2 WHERE t1.x!=t2.x)
} {
0 0 0 {SCAN TABLE t1 (~500000 rows)}
0 0 0 {EXECUTE CORRELATED LIST SUBQUERY 1}
1 0 0 {SCAN TABLE t2 (~500000 rows)}
}
det 3.3.3 {
SELECT * FROM t1 WHERE EXISTS (SELECT y FROM t2 WHERE t1.x!=t2.x)
} {
0 0 0 {SCAN TABLE t1 (~500000 rows)}
0 0 0 {EXECUTE CORRELATED SCALAR SUBQUERY 1}
1 0 0 {SCAN TABLE t2 (~500000 rows)}
}
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# Test cases eqp-4.* - tests for composite select statements. # Test cases eqp-4.* - tests for composite select statements.
# #

View File

@ -15,6 +15,9 @@
set testdir [file dirname $argv0] set testdir [file dirname $argv0]
source $testdir/tester.tcl source $testdir/tester.tcl
# If SQLITE_ENABLE_FTS3 is not defined, omit this file.
ifcapable !fts3 { finish_test ; return }
set testprefix fts3matchinfo set testprefix fts3matchinfo
proc mit {blob} { proc mit {blob} {

View File

@ -40,15 +40,18 @@ proc EQP {sql} {
# These tests are to check that "EXPLAIN QUERY PLAN" is working as expected. # These tests are to check that "EXPLAIN QUERY PLAN" is working as expected.
# #
do_test indexedby-1.2 { do_execsql_test indexedby-1.2 {
EQP { select * from t1 WHERE a = 10; } EXPLAIN QUERY PLAN select * from t1 WHERE a = 10;
} {0 0 {TABLE t1 WITH INDEX i1}} } {0 0 0 {SCAN TABLE t1 BY INDEX i1 (a=?) (~10 rows)}}
do_test indexedby-1.3 { do_execsql_test indexedby-1.3 {
EQP { select * from t1 ; } EXPLAIN QUERY PLAN select * from t1 ;
} {0 0 {TABLE t1}} } {0 0 0 {SCAN TABLE t1 (~1000000 rows)}}
do_test indexedby-1.4 { do_execsql_test indexedby-1.4 {
EQP { select * from t1, t2 WHERE c = 10; } EXPLAIN QUERY PLAN select * from t1, t2 WHERE c = 10;
} {0 1 {TABLE t2 WITH INDEX i3} 1 0 {TABLE t1}} } {
0 0 1 {SCAN TABLE t2 BY INDEX i3 (c=?) (~10 rows)}
0 1 0 {SCAN TABLE t1 (~1000000 rows)}
}
# Parser tests. Test that an INDEXED BY or NOT INDEX clause can be # Parser tests. Test that an INDEXED BY or NOT INDEX clause can be
# attached to a table in the FROM clause, but not to a sub-select or # attached to a table in the FROM clause, but not to a sub-select or
@ -80,15 +83,17 @@ do_test indexedby-2.7 {
# Tests for single table cases. # Tests for single table cases.
# #
do_test indexedby-3.1 { do_execsql_test indexedby-3.1 {
EQP { SELECT * FROM t1 NOT INDEXED WHERE a = 'one' AND b = 'two'} EXPLAIN QUERY PLAN SELECT * FROM t1 NOT INDEXED WHERE a = 'one' AND b = 'two'
} {0 0 {TABLE t1}} } {0 0 0 {SCAN TABLE t1 (~10000 rows)}}
do_test indexedby-3.2 { do_execsql_test indexedby-3.2 {
EQP { SELECT * FROM t1 INDEXED BY i1 WHERE a = 'one' AND b = 'two'} EXPLAIN QUERY PLAN
} {0 0 {TABLE t1 WITH INDEX i1}} SELECT * FROM t1 INDEXED BY i1 WHERE a = 'one' AND b = 'two'
do_test indexedby-3.3 { } {0 0 0 {SCAN TABLE t1 BY INDEX i1 (a=?) (~2 rows)}}
EQP { SELECT * FROM t1 INDEXED BY i2 WHERE a = 'one' AND b = 'two'} do_execsql_test indexedby-3.3 {
} {0 0 {TABLE t1 WITH INDEX i2}} EXPLAIN QUERY PLAN
SELECT * FROM t1 INDEXED BY i2 WHERE a = 'one' AND b = 'two'
} {0 0 0 {SCAN TABLE t1 BY INDEX i2 (b=?) (~2 rows)}}
do_test indexedby-3.4 { do_test indexedby-3.4 {
catchsql { SELECT * FROM t1 INDEXED BY i2 WHERE a = 'one' } catchsql { SELECT * FROM t1 INDEXED BY i2 WHERE a = 'one' }
} {1 {cannot use index: i2}} } {1 {cannot use index: i2}}
@ -102,12 +107,14 @@ do_test indexedby-3.7 {
catchsql { SELECT * FROM t1 INDEXED BY i1 ORDER BY a } catchsql { SELECT * FROM t1 INDEXED BY i1 ORDER BY a }
} {0 {}} } {0 {}}
do_test indexedby-3.8 { do_execsql_test indexedby-3.8 {
EQP { SELECT * FROM t3 INDEXED BY sqlite_autoindex_t3_1 ORDER BY e } EXPLAIN QUERY PLAN
} {0 0 {TABLE t3 WITH INDEX sqlite_autoindex_t3_1 ORDER BY}} SELECT * FROM t3 INDEXED BY sqlite_autoindex_t3_1 ORDER BY e
do_test indexedby-3.9 { } {0 0 0 {SCAN TABLE t3 BY INDEX sqlite_autoindex_t3_1 (~1000000 rows)}}
EQP { SELECT * FROM t3 INDEXED BY sqlite_autoindex_t3_1 WHERE e = 10 } do_execsql_test indexedby-3.9 {
} {0 0 {TABLE t3 WITH INDEX sqlite_autoindex_t3_1}} EXPLAIN QUERY PLAN
SELECT * FROM t3 INDEXED BY sqlite_autoindex_t3_1 WHERE e = 10
} {0 0 0 {SCAN TABLE t3 BY INDEX sqlite_autoindex_t3_1 (e=?) (~1 rows)}}
do_test indexedby-3.10 { do_test indexedby-3.10 {
catchsql { SELECT * FROM t3 INDEXED BY sqlite_autoindex_t3_1 WHERE f = 10 } catchsql { SELECT * FROM t3 INDEXED BY sqlite_autoindex_t3_1 WHERE f = 10 }
} {1 {cannot use index: sqlite_autoindex_t3_1}} } {1 {cannot use index: sqlite_autoindex_t3_1}}
@ -117,12 +124,18 @@ do_test indexedby-3.11 {
# Tests for multiple table cases. # Tests for multiple table cases.
# #
do_test indexedby-4.1 { do_execsql_test indexedby-4.1 {
EQP { SELECT * FROM t1, t2 WHERE a = c } EXPLAIN QUERY PLAN SELECT * FROM t1, t2 WHERE a = c
} {0 0 {TABLE t1} 1 1 {TABLE t2 WITH INDEX i3}} } {
do_test indexedby-4.2 { 0 0 0 {SCAN TABLE t1 (~1000000 rows)}
EQP { SELECT * FROM t1 INDEXED BY i1, t2 WHERE a = c } 0 1 1 {SCAN TABLE t2 BY INDEX i3 (c=?) (~10 rows)}
} {0 1 {TABLE t2} 1 0 {TABLE t1 WITH INDEX i1}} }
do_execsql_test indexedby-4.2 {
EXPLAIN QUERY PLAN SELECT * FROM t1 INDEXED BY i1, t2 WHERE a = c
} {
0 0 1 {SCAN TABLE t2 (~1000000 rows)}
0 1 0 {SCAN TABLE t1 BY INDEX i1 (a=?) (~10 rows)}
}
do_test indexedby-4.3 { do_test indexedby-4.3 {
catchsql { catchsql {
SELECT * FROM t1 INDEXED BY i1, t2 INDEXED BY i3 WHERE a=c SELECT * FROM t1 INDEXED BY i1, t2 INDEXED BY i3 WHERE a=c
@ -138,15 +151,13 @@ do_test indexedby-4.4 {
# also tests that nothing bad happens if an index refered to by # also tests that nothing bad happens if an index refered to by
# a CREATE VIEW statement is dropped and recreated. # a CREATE VIEW statement is dropped and recreated.
# #
do_test indexedby-5.1 { do_execsql_test indexedby-5.1 {
execsql { CREATE VIEW v2 AS SELECT * FROM t1 INDEXED BY i1 WHERE a > 5;
CREATE VIEW v2 AS SELECT * FROM t1 INDEXED BY i1 WHERE a > 5; EXPLAIN QUERY PLAN SELECT * FROM v2
} } {0 0 0 {SCAN TABLE t1 BY INDEX i1 (a>?) (~330000 rows)}}
EQP { SELECT * FROM v2 } do_execsql_test indexedby-5.2 {
} {0 0 {TABLE t1 WITH INDEX i1}} EXPLAIN QUERY PLAN SELECT * FROM v2 WHERE b = 10
do_test indexedby-5.2 { } {0 0 0 {SCAN TABLE t1 BY INDEX i1 (a>?) (~33000 rows)}}
EQP { SELECT * FROM v2 WHERE b = 10 }
} {0 0 {TABLE t1 WITH INDEX i1}}
do_test indexedby-5.3 { do_test indexedby-5.3 {
execsql { DROP INDEX i1 } execsql { DROP INDEX i1 }
catchsql { SELECT * FROM v2 } catchsql { SELECT * FROM v2 }
@ -165,51 +176,53 @@ do_test indexedby-5.5 {
# Test that "NOT INDEXED" may use the rowid index, but not others. # Test that "NOT INDEXED" may use the rowid index, but not others.
# #
do_test indexedby-6.1 { do_execsql_test indexedby-6.1 {
EQP { SELECT * FROM t1 WHERE b = 10 ORDER BY rowid } EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b = 10 ORDER BY rowid
} {0 0 {TABLE t1 WITH INDEX i2 ORDER BY}} } {0 0 0 {SCAN TABLE t1 BY INDEX i2 (b=?) (~10 rows)}}
do_test indexedby-6.2 { do_execsql_test indexedby-6.2 {
EQP { SELECT * FROM t1 NOT INDEXED WHERE b = 10 ORDER BY rowid } EXPLAIN QUERY PLAN SELECT * FROM t1 NOT INDEXED WHERE b = 10 ORDER BY rowid
} {0 0 {TABLE t1 USING PRIMARY KEY ORDER BY}} } {0 0 0 {SCAN TABLE t1 BY INTEGER PRIMARY KEY (~100000 rows)}}
# Test that "INDEXED BY" can be used in a DELETE statement. # Test that "INDEXED BY" can be used in a DELETE statement.
# #
do_test indexedby-7.1 { do_execsql_test indexedby-7.1 {
EQP { DELETE FROM t1 WHERE a = 5 } EXPLAIN QUERY PLAN DELETE FROM t1 WHERE a = 5
} {0 0 {TABLE t1 WITH INDEX i1}} } {0 0 0 {SCAN TABLE t1 BY COVERING INDEX i1 (a=?) (~10 rows)}}
do_test indexedby-7.2 { do_execsql_test indexedby-7.2 {
EQP { DELETE FROM t1 NOT INDEXED WHERE a = 5 } EXPLAIN QUERY PLAN DELETE FROM t1 NOT INDEXED WHERE a = 5
} {0 0 {TABLE t1}} } {0 0 0 {SCAN TABLE t1 (~100000 rows)}}
do_test indexedby-7.3 { do_execsql_test indexedby-7.3 {
EQP { DELETE FROM t1 INDEXED BY i1 WHERE a = 5 } EXPLAIN QUERY PLAN DELETE FROM t1 INDEXED BY i1 WHERE a = 5
} {0 0 {TABLE t1 WITH INDEX i1}} } {0 0 0 {SCAN TABLE t1 BY COVERING INDEX i1 (a=?) (~10 rows)}}
do_test indexedby-7.4 { do_execsql_test indexedby-7.4 {
EQP { DELETE FROM t1 INDEXED BY i1 WHERE a = 5 AND b = 10} EXPLAIN QUERY PLAN DELETE FROM t1 INDEXED BY i1 WHERE a = 5 AND b = 10
} {0 0 {TABLE t1 WITH INDEX i1}} } {0 0 0 {SCAN TABLE t1 BY INDEX i1 (a=?) (~2 rows)}}
do_test indexedby-7.5 { do_execsql_test indexedby-7.5 {
EQP { DELETE FROM t1 INDEXED BY i2 WHERE a = 5 AND b = 10} EXPLAIN QUERY PLAN DELETE FROM t1 INDEXED BY i2 WHERE a = 5 AND b = 10
} {0 0 {TABLE t1 WITH INDEX i2}} } {0 0 0 {SCAN TABLE t1 BY INDEX i2 (b=?) (~2 rows)}}
do_test indexedby-7.6 { do_test indexedby-7.6 {
catchsql { DELETE FROM t1 INDEXED BY i2 WHERE a = 5} catchsql { DELETE FROM t1 INDEXED BY i2 WHERE a = 5}
} {1 {cannot use index: i2}} } {1 {cannot use index: i2}}
# Test that "INDEXED BY" can be used in an UPDATE statement. # Test that "INDEXED BY" can be used in an UPDATE statement.
# #
do_test indexedby-8.1 { do_execsql_test indexedby-8.1 {
EQP { UPDATE t1 SET rowid=rowid+1 WHERE a = 5 } EXPLAIN QUERY PLAN UPDATE t1 SET rowid=rowid+1 WHERE a = 5
} {0 0 {TABLE t1 WITH INDEX i1}} } {0 0 0 {SCAN TABLE t1 BY COVERING INDEX i1 (a=?) (~10 rows)}}
do_test indexedby-8.2 { do_execsql_test indexedby-8.2 {
EQP { UPDATE t1 NOT INDEXED SET rowid=rowid+1 WHERE a = 5 } EXPLAIN QUERY PLAN UPDATE t1 NOT INDEXED SET rowid=rowid+1 WHERE a = 5
} {0 0 {TABLE t1}} } {0 0 0 {SCAN TABLE t1 (~100000 rows)}}
do_test indexedby-8.3 { do_execsql_test indexedby-8.3 {
EQP { UPDATE t1 INDEXED BY i1 SET rowid=rowid+1 WHERE a = 5 } EXPLAIN QUERY PLAN UPDATE t1 INDEXED BY i1 SET rowid=rowid+1 WHERE a = 5
} {0 0 {TABLE t1 WITH INDEX i1}} } {0 0 0 {SCAN TABLE t1 BY COVERING INDEX i1 (a=?) (~10 rows)}}
do_test indexedby-8.4 { do_execsql_test indexedby-8.4 {
EQP { UPDATE t1 INDEXED BY i1 SET rowid=rowid+1 WHERE a = 5 AND b = 10} EXPLAIN QUERY PLAN
} {0 0 {TABLE t1 WITH INDEX i1}} UPDATE t1 INDEXED BY i1 SET rowid=rowid+1 WHERE a = 5 AND b = 10
do_test indexedby-8.5 { } {0 0 0 {SCAN TABLE t1 BY INDEX i1 (a=?) (~2 rows)}}
EQP { UPDATE t1 INDEXED BY i2 SET rowid=rowid+1 WHERE a = 5 AND b = 10} do_execsql_test indexedby-8.5 {
} {0 0 {TABLE t1 WITH INDEX i2}} EXPLAIN QUERY PLAN
UPDATE t1 INDEXED BY i2 SET rowid=rowid+1 WHERE a = 5 AND b = 10
} {0 0 0 {SCAN TABLE t1 BY INDEX i2 (b=?) (~2 rows)}}
do_test indexedby-8.6 { do_test indexedby-8.6 {
catchsql { UPDATE t1 INDEXED BY i2 SET rowid=rowid+1 WHERE a = 5} catchsql { UPDATE t1 INDEXED BY i2 SET rowid=rowid+1 WHERE a = 5}
} {1 {cannot use index: i2}} } {1 {cannot use index: i2}}

View File

@ -349,7 +349,7 @@ proc fix_testname {varname} {
proc do_execsql_test {testname sql {result {}}} { proc do_execsql_test {testname sql {result {}}} {
fix_testname testname fix_testname testname
uplevel do_test $testname [list "execsql {$sql}"] [list $result] uplevel do_test $testname [list "execsql {$sql}"] [list [list {*}$result]]
} }
proc do_catchsql_test {testname sql result} { proc do_catchsql_test {testname sql result} {
fix_testname testname fix_testname testname

View File

@ -44,7 +44,7 @@ do_test tkt-78e04-1.4 {
execsql { execsql {
EXPLAIN QUERY PLAN SELECT * FROM "" WHERE "" LIKE 'abc%'; EXPLAIN QUERY PLAN SELECT * FROM "" WHERE "" LIKE 'abc%';
} }
} {0 0 {TABLE }} } {0 0 0 {SCAN TABLE (~500000 rows)}}
do_test tkt-78e04-1.5 { do_test tkt-78e04-1.5 {
execsql { execsql {
DROP TABLE ""; DROP TABLE "";
@ -57,12 +57,12 @@ do_test tkt-78e04-2.1 {
CREATE INDEX "" ON t2(x); CREATE INDEX "" ON t2(x);
EXPLAIN QUERY PLAN SELECT * FROM t2 WHERE x=5; EXPLAIN QUERY PLAN SELECT * FROM t2 WHERE x=5;
} }
} {0 0 {TABLE t2 WITH INDEX }} } {0 0 0 {SCAN TABLE t2 BY COVERING INDEX (x=?) (~10 rows)}}
do_test tkt-78e04-2.2 { do_test tkt-78e04-2.2 {
execsql { execsql {
DROP INDEX ""; DROP INDEX "";
EXPLAIN QUERY PLAN SELECT * FROM t2 WHERE x=2; EXPLAIN QUERY PLAN SELECT * FROM t2 WHERE x=2;
} }
} {0 0 {TABLE t2}} } {0 0 0 {SCAN TABLE t2 (~100000 rows)}}
finish_test finish_test

View File

@ -49,10 +49,10 @@ proc EQP {sql} {
ifcapable explain { ifcapable explain {
do_test tkt3442-1.2 { do_test tkt3442-1.2 {
EQP { SELECT node FROM listhash WHERE id='5000' LIMIT 1; } EQP { SELECT node FROM listhash WHERE id='5000' LIMIT 1; }
} {0 0 {TABLE listhash WITH INDEX ididx}} } {0 0 0 {SCAN TABLE listhash BY INDEX ididx (id=?) (~1 rows)}}
do_test tkt3442-1.3 { do_test tkt3442-1.3 {
EQP { SELECT node FROM listhash WHERE id="5000" LIMIT 1; } EQP { SELECT node FROM listhash WHERE id="5000" LIMIT 1; }
} {0 0 {TABLE listhash WITH INDEX ididx}} } {0 0 0 {SCAN TABLE listhash BY INDEX ididx (id=?) (~1 rows)}}
} }
@ -61,7 +61,7 @@ ifcapable explain {
ifcapable explain { ifcapable explain {
do_test tkt3442-1.4 { do_test tkt3442-1.4 {
EQP { SELECT node FROM listhash WHERE id=5000 LIMIT 1; } EQP { SELECT node FROM listhash WHERE id=5000 LIMIT 1; }
} {0 0 {TABLE listhash WITH INDEX ididx}} } {0 0 0 {SCAN TABLE listhash BY INDEX ididx (id=?) (~1 rows)}}
} }
do_test tkt3442-1.5 { do_test tkt3442-1.5 {
catchsql { catchsql {

View File

@ -217,116 +217,129 @@ do_test where3-2.7 {
# the planner into use a table for the outer loop that might be indexable # the planner into use a table for the outer loop that might be indexable
# if held until an inner loop. # if held until an inner loop.
# #
do_test where3-3.0 { do_execsql_test where3-3.0 {
execsql { CREATE TABLE t301(a INTEGER PRIMARY KEY,b,c);
CREATE TABLE t301(a INTEGER PRIMARY KEY,b,c); CREATE INDEX t301c ON t301(c);
CREATE INDEX t301c ON t301(c); INSERT INTO t301 VALUES(1,2,3);
INSERT INTO t301 VALUES(1,2,3); CREATE TABLE t302(x, y);
CREATE TABLE t302(x, y); ANALYZE;
ANALYZE; explain query plan SELECT * FROM t302, t301 WHERE t302.x=5 AND t301.a=t302.y;
explain query plan } {
SELECT * FROM t302, t301 WHERE t302.x=5 AND t301.a=t302.y; 0 0 0 {SCAN TABLE t302 (~0 rows)}
} 0 1 1 {SCAN TABLE t301 BY INTEGER PRIMARY KEY (rowid=?) (~1 rows)}
} {0 0 {TABLE t302} 1 1 {TABLE t301 USING PRIMARY KEY}} }
do_test where3-3.1 { do_execsql_test where3-3.1 {
execsql { explain query plan
explain query plan SELECT * FROM t301, t302 WHERE t302.x=5 AND t301.a=t302.y;
SELECT * FROM t301, t302 WHERE t302.x=5 AND t301.a=t302.y; } {
} 0 0 1 {SCAN TABLE t302 (~0 rows)}
} {0 1 {TABLE t302} 1 0 {TABLE t301 USING PRIMARY KEY}} 0 1 0 {SCAN TABLE t301 BY INTEGER PRIMARY KEY (rowid=?) (~1 rows)}
}
# Verify that when there are multiple tables in a join which must be # Verify that when there are multiple tables in a join which must be
# full table scans that the query planner attempts put the table with # full table scans that the query planner attempts put the table with
# the fewest number of output rows as the outer loop. # the fewest number of output rows as the outer loop.
# #
do_test where3-4.0 { do_execsql_test where3-4.0 {
execsql { CREATE TABLE t400(a INTEGER PRIMARY KEY, b, c);
CREATE TABLE t400(a INTEGER PRIMARY KEY, b, c); CREATE TABLE t401(p INTEGER PRIMARY KEY, q, r);
CREATE TABLE t401(p INTEGER PRIMARY KEY, q, r); CREATE TABLE t402(x INTEGER PRIMARY KEY, y, z);
CREATE TABLE t402(x INTEGER PRIMARY KEY, y, z); EXPLAIN QUERY PLAN
EXPLAIN QUERY PLAN SELECT * FROM t400, t401, t402 WHERE t402.z GLOB 'abc*';
SELECT * FROM t400, t401, t402 WHERE t402.z GLOB 'abc*'; } {
} 0 0 2 {SCAN TABLE t402 (~500000 rows)}
} {0 2 {TABLE t402} 1 0 {TABLE t400} 2 1 {TABLE t401}} 0 1 0 {SCAN TABLE t400 (~1000000 rows)}
do_test where3-4.1 { 0 2 1 {SCAN TABLE t401 (~1000000 rows)}
execsql { }
EXPLAIN QUERY PLAN do_execsql_test where3-4.1 {
SELECT * FROM t400, t401, t402 WHERE t401.r GLOB 'abc*'; EXPLAIN QUERY PLAN
} SELECT * FROM t400, t401, t402 WHERE t401.r GLOB 'abc*';
} {0 1 {TABLE t401} 1 0 {TABLE t400} 2 2 {TABLE t402}} } {
do_test where3-4.2 { 0 0 1 {SCAN TABLE t401 (~500000 rows)}
execsql { 0 1 0 {SCAN TABLE t400 (~1000000 rows)}
EXPLAIN QUERY PLAN 0 2 2 {SCAN TABLE t402 (~1000000 rows)}
SELECT * FROM t400, t401, t402 WHERE t400.c GLOB 'abc*'; }
} do_execsql_test where3-4.2 {
} {0 0 {TABLE t400} 1 1 {TABLE t401} 2 2 {TABLE t402}} EXPLAIN QUERY PLAN
SELECT * FROM t400, t401, t402 WHERE t400.c GLOB 'abc*';
} {
0 0 0 {SCAN TABLE t400 (~500000 rows)}
0 1 1 {SCAN TABLE t401 (~1000000 rows)}
0 2 2 {SCAN TABLE t402 (~1000000 rows)}
}
# Verify that a performance regression encountered by firefox # Verify that a performance regression encountered by firefox
# has been fixed. # has been fixed.
# #
do_test where3-5.0 { do_execsql_test where3-5.0 {
execsql { CREATE TABLE aaa (id INTEGER PRIMARY KEY, type INTEGER,
CREATE TABLE aaa (id INTEGER PRIMARY KEY, type INTEGER, fk INTEGER DEFAULT NULL, parent INTEGER,
fk INTEGER DEFAULT NULL, parent INTEGER, position INTEGER, title LONGVARCHAR,
position INTEGER, title LONGVARCHAR, keyword_id INTEGER, folder_type TEXT,
keyword_id INTEGER, folder_type TEXT, dateAdded INTEGER, lastModified INTEGER);
dateAdded INTEGER, lastModified INTEGER); CREATE INDEX aaa_111 ON aaa (fk, type);
CREATE INDEX aaa_111 ON aaa (fk, type); CREATE INDEX aaa_222 ON aaa (parent, position);
CREATE INDEX aaa_222 ON aaa (parent, position); CREATE INDEX aaa_333 ON aaa (fk, lastModified);
CREATE INDEX aaa_333 ON aaa (fk, lastModified); CREATE TABLE bbb (id INTEGER PRIMARY KEY, type INTEGER,
CREATE TABLE bbb (id INTEGER PRIMARY KEY, type INTEGER, fk INTEGER DEFAULT NULL, parent INTEGER,
fk INTEGER DEFAULT NULL, parent INTEGER, position INTEGER, title LONGVARCHAR,
position INTEGER, title LONGVARCHAR, keyword_id INTEGER, folder_type TEXT,
keyword_id INTEGER, folder_type TEXT, dateAdded INTEGER, lastModified INTEGER);
dateAdded INTEGER, lastModified INTEGER); CREATE INDEX bbb_111 ON bbb (fk, type);
CREATE INDEX bbb_111 ON bbb (fk, type); CREATE INDEX bbb_222 ON bbb (parent, position);
CREATE INDEX bbb_222 ON bbb (parent, position); CREATE INDEX bbb_333 ON bbb (fk, lastModified);
CREATE INDEX bbb_333 ON bbb (fk, lastModified);
}
execsql { EXPLAIN QUERY PLAN
EXPLAIN QUERY PLAN SELECT bbb.title AS tag_title
SELECT bbb.title AS tag_title FROM aaa JOIN bbb ON bbb.id = aaa.parent
FROM aaa JOIN bbb ON bbb.id = aaa.parent WHERE aaa.fk = 'constant'
WHERE aaa.fk = 'constant' AND LENGTH(bbb.title) > 0
AND LENGTH(bbb.title) > 0 AND bbb.parent = 4
AND bbb.parent = 4 ORDER BY bbb.title COLLATE NOCASE ASC;
ORDER BY bbb.title COLLATE NOCASE ASC; } {
} 0 0 0 {SCAN TABLE aaa BY INDEX aaa_333 (fk=?) (~10 rows)}
} {0 0 {TABLE aaa WITH INDEX aaa_333} 1 1 {TABLE bbb USING PRIMARY KEY}} 0 1 1 {SCAN TABLE bbb BY INTEGER PRIMARY KEY (rowid=?) (~1 rows)}
do_test where3-5.1 { 0 0 0 {USE TEMP B-TREE FOR ORDER BY}
execsql { }
EXPLAIN QUERY PLAN do_execsql_test where3-5.1 {
SELECT bbb.title AS tag_title EXPLAIN QUERY PLAN
FROM aaa JOIN aaa AS bbb ON bbb.id = aaa.parent SELECT bbb.title AS tag_title
WHERE aaa.fk = 'constant' FROM aaa JOIN aaa AS bbb ON bbb.id = aaa.parent
AND LENGTH(bbb.title) > 0 WHERE aaa.fk = 'constant'
AND bbb.parent = 4 AND LENGTH(bbb.title) > 0
ORDER BY bbb.title COLLATE NOCASE ASC; AND bbb.parent = 4
} ORDER BY bbb.title COLLATE NOCASE ASC;
} {0 0 {TABLE aaa WITH INDEX aaa_333} 1 1 {TABLE aaa AS bbb USING PRIMARY KEY}} } {
do_test where3-5.2 { 0 0 0 {SCAN TABLE aaa BY INDEX aaa_333 (fk=?) (~10 rows)}
execsql { 0 1 1 {SCAN TABLE aaa AS bbb BY INTEGER PRIMARY KEY (rowid=?) (~1 rows)}
EXPLAIN QUERY PLAN 0 0 0 {USE TEMP B-TREE FOR ORDER BY}
SELECT bbb.title AS tag_title }
FROM bbb JOIN aaa ON bbb.id = aaa.parent do_execsql_test where3-5.2 {
WHERE aaa.fk = 'constant' EXPLAIN QUERY PLAN
AND LENGTH(bbb.title) > 0 SELECT bbb.title AS tag_title
AND bbb.parent = 4 FROM bbb JOIN aaa ON bbb.id = aaa.parent
ORDER BY bbb.title COLLATE NOCASE ASC; WHERE aaa.fk = 'constant'
} AND LENGTH(bbb.title) > 0
} {0 1 {TABLE aaa WITH INDEX aaa_333} 1 0 {TABLE bbb USING PRIMARY KEY}} AND bbb.parent = 4
do_test where3-5.3 { ORDER BY bbb.title COLLATE NOCASE ASC;
execsql { } {
EXPLAIN QUERY PLAN 0 0 1 {SCAN TABLE aaa BY INDEX aaa_333 (fk=?) (~10 rows)}
SELECT bbb.title AS tag_title 0 1 0 {SCAN TABLE bbb BY INTEGER PRIMARY KEY (rowid=?) (~1 rows)}
FROM aaa AS bbb JOIN aaa ON bbb.id = aaa.parent 0 0 0 {USE TEMP B-TREE FOR ORDER BY}
WHERE aaa.fk = 'constant' }
AND LENGTH(bbb.title) > 0 do_execsql_test where3-5.3 {
AND bbb.parent = 4 EXPLAIN QUERY PLAN
ORDER BY bbb.title COLLATE NOCASE ASC; SELECT bbb.title AS tag_title
} FROM aaa AS bbb JOIN aaa ON bbb.id = aaa.parent
} {0 1 {TABLE aaa WITH INDEX aaa_333} 1 0 {TABLE aaa AS bbb USING PRIMARY KEY}} WHERE aaa.fk = 'constant'
AND LENGTH(bbb.title) > 0
AND bbb.parent = 4
ORDER BY bbb.title COLLATE NOCASE ASC;
} {
0 0 1 {SCAN TABLE aaa BY INDEX aaa_333 (fk=?) (~10 rows)}
0 1 0 {SCAN TABLE aaa AS bbb BY INTEGER PRIMARY KEY (rowid=?) (~1 rows)}
0 0 0 {USE TEMP B-TREE FOR ORDER BY}
}
finish_test finish_test

View File

@ -23307,41 +23307,44 @@ do_test where7-2.1001.2 {
# application with identifiers change and unused columns # application with identifiers change and unused columns
# remove. # remove.
# #
do_test where7-3.1 { do_execsql_test where7-3.1 {
db eval { CREATE TABLE t301 (
CREATE TABLE t301 ( c8 INTEGER PRIMARY KEY,
c8 INTEGER PRIMARY KEY, c6 INTEGER,
c6 INTEGER, c4 INTEGER,
c4 INTEGER, c7 INTEGER,
c7 INTEGER, FOREIGN KEY (c4) REFERENCES series(c4)
FOREIGN KEY (c4) REFERENCES series(c4) );
); CREATE INDEX t301_c6 on t301(c6);
CREATE INDEX t301_c6 on t301(c6); CREATE INDEX t301_c4 on t301(c4);
CREATE INDEX t301_c4 on t301(c4); CREATE INDEX t301_c7 on t301(c7);
CREATE INDEX t301_c7 on t301(c7);
CREATE TABLE t302 (
CREATE TABLE t302 ( c1 INTEGER PRIMARY KEY,
c1 INTEGER PRIMARY KEY, c8 INTEGER,
c8 INTEGER, c5 INTEGER,
c5 INTEGER, c3 INTEGER,
c3 INTEGER, c2 INTEGER,
c2 INTEGER, c4 INTEGER,
c4 INTEGER, FOREIGN KEY (c8) REFERENCES t301(c8)
FOREIGN KEY (c8) REFERENCES t301(c8) );
); CREATE INDEX t302_c3 on t302(c3);
CREATE INDEX t302_c3 on t302(c3); CREATE INDEX t302_c8_c3 on t302(c8, c3);
CREATE INDEX t302_c8_c3 on t302(c8, c3); CREATE INDEX t302_c5 on t302(c5);
CREATE INDEX t302_c5 on t302(c5);
EXPLAIN QUERY PLAN
EXPLAIN QUERY PLAN SELECT t302.c1
SELECT t302.c1 FROM t302 JOIN t301 ON t302.c8 = t301.c8
FROM t302 JOIN t301 ON t302.c8 = t301.c8 WHERE t302.c2 = 19571
WHERE t302.c2 = 19571 AND t302.c3 > 1287603136
AND t302.c3 > 1287603136 AND (t301.c4 = 1407449685622784
AND (t301.c4 = 1407449685622784 OR t301.c8 = 1407424651264000)
OR t301.c8 = 1407424651264000) ORDER BY t302.c5 LIMIT 200;
ORDER BY t302.c5 LIMIT 200; } {
} 0 0 1 {SCAN TABLE t301 BY COVERING INDEX t301_c4 (c4=?) (~10 rows)}
} {0 1 {TABLE t301 VIA MULTI-INDEX UNION} 1 0 {TABLE t302 WITH INDEX t302_c8_c3} 0 0 {TABLE t301 WITH INDEX t301_c4} 0 0 {TABLE t301 USING PRIMARY KEY}} 0 0 1 {SCAN TABLE t301 BY INTEGER PRIMARY KEY (rowid=?) (~1 rows)}
0 1 0 {SCAN TABLE t302 BY INDEX t302_c8_c3 (c8=? AND c8>?) (~2 rows)}
0 0 0 {USE TEMP B-TREE FOR ORDER BY}
}
finish_test finish_test

View File

@ -358,32 +358,25 @@ do_test where9-2.8 {
ifcapable explain { ifcapable explain {
do_test where9-3.1 { do_execsql_test where9-3.1 {
set r [db eval { EXPLAIN QUERY PLAN
EXPLAIN QUERY PLAN SELECT t2.a FROM t1, t2
SELECT t2.a FROM t1, t2 WHERE t1.a=80 AND ((t1.c=t2.c AND t1.d=t2.d) OR t1.f=t2.f)
WHERE t1.a=80 } {
AND ((t1.c=t2.c AND t1.d=t2.d) OR t1.f=t2.f) 0 0 0 {SCAN TABLE t1 BY INTEGER PRIMARY KEY (rowid=?) (~1 rows)}
}] 0 1 1 {SCAN TABLE t2 BY INDEX t2d (d=?) (~2 rows)}
set a [expr {[lsearch $r {TABLE t2 VIA MULTI-INDEX UNION}]>=0}] 0 1 1 {SCAN TABLE t2 BY COVERING INDEX t2f (f=?) (~10 rows)}
set b [expr {[lsearch $r {TABLE t2 WITH INDEX t2f}]>=0}] }
set c [expr {([lsearch $r {TABLE t2 WITH INDEX t2c}]>=0)+ do_execsql_test where9-3.2 {
[lsearch $r {TABLE t2 WITH INDEX t2d}]>=0}] EXPLAIN QUERY PLAN
concat $a $b $c SELECT coalesce(t2.a,9999)
} {1 1 1} FROM t1 LEFT JOIN t2 ON (t1.c+1=t2.c AND t1.d=t2.d) OR (t1.f||'x')=t2.f
do_test where9-3.2 { WHERE t1.a=80
set r [db eval { } {
EXPLAIN QUERY PLAN 0 0 0 {SCAN TABLE t1 BY INTEGER PRIMARY KEY (rowid=?) (~1 rows)}
SELECT coalesce(t2.a,9999) 0 1 1 {SCAN TABLE t2 BY INDEX t2d (d=?) (~2 rows)}
FROM t1 LEFT JOIN t2 ON (t1.c+1=t2.c AND t1.d=t2.d) OR (t1.f||'x')=t2.f 0 1 1 {SCAN TABLE t2 BY COVERING INDEX t2f (f=?) (~10 rows)}
WHERE t1.a=80 }
}]
set a [expr {[lsearch $r {TABLE t2 VIA MULTI-INDEX UNION}]>=0}]
set b [expr {[lsearch $r {TABLE t2 WITH INDEX t2f}]>=0}]
set c [expr {([lsearch $r {TABLE t2 WITH INDEX t2c}]>=0)+
[lsearch $r {TABLE t2 WITH INDEX t2d}]>=0}]
concat $a $b $c
} {1 1 1}
} }
# Make sure that INDEXED BY and multi-index OR clauses play well with # Make sure that INDEXED BY and multi-index OR clauses play well with
@ -458,46 +451,29 @@ ifcapable explain {
# The (c=31031 OR d IS NULL) clause is preferred over b>1000 because # The (c=31031 OR d IS NULL) clause is preferred over b>1000 because
# the former is an equality test which is expected to return fewer rows. # the former is an equality test which is expected to return fewer rows.
# #
do_test where9-5.1 { do_execsql_test where9-5.1 {
set r [db eval { EXPLAIN QUERY PLAN SELECT a FROM t1 WHERE b>1000 AND (c=31031 OR d IS NULL)
EXPLAIN QUERY PLAN } {
SELECT a FROM t1 0 0 0 {SCAN TABLE t1 BY INDEX t1c (c=?) (~10 rows)}
WHERE b>1000 0 0 0 {SCAN TABLE t1 BY INDEX t1d (d=?) (~10 rows)}
AND (c=31031 OR d IS NULL) }
}]
set a [expr {[lsearch $r {TABLE t1 VIA MULTI-INDEX UNION}]>=0}]
set b [expr {[lsearch $r {TABLE t1 WITH INDEX t1b}]>=0}]
concat $a $b
} {1 0}
# In contrast, b=1000 is preferred over any OR-clause. # In contrast, b=1000 is preferred over any OR-clause.
# #
do_test where9-5.2 { do_execsql_test where9-5.2 {
set r [db eval { EXPLAIN QUERY PLAN SELECT a FROM t1 WHERE b=1000 AND (c=31031 OR d IS NULL)
EXPLAIN QUERY PLAN } {
SELECT a FROM t1 0 0 0 {SCAN TABLE t1 BY INDEX t1b (b=?) (~5 rows)}
WHERE b=1000 }
AND (c=31031 OR d IS NULL)
}]
set a [expr {[lsearch $r {TABLE t1 VIA MULTI-INDEX UNION}]>=0}]
set b [expr {[lsearch $r {TABLE t1 WITH INDEX t1b}]>=0}]
concat $a $b
} {0 1}
# Likewise, inequalities in an AND are preferred over inequalities in # Likewise, inequalities in an AND are preferred over inequalities in
# an OR. # an OR.
# #
do_test where9-5.3 { do_execsql_test where9-5.3 {
set r [db eval { EXPLAIN QUERY PLAN SELECT a FROM t1 WHERE b>1000 AND (c>=31031 OR d IS NULL)
EXPLAIN QUERY PLAN } {
SELECT a FROM t1 0 0 0 {SCAN TABLE t1 BY INDEX t1b (a>?) (~165000 rows)}
WHERE b>1000 }
AND (c>=31031 OR d IS NULL)
}]
set a [expr {[lsearch $r {TABLE t1 VIA MULTI-INDEX UNION}]>=0}]
set b [expr {[lsearch $r {TABLE t1 WITH INDEX t1b}]>=0}]
concat $a $b
} {0 1}
} }
############################################################################ ############################################################################