/ Hex Artifact Content
Login

Artifact 318cdd40e66dfae686537eea581ae49cbb01195d:


0000: 23 20 32 30 31 36 20 4a 75 6c 79 20 32 39 0a 23  # 2016 July 29.#
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 73 79   this file is sy
01c0: 6e 74 61 78 20 65 72 72 6f 72 73 20 69 6e 76 6f  ntax errors invo
01d0: 6c 76 69 6e 67 20 72 6f 77 2d 76 61 6c 75 65 20  lving row-value 
01e0: 63 6f 6e 73 74 72 75 63 74 6f 72 73 0a 23 20 61  constructors.# a
01f0: 6e 64 20 73 75 62 2d 73 65 6c 65 63 74 73 20 74  nd sub-selects t
0200: 68 61 74 20 72 65 74 75 72 6e 20 6d 75 6c 74 69  hat return multi
0210: 70 6c 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 23  ple arguments..#
0220: 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
0230: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
0240: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
0250: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73  dir/tester.tcl.s
0260: 65 74 20 3a 3a 74 65 73 74 70 72 65 66 69 78 20  et ::testprefix 
0270: 72 6f 77 76 61 6c 75 65 34 0a 0a 23 2d 2d 2d 2d  rowvalue4..#----
0280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02c0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 6f 6d  -----.# Test som
02d0: 65 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  e error conditio
02e0: 6e 73 3a 0a 23 20 0a 23 20 20 20 2a 20 72 6f 77  ns:.# .#   * row
02f0: 20 76 61 6c 75 65 73 20 75 73 65 64 20 77 68 65   values used whe
0300: 72 65 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  re they are not 
0310: 73 75 70 70 6f 72 74 65 64 2c 0a 23 20 20 20 2a  supported,.#   *
0320: 20 72 6f 77 20 76 61 6c 75 65 73 20 6f 72 20 73   row values or s
0330: 75 62 2d 73 65 6c 65 63 74 73 20 74 68 61 74 20  ub-selects that 
0340: 63 6f 6e 74 61 69 6e 2f 72 65 74 75 72 6e 20 74  contain/return t
0350: 68 65 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 0a  he wrong number.
0360: 23 20 20 20 20 20 6f 66 20 65 6c 65 6d 65 6e 74  #     of element
0370: 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  s..#.do_execsql_
0380: 74 65 73 74 20 31 2e 30 20 7b 0a 20 20 43 52 45  test 1.0 {.  CRE
0390: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
03a0: 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45 20  b, c);.  CREATE 
03b0: 49 4e 44 45 58 20 74 31 62 61 63 20 4f 4e 20 74  INDEX t1bac ON t
03c0: 31 28 62 2c 20 61 2c 20 63 29 3b 0a 7d 0a 0a 66  1(b, a, c);.}..f
03d0: 6f 72 65 61 63 68 20 7b 74 6e 20 65 7d 20 7b 0a  oreach {tn e} {.
03e0: 20 20 31 20 22 28 31 2c 20 32 2c 20 33 29 22 0a    1 "(1, 2, 3)".
03f0: 20 20 32 20 22 31 20 2b 20 28 31 2c 20 32 29 22    2 "1 + (1, 2)"
0400: 0a 20 20 33 20 22 28 31 2c 32 2c 33 29 20 3d 3d  .  3 "(1,2,3) ==
0410: 20 28 31 2c 20 32 29 22 0a 7d 20 7b 0a 20 20 64   (1, 2)".} {.  d
0420: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
0430: 31 2e 24 74 6e 20 22 53 45 4c 45 43 54 20 24 65  1.$tn "SELECT $e
0440: 22 20 7b 31 20 7b 69 6e 76 61 6c 69 64 20 75 73  " {1 {invalid us
0450: 65 20 6f 66 20 72 6f 77 20 76 61 6c 75 65 7d 7d  e of row value}}
0460: 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  .}..foreach {tn 
0470: 73 20 65 72 72 6f 72 7d 20 7b 0a 20 20 31 20 22  s error} {.  1 "
0480: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0490: 20 57 48 45 52 45 20 61 20 3d 20 28 31 2c 20 32   WHERE a = (1, 2
04a0: 29 22 20 20 20 20 20 20 20 7b 69 6e 76 61 6c 69  )"       {invali
04b0: 64 20 75 73 65 20 6f 66 20 72 6f 77 20 76 61 6c  d use of row val
04c0: 75 65 7d 0a 20 20 32 20 22 53 45 4c 45 43 54 20  ue}.  2 "SELECT 
04d0: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
04e0: 62 20 3d 20 28 31 2c 20 32 29 22 20 20 20 20 20  b = (1, 2)"     
04f0: 20 20 7b 69 6e 76 61 6c 69 64 20 75 73 65 20 6f    {invalid use o
0500: 66 20 72 6f 77 20 76 61 6c 75 65 7d 0a 20 20 33  f row value}.  3
0510: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
0520: 74 31 20 57 48 45 52 45 20 4e 4f 54 20 28 62 20  t1 WHERE NOT (b 
0530: 3d 20 28 31 2c 20 32 29 29 22 20 7b 69 6e 76 61  = (1, 2))" {inva
0540: 6c 69 64 20 75 73 65 20 6f 66 20 72 6f 77 20 76  lid use of row v
0550: 61 6c 75 65 7d 0a 20 20 34 20 22 53 45 4c 45 43  alue}.  4 "SELEC
0560: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49  T * FROM t1 LIMI
0570: 54 20 28 31 2c 20 32 29 22 20 20 20 20 20 20 20  T (1, 2)"       
0580: 20 20 20 20 7b 69 6e 76 61 6c 69 64 20 75 73 65      {invalid use
0590: 20 6f 66 20 72 6f 77 20 76 61 6c 75 65 7d 0a 20   of row value}. 
05a0: 20 35 20 22 53 45 4c 45 43 54 20 28 61 2c 20 62   5 "SELECT (a, b
05b0: 29 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  ) IN (SELECT * F
05c0: 52 4f 4d 20 74 31 29 20 46 52 4f 4d 20 74 31 22  ROM t1) FROM t1"
05d0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
05f0: 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
0600: 6e 73 20 33 20 63 6f 6c 75 6d 6e 73 20 2d 20 65  ns 3 columns - e
0610: 78 70 65 63 74 65 64 20 32 7d 0a 0a 20 20 36 20  xpected 2}..  6 
0620: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
0630: 31 20 57 48 45 52 45 20 28 61 2c 20 62 29 20 49  1 WHERE (a, b) I
0640: 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
0650: 20 74 31 29 22 20 0a 20 20 20 20 20 20 20 20 20   t1)" .         
0660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0670: 20 20 20 20 7b 73 75 62 2d 73 65 6c 65 63 74 20      {sub-select 
0680: 72 65 74 75 72 6e 73 20 33 20 63 6f 6c 75 6d 6e  returns 3 column
0690: 73 20 2d 20 65 78 70 65 63 74 65 64 20 32 7d 0a  s - expected 2}.
06a0: 7d 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71  } {.  do_catchsq
06b0: 6c 5f 74 65 73 74 20 32 2e 24 74 6e 20 22 24 73  l_test 2.$tn "$s
06c0: 22 20 5b 6c 69 73 74 20 31 20 24 65 72 72 6f 72  " [list 1 $error
06d0: 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ].}..#----------
06e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0720: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0730: 32 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  2.0 {.  CREATE T
0740: 41 42 4c 45 20 74 32 28 61 2c 20 62 2c 20 63 2c  ABLE t2(a, b, c,
0750: 20 64 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   d);.  INSERT IN
0760: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20  TO t2 VALUES(1, 
0770: 31 2c 20 31 2c 20 20 20 31 29 3b 0a 20 20 49 4e  1, 1,   1);.  IN
0780: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
0790: 55 45 53 28 31 2c 20 31 2c 20 32 2c 20 20 20 32  UES(1, 1, 2,   2
07a0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
07b0: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 31 2c   t2 VALUES(1, 1,
07c0: 20 33 2c 20 20 20 33 29 3b 0a 20 20 49 4e 53 45   3,   3);.  INSE
07d0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
07e0: 53 28 31 2c 20 32 2c 20 31 2c 20 20 20 34 29 3b  S(1, 2, 1,   4);
07f0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0800: 32 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 32  2 VALUES(1, 2, 2
0810: 2c 20 20 20 35 29 3b 0a 20 20 49 4e 53 45 52 54  ,   5);.  INSERT
0820: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
0830: 31 2c 20 32 2c 20 33 2c 20 20 20 36 29 3b 0a 20  1, 2, 3,   6);. 
0840: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
0850: 56 41 4c 55 45 53 28 31 2c 20 33 2c 20 31 2c 20  VALUES(1, 3, 1, 
0860: 20 20 37 29 3b 0a 20 20 49 4e 53 45 52 54 20 49    7);.  INSERT I
0870: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c  NTO t2 VALUES(1,
0880: 20 33 2c 20 32 2c 20 20 20 38 29 3b 0a 20 20 49   3, 2,   8);.  I
0890: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
08a0: 4c 55 45 53 28 31 2c 20 33 2c 20 33 2c 20 20 20  LUES(1, 3, 3,   
08b0: 39 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e  9);..  INSERT IN
08c0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 32 2c 20  TO t2 VALUES(2, 
08d0: 31 2c 20 31 2c 20 20 20 31 30 29 3b 0a 20 20 49  1, 1,   10);.  I
08e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
08f0: 4c 55 45 53 28 32 2c 20 31 2c 20 32 2c 20 20 20  LUES(2, 1, 2,   
0900: 31 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  11);.  INSERT IN
0910: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 32 2c 20  TO t2 VALUES(2, 
0920: 31 2c 20 33 2c 20 20 20 31 32 29 3b 0a 20 20 49  1, 3,   12);.  I
0930: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
0940: 4c 55 45 53 28 32 2c 20 32 2c 20 31 2c 20 20 20  LUES(2, 2, 1,   
0950: 31 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  13);.  INSERT IN
0960: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 32 2c 20  TO t2 VALUES(2, 
0970: 32 2c 20 32 2c 20 20 20 31 34 29 3b 0a 20 20 49  2, 2,   14);.  I
0980: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
0990: 4c 55 45 53 28 32 2c 20 32 2c 20 33 2c 20 20 20  LUES(2, 2, 3,   
09a0: 31 35 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  15);.  INSERT IN
09b0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 32 2c 20  TO t2 VALUES(2, 
09c0: 33 2c 20 31 2c 20 20 20 31 36 29 3b 0a 20 20 49  3, 1,   16);.  I
09d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
09e0: 4c 55 45 53 28 32 2c 20 33 2c 20 32 2c 20 20 20  LUES(2, 3, 2,   
09f0: 31 37 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  17);.  INSERT IN
0a00: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 32 2c 20  TO t2 VALUES(2, 
0a10: 33 2c 20 33 2c 20 20 20 31 38 29 3b 0a 0a 20 20  3, 3,   18);..  
0a20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
0a30: 41 4c 55 45 53 28 33 2c 20 31 2c 20 31 2c 20 20  ALUES(3, 1, 1,  
0a40: 20 31 39 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   19);.  INSERT I
0a50: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c  NTO t2 VALUES(3,
0a60: 20 31 2c 20 32 2c 20 20 20 32 30 29 3b 0a 20 20   1, 2,   20);.  
0a70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
0a80: 41 4c 55 45 53 28 33 2c 20 31 2c 20 33 2c 20 20  ALUES(3, 1, 3,  
0a90: 20 32 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   21);.  INSERT I
0aa0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c  NTO t2 VALUES(3,
0ab0: 20 32 2c 20 31 2c 20 20 20 32 32 29 3b 0a 20 20   2, 1,   22);.  
0ac0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
0ad0: 41 4c 55 45 53 28 33 2c 20 32 2c 20 32 2c 20 20  ALUES(3, 2, 2,  
0ae0: 20 32 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   23);.  INSERT I
0af0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c  NTO t2 VALUES(3,
0b00: 20 32 2c 20 33 2c 20 20 20 32 34 29 3b 0a 20 20   2, 3,   24);.  
0b10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
0b20: 41 4c 55 45 53 28 33 2c 20 33 2c 20 31 2c 20 20  ALUES(3, 3, 1,  
0b30: 20 32 35 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   25);.  INSERT I
0b40: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c  NTO t2 VALUES(3,
0b50: 20 33 2c 20 32 2c 20 20 20 32 36 29 3b 0a 20 20   3, 2,   26);.  
0b60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
0b70: 41 4c 55 45 53 28 33 2c 20 33 2c 20 33 2c 20 20  ALUES(3, 3, 3,  
0b80: 20 32 37 29 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68   27);.}..foreach
0b90: 20 7b 6e 6d 20 69 64 78 7d 20 7b 0a 20 20 69 64   {nm idx} {.  id
0ba0: 78 31 20 7b 7d 0a 20 20 69 64 78 32 20 7b 20 43  x1 {}.  idx2 { C
0bb0: 52 45 41 54 45 20 49 4e 44 45 58 20 74 32 61 62  REATE INDEX t2ab
0bc0: 63 20 4f 4e 20 74 32 28 61 2c 20 62 2c 20 63 29  c ON t2(a, b, c)
0bd0: 3b 20 7d 0a 20 20 69 64 78 33 20 7b 20 43 52 45  ; }.  idx3 { CRE
0be0: 41 54 45 20 49 4e 44 45 58 20 74 32 61 62 63 20  ATE INDEX t2abc 
0bf0: 4f 4e 20 74 32 28 61 2c 20 62 20 44 45 53 43 2c  ON t2(a, b DESC,
0c00: 20 63 29 3b 20 7d 0a 20 20 69 64 78 34 20 7b 20   c); }.  idx4 { 
0c10: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 32 61  CREATE INDEX t2a
0c20: 62 63 20 4f 4e 20 74 32 28 61 20 44 45 53 43 2c  bc ON t2(a DESC,
0c30: 20 62 20 44 45 53 43 2c 20 63 20 44 45 53 43 29   b DESC, c DESC)
0c40: 3b 20 7d 0a 20 20 69 64 78 35 20 7b 20 43 52 45  ; }.  idx5 { CRE
0c50: 41 54 45 20 49 4e 44 45 58 20 74 32 61 62 63 20  ATE INDEX t2abc 
0c60: 4f 4e 20 74 32 28 61 20 41 53 43 2c 20 62 20 41  ON t2(a ASC, b A
0c70: 53 43 2c 20 63 20 41 53 43 29 3b 20 7d 0a 20 20  SC, c ASC); }.  
0c80: 69 64 78 36 20 7b 20 43 52 45 41 54 45 20 49 4e  idx6 { CREATE IN
0c90: 44 45 58 20 74 32 61 62 63 20 4f 4e 20 74 32 28  DEX t2abc ON t2(
0ca0: 61 20 44 45 53 43 2c 20 62 2c 20 63 29 3b 20 7d  a DESC, b, c); }
0cb0: 0a 20 20 69 64 78 37 20 7b 20 43 52 45 41 54 45  .  idx7 { CREATE
0cc0: 20 49 4e 44 45 58 20 74 32 61 62 63 20 4f 4e 20   INDEX t2abc ON 
0cd0: 74 32 28 61 20 44 45 53 43 2c 20 62 20 44 45 53  t2(a DESC, b DES
0ce0: 43 29 20 7d 0a 20 20 69 64 78 38 20 7b 20 43 52  C) }.  idx8 { CR
0cf0: 45 41 54 45 20 49 4e 44 45 58 20 74 32 61 62 63  EATE INDEX t2abc
0d00: 20 4f 4e 20 74 32 28 63 2c 20 62 2c 20 61 29 3b   ON t2(c, b, a);
0d10: 20 7d 0a 20 20 69 64 78 39 20 7b 20 43 52 45 41   }.  idx9 { CREA
0d20: 54 45 20 49 4e 44 45 58 20 74 32 64 20 4f 4e 20  TE INDEX t2d ON 
0d30: 74 32 28 64 29 3b 20 7d 0a 20 20 69 64 78 31 30  t2(d); }.  idx10
0d40: 20 7b 20 43 52 45 41 54 45 20 49 4e 44 45 58 20   { CREATE INDEX 
0d50: 74 32 61 62 63 20 4f 4e 20 74 32 28 61 20 44 45  t2abc ON t2(a DE
0d60: 53 43 2c 20 62 2c 20 63 20 44 45 53 43 29 3b 20  SC, b, c DESC); 
0d70: 7d 0a 7d 20 7b 0a 20 20 64 72 6f 70 5f 61 6c 6c  }.} {.  drop_all
0d80: 5f 69 6e 64 65 78 65 73 0a 20 20 65 78 65 63 73  _indexes.  execs
0d90: 71 6c 20 24 69 64 78 0a 0a 20 20 66 6f 72 65 61  ql $idx..  forea
0da0: 63 68 20 7b 74 6e 20 77 68 65 72 65 20 72 65 73  ch {tn where res
0db0: 7d 20 7b 0a 20 20 20 20 31 20 22 28 61 2c 20 62  } {.    1 "(a, b
0dc0: 2c 20 63 29 20 3c 20 28 32 2c 20 32 2c 20 32 29  , c) < (2, 2, 2)
0dd0: 22 20 20 7b 31 20 32 20 33 20 34 20 35 20 36 20  "  {1 2 3 4 5 6 
0de0: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31  7 8 9 10 11 12 1
0df0: 33 7d 0a 20 20 20 20 32 20 22 28 61 2c 20 62 2c  3}.    2 "(a, b,
0e00: 20 63 29 20 3c 3d 20 28 32 2c 20 32 2c 20 32 29   c) <= (2, 2, 2)
0e10: 22 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  " {1 2 3 4 5 6 7
0e20: 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33   8 9 10 11 12 13
0e30: 20 31 34 7d 0a 20 20 20 20 33 20 22 28 61 2c 20   14}.    3 "(a, 
0e40: 62 2c 20 63 29 20 3e 20 28 32 2c 20 32 2c 20 32  b, c) > (2, 2, 2
0e50: 29 22 20 20 7b 31 35 20 31 36 20 31 37 20 31 38  )"  {15 16 17 18
0e60: 20 31 39 20 32 30 20 32 31 20 32 32 20 32 33 20   19 20 21 22 23 
0e70: 32 34 20 32 35 20 32 36 20 32 37 7d 0a 20 20 20  24 25 26 27}.   
0e80: 20 34 20 22 28 61 2c 20 62 2c 20 63 29 20 3e 3d   4 "(a, b, c) >=
0e90: 20 28 32 2c 20 32 2c 20 32 29 22 20 7b 31 34 20   (2, 2, 2)" {14 
0ea0: 31 35 20 31 36 20 31 37 20 31 38 20 31 39 20 32  15 16 17 18 19 2
0eb0: 30 20 32 31 20 32 32 20 32 33 20 32 34 20 32 35  0 21 22 23 24 25
0ec0: 20 32 36 20 32 37 7d 0a 20 20 20 20 35 20 22 28   26 27}.    5 "(
0ed0: 61 2c 20 62 2c 20 63 29 20 3e 3d 20 28 32 2c 20  a, b, c) >= (2, 
0ee0: 32 2c 20 4e 55 4c 4c 29 22 20 7b 31 36 20 31 37  2, NULL)" {16 17
0ef0: 20 31 38 20 31 39 20 32 30 20 32 31 20 32 32 20   18 19 20 21 22 
0f00: 32 33 20 32 34 20 32 35 20 32 36 20 32 37 7d 0a  23 24 25 26 27}.
0f10: 20 20 20 20 36 20 22 28 61 2c 20 62 2c 20 63 29      6 "(a, b, c)
0f20: 20 3c 3d 20 28 32 2c 20 32 2c 20 4e 55 4c 4c 29   <= (2, 2, NULL)
0f30: 22 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  " {1 2 3 4 5 6 7
0f40: 20 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a 20   8 9 10 11 12}. 
0f50: 20 20 20 37 20 22 28 61 2c 20 62 2c 20 63 29 20     7 "(a, b, c) 
0f60: 3e 3d 20 28 32 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  >= (2, NULL, NUL
0f70: 4c 29 22 20 7b 31 39 20 32 30 20 32 31 20 32 32  L)" {19 20 21 22
0f80: 20 32 33 20 32 34 20 32 35 20 32 36 20 32 37 7d   23 24 25 26 27}
0f90: 0a 20 20 20 20 38 20 22 28 61 2c 20 62 2c 20 63  .    8 "(a, b, c
0fa0: 29 20 3c 3d 20 28 32 2c 20 4e 55 4c 4c 2c 20 4e  ) <= (2, NULL, N
0fb0: 55 4c 4c 29 22 20 7b 31 20 32 20 33 20 34 20 35  ULL)" {1 2 3 4 5
0fc0: 20 36 20 37 20 38 20 39 7d 0a 0a 20 20 20 20 39   6 7 8 9}..    9
0fd0: 20 22 28 61 2c 20 62 2c 20 63 29 20 3c 20 28 53   "(a, b, c) < (S
0fe0: 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52  ELECT a, b, c FR
0ff0: 4f 4d 20 74 32 20 57 48 45 52 45 20 64 3d 31 34  OM t2 WHERE d=14
1000: 29 22 20 20 0a 20 20 20 20 20 20 7b 31 20 32 20  )"  .      {1 2 
1010: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
1020: 20 31 31 20 31 32 20 31 33 7d 0a 0a 20 20 20 20   11 12 13}..    
1030: 31 30 20 22 28 61 2c 20 62 2c 20 63 29 20 3d 20  10 "(a, b, c) = 
1040: 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20  (SELECT a, b, c 
1050: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 64 3d  FROM t2 WHERE d=
1060: 31 34 29 22 20 31 34 0a 0a 20 20 20 20 31 31 20  14)" 14..    11 
1070: 22 61 20 3d 20 32 20 41 4e 44 20 28 62 2c 20 63  "a = 2 AND (b, c
1080: 29 20 3e 20 28 32 2c 20 32 29 22 20 7b 31 35 20  ) > (2, 2)" {15 
1090: 31 36 20 31 37 20 31 38 7d 0a 20 20 20 20 31 32  16 17 18}.    12
10a0: 20 22 61 20 3d 20 32 20 41 4e 44 20 28 62 2c 20   "a = 2 AND (b, 
10b0: 63 29 20 3c 20 28 33 2c 20 33 29 20 41 4e 44 20  c) < (3, 3) AND 
10c0: 28 62 2c 20 63 29 20 3e 20 28 31 2c 20 31 29 22  (b, c) > (1, 1)"
10d0: 20 7b 31 31 20 31 32 20 31 33 20 31 34 20 31 35   {11 12 13 14 15
10e0: 20 31 36 20 31 37 7d 0a 20 20 7d 20 7b 0a 20 20   16 17}.  } {.  
10f0: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 64 62    set result [db
1100: 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 64 20   eval "SELECT d 
1110: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 24 77  FROM t2 WHERE $w
1120: 68 65 72 65 22 5d 0a 20 20 20 20 64 6f 5f 74 65  here"].    do_te
1130: 73 74 20 32 2e 31 2e 24 6e 6d 2e 24 74 6e 20 7b  st 2.1.$nm.$tn {
1140: 20 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20   lsort -integer 
1150: 24 72 65 73 75 6c 74 20 7d 20 24 72 65 73 0a 20  $result } $res. 
1160: 20 7d 0a 0a 20 20 66 6f 72 65 61 63 68 20 7b 74   }..  foreach {t
1170: 6e 20 65 20 72 65 73 7d 20 7b 0a 20 20 20 20 31  n e res} {.    1
1180: 20 22 28 32 2c 20 31 29 20 49 4e 20 28 53 45 4c   "(2, 1) IN (SEL
1190: 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 32  ECT a, b FROM t2
11a0: 29 22 20 31 0a 20 20 20 20 32 20 22 28 32 2c 20  )" 1.    2 "(2, 
11b0: 31 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61 2c  1) IN (SELECT a,
11c0: 20 62 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52   b FROM t2 ORDER
11d0: 20 42 59 20 64 29 22 20 31 0a 20 20 20 20 33 20   BY d)" 1.    3 
11e0: 22 28 32 2c 20 31 29 20 49 4e 20 28 53 45 4c 45  "(2, 1) IN (SELE
11f0: 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 32 20  CT a, b FROM t2 
1200: 4f 52 44 45 52 20 42 59 20 64 20 4c 49 4d 49 54  ORDER BY d LIMIT
1210: 20 39 29 22 20 30 0a 20 20 20 20 34 20 22 28 32   9)" 0.    4 "(2
1220: 2c 20 31 29 20 49 4e 20 28 53 45 4c 45 43 54 20  , 1) IN (SELECT 
1230: 61 2c 20 62 20 46 52 4f 4d 20 74 32 20 4f 52 44  a, b FROM t2 ORD
1240: 45 52 20 42 59 20 64 20 4c 49 4d 49 54 20 31 30  ER BY d LIMIT 10
1250: 29 22 20 31 0a 0a 20 20 20 20 35 20 22 28 33 2c  )" 1..    5 "(3,
1260: 20 33 29 20 3d 20 28 53 45 4c 45 43 54 20 61 2c   3) = (SELECT a,
1270: 20 62 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52   b FROM t2 ORDER
1280: 20 42 59 20 64 20 44 45 53 43 20 4c 49 4d 49 54   BY d DESC LIMIT
1290: 20 31 29 22 20 31 0a 20 20 20 20 36 20 22 28 33   1)" 1.    6 "(3
12a0: 2c 20 33 29 20 3d 20 28 53 45 4c 45 43 54 20 61  , 3) = (SELECT a
12b0: 2c 20 62 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  , b FROM t2 ORDE
12c0: 52 20 42 59 20 64 20 41 53 43 20 4c 49 4d 49 54  R BY d ASC LIMIT
12d0: 20 31 29 22 20 30 0a 20 20 20 20 37 20 22 28 31   1)" 0.    7 "(1
12e0: 2c 20 4e 55 4c 4c 29 20 3d 20 28 53 45 4c 45 43  , NULL) = (SELEC
12f0: 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 32 20 4f  T a, b FROM t2 O
1300: 52 44 45 52 20 42 59 20 64 20 41 53 43 20 4c 49  RDER BY d ASC LI
1310: 4d 49 54 20 31 29 22 20 7b 7b 7d 7d 0a 0a 20 20  MIT 1)" {{}}..  
1320: 20 20 38 20 22 28 33 2c 20 31 29 20 3d 20 28 53    8 "(3, 1) = (S
1330: 45 4c 45 43 54 20 62 2c 20 63 20 46 52 4f 4d 20  ELECT b, c FROM 
1340: 74 32 20 4f 52 44 45 52 20 42 59 20 64 20 44 45  t2 ORDER BY d DE
1350: 53 43 20 4c 49 4d 49 54 20 31 20 4f 46 46 53 45  SC LIMIT 1 OFFSE
1360: 54 20 32 29 22 20 31 0a 20 20 20 20 39 20 22 28  T 2)" 1.    9 "(
1370: 33 2c 20 31 29 20 3d 20 28 53 45 4c 45 43 54 20  3, 1) = (SELECT 
1380: 62 2c 20 63 20 46 52 4f 4d 20 74 32 20 4f 52 44  b, c FROM t2 ORD
1390: 45 52 20 42 59 20 64 20 41 53 43 20 4c 49 4d 49  ER BY d ASC LIMI
13a0: 54 20 31 20 4f 46 46 53 45 54 20 32 29 22 20 30  T 1 OFFSET 2)" 0
13b0: 0a 20 20 20 20 31 30 20 22 28 31 2c 20 4e 55 4c  .    10 "(1, NUL
13c0: 4c 29 20 3d 20 28 53 45 4c 45 43 54 20 62 2c 20  L) = (SELECT b, 
13d0: 63 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  c FROM t2 ORDER 
13e0: 42 59 20 64 20 41 53 43 20 4c 49 4d 49 54 20 31  BY d ASC LIMIT 1
13f0: 20 4f 46 46 53 45 54 20 32 29 22 20 7b 7b 7d 7d   OFFSET 2)" {{}}
1400: 0a 0a 20 20 20 20 31 31 20 22 28 33 2c 20 33 29  ..    11 "(3, 3)
1410: 20 3d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 61   = (SELECT max(a
1420: 29 2c 20 6d 61 78 28 62 29 20 46 52 4f 4d 20 74  ), max(b) FROM t
1430: 32 29 22 20 31 0a 20 20 20 20 31 32 20 22 28 33  2)" 1.    12 "(3
1440: 2c 20 31 29 20 3d 20 28 53 45 4c 45 43 54 20 6d  , 1) = (SELECT m
1450: 61 78 28 61 29 2c 20 6d 69 6e 28 62 29 20 46 52  ax(a), min(b) FR
1460: 4f 4d 20 74 32 29 22 20 31 0a 20 20 20 20 31 33  OM t2)" 1.    13
1470: 20 22 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 20 3d   "(NULL, NULL) =
1480: 20 28 53 45 4c 45 43 54 20 6d 61 78 28 61 29 2c   (SELECT max(a),
1490: 20 6d 69 6e 28 62 29 20 46 52 4f 4d 20 74 32 29   min(b) FROM t2)
14a0: 22 20 7b 7b 7d 7d 0a 0a 20 20 20 20 31 34 20 22  " {{}}..    14 "
14b0: 28 32 2c 20 31 29 20 49 4e 20 28 53 45 4c 45 43  (2, 1) IN (SELEC
14c0: 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 32 20 4f  T a, b FROM t2 O
14d0: 52 44 45 52 20 42 59 20 64 20 4c 49 4d 49 54 20  RDER BY d LIMIT 
14e0: 35 20 4f 46 46 53 45 54 20 31 31 29 22 20 31 0a  5 OFFSET 11)" 1.
14f0: 20 20 20 20 31 35 20 22 28 32 2c 20 31 29 20 49      15 "(2, 1) I
1500: 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62 20 46  N (SELECT a, b F
1510: 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
1520: 64 20 4c 49 4d 49 54 20 35 20 4f 46 46 53 45 54  d LIMIT 5 OFFSET
1530: 20 31 32 29 22 20 30 0a 20 20 7d 20 7b 0a 20 20   12)" 0.  } {.  
1540: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
1550: 74 20 32 2e 32 2e 24 6e 6d 2e 24 74 6e 20 22 53  t 2.2.$nm.$tn "S
1560: 45 4c 45 43 54 20 24 65 22 20 24 72 65 73 0a 20  ELECT $e" $res. 
1570: 20 7d 0a 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20   }.}..ifcapable 
1580: 73 74 61 74 34 20 7b 0a 20 20 64 6f 5f 65 78 65  stat4 {.  do_exe
1590: 63 73 71 6c 5f 74 65 73 74 20 33 2e 30 20 7b 0a  csql_test 3.0 {.
15a0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
15b0: 20 63 31 28 61 2c 20 62 2c 20 63 2c 20 64 29 3b   c1(a, b, c, d);
15c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
15d0: 20 63 31 28 61 2c 20 62 29 20 56 41 4c 55 45 53   c1(a, b) VALUES
15e0: 28 31 2c 20 27 61 27 29 3b 0a 20 20 20 20 49 4e  (1, 'a');.    IN
15f0: 53 45 52 54 20 49 4e 54 4f 20 63 31 28 61 2c 20  SERT INTO c1(a, 
1600: 62 29 20 56 41 4c 55 45 53 28 31 2c 20 27 62 27  b) VALUES(1, 'b'
1610: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
1620: 54 4f 20 63 31 28 61 2c 20 62 29 20 56 41 4c 55  TO c1(a, b) VALU
1630: 45 53 28 31 2c 20 27 63 27 29 3b 0a 20 20 20 20  ES(1, 'c');.    
1640: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 28 61  INSERT INTO c1(a
1650: 2c 20 62 29 20 56 41 4c 55 45 53 28 31 2c 20 27  , b) VALUES(1, '
1660: 64 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  d');.    INSERT 
1670: 49 4e 54 4f 20 63 31 28 61 2c 20 62 29 20 56 41  INTO c1(a, b) VA
1680: 4c 55 45 53 28 31 2c 20 27 65 27 29 3b 0a 20 20  LUES(1, 'e');.  
1690: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31    INSERT INTO c1
16a0: 28 61 2c 20 62 29 20 56 41 4c 55 45 53 28 31 2c  (a, b) VALUES(1,
16b0: 20 27 66 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'f');.    INSER
16c0: 54 20 49 4e 54 4f 20 63 31 28 61 2c 20 62 29 20  T INTO c1(a, b) 
16d0: 56 41 4c 55 45 53 28 31 2c 20 27 67 27 29 3b 0a  VALUES(1, 'g');.
16e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
16f0: 63 31 28 61 2c 20 62 29 20 56 41 4c 55 45 53 28  c1(a, b) VALUES(
1700: 31 2c 20 27 68 27 29 3b 0a 20 20 20 20 49 4e 53  1, 'h');.    INS
1710: 45 52 54 20 49 4e 54 4f 20 63 31 28 61 2c 20 62  ERT INTO c1(a, b
1720: 29 20 56 41 4c 55 45 53 28 31 2c 20 27 69 27 29  ) VALUES(1, 'i')
1730: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1740: 4f 20 63 31 28 61 2c 20 62 29 20 56 41 4c 55 45  O c1(a, b) VALUE
1750: 53 28 31 2c 20 27 6a 27 29 3b 0a 20 20 20 20 49  S(1, 'j');.    I
1760: 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 28 61 2c  NSERT INTO c1(a,
1770: 20 62 29 20 56 41 4c 55 45 53 28 31 2c 20 27 6b   b) VALUES(1, 'k
1780: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
1790: 4e 54 4f 20 63 31 28 61 2c 20 62 29 20 56 41 4c  NTO c1(a, b) VAL
17a0: 55 45 53 28 31 2c 20 27 6c 27 29 3b 0a 20 20 20  UES(1, 'l');.   
17b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 28   INSERT INTO c1(
17c0: 61 2c 20 62 29 20 56 41 4c 55 45 53 28 31 2c 20  a, b) VALUES(1, 
17d0: 27 6d 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'm');.    INSERT
17e0: 20 49 4e 54 4f 20 63 31 28 61 2c 20 62 29 20 56   INTO c1(a, b) V
17f0: 41 4c 55 45 53 28 31 2c 20 27 6e 27 29 3b 0a 20  ALUES(1, 'n');. 
1800: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
1810: 31 28 61 2c 20 62 29 20 56 41 4c 55 45 53 28 31  1(a, b) VALUES(1
1820: 2c 20 27 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45  , 'o');.    INSE
1830: 52 54 20 49 4e 54 4f 20 63 31 28 61 2c 20 62 29  RT INTO c1(a, b)
1840: 20 56 41 4c 55 45 53 28 31 2c 20 27 70 27 29 3b   VALUES(1, 'p');
1850: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1860: 20 63 31 28 61 2c 20 62 29 20 56 41 4c 55 45 53   c1(a, b) VALUES
1870: 28 32 2c 20 27 61 27 29 3b 0a 20 20 20 20 49 4e  (2, 'a');.    IN
1880: 53 45 52 54 20 49 4e 54 4f 20 63 31 28 61 2c 20  SERT INTO c1(a, 
1890: 62 29 20 56 41 4c 55 45 53 28 32 2c 20 27 62 27  b) VALUES(2, 'b'
18a0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
18b0: 54 4f 20 63 31 28 61 2c 20 62 29 20 56 41 4c 55  TO c1(a, b) VALU
18c0: 45 53 28 32 2c 20 27 63 27 29 3b 0a 20 20 20 20  ES(2, 'c');.    
18d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 28 61  INSERT INTO c1(a
18e0: 2c 20 62 29 20 56 41 4c 55 45 53 28 32 2c 20 27  , b) VALUES(2, '
18f0: 64 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  d');.    INSERT 
1900: 49 4e 54 4f 20 63 31 28 61 2c 20 62 29 20 56 41  INTO c1(a, b) VA
1910: 4c 55 45 53 28 32 2c 20 27 65 27 29 3b 0a 20 20  LUES(2, 'e');.  
1920: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31    INSERT INTO c1
1930: 28 61 2c 20 62 29 20 56 41 4c 55 45 53 28 32 2c  (a, b) VALUES(2,
1940: 20 27 66 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'f');.    INSER
1950: 54 20 49 4e 54 4f 20 63 31 28 61 2c 20 62 29 20  T INTO c1(a, b) 
1960: 56 41 4c 55 45 53 28 32 2c 20 27 67 27 29 3b 0a  VALUES(2, 'g');.
1970: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1980: 63 31 28 61 2c 20 62 29 20 56 41 4c 55 45 53 28  c1(a, b) VALUES(
1990: 32 2c 20 27 68 27 29 3b 0a 0a 20 20 20 20 49 4e  2, 'h');..    IN
19a0: 53 45 52 54 20 49 4e 54 4f 20 63 31 28 63 2c 20  SERT INTO c1(c, 
19b0: 64 29 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46  d) SELECT a, b F
19c0: 52 4f 4d 20 63 31 3b 0a 0a 20 20 20 20 43 52 45  ROM c1;..    CRE
19d0: 41 54 45 20 49 4e 44 45 58 20 63 31 61 62 20 4f  ATE INDEX c1ab O
19e0: 4e 20 63 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  N c1(a, b);.    
19f0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 63 31 63  CREATE INDEX c1c
1a00: 64 20 4f 4e 20 63 31 28 63 2c 20 64 29 3b 0a 20  d ON c1(c, d);. 
1a10: 20 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 7d 0a     ANALYZE;.  }.
1a20: 0a 20 20 64 6f 5f 65 71 70 5f 74 65 73 74 20 33  .  do_eqp_test 3
1a30: 2e 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 2a 20  .1.1 { SELECT * 
1a40: 46 52 4f 4d 20 63 31 20 57 48 45 52 45 20 61 3d  FROM c1 WHERE a=
1a50: 31 20 41 4e 44 20 63 3d 32 20 7d 20 7b 0a 20 20  1 AND c=2 } {.  
1a60: 20 20 30 20 30 20 30 20 7b 53 45 41 52 43 48 20    0 0 0 {SEARCH 
1a70: 54 41 42 4c 45 20 63 31 20 55 53 49 4e 47 20 49  TABLE c1 USING I
1a80: 4e 44 45 58 20 63 31 63 64 20 28 63 3d 3f 29 7d  NDEX c1cd (c=?)}
1a90: 0a 20 20 7d 0a 20 20 64 6f 5f 65 71 70 5f 74 65  .  }.  do_eqp_te
1aa0: 73 74 20 33 2e 31 2e 32 20 7b 20 53 45 4c 45 43  st 3.1.2 { SELEC
1ab0: 54 20 2a 20 46 52 4f 4d 20 63 31 20 57 48 45 52  T * FROM c1 WHER
1ac0: 45 20 61 3d 31 20 41 4e 44 20 62 3e 27 64 27 20  E a=1 AND b>'d' 
1ad0: 41 4e 44 20 63 3d 32 20 7d 20 7b 0a 20 20 20 20  AND c=2 } {.    
1ae0: 30 20 30 20 30 20 7b 53 45 41 52 43 48 20 54 41  0 0 0 {SEARCH TA
1af0: 42 4c 45 20 63 31 20 55 53 49 4e 47 20 49 4e 44  BLE c1 USING IND
1b00: 45 58 20 63 31 63 64 20 28 63 3d 3f 29 7d 0a 20  EX c1cd (c=?)}. 
1b10: 20 7d 0a 20 20 64 6f 5f 65 71 70 5f 74 65 73 74   }.  do_eqp_test
1b20: 20 33 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54 20   3.1.3 { SELECT 
1b30: 2a 20 46 52 4f 4d 20 63 31 20 57 48 45 52 45 20  * FROM c1 WHERE 
1b40: 61 3d 31 20 41 4e 44 20 62 3e 27 6c 27 20 41 4e  a=1 AND b>'l' AN
1b50: 44 20 63 3d 32 20 7d 20 7b 0a 20 20 20 20 30 20  D c=2 } {.    0 
1b60: 30 20 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c  0 0 {SEARCH TABL
1b70: 45 20 63 31 20 55 53 49 4e 47 20 49 4e 44 45 58  E c1 USING INDEX
1b80: 20 63 31 61 62 20 28 61 3d 3f 20 41 4e 44 20 62   c1ab (a=? AND b
1b90: 3e 3f 29 7d 0a 20 20 7d 0a 0a 20 20 64 6f 5f 65  >?)}.  }..  do_e
1ba0: 71 70 5f 74 65 73 74 20 33 2e 32 2e 31 20 7b 20  qp_test 3.2.1 { 
1bb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 31  SELECT * FROM c1
1bc0: 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20 63   WHERE a=1 AND c
1bd0: 3e 31 20 7d 20 7b 0a 20 20 20 20 30 20 30 20 30  >1 } {.    0 0 0
1be0: 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 63   {SEARCH TABLE c
1bf0: 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20 63 31  1 USING INDEX c1
1c00: 63 64 20 28 63 3e 3f 29 7d 0a 20 20 7d 0a 20 20  cd (c>?)}.  }.  
1c10: 64 6f 5f 65 71 70 5f 74 65 73 74 20 33 2e 32 2e  do_eqp_test 3.2.
1c20: 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2 { SELECT * FRO
1c30: 4d 20 63 31 20 57 48 45 52 45 20 61 3d 31 20 41  M c1 WHERE a=1 A
1c40: 4e 44 20 63 3e 30 20 7d 20 7b 0a 20 20 20 20 30  ND c>0 } {.    0
1c50: 20 30 20 30 20 7b 53 45 41 52 43 48 20 54 41 42   0 0 {SEARCH TAB
1c60: 4c 45 20 63 31 20 55 53 49 4e 47 20 49 4e 44 45  LE c1 USING INDE
1c70: 58 20 63 31 61 62 20 28 61 3d 3f 29 7d 0a 20 20  X c1ab (a=?)}.  
1c80: 7d 0a 20 20 64 6f 5f 65 71 70 5f 74 65 73 74 20  }.  do_eqp_test 
1c90: 33 2e 32 2e 33 20 7b 20 53 45 4c 45 43 54 20 2a  3.2.3 { SELECT *
1ca0: 20 46 52 4f 4d 20 63 31 20 57 48 45 52 45 20 61   FROM c1 WHERE a
1cb0: 3d 31 20 41 4e 44 20 63 3e 3d 31 20 7d 20 7b 0a  =1 AND c>=1 } {.
1cc0: 20 20 20 20 30 20 30 20 30 20 7b 53 45 41 52 43      0 0 0 {SEARC
1cd0: 48 20 54 41 42 4c 45 20 63 31 20 55 53 49 4e 47  H TABLE c1 USING
1ce0: 20 49 4e 44 45 58 20 63 31 61 62 20 28 61 3d 3f   INDEX c1ab (a=?
1cf0: 29 7d 0a 20 20 7d 0a 20 20 64 6f 5f 65 71 70 5f  )}.  }.  do_eqp_
1d00: 74 65 73 74 20 33 2e 32 2e 34 20 7b 20 53 45 4c  test 3.2.4 { SEL
1d10: 45 43 54 20 2a 20 46 52 4f 4d 20 63 31 20 57 48  ECT * FROM c1 WH
1d20: 45 52 45 20 61 3d 31 20 41 4e 44 20 28 63 2c 20  ERE a=1 AND (c, 
1d30: 64 29 3e 28 31 2c 20 27 63 27 29 20 7d 20 7b 0a  d)>(1, 'c') } {.
1d40: 20 20 20 20 30 20 30 20 30 20 7b 53 45 41 52 43      0 0 0 {SEARC
1d50: 48 20 54 41 42 4c 45 20 63 31 20 55 53 49 4e 47  H TABLE c1 USING
1d60: 20 49 4e 44 45 58 20 63 31 61 62 20 28 61 3d 3f   INDEX c1ab (a=?
1d70: 29 7d 0a 20 20 7d 0a 20 20 64 6f 5f 65 71 70 5f  )}.  }.  do_eqp_
1d80: 74 65 73 74 20 33 2e 32 2e 35 20 7b 20 53 45 4c  test 3.2.5 { SEL
1d90: 45 43 54 20 2a 20 46 52 4f 4d 20 63 31 20 57 48  ECT * FROM c1 WH
1da0: 45 52 45 20 61 3d 31 20 41 4e 44 20 28 63 2c 20  ERE a=1 AND (c, 
1db0: 64 29 3e 28 31 2c 20 27 6f 27 29 20 7d 20 7b 0a  d)>(1, 'o') } {.
1dc0: 20 20 20 20 30 20 30 20 30 20 7b 53 45 41 52 43      0 0 0 {SEARC
1dd0: 48 20 54 41 42 4c 45 20 63 31 20 55 53 49 4e 47  H TABLE c1 USING
1de0: 20 49 4e 44 45 58 20 63 31 63 64 20 28 28 63 2c   INDEX c1cd ((c,
1df0: 64 29 3e 28 3f 2c 3f 29 29 7d 0a 20 20 7d 0a 20  d)>(?,?))}.  }. 
1e00: 20 64 6f 5f 65 71 70 5f 74 65 73 74 20 33 2e 32   do_eqp_test 3.2
1e10: 2e 36 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .6 { SELECT * FR
1e20: 4f 4d 20 63 31 20 57 48 45 52 45 20 61 3d 31 20  OM c1 WHERE a=1 
1e30: 41 4e 44 20 28 63 2c 20 2b 62 29 3e 28 31 2c 20  AND (c, +b)>(1, 
1e40: 27 63 27 29 20 7d 20 7b 0a 20 20 20 20 30 20 30  'c') } {.    0 0
1e50: 20 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45   0 {SEARCH TABLE
1e60: 20 63 31 20 55 53 49 4e 47 20 49 4e 44 45 58 20   c1 USING INDEX 
1e70: 63 31 61 62 20 28 61 3d 3f 29 7d 0a 20 20 7d 0a  c1ab (a=?)}.  }.
1e80: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
1e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 64 6f  ------------..do
1ed0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e  _execsql_test 5.
1ee0: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
1ef0: 4c 45 20 64 31 28 78 2c 20 79 29 3b 0a 20 20 43  LE d1(x, y);.  C
1f00: 52 45 41 54 45 20 54 41 42 4c 45 20 64 32 28 61  REATE TABLE d2(a
1f10: 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54  , b, c);.  CREAT
1f20: 45 20 49 4e 44 45 58 20 64 32 61 62 20 4f 4e 20  E INDEX d2ab ON 
1f30: 64 32 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41  d2(a, b);.  CREA
1f40: 54 45 20 49 4e 44 45 58 20 64 32 63 20 4f 4e 20  TE INDEX d2c ON 
1f50: 64 32 28 63 29 3b 0a 0a 20 20 57 49 54 48 20 69  d2(c);..  WITH i
1f60: 28 69 29 20 41 53 20 28 0a 20 20 20 20 56 41 4c  (i) AS (.    VAL
1f70: 55 45 53 28 31 29 20 55 4e 49 4f 4e 20 41 4c 4c  UES(1) UNION ALL
1f80: 20 53 45 4c 45 43 54 20 69 2b 31 20 46 52 4f 4d   SELECT i+1 FROM
1f90: 20 69 20 57 48 45 52 45 20 69 3c 31 30 30 30 0a   i WHERE i<1000.
1fa0: 20 20 29 0a 20 20 49 4e 53 45 52 54 20 49 4e 54    ).  INSERT INT
1fb0: 4f 20 64 32 20 53 45 4c 45 43 54 20 69 2f 33 2c  O d2 SELECT i/3,
1fc0: 20 69 25 33 2c 20 69 2f 33 20 46 52 4f 4d 20 69   i%3, i/3 FROM i
1fd0: 3b 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 7d 0a 0a  ;.  ANALYZE;.}..
1fe0: 64 6f 5f 65 71 70 5f 74 65 73 74 20 35 2e 31 20  do_eqp_test 5.1 
1ff0: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
2000: 4d 20 64 32 20 57 48 45 52 45 20 0a 20 20 20 20  M d2 WHERE .    
2010: 28 61 2c 20 62 29 20 49 4e 20 28 53 45 4c 45 43  (a, b) IN (SELEC
2020: 54 20 78 2c 20 79 20 46 52 4f 4d 20 64 31 29 20  T x, y FROM d1) 
2030: 41 4e 44 0a 20 20 20 20 28 63 29 20 49 4e 20 28  AND.    (c) IN (
2040: 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 64 31  SELECT y FROM d1
2050: 29 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53  ).} {.  0 0 0 {S
2060: 45 41 52 43 48 20 54 41 42 4c 45 20 64 32 20 55  EARCH TABLE d2 U
2070: 53 49 4e 47 20 49 4e 44 45 58 20 64 32 61 62 20  SING INDEX d2ab 
2080: 28 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 7d 0a 20  (a=? AND b=?)}. 
2090: 20 30 20 30 20 30 20 7b 45 58 45 43 55 54 45 20   0 0 0 {EXECUTE 
20a0: 4c 49 53 54 20 53 55 42 51 55 45 52 59 20 31 7d  LIST SUBQUERY 1}
20b0: 20 0a 20 20 31 20 30 20 30 20 7b 53 43 41 4e 20   .  1 0 0 {SCAN 
20c0: 54 41 42 4c 45 20 64 31 7d 0a 20 20 30 20 30 20  TABLE d1}.  0 0 
20d0: 30 20 7b 45 58 45 43 55 54 45 20 4c 49 53 54 20  0 {EXECUTE LIST 
20e0: 53 55 42 51 55 45 52 59 20 32 7d 20 0a 20 20 32  SUBQUERY 2} .  2
20f0: 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 0 {SCAN TABLE
2100: 20 64 31 7d 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73   d1}.}..do_execs
2110: 71 6c 5f 74 65 73 74 20 36 2e 30 20 7b 0a 20 20  ql_test 6.0 {.  
2120: 43 52 45 41 54 45 20 54 41 42 4c 45 20 65 31 28  CREATE TABLE e1(
2130: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 3b 0a  a, b, c, d, e);.
2140: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 65    CREATE INDEX e
2150: 31 61 62 20 4f 4e 20 65 31 28 61 2c 20 62 29 3b  1ab ON e1(a, b);
2160: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
2170: 65 31 63 64 65 20 4f 4e 20 65 31 28 63 2c 20 64  e1cde ON e1(c, d
2180: 2c 20 65 29 3b 0a 7d 0a 0a 64 6f 5f 65 71 70 5f  , e);.}..do_eqp_
2190: 74 65 73 74 20 36 2e 31 20 7b 0a 20 20 53 45 4c  test 6.1 {.  SEL
21a0: 45 43 54 20 2a 20 46 52 4f 4d 20 65 31 20 57 48  ECT * FROM e1 WH
21b0: 45 52 45 20 28 61 2c 20 62 29 20 3e 20 28 3f 2c  ERE (a, b) > (?,
21c0: 20 3f 29 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20   ?).} {.  0 0 0 
21d0: 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20 65 31  {SEARCH TABLE e1
21e0: 20 55 53 49 4e 47 20 49 4e 44 45 58 20 65 31 61   USING INDEX e1a
21f0: 62 20 28 28 61 2c 62 29 3e 28 3f 2c 3f 29 29 7d  b ((a,b)>(?,?))}
2200: 0a 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 36  .}.do_eqp_test 6
2210: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .2 {.  SELECT * 
2220: 46 52 4f 4d 20 65 31 20 57 48 45 52 45 20 28 61  FROM e1 WHERE (a
2230: 2c 20 62 29 20 3c 20 28 3f 2c 20 3f 29 0a 7d 20  , b) < (?, ?).} 
2240: 7b 0a 20 20 30 20 30 20 30 20 7b 53 45 41 52 43  {.  0 0 0 {SEARC
2250: 48 20 54 41 42 4c 45 20 65 31 20 55 53 49 4e 47  H TABLE e1 USING
2260: 20 49 4e 44 45 58 20 65 31 61 62 20 28 28 61 2c   INDEX e1ab ((a,
2270: 62 29 3c 28 3f 2c 3f 29 29 7d 0a 7d 0a 64 6f 5f  b)<(?,?))}.}.do_
2280: 65 71 70 5f 74 65 73 74 20 36 2e 33 20 7b 0a 20  eqp_test 6.3 {. 
2290: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65   SELECT * FROM e
22a0: 31 20 57 48 45 52 45 20 63 20 3d 20 3f 20 41 4e  1 WHERE c = ? AN
22b0: 44 20 28 64 2c 20 65 29 20 3e 20 28 3f 2c 20 3f  D (d, e) > (?, ?
22c0: 29 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53  ).} {.  0 0 0 {S
22d0: 45 41 52 43 48 20 54 41 42 4c 45 20 65 31 20 55  EARCH TABLE e1 U
22e0: 53 49 4e 47 20 49 4e 44 45 58 20 65 31 63 64 65  SING INDEX e1cde
22f0: 20 28 63 3d 3f 20 41 4e 44 20 28 64 2c 65 29 3e   (c=? AND (d,e)>
2300: 28 3f 2c 3f 29 29 7d 0a 7d 0a 64 6f 5f 65 71 70  (?,?))}.}.do_eqp
2310: 5f 74 65 73 74 20 36 2e 34 20 7b 0a 20 20 53 45  _test 6.4 {.  SE
2320: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 31 20 57  LECT * FROM e1 W
2330: 48 45 52 45 20 63 20 3d 20 3f 20 41 4e 44 20 28  HERE c = ? AND (
2340: 64 2c 20 65 29 20 3c 20 28 3f 2c 20 3f 29 0a 7d  d, e) < (?, ?).}
2350: 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 45 41 52   {.  0 0 0 {SEAR
2360: 43 48 20 54 41 42 4c 45 20 65 31 20 55 53 49 4e  CH TABLE e1 USIN
2370: 47 20 49 4e 44 45 58 20 65 31 63 64 65 20 28 63  G INDEX e1cde (c
2380: 3d 3f 20 41 4e 44 20 28 64 2c 65 29 3c 28 3f 2c  =? AND (d,e)<(?,
2390: 3f 29 29 7d 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 74  ?))}.}..do_eqp_t
23a0: 65 73 74 20 36 2e 35 20 7b 0a 20 20 53 45 4c 45  est 6.5 {.  SELE
23b0: 43 54 20 2a 20 46 52 4f 4d 20 65 31 20 57 48 45  CT * FROM e1 WHE
23c0: 52 45 20 28 64 2c 20 65 29 20 42 45 54 57 45 45  RE (d, e) BETWEE
23d0: 4e 20 28 3f 2c 20 3f 29 20 41 4e 44 20 28 3f 2c  N (?, ?) AND (?,
23e0: 20 3f 29 20 41 4e 44 20 63 20 3d 20 3f 0a 7d 20   ?) AND c = ?.} 
23f0: 7b 0a 20 20 30 20 30 20 30 20 0a 20 20 7b 53 45  {.  0 0 0 .  {SE
2400: 41 52 43 48 20 54 41 42 4c 45 20 65 31 20 55 53  ARCH TABLE e1 US
2410: 49 4e 47 20 49 4e 44 45 58 20 65 31 63 64 65 20  ING INDEX e1cde 
2420: 28 63 3d 3f 20 41 4e 44 20 28 64 2c 65 29 3e 28  (c=? AND (d,e)>(
2430: 3f 2c 3f 29 20 41 4e 44 20 28 64 2c 65 29 3c 28  ?,?) AND (d,e)<(
2440: 3f 2c 3f 29 29 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  ?,?))}.}..#-----
2450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2490: 2d 2d 2d 2d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  ----..do_execsql
24a0: 5f 74 65 73 74 20 37 2e 31 20 7b 0a 20 20 43 52  _test 7.1 {.  CR
24b0: 45 41 54 45 20 54 41 42 4c 45 20 66 31 28 61 2c  EATE TABLE f1(a,
24c0: 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45   b, c);.  CREATE
24d0: 20 49 4e 44 45 58 20 66 31 61 62 20 4f 4e 20 66   INDEX f1ab ON f
24e0: 31 28 61 2c 20 62 29 3b 0a 7d 0a 0a 64 6f 5f 63  1(a, b);.}..do_c
24f0: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 37 2e 32  atchsql_test 7.2
2500: 20 7b 0a 20 20 53 45 4c 45 43 54 20 28 61 20 43   {.  SELECT (a C
2510: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 2c 20 62  OLLATE nocase, b
2520: 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20  ) IN (SELECT a, 
2530: 62 20 46 52 4f 4d 20 66 31 29 20 46 52 4f 4d 20  b FROM f1) FROM 
2540: 66 31 3b 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f  f1;.} {0 {}}..do
2550: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 37  _catchsql_test 7
2560: 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 28 61  .3 {.  SELECT (a
2570: 20 43 4f 4c 4c 41 54 45 20 6e 6f 73 65 2c 20 62   COLLATE nose, b
2580: 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20  ) IN (SELECT a, 
2590: 62 20 46 52 4f 4d 20 66 31 29 20 46 52 4f 4d 20  b FROM f1) FROM 
25a0: 66 31 3b 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63  f1;.} {1 {no suc
25b0: 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  h collation sequ
25c0: 65 6e 63 65 3a 20 6e 6f 73 65 7d 7d 0a 0a 64 6f  ence: nose}}..do
25d0: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 37  _catchsql_test 7
25e0: 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .4 {.  SELECT * 
25f0: 46 52 4f 4d 20 66 31 20 57 48 45 52 45 20 28 3f  FROM f1 WHERE (?
2600: 2c 20 3f 20 43 4f 4c 4c 41 54 45 20 6e 6f 73 65  , ? COLLATE nose
2610: 29 20 3e 20 28 61 2c 20 62 29 3b 0a 7d 20 7b 31  ) > (a, b);.} {1
2620: 20 7b 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74   {no such collat
2630: 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 6e 6f  ion sequence: no
2640: 73 65 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  se}}..#---------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2690: 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65 73  .drop_all_tables
26a0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
26b0: 20 38 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20   8.1 {.  CREATE 
26c0: 54 41 42 4c 45 20 63 31 28 78 2c 20 79 29 3b 0a  TABLE c1(x, y);.
26d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
26e0: 32 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52  2(a, b, c);.  CR
26f0: 45 41 54 45 20 49 4e 44 45 58 20 63 32 61 62 20  EATE INDEX c2ab 
2700: 4f 4e 20 63 32 28 61 2c 20 62 29 3b 0a 20 20 43  ON c2(a, b);.  C
2710: 52 45 41 54 45 20 49 4e 44 45 58 20 63 32 63 20  REATE INDEX c2c 
2720: 4f 4e 20 63 32 28 63 29 3b 0a 0a 20 20 43 52 45  ON c2(c);..  CRE
2730: 41 54 45 20 54 41 42 4c 45 20 63 33 28 64 29 3b  ATE TABLE c3(d);
2740: 0a 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  .}.do_catchsql_t
2750: 65 73 74 20 38 2e 32 20 7b 0a 20 20 53 45 4c 45  est 8.2 {.  SELE
2760: 43 54 20 2a 20 46 52 4f 4d 20 63 32 20 43 52 4f  CT * FROM c2 CRO
2770: 53 53 20 4a 4f 49 4e 20 63 33 20 57 48 45 52 45  SS JOIN c3 WHERE
2780: 20 0a 20 20 20 20 28 20 28 61 2c 20 62 29 20 3d   .    ( (a, b) =
2790: 3d 20 28 53 45 4c 45 43 54 20 78 2c 20 79 20 46  = (SELECT x, y F
27a0: 52 4f 4d 20 63 31 29 20 41 4e 44 20 63 33 2e 64  ROM c1) AND c3.d
27b0: 20 3d 20 63 20 29 20 4f 52 0a 20 20 20 20 28 20   = c ) OR.    ( 
27c0: 63 20 3d 3d 20 28 53 45 4c 45 43 54 20 78 2c 20  c == (SELECT x, 
27d0: 79 20 46 52 4f 4d 20 63 31 29 20 41 4e 44 20 63  y FROM c1) AND c
27e0: 33 2e 64 20 3d 20 63 20 29 0a 7d 20 7b 31 20 7b  3.d = c ).} {1 {
27f0: 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
2800: 6e 73 20 32 20 63 6f 6c 75 6d 6e 73 20 2d 20 65  ns 2 columns - e
2810: 78 70 65 63 74 65 64 20 31 7d 7d 0a 0a 66 69 6e  xpected 1}}..fin
2820: 69 73 68 5f 74 65 73 74 0a 0a                    ish_test..