/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 936979c3a1e87b81feaed2d00505665bf142d764:


0000: 23 20 32 30 31 33 2d 30 37 2d 33 31 0a 23 0a 23  # 2013-07-31.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u 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 0a 23 0a 23 20 54 65 73 74 20 63 61 73 65  **.#.# Test case
0170: 73 20 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e  s for partial in
0180: 64 69 63 65 73 0a 23 0a 0a 0a 73 65 74 20 74 65  dices.#...set te
0190: 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e  stdir [file dirn
01a0: 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72  ame $argv0].sour
01b0: 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74  ce $testdir/test
01c0: 65 72 2e 74 63 6c 0a 0a 69 66 63 61 70 61 62 6c  er.tcl..ifcapabl
01d0: 65 20 21 76 74 61 62 20 7b 0a 20 20 66 69 6e 69  e !vtab {.  fini
01e0: 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e  sh_test.  return
01f0: 0a 7d 0a 0a 6c 6f 61 64 5f 73 74 61 74 69 63 5f  .}..load_static_
0200: 65 78 74 65 6e 73 69 6f 6e 20 64 62 20 77 68 6f  extension db who
0210: 6c 65 6e 75 6d 62 65 72 3b 0a 64 6f 5f 74 65 73  lenumber;.do_tes
0220: 74 20 69 6e 64 65 78 36 2d 31 2e 31 20 7b 0a 20  t index6-1.1 {. 
0230: 20 23 20 41 62 6c 65 20 74 6f 20 70 61 72 73 65   # Able to parse
0240: 20 61 6e 64 20 6d 61 6e 61 67 65 20 70 61 72 74   and manage part
0250: 69 61 6c 20 69 6e 64 69 63 65 73 0a 20 20 65 78  ial indices.  ex
0260: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
0270: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c  TE TABLE t1(a,b,
0280: 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  c);.    CREATE I
0290: 4e 44 45 58 20 74 31 61 20 4f 4e 20 74 31 28 61  NDEX t1a ON t1(a
02a0: 29 20 57 48 45 52 45 20 61 20 49 53 20 4e 4f 54  ) WHERE a IS NOT
02b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 43 52 45 41 54   NULL;.    CREAT
02c0: 45 20 49 4e 44 45 58 20 74 31 62 20 4f 4e 20 74  E INDEX t1b ON t
02d0: 31 28 62 29 20 57 48 45 52 45 20 62 3e 31 30 3b  1(b) WHERE b>10;
02e0: 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  .    CREATE VIRT
02f0: 55 41 4c 20 54 41 42 4c 45 20 6e 75 6d 73 20 55  UAL TABLE nums U
0300: 53 49 4e 47 20 77 68 6f 6c 65 6e 75 6d 62 65 72  SING wholenumber
0310: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0320: 4f 20 74 31 28 61 2c 62 2c 63 29 0a 20 20 20 20  O t1(a,b,c).    
0330: 20 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57     SELECT CASE W
0340: 48 45 4e 20 76 61 6c 75 65 25 33 21 3d 30 20 54  HEN value%3!=0 T
0350: 48 45 4e 20 76 61 6c 75 65 20 45 4e 44 2c 20 76  HEN value END, v
0360: 61 6c 75 65 2c 20 76 61 6c 75 65 0a 20 20 20 20  alue, value.    
0370: 20 20 20 20 20 46 52 4f 4d 20 6e 75 6d 73 20 57       FROM nums W
0380: 48 45 52 45 20 76 61 6c 75 65 3c 3d 32 30 3b 0a  HERE value<=20;.
0390: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
03a0: 28 61 29 2c 20 63 6f 75 6e 74 28 62 29 20 46 52  (a), count(b) FR
03b0: 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d  OM t1;.    PRAGM
03c0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
03d0: 6b 3b 0a 20 20 7d 0a 7d 20 7b 31 34 20 32 30 20  k;.  }.} {14 20 
03e0: 6f 6b 7d 0a 0a 23 20 4d 61 6b 65 20 73 75 72 65  ok}..# Make sure
03f0: 20 74 68 65 20 63 6f 75 6e 74 28 2a 29 20 6f 70   the count(*) op
0400: 74 69 6d 69 7a 61 74 69 6f 6e 20 77 6f 72 6b 73  timization works
0410: 20 63 6f 72 72 65 63 74 6c 79 20 77 69 74 68 0a   correctly with.
0420: 23 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65  # partial indice
0430: 73 2e 20 20 54 69 63 6b 65 74 20 5b 61 35 63 38  s.  Ticket [a5c8
0440: 65 64 36 36 63 61 65 31 36 32 34 33 62 65 36 5d  ed66cae16243be6]
0450: 20 32 30 31 33 2d 31 30 2d 30 33 2e 0a 23 0a 64   2013-10-03..#.d
0460: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69  o_execsql_test i
0470: 6e 64 65 78 36 2d 31 2e 31 2e 31 20 7b 0a 20 20  ndex6-1.1.1 {.  
0480: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
0490: 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 32 30 7d 0a  FROM t1;.} {20}.
04a0: 0a 23 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69  .# Error conditi
04b0: 6f 6e 73 20 64 75 72 69 6e 67 20 70 61 72 73 69  ons during parsi
04c0: 6e 67 2e 2e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ng....#.do_test 
04d0: 69 6e 64 65 78 36 2d 31 2e 32 20 7b 0a 20 20 63  index6-1.2 {.  c
04e0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52  atchsql {.    CR
04f0: 45 41 54 45 20 49 4e 44 45 58 20 62 61 64 31 20  EATE INDEX bad1 
0500: 4f 4e 20 74 31 28 61 2c 62 29 20 57 48 45 52 45  ON t1(a,b) WHERE
0510: 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 3b 0a   x IS NOT NULL;.
0520: 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63    }.} {1 {no suc
0530: 68 20 63 6f 6c 75 6d 6e 3a 20 78 7d 7d 0a 64 6f  h column: x}}.do
0540: 5f 74 65 73 74 20 69 6e 64 65 78 36 2d 31 2e 33  _test index6-1.3
0550: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
0560: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
0570: 20 62 61 64 31 20 4f 4e 20 74 31 28 61 2c 62 29   bad1 ON t1(a,b)
0580: 20 57 48 45 52 45 20 45 58 49 53 54 53 28 53 45   WHERE EXISTS(SE
0590: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 29 3b  LECT * FROM t1);
05a0: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 73 75 62 71 75  .  }.} {1 {subqu
05b0: 65 72 69 65 73 20 70 72 6f 68 69 62 69 74 65 64  eries prohibited
05c0: 20 69 6e 20 70 61 72 74 69 61 6c 20 69 6e 64 65   in partial inde
05d0: 78 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 7d  x WHERE clauses}
05e0: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 36  }.do_test index6
05f0: 2d 31 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71  -1.4 {.  catchsq
0600: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 49  l {.    CREATE I
0610: 4e 44 45 58 20 62 61 64 31 20 4f 4e 20 74 31 28  NDEX bad1 ON t1(
0620: 61 2c 62 29 20 57 48 45 52 45 20 61 21 3d 3f 31  a,b) WHERE a!=?1
0630: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 70 61 72 61  ;.  }.} {1 {para
0640: 6d 65 74 65 72 73 20 70 72 6f 68 69 62 69 74 65  meters prohibite
0650: 64 20 69 6e 20 70 61 72 74 69 61 6c 20 69 6e 64  d in partial ind
0660: 65 78 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  ex WHERE clauses
0670: 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78  }}.do_test index
0680: 36 2d 31 2e 35 20 7b 0a 20 20 63 61 74 63 68 73  6-1.5 {.  catchs
0690: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
06a0: 49 4e 44 45 58 20 62 61 64 31 20 4f 4e 20 74 31  INDEX bad1 ON t1
06b0: 28 61 2c 62 29 20 57 48 45 52 45 20 61 21 3d 72  (a,b) WHERE a!=r
06c0: 61 6e 64 6f 6d 28 29 3b 0a 20 20 7d 0a 7d 20 7b  andom();.  }.} {
06d0: 31 20 7b 66 75 6e 63 74 69 6f 6e 73 20 70 72 6f  1 {functions pro
06e0: 68 69 62 69 74 65 64 20 69 6e 20 70 61 72 74 69  hibited in parti
06f0: 61 6c 20 69 6e 64 65 78 20 57 48 45 52 45 20 63  al index WHERE c
0700: 6c 61 75 73 65 73 7d 7d 0a 64 6f 5f 74 65 73 74  lauses}}.do_test
0710: 20 69 6e 64 65 78 36 2d 31 2e 36 20 7b 0a 20 20   index6-1.6 {.  
0720: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43  catchsql {.    C
0730: 52 45 41 54 45 20 49 4e 44 45 58 20 62 61 64 31  REATE INDEX bad1
0740: 20 4f 4e 20 74 31 28 61 2c 62 29 20 57 48 45 52   ON t1(a,b) WHER
0750: 45 20 61 20 4e 4f 54 20 4c 49 4b 45 20 27 61 62  E a NOT LIKE 'ab
0760: 63 25 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 66  c%';.  }.} {1 {f
0770: 75 6e 63 74 69 6f 6e 73 20 70 72 6f 68 69 62 69  unctions prohibi
0780: 74 65 64 20 69 6e 20 70 61 72 74 69 61 6c 20 69  ted in partial i
0790: 6e 64 65 78 20 57 48 45 52 45 20 63 6c 61 75 73  ndex WHERE claus
07a0: 65 73 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e  es}}..do_test in
07b0: 64 65 78 36 2d 31 2e 31 30 20 7b 0a 20 20 65 78  dex6-1.10 {.  ex
07c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 41 4e 41 4c  ecsql {.    ANAL
07d0: 59 5a 45 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  YZE;.    SELECT 
07e0: 69 64 78 2c 20 73 74 61 74 20 46 52 4f 4d 20 73  idx, stat FROM s
07f0: 71 6c 69 74 65 5f 73 74 61 74 31 20 4f 52 44 45  qlite_stat1 ORDE
0800: 52 20 42 59 20 69 64 78 3b 0a 20 20 20 20 50 52  R BY idx;.    PR
0810: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
0820: 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20  heck;.  }.} {{} 
0830: 32 30 20 74 31 61 20 7b 31 34 20 31 7d 20 74 31  20 t1a {14 1} t1
0840: 62 20 7b 31 30 20 31 7d 20 6f 6b 7d 0a 0a 23 20  b {10 1} ok}..# 
0850: 53 54 41 54 31 20 73 68 6f 77 73 20 74 68 65 20  STAT1 shows the 
0860: 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20  partial indices 
0870: 68 61 76 65 20 61 20 72 65 64 75 63 65 64 20 6e  have a reduced n
0880: 75 6d 62 65 72 20 6f 66 0a 23 20 72 6f 77 73 2e  umber of.# rows.
0890: 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78  .#.do_test index
08a0: 36 2d 31 2e 31 31 20 7b 0a 20 20 65 78 65 63 73  6-1.11 {.  execs
08b0: 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
08c0: 74 31 20 53 45 54 20 61 3d 62 3b 0a 20 20 20 20  t1 SET a=b;.    
08d0: 41 4e 41 4c 59 5a 45 3b 0a 20 20 20 20 53 45 4c  ANALYZE;.    SEL
08e0: 45 43 54 20 69 64 78 2c 20 73 74 61 74 20 46 52  ECT idx, stat FR
08f0: 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  OM sqlite_stat1 
0900: 4f 52 44 45 52 20 42 59 20 69 64 78 3b 0a 20 20  ORDER BY idx;.  
0910: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
0920: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
0930: 7b 7b 7d 20 32 30 20 74 31 61 20 7b 32 30 20 31  {{} 20 t1a {20 1
0940: 7d 20 74 31 62 20 7b 31 30 20 31 7d 20 6f 6b 7d  } t1b {10 1} ok}
0950: 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 36  ..do_test index6
0960: 2d 31 2e 31 31 20 7b 0a 20 20 65 78 65 63 73 71  -1.11 {.  execsq
0970: 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74  l {.    UPDATE t
0980: 31 20 53 45 54 20 61 3d 4e 55 4c 4c 20 57 48 45  1 SET a=NULL WHE
0990: 52 45 20 62 25 33 21 3d 30 3b 0a 20 20 20 20 55  RE b%3!=0;.    U
09a0: 50 44 41 54 45 20 74 31 20 53 45 54 20 62 3d 62  PDATE t1 SET b=b
09b0: 2b 31 30 30 3b 0a 20 20 20 20 41 4e 41 4c 59 5a  +100;.    ANALYZ
09c0: 45 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 69 64  E;.    SELECT id
09d0: 78 2c 20 73 74 61 74 20 46 52 4f 4d 20 73 71 6c  x, stat FROM sql
09e0: 69 74 65 5f 73 74 61 74 31 20 4f 52 44 45 52 20  ite_stat1 ORDER 
09f0: 42 59 20 69 64 78 3b 0a 20 20 20 20 50 52 41 47  BY idx;.    PRAG
0a00: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
0a10: 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 32 30  ck;.  }.} {{} 20
0a20: 20 74 31 61 20 7b 36 20 31 7d 20 74 31 62 20 7b   t1a {6 1} t1b {
0a30: 32 30 20 31 7d 20 6f 6b 7d 0a 0a 64 6f 5f 74 65  20 1} ok}..do_te
0a40: 73 74 20 69 6e 64 65 78 36 2d 31 2e 31 32 20 7b  st index6-1.12 {
0a50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0a60: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 61   UPDATE t1 SET a
0a70: 3d 43 41 53 45 20 57 48 45 4e 20 62 25 33 21 3d  =CASE WHEN b%3!=
0a80: 30 20 54 48 45 4e 20 62 20 45 4e 44 3b 0a 20 20  0 THEN b END;.  
0a90: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
0aa0: 62 3d 62 2d 31 30 30 3b 0a 20 20 20 20 41 4e 41  b=b-100;.    ANA
0ab0: 4c 59 5a 45 3b 0a 20 20 20 20 53 45 4c 45 43 54  LYZE;.    SELECT
0ac0: 20 69 64 78 2c 20 73 74 61 74 20 46 52 4f 4d 20   idx, stat FROM 
0ad0: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 4f 52 44  sqlite_stat1 ORD
0ae0: 45 52 20 42 59 20 69 64 78 3b 0a 20 20 20 20 50  ER BY idx;.    P
0af0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
0b00: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d  check;.  }.} {{}
0b10: 20 32 30 20 74 31 61 20 7b 31 33 20 31 7d 20 74   20 t1a {13 1} t
0b20: 31 62 20 7b 31 30 20 31 7d 20 6f 6b 7d 0a 0a 64  1b {10 1} ok}..d
0b30: 6f 5f 74 65 73 74 20 69 6e 64 65 78 36 2d 31 2e  o_test index6-1.
0b40: 31 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  13 {.  execsql {
0b50: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
0b60: 20 74 31 20 57 48 45 52 45 20 62 20 42 45 54 57   t1 WHERE b BETW
0b70: 45 45 4e 20 38 20 41 4e 44 20 31 32 3b 0a 20 20  EEN 8 AND 12;.  
0b80: 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 20 20 53    ANALYZE;.    S
0b90: 45 4c 45 43 54 20 69 64 78 2c 20 73 74 61 74 20  ELECT idx, stat 
0ba0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74  FROM sqlite_stat
0bb0: 31 20 4f 52 44 45 52 20 42 59 20 69 64 78 3b 0a  1 ORDER BY idx;.
0bc0: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
0bd0: 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a  rity_check;.  }.
0be0: 7d 20 7b 7b 7d 20 31 35 20 74 31 61 20 7b 31 30  } {{} 15 t1a {10
0bf0: 20 31 7d 20 74 31 62 20 7b 38 20 31 7d 20 6f 6b   1} t1b {8 1} ok
0c00: 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78  }..do_test index
0c10: 36 2d 31 2e 31 34 20 7b 0a 20 20 65 78 65 63 73  6-1.14 {.  execs
0c20: 71 6c 20 7b 0a 20 20 20 20 52 45 49 4e 44 45 58  ql {.    REINDEX
0c30: 3b 0a 20 20 20 20 41 4e 41 4c 59 5a 45 3b 0a 20  ;.    ANALYZE;. 
0c40: 20 20 20 53 45 4c 45 43 54 20 69 64 78 2c 20 73     SELECT idx, s
0c50: 74 61 74 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  tat FROM sqlite_
0c60: 73 74 61 74 31 20 4f 52 44 45 52 20 42 59 20 69  stat1 ORDER BY i
0c70: 64 78 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  dx;.    PRAGMA i
0c80: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
0c90: 20 20 7d 0a 7d 20 7b 7b 7d 20 31 35 20 74 31 61    }.} {{} 15 t1a
0ca0: 20 7b 31 30 20 31 7d 20 74 31 62 20 7b 38 20 31   {10 1} t1b {8 1
0cb0: 7d 20 6f 6b 7d 0a 0a 64 6f 5f 74 65 73 74 20 69  } ok}..do_test i
0cc0: 6e 64 65 78 36 2d 31 2e 31 35 20 7b 0a 20 20 65  ndex6-1.15 {.  e
0cd0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
0ce0: 41 54 45 20 49 4e 44 45 58 20 74 31 63 20 4f 4e  ATE INDEX t1c ON
0cf0: 20 74 31 28 63 29 3b 0a 20 20 20 20 41 4e 41 4c   t1(c);.    ANAL
0d00: 59 5a 45 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  YZE;.    SELECT 
0d10: 69 64 78 2c 20 73 74 61 74 20 46 52 4f 4d 20 73  idx, stat FROM s
0d20: 71 6c 69 74 65 5f 73 74 61 74 31 20 4f 52 44 45  qlite_stat1 ORDE
0d30: 52 20 42 59 20 69 64 78 3b 0a 20 20 20 20 50 52  R BY idx;.    PR
0d40: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
0d50: 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 74 31 61  heck;.  }.} {t1a
0d60: 20 7b 31 30 20 31 7d 20 74 31 62 20 7b 38 20 31   {10 1} t1b {8 1
0d70: 7d 20 74 31 63 20 7b 31 35 20 31 7d 20 6f 6b 7d  } t1c {15 1} ok}
0d80: 0a 0a 23 20 51 75 65 72 69 65 73 20 75 73 65 20  ..# Queries use 
0d90: 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20  partial indices 
0da0: 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 74  as appropriate t
0db0: 69 6d 65 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  imes..#.do_test 
0dc0: 69 6e 64 65 78 36 2d 32 2e 31 20 7b 0a 20 20 65  index6-2.1 {.  e
0dd0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
0de0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 62  ATE TABLE t2(a,b
0df0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0e00: 54 4f 20 74 32 28 61 2c 62 29 20 53 45 4c 45 43  TO t2(a,b) SELEC
0e10: 54 20 76 61 6c 75 65 2c 20 76 61 6c 75 65 20 46  T value, value F
0e20: 52 4f 4d 20 6e 75 6d 73 20 57 48 45 52 45 20 76  ROM nums WHERE v
0e30: 61 6c 75 65 3c 31 30 30 30 3b 0a 20 20 20 20 55  alue<1000;.    U
0e40: 50 44 41 54 45 20 74 32 20 53 45 54 20 61 3d 4e  PDATE t2 SET a=N
0e50: 55 4c 4c 20 57 48 45 52 45 20 62 25 35 3d 3d 30  ULL WHERE b%5==0
0e60: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
0e70: 45 58 20 74 32 61 31 20 4f 4e 20 74 32 28 61 29  EX t2a1 ON t2(a)
0e80: 20 57 48 45 52 45 20 61 20 49 53 20 4e 4f 54 20   WHERE a IS NOT 
0e90: 4e 55 4c 4c 3b 0a 20 20 20 20 53 45 4c 45 43 54  NULL;.    SELECT
0ea0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
0eb0: 32 20 57 48 45 52 45 20 61 20 49 53 20 4e 4f 54  2 WHERE a IS NOT
0ec0: 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 20 7b 38 30   NULL;.  }.} {80
0ed0: 30 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78  0}.do_test index
0ee0: 36 2d 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  6-2.2 {.  execsq
0ef0: 6c 20 7b 0a 20 20 20 20 45 58 50 4c 41 49 4e 20  l {.    EXPLAIN 
0f00: 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 20 20 53  QUERY PLAN.    S
0f10: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
0f20: 57 48 45 52 45 20 61 3d 35 3b 0a 20 20 7d 0a 7d  WHERE a=5;.  }.}
0f30: 20 7b 2f 2e 2a 20 54 41 42 4c 45 20 74 32 20 55   {/.* TABLE t2 U
0f40: 53 49 4e 47 20 49 4e 44 45 58 20 74 32 61 31 20  SING INDEX t2a1 
0f50: 2e 2a 2f 7d 0a 69 66 63 61 70 61 62 6c 65 20 73  .*/}.ifcapable s
0f60: 74 61 74 34 7c 7c 73 74 61 74 33 20 7b 0a 20 20  tat4||stat3 {.  
0f70: 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 36 2d 32  do_test index6-2
0f80: 2e 33 73 74 61 74 34 20 7b 0a 20 20 20 20 65 78  .3stat4 {.    ex
0f90: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 45 58  ecsql {.      EX
0fa0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
0fb0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
0fc0: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 61 20  FROM t2 WHERE a 
0fd0: 49 53 20 4e 4f 54 20 4e 55 4c 4c 3b 0a 20 20 20  IS NOT NULL;.   
0fe0: 20 7d 0a 20 20 7d 20 7b 2f 2e 2a 20 54 41 42 4c   }.  } {/.* TABL
0ff0: 45 20 74 32 20 55 53 49 4e 47 20 49 4e 44 45 58  E t2 USING INDEX
1000: 20 74 32 61 31 20 2e 2a 2f 7d 0a 7d 20 65 6c 73   t2a1 .*/}.} els
1010: 65 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e  e {.  do_test in
1020: 64 65 78 36 2d 32 2e 33 73 74 61 74 34 20 7b 0a  dex6-2.3stat4 {.
1030: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
1040: 20 20 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52      EXPLAIN QUER
1050: 59 20 50 4c 41 4e 0a 20 20 20 20 20 20 53 45 4c  Y PLAN.      SEL
1060: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
1070: 45 52 45 20 61 20 49 53 20 4e 4f 54 20 4e 55 4c  ERE a IS NOT NUL
1080: 4c 20 41 4e 44 20 61 3e 30 3b 0a 20 20 20 20 7d  L AND a>0;.    }
1090: 0a 20 20 7d 20 7b 2f 2e 2a 20 54 41 42 4c 45 20  .  } {/.* TABLE 
10a0: 74 32 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74  t2 USING INDEX t
10b0: 32 61 31 20 2e 2a 2f 7d 0a 7d 0a 64 6f 5f 74 65  2a1 .*/}.}.do_te
10c0: 73 74 20 69 6e 64 65 78 36 2d 32 2e 34 20 7b 0a  st index6-2.4 {.
10d0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
10e0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
10f0: 41 4e 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  AN.    SELECT * 
1100: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 61 20  FROM t2 WHERE a 
1110: 49 53 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 20 7b  IS NULL;.  }.} {
1120: 7e 2f 2e 2a 49 4e 44 45 58 20 74 32 61 31 2e 2a  ~/.*INDEX t2a1.*
1130: 2f 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  /}..do_execsql_t
1140: 65 73 74 20 69 6e 64 65 78 36 2d 32 2e 31 30 31  est index6-2.101
1150: 20 7b 0a 20 20 44 52 4f 50 20 49 4e 44 45 58 20   {.  DROP INDEX 
1160: 74 32 61 31 3b 0a 20 20 55 50 44 41 54 45 20 74  t2a1;.  UPDATE t
1170: 32 20 53 45 54 20 61 3d 62 2c 20 62 3d 62 2b 31  2 SET a=b, b=b+1
1180: 30 30 30 30 3b 0a 20 20 53 45 4c 45 43 54 20 62  0000;.  SELECT b
1190: 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 61   FROM t2 WHERE a
11a0: 3d 31 35 3b 0a 7d 20 7b 31 30 30 31 35 7d 0a 64  =15;.} {10015}.d
11b0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69  o_execsql_test i
11c0: 6e 64 65 78 36 2d 32 2e 31 30 32 20 7b 0a 20 20  ndex6-2.102 {.  
11d0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 32 61  CREATE INDEX t2a
11e0: 32 20 4f 4e 20 74 32 28 61 29 20 57 48 45 52 45  2 ON t2(a) WHERE
11f0: 20 61 3c 31 30 30 20 4f 52 20 61 3e 32 30 30 3b   a<100 OR a>200;
1200: 0a 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  .  SELECT b FROM
1210: 20 74 32 20 57 48 45 52 45 20 61 3d 31 35 3b 0a   t2 WHERE a=15;.
1220: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
1230: 74 79 5f 63 68 65 63 6b 3b 0a 7d 20 7b 31 30 30  ty_check;.} {100
1240: 31 35 20 6f 6b 7d 0a 64 6f 5f 65 78 65 63 73 71  15 ok}.do_execsq
1250: 6c 5f 74 65 73 74 20 69 6e 64 65 78 36 2d 32 2e  l_test index6-2.
1260: 31 30 32 65 71 70 20 7b 0a 20 20 45 58 50 4c 41  102eqp {.  EXPLA
1270: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  IN QUERY PLAN.  
1280: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
1290: 20 57 48 45 52 45 20 61 3d 31 35 3b 0a 7d 20 7b   WHERE a=15;.} {
12a0: 7e 2f 2e 2a 49 4e 44 45 58 20 74 32 61 32 2e 2a  ~/.*INDEX t2a2.*
12b0: 2f 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  /}.do_execsql_te
12c0: 73 74 20 69 6e 64 65 78 36 2d 32 2e 31 30 33 20  st index6-2.103 
12d0: 7b 0a 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  {.  SELECT b FRO
12e0: 4d 20 74 32 20 57 48 45 52 45 20 61 3d 31 35 20  M t2 WHERE a=15 
12f0: 41 4e 44 20 61 3c 31 30 30 3b 0a 7d 20 7b 31 30  AND a<100;.} {10
1300: 30 31 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  015}.do_execsql_
1310: 74 65 73 74 20 69 6e 64 65 78 36 2d 32 2e 31 30  test index6-2.10
1320: 33 65 71 70 20 7b 0a 20 20 45 58 50 4c 41 49 4e  3eqp {.  EXPLAIN
1330: 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 53 45   QUERY PLAN.  SE
1340: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 57  LECT b FROM t2 W
1350: 48 45 52 45 20 61 3d 31 35 20 41 4e 44 20 61 3c  HERE a=15 AND a<
1360: 31 30 30 3b 0a 7d 20 7b 2f 2e 2a 49 4e 44 45 58  100;.} {/.*INDEX
1370: 20 74 32 61 32 2e 2a 2f 7d 0a 64 6f 5f 65 78 65   t2a2.*/}.do_exe
1380: 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 36  csql_test index6
1390: 2d 32 2e 31 30 34 20 7b 0a 20 20 53 45 4c 45 43  -2.104 {.  SELEC
13a0: 54 20 62 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T b FROM t2 WHER
13b0: 45 20 61 3d 35 31 35 20 41 4e 44 20 61 3e 32 30  E a=515 AND a>20
13c0: 30 3b 0a 7d 20 7b 31 30 35 31 35 7d 0a 64 6f 5f  0;.} {10515}.do_
13d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64  execsql_test ind
13e0: 65 78 36 2d 32 2e 31 30 34 65 71 70 20 7b 0a 20  ex6-2.104eqp {. 
13f0: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
1400: 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20 62 20 46  LAN.  SELECT b F
1410: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 61 3d 35  ROM t2 WHERE a=5
1420: 31 35 20 41 4e 44 20 61 3e 32 30 30 3b 0a 7d 20  15 AND a>200;.} 
1430: 7b 2f 2e 2a 49 4e 44 45 58 20 74 32 61 32 2e 2a  {/.*INDEX t2a2.*
1440: 2f 7d 0a 0a 23 20 50 61 72 74 69 61 6c 20 55 4e  /}..# Partial UN
1450: 49 51 55 45 20 69 6e 64 69 63 65 73 0a 23 0a 64  IQUE indices.#.d
1460: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69  o_execsql_test i
1470: 6e 64 65 78 36 2d 33 2e 31 20 7b 0a 20 20 43 52  ndex6-3.1 {.  CR
1480: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c  EATE TABLE t3(a,
1490: 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  b);.  INSERT INT
14a0: 4f 20 74 33 20 53 45 4c 45 43 54 20 76 61 6c 75  O t3 SELECT valu
14b0: 65 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20 6e 75  e, value FROM nu
14c0: 6d 73 20 57 48 45 52 45 20 76 61 6c 75 65 3c 32  ms WHERE value<2
14d0: 30 30 3b 0a 20 20 55 50 44 41 54 45 20 74 33 20  00;.  UPDATE t3 
14e0: 53 45 54 20 61 3d 39 39 39 20 57 48 45 52 45 20  SET a=999 WHERE 
14f0: 62 25 35 21 3d 30 3b 0a 20 20 43 52 45 41 54 45  b%5!=0;.  CREATE
1500: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 74 33   UNIQUE INDEX t3
1510: 61 20 4f 4e 20 74 33 28 61 29 20 57 48 45 52 45  a ON t3(a) WHERE
1520: 20 61 3c 3e 39 39 39 3b 0a 7d 20 7b 7d 0a 64 6f   a<>999;.} {}.do
1530: 5f 74 65 73 74 20 69 6e 64 65 78 36 2d 33 2e 32  _test index6-3.2
1540: 20 7b 0a 20 20 23 20 75 6e 61 62 6c 65 20 74 6f   {.  # unable to
1550: 20 69 6e 73 65 72 74 20 61 20 64 75 70 6c 69 63   insert a duplic
1560: 61 74 65 20 72 6f 77 20 61 2d 76 61 6c 75 65 20  ate row a-value 
1570: 74 68 61 74 20 69 73 20 6e 6f 74 20 39 39 39 2e  that is not 999.
1580: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
1590: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
15a0: 28 61 2c 62 29 20 56 41 4c 55 45 53 28 31 35 30  (a,b) VALUES(150
15b0: 2c 20 27 74 65 73 74 31 27 29 3b 0a 20 20 7d 0a  , 'test1');.  }.
15c0: 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e  } {1 {UNIQUE con
15d0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20  straint failed: 
15e0: 74 33 2e 61 7d 7d 0a 64 6f 5f 74 65 73 74 20 69  t3.a}}.do_test i
15f0: 6e 64 65 78 36 2d 33 2e 33 20 7b 0a 20 20 23 20  ndex6-3.3 {.  # 
1600: 63 61 6e 20 69 6e 73 65 72 74 20 6d 75 6c 74 69  can insert multi
1610: 70 6c 65 20 72 6f 77 73 20 77 69 74 68 20 61 3d  ple rows with a=
1620: 3d 39 39 39 20 62 65 63 61 75 73 65 20 73 75 63  =999 because suc
1630: 68 20 72 6f 77 73 20 61 72 65 20 6e 6f 74 0a 20  h rows are not. 
1640: 20 23 20 70 61 72 74 20 6f 66 20 74 68 65 20 75   # part of the u
1650: 6e 69 71 75 65 20 69 6e 64 65 78 2e 0a 20 20 63  nique index..  c
1660: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e  atchsql {.    IN
1670: 53 45 52 54 20 49 4e 54 4f 20 74 33 28 61 2c 62  SERT INTO t3(a,b
1680: 29 20 56 41 4c 55 45 53 28 39 39 39 2c 20 27 74  ) VALUES(999, 't
1690: 65 73 74 31 27 29 2c 20 28 39 39 39 2c 20 27 74  est1'), (999, 't
16a0: 65 73 74 32 27 29 3b 0a 20 20 7d 0a 7d 20 7b 30  est2');.  }.} {0
16b0: 20 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {}}.do_execsql_
16c0: 74 65 73 74 20 69 6e 64 65 78 36 2d 33 2e 34 20  test index6-3.4 
16d0: 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  {.  SELECT count
16e0: 28 2a 29 20 46 52 4f 4d 20 74 33 20 57 48 45 52  (*) FROM t3 WHER
16f0: 45 20 61 3d 39 39 39 3b 0a 7d 20 7b 31 36 32 7d  E a=999;.} {162}
1700: 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  .integrity_check
1710: 20 69 6e 64 65 78 36 2d 33 2e 35 0a 0a 64 6f 5f   index6-3.5..do_
1720: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64  execsql_test ind
1730: 65 78 36 2d 34 2e 30 20 7b 0a 20 20 56 41 43 55  ex6-4.0 {.  VACU
1740: 55 4d 3b 0a 20 20 50 52 41 47 4d 41 20 69 6e 74  UM;.  PRAGMA int
1750: 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 7d 20  egrity_check;.} 
1760: 7b 6f 6b 7d 0a 0a 23 20 53 69 6c 65 6e 74 6c 79  {ok}..# Silently
1770: 20 69 67 6e 6f 72 65 20 64 61 74 61 62 61 73 65   ignore database
1780: 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 73   name qualifiers
1790: 20 69 6e 20 70 61 72 74 69 61 6c 20 69 6e 64 69   in partial indi
17a0: 63 65 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  ces..#.do_execsq
17b0: 6c 5f 74 65 73 74 20 69 6e 64 65 78 36 2d 35 2e  l_test index6-5.
17c0: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  0 {.  CREATE IND
17d0: 45 58 20 74 33 62 20 4f 4e 20 74 33 28 62 29 20  EX t3b ON t3(b) 
17e0: 57 48 45 52 45 20 78 79 7a 7a 79 2e 74 33 2e 62  WHERE xyzzy.t3.b
17f0: 20 42 45 54 57 45 45 4e 20 35 20 41 4e 44 20 31   BETWEEN 5 AND 1
1800: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 2f 2a 20 5e 5e 5e 5e 5e 2d 2d 20 69 67 6e    /* ^^^^^-- ign
1830: 6f 72 65 64 20 2a 2f 0a 20 20 41 4e 41 4c 59 5a  ored */.  ANALYZ
1840: 45 3b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  E;.  SELECT coun
1850: 74 28 2a 29 20 46 52 4f 4d 20 74 33 20 57 48 45  t(*) FROM t3 WHE
1860: 52 45 20 74 33 2e 62 20 42 45 54 57 45 45 4e 20  RE t3.b BETWEEN 
1870: 35 20 41 4e 44 20 31 30 3b 0a 20 20 53 45 4c 45  5 AND 10;.  SELE
1880: 43 54 20 73 74 61 74 2b 30 20 46 52 4f 4d 20 73  CT stat+0 FROM s
1890: 71 6c 69 74 65 5f 73 74 61 74 31 20 57 48 45 52  qlite_stat1 WHER
18a0: 45 20 69 64 78 3d 27 74 33 62 27 3b 0a 7d 20 7b  E idx='t3b';.} {
18b0: 36 20 36 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73  6 6}..finish_tes
18c0: 74 0a                                            t.