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

Artifact 7102ec371414c42dfb1d5ca37eb4519aa9edc23a:


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 32 3d 3d 30  ULL WHERE b%2==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 35 30   NULL;.  }.} {50
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: 65 78 65 63 73 71 6c 20 41 4e 41 4c 59 5a 45 0a  execsql ANALYZE.
0f80: 20 20 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 36    do_test index6
0f90: 2d 32 2e 33 73 74 61 74 34 20 7b 0a 20 20 20 20  -2.3stat4 {.    
0fa0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
0fb0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
0fc0: 41 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  AN.      SELECT 
0fd0: 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  * FROM t2 WHERE 
0fe0: 61 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 3b 0a 20  a IS NOT NULL;. 
0ff0: 20 20 20 7d 0a 20 20 7d 20 7b 2f 2e 2a 20 54 41     }.  } {/.* TA
1000: 42 4c 45 20 74 32 20 55 53 49 4e 47 20 49 4e 44  BLE t2 USING IND
1010: 45 58 20 74 32 61 31 20 2e 2a 2f 7d 0a 7d 20 65  EX t2a1 .*/}.} e
1020: 6c 73 65 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  lse {.  do_test 
1030: 69 6e 64 65 78 36 2d 32 2e 33 73 74 61 74 34 20  index6-2.3stat4 
1040: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
1050: 20 20 20 20 20 20 45 58 50 4c 41 49 4e 20 51 55        EXPLAIN QU
1060: 45 52 59 20 50 4c 41 4e 0a 20 20 20 20 20 20 53  ERY PLAN.      S
1070: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
1080: 57 48 45 52 45 20 61 20 49 53 20 4e 4f 54 20 4e  WHERE a IS NOT N
1090: 55 4c 4c 20 41 4e 44 20 61 3e 30 3b 0a 20 20 20  ULL AND a>0;.   
10a0: 20 7d 0a 20 20 7d 20 7b 2f 2e 2a 20 54 41 42 4c   }.  } {/.* TABL
10b0: 45 20 74 32 20 55 53 49 4e 47 20 49 4e 44 45 58  E t2 USING INDEX
10c0: 20 74 32 61 31 20 2e 2a 2f 7d 0a 7d 0a 64 6f 5f   t2a1 .*/}.}.do_
10d0: 74 65 73 74 20 69 6e 64 65 78 36 2d 32 2e 34 20  test index6-2.4 
10e0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
10f0: 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20    EXPLAIN QUERY 
1100: 50 4c 41 4e 0a 20 20 20 20 53 45 4c 45 43 54 20  PLAN.    SELECT 
1110: 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  * FROM t2 WHERE 
1120: 61 20 49 53 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d  a IS NULL;.  }.}
1130: 20 7b 7e 2f 2e 2a 49 4e 44 45 58 20 74 32 61 31   {~/.*INDEX t2a1
1140: 2e 2a 2f 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  .*/}..do_execsql
1150: 5f 74 65 73 74 20 69 6e 64 65 78 36 2d 32 2e 31  _test index6-2.1
1160: 30 31 20 7b 0a 20 20 44 52 4f 50 20 49 4e 44 45  01 {.  DROP INDE
1170: 58 20 74 32 61 31 3b 0a 20 20 55 50 44 41 54 45  X t2a1;.  UPDATE
1180: 20 74 32 20 53 45 54 20 61 3d 62 2c 20 62 3d 62   t2 SET a=b, b=b
1190: 2b 31 30 30 30 30 3b 0a 20 20 53 45 4c 45 43 54  +10000;.  SELECT
11a0: 20 62 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   b FROM t2 WHERE
11b0: 20 61 3d 31 35 3b 0a 7d 20 7b 31 30 30 31 35 7d   a=15;.} {10015}
11c0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
11d0: 20 69 6e 64 65 78 36 2d 32 2e 31 30 32 20 7b 0a   index6-2.102 {.
11e0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74    CREATE INDEX t
11f0: 32 61 32 20 4f 4e 20 74 32 28 61 29 20 57 48 45  2a2 ON t2(a) WHE
1200: 52 45 20 61 3c 31 30 30 20 4f 52 20 61 3e 32 30  RE a<100 OR a>20
1210: 30 3b 0a 20 20 53 45 4c 45 43 54 20 62 20 46 52  0;.  SELECT b FR
1220: 4f 4d 20 74 32 20 57 48 45 52 45 20 61 3d 31 35  OM t2 WHERE a=15
1230: 3b 0a 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67  ;.  PRAGMA integ
1240: 72 69 74 79 5f 63 68 65 63 6b 3b 0a 7d 20 7b 31  rity_check;.} {1
1250: 30 30 31 35 20 6f 6b 7d 0a 64 6f 5f 65 78 65 63  0015 ok}.do_exec
1260: 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 36 2d  sql_test index6-
1270: 32 2e 31 30 32 65 71 70 20 7b 0a 20 20 45 58 50  2.102eqp {.  EXP
1280: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a  LAIN QUERY PLAN.
1290: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
12a0: 74 32 20 57 48 45 52 45 20 61 3d 31 35 3b 0a 7d  t2 WHERE a=15;.}
12b0: 20 7b 7e 2f 2e 2a 49 4e 44 45 58 20 74 32 61 32   {~/.*INDEX t2a2
12c0: 2e 2a 2f 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  .*/}.do_execsql_
12d0: 74 65 73 74 20 69 6e 64 65 78 36 2d 32 2e 31 30  test index6-2.10
12e0: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 62 20 46  3 {.  SELECT b F
12f0: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 61 3d 31  ROM t2 WHERE a=1
1300: 35 20 41 4e 44 20 61 3c 31 30 30 3b 0a 7d 20 7b  5 AND a<100;.} {
1310: 31 30 30 31 35 7d 0a 64 6f 5f 65 78 65 63 73 71  10015}.do_execsq
1320: 6c 5f 74 65 73 74 20 69 6e 64 65 78 36 2d 32 2e  l_test index6-2.
1330: 31 30 33 65 71 70 20 7b 0a 20 20 45 58 50 4c 41  103eqp {.  EXPLA
1340: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  IN QUERY PLAN.  
1350: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
1360: 20 57 48 45 52 45 20 61 3d 31 35 20 41 4e 44 20   WHERE a=15 AND 
1370: 61 3c 31 30 30 3b 0a 7d 20 7b 2f 2e 2a 49 4e 44  a<100;.} {/.*IND
1380: 45 58 20 74 32 61 32 2e 2a 2f 7d 0a 64 6f 5f 65  EX t2a2.*/}.do_e
1390: 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65  xecsql_test inde
13a0: 78 36 2d 32 2e 31 30 34 20 7b 0a 20 20 53 45 4c  x6-2.104 {.  SEL
13b0: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 57 48  ECT b FROM t2 WH
13c0: 45 52 45 20 61 3d 35 31 35 20 41 4e 44 20 61 3e  ERE a=515 AND a>
13d0: 32 30 30 3b 0a 7d 20 7b 31 30 35 31 35 7d 0a 64  200;.} {10515}.d
13e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69  o_execsql_test i
13f0: 6e 64 65 78 36 2d 32 2e 31 30 34 65 71 70 20 7b  ndex6-2.104eqp {
1400: 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  .  EXPLAIN QUERY
1410: 20 50 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20 62   PLAN.  SELECT b
1420: 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 61   FROM t2 WHERE a
1430: 3d 35 31 35 20 41 4e 44 20 61 3e 32 30 30 3b 0a  =515 AND a>200;.
1440: 7d 20 7b 2f 2e 2a 49 4e 44 45 58 20 74 32 61 32  } {/.*INDEX t2a2
1450: 2e 2a 2f 7d 0a 0a 23 20 50 61 72 74 69 61 6c 20  .*/}..# Partial 
1460: 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73 0a 23  UNIQUE indices.#
1470: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1480: 20 69 6e 64 65 78 36 2d 33 2e 31 20 7b 0a 20 20   index6-3.1 {.  
1490: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
14a0: 61 2c 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  a,b);.  INSERT I
14b0: 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20 76 61  NTO t3 SELECT va
14c0: 6c 75 65 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20  lue, value FROM 
14d0: 6e 75 6d 73 20 57 48 45 52 45 20 76 61 6c 75 65  nums WHERE value
14e0: 3c 32 30 30 3b 0a 20 20 55 50 44 41 54 45 20 74  <200;.  UPDATE t
14f0: 33 20 53 45 54 20 61 3d 39 39 39 20 57 48 45 52  3 SET a=999 WHER
1500: 45 20 62 25 35 21 3d 30 3b 0a 20 20 43 52 45 41  E b%5!=0;.  CREA
1510: 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20  TE UNIQUE INDEX 
1520: 74 33 61 20 4f 4e 20 74 33 28 61 29 20 57 48 45  t3a ON t3(a) WHE
1530: 52 45 20 61 3c 3e 39 39 39 3b 0a 7d 20 7b 7d 0a  RE a<>999;.} {}.
1540: 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 36 2d 33  do_test index6-3
1550: 2e 32 20 7b 0a 20 20 23 20 75 6e 61 62 6c 65 20  .2 {.  # unable 
1560: 74 6f 20 69 6e 73 65 72 74 20 61 20 64 75 70 6c  to insert a dupl
1570: 69 63 61 74 65 20 72 6f 77 20 61 2d 76 61 6c 75  icate row a-valu
1580: 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 39 39  e that is not 99
1590: 39 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  9..  catchsql {.
15a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
15b0: 74 33 28 61 2c 62 29 20 56 41 4c 55 45 53 28 31  t3(a,b) VALUES(1
15c0: 35 30 2c 20 27 74 65 73 74 31 27 29 3b 0a 20 20  50, 'test1');.  
15d0: 7d 0a 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20 63  }.} {1 {UNIQUE c
15e0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
15f0: 3a 20 74 33 2e 61 7d 7d 0a 64 6f 5f 74 65 73 74  : t3.a}}.do_test
1600: 20 69 6e 64 65 78 36 2d 33 2e 33 20 7b 0a 20 20   index6-3.3 {.  
1610: 23 20 63 61 6e 20 69 6e 73 65 72 74 20 6d 75 6c  # can insert mul
1620: 74 69 70 6c 65 20 72 6f 77 73 20 77 69 74 68 20  tiple rows with 
1630: 61 3d 3d 39 39 39 20 62 65 63 61 75 73 65 20 73  a==999 because s
1640: 75 63 68 20 72 6f 77 73 20 61 72 65 20 6e 6f 74  uch rows are not
1650: 0a 20 20 23 20 70 61 72 74 20 6f 66 20 74 68 65  .  # part of the
1660: 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 0a 20   unique index.. 
1670: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
1680: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 28 61  INSERT INTO t3(a
1690: 2c 62 29 20 56 41 4c 55 45 53 28 39 39 39 2c 20  ,b) VALUES(999, 
16a0: 27 74 65 73 74 31 27 29 2c 20 28 39 39 39 2c 20  'test1'), (999, 
16b0: 27 74 65 73 74 32 27 29 3b 0a 20 20 7d 0a 7d 20  'test2');.  }.} 
16c0: 7b 30 20 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  {0 {}}.do_execsq
16d0: 6c 5f 74 65 73 74 20 69 6e 64 65 78 36 2d 33 2e  l_test index6-3.
16e0: 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75  4 {.  SELECT cou
16f0: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 33 20 57 48  nt(*) FROM t3 WH
1700: 45 52 45 20 61 3d 39 39 39 3b 0a 7d 20 7b 31 36  ERE a=999;.} {16
1710: 32 7d 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65  2}.integrity_che
1720: 63 6b 20 69 6e 64 65 78 36 2d 33 2e 35 0a 0a 64  ck index6-3.5..d
1730: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69  o_execsql_test i
1740: 6e 64 65 78 36 2d 34 2e 30 20 7b 0a 20 20 56 41  ndex6-4.0 {.  VA
1750: 43 55 55 4d 3b 0a 20 20 50 52 41 47 4d 41 20 69  CUUM;.  PRAGMA i
1760: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
1770: 7d 20 7b 6f 6b 7d 0a 0a 23 20 53 69 6c 65 6e 74  } {ok}..# Silent
1780: 6c 79 20 69 67 6e 6f 72 65 20 64 61 74 61 62 61  ly ignore databa
1790: 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65  se name qualifie
17a0: 72 73 20 69 6e 20 70 61 72 74 69 61 6c 20 69 6e  rs in partial in
17b0: 64 69 63 65 73 2e 0a 23 0a 64 6f 5f 65 78 65 63  dices..#.do_exec
17c0: 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 36 2d  sql_test index6-
17d0: 35 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 49  5.0 {.  CREATE I
17e0: 4e 44 45 58 20 74 33 62 20 4f 4e 20 74 33 28 62  NDEX t3b ON t3(b
17f0: 29 20 57 48 45 52 45 20 78 79 7a 7a 79 2e 74 33  ) WHERE xyzzy.t3
1800: 2e 62 20 42 45 54 57 45 45 4e 20 35 20 41 4e 44  .b BETWEEN 5 AND
1810: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20   10;.           
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1830: 20 20 20 20 2f 2a 20 5e 5e 5e 5e 5e 2d 2d 20 69      /* ^^^^^-- i
1840: 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 41 4e 41 4c  gnored */.  ANAL
1850: 59 5a 45 3b 0a 20 20 53 45 4c 45 43 54 20 63 6f  YZE;.  SELECT co
1860: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 33 20 57  unt(*) FROM t3 W
1870: 48 45 52 45 20 74 33 2e 62 20 42 45 54 57 45 45  HERE t3.b BETWEE
1880: 4e 20 35 20 41 4e 44 20 31 30 3b 0a 20 20 53 45  N 5 AND 10;.  SE
1890: 4c 45 43 54 20 73 74 61 74 2b 30 20 46 52 4f 4d  LECT stat+0 FROM
18a0: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 57 48   sqlite_stat1 WH
18b0: 45 52 45 20 69 64 78 3d 27 74 33 62 27 3b 0a 7d  ERE idx='t3b';.}
18c0: 20 7b 36 20 36 7d 0a 0a 23 20 54 65 73 74 20 63   {6 6}..# Test c
18d0: 61 73 65 20 66 6f 72 20 74 69 63 6b 65 74 20 5b  ase for ticket [
18e0: 32 65 61 33 65 39 66 65 36 33 37 39 66 63 33 66  2ea3e9fe6379fc3f
18f0: 36 63 65 37 65 30 39 30 63 65 34 38 33 63 31 61  6ce7e090ce483c1a
1900: 33 61 38 30 64 36 63 39 5d 20 66 72 6f 6d 0a 23  3a80d6c9] from.#
1910: 20 32 30 31 34 2d 30 34 2d 31 33 3a 20 50 61 72   2014-04-13: Par
1920: 74 69 61 6c 20 69 6e 64 65 78 20 63 61 75 73 65  tial index cause
1930: 73 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c  s assertion faul
1940: 74 20 6f 6e 20 55 50 44 41 54 45 20 4f 52 20 52  t on UPDATE OR R
1950: 45 50 4c 41 43 45 2e 0a 23 0a 64 6f 5f 65 78 65  EPLACE..#.do_exe
1960: 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 36  csql_test index6
1970: 2d 36 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  -6.0 {.  CREATE 
1980: 54 41 42 4c 45 20 74 36 28 61 2c 62 29 3b 0a 20  TABLE t6(a,b);. 
1990: 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49   CREATE UNIQUE I
19a0: 4e 44 45 58 20 74 36 61 62 20 4f 4e 20 74 31 28  NDEX t6ab ON t1(
19b0: 61 2c 62 29 3b 0a 20 20 43 52 45 41 54 45 20 49  a,b);.  CREATE I
19c0: 4e 44 45 58 20 74 36 62 20 4f 4e 20 74 36 28 62  NDEX t6b ON t6(b
19d0: 29 20 57 48 45 52 45 20 62 3d 31 3b 0a 20 20 49  ) WHERE b=1;.  I
19e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 28 61 2c  NSERT INTO t6(a,
19f0: 62 29 20 56 41 4c 55 45 53 28 31 32 33 2c 34 35  b) VALUES(123,45
1a00: 36 29 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  6);.  SELECT * F
1a10: 52 4f 4d 20 74 36 3b 0a 7d 20 7b 31 32 33 20 34  ROM t6;.} {123 4
1a20: 35 36 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  56}.do_execsql_t
1a30: 65 73 74 20 69 6e 64 65 78 36 2d 36 2e 31 20 7b  est index6-6.1 {
1a40: 0a 20 20 55 50 44 41 54 45 20 4f 52 20 52 45 50  .  UPDATE OR REP
1a50: 4c 41 43 45 20 74 36 20 53 45 54 20 62 3d 37 38  LACE t6 SET b=78
1a60: 39 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  9;.  SELECT * FR
1a70: 4f 4d 20 74 36 3b 0a 7d 20 7b 31 32 33 20 37 38  OM t6;.} {123 78
1a80: 39 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  9}.do_execsql_te
1a90: 73 74 20 69 6e 64 65 78 36 2d 36 2e 32 20 7b 0a  st index6-6.2 {.
1aa0: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
1ab0: 74 79 5f 63 68 65 63 6b 3b 0a 7d 20 7b 6f 6b 7d  ty_check;.} {ok}
1ac0: 0a 0a 23 20 54 65 73 74 20 63 61 73 65 20 66 6f  ..# Test case fo
1ad0: 72 20 74 69 63 6b 65 74 20 5b 32 33 32 36 63 32  r ticket [2326c2
1ae0: 35 38 64 30 32 65 61 64 33 33 64 36 39 66 61 61  58d02ead33d69faa
1af0: 36 33 64 65 38 66 34 36 38 36 62 39 62 31 62 39  63de8f4686b9b1b9
1b00: 64 39 5d 20 6f 6e 0a 23 20 32 30 31 35 2d 30 32  d9] on.# 2015-02
1b10: 2d 32 34 2e 20 20 41 6e 79 20 75 73 65 20 6f 66  -24.  Any use of
1b20: 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
1b30: 20 71 75 61 6c 69 66 79 69 6e 67 20 63 6f 6e 73   qualifying cons
1b40: 74 72 61 69 6e 74 20 69 6e 73 69 64 65 0a 23 20  traint inside.# 
1b50: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  the ON clause of
1b60: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 77 61 73   a LEFT JOIN was
1b70: 20 63 61 75 73 69 6e 67 20 69 6e 63 6f 72 72 65   causing incorre
1b80: 63 74 20 72 65 73 75 6c 74 73 20 66 6f 72 20 61  ct results for a
1b90: 6c 6c 0a 23 20 76 65 72 73 69 6f 6e 73 20 6f 66  ll.# versions of
1ba0: 20 53 51 4c 69 74 65 20 33 2e 38 2e 30 20 74 68   SQLite 3.8.0 th
1bb0: 72 6f 75 67 68 20 33 2e 38 2e 38 2e 0a 23 0a 64  rough 3.8.8..#.d
1bc0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69  o_execsql_test i
1bd0: 6e 64 65 78 36 2d 37 2e 30 20 7b 0a 20 20 43 52  ndex6-7.0 {.  CR
1be0: 45 41 54 45 20 54 41 42 4c 45 20 74 37 61 28 78  EATE TABLE t7a(x
1bf0: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
1c00: 45 20 74 37 62 28 79 29 3b 0a 20 20 49 4e 53 45  E t7b(y);.  INSE
1c10: 52 54 20 49 4e 54 4f 20 74 37 61 28 78 29 20 56  RT INTO t7a(x) V
1c20: 41 4c 55 45 53 28 31 29 3b 0a 20 20 43 52 45 41  ALUES(1);.  CREA
1c30: 54 45 20 49 4e 44 45 58 20 74 37 61 78 20 4f 4e  TE INDEX t7ax ON
1c40: 20 74 37 61 28 78 29 20 57 48 45 52 45 20 78 3d   t7a(x) WHERE x=
1c50: 39 39 3b 0a 20 20 50 52 41 47 4d 41 20 61 75 74  99;.  PRAGMA aut
1c60: 6f 6d 61 74 69 63 5f 69 6e 64 65 78 3d 4f 46 46  omatic_index=OFF
1c70: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
1c80: 4d 20 74 37 61 20 4c 45 46 54 20 4a 4f 49 4e 20  M t7a LEFT JOIN 
1c90: 74 37 62 20 4f 4e 20 28 78 3d 39 39 29 20 4f 52  t7b ON (x=99) OR
1ca0: 44 45 52 20 42 59 20 78 3b 0a 7d 20 7b 31 20 7b  DER BY x;.} {1 {
1cb0: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
1cc0: 73 74 20 69 6e 64 65 78 36 2d 37 2e 31 20 7b 0a  st index6-7.1 {.
1cd0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37    INSERT INTO t7
1ce0: 62 28 79 29 20 56 41 4c 55 45 53 28 32 29 3b 0a  b(y) VALUES(2);.
1cf0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1d00: 74 37 61 20 4a 4f 49 4e 20 74 37 62 20 4f 4e 20  t7a JOIN t7b ON 
1d10: 28 78 3d 39 39 29 20 4f 52 44 45 52 20 42 59 20  (x=99) ORDER BY 
1d20: 78 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73  x;.} {}.do_execs
1d30: 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 36 2d 37  ql_test index6-7
1d40: 2e 32 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e  .2 {.  INSERT IN
1d50: 54 4f 20 74 37 61 28 78 29 20 56 41 4c 55 45 53  TO t7a(x) VALUES
1d60: 28 39 39 29 3b 0a 20 20 53 45 4c 45 43 54 20 2a  (99);.  SELECT *
1d70: 20 46 52 4f 4d 20 74 37 61 20 4c 45 46 54 20 4a   FROM t7a LEFT J
1d80: 4f 49 4e 20 74 37 62 20 4f 4e 20 28 78 3d 39 39  OIN t7b ON (x=99
1d90: 29 20 4f 52 44 45 52 20 42 59 20 78 3b 0a 7d 20  ) ORDER BY x;.} 
1da0: 7b 31 20 7b 7d 20 39 39 20 32 7d 0a 64 6f 5f 65  {1 {} 99 2}.do_e
1db0: 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65  xecsql_test inde
1dc0: 78 36 2d 37 2e 33 20 7b 0a 20 20 53 45 4c 45 43  x6-7.3 {.  SELEC
1dd0: 54 20 2a 20 46 52 4f 4d 20 74 37 61 20 4a 4f 49  T * FROM t7a JOI
1de0: 4e 20 74 37 62 20 4f 4e 20 28 78 3d 39 39 29 20  N t7b ON (x=99) 
1df0: 4f 52 44 45 52 20 42 59 20 78 3b 0a 7d 20 7b 39  ORDER BY x;.} {9
1e00: 39 20 32 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  9 2}.do_execsql_
1e10: 74 65 73 74 20 69 6e 64 65 78 36 2d 37 2e 34 20  test index6-7.4 
1e20: 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  {.  EXPLAIN QUER
1e30: 59 20 50 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20  Y PLAN.  SELECT 
1e40: 2a 20 46 52 4f 4d 20 74 37 61 20 4a 4f 49 4e 20  * FROM t7a JOIN 
1e50: 74 37 62 20 4f 4e 20 28 78 3d 39 39 29 20 4f 52  t7b ON (x=99) OR
1e60: 44 45 52 20 42 59 20 78 3b 0a 7d 20 7b 2f 55 53  DER BY x;.} {/US
1e70: 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
1e80: 45 58 20 74 37 61 78 2f 7d 0a 0a 0a 64 6f 5f 65  EX t7ax/}...do_e
1e90: 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65  xecsql_test inde
1ea0: 78 36 2d 38 2e 30 20 7b 0a 20 20 43 52 45 41 54  x6-8.0 {.  CREAT
1eb0: 45 20 54 41 42 4c 45 20 74 38 61 28 61 2c 62 29  E TABLE t8a(a,b)
1ec0: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
1ed0: 20 74 38 62 28 78 2c 79 29 3b 0a 20 20 43 52 45   t8b(x,y);.  CRE
1ee0: 41 54 45 20 49 4e 44 45 58 20 69 38 63 20 4f 4e  ATE INDEX i8c ON
1ef0: 20 74 38 62 28 79 29 20 57 48 45 52 45 20 78 20   t8b(y) WHERE x 
1f00: 3d 20 27 76 61 6c 75 65 27 3b 0a 0a 20 20 49 4e  = 'value';..  IN
1f10: 53 45 52 54 20 49 4e 54 4f 20 74 38 61 20 56 41  SERT INTO t8a VA
1f20: 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a  LUES(1, 'one');.
1f30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38    INSERT INTO t8
1f40: 61 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f  a VALUES(2, 'two
1f50: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
1f60: 4f 20 74 38 61 20 56 41 4c 55 45 53 28 33 2c 20  O t8a VALUES(3, 
1f70: 27 74 68 72 65 65 27 29 3b 0a 0a 20 20 49 4e 53  'three');..  INS
1f80: 45 52 54 20 49 4e 54 4f 20 74 38 62 20 56 41 4c  ERT INTO t8b VAL
1f90: 55 45 53 28 27 76 61 6c 75 65 27 2c 20 31 29 3b  UES('value', 1);
1fa0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
1fb0: 38 62 20 56 41 4c 55 45 53 28 27 64 75 6d 6d 79  8b VALUES('dummy
1fc0: 27 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20  ', 2);.  INSERT 
1fd0: 49 4e 54 4f 20 74 38 62 20 56 41 4c 55 45 53 28  INTO t8b VALUES(
1fe0: 27 76 61 6c 75 65 27 2c 20 33 29 3b 0a 20 20 49  'value', 3);.  I
1ff0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 62 20 56  NSERT INTO t8b V
2000: 41 4c 55 45 53 28 27 64 75 6d 6d 79 27 2c 20 34  ALUES('dummy', 4
2010: 29 3b 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65 71 70 5f  );.} {}..do_eqp_
2020: 74 65 73 74 20 69 6e 64 65 78 36 2d 38 2e 31 20  test index6-8.1 
2030: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
2040: 4d 20 74 38 61 20 4c 45 46 54 20 4a 4f 49 4e 20  M t8a LEFT JOIN 
2050: 74 38 62 20 4f 4e 20 28 78 20 3d 20 27 76 61 6c  t8b ON (x = 'val
2060: 75 65 27 20 41 4e 44 20 79 20 3d 20 61 29 0a 7d  ue' AND y = a).}
2070: 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e   {.  0 0 0 {SCAN
2080: 20 54 41 42 4c 45 20 74 38 61 7d 20 0a 20 20 30   TABLE t8a} .  0
2090: 20 31 20 31 20 7b 53 45 41 52 43 48 20 54 41 42   1 1 {SEARCH TAB
20a0: 4c 45 20 74 38 62 20 55 53 49 4e 47 20 49 4e 44  LE t8b USING IND
20b0: 45 58 20 69 38 63 20 28 79 3d 3f 29 7d 0a 7d 0a  EX i8c (y=?)}.}.
20c0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
20d0: 20 69 6e 64 65 78 36 2d 38 2e 32 20 7b 0a 20 20   index6-8.2 {.  
20e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 38  SELECT * FROM t8
20f0: 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 38 62 20  a LEFT JOIN t8b 
2100: 4f 4e 20 28 78 20 3d 20 27 76 61 6c 75 65 27 20  ON (x = 'value' 
2110: 41 4e 44 20 79 20 3d 20 61 29 0a 7d 20 7b 0a 20  AND y = a).} {. 
2120: 20 31 20 6f 6e 65 20 76 61 6c 75 65 20 31 20 0a   1 one value 1 .
2130: 20 20 32 20 74 77 6f 20 7b 7d 20 7b 7d 20 0a 20    2 two {} {} . 
2140: 20 33 20 74 68 72 65 65 20 76 61 6c 75 65 20 33   3 three value 3
2150: 0a 7d 0a 0a 23 20 32 30 31 35 2d 30 36 2d 31 31  .}..# 2015-06-11
2160: 2e 20 20 41 73 73 65 72 74 69 6f 6e 20 66 61 75  .  Assertion fau
2170: 6c 74 20 66 6f 75 6e 64 20 62 79 20 41 46 4c 0a  lt found by AFL.
2180: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
2190: 74 20 69 6e 64 65 78 36 2d 39 2e 31 20 7b 0a 20  t index6-9.1 {. 
21a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 39   CREATE TABLE t9
21b0: 28 61 20 69 6e 74 2c 20 62 20 69 6e 74 2c 20 63  (a int, b int, c
21c0: 20 69 6e 74 29 3b 0a 20 20 43 52 45 41 54 45 20   int);.  CREATE 
21d0: 49 4e 44 45 58 20 74 39 63 61 20 4f 4e 20 74 39  INDEX t9ca ON t9
21e0: 28 63 2c 61 29 20 57 48 45 52 45 20 61 20 69 6e  (c,a) WHERE a in
21f0: 20 28 31 30 2c 31 32 2c 32 30 29 3b 0a 20 20 49   (10,12,20);.  I
2200: 4e 53 45 52 54 20 49 4e 54 4f 20 74 39 20 56 41  NSERT INTO t9 VA
2210: 4c 55 45 53 28 31 2c 31 2c 39 29 2c 28 31 30 2c  LUES(1,1,9),(10,
2220: 32 2c 33 35 29 2c 28 31 31 2c 31 35 2c 38 32 29  2,35),(11,15,82)
2230: 2c 28 32 30 2c 31 39 2c 35 29 2c 28 4e 55 4c 4c  ,(20,19,5),(NULL
2240: 2c 37 2c 33 29 3b 0a 20 20 55 50 44 41 54 45 20  ,7,3);.  UPDATE 
2250: 74 39 20 53 45 54 20 62 3d 63 20 57 48 45 52 45  t9 SET b=c WHERE
2260: 20 61 20 69 6e 20 28 31 30 2c 31 32 2c 32 30 29   a in (10,12,20)
2270: 3b 0a 20 20 53 45 4c 45 43 54 20 61 2c 62 2c 63  ;.  SELECT a,b,c
2280: 2c 27 7c 27 20 46 52 4f 4d 20 74 39 20 4f 52 44  ,'|' FROM t9 ORD
2290: 45 52 20 42 59 20 61 3b 0a 7d 20 7b 7b 7d 20 37  ER BY a;.} {{} 7
22a0: 20 33 20 7c 20 31 20 31 20 39 20 7c 20 31 30 20   3 | 1 1 9 | 10 
22b0: 33 35 20 33 35 20 7c 20 31 31 20 31 35 20 38 32  35 35 | 11 15 82
22c0: 20 7c 20 32 30 20 35 20 35 20 7c 7d 0a 64 6f 5f   | 20 5 5 |}.do_
22d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64  execsql_test ind
22e0: 65 78 36 2d 39 2e 32 20 7b 0a 20 20 44 52 4f 50  ex6-9.2 {.  DROP
22f0: 20 54 41 42 4c 45 20 74 39 3b 0a 20 20 43 52 45   TABLE t9;.  CRE
2300: 41 54 45 20 54 41 42 4c 45 20 74 39 28 61 20 69  ATE TABLE t9(a i
2310: 6e 74 2c 20 62 20 69 6e 74 2c 20 63 20 69 6e 74  nt, b int, c int
2320: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 29  , PRIMARY KEY(a)
2330: 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b  ) WITHOUT ROWID;
2340: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
2350: 74 39 63 61 20 4f 4e 20 74 39 28 63 2c 61 29 20  t9ca ON t9(c,a) 
2360: 57 48 45 52 45 20 61 20 69 6e 20 28 31 30 2c 31  WHERE a in (10,1
2370: 32 2c 32 30 29 3b 0a 20 20 49 4e 53 45 52 54 20  2,20);.  INSERT 
2380: 49 4e 54 4f 20 74 39 20 56 41 4c 55 45 53 28 31  INTO t9 VALUES(1
2390: 2c 31 2c 39 29 2c 28 31 30 2c 32 2c 33 35 29 2c  ,1,9),(10,2,35),
23a0: 28 31 31 2c 31 35 2c 38 32 29 2c 28 32 30 2c 31  (11,15,82),(20,1
23b0: 39 2c 35 29 3b 0a 20 20 55 50 44 41 54 45 20 74  9,5);.  UPDATE t
23c0: 39 20 53 45 54 20 62 3d 63 20 57 48 45 52 45 20  9 SET b=c WHERE 
23d0: 61 20 69 6e 20 28 31 30 2c 31 32 2c 32 30 29 3b  a in (10,12,20);
23e0: 0a 20 20 53 45 4c 45 43 54 20 61 2c 62 2c 63 2c  .  SELECT a,b,c,
23f0: 27 7c 27 20 46 52 4f 4d 20 74 39 20 4f 52 44 45  '|' FROM t9 ORDE
2400: 52 20 42 59 20 61 3b 0a 7d 20 7b 31 20 31 20 39  R BY a;.} {1 1 9
2410: 20 7c 20 31 30 20 33 35 20 33 35 20 7c 20 31 31   | 10 35 35 | 11
2420: 20 31 35 20 38 32 20 7c 20 32 30 20 35 20 35 20   15 82 | 20 5 5 
2430: 7c 7d 0a 0a 23 20 41 4e 44 2d 63 6f 6e 6e 65 63  |}..# AND-connec
2440: 74 65 64 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ted terms in the
2450: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
2460: 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
2470: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
2480: 73 74 20 69 6e 64 65 78 36 2d 31 30 2e 31 20 7b  st index6-10.1 {
2490: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
24a0: 74 31 30 28 61 2c 62 2c 63 2c 64 2c 65 20 49 4e  t10(a,b,c,d,e IN
24b0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
24c0: 59 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  Y);.  INSERT INT
24d0: 4f 20 74 31 30 20 56 41 4c 55 45 53 0a 20 20 20  O t10 VALUES.   
24e0: 20 28 31 2c 32 2c 33 2c 34 2c 35 29 2c 0a 20 20   (1,2,3,4,5),.  
24f0: 20 20 28 32 2c 33 2c 34 2c 35 2c 36 29 2c 0a 20    (2,3,4,5,6),. 
2500: 20 20 20 28 33 2c 34 2c 35 2c 36 2c 37 29 2c 0a     (3,4,5,6,7),.
2510: 20 20 20 20 28 31 2c 32 2c 33 2c 38 2c 39 29 3b      (1,2,3,8,9);
2520: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
2530: 74 31 30 78 20 4f 4e 20 74 31 30 28 64 29 20 57  t10x ON t10(d) W
2540: 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3d 32  HERE a=1 AND b=2
2550: 20 41 4e 44 20 63 3d 33 3b 0a 20 20 53 45 4c 45   AND c=3;.  SELE
2560: 43 54 20 65 20 46 52 4f 4d 20 74 31 30 20 57 48  CT e FROM t10 WH
2570: 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3d 32 20  ERE a=1 AND b=2 
2580: 41 4e 44 20 63 3d 33 20 4f 52 44 45 52 20 42 59  AND c=3 ORDER BY
2590: 20 64 3b 0a 7d 20 7b 35 20 39 7d 0a 64 6f 5f 65   d;.} {5 9}.do_e
25a0: 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65  xecsql_test inde
25b0: 78 36 2d 31 30 2e 31 65 71 70 20 7b 0a 20 20 45  x6-10.1eqp {.  E
25c0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
25d0: 4e 0a 20 20 53 45 4c 45 43 54 20 65 20 46 52 4f  N.  SELECT e FRO
25e0: 4d 20 74 31 30 20 57 48 45 52 45 20 61 3d 31 20  M t10 WHERE a=1 
25f0: 41 4e 44 20 62 3d 32 20 41 4e 44 20 63 3d 33 20  AND b=2 AND c=3 
2600: 4f 52 44 45 52 20 42 59 20 64 3b 0a 7d 20 7b 2f  ORDER BY d;.} {/
2610: 55 53 49 4e 47 20 49 4e 44 45 58 20 74 31 30 78  USING INDEX t10x
2620: 2f 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  /}.do_execsql_te
2630: 73 74 20 69 6e 64 65 78 36 2d 31 30 2e 32 20 7b  st index6-10.2 {
2640: 0a 20 20 53 45 4c 45 43 54 20 65 20 46 52 4f 4d  .  SELECT e FROM
2650: 20 74 31 30 20 57 48 45 52 45 20 63 3d 33 20 41   t10 WHERE c=3 A
2660: 4e 44 20 32 3d 62 20 41 4e 44 20 61 3d 31 20 4f  ND 2=b AND a=1 O
2670: 52 44 45 52 20 42 59 20 64 20 44 45 53 43 3b 0a  RDER BY d DESC;.
2680: 7d 20 7b 39 20 35 7d 0a 64 6f 5f 65 78 65 63 73  } {9 5}.do_execs
2690: 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 36 2d 31  ql_test index6-1
26a0: 30 2e 32 65 71 70 20 7b 0a 20 20 45 58 50 4c 41  0.2eqp {.  EXPLA
26b0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  IN QUERY PLAN.  
26c0: 53 45 4c 45 43 54 20 65 20 46 52 4f 4d 20 74 31  SELECT e FROM t1
26d0: 30 20 57 48 45 52 45 20 63 3d 33 20 41 4e 44 20  0 WHERE c=3 AND 
26e0: 32 3d 62 20 41 4e 44 20 61 3d 31 20 4f 52 44 45  2=b AND a=1 ORDE
26f0: 52 20 42 59 20 64 20 44 45 53 43 3b 0a 7d 20 7b  R BY d DESC;.} {
2700: 2f 55 53 49 4e 47 20 49 4e 44 45 58 20 74 31 30  /USING INDEX t10
2710: 78 2f 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  x/}.do_execsql_t
2720: 65 73 74 20 69 6e 64 65 78 36 2d 31 30 2e 33 20  est index6-10.3 
2730: 7b 0a 20 20 53 45 4c 45 43 54 20 65 20 46 52 4f  {.  SELECT e FRO
2740: 4d 20 74 31 30 20 57 48 45 52 45 20 61 3d 31 20  M t10 WHERE a=1 
2750: 41 4e 44 20 62 3d 32 20 4f 52 44 45 52 20 42 59  AND b=2 ORDER BY
2760: 20 64 20 44 45 53 43 3b 0a 7d 20 7b 39 20 35 7d   d DESC;.} {9 5}
2770: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2780: 20 69 6e 64 65 78 36 2d 31 30 2e 33 65 71 70 20   index6-10.3eqp 
2790: 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  {.  EXPLAIN QUER
27a0: 59 20 50 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20  Y PLAN.  SELECT 
27b0: 65 20 46 52 4f 4d 20 74 31 30 20 57 48 45 52 45  e FROM t10 WHERE
27c0: 20 61 3d 31 20 41 4e 44 20 62 3d 32 20 4f 52 44   a=1 AND b=2 ORD
27d0: 45 52 20 42 59 20 64 20 44 45 53 43 3b 0a 7d 20  ER BY d DESC;.} 
27e0: 7b 7e 2f 55 53 49 4e 47 20 49 4e 44 45 58 20 74  {~/USING INDEX t
27f0: 31 30 78 2f 7d 0a 0a 66 69 6e 69 73 68 5f 74 65  10x/}..finish_te
2800: 73 74 0a                                         st.