/ Hex Artifact Content
Login

Artifact 2a5a1b654f50ca0768fb10ae44b72e6a776b1f18:


0000: 23 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72  # 2001 September
0010: 20 31 35 0a 23 0a 23 20 54 68 65 20 61 75 74 68   15.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 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 2a 2a 2a 0a 23 20 54 68 69 73  *********.# This
0170: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0180: 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74   regression test
0190: 73 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62  s for SQLite lib
01a0: 72 61 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63  rary.  The.# foc
01b0: 75 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  us of this file 
01c0: 69 73 20 74 65 73 74 69 6e 67 20 74 68 65 20 43  is testing the C
01d0: 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
01e0: 65 6d 65 6e 74 2e 0a 23 0a 23 20 24 49 64 3a 20  ement..#.# $Id: 
01f0: 69 6e 64 65 78 2e 74 65 73 74 2c 76 20 31 2e 32  index.test,v 1.2
0200: 30 20 32 30 30 32 2f 30 38 2f 31 33 20 32 33 3a  0 2002/08/13 23:
0210: 30 32 3a 35 38 20 64 72 68 20 45 78 70 20 24 0a  02:58 drh Exp $.
0220: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69  .set testdir [fi
0230: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76  le dirname $argv
0240: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64  0].source $testd
0250: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 23  ir/tester.tcl..#
0260: 20 43 72 65 61 74 65 20 61 20 62 61 73 69 63 20   Create a basic 
0270: 69 6e 64 65 78 20 61 6e 64 20 76 65 72 69 66 79  index and verify
0280: 20 69 74 20 69 73 20 61 64 64 65 64 20 74 6f 20   it is added to 
0290: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 23 0a  sqlite_master.#.
02a0: 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 31 2e  do_test index-1.
02b0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 43  1 {.  execsql {C
02c0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 65 73 74  REATE TABLE test
02d0: 31 28 66 31 20 69 6e 74 2c 20 66 32 20 69 6e 74  1(f1 int, f2 int
02e0: 2c 20 66 33 20 69 6e 74 29 7d 0a 20 20 65 78 65  , f3 int)}.  exe
02f0: 63 73 71 6c 20 7b 43 52 45 41 54 45 20 49 4e 44  csql {CREATE IND
0300: 45 58 20 69 6e 64 65 78 31 20 4f 4e 20 74 65 73  EX index1 ON tes
0310: 74 31 28 66 31 29 7d 0a 20 20 65 78 65 63 73 71  t1(f1)}.  execsq
0320: 6c 20 7b 53 45 4c 45 43 54 20 6e 61 6d 65 20 46  l {SELECT name F
0330: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
0340: 72 20 57 48 45 52 45 20 74 79 70 65 21 3d 27 6d  r WHERE type!='m
0350: 65 74 61 27 20 4f 52 44 45 52 20 42 59 20 6e 61  eta' ORDER BY na
0360: 6d 65 7d 0a 7d 20 7b 69 6e 64 65 78 31 20 74 65  me}.} {index1 te
0370: 73 74 31 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64  st1}.do_test ind
0380: 65 78 2d 31 2e 31 62 20 7b 0a 20 20 65 78 65 63  ex-1.1b {.  exec
0390: 73 71 6c 20 7b 53 45 4c 45 43 54 20 6e 61 6d 65  sql {SELECT name
03a0: 2c 20 73 71 6c 2c 20 74 62 6c 5f 6e 61 6d 65 2c  , sql, tbl_name,
03b0: 20 74 79 70 65 20 46 52 4f 4d 20 73 71 6c 69 74   type FROM sqlit
03c0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 20 20 20 20  e_master .      
03d0: 20 20 20 20 20 57 48 45 52 45 20 6e 61 6d 65 3d       WHERE name=
03e0: 27 69 6e 64 65 78 31 27 7d 0a 7d 20 7b 69 6e 64  'index1'}.} {ind
03f0: 65 78 31 20 7b 43 52 45 41 54 45 20 49 4e 44 45  ex1 {CREATE INDE
0400: 58 20 69 6e 64 65 78 31 20 4f 4e 20 74 65 73 74  X index1 ON test
0410: 31 28 66 31 29 7d 20 74 65 73 74 31 20 69 6e 64  1(f1)} test1 ind
0420: 65 78 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65  ex}.do_test inde
0430: 78 2d 31 2e 31 63 20 7b 0a 20 20 64 62 20 63 6c  x-1.1c {.  db cl
0440: 6f 73 65 0a 20 20 73 71 6c 69 74 65 20 64 62 20  ose.  sqlite db 
0450: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
0460: 6c 20 7b 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20  l {SELECT name, 
0470: 73 71 6c 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 74  sql, tbl_name, t
0480: 79 70 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ype FROM sqlite_
0490: 6d 61 73 74 65 72 20 0a 20 20 20 20 20 20 20 20  master .        
04a0: 20 20 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 69     WHERE name='i
04b0: 6e 64 65 78 31 27 7d 0a 7d 20 7b 69 6e 64 65 78  ndex1'}.} {index
04c0: 31 20 7b 43 52 45 41 54 45 20 49 4e 44 45 58 20  1 {CREATE INDEX 
04d0: 69 6e 64 65 78 31 20 4f 4e 20 74 65 73 74 31 28  index1 ON test1(
04e0: 66 31 29 7d 20 74 65 73 74 31 20 69 6e 64 65 78  f1)} test1 index
04f0: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d  }.do_test index-
0500: 31 2e 31 64 20 7b 0a 20 20 64 62 20 63 6c 6f 73  1.1d {.  db clos
0510: 65 0a 20 20 73 71 6c 69 74 65 20 64 62 20 74 65  e.  sqlite db te
0520: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
0530: 7b 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  {SELECT name FRO
0540: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
0550: 57 48 45 52 45 20 74 79 70 65 21 3d 27 6d 65 74  WHERE type!='met
0560: 61 27 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65  a' ORDER BY name
0570: 7d 0a 7d 20 7b 69 6e 64 65 78 31 20 74 65 73 74  }.} {index1 test
0580: 31 7d 0a 0a 23 20 56 65 72 69 66 79 20 74 68 61  1}..# Verify tha
0590: 74 20 74 68 65 20 69 6e 64 65 78 20 64 69 65 73  t the index dies
05a0: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 0a   with the table.
05b0: 23 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d  #.do_test index-
05c0: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
05d0: 7b 44 52 4f 50 20 54 41 42 4c 45 20 74 65 73 74  {DROP TABLE test
05e0: 31 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45  1}.  execsql {SE
05f0: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
0600: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
0610: 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20  RE type!='meta' 
0620: 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 7d 0a 7d  ORDER BY name}.}
0630: 20 7b 7d 0a 0a 23 20 54 72 79 20 61 64 64 69 6e   {}..# Try addin
0640: 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 20  g an index to a 
0650: 74 61 62 6c 65 20 74 68 61 74 20 64 6f 65 73 20  table that does 
0660: 6e 6f 74 20 65 78 69 73 74 0a 23 0a 64 6f 5f 74  not exist.#.do_t
0670: 65 73 74 20 69 6e 64 65 78 2d 32 2e 31 20 7b 0a  est index-2.1 {.
0680: 20 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b    set v [catch {
0690: 65 78 65 63 73 71 6c 20 7b 43 52 45 41 54 45 20  execsql {CREATE 
06a0: 49 4e 44 45 58 20 69 6e 64 65 78 31 20 4f 4e 20  INDEX index1 ON 
06b0: 74 65 73 74 31 28 66 31 29 7d 7d 20 6d 73 67 5d  test1(f1)}} msg]
06c0: 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73  .  lappend v $ms
06d0: 67 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20  g.} {1 {no such 
06e0: 74 61 62 6c 65 3a 20 74 65 73 74 31 7d 7d 0a 0a  table: test1}}..
06f0: 23 20 54 72 79 20 61 64 64 69 6e 67 20 61 6e 20  # Try adding an 
0700: 69 6e 64 65 78 20 6f 6e 20 61 20 63 6f 6c 75 6d  index on a colum
0710: 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 77 68 65  n of a table whe
0720: 72 65 20 74 68 65 20 74 61 62 6c 65 0a 23 20 65  re the table.# e
0730: 78 69 73 74 73 20 62 75 74 20 74 68 65 20 63 6f  xists but the co
0740: 6c 75 6d 6e 20 64 6f 65 73 20 6e 6f 74 2e 0a 23  lumn does not..#
0750: 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 32  .do_test index-2
0760: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
0770: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 65 73  CREATE TABLE tes
0780: 74 31 28 66 31 20 69 6e 74 2c 20 66 32 20 69 6e  t1(f1 int, f2 in
0790: 74 2c 20 66 33 20 69 6e 74 29 7d 0a 20 20 73 65  t, f3 int)}.  se
07a0: 74 20 76 20 5b 63 61 74 63 68 20 7b 65 78 65 63  t v [catch {exec
07b0: 73 71 6c 20 7b 43 52 45 41 54 45 20 49 4e 44 45  sql {CREATE INDE
07c0: 58 20 69 6e 64 65 78 31 20 4f 4e 20 74 65 73 74  X index1 ON test
07d0: 31 28 66 34 29 7d 7d 20 6d 73 67 5d 0a 20 20 6c  1(f4)}} msg].  l
07e0: 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d 20  append v $msg.} 
07f0: 7b 31 20 7b 74 61 62 6c 65 20 74 65 73 74 31 20  {1 {table test1 
0800: 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
0810: 6d 65 64 20 66 34 7d 7d 0a 0a 23 20 54 72 79 20  med f4}}..# Try 
0820: 61 6e 20 69 6e 64 65 78 20 77 69 74 68 20 73 6f  an index with so
0830: 6d 65 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  me columns that 
0840: 6d 61 74 63 68 20 61 6e 64 20 6f 74 68 65 72 73  match and others
0850: 20 74 68 61 74 20 64 6f 20 6e 6f 77 2e 0a 23 0a   that do now..#.
0860: 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 32 2e  do_test index-2.
0870: 32 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61 74  2 {.  set v [cat
0880: 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 43 52 45  ch {execsql {CRE
0890: 41 54 45 20 49 4e 44 45 58 20 69 6e 64 65 78 31  ATE INDEX index1
08a0: 20 4f 4e 20 74 65 73 74 31 28 66 31 2c 20 66 32   ON test1(f1, f2
08b0: 2c 20 66 34 2c 20 66 33 29 7d 7d 20 6d 73 67 5d  , f4, f3)}} msg]
08c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 44 52 4f 50  .  execsql {DROP
08d0: 20 54 41 42 4c 45 20 74 65 73 74 31 7d 0a 20 20   TABLE test1}.  
08e0: 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67 0a 7d  lappend v $msg.}
08f0: 20 7b 31 20 7b 74 61 62 6c 65 20 74 65 73 74 31   {1 {table test1
0900: 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
0910: 61 6d 65 64 20 66 34 7d 7d 0a 0a 23 20 54 72 79  amed f4}}..# Try
0920: 20 63 72 65 61 74 69 6e 67 20 61 20 62 75 6e 63   creating a bunc
0930: 68 20 6f 66 20 69 6e 64 69 63 65 73 20 6f 6e 20  h of indices on 
0940: 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 0a 23  the same table.#
0950: 0a 73 65 74 20 72 20 7b 7d 0a 66 6f 72 20 7b 73  .set r {}.for {s
0960: 65 74 20 69 20 31 7d 20 7b 24 69 3c 31 30 30 7d  et i 1} {$i<100}
0970: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 6c 61   {incr i} {.  la
0980: 70 70 65 6e 64 20 72 20 5b 66 6f 72 6d 61 74 20  ppend r [format 
0990: 69 6e 64 65 78 25 30 32 64 20 24 69 5d 0a 7d 0a  index%02d $i].}.
09a0: 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 33 2e  do_test index-3.
09b0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 43  1 {.  execsql {C
09c0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 65 73 74  REATE TABLE test
09d0: 31 28 66 31 20 69 6e 74 2c 20 66 32 20 69 6e 74  1(f1 int, f2 int
09e0: 2c 20 66 33 20 69 6e 74 2c 20 66 34 20 69 6e 74  , f3 int, f4 int
09f0: 2c 20 66 35 20 69 6e 74 29 7d 0a 20 20 66 6f 72  , f5 int)}.  for
0a00: 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 3c 31   {set i 1} {$i<1
0a10: 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  00} {incr i} {. 
0a20: 20 20 20 73 65 74 20 73 71 6c 20 22 43 52 45 41     set sql "CREA
0a30: 54 45 20 49 4e 44 45 58 20 5b 66 6f 72 6d 61 74  TE INDEX [format
0a40: 20 69 6e 64 65 78 25 30 32 64 20 24 69 5d 20 4f   index%02d $i] O
0a50: 4e 20 74 65 73 74 31 28 66 5b 65 78 70 72 20 7b  N test1(f[expr {
0a60: 28 24 69 25 35 29 2b 31 7d 5d 29 22 0a 20 20 20  ($i%5)+1}])".   
0a70: 20 65 78 65 63 73 71 6c 20 24 73 71 6c 0a 20 20   execsql $sql.  
0a80: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  }.  execsql {SEL
0a90: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
0aa0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20 20  lite_master .   
0ab0: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 74 79          WHERE ty
0ac0: 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74  pe='index' AND t
0ad0: 62 6c 5f 6e 61 6d 65 3d 27 74 65 73 74 31 27 0a  bl_name='test1'.
0ae0: 20 20 20 20 20 20 20 20 20 20 20 4f 52 44 45 52             ORDER
0af0: 20 42 59 20 6e 61 6d 65 7d 0a 7d 20 24 72 0a 0a   BY name}.} $r..
0b00: 0a 23 20 56 65 72 69 66 79 20 74 68 61 74 20 61  .# Verify that a
0b10: 6c 6c 20 74 68 65 20 69 6e 64 69 63 65 73 20 67  ll the indices g
0b20: 6f 20 61 77 61 79 20 77 68 65 6e 20 77 65 20 64  o away when we d
0b30: 72 6f 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 23  rop the table..#
0b40: 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 33  .do_test index-3
0b50: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
0b60: 44 52 4f 50 20 54 41 42 4c 45 20 74 65 73 74 31  DROP TABLE test1
0b70: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  }.  execsql {SEL
0b80: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
0b90: 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20 20  lite_master .   
0ba0: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 74 79          WHERE ty
0bb0: 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74  pe='index' AND t
0bc0: 62 6c 5f 6e 61 6d 65 3d 27 74 65 73 74 31 27 0a  bl_name='test1'.
0bd0: 20 20 20 20 20 20 20 20 20 20 20 4f 52 44 45 52             ORDER
0be0: 20 42 59 20 6e 61 6d 65 7d 0a 7d 20 7b 7d 0a 0a   BY name}.} {}..
0bf0: 23 20 43 72 65 61 74 65 20 61 20 74 61 62 6c 65  # Create a table
0c00: 20 61 6e 64 20 69 6e 73 65 72 74 20 76 61 6c 75   and insert valu
0c10: 65 73 20 69 6e 74 6f 20 74 68 61 74 20 74 61 62  es into that tab
0c20: 6c 65 2e 20 20 54 68 65 6e 20 63 72 65 61 74 65  le.  Then create
0c30: 0a 23 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 74  .# an index on t
0c40: 68 61 74 20 74 61 62 6c 65 2e 20 20 56 65 72 69  hat table.  Veri
0c50: 66 79 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  fy that we can s
0c60: 65 6c 65 63 74 20 76 61 6c 75 65 73 0a 23 20 66  elect values.# f
0c70: 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 63 6f  rom the table co
0c80: 72 72 65 63 74 6c 79 20 75 73 69 6e 67 20 74 68  rrectly using th
0c90: 65 20 69 6e 64 65 78 2e 0a 23 0a 23 20 4e 6f 74  e index..#.# Not
0ca0: 65 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  e that the index
0cb0: 20 6e 61 6d 65 73 20 22 69 6e 64 65 78 39 22 20   names "index9" 
0cc0: 61 6e 64 20 22 69 6e 64 65 78 74 22 20 61 72 65  and "indext" are
0cd0: 20 63 68 6f 73 65 6e 20 62 65 63 61 75 73 65 0a   chosen because.
0ce0: 23 20 74 68 65 79 20 62 6f 74 68 20 68 61 76 65  # they both have
0cf0: 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 2e 0a   the same hash..
0d00: 23 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d  #.do_test index-
0d10: 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.1 {.  execsql 
0d20: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 65  {CREATE TABLE te
0d30: 73 74 31 28 63 6e 74 20 69 6e 74 2c 20 70 6f 77  st1(cnt int, pow
0d40: 65 72 20 69 6e 74 29 7d 0a 20 20 66 6f 72 20 7b  er int)}.  for {
0d50: 73 65 74 20 69 20 31 7d 20 7b 24 69 3c 32 30 7d  set i 1} {$i<20}
0d60: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
0d70: 65 78 65 63 73 71 6c 20 22 49 4e 53 45 52 54 20  execsql "INSERT 
0d80: 49 4e 54 4f 20 74 65 73 74 31 20 56 41 4c 55 45  INTO test1 VALUE
0d90: 53 28 24 69 2c 5b 65 78 70 72 20 7b 69 6e 74 28  S($i,[expr {int(
0da0: 70 6f 77 28 32 2c 24 69 29 29 7d 5d 29 22 0a 20  pow(2,$i))}])". 
0db0: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 43 52   }.  execsql {CR
0dc0: 45 41 54 45 20 49 4e 44 45 58 20 69 6e 64 65 78  EATE INDEX index
0dd0: 39 20 4f 4e 20 74 65 73 74 31 28 63 6e 74 29 7d  9 ON test1(cnt)}
0de0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 43 52 45 41  .  execsql {CREA
0df0: 54 45 20 49 4e 44 45 58 20 69 6e 64 65 78 74 20  TE INDEX indext 
0e00: 4f 4e 20 74 65 73 74 31 28 70 6f 77 65 72 29 7d  ON test1(power)}
0e10: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
0e20: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
0e30: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
0e40: 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20 4f 52   type!='meta' OR
0e50: 44 45 52 20 42 59 20 6e 61 6d 65 7d 0a 7d 20 7b  DER BY name}.} {
0e60: 69 6e 64 65 78 39 20 69 6e 64 65 78 74 20 74 65  index9 indext te
0e70: 73 74 31 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64  st1}.do_test ind
0e80: 65 78 2d 34 2e 32 20 7b 0a 20 20 65 78 65 63 73  ex-4.2 {.  execs
0e90: 71 6c 20 7b 53 45 4c 45 43 54 20 63 6e 74 20 46  ql {SELECT cnt F
0ea0: 52 4f 4d 20 74 65 73 74 31 20 57 48 45 52 45 20  ROM test1 WHERE 
0eb0: 70 6f 77 65 72 3d 34 7d 0a 7d 20 7b 32 7d 0a 64  power=4}.} {2}.d
0ec0: 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 34 2e 33  o_test index-4.3
0ed0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
0ee0: 4c 45 43 54 20 63 6e 74 20 46 52 4f 4d 20 74 65  LECT cnt FROM te
0ef0: 73 74 31 20 57 48 45 52 45 20 70 6f 77 65 72 3d  st1 WHERE power=
0f00: 31 30 32 34 7d 0a 7d 20 7b 31 30 7d 0a 64 6f 5f  1024}.} {10}.do_
0f10: 74 65 73 74 20 69 6e 64 65 78 2d 34 2e 34 20 7b  test index-4.4 {
0f20: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
0f30: 43 54 20 70 6f 77 65 72 20 46 52 4f 4d 20 74 65  CT power FROM te
0f40: 73 74 31 20 57 48 45 52 45 20 63 6e 74 3d 36 7d  st1 WHERE cnt=6}
0f50: 0a 7d 20 7b 36 34 7d 0a 64 6f 5f 74 65 73 74 20  .} {64}.do_test 
0f60: 69 6e 64 65 78 2d 34 2e 35 20 7b 0a 20 20 65 78  index-4.5 {.  ex
0f70: 65 63 73 71 6c 20 7b 44 52 4f 50 20 49 4e 44 45  ecsql {DROP INDE
0f80: 58 20 69 6e 64 65 78 74 7d 0a 20 20 65 78 65 63  X indext}.  exec
0f90: 73 71 6c 20 7b 53 45 4c 45 43 54 20 70 6f 77 65  sql {SELECT powe
0fa0: 72 20 46 52 4f 4d 20 74 65 73 74 31 20 57 48 45  r FROM test1 WHE
0fb0: 52 45 20 63 6e 74 3d 36 7d 0a 7d 20 7b 36 34 7d  RE cnt=6}.} {64}
0fc0: 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 34  .do_test index-4
0fd0: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
0fe0: 53 45 4c 45 43 54 20 63 6e 74 20 46 52 4f 4d 20  SELECT cnt FROM 
0ff0: 74 65 73 74 31 20 57 48 45 52 45 20 70 6f 77 65  test1 WHERE powe
1000: 72 3d 31 30 32 34 7d 0a 7d 20 7b 31 30 7d 0a 64  r=1024}.} {10}.d
1010: 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 34 2e 37  o_test index-4.7
1020: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 43 52   {.  execsql {CR
1030: 45 41 54 45 20 49 4e 44 45 58 20 69 6e 64 65 78  EATE INDEX index
1040: 74 20 4f 4e 20 74 65 73 74 31 28 63 6e 74 29 7d  t ON test1(cnt)}
1050: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
1060: 43 54 20 70 6f 77 65 72 20 46 52 4f 4d 20 74 65  CT power FROM te
1070: 73 74 31 20 57 48 45 52 45 20 63 6e 74 3d 36 7d  st1 WHERE cnt=6}
1080: 0a 7d 20 7b 36 34 7d 0a 64 6f 5f 74 65 73 74 20  .} {64}.do_test 
1090: 69 6e 64 65 78 2d 34 2e 38 20 7b 0a 20 20 65 78  index-4.8 {.  ex
10a0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 63 6e  ecsql {SELECT cn
10b0: 74 20 46 52 4f 4d 20 74 65 73 74 31 20 57 48 45  t FROM test1 WHE
10c0: 52 45 20 70 6f 77 65 72 3d 31 30 32 34 7d 0a 7d  RE power=1024}.}
10d0: 20 7b 31 30 7d 0a 64 6f 5f 74 65 73 74 20 69 6e   {10}.do_test in
10e0: 64 65 78 2d 34 2e 39 20 7b 0a 20 20 65 78 65 63  dex-4.9 {.  exec
10f0: 73 71 6c 20 7b 44 52 4f 50 20 49 4e 44 45 58 20  sql {DROP INDEX 
1100: 69 6e 64 65 78 39 7d 0a 20 20 65 78 65 63 73 71  index9}.  execsq
1110: 6c 20 7b 53 45 4c 45 43 54 20 70 6f 77 65 72 20  l {SELECT power 
1120: 46 52 4f 4d 20 74 65 73 74 31 20 57 48 45 52 45  FROM test1 WHERE
1130: 20 63 6e 74 3d 36 7d 0a 7d 20 7b 36 34 7d 0a 64   cnt=6}.} {64}.d
1140: 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 34 2e 31  o_test index-4.1
1150: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  0 {.  execsql {S
1160: 45 4c 45 43 54 20 63 6e 74 20 46 52 4f 4d 20 74  ELECT cnt FROM t
1170: 65 73 74 31 20 57 48 45 52 45 20 70 6f 77 65 72  est1 WHERE power
1180: 3d 31 30 32 34 7d 0a 7d 20 7b 31 30 7d 0a 64 6f  =1024}.} {10}.do
1190: 5f 74 65 73 74 20 69 6e 64 65 78 2d 34 2e 31 31  _test index-4.11
11a0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 44 52   {.  execsql {DR
11b0: 4f 50 20 49 4e 44 45 58 20 69 6e 64 65 78 74 7d  OP INDEX indext}
11c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
11d0: 43 54 20 70 6f 77 65 72 20 46 52 4f 4d 20 74 65  CT power FROM te
11e0: 73 74 31 20 57 48 45 52 45 20 63 6e 74 3d 36 7d  st1 WHERE cnt=6}
11f0: 0a 7d 20 7b 36 34 7d 0a 64 6f 5f 74 65 73 74 20  .} {64}.do_test 
1200: 69 6e 64 65 78 2d 34 2e 31 32 20 7b 0a 20 20 65  index-4.12 {.  e
1210: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 63  xecsql {SELECT c
1220: 6e 74 20 46 52 4f 4d 20 74 65 73 74 31 20 57 48  nt FROM test1 WH
1230: 45 52 45 20 70 6f 77 65 72 3d 31 30 32 34 7d 0a  ERE power=1024}.
1240: 7d 20 7b 31 30 7d 0a 64 6f 5f 74 65 73 74 20 69  } {10}.do_test i
1250: 6e 64 65 78 2d 34 2e 31 33 20 7b 0a 20 20 65 78  ndex-4.13 {.  ex
1260: 65 63 73 71 6c 20 7b 44 52 4f 50 20 54 41 42 4c  ecsql {DROP TABL
1270: 45 20 74 65 73 74 31 7d 0a 20 20 65 78 65 63 73  E test1}.  execs
1280: 71 6c 20 7b 53 45 4c 45 43 54 20 6e 61 6d 65 20  ql {SELECT name 
1290: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
12a0: 65 72 20 57 48 45 52 45 20 74 79 70 65 21 3d 27  er WHERE type!='
12b0: 6d 65 74 61 27 20 4f 52 44 45 52 20 42 59 20 6e  meta' ORDER BY n
12c0: 61 6d 65 7d 0a 7d 20 7b 7d 0a 0a 23 20 44 6f 20  ame}.} {}..# Do 
12d0: 6e 6f 74 20 61 6c 6c 6f 77 20 69 6e 64 69 63 65  not allow indice
12e0: 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
12f0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 23   sqlite_master.#
1300: 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 35  .do_test index-5
1310: 2e 31 20 7b 0a 20 20 73 65 74 20 76 20 5b 63 61  .1 {.  set v [ca
1320: 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 43 52  tch {execsql {CR
1330: 45 41 54 45 20 49 4e 44 45 58 20 69 6e 64 65 78  EATE INDEX index
1340: 31 20 4f 4e 20 73 71 6c 69 74 65 5f 6d 61 73 74  1 ON sqlite_mast
1350: 65 72 28 6e 61 6d 65 29 7d 7d 20 6d 73 67 5d 0a  er(name)}} msg].
1360: 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67    lappend v $msg
1370: 0a 7d 20 7b 31 20 7b 74 61 62 6c 65 20 73 71 6c  .} {1 {table sql
1380: 69 74 65 5f 6d 61 73 74 65 72 20 6d 61 79 20 6e  ite_master may n
1390: 6f 74 20 68 61 76 65 20 6e 65 77 20 69 6e 64 69  ot have new indi
13a0: 63 65 73 20 61 64 64 65 64 7d 7d 0a 64 6f 5f 74  ces added}}.do_t
13b0: 65 73 74 20 69 6e 64 65 78 2d 35 2e 32 20 7b 0a  est index-5.2 {.
13c0: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
13d0: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
13e0: 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
13f0: 74 79 70 65 21 3d 27 6d 65 74 61 27 7d 0a 7d 20  type!='meta'}.} 
1400: 7b 7d 0a 0a 23 20 44 6f 20 6e 6f 74 20 61 6c 6c  {}..# Do not all
1410: 6f 77 20 69 6e 64 69 63 65 73 20 77 69 74 68 20  ow indices with 
1420: 64 75 70 6c 69 63 61 74 65 20 6e 61 6d 65 73 20  duplicate names 
1430: 74 6f 20 62 65 20 61 64 64 65 64 0a 23 0a 64 6f  to be added.#.do
1440: 5f 74 65 73 74 20 69 6e 64 65 78 2d 36 2e 31 20  _test index-6.1 
1450: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 43 52 45  {.  execsql {CRE
1460: 41 54 45 20 54 41 42 4c 45 20 74 65 73 74 31 28  ATE TABLE test1(
1470: 66 31 20 69 6e 74 2c 20 66 32 20 69 6e 74 29 7d  f1 int, f2 int)}
1480: 0a 20 20 65 78 65 63 73 71 6c 20 7b 43 52 45 41  .  execsql {CREA
1490: 54 45 20 54 41 42 4c 45 20 74 65 73 74 32 28 67  TE TABLE test2(g
14a0: 31 20 72 65 61 6c 2c 20 67 32 20 72 65 61 6c 29  1 real, g2 real)
14b0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 43 52 45  }.  execsql {CRE
14c0: 41 54 45 20 49 4e 44 45 58 20 69 6e 64 65 78 31  ATE INDEX index1
14d0: 20 4f 4e 20 74 65 73 74 31 28 66 31 29 7d 0a 20   ON test1(f1)}. 
14e0: 20 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 65   set v [catch {e
14f0: 78 65 63 73 71 6c 20 7b 43 52 45 41 54 45 20 49  xecsql {CREATE I
1500: 4e 44 45 58 20 69 6e 64 65 78 31 20 4f 4e 20 74  NDEX index1 ON t
1510: 65 73 74 32 28 67 31 29 7d 7d 20 6d 73 67 5d 0a  est2(g1)}} msg].
1520: 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67    lappend v $msg
1530: 0a 7d 20 7b 31 20 7b 69 6e 64 65 78 20 69 6e 64  .} {1 {index ind
1540: 65 78 31 20 61 6c 72 65 61 64 79 20 65 78 69 73  ex1 already exis
1550: 74 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64  ts}}.do_test ind
1560: 65 78 2d 36 2e 31 62 20 7b 0a 20 20 65 78 65 63  ex-6.1b {.  exec
1570: 73 71 6c 20 7b 53 45 4c 45 43 54 20 6e 61 6d 65  sql {SELECT name
1580: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
1590: 74 65 72 20 57 48 45 52 45 20 74 79 70 65 21 3d  ter WHERE type!=
15a0: 27 6d 65 74 61 27 20 4f 52 44 45 52 20 42 59 20  'meta' ORDER BY 
15b0: 6e 61 6d 65 7d 0a 7d 20 7b 69 6e 64 65 78 31 20  name}.} {index1 
15c0: 74 65 73 74 31 20 74 65 73 74 32 7d 0a 64 6f 5f  test1 test2}.do_
15d0: 74 65 73 74 20 69 6e 64 65 78 2d 36 2e 32 20 7b  test index-6.2 {
15e0: 0a 20 20 73 65 74 20 76 20 5b 63 61 74 63 68 20  .  set v [catch 
15f0: 7b 65 78 65 63 73 71 6c 20 7b 43 52 45 41 54 45  {execsql {CREATE
1600: 20 49 4e 44 45 58 20 74 65 73 74 31 20 4f 4e 20   INDEX test1 ON 
1610: 74 65 73 74 32 28 67 31 29 7d 7d 20 6d 73 67 5d  test2(g1)}} msg]
1620: 0a 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73  .  lappend v $ms
1630: 67 0a 7d 20 7b 31 20 7b 74 68 65 72 65 20 69 73  g.} {1 {there is
1640: 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65   already a table
1650: 20 6e 61 6d 65 64 20 74 65 73 74 31 7d 7d 0a 64   named test1}}.d
1660: 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 36 2e 32  o_test index-6.2
1670: 62 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  b {.  execsql {S
1680: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
1690: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
16a0: 45 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61 27  ERE type!='meta'
16b0: 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 7d 0a   ORDER BY name}.
16c0: 7d 20 7b 69 6e 64 65 78 31 20 74 65 73 74 31 20  } {index1 test1 
16d0: 74 65 73 74 32 7d 0a 64 6f 5f 74 65 73 74 20 69  test2}.do_test i
16e0: 6e 64 65 78 2d 36 2e 33 20 7b 0a 20 20 65 78 65  ndex-6.3 {.  exe
16f0: 63 73 71 6c 20 7b 44 52 4f 50 20 54 41 42 4c 45  csql {DROP TABLE
1700: 20 74 65 73 74 31 7d 0a 20 20 65 78 65 63 73 71   test1}.  execsq
1710: 6c 20 7b 44 52 4f 50 20 54 41 42 4c 45 20 74 65  l {DROP TABLE te
1720: 73 74 32 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  st2}.  execsql {
1730: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
1740: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
1750: 48 45 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61  HERE type!='meta
1760: 27 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 7d  ' ORDER BY name}
1770: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  .} {}.do_test in
1780: 64 65 78 2d 36 2e 34 20 7b 0a 20 20 65 78 65 63  dex-6.4 {.  exec
1790: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
17a0: 20 54 41 42 4c 45 20 74 65 73 74 31 28 61 2c 62   TABLE test1(a,b
17b0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
17c0: 44 45 58 20 69 6e 64 65 78 31 20 4f 4e 20 74 65  DEX index1 ON te
17d0: 73 74 31 28 61 29 3b 0a 20 20 20 20 43 52 45 41  st1(a);.    CREA
17e0: 54 45 20 49 4e 44 45 58 20 69 6e 64 65 78 32 20  TE INDEX index2 
17f0: 4f 4e 20 74 65 73 74 31 28 62 29 3b 0a 20 20 20  ON test1(b);.   
1800: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 6e   CREATE INDEX in
1810: 64 65 78 33 20 4f 4e 20 74 65 73 74 31 28 61 2c  dex3 ON test1(a,
1820: 62 29 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  b);.    DROP TAB
1830: 4c 45 20 74 65 73 74 31 3b 0a 20 20 20 20 53 45  LE test1;.    SE
1840: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
1850: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
1860: 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20  RE type!='meta' 
1870: 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 0a 20  ORDER BY name;. 
1880: 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 43 72 65 61 74   }.} {}..# Creat
1890: 65 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a  e a primary key.
18a0: 23 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d  #.do_test index-
18b0: 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.1 {.  execsql 
18c0: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 65  {CREATE TABLE te
18d0: 73 74 31 28 66 31 20 69 6e 74 2c 20 66 32 20 69  st1(f1 int, f2 i
18e0: 6e 74 20 70 72 69 6d 61 72 79 20 6b 65 79 29 7d  nt primary key)}
18f0: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 31 7d  .  for {set i 1}
1900: 20 7b 24 69 3c 32 30 7d 20 7b 69 6e 63 72 20 69   {$i<20} {incr i
1910: 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  } {.    execsql 
1920: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 73  "INSERT INTO tes
1930: 74 31 20 56 41 4c 55 45 53 28 24 69 2c 5b 65 78  t1 VALUES($i,[ex
1940: 70 72 20 7b 69 6e 74 28 70 6f 77 28 32 2c 24 69  pr {int(pow(2,$i
1950: 29 29 7d 5d 29 22 0a 20 20 7d 0a 20 20 65 78 65  ))}])".  }.  exe
1960: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75  csql {SELECT cou
1970: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 65 73 74 31  nt(*) FROM test1
1980: 7d 0a 7d 20 7b 31 39 7d 0a 64 6f 5f 74 65 73 74  }.} {19}.do_test
1990: 20 69 6e 64 65 78 2d 37 2e 32 20 7b 0a 20 20 65   index-7.2 {.  e
19a0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 66  xecsql {SELECT f
19b0: 31 20 46 52 4f 4d 20 74 65 73 74 31 20 57 48 45  1 FROM test1 WHE
19c0: 52 45 20 66 32 3d 36 35 35 33 36 7d 0a 7d 20 7b  RE f2=65536}.} {
19d0: 31 36 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65  16}.do_test inde
19e0: 78 2d 37 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  x-7.3 {.  execsq
19f0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  l {.    SELECT n
1a00: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
1a10: 6d 61 73 74 65 72 20 0a 20 20 20 20 57 48 45 52  master .    WHER
1a20: 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41  E type='index' A
1a30: 4e 44 20 74 62 6c 5f 6e 61 6d 65 3d 27 74 65 73  ND tbl_name='tes
1a40: 74 31 27 0a 20 20 7d 0a 7d 20 7b 7b 28 74 65 73  t1'.  }.} {{(tes
1a50: 74 31 20 61 75 74 6f 69 6e 64 65 78 20 31 29 7d  t1 autoindex 1)}
1a60: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d  }.do_test index-
1a70: 37 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.4 {.  execsql 
1a80: 7b 44 52 4f 50 20 74 61 62 6c 65 20 74 65 73 74  {DROP table test
1a90: 31 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45  1}.  execsql {SE
1aa0: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
1ab0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
1ac0: 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61 27 7d  RE type!='meta'}
1ad0: 0a 7d 20 7b 7d 0a 0a 23 20 4d 61 6b 65 20 73 75  .} {}..# Make su
1ae0: 72 65 20 77 65 20 63 61 6e 6e 6f 74 20 64 72 6f  re we cannot dro
1af0: 70 20 61 20 6e 6f 6e 2d 65 78 69 73 74 61 6e 74  p a non-existant
1b00: 20 69 6e 64 65 78 2e 0a 23 0a 64 6f 5f 74 65 73   index..#.do_tes
1b10: 74 20 69 6e 64 65 78 2d 38 2e 31 20 7b 0a 20 20  t index-8.1 {.  
1b20: 73 65 74 20 76 20 5b 63 61 74 63 68 20 7b 65 78  set v [catch {ex
1b30: 65 63 73 71 6c 20 7b 44 52 4f 50 20 49 4e 44 45  ecsql {DROP INDE
1b40: 58 20 69 6e 64 65 78 31 7d 7d 20 6d 73 67 5d 0a  X index1}} msg].
1b50: 20 20 6c 61 70 70 65 6e 64 20 76 20 24 6d 73 67    lappend v $msg
1b60: 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 69  .} {1 {no such i
1b70: 6e 64 65 78 3a 20 69 6e 64 65 78 31 7d 7d 0a 0a  ndex: index1}}..
1b80: 23 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 64  # Make sure we d
1b90: 6f 6e 27 74 20 61 63 74 75 61 6c 6c 79 20 63 72  on't actually cr
1ba0: 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20 77 68  eate an index wh
1bb0: 65 6e 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  en the EXPLAIN k
1bc0: 65 79 77 6f 72 64 0a 23 20 69 73 20 75 73 65 64  eyword.# is used
1bd0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65  ..#.do_test inde
1be0: 78 2d 39 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  x-9.1 {.  execsq
1bf0: 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20  l {CREATE TABLE 
1c00: 74 61 62 31 28 61 20 69 6e 74 29 7d 0a 20 20 65  tab1(a int)}.  e
1c10: 78 65 63 73 71 6c 20 7b 45 58 50 4c 41 49 4e 20  xecsql {EXPLAIN 
1c20: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 64 78  CREATE INDEX idx
1c30: 31 20 4f 4e 20 74 61 62 31 28 61 29 7d 0a 20 20  1 ON tab1(a)}.  
1c40: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
1c50: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
1c60: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 62  _master WHERE tb
1c70: 6c 5f 6e 61 6d 65 3d 27 74 61 62 31 27 7d 0a 7d  l_name='tab1'}.}
1c80: 20 7b 74 61 62 31 7d 0a 64 6f 5f 74 65 73 74 20   {tab1}.do_test 
1c90: 69 6e 64 65 78 2d 39 2e 32 20 7b 0a 20 20 65 78  index-9.2 {.  ex
1ca0: 65 63 73 71 6c 20 7b 43 52 45 41 54 45 20 49 4e  ecsql {CREATE IN
1cb0: 44 45 58 20 69 64 78 31 20 4f 4e 20 74 61 62 31  DEX idx1 ON tab1
1cc0: 28 61 29 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  (a)}.  execsql {
1cd0: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
1ce0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
1cf0: 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 27 74  HERE tbl_name='t
1d00: 61 62 31 27 20 4f 52 44 45 52 20 42 59 20 6e 61  ab1' ORDER BY na
1d10: 6d 65 7d 0a 7d 20 7b 69 64 78 31 20 74 61 62 31  me}.} {idx1 tab1
1d20: 7d 0a 0a 23 20 41 6c 6c 6f 77 20 6d 6f 72 65 20  }..# Allow more 
1d30: 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 77  than one entry w
1d40: 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
1d50: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65  ..#.do_test inde
1d60: 78 2d 31 30 2e 30 20 7b 0a 20 20 65 78 65 63 73  x-10.0 {.  execs
1d70: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1d80: 54 41 42 4c 45 20 74 31 28 61 20 69 6e 74 2c 20  TABLE t1(a int, 
1d90: 62 20 69 6e 74 29 3b 0a 20 20 20 20 43 52 45 41  b int);.    CREA
1da0: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
1db0: 31 28 61 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  1(a);.    INSERT
1dc0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1dd0: 31 2c 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  1,2);.    INSERT
1de0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1df0: 32 2c 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  2,4);.    INSERT
1e00: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1e10: 33 2c 38 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  3,8);.    INSERT
1e20: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1e30: 31 2c 31 32 29 3b 0a 20 20 20 20 53 45 4c 45 43  1,12);.    SELEC
1e40: 54 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T b FROM t1 WHER
1e50: 45 20 61 3d 31 20 4f 52 44 45 52 20 42 59 20 62  E a=1 ORDER BY b
1e60: 3b 0a 20 20 7d 0a 7d 20 7b 32 20 31 32 7d 0a 64  ;.  }.} {2 12}.d
1e70: 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 31 30 2e  o_test index-10.
1e80: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
1e90: 20 20 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f      SELECT b FRO
1ea0: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 32 20 4f  M t1 WHERE a=2 O
1eb0: 52 44 45 52 20 42 59 20 62 3b 0a 20 20 7d 0a 7d  RDER BY b;.  }.}
1ec0: 20 7b 34 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64   {4}.do_test ind
1ed0: 65 78 2d 31 30 2e 32 20 7b 0a 20 20 65 78 65 63  ex-10.2 {.  exec
1ee0: 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
1ef0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
1f00: 3d 31 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  =12;.    SELECT 
1f10: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
1f20: 61 3d 31 20 4f 52 44 45 52 20 42 59 20 62 3b 0a  a=1 ORDER BY b;.
1f30: 20 20 7d 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73    }.} {2}.do_tes
1f40: 74 20 69 6e 64 65 78 2d 31 30 2e 33 20 7b 0a 20  t index-10.3 {. 
1f50: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
1f60: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
1f70: 45 52 45 20 62 3d 32 3b 0a 20 20 20 20 53 45 4c  ERE b=2;.    SEL
1f80: 45 43 54 20 62 20 46 52 4f 4d 20 74 31 20 57 48  ECT b FROM t1 WH
1f90: 45 52 45 20 61 3d 31 20 4f 52 44 45 52 20 42 59  ERE a=1 ORDER BY
1fa0: 20 62 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f   b;.  }.} {}.do_
1fb0: 74 65 73 74 20 69 6e 64 65 78 2d 31 30 2e 34 20  test index-10.4 
1fc0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1fd0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
1fe0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1ff0: 4f 20 74 31 20 56 41 4c 55 45 53 20 28 31 2c 31  O t1 VALUES (1,1
2000: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2010: 54 4f 20 74 31 20 56 41 4c 55 45 53 20 28 31 2c  TO t1 VALUES (1,
2020: 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
2030: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 20 28 31  NTO t1 VALUES (1
2040: 2c 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ,3);.    INSERT 
2050: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 20 28  INTO t1 VALUES (
2060: 31 2c 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  1,4);.    INSERT
2070: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 20   INTO t1 VALUES 
2080: 28 31 2c 35 29 3b 0a 20 20 20 20 49 4e 53 45 52  (1,5);.    INSER
2090: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
20a0: 20 28 31 2c 36 29 3b 0a 20 20 20 20 49 4e 53 45   (1,6);.    INSE
20b0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
20c0: 53 20 28 31 2c 37 29 3b 0a 20 20 20 20 49 4e 53  S (1,7);.    INS
20d0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
20e0: 45 53 20 28 31 2c 38 29 3b 0a 20 20 20 20 49 4e  ES (1,8);.    IN
20f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2100: 55 45 53 20 28 31 2c 39 29 3b 0a 20 20 20 20 49  UES (1,9);.    I
2110: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2120: 4c 55 45 53 20 28 32 2c 30 29 3b 0a 20 20 20 20  LUES (2,0);.    
2130: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31  SELECT b FROM t1
2140: 20 57 48 45 52 45 20 61 3d 31 20 4f 52 44 45 52   WHERE a=1 ORDER
2150: 20 42 59 20 62 3b 0a 20 20 7d 0a 7d 20 7b 31 20   BY b;.  }.} {1 
2160: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 7d  2 3 4 5 6 7 8 9}
2170: 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 31  .do_test index-1
2180: 30 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  0.5 {.  execsql 
2190: 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
21a0: 4d 20 74 31 20 57 48 45 52 45 20 62 20 49 4e 20  M t1 WHERE b IN 
21b0: 28 32 2c 20 34 2c 20 36 2c 20 38 29 3b 0a 20 20  (2, 4, 6, 8);.  
21c0: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
21d0: 74 31 20 57 48 45 52 45 20 61 3d 31 20 4f 52 44  t1 WHERE a=1 ORD
21e0: 45 52 20 42 59 20 62 3b 0a 20 20 7d 0a 7d 20 7b  ER BY b;.  }.} {
21f0: 31 20 33 20 35 20 37 20 39 7d 0a 64 6f 5f 74 65  1 3 5 7 9}.do_te
2200: 73 74 20 69 6e 64 65 78 2d 31 30 2e 36 20 7b 0a  st index-10.6 {.
2210: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2220: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
2230: 48 45 52 45 20 62 3e 32 3b 0a 20 20 20 20 53 45  HERE b>2;.    SE
2240: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31 20 57  LECT b FROM t1 W
2250: 48 45 52 45 20 61 3d 31 20 4f 52 44 45 52 20 42  HERE a=1 ORDER B
2260: 59 20 62 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64  Y b;.  }.} {1}.d
2270: 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 31 30 2e  o_test index-10.
2280: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  7 {.  execsql {.
2290: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
22a0: 74 31 20 57 48 45 52 45 20 62 3d 31 3b 0a 20 20  t1 WHERE b=1;.  
22b0: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
22c0: 74 31 20 57 48 45 52 45 20 61 3d 31 20 4f 52 44  t1 WHERE a=1 ORD
22d0: 45 52 20 42 59 20 62 3b 0a 20 20 7d 0a 7d 20 7b  ER BY b;.  }.} {
22e0: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d  }.do_test index-
22f0: 31 30 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c  10.8 {.  execsql
2300: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 62 20   {.    SELECT b 
2310: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
2320: 20 62 3b 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 0a 23   b;.  }.} {0}..#
2330: 20 41 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   Automatically c
2340: 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20 77  reate an index w
2350: 68 65 6e 20 77 65 20 73 70 65 63 69 66 79 20 61  hen we specify a
2360: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 23 0a   primary key..#.
2370: 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 31 31  do_test index-11
2380: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
2390: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
23a0: 45 20 74 33 28 0a 20 20 20 20 20 20 61 20 74 65  E t3(.      a te
23b0: 78 74 2c 0a 20 20 20 20 20 20 62 20 69 6e 74 2c  xt,.      b int,
23c0: 0a 20 20 20 20 20 20 63 20 66 6c 6f 61 74 2c 0a  .      c float,.
23d0: 20 20 20 20 20 20 50 52 49 4d 41 52 59 20 4b 45        PRIMARY KE
23e0: 59 28 62 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Y(b).    );.  }.
23f0: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20    for {set i 1} 
2400: 7b 24 69 3c 3d 35 30 7d 20 7b 69 6e 63 72 20 69  {$i<=50} {incr i
2410: 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  } {.    execsql 
2420: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20  "INSERT INTO t3 
2430: 56 41 4c 55 45 53 28 27 78 24 7b 69 7d 78 27 2c  VALUES('x${i}x',
2440: 24 69 2c 30 2e 24 69 29 22 0a 20 20 7d 0a 20 20  $i,0.$i)".  }.  
2450: 73 65 74 20 73 71 6c 69 74 65 5f 73 65 61 72 63  set sqlite_searc
2460: 68 5f 63 6f 75 6e 74 20 30 0a 20 20 63 6f 6e 63  h_count 0.  conc
2470: 61 74 20 5b 65 78 65 63 73 71 6c 20 7b 53 45 4c  at [execsql {SEL
2480: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 20 57 48  ECT c FROM t3 WH
2490: 45 52 45 20 62 3d 3d 31 30 7d 5d 20 24 73 71 6c  ERE b==10}] $sql
24a0: 69 74 65 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  ite_search_count
24b0: 0a 7d 20 7b 30 2e 31 30 20 33 7d 0a 0a 23 20 4e  .} {0.10 3}..# N
24c0: 75 6d 65 72 69 63 20 73 74 72 69 6e 67 73 20 73  umeric strings s
24d0: 68 6f 75 6c 64 20 63 6f 6d 70 61 72 65 20 61 73  hould compare as
24e0: 20 69 66 20 74 68 65 79 20 77 65 72 65 20 6e 75   if they were nu
24f0: 6d 62 65 72 73 2e 20 20 53 6f 20 65 76 65 6e 20  mbers.  So even 
2500: 69 66 20 74 68 65 0a 23 20 73 74 72 69 6e 67 73  if the.# strings
2510: 20 61 72 65 20 6e 6f 74 20 63 68 61 72 61 63 74   are not charact
2520: 65 72 2d 62 79 2d 63 68 61 72 61 63 74 65 72 20  er-by-character 
2530: 74 68 65 20 73 61 6d 65 2c 20 69 66 20 74 68 65  the same, if the
2540: 79 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 0a  y represent the.
2550: 23 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 74 68  # same number th
2560: 65 79 20 73 68 6f 75 6c 64 20 63 6f 6d 70 61 72  ey should compar
2570: 65 20 65 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61  e equal to one a
2580: 6e 6f 74 68 65 72 2e 20 20 56 65 72 69 66 79 20  nother.  Verify 
2590: 74 68 61 74 20 74 68 69 73 0a 23 20 69 73 20 74  that this.# is t
25a0: 72 75 65 20 69 6e 20 69 6e 64 69 63 65 73 2e 0a  rue in indices..
25b0: 23 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d  #.do_test index-
25c0: 31 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  12.1 {.  execsql
25d0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
25e0: 42 4c 45 20 74 34 28 61 2c 62 29 3b 0a 20 20 20  BLE t4(a,b);.   
25f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
2600: 56 41 4c 55 45 53 28 27 30 2e 30 27 2c 31 29 3b  VALUES('0.0',1);
2610: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2620: 20 74 34 20 56 41 4c 55 45 53 28 27 30 2e 30 30   t4 VALUES('0.00
2630: 27 2c 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ',2);.    INSERT
2640: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
2650: 27 61 62 63 27 2c 33 29 3b 0a 20 20 20 20 49 4e  'abc',3);.    IN
2660: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
2670: 55 45 53 28 27 2d 31 2e 30 27 2c 34 29 3b 0a 20  UES('-1.0',4);. 
2680: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2690: 34 20 56 41 4c 55 45 53 28 27 2b 31 2e 30 27 2c  4 VALUES('+1.0',
26a0: 35 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  5);.    INSERT I
26b0: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27 30  NTO t4 VALUES('0
26c0: 27 2c 36 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ',6);.    INSERT
26d0: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
26e0: 27 30 30 30 30 30 27 2c 37 29 3b 0a 20 20 20 20  '00000',7);.    
26f0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 34  SELECT a FROM t4
2700: 20 4f 52 44 45 52 20 42 59 20 62 3b 0a 20 20 7d   ORDER BY b;.  }
2710: 0a 7d 20 7b 30 2e 30 20 30 2e 30 30 20 61 62 63  .} {0.0 0.00 abc
2720: 20 2d 31 2e 30 20 2b 31 2e 30 20 30 20 30 30 30   -1.0 +1.0 0 000
2730: 30 30 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65  00}.do_test inde
2740: 78 2d 31 32 2e 32 20 7b 0a 20 20 65 78 65 63 73  x-12.2 {.  execs
2750: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2760: 61 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20  a FROM t4 WHERE 
2770: 61 3d 3d 30 20 4f 52 44 45 52 20 42 59 20 62 0a  a==0 ORDER BY b.
2780: 20 20 7d 0a 7d 20 7b 30 2e 30 20 30 2e 30 30 20    }.} {0.0 0.00 
2790: 30 20 30 30 30 30 30 7d 0a 64 6f 5f 74 65 73 74  0 00000}.do_test
27a0: 20 69 6e 64 65 78 2d 31 32 2e 33 20 7b 0a 20 20   index-12.3 {.  
27b0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
27c0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 34 20 57  LECT a FROM t4 W
27d0: 48 45 52 45 20 61 3c 30 2e 35 20 4f 52 44 45 52  HERE a<0.5 ORDER
27e0: 20 42 59 20 62 0a 20 20 7d 0a 7d 20 7b 30 2e 30   BY b.  }.} {0.0
27f0: 20 30 2e 30 30 20 2d 31 2e 30 20 30 20 30 30 30   0.00 -1.0 0 000
2800: 30 30 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65  00}.do_test inde
2810: 78 2d 31 32 2e 34 20 7b 0a 20 20 65 78 65 63 73  x-12.4 {.  execs
2820: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2830: 61 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20  a FROM t4 WHERE 
2840: 61 3e 2d 30 2e 35 20 4f 52 44 45 52 20 42 59 20  a>-0.5 ORDER BY 
2850: 62 0a 20 20 7d 0a 7d 20 7b 30 2e 30 20 30 2e 30  b.  }.} {0.0 0.0
2860: 30 20 61 62 63 20 2b 31 2e 30 20 30 20 30 30 30  0 abc +1.0 0 000
2870: 30 30 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65  00}.do_test inde
2880: 78 2d 31 32 2e 35 20 7b 0a 20 20 65 78 65 63 73  x-12.5 {.  execs
2890: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
28a0: 49 4e 44 45 58 20 74 34 69 31 20 4f 4e 20 74 34  INDEX t4i1 ON t4
28b0: 28 61 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  (a);.    SELECT 
28c0: 61 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20  a FROM t4 WHERE 
28d0: 61 3d 3d 30 20 4f 52 44 45 52 20 42 59 20 62 0a  a==0 ORDER BY b.
28e0: 20 20 7d 0a 7d 20 7b 30 2e 30 20 30 2e 30 30 20    }.} {0.0 0.00 
28f0: 30 20 30 30 30 30 30 7d 0a 64 6f 5f 74 65 73 74  0 00000}.do_test
2900: 20 69 6e 64 65 78 2d 31 32 2e 36 20 7b 0a 20 20   index-12.6 {.  
2910: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
2920: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 34 20 57  LECT a FROM t4 W
2930: 48 45 52 45 20 61 3c 30 2e 35 20 4f 52 44 45 52  HERE a<0.5 ORDER
2940: 20 42 59 20 62 0a 20 20 7d 0a 7d 20 7b 30 2e 30   BY b.  }.} {0.0
2950: 20 30 2e 30 30 20 2d 31 2e 30 20 30 20 30 30 30   0.00 -1.0 0 000
2960: 30 30 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65  00}.do_test inde
2970: 78 2d 31 32 2e 37 20 7b 0a 20 20 65 78 65 63 73  x-12.7 {.  execs
2980: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2990: 61 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20  a FROM t4 WHERE 
29a0: 61 3e 2d 30 2e 35 20 4f 52 44 45 52 20 42 59 20  a>-0.5 ORDER BY 
29b0: 62 0a 20 20 7d 0a 7d 20 7b 30 2e 30 20 30 2e 30  b.  }.} {0.0 0.0
29c0: 30 20 61 62 63 20 2b 31 2e 30 20 30 20 30 30 30  0 abc +1.0 0 000
29d0: 30 30 7d 0a 0a 23 20 4d 61 6b 65 20 73 75 72 65  00}..# Make sure
29e0: 20 77 65 20 63 61 6e 6e 6f 74 20 64 72 6f 70 20   we cannot drop 
29f0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  an automatically
2a00: 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 2e 0a   created index..
2a10: 23 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d  #.do_test index-
2a20: 31 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  13.1 {.  execsql
2a30: 20 7b 0a 20 20 20 43 52 45 41 54 45 20 54 41 42   {.   CREATE TAB
2a40: 4c 45 20 74 35 28 0a 20 20 20 20 20 20 61 20 69  LE t5(.      a i
2a50: 6e 74 20 55 4e 49 51 55 45 2c 0a 20 20 20 20 20  nt UNIQUE,.     
2a60: 20 62 20 66 6c 6f 61 74 20 50 52 49 4d 41 52 59   b float PRIMARY
2a70: 20 4b 45 59 2c 0a 20 20 20 20 20 20 63 20 76 61   KEY,.      c va
2a80: 72 63 68 61 72 28 31 30 29 2c 0a 20 20 20 20 20  rchar(10),.     
2a90: 20 55 4e 49 51 55 45 28 61 2c 63 29 0a 20 20 20   UNIQUE(a,c).   
2aa0: 29 3b 0a 20 20 20 49 4e 53 45 52 54 20 49 4e 54  );.   INSERT INT
2ab0: 4f 20 74 35 20 56 41 4c 55 45 53 28 31 2c 32 2c  O t5 VALUES(1,2,
2ac0: 33 29 3b 0a 20 20 20 53 45 4c 45 43 54 20 2a 20  3);.   SELECT * 
2ad0: 46 52 4f 4d 20 74 35 3b 0a 20 20 7d 0a 7d 20 7b  FROM t5;.  }.} {
2ae0: 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 69  1 2 3}.do_test i
2af0: 6e 64 65 78 2d 31 33 2e 32 20 7b 0a 20 20 73 65  ndex-13.2 {.  se
2b00: 74 20 3a 3a 69 64 78 6c 69 73 74 20 5b 65 78 65  t ::idxlist [exe
2b10: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2b20: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
2b30: 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
2b40: 74 79 70 65 3d 22 69 6e 64 65 78 22 20 41 4e 44  type="index" AND
2b50: 20 74 62 6c 5f 6e 61 6d 65 3d 22 74 35 22 3b 0a   tbl_name="t5";.
2b60: 20 20 7d 5d 0a 20 20 6c 6c 65 6e 67 74 68 20 24    }].  llength $
2b70: 3a 3a 69 64 78 6c 69 73 74 0a 7d 20 7b 33 7d 0a  ::idxlist.} {3}.
2b80: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
2b90: 69 3c 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 69 64  i<[llength $::id
2ba0: 78 6c 69 73 74 5d 7d 20 7b 69 6e 63 72 20 69 7d  xlist]} {incr i}
2bb0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 64   {.  do_test ind
2bc0: 65 78 2d 31 33 2e 33 2e 24 69 20 7b 0a 20 20 20  ex-13.3.$i {.   
2bd0: 20 63 61 74 63 68 73 71 6c 20 22 0a 20 20 20 20   catchsql ".    
2be0: 20 20 44 52 4f 50 20 49 4e 44 45 58 20 27 5b 6c    DROP INDEX '[l
2bf0: 69 6e 64 65 78 20 24 3a 3a 69 64 78 6c 69 73 74  index $::idxlist
2c00: 20 24 69 5d 27 3b 0a 20 20 20 20 22 0a 20 20 7d   $i]';.    ".  }
2c10: 20 7b 31 20 7b 69 6e 64 65 78 20 61 73 73 6f 63   {1 {index assoc
2c20: 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55  iated with UNIQU
2c30: 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
2c40: 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
2c50: 6f 74 20 62 65 20 64 72 6f 70 70 65 64 7d 7d 0a  ot be dropped}}.
2c60: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d  }.do_test index-
2c70: 31 33 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  13.4 {.  execsql
2c80: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
2c90: 54 4f 20 74 35 20 56 41 4c 55 45 53 28 27 61 27  TO t5 VALUES('a'
2ca0: 2c 27 62 27 2c 27 63 27 29 3b 0a 20 20 20 20 53  ,'b','c');.    S
2cb0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 35 3b  ELECT * FROM t5;
2cc0: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 61 20  .  }.} {1 2 3 a 
2cd0: 62 20 63 7d 0a 0a 23 20 43 68 65 63 6b 20 74 68  b c}..# Check th
2ce0: 65 20 73 6f 72 74 20 6f 72 64 65 72 20 6f 66 20  e sort order of 
2cf0: 64 61 74 61 20 69 6e 20 61 6e 20 69 6e 64 65 78  data in an index
2d00: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65  ..#.do_test inde
2d10: 78 2d 31 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  x-14.1 {.  execs
2d20: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
2d30: 54 41 42 4c 45 20 74 36 28 61 2c 62 2c 63 29 3b  TABLE t6(a,b,c);
2d40: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
2d50: 58 20 74 36 69 31 20 4f 4e 20 74 36 28 61 2c 62  X t6i1 ON t6(a,b
2d60: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2d70: 54 4f 20 74 36 20 56 41 4c 55 45 53 28 27 27 2c  TO t6 VALUES('',
2d80: 27 27 2c 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  '',1);.    INSER
2d90: 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53  T INTO t6 VALUES
2da0: 28 27 27 2c 4e 55 4c 4c 2c 32 29 3b 0a 20 20 20  ('',NULL,2);.   
2db0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20   INSERT INTO t6 
2dc0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 27 27 2c 33  VALUES(NULL,'',3
2dd0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2de0: 54 4f 20 74 36 20 56 41 4c 55 45 53 28 27 61 62  TO t6 VALUES('ab
2df0: 63 27 2c 31 32 33 2c 34 29 3b 0a 20 20 20 20 49  c',123,4);.    I
2e00: 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41  NSERT INTO t6 VA
2e10: 4c 55 45 53 28 31 32 33 2c 27 61 62 63 27 2c 35  LUES(123,'abc',5
2e20: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 20  );.    SELECT c 
2e30: 46 52 4f 4d 20 74 36 20 4f 52 44 45 52 20 42 59  FROM t6 ORDER BY
2e40: 20 61 2c 62 3b 0a 20 20 7d 0a 7d 20 7b 33 20 35   a,b;.  }.} {3 5
2e50: 20 32 20 31 20 34 7d 0a 64 6f 5f 74 65 73 74 20   2 1 4}.do_test 
2e60: 69 6e 64 65 78 2d 31 34 2e 32 20 7b 0a 20 20 65  index-14.2 {.  e
2e70: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
2e80: 45 43 54 20 63 20 46 52 4f 4d 20 74 36 20 57 48  ECT c FROM t6 WH
2e90: 45 52 45 20 61 3d 27 27 3b 0a 20 20 7d 0a 7d 20  ERE a='';.  }.} 
2ea0: 7b 32 20 31 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  {2 1}.do_test in
2eb0: 64 65 78 2d 31 34 2e 33 20 7b 0a 20 20 65 78 65  dex-14.3 {.  exe
2ec0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2ed0: 54 20 63 20 46 52 4f 4d 20 74 36 20 57 48 45 52  T c FROM t6 WHER
2ee0: 45 20 62 3d 27 27 3b 0a 20 20 7d 0a 7d 20 7b 31  E b='';.  }.} {1
2ef0: 20 33 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65   3}.do_test inde
2f00: 78 2d 31 34 2e 34 20 7b 0a 20 20 65 78 65 63 73  x-14.4 {.  execs
2f10: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2f20: 63 20 46 52 4f 4d 20 74 36 20 57 48 45 52 45 20  c FROM t6 WHERE 
2f30: 61 3e 27 27 3b 0a 20 20 7d 0a 7d 20 7b 34 7d 0a  a>'';.  }.} {4}.
2f40: 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 31 34  do_test index-14
2f50: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
2f60: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52  .    SELECT c FR
2f70: 4f 4d 20 74 36 20 57 48 45 52 45 20 61 3e 3d 27  OM t6 WHERE a>='
2f80: 27 3b 0a 20 20 7d 0a 7d 20 7b 32 20 31 20 34 7d  ';.  }.} {2 1 4}
2f90: 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d 31  .do_test index-1
2fa0: 34 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.6 {.  execsql 
2fb0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  {.    SELECT c F
2fc0: 52 4f 4d 20 74 36 20 57 48 45 52 45 20 61 3e 31  ROM t6 WHERE a>1
2fd0: 32 33 3b 0a 20 20 7d 0a 7d 20 7b 32 20 31 20 34  23;.  }.} {2 1 4
2fe0: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 2d  }.do_test index-
2ff0: 31 34 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  14.7 {.  execsql
3000: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 20   {.    SELECT c 
3010: 46 52 4f 4d 20 74 36 20 57 48 45 52 45 20 61 3e  FROM t6 WHERE a>
3020: 3d 31 32 33 3b 0a 20 20 7d 0a 7d 20 7b 35 20 32  =123;.  }.} {5 2
3030: 20 31 20 34 7d 0a 64 6f 5f 74 65 73 74 20 69 6e   1 4}.do_test in
3040: 64 65 78 2d 31 34 2e 38 20 7b 0a 20 20 65 78 65  dex-14.8 {.  exe
3050: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3060: 54 20 63 20 46 52 4f 4d 20 74 36 20 57 48 45 52  T c FROM t6 WHER
3070: 45 20 61 3c 27 61 62 63 27 3b 0a 20 20 7d 0a 7d  E a<'abc';.  }.}
3080: 20 7b 33 20 35 20 32 20 31 7d 0a 64 6f 5f 74 65   {3 5 2 1}.do_te
3090: 73 74 20 69 6e 64 65 78 2d 31 34 2e 39 20 7b 0a  st index-14.9 {.
30a0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
30b0: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 36  SELECT c FROM t6
30c0: 20 57 48 45 52 45 20 61 3c 3d 27 61 62 63 27 3b   WHERE a<='abc';
30d0: 0a 20 20 7d 0a 7d 20 7b 33 20 35 20 32 20 31 20  .  }.} {3 5 2 1 
30e0: 34 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78  4}.do_test index
30f0: 2d 31 34 2e 31 30 20 7b 0a 20 20 65 78 65 63 73  -14.10 {.  execs
3100: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
3110: 63 20 46 52 4f 4d 20 74 36 20 57 48 45 52 45 20  c FROM t6 WHERE 
3120: 61 3c 3d 27 27 3b 0a 20 20 7d 0a 7d 20 7b 33 20  a<='';.  }.} {3 
3130: 35 20 32 20 31 7d 0a 64 6f 5f 74 65 73 74 20 69  5 2 1}.do_test i
3140: 6e 64 65 78 2d 31 34 2e 31 31 20 7b 0a 20 20 65  ndex-14.11 {.  e
3150: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
3160: 45 43 54 20 63 20 46 52 4f 4d 20 74 36 20 57 48  ECT c FROM t6 WH
3170: 45 52 45 20 61 3c 27 27 3b 0a 20 20 7d 0a 7d 20  ERE a<'';.  }.} 
3180: 7b 33 20 35 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74  {3 5}...finish_t
3190: 65 73 74 0a                                      est.