SQLite4
Hex Artifact Content
Not logged in

Artifact be501e381b82b2f8ab406309ba7aac46e221f4ad:


0000: 23 20 32 30 30 38 20 4f 63 74 6f 62 65 72 20 34  # 2008 October 4
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n you give..#.#*
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 0a 23 0a 23 20 24 49 64 3a 20  ******.#.# $Id: 
0170: 69 6e 64 65 78 65 64 62 79 2e 74 65 73 74 2c 76  indexedby.test,v
0180: 20 31 2e 35 20 32 30 30 39 2f 30 33 2f 32 32 20   1.5 2009/03/22 
0190: 32 30 3a 33 36 3a 31 39 20 64 72 68 20 45 78 70  20:36:19 drh Exp
01a0: 20 24 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20   $..set testdir 
01b0: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61  [file dirname $a
01c0: 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65  rgv0].source $te
01d0: 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c  stdir/tester.tcl
01e0: 0a 0a 23 20 43 72 65 61 74 65 20 61 20 73 63 68  ..# Create a sch
01f0: 65 6d 61 20 77 69 74 68 20 73 6f 6d 65 20 69 6e  ema with some in
0200: 64 65 78 65 73 2e 0a 23 0a 64 6f 5f 74 65 73 74  dexes..#.do_test
0210: 20 69 6e 64 65 78 65 64 62 79 2d 31 2e 31 20 7b   indexedby-1.1 {
0220: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0230: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
0240: 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  (a, b);.    CREA
0250: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
0260: 31 28 61 29 3b 0a 20 20 20 20 43 52 45 41 54 45  1(a);.    CREATE
0270: 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28   INDEX i2 ON t1(
0280: 62 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20  b);..    CREATE 
0290: 54 41 42 4c 45 20 74 32 28 63 2c 20 64 29 3b 0a  TABLE t2(c, d);.
02a0: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
02b0: 20 69 33 20 4f 4e 20 74 32 28 63 29 3b 0a 20 20   i3 ON t2(c);.  
02c0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
02d0: 34 20 4f 4e 20 74 32 28 64 29 3b 0a 0a 20 20 20  4 ON t2(d);..   
02e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
02f0: 28 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (e PRIMARY KEY, 
0300: 66 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20  f);..    CREATE 
0310: 56 49 45 57 20 76 31 20 41 53 20 53 45 4c 45 43  VIEW v1 AS SELEC
0320: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
0330: 0a 7d 20 7b 7d 0a 0a 23 20 45 78 70 6c 61 69 6e  .} {}..# Explain
0340: 20 51 75 65 72 79 20 50 6c 61 6e 0a 23 0a 70 72   Query Plan.#.pr
0350: 6f 63 20 45 51 50 20 7b 73 71 6c 7d 20 7b 0a 20  oc EQP {sql} {. 
0360: 20 75 70 6c 65 76 65 6c 20 22 65 78 65 63 73 71   uplevel "execsq
0370: 6c 20 7b 45 58 50 4c 41 49 4e 20 51 55 45 52 59  l {EXPLAIN QUERY
0380: 20 50 4c 41 4e 20 24 73 71 6c 7d 22 0a 7d 0a 0a   PLAN $sql}".}..
0390: 23 20 54 68 65 73 65 20 74 65 73 74 73 20 61 72  # These tests ar
03a0: 65 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20  e to check that 
03b0: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
03c0: 4c 41 4e 22 20 69 73 20 77 6f 72 6b 69 6e 67 20  LAN" is working 
03d0: 61 73 20 65 78 70 65 63 74 65 64 2e 0a 23 0a 64  as expected..#.d
03e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69  o_execsql_test i
03f0: 6e 64 65 78 65 64 62 79 2d 31 2e 32 20 7b 0a 20  ndexedby-1.2 {. 
0400: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
0410: 4c 41 4e 20 73 65 6c 65 63 74 20 2a 20 66 72 6f  LAN select * fro
0420: 6d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 31  m t1 WHERE a = 1
0430: 30 3b 20 0a 7d 20 7b 30 20 30 20 30 20 7b 53 45  0; .} {0 0 0 {SE
0440: 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53  ARCH TABLE t1 US
0450: 49 4e 47 20 49 4e 44 45 58 20 69 31 20 28 61 3d  ING INDEX i1 (a=
0460: 3f 29 20 28 7e 31 30 20 72 6f 77 73 29 7d 7d 0a  ?) (~10 rows)}}.
0470: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0480: 69 6e 64 65 78 65 64 62 79 2d 31 2e 33 20 7b 0a  indexedby-1.3 {.
0490: 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20    EXPLAIN QUERY 
04a0: 50 4c 41 4e 20 73 65 6c 65 63 74 20 2a 20 66 72  PLAN select * fr
04b0: 6f 6d 20 74 31 20 3b 20 0a 7d 20 7b 30 20 30 20  om t1 ; .} {0 0 
04c0: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31  0 {SCAN TABLE t1
04d0: 20 28 7e 31 30 30 30 30 30 30 20 72 6f 77 73 29   (~1000000 rows)
04e0: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
04f0: 73 74 20 69 6e 64 65 78 65 64 62 79 2d 31 2e 34  st indexedby-1.4
0500: 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45   {.  EXPLAIN QUE
0510: 52 59 20 50 4c 41 4e 20 73 65 6c 65 63 74 20 2a  RY PLAN select *
0520: 20 66 72 6f 6d 20 74 31 2c 20 74 32 20 57 48 45   from t1, t2 WHE
0530: 52 45 20 63 20 3d 20 31 30 3b 20 0a 7d 20 7b 0a  RE c = 10; .} {.
0540: 20 20 30 20 30 20 31 20 7b 53 45 41 52 43 48 20    0 0 1 {SEARCH 
0550: 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47 20 49  TABLE t2 USING I
0560: 4e 44 45 58 20 69 33 20 28 63 3d 3f 29 20 28 7e  NDEX i3 (c=?) (~
0570: 31 30 20 72 6f 77 73 29 7d 20 0a 20 20 30 20 31  10 rows)} .  0 1
0580: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   0 {SCAN TABLE t
0590: 31 20 28 7e 31 30 30 30 30 30 30 20 72 6f 77 73  1 (~1000000 rows
05a0: 29 7d 0a 7d 0a 0a 23 20 50 61 72 73 65 72 20 74  )}.}..# Parser t
05b0: 65 73 74 73 2e 20 54 65 73 74 20 74 68 61 74 20  ests. Test that 
05c0: 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72  an INDEXED BY or
05d0: 20 4e 4f 54 20 49 4e 44 45 58 20 63 6c 61 75 73   NOT INDEX claus
05e0: 65 20 63 61 6e 20 62 65 20 0a 23 20 61 74 74 61  e can be .# atta
05f0: 63 68 65 64 20 74 6f 20 61 20 74 61 62 6c 65 20  ched to a table 
0600: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
0610: 73 65 2c 20 62 75 74 20 6e 6f 74 20 74 6f 20 61  se, but not to a
0620: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 0a 23   sub-select or.#
0630: 20 53 51 4c 20 76 69 65 77 2e 20 41 6c 73 6f 20   SQL view. Also 
0640: 74 65 73 74 20 74 68 61 74 20 73 70 65 63 69 66  test that specif
0650: 79 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 68  ying an index th
0660: 61 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  at does not exis
0670: 74 20 6f 72 0a 23 20 69 73 20 61 74 74 61 63 68  t or.# is attach
0680: 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
0690: 74 20 74 61 62 6c 65 20 69 73 20 64 65 74 65 63  t table is detec
06a0: 74 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2e  ted as an error.
06b0: 0a 23 20 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65  .# .do_test inde
06c0: 78 65 64 62 79 2d 32 2e 31 20 7b 0a 20 20 65 78  xedby-2.1 {.  ex
06d0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
06e0: 20 46 52 4f 4d 20 74 31 20 4e 4f 54 20 49 4e 44   FROM t1 NOT IND
06f0: 45 58 45 44 20 57 48 45 52 45 20 61 20 3d 20 27  EXED WHERE a = '
0700: 6f 6e 65 27 20 41 4e 44 20 62 20 3d 20 27 74 77  one' AND b = 'tw
0710: 6f 27 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  o'}.} {}.do_test
0720: 20 69 6e 64 65 78 65 64 62 79 2d 32 2e 32 20 7b   indexedby-2.2 {
0730: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
0740: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 49 4e  ECT * FROM t1 IN
0750: 44 45 58 45 44 20 42 59 20 69 31 20 57 48 45 52  DEXED BY i1 WHER
0760: 45 20 61 20 3d 20 27 6f 6e 65 27 20 41 4e 44 20  E a = 'one' AND 
0770: 62 20 3d 20 27 74 77 6f 27 7d 0a 7d 20 7b 7d 0a  b = 'two'}.} {}.
0780: 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62  do_test indexedb
0790: 79 2d 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  y-2.3 {.  execsq
07a0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
07b0: 4d 20 74 31 20 49 4e 44 45 58 45 44 20 42 59 20  M t1 INDEXED BY 
07c0: 69 32 20 57 48 45 52 45 20 61 20 3d 20 27 6f 6e  i2 WHERE a = 'on
07d0: 65 27 20 41 4e 44 20 62 20 3d 20 27 74 77 6f 27  e' AND b = 'two'
07e0: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
07f0: 69 6e 64 65 78 65 64 62 79 2d 32 2e 34 20 7b 0a  indexedby-2.4 {.
0800: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c    catchsql { SEL
0810: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 49 4e  ECT * FROM t1 IN
0820: 44 45 58 45 44 20 42 59 20 69 33 20 57 48 45 52  DEXED BY i3 WHER
0830: 45 20 61 20 3d 20 27 6f 6e 65 27 20 41 4e 44 20  E a = 'one' AND 
0840: 62 20 3d 20 27 74 77 6f 27 7d 0a 7d 20 7b 31 20  b = 'two'}.} {1 
0850: 7b 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  {no such index: 
0860: 69 33 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64  i3}}.do_test ind
0870: 65 78 65 64 62 79 2d 32 2e 35 20 7b 0a 20 20 63  exedby-2.5 {.  c
0880: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
0890: 20 2a 20 46 52 4f 4d 20 74 31 20 49 4e 44 45 58   * FROM t1 INDEX
08a0: 45 44 20 42 59 20 69 35 20 57 48 45 52 45 20 61  ED BY i5 WHERE a
08b0: 20 3d 20 27 6f 6e 65 27 20 41 4e 44 20 62 20 3d   = 'one' AND b =
08c0: 20 27 74 77 6f 27 7d 0a 7d 20 7b 31 20 7b 6e 6f   'two'}.} {1 {no
08d0: 20 73 75 63 68 20 69 6e 64 65 78 3a 20 69 35 7d   such index: i5}
08e0: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65  }.do_test indexe
08f0: 64 62 79 2d 32 2e 36 20 7b 0a 20 20 63 61 74 63  dby-2.6 {.  catc
0900: 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  hsql { SELECT * 
0910: 46 52 4f 4d 20 74 31 20 49 4e 44 45 58 45 44 20  FROM t1 INDEXED 
0920: 42 59 20 57 48 45 52 45 20 61 20 3d 20 27 6f 6e  BY WHERE a = 'on
0930: 65 27 20 41 4e 44 20 62 20 3d 20 27 74 77 6f 27  e' AND b = 'two'
0940: 7d 0a 7d 20 7b 31 20 7b 6e 65 61 72 20 22 57 48  }.} {1 {near "WH
0950: 45 52 45 22 3a 20 73 79 6e 74 61 78 20 65 72 72  ERE": syntax err
0960: 6f 72 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64  or}}.do_test ind
0970: 65 78 65 64 62 79 2d 32 2e 37 20 7b 0a 20 20 63  exedby-2.7 {.  c
0980: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
0990: 20 2a 20 46 52 4f 4d 20 76 31 20 49 4e 44 45 58   * FROM v1 INDEX
09a0: 45 44 20 42 59 20 69 31 20 57 48 45 52 45 20 61  ED BY i1 WHERE a
09b0: 20 3d 20 27 6f 6e 65 27 20 7d 0a 7d 20 7b 31 20   = 'one' }.} {1 
09c0: 7b 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  {no such index: 
09d0: 69 31 7d 7d 0a 0a 23 20 54 65 73 74 73 20 66 6f  i1}}..# Tests fo
09e0: 72 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 63  r single table c
09f0: 61 73 65 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  ases..#.do_execs
0a00: 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62  ql_test indexedb
0a10: 79 2d 33 2e 31 20 7b 0a 20 20 45 58 50 4c 41 49  y-3.1 {.  EXPLAI
0a20: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c  N QUERY PLAN SEL
0a30: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4e 4f  ECT * FROM t1 NO
0a40: 54 20 49 4e 44 45 58 45 44 20 57 48 45 52 45 20  T INDEXED WHERE 
0a50: 61 20 3d 20 27 6f 6e 65 27 20 41 4e 44 20 62 20  a = 'one' AND b 
0a60: 3d 20 27 74 77 6f 27 0a 7d 20 7b 30 20 30 20 30  = 'two'.} {0 0 0
0a70: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 20   {SCAN TABLE t1 
0a80: 28 7e 31 30 30 30 30 20 72 6f 77 73 29 7d 7d 0a  (~10000 rows)}}.
0a90: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0aa0: 69 6e 64 65 78 65 64 62 79 2d 33 2e 32 20 7b 0a  indexedby-3.2 {.
0ab0: 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20    EXPLAIN QUERY 
0ac0: 50 4c 41 4e 20 0a 20 20 53 45 4c 45 43 54 20 2a  PLAN .  SELECT *
0ad0: 20 46 52 4f 4d 20 74 31 20 49 4e 44 45 58 45 44   FROM t1 INDEXED
0ae0: 20 42 59 20 69 31 20 57 48 45 52 45 20 61 20 3d   BY i1 WHERE a =
0af0: 20 27 6f 6e 65 27 20 41 4e 44 20 62 20 3d 20 27   'one' AND b = '
0b00: 74 77 6f 27 0a 7d 20 7b 30 20 30 20 30 20 7b 53  two'.} {0 0 0 {S
0b10: 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55  EARCH TABLE t1 U
0b20: 53 49 4e 47 20 49 4e 44 45 58 20 69 31 20 28 61  SING INDEX i1 (a
0b30: 3d 3f 29 20 28 7e 32 20 72 6f 77 73 29 7d 7d 0a  =?) (~2 rows)}}.
0b40: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0b50: 69 6e 64 65 78 65 64 62 79 2d 33 2e 33 20 7b 0a  indexedby-3.3 {.
0b60: 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20    EXPLAIN QUERY 
0b70: 50 4c 41 4e 20 0a 20 20 53 45 4c 45 43 54 20 2a  PLAN .  SELECT *
0b80: 20 46 52 4f 4d 20 74 31 20 49 4e 44 45 58 45 44   FROM t1 INDEXED
0b90: 20 42 59 20 69 32 20 57 48 45 52 45 20 61 20 3d   BY i2 WHERE a =
0ba0: 20 27 6f 6e 65 27 20 41 4e 44 20 62 20 3d 20 27   'one' AND b = '
0bb0: 74 77 6f 27 0a 7d 20 7b 30 20 30 20 30 20 7b 53  two'.} {0 0 0 {S
0bc0: 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55  EARCH TABLE t1 U
0bd0: 53 49 4e 47 20 49 4e 44 45 58 20 69 32 20 28 62  SING INDEX i2 (b
0be0: 3d 3f 29 20 28 7e 32 20 72 6f 77 73 29 7d 7d 0a  =?) (~2 rows)}}.
0bf0: 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62  do_test indexedb
0c00: 79 2d 33 2e 34 20 7b 0a 20 20 63 61 74 63 68 73  y-3.4 {.  catchs
0c10: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
0c20: 4f 4d 20 74 31 20 49 4e 44 45 58 45 44 20 42 59  OM t1 INDEXED BY
0c30: 20 69 32 20 57 48 45 52 45 20 61 20 3d 20 27 6f   i2 WHERE a = 'o
0c40: 6e 65 27 20 7d 0a 7d 20 7b 31 20 7b 63 61 6e 6e  ne' }.} {1 {cann
0c50: 6f 74 20 75 73 65 20 69 6e 64 65 78 3a 20 69 32  ot use index: i2
0c60: 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78  }}.do_test index
0c70: 65 64 62 79 2d 33 2e 35 20 7b 0a 20 20 63 61 74  edby-3.5 {.  cat
0c80: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  chsql { SELECT *
0c90: 20 46 52 4f 4d 20 74 31 20 49 4e 44 45 58 45 44   FROM t1 INDEXED
0ca0: 20 42 59 20 69 32 20 4f 52 44 45 52 20 42 59 20   BY i2 ORDER BY 
0cb0: 61 20 7d 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74  a }.} {1 {cannot
0cc0: 20 75 73 65 20 69 6e 64 65 78 3a 20 69 32 7d 7d   use index: i2}}
0cd0: 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65 64  .do_test indexed
0ce0: 62 79 2d 33 2e 36 20 7b 0a 20 20 63 61 74 63 68  by-3.6 {.  catch
0cf0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
0d00: 52 4f 4d 20 74 31 20 49 4e 44 45 58 45 44 20 42  ROM t1 INDEXED B
0d10: 59 20 69 31 20 57 48 45 52 45 20 61 20 3d 20 27  Y i1 WHERE a = '
0d20: 6f 6e 65 27 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a  one' }.} {0 {}}.
0d30: 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62  do_test indexedb
0d40: 79 2d 33 2e 37 20 7b 0a 20 20 63 61 74 63 68 73  y-3.7 {.  catchs
0d50: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
0d60: 4f 4d 20 74 31 20 49 4e 44 45 58 45 44 20 42 59  OM t1 INDEXED BY
0d70: 20 69 31 20 4f 52 44 45 52 20 42 59 20 61 20 7d   i1 ORDER BY a }
0d80: 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f 65 78  .} {0 {}}..do_ex
0d90: 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78  ecsql_test index
0da0: 65 64 62 79 2d 33 2e 38 20 7b 0a 20 20 45 58 50  edby-3.8 {.  EXP
0db0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
0dc0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
0dd0: 20 74 33 20 49 4e 44 45 58 45 44 20 42 59 20 73   t3 INDEXED BY s
0de0: 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
0df0: 74 33 5f 31 20 4f 52 44 45 52 20 42 59 20 65 20  t3_1 ORDER BY e 
0e00: 0a 7d 20 7b 30 20 30 20 30 20 7b 53 43 41 4e 20  .} {0 0 0 {SCAN 
0e10: 54 41 42 4c 45 20 74 33 20 55 53 49 4e 47 20 49  TABLE t3 USING I
0e20: 4e 44 45 58 20 73 71 6c 69 74 65 5f 61 75 74 6f  NDEX sqlite_auto
0e30: 69 6e 64 65 78 5f 74 33 5f 31 20 28 7e 31 30 30  index_t3_1 (~100
0e40: 30 30 30 30 20 72 6f 77 73 29 7d 7d 0a 64 6f 5f  0000 rows)}}.do_
0e50: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64  execsql_test ind
0e60: 65 78 65 64 62 79 2d 33 2e 39 20 7b 0a 20 20 45  exedby-3.9 {.  E
0e70: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
0e80: 4e 20 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  N .  SELECT * FR
0e90: 4f 4d 20 74 33 20 49 4e 44 45 58 45 44 20 42 59  OM t3 INDEXED BY
0ea0: 20 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65   sqlite_autoinde
0eb0: 78 5f 74 33 5f 31 20 57 48 45 52 45 20 65 20 3d  x_t3_1 WHERE e =
0ec0: 20 31 30 20 0a 7d 20 7b 30 20 30 20 30 20 7b 53   10 .} {0 0 0 {S
0ed0: 45 41 52 43 48 20 54 41 42 4c 45 20 74 33 20 55  EARCH TABLE t3 U
0ee0: 53 49 4e 47 20 49 4e 44 45 58 20 73 71 6c 69 74  SING INDEX sqlit
0ef0: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 33 5f 31  e_autoindex_t3_1
0f00: 20 28 65 3d 3f 29 20 28 7e 31 20 72 6f 77 73 29   (e=?) (~1 rows)
0f10: 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78  }}.do_test index
0f20: 65 64 62 79 2d 33 2e 31 30 20 7b 0a 20 20 63 61  edby-3.10 {.  ca
0f30: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
0f40: 2a 20 46 52 4f 4d 20 74 33 20 49 4e 44 45 58 45  * FROM t3 INDEXE
0f50: 44 20 42 59 20 73 71 6c 69 74 65 5f 61 75 74 6f  D BY sqlite_auto
0f60: 69 6e 64 65 78 5f 74 33 5f 31 20 57 48 45 52 45  index_t3_1 WHERE
0f70: 20 66 20 3d 20 31 30 20 7d 0a 7d 20 7b 31 20 7b   f = 10 }.} {1 {
0f80: 63 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65 78  cannot use index
0f90: 3a 20 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64  : sqlite_autoind
0fa0: 65 78 5f 74 33 5f 31 7d 7d 0a 64 6f 5f 74 65 73  ex_t3_1}}.do_tes
0fb0: 74 20 69 6e 64 65 78 65 64 62 79 2d 33 2e 31 31  t indexedby-3.11
0fc0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
0fd0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
0fe0: 20 49 4e 44 45 58 45 44 20 42 59 20 73 71 6c 69   INDEXED BY sqli
0ff0: 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 33 5f  te_autoindex_t3_
1000: 32 20 57 48 45 52 45 20 66 20 3d 20 31 30 20 7d  2 WHERE f = 10 }
1010: 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 69  .} {1 {no such i
1020: 6e 64 65 78 3a 20 73 71 6c 69 74 65 5f 61 75 74  ndex: sqlite_aut
1030: 6f 69 6e 64 65 78 5f 74 33 5f 32 7d 7d 0a 0a 23  oindex_t3_2}}..#
1040: 20 54 65 73 74 73 20 66 6f 72 20 6d 75 6c 74 69   Tests for multi
1050: 70 6c 65 20 74 61 62 6c 65 20 63 61 73 65 73 2e  ple table cases.
1060: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1070: 73 74 20 69 6e 64 65 78 65 64 62 79 2d 34 2e 31  st indexedby-4.1
1080: 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45   {.  EXPLAIN QUE
1090: 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 2a  RY PLAN SELECT *
10a0: 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
10b0: 52 45 20 61 20 3d 20 63 20 0a 7d 20 7b 0a 20 20  RE a = c .} {.  
10c0: 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c  0 0 0 {SCAN TABL
10d0: 45 20 74 31 20 28 7e 31 30 30 30 30 30 30 20 72  E t1 (~1000000 r
10e0: 6f 77 73 29 7d 20 0a 20 20 30 20 31 20 31 20 7b  ows)} .  0 1 1 {
10f0: 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 32 20  SEARCH TABLE t2 
1100: 55 53 49 4e 47 20 49 4e 44 45 58 20 69 33 20 28  USING INDEX i3 (
1110: 63 3d 3f 29 20 28 7e 31 30 20 72 6f 77 73 29 7d  c=?) (~10 rows)}
1120: 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .}.do_execsql_te
1130: 73 74 20 69 6e 64 65 78 65 64 62 79 2d 34 2e 32  st indexedby-4.2
1140: 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45   {.  EXPLAIN QUE
1150: 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 2a  RY PLAN SELECT *
1160: 20 46 52 4f 4d 20 74 31 20 49 4e 44 45 58 45 44   FROM t1 INDEXED
1170: 20 42 59 20 69 31 2c 20 74 32 20 57 48 45 52 45   BY i1, t2 WHERE
1180: 20 61 20 3d 20 63 20 0a 7d 20 7b 0a 20 20 30 20   a = c .} {.  0 
1190: 30 20 31 20 7b 53 43 41 4e 20 54 41 42 4c 45 20  0 1 {SCAN TABLE 
11a0: 74 32 20 28 7e 31 30 30 30 30 30 30 20 72 6f 77  t2 (~1000000 row
11b0: 73 29 7d 20 0a 20 20 30 20 31 20 30 20 7b 53 45  s)} .  0 1 0 {SE
11c0: 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53  ARCH TABLE t1 US
11d0: 49 4e 47 20 49 4e 44 45 58 20 69 31 20 28 61 3d  ING INDEX i1 (a=
11e0: 3f 29 20 28 7e 31 30 20 72 6f 77 73 29 7d 0a 7d  ?) (~10 rows)}.}
11f0: 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65 64  .do_test indexed
1200: 62 79 2d 34 2e 33 20 7b 0a 20 20 63 61 74 63 68  by-4.3 {.  catch
1210: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
1220: 20 2a 20 46 52 4f 4d 20 74 31 20 49 4e 44 45 58   * FROM t1 INDEX
1230: 45 44 20 42 59 20 69 31 2c 20 74 32 20 49 4e 44  ED BY i1, t2 IND
1240: 45 58 45 44 20 42 59 20 69 33 20 57 48 45 52 45  EXED BY i3 WHERE
1250: 20 61 3d 63 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63   a=c.  }.} {1 {c
1260: 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65 78 3a  annot use index:
1270: 20 69 31 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e   i1}}.do_test in
1280: 64 65 78 65 64 62 79 2d 34 2e 34 20 7b 0a 20 20  dexedby-4.4 {.  
1290: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
12a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
12b0: 49 4e 44 45 58 45 44 20 42 59 20 69 33 2c 20 74  INDEXED BY i3, t
12c0: 31 20 49 4e 44 45 58 45 44 20 42 59 20 69 31 20  1 INDEXED BY i1 
12d0: 57 48 45 52 45 20 61 3d 63 0a 20 20 7d 0a 7d 20  WHERE a=c.  }.} 
12e0: 7b 31 20 7b 63 61 6e 6e 6f 74 20 75 73 65 20 69  {1 {cannot use i
12f0: 6e 64 65 78 3a 20 69 33 7d 7d 0a 0a 23 20 54 65  ndex: i3}}..# Te
1300: 73 74 20 65 6d 62 65 64 64 69 6e 67 20 61 6e 20  st embedding an 
1310: 49 4e 44 45 58 45 44 20 42 59 20 69 6e 20 61 20  INDEXED BY in a 
1320: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
1330: 65 6d 65 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63  ement. This bloc
1340: 6b 0a 23 20 61 6c 73 6f 20 74 65 73 74 73 20 74  k.# also tests t
1350: 68 61 74 20 6e 6f 74 68 69 6e 67 20 62 61 64 20  hat nothing bad 
1360: 68 61 70 70 65 6e 73 20 69 66 20 61 6e 20 69 6e  happens if an in
1370: 64 65 78 20 72 65 66 65 72 65 64 20 74 6f 20 62  dex refered to b
1380: 79 0a 23 20 61 20 43 52 45 41 54 45 20 56 49 45  y.# a CREATE VIE
1390: 57 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 64  W statement is d
13a0: 72 6f 70 70 65 64 20 61 6e 64 20 72 65 63 72 65  ropped and recre
13b0: 61 74 65 64 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  ated..#.do_execs
13c0: 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62  ql_test indexedb
13d0: 79 2d 35 2e 31 20 7b 0a 20 20 43 52 45 41 54 45  y-5.1 {.  CREATE
13e0: 20 56 49 45 57 20 76 32 20 41 53 20 53 45 4c 45   VIEW v2 AS SELE
13f0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 49 4e 44  CT * FROM t1 IND
1400: 45 58 45 44 20 42 59 20 69 31 20 57 48 45 52 45  EXED BY i1 WHERE
1410: 20 61 20 3e 20 35 3b 0a 20 20 45 58 50 4c 41 49   a > 5;.  EXPLAI
1420: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c  N QUERY PLAN SEL
1430: 45 43 54 20 2a 20 46 52 4f 4d 20 76 32 20 0a 7d  ECT * FROM v2 .}
1440: 20 7b 30 20 30 20 30 20 7b 53 45 41 52 43 48 20   {0 0 0 {SEARCH 
1450: 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 49  TABLE t1 USING I
1460: 4e 44 45 58 20 69 31 20 28 61 3e 3f 29 20 28 7e  NDEX i1 (a>?) (~
1470: 32 35 30 30 30 30 20 72 6f 77 73 29 7d 7d 0a 64  250000 rows)}}.d
1480: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69  o_execsql_test i
1490: 6e 64 65 78 65 64 62 79 2d 35 2e 32 20 7b 0a 20  ndexedby-5.2 {. 
14a0: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
14b0: 4c 41 4e 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  LAN SELECT * FRO
14c0: 4d 20 76 32 20 57 48 45 52 45 20 62 20 3d 20 31  M v2 WHERE b = 1
14d0: 30 20 0a 7d 20 7b 30 20 30 20 30 20 7b 53 45 41  0 .} {0 0 0 {SEA
14e0: 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49  RCH TABLE t1 USI
14f0: 4e 47 20 49 4e 44 45 58 20 69 31 20 28 61 3e 3f  NG INDEX i1 (a>?
1500: 29 20 28 7e 32 35 30 30 30 20 72 6f 77 73 29 7d  ) (~25000 rows)}
1510: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65  }.do_test indexe
1520: 64 62 79 2d 35 2e 33 20 7b 0a 20 20 65 78 65 63  dby-5.3 {.  exec
1530: 73 71 6c 20 7b 20 44 52 4f 50 20 49 4e 44 45 58  sql { DROP INDEX
1540: 20 69 31 20 7d 0a 20 20 63 61 74 63 68 73 71 6c   i1 }.  catchsql
1550: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
1560: 20 76 32 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73   v2 }.} {1 {no s
1570: 75 63 68 20 69 6e 64 65 78 3a 20 69 31 7d 7d 0a  uch index: i1}}.
1580: 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62  do_test indexedb
1590: 79 2d 35 2e 34 20 7b 0a 20 20 23 20 52 65 63 72  y-5.4 {.  # Recr
15a0: 65 61 74 65 20 69 6e 64 65 78 20 69 31 20 69 6e  eate index i1 in
15b0: 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20 69   such a way as i
15c0: 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  t cannot be used
15d0: 20 62 79 20 74 68 65 20 76 69 65 77 20 71 75 65   by the view que
15e0: 72 79 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ry..  execsql { 
15f0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
1600: 4f 4e 20 74 31 28 62 29 20 7d 0a 20 20 63 61 74  ON t1(b) }.  cat
1610: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  chsql { SELECT *
1620: 20 46 52 4f 4d 20 76 32 20 7d 0a 7d 20 7b 31 20   FROM v2 }.} {1 
1630: 7b 63 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65  {cannot use inde
1640: 78 3a 20 69 31 7d 7d 0a 64 6f 5f 74 65 73 74 20  x: i1}}.do_test 
1650: 69 6e 64 65 78 65 64 62 79 2d 35 2e 35 20 7b 0a  indexedby-5.5 {.
1660: 20 20 23 20 44 72 6f 70 20 61 6e 64 20 72 65 63    # Drop and rec
1670: 72 65 61 74 65 20 69 6e 64 65 78 20 69 31 20 61  reate index i1 a
1680: 67 61 69 6e 2e 20 54 68 69 73 20 74 69 6d 65 2c  gain. This time,
1690: 20 63 72 65 61 74 65 20 69 74 20 73 6f 20 74 68   create it so th
16a0: 61 74 20 69 74 20 63 61 6e 0a 20 20 23 20 62 65  at it can.  # be
16b0: 20 75 73 65 64 20 62 79 20 74 68 65 20 71 75 65   used by the que
16c0: 72 79 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ry..  execsql { 
16d0: 44 52 4f 50 20 49 4e 44 45 58 20 69 31 20 3b 20  DROP INDEX i1 ; 
16e0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
16f0: 4f 4e 20 74 31 28 61 29 20 7d 0a 20 20 63 61 74  ON t1(a) }.  cat
1700: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  chsql { SELECT *
1710: 20 46 52 4f 4d 20 76 32 20 7d 0a 7d 20 7b 30 20   FROM v2 }.} {0 
1720: 7b 7d 7d 0a 0a 23 20 54 65 73 74 20 74 68 61 74  {}}..# Test that
1730: 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 6d   "NOT INDEXED" m
1740: 61 79 20 75 73 65 20 74 68 65 20 72 6f 77 69 64  ay use the rowid
1750: 20 69 6e 64 65 78 2c 20 62 75 74 20 6e 6f 74 20   index, but not 
1760: 6f 74 68 65 72 73 2e 0a 23 20 0a 64 6f 5f 65 78  others..# .do_ex
1770: 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78  ecsql_test index
1780: 65 64 62 79 2d 36 2e 31 20 7b 0a 20 20 45 58 50  edby-6.1 {.  EXP
1790: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
17a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
17b0: 20 57 48 45 52 45 20 62 20 3d 20 31 30 20 4f 52   WHERE b = 10 OR
17c0: 44 45 52 20 42 59 20 72 6f 77 69 64 20 0a 7d 20  DER BY rowid .} 
17d0: 7b 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54  {0 0 0 {SEARCH T
17e0: 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 49 4e  ABLE t1 USING IN
17f0: 44 45 58 20 69 32 20 28 62 3d 3f 29 20 28 7e 31  DEX i2 (b=?) (~1
1800: 30 20 72 6f 77 73 29 7d 7d 0a 64 6f 5f 65 78 65  0 rows)}}.do_exe
1810: 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65  csql_test indexe
1820: 64 62 79 2d 36 2e 32 20 7b 0a 20 20 45 58 50 4c  dby-6.2 {.  EXPL
1830: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53  AIN QUERY PLAN S
1840: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1850: 4e 4f 54 20 49 4e 44 45 58 45 44 20 57 48 45 52  NOT INDEXED WHER
1860: 45 20 62 20 3d 20 31 30 20 4f 52 44 45 52 20 42  E b = 10 ORDER B
1870: 59 20 72 6f 77 69 64 20 0a 7d 20 7b 30 20 30 20  Y rowid .} {0 0 
1880: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31  0 {SCAN TABLE t1
1890: 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50   USING INTEGER P
18a0: 52 49 4d 41 52 59 20 4b 45 59 20 28 7e 31 30 30  RIMARY KEY (~100
18b0: 30 30 30 20 72 6f 77 73 29 7d 7d 0a 0a 23 20 54  000 rows)}}..# T
18c0: 65 73 74 20 74 68 61 74 20 22 49 4e 44 45 58 45  est that "INDEXE
18d0: 44 20 42 59 22 20 63 61 6e 20 62 65 20 75 73 65  D BY" can be use
18e0: 64 20 69 6e 20 61 20 44 45 4c 45 54 45 20 73 74  d in a DELETE st
18f0: 61 74 65 6d 65 6e 74 2e 0a 23 20 0a 64 6f 5f 65  atement..# .do_e
1900: 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65  xecsql_test inde
1910: 78 65 64 62 79 2d 37 2e 31 20 7b 0a 20 20 45 58  xedby-7.1 {.  EX
1920: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
1930: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
1940: 57 48 45 52 45 20 61 20 3d 20 35 20 0a 7d 20 7b  WHERE a = 5 .} {
1950: 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54 41  0 0 0 {SEARCH TA
1960: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 43 4f 56  BLE t1 USING COV
1970: 45 52 49 4e 47 20 49 4e 44 45 58 20 69 31 20 28  ERING INDEX i1 (
1980: 61 3d 3f 29 20 28 7e 31 30 20 72 6f 77 73 29 7d  a=?) (~10 rows)}
1990: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
19a0: 74 20 69 6e 64 65 78 65 64 62 79 2d 37 2e 32 20  t indexedby-7.2 
19b0: 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  {.  EXPLAIN QUER
19c0: 59 20 50 4c 41 4e 20 44 45 4c 45 54 45 20 46 52  Y PLAN DELETE FR
19d0: 4f 4d 20 74 31 20 4e 4f 54 20 49 4e 44 45 58 45  OM t1 NOT INDEXE
19e0: 44 20 57 48 45 52 45 20 61 20 3d 20 35 20 0a 7d  D WHERE a = 5 .}
19f0: 20 7b 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41   {0 0 0 {SCAN TA
1a00: 42 4c 45 20 74 31 20 28 7e 31 30 30 30 30 30 20  BLE t1 (~100000 
1a10: 72 6f 77 73 29 7d 7d 0a 64 6f 5f 65 78 65 63 73  rows)}}.do_execs
1a20: 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62  ql_test indexedb
1a30: 79 2d 37 2e 33 20 7b 0a 20 20 45 58 50 4c 41 49  y-7.3 {.  EXPLAI
1a40: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 44 45 4c  N QUERY PLAN DEL
1a50: 45 54 45 20 46 52 4f 4d 20 74 31 20 49 4e 44 45  ETE FROM t1 INDE
1a60: 58 45 44 20 42 59 20 69 31 20 57 48 45 52 45 20  XED BY i1 WHERE 
1a70: 61 20 3d 20 35 20 0a 7d 20 7b 30 20 30 20 30 20  a = 5 .} {0 0 0 
1a80: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31  {SEARCH TABLE t1
1a90: 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
1aa0: 49 4e 44 45 58 20 69 31 20 28 61 3d 3f 29 20 28  INDEX i1 (a=?) (
1ab0: 7e 31 30 20 72 6f 77 73 29 7d 7d 0a 64 6f 5f 65  ~10 rows)}}.do_e
1ac0: 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65  xecsql_test inde
1ad0: 78 65 64 62 79 2d 37 2e 34 20 7b 0a 20 20 45 58  xedby-7.4 {.  EX
1ae0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
1af0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
1b00: 49 4e 44 45 58 45 44 20 42 59 20 69 31 20 57 48  INDEXED BY i1 WH
1b10: 45 52 45 20 61 20 3d 20 35 20 41 4e 44 20 62 20  ERE a = 5 AND b 
1b20: 3d 20 31 30 0a 7d 20 7b 30 20 30 20 30 20 7b 53  = 10.} {0 0 0 {S
1b30: 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55  EARCH TABLE t1 U
1b40: 53 49 4e 47 20 49 4e 44 45 58 20 69 31 20 28 61  SING INDEX i1 (a
1b50: 3d 3f 29 20 28 7e 32 20 72 6f 77 73 29 7d 7d 0a  =?) (~2 rows)}}.
1b60: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1b70: 69 6e 64 65 78 65 64 62 79 2d 37 2e 35 20 7b 0a  indexedby-7.5 {.
1b80: 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20    EXPLAIN QUERY 
1b90: 50 4c 41 4e 20 44 45 4c 45 54 45 20 46 52 4f 4d  PLAN DELETE FROM
1ba0: 20 74 31 20 49 4e 44 45 58 45 44 20 42 59 20 69   t1 INDEXED BY i
1bb0: 32 20 57 48 45 52 45 20 61 20 3d 20 35 20 41 4e  2 WHERE a = 5 AN
1bc0: 44 20 62 20 3d 20 31 30 0a 7d 20 7b 30 20 30 20  D b = 10.} {0 0 
1bd0: 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20  0 {SEARCH TABLE 
1be0: 74 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69  t1 USING INDEX i
1bf0: 32 20 28 62 3d 3f 29 20 28 7e 32 20 72 6f 77 73  2 (b=?) (~2 rows
1c00: 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65  )}}.do_test inde
1c10: 78 65 64 62 79 2d 37 2e 36 20 7b 0a 20 20 63 61  xedby-7.6 {.  ca
1c20: 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  tchsql { DELETE 
1c30: 46 52 4f 4d 20 74 31 20 49 4e 44 45 58 45 44 20  FROM t1 INDEXED 
1c40: 42 59 20 69 32 20 57 48 45 52 45 20 61 20 3d 20  BY i2 WHERE a = 
1c50: 35 7d 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20  5}.} {1 {cannot 
1c60: 75 73 65 20 69 6e 64 65 78 3a 20 69 32 7d 7d 0a  use index: i2}}.
1c70: 0a 23 20 54 65 73 74 20 74 68 61 74 20 22 49 4e  .# Test that "IN
1c80: 44 45 58 45 44 20 42 59 22 20 63 61 6e 20 62 65  DEXED BY" can be
1c90: 20 75 73 65 64 20 69 6e 20 61 6e 20 55 50 44 41   used in an UPDA
1ca0: 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 20  TE statement..# 
1cb0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1cc0: 20 69 6e 64 65 78 65 64 62 79 2d 38 2e 31 20 7b   indexedby-8.1 {
1cd0: 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  .  EXPLAIN QUERY
1ce0: 20 50 4c 41 4e 20 55 50 44 41 54 45 20 74 31 20   PLAN UPDATE t1 
1cf0: 53 45 54 20 72 6f 77 69 64 3d 72 6f 77 69 64 2b  SET rowid=rowid+
1d00: 31 20 57 48 45 52 45 20 61 20 3d 20 35 20 0a 7d  1 WHERE a = 5 .}
1d10: 20 7b 30 20 30 20 30 20 7b 53 45 41 52 43 48 20   {0 0 0 {SEARCH 
1d20: 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 43  TABLE t1 USING C
1d30: 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 69 31  OVERING INDEX i1
1d40: 20 28 61 3d 3f 29 20 28 7e 31 30 20 72 6f 77 73   (a=?) (~10 rows
1d50: 29 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  )}}.do_execsql_t
1d60: 65 73 74 20 69 6e 64 65 78 65 64 62 79 2d 38 2e  est indexedby-8.
1d70: 32 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55  2 {.  EXPLAIN QU
1d80: 45 52 59 20 50 4c 41 4e 20 55 50 44 41 54 45 20  ERY PLAN UPDATE 
1d90: 74 31 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 53  t1 NOT INDEXED S
1da0: 45 54 20 72 6f 77 69 64 3d 72 6f 77 69 64 2b 31  ET rowid=rowid+1
1db0: 20 57 48 45 52 45 20 61 20 3d 20 35 20 0a 7d 20   WHERE a = 5 .} 
1dc0: 7b 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42  {0 0 0 {SCAN TAB
1dd0: 4c 45 20 74 31 20 28 7e 31 30 30 30 30 30 20 72  LE t1 (~100000 r
1de0: 6f 77 73 29 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  ows)}}.do_execsq
1df0: 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62 79  l_test indexedby
1e00: 2d 38 2e 33 20 7b 0a 20 20 45 58 50 4c 41 49 4e  -8.3 {.  EXPLAIN
1e10: 20 51 55 45 52 59 20 50 4c 41 4e 20 55 50 44 41   QUERY PLAN UPDA
1e20: 54 45 20 74 31 20 49 4e 44 45 58 45 44 20 42 59  TE t1 INDEXED BY
1e30: 20 69 31 20 53 45 54 20 72 6f 77 69 64 3d 72 6f   i1 SET rowid=ro
1e40: 77 69 64 2b 31 20 57 48 45 52 45 20 61 20 3d 20  wid+1 WHERE a = 
1e50: 35 20 0a 7d 20 7b 30 20 30 20 30 20 7b 53 45 41  5 .} {0 0 0 {SEA
1e60: 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53 49  RCH TABLE t1 USI
1e70: 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
1e80: 58 20 69 31 20 28 61 3d 3f 29 20 28 7e 31 30 20  X i1 (a=?) (~10 
1e90: 72 6f 77 73 29 7d 7d 0a 64 6f 5f 65 78 65 63 73  rows)}}.do_execs
1ea0: 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62  ql_test indexedb
1eb0: 79 2d 38 2e 34 20 7b 0a 20 20 45 58 50 4c 41 49  y-8.4 {.  EXPLAI
1ec0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 0a 20 20  N QUERY PLAN .  
1ed0: 55 50 44 41 54 45 20 74 31 20 49 4e 44 45 58 45  UPDATE t1 INDEXE
1ee0: 44 20 42 59 20 69 31 20 53 45 54 20 72 6f 77 69  D BY i1 SET rowi
1ef0: 64 3d 72 6f 77 69 64 2b 31 20 57 48 45 52 45 20  d=rowid+1 WHERE 
1f00: 61 20 3d 20 35 20 41 4e 44 20 62 20 3d 20 31 30  a = 5 AND b = 10
1f10: 0a 7d 20 7b 30 20 30 20 30 20 7b 53 45 41 52 43  .} {0 0 0 {SEARC
1f20: 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  H TABLE t1 USING
1f30: 20 49 4e 44 45 58 20 69 31 20 28 61 3d 3f 29 20   INDEX i1 (a=?) 
1f40: 28 7e 32 20 72 6f 77 73 29 7d 7d 0a 64 6f 5f 65  (~2 rows)}}.do_e
1f50: 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65  xecsql_test inde
1f60: 78 65 64 62 79 2d 38 2e 35 20 7b 0a 20 20 45 58  xedby-8.5 {.  EX
1f70: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
1f80: 20 0a 20 20 55 50 44 41 54 45 20 74 31 20 49 4e   .  UPDATE t1 IN
1f90: 44 45 58 45 44 20 42 59 20 69 32 20 53 45 54 20  DEXED BY i2 SET 
1fa0: 72 6f 77 69 64 3d 72 6f 77 69 64 2b 31 20 57 48  rowid=rowid+1 WH
1fb0: 45 52 45 20 61 20 3d 20 35 20 41 4e 44 20 62 20  ERE a = 5 AND b 
1fc0: 3d 20 31 30 0a 7d 20 7b 30 20 30 20 30 20 7b 53  = 10.} {0 0 0 {S
1fd0: 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55  EARCH TABLE t1 U
1fe0: 53 49 4e 47 20 49 4e 44 45 58 20 69 32 20 28 62  SING INDEX i2 (b
1ff0: 3d 3f 29 20 28 7e 32 20 72 6f 77 73 29 7d 7d 0a  =?) (~2 rows)}}.
2000: 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62  do_test indexedb
2010: 79 2d 38 2e 36 20 7b 0a 20 20 63 61 74 63 68 73  y-8.6 {.  catchs
2020: 71 6c 20 7b 20 55 50 44 41 54 45 20 74 31 20 49  ql { UPDATE t1 I
2030: 4e 44 45 58 45 44 20 42 59 20 69 32 20 53 45 54  NDEXED BY i2 SET
2040: 20 72 6f 77 69 64 3d 72 6f 77 69 64 2b 31 20 57   rowid=rowid+1 W
2050: 48 45 52 45 20 61 20 3d 20 35 7d 0a 7d 20 7b 31  HERE a = 5}.} {1
2060: 20 7b 63 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64   {cannot use ind
2070: 65 78 3a 20 69 32 7d 7d 0a 0a 23 20 54 65 73 74  ex: i2}}..# Test
2080: 20 74 68 61 74 20 62 75 67 20 23 33 35 36 30 20   that bug #3560 
2090: 69 73 20 66 69 78 65 64 2e 0a 23 0a 64 6f 5f 74  is fixed..#.do_t
20a0: 65 73 74 20 69 6e 64 65 78 65 64 62 79 2d 39 2e  est indexedby-9.
20b0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
20c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
20d0: 20 6d 61 69 6e 74 61 62 6c 65 28 20 69 64 20 69   maintable( id i
20e0: 6e 74 65 67 65 72 29 3b 0a 20 20 20 20 43 52 45  nteger);.    CRE
20f0: 41 54 45 20 54 41 42 4c 45 20 6a 6f 69 6e 6d 65  ATE TABLE joinme
2100: 28 69 64 5f 69 6e 74 20 69 6e 74 65 67 65 72 2c  (id_int integer,
2110: 20 69 64 5f 74 65 78 74 20 74 65 78 74 29 3b 0a   id_text text);.
2120: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
2130: 20 6a 6f 69 6e 6d 65 5f 69 64 5f 74 65 78 74 5f   joinme_id_text_
2140: 69 64 78 20 6f 6e 20 6a 6f 69 6e 6d 65 28 69 64  idx on joinme(id
2150: 5f 74 65 78 74 29 3b 0a 20 20 20 20 43 52 45 41  _text);.    CREA
2160: 54 45 20 49 4e 44 45 58 20 6a 6f 69 6e 6d 65 5f  TE INDEX joinme_
2170: 69 64 5f 69 6e 74 5f 69 64 78 20 6f 6e 20 6a 6f  id_int_idx on jo
2180: 69 6e 6d 65 28 69 64 5f 69 6e 74 29 3b 0a 20 20  inme(id_int);.  
2190: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 69  }.} {}.do_test i
21a0: 6e 64 65 78 65 64 62 79 2d 39 2e 32 20 7b 0a 20  ndexedby-9.2 {. 
21b0: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
21c0: 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20 6d 61  select * from ma
21d0: 69 6e 74 61 62 6c 65 20 61 73 20 6d 20 69 6e 6e  intable as m inn
21e0: 65 72 20 6a 6f 69 6e 0a 20 20 20 20 6a 6f 69 6e  er join.    join
21f0: 6d 65 20 61 73 20 6a 20 69 6e 64 65 78 65 64 20  me as j indexed 
2200: 62 79 20 6a 6f 69 6e 6d 65 5f 69 64 5f 74 65 78  by joinme_id_tex
2210: 74 5f 69 64 78 0a 20 20 20 20 6f 6e 20 28 20 6d  t_idx.    on ( m
2220: 2e 69 64 20 20 3d 20 6a 2e 69 64 5f 69 6e 74 29  .id  = j.id_int)
2230: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f  .  }.} {1 {canno
2240: 74 20 75 73 65 20 69 6e 64 65 78 3a 20 6a 6f 69  t use index: joi
2250: 6e 6d 65 5f 69 64 5f 74 65 78 74 5f 69 64 78 7d  nme_id_text_idx}
2260: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65  }.do_test indexe
2270: 64 62 79 2d 39 2e 33 20 7b 0a 20 20 63 61 74 63  dby-9.3 {.  catc
2280: 68 73 71 6c 20 7b 20 73 65 6c 65 63 74 20 2a 20  hsql { select * 
2290: 66 72 6f 6d 20 6d 61 69 6e 74 61 62 6c 65 2c 20  from maintable, 
22a0: 6a 6f 69 6e 6d 65 20 49 4e 44 45 58 45 44 20 62  joinme INDEXED b
22b0: 79 20 6a 6f 69 6e 6d 65 5f 69 64 5f 74 65 78 74  y joinme_id_text
22c0: 5f 69 64 78 20 7d 0a 7d 20 7b 31 20 7b 63 61 6e  _idx }.} {1 {can
22d0: 6e 6f 74 20 75 73 65 20 69 6e 64 65 78 3a 20 6a  not use index: j
22e0: 6f 69 6e 6d 65 5f 69 64 5f 74 65 78 74 5f 69 64  oinme_id_text_id
22f0: 78 7d 7d 0a 0a 23 20 4d 61 6b 65 20 73 75 72 65  x}}..# Make sure
2300: 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 63 72   we can still cr
2310: 65 61 74 65 20 74 61 62 6c 65 73 2c 20 69 6e 64  eate tables, ind
2320: 69 63 65 73 2c 20 61 6e 64 20 63 6f 6c 75 6d 6e  ices, and column
2330: 73 20 77 68 6f 73 65 20 6e 61 6d 65 0a 23 20 69  s whose name.# i
2340: 73 20 22 69 6e 64 65 78 65 64 22 2e 0a 23 0a 64  s "indexed"..#.d
2350: 6f 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62 79  o_test indexedby
2360: 2d 31 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -10.1 {.  execsq
2370: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
2380: 41 42 4c 45 20 69 6e 64 65 78 65 64 28 78 2c 79  ABLE indexed(x,y
2390: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
23a0: 54 4f 20 69 6e 64 65 78 65 64 20 56 41 4c 55 45  TO indexed VALUE
23b0: 53 28 31 2c 32 29 3b 0a 20 20 20 20 53 45 4c 45  S(1,2);.    SELE
23c0: 43 54 20 2a 20 46 52 4f 4d 20 69 6e 64 65 78 65  CT * FROM indexe
23d0: 64 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64  d;.  }.} {1 2}.d
23e0: 6f 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62 79  o_test indexedby
23f0: 2d 31 30 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -10.2 {.  execsq
2400: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 49  l {.    CREATE I
2410: 4e 44 45 58 20 69 31 30 20 4f 4e 20 69 6e 64 65  NDEX i10 ON inde
2420: 78 65 64 28 78 29 3b 0a 20 20 20 20 53 45 4c 45  xed(x);.    SELE
2430: 43 54 20 2a 20 46 52 4f 4d 20 69 6e 64 65 78 65  CT * FROM indexe
2440: 64 20 69 6e 64 65 78 65 64 20 62 79 20 69 31 30  d indexed by i10
2450: 20 77 68 65 72 65 20 78 3e 30 3b 0a 20 20 7d 0a   where x>0;.  }.
2460: 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {1 2}.do_test 
2470: 69 6e 64 65 78 65 64 62 79 2d 31 30 2e 33 20 7b  indexedby-10.3 {
2480: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2490: 20 44 52 4f 50 20 54 41 42 4c 45 20 69 6e 64 65   DROP TABLE inde
24a0: 78 65 64 3b 0a 20 20 20 20 43 52 45 41 54 45 20  xed;.    CREATE 
24b0: 54 41 42 4c 45 20 74 31 30 28 69 6e 64 65 78 65  TABLE t10(indexe
24c0: 64 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20  d INTEGER);.    
24d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 30 20  INSERT INTO t10 
24e0: 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 43  VALUES(1);.    C
24f0: 52 45 41 54 45 20 49 4e 44 45 58 20 69 6e 64 65  REATE INDEX inde
2500: 78 65 64 20 4f 4e 20 74 31 30 28 69 6e 64 65 78  xed ON t10(index
2510: 65 64 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  ed);.    SELECT 
2520: 2a 20 46 52 4f 4d 20 74 31 30 20 69 6e 64 65 78  * FROM t10 index
2530: 65 64 20 62 79 20 69 6e 64 65 78 65 64 20 57 48  ed by indexed WH
2540: 45 52 45 20 69 6e 64 65 78 65 64 3e 30 0a 20 20  ERE indexed>0.  
2550: 7d 0a 7d 20 7b 31 7d 0a 0a 66 69 6e 69 73 68 5f  }.} {1}..finish_
2560: 74 65 73 74 0a                                   test.