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:
34
manifest
34
manifest
@ -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
|
||||||
|
@ -1 +1 @@
|
|||||||
4b5c93bc7c43c80962ddae65c58037bf5977b94b
|
30904ef8412348464e893e9e1551ef22cad24a3e
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)}
|
||||||
]
|
}
|
||||||
|
|
||||||
|
|
||||||
###########################################################################
|
###########################################################################
|
||||||
|
@ -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.
|
||||||
#
|
#
|
||||||
|
@ -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} {
|
||||||
|
@ -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}}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
213
test/where3.test
213
test/where3.test
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
|
Reference in New Issue
Block a user