/ Hex Artifact Content
Login

Artifact 9c4cd331224e57f79fbf411ae245e6272d415985:


0000: 23 20 32 30 30 38 2d 31 30 2d 30 34 0a 23 0a 23  # 2008-10-04.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u give..#.#*****
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73 74 64 69  **.#..set testdi
0170: 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  r [file dirname 
0180: 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24  $argv0].source $
0190: 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74  testdir/tester.t
01a0: 63 6c 0a 73 65 74 20 3a 3a 74 65 73 74 70 72 65  cl.set ::testpre
01b0: 66 69 78 20 69 6e 64 65 78 65 64 62 79 0a 0a 23  fix indexedby..#
01c0: 20 43 72 65 61 74 65 20 61 20 73 63 68 65 6d 61   Create a schema
01d0: 20 77 69 74 68 20 73 6f 6d 65 20 69 6e 64 65 78   with some index
01e0: 65 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e  es..#.do_test in
01f0: 64 65 78 65 64 62 79 2d 31 2e 31 20 7b 0a 20 20  dexedby-1.1 {.  
0200: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
0210: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
0220: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
0230: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
0240: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
0250: 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b  DEX i2 ON t1(b);
0260: 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ..    CREATE TAB
0270: 4c 45 20 74 32 28 63 2c 20 64 29 3b 0a 20 20 20  LE t2(c, d);.   
0280: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33   CREATE INDEX i3
0290: 20 4f 4e 20 74 32 28 63 29 3b 0a 20 20 20 20 43   ON t2(c);.    C
02a0: 52 45 41 54 45 20 49 4e 44 45 58 20 69 34 20 4f  REATE INDEX i4 O
02b0: 4e 20 74 32 28 64 29 3b 0a 0a 20 20 20 20 43 52  N t2(d);..    CR
02c0: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 65 20  EATE TABLE t3(e 
02d0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 66 29 3b  PRIMARY KEY, f);
02e0: 0a 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 45  ..    CREATE VIE
02f0: 57 20 76 31 20 41 53 20 53 45 4c 45 43 54 20 2a  W v1 AS SELECT *
0300: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
0310: 7b 7d 0a 0a 23 20 45 78 70 6c 61 69 6e 20 51 75  {}..# Explain Qu
0320: 65 72 79 20 50 6c 61 6e 0a 23 0a 70 72 6f 63 20  ery Plan.#.proc 
0330: 45 51 50 20 7b 73 71 6c 7d 20 7b 0a 20 20 75 70  EQP {sql} {.  up
0340: 6c 65 76 65 6c 20 22 65 78 65 63 73 71 6c 20 7b  level "execsql {
0350: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
0360: 41 4e 20 24 73 71 6c 7d 22 0a 7d 0a 0a 23 20 54  AN $sql}".}..# T
0370: 68 65 73 65 20 74 65 73 74 73 20 61 72 65 20 74  hese tests are t
0380: 6f 20 63 68 65 63 6b 20 74 68 61 74 20 22 45 58  o check that "EX
0390: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
03a0: 22 20 69 73 20 77 6f 72 6b 69 6e 67 20 61 73 20  " is working as 
03b0: 65 78 70 65 63 74 65 64 2e 0a 23 0a 64 6f 5f 65  expected..#.do_e
03c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65  xecsql_test inde
03d0: 78 65 64 62 79 2d 31 2e 32 20 7b 0a 20 20 45 58  xedby-1.2 {.  EX
03e0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
03f0: 20 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20 74   select * from t
0400: 31 20 57 48 45 52 45 20 61 20 3d 20 31 30 3b 20  1 WHERE a = 10; 
0410: 0a 7d 20 7b 30 20 30 20 30 20 7b 53 45 41 52 43  .} {0 0 0 {SEARC
0420: 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  H TABLE t1 USING
0430: 20 49 4e 44 45 58 20 69 31 20 28 61 3d 3f 29 7d   INDEX i1 (a=?)}
0440: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
0450: 74 20 69 6e 64 65 78 65 64 62 79 2d 31 2e 33 20  t indexedby-1.3 
0460: 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  {.  EXPLAIN QUER
0470: 59 20 50 4c 41 4e 20 73 65 6c 65 63 74 20 2a 20  Y PLAN select * 
0480: 66 72 6f 6d 20 74 31 20 3b 20 0a 7d 20 7b 30 20  from t1 ; .} {0 
0490: 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20  0 0 {SCAN TABLE 
04a0: 74 31 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t1}}.do_execsql_
04b0: 74 65 73 74 20 69 6e 64 65 78 65 64 62 79 2d 31  test indexedby-1
04c0: 2e 34 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51  .4 {.  EXPLAIN Q
04d0: 55 45 52 59 20 50 4c 41 4e 20 73 65 6c 65 63 74  UERY PLAN select
04e0: 20 2a 20 66 72 6f 6d 20 74 31 2c 20 74 32 20 57   * from t1, t2 W
04f0: 48 45 52 45 20 63 20 3d 20 31 30 3b 20 0a 7d 20  HERE c = 10; .} 
0500: 7b 0a 20 20 30 20 30 20 31 20 7b 53 45 41 52 43  {.  0 0 1 {SEARC
0510: 48 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47  H TABLE t2 USING
0520: 20 49 4e 44 45 58 20 69 33 20 28 63 3d 3f 29 7d   INDEX i3 (c=?)}
0530: 20 0a 20 20 30 20 31 20 30 20 7b 53 43 41 4e 20   .  0 1 0 {SCAN 
0540: 54 41 42 4c 45 20 74 31 7d 0a 7d 0a 0a 23 20 50  TABLE t1}.}..# P
0550: 61 72 73 65 72 20 74 65 73 74 73 2e 20 54 65 73  arser tests. Tes
0560: 74 20 74 68 61 74 20 61 6e 20 49 4e 44 45 58 45  t that an INDEXE
0570: 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45  D BY or NOT INDE
0580: 58 20 63 6c 61 75 73 65 20 63 61 6e 20 62 65 20  X clause can be 
0590: 0a 23 20 61 74 74 61 63 68 65 64 20 74 6f 20 61  .# attached to a
05a0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
05b0: 4f 4d 20 63 6c 61 75 73 65 2c 20 62 75 74 20 6e  OM clause, but n
05c0: 6f 74 20 74 6f 20 61 20 73 75 62 2d 73 65 6c 65  ot to a sub-sele
05d0: 63 74 20 6f 72 0a 23 20 53 51 4c 20 76 69 65 77  ct or.# SQL view
05e0: 2e 20 41 6c 73 6f 20 74 65 73 74 20 74 68 61 74  . Also test that
05f0: 20 73 70 65 63 69 66 79 69 6e 67 20 61 6e 20 69   specifying an i
0600: 6e 64 65 78 20 74 68 61 74 20 64 6f 65 73 20 6e  ndex that does n
0610: 6f 74 20 65 78 69 73 74 20 6f 72 0a 23 20 69 73  ot exist or.# is
0620: 20 61 74 74 61 63 68 65 64 20 74 6f 20 61 20 64   attached to a d
0630: 69 66 66 65 72 65 6e 74 20 74 61 62 6c 65 20 69  ifferent table i
0640: 73 20 64 65 74 65 63 74 65 64 20 61 73 20 61 6e  s detected as an
0650: 20 65 72 72 6f 72 2e 0a 23 0a 23 20 45 56 49 44   error..#.# EVID
0660: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 30 30 34  ENCE-OF: R-07004
0670: 2d 31 31 35 32 32 20 2d 2d 20 73 79 6e 74 61 78  -11522 -- syntax
0680: 20 64 69 61 67 72 61 6d 20 71 75 61 6c 69 66 69   diagram qualifi
0690: 65 64 2d 74 61 62 6c 65 2d 6e 61 6d 65 0a 23 20  ed-table-name.# 
06a0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
06b0: 52 2d 35 38 32 33 30 2d 35 37 30 39 38 20 54 68  R-58230-57098 Th
06c0: 65 20 22 49 4e 44 45 58 45 44 20 42 59 20 69 6e  e "INDEXED BY in
06d0: 64 65 78 2d 6e 61 6d 65 22 20 70 68 72 61 73 65  dex-name" phrase
06e0: 0a 23 20 73 70 65 63 69 66 69 65 73 20 74 68 61  .# specifies tha
06f0: 74 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  t the named inde
0700: 78 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69  x must be used i
0710: 6e 20 6f 72 64 65 72 20 74 6f 20 6c 6f 6f 6b 20  n order to look 
0720: 75 70 20 76 61 6c 75 65 73 0a 23 20 6f 6e 20 74  up values.# on t
0730: 68 65 20 70 72 65 63 65 64 69 6e 67 20 74 61 62  he preceding tab
0740: 6c 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e  le..#.do_test in
0750: 64 65 78 65 64 62 79 2d 32 2e 31 20 7b 0a 20 20  dexedby-2.1 {.  
0760: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
0770: 20 2a 20 46 52 4f 4d 20 74 31 20 4e 4f 54 20 49   * FROM t1 NOT I
0780: 4e 44 45 58 45 44 20 57 48 45 52 45 20 61 20 3d  NDEXED WHERE a =
0790: 20 27 6f 6e 65 27 20 41 4e 44 20 62 20 3d 20 27   'one' AND b = '
07a0: 74 77 6f 27 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  two'}.} {}.do_te
07b0: 73 74 20 69 6e 64 65 78 65 64 62 79 2d 32 2e 31  st indexedby-2.1
07c0: 62 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  b {.  execsql { 
07d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61  SELECT * FROM ma
07e0: 69 6e 2e 74 31 20 4e 4f 54 20 49 4e 44 45 58 45  in.t1 NOT INDEXE
07f0: 44 20 57 48 45 52 45 20 61 20 3d 20 27 6f 6e 65  D WHERE a = 'one
0800: 27 20 41 4e 44 20 62 20 3d 20 27 74 77 6f 27 7d  ' AND b = 'two'}
0810: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  .} {}.do_test in
0820: 64 65 78 65 64 62 79 2d 32 2e 32 20 7b 0a 20 20  dexedby-2.2 {.  
0830: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
0840: 20 2a 20 46 52 4f 4d 20 74 31 20 49 4e 44 45 58   * FROM t1 INDEX
0850: 45 44 20 42 59 20 69 31 20 57 48 45 52 45 20 61  ED BY i1 WHERE a
0860: 20 3d 20 27 6f 6e 65 27 20 41 4e 44 20 62 20 3d   = 'one' AND b =
0870: 20 27 74 77 6f 27 7d 0a 7d 20 7b 7d 0a 64 6f 5f   'two'}.} {}.do_
0880: 74 65 73 74 20 69 6e 64 65 78 65 64 62 79 2d 32  test indexedby-2
0890: 2e 32 62 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .2b {.  execsql 
08a0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
08b0: 6d 61 69 6e 2e 74 31 20 49 4e 44 45 58 45 44 20  main.t1 INDEXED 
08c0: 42 59 20 69 31 20 57 48 45 52 45 20 61 20 3d 20  BY i1 WHERE a = 
08d0: 27 6f 6e 65 27 20 41 4e 44 20 62 20 3d 20 27 74  'one' AND b = 't
08e0: 77 6f 27 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  wo'}.} {}.do_tes
08f0: 74 20 69 6e 64 65 78 65 64 62 79 2d 32 2e 33 20  t indexedby-2.3 
0900: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
0910: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 49  LECT * FROM t1 I
0920: 4e 44 45 58 45 44 20 42 59 20 69 32 20 57 48 45  NDEXED BY i2 WHE
0930: 52 45 20 61 20 3d 20 27 6f 6e 65 27 20 41 4e 44  RE a = 'one' AND
0940: 20 62 20 3d 20 27 74 77 6f 27 7d 0a 7d 20 7b 7d   b = 'two'}.} {}
0950: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
0960: 52 2d 34 34 36 39 39 2d 35 35 35 35 38 20 54 68  R-44699-55558 Th
0970: 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  e INDEXED BY cla
0980: 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 67 69 76  use does not giv
0990: 65 20 74 68 65 0a 23 20 6f 70 74 69 6d 69 7a 65  e the.# optimize
09a0: 72 20 68 69 6e 74 73 20 61 62 6f 75 74 20 77 68  r hints about wh
09b0: 69 63 68 20 69 6e 64 65 78 20 74 6f 20 75 73 65  ich index to use
09c0: 3b 20 69 74 20 67 69 76 65 73 20 74 68 65 20 6f  ; it gives the o
09d0: 70 74 69 6d 69 7a 65 72 20 61 0a 23 20 72 65 71  ptimizer a.# req
09e0: 75 69 72 65 6d 65 6e 74 20 6f 66 20 77 68 69 63  uirement of whic
09f0: 68 20 69 6e 64 65 78 20 74 6f 20 75 73 65 2e 0a  h index to use..
0a00: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
0a10: 2d 31 35 38 30 30 2d 32 35 37 31 39 20 49 66 20  -15800-25719 If 
0a20: 69 6e 64 65 78 2d 6e 61 6d 65 20 64 6f 65 73 20  index-name does 
0a30: 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 61 6e  not exist or can
0a40: 6e 6f 74 20 62 65 0a 23 20 75 73 65 64 20 66 6f  not be.# used fo
0a50: 72 20 74 68 65 20 71 75 65 72 79 2c 20 74 68 65  r the query, the
0a60: 6e 20 74 68 65 20 70 72 65 70 61 72 61 74 69 6f  n the preparatio
0a70: 6e 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61  n of the SQL sta
0a80: 74 65 6d 65 6e 74 20 66 61 69 6c 73 2e 0a 23 0a  tement fails..#.
0a90: 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62  do_test indexedb
0aa0: 79 2d 32 2e 34 20 7b 0a 20 20 63 61 74 63 68 73  y-2.4 {.  catchs
0ab0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
0ac0: 4f 4d 20 74 31 20 49 4e 44 45 58 45 44 20 42 59  OM t1 INDEXED BY
0ad0: 20 69 33 20 57 48 45 52 45 20 61 20 3d 20 27 6f   i3 WHERE a = 'o
0ae0: 6e 65 27 20 41 4e 44 20 62 20 3d 20 27 74 77 6f  ne' AND b = 'two
0af0: 27 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68  '}.} {1 {no such
0b00: 20 69 6e 64 65 78 3a 20 69 33 7d 7d 0a 0a 23 20   index: i3}}..# 
0b10: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
0b20: 32 31 31 32 2d 34 32 34 35 36 20 49 66 20 74 68  2112-42456 If th
0b30: 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65  e query optimize
0b40: 72 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 75  r is unable to u
0b50: 73 65 20 74 68 65 0a 23 20 69 6e 64 65 78 20 73  se the.# index s
0b60: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
0b70: 49 4e 44 45 58 20 42 59 20 63 6c 61 75 73 65 2c  INDEX BY clause,
0b80: 20 74 68 65 6e 20 74 68 65 20 71 75 65 72 79 20   then the query 
0b90: 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 0a 23  will fail with.#
0ba0: 20 61 6e 20 65 72 72 6f 72 2e 0a 64 6f 5f 74 65   an error..do_te
0bb0: 73 74 20 69 6e 64 65 78 65 64 62 79 2d 32 2e 34  st indexedby-2.4
0bc0: 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .1 {.  catchsql 
0bd0: 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  { SELECT b FROM 
0be0: 74 31 20 49 4e 44 45 58 45 44 20 42 59 20 69 31  t1 INDEXED BY i1
0bf0: 20 57 48 45 52 45 20 62 20 3d 20 27 74 77 6f 27   WHERE b = 'two'
0c00: 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 71 75 65 72   }.} {1 {no quer
0c10: 79 20 73 6f 6c 75 74 69 6f 6e 7d 7d 0a 0a 64 6f  y solution}}..do
0c20: 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62 79 2d  _test indexedby-
0c30: 32 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  2.5 {.  catchsql
0c40: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
0c50: 20 74 31 20 49 4e 44 45 58 45 44 20 42 59 20 69   t1 INDEXED BY i
0c60: 35 20 57 48 45 52 45 20 61 20 3d 20 27 6f 6e 65  5 WHERE a = 'one
0c70: 27 20 41 4e 44 20 62 20 3d 20 27 74 77 6f 27 7d  ' AND b = 'two'}
0c80: 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 69  .} {1 {no such i
0c90: 6e 64 65 78 3a 20 69 35 7d 7d 0a 64 6f 5f 74 65  ndex: i5}}.do_te
0ca0: 73 74 20 69 6e 64 65 78 65 64 62 79 2d 32 2e 36  st indexedby-2.6
0cb0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
0cc0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0cd0: 20 49 4e 44 45 58 45 44 20 42 59 20 57 48 45 52   INDEXED BY WHER
0ce0: 45 20 61 20 3d 20 27 6f 6e 65 27 20 41 4e 44 20  E a = 'one' AND 
0cf0: 62 20 3d 20 27 74 77 6f 27 7d 0a 7d 20 7b 31 20  b = 'two'}.} {1 
0d00: 7b 6e 65 61 72 20 22 57 48 45 52 45 22 3a 20 73  {near "WHERE": s
0d10: 79 6e 74 61 78 20 65 72 72 6f 72 7d 7d 0a 64 6f  yntax error}}.do
0d20: 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62 79 2d  _test indexedby-
0d30: 32 2e 37 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  2.7 {.  catchsql
0d40: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
0d50: 20 76 31 20 49 4e 44 45 58 45 44 20 42 59 20 69   v1 INDEXED BY i
0d60: 31 20 57 48 45 52 45 20 61 20 3d 20 27 6f 6e 65  1 WHERE a = 'one
0d70: 27 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63  ' }.} {1 {no suc
0d80: 68 20 69 6e 64 65 78 3a 20 69 31 7d 7d 0a 0a 0a  h index: i1}}...
0d90: 23 20 54 65 73 74 73 20 66 6f 72 20 73 69 6e 67  # Tests for sing
0da0: 6c 65 20 74 61 62 6c 65 20 63 61 73 65 73 2e 0a  le table cases..
0db0: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
0dc0: 20 52 2d 33 37 30 30 32 2d 32 38 38 37 31 20 54   R-37002-28871 T
0dd0: 68 65 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22  he "NOT INDEXED"
0de0: 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
0df0: 73 20 74 68 61 74 20 6e 6f 0a 23 20 69 6e 64 65  s that no.# inde
0e00: 78 20 73 68 61 6c 6c 20 62 65 20 75 73 65 64 20  x shall be used 
0e10: 77 68 65 6e 20 61 63 63 65 73 73 69 6e 67 20 74  when accessing t
0e20: 68 65 20 70 72 65 63 65 64 69 6e 67 20 74 61 62  he preceding tab
0e30: 6c 65 2c 20 69 6e 63 6c 75 64 69 6e 67 0a 23 20  le, including.# 
0e40: 69 6d 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20  implied indices 
0e50: 63 72 65 61 74 65 20 62 79 20 55 4e 49 51 55 45  create by UNIQUE
0e60: 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b 45 59   and PRIMARY KEY
0e70: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 48 6f   constraints. Ho
0e80: 77 65 76 65 72 2c 0a 23 20 74 68 65 20 72 6f 77  wever,.# the row
0e90: 69 64 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20  id can still be 
0ea0: 75 73 65 64 20 74 6f 20 6c 6f 6f 6b 20 75 70 20  used to look up 
0eb0: 65 6e 74 72 69 65 73 20 65 76 65 6e 20 77 68 65  entries even whe
0ec0: 6e 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 0a  n "NOT INDEXED".
0ed0: 23 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  # is specified..
0ee0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
0ef0: 74 20 69 6e 64 65 78 65 64 62 79 2d 33 2e 31 20  t indexedby-3.1 
0f00: 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  {.  EXPLAIN QUER
0f10: 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 2a 20  Y PLAN SELECT * 
0f20: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
0f30: 3d 20 27 6f 6e 65 27 20 41 4e 44 20 62 20 3d 20  = 'one' AND b = 
0f40: 27 74 77 6f 27 0a 7d 20 7b 2f 53 45 41 52 43 48  'two'.} {/SEARCH
0f50: 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20   TABLE t1 USING 
0f60: 49 4e 44 45 58 2f 7d 0a 64 6f 5f 65 78 65 63 73  INDEX/}.do_execs
0f70: 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62  ql_test indexedb
0f80: 79 2d 33 2e 31 2e 31 20 7b 0a 20 20 45 58 50 4c  y-3.1.1 {.  EXPL
0f90: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53  AIN QUERY PLAN S
0fa0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0fb0: 4e 4f 54 20 49 4e 44 45 58 45 44 20 57 48 45 52  NOT INDEXED WHER
0fc0: 45 20 61 20 3d 20 27 6f 6e 65 27 20 41 4e 44 20  E a = 'one' AND 
0fd0: 62 20 3d 20 27 74 77 6f 27 0a 7d 20 7b 30 20 30  b = 'two'.} {0 0
0fe0: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   0 {SCAN TABLE t
0ff0: 31 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  1}}.do_execsql_t
1000: 65 73 74 20 69 6e 64 65 78 65 64 62 79 2d 33 2e  est indexedby-3.
1010: 31 2e 32 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20  1.2 {.  EXPLAIN 
1020: 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43  QUERY PLAN SELEC
1030: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4e 4f 54 20  T * FROM t1 NOT 
1040: 49 4e 44 45 58 45 44 20 57 48 45 52 45 20 72 6f  INDEXED WHERE ro
1050: 77 69 64 3d 31 0a 7d 20 7b 2f 53 45 41 52 43 48  wid=1.} {/SEARCH
1060: 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20   TABLE t1 USING 
1070: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1080: 4b 45 59 20 2e 72 6f 77 69 64 3d 2f 7d 0a 0a 0a  KEY .rowid=/}...
1090: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
10a0: 69 6e 64 65 78 65 64 62 79 2d 33 2e 32 20 7b 0a  indexedby-3.2 {.
10b0: 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20    EXPLAIN QUERY 
10c0: 50 4c 41 4e 20 0a 20 20 53 45 4c 45 43 54 20 2a  PLAN .  SELECT *
10d0: 20 46 52 4f 4d 20 74 31 20 49 4e 44 45 58 45 44   FROM t1 INDEXED
10e0: 20 42 59 20 69 31 20 57 48 45 52 45 20 61 20 3d   BY i1 WHERE a =
10f0: 20 27 6f 6e 65 27 20 41 4e 44 20 62 20 3d 20 27   'one' AND b = '
1100: 74 77 6f 27 0a 7d 20 7b 30 20 30 20 30 20 7b 53  two'.} {0 0 0 {S
1110: 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55  EARCH TABLE t1 U
1120: 53 49 4e 47 20 49 4e 44 45 58 20 69 31 20 28 61  SING INDEX i1 (a
1130: 3d 3f 29 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  =?)}}.do_execsql
1140: 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62 79 2d  _test indexedby-
1150: 33 2e 33 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20  3.3 {.  EXPLAIN 
1160: 51 55 45 52 59 20 50 4c 41 4e 20 0a 20 20 53 45  QUERY PLAN .  SE
1170: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 49  LECT * FROM t1 I
1180: 4e 44 45 58 45 44 20 42 59 20 69 32 20 57 48 45  NDEXED BY i2 WHE
1190: 52 45 20 61 20 3d 20 27 6f 6e 65 27 20 41 4e 44  RE a = 'one' AND
11a0: 20 62 20 3d 20 27 74 77 6f 27 0a 7d 20 7b 30 20   b = 'two'.} {0 
11b0: 30 20 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c  0 0 {SEARCH TABL
11c0: 45 20 74 31 20 55 53 49 4e 47 20 49 4e 44 45 58  E t1 USING INDEX
11d0: 20 69 32 20 28 62 3d 3f 29 7d 7d 0a 64 6f 5f 74   i2 (b=?)}}.do_t
11e0: 65 73 74 20 69 6e 64 65 78 65 64 62 79 2d 33 2e  est indexedby-3.
11f0: 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  4 {.  catchsql {
1200: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1210: 31 20 49 4e 44 45 58 45 44 20 42 59 20 69 32 20  1 INDEXED BY i2 
1220: 57 48 45 52 45 20 61 20 3d 20 27 6f 6e 65 27 20  WHERE a = 'one' 
1230: 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 71 75 65 72 79  }.} {1 {no query
1240: 20 73 6f 6c 75 74 69 6f 6e 7d 7d 0a 64 6f 5f 74   solution}}.do_t
1250: 65 73 74 20 69 6e 64 65 78 65 64 62 79 2d 33 2e  est indexedby-3.
1260: 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  5 {.  catchsql {
1270: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1280: 31 20 49 4e 44 45 58 45 44 20 42 59 20 69 32 20  1 INDEXED BY i2 
1290: 4f 52 44 45 52 20 42 59 20 61 20 7d 0a 7d 20 7b  ORDER BY a }.} {
12a0: 31 20 7b 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75  1 {no query solu
12b0: 74 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 69  tion}}.do_test i
12c0: 6e 64 65 78 65 64 62 79 2d 33 2e 36 20 7b 0a 20  ndexedby-3.6 {. 
12d0: 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45   catchsql { SELE
12e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 49 4e 44  CT * FROM t1 IND
12f0: 45 58 45 44 20 42 59 20 69 31 20 57 48 45 52 45  EXED BY i1 WHERE
1300: 20 61 20 3d 20 27 6f 6e 65 27 20 7d 0a 7d 20 7b   a = 'one' }.} {
1310: 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  0 {}}.do_test in
1320: 64 65 78 65 64 62 79 2d 33 2e 37 20 7b 0a 20 20  dexedby-3.7 {.  
1330: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
1340: 54 20 2a 20 46 52 4f 4d 20 74 31 20 49 4e 44 45  T * FROM t1 INDE
1350: 58 45 44 20 42 59 20 69 31 20 4f 52 44 45 52 20  XED BY i1 ORDER 
1360: 42 59 20 61 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a  BY a }.} {0 {}}.
1370: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1380: 20 69 6e 64 65 78 65 64 62 79 2d 33 2e 38 20 7b   indexedby-3.8 {
1390: 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  .  EXPLAIN QUERY
13a0: 20 50 4c 41 4e 20 0a 20 20 53 45 4c 45 43 54 20   PLAN .  SELECT 
13b0: 2a 20 46 52 4f 4d 20 74 33 20 49 4e 44 45 58 45  * FROM t3 INDEXE
13c0: 44 20 42 59 20 73 71 6c 69 74 65 5f 61 75 74 6f  D BY sqlite_auto
13d0: 69 6e 64 65 78 5f 74 33 5f 31 20 4f 52 44 45 52  index_t3_1 ORDER
13e0: 20 42 59 20 65 20 0a 7d 20 7b 30 20 30 20 30 20   BY e .} {0 0 0 
13f0: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 33 20 55  {SCAN TABLE t3 U
1400: 53 49 4e 47 20 49 4e 44 45 58 20 73 71 6c 69 74  SING INDEX sqlit
1410: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 33 5f 31  e_autoindex_t3_1
1420: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
1430: 73 74 20 69 6e 64 65 78 65 64 62 79 2d 33 2e 39  st indexedby-3.9
1440: 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45   {.  EXPLAIN QUE
1450: 52 59 20 50 4c 41 4e 20 0a 20 20 53 45 4c 45 43  RY PLAN .  SELEC
1460: 54 20 2a 20 46 52 4f 4d 20 74 33 20 49 4e 44 45  T * FROM t3 INDE
1470: 58 45 44 20 42 59 20 73 71 6c 69 74 65 5f 61 75  XED BY sqlite_au
1480: 74 6f 69 6e 64 65 78 5f 74 33 5f 31 20 57 48 45  toindex_t3_1 WHE
1490: 52 45 20 65 20 3d 20 31 30 20 0a 7d 20 7b 30 20  RE e = 10 .} {0 
14a0: 30 20 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c  0 0 {SEARCH TABL
14b0: 45 20 74 33 20 55 53 49 4e 47 20 49 4e 44 45 58  E t3 USING INDEX
14c0: 20 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65   sqlite_autoinde
14d0: 78 5f 74 33 5f 31 20 28 65 3d 3f 29 7d 7d 0a 64  x_t3_1 (e=?)}}.d
14e0: 6f 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62 79  o_test indexedby
14f0: 2d 33 2e 31 30 20 7b 0a 20 20 63 61 74 63 68 73  -3.10 {.  catchs
1500: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
1510: 4f 4d 20 74 33 20 49 4e 44 45 58 45 44 20 42 59  OM t3 INDEXED BY
1520: 20 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65   sqlite_autoinde
1530: 78 5f 74 33 5f 31 20 57 48 45 52 45 20 66 20 3d  x_t3_1 WHERE f =
1540: 20 31 30 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 71   10 }.} {1 {no q
1550: 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 7d 7d 0a  uery solution}}.
1560: 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62  do_test indexedb
1570: 79 2d 33 2e 31 31 20 7b 0a 20 20 63 61 74 63 68  y-3.11 {.  catch
1580: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
1590: 52 4f 4d 20 74 33 20 49 4e 44 45 58 45 44 20 42  ROM t3 INDEXED B
15a0: 59 20 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64  Y sqlite_autoind
15b0: 65 78 5f 74 33 5f 32 20 57 48 45 52 45 20 66 20  ex_t3_2 WHERE f 
15c0: 3d 20 31 30 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20  = 10 }.} {1 {no 
15d0: 73 75 63 68 20 69 6e 64 65 78 3a 20 73 71 6c 69  such index: sqli
15e0: 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 33 5f  te_autoindex_t3_
15f0: 32 7d 7d 0a 0a 23 20 54 65 73 74 73 20 66 6f 72  2}}..# Tests for
1600: 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 20   multiple table 
1610: 63 61 73 65 73 2e 0a 23 0a 64 6f 5f 65 78 65 63  cases..#.do_exec
1620: 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 64  sql_test indexed
1630: 62 79 2d 34 2e 31 20 7b 0a 20 20 45 58 50 4c 41  by-4.1 {.  EXPLA
1640: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45  IN QUERY PLAN SE
1650: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
1660: 74 32 20 57 48 45 52 45 20 61 20 3d 20 63 20 0a  t2 WHERE a = c .
1670: 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41  } {.  0 0 0 {SCA
1680: 4e 20 54 41 42 4c 45 20 74 31 7d 20 0a 20 20 30  N TABLE t1} .  0
1690: 20 31 20 31 20 7b 53 45 41 52 43 48 20 54 41 42   1 1 {SEARCH TAB
16a0: 4c 45 20 74 32 20 55 53 49 4e 47 20 49 4e 44 45  LE t2 USING INDE
16b0: 58 20 69 33 20 28 63 3d 3f 29 7d 0a 7d 0a 64 6f  X i3 (c=?)}.}.do
16c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e  _execsql_test in
16d0: 64 65 78 65 64 62 79 2d 34 2e 32 20 7b 0a 20 20  dexedby-4.2 {.  
16e0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
16f0: 41 4e 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AN SELECT * FROM
1700: 20 74 31 20 49 4e 44 45 58 45 44 20 42 59 20 69   t1 INDEXED BY i
1710: 31 2c 20 74 32 20 57 48 45 52 45 20 61 20 3d 20  1, t2 WHERE a = 
1720: 63 20 0a 7d 20 7b 0a 20 20 30 20 30 20 31 20 7b  c .} {.  0 0 1 {
1730: 53 43 41 4e 20 54 41 42 4c 45 20 74 32 7d 20 0a  SCAN TABLE t2} .
1740: 20 20 30 20 31 20 30 20 7b 53 45 41 52 43 48 20    0 1 0 {SEARCH 
1750: 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 49  TABLE t1 USING I
1760: 4e 44 45 58 20 69 31 20 28 61 3d 3f 29 7d 0a 7d  NDEX i1 (a=?)}.}
1770: 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65 64  .do_test indexed
1780: 62 79 2d 34 2e 33 20 7b 0a 20 20 63 61 74 63 68  by-4.3 {.  catch
1790: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
17a0: 20 2a 20 46 52 4f 4d 20 74 31 20 49 4e 44 45 58   * FROM t1 INDEX
17b0: 45 44 20 42 59 20 69 31 2c 20 74 32 20 49 4e 44  ED BY i1, t2 IND
17c0: 45 58 45 44 20 42 59 20 69 33 20 57 48 45 52 45  EXED BY i3 WHERE
17d0: 20 61 3d 63 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e   a=c.  }.} {1 {n
17e0: 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e  o query solution
17f0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78  }}.do_test index
1800: 65 64 62 79 2d 34 2e 34 20 7b 0a 20 20 63 61 74  edby-4.4 {.  cat
1810: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  chsql {.    SELE
1820: 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 49 4e 44  CT * FROM t2 IND
1830: 45 58 45 44 20 42 59 20 69 33 2c 20 74 31 20 49  EXED BY i3, t1 I
1840: 4e 44 45 58 45 44 20 42 59 20 69 31 20 57 48 45  NDEXED BY i1 WHE
1850: 52 45 20 61 3d 63 0a 20 20 7d 0a 7d 20 7b 31 20  RE a=c.  }.} {1 
1860: 7b 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69  {no query soluti
1870: 6f 6e 7d 7d 0a 0a 23 20 54 65 73 74 20 65 6d 62  on}}..# Test emb
1880: 65 64 64 69 6e 67 20 61 6e 20 49 4e 44 45 58 45  edding an INDEXE
1890: 44 20 42 59 20 69 6e 20 61 20 43 52 45 41 54 45  D BY in a CREATE
18a0: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
18b0: 20 54 68 69 73 20 62 6c 6f 63 6b 0a 23 20 61 6c   This block.# al
18c0: 73 6f 20 74 65 73 74 73 20 74 68 61 74 20 6e 6f  so tests that no
18d0: 74 68 69 6e 67 20 62 61 64 20 68 61 70 70 65 6e  thing bad happen
18e0: 73 20 69 66 20 61 6e 20 69 6e 64 65 78 20 72 65  s if an index re
18f0: 66 65 72 65 64 20 74 6f 20 62 79 0a 23 20 61 20  fered to by.# a 
1900: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
1910: 65 6d 65 6e 74 20 69 73 20 64 72 6f 70 70 65 64  ement is dropped
1920: 20 61 6e 64 20 72 65 63 72 65 61 74 65 64 2e 0a   and recreated..
1930: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
1940: 74 20 69 6e 64 65 78 65 64 62 79 2d 35 2e 31 20  t indexedby-5.1 
1950: 7b 0a 20 20 43 52 45 41 54 45 20 56 49 45 57 20  {.  CREATE VIEW 
1960: 76 32 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  v2 AS SELECT * F
1970: 52 4f 4d 20 74 31 20 49 4e 44 45 58 45 44 20 42  ROM t1 INDEXED B
1980: 59 20 69 31 20 57 48 45 52 45 20 61 20 3e 20 35  Y i1 WHERE a > 5
1990: 3b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  ;.  EXPLAIN QUER
19a0: 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 2a 20  Y PLAN SELECT * 
19b0: 46 52 4f 4d 20 76 32 20 0a 7d 20 7b 30 20 30 20  FROM v2 .} {0 0 
19c0: 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20  0 {SEARCH TABLE 
19d0: 74 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69  t1 USING INDEX i
19e0: 31 20 28 61 3e 3f 29 7d 7d 0a 64 6f 5f 65 78 65  1 (a>?)}}.do_exe
19f0: 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65  csql_test indexe
1a00: 64 62 79 2d 35 2e 32 20 7b 0a 20 20 45 58 50 4c  dby-5.2 {.  EXPL
1a10: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53  AIN QUERY PLAN S
1a20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 76 32 20  ELECT * FROM v2 
1a30: 57 48 45 52 45 20 62 20 3d 20 31 30 20 0a 7d 20  WHERE b = 10 .} 
1a40: 7b 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54  {0 0 0 {SEARCH T
1a50: 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 49 4e  ABLE t1 USING IN
1a60: 44 45 58 20 69 31 20 28 61 3e 3f 29 7d 7d 0a 64  DEX i1 (a>?)}}.d
1a70: 6f 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62 79  o_test indexedby
1a80: 2d 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -5.3 {.  execsql
1a90: 20 7b 20 44 52 4f 50 20 49 4e 44 45 58 20 69 31   { DROP INDEX i1
1aa0: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   }.  catchsql { 
1ab0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 76 32  SELECT * FROM v2
1ac0: 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68   }.} {1 {no such
1ad0: 20 69 6e 64 65 78 3a 20 69 31 7d 7d 0a 64 6f 5f   index: i1}}.do_
1ae0: 74 65 73 74 20 69 6e 64 65 78 65 64 62 79 2d 35  test indexedby-5
1af0: 2e 34 20 7b 0a 20 20 23 20 52 65 63 72 65 61 74  .4 {.  # Recreat
1b00: 65 20 69 6e 64 65 78 20 69 31 20 69 6e 20 73 75  e index i1 in su
1b10: 63 68 20 61 20 77 61 79 20 61 73 20 69 74 20 63  ch a way as it c
1b20: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 62 79  annot be used by
1b30: 20 74 68 65 20 76 69 65 77 20 71 75 65 72 79 2e   the view query.
1b40: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45  .  execsql { CRE
1b50: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
1b60: 74 31 28 62 29 20 7d 0a 20 20 63 61 74 63 68 73  t1(b) }.  catchs
1b70: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
1b80: 4f 4d 20 76 32 20 7d 0a 7d 20 7b 31 20 7b 6e 6f  OM v2 }.} {1 {no
1b90: 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 7d   query solution}
1ba0: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65  }.do_test indexe
1bb0: 64 62 79 2d 35 2e 35 20 7b 0a 20 20 23 20 44 72  dby-5.5 {.  # Dr
1bc0: 6f 70 20 61 6e 64 20 72 65 63 72 65 61 74 65 20  op and recreate 
1bd0: 69 6e 64 65 78 20 69 31 20 61 67 61 69 6e 2e 20  index i1 again. 
1be0: 54 68 69 73 20 74 69 6d 65 2c 20 63 72 65 61 74  This time, creat
1bf0: 65 20 69 74 20 73 6f 20 74 68 61 74 20 69 74 20  e it so that it 
1c00: 63 61 6e 0a 20 20 23 20 62 65 20 75 73 65 64 20  can.  # be used 
1c10: 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  by the query..  
1c20: 65 78 65 63 73 71 6c 20 7b 20 44 52 4f 50 20 49  execsql { DROP I
1c30: 4e 44 45 58 20 69 31 20 3b 20 43 52 45 41 54 45  NDEX i1 ; CREATE
1c40: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
1c50: 61 29 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  a) }.  catchsql 
1c60: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
1c70: 76 32 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 23  v2 }.} {0 {}}..#
1c80: 20 54 65 73 74 20 74 68 61 74 20 22 4e 4f 54 20   Test that "NOT 
1c90: 49 4e 44 45 58 45 44 22 20 6d 61 79 20 75 73 65  INDEXED" may use
1ca0: 20 74 68 65 20 72 6f 77 69 64 20 69 6e 64 65 78   the rowid index
1cb0: 2c 20 62 75 74 20 6e 6f 74 20 6f 74 68 65 72 73  , but not others
1cc0: 2e 0a 23 20 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ..# .do_execsql_
1cd0: 74 65 73 74 20 69 6e 64 65 78 65 64 62 79 2d 36  test indexedby-6
1ce0: 2e 31 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51  .1 {.  EXPLAIN Q
1cf0: 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54  UERY PLAN SELECT
1d00: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
1d10: 20 62 20 3d 20 31 30 20 4f 52 44 45 52 20 42 59   b = 10 ORDER BY
1d20: 20 72 6f 77 69 64 20 0a 7d 20 7b 30 20 30 20 30   rowid .} {0 0 0
1d30: 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74   {SEARCH TABLE t
1d40: 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69 32  1 USING INDEX i2
1d50: 20 28 62 3d 3f 29 7d 7d 0a 64 6f 5f 65 78 65 63   (b=?)}}.do_exec
1d60: 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 64  sql_test indexed
1d70: 62 79 2d 36 2e 32 20 7b 0a 20 20 45 58 50 4c 41  by-6.2 {.  EXPLA
1d80: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45  IN QUERY PLAN SE
1d90: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4e  LECT * FROM t1 N
1da0: 4f 54 20 49 4e 44 45 58 45 44 20 57 48 45 52 45  OT INDEXED WHERE
1db0: 20 62 20 3d 20 31 30 20 4f 52 44 45 52 20 42 59   b = 10 ORDER BY
1dc0: 20 72 6f 77 69 64 20 0a 7d 20 7b 30 20 30 20 30   rowid .} {0 0 0
1dd0: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 7d   {SCAN TABLE t1}
1de0: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
1df0: 3a 20 52 2d 34 30 32 39 37 2d 31 34 34 36 34 20  : R-40297-14464 
1e00: 54 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 70  The INDEXED BY p
1e10: 68 72 61 73 65 20 66 6f 72 63 65 73 20 74 68 65  hrase forces the
1e20: 20 53 51 4c 69 74 65 0a 23 20 71 75 65 72 79 20   SQLite.# query 
1e30: 70 6c 61 6e 6e 65 72 20 74 6f 20 75 73 65 20 61  planner to use a
1e40: 20 70 61 72 74 69 63 75 6c 61 72 20 6e 61 6d 65   particular name
1e50: 64 20 69 6e 64 65 78 20 6f 6e 20 61 20 44 45 4c  d index on a DEL
1e60: 45 54 45 2c 20 53 45 4c 45 43 54 2c 20 6f 72 0a  ETE, SELECT, or.
1e70: 23 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  # UPDATE stateme
1e80: 6e 74 2e 0a 23 0a 23 20 54 65 73 74 20 74 68 61  nt..#.# Test tha
1e90: 74 20 22 49 4e 44 45 58 45 44 20 42 59 22 20 63  t "INDEXED BY" c
1ea0: 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 20  an be used in a 
1eb0: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
1ec0: 2e 0a 23 20 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ..# .do_execsql_
1ed0: 74 65 73 74 20 69 6e 64 65 78 65 64 62 79 2d 37  test indexedby-7
1ee0: 2e 31 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51  .1 {.  EXPLAIN Q
1ef0: 55 45 52 59 20 50 4c 41 4e 20 44 45 4c 45 54 45  UERY PLAN DELETE
1f00: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
1f10: 20 3d 20 35 20 0a 7d 20 7b 30 20 30 20 30 20 7b   = 5 .} {0 0 0 {
1f20: 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31 20  SEARCH TABLE t1 
1f30: 55 53 49 4e 47 20 49 4e 44 45 58 20 69 31 20 28  USING INDEX i1 (
1f40: 61 3d 3f 29 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  a=?)}}.do_execsq
1f50: 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62 79  l_test indexedby
1f60: 2d 37 2e 32 20 7b 0a 20 20 45 58 50 4c 41 49 4e  -7.2 {.  EXPLAIN
1f70: 20 51 55 45 52 59 20 50 4c 41 4e 20 44 45 4c 45   QUERY PLAN DELE
1f80: 54 45 20 46 52 4f 4d 20 74 31 20 4e 4f 54 20 49  TE FROM t1 NOT I
1f90: 4e 44 45 58 45 44 20 57 48 45 52 45 20 61 20 3d  NDEXED WHERE a =
1fa0: 20 35 20 0a 7d 20 7b 30 20 30 20 30 20 7b 53 43   5 .} {0 0 0 {SC
1fb0: 41 4e 20 54 41 42 4c 45 20 74 31 7d 7d 0a 64 6f  AN TABLE t1}}.do
1fc0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e  _execsql_test in
1fd0: 64 65 78 65 64 62 79 2d 37 2e 33 20 7b 0a 20 20  dexedby-7.3 {.  
1fe0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1ff0: 41 4e 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  AN DELETE FROM t
2000: 31 20 49 4e 44 45 58 45 44 20 42 59 20 69 31 20  1 INDEXED BY i1 
2010: 57 48 45 52 45 20 61 20 3d 20 35 20 0a 7d 20 7b  WHERE a = 5 .} {
2020: 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54 41  0 0 0 {SEARCH TA
2030: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 49 4e 44  BLE t1 USING IND
2040: 45 58 20 69 31 20 28 61 3d 3f 29 7d 7d 0a 64 6f  EX i1 (a=?)}}.do
2050: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e  _execsql_test in
2060: 64 65 78 65 64 62 79 2d 37 2e 34 20 7b 0a 20 20  dexedby-7.4 {.  
2070: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
2080: 41 4e 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  AN DELETE FROM t
2090: 31 20 49 4e 44 45 58 45 44 20 42 59 20 69 31 20  1 INDEXED BY i1 
20a0: 57 48 45 52 45 20 61 20 3d 20 35 20 41 4e 44 20  WHERE a = 5 AND 
20b0: 62 20 3d 20 31 30 0a 7d 20 7b 30 20 30 20 30 20  b = 10.} {0 0 0 
20c0: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31  {SEARCH TABLE t1
20d0: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69 31 20   USING INDEX i1 
20e0: 28 61 3d 3f 29 7d 7d 0a 64 6f 5f 65 78 65 63 73  (a=?)}}.do_execs
20f0: 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62  ql_test indexedb
2100: 79 2d 37 2e 35 20 7b 0a 20 20 45 58 50 4c 41 49  y-7.5 {.  EXPLAI
2110: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 44 45 4c  N QUERY PLAN DEL
2120: 45 54 45 20 46 52 4f 4d 20 74 31 20 49 4e 44 45  ETE FROM t1 INDE
2130: 58 45 44 20 42 59 20 69 32 20 57 48 45 52 45 20  XED BY i2 WHERE 
2140: 61 20 3d 20 35 20 41 4e 44 20 62 20 3d 20 31 30  a = 5 AND b = 10
2150: 0a 7d 20 7b 30 20 30 20 30 20 7b 53 45 41 52 43  .} {0 0 0 {SEARC
2160: 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  H TABLE t1 USING
2170: 20 49 4e 44 45 58 20 69 32 20 28 62 3d 3f 29 7d   INDEX i2 (b=?)}
2180: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65  }.do_test indexe
2190: 64 62 79 2d 37 2e 36 20 7b 0a 20 20 63 61 74 63  dby-7.6 {.  catc
21a0: 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52  hsql { DELETE FR
21b0: 4f 4d 20 74 31 20 49 4e 44 45 58 45 44 20 42 59  OM t1 INDEXED BY
21c0: 20 69 32 20 57 48 45 52 45 20 61 20 3d 20 35 7d   i2 WHERE a = 5}
21d0: 0a 7d 20 7b 31 20 7b 6e 6f 20 71 75 65 72 79 20  .} {1 {no query 
21e0: 73 6f 6c 75 74 69 6f 6e 7d 7d 0a 0a 23 20 54 65  solution}}..# Te
21f0: 73 74 20 74 68 61 74 20 22 49 4e 44 45 58 45 44  st that "INDEXED
2200: 20 42 59 22 20 63 61 6e 20 62 65 20 75 73 65 64   BY" can be used
2210: 20 69 6e 20 61 6e 20 55 50 44 41 54 45 20 73 74   in an UPDATE st
2220: 61 74 65 6d 65 6e 74 2e 0a 23 20 0a 64 6f 5f 65  atement..# .do_e
2230: 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65  xecsql_test inde
2240: 78 65 64 62 79 2d 38 2e 31 20 7b 0a 20 20 45 58  xedby-8.1 {.  EX
2250: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
2260: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 72   UPDATE t1 SET r
2270: 6f 77 69 64 3d 72 6f 77 69 64 2b 31 20 57 48 45  owid=rowid+1 WHE
2280: 52 45 20 61 20 3d 20 35 20 0a 7d 20 7b 30 20 30  RE a = 5 .} {0 0
2290: 20 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45   0 {SEARCH TABLE
22a0: 20 74 31 20 55 53 49 4e 47 20 43 4f 56 45 52 49   t1 USING COVERI
22b0: 4e 47 20 49 4e 44 45 58 20 69 31 20 28 61 3d 3f  NG INDEX i1 (a=?
22c0: 29 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  )}}.do_execsql_t
22d0: 65 73 74 20 69 6e 64 65 78 65 64 62 79 2d 38 2e  est indexedby-8.
22e0: 32 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55  2 {.  EXPLAIN QU
22f0: 45 52 59 20 50 4c 41 4e 20 55 50 44 41 54 45 20  ERY PLAN UPDATE 
2300: 74 31 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 53  t1 NOT INDEXED S
2310: 45 54 20 72 6f 77 69 64 3d 72 6f 77 69 64 2b 31  ET rowid=rowid+1
2320: 20 57 48 45 52 45 20 61 20 3d 20 35 20 0a 7d 20   WHERE a = 5 .} 
2330: 7b 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42  {0 0 0 {SCAN TAB
2340: 4c 45 20 74 31 7d 7d 0a 64 6f 5f 65 78 65 63 73  LE t1}}.do_execs
2350: 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62  ql_test indexedb
2360: 79 2d 38 2e 33 20 7b 0a 20 20 45 58 50 4c 41 49  y-8.3 {.  EXPLAI
2370: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 55 50 44  N QUERY PLAN UPD
2380: 41 54 45 20 74 31 20 49 4e 44 45 58 45 44 20 42  ATE t1 INDEXED B
2390: 59 20 69 31 20 53 45 54 20 72 6f 77 69 64 3d 72  Y i1 SET rowid=r
23a0: 6f 77 69 64 2b 31 20 57 48 45 52 45 20 61 20 3d  owid+1 WHERE a =
23b0: 20 35 20 0a 7d 20 7b 30 20 30 20 30 20 7b 53 45   5 .} {0 0 0 {SE
23c0: 41 52 43 48 20 54 41 42 4c 45 20 74 31 20 55 53  ARCH TABLE t1 US
23d0: 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
23e0: 45 58 20 69 31 20 28 61 3d 3f 29 7d 7d 0a 64 6f  EX i1 (a=?)}}.do
23f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e  _execsql_test in
2400: 64 65 78 65 64 62 79 2d 38 2e 34 20 7b 0a 20 20  dexedby-8.4 {.  
2410: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
2420: 41 4e 20 0a 20 20 55 50 44 41 54 45 20 74 31 20  AN .  UPDATE t1 
2430: 49 4e 44 45 58 45 44 20 42 59 20 69 31 20 53 45  INDEXED BY i1 SE
2440: 54 20 72 6f 77 69 64 3d 72 6f 77 69 64 2b 31 20  T rowid=rowid+1 
2450: 57 48 45 52 45 20 61 20 3d 20 35 20 41 4e 44 20  WHERE a = 5 AND 
2460: 62 20 3d 20 31 30 0a 7d 20 7b 30 20 30 20 30 20  b = 10.} {0 0 0 
2470: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31  {SEARCH TABLE t1
2480: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 69 31 20   USING INDEX i1 
2490: 28 61 3d 3f 29 7d 7d 0a 64 6f 5f 65 78 65 63 73  (a=?)}}.do_execs
24a0: 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62  ql_test indexedb
24b0: 79 2d 38 2e 35 20 7b 0a 20 20 45 58 50 4c 41 49  y-8.5 {.  EXPLAI
24c0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 0a 20 20  N QUERY PLAN .  
24d0: 55 50 44 41 54 45 20 74 31 20 49 4e 44 45 58 45  UPDATE t1 INDEXE
24e0: 44 20 42 59 20 69 32 20 53 45 54 20 72 6f 77 69  D BY i2 SET rowi
24f0: 64 3d 72 6f 77 69 64 2b 31 20 57 48 45 52 45 20  d=rowid+1 WHERE 
2500: 61 20 3d 20 35 20 41 4e 44 20 62 20 3d 20 31 30  a = 5 AND b = 10
2510: 0a 7d 20 7b 30 20 30 20 30 20 7b 53 45 41 52 43  .} {0 0 0 {SEARC
2520: 48 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  H TABLE t1 USING
2530: 20 49 4e 44 45 58 20 69 32 20 28 62 3d 3f 29 7d   INDEX i2 (b=?)}
2540: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65  }.do_test indexe
2550: 64 62 79 2d 38 2e 36 20 7b 0a 20 20 63 61 74 63  dby-8.6 {.  catc
2560: 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 31  hsql { UPDATE t1
2570: 20 49 4e 44 45 58 45 44 20 42 59 20 69 32 20 53   INDEXED BY i2 S
2580: 45 54 20 72 6f 77 69 64 3d 72 6f 77 69 64 2b 31  ET rowid=rowid+1
2590: 20 57 48 45 52 45 20 61 20 3d 20 35 7d 0a 7d 20   WHERE a = 5}.} 
25a0: 7b 31 20 7b 6e 6f 20 71 75 65 72 79 20 73 6f 6c  {1 {no query sol
25b0: 75 74 69 6f 6e 7d 7d 0a 0a 23 20 54 65 73 74 20  ution}}..# Test 
25c0: 74 68 61 74 20 62 75 67 20 23 33 35 36 30 20 69  that bug #3560 i
25d0: 73 20 66 69 78 65 64 2e 0a 23 0a 64 6f 5f 74 65  s fixed..#.do_te
25e0: 73 74 20 69 6e 64 65 78 65 64 62 79 2d 39 2e 31  st indexedby-9.1
25f0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2600: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2610: 6d 61 69 6e 74 61 62 6c 65 28 20 69 64 20 69 6e  maintable( id in
2620: 74 65 67 65 72 29 3b 0a 20 20 20 20 43 52 45 41  teger);.    CREA
2630: 54 45 20 54 41 42 4c 45 20 6a 6f 69 6e 6d 65 28  TE TABLE joinme(
2640: 69 64 5f 69 6e 74 20 69 6e 74 65 67 65 72 2c 20  id_int integer, 
2650: 69 64 5f 74 65 78 74 20 74 65 78 74 29 3b 0a 20  id_text text);. 
2660: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
2670: 6a 6f 69 6e 6d 65 5f 69 64 5f 74 65 78 74 5f 69  joinme_id_text_i
2680: 64 78 20 6f 6e 20 6a 6f 69 6e 6d 65 28 69 64 5f  dx on joinme(id_
2690: 74 65 78 74 29 3b 0a 20 20 20 20 43 52 45 41 54  text);.    CREAT
26a0: 45 20 49 4e 44 45 58 20 6a 6f 69 6e 6d 65 5f 69  E INDEX joinme_i
26b0: 64 5f 69 6e 74 5f 69 64 78 20 6f 6e 20 6a 6f 69  d_int_idx on joi
26c0: 6e 6d 65 28 69 64 5f 69 6e 74 29 3b 0a 20 20 7d  nme(id_int);.  }
26d0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  .} {}.do_test in
26e0: 64 65 78 65 64 62 79 2d 39 2e 32 20 7b 0a 20 20  dexedby-9.2 {.  
26f0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 73  catchsql {.    s
2700: 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20 6d 61 69  elect * from mai
2710: 6e 74 61 62 6c 65 20 61 73 20 6d 20 69 6e 6e 65  ntable as m inne
2720: 72 20 6a 6f 69 6e 0a 20 20 20 20 6a 6f 69 6e 6d  r join.    joinm
2730: 65 20 61 73 20 6a 20 69 6e 64 65 78 65 64 20 62  e as j indexed b
2740: 79 20 6a 6f 69 6e 6d 65 5f 69 64 5f 74 65 78 74  y joinme_id_text
2750: 5f 69 64 78 0a 20 20 20 20 6f 6e 20 28 20 6d 2e  _idx.    on ( m.
2760: 69 64 20 20 3d 20 6a 2e 69 64 5f 69 6e 74 29 0a  id  = j.id_int).
2770: 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 71 75 65    }.} {1 {no que
2780: 72 79 20 73 6f 6c 75 74 69 6f 6e 7d 7d 0a 64 6f  ry solution}}.do
2790: 5f 74 65 73 74 20 69 6e 64 65 78 65 64 62 79 2d  _test indexedby-
27a0: 39 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  9.3 {.  catchsql
27b0: 20 7b 20 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d   { select * from
27c0: 20 6d 61 69 6e 74 61 62 6c 65 2c 20 6a 6f 69 6e   maintable, join
27d0: 6d 65 20 49 4e 44 45 58 45 44 20 62 79 20 6a 6f  me INDEXED by jo
27e0: 69 6e 6d 65 5f 69 64 5f 74 65 78 74 5f 69 64 78  inme_id_text_idx
27f0: 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 71 75 65 72   }.} {1 {no quer
2800: 79 20 73 6f 6c 75 74 69 6f 6e 7d 7d 0a 0a 23 20  y solution}}..# 
2810: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 63 61 6e  Make sure we can
2820: 20 73 74 69 6c 6c 20 63 72 65 61 74 65 20 74 61   still create ta
2830: 62 6c 65 73 2c 20 69 6e 64 69 63 65 73 2c 20 61  bles, indices, a
2840: 6e 64 20 63 6f 6c 75 6d 6e 73 20 77 68 6f 73 65  nd columns whose
2850: 20 6e 61 6d 65 0a 23 20 69 73 20 22 69 6e 64 65   name.# is "inde
2860: 78 65 64 22 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  xed"..#.do_test 
2870: 69 6e 64 65 78 65 64 62 79 2d 31 30 2e 31 20 7b  indexedby-10.1 {
2880: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2890: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 69 6e   CREATE TABLE in
28a0: 64 65 78 65 64 28 78 2c 79 29 3b 0a 20 20 20 20  dexed(x,y);.    
28b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 69 6e 64 65  INSERT INTO inde
28c0: 78 65 64 20 56 41 4c 55 45 53 28 31 2c 32 29 3b  xed VALUES(1,2);
28d0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
28e0: 4f 4d 20 69 6e 64 65 78 65 64 3b 0a 20 20 7d 0a  OM indexed;.  }.
28f0: 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {1 2}.do_test 
2900: 69 6e 64 65 78 65 64 62 79 2d 31 30 2e 32 20 7b  indexedby-10.2 {
2910: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2920: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
2930: 30 20 4f 4e 20 69 6e 64 65 78 65 64 28 78 29 3b  0 ON indexed(x);
2940: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
2950: 4f 4d 20 69 6e 64 65 78 65 64 20 69 6e 64 65 78  OM indexed index
2960: 65 64 20 62 79 20 69 31 30 20 77 68 65 72 65 20  ed by i10 where 
2970: 78 3e 30 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d  x>0;.  }.} {1 2}
2980: 0a 64 6f 5f 74 65 73 74 20 69 6e 64 65 78 65 64  .do_test indexed
2990: 62 79 2d 31 30 2e 33 20 7b 0a 20 20 65 78 65 63  by-10.3 {.  exec
29a0: 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54  sql {.    DROP T
29b0: 41 42 4c 45 20 69 6e 64 65 78 65 64 3b 0a 20 20  ABLE indexed;.  
29c0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
29d0: 31 30 28 69 6e 64 65 78 65 64 20 49 4e 54 45 47  10(indexed INTEG
29e0: 45 52 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ER);.    INSERT 
29f0: 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53 28  INTO t10 VALUES(
2a00: 31 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  1);.    CREATE I
2a10: 4e 44 45 58 20 69 6e 64 65 78 65 64 20 4f 4e 20  NDEX indexed ON 
2a20: 74 31 30 28 69 6e 64 65 78 65 64 29 3b 0a 20 20  t10(indexed);.  
2a30: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2a40: 74 31 30 20 69 6e 64 65 78 65 64 20 62 79 20 69  t10 indexed by i
2a50: 6e 64 65 78 65 64 20 57 48 45 52 45 20 69 6e 64  ndexed WHERE ind
2a60: 65 78 65 64 3e 30 0a 20 20 7d 0a 7d 20 7b 31 7d  exed>0.  }.} {1}
2a70: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
2a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45  ------------.# E
2ac0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72  nsure that the r
2ad0: 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
2ae0: 6f 66 20 65 61 63 68 20 69 6e 64 65 78 20 65 6e  of each index en
2af0: 74 72 79 20 6d 61 79 20 62 65 20 75 73 65 64 0a  try may be used.
2b00: 23 20 66 6f 72 20 65 71 75 61 6c 69 74 79 20 63  # for equality c
2b10: 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
2b20: 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 6f 74  e same way as ot
2b30: 68 65 72 20 69 6e 64 65 78 65 64 20 66 69 65 6c  her indexed fiel
2b40: 64 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ds..#.do_execsql
2b50: 5f 74 65 73 74 20 31 31 2e 31 20 7b 0a 20 20 43  _test 11.1 {.  C
2b60: 52 45 41 54 45 20 54 41 42 4c 45 20 78 31 28 61  REATE TABLE x1(a
2b70: 2c 20 62 20 54 45 58 54 29 3b 0a 20 20 43 52 45  , b TEXT);.  CRE
2b80: 41 54 45 20 49 4e 44 45 58 20 78 31 69 20 4f 4e  ATE INDEX x1i ON
2b90: 20 78 31 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53   x1(a, b);.  INS
2ba0: 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55  ERT INTO x1 VALU
2bb0: 45 53 28 31 2c 20 31 29 3b 0a 20 20 49 4e 53 45  ES(1, 1);.  INSE
2bc0: 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45  RT INTO x1 VALUE
2bd0: 53 28 31 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52  S(1, 1);.  INSER
2be0: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
2bf0: 28 31 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52 54  (1, 1);.  INSERT
2c00: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
2c10: 31 2c 20 31 29 3b 0a 7d 0a 64 6f 5f 65 78 65 63  1, 1);.}.do_exec
2c20: 73 71 6c 5f 74 65 73 74 20 31 31 2e 32 20 7b 0a  sql_test 11.2 {.
2c30: 20 20 53 45 4c 45 43 54 20 61 2c 62 2c 72 6f 77    SELECT a,b,row
2c40: 69 64 20 46 52 4f 4d 20 78 31 20 49 4e 44 45 58  id FROM x1 INDEX
2c50: 45 44 20 42 59 20 78 31 69 20 57 48 45 52 45 20  ED BY x1i WHERE 
2c60: 61 3d 31 20 41 4e 44 20 62 3d 31 20 41 4e 44 20  a=1 AND b=1 AND 
2c70: 72 6f 77 69 64 3d 33 3b 0a 7d 20 7b 31 20 31 20  rowid=3;.} {1 1 
2c80: 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  3}.do_execsql_te
2c90: 73 74 20 31 31 2e 33 20 7b 0a 20 20 53 45 4c 45  st 11.3 {.  SELE
2ca0: 43 54 20 61 2c 62 2c 72 6f 77 69 64 20 46 52 4f  CT a,b,rowid FRO
2cb0: 4d 20 78 31 20 49 4e 44 45 58 45 44 20 42 59 20  M x1 INDEXED BY 
2cc0: 78 31 69 20 57 48 45 52 45 20 61 3d 31 20 41 4e  x1i WHERE a=1 AN
2cd0: 44 20 62 3d 31 20 41 4e 44 20 72 6f 77 69 64 3d  D b=1 AND rowid=
2ce0: 27 33 27 3b 0a 7d 20 7b 31 20 31 20 33 7d 0a 64  '3';.} {1 1 3}.d
2cf0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
2d00: 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 61  1.4 {.  SELECT a
2d10: 2c 62 2c 72 6f 77 69 64 20 46 52 4f 4d 20 78 31  ,b,rowid FROM x1
2d20: 20 49 4e 44 45 58 45 44 20 42 59 20 78 31 69 20   INDEXED BY x1i 
2d30: 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3d  WHERE a=1 AND b=
2d40: 31 20 41 4e 44 20 72 6f 77 69 64 3d 27 33 2e 30  1 AND rowid='3.0
2d50: 27 3b 0a 7d 20 7b 31 20 31 20 33 7d 0a 64 6f 5f  ';.} {1 1 3}.do_
2d60: 65 71 70 5f 74 65 73 74 20 31 31 2e 35 20 7b 0a  eqp_test 11.5 {.
2d70: 20 20 53 45 4c 45 43 54 20 61 2c 62 2c 72 6f 77    SELECT a,b,row
2d80: 69 64 20 46 52 4f 4d 20 78 31 20 49 4e 44 45 58  id FROM x1 INDEX
2d90: 45 44 20 42 59 20 78 31 69 20 57 48 45 52 45 20  ED BY x1i WHERE 
2da0: 61 3d 31 20 41 4e 44 20 62 3d 31 20 41 4e 44 20  a=1 AND b=1 AND 
2db0: 72 6f 77 69 64 3d 27 33 2e 30 27 3b 0a 7d 20 7b  rowid='3.0';.} {
2dc0: 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54 41  0 0 0 {SEARCH TA
2dd0: 42 4c 45 20 78 31 20 55 53 49 4e 47 20 43 4f 56  BLE x1 USING COV
2de0: 45 52 49 4e 47 20 49 4e 44 45 58 20 78 31 69 20  ERING INDEX x1i 
2df0: 28 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 41 4e 44  (a=? AND b=? AND
2e00: 20 72 6f 77 69 64 3d 3f 29 7d 7d 0a 0a 64 6f 5f   rowid=?)}}..do_
2e10: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 31 2e  execsql_test 11.
2e20: 36 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  6 {.  CREATE TAB
2e30: 4c 45 20 78 32 28 63 20 49 4e 54 45 47 45 52 20  LE x2(c INTEGER 
2e40: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 61 2c 20  PRIMARY KEY, a, 
2e50: 62 20 54 45 58 54 29 3b 0a 20 20 43 52 45 41 54  b TEXT);.  CREAT
2e60: 45 20 49 4e 44 45 58 20 78 32 69 20 4f 4e 20 78  E INDEX x2i ON x
2e70: 32 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52  2(a, b);.  INSER
2e80: 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55 45 53  T INTO x2 VALUES
2e90: 28 31 2c 20 31 2c 20 31 29 3b 0a 20 20 49 4e 53  (1, 1, 1);.  INS
2ea0: 45 52 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55  ERT INTO x2 VALU
2eb0: 45 53 28 32 2c 20 31 2c 20 31 29 3b 0a 20 20 49  ES(2, 1, 1);.  I
2ec0: 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 56 41  NSERT INTO x2 VA
2ed0: 4c 55 45 53 28 33 2c 20 31 2c 20 31 29 3b 0a 20  LUES(3, 1, 1);. 
2ee0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20   INSERT INTO x2 
2ef0: 56 41 4c 55 45 53 28 34 2c 20 31 2c 20 31 29 3b  VALUES(4, 1, 1);
2f00: 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .}.do_execsql_te
2f10: 73 74 20 31 31 2e 37 20 7b 0a 20 20 53 45 4c 45  st 11.7 {.  SELE
2f20: 43 54 20 61 2c 62 2c 63 20 46 52 4f 4d 20 78 32  CT a,b,c FROM x2
2f30: 20 49 4e 44 45 58 45 44 20 42 59 20 78 32 69 20   INDEXED BY x2i 
2f40: 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3d  WHERE a=1 AND b=
2f50: 31 20 41 4e 44 20 63 3d 33 3b 0a 7d 20 7b 31 20  1 AND c=3;.} {1 
2f60: 31 20 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  1 3}.do_execsql_
2f70: 74 65 73 74 20 31 31 2e 38 20 7b 0a 20 20 53 45  test 11.8 {.  SE
2f80: 4c 45 43 54 20 61 2c 62 2c 63 20 46 52 4f 4d 20  LECT a,b,c FROM 
2f90: 78 32 20 49 4e 44 45 58 45 44 20 42 59 20 78 32  x2 INDEXED BY x2
2fa0: 69 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20  i WHERE a=1 AND 
2fb0: 62 3d 31 20 41 4e 44 20 63 3d 27 33 27 3b 0a 7d  b=1 AND c='3';.}
2fc0: 20 7b 31 20 31 20 33 7d 0a 64 6f 5f 65 78 65 63   {1 1 3}.do_exec
2fd0: 73 71 6c 5f 74 65 73 74 20 31 31 2e 39 20 7b 0a  sql_test 11.9 {.
2fe0: 20 20 53 45 4c 45 43 54 20 61 2c 62 2c 63 20 46    SELECT a,b,c F
2ff0: 52 4f 4d 20 78 32 20 49 4e 44 45 58 45 44 20 42  ROM x2 INDEXED B
3000: 59 20 78 32 69 20 57 48 45 52 45 20 61 3d 31 20  Y x2i WHERE a=1 
3010: 41 4e 44 20 62 3d 31 20 41 4e 44 20 63 3d 27 33  AND b=1 AND c='3
3020: 2e 30 27 3b 0a 7d 20 7b 31 20 31 20 33 7d 0a 64  .0';.} {1 1 3}.d
3030: 6f 5f 65 71 70 5f 74 65 73 74 20 31 31 2e 31 30  o_eqp_test 11.10
3040: 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c 62 2c   {.  SELECT a,b,
3050: 63 20 46 52 4f 4d 20 78 32 20 49 4e 44 45 58 45  c FROM x2 INDEXE
3060: 44 20 42 59 20 78 32 69 20 57 48 45 52 45 20 61  D BY x2i WHERE a
3070: 3d 31 20 41 4e 44 20 62 3d 31 20 41 4e 44 20 63  =1 AND b=1 AND c
3080: 3d 27 33 2e 30 27 3b 0a 7d 20 7b 30 20 30 20 30  ='3.0';.} {0 0 0
3090: 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 78   {SEARCH TABLE x
30a0: 32 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47  2 USING COVERING
30b0: 20 49 4e 44 45 58 20 78 32 69 20 28 61 3d 3f 20   INDEX x2i (a=? 
30c0: 41 4e 44 20 62 3d 3f 20 41 4e 44 20 72 6f 77 69  AND b=? AND rowi
30d0: 64 3d 3f 29 7d 7d 0a 0a 66 69 6e 69 73 68 5f 74  d=?)}}..finish_t
30e0: 65 73 74 0a                                      est.