/ Hex Artifact Content
Login

Artifact 060d238b7e5639a7c5630cb5e63e311b44efef2b:


0000: 23 20 32 30 31 36 20 4a 75 6e 65 20 31 37 0a 23  # 2016 June 17.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c 65  ****.# This file
0170: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72   implements regr
0180: 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72  ession tests for
0190: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e   SQLite library.
01a0: 20 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66    The.# focus of
01b0: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 74 65   this file is te
01c0: 73 74 69 6e 67 20 74 68 65 20 53 45 4c 45 43 54  sting the SELECT
01d0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 0a 73   statement..#..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 73 65 74 20  /tester.tcl.set 
0220: 3a 3a 74 65 73 74 70 72 65 66 69 78 20 72 6f 77  ::testprefix row
0230: 76 61 6c 75 65 32 0a 0a 64 6f 5f 65 78 65 63 73  value2..do_execs
0240: 71 6c 5f 74 65 73 74 20 31 2e 30 20 7b 0a 20 20  ql_test 1.0 {.  
0250: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0260: 61 2c 20 62 2c 20 63 29 3b 0a 20 20 49 4e 53 45  a, b, c);.  INSE
0270: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0280: 53 28 30 2c 20 30 2c 20 30 29 3b 0a 20 20 49 4e  S(0, 0, 0);.  IN
0290: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
02a0: 55 45 53 28 30 2c 20 31 2c 20 31 29 3b 0a 20 20  UES(0, 1, 1);.  
02b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
02c0: 41 4c 55 45 53 28 31 2c 20 30 2c 20 32 29 3b 0a  ALUES(1, 0, 2);.
02d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
02e0: 20 56 41 4c 55 45 53 28 31 2c 20 31 2c 20 33 29   VALUES(1, 1, 3)
02f0: 3b 0a 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45  ;..  CREATE INDE
0300: 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 29  X i1 ON t1(a, b)
0310: 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ;.}..do_execsql_
0320: 74 65 73 74 20 31 2e 31 2e 31 20 7b 20 53 45 4c  test 1.1.1 { SEL
0330: 45 43 54 20 63 20 46 52 4f 4d 20 74 31 20 57 48  ECT c FROM t1 WH
0340: 45 52 45 20 28 61 2c 20 62 29 20 3e 3d 20 28 31  ERE (a, b) >= (1
0350: 2c 20 30 29 20 7d 20 7b 32 20 33 7d 20 0a 64 6f  , 0) } {2 3} .do
0360: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
0370: 31 2e 32 20 7b 20 53 45 4c 45 43 54 20 63 20 46  1.2 { SELECT c F
0380: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 61 2c  ROM t1 WHERE (a,
0390: 20 62 29 20 3e 20 28 31 2c 20 30 29 20 20 7d 20   b) > (1, 0)  } 
03a0: 7b 33 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {3}..#----------
03b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
03f0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0400: 20 32 2e 30 2e 31 20 7b 0a 20 20 43 52 45 41 54   2.0.1 {.  CREAT
0410: 45 20 54 41 42 4c 45 20 74 32 28 61 20 49 4e 54  E TABLE t2(a INT
0420: 45 47 45 52 2c 20 62 20 49 4e 54 45 47 45 52 2c  EGER, b INTEGER,
0430: 20 63 20 49 4e 54 45 47 45 52 2c 20 64 20 49 4e   c INTEGER, d IN
0440: 54 45 47 45 52 29 3b 0a 20 20 43 52 45 41 54 45  TEGER);.  CREATE
0450: 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 32 28   INDEX i2 ON t2(
0460: 61 2c 20 62 2c 20 63 29 3b 0a 7d 0a 64 6f 5f 74  a, b, c);.}.do_t
0470: 65 73 74 20 32 2e 30 2e 32 20 7b 0a 20 20 66 6f  est 2.0.2 {.  fo
0480: 72 65 61 63 68 20 61 20 7b 30 20 31 20 32 20 33  reach a {0 1 2 3
0490: 7d 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 62 20  } {.  foreach b 
04a0: 7b 30 20 31 20 32 20 33 7d 20 7b 0a 20 20 66 6f  {0 1 2 3} {.  fo
04b0: 72 65 61 63 68 20 63 20 7b 30 20 31 20 32 20 33  reach c {0 1 2 3
04c0: 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  } {.    execsql 
04d0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32  { INSERT INTO t2
04e0: 20 56 41 4c 55 45 53 28 24 61 2c 20 24 62 2c 20   VALUES($a, $b, 
04f0: 24 63 2c 20 24 63 20 2b 20 24 62 2a 34 20 2b 20  $c, $c + $b*4 + 
0500: 24 61 2a 31 36 29 3b 20 7d 0a 20 20 7d 7d 7d 0a  $a*16); }.  }}}.
0510: 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  } {}..do_execsql
0520: 5f 74 65 73 74 20 32 2e 31 20 7b 0a 20 20 53 45  _test 2.1 {.  SE
0530: 4c 45 43 54 20 64 20 46 52 4f 4d 20 74 32 20 57  LECT d FROM t2 W
0540: 48 45 52 45 20 28 61 2c 20 62 29 20 3e 20 28 32  HERE (a, b) > (2
0550: 2c 20 32 29 3b 0a 7d 20 5b 64 62 20 65 76 61 6c  , 2);.} [db eval
0560: 20 7b 20 53 45 4c 45 43 54 20 64 20 46 52 4f 4d   { SELECT d FROM
0570: 20 74 32 20 57 48 45 52 45 20 61 3e 32 20 4f 52   t2 WHERE a>2 OR
0580: 20 28 61 3d 32 20 41 4e 44 20 62 3e 32 29 20 7d   (a=2 AND b>2) }
0590: 5d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  ]..do_execsql_te
05a0: 73 74 20 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43  st 2.2 {.  SELEC
05b0: 54 20 64 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T d FROM t2 WHER
05c0: 45 20 28 61 2c 20 62 29 20 3e 3d 20 28 32 2c 20  E (a, b) >= (2, 
05d0: 32 29 3b 0a 7d 20 5b 64 62 20 65 76 61 6c 20 7b  2);.} [db eval {
05e0: 20 53 45 4c 45 43 54 20 64 20 46 52 4f 4d 20 74   SELECT d FROM t
05f0: 32 20 57 48 45 52 45 20 61 3e 32 20 4f 52 20 28  2 WHERE a>2 OR (
0600: 61 3d 32 20 41 4e 44 20 62 3e 3d 32 29 20 7d 5d  a=2 AND b>=2) }]
0610: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
0620: 74 20 32 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  t 2.3 {.  SELECT
0630: 20 64 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   d FROM t2 WHERE
0640: 20 61 3d 31 20 41 4e 44 20 28 62 2c 20 63 29 20   a=1 AND (b, c) 
0650: 3e 3d 20 28 31 2c 20 32 29 3b 0a 7d 20 5b 64 62  >= (1, 2);.} [db
0660: 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 64   eval { SELECT d
0670: 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 2b   FROM t2 WHERE +
0680: 61 3d 31 20 41 4e 44 20 28 62 3e 31 20 4f 52 20  a=1 AND (b>1 OR 
0690: 28 62 3d 3d 31 20 41 4e 44 20 63 3e 3d 32 29 29  (b==1 AND c>=2))
06a0: 20 7d 5d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   }]..do_execsql_
06b0: 74 65 73 74 20 32 2e 34 20 7b 0a 20 20 53 45 4c  test 2.4 {.  SEL
06c0: 45 43 54 20 64 20 46 52 4f 4d 20 74 32 20 57 48  ECT d FROM t2 WH
06d0: 45 52 45 20 61 3d 31 20 41 4e 44 20 28 62 2c 20  ERE a=1 AND (b, 
06e0: 63 29 20 3e 20 28 31 2c 20 32 29 3b 0a 7d 20 5b  c) > (1, 2);.} [
06f0: 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54  db eval { SELECT
0700: 20 64 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   d FROM t2 WHERE
0710: 20 2b 61 3d 31 20 41 4e 44 20 28 62 3e 31 20 4f   +a=1 AND (b>1 O
0720: 52 20 28 62 3d 3d 31 20 41 4e 44 20 63 3e 32 29  R (b==1 AND c>2)
0730: 29 20 7d 5d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ) }]..#---------
0740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0780: 0a 0a 73 65 74 20 77 6f 72 64 73 20 7b 0a 61 69  ..set words {.ai
0790: 72 66 61 72 65 20 61 69 72 66 69 65 6c 64 20 61  rfare airfield a
07a0: 69 72 66 69 65 6c 64 73 20 61 69 72 66 6c 6f 77  irfields airflow
07b0: 20 61 69 72 66 6f 69 6c 0a 61 69 72 66 6f 69 6c   airfoil.airfoil
07c0: 73 20 61 69 72 66 72 61 6d 65 20 61 69 72 66 72  s airframe airfr
07d0: 61 6d 65 73 20 61 69 72 69 6c 79 20 61 69 72 69  ames airily airi
07e0: 6e 67 0a 61 69 72 69 6e 67 73 20 61 69 72 6c 65  ng.airings airle
07f0: 73 73 20 61 69 72 6c 69 66 74 20 61 69 72 6c 69  ss airlift airli
0800: 66 74 73 20 61 69 72 6c 69 6e 65 0a 61 69 72 6c  fts airline.airl
0810: 69 6e 65 72 20 61 69 72 6c 69 6e 65 73 20 61 69  iner airlines ai
0820: 72 6c 6f 63 6b 20 61 69 72 6c 6f 63 6b 73 20 61  rlock airlocks a
0830: 69 72 6d 61 69 6c 0a 61 69 72 6d 61 69 6c 73 20  irmail.airmails 
0840: 61 69 72 6d 61 6e 20 61 69 72 6d 65 6e 20 61 69  airman airmen ai
0850: 72 70 6c 61 6e 65 20 61 69 72 70 6c 61 6e 65 73  rplane airplanes
0860: 0a 0a 61 72 72 61 69 67 6e 6d 65 6e 74 20 61 72  ..arraignment ar
0870: 72 61 69 67 6e 6d 65 6e 74 73 20 61 72 72 61 69  raignments arrai
0880: 67 6e 73 20 61 72 72 61 6e 67 65 20 61 72 72 61  gns arrange arra
0890: 6e 67 65 64 0a 61 72 72 61 6e 67 65 6d 65 6e 74  nged.arrangement
08a0: 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 61 72   arrangements ar
08b0: 72 61 6e 67 65 72 20 61 72 72 61 6e 67 65 72 73  ranger arrangers
08c0: 20 61 72 72 61 6e 67 65 73 0a 61 72 72 61 6e 67   arranges.arrang
08d0: 69 6e 67 20 61 72 72 61 6e 74 20 61 72 72 61 79  ing arrant array
08e0: 20 61 72 72 61 79 65 64 20 61 72 72 61 79 73 0a   arrayed arrays.
08f0: 61 72 72 65 61 72 73 20 61 72 72 65 73 74 20 61  arrears arrest a
0900: 72 72 65 73 74 65 64 20 61 72 72 65 73 74 65 72  rrested arrester
0910: 20 61 72 72 65 73 74 65 72 73 0a 61 72 72 65 73   arresters.arres
0920: 74 69 6e 67 20 61 72 72 65 73 74 69 6e 67 6c 79  ting arrestingly
0930: 20 61 72 72 65 73 74 6f 72 20 61 72 72 65 73 74   arrestor arrest
0940: 6f 72 73 20 61 72 72 65 73 74 73 0a 0a 65 64 69  ors arrests..edi
0950: 66 69 63 65 73 20 65 64 69 74 20 65 64 69 74 65  fices edit edite
0960: 64 20 65 64 69 74 69 6e 67 20 65 64 69 74 69 6f  d editing editio
0970: 6e 0a 65 64 69 74 69 6f 6e 73 20 65 64 69 74 6f  n.editions edito
0980: 72 20 65 64 69 74 6f 72 69 61 6c 20 65 64 69 74  r editorial edit
0990: 6f 72 69 61 6c 6c 79 20 65 64 69 74 6f 72 69 61  orially editoria
09a0: 6c 73 0a 65 64 69 74 6f 72 73 20 65 64 69 74 73  ls.editors edits
09b0: 20 65 64 75 63 61 62 6c 65 20 65 64 75 63 61 74   educable educat
09c0: 65 20 65 64 75 63 61 74 65 64 0a 65 64 75 63 61  e educated.educa
09d0: 74 65 73 20 65 64 75 63 61 74 69 6e 67 20 65 64  tes educating ed
09e0: 75 63 61 74 69 6f 6e 20 65 64 75 63 61 74 69 6f  ucation educatio
09f0: 6e 61 6c 20 65 64 75 63 61 74 69 6f 6e 61 6c 6c  nal educationall
0a00: 79 0a 65 64 75 63 61 74 69 6f 6e 73 20 65 64 75  y.educations edu
0a10: 63 61 74 6f 72 20 65 64 75 63 61 74 6f 72 73 20  cator educators 
0a20: 65 65 6c 20 65 65 6c 67 72 61 73 73 0a 7d 0a 0a  eel eelgrass.}..
0a30: 64 6f 5f 74 65 73 74 20 33 2e 30 20 7b 0a 20 20  do_test 3.0 {.  
0a40: 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45  execsql { CREATE
0a50: 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62 2c 20   TABLE t3(a, b, 
0a60: 63 2c 20 77 29 3b 20 7d 0a 20 20 66 6f 72 65 61  c, w); }.  forea
0a70: 63 68 20 77 20 24 77 6f 72 64 73 20 7b 0a 20 20  ch w $words {.  
0a80: 20 20 73 65 74 20 61 20 5b 73 74 72 69 6e 67 20    set a [string 
0a90: 72 61 6e 67 65 20 24 77 20 30 20 32 5d 0a 20 20  range $w 0 2].  
0aa0: 20 20 73 65 74 20 62 20 5b 73 74 72 69 6e 67 20    set b [string 
0ab0: 72 61 6e 67 65 20 24 77 20 33 20 35 5d 0a 20 20  range $w 3 5].  
0ac0: 20 20 73 65 74 20 63 20 5b 73 74 72 69 6e 67 20    set c [string 
0ad0: 72 61 6e 67 65 20 24 77 20 36 20 65 6e 64 5d 0a  range $w 6 end].
0ae0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
0af0: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
0b00: 55 45 53 28 24 61 2c 20 24 62 2c 20 24 63 2c 20  UES($a, $b, $c, 
0b10: 24 77 29 20 7d 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  $w) }.  }.} {}..
0b20: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 69 64 78  .foreach {tn idx
0b30: 7d 20 7b 0a 20 20 49 44 58 31 20 7b 7d 0a 20 20  } {.  IDX1 {}.  
0b40: 49 44 58 32 20 7b 20 43 52 45 41 54 45 20 49 4e  IDX2 { CREATE IN
0b50: 44 45 58 20 69 33 20 4f 4e 20 74 33 28 61 2c 20  DEX i3 ON t3(a, 
0b60: 62 2c 20 63 29 3b 20 7d 0a 20 20 49 44 58 33 20  b, c); }.  IDX3 
0b70: 7b 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69  { CREATE INDEX i
0b80: 33 20 4f 4e 20 74 33 28 61 2c 20 62 29 3b 20 7d  3 ON t3(a, b); }
0b90: 0a 20 20 49 44 58 34 20 7b 20 43 52 45 41 54 45  .  IDX4 { CREATE
0ba0: 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 33 28   INDEX i3 ON t3(
0bb0: 61 29 3b 20 7d 0a 7d 20 7b 0a 20 20 65 78 65 63  a); }.} {.  exec
0bc0: 73 71 6c 20 7b 20 44 52 4f 50 20 49 4e 44 45 58  sql { DROP INDEX
0bd0: 20 49 46 20 45 58 49 53 54 53 20 69 33 20 7d 0a   IF EXISTS i3 }.
0be0: 20 20 65 78 65 63 73 71 6c 20 24 69 64 78 0a 0a    execsql $idx..
0bf0: 20 20 66 6f 72 65 61 63 68 20 77 20 24 77 6f 72    foreach w $wor
0c00: 64 73 20 7b 0a 20 20 20 20 73 65 74 20 61 20 5b  ds {.    set a [
0c10: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 77 20  string range $w 
0c20: 30 20 32 5d 0a 20 20 20 20 73 65 74 20 62 20 5b  0 2].    set b [
0c30: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 77 20  string range $w 
0c40: 33 20 35 5d 0a 20 20 20 20 73 65 74 20 63 20 5b  3 5].    set c [
0c50: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 77 20  string range $w 
0c60: 36 20 65 6e 64 5d 0a 0a 20 20 20 20 66 6f 72 65  6 end]..    fore
0c70: 61 63 68 20 6f 70 20 5b 6c 69 73 74 20 3e 20 3e  ach op [list > >
0c80: 3d 20 3c 20 3c 3d 20 3d 3d 20 49 53 5d 20 7b 0a  = < <= == IS] {.
0c90: 20 20 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c        do_execsql
0ca0: 5f 74 65 73 74 20 33 2e 31 2e 24 74 6e 2e 24 77  _test 3.1.$tn.$w
0cb0: 2e 24 6f 70 20 5b 73 75 62 73 74 20 2d 6e 6f 76  .$op [subst -nov
0cc0: 61 72 20 7b 0a 20 20 20 20 20 20 20 20 53 45 4c  ar {.        SEL
0cd0: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
0ce0: 33 20 57 48 45 52 45 20 28 61 2c 20 62 2c 20 63  3 WHERE (a, b, c
0cf0: 29 20 5b 73 65 74 20 6f 70 5d 20 28 24 61 2c 20  ) [set op] ($a, 
0d00: 24 62 2c 20 24 63 29 20 0a 20 20 20 20 20 20 20  $b, $c) .       
0d10: 20 4f 52 44 45 52 20 42 59 20 2b 72 6f 77 69 64   ORDER BY +rowid
0d20: 0a 20 20 20 20 20 20 7d 5d 20 5b 64 62 20 65 76  .      }] [db ev
0d30: 61 6c 20 5b 73 75 62 73 74 20 2d 6e 6f 76 61 72  al [subst -novar
0d40: 20 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43   {.        SELEC
0d50: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 33 20  T rowid FROM t3 
0d60: 57 48 45 52 45 20 77 20 5b 73 65 74 20 6f 70 5d  WHERE w [set op]
0d70: 20 24 77 20 4f 52 44 45 52 20 42 59 20 2b 72 6f   $w ORDER BY +ro
0d80: 77 69 64 0a 20 20 20 20 20 20 7d 5d 5d 0a 0a 20  wid.      }]].. 
0d90: 20 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f       do_execsql_
0da0: 74 65 73 74 20 33 2e 31 2e 24 74 6e 2e 24 77 2e  test 3.1.$tn.$w.
0db0: 24 6f 70 2e 73 75 62 73 65 6c 65 63 74 20 5b 73  $op.subselect [s
0dc0: 75 62 73 74 20 2d 6e 6f 76 61 72 20 7b 0a 20 20  ubst -novar {.  
0dd0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77        SELECT row
0de0: 69 64 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45  id FROM t3 WHERE
0df0: 20 28 61 2c 20 62 2c 20 63 29 20 5b 73 65 74 20   (a, b, c) [set 
0e00: 6f 70 5d 20 28 0a 20 20 20 20 20 20 20 20 20 20  op] (.          
0e10: 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46  SELECT a, b, c F
0e20: 52 4f 4d 20 74 33 20 57 48 45 52 45 20 77 20 3d  ROM t3 WHERE w =
0e30: 20 24 77 0a 20 20 20 20 20 20 20 20 29 0a 20 20   $w.        ).  
0e40: 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2b        ORDER BY +
0e50: 72 6f 77 69 64 0a 20 20 20 20 20 20 7d 5d 20 5b  rowid.      }] [
0e60: 64 62 20 65 76 61 6c 20 5b 73 75 62 73 74 20 2d  db eval [subst -
0e70: 6e 6f 76 61 72 20 7b 0a 20 20 20 20 20 20 20 20  novar {.        
0e80: 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
0e90: 4d 20 74 33 20 57 48 45 52 45 20 77 20 5b 73 65  M t3 WHERE w [se
0ea0: 74 20 6f 70 5d 20 24 77 20 4f 52 44 45 52 20 42  t op] $w ORDER B
0eb0: 59 20 2b 72 6f 77 69 64 0a 20 20 20 20 20 20 7d  Y +rowid.      }
0ec0: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 7d 0a  ]].    }..  }.}.
0ed0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 0a 64  -----------.#..d
0f20: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  o_execsql_test 4
0f30: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
0f40: 42 4c 45 20 74 34 28 61 2c 20 62 2c 20 63 29 3b  BLE t4(a, b, c);
0f50: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0f60: 34 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e  4 VALUES(NULL, N
0f70: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e  ULL, NULL);.  IN
0f80: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
0f90: 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  UES(NULL, NULL, 
0fa0: 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  0);.  INSERT INT
0fb0: 4f 20 74 34 20 56 41 4c 55 45 53 28 4e 55 4c 4c  O t4 VALUES(NULL
0fc0: 2c 20 4e 55 4c 4c 2c 20 31 29 3b 0a 20 20 49 4e  , NULL, 1);.  IN
0fd0: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
0fe0: 55 45 53 28 4e 55 4c 4c 2c 20 20 20 20 30 2c 20  UES(NULL,    0, 
0ff0: 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20  NULL);.  INSERT 
1000: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 4e  INTO t4 VALUES(N
1010: 55 4c 4c 2c 20 20 20 20 30 2c 20 30 29 3b 0a 20  ULL,    0, 0);. 
1020: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
1030: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 20 20 20  VALUES(NULL,    
1040: 30 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52 54 20  0, 1);.  INSERT 
1050: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 4e  INTO t4 VALUES(N
1060: 55 4c 4c 2c 20 20 20 20 31 2c 20 4e 55 4c 4c 29  ULL,    1, NULL)
1070: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1080: 74 34 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20  t4 VALUES(NULL, 
1090: 20 20 20 31 2c 20 30 29 3b 0a 20 20 49 4e 53 45     1, 0);.  INSE
10a0: 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45  RT INTO t4 VALUE
10b0: 53 28 4e 55 4c 4c 2c 20 20 20 20 31 2c 20 31 29  S(NULL,    1, 1)
10c0: 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  ;..  INSERT INTO
10d0: 20 74 34 20 56 41 4c 55 45 53 28 20 20 20 30 2c   t4 VALUES(   0,
10e0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20   NULL, NULL);.  
10f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
1100: 41 4c 55 45 53 28 20 20 20 30 2c 20 4e 55 4c 4c  ALUES(   0, NULL
1110: 2c 20 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 0);.  INSERT I
1120: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 20 20  NTO t4 VALUES(  
1130: 20 30 2c 20 4e 55 4c 4c 2c 20 31 29 3b 0a 20 20   0, NULL, 1);.  
1140: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
1150: 41 4c 55 45 53 28 20 20 20 30 2c 20 20 20 20 30  ALUES(   0,    0
1160: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52  , NULL);.  INSER
1170: 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53  T INTO t4 VALUES
1180: 28 20 20 20 30 2c 20 20 20 20 30 2c 20 30 29 3b  (   0,    0, 0);
1190: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
11a0: 34 20 56 41 4c 55 45 53 28 20 20 20 30 2c 20 20  4 VALUES(   0,  
11b0: 20 20 30 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52    0, 1);.  INSER
11c0: 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53  T INTO t4 VALUES
11d0: 28 20 20 20 30 2c 20 20 20 20 31 2c 20 4e 55 4c  (   0,    1, NUL
11e0: 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  L);.  INSERT INT
11f0: 4f 20 74 34 20 56 41 4c 55 45 53 28 20 20 20 30  O t4 VALUES(   0
1200: 2c 20 20 20 20 31 2c 20 30 29 3b 0a 20 20 49 4e  ,    1, 0);.  IN
1210: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
1220: 55 45 53 28 20 20 20 30 2c 20 20 20 20 31 2c 20  UES(   0,    1, 
1230: 31 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e  1);..  INSERT IN
1240: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 20 20 20  TO t4 VALUES(   
1250: 31 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  1, NULL, NULL);.
1260: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
1270: 20 56 41 4c 55 45 53 28 20 20 20 31 2c 20 4e 55   VALUES(   1, NU
1280: 4c 4c 2c 20 30 29 3b 0a 20 20 49 4e 53 45 52 54  LL, 0);.  INSERT
1290: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
12a0: 20 20 20 31 2c 20 4e 55 4c 4c 2c 20 31 29 3b 0a     1, NULL, 1);.
12b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
12c0: 20 56 41 4c 55 45 53 28 20 20 20 31 2c 20 20 20   VALUES(   1,   
12d0: 20 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53   0, NULL);.  INS
12e0: 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
12f0: 45 53 28 20 20 20 31 2c 20 20 20 20 30 2c 20 30  ES(   1,    0, 0
1300: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
1310: 20 74 34 20 56 41 4c 55 45 53 28 20 20 20 31 2c   t4 VALUES(   1,
1320: 20 20 20 20 30 2c 20 31 29 3b 0a 20 20 49 4e 53      0, 1);.  INS
1330: 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
1340: 45 53 28 20 20 20 31 2c 20 20 20 20 31 2c 20 4e  ES(   1,    1, N
1350: 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ULL);.  INSERT I
1360: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 20 20  NTO t4 VALUES(  
1370: 20 31 2c 20 20 20 20 31 2c 20 30 29 3b 0a 20 20   1,    1, 0);.  
1380: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
1390: 41 4c 55 45 53 28 20 20 20 31 2c 20 20 20 20 31  ALUES(   1,    1
13a0: 2c 20 31 29 3b 0a 7d 0a 0a 70 72 6f 63 20 6d 61  , 1);.}..proc ma
13b0: 6b 65 5f 65 78 70 72 31 20 7b 63 4c 69 73 74 20  ke_expr1 {cList 
13c0: 76 4c 69 73 74 20 6f 70 7d 20 7b 0a 20 20 72 65  vList op} {.  re
13d0: 74 75 72 6e 20 22 28 5b 6a 6f 69 6e 20 24 63 4c  turn "([join $cL
13e0: 69 73 74 20 2c 5d 29 20 24 6f 70 20 28 5b 6a 6f  ist ,]) $op ([jo
13f0: 69 6e 20 24 76 4c 69 73 74 20 2c 5d 29 22 0a 7d  in $vList ,])".}
1400: 0a 0a 70 72 6f 63 20 6d 61 6b 65 5f 65 78 70 72  ..proc make_expr
1410: 33 20 7b 63 4c 69 73 74 20 76 4c 69 73 74 20 6f  3 {cList vList o
1420: 70 7d 20 7b 0a 20 20 73 65 74 20 6e 20 5b 6c 6c  p} {.  set n [ll
1430: 65 6e 67 74 68 20 24 63 4c 69 73 74 5d 0a 0a 20  ength $cList].. 
1440: 20 73 65 74 20 61 4c 69 73 74 20 5b 6c 69 73 74   set aList [list
1450: 5d 0a 20 20 66 6f 72 65 61 63 68 20 63 20 5b 6c  ].  foreach c [l
1460: 72 61 6e 67 65 20 24 63 4c 69 73 74 20 30 20 65  range $cList 0 e
1470: 6e 64 2d 31 5d 20 76 20 5b 6c 72 61 6e 67 65 20  nd-1] v [lrange 
1480: 24 76 4c 69 73 74 20 30 20 65 6e 64 2d 31 5d 20  $vList 0 end-1] 
1490: 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 61 4c  {.    lappend aL
14a0: 69 73 74 20 22 24 63 20 3d 3d 20 24 76 22 0a 20  ist "$c == $v". 
14b0: 20 7d 0a 20 20 6c 61 70 70 65 6e 64 20 61 4c 69   }.  lappend aLi
14c0: 73 74 20 22 5b 6c 69 6e 64 65 78 20 24 63 4c 69  st "[lindex $cLi
14d0: 73 74 20 65 6e 64 5d 20 24 6f 70 20 5b 6c 69 6e  st end] $op [lin
14e0: 64 65 78 20 24 76 4c 69 73 74 20 65 6e 64 5d 22  dex $vList end]"
14f0: 0a 0a 20 20 72 65 74 75 72 6e 20 22 28 5b 6a 6f  ..  return "([jo
1500: 69 6e 20 24 61 4c 69 73 74 20 7b 20 41 4e 44 20  in $aList { AND 
1510: 7d 5d 29 22 0a 7d 0a 0a 70 72 6f 63 20 6d 61 6b  }])".}..proc mak
1520: 65 5f 65 78 70 72 32 20 7b 63 4c 69 73 74 20 76  e_expr2 {cList v
1530: 4c 69 73 74 20 6f 70 7d 20 7b 0a 20 20 73 65 74  List op} {.  set
1540: 20 72 65 74 20 22 22 0a 0a 20 20 73 77 69 74 63   ret ""..  switc
1550: 68 20 2d 2d 20 24 6f 70 20 7b 0a 20 20 20 20 3d  h -- $op {.    =
1560: 3d 20 2d 20 49 53 20 7b 0a 20 20 20 20 20 20 73  = - IS {.      s
1570: 65 74 20 61 4c 69 73 74 20 5b 6c 69 73 74 5d 0a  et aList [list].
1580: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 63 20        foreach c 
1590: 24 63 4c 69 73 74 20 76 20 24 76 4c 69 73 74 20  $cList v $vList 
15a0: 7b 20 6c 61 70 70 65 6e 64 20 61 4c 69 73 74 20  { lappend aList 
15b0: 22 28 24 63 20 24 6f 70 20 24 76 29 22 20 7d 0a  "($c $op $v)" }.
15c0: 20 20 20 20 20 20 73 65 74 20 72 65 74 20 5b 6a        set ret [j
15d0: 6f 69 6e 20 24 61 4c 69 73 74 20 22 20 41 4e 44  oin $aList " AND
15e0: 20 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 3c   "].    }..    <
15f0: 20 2d 20 3e 20 7b 0a 20 20 20 20 20 20 73 65 74   - > {.      set
1600: 20 6f 4c 69 73 74 20 5b 6c 69 73 74 5d 0a 20 20   oList [list].  
1610: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30      for {set i 0
1620: 7d 20 7b 24 69 20 3c 20 5b 6c 6c 65 6e 67 74 68  } {$i < [llength
1630: 20 24 63 4c 69 73 74 5d 7d 20 7b 69 6e 63 72 20   $cList]} {incr 
1640: 69 7d 20 7b 0a 20 20 20 20 20 20 20 20 6c 61 70  i} {.        lap
1650: 70 65 6e 64 20 6f 4c 69 73 74 20 5b 6d 61 6b 65  pend oList [make
1660: 5f 65 78 70 72 33 20 5b 6c 72 61 6e 67 65 20 24  _expr3 [lrange $
1670: 63 4c 69 73 74 20 30 20 24 69 5d 20 5b 6c 72 61  cList 0 $i] [lra
1680: 6e 67 65 20 24 76 4c 69 73 74 20 30 20 24 69 5d  nge $vList 0 $i]
1690: 20 24 6f 70 5d 0a 20 20 20 20 20 20 7d 0a 20 20   $op].      }.  
16a0: 20 20 20 20 73 65 74 20 72 65 74 20 5b 6a 6f 69      set ret [joi
16b0: 6e 20 24 6f 4c 69 73 74 20 22 20 4f 52 20 22 5d  n $oList " OR "]
16c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 3c 3d 20 2d  .    }..    <= -
16d0: 20 3e 3d 20 7b 0a 20 20 20 20 20 20 73 65 74 20   >= {.      set 
16e0: 6f 32 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  o2 [string range
16f0: 20 24 6f 70 20 30 20 30 5d 0a 20 20 20 20 20 20   $op 0 0].      
1700: 73 65 74 20 6f 4c 69 73 74 20 5b 6c 69 73 74 5d  set oList [list]
1710: 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20  .      for {set 
1720: 69 20 30 7d 20 7b 24 69 20 3c 20 5b 6c 6c 65 6e  i 0} {$i < [llen
1730: 67 74 68 20 24 63 4c 69 73 74 5d 2d 31 7d 20 7b  gth $cList]-1} {
1740: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20  incr i} {.      
1750: 20 20 6c 61 70 70 65 6e 64 20 6f 4c 69 73 74 20    lappend oList 
1760: 5b 6d 61 6b 65 5f 65 78 70 72 33 20 5b 6c 72 61  [make_expr3 [lra
1770: 6e 67 65 20 24 63 4c 69 73 74 20 30 20 24 69 5d  nge $cList 0 $i]
1780: 20 5b 6c 72 61 6e 67 65 20 24 76 4c 69 73 74 20   [lrange $vList 
1790: 30 20 24 69 5d 20 24 6f 32 5d 0a 20 20 20 20 20  0 $i] $o2].     
17a0: 20 7d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64   }.      lappend
17b0: 20 6f 4c 69 73 74 20 5b 6d 61 6b 65 5f 65 78 70   oList [make_exp
17c0: 72 33 20 24 63 4c 69 73 74 20 24 76 4c 69 73 74  r3 $cList $vList
17d0: 20 24 6f 70 5d 0a 20 20 20 20 20 20 73 65 74 20   $op].      set 
17e0: 72 65 74 20 5b 6a 6f 69 6e 20 24 6f 4c 69 73 74  ret [join $oList
17f0: 20 22 20 4f 52 20 22 5d 0a 20 20 20 20 7d 0a 0a   " OR "].    }..
1800: 0a 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0a 20  .    default {. 
1810: 20 20 20 20 20 65 72 72 6f 72 20 22 55 6e 6b 6e       error "Unkn
1820: 6f 77 6e 20 6f 70 3a 20 24 6f 70 22 0a 20 20 20  own op: $op".   
1830: 20 7d 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72 65   }.  }..  set re
1840: 74 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e  t.}..foreach {tn
1850: 20 69 64 78 7d 20 7b 0a 20 20 49 44 58 31 20 7b   idx} {.  IDX1 {
1860: 7d 0a 20 20 49 44 58 32 20 7b 20 43 52 45 41 54  }.  IDX2 { CREAT
1870: 45 20 49 4e 44 45 58 20 69 34 20 4f 4e 20 74 34  E INDEX i4 ON t4
1880: 28 61 2c 20 62 2c 20 63 29 3b 20 7d 0a 20 20 49  (a, b, c); }.  I
1890: 44 58 33 20 7b 20 43 52 45 41 54 45 20 49 4e 44  DX3 { CREATE IND
18a0: 45 58 20 69 34 20 4f 4e 20 74 34 28 61 2c 20 62  EX i4 ON t4(a, b
18b0: 29 3b 20 7d 0a 20 20 49 44 58 34 20 7b 20 43 52  ); }.  IDX4 { CR
18c0: 45 41 54 45 20 49 4e 44 45 58 20 69 34 20 4f 4e  EATE INDEX i4 ON
18d0: 20 74 34 28 61 29 3b 20 7d 0a 7d 20 7b 0a 20 20   t4(a); }.} {.  
18e0: 65 78 65 63 73 71 6c 20 7b 20 44 52 4f 50 20 49  execsql { DROP I
18f0: 4e 44 45 58 20 49 46 20 45 58 49 53 54 53 20 69  NDEX IF EXISTS i
1900: 34 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 24 69  4 }.  execsql $i
1910: 64 78 0a 0a 20 20 66 6f 72 65 61 63 68 20 7b 74  dx..  foreach {t
1920: 6e 32 20 76 65 63 74 6f 72 7d 20 7b 0a 20 20 20  n2 vector} {.   
1930: 20 31 20 7b 30 20 30 20 30 7d 0a 20 20 20 20 32   1 {0 0 0}.    2
1940: 20 7b 31 20 31 20 31 7d 0a 20 20 20 20 33 20 7b   {1 1 1}.    3 {
1950: 30 20 30 20 4e 55 4c 4c 7d 0a 20 20 20 20 34 20  0 0 NULL}.    4 
1960: 7b 30 20 4e 55 4c 4c 20 30 7d 0a 20 20 20 20 35  {0 NULL 0}.    5
1970: 20 7b 4e 55 4c 4c 20 30 20 30 7d 0a 20 20 20 20   {NULL 0 0}.    
1980: 36 20 7b 31 20 31 20 4e 55 4c 4c 7d 0a 20 20 20  6 {1 1 NULL}.   
1990: 20 37 20 7b 31 20 4e 55 4c 4c 20 31 7d 0a 20 20   7 {1 NULL 1}.  
19a0: 20 20 38 20 7b 4e 55 4c 4c 20 31 20 31 7d 0a 20    8 {NULL 1 1}. 
19b0: 20 7d 20 7b 0a 20 20 20 20 66 6f 72 65 61 63 68   } {.    foreach
19c0: 20 6f 70 20 7b 20 49 53 20 3d 3d 20 3c 20 3c 3d   op { IS == < <=
19d0: 20 3e 20 3e 3d 20 7d 20 7b 0a 20 20 20 20 20 20   > >= } {.      
19e0: 73 65 74 20 65 31 20 5b 6d 61 6b 65 5f 65 78 70  set e1 [make_exp
19f0: 72 31 20 7b 61 20 62 20 63 7d 20 24 76 65 63 74  r1 {a b c} $vect
1a00: 6f 72 20 24 6f 70 5d 0a 20 20 20 20 20 20 73 65  or $op].      se
1a10: 74 20 65 32 20 5b 6d 61 6b 65 5f 65 78 70 72 32  t e2 [make_expr2
1a20: 20 7b 61 20 62 20 63 7d 20 24 76 65 63 74 6f 72   {a b c} $vector
1a30: 20 24 6f 70 5d 0a 0a 20 20 20 20 20 20 64 6f 5f   $op]..      do_
1a40: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 24  execsql_test 4.$
1a50: 74 6e 2e 24 74 6e 32 2e 24 6f 70 20 5c 0a 20 20  tn.$tn2.$op \.  
1a60: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
1a70: 72 6f 77 69 64 20 46 52 4f 4d 20 74 34 20 57 48  rowid FROM t4 WH
1a80: 45 52 45 20 24 65 32 20 4f 52 44 45 52 20 42 59  ERE $e2 ORDER BY
1a90: 20 2b 72 6f 77 69 64 22 20 5b 0a 20 20 20 20 20   +rowid" [.     
1aa0: 20 20 20 20 20 64 62 20 65 76 61 6c 20 22 53 45       db eval "SE
1ab0: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
1ac0: 74 34 20 57 48 45 52 45 20 24 65 31 20 4f 52 44  t4 WHERE $e1 ORD
1ad0: 45 52 20 42 59 20 2b 72 6f 77 69 64 22 0a 20 20  ER BY +rowid".  
1ae0: 20 20 20 20 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a      ].    }.  }.
1af0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
1b00: 73 74 20 35 2e 30 20 7b 0a 20 20 43 52 45 41 54  st 5.0 {.  CREAT
1b10: 45 20 54 41 42 4c 45 20 72 31 28 61 20 54 45 58  E TABLE r1(a TEX
1b20: 54 2c 20 69 42 20 54 45 58 54 29 3b 0a 20 20 43  T, iB TEXT);.  C
1b30: 52 45 41 54 45 20 54 41 42 4c 45 20 72 32 28 78  REATE TABLE r2(x
1b40: 20 54 45 58 54 2c 20 7a 59 20 49 4e 54 45 47 45   TEXT, zY INTEGE
1b50: 52 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  R);.  CREATE IND
1b60: 45 58 20 72 31 61 62 20 4f 4e 20 72 31 28 61 2c  EX r1ab ON r1(a,
1b70: 20 69 42 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20   iB);..  INSERT 
1b80: 49 4e 54 4f 20 72 31 20 56 41 4c 55 45 53 28 33  INTO r1 VALUES(3
1b90: 35 2c 20 33 35 29 3b 0a 20 20 49 4e 53 45 52 54  5, 35);.  INSERT
1ba0: 20 49 4e 54 4f 20 72 32 20 56 41 4c 55 45 53 28   INTO r2 VALUES(
1bb0: 33 35 2c 20 33 36 29 3b 0a 20 20 49 4e 53 45 52  35, 36);.  INSER
1bc0: 54 20 49 4e 54 4f 20 72 32 20 56 41 4c 55 45 53  T INTO r2 VALUES
1bd0: 28 33 35 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52  (35, 4);.  INSER
1be0: 54 20 49 4e 54 4f 20 72 32 20 56 41 4c 55 45 53  T INTO r2 VALUES
1bf0: 28 33 35 2c 20 33 35 29 3b 0a 7d 20 7b 7d 0a 0a  (35, 35);.} {}..
1c00: 66 6f 72 65 61 63 68 20 7b 74 6e 20 6c 68 73 20  foreach {tn lhs 
1c10: 72 68 73 7d 20 7b 0a 20 20 31 20 7b 78 20 2b 7a  rhs} {.  1 {x +z
1c20: 59 7d 20 7b 61 20 69 42 7d 0a 20 20 32 20 7b 78  Y} {a iB}.  2 {x
1c30: 20 20 7a 59 7d 20 7b 61 20 69 42 7d 0a 20 20 33    zY} {a iB}.  3
1c40: 20 7b 78 20 20 7a 59 7d 20 7b 61 20 2b 69 42 7d   {x  zY} {a +iB}
1c50: 0a 20 20 34 20 7b 2b 78 20 20 7a 59 7d 20 7b 61  .  4 {+x  zY} {a
1c60: 20 69 42 7d 0a 20 20 35 20 7b 78 20 20 7a 59 7d   iB}.  5 {x  zY}
1c70: 20 7b 2b 61 20 69 42 7d 0a 7d 20 7b 0a 20 20 66   {+a iB}.} {.  f
1c80: 6f 72 65 61 63 68 20 6f 70 20 7b 20 49 53 20 3d  oreach op { IS =
1c90: 3d 20 3c 20 3c 3d 20 3e 20 3e 3d 20 7d 20 7b 0a  = < <= > >= } {.
1ca0: 20 20 20 20 73 65 74 20 65 31 20 5b 6d 61 6b 65      set e1 [make
1cb0: 5f 65 78 70 72 31 20 24 6c 68 73 20 24 72 68 73  _expr1 $lhs $rhs
1cc0: 20 24 6f 70 5d 0a 20 20 20 20 73 65 74 20 65 32   $op].    set e2
1cd0: 20 5b 6d 61 6b 65 5f 65 78 70 72 32 20 24 6c 68   [make_expr2 $lh
1ce0: 73 20 24 72 68 73 20 24 6f 70 5d 0a 20 20 20 20  s $rhs $op].    
1cf0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1d00: 35 2e 24 74 6e 2e 24 6f 70 20 5c 0a 20 20 20 20  5.$tn.$op \.    
1d10: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
1d20: 20 72 31 2c 20 72 32 20 57 48 45 52 45 20 24 65   r1, r2 WHERE $e
1d30: 32 20 4f 52 44 45 52 20 42 59 20 69 42 22 20 5b  2 ORDER BY iB" [
1d40: 64 62 20 65 76 61 6c 20 5c 0a 20 20 20 20 20 20  db eval \.      
1d50: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 72  "SELECT * FROM r
1d60: 31 2c 20 72 32 20 57 48 45 52 45 20 24 65 31 20  1, r2 WHERE $e1 
1d70: 4f 52 44 45 52 20 42 59 20 69 42 22 0a 20 20 20  ORDER BY iB".   
1d80: 20 5d 0a 20 20 7d 0a 7d 0a 0a 0a 66 69 6e 69 73   ].  }.}...finis
1d90: 68 5f 74 65 73 74 0a                             h_test.