SQLite4
Hex Artifact Content
Not logged in

Artifact 9cb37d20a68456ed91fbd7c6756d87cba462f0c6:


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.