/ Hex Artifact Content
Login

Artifact 1e57b4bb93b65a451803e7547a51f685af1c35db:


0000: 23 20 32 30 31 35 2d 30 38 2d 33 31 0a 23 0a 23  # 2015-08-31.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u give..#.#*****
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c 65 20 69  **.# This file i
0170: 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65 73  mplements regres
0180: 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20 53  sion tests for S
0190: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20 20  QLite library.  
01a0: 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66 20 74  The.# focus of t
01b0: 68 69 73 20 66 69 6c 65 20 69 73 20 74 65 73 74  his file is test
01c0: 69 6e 67 20 69 6e 64 65 78 65 73 20 6f 6e 20 65  ing indexes on e
01d0: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 23 0a 0a 73  xpressions..#..s
01e0: 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65  et testdir [file
01f0: 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d   dirname $argv0]
0200: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
0210: 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 64 6f 5f  /tester.tcl..do_
0220: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64  execsql_test ind
0230: 65 78 65 78 70 72 31 2d 31 30 30 20 7b 0a 20 20  exexpr1-100 {.  
0240: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0250: 61 2c 62 2c 63 29 3b 0a 20 20 49 4e 53 45 52 54  a,b,c);.  INSERT
0260: 20 49 4e 54 4f 20 74 31 28 61 2c 62 2c 63 29 0a   INTO t1(a,b,c).
0270: 20 20 56 41 4c 55 45 53 28 27 49 6e 5f 74 68 65    VALUES('In_the
0280: 5f 62 65 67 69 6e 6e 69 6e 67 5f 77 61 73 5f 74  _beginning_was_t
0290: 68 65 5f 57 6f 72 64 27 2c 31 2c 31 29 2c 0a 20  he_Word',1,1),. 
02a0: 20 20 20 20 20 20 20 28 27 61 6e 64 5f 74 68 65         ('and_the
02b0: 5f 57 6f 72 64 5f 77 61 73 5f 77 69 74 68 5f 47  _Word_was_with_G
02c0: 6f 64 27 2c 31 2c 32 29 2c 0a 20 20 20 20 20 20  od',1,2),.      
02d0: 20 20 28 27 61 6e 64 5f 74 68 65 5f 57 6f 72 64    ('and_the_Word
02e0: 5f 77 61 73 5f 47 6f 64 27 2c 31 2c 33 29 2c 0a  _was_God',1,3),.
02f0: 20 20 20 20 20 20 20 20 28 27 54 68 65 5f 73 61          ('The_sa
0300: 6d 65 5f 77 61 73 5f 69 6e 5f 74 68 65 5f 62 65  me_was_in_the_be
0310: 67 69 6e 6e 69 6e 67 5f 77 69 74 68 5f 47 6f 64  ginning_with_God
0320: 27 2c 32 2c 31 29 2c 0a 20 20 20 20 20 20 20 20  ',2,1),.        
0330: 28 27 41 6c 6c 5f 74 68 69 6e 67 73 5f 77 65 72  ('All_things_wer
0340: 65 5f 6d 61 64 65 5f 62 79 5f 68 69 6d 27 2c 33  e_made_by_him',3
0350: 2c 31 29 2c 0a 20 20 20 20 20 20 20 20 28 27 61  ,1),.        ('a
0360: 6e 64 5f 77 69 74 68 6f 75 74 5f 68 69 6d 5f 77  nd_without_him_w
0370: 61 73 5f 6e 6f 74 5f 61 6e 79 5f 74 68 69 6e 67  as_not_any_thing
0380: 5f 6d 61 64 65 5f 74 68 61 74 5f 77 61 73 5f 6d  _made_that_was_m
0390: 61 64 65 27 2c 33 2c 32 29 3b 0a 20 20 43 52 45  ade',3,2);.  CRE
03a0: 41 54 45 20 49 4e 44 45 58 20 74 31 61 31 20 4f  ATE INDEX t1a1 O
03b0: 4e 20 74 31 28 73 75 62 73 74 72 28 61 2c 31 2c  N t1(substr(a,1,
03c0: 31 32 29 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 78  12));.} {}.do_ex
03d0: 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78  ecsql_test index
03e0: 65 78 70 72 31 2d 31 31 30 20 7b 0a 20 20 53 45  expr1-110 {.  SE
03f0: 4c 45 43 54 20 62 2c 20 63 2c 20 27 7c 27 20 46  LECT b, c, '|' F
0400: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 73 75 62  ROM t1 WHERE sub
0410: 73 74 72 28 61 2c 31 2c 31 32 29 3d 3d 27 61 6e  str(a,1,12)=='an
0420: 64 5f 74 68 65 5f 57 6f 72 64 27 20 4f 52 44 45  d_the_Word' ORDE
0430: 52 20 42 59 20 62 2c 20 63 3b 0a 7d 20 7b 31 20  R BY b, c;.} {1 
0440: 32 20 7c 20 31 20 33 20 7c 7d 0a 64 6f 5f 65 78  2 | 1 3 |}.do_ex
0450: 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78  ecsql_test index
0460: 65 78 70 72 31 2d 31 31 30 65 71 70 20 7b 0a 20  expr1-110eqp {. 
0470: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
0480: 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20 62 2c 20  LAN.  SELECT b, 
0490: 63 2c 20 27 7c 27 20 46 52 4f 4d 20 74 31 20 57  c, '|' FROM t1 W
04a0: 48 45 52 45 20 73 75 62 73 74 72 28 61 2c 31 2c  HERE substr(a,1,
04b0: 31 32 29 3d 3d 27 61 6e 64 5f 74 68 65 5f 57 6f  12)=='and_the_Wo
04c0: 72 64 27 20 4f 52 44 45 52 20 42 59 20 62 2c 20  rd' ORDER BY b, 
04d0: 63 3b 0a 7d 20 7b 2f 55 53 49 4e 47 20 49 4e 44  c;.} {/USING IND
04e0: 45 58 20 74 31 61 31 2f 7d 0a 64 6f 5f 65 78 65  EX t1a1/}.do_exe
04f0: 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65  csql_test indexe
0500: 78 70 72 31 2d 31 32 30 20 7b 0a 20 20 53 45 4c  xpr1-120 {.  SEL
0510: 45 43 54 20 62 2c 20 63 2c 20 27 7c 27 20 46 52  ECT b, c, '|' FR
0520: 4f 4d 20 74 31 20 57 48 45 52 45 20 27 61 6e 64  OM t1 WHERE 'and
0530: 5f 74 68 65 5f 57 6f 72 64 27 3d 3d 73 75 62 73  _the_Word'==subs
0540: 74 72 28 61 2c 31 2c 31 32 29 20 4f 52 44 45 52  tr(a,1,12) ORDER
0550: 20 42 59 20 62 2c 20 63 3b 0a 7d 20 7b 31 20 32   BY b, c;.} {1 2
0560: 20 7c 20 31 20 33 20 7c 7d 0a 64 6f 5f 65 78 65   | 1 3 |}.do_exe
0570: 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65  csql_test indexe
0580: 78 70 72 31 2d 31 32 30 65 71 70 20 7b 0a 20 20  xpr1-120eqp {.  
0590: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
05a0: 41 4e 0a 20 20 53 45 4c 45 43 54 20 62 2c 20 63  AN.  SELECT b, c
05b0: 2c 20 27 7c 27 20 46 52 4f 4d 20 74 31 20 57 48  , '|' FROM t1 WH
05c0: 45 52 45 20 27 61 6e 64 5f 74 68 65 5f 57 6f 72  ERE 'and_the_Wor
05d0: 64 27 3d 3d 73 75 62 73 74 72 28 61 2c 31 2c 31  d'==substr(a,1,1
05e0: 32 29 20 4f 52 44 45 52 20 42 59 20 62 2c 20 63  2) ORDER BY b, c
05f0: 3b 0a 7d 20 7b 2f 55 53 49 4e 47 20 49 4e 44 45  ;.} {/USING INDE
0600: 58 20 74 31 61 31 2f 7d 0a 0a 64 6f 5f 65 78 65  X t1a1/}..do_exe
0610: 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65  csql_test indexe
0620: 78 70 72 31 2d 31 33 30 20 7b 0a 20 20 43 52 45  xpr1-130 {.  CRE
0630: 41 54 45 20 49 4e 44 45 58 20 74 31 62 61 20 4f  ATE INDEX t1ba O
0640: 4e 20 74 31 28 62 2c 73 75 62 73 74 72 28 61 2c  N t1(b,substr(a,
0650: 32 2c 33 29 2c 63 29 3b 0a 20 20 53 45 4c 45 43  2,3),c);.  SELEC
0660: 54 20 63 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T c FROM t1 WHER
0670: 45 20 62 3d 31 20 41 4e 44 20 73 75 62 73 74 72  E b=1 AND substr
0680: 28 61 2c 32 2c 33 29 3d 27 6e 64 5f 27 20 4f 52  (a,2,3)='nd_' OR
0690: 44 45 52 20 42 59 20 63 3b 0a 7d 20 7b 32 20 33  DER BY c;.} {2 3
06a0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
06b0: 74 20 69 6e 64 65 78 65 78 70 72 31 2d 31 33 30  t indexexpr1-130
06c0: 65 71 70 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20  eqp {.  EXPLAIN 
06d0: 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 53 45 4c  QUERY PLAN.  SEL
06e0: 45 43 54 20 63 20 46 52 4f 4d 20 74 31 20 57 48  ECT c FROM t1 WH
06f0: 45 52 45 20 62 3d 31 20 41 4e 44 20 73 75 62 73  ERE b=1 AND subs
0700: 74 72 28 61 2c 32 2c 33 29 3d 27 6e 64 5f 27 20  tr(a,2,3)='nd_' 
0710: 4f 52 44 45 52 20 42 59 20 63 3b 0a 7d 20 7b 2f  ORDER BY c;.} {/
0720: 55 53 49 4e 47 20 49 4e 44 45 58 20 74 31 62 61  USING INDEX t1ba
0730: 2f 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  /}..do_execsql_t
0740: 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 31  est indexexpr1-1
0750: 34 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 72 6f  40 {.  SELECT ro
0760: 77 69 64 2c 20 73 75 62 73 74 72 28 61 2c 62 2c  wid, substr(a,b,
0770: 33 29 2c 20 27 7c 27 20 46 52 4f 4d 20 74 31 20  3), '|' FROM t1 
0780: 4f 52 44 45 52 20 42 59 20 32 3b 0a 7d 20 7b 31  ORDER BY 2;.} {1
0790: 20 49 6e 5f 20 7c 20 32 20 61 6e 64 20 7c 20 33   In_ | 2 and | 3
07a0: 20 61 6e 64 20 7c 20 36 20 64 5f 77 20 7c 20 34   and | 6 d_w | 4
07b0: 20 68 65 5f 20 7c 20 35 20 6c 5f 74 20 7c 7d 0a   he_ | 5 l_t |}.
07c0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
07d0: 69 6e 64 65 78 65 78 70 72 31 2d 31 34 31 20 7b  indexexpr1-141 {
07e0: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
07f0: 74 31 61 62 78 20 4f 4e 20 74 31 28 73 75 62 73  t1abx ON t1(subs
0800: 74 72 28 61 2c 62 2c 33 29 29 3b 0a 20 20 53 45  tr(a,b,3));.  SE
0810: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
0820: 74 31 20 57 48 45 52 45 20 73 75 62 73 74 72 28  t1 WHERE substr(
0830: 61 2c 62 2c 33 29 3c 3d 27 61 6e 64 27 20 4f 52  a,b,3)<='and' OR
0840: 44 45 52 20 42 59 20 2b 72 6f 77 69 64 3b 0a 7d  DER BY +rowid;.}
0850: 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 65 78 65 63   {1 2 3}.do_exec
0860: 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78  sql_test indexex
0870: 70 72 31 2d 31 34 31 65 71 70 20 7b 0a 20 20 45  pr1-141eqp {.  E
0880: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
0890: 4e 0a 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64  N.  SELECT rowid
08a0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 73   FROM t1 WHERE s
08b0: 75 62 73 74 72 28 61 2c 62 2c 33 29 3c 3d 27 61  ubstr(a,b,3)<='a
08c0: 6e 64 27 20 4f 52 44 45 52 20 42 59 20 2b 72 6f  nd' ORDER BY +ro
08d0: 77 69 64 3b 0a 7d 20 7b 2f 55 53 49 4e 47 20 49  wid;.} {/USING I
08e0: 4e 44 45 58 20 74 31 61 62 78 2f 7d 0a 64 6f 5f  NDEX t1abx/}.do_
08f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64  execsql_test ind
0900: 65 78 65 78 70 72 31 2d 31 34 32 20 7b 0a 20 20  exexpr1-142 {.  
0910: 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
0920: 4d 20 74 31 20 57 48 45 52 45 20 2b 73 75 62 73  M t1 WHERE +subs
0930: 74 72 28 61 2c 62 2c 33 29 3c 3d 27 61 6e 64 27  tr(a,b,3)<='and'
0940: 20 4f 52 44 45 52 20 42 59 20 2b 72 6f 77 69 64   ORDER BY +rowid
0950: 3b 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 65  ;.} {1 2 3}.do_e
0960: 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65  xecsql_test inde
0970: 78 65 78 70 72 31 2d 31 35 30 20 7b 0a 20 20 53  xexpr1-150 {.  S
0980: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
0990: 20 74 31 20 57 48 45 52 45 20 73 75 62 73 74 72   t1 WHERE substr
09a0: 28 61 2c 62 2c 33 29 20 49 4e 20 28 27 61 6e 64  (a,b,3) IN ('and
09b0: 27 2c 27 6c 5f 74 27 2c 27 78 79 7a 27 29 0a 20  ','l_t','xyz'). 
09c0: 20 20 4f 52 44 45 52 20 42 59 20 2b 72 6f 77 69    ORDER BY +rowi
09d0: 64 3b 0a 7d 20 7b 32 20 33 20 35 7d 0a 64 6f 5f  d;.} {2 3 5}.do_
09e0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64  execsql_test ind
09f0: 65 78 65 78 70 72 31 2d 31 35 30 65 71 70 20 7b  exexpr1-150eqp {
0a00: 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  .  EXPLAIN QUERY
0a10: 20 50 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20 72   PLAN.  SELECT r
0a20: 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45  owid FROM t1 WHE
0a30: 52 45 20 73 75 62 73 74 72 28 61 2c 62 2c 33 29  RE substr(a,b,3)
0a40: 20 49 4e 20 28 27 61 6e 64 27 2c 27 6c 5f 74 27   IN ('and','l_t'
0a50: 2c 27 78 79 7a 27 29 0a 20 20 20 4f 52 44 45 52  ,'xyz').   ORDER
0a60: 20 42 59 20 2b 72 6f 77 69 64 3b 0a 7d 20 7b 2f   BY +rowid;.} {/
0a70: 55 53 49 4e 47 20 49 4e 44 45 58 20 74 31 61 62  USING INDEX t1ab
0a80: 78 2f 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  x/}..do_execsql_
0a90: 74 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d  test indexexpr1-
0aa0: 32 30 30 20 7b 0a 20 20 44 52 4f 50 20 54 41 42  200 {.  DROP TAB
0ab0: 4c 45 20 74 31 3b 0a 20 20 43 52 45 41 54 45 20  LE t1;.  CREATE 
0ac0: 54 41 42 4c 45 20 74 31 28 69 64 20 41 4e 59 20  TABLE t1(id ANY 
0ad0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 61 2c 62  PRIMARY KEY, a,b
0ae0: 2c 63 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49  ,c) WITHOUT ROWI
0af0: 44 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  D;.  INSERT INTO
0b00: 20 74 31 28 69 64 2c 61 2c 62 2c 63 29 0a 20 20   t1(id,a,b,c).  
0b10: 56 41 4c 55 45 53 28 31 2c 27 49 6e 5f 74 68 65  VALUES(1,'In_the
0b20: 5f 62 65 67 69 6e 6e 69 6e 67 5f 77 61 73 5f 74  _beginning_was_t
0b30: 68 65 5f 57 6f 72 64 27 2c 31 2c 31 29 2c 0a 20  he_Word',1,1),. 
0b40: 20 20 20 20 20 20 20 28 32 2c 27 61 6e 64 5f 74         (2,'and_t
0b50: 68 65 5f 57 6f 72 64 5f 77 61 73 5f 77 69 74 68  he_Word_was_with
0b60: 5f 47 6f 64 27 2c 31 2c 32 29 2c 0a 20 20 20 20  _God',1,2),.    
0b70: 20 20 20 20 28 33 2c 27 61 6e 64 5f 74 68 65 5f      (3,'and_the_
0b80: 57 6f 72 64 5f 77 61 73 5f 47 6f 64 27 2c 31 2c  Word_was_God',1,
0b90: 33 29 2c 0a 20 20 20 20 20 20 20 20 28 34 2c 27  3),.        (4,'
0ba0: 54 68 65 5f 73 61 6d 65 5f 77 61 73 5f 69 6e 5f  The_same_was_in_
0bb0: 74 68 65 5f 62 65 67 69 6e 6e 69 6e 67 5f 77 69  the_beginning_wi
0bc0: 74 68 5f 47 6f 64 27 2c 32 2c 31 29 2c 0a 20 20  th_God',2,1),.  
0bd0: 20 20 20 20 20 20 28 35 2c 27 41 6c 6c 5f 74 68        (5,'All_th
0be0: 69 6e 67 73 5f 77 65 72 65 5f 6d 61 64 65 5f 62  ings_were_made_b
0bf0: 79 5f 68 69 6d 27 2c 33 2c 31 29 2c 0a 20 20 20  y_him',3,1),.   
0c00: 20 20 20 20 20 28 36 2c 27 61 6e 64 5f 77 69 74       (6,'and_wit
0c10: 68 6f 75 74 5f 68 69 6d 5f 77 61 73 5f 6e 6f 74  hout_him_was_not
0c20: 5f 61 6e 79 5f 74 68 69 6e 67 5f 6d 61 64 65 5f  _any_thing_made_
0c30: 74 68 61 74 5f 77 61 73 5f 6d 61 64 65 27 2c 33  that_was_made',3
0c40: 2c 32 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e  ,2);.  CREATE IN
0c50: 44 45 58 20 74 31 61 31 20 4f 4e 20 74 31 28 73  DEX t1a1 ON t1(s
0c60: 75 62 73 74 72 28 61 2c 31 2c 31 32 29 29 3b 0a  ubstr(a,1,12));.
0c70: 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } {}.do_execsql_
0c80: 74 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d  test indexexpr1-
0c90: 32 31 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 62  210 {.  SELECT b
0ca0: 2c 20 63 2c 20 27 7c 27 20 46 52 4f 4d 20 74 31  , c, '|' FROM t1
0cb0: 20 57 48 45 52 45 20 73 75 62 73 74 72 28 61 2c   WHERE substr(a,
0cc0: 31 2c 31 32 29 3d 3d 27 61 6e 64 5f 74 68 65 5f  1,12)=='and_the_
0cd0: 57 6f 72 64 27 20 4f 52 44 45 52 20 42 59 20 62  Word' ORDER BY b
0ce0: 2c 20 63 3b 0a 7d 20 7b 31 20 32 20 7c 20 31 20  , c;.} {1 2 | 1 
0cf0: 33 20 7c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  3 |}.do_execsql_
0d00: 74 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d  test indexexpr1-
0d10: 32 31 30 65 71 70 20 7b 0a 20 20 45 58 50 4c 41  210eqp {.  EXPLA
0d20: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  IN QUERY PLAN.  
0d30: 53 45 4c 45 43 54 20 62 2c 20 63 2c 20 27 7c 27  SELECT b, c, '|'
0d40: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 73   FROM t1 WHERE s
0d50: 75 62 73 74 72 28 61 2c 31 2c 31 32 29 3d 3d 27  ubstr(a,1,12)=='
0d60: 61 6e 64 5f 74 68 65 5f 57 6f 72 64 27 20 4f 52  and_the_Word' OR
0d70: 44 45 52 20 42 59 20 62 2c 20 63 3b 0a 7d 20 7b  DER BY b, c;.} {
0d80: 2f 55 53 49 4e 47 20 49 4e 44 45 58 20 74 31 61  /USING INDEX t1a
0d90: 31 2f 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  1/}.do_execsql_t
0da0: 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 32  est indexexpr1-2
0db0: 32 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 62 2c  20 {.  SELECT b,
0dc0: 20 63 2c 20 27 7c 27 20 46 52 4f 4d 20 74 31 20   c, '|' FROM t1 
0dd0: 57 48 45 52 45 20 27 61 6e 64 5f 74 68 65 5f 57  WHERE 'and_the_W
0de0: 6f 72 64 27 3d 3d 73 75 62 73 74 72 28 61 2c 31  ord'==substr(a,1
0df0: 2c 31 32 29 20 4f 52 44 45 52 20 42 59 20 62 2c  ,12) ORDER BY b,
0e00: 20 63 3b 0a 7d 20 7b 31 20 32 20 7c 20 31 20 33   c;.} {1 2 | 1 3
0e10: 20 7c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   |}.do_execsql_t
0e20: 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 32  est indexexpr1-2
0e30: 32 30 65 71 70 20 7b 0a 20 20 45 58 50 4c 41 49  20eqp {.  EXPLAI
0e40: 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 53  N QUERY PLAN.  S
0e50: 45 4c 45 43 54 20 62 2c 20 63 2c 20 27 7c 27 20  ELECT b, c, '|' 
0e60: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 27 61  FROM t1 WHERE 'a
0e70: 6e 64 5f 74 68 65 5f 57 6f 72 64 27 3d 3d 73 75  nd_the_Word'==su
0e80: 62 73 74 72 28 61 2c 31 2c 31 32 29 20 4f 52 44  bstr(a,1,12) ORD
0e90: 45 52 20 42 59 20 62 2c 20 63 3b 0a 7d 20 7b 2f  ER BY b, c;.} {/
0ea0: 55 53 49 4e 47 20 49 4e 44 45 58 20 74 31 61 31  USING INDEX t1a1
0eb0: 2f 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  /}..do_execsql_t
0ec0: 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 32  est indexexpr1-2
0ed0: 33 30 20 7b 0a 20 20 43 52 45 41 54 45 20 49 4e  30 {.  CREATE IN
0ee0: 44 45 58 20 74 31 62 61 20 4f 4e 20 74 31 28 62  DEX t1ba ON t1(b
0ef0: 2c 73 75 62 73 74 72 28 61 2c 32 2c 33 29 2c 63  ,substr(a,2,3),c
0f00: 29 3b 0a 20 20 53 45 4c 45 43 54 20 63 20 46 52  );.  SELECT c FR
0f10: 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3d 31 20  OM t1 WHERE b=1 
0f20: 41 4e 44 20 73 75 62 73 74 72 28 61 2c 32 2c 33  AND substr(a,2,3
0f30: 29 3d 27 6e 64 5f 27 20 4f 52 44 45 52 20 42 59  )='nd_' ORDER BY
0f40: 20 63 3b 0a 7d 20 7b 32 20 33 7d 0a 64 6f 5f 65   c;.} {2 3}.do_e
0f50: 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65  xecsql_test inde
0f60: 78 65 78 70 72 31 2d 32 33 30 65 71 70 20 7b 0a  xexpr1-230eqp {.
0f70: 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20    EXPLAIN QUERY 
0f80: 50 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20 63 20  PLAN.  SELECT c 
0f90: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3d  FROM t1 WHERE b=
0fa0: 31 20 41 4e 44 20 73 75 62 73 74 72 28 61 2c 32  1 AND substr(a,2
0fb0: 2c 33 29 3d 27 6e 64 5f 27 20 4f 52 44 45 52 20  ,3)='nd_' ORDER 
0fc0: 42 59 20 63 3b 0a 7d 20 7b 2f 55 53 49 4e 47 20  BY c;.} {/USING 
0fd0: 49 4e 44 45 58 20 74 31 62 61 2f 7d 0a 0a 64 6f  INDEX t1ba/}..do
0fe0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e  _execsql_test in
0ff0: 64 65 78 65 78 70 72 31 2d 32 34 30 20 7b 0a 20  dexexpr1-240 {. 
1000: 20 53 45 4c 45 43 54 20 69 64 2c 20 73 75 62 73   SELECT id, subs
1010: 74 72 28 61 2c 62 2c 33 29 2c 20 27 7c 27 20 46  tr(a,b,3), '|' F
1020: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
1030: 32 3b 0a 7d 20 7b 31 20 49 6e 5f 20 7c 20 32 20  2;.} {1 In_ | 2 
1040: 61 6e 64 20 7c 20 33 20 61 6e 64 20 7c 20 36 20  and | 3 and | 6 
1050: 64 5f 77 20 7c 20 34 20 68 65 5f 20 7c 20 35 20  d_w | 4 he_ | 5 
1060: 6c 5f 74 20 7c 7d 0a 64 6f 5f 65 78 65 63 73 71  l_t |}.do_execsq
1070: 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70 72  l_test indexexpr
1080: 31 2d 32 34 31 20 7b 0a 20 20 43 52 45 41 54 45  1-241 {.  CREATE
1090: 20 49 4e 44 45 58 20 74 31 61 62 78 20 4f 4e 20   INDEX t1abx ON 
10a0: 74 31 28 73 75 62 73 74 72 28 61 2c 62 2c 33 29  t1(substr(a,b,3)
10b0: 29 3b 0a 20 20 53 45 4c 45 43 54 20 69 64 20 46  );.  SELECT id F
10c0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 73 75 62  ROM t1 WHERE sub
10d0: 73 74 72 28 61 2c 62 2c 33 29 3c 3d 27 61 6e 64  str(a,b,3)<='and
10e0: 27 20 4f 52 44 45 52 20 42 59 20 2b 69 64 3b 0a  ' ORDER BY +id;.
10f0: 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 65 78 65  } {1 2 3}.do_exe
1100: 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65  csql_test indexe
1110: 78 70 72 31 2d 32 34 31 65 71 70 20 7b 0a 20 20  xpr1-241eqp {.  
1120: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1130: 41 4e 0a 20 20 53 45 4c 45 43 54 20 69 64 20 46  AN.  SELECT id F
1140: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 73 75 62  ROM t1 WHERE sub
1150: 73 74 72 28 61 2c 62 2c 33 29 3c 3d 27 61 6e 64  str(a,b,3)<='and
1160: 27 20 4f 52 44 45 52 20 42 59 20 2b 69 64 3b 0a  ' ORDER BY +id;.
1170: 7d 20 7b 2f 55 53 49 4e 47 20 49 4e 44 45 58 20  } {/USING INDEX 
1180: 74 31 61 62 78 2f 7d 0a 64 6f 5f 65 78 65 63 73  t1abx/}.do_execs
1190: 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70  ql_test indexexp
11a0: 72 31 2d 32 34 32 20 7b 0a 20 20 53 45 4c 45 43  r1-242 {.  SELEC
11b0: 54 20 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45  T id FROM t1 WHE
11c0: 52 45 20 2b 73 75 62 73 74 72 28 61 2c 62 2c 33  RE +substr(a,b,3
11d0: 29 3c 3d 27 61 6e 64 27 20 4f 52 44 45 52 20 42  )<='and' ORDER B
11e0: 59 20 2b 69 64 3b 0a 7d 20 7b 31 20 32 20 33 7d  Y +id;.} {1 2 3}
11f0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1200: 20 69 6e 64 65 78 65 78 70 72 31 2d 32 35 30 20   indexexpr1-250 
1210: 7b 0a 20 20 53 45 4c 45 43 54 20 69 64 20 46 52  {.  SELECT id FR
1220: 4f 4d 20 74 31 20 57 48 45 52 45 20 73 75 62 73  OM t1 WHERE subs
1230: 74 72 28 61 2c 62 2c 33 29 20 49 4e 20 28 27 61  tr(a,b,3) IN ('a
1240: 6e 64 27 2c 27 6c 5f 74 27 2c 27 78 79 7a 27 29  nd','l_t','xyz')
1250: 0a 20 20 20 4f 52 44 45 52 20 42 59 20 2b 69 64  .   ORDER BY +id
1260: 3b 0a 7d 20 7b 32 20 33 20 35 7d 0a 64 6f 5f 65  ;.} {2 3 5}.do_e
1270: 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65  xecsql_test inde
1280: 78 65 78 70 72 31 2d 32 35 30 65 71 70 20 7b 0a  xexpr1-250eqp {.
1290: 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20    EXPLAIN QUERY 
12a0: 50 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20 69 64  PLAN.  SELECT id
12b0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 73   FROM t1 WHERE s
12c0: 75 62 73 74 72 28 61 2c 62 2c 33 29 20 49 4e 20  ubstr(a,b,3) IN 
12d0: 28 27 61 6e 64 27 2c 27 6c 5f 74 27 2c 27 78 79  ('and','l_t','xy
12e0: 7a 27 29 0a 20 20 20 4f 52 44 45 52 20 42 59 20  z').   ORDER BY 
12f0: 2b 69 64 3b 0a 7d 20 7b 2f 55 53 49 4e 47 20 49  +id;.} {/USING I
1300: 4e 44 45 58 20 74 31 61 62 78 2f 7d 0a 0a 64 6f  NDEX t1abx/}..do
1310: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 69  _catchsql_test i
1320: 6e 64 65 78 65 78 70 72 31 2d 33 30 30 20 7b 0a  ndexexpr1-300 {.
1330: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1340: 32 28 61 2c 62 2c 63 29 3b 0a 20 20 43 52 45 41  2(a,b,c);.  CREA
1350: 54 45 20 49 4e 44 45 58 20 74 32 78 31 20 4f 4e  TE INDEX t2x1 ON
1360: 20 74 32 28 61 2c 62 2b 72 61 6e 64 6f 6d 28 29   t2(a,b+random()
1370: 29 3b 0a 7d 20 7b 31 20 7b 6e 6f 6e 2d 64 65 74  );.} {1 {non-det
1380: 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74  erministic funct
1390: 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65 64 20  ions prohibited 
13a0: 69 6e 20 69 6e 64 65 78 20 65 78 70 72 65 73 73  in index express
13b0: 69 6f 6e 73 7d 7d 0a 64 6f 5f 63 61 74 63 68 73  ions}}.do_catchs
13c0: 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70  ql_test indexexp
13d0: 72 31 2d 33 30 31 20 7b 0a 20 20 43 52 45 41 54  r1-301 {.  CREAT
13e0: 45 20 49 4e 44 45 58 20 74 32 78 31 20 4f 4e 20  E INDEX t2x1 ON 
13f0: 74 32 28 61 2b 6a 75 6c 69 61 6e 64 61 79 28 27  t2(a+julianday('
1400: 6e 6f 77 27 29 29 3b 0a 7d 20 7b 31 20 7b 6e 6f  now'));.} {1 {no
1410: 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
1420: 66 75 6e 63 74 69 6f 6e 73 20 70 72 6f 68 69 62  functions prohib
1430: 69 74 65 64 20 69 6e 20 69 6e 64 65 78 20 65 78  ited in index ex
1440: 70 72 65 73 73 69 6f 6e 73 7d 7d 0a 64 6f 5f 63  pressions}}.do_c
1450: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 69 6e 64  atchsql_test ind
1460: 65 78 65 78 70 72 31 2d 33 31 30 20 7b 0a 20 20  exexpr1-310 {.  
1470: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 32 78  CREATE INDEX t2x
1480: 32 20 4f 4e 20 74 32 28 61 2c 62 2b 28 53 45 4c  2 ON t2(a,b+(SEL
1490: 45 43 54 20 31 35 29 29 3b 0a 7d 20 7b 31 20 7b  ECT 15));.} {1 {
14a0: 73 75 62 71 75 65 72 69 65 73 20 70 72 6f 68 69  subqueries prohi
14b0: 62 69 74 65 64 20 69 6e 20 69 6e 64 65 78 20 65  bited in index e
14c0: 78 70 72 65 73 73 69 6f 6e 73 7d 7d 0a 0a 66 69  xpressions}}..fi
14d0: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.