/ Hex Artifact Content
Login

Artifact 7d243fac508b4a99fb900ffe34eb488312cfce84:


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 20 20 20 20 2f 2a 20 20 31 32 33 34 35 36        /*  123456
0280: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
0290: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
02a0: 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34  9 123456789 1234
02b0: 35 36 37 38 39 20 2a 2f 20 0a 20 20 56 41 4c 55  56789 */ .  VALU
02c0: 45 53 28 27 49 6e 5f 74 68 65 5f 62 65 67 69 6e  ES('In_the_begin
02d0: 6e 69 6e 67 5f 77 61 73 5f 74 68 65 5f 57 6f 72  ning_was_the_Wor
02e0: 64 27 2c 31 2c 31 29 2c 0a 20 20 20 20 20 20 20  d',1,1),.       
02f0: 20 28 27 61 6e 64 5f 74 68 65 5f 57 6f 72 64 5f   ('and_the_Word_
0300: 77 61 73 5f 77 69 74 68 5f 47 6f 64 27 2c 31 2c  was_with_God',1,
0310: 32 29 2c 0a 20 20 20 20 20 20 20 20 28 27 61 6e  2),.        ('an
0320: 64 5f 74 68 65 5f 57 6f 72 64 5f 77 61 73 5f 47  d_the_Word_was_G
0330: 6f 64 27 2c 31 2c 33 29 2c 0a 20 20 20 20 20 20  od',1,3),.      
0340: 20 20 28 27 54 68 65 5f 73 61 6d 65 5f 77 61 73    ('The_same_was
0350: 5f 69 6e 5f 74 68 65 5f 62 65 67 69 6e 6e 69 6e  _in_the_beginnin
0360: 67 5f 77 69 74 68 5f 47 6f 64 27 2c 32 2c 31 29  g_with_God',2,1)
0370: 2c 0a 20 20 20 20 20 20 20 20 28 27 41 6c 6c 5f  ,.        ('All_
0380: 74 68 69 6e 67 73 5f 77 65 72 65 5f 6d 61 64 65  things_were_made
0390: 5f 62 79 5f 68 69 6d 27 2c 33 2c 31 29 2c 0a 20  _by_him',3,1),. 
03a0: 20 20 20 20 20 20 20 28 27 61 6e 64 5f 77 69 74         ('and_wit
03b0: 68 6f 75 74 5f 68 69 6d 5f 77 61 73 5f 6e 6f 74  hout_him_was_not
03c0: 5f 61 6e 79 5f 74 68 69 6e 67 5f 6d 61 64 65 5f  _any_thing_made_
03d0: 74 68 61 74 5f 77 61 73 5f 6d 61 64 65 27 2c 33  that_was_made',3
03e0: 2c 32 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e  ,2);.  CREATE IN
03f0: 44 45 58 20 74 31 61 31 20 4f 4e 20 74 31 28 73  DEX t1a1 ON t1(s
0400: 75 62 73 74 72 28 61 2c 31 2c 31 32 29 29 3b 0a  ubstr(a,1,12));.
0410: 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } {}.do_execsql_
0420: 74 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d  test indexexpr1-
0430: 31 31 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 62  110 {.  SELECT b
0440: 2c 20 63 2c 20 27 7c 27 20 46 52 4f 4d 20 74 31  , c, '|' FROM t1
0450: 20 57 48 45 52 45 20 73 75 62 73 74 72 28 61 2c   WHERE substr(a,
0460: 31 2c 31 32 29 3d 3d 27 61 6e 64 5f 74 68 65 5f  1,12)=='and_the_
0470: 57 6f 72 64 27 20 4f 52 44 45 52 20 42 59 20 62  Word' ORDER BY b
0480: 2c 20 63 3b 0a 7d 20 7b 31 20 32 20 7c 20 31 20  , c;.} {1 2 | 1 
0490: 33 20 7c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  3 |}.do_execsql_
04a0: 74 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d  test indexexpr1-
04b0: 31 31 30 65 71 70 20 7b 0a 20 20 45 58 50 4c 41  110eqp {.  EXPLA
04c0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  IN QUERY PLAN.  
04d0: 53 45 4c 45 43 54 20 62 2c 20 63 2c 20 27 7c 27  SELECT b, c, '|'
04e0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 73   FROM t1 WHERE s
04f0: 75 62 73 74 72 28 61 2c 31 2c 31 32 29 3d 3d 27  ubstr(a,1,12)=='
0500: 61 6e 64 5f 74 68 65 5f 57 6f 72 64 27 20 4f 52  and_the_Word' OR
0510: 44 45 52 20 42 59 20 62 2c 20 63 3b 0a 7d 20 7b  DER BY b, c;.} {
0520: 2f 55 53 49 4e 47 20 49 4e 44 45 58 20 74 31 61  /USING INDEX t1a
0530: 31 2f 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  1/}.do_execsql_t
0540: 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 31  est indexexpr1-1
0550: 32 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 62 2c  20 {.  SELECT b,
0560: 20 63 2c 20 27 7c 27 20 46 52 4f 4d 20 74 31 20   c, '|' FROM t1 
0570: 57 48 45 52 45 20 27 61 6e 64 5f 74 68 65 5f 57  WHERE 'and_the_W
0580: 6f 72 64 27 3d 3d 73 75 62 73 74 72 28 61 2c 31  ord'==substr(a,1
0590: 2c 31 32 29 20 4f 52 44 45 52 20 42 59 20 62 2c  ,12) ORDER BY b,
05a0: 20 63 3b 0a 7d 20 7b 31 20 32 20 7c 20 31 20 33   c;.} {1 2 | 1 3
05b0: 20 7c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   |}.do_execsql_t
05c0: 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 31  est indexexpr1-1
05d0: 32 30 65 71 70 20 7b 0a 20 20 45 58 50 4c 41 49  20eqp {.  EXPLAI
05e0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 53  N QUERY PLAN.  S
05f0: 45 4c 45 43 54 20 62 2c 20 63 2c 20 27 7c 27 20  ELECT b, c, '|' 
0600: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 27 61  FROM t1 WHERE 'a
0610: 6e 64 5f 74 68 65 5f 57 6f 72 64 27 3d 3d 73 75  nd_the_Word'==su
0620: 62 73 74 72 28 61 2c 31 2c 31 32 29 20 4f 52 44  bstr(a,1,12) ORD
0630: 45 52 20 42 59 20 62 2c 20 63 3b 0a 7d 20 7b 2f  ER BY b, c;.} {/
0640: 55 53 49 4e 47 20 49 4e 44 45 58 20 74 31 61 31  USING INDEX t1a1
0650: 2f 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  /}..do_execsql_t
0660: 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 31  est indexexpr1-1
0670: 33 30 20 7b 0a 20 20 43 52 45 41 54 45 20 49 4e  30 {.  CREATE IN
0680: 44 45 58 20 74 31 62 61 20 4f 4e 20 74 31 28 62  DEX t1ba ON t1(b
0690: 2c 73 75 62 73 74 72 28 61 2c 32 2c 33 29 2c 63  ,substr(a,2,3),c
06a0: 29 3b 0a 20 20 53 45 4c 45 43 54 20 63 20 46 52  );.  SELECT c FR
06b0: 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3d 31 20  OM t1 WHERE b=1 
06c0: 41 4e 44 20 73 75 62 73 74 72 28 61 2c 32 2c 33  AND substr(a,2,3
06d0: 29 3d 27 6e 64 5f 27 20 4f 52 44 45 52 20 42 59  )='nd_' ORDER BY
06e0: 20 63 3b 0a 7d 20 7b 32 20 33 7d 0a 64 6f 5f 65   c;.} {2 3}.do_e
06f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65  xecsql_test inde
0700: 78 65 78 70 72 31 2d 31 33 30 65 71 70 20 7b 0a  xexpr1-130eqp {.
0710: 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20    EXPLAIN QUERY 
0720: 50 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20 63 20  PLAN.  SELECT c 
0730: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3d  FROM t1 WHERE b=
0740: 31 20 41 4e 44 20 73 75 62 73 74 72 28 61 2c 32  1 AND substr(a,2
0750: 2c 33 29 3d 27 6e 64 5f 27 20 4f 52 44 45 52 20  ,3)='nd_' ORDER 
0760: 42 59 20 63 3b 0a 7d 20 7b 2f 55 53 49 4e 47 20  BY c;.} {/USING 
0770: 49 4e 44 45 58 20 74 31 62 61 2f 7d 0a 0a 64 6f  INDEX t1ba/}..do
0780: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e  _execsql_test in
0790: 64 65 78 65 78 70 72 31 2d 31 34 30 20 7b 0a 20  dexexpr1-140 {. 
07a0: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 73   SELECT rowid, s
07b0: 75 62 73 74 72 28 61 2c 62 2c 33 29 2c 20 27 7c  ubstr(a,b,3), '|
07c0: 27 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  ' FROM t1 ORDER 
07d0: 42 59 20 32 3b 0a 7d 20 7b 31 20 49 6e 5f 20 7c  BY 2;.} {1 In_ |
07e0: 20 32 20 61 6e 64 20 7c 20 33 20 61 6e 64 20 7c   2 and | 3 and |
07f0: 20 36 20 64 5f 77 20 7c 20 34 20 68 65 5f 20 7c   6 d_w | 4 he_ |
0800: 20 35 20 6c 5f 74 20 7c 7d 0a 64 6f 5f 65 78 65   5 l_t |}.do_exe
0810: 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65  csql_test indexe
0820: 78 70 72 31 2d 31 34 31 20 7b 0a 20 20 43 52 45  xpr1-141 {.  CRE
0830: 41 54 45 20 49 4e 44 45 58 20 74 31 61 62 78 20  ATE INDEX t1abx 
0840: 4f 4e 20 74 31 28 73 75 62 73 74 72 28 61 2c 62  ON t1(substr(a,b
0850: 2c 33 29 29 3b 0a 20 20 53 45 4c 45 43 54 20 72  ,3));.  SELECT r
0860: 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45  owid FROM t1 WHE
0870: 52 45 20 73 75 62 73 74 72 28 61 2c 62 2c 33 29  RE substr(a,b,3)
0880: 3c 3d 27 61 6e 64 27 20 4f 52 44 45 52 20 42 59  <='and' ORDER BY
0890: 20 2b 72 6f 77 69 64 3b 0a 7d 20 7b 31 20 32 20   +rowid;.} {1 2 
08a0: 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  3}.do_execsql_te
08b0: 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 31 34  st indexexpr1-14
08c0: 31 65 71 70 20 7b 0a 20 20 45 58 50 4c 41 49 4e  1eqp {.  EXPLAIN
08d0: 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 53 45   QUERY PLAN.  SE
08e0: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
08f0: 74 31 20 57 48 45 52 45 20 73 75 62 73 74 72 28  t1 WHERE substr(
0900: 61 2c 62 2c 33 29 3c 3d 27 61 6e 64 27 20 4f 52  a,b,3)<='and' OR
0910: 44 45 52 20 42 59 20 2b 72 6f 77 69 64 3b 0a 7d  DER BY +rowid;.}
0920: 20 7b 2f 55 53 49 4e 47 20 49 4e 44 45 58 20 74   {/USING INDEX t
0930: 31 61 62 78 2f 7d 0a 64 6f 5f 65 78 65 63 73 71  1abx/}.do_execsq
0940: 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70 72  l_test indexexpr
0950: 31 2d 31 34 32 20 7b 0a 20 20 53 45 4c 45 43 54  1-142 {.  SELECT
0960: 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 57   rowid FROM t1 W
0970: 48 45 52 45 20 2b 73 75 62 73 74 72 28 61 2c 62  HERE +substr(a,b
0980: 2c 33 29 3c 3d 27 61 6e 64 27 20 4f 52 44 45 52  ,3)<='and' ORDER
0990: 20 42 59 20 2b 72 6f 77 69 64 3b 0a 7d 20 7b 31   BY +rowid;.} {1
09a0: 20 32 20 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   2 3}.do_execsql
09b0: 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70 72 31  _test indexexpr1
09c0: 2d 31 35 30 20 7b 0a 20 20 53 45 4c 45 43 54 20  -150 {.  SELECT 
09d0: 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 57 48  rowid FROM t1 WH
09e0: 45 52 45 20 73 75 62 73 74 72 28 61 2c 62 2c 33  ERE substr(a,b,3
09f0: 29 20 49 4e 20 28 27 61 6e 64 27 2c 27 6c 5f 74  ) IN ('and','l_t
0a00: 27 2c 27 78 79 7a 27 29 0a 20 20 20 4f 52 44 45  ','xyz').   ORDE
0a10: 52 20 42 59 20 2b 72 6f 77 69 64 3b 0a 7d 20 7b  R BY +rowid;.} {
0a20: 32 20 33 20 35 7d 0a 64 6f 5f 65 78 65 63 73 71  2 3 5}.do_execsq
0a30: 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70 72  l_test indexexpr
0a40: 31 2d 31 35 30 65 71 70 20 7b 0a 20 20 45 58 50  1-150eqp {.  EXP
0a50: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a  LAIN QUERY PLAN.
0a60: 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46    SELECT rowid F
0a70: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 73 75 62  ROM t1 WHERE sub
0a80: 73 74 72 28 61 2c 62 2c 33 29 20 49 4e 20 28 27  str(a,b,3) IN ('
0a90: 61 6e 64 27 2c 27 6c 5f 74 27 2c 27 78 79 7a 27  and','l_t','xyz'
0aa0: 29 0a 20 20 20 4f 52 44 45 52 20 42 59 20 2b 72  ).   ORDER BY +r
0ab0: 6f 77 69 64 3b 0a 7d 20 7b 2f 55 53 49 4e 47 20  owid;.} {/USING 
0ac0: 49 4e 44 45 58 20 74 31 61 62 78 2f 7d 0a 0a 64  INDEX t1abx/}..d
0ad0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69  o_execsql_test i
0ae0: 6e 64 65 78 65 78 70 72 31 2d 31 36 30 20 7b 0a  ndexexpr1-160 {.
0af0: 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 31    ALTER TABLE t1
0b00: 20 41 44 44 20 43 4f 4c 55 4d 4e 20 64 3b 0a 20   ADD COLUMN d;. 
0b10: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 64   UPDATE t1 SET d
0b20: 3d 6c 65 6e 67 74 68 28 61 29 3b 0a 20 20 43 52  =length(a);.  CR
0b30: 45 41 54 45 20 49 4e 44 45 58 20 74 31 61 32 20  EATE INDEX t1a2 
0b40: 4f 4e 20 74 31 28 53 55 42 53 54 52 28 61 2c 20  ON t1(SUBSTR(a, 
0b50: 32 37 2c 20 33 29 29 20 57 48 45 52 45 20 64 3e  27, 3)) WHERE d>
0b60: 3d 32 39 3b 0a 20 20 53 45 4c 45 43 54 20 72 6f  =29;.  SELECT ro
0b70: 77 69 64 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74  wid, b, c FROM t
0b80: 31 0a 20 20 20 57 48 45 52 45 20 73 75 62 73 74  1.   WHERE subst
0b90: 72 28 61 2c 32 37 2c 33 29 3d 3d 27 6f 72 64 27  r(a,27,3)=='ord'
0ba0: 20 41 4e 44 20 64 3e 3d 32 39 3b 0a 7d 20 7b 31   AND d>=29;.} {1
0bb0: 20 31 20 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   1 1}.do_execsql
0bc0: 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70 72 31  _test indexexpr1
0bd0: 2d 31 36 30 65 71 70 20 7b 0a 20 20 45 58 50 4c  -160eqp {.  EXPL
0be0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20  AIN QUERY PLAN. 
0bf0: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 62   SELECT rowid, b
0c00: 2c 20 63 20 46 52 4f 4d 20 74 31 0a 20 20 20 57  , c FROM t1.   W
0c10: 48 45 52 45 20 73 75 62 73 74 72 28 61 2c 32 37  HERE substr(a,27
0c20: 2c 33 29 3d 3d 27 6f 72 64 27 20 41 4e 44 20 64  ,3)=='ord' AND d
0c30: 3e 3d 32 39 3b 0a 7d 20 7b 2f 55 53 49 4e 47 20  >=29;.} {/USING 
0c40: 49 4e 44 45 58 20 74 31 61 32 2f 7d 0a 0a 23 20  INDEX t1a2/}..# 
0c50: 4f 52 44 45 52 20 42 59 20 75 73 69 6e 67 20 61  ORDER BY using a
0c60: 6e 20 69 6e 64 65 78 65 64 20 65 78 70 72 65 73  n indexed expres
0c70: 73 69 6f 6e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  sion.#.do_execsq
0c80: 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70 72  l_test indexexpr
0c90: 31 2d 31 37 30 20 7b 0a 20 20 43 52 45 41 54 45  1-170 {.  CREATE
0ca0: 20 49 4e 44 45 58 20 74 31 61 6c 65 6e 20 4f 4e   INDEX t1alen ON
0cb0: 20 74 31 28 6c 65 6e 67 74 68 28 61 29 29 3b 0a   t1(length(a));.
0cc0: 20 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28    SELECT length(
0cd0: 61 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52  a) FROM t1 ORDER
0ce0: 20 42 59 20 6c 65 6e 67 74 68 28 61 29 3b 0a 7d   BY length(a);.}
0cf0: 20 7b 32 30 20 32 35 20 32 37 20 32 39 20 33 38   {20 25 27 29 38
0d00: 20 35 32 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   52}.do_execsql_
0d10: 74 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d  test indexexpr1-
0d20: 31 37 30 65 71 70 20 7b 0a 20 20 45 58 50 4c 41  170eqp {.  EXPLA
0d30: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  IN QUERY PLAN.  
0d40: 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 61 29  SELECT length(a)
0d50: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
0d60: 59 20 6c 65 6e 67 74 68 28 61 29 3b 0a 7d 20 7b  Y length(a);.} {
0d70: 2f 53 43 41 4e 20 54 41 42 4c 45 20 74 31 20 55  /SCAN TABLE t1 U
0d80: 53 49 4e 47 20 49 4e 44 45 58 20 74 31 61 6c 65  SING INDEX t1ale
0d90: 6e 2f 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  n/}.do_execsql_t
0da0: 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 31  est indexexpr1-1
0db0: 37 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 6c 65  71 {.  SELECT le
0dc0: 6e 67 74 68 28 61 29 20 46 52 4f 4d 20 74 31 20  ngth(a) FROM t1 
0dd0: 4f 52 44 45 52 20 42 59 20 6c 65 6e 67 74 68 28  ORDER BY length(
0de0: 61 29 20 44 45 53 43 3b 0a 7d 20 7b 35 32 20 33  a) DESC;.} {52 3
0df0: 38 20 32 39 20 32 37 20 32 35 20 32 30 7d 0a 64  8 29 27 25 20}.d
0e00: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69  o_execsql_test i
0e10: 6e 64 65 78 65 78 70 72 31 2d 31 37 31 65 71 70  ndexexpr1-171eqp
0e20: 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45   {.  EXPLAIN QUE
0e30: 52 59 20 50 4c 41 4e 0a 20 20 53 45 4c 45 43 54  RY PLAN.  SELECT
0e40: 20 6c 65 6e 67 74 68 28 61 29 20 46 52 4f 4d 20   length(a) FROM 
0e50: 74 31 20 4f 52 44 45 52 20 42 59 20 6c 65 6e 67  t1 ORDER BY leng
0e60: 74 68 28 61 29 20 44 45 53 43 3b 0a 7d 20 7b 2f  th(a) DESC;.} {/
0e70: 53 43 41 4e 20 54 41 42 4c 45 20 74 31 20 55 53  SCAN TABLE t1 US
0e80: 49 4e 47 20 49 4e 44 45 58 20 74 31 61 6c 65 6e  ING INDEX t1alen
0e90: 2f 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  /}..do_execsql_t
0ea0: 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 32  est indexexpr1-2
0eb0: 30 30 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c  00 {.  DROP TABL
0ec0: 45 20 74 31 3b 0a 20 20 43 52 45 41 54 45 20 54  E t1;.  CREATE T
0ed0: 41 42 4c 45 20 74 31 28 69 64 20 41 4e 59 20 50  ABLE t1(id ANY P
0ee0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 61 2c 62 2c  RIMARY KEY, a,b,
0ef0: 63 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  c) WITHOUT ROWID
0f00: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0f10: 74 31 28 69 64 2c 61 2c 62 2c 63 29 0a 20 20 56  t1(id,a,b,c).  V
0f20: 41 4c 55 45 53 28 31 2c 27 49 6e 5f 74 68 65 5f  ALUES(1,'In_the_
0f30: 62 65 67 69 6e 6e 69 6e 67 5f 77 61 73 5f 74 68  beginning_was_th
0f40: 65 5f 57 6f 72 64 27 2c 31 2c 31 29 2c 0a 20 20  e_Word',1,1),.  
0f50: 20 20 20 20 20 20 28 32 2c 27 61 6e 64 5f 74 68        (2,'and_th
0f60: 65 5f 57 6f 72 64 5f 77 61 73 5f 77 69 74 68 5f  e_Word_was_with_
0f70: 47 6f 64 27 2c 31 2c 32 29 2c 0a 20 20 20 20 20  God',1,2),.     
0f80: 20 20 20 28 33 2c 27 61 6e 64 5f 74 68 65 5f 57     (3,'and_the_W
0f90: 6f 72 64 5f 77 61 73 5f 47 6f 64 27 2c 31 2c 33  ord_was_God',1,3
0fa0: 29 2c 0a 20 20 20 20 20 20 20 20 28 34 2c 27 54  ),.        (4,'T
0fb0: 68 65 5f 73 61 6d 65 5f 77 61 73 5f 69 6e 5f 74  he_same_was_in_t
0fc0: 68 65 5f 62 65 67 69 6e 6e 69 6e 67 5f 77 69 74  he_beginning_wit
0fd0: 68 5f 47 6f 64 27 2c 32 2c 31 29 2c 0a 20 20 20  h_God',2,1),.   
0fe0: 20 20 20 20 20 28 35 2c 27 41 6c 6c 5f 74 68 69       (5,'All_thi
0ff0: 6e 67 73 5f 77 65 72 65 5f 6d 61 64 65 5f 62 79  ngs_were_made_by
1000: 5f 68 69 6d 27 2c 33 2c 31 29 2c 0a 20 20 20 20  _him',3,1),.    
1010: 20 20 20 20 28 36 2c 27 61 6e 64 5f 77 69 74 68      (6,'and_with
1020: 6f 75 74 5f 68 69 6d 5f 77 61 73 5f 6e 6f 74 5f  out_him_was_not_
1030: 61 6e 79 5f 74 68 69 6e 67 5f 6d 61 64 65 5f 74  any_thing_made_t
1040: 68 61 74 5f 77 61 73 5f 6d 61 64 65 27 2c 33 2c  hat_was_made',3,
1050: 32 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  2);.  CREATE IND
1060: 45 58 20 74 31 61 31 20 4f 4e 20 74 31 28 73 75  EX t1a1 ON t1(su
1070: 62 73 74 72 28 61 2c 31 2c 31 32 29 29 3b 0a 7d  bstr(a,1,12));.}
1080: 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   {}.do_execsql_t
1090: 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 32  est indexexpr1-2
10a0: 31 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 62 2c  10 {.  SELECT b,
10b0: 20 63 2c 20 27 7c 27 20 46 52 4f 4d 20 74 31 20   c, '|' FROM t1 
10c0: 57 48 45 52 45 20 73 75 62 73 74 72 28 61 2c 31  WHERE substr(a,1
10d0: 2c 31 32 29 3d 3d 27 61 6e 64 5f 74 68 65 5f 57  ,12)=='and_the_W
10e0: 6f 72 64 27 20 4f 52 44 45 52 20 42 59 20 62 2c  ord' ORDER BY b,
10f0: 20 63 3b 0a 7d 20 7b 31 20 32 20 7c 20 31 20 33   c;.} {1 2 | 1 3
1100: 20 7c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   |}.do_execsql_t
1110: 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 32  est indexexpr1-2
1120: 31 30 65 71 70 20 7b 0a 20 20 45 58 50 4c 41 49  10eqp {.  EXPLAI
1130: 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 53  N QUERY PLAN.  S
1140: 45 4c 45 43 54 20 62 2c 20 63 2c 20 27 7c 27 20  ELECT b, c, '|' 
1150: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 73 75  FROM t1 WHERE su
1160: 62 73 74 72 28 61 2c 31 2c 31 32 29 3d 3d 27 61  bstr(a,1,12)=='a
1170: 6e 64 5f 74 68 65 5f 57 6f 72 64 27 20 4f 52 44  nd_the_Word' ORD
1180: 45 52 20 42 59 20 62 2c 20 63 3b 0a 7d 20 7b 2f  ER BY b, c;.} {/
1190: 55 53 49 4e 47 20 49 4e 44 45 58 20 74 31 61 31  USING INDEX t1a1
11a0: 2f 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  /}.do_execsql_te
11b0: 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 32 32  st indexexpr1-22
11c0: 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 62 2c 20  0 {.  SELECT b, 
11d0: 63 2c 20 27 7c 27 20 46 52 4f 4d 20 74 31 20 57  c, '|' FROM t1 W
11e0: 48 45 52 45 20 27 61 6e 64 5f 74 68 65 5f 57 6f  HERE 'and_the_Wo
11f0: 72 64 27 3d 3d 73 75 62 73 74 72 28 61 2c 31 2c  rd'==substr(a,1,
1200: 31 32 29 20 4f 52 44 45 52 20 42 59 20 62 2c 20  12) ORDER BY b, 
1210: 63 3b 0a 7d 20 7b 31 20 32 20 7c 20 31 20 33 20  c;.} {1 2 | 1 3 
1220: 7c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  |}.do_execsql_te
1230: 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 32 32  st indexexpr1-22
1240: 30 65 71 70 20 7b 0a 20 20 45 58 50 4c 41 49 4e  0eqp {.  EXPLAIN
1250: 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 53 45   QUERY PLAN.  SE
1260: 4c 45 43 54 20 62 2c 20 63 2c 20 27 7c 27 20 46  LECT b, c, '|' F
1270: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 27 61 6e  ROM t1 WHERE 'an
1280: 64 5f 74 68 65 5f 57 6f 72 64 27 3d 3d 73 75 62  d_the_Word'==sub
1290: 73 74 72 28 61 2c 31 2c 31 32 29 20 4f 52 44 45  str(a,1,12) ORDE
12a0: 52 20 42 59 20 62 2c 20 63 3b 0a 7d 20 7b 2f 55  R BY b, c;.} {/U
12b0: 53 49 4e 47 20 49 4e 44 45 58 20 74 31 61 31 2f  SING INDEX t1a1/
12c0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
12d0: 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 32 33  st indexexpr1-23
12e0: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  0 {.  CREATE IND
12f0: 45 58 20 74 31 62 61 20 4f 4e 20 74 31 28 62 2c  EX t1ba ON t1(b,
1300: 73 75 62 73 74 72 28 61 2c 32 2c 33 29 2c 63 29  substr(a,2,3),c)
1310: 3b 0a 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ;.  SELECT c FRO
1320: 4d 20 74 31 20 57 48 45 52 45 20 62 3d 31 20 41  M t1 WHERE b=1 A
1330: 4e 44 20 73 75 62 73 74 72 28 61 2c 32 2c 33 29  ND substr(a,2,3)
1340: 3d 27 6e 64 5f 27 20 4f 52 44 45 52 20 42 59 20  ='nd_' ORDER BY 
1350: 63 3b 0a 7d 20 7b 32 20 33 7d 0a 64 6f 5f 65 78  c;.} {2 3}.do_ex
1360: 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78  ecsql_test index
1370: 65 78 70 72 31 2d 32 33 30 65 71 70 20 7b 0a 20  expr1-230eqp {. 
1380: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
1390: 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20 63 20 46  LAN.  SELECT c F
13a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3d 31  ROM t1 WHERE b=1
13b0: 20 41 4e 44 20 73 75 62 73 74 72 28 61 2c 32 2c   AND substr(a,2,
13c0: 33 29 3d 27 6e 64 5f 27 20 4f 52 44 45 52 20 42  3)='nd_' ORDER B
13d0: 59 20 63 3b 0a 7d 20 7b 2f 55 53 49 4e 47 20 49  Y c;.} {/USING I
13e0: 4e 44 45 58 20 74 31 62 61 2f 7d 0a 0a 64 6f 5f  NDEX t1ba/}..do_
13f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64  execsql_test ind
1400: 65 78 65 78 70 72 31 2d 32 34 30 20 7b 0a 20 20  exexpr1-240 {.  
1410: 53 45 4c 45 43 54 20 69 64 2c 20 73 75 62 73 74  SELECT id, subst
1420: 72 28 61 2c 62 2c 33 29 2c 20 27 7c 27 20 46 52  r(a,b,3), '|' FR
1430: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 32  OM t1 ORDER BY 2
1440: 3b 0a 7d 20 7b 31 20 49 6e 5f 20 7c 20 32 20 61  ;.} {1 In_ | 2 a
1450: 6e 64 20 7c 20 33 20 61 6e 64 20 7c 20 36 20 64  nd | 3 and | 6 d
1460: 5f 77 20 7c 20 34 20 68 65 5f 20 7c 20 35 20 6c  _w | 4 he_ | 5 l
1470: 5f 74 20 7c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  _t |}.do_execsql
1480: 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70 72 31  _test indexexpr1
1490: 2d 32 34 31 20 7b 0a 20 20 43 52 45 41 54 45 20  -241 {.  CREATE 
14a0: 49 4e 44 45 58 20 74 31 61 62 78 20 4f 4e 20 74  INDEX t1abx ON t
14b0: 31 28 73 75 62 73 74 72 28 61 2c 62 2c 33 29 29  1(substr(a,b,3))
14c0: 3b 0a 20 20 53 45 4c 45 43 54 20 69 64 20 46 52  ;.  SELECT id FR
14d0: 4f 4d 20 74 31 20 57 48 45 52 45 20 73 75 62 73  OM t1 WHERE subs
14e0: 74 72 28 61 2c 62 2c 33 29 3c 3d 27 61 6e 64 27  tr(a,b,3)<='and'
14f0: 20 4f 52 44 45 52 20 42 59 20 2b 69 64 3b 0a 7d   ORDER BY +id;.}
1500: 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 65 78 65 63   {1 2 3}.do_exec
1510: 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78  sql_test indexex
1520: 70 72 31 2d 32 34 31 65 71 70 20 7b 0a 20 20 45  pr1-241eqp {.  E
1530: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
1540: 4e 0a 20 20 53 45 4c 45 43 54 20 69 64 20 46 52  N.  SELECT id FR
1550: 4f 4d 20 74 31 20 57 48 45 52 45 20 73 75 62 73  OM t1 WHERE subs
1560: 74 72 28 61 2c 62 2c 33 29 3c 3d 27 61 6e 64 27  tr(a,b,3)<='and'
1570: 20 4f 52 44 45 52 20 42 59 20 2b 69 64 3b 0a 7d   ORDER BY +id;.}
1580: 20 7b 2f 55 53 49 4e 47 20 49 4e 44 45 58 20 74   {/USING INDEX t
1590: 31 61 62 78 2f 7d 0a 64 6f 5f 65 78 65 63 73 71  1abx/}.do_execsq
15a0: 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70 72  l_test indexexpr
15b0: 31 2d 32 34 32 20 7b 0a 20 20 53 45 4c 45 43 54  1-242 {.  SELECT
15c0: 20 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45 52   id FROM t1 WHER
15d0: 45 20 2b 73 75 62 73 74 72 28 61 2c 62 2c 33 29  E +substr(a,b,3)
15e0: 3c 3d 27 61 6e 64 27 20 4f 52 44 45 52 20 42 59  <='and' ORDER BY
15f0: 20 2b 69 64 3b 0a 7d 20 7b 31 20 32 20 33 7d 0a   +id;.} {1 2 3}.
1600: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1610: 69 6e 64 65 78 65 78 70 72 31 2d 32 35 30 20 7b  indexexpr1-250 {
1620: 0a 20 20 53 45 4c 45 43 54 20 69 64 20 46 52 4f  .  SELECT id FRO
1630: 4d 20 74 31 20 57 48 45 52 45 20 73 75 62 73 74  M t1 WHERE subst
1640: 72 28 61 2c 62 2c 33 29 20 49 4e 20 28 27 61 6e  r(a,b,3) IN ('an
1650: 64 27 2c 27 6c 5f 74 27 2c 27 78 79 7a 27 29 0a  d','l_t','xyz').
1660: 20 20 20 4f 52 44 45 52 20 42 59 20 2b 69 64 3b     ORDER BY +id;
1670: 0a 7d 20 7b 32 20 33 20 35 7d 0a 64 6f 5f 65 78  .} {2 3 5}.do_ex
1680: 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78  ecsql_test index
1690: 65 78 70 72 31 2d 32 35 30 65 71 70 20 7b 0a 20  expr1-250eqp {. 
16a0: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
16b0: 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20 69 64 20  LAN.  SELECT id 
16c0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 73 75  FROM t1 WHERE su
16d0: 62 73 74 72 28 61 2c 62 2c 33 29 20 49 4e 20 28  bstr(a,b,3) IN (
16e0: 27 61 6e 64 27 2c 27 6c 5f 74 27 2c 27 78 79 7a  'and','l_t','xyz
16f0: 27 29 0a 20 20 20 4f 52 44 45 52 20 42 59 20 2b  ').   ORDER BY +
1700: 69 64 3b 0a 7d 20 7b 2f 55 53 49 4e 47 20 49 4e  id;.} {/USING IN
1710: 44 45 58 20 74 31 61 62 78 2f 7d 0a 0a 64 6f 5f  DEX t1abx/}..do_
1720: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64  execsql_test ind
1730: 65 78 65 78 70 72 31 2d 32 36 30 20 7b 0a 20 20  exexpr1-260 {.  
1740: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 31 20 41  ALTER TABLE t1 A
1750: 44 44 20 43 4f 4c 55 4d 4e 20 64 3b 0a 20 20 55  DD COLUMN d;.  U
1760: 50 44 41 54 45 20 74 31 20 53 45 54 20 64 3d 6c  PDATE t1 SET d=l
1770: 65 6e 67 74 68 28 61 29 3b 0a 20 20 43 52 45 41  ength(a);.  CREA
1780: 54 45 20 49 4e 44 45 58 20 74 31 61 32 20 4f 4e  TE INDEX t1a2 ON
1790: 20 74 31 28 53 55 42 53 54 52 28 61 2c 20 32 37   t1(SUBSTR(a, 27
17a0: 2c 20 33 29 29 20 57 48 45 52 45 20 64 3e 3d 32  , 3)) WHERE d>=2
17b0: 39 3b 0a 20 20 53 45 4c 45 43 54 20 69 64 2c 20  9;.  SELECT id, 
17c0: 62 2c 20 63 20 46 52 4f 4d 20 74 31 0a 20 20 20  b, c FROM t1.   
17d0: 57 48 45 52 45 20 73 75 62 73 74 72 28 61 2c 32  WHERE substr(a,2
17e0: 37 2c 33 29 3d 3d 27 6f 72 64 27 20 41 4e 44 20  7,3)=='ord' AND 
17f0: 64 3e 3d 32 39 3b 0a 7d 20 7b 31 20 31 20 31 7d  d>=29;.} {1 1 1}
1800: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1810: 20 69 6e 64 65 78 65 78 70 72 31 2d 32 36 30 65   indexexpr1-260e
1820: 71 70 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51  qp {.  EXPLAIN Q
1830: 55 45 52 59 20 50 4c 41 4e 0a 20 20 53 45 4c 45  UERY PLAN.  SELE
1840: 43 54 20 69 64 2c 20 62 2c 20 63 20 46 52 4f 4d  CT id, b, c FROM
1850: 20 74 31 0a 20 20 20 57 48 45 52 45 20 73 75 62   t1.   WHERE sub
1860: 73 74 72 28 61 2c 32 37 2c 33 29 3d 3d 27 6f 72  str(a,27,3)=='or
1870: 64 27 20 41 4e 44 20 64 3e 3d 32 39 3b 0a 7d 20  d' AND d>=29;.} 
1880: 7b 2f 55 53 49 4e 47 20 49 4e 44 45 58 20 74 31  {/USING INDEX t1
1890: 61 32 2f 7d 0a 0a 0a 64 6f 5f 63 61 74 63 68 73  a2/}...do_catchs
18a0: 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70  ql_test indexexp
18b0: 72 31 2d 33 30 30 20 7b 0a 20 20 43 52 45 41 54  r1-300 {.  CREAT
18c0: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 62 2c 63  E TABLE t2(a,b,c
18d0: 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45  );.  CREATE INDE
18e0: 58 20 74 32 78 31 20 4f 4e 20 74 32 28 61 2c 62  X t2x1 ON t2(a,b
18f0: 2b 72 61 6e 64 6f 6d 28 29 29 3b 0a 7d 20 7b 31  +random());.} {1
1900: 20 7b 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73   {non-determinis
1910: 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 20 70 72  tic functions pr
1920: 6f 68 69 62 69 74 65 64 20 69 6e 20 69 6e 64 65  ohibited in inde
1930: 78 20 65 78 70 72 65 73 73 69 6f 6e 73 7d 7d 0a  x expressions}}.
1940: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
1950: 20 69 6e 64 65 78 65 78 70 72 31 2d 33 30 31 20   indexexpr1-301 
1960: 7b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  {.  CREATE INDEX
1970: 20 74 32 78 31 20 4f 4e 20 74 32 28 61 2b 6a 75   t2x1 ON t2(a+ju
1980: 6c 69 61 6e 64 61 79 28 27 6e 6f 77 27 29 29 3b  lianday('now'));
1990: 0a 7d 20 7b 31 20 7b 6e 6f 6e 2d 64 65 74 65 72  .} {1 {non-deter
19a0: 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
19b0: 6e 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e  ns prohibited in
19c0: 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f   index expressio
19d0: 6e 73 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  ns}}.do_catchsql
19e0: 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70 72 31  _test indexexpr1
19f0: 2d 33 31 30 20 7b 0a 20 20 43 52 45 41 54 45 20  -310 {.  CREATE 
1a00: 49 4e 44 45 58 20 74 32 78 32 20 4f 4e 20 74 32  INDEX t2x2 ON t2
1a10: 28 61 2c 62 2b 28 53 45 4c 45 43 54 20 31 35 29  (a,b+(SELECT 15)
1a20: 29 3b 0a 7d 20 7b 31 20 7b 73 75 62 71 75 65 72  );.} {1 {subquer
1a30: 69 65 73 20 70 72 6f 68 69 62 69 74 65 64 20 69  ies prohibited i
1a40: 6e 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69  n index expressi
1a50: 6f 6e 73 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71  ons}}.do_catchsq
1a60: 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70 72  l_test indexexpr
1a70: 31 2d 33 32 30 20 7b 0a 20 20 43 52 45 41 54 45  1-320 {.  CREATE
1a80: 20 54 41 42 4c 45 20 65 31 28 78 2c 79 2c 55 4e   TABLE e1(x,y,UN
1a90: 49 51 55 45 28 79 2c 73 75 62 73 74 72 28 78 2c  IQUE(y,substr(x,
1aa0: 31 2c 35 29 29 29 3b 0a 7d 20 7b 31 20 7b 65 78  1,5)));.} {1 {ex
1ab0: 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62  pressions prohib
1ac0: 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20  ited in PRIMARY 
1ad0: 4b 45 59 20 61 6e 64 20 55 4e 49 51 55 45 20 63  KEY and UNIQUE c
1ae0: 6f 6e 73 74 72 61 69 6e 74 73 7d 7d 0a 64 6f 5f  onstraints}}.do_
1af0: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 69 6e  catchsql_test in
1b00: 64 65 78 65 78 70 72 31 2d 33 33 30 20 7b 0a 20  dexexpr1-330 {. 
1b10: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 65 31   CREATE TABLE e1
1b20: 28 78 2c 79 2c 50 52 49 4d 41 52 59 20 4b 45 59  (x,y,PRIMARY KEY
1b30: 28 79 2c 73 75 62 73 74 72 28 78 2c 31 2c 35 29  (y,substr(x,1,5)
1b40: 29 29 3b 0a 7d 20 7b 31 20 7b 65 78 70 72 65 73  ));.} {1 {expres
1b50: 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65 64  sions prohibited
1b60: 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20   in PRIMARY KEY 
1b70: 61 6e 64 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  and UNIQUE const
1b80: 72 61 69 6e 74 73 7d 7d 0a 64 6f 5f 63 61 74 63  raints}}.do_catc
1b90: 68 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65  hsql_test indexe
1ba0: 78 70 72 31 2d 33 33 31 20 7b 0a 20 20 43 52 45  xpr1-331 {.  CRE
1bb0: 41 54 45 20 54 41 42 4c 45 20 65 31 28 78 2c 79  ATE TABLE e1(x,y
1bc0: 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 79 2c 73  ,PRIMARY KEY(y,s
1bd0: 75 62 73 74 72 28 78 2c 31 2c 35 29 29 29 20 57  ubstr(x,1,5))) W
1be0: 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 7d 20  ITHOUT ROWID;.} 
1bf0: 7b 31 20 7b 65 78 70 72 65 73 73 69 6f 6e 73 20  {1 {expressions 
1c00: 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 50 52  prohibited in PR
1c10: 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 55 4e  IMARY KEY and UN
1c20: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73  IQUE constraints
1c30: 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  }}.do_catchsql_t
1c40: 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 33  est indexexpr1-3
1c50: 34 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  40 {.  CREATE TA
1c60: 42 4c 45 20 65 31 28 78 2c 79 2c 46 4f 52 45 49  BLE e1(x,y,FOREI
1c70: 47 4e 20 4b 45 59 28 73 75 62 73 74 72 28 79 2c  GN KEY(substr(y,
1c80: 31 2c 35 29 29 20 52 45 46 45 52 45 4e 43 45 53  1,5)) REFERENCES
1c90: 20 74 31 29 3b 0a 7d 20 7b 31 20 7b 6e 65 61 72   t1);.} {1 {near
1ca0: 20 22 28 22 3a 20 73 79 6e 74 61 78 20 65 72 72   "(": syntax err
1cb0: 6f 72 7d 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  or}}..do_execsql
1cc0: 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70 72 31  _test indexexpr1
1cd0: 2d 34 30 30 20 7b 0a 20 20 43 52 45 41 54 45 20  -400 {.  CREATE 
1ce0: 54 41 42 4c 45 20 74 33 28 61 2c 62 2c 63 29 3b  TABLE t3(a,b,c);
1cf0: 0a 20 20 57 49 54 48 20 52 45 43 55 52 53 49 56  .  WITH RECURSIV
1d00: 45 20 63 28 78 29 20 41 53 20 28 56 41 4c 55 45  E c(x) AS (VALUE
1d10: 53 28 31 29 20 55 4e 49 4f 4e 20 53 45 4c 45 43  S(1) UNION SELEC
1d20: 54 20 78 2b 31 20 46 52 4f 4d 20 63 20 57 48 45  T x+1 FROM c WHE
1d30: 52 45 20 78 3c 33 30 29 0a 20 20 49 4e 53 45 52  RE x<30).  INSER
1d40: 54 20 49 4e 54 4f 20 74 33 28 61 2c 62 2c 63 29  T INTO t3(a,b,c)
1d50: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 2c 20 70  .    SELECT x, p
1d60: 72 69 6e 74 66 28 27 61 62 25 30 34 78 79 7a 27  rintf('ab%04xyz'
1d70: 2c 78 29 2c 20 72 61 6e 64 6f 6d 28 29 20 46 52  ,x), random() FR
1d80: 4f 4d 20 63 3b 0a 20 20 43 52 45 41 54 45 20 55  OM c;.  CREATE U
1d90: 4e 49 51 55 45 20 49 4e 44 45 58 20 74 33 61 62  NIQUE INDEX t3ab
1da0: 63 20 4f 4e 20 74 33 28 43 41 53 54 28 61 20 41  c ON t3(CAST(a A
1db0: 53 20 74 65 78 74 29 2c 20 62 2c 20 73 75 62 73  S text), b, subs
1dc0: 74 72 28 63 2c 31 2c 33 29 29 3b 0a 20 20 53 45  tr(c,1,3));.  SE
1dd0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 33 20 57  LECT a FROM t3 W
1de0: 48 45 52 45 20 43 41 53 54 28 61 20 41 53 20 74  HERE CAST(a AS t
1df0: 65 78 74 29 3c 3d 27 31 30 27 20 4f 52 44 45 52  ext)<='10' ORDER
1e00: 20 42 59 20 2b 61 3b 0a 20 20 50 52 41 47 4d 41   BY +a;.  PRAGMA
1e10: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
1e20: 3b 0a 7d 20 7b 31 20 31 30 20 6f 6b 7d 0a 64 6f  ;.} {1 10 ok}.do
1e30: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 69  _catchsql_test i
1e40: 6e 64 65 78 65 78 70 72 31 2d 34 31 30 20 7b 0a  ndexexpr1-410 {.
1e50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
1e60: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1e70: 33 20 57 48 45 52 45 20 72 6f 77 69 64 3d 31 30  3 WHERE rowid=10
1e80: 3b 0a 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20 63  ;.} {1 {UNIQUE c
1e90: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
1ea0: 3a 20 69 6e 64 65 78 20 27 74 33 61 62 63 27 7d  : index 't3abc'}
1eb0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
1ec0: 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 35 30  st indexexpr1-50
1ed0: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
1ee0: 4c 45 20 74 35 28 61 29 3b 0a 20 20 43 52 45 41  LE t5(a);.  CREA
1ef0: 54 45 20 54 41 42 4c 45 20 63 6e 74 28 78 29 3b  TE TABLE cnt(x);
1f00: 0a 20 20 57 49 54 48 20 52 45 43 55 52 53 49 56  .  WITH RECURSIV
1f10: 45 0a 20 20 20 20 63 28 78 29 20 41 53 20 28 56  E.    c(x) AS (V
1f20: 41 4c 55 45 53 28 31 29 20 55 4e 49 4f 4e 20 41  ALUES(1) UNION A
1f30: 4c 4c 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52  LL SELECT x+1 FR
1f40: 4f 4d 20 63 20 57 48 45 52 45 20 78 3c 35 29 0a  OM c WHERE x<5).
1f50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 6e    INSERT INTO cn
1f60: 74 28 78 29 20 53 45 4c 45 43 54 20 78 20 46 52  t(x) SELECT x FR
1f70: 4f 4d 20 63 3b 0a 20 20 49 4e 53 45 52 54 20 49  OM c;.  INSERT I
1f80: 4e 54 4f 20 74 35 28 61 29 20 53 45 4c 45 43 54  NTO t5(a) SELECT
1f90: 20 70 72 69 6e 74 66 28 27 61 62 63 25 30 33 64   printf('abc%03d
1fa0: 78 79 7a 27 2c 78 29 20 46 52 4f 4d 20 63 6e 74  xyz',x) FROM cnt
1fb0: 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  ;.  CREATE INDEX
1fc0: 20 74 35 61 78 20 4f 4e 20 74 35 28 20 73 75 62   t5ax ON t5( sub
1fd0: 73 74 72 28 61 2c 34 2c 33 29 20 29 3b 0a 7d 20  str(a,4,3) );.} 
1fe0: 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  {}.do_execsql_te
1ff0: 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d 35 31  st indexexpr1-51
2000: 30 20 7b 0a 20 20 2d 2d 20 54 68 65 20 75 73 65  0 {.  -- The use
2010: 20 6f 66 20 74 68 65 20 22 6b 22 20 61 6c 69 61   of the "k" alia
2020: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
2030: 6c 61 75 73 65 20 69 73 20 74 65 63 68 6e 69 63  lause is technic
2040: 61 6c 6c 79 0a 20 20 2d 2d 20 69 6c 6c 65 67 61  ally.  -- illega
2050: 6c 2c 20 62 75 74 20 53 51 4c 69 74 65 20 61 6c  l, but SQLite al
2060: 6c 6f 77 73 20 69 74 20 66 6f 72 20 68 69 73 74  lows it for hist
2070: 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 20  orical reasons. 
2080: 20 49 6e 20 74 68 69 73 0a 20 20 2d 2d 20 74 65   In this.  -- te
2090: 73 74 20 61 6e 64 20 74 68 65 20 6e 65 78 74 2c  st and the next,
20a0: 20 76 65 72 69 66 79 20 74 68 61 74 20 22 6b 22   verify that "k"
20b0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 62 79 20   can be used by 
20c0: 74 68 65 20 74 35 61 78 20 69 6e 64 65 78 0a 20  the t5ax index. 
20d0: 20 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 61   SELECT substr(a
20e0: 2c 34 2c 33 29 20 41 53 20 6b 20 46 52 4f 4d 20  ,4,3) AS k FROM 
20f0: 63 6e 74 2c 20 74 35 20 57 48 45 52 45 20 6b 3d  cnt, t5 WHERE k=
2100: 70 72 69 6e 74 66 28 27 25 30 33 64 27 2c 78 29  printf('%03d',x)
2110: 3b 0a 7d 20 7b 30 30 31 20 30 30 32 20 30 30 33  ;.} {001 002 003
2120: 20 30 30 34 20 30 30 35 7d 0a 64 6f 5f 65 78 65   004 005}.do_exe
2130: 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65  csql_test indexe
2140: 78 70 72 31 2d 35 31 30 65 71 70 20 7b 0a 20 20  xpr1-510eqp {.  
2150: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
2160: 41 4e 0a 20 20 53 45 4c 45 43 54 20 73 75 62 73  AN.  SELECT subs
2170: 74 72 28 61 2c 34 2c 33 29 20 41 53 20 6b 20 46  tr(a,4,3) AS k F
2180: 52 4f 4d 20 63 6e 74 2c 20 74 35 20 57 48 45 52  ROM cnt, t5 WHER
2190: 45 20 6b 3d 70 72 69 6e 74 66 28 27 25 30 33 64  E k=printf('%03d
21a0: 27 2c 78 29 3b 0a 7d 20 7b 2f 55 53 49 4e 47 20  ',x);.} {/USING 
21b0: 49 4e 44 45 58 20 74 35 61 78 2f 7d 0a 0a 23 20  INDEX t5ax/}..# 
21c0: 53 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 61 6e 20  Skip-scan on an 
21d0: 69 6e 64 65 78 65 64 20 65 78 70 72 65 73 73 69  indexed expressi
21e0: 6f 6e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  on.#.do_execsql_
21f0: 74 65 73 74 20 69 6e 64 65 78 65 78 70 72 31 2d  test indexexpr1-
2200: 36 30 30 20 7b 0a 20 20 44 52 4f 50 20 54 41 42  600 {.  DROP TAB
2210: 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 34 3b  LE IF EXISTS t4;
2220: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
2230: 74 34 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 2c 67  t4(a,b,c,d,e,f,g
2240: 2c 68 2c 69 29 3b 0a 20 20 43 52 45 41 54 45 20  ,h,i);.  CREATE 
2250: 49 4e 44 45 58 20 74 34 61 6c 6c 20 4f 4e 20 74  INDEX t4all ON t
2260: 34 28 61 2c 62 2c 63 3c 64 2c 65 2c 66 2c 69 2c  4(a,b,c<d,e,f,i,
2270: 68 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  h);.  INSERT INT
2280: 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c 32 2c  O t4 VALUES(1,2,
2290: 33 2c 34 2c 35 2c 36 2c 37 2c 38 2c 39 29 3b 0a  3,4,5,6,7,8,9);.
22a0: 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 44 45 4c    ANALYZE;.  DEL
22b0: 45 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ETE FROM sqlite_
22c0: 73 74 61 74 31 3b 0a 20 20 49 4e 53 45 52 54 20  stat1;.  INSERT 
22d0: 49 4e 54 4f 20 73 71 6c 69 74 65 5f 73 74 61 74  INTO sqlite_stat
22e0: 31 0a 20 20 20 20 56 41 4c 55 45 53 28 27 74 34  1.    VALUES('t4
22f0: 27 2c 27 74 34 61 6c 6c 27 2c 27 36 30 30 30 30  ','t4all','60000
2300: 30 20 31 36 30 30 30 30 20 34 30 30 30 30 20 31  0 160000 40000 1
2310: 30 30 30 30 20 32 30 30 30 20 36 30 30 20 31 30  0000 2000 600 10
2320: 30 20 34 30 20 31 30 27 29 3b 0a 20 20 41 4e 41  0 40 10');.  ANA
2330: 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  LYZE sqlite_mast
2340: 65 72 3b 0a 20 20 53 45 4c 45 43 54 20 69 20 46  er;.  SELECT i F
2350: 52 4f 4d 20 74 34 20 57 48 45 52 45 20 65 3d 35  ROM t4 WHERE e=5
2360: 3b 0a 7d 20 7b 39 7d 0a 0a 23 20 49 6e 64 65 78  ;.} {9}..# Index
2370: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  ed expressions o
2380: 6e 20 62 6f 74 68 20 73 69 64 65 73 20 6f 66 20  n both sides of 
2390: 61 6e 20 3d 3d 20 69 6e 20 61 20 57 48 45 52 45  an == in a WHERE
23a0: 20 63 6c 61 75 73 65 2e 0a 23 0a 64 6f 5f 65 78   clause..#.do_ex
23b0: 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78  ecsql_test index
23c0: 65 78 70 72 31 2d 37 30 30 20 7b 0a 20 20 44 52  expr1-700 {.  DR
23d0: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
23e0: 54 53 20 74 37 3b 0a 20 20 43 52 45 41 54 45 20  TS t7;.  CREATE 
23f0: 54 41 42 4c 45 20 74 37 28 61 2c 62 2c 63 29 3b  TABLE t7(a,b,c);
2400: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
2410: 37 28 61 2c 62 2c 63 29 20 56 41 4c 55 45 53 28  7(a,b,c) VALUES(
2420: 31 2c 32 2c 32 29 2c 28 27 61 62 63 27 2c 27 64  1,2,2),('abc','d
2430: 65 66 27 2c 27 64 65 66 27 29 2c 28 34 2c 35 2c  ef','def'),(4,5,
2440: 36 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  6);.  CREATE IND
2450: 45 58 20 74 37 62 20 4f 4e 20 74 37 28 2b 62 29  EX t7b ON t7(+b)
2460: 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  ;.  CREATE INDEX
2470: 20 74 37 63 20 4f 4e 20 74 37 28 2b 63 29 3b 0a   t7c ON t7(+c);.
2480: 20 20 53 45 4c 45 43 54 20 2a 2c 20 27 7c 27 20    SELECT *, '|' 
2490: 46 52 4f 4d 20 74 37 20 57 48 45 52 45 20 2b 62  FROM t7 WHERE +b
24a0: 3d 2b 63 20 4f 52 44 45 52 20 42 59 20 2b 61 3b  =+c ORDER BY +a;
24b0: 0a 7d 20 7b 31 20 32 20 32 20 7c 20 61 62 63 20  .} {1 2 2 | abc 
24c0: 64 65 66 20 64 65 66 20 7c 7d 0a 64 6f 5f 65 78  def def |}.do_ex
24d0: 65 63 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78  ecsql_test index
24e0: 65 78 70 72 31 2d 37 31 30 20 7b 0a 20 20 43 52  expr1-710 {.  CR
24f0: 45 41 54 45 20 54 41 42 4c 45 20 74 37 31 28 61  EATE TABLE t71(a
2500: 2c 62 2c 63 29 3b 0a 20 20 43 52 45 41 54 45 20  ,b,c);.  CREATE 
2510: 49 4e 44 45 58 20 74 37 31 62 63 20 4f 4e 20 74  INDEX t71bc ON t
2520: 37 31 28 62 2b 63 29 3b 0a 20 20 43 52 45 41 54  71(b+c);.  CREAT
2530: 45 20 54 41 42 4c 45 20 74 37 32 28 78 2c 79 2c  E TABLE t72(x,y,
2540: 7a 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  z);.  CREATE IND
2550: 45 58 20 74 37 32 79 7a 20 4f 4e 20 74 37 32 28  EX t72yz ON t72(
2560: 79 2b 7a 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  y+z);.  INSERT I
2570: 4e 54 4f 20 74 37 31 28 61 2c 62 2c 63 29 20 56  NTO t71(a,b,c) V
2580: 41 4c 55 45 53 28 31 2c 31 31 2c 32 29 2c 28 32  ALUES(1,11,2),(2
2590: 2c 37 2c 31 35 29 2c 28 33 2c 35 2c 34 29 3b 0a  ,7,15),(3,5,4);.
25a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37    INSERT INTO t7
25b0: 32 28 78 2c 79 2c 7a 29 20 56 41 4c 55 45 53 28  2(x,y,z) VALUES(
25c0: 31 2c 31 30 2c 33 29 2c 28 32 2c 38 2c 31 34 29  1,10,3),(2,8,14)
25d0: 2c 28 33 2c 39 2c 39 29 3b 0a 20 20 53 45 4c 45  ,(3,9,9);.  SELE
25e0: 43 54 20 61 2c 20 78 2c 20 27 7c 27 20 46 52 4f  CT a, x, '|' FRO
25f0: 4d 20 74 37 31 2c 20 74 37 32 0a 20 20 20 57 48  M t71, t72.   WH
2600: 45 52 45 20 62 2b 63 3d 79 2b 7a 0a 20 20 4f 52  ERE b+c=y+z.  OR
2610: 44 45 52 20 42 59 20 2b 61 2c 20 2b 78 3b 0a 7d  DER BY +a, +x;.}
2620: 20 7b 31 20 31 20 7c 20 32 20 32 20 7c 7d 0a 0a   {1 1 | 2 2 |}..
2630: 23 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  # Collating sequ
2640: 65 6e 63 65 73 20 6f 6e 20 69 6e 64 65 78 65 73  ences on indexes
2650: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a   of expressions.
2660: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
2670: 74 20 69 6e 64 65 78 65 78 70 72 31 2d 38 30 30  t indexexpr1-800
2680: 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20   {.  DROP TABLE 
2690: 49 46 20 45 58 49 53 54 53 20 74 38 3b 0a 20 20  IF EXISTS t8;.  
26a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 38 28  CREATE TABLE t8(
26b0: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
26c0: 59 20 4b 45 59 2c 20 62 20 54 45 58 54 29 3b 0a  Y KEY, b TEXT);.
26d0: 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20    CREATE UNIQUE 
26e0: 49 4e 44 45 58 20 74 38 62 78 20 4f 4e 20 74 38  INDEX t8bx ON t8
26f0: 28 73 75 62 73 74 72 28 62 2c 32 2c 34 29 20 43  (substr(b,2,4) C
2700: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a  OLLATE nocase);.
2710: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38    INSERT INTO t8
2720: 28 61 2c 62 29 20 56 41 4c 55 45 53 28 31 2c 27  (a,b) VALUES(1,'
2730: 41 6c 69 63 65 27 29 2c 28 32 2c 27 42 61 72 74  Alice'),(2,'Bart
2740: 68 6f 6c 65 6d 65 77 27 29 2c 28 33 2c 27 43 79  holemew'),(3,'Cy
2750: 6e 74 68 69 61 27 29 3b 0a 20 20 53 45 4c 45 43  nthia');.  SELEC
2760: 54 20 2a 20 46 52 4f 4d 20 74 38 20 57 48 45 52  T * FROM t8 WHER
2770: 45 20 73 75 62 73 74 72 28 62 2c 32 2c 34 29 3d  E substr(b,2,4)=
2780: 27 41 52 54 48 27 20 43 4f 4c 4c 41 54 45 20 6e  'ARTH' COLLATE n
2790: 6f 63 61 73 65 3b 0a 7d 20 7b 32 20 42 61 72 74  ocase;.} {2 Bart
27a0: 68 6f 6c 65 6d 65 77 7d 0a 64 6f 5f 63 61 74 63  holemew}.do_catc
27b0: 68 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65  hsql_test indexe
27c0: 78 70 72 31 2d 38 31 30 20 7b 0a 20 20 49 4e 53  xpr1-810 {.  INS
27d0: 45 52 54 20 49 4e 54 4f 20 74 38 28 61 2c 62 29  ERT INTO t8(a,b)
27e0: 20 56 41 4c 55 45 53 28 34 2c 27 42 41 52 54 48   VALUES(4,'BARTH
27f0: 4d 45 52 45 27 29 3b 0a 7d 20 7b 31 20 7b 55 4e  MERE');.} {1 {UN
2800: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
2810: 66 61 69 6c 65 64 3a 20 69 6e 64 65 78 20 27 74  failed: index 't
2820: 38 62 78 27 7d 7d 0a 64 6f 5f 63 61 74 63 68 73  8bx'}}.do_catchs
2830: 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70  ql_test indexexp
2840: 72 31 2d 38 32 30 20 7b 0a 20 20 44 52 4f 50 20  r1-820 {.  DROP 
2850: 49 4e 44 45 58 20 74 38 62 78 3b 0a 20 20 43 52  INDEX t8bx;.  CR
2860: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
2870: 58 20 74 38 62 78 20 4f 4e 20 74 38 28 73 75 62  X t8bx ON t8(sub
2880: 73 74 72 28 62 2c 32 2c 34 29 20 43 4f 4c 4c 41  str(b,2,4) COLLA
2890: 54 45 20 72 74 72 69 6d 29 3b 0a 20 20 49 4e 53  TE rtrim);.  INS
28a0: 45 52 54 20 49 4e 54 4f 20 74 38 28 61 2c 62 29  ERT INTO t8(a,b)
28b0: 20 56 41 4c 55 45 53 28 34 2c 27 42 41 52 54 48   VALUES(4,'BARTH
28c0: 4d 45 52 45 27 29 3b 0a 7d 20 7b 30 20 7b 7d 7d  MERE');.} {0 {}}
28d0: 0a 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 50  ..# Check that P
28e0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
28f0: 63 68 65 63 6b 20 77 6f 72 6b 73 20 63 6f 72 72  check works corr
2900: 65 63 74 6c 79 20 6f 6e 20 61 0a 23 20 55 4e 49  ectly on a.# UNI
2910: 51 55 45 20 69 6e 64 65 78 20 74 68 61 74 20 69  QUE index that i
2920: 6e 63 6c 75 64 65 73 20 72 6f 77 69 64 20 61 6e  ncludes rowid an
2930: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 74 65 72  d expression ter
2940: 6d 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ms..#.do_execsql
2950: 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70 72 31  _test indexexpr1
2960: 2d 39 30 30 20 7b 0a 20 20 43 52 45 41 54 45 20  -900 {.  CREATE 
2970: 54 41 42 4c 45 20 74 39 28 61 2c 62 2c 63 2c 64  TABLE t9(a,b,c,d
2980: 29 3b 0a 20 20 43 52 45 41 54 45 20 55 4e 49 51  );.  CREATE UNIQ
2990: 55 45 20 49 4e 44 45 58 20 74 39 78 31 20 4f 4e  UE INDEX t9x1 ON
29a0: 20 74 39 28 63 2c 61 62 73 28 64 29 2c 62 29 3b   t9(c,abs(d),b);
29b0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
29c0: 39 28 72 6f 77 69 64 2c 61 2c 62 2c 63 2c 64 29  9(rowid,a,b,c,d)
29d0: 20 56 41 4c 55 45 53 28 31 2c 32 2c 33 2c 34 2c   VALUES(1,2,3,4,
29e0: 35 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  5);.  INSERT INT
29f0: 4f 20 74 39 28 72 6f 77 69 64 2c 61 2c 62 2c 63  O t9(rowid,a,b,c
2a00: 2c 64 29 20 56 41 4c 55 45 53 28 32 2c 4e 55 4c  ,d) VALUES(2,NUL
2a10: 4c 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 4e 55 4c 4c  L,NULL,NULL,NULL
2a20: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
2a30: 20 74 39 28 72 6f 77 69 64 2c 61 2c 62 2c 63 2c   t9(rowid,a,b,c,
2a40: 64 29 20 56 41 4c 55 45 53 28 33 2c 4e 55 4c 4c  d) VALUES(3,NULL
2a50: 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29  ,NULL,NULL,NULL)
2a60: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2a70: 74 39 28 72 6f 77 69 64 2c 61 2c 62 2c 63 2c 64  t9(rowid,a,b,c,d
2a80: 29 20 56 41 4c 55 45 53 28 34 2c 35 2c 36 2c 37  ) VALUES(4,5,6,7
2a90: 2c 38 29 3b 0a 20 20 50 52 41 47 4d 41 20 69 6e  ,8);.  PRAGMA in
2aa0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 7d  tegrity_check;.}
2ab0: 20 7b 6f 6b 7d 0a 64 6f 5f 63 61 74 63 68 73 71   {ok}.do_catchsq
2ac0: 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70 72  l_test indexexpr
2ad0: 31 2d 39 31 30 20 7b 0a 20 20 49 4e 53 45 52 54  1-910 {.  INSERT
2ae0: 20 49 4e 54 4f 20 74 39 28 61 2c 62 2c 63 2c 64   INTO t9(a,b,c,d
2af0: 29 20 56 41 4c 55 45 53 28 35 2c 36 2c 37 2c 2d  ) VALUES(5,6,7,-
2b00: 38 29 3b 0a 7d 20 7b 31 20 7b 55 4e 49 51 55 45  8);.} {1 {UNIQUE
2b10: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
2b20: 65 64 3a 20 69 6e 64 65 78 20 27 74 39 78 31 27  ed: index 't9x1'
2b30: 7d 7d 0a 0a 23 20 54 65 73 74 20 63 61 73 65 73  }}..# Test cases
2b40: 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20 61 20   derived from a 
2b50: 4e 45 56 45 52 28 29 20 6d 61 72 6f 20 66 61 69  NEVER() maro fai
2b60: 6c 75 72 65 20 64 69 73 63 6f 76 65 72 65 64 20  lure discovered 
2b70: 62 79 0a 23 20 4a 6f 6e 61 74 68 61 6e 20 4d 65  by.# Jonathan Me
2b80: 74 7a 6d 61 6e 20 75 73 69 6e 67 20 41 46 4c 0a  tzman using AFL.
2b90: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
2ba0: 74 20 69 6e 64 65 78 65 78 70 72 31 2d 31 30 30  t indexexpr1-100
2bb0: 30 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  0 {.  DROP TABLE
2bc0: 20 49 46 20 45 58 49 53 54 53 20 74 30 3b 0a 20   IF EXISTS t0;. 
2bd0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 30   CREATE TABLE t0
2be0: 28 61 2c 62 2c 74 29 3b 0a 20 20 43 52 45 41 54  (a,b,t);.  CREAT
2bf0: 45 20 49 4e 44 45 58 20 69 20 4f 4e 20 74 30 28  E INDEX i ON t0(
2c00: 61 20 69 6e 28 30 2c 31 29 29 3b 0a 20 20 49 4e  a in(0,1));.  IN
2c10: 53 45 52 54 20 49 4e 54 4f 20 74 30 20 56 41 4c  SERT INTO t0 VAL
2c20: 55 45 53 28 30 2c 31 2c 32 29 2c 28 32 2c 33 2c  UES(0,1,2),(2,3,
2c30: 34 29 2c 28 35 2c 36 2c 37 29 3b 0a 20 20 55 50  4),(5,6,7);.  UP
2c40: 44 41 54 45 20 74 30 20 53 45 54 20 62 3d 39 39  DATE t0 SET b=99
2c50: 20 57 48 45 52 45 20 28 61 20 69 6e 28 30 2c 31   WHERE (a in(0,1
2c60: 29 29 3d 30 3b 0a 20 20 53 45 4c 45 43 54 20 2a  ))=0;.  SELECT *
2c70: 2c 20 27 7c 27 20 46 52 4f 4d 20 74 30 20 4f 52  , '|' FROM t0 OR
2c80: 44 45 52 20 42 59 20 2b 61 3b 0a 7d 20 7b 30 20  DER BY +a;.} {0 
2c90: 31 20 32 20 7c 20 32 20 39 39 20 34 20 7c 20 35  1 2 | 2 99 4 | 5
2ca0: 20 39 39 20 37 20 7c 7d 0a 64 6f 5f 65 78 65 63   99 7 |}.do_exec
2cb0: 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78  sql_test indexex
2cc0: 70 72 31 2d 31 30 31 30 20 7b 0a 20 20 55 50 44  pr1-1010 {.  UPD
2cd0: 41 54 45 20 74 30 20 53 45 54 20 62 3d 38 38 20  ATE t0 SET b=88 
2ce0: 57 48 45 52 45 20 28 61 20 69 6e 28 30 2c 31 29  WHERE (a in(0,1)
2cf0: 29 3d 31 3b 0a 20 20 53 45 4c 45 43 54 20 2a 2c  )=1;.  SELECT *,
2d00: 20 27 7c 27 20 46 52 4f 4d 20 74 30 20 4f 52 44   '|' FROM t0 ORD
2d10: 45 52 20 42 59 20 2b 61 3b 0a 7d 20 7b 30 20 38  ER BY +a;.} {0 8
2d20: 38 20 32 20 7c 20 32 20 39 39 20 34 20 7c 20 35  8 2 | 2 99 4 | 5
2d30: 20 39 39 20 37 20 7c 7d 0a 0a 23 20 32 30 31 36   99 7 |}..# 2016
2d40: 2d 31 30 2d 31 30 0a 23 20 4d 61 6b 65 20 73 75  -10-10.# Make su
2d50: 72 65 20 69 6e 64 65 78 65 73 20 6f 6e 20 65 78  re indexes on ex
2d60: 70 72 65 73 73 69 6f 6e 73 20 73 6b 69 70 20 6f  pressions skip o
2d70: 76 65 72 20 69 6e 69 74 69 61 6c 20 4e 55 4c 4c  ver initial NULL
2d80: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 0a 23   values in the.#
2d90: 20 69 6e 64 65 78 20 61 73 20 74 68 65 79 20 61   index as they a
2da0: 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20 64 6f  re suppose to do
2db0: 2e 0a 23 20 54 69 63 6b 65 74 20 68 74 74 70 73  ..# Ticket https
2dc0: 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
2dd0: 67 2f 73 72 63 2f 74 6b 74 76 69 65 77 2f 34 62  g/src/tktview/4b
2de0: 61 61 34 36 34 39 31 32 31 32 39 34 37 0a 23 0a  aa46491212947.#.
2df0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2e00: 69 6e 64 65 78 65 78 70 72 31 2d 31 31 30 30 20  indexexpr1-1100 
2e10: 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49  {.  DROP TABLE I
2e20: 46 20 45 58 49 53 54 53 20 74 31 3b 0a 20 20 43  F EXISTS t1;.  C
2e30: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
2e40: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
2e50: 20 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 29   t1 VALUES(NULL)
2e60: 2c 28 31 29 3b 0a 20 20 53 45 4c 45 43 54 20 27  ,(1);.  SELECT '
2e70: 31 3a 27 2c 20 74 79 70 65 6f 66 28 61 29 2c 20  1:', typeof(a), 
2e80: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
2e90: 61 3c 31 30 3b 0a 20 20 53 45 4c 45 43 54 20 27  a<10;.  SELECT '
2ea0: 32 3a 27 2c 20 74 79 70 65 6f 66 28 61 29 2c 20  2:', typeof(a), 
2eb0: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
2ec0: 61 2b 30 3c 31 30 3b 0a 20 20 43 52 45 41 54 45  a+0<10;.  CREATE
2ed0: 20 49 4e 44 45 58 20 74 31 78 31 20 4f 4e 20 74   INDEX t1x1 ON t
2ee0: 31 28 61 29 3b 0a 20 20 43 52 45 41 54 45 20 49  1(a);.  CREATE I
2ef0: 4e 44 45 58 20 74 31 78 32 20 4f 4e 20 74 31 28  NDEX t1x2 ON t1(
2f00: 61 2b 30 29 3b 0a 20 20 53 45 4c 45 43 54 20 27  a+0);.  SELECT '
2f10: 33 3a 27 2c 20 74 79 70 65 6f 66 28 61 29 2c 20  3:', typeof(a), 
2f20: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
2f30: 61 3c 31 30 3b 0a 20 20 53 45 4c 45 43 54 20 27  a<10;.  SELECT '
2f40: 34 3a 27 2c 20 74 79 70 65 6f 66 28 61 29 2c 20  4:', typeof(a), 
2f50: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
2f60: 61 2b 30 3c 31 30 3b 0a 7d 20 7b 31 3a 20 69 6e  a+0<10;.} {1: in
2f70: 74 65 67 65 72 20 31 20 32 3a 20 69 6e 74 65 67  teger 1 2: integ
2f80: 65 72 20 31 20 33 3a 20 69 6e 74 65 67 65 72 20  er 1 3: integer 
2f90: 31 20 34 3a 20 69 6e 74 65 67 65 72 20 31 7d 0a  1 4: integer 1}.
2fa0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2fb0: 20 69 6e 64 65 78 65 78 70 72 31 2d 31 32 30 30   indexexpr1-1200
2fc0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
2fd0: 45 20 74 31 30 28 61 20 69 6e 74 2c 20 62 20 69  E t10(a int, b i
2fe0: 6e 74 2c 20 63 20 69 6e 74 2c 20 64 20 69 6e 74  nt, c int, d int
2ff0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
3000: 20 74 31 30 28 61 2c 20 62 2c 20 63 2c 20 64 29   t10(a, b, c, d)
3010: 20 56 41 4c 55 45 53 28 30 2c 20 30 2c 20 32 2c   VALUES(0, 0, 2,
3020: 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   2);.  INSERT IN
3030: 54 4f 20 74 31 30 28 61 2c 20 62 2c 20 63 2c 20  TO t10(a, b, c, 
3040: 64 29 20 56 41 4c 55 45 53 28 30 2c 20 30 2c 20  d) VALUES(0, 0, 
3050: 30 2c 20 30 29 3b 0a 20 20 49 4e 53 45 52 54 20  0, 0);.  INSERT 
3060: 49 4e 54 4f 20 74 31 30 28 61 2c 20 62 2c 20 63  INTO t10(a, b, c
3070: 2c 20 64 29 20 56 41 4c 55 45 53 28 30 2c 20 30  , d) VALUES(0, 0
3080: 2c 20 31 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52  , 1, 1);.  INSER
3090: 54 20 49 4e 54 4f 20 74 31 30 28 61 2c 20 62 2c  T INTO t10(a, b,
30a0: 20 63 2c 20 64 29 20 56 41 4c 55 45 53 28 31 2c   c, d) VALUES(1,
30b0: 20 31 2c 20 31 2c 20 31 29 3b 0a 20 20 49 4e 53   1, 1, 1);.  INS
30c0: 45 52 54 20 49 4e 54 4f 20 74 31 30 28 61 2c 20  ERT INTO t10(a, 
30d0: 62 2c 20 63 2c 20 64 29 20 56 41 4c 55 45 53 28  b, c, d) VALUES(
30e0: 31 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 49  1, 1, 0, 0);.  I
30f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 30 28 61  NSERT INTO t10(a
3100: 2c 20 62 2c 20 63 2c 20 64 29 20 56 41 4c 55 45  , b, c, d) VALUE
3110: 53 28 32 2c 20 32 2c 20 30 2c 20 30 29 3b 0a 0a  S(2, 2, 0, 0);..
3120: 20 20 53 45 4c 45 43 54 20 61 2b 62 2c 20 63 2b    SELECT a+b, c+
3130: 64 20 46 52 4f 4d 20 74 31 30 20 4f 52 44 45 52  d FROM t10 ORDER
3140: 20 42 59 20 61 2b 62 2c 20 63 2b 64 3b 0a 7d 20   BY a+b, c+d;.} 
3150: 7b 0a 20 20 30 20 30 20 30 20 32 20 30 20 34 20  {.  0 0 0 2 0 4 
3160: 32 20 30 20 32 20 32 20 34 20 30 0a 7d 0a 64 6f  2 0 2 2 4 0.}.do
3170: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 69 6e  _execsql_test in
3180: 64 65 78 65 78 70 72 31 2d 31 32 30 30 2e 31 20  dexexpr1-1200.1 
3190: 7b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  {.  CREATE INDEX
31a0: 20 74 31 30 5f 61 62 20 4f 4e 20 74 31 30 28 61   t10_ab ON t10(a
31b0: 2b 62 29 3b 0a 7d 0a 64 6f 5f 65 78 65 63 73 71  +b);.}.do_execsq
31c0: 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70 72  l_test indexexpr
31d0: 31 2d 31 32 30 30 2e 32 20 7b 0a 20 20 53 45 4c  1-1200.2 {.  SEL
31e0: 45 43 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f  ECT a+b, c+d FRO
31f0: 4d 20 74 31 30 20 4f 52 44 45 52 20 42 59 20 61  M t10 ORDER BY a
3200: 2b 62 2c 20 63 2b 64 3b 0a 7d 20 7b 0a 20 20 30  +b, c+d;.} {.  0
3210: 20 30 20 30 20 32 20 30 20 34 20 32 20 30 20 32   0 0 2 0 4 2 0 2
3220: 20 32 20 34 20 30 0a 7d 0a 64 6f 5f 65 78 65 63   2 4 0.}.do_exec
3230: 73 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78  sql_test indexex
3240: 70 72 31 2d 31 32 30 30 2e 33 20 7b 0a 20 20 43  pr1-1200.3 {.  C
3250: 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 30 5f  REATE INDEX t10_
3260: 61 62 63 64 20 4f 4e 20 74 31 30 28 61 2b 62 2c  abcd ON t10(a+b,
3270: 63 2b 64 29 3b 0a 7d 0a 64 6f 5f 65 78 65 63 73  c+d);.}.do_execs
3280: 71 6c 5f 74 65 73 74 20 69 6e 64 65 78 65 78 70  ql_test indexexp
3290: 72 31 2d 31 32 30 30 2e 34 20 7b 0a 20 20 53 45  r1-1200.4 {.  SE
32a0: 4c 45 43 54 20 61 2b 62 2c 20 63 2b 64 20 46 52  LECT a+b, c+d FR
32b0: 4f 4d 20 74 31 30 20 4f 52 44 45 52 20 42 59 20  OM t10 ORDER BY 
32c0: 61 2b 62 2c 20 63 2b 64 3b 0a 7d 20 7b 0a 20 20  a+b, c+d;.} {.  
32d0: 30 20 30 20 30 20 32 20 30 20 34 20 32 20 30 20  0 0 0 2 0 4 2 0 
32e0: 32 20 32 20 34 20 30 0a 7d 0a 0a 66 69 6e 69 73  2 2 4 0.}..finis
32f0: 68 5f 74 65 73 74 0a                             h_test.