Artifact
9cb37d20a68456ed91fbd7c6756d87cba462f0c6:
- File
test/analyze8.test
— part of check-in
[2fbe583868]
at
2013-07-27 18:52:46
on branch trunk
— Fixes for sqlite_stat3 related functionality. Also EXPLAIN QUERY PLAN.
(user:
dan
size: 3198)
0000: 23 20 32 30 31 31 20 41 75 67 75 73 74 20 31 33 # 2011 August 13
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 .#.# The author
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 ce code. In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 ce of.# a legal
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 notice, here is
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 a blessing:.#.#
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 .# May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 or yourself and
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 # May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a n you give..#.#*
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0160: 2a 2a 2a 2a 2a 2a 0a 23 0a 23 20 54 68 69 73 20 ******.#.# This
0170: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 file implements
0180: 74 65 73 74 73 20 66 6f 72 20 53 51 4c 69 74 65 tests for SQLite
0190: 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65 20 66 library. The f
01a0: 6f 63 75 73 20 6f 66 20 74 68 65 20 74 65 73 74 ocus of the test
01b0: 73 0a 23 20 69 6e 20 74 68 69 73 20 66 69 6c 65 s.# in this file
01c0: 20 69 73 20 74 65 73 74 69 6e 67 20 74 68 65 20 is testing the
01d0: 63 61 70 61 62 69 6c 69 74 69 65 73 20 6f 66 20 capabilities of
01e0: 73 71 6c 69 74 65 5f 73 74 61 74 33 2e 0a 23 0a sqlite_stat3..#.
01f0: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 .set testdir [fi
0200: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 le dirname $argv
0210: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 0].source $testd
0220: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 69 ir/tester.tcl..i
0230: 66 63 61 70 61 62 6c 65 20 21 73 74 61 74 33 20 fcapable !stat3
0240: 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a {. finish_test.
0250: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 73 65 74 20 return.}..set
0260: 74 65 73 74 70 72 65 66 69 78 20 61 6e 61 6c 79 testprefix analy
0270: 7a 65 38 0a 0a 70 72 6f 63 20 65 71 70 20 7b 73 ze8..proc eqp {s
0280: 71 6c 20 7b 64 62 20 64 62 7d 7d 20 7b 0a 20 20 ql {db db}} {.
0290: 75 70 6c 65 76 65 6c 20 65 78 65 63 73 71 6c 20 uplevel execsql
02a0: 5b 6c 69 73 74 20 22 45 58 50 4c 41 49 4e 20 51 [list "EXPLAIN Q
02b0: 55 45 52 59 20 50 4c 41 4e 20 24 73 71 6c 22 5d UERY PLAN $sql"]
02c0: 20 24 64 62 0a 7d 0a 0a 23 20 53 63 65 6e 61 72 $db.}..# Scenar
02d0: 69 6f 3a 0a 23 0a 23 20 20 20 20 54 77 6f 20 69 io:.#.# Two i
02e0: 6e 64 69 63 65 73 2e 20 20 4f 6e 65 20 68 61 73 ndices. One has
02f0: 20 6d 6f 73 74 6c 79 20 73 69 6e 67 6c 65 74 6f mostly singleto
0300: 6e 20 65 6e 74 72 69 65 73 2c 20 62 75 74 20 66 n entries, but f
0310: 6f 72 20 61 20 66 65 77 0a 23 20 20 20 20 76 61 or a few.# va
0320: 6c 75 65 73 20 74 68 65 72 65 20 61 72 65 20 68 lues there are h
0330: 75 6e 64 72 65 64 73 20 6f 66 20 65 6e 74 72 69 undreds of entri
0340: 65 73 2e 20 20 54 68 65 20 6f 74 68 65 72 20 68 es. The other h
0350: 61 73 20 31 30 2d 32 30 0a 23 20 20 20 20 65 6e as 10-20.# en
0360: 74 72 69 65 73 20 70 65 72 20 76 61 6c 75 65 2e tries per value.
0370: 0a 23 0a 23 20 56 65 72 69 66 79 20 74 68 61 74 .#.# Verify that
0380: 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e the query plann
0390: 65 72 20 63 68 6f 6f 73 65 73 20 74 68 65 20 66 er chooses the f
03a0: 69 72 73 74 20 69 6e 64 65 78 20 66 6f 72 20 74 irst index for t
03b0: 68 65 20 73 69 6e 67 6c 65 74 6f 6e 0a 23 20 65 he singleton.# e
03c0: 6e 74 72 69 65 73 20 61 6e 64 20 74 68 65 20 73 ntries and the s
03d0: 65 63 6f 6e 64 20 69 6e 64 65 78 20 66 6f 72 20 econd index for
03e0: 74 68 65 20 6f 74 68 65 72 73 2e 0a 23 0a 64 6f the others..#.do
03f0: 5f 74 65 73 74 20 31 2e 30 20 7b 0a 20 20 70 72 _test 1.0 {. pr
0400: 6e 67 5f 73 74 61 74 65 5f 73 65 74 20 31 32 33 ng_state_set 123
0410: 34 35 36 37 38 39 30 30 39 38 37 36 35 34 33 0a 456789009876543.
0420: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 db eval {.
0430: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 CREATE TABLE t1(
0440: 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 43 52 a,b,c,d);. CR
0450: 45 41 54 45 20 49 4e 44 45 58 20 74 31 61 20 4f EATE INDEX t1a O
0460: 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 43 52 45 N t1(a);. CRE
0470: 41 54 45 20 49 4e 44 45 58 20 74 31 62 20 4f 4e ATE INDEX t1b ON
0480: 20 74 31 28 62 29 3b 0a 20 20 20 20 43 52 45 41 t1(b);. CREA
0490: 54 45 20 49 4e 44 45 58 20 74 31 63 20 4f 4e 20 TE INDEX t1c ON
04a0: 74 31 28 63 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 t1(c);. }. for
04b0: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 31 {set i 0} {$i<1
04c0: 30 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 000} {incr i} {.
04d0: 20 20 20 20 69 66 20 7b 24 69 25 32 3d 3d 30 7d if {$i%2==0}
04e0: 20 7b 73 65 74 20 61 20 24 69 7d 20 7b 73 65 74 {set a $i} {set
04f0: 20 61 20 5b 65 78 70 72 20 7b 28 24 69 25 38 29 a [expr {($i%8)
0500: 2a 31 30 30 7d 5d 7d 0a 20 20 20 20 73 65 74 20 *100}]}. set
0510: 62 20 5b 65 78 70 72 20 7b 24 69 2f 31 30 7d 5d b [expr {$i/10}]
0520: 0a 20 20 20 20 73 65 74 20 63 20 5b 65 78 70 72 . set c [expr
0530: 20 7b 24 69 2f 38 7d 5d 0a 20 20 20 20 73 65 74 {$i/8}]. set
0540: 20 63 20 5b 65 78 70 72 20 7b 24 63 2a 24 63 2a c [expr {$c*$c*
0550: 24 63 7d 5d 0a 20 20 20 20 64 62 20 65 76 61 6c $c}]. db eval
0560: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 {INSERT INTO t1
0570: 20 56 41 4c 55 45 53 28 24 61 2c 24 62 2c 24 63 VALUES($a,$b,$c
0580: 2c 24 69 29 7d 0a 20 20 7d 0a 20 20 64 62 20 65 ,$i)}. }. db e
0590: 76 61 6c 20 7b 41 4e 41 4c 59 5a 45 7d 0a 7d 20 val {ANALYZE}.}
05a0: 7b 7d 0a 0a 23 20 54 68 65 20 61 3d 3d 31 30 30 {}..# The a==100
05b0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 comparison is e
05c0: 78 70 65 6e 73 69 76 65 20 62 65 63 61 75 73 65 xpensive because
05d0: 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 20 there are many
05e0: 72 6f 77 73 0a 23 20 77 69 74 68 20 61 3d 3d 31 rows.# with a==1
05f0: 30 30 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 20 00. And so for
0600: 74 68 6f 73 65 20 63 61 73 65 73 2c 20 63 68 6f those cases, cho
0610: 6f 73 65 20 74 68 65 20 74 31 62 20 69 6e 64 65 ose the t1b inde
0620: 78 2e 0a 23 0a 23 20 42 75 66 20 72 6f 20 61 3d x..#.# Buf ro a=
0630: 3d 39 39 20 61 6e 64 20 61 3d 3d 31 30 31 2c 20 =99 and a==101,
0640: 74 68 65 72 65 20 61 72 65 20 66 61 72 20 66 65 there are far fe
0650: 77 65 72 20 72 6f 77 73 20 73 6f 20 63 68 6f 6f wer rows so choo
0660: 73 65 0a 23 20 74 68 65 20 74 31 61 20 69 6e 64 se.# the t1a ind
0670: 65 78 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 31 2e ex..#.do_test 1.
0680: 31 20 7b 0a 20 20 65 71 70 20 7b 53 45 4c 45 43 1 {. eqp {SELEC
0690: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 T * FROM t1 WHER
06a0: 45 20 61 3d 31 30 30 20 41 4e 44 20 62 3d 35 35 E a=100 AND b=55
06b0: 7d 0a 7d 20 7b 30 20 30 20 30 20 7b 53 45 41 52 }.} {0 0 0 {SEAR
06c0: 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e CH TABLE t1 USIN
06d0: 47 20 49 4e 44 45 58 20 74 31 62 20 28 62 3d 3f G INDEX t1b (b=?
06e0: 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 31 2e 32 20 )}}.do_test 1.2
06f0: 7b 0a 20 20 65 71 70 20 7b 53 45 4c 45 43 54 20 {. eqp {SELECT
0700: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 * FROM t1 WHERE
0710: 61 3d 39 39 20 41 4e 44 20 62 3d 35 35 7d 0a 7d a=99 AND b=55}.}
0720: 20 7b 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 {0 0 0 {SEARCH
0730: 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 49 TABLE t1 USING I
0740: 4e 44 45 58 20 74 31 61 20 28 61 3d 3f 29 7d 7d NDEX t1a (a=?)}}
0750: 0a 64 6f 5f 74 65 73 74 20 31 2e 33 20 7b 0a 20 .do_test 1.3 {.
0760: 20 65 71 70 20 7b 53 45 4c 45 43 54 20 2a 20 46 eqp {SELECT * F
0770: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 ROM t1 WHERE a=1
0780: 30 31 20 41 4e 44 20 62 3d 35 35 7d 0a 7d 20 7b 01 AND b=55}.} {
0790: 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54 41 0 0 0 {SEARCH TA
07a0: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 49 4e 44 BLE t1 USING IND
07b0: 45 58 20 74 31 61 20 28 61 3d 3f 29 7d 7d 0a 64 EX t1a (a=?)}}.d
07c0: 6f 5f 74 65 73 74 20 31 2e 34 20 7b 0a 20 20 65 o_test 1.4 {. e
07d0: 71 70 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f qp {SELECT * FRO
07e0: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 30 30 M t1 WHERE a=100
07f0: 20 41 4e 44 20 62 3d 35 36 7d 0a 7d 20 7b 30 20 AND b=56}.} {0
0800: 30 20 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 0 0 {SEARCH TABL
0810: 45 20 74 31 20 55 53 49 4e 47 20 49 4e 44 45 58 E t1 USING INDEX
0820: 20 74 31 62 20 28 62 3d 3f 29 7d 7d 0a 64 6f 5f t1b (b=?)}}.do_
0830: 74 65 73 74 20 31 2e 35 20 7b 0a 20 20 65 71 70 test 1.5 {. eqp
0840: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 {SELECT * FROM
0850: 74 31 20 57 48 45 52 45 20 61 3d 39 39 20 41 4e t1 WHERE a=99 AN
0860: 44 20 62 3d 35 36 7d 0a 7d 20 7b 30 20 30 20 30 D b=56}.} {0 0 0
0870: 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 {SEARCH TABLE t
0880: 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 31 1 USING INDEX t1
0890: 61 20 28 61 3d 3f 29 7d 7d 0a 64 6f 5f 74 65 73 a (a=?)}}.do_tes
08a0: 74 20 31 2e 36 20 7b 0a 20 20 65 71 70 20 7b 53 t 1.6 {. eqp {S
08b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 ELECT * FROM t1
08c0: 57 48 45 52 45 20 61 3d 31 30 31 20 41 4e 44 20 WHERE a=101 AND
08d0: 62 3d 35 36 7d 0a 7d 20 7b 30 20 30 20 30 20 7b b=56}.} {0 0 0 {
08e0: 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 SEARCH TABLE t1
08f0: 55 53 49 4e 47 20 49 4e 44 45 58 20 74 31 61 20 USING INDEX t1a
0900: 28 61 3d 3f 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 (a=?)}}.do_test
0910: 32 2e 31 20 7b 0a 20 20 65 71 70 20 7b 53 45 4c 2.1 {. eqp {SEL
0920: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 ECT * FROM t1 WH
0930: 45 52 45 20 61 3d 31 30 30 20 41 4e 44 20 62 20 ERE a=100 AND b
0940: 42 45 54 57 45 45 4e 20 35 30 20 41 4e 44 20 35 BETWEEN 50 AND 5
0950: 34 7d 0a 7d 20 7b 30 20 30 20 30 20 7b 53 45 41 4}.} {0 0 0 {SEA
0960: 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 RCH TABLE t1 USI
0970: 4e 47 20 49 4e 44 45 58 20 74 31 62 20 28 62 3e NG INDEX t1b (b>
0980: 3f 20 41 4e 44 20 62 3c 3f 29 7d 7d 0a 0a 23 20 ? AND b<?)}}..#
0990: 54 68 65 72 65 20 61 72 65 20 6d 61 6e 79 20 6d There are many m
09a0: 6f 72 65 20 76 61 6c 75 65 73 20 6f 66 20 63 20 ore values of c
09b0: 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 30 between 0 and 10
09c0: 30 30 30 30 20 74 68 61 6e 20 74 68 65 72 65 20 0000 than there
09d0: 61 72 65 0a 23 20 62 65 74 77 65 65 6e 20 38 30 are.# between 80
09e0: 30 30 30 30 20 61 6e 64 20 39 30 30 30 30 30 2e 0000 and 900000.
09f0: 20 20 53 6f 20 74 31 63 20 69 73 20 6d 6f 72 65 So t1c is more
0a00: 20 73 65 6c 65 63 74 69 76 65 20 66 6f 72 20 74 selective for t
0a10: 68 65 20 6c 61 74 74 65 72 0a 23 20 72 61 6e 67 he latter.# rang
0a20: 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 33 2e 31 e..#.do_test 3.1
0a30: 20 7b 0a 20 20 65 71 70 20 7b 53 45 4c 45 43 54 {. eqp {SELECT
0a40: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 * FROM t1 WHERE
0a50: 20 62 20 42 45 54 57 45 45 4e 20 35 30 20 41 4e b BETWEEN 50 AN
0a60: 44 20 35 34 20 41 4e 44 20 63 20 42 45 54 57 45 D 54 AND c BETWE
0a70: 45 4e 20 30 20 41 4e 44 20 31 30 30 30 30 30 7d EN 0 AND 100000}
0a80: 0a 7d 20 7b 30 20 30 20 30 20 7b 53 45 41 52 43 .} {0 0 0 {SEARC
0a90: 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 H TABLE t1 USING
0aa0: 20 49 4e 44 45 58 20 74 31 62 20 28 62 3e 3f 20 INDEX t1b (b>?
0ab0: 41 4e 44 20 62 3c 3f 29 7d 7d 0a 64 6f 5f 74 65 AND b<?)}}.do_te
0ac0: 73 74 20 33 2e 32 20 7b 0a 20 20 65 71 70 20 7b st 3.2 {. eqp {
0ad0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 SELECT * FROM t1
0ae0: 0a 20 20 20 20 20 20 20 57 48 45 52 45 20 62 20 . WHERE b
0af0: 42 45 54 57 45 45 4e 20 35 30 20 41 4e 44 20 35 BETWEEN 50 AND 5
0b00: 34 20 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20 4 AND c BETWEEN
0b10: 38 30 30 30 30 30 20 41 4e 44 20 39 30 30 30 30 800000 AND 90000
0b20: 30 7d 0a 7d 20 7b 30 20 30 20 30 20 7b 53 45 41 0}.} {0 0 0 {SEA
0b30: 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 RCH TABLE t1 USI
0b40: 4e 47 20 49 4e 44 45 58 20 74 31 63 20 28 63 3e NG INDEX t1c (c>
0b50: 3f 20 41 4e 44 20 63 3c 3f 29 7d 7d 0a 64 6f 5f ? AND c<?)}}.do_
0b60: 74 65 73 74 20 33 2e 33 20 7b 0a 20 20 65 71 70 test 3.3 {. eqp
0b70: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 {SELECT * FROM
0b80: 74 31 20 57 48 45 52 45 20 61 3d 31 30 30 20 41 t1 WHERE a=100 A
0b90: 4e 44 20 63 20 42 45 54 57 45 45 4e 20 30 20 41 ND c BETWEEN 0 A
0ba0: 4e 44 20 31 30 30 30 30 30 7d 0a 7d 20 7b 30 20 ND 100000}.} {0
0bb0: 30 20 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 0 0 {SEARCH TABL
0bc0: 45 20 74 31 20 55 53 49 4e 47 20 49 4e 44 45 58 E t1 USING INDEX
0bd0: 20 74 31 61 20 28 61 3d 3f 29 7d 7d 0a 64 6f 5f t1a (a=?)}}.do_
0be0: 74 65 73 74 20 33 2e 34 20 7b 0a 20 20 65 71 70 test 3.4 {. eqp
0bf0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 {SELECT * FROM
0c00: 74 31 0a 20 20 20 20 20 20 20 57 48 45 52 45 20 t1. WHERE
0c10: 61 3d 31 30 30 20 41 4e 44 20 63 20 42 45 54 57 a=100 AND c BETW
0c20: 45 45 4e 20 38 30 30 30 30 30 20 41 4e 44 20 39 EEN 800000 AND 9
0c30: 30 30 30 30 30 7d 0a 7d 20 7b 30 20 30 20 30 20 00000}.} {0 0 0
0c40: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 {SEARCH TABLE t1
0c50: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 31 63 USING INDEX t1c
0c60: 20 28 63 3e 3f 20 41 4e 44 20 63 3c 3f 29 7d 7d (c>? AND c<?)}}
0c70: 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a ..finish_test.