/ Hex Artifact Content
Login

Artifact b8680f07d19c8c5223b808bba998faffcec6d505f5689ff6070280119173bb51:


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 0a   statement..#...
01e0: 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c  set testdir [fil
01f0: 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30  e dirname $argv0
0200: 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69  ].source $testdi
0210: 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 65 74  r/tester.tcl.set
0220: 20 3a 3a 74 65 73 74 70 72 65 66 69 78 20 72 6f   ::testprefix ro
0230: 77 76 61 6c 75 65 0a 0a 64 6f 5f 65 78 65 63 73  wvalue..do_execs
0240: 71 6c 5f 74 65 73 74 20 30 2e 30 20 7b 0a 20 20  ql_test 0.0 {.  
0250: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65  CREATE TABLE one
0260: 28 6f 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  (o);.  INSERT IN
0270: 54 4f 20 6f 6e 65 20 56 41 4c 55 45 53 28 31 29  TO one VALUES(1)
0280: 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e  ;.}..foreach {tn
0290: 20 76 31 20 76 32 20 65 71 20 6e 65 20 69 73 20   v1 v2 eq ne is 
02a0: 69 73 6e 6f 74 7d 20 7b 0a 20 20 31 20 22 31 2c  isnot} {.  1 "1,
02b0: 20 32 2c 20 33 22 20 20 20 20 22 31 2c 20 32 2c   2, 3"    "1, 2,
02c0: 20 33 22 20 20 20 20 20 20 20 20 20 20 20 20 20   3"             
02d0: 20 20 20 20 20 20 31 20 20 30 20 20 20 20 20 31        1  0     1
02e0: 20 30 0a 20 20 32 20 22 31 2c 20 30 2c 20 33 22   0.  2 "1, 0, 3"
02f0: 20 20 20 20 22 31 2c 20 32 2c 20 33 22 20 20 20      "1, 2, 3"   
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0310: 30 20 20 31 20 20 20 20 20 30 20 31 0a 20 20 33  0  1     0 1.  3
0320: 20 22 31 2c 20 32 2c 20 4e 55 4c 4c 22 20 22 31   "1, 2, NULL" "1
0330: 2c 20 32 2c 20 33 22 20 20 20 20 20 20 20 20 20  , 2, 3"         
0340: 20 20 20 20 20 20 20 20 20 20 7b 7d 20 7b 7d 20            {} {} 
0350: 20 20 20 30 20 31 0a 20 20 34 20 22 31 2c 20 32     0 1.  4 "1, 2
0360: 2c 20 4e 55 4c 4c 22 20 22 31 2c 20 32 2c 20 4e  , NULL" "1, 2, N
0370: 55 4c 4c 22 20 20 20 20 20 20 20 20 20 20 20 20  ULL"            
0380: 20 20 20 20 7b 7d 20 7b 7d 20 20 20 20 31 20 30      {} {}    1 0
0390: 0a 20 20 35 20 22 4e 55 4c 4c 2c 20 4e 55 4c 4c  .  5 "NULL, NULL
03a0: 2c 20 4e 55 4c 4c 22 20 22 4e 55 4c 4c 2c 20 4e  , NULL" "NULL, N
03b0: 55 4c 4c 2c 20 4e 55 4c 4c 22 20 20 20 20 7b 7d  ULL, NULL"    {}
03c0: 20 7b 7d 20 20 20 20 31 20 30 0a 0a 20 20 36 20   {}    1 0..  6 
03d0: 22 31 2c 20 4e 55 4c 4c 2c 20 31 22 20 22 31 2c  "1, NULL, 1" "1,
03e0: 20 31 2c 20 31 22 20 20 20 20 20 20 20 20 20 20   1, 1"          
03f0: 20 20 20 20 20 20 20 20 20 7b 7d 20 7b 7d 20 20           {} {}  
0400: 20 20 30 20 31 0a 20 20 37 20 22 31 2c 20 4e 55    0 1.  7 "1, NU
0410: 4c 4c 2c 20 31 22 20 22 31 2c 20 31 2c 20 32 22  LL, 1" "1, 1, 2"
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0430: 20 20 20 30 20 20 31 20 20 20 20 20 30 20 31 0a     0  1     0 1.
0440: 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  } {.  do_execsql
0450: 5f 74 65 73 74 20 31 2e 24 74 6e 2e 65 71 20 22  _test 1.$tn.eq "
0460: 53 45 4c 45 43 54 20 28 24 76 31 29 20 3d 3d 20  SELECT ($v1) == 
0470: 28 24 76 32 29 22 20 5b 6c 69 73 74 20 24 65 71  ($v2)" [list $eq
0480: 5d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ].  do_execsql_t
0490: 65 73 74 20 31 2e 24 74 6e 2e 6e 65 20 22 53 45  est 1.$tn.ne "SE
04a0: 4c 45 43 54 20 28 24 76 31 29 20 21 3d 20 28 24  LECT ($v1) != ($
04b0: 76 32 29 22 20 5b 6c 69 73 74 20 24 6e 65 5d 0a  v2)" [list $ne].
04c0: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
04d0: 73 74 20 31 2e 24 74 6e 2e 69 73 20 20 20 20 22  st 1.$tn.is    "
04e0: 53 45 4c 45 43 54 20 28 24 76 31 29 20 49 53 20  SELECT ($v1) IS 
04f0: 28 24 76 32 29 22 20 20 20 20 20 5b 6c 69 73 74  ($v2)"     [list
0500: 20 24 69 73 5d 0a 20 20 64 6f 5f 65 78 65 63 73   $is].  do_execs
0510: 71 6c 5f 74 65 73 74 20 31 2e 24 74 6e 2e 69 73  ql_test 1.$tn.is
0520: 6e 6f 74 20 22 53 45 4c 45 43 54 20 28 24 76 31  not "SELECT ($v1
0530: 29 20 49 53 20 4e 4f 54 20 28 24 76 32 29 22 20  ) IS NOT ($v2)" 
0540: 5b 6c 69 73 74 20 24 69 73 6e 6f 74 5d 0a 0a 20  [list $isnot].. 
0550: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
0560: 20 31 2e 24 74 6e 2e 32 2e 65 71 20 22 53 45 4c   1.$tn.2.eq "SEL
0570: 45 43 54 20 28 53 45 4c 45 43 54 20 24 76 31 29  ECT (SELECT $v1)
0580: 20 3d 3d 20 28 53 45 4c 45 43 54 20 24 76 32 29   == (SELECT $v2)
0590: 22 20 5b 6c 69 73 74 20 24 65 71 5d 0a 20 20 64  " [list $eq].  d
05a0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
05b0: 2e 24 74 6e 2e 32 2e 6e 65 20 22 53 45 4c 45 43  .$tn.2.ne "SELEC
05c0: 54 20 28 53 45 4c 45 43 54 20 24 76 31 29 20 21  T (SELECT $v1) !
05d0: 3d 20 28 53 45 4c 45 43 54 20 24 76 32 29 22 20  = (SELECT $v2)" 
05e0: 5b 6c 69 73 74 20 24 6e 65 5d 0a 7d 0a 0a 66 6f  [list $ne].}..fo
05f0: 72 65 61 63 68 20 7b 74 6e 20 76 31 20 76 32 20  reach {tn v1 v2 
0600: 6c 74 20 67 74 20 6c 65 20 67 65 7d 20 7b 0a 20  lt gt le ge} {. 
0610: 20 31 20 22 28 31 2c 20 31 2c 20 33 29 22 20 20   1 "(1, 1, 3)"  
0620: 20 20 22 28 31 2c 20 32 2c 20 33 29 22 20 20 20    "(1, 2, 3)"   
0630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0640: 31 20 30 20 20 20 20 20 20 31 20 30 0a 20 20 32  1 0      1 0.  2
0650: 20 22 28 31 2c 20 32 2c 20 33 29 22 20 20 20 20   "(1, 2, 3)"    
0660: 22 28 31 2c 20 32 2c 20 33 29 22 20 20 20 20 20  "(1, 2, 3)"     
0670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
0680: 30 20 20 20 20 20 20 31 20 31 0a 20 20 33 20 22  0      1 1.  3 "
0690: 28 31 2c 20 33 2c 20 33 29 22 20 20 20 20 22 28  (1, 3, 3)"    "(
06a0: 31 2c 20 32 2c 20 33 29 22 20 20 20 20 20 20 20  1, 2, 3)"       
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 31 20              0 1 
06c0: 20 20 20 20 20 30 20 31 0a 0a 20 20 34 20 22 28       0 1..  4 "(
06d0: 31 2c 20 4e 55 4c 4c 2c 20 33 29 22 20 20 20 20  1, NULL, 3)"    
06e0: 22 28 31 2c 20 32 2c 20 33 29 22 20 20 20 20 20  "(1, 2, 3)"     
06f0: 20 20 20 20 20 20 20 20 20 20 20 7b 7d 20 7b 7d             {} {}
0700: 20 20 20 20 20 20 7b 7d 20 7b 7d 0a 20 20 35 20        {} {}.  5 
0710: 22 28 31 2c 20 33 2c 20 33 29 22 20 20 20 20 22  "(1, 3, 3)"    "
0720: 28 31 2c 20 4e 55 4c 4c 2c 20 33 29 22 20 20 20  (1, NULL, 3)"   
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 7d 20               {} 
0740: 7b 7d 20 20 20 20 20 20 7b 7d 20 7b 7d 0a 20 20  {}      {} {}.  
0750: 36 20 22 28 31 2c 20 4e 55 4c 4c 2c 20 33 29 22  6 "(1, NULL, 3)"
0760: 20 20 20 20 22 28 31 2c 20 4e 55 4c 4c 2c 20 33      "(1, NULL, 3
0770: 29 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  )"             {
0780: 7d 20 7b 7d 20 20 20 20 20 20 7b 7d 20 7b 7d 0a  } {}      {} {}.
0790: 7d 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 7b 74  } {.  foreach {t
07a0: 6e 32 20 65 78 70 72 20 72 65 73 7d 20 5b 6c 69  n2 expr res} [li
07b0: 73 74 20 5c 0a 20 20 20 20 32 2e 24 74 6e 2e 6c  st \.    2.$tn.l
07c0: 74 20 22 24 76 31 20 3c 20 24 76 32 22 20 24 6c  t "$v1 < $v2" $l
07d0: 74 20 20 20 5c 0a 20 20 20 20 32 2e 24 74 6e 2e  t   \.    2.$tn.
07e0: 67 74 20 22 24 76 31 20 3e 20 24 76 32 22 20 24  gt "$v1 > $v2" $
07f0: 67 74 20 20 20 5c 0a 20 20 20 20 32 2e 24 74 6e  gt   \.    2.$tn
0800: 2e 6c 65 20 22 24 76 31 20 3c 3d 20 24 76 32 22  .le "$v1 <= $v2"
0810: 20 24 6c 65 20 20 20 5c 0a 20 20 20 20 32 2e 24   $le   \.    2.$
0820: 74 6e 2e 67 65 20 22 24 76 31 20 3e 3d 20 24 76  tn.ge "$v1 >= $v
0830: 32 22 20 24 67 65 20 20 20 5c 0a 20 20 5d 20 7b  2" $ge   \.  ] {
0840: 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  .    do_execsql_
0850: 74 65 73 74 20 24 74 6e 32 20 22 53 45 4c 45 43  test $tn2 "SELEC
0860: 54 20 24 65 78 70 72 22 20 5b 6c 69 73 74 20 24  T $expr" [list $
0870: 72 65 73 5d 0a 0a 20 20 20 20 73 65 74 20 6d 61  res]..    set ma
0880: 70 28 30 29 20 5b 6c 69 73 74 5d 0a 20 20 20 20  p(0) [list].    
0890: 73 65 74 20 6d 61 70 28 29 20 5b 6c 69 73 74 5d  set map() [list]
08a0: 0a 20 20 20 20 73 65 74 20 6d 61 70 28 31 29 20  .    set map(1) 
08b0: 5b 6c 69 73 74 20 31 5d 0a 20 20 20 20 64 6f 5f  [list 1].    do_
08c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 24 74 6e  execsql_test $tn
08d0: 32 2e 77 68 65 72 65 31 20 22 53 45 4c 45 43 54  2.where1 "SELECT
08e0: 20 2a 20 46 52 4f 4d 20 6f 6e 65 20 57 48 45 52   * FROM one WHER
08f0: 45 20 24 65 78 70 72 22 20 24 6d 61 70 28 24 72  E $expr" $map($r
0900: 65 73 29 0a 0a 20 20 20 20 73 65 74 20 6d 61 70  es)..    set map
0910: 28 30 29 20 5b 6c 69 73 74 20 31 5d 0a 20 20 20  (0) [list 1].   
0920: 20 73 65 74 20 6d 61 70 28 29 20 5b 6c 69 73 74   set map() [list
0930: 5d 0a 20 20 20 20 73 65 74 20 6d 61 70 28 31 29  ].    set map(1)
0940: 20 5b 6c 69 73 74 5d 0a 20 20 20 20 64 6f 5f 65   [list].    do_e
0950: 78 65 63 73 71 6c 5f 74 65 73 74 20 24 74 6e 32  xecsql_test $tn2
0960: 2e 77 68 65 72 65 32 20 22 53 45 4c 45 43 54 20  .where2 "SELECT 
0970: 2a 20 46 52 4f 4d 20 6f 6e 65 20 57 48 45 52 45  * FROM one WHERE
0980: 20 4e 4f 54 20 24 65 78 70 72 22 20 24 6d 61 70   NOT $expr" $map
0990: 28 24 72 65 73 29 0a 20 20 7d 0a 7d 0a 0a 64 6f  ($res).  }.}..do
09a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
09b0: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
09c0: 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20 49  LE t1(x, y);.  I
09d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
09e0: 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20 49 4e  LUES(1, 1);.  IN
09f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0a00: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 49 4e 53  UES(1, 2);.  INS
0a10: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0a20: 45 53 28 32 2c 20 33 29 3b 0a 20 20 49 4e 53 45  ES(2, 3);.  INSE
0a30: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0a40: 53 28 32 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52  S(2, 4);.  INSER
0a50: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0a60: 28 33 2c 20 35 29 3b 0a 20 20 49 4e 53 45 52 54  (3, 5);.  INSERT
0a70: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0a80: 33 2c 20 36 29 3b 0a 7d 0a 0a 66 6f 72 65 61 63  3, 6);.}..foreac
0a90: 68 20 7b 74 6e 20 72 20 6f 72 64 65 72 7d 20 7b  h {tn r order} {
0aa0: 0a 20 20 31 20 22 28 31 2c 20 31 29 22 20 20 20  .  1 "(1, 1)"   
0ab0: 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
0ac0: 59 20 79 22 0a 20 20 32 20 22 28 31 2c 20 31 29  Y y".  2 "(1, 1)
0ad0: 22 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44  "           "ORD
0ae0: 45 52 20 42 59 20 78 2c 20 79 22 0a 20 20 33 20  ER BY x, y".  3 
0af0: 22 28 31 2c 20 32 29 22 20 20 20 20 20 20 20 20  "(1, 2)"        
0b00: 20 20 20 22 4f 52 44 45 52 20 42 59 20 78 2c 20     "ORDER BY x, 
0b10: 79 20 44 45 53 43 22 0a 20 20 34 20 22 28 33 2c  y DESC".  4 "(3,
0b20: 20 36 29 22 20 20 20 20 20 20 20 20 20 20 20 22   6)"           "
0b30: 4f 52 44 45 52 20 42 59 20 78 20 44 45 53 43 2c  ORDER BY x DESC,
0b40: 20 79 20 44 45 53 43 22 0a 20 20 35 20 22 28 28   y DESC".  5 "((
0b50: 33 2c 20 35 29 29 22 20 20 20 20 20 20 20 20 20  3, 5))"         
0b60: 22 4f 52 44 45 52 20 42 59 20 78 20 44 45 53 43  "ORDER BY x DESC
0b70: 2c 20 79 22 0a 20 20 36 20 22 28 53 45 4c 45 43  , y".  6 "(SELEC
0b80: 54 20 33 2c 20 35 29 22 20 20 20 20 22 4f 52 44  T 3, 5)"    "ORD
0b90: 45 52 20 42 59 20 78 20 44 45 53 43 2c 20 79 22  ER BY x DESC, y"
0ba0: 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71  .} {.  do_execsq
0bb0: 6c 5f 74 65 73 74 20 33 2e 24 74 6e 2e 31 20 22  l_test 3.$tn.1 "
0bc0: 53 45 4c 45 43 54 20 24 72 20 3d 3d 20 28 53 45  SELECT $r == (SE
0bd0: 4c 45 43 54 20 78 2c 79 20 46 52 4f 4d 20 74 31  LECT x,y FROM t1
0be0: 20 24 6f 72 64 65 72 29 22 20 31 0a 20 20 64 6f   $order)" 1.  do
0bf0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
0c00: 24 74 6e 2e 32 20 22 53 45 4c 45 43 54 20 24 72  $tn.2 "SELECT $r
0c10: 20 3d 3d 20 28 53 45 4c 45 43 54 20 2a 20 46 52   == (SELECT * FR
0c20: 4f 4d 20 74 31 20 24 6f 72 64 65 72 29 22 20 31  OM t1 $order)" 1
0c30: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
0c40: 65 73 74 20 33 2e 24 74 6e 2e 33 20 22 0a 20 20  est 3.$tn.3 ".  
0c50: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
0c60: 20 2a 20 46 52 4f 4d 20 74 31 20 24 6f 72 64 65   * FROM t1 $orde
0c70: 72 29 20 3d 3d 20 28 53 45 4c 45 43 54 20 2a 20  r) == (SELECT * 
0c80: 46 52 4f 4d 20 74 31 20 24 6f 72 64 65 72 29 0a  FROM t1 $order).
0c90: 20 20 22 20 31 0a 20 20 64 6f 5f 65 78 65 63 73    " 1.  do_execs
0ca0: 71 6c 5f 74 65 73 74 20 33 2e 24 74 6e 2e 34 20  ql_test 3.$tn.4 
0cb0: 22 0a 20 20 20 20 53 45 4c 45 43 54 20 28 53 45  ".    SELECT (SE
0cc0: 4c 45 43 54 20 30 2c 20 30 29 20 3d 3d 20 28 53  LECT 0, 0) == (S
0cd0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0ce0: 24 6f 72 64 65 72 29 0a 20 20 22 20 30 0a 7d 0a  $order).  " 0.}.
0cf0: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 65 78 70  .foreach {tn exp
0d00: 72 20 72 65 73 7d 20 7b 0a 20 20 31 20 7b 28 32  r res} {.  1 {(2
0d10: 2c 20 32 29 20 42 45 54 57 45 45 4e 20 28 32 2c  , 2) BETWEEN (2,
0d20: 20 32 29 20 41 4e 44 20 28 33 2c 20 33 29 7d 20   2) AND (3, 3)} 
0d30: 31 0a 20 20 32 20 7b 28 32 2c 20 32 29 20 42 45  1.  2 {(2, 2) BE
0d40: 54 57 45 45 4e 20 28 32 2c 20 4e 55 4c 4c 29 20  TWEEN (2, NULL) 
0d50: 41 4e 44 20 28 33 2c 20 33 29 7d 20 7b 7d 0a 20  AND (3, 3)} {}. 
0d60: 20 33 20 7b 28 32 2c 20 32 29 20 42 45 54 57 45   3 {(2, 2) BETWE
0d70: 45 4e 20 28 33 2c 20 4e 55 4c 4c 29 20 41 4e 44  EN (3, NULL) AND
0d80: 20 28 33 2c 20 33 29 7d 20 30 0a 7d 20 7b 0a 20   (3, 3)} 0.} {. 
0d90: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
0da0: 20 34 2e 24 74 6e 20 22 53 45 4c 45 43 54 20 24   4.$tn "SELECT $
0db0: 65 78 70 72 22 20 5b 6c 69 73 74 20 24 72 65 73  expr" [list $res
0dc0: 5d 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e  ].}..foreach {tn
0dd0: 20 65 78 70 72 20 72 65 73 7d 20 7b 0a 20 20 31   expr res} {.  1
0de0: 20 7b 28 32 2c 20 34 29 20 49 4e 20 28 53 45 4c   {(2, 4) IN (SEL
0df0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 29 7d 20  ECT * FROM t1)} 
0e00: 31 0a 20 20 32 20 7b 28 33 2c 20 34 29 20 49 4e  1.  2 {(3, 4) IN
0e10: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
0e20: 74 31 29 7d 20 30 0a 0a 20 20 33 20 7b 28 4e 55  t1)} 0..  3 {(NU
0e30: 4c 4c 2c 20 34 29 20 49 4e 20 28 53 45 4c 45 43  LL, 4) IN (SELEC
0e40: 54 20 2a 20 46 52 4f 4d 20 74 31 29 7d 20 7b 7d  T * FROM t1)} {}
0e50: 0a 20 20 34 20 7b 28 4e 55 4c 4c 2c 20 30 29 20  .  4 {(NULL, 0) 
0e60: 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
0e70: 4d 20 74 31 29 7d 20 30 0a 0a 20 20 35 20 7b 28  M t1)} 0..  5 {(
0e80: 4e 55 4c 4c 2c 20 34 29 20 4e 4f 54 20 49 4e 20  NULL, 4) NOT IN 
0e90: 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
0ea0: 31 29 7d 20 7b 7d 0a 20 20 36 20 7b 28 4e 55 4c  1)} {}.  6 {(NUL
0eb0: 4c 2c 20 30 29 20 4e 4f 54 20 49 4e 20 28 53 45  L, 0) NOT IN (SE
0ec0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 29 7d  LECT * FROM t1)}
0ed0: 20 31 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63   1.} {.  do_exec
0ee0: 73 71 6c 5f 74 65 73 74 20 35 2e 24 74 6e 20 22  sql_test 5.$tn "
0ef0: 53 45 4c 45 43 54 20 24 65 78 70 72 22 20 5b 6c  SELECT $expr" [l
0f00: 69 73 74 20 24 72 65 73 5d 0a 7d 0a 0a 64 6f 5f  ist $res].}..do_
0f10: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 36 2e 30  execsql_test 6.0
0f20: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
0f30: 45 20 68 68 28 61 2c 20 62 2c 20 63 29 3b 0a 20  E hh(a, b, c);. 
0f40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 68 68 20   INSERT INTO hh 
0f50: 56 41 4c 55 45 53 28 27 61 62 63 27 2c 20 31 2c  VALUES('abc', 1,
0f60: 20 27 69 27 29 3b 0a 20 20 49 4e 53 45 52 54 20   'i');.  INSERT 
0f70: 49 4e 54 4f 20 68 68 20 56 41 4c 55 45 53 28 27  INTO hh VALUES('
0f80: 41 42 43 27 2c 20 31 2c 20 27 69 69 27 29 3b 0a  ABC', 1, 'ii');.
0f90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 68 68    INSERT INTO hh
0fa0: 20 56 41 4c 55 45 53 28 27 64 65 66 27 2c 20 32   VALUES('def', 2
0fb0: 2c 20 27 69 69 69 27 29 3b 0a 20 20 49 4e 53 45  , 'iii');.  INSE
0fc0: 52 54 20 49 4e 54 4f 20 68 68 20 56 41 4c 55 45  RT INTO hh VALUE
0fd0: 53 28 27 44 45 46 27 2c 20 32 2c 20 27 69 76 27  S('DEF', 2, 'iv'
0fe0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0ff0: 20 68 68 20 56 41 4c 55 45 53 28 27 47 48 49 27   hh VALUES('GHI'
1000: 2c 20 33 2c 20 27 76 27 29 3b 0a 20 20 49 4e 53  , 3, 'v');.  INS
1010: 45 52 54 20 49 4e 54 4f 20 68 68 20 56 41 4c 55  ERT INTO hh VALU
1020: 45 53 28 27 67 68 69 27 2c 20 33 2c 20 27 76 69  ES('ghi', 3, 'vi
1030: 27 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 49 4e  ');..  CREATE IN
1040: 44 45 58 20 68 68 5f 61 62 20 4f 4e 20 68 68 28  DEX hh_ab ON hh(
1050: 61 2c 20 62 29 3b 20 0a 7d 0a 0a 64 6f 5f 65 78  a, b); .}..do_ex
1060: 65 63 73 71 6c 5f 74 65 73 74 20 36 2e 31 20 7b  ecsql_test 6.1 {
1070: 0a 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  .  SELECT c FROM
1080: 20 68 68 20 57 48 45 52 45 20 28 61 2c 20 62 29   hh WHERE (a, b)
1090: 20 3d 20 28 53 45 4c 45 43 54 20 27 61 62 63 27   = (SELECT 'abc'
10a0: 2c 20 31 29 3b 0a 7d 20 7b 69 7d 0a 64 6f 5f 65  , 1);.} {i}.do_e
10b0: 78 65 63 73 71 6c 5f 74 65 73 74 20 36 2e 32 20  xecsql_test 6.2 
10c0: 7b 0a 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f  {.  SELECT c FRO
10d0: 4d 20 68 68 20 57 48 45 52 45 20 28 61 2c 20 62  M hh WHERE (a, b
10e0: 29 20 3d 20 28 53 45 4c 45 43 54 20 27 61 62 63  ) = (SELECT 'abc
10f0: 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ' COLLATE nocase
1100: 2c 20 31 29 3b 0a 7d 20 7b 69 7d 0a 64 6f 5f 65  , 1);.} {i}.do_e
1110: 78 65 63 73 71 6c 5f 74 65 73 74 20 36 2e 33 20  xecsql_test 6.3 
1120: 7b 0a 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f  {.  SELECT c FRO
1130: 4d 20 68 68 20 57 48 45 52 45 20 61 20 3d 20 28  M hh WHERE a = (
1140: 53 45 4c 45 43 54 20 27 61 62 63 27 20 43 4f 4c  SELECT 'abc' COL
1150: 4c 41 54 45 20 6e 6f 63 61 73 65 29 20 41 4e 44  LATE nocase) AND
1160: 20 62 20 3d 20 28 53 45 4c 45 43 54 20 31 29 3b   b = (SELECT 1);
1170: 0a 7d 20 7b 69 7d 0a 64 6f 5f 65 78 65 63 73 71  .} {i}.do_execsq
1180: 6c 5f 74 65 73 74 20 36 2e 34 20 7b 0a 20 20 53  l_test 6.4 {.  S
1190: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 68 68 20  ELECT c FROM hh 
11a0: 57 48 45 52 45 20 2b 61 20 3d 20 28 53 45 4c 45  WHERE +a = (SELE
11b0: 43 54 20 27 61 62 63 27 20 43 4f 4c 4c 41 54 45  CT 'abc' COLLATE
11c0: 20 6e 6f 63 61 73 65 29 20 41 4e 44 20 62 20 3d   nocase) AND b =
11d0: 20 28 53 45 4c 45 43 54 20 31 29 3b 0a 7d 20 7b   (SELECT 1);.} {
11e0: 69 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  i}.do_execsql_te
11f0: 73 74 20 36 2e 35 20 7b 0a 20 20 53 45 4c 45 43  st 6.5 {.  SELEC
1200: 54 20 63 20 46 52 4f 4d 20 68 68 20 57 48 45 52  T c FROM hh WHER
1210: 45 20 61 20 3d 20 28 53 45 4c 45 43 54 20 27 61  E a = (SELECT 'a
1220: 62 63 27 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  bc') COLLATE noc
1230: 61 73 65 20 41 4e 44 20 62 20 3d 20 28 53 45 4c  ase AND b = (SEL
1240: 45 43 54 20 31 29 3b 0a 7d 20 7b 69 20 69 69 7d  ECT 1);.} {i ii}
1250: 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73  .do_catchsql_tes
1260: 74 20 36 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54  t 6.6 {.  SELECT
1270: 20 63 20 46 52 4f 4d 20 68 68 20 57 48 45 52 45   c FROM hh WHERE
1280: 20 28 61 2c 20 62 29 20 3d 20 28 53 45 4c 45 43   (a, b) = (SELEC
1290: 54 20 27 61 62 63 27 2c 20 31 29 20 43 4f 4c 4c  T 'abc', 1) COLL
12a0: 41 54 45 20 6e 6f 63 61 73 65 3b 0a 7d 20 7b 31  ATE nocase;.} {1
12b0: 20 7b 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75   {row value misu
12c0: 73 65 64 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71  sed}}.do_catchsq
12d0: 6c 5f 74 65 73 74 20 36 2e 37 20 7b 0a 20 20 53  l_test 6.7 {.  S
12e0: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 68 68 20  ELECT c FROM hh 
12f0: 57 48 45 52 45 20 28 61 2c 20 62 29 20 3d 20 31  WHERE (a, b) = 1
1300: 3b 0a 7d 20 7b 31 20 7b 72 6f 77 20 76 61 6c 75  ;.} {1 {row valu
1310: 65 20 6d 69 73 75 73 65 64 7d 7d 0a 64 6f 5f 65  e misused}}.do_e
1320: 78 65 63 73 71 6c 5f 74 65 73 74 20 36 2e 38 20  xecsql_test 6.8 
1330: 7b 0a 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f  {.  SELECT c FRO
1340: 4d 20 68 68 20 57 48 45 52 45 20 28 61 20 43 4f  M hh WHERE (a CO
1350: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 2c 20 62 29  LLATE nocase, b)
1360: 20 3d 20 28 53 45 4c 45 43 54 20 27 64 65 66 27   = (SELECT 'def'
1370: 2c 20 32 29 3b 0a 7d 20 7b 69 69 69 20 69 76 7d  , 2);.} {iii iv}
1380: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1390: 20 36 2e 39 20 7b 0a 20 20 53 45 4c 45 43 54 20   6.9 {.  SELECT 
13a0: 63 20 46 52 4f 4d 20 68 68 20 57 48 45 52 45 20  c FROM hh WHERE 
13b0: 28 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (a COLLATE nocas
13c0: 65 2c 20 62 29 20 49 53 20 4e 4f 54 20 28 53 45  e, b) IS NOT (SE
13d0: 4c 45 43 54 20 27 64 65 66 27 2c 20 32 29 3b 0a  LECT 'def', 2);.
13e0: 7d 20 7b 69 20 69 69 20 76 20 76 69 7d 0a 64 6f  } {i ii v vi}.do
13f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 36 2e  _execsql_test 6.
1400: 31 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 20  10 {.  SELECT c 
1410: 46 52 4f 4d 20 68 68 20 57 48 45 52 45 20 28 62  FROM hh WHERE (b
1420: 2c 20 61 29 20 3d 20 28 53 45 4c 45 43 54 20 32  , a) = (SELECT 2
1430: 2c 20 27 64 65 66 27 29 3b 0a 7d 20 7b 69 69 69  , 'def');.} {iii
1440: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
1450: 73 74 20 37 2e 30 20 7b 0a 20 20 43 52 45 41 54  st 7.0 {.  CREAT
1460: 45 20 54 41 42 4c 45 20 78 79 28 69 20 49 4e 54  E TABLE xy(i INT
1470: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1480: 2c 20 6a 2c 20 6b 29 3b 0a 20 20 49 4e 53 45 52  , j, k);.  INSER
1490: 54 20 49 4e 54 4f 20 78 79 20 56 41 4c 55 45 53  T INTO xy VALUES
14a0: 28 31 2c 20 31 2c 20 31 29 3b 0a 20 20 49 4e 53  (1, 1, 1);.  INS
14b0: 45 52 54 20 49 4e 54 4f 20 78 79 20 56 41 4c 55  ERT INTO xy VALU
14c0: 45 53 28 32 2c 20 32 2c 20 32 29 3b 0a 20 20 49  ES(2, 2, 2);.  I
14d0: 4e 53 45 52 54 20 49 4e 54 4f 20 78 79 20 56 41  NSERT INTO xy VA
14e0: 4c 55 45 53 28 33 2c 20 33 2c 20 33 29 3b 0a 20  LUES(3, 3, 3);. 
14f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 79 20   INSERT INTO xy 
1500: 56 41 4c 55 45 53 28 34 2c 20 34 2c 20 34 29 3b  VALUES(4, 4, 4);
1510: 0a 7d 0a 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e  .}...foreach {tn
1520: 20 73 71 6c 20 72 65 73 20 65 71 70 7d 20 7b 0a   sql res eqp} {.
1530: 20 20 31 20 22 53 45 4c 45 43 54 20 2a 20 46 52    1 "SELECT * FR
1540: 4f 4d 20 78 79 20 57 48 45 52 45 20 28 69 2c 20  OM xy WHERE (i, 
1550: 6a 29 20 49 53 20 28 32 2c 20 32 29 22 20 7b 32  j) IS (2, 2)" {2
1560: 20 32 20 32 7d 20 0a 20 20 20 20 22 53 45 41 52   2 2} .    "SEAR
1570: 43 48 20 54 41 42 4c 45 20 78 79 20 55 53 49 4e  CH TABLE xy USIN
1580: 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
1590: 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 22  Y KEY (rowid=?)"
15a0: 0a 0a 20 20 32 20 22 53 45 4c 45 43 54 20 2a 20  ..  2 "SELECT * 
15b0: 46 52 4f 4d 20 78 79 20 57 48 45 52 45 20 28 6b  FROM xy WHERE (k
15c0: 2c 20 6a 29 20 3c 20 28 32 2c 20 33 29 22 20 7b  , j) < (2, 3)" {
15d0: 31 20 31 20 31 20 32 20 32 20 32 7d 0a 20 20 20  1 1 1 2 2 2}.   
15e0: 20 22 53 43 41 4e 20 54 41 42 4c 45 20 78 79 22   "SCAN TABLE xy"
15f0: 0a 0a 20 20 33 20 22 53 45 4c 45 43 54 20 2a 20  ..  3 "SELECT * 
1600: 46 52 4f 4d 20 78 79 20 57 48 45 52 45 20 28 69  FROM xy WHERE (i
1610: 2c 20 6a 29 20 3c 20 28 32 2c 20 33 29 22 20 7b  , j) < (2, 3)" {
1620: 31 20 31 20 31 20 32 20 32 20 32 7d 0a 20 20 20  1 1 1 2 2 2}.   
1630: 20 22 53 45 41 52 43 48 20 54 41 42 4c 45 20 78   "SEARCH TABLE x
1640: 79 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20  y USING INTEGER 
1650: 50 52 49 4d 41 52 59 20 4b 45 59 20 28 72 6f 77  PRIMARY KEY (row
1660: 69 64 3c 3f 29 22 0a 0a 20 20 34 20 22 53 45 4c  id<?)"..  4 "SEL
1670: 45 43 54 20 2a 20 46 52 4f 4d 20 78 79 20 57 48  ECT * FROM xy WH
1680: 45 52 45 20 28 69 2c 20 6a 29 20 3e 20 28 32 2c  ERE (i, j) > (2,
1690: 20 31 29 22 20 7b 32 20 32 20 32 20 33 20 33 20   1)" {2 2 2 3 3 
16a0: 33 20 34 20 34 20 34 7d 0a 20 20 20 20 22 53 45  3 4 4 4}.    "SE
16b0: 41 52 43 48 20 54 41 42 4c 45 20 78 79 20 55 53  ARCH TABLE xy US
16c0: 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
16d0: 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3e 3f  ARY KEY (rowid>?
16e0: 29 22 0a 0a 20 20 35 20 22 53 45 4c 45 43 54 20  )"..  5 "SELECT 
16f0: 2a 20 46 52 4f 4d 20 78 79 20 57 48 45 52 45 20  * FROM xy WHERE 
1700: 28 69 2c 20 6a 29 20 3e 20 28 27 32 27 2c 20 31  (i, j) > ('2', 1
1710: 29 22 20 7b 32 20 32 20 32 20 33 20 33 20 33 20  )" {2 2 2 3 3 3 
1720: 34 20 34 20 34 7d 0a 20 20 20 20 22 53 45 41 52  4 4 4}.    "SEAR
1730: 43 48 20 54 41 42 4c 45 20 78 79 20 55 53 49 4e  CH TABLE xy USIN
1740: 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
1750: 59 20 4b 45 59 20 28 72 6f 77 69 64 3e 3f 29 22  Y KEY (rowid>?)"
1760: 0a 0a 7d 20 7b 0a 20 20 64 6f 5f 65 71 70 5f 74  ..} {.  do_eqp_t
1770: 65 73 74 20 37 2e 24 74 6e 2e 31 20 24 73 71 6c  est 7.$tn.1 $sql
1780: 20 24 65 71 70 0a 20 20 64 6f 5f 65 78 65 63 73   $eqp.  do_execs
1790: 71 6c 5f 74 65 73 74 20 37 2e 24 74 6e 2e 32 20  ql_test 7.$tn.2 
17a0: 24 73 71 6c 20 24 72 65 73 0a 7d 0a 0a 64 6f 5f  $sql $res.}..do_
17b0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 38 2e 30  execsql_test 8.0
17c0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
17d0: 45 20 6a 31 28 61 29 3b 0a 7d 0a 64 6f 5f 65 78  E j1(a);.}.do_ex
17e0: 65 63 73 71 6c 5f 74 65 73 74 20 38 2e 31 20 7b  ecsql_test 8.1 {
17f0: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
1800: 20 6a 31 20 57 48 45 52 45 20 28 73 65 6c 65 63   j1 WHERE (selec
1810: 74 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 6a 31  t min(a) FROM j1
1820: 29 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 0a 7d  ) IN (?, ?, ?).}
1830: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
1840: 74 20 39 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  t 9.0 {.  CREATE
1850: 20 54 41 42 4c 45 20 74 32 28 61 20 49 4e 54 45   TABLE t2(a INTE
1860: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1870: 20 62 2c 20 63 29 3b 0a 20 20 49 4e 53 45 52 54   b, c);.  INSERT
1880: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1890: 31 2c 20 31 2c 20 31 29 3b 0a 20 20 49 4e 53 45  1, 1, 1);.  INSE
18a0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
18b0: 53 28 32 2c 20 32 2c 20 32 29 3b 0a 20 20 49 4e  S(2, 2, 2);.  IN
18c0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
18d0: 55 45 53 28 33 2c 20 33 2c 20 33 29 3b 0a 20 20  UES(3, 3, 3);.  
18e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
18f0: 41 4c 55 45 53 28 34 2c 20 34 2c 20 34 29 3b 0a  ALUES(4, 4, 4);.
1900: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1910: 20 56 41 4c 55 45 53 28 35 2c 20 35 2c 20 35 29   VALUES(5, 5, 5)
1920: 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e  ;.}..foreach {tn
1930: 20 71 20 72 65 73 7d 20 7b 0a 20 20 31 20 22 28   q res} {.  1 "(
1940: 61 2c 20 62 29 20 3e 20 28 32 2c 20 31 29 22 20  a, b) > (2, 1)" 
1950: 7b 32 20 33 20 34 20 35 7d 0a 20 20 32 20 22 28  {2 3 4 5}.  2 "(
1960: 61 2c 20 62 29 20 3e 20 28 32 2c 20 32 29 22 20  a, b) > (2, 2)" 
1970: 7b 33 20 34 20 35 7d 0a 20 20 33 20 22 28 61 2c  {3 4 5}.  3 "(a,
1980: 20 62 29 20 3c 20 28 34 2c 20 35 29 22 20 7b 31   b) < (4, 5)" {1
1990: 20 32 20 33 20 34 7d 0a 20 20 34 20 22 28 61 2c   2 3 4}.  4 "(a,
19a0: 20 62 29 20 3c 20 28 34 2c 20 33 29 22 20 7b 31   b) < (4, 3)" {1
19b0: 20 32 20 33 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 65   2 3}.} {.  do_e
19c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 39 2e 24 74  xecsql_test 9.$t
19d0: 6e 20 22 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  n "SELECT c FROM
19e0: 20 74 32 20 57 48 45 52 45 20 24 71 22 20 24 72   t2 WHERE $q" $r
19f0: 65 73 0a 7d 20 0a 0a 64 6f 5f 65 78 65 63 73 71  es.} ..do_execsq
1a00: 6c 5f 74 65 73 74 20 31 30 2e 30 20 7b 0a 20 20  l_test 10.0 {.  
1a10: 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 75 61  CREATE TABLE dua
1a20: 6c 28 64 75 6d 6d 79 29 3b 20 49 4e 53 45 52 54  l(dummy); INSERT
1a30: 20 49 4e 54 4f 20 64 75 61 6c 28 64 75 6d 6d 79   INTO dual(dummy
1a40: 29 20 56 41 4c 55 45 53 28 27 58 27 29 3b 0a 20  ) VALUES('X');. 
1a50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
1a60: 28 61 20 54 45 58 54 2c 62 20 54 45 58 54 2c 63  (a TEXT,b TEXT,c
1a70: 20 54 45 58 54 2c 64 20 54 45 58 54 2c 65 20 54   TEXT,d TEXT,e T
1a80: 45 58 54 2c 66 20 54 45 58 54 29 3b 0a 20 20 43  EXT,f TEXT);.  C
1a90: 52 45 41 54 45 20 49 4e 44 45 58 20 74 33 78 20  REATE INDEX t3x 
1aa0: 4f 4e 20 74 33 28 62 2c 63 2c 64 2c 65 2c 66 29  ON t3(b,c,d,e,f)
1ab0: 3b 0a 0a 20 20 53 45 4c 45 43 54 20 61 20 46 52  ;..  SELECT a FR
1ac0: 4f 4d 20 74 33 0a 20 20 20 20 57 48 45 52 45 20  OM t3.    WHERE 
1ad0: 28 63 2c 64 29 20 49 4e 20 28 53 45 4c 45 43 54  (c,d) IN (SELECT
1ae0: 20 27 63 27 2c 27 64 27 20 46 52 4f 4d 20 64 75   'c','d' FROM du
1af0: 61 6c 29 0a 20 20 20 20 41 4e 44 20 28 61 2c 62  al).    AND (a,b
1b00: 2c 65 29 20 49 4e 20 28 53 45 4c 45 43 54 20 27  ,e) IN (SELECT '
1b10: 61 27 2c 27 62 27 2c 27 64 27 20 46 52 4f 4d 20  a','b','d' FROM 
1b20: 64 75 61 6c 29 3b 0a 7d 0a 0a 64 6f 5f 63 61 74  dual);.}..do_cat
1b30: 63 68 73 71 6c 5f 74 65 73 74 20 31 31 2e 31 20  chsql_test 11.1 
1b40: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
1b50: 20 74 31 31 28 61 29 3b 0a 20 20 53 45 4c 45 43   t11(a);.  SELEC
1b60: 54 20 2a 20 46 52 4f 4d 20 74 31 31 20 57 48 45  T * FROM t11 WHE
1b70: 52 45 20 28 61 2c 61 29 3c 3d 31 3b 0a 7d 20 7b  RE (a,a)<=1;.} {
1b80: 31 20 7b 72 6f 77 20 76 61 6c 75 65 20 6d 69 73  1 {row value mis
1b90: 75 73 65 64 7d 7d 0a 64 6f 5f 63 61 74 63 68 73  used}}.do_catchs
1ba0: 71 6c 5f 74 65 73 74 20 31 31 2e 32 20 7b 0a 20  ql_test 11.2 {. 
1bb0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1bc0: 31 31 20 57 48 45 52 45 20 28 61 2c 61 29 3c 31  11 WHERE (a,a)<1
1bd0: 3b 0a 7d 20 7b 31 20 7b 72 6f 77 20 76 61 6c 75  ;.} {1 {row valu
1be0: 65 20 6d 69 73 75 73 65 64 7d 7d 0a 64 6f 5f 63  e misused}}.do_c
1bf0: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 31 31 2e  atchsql_test 11.
1c00: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  3 {.  SELECT * F
1c10: 52 4f 4d 20 74 31 31 20 57 48 45 52 45 20 28 61  ROM t11 WHERE (a
1c20: 2c 61 29 3e 3d 31 3b 0a 7d 20 7b 31 20 7b 72 6f  ,a)>=1;.} {1 {ro
1c30: 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 7d  w value misused}
1c40: 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  }.do_catchsql_te
1c50: 73 74 20 31 31 2e 34 20 7b 0a 20 20 53 45 4c 45  st 11.4 {.  SELE
1c60: 43 54 20 2a 20 46 52 4f 4d 20 74 31 31 20 57 48  CT * FROM t11 WH
1c70: 45 52 45 20 28 61 2c 61 29 3e 31 3b 0a 7d 20 7b  ERE (a,a)>1;.} {
1c80: 31 20 7b 72 6f 77 20 76 61 6c 75 65 20 6d 69 73  1 {row value mis
1c90: 75 73 65 64 7d 7d 0a 64 6f 5f 63 61 74 63 68 73  used}}.do_catchs
1ca0: 71 6c 5f 74 65 73 74 20 31 31 2e 35 20 7b 0a 20  ql_test 11.5 {. 
1cb0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1cc0: 31 31 20 57 48 45 52 45 20 28 61 2c 61 29 3d 3d  11 WHERE (a,a)==
1cd0: 31 3b 0a 7d 20 7b 31 20 7b 72 6f 77 20 76 61 6c  1;.} {1 {row val
1ce0: 75 65 20 6d 69 73 75 73 65 64 7d 7d 0a 64 6f 5f  ue misused}}.do_
1cf0: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 31 31  catchsql_test 11
1d00: 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .6 {.  SELECT * 
1d10: 46 52 4f 4d 20 74 31 31 20 57 48 45 52 45 20 28  FROM t11 WHERE (
1d20: 61 2c 61 29 3c 3e 31 3b 0a 7d 20 7b 31 20 7b 72  a,a)<>1;.} {1 {r
1d30: 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
1d40: 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  }}.do_catchsql_t
1d50: 65 73 74 20 31 31 2e 37 20 7b 0a 20 20 53 45 4c  est 11.7 {.  SEL
1d60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 31 20 57  ECT * FROM t11 W
1d70: 48 45 52 45 20 28 61 2c 61 29 20 49 53 20 31 3b  HERE (a,a) IS 1;
1d80: 0a 7d 20 7b 31 20 7b 72 6f 77 20 76 61 6c 75 65  .} {1 {row value
1d90: 20 6d 69 73 75 73 65 64 7d 7d 0a 64 6f 5f 63 61   misused}}.do_ca
1da0: 74 63 68 73 71 6c 5f 74 65 73 74 20 31 31 2e 38  tchsql_test 11.8
1db0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
1dc0: 4f 4d 20 74 31 31 20 57 48 45 52 45 20 28 61 2c  OM t11 WHERE (a,
1dd0: 61 29 20 49 53 20 4e 4f 54 20 31 3b 0a 7d 20 7b  a) IS NOT 1;.} {
1de0: 31 20 7b 72 6f 77 20 76 61 6c 75 65 20 6d 69 73  1 {row value mis
1df0: 75 73 65 64 7d 7d 0a 0a 23 20 32 30 31 36 2d 31  used}}..# 2016-1
1e00: 30 2d 32 37 3a 20 68 74 74 70 73 3a 2f 2f 77 77  0-27: https://ww
1e10: 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  w.sqlite.org/src
1e20: 2f 74 6b 74 76 69 65 77 2f 66 65 66 34 62 62 34  /tktview/fef4bb4
1e30: 62 64 39 31 38 35 65 63 38 66 0a 23 20 49 6e 63  bd9185ec8f.# Inc
1e40: 6f 72 72 65 63 74 20 72 65 73 75 6c 74 20 66 72  orrect result fr
1e50: 6f 6d 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 77  om a LEFT JOIN w
1e60: 69 74 68 20 61 20 72 6f 77 2d 76 61 6c 75 65 20  ith a row-value 
1e70: 63 6f 6e 73 74 72 61 69 6e 74 0a 23 0a 64 6f 5f  constraint.#.do_
1e80: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 32 2e  execsql_test 12.
1e90: 31 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  1 {.  DROP TABLE
1ea0: 20 49 46 20 45 58 49 53 54 53 20 74 31 3b 0a 20   IF EXISTS t1;. 
1eb0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1ec0: 28 61 2c 62 29 3b 20 49 4e 53 45 52 54 20 49 4e  (a,b); INSERT IN
1ed0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32  TO t1 VALUES(1,2
1ee0: 29 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20  );.  DROP TABLE 
1ef0: 49 46 20 45 58 49 53 54 53 20 74 32 3b 0a 20 20  IF EXISTS t2;.  
1f00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
1f10: 78 2c 79 29 3b 20 49 4e 53 45 52 54 20 49 4e 54  x,y); INSERT INT
1f20: 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 34 29  O t2 VALUES(3,4)
1f30: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 2c 27 78 27  ;.  SELECT *,'x'
1f40: 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
1f50: 49 4e 20 74 32 20 4f 4e 20 28 61 2c 62 29 3d 28  IN t2 ON (a,b)=(
1f60: 78 2c 79 29 3b 0a 7d 20 7b 31 20 32 20 7b 7d 20  x,y);.} {1 2 {} 
1f70: 7b 7d 20 78 7d 0a 0a 0a 66 6f 72 65 61 63 68 20  {} x}...foreach 
1f80: 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20 20 30 20 22  {tn sql} {.  0 "
1f90: 53 45 4c 45 43 54 20 28 31 2c 32 29 20 41 53 20  SELECT (1,2) AS 
1fa0: 78 20 57 48 45 52 45 20 78 3d 33 22 0a 20 20 31  x WHERE x=3".  1
1fb0: 20 22 53 45 4c 45 43 54 20 28 31 2c 32 29 20 42   "SELECT (1,2) B
1fc0: 45 54 57 45 45 4e 20 31 20 41 4e 44 20 32 22 0a  ETWEEN 1 AND 2".
1fd0: 20 20 32 20 22 53 45 4c 45 43 54 20 31 20 42 45    2 "SELECT 1 BE
1fe0: 54 57 45 45 4e 20 28 31 2c 32 29 20 41 4e 44 20  TWEEN (1,2) AND 
1ff0: 32 22 0a 20 20 33 20 22 53 45 4c 45 43 54 20 32  2".  3 "SELECT 2
2000: 20 42 45 54 57 45 45 4e 20 31 20 41 4e 44 20 28   BETWEEN 1 AND (
2010: 31 2c 32 29 22 0a 20 20 34 20 22 53 45 4c 45 43  1,2)".  4 "SELEC
2020: 54 20 28 31 2c 32 29 20 46 52 4f 4d 20 28 53 45  T (1,2) FROM (SE
2030: 4c 45 43 54 20 31 29 20 4f 52 44 45 52 20 42 59  LECT 1) ORDER BY
2040: 20 31 22 0a 20 20 35 20 22 53 45 4c 45 43 54 20   1".  5 "SELECT 
2050: 28 31 2c 32 29 20 46 52 4f 4d 20 28 53 45 4c 45  (1,2) FROM (SELE
2060: 43 54 20 31 29 20 47 52 4f 55 50 20 42 59 20 31  CT 1) GROUP BY 1
2070: 22 0a 7d 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68  ".} {.  do_catch
2080: 73 71 6c 5f 74 65 73 74 20 31 33 2e 24 74 6e 20  sql_test 13.$tn 
2090: 24 73 71 6c 20 7b 31 20 7b 72 6f 77 20 76 61 6c  $sql {1 {row val
20a0: 75 65 20 6d 69 73 75 73 65 64 7d 7d 0a 7d 0a 0a  ue misused}}.}..
20b0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
20c0: 31 34 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  14.0 {.  CREATE 
20d0: 54 41 42 4c 45 20 74 31 32 28 78 29 3b 0a 20 20  TABLE t12(x);.  
20e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 32 20  INSERT INTO t12 
20f0: 56 41 4c 55 45 53 28 32 29 2c 20 28 34 29 3b 0a  VALUES(2), (4);.
2100: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
2110: 74 20 31 34 2e 31 20 22 53 45 4c 45 43 54 20 31  t 14.1 "SELECT 1
2120: 20 57 48 45 52 45 20 28 32 2c 32 29 20 42 45 54   WHERE (2,2) BET
2130: 57 45 45 4e 20 28 31 2c 31 29 20 41 4e 44 20 28  WEEN (1,1) AND (
2140: 33 2c 33 29 22 20 31 0a 64 6f 5f 65 78 65 63 73  3,3)" 1.do_execs
2150: 71 6c 5f 74 65 73 74 20 31 34 2e 32 20 22 53 45  ql_test 14.2 "SE
2160: 4c 45 43 54 20 43 41 53 45 20 28 32 2c 32 29 20  LECT CASE (2,2) 
2170: 57 48 45 4e 20 28 31 2c 20 31 29 20 54 48 45 4e  WHEN (1, 1) THEN
2180: 20 32 20 45 4c 53 45 20 31 20 45 4e 44 22 20 31   2 ELSE 1 END" 1
2190: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
21a0: 20 31 34 2e 33 20 22 53 45 4c 45 43 54 20 43 41   14.3 "SELECT CA
21b0: 53 45 20 28 53 45 4c 45 43 54 20 32 2c 32 29 20  SE (SELECT 2,2) 
21c0: 57 48 45 4e 20 28 31 2c 20 31 29 20 54 48 45 4e  WHEN (1, 1) THEN
21d0: 20 32 20 45 4c 53 45 20 31 20 45 4e 44 22 20 31   2 ELSE 1 END" 1
21e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
21f0: 20 31 34 2e 34 20 22 53 45 4c 45 43 54 20 31 20   14.4 "SELECT 1 
2200: 57 48 45 52 45 20 28 53 45 4c 45 43 54 20 32 2c  WHERE (SELECT 2,
2210: 32 29 20 42 45 54 57 45 45 4e 20 28 31 2c 31 29  2) BETWEEN (1,1)
2220: 20 41 4e 44 20 28 33 2c 33 29 22 20 31 0a 64 6f   AND (3,3)" 1.do
2230: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 34  _execsql_test 14
2240: 2e 35 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f  .5 "SELECT 1 FRO
2250: 4d 20 74 31 32 20 57 48 45 52 45 20 28 78 2c 31  M t12 WHERE (x,1
2260: 29 20 42 45 54 57 45 45 4e 20 28 31 2c 31 29 20  ) BETWEEN (1,1) 
2270: 41 4e 44 20 28 33 2c 33 29 22 20 31 0a 64 6f 5f  AND (3,3)" 1.do_
2280: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 34 2e  execsql_test 14.
2290: 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 31 20 46  6 {.  SELECT 1 F
22a0: 52 4f 4d 20 74 31 32 20 57 48 45 52 45 20 28 31  ROM t12 WHERE (1
22b0: 2c 78 29 20 42 45 54 57 45 45 4e 20 28 31 2c 31  ,x) BETWEEN (1,1
22c0: 29 20 41 4e 44 20 28 33 2c 33 29 0a 7d 20 7b 31  ) AND (3,3).} {1
22d0: 20 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   1}..#----------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2320: 23 20 54 65 73 74 20 74 68 61 74 20 65 72 72 6f  # Test that erro
2330: 72 73 20 61 72 65 20 6e 6f 74 20 63 6f 6e 63 65  rs are not conce
2340: 61 6c 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  aled by the SELE
2350: 43 54 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 72  CT flattening or
2360: 0a 23 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20  .# WHERE-clause 
2370: 70 75 73 68 2d 64 6f 77 6e 20 6f 70 74 69 6d 69  push-down optimi
2380: 7a 61 74 69 6f 6e 73 2e 0a 64 6f 5f 65 78 65 63  zations..do_exec
2390: 73 71 6c 5f 74 65 73 74 20 31 34 2e 31 20 7b 0a  sql_test 14.1 {.
23a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
23b0: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
23c0: 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41   b);.  CREATE TA
23d0: 42 4c 45 20 78 32 28 61 20 49 4e 54 45 47 45 52  BLE x2(a INTEGER
23e0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
23f0: 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e  ;.}..foreach {tn
2400: 20 6e 20 73 71 6c 7d 20 7b 0a 20 20 31 20 30 20   n sql} {.  1 0 
2410: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28  "SELECT * FROM (
2420: 53 45 4c 45 43 54 20 28 31 2c 20 31 29 20 41 53  SELECT (1, 1) AS
2430: 20 63 20 46 52 4f 4d 20 78 31 29 20 57 48 45 52   c FROM x1) WHER
2440: 45 20 63 3d 31 22 0a 20 20 32 20 32 20 22 53 45  E c=1".  2 2 "SE
2450: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
2460: 45 43 54 20 31 20 41 53 20 78 2c 20 28 53 45 4c  ECT 1 AS x, (SEL
2470: 45 43 54 20 38 2c 39 29 20 41 53 20 79 29 20 57  ECT 8,9) AS y) W
2480: 48 45 52 45 20 79 3c 31 22 0a 20 20 33 20 33 20  HERE y<1".  3 3 
2490: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28  "SELECT * FROM (
24a0: 53 45 4c 45 43 54 20 31 20 41 53 20 78 2c 20 28  SELECT 1 AS x, (
24b0: 53 45 4c 45 43 54 20 38 2c 39 2c 31 30 29 20 41  SELECT 8,9,10) A
24c0: 53 20 79 29 20 57 48 45 52 45 20 79 3c 31 22 0a  S y) WHERE y<1".
24d0: 20 20 34 20 30 20 22 53 45 4c 45 43 54 20 2a 20    4 0 "SELECT * 
24e0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 28 61 2c  FROM (SELECT (a,
24f0: 20 62 29 20 41 53 20 63 20 46 52 4f 4d 20 78 31   b) AS c FROM x1
2500: 29 2c 20 78 32 20 57 48 45 52 45 20 63 3d 61 22  ), x2 WHERE c=a"
2510: 0a 20 20 35 20 30 20 22 53 45 4c 45 43 54 20 2a  .  5 0 "SELECT *
2520: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20   FROM (SELECT a 
2530: 41 53 20 63 2c 20 28 31 2c 20 32 2c 20 33 29 20  AS c, (1, 2, 3) 
2540: 46 52 4f 4d 20 78 31 29 2c 20 78 32 20 57 48 45  FROM x1), x2 WHE
2550: 52 45 20 63 3d 61 22 0a 20 20 36 20 30 20 22 53  RE c=a".  6 0 "S
2560: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
2570: 4c 45 43 54 20 31 20 41 53 20 63 2c 20 28 31 2c  LECT 1 AS c, (1,
2580: 20 32 2c 20 33 29 20 46 52 4f 4d 20 78 31 29 20   2, 3) FROM x1) 
2590: 57 48 45 52 45 20 63 3d 31 22 0a 7d 20 7b 0a 20  WHERE c=1".} {. 
25a0: 20 69 66 20 7b 24 6e 3d 3d 30 7d 20 7b 0a 20 20   if {$n==0} {.  
25b0: 20 20 73 65 74 20 65 72 72 20 22 72 6f 77 20 76    set err "row v
25c0: 61 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 20 20  alue misused".  
25d0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74  } else {.    set
25e0: 20 65 72 72 20 22 73 75 62 2d 73 65 6c 65 63 74   err "sub-select
25f0: 20 72 65 74 75 72 6e 73 20 24 6e 20 63 6f 6c 75   returns $n colu
2600: 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 31  mns - expected 1
2610: 22 0a 20 20 7d 0a 20 20 64 6f 5f 63 61 74 63 68  ".  }.  do_catch
2620: 73 71 6c 5f 74 65 73 74 20 31 34 2e 32 2e 24 74  sql_test 14.2.$t
2630: 6e 20 24 73 71 6c 20 5b 6c 69 73 74 20 31 20 24  n $sql [list 1 $
2640: 65 72 72 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  err].}..#-------
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: 2d 2d 2d 0a 23 20 54 65 73 74 20 66 6f 72 20 76  ---.# Test for v
26a0: 65 63 74 6f 72 20 73 69 7a 65 20 6d 69 73 6d 61  ector size misma
26b0: 74 63 68 65 73 20 63 6f 6e 63 65 61 6c 65 64 20  tches concealed 
26c0: 62 79 20 75 6e 65 78 70 61 6e 64 65 64 20 73 75  by unexpanded su
26d0: 62 71 75 65 72 69 65 73 2e 0a 23 0a 64 6f 5f 63  bqueries..#.do_c
26e0: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 31 35 2e  atchsql_test 15.
26f0: 31 20 7b 0a 20 20 44 45 54 41 43 48 20 28 53 45  1 {.  DETACH (SE
2700: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
2710: 45 43 54 20 31 2c 32 29 29 3c 33 3b 0a 7d 20 7b  ECT 1,2))<3;.} {
2720: 31 20 7b 72 6f 77 20 76 61 6c 75 65 20 6d 69 73  1 {row value mis
2730: 75 73 65 64 7d 7d 0a 64 6f 5f 63 61 74 63 68 73  used}}.do_catchs
2740: 71 6c 5f 74 65 73 74 20 31 35 2e 32 20 7b 0a 20  ql_test 15.2 {. 
2750: 20 55 50 44 41 54 45 20 78 31 20 53 45 54 20 61   UPDATE x1 SET a
2760: 3d 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  =(SELECT * FROM 
2770: 28 53 45 4c 45 43 54 20 62 2c 32 29 29 3c 33 3b  (SELECT b,2))<3;
2780: 0a 7d 20 7b 31 20 7b 72 6f 77 20 76 61 6c 75 65  .} {1 {row value
2790: 20 6d 69 73 75 73 65 64 7d 7d 0a 64 6f 5f 63 61   misused}}.do_ca
27a0: 74 63 68 73 71 6c 5f 74 65 73 74 20 31 35 2e 33  tchsql_test 15.3
27b0: 20 7b 0a 20 20 55 50 44 41 54 45 20 78 31 20 53   {.  UPDATE x1 S
27c0: 45 54 20 61 3d 4e 55 4c 4c 20 57 48 45 52 45 20  ET a=NULL WHERE 
27d0: 20 61 3c 28 53 45 4c 45 43 54 20 2a 20 46 52 4f   a<(SELECT * FRO
27e0: 4d 20 28 53 45 4c 45 43 54 20 62 2c 32 29 29 3b  M (SELECT b,2));
27f0: 0a 7d 20 7b 31 20 7b 73 75 62 2d 73 65 6c 65 63  .} {1 {sub-selec
2800: 74 20 72 65 74 75 72 6e 73 20 32 20 63 6f 6c 75  t returns 2 colu
2810: 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 31  mns - expected 1
2820: 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  }}.do_catchsql_t
2830: 65 73 74 20 31 35 2e 34 20 7b 0a 20 20 44 45 4c  est 15.4 {.  DEL
2840: 45 54 45 20 46 52 4f 4d 20 78 31 20 57 48 45 52  ETE FROM x1 WHER
2850: 45 20 20 61 3c 28 53 45 4c 45 43 54 20 2a 20 46  E  a<(SELECT * F
2860: 52 4f 4d 20 28 53 45 4c 45 43 54 20 62 2c 32 29  ROM (SELECT b,2)
2870: 29 3b 0a 7d 20 7b 31 20 7b 73 75 62 2d 73 65 6c  );.} {1 {sub-sel
2880: 65 63 74 20 72 65 74 75 72 6e 73 20 32 20 63 6f  ect returns 2 co
2890: 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64  lumns - expected
28a0: 20 31 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c   1}}.do_catchsql
28b0: 5f 74 65 73 74 20 31 35 2e 35 20 7b 0a 20 20 49  _test 15.5 {.  I
28c0: 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 28 61 2c  NSERT INTO x1(a,
28d0: 62 29 20 56 41 4c 55 45 53 28 31 2c 28 53 45 4c  b) VALUES(1,(SEL
28e0: 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
28f0: 43 54 20 31 2c 32 29 29 3c 33 29 3b 0a 7d 20 7b  CT 1,2))<3);.} {
2900: 31 20 7b 72 6f 77 20 76 61 6c 75 65 20 6d 69 73  1 {row value mis
2910: 75 73 65 64 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  used}}..#-------
2920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2960: 2d 2d 0a 23 20 52 6f 77 2d 76 61 6c 75 65 73 20  --.# Row-values 
2970: 75 73 65 64 20 69 6e 20 55 50 44 41 54 45 20 73  used in UPDATE s
2980: 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e  tatements within
2990: 20 54 52 49 47 47 45 52 73 0a 23 0a 23 20 54 69   TRIGGERs.#.# Ti
29a0: 63 6b 65 74 20 68 74 74 70 73 3a 2f 2f 77 77 77  cket https://www
29b0: 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
29c0: 69 6e 66 6f 2f 38 63 39 34 35 38 65 37 30 33 36  info/8c9458e7036
29d0: 36 36 65 31 61 0a 23 0a 64 6f 5f 65 78 65 63 73  66e1a.#.do_execs
29e0: 71 6c 5f 74 65 73 74 20 31 36 2e 31 20 7b 0a 20  ql_test 16.1 {. 
29f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
2a00: 36 61 28 61 2c 62 2c 63 29 3b 0a 20 20 49 4e 53  6a(a,b,c);.  INS
2a10: 45 52 54 20 49 4e 54 4f 20 74 31 36 61 20 56 41  ERT INTO t16a VA
2a20: 4c 55 45 53 28 31 2c 32 2c 33 29 3b 0a 20 20 43  LUES(1,2,3);.  C
2a30: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 36 62  REATE TABLE t16b
2a40: 28 78 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  (x);.  INSERT IN
2a50: 54 4f 20 74 31 36 62 28 78 29 20 56 41 4c 55 45  TO t16b(x) VALUE
2a60: 53 28 31 29 3b 0a 20 20 43 52 45 41 54 45 20 54  S(1);.  CREATE T
2a70: 52 49 47 47 45 52 20 74 31 36 72 20 41 46 54 45  RIGGER t16r AFTE
2a80: 52 20 55 50 44 41 54 45 20 4f 4e 20 74 31 36 62  R UPDATE ON t16b
2a90: 20 42 45 47 49 4e 0a 20 20 20 20 20 55 50 44 41   BEGIN.     UPDA
2aa0: 54 45 20 74 31 36 61 20 53 45 54 20 28 61 2c 62  TE t16a SET (a,b
2ab0: 2c 63 29 3d 28 53 45 4c 45 43 54 20 6e 65 77 2e  ,c)=(SELECT new.
2ac0: 78 2c 6e 65 77 2e 78 2b 31 2c 6e 65 77 2e 78 2b  x,new.x+1,new.x+
2ad0: 32 29 3b 0a 20 20 45 4e 44 3b 0a 20 20 55 50 44  2);.  END;.  UPD
2ae0: 41 54 45 20 74 31 36 62 20 53 45 54 20 78 3d 37  ATE t16b SET x=7
2af0: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
2b00: 4d 20 74 31 36 61 3b 0a 7d 20 7b 37 20 38 20 39  M t16a;.} {7 8 9
2b10: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
2b20: 74 20 31 36 2e 32 20 7b 0a 20 20 55 50 44 41 54  t 16.2 {.  UPDAT
2b30: 45 20 74 31 36 62 20 53 45 54 20 78 3d 39 37 3b  E t16b SET x=97;
2b40: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
2b50: 20 74 31 36 61 3b 0a 7d 20 7b 39 37 20 39 38 20   t16a;.} {97 98 
2b60: 39 39 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  99}..do_execsql_
2b70: 74 65 73 74 20 31 36 2e 33 20 7b 0a 20 20 43 52  test 16.3 {.  CR
2b80: 45 41 54 45 20 54 41 42 4c 45 20 74 31 36 63 28  EATE TABLE t16c(
2b90: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 3b 0a  a, b, c, d, e);.
2ba0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2bb0: 36 63 20 56 41 4c 55 45 53 28 31 2c 20 27 61 27  6c VALUES(1, 'a'
2bc0: 2c 20 27 62 27 2c 20 27 63 27 2c 20 27 64 27 29  , 'b', 'c', 'd')
2bd0: 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47  ;.  CREATE TRIGG
2be0: 45 52 20 74 31 36 63 31 20 41 46 54 45 52 20 49  ER t16c1 AFTER I
2bf0: 4e 53 45 52 54 20 4f 4e 20 74 31 36 63 20 42 45  NSERT ON t16c BE
2c00: 47 49 4e 0a 20 20 20 20 55 50 44 41 54 45 20 74  GIN.    UPDATE t
2c10: 31 36 63 20 53 45 54 20 28 63 2c 20 64 29 20 3d  16c SET (c, d) =
2c20: 20 28 53 45 4c 45 43 54 20 27 41 27 2c 20 27 42   (SELECT 'A', 'B
2c30: 27 29 2c 20 28 65 2c 20 62 29 20 3d 20 28 53 45  '), (e, b) = (SE
2c40: 4c 45 43 54 20 27 43 27 2c 20 27 44 27 29 0a 20  LECT 'C', 'D'). 
2c50: 20 20 20 20 20 57 48 45 52 45 20 61 20 3d 20 6e       WHERE a = n
2c60: 65 77 2e 61 2d 31 3b 0a 20 20 45 4e 44 3b 0a 0a  ew.a-1;.  END;..
2c70: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2c80: 74 31 36 63 3b 0a 7d 20 7b 31 20 61 20 62 20 63  t16c;.} {1 a b c
2c90: 20 64 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   d}..do_execsql_
2ca0: 74 65 73 74 20 31 36 2e 34 20 7b 0a 20 20 49 4e  test 16.4 {.  IN
2cb0: 53 45 52 54 20 49 4e 54 4f 20 74 31 36 63 20 56  SERT INTO t16c V
2cc0: 41 4c 55 45 53 28 32 2c 20 27 77 27 2c 20 27 78  ALUES(2, 'w', 'x
2cd0: 27 2c 20 27 79 27 2c 20 27 7a 27 29 3b 0a 20 20  ', 'y', 'z');.  
2ce0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2cf0: 36 63 3b 0a 7d 20 7b 0a 20 20 31 20 44 20 41 20  6c;.} {.  1 D A 
2d00: 42 20 43 20 0a 20 20 32 20 77 20 78 20 79 20 7a  B C .  2 w x y z
2d10: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
2d20: 65 73 74 20 31 36 2e 35 20 7b 0a 20 20 44 52 4f  est 16.5 {.  DRO
2d30: 50 20 54 52 49 47 47 45 52 20 74 31 36 63 31 3b  P TRIGGER t16c1;
2d40: 0a 20 20 50 52 41 47 4d 41 20 72 65 63 75 72 73  .  PRAGMA recurs
2d50: 69 76 65 5f 74 72 69 67 67 65 72 73 20 3d 20 31  ive_triggers = 1
2d60: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2d70: 74 31 36 63 20 56 41 4c 55 45 53 28 33 2c 20 27  t16c VALUES(3, '
2d80: 69 27 2c 20 27 69 69 27 2c 20 27 69 69 69 27 2c  i', 'ii', 'iii',
2d90: 20 27 69 76 27 29 3b 0a 20 20 43 52 45 41 54 45   'iv');.  CREATE
2da0: 20 54 52 49 47 47 45 52 20 74 31 36 63 31 20 41   TRIGGER t16c1 A
2db0: 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20 74  FTER UPDATE ON t
2dc0: 31 36 63 20 57 48 45 4e 20 6e 65 77 2e 61 3e 31  16c WHEN new.a>1
2dd0: 20 42 45 47 49 4e 0a 20 20 20 20 55 50 44 41 54   BEGIN.    UPDAT
2de0: 45 20 74 31 36 63 20 53 45 54 20 28 65 2c 20 64  E t16c SET (e, d
2df0: 29 20 3d 20 28 0a 20 20 20 20 20 20 53 45 4c 45  ) = (.      SELE
2e00: 43 54 20 62 2c 20 63 20 46 52 4f 4d 20 74 31 36  CT b, c FROM t16
2e10: 63 20 57 48 45 52 45 20 61 20 3d 20 6e 65 77 2e  c WHERE a = new.
2e20: 61 2d 31 0a 20 20 20 20 29 2c 20 28 63 2c 20 62  a-1.    ), (c, b
2e30: 29 20 3d 20 28 0a 20 20 20 20 20 20 53 45 4c 45  ) = (.      SELE
2e40: 43 54 20 64 2c 20 65 20 46 52 4f 4d 20 74 31 36  CT d, e FROM t16
2e50: 63 20 57 48 45 52 45 20 61 20 3d 20 6e 65 77 2e  c WHERE a = new.
2e60: 61 2d 31 0a 20 20 20 20 29 20 57 48 45 52 45 20  a-1.    ) WHERE 
2e70: 61 20 3d 20 6e 65 77 2e 61 2d 31 3b 0a 20 20 45  a = new.a-1;.  E
2e80: 4e 44 3b 0a 0a 20 20 55 50 44 41 54 45 20 74 31  ND;..  UPDATE t1
2e90: 36 63 20 53 45 54 20 61 3d 61 20 57 48 45 52 45  6c SET a=a WHERE
2ea0: 20 61 3d 33 3b 0a 20 20 53 45 4c 45 43 54 20 2a   a=3;.  SELECT *
2eb0: 20 46 52 4f 4d 20 74 31 36 63 3b 0a 7d 20 7b 0a   FROM t16c;.} {.
2ec0: 20 20 31 20 43 20 42 20 41 20 44 0a 20 20 32 20    1 C B A D.  2 
2ed0: 7a 20 79 20 78 20 77 0a 20 20 33 20 69 20 69 69  z y x w.  3 i ii
2ee0: 20 69 69 69 20 69 76 0a 7d 0a 0a 64 6f 5f 65 78   iii iv.}..do_ex
2ef0: 65 63 73 71 6c 5f 74 65 73 74 20 31 37 2e 30 20  ecsql_test 17.0 
2f00: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
2f10: 20 62 31 28 61 2c 20 62 29 3b 0a 20 20 43 52 45   b1(a, b);.  CRE
2f20: 41 54 45 20 54 41 42 4c 45 20 62 32 28 78 29 3b  ATE TABLE b2(x);
2f30: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
2f40: 65 73 74 20 31 37 2e 31 20 7b 0a 20 20 53 45 4c  est 17.1 {.  SEL
2f50: 45 43 54 20 2a 20 46 52 4f 4d 20 62 32 20 43 52  ECT * FROM b2 CR
2f60: 4f 53 53 20 4a 4f 49 4e 20 62 31 20 0a 20 20 57  OSS JOIN b1 .  W
2f70: 48 45 52 45 20 62 32 2e 78 3d 62 31 2e 61 20 41  HERE b2.x=b1.a A
2f80: 4e 44 20 28 62 31 2e 61 2c 20 32 29 20 0a 20 20  ND (b1.a, 2) .  
2f90: 49 4e 20 28 56 41 4c 55 45 53 28 31 2c 20 32 29  IN (VALUES(1, 2)
2fa0: 29 3b 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63  );.} {}..do_exec
2fb0: 73 71 6c 5f 74 65 73 74 20 31 38 2e 30 20 7b 0a  sql_test 18.0 {.
2fc0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 62    CREATE TABLE b
2fd0: 33 20 28 20 61 2c 20 62 2c 20 50 52 49 4d 41 52  3 ( a, b, PRIMAR
2fe0: 59 20 4b 45 59 20 28 61 2c 20 62 29 20 29 3b 0a  Y KEY (a, b) );.
2ff0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 62    CREATE TABLE b
3000: 34 20 28 20 61 20 29 3b 0a 20 20 43 52 45 41 54  4 ( a );.  CREAT
3010: 45 20 54 41 42 4c 45 20 62 35 20 28 20 61 2c 20  E TABLE b5 ( a, 
3020: 62 20 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  b );.  INSERT IN
3030: 54 4f 20 62 33 20 56 41 4c 55 45 53 20 28 31 2c  TO b3 VALUES (1,
3040: 20 31 29 2c 20 28 31 2c 20 32 29 3b 0a 20 20 49   1), (1, 2);.  I
3050: 4e 53 45 52 54 20 49 4e 54 4f 20 62 34 20 56 41  NSERT INTO b4 VA
3060: 4c 55 45 53 20 28 31 29 3b 0a 20 20 49 4e 53 45  LUES (1);.  INSE
3070: 52 54 20 49 4e 54 4f 20 62 35 20 56 41 4c 55 45  RT INTO b5 VALUE
3080: 53 20 28 31 2c 20 31 29 2c 20 28 31 2c 20 32 29  S (1, 1), (1, 2)
3090: 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ;.}..do_execsql_
30a0: 74 65 73 74 20 31 38 2e 31 20 7b 0a 20 20 53 45  test 18.1 {.  SE
30b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 33 20 57  LECT * FROM b3 W
30c0: 48 45 52 45 20 28 53 45 4c 45 43 54 20 62 33 2e  HERE (SELECT b3.
30d0: 61 2c 20 62 33 2e 62 29 20 49 4e 20 28 20 53 45  a, b3.b) IN ( SE
30e0: 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 62  LECT a, b FROM b
30f0: 35 20 29 0a 7d 20 7b 31 20 31 20 31 20 32 7d 0a  5 ).} {1 1 1 2}.
3100: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3110: 31 38 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  18.2 {.  SELECT 
3120: 2a 20 46 52 4f 4d 20 62 33 20 57 48 45 52 45 20  * FROM b3 WHERE 
3130: 28 56 41 4c 55 45 53 28 62 33 2e 61 2c 20 62 33  (VALUES(b3.a, b3
3140: 2e 62 29 29 20 49 4e 20 28 20 53 45 4c 45 43 54  .b)) IN ( SELECT
3150: 20 61 2c 20 62 20 46 52 4f 4d 20 62 35 20 29 3b   a, b FROM b5 );
3160: 0a 7d 20 7b 31 20 31 20 31 20 32 7d 0a 64 6f 5f  .} {1 1 1 2}.do_
3170: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 38 2e  execsql_test 18.
3180: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  3 {.  SELECT * F
3190: 52 4f 4d 20 62 33 20 57 48 45 52 45 20 28 62 33  ROM b3 WHERE (b3
31a0: 2e 61 2c 20 62 33 2e 62 29 20 49 4e 20 28 20 53  .a, b3.b) IN ( S
31b0: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
31c0: 62 35 20 29 3b 20 0a 7d 20 7b 31 20 31 20 31 20  b5 ); .} {1 1 1 
31d0: 32 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  2}.do_execsql_te
31e0: 73 74 20 31 38 2e 34 20 7b 0a 20 20 53 45 4c 45  st 18.4 {.  SELE
31f0: 43 54 20 2a 20 46 52 4f 4d 20 62 33 20 4a 4f 49  CT * FROM b3 JOI
3200: 4e 20 62 34 20 4f 4e 20 62 34 2e 61 20 3d 20 62  N b4 ON b4.a = b
3210: 33 2e 61 0a 20 20 57 48 45 52 45 20 28 53 45 4c  3.a.  WHERE (SEL
3220: 45 43 54 20 62 33 2e 61 2c 20 62 33 2e 62 29 20  ECT b3.a, b3.b) 
3230: 49 4e 20 28 20 53 45 4c 45 43 54 20 61 2c 20 62  IN ( SELECT a, b
3240: 20 46 52 4f 4d 20 62 35 20 29 3b 20 0a 7d 20 7b   FROM b5 ); .} {
3250: 31 20 31 20 31 20 31 20 32 20 31 7d 0a 64 6f 5f  1 1 1 1 2 1}.do_
3260: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 38 2e  execsql_test 18.
3270: 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  5 {.  SELECT * F
3280: 52 4f 4d 20 62 33 20 4a 4f 49 4e 20 62 34 20 4f  ROM b3 JOIN b4 O
3290: 4e 20 62 34 2e 61 20 3d 20 62 33 2e 61 0a 20 20  N b4.a = b3.a.  
32a0: 57 48 45 52 45 20 28 56 41 4c 55 45 53 28 62 33  WHERE (VALUES(b3
32b0: 2e 61 2c 20 62 33 2e 62 29 29 20 49 4e 20 28 20  .a, b3.b)) IN ( 
32c0: 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d  SELECT a, b FROM
32d0: 20 62 35 20 29 3b 20 0a 7d 20 7b 31 20 31 20 31   b5 ); .} {1 1 1
32e0: 20 31 20 32 20 31 7d 0a 64 6f 5f 65 78 65 63 73   1 2 1}.do_execs
32f0: 71 6c 5f 74 65 73 74 20 31 38 2e 36 20 7b 0a 20  ql_test 18.6 {. 
3300: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62   SELECT * FROM b
3310: 33 20 4a 4f 49 4e 20 62 34 20 4f 4e 20 62 34 2e  3 JOIN b4 ON b4.
3320: 61 20 3d 20 62 33 2e 61 0a 20 20 57 48 45 52 45  a = b3.a.  WHERE
3330: 20 28 62 33 2e 61 2c 20 62 33 2e 62 29 20 49 4e   (b3.a, b3.b) IN
3340: 20 28 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46   ( SELECT a, b F
3350: 52 4f 4d 20 62 35 20 29 3b 20 0a 7d 20 7b 31 20  ROM b5 ); .} {1 
3360: 31 20 31 20 31 20 32 20 31 7d 0a 0a 20 0a 23 20  1 1 1 2 1}.. .# 
3370: 32 30 31 38 2d 30 32 2d 31 33 20 54 69 63 6b 65  2018-02-13 Ticke
3380: 74 20 68 74 74 70 73 3a 2f 2f 77 77 77 2e 73 71  t https://www.sq
3390: 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 74 6b 74  lite.org/src/tkt
33a0: 76 69 65 77 2f 66 34 38 34 62 36 35 66 33 64 36  view/f484b65f3d6
33b0: 32 33 30 35 39 33 63 33 0a 23 20 49 6e 63 6f 72  230593c3.# Incor
33c0: 72 65 63 74 20 72 65 73 75 6c 74 20 66 72 6f 6d  rect result from
33d0: 20 61 20 72 6f 77 2d 76 61 6c 75 65 20 63 6f 6d   a row-value com
33e0: 70 61 72 69 73 6f 6e 20 69 6e 20 74 68 65 20 57  parison in the W
33f0: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 23 0a 64  HERE clause..#.d
3400: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
3410: 39 2e 31 20 7b 0a 20 20 44 52 4f 50 20 54 41 42  9.1 {.  DROP TAB
3420: 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 31 3b  LE IF EXISTS t1;
3430: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
3440: 74 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  t1(a INTEGER PRI
3450: 4d 41 52 59 20 4b 45 59 2c 62 29 3b 0a 20 20 49  MARY KEY,b);.  I
3460: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61 2c  NSERT INTO t1(a,
3470: 62 29 20 56 41 4c 55 45 53 28 31 2c 31 31 29 2c  b) VALUES(1,11),
3480: 28 32 2c 32 32 29 2c 28 33 2c 33 33 29 2c 28 34  (2,22),(3,33),(4
3490: 2c 34 34 29 3b 0a 20 20 53 45 4c 45 43 54 20 2a  ,44);.  SELECT *
34a0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28   FROM t1 WHERE (
34b0: 61 2c 62 29 3e 28 30 2c 30 29 20 4f 52 44 45 52  a,b)>(0,0) ORDER
34c0: 20 42 59 20 61 3b 0a 7d 20 7b 31 20 31 31 20 32   BY a;.} {1 11 2
34d0: 20 32 32 20 33 20 33 33 20 34 20 34 34 7d 0a 64   22 3 33 4 44}.d
34e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
34f0: 39 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  9.2 {.  SELECT *
3500: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28   FROM t1 WHERE (
3510: 61 2c 62 29 3e 3d 28 30 2c 30 29 20 4f 52 44 45  a,b)>=(0,0) ORDE
3520: 52 20 42 59 20 61 3b 0a 7d 20 7b 31 20 31 31 20  R BY a;.} {1 11 
3530: 32 20 32 32 20 33 20 33 33 20 34 20 34 34 7d 0a  2 22 3 33 4 44}.
3540: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3550: 31 39 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20  19.3 {.  SELECT 
3560: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
3570: 28 61 2c 62 29 3c 28 35 2c 30 29 20 4f 52 44 45  (a,b)<(5,0) ORDE
3580: 52 20 42 59 20 61 20 44 45 53 43 3b 0a 7d 20 7b  R BY a DESC;.} {
3590: 34 20 34 34 20 33 20 33 33 20 32 20 32 32 20 31  4 44 3 33 2 22 1
35a0: 20 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   11}.do_execsql_
35b0: 74 65 73 74 20 31 39 2e 34 20 7b 0a 20 20 53 45  test 19.4 {.  SE
35c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
35d0: 48 45 52 45 20 28 61 2c 62 29 3c 3d 28 35 2c 30  HERE (a,b)<=(5,0
35e0: 29 20 4f 52 44 45 52 20 42 59 20 61 20 44 45 53  ) ORDER BY a DES
35f0: 43 3b 0a 7d 20 7b 34 20 34 34 20 33 20 33 33 20  C;.} {4 44 3 33 
3600: 32 20 32 32 20 31 20 31 31 7d 0a 64 6f 5f 65 78  2 22 1 11}.do_ex
3610: 65 63 73 71 6c 5f 74 65 73 74 20 31 39 2e 35 20  ecsql_test 19.5 
3620: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
3630: 4d 20 74 31 20 57 48 45 52 45 20 28 61 2c 62 29  M t1 WHERE (a,b)
3640: 3e 28 33 2c 30 29 20 4f 52 44 45 52 20 42 59 20  >(3,0) ORDER BY 
3650: 61 3b 0a 7d 20 7b 33 20 33 33 20 34 20 34 34 7d  a;.} {3 33 4 44}
3660: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3670: 20 31 39 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54   19.6 {.  SELECT
3680: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
3690: 20 28 61 2c 62 29 3e 3d 28 33 2c 30 29 20 4f 52   (a,b)>=(3,0) OR
36a0: 44 45 52 20 42 59 20 61 3b 0a 7d 20 7b 33 20 33  DER BY a;.} {3 3
36b0: 33 20 34 20 34 34 7d 0a 64 6f 5f 65 78 65 63 73  3 4 44}.do_execs
36c0: 71 6c 5f 74 65 73 74 20 31 39 2e 37 20 7b 0a 20  ql_test 19.7 {. 
36d0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
36e0: 31 20 57 48 45 52 45 20 28 61 2c 62 29 3c 28 33  1 WHERE (a,b)<(3
36f0: 2c 30 29 20 4f 52 44 45 52 20 42 59 20 61 20 44  ,0) ORDER BY a D
3700: 45 53 43 3b 0a 7d 20 7b 32 20 32 32 20 31 20 31  ESC;.} {2 22 1 1
3710: 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  1}.do_execsql_te
3720: 73 74 20 31 39 2e 38 20 7b 0a 20 20 53 45 4c 45  st 19.8 {.  SELE
3730: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
3740: 52 45 20 28 61 2c 62 29 3c 3d 28 33 2c 30 29 20  RE (a,b)<=(3,0) 
3750: 4f 52 44 45 52 20 42 59 20 61 20 44 45 53 43 3b  ORDER BY a DESC;
3760: 0a 7d 20 7b 32 20 32 32 20 31 20 31 31 7d 0a 64  .} {2 22 1 11}.d
3770: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
3780: 39 2e 39 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  9.9 {.  SELECT *
3790: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28   FROM t1 WHERE (
37a0: 61 2c 62 29 3e 28 33 2c 33 32 29 20 4f 52 44 45  a,b)>(3,32) ORDE
37b0: 52 20 42 59 20 61 3b 0a 7d 20 7b 33 20 33 33 20  R BY a;.} {3 33 
37c0: 34 20 34 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  4 44}.do_execsql
37d0: 5f 74 65 73 74 20 31 39 2e 31 30 20 7b 0a 20 20  _test 19.10 {.  
37e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
37f0: 20 57 48 45 52 45 20 28 61 2c 62 29 3e 28 33 2c   WHERE (a,b)>(3,
3800: 33 33 29 20 4f 52 44 45 52 20 42 59 20 61 3b 0a  33) ORDER BY a;.
3810: 7d 20 7b 34 20 34 34 7d 0a 64 6f 5f 65 78 65 63  } {4 44}.do_exec
3820: 73 71 6c 5f 74 65 73 74 20 31 39 2e 31 31 20 7b  sql_test 19.11 {
3830: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
3840: 20 74 31 20 57 48 45 52 45 20 28 61 2c 62 29 3e   t1 WHERE (a,b)>
3850: 3d 28 33 2c 33 33 29 20 4f 52 44 45 52 20 42 59  =(3,33) ORDER BY
3860: 20 61 3b 0a 7d 20 7b 33 20 33 33 20 34 20 34 34   a;.} {3 33 4 44
3870: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
3880: 74 20 31 39 2e 31 32 20 7b 0a 20 20 53 45 4c 45  t 19.12 {.  SELE
3890: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
38a0: 52 45 20 28 61 2c 62 29 3e 3d 28 33 2c 33 34 29  RE (a,b)>=(3,34)
38b0: 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 7d 20 7b   ORDER BY a;.} {
38c0: 34 20 34 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  4 44}.do_execsql
38d0: 5f 74 65 73 74 20 31 39 2e 31 33 20 7b 0a 20 20  _test 19.13 {.  
38e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
38f0: 20 57 48 45 52 45 20 28 61 2c 62 29 3c 28 33 2c   WHERE (a,b)<(3,
3900: 33 34 29 20 4f 52 44 45 52 20 42 59 20 61 20 44  34) ORDER BY a D
3910: 45 53 43 3b 0a 7d 20 7b 33 20 33 33 20 32 20 32  ESC;.} {3 33 2 2
3920: 32 20 31 20 31 31 7d 0a 64 6f 5f 65 78 65 63 73  2 1 11}.do_execs
3930: 71 6c 5f 74 65 73 74 20 31 39 2e 31 34 20 7b 0a  ql_test 19.14 {.
3940: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3950: 74 31 20 57 48 45 52 45 20 28 61 2c 62 29 3c 28  t1 WHERE (a,b)<(
3960: 33 2c 33 33 29 20 4f 52 44 45 52 20 42 59 20 61  3,33) ORDER BY a
3970: 20 44 45 53 43 3b 0a 7d 20 7b 32 20 32 32 20 31   DESC;.} {2 22 1
3980: 20 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   11}.do_execsql_
3990: 74 65 73 74 20 31 39 2e 31 35 20 7b 0a 20 20 53  test 19.15 {.  S
39a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
39b0: 57 48 45 52 45 20 28 61 2c 62 29 3c 3d 28 33 2c  WHERE (a,b)<=(3,
39c0: 33 33 29 20 4f 52 44 45 52 20 42 59 20 61 20 44  33) ORDER BY a D
39d0: 45 53 43 3b 0a 7d 20 7b 33 20 33 33 20 32 20 32  ESC;.} {3 33 2 2
39e0: 32 20 31 20 31 31 7d 0a 64 6f 5f 65 78 65 63 73  2 1 11}.do_execs
39f0: 71 6c 5f 74 65 73 74 20 31 39 2e 31 36 20 7b 0a  ql_test 19.16 {.
3a00: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3a10: 74 31 20 57 48 45 52 45 20 28 61 2c 62 29 3c 3d  t1 WHERE (a,b)<=
3a20: 28 33 2c 33 32 29 20 4f 52 44 45 52 20 42 59 20  (3,32) ORDER BY 
3a30: 61 20 44 45 53 43 3b 0a 7d 20 7b 32 20 32 32 20  a DESC;.} {2 22 
3a40: 31 20 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  1 11}.do_execsql
3a50: 5f 74 65 73 74 20 31 39 2e 32 31 20 7b 0a 20 20  _test 19.21 {.  
3a60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3a70: 20 57 48 45 52 45 20 28 30 2c 30 29 3c 28 61 2c   WHERE (0,0)<(a,
3a80: 62 29 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 7d  b) ORDER BY a;.}
3a90: 20 7b 31 20 31 31 20 32 20 32 32 20 33 20 33 33   {1 11 2 22 3 33
3aa0: 20 34 20 34 34 7d 0a 64 6f 5f 65 78 65 63 73 71   4 44}.do_execsq
3ab0: 6c 5f 74 65 73 74 20 31 39 2e 32 32 20 7b 0a 20  l_test 19.22 {. 
3ac0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3ad0: 31 20 57 48 45 52 45 20 28 30 2c 30 29 3c 3d 28  1 WHERE (0,0)<=(
3ae0: 61 2c 62 29 20 4f 52 44 45 52 20 42 59 20 61 3b  a,b) ORDER BY a;
3af0: 0a 7d 20 7b 31 20 31 31 20 32 20 32 32 20 33 20  .} {1 11 2 22 3 
3b00: 33 33 20 34 20 34 34 7d 0a 64 6f 5f 65 78 65 63  33 4 44}.do_exec
3b10: 73 71 6c 5f 74 65 73 74 20 31 39 2e 32 33 20 7b  sql_test 19.23 {
3b20: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
3b30: 20 74 31 20 57 48 45 52 45 20 28 35 2c 30 29 3e   t1 WHERE (5,0)>
3b40: 28 61 2c 62 29 20 4f 52 44 45 52 20 42 59 20 61  (a,b) ORDER BY a
3b50: 20 44 45 53 43 3b 0a 7d 20 7b 34 20 34 34 20 33   DESC;.} {4 44 3
3b60: 20 33 33 20 32 20 32 32 20 31 20 31 31 7d 0a 64   33 2 22 1 11}.d
3b70: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
3b80: 39 2e 32 34 20 7b 0a 20 20 53 45 4c 45 43 54 20  9.24 {.  SELECT 
3b90: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
3ba0: 28 35 2c 30 29 3e 3d 28 61 2c 62 29 20 4f 52 44  (5,0)>=(a,b) ORD
3bb0: 45 52 20 42 59 20 61 20 44 45 53 43 3b 0a 7d 20  ER BY a DESC;.} 
3bc0: 7b 34 20 34 34 20 33 20 33 33 20 32 20 32 32 20  {4 44 3 33 2 22 
3bd0: 31 20 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  1 11}.do_execsql
3be0: 5f 74 65 73 74 20 31 39 2e 32 35 20 7b 0a 20 20  _test 19.25 {.  
3bf0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3c00: 20 57 48 45 52 45 20 28 33 2c 30 29 3c 28 61 2c   WHERE (3,0)<(a,
3c10: 62 29 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 7d  b) ORDER BY a;.}
3c20: 20 7b 33 20 33 33 20 34 20 34 34 7d 0a 64 6f 5f   {3 33 4 44}.do_
3c30: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 39 2e  execsql_test 19.
3c40: 32 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  26 {.  SELECT * 
3c50: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 33  FROM t1 WHERE (3
3c60: 2c 30 29 3c 3d 28 61 2c 62 29 20 4f 52 44 45 52  ,0)<=(a,b) ORDER
3c70: 20 42 59 20 61 3b 0a 7d 20 7b 33 20 33 33 20 34   BY a;.} {3 33 4
3c80: 20 34 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   44}.do_execsql_
3c90: 74 65 73 74 20 31 39 2e 32 37 20 7b 0a 20 20 53  test 19.27 {.  S
3ca0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
3cb0: 57 48 45 52 45 20 28 33 2c 30 29 3e 28 61 2c 62  WHERE (3,0)>(a,b
3cc0: 29 20 4f 52 44 45 52 20 42 59 20 61 20 44 45 53  ) ORDER BY a DES
3cd0: 43 3b 0a 7d 20 7b 32 20 32 32 20 31 20 31 31 7d  C;.} {2 22 1 11}
3ce0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3cf0: 20 31 39 2e 32 38 20 7b 0a 20 20 53 45 4c 45 43   19.28 {.  SELEC
3d00: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
3d10: 45 20 28 33 2c 30 29 3e 3d 28 61 2c 62 29 20 4f  E (3,0)>=(a,b) O
3d20: 52 44 45 52 20 42 59 20 61 20 44 45 53 43 3b 0a  RDER BY a DESC;.
3d30: 7d 20 7b 32 20 32 32 20 31 20 31 31 7d 0a 64 6f  } {2 22 1 11}.do
3d40: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 39  _execsql_test 19
3d50: 2e 32 39 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  .29 {.  SELECT *
3d60: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28   FROM t1 WHERE (
3d70: 33 2c 33 32 29 3c 28 61 2c 62 29 20 4f 52 44 45  3,32)<(a,b) ORDE
3d80: 52 20 42 59 20 61 3b 0a 7d 20 7b 33 20 33 33 20  R BY a;.} {3 33 
3d90: 34 20 34 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  4 44}.do_execsql
3da0: 5f 74 65 73 74 20 31 39 2e 33 30 20 7b 0a 20 20  _test 19.30 {.  
3db0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3dc0: 20 57 48 45 52 45 20 28 33 2c 33 33 29 3c 28 61   WHERE (3,33)<(a
3dd0: 2c 62 29 20 4f 52 44 45 52 20 42 59 20 61 3b 0a  ,b) ORDER BY a;.
3de0: 7d 20 7b 34 20 34 34 7d 0a 64 6f 5f 65 78 65 63  } {4 44}.do_exec
3df0: 73 71 6c 5f 74 65 73 74 20 31 39 2e 33 31 20 7b  sql_test 19.31 {
3e00: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
3e10: 20 74 31 20 57 48 45 52 45 20 28 33 2c 33 33 29   t1 WHERE (3,33)
3e20: 3c 3d 28 61 2c 62 29 20 4f 52 44 45 52 20 42 59  <=(a,b) ORDER BY
3e30: 20 61 3b 0a 7d 20 7b 33 20 33 33 20 34 20 34 34   a;.} {3 33 4 44
3e40: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
3e50: 74 20 31 39 2e 33 32 20 7b 0a 20 20 53 45 4c 45  t 19.32 {.  SELE
3e60: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
3e70: 52 45 20 28 33 2c 33 34 29 3c 3d 28 61 2c 62 29  RE (3,34)<=(a,b)
3e80: 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 7d 20 7b   ORDER BY a;.} {
3e90: 34 20 34 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  4 44}.do_execsql
3ea0: 5f 74 65 73 74 20 31 39 2e 33 33 20 7b 0a 20 20  _test 19.33 {.  
3eb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3ec0: 20 57 48 45 52 45 20 28 33 2c 33 34 29 3e 28 61   WHERE (3,34)>(a
3ed0: 2c 62 29 20 4f 52 44 45 52 20 42 59 20 61 20 44  ,b) ORDER BY a D
3ee0: 45 53 43 3b 0a 7d 20 7b 33 20 33 33 20 32 20 32  ESC;.} {3 33 2 2
3ef0: 32 20 31 20 31 31 7d 0a 64 6f 5f 65 78 65 63 73  2 1 11}.do_execs
3f00: 71 6c 5f 74 65 73 74 20 31 39 2e 33 34 20 7b 0a  ql_test 19.34 {.
3f10: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3f20: 74 31 20 57 48 45 52 45 20 28 33 2c 33 33 29 3e  t1 WHERE (3,33)>
3f30: 28 61 2c 62 29 20 4f 52 44 45 52 20 42 59 20 61  (a,b) ORDER BY a
3f40: 20 44 45 53 43 3b 0a 7d 20 7b 32 20 32 32 20 31   DESC;.} {2 22 1
3f50: 20 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   11}.do_execsql_
3f60: 74 65 73 74 20 31 39 2e 33 35 20 7b 0a 20 20 53  test 19.35 {.  S
3f70: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
3f80: 57 48 45 52 45 20 28 33 2c 33 33 29 3e 3d 28 61  WHERE (3,33)>=(a
3f90: 2c 62 29 20 4f 52 44 45 52 20 42 59 20 61 20 44  ,b) ORDER BY a D
3fa0: 45 53 43 3b 0a 7d 20 7b 33 20 33 33 20 32 20 32  ESC;.} {3 33 2 2
3fb0: 32 20 31 20 31 31 7d 0a 64 6f 5f 65 78 65 63 73  2 1 11}.do_execs
3fc0: 71 6c 5f 74 65 73 74 20 31 39 2e 33 36 20 7b 0a  ql_test 19.36 {.
3fd0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3fe0: 74 31 20 57 48 45 52 45 20 28 33 2c 33 32 29 3e  t1 WHERE (3,32)>
3ff0: 3d 28 61 2c 62 29 20 4f 52 44 45 52 20 42 59 20  =(a,b) ORDER BY 
4000: 61 20 44 45 53 43 3b 0a 7d 20 7b 32 20 32 32 20  a DESC;.} {2 22 
4010: 31 20 31 31 7d 0a 0a 23 20 32 30 31 38 2d 30 32  1 11}..# 2018-02
4020: 2d 31 38 3a 20 4d 65 6d 6f 72 79 20 6c 65 61 6b  -18: Memory leak
4030: 20 6e 65 78 74 65 64 20 72 6f 77 2d 76 61 6c 75   nexted row-valu
4040: 65 2e 20 20 44 65 74 65 63 74 65 64 20 62 79 20  e.  Detected by 
4050: 4f 53 53 46 75 7a 7a 2e 0a 23 0a 64 6f 5f 63 61  OSSFuzz..#.do_ca
4060: 74 63 68 73 71 6c 5f 74 65 73 74 20 32 30 2e 31  tchsql_test 20.1
4070: 20 7b 0a 20 20 53 45 4c 45 43 54 20 31 20 57 48   {.  SELECT 1 WH
4080: 45 52 45 20 28 32 2c 28 32 2c 30 29 29 20 49 53  ERE (2,(2,0)) IS
4090: 20 28 32 2c 28 32 2c 30 29 29 3b 0a 7d 20 7b 30   (2,(2,0));.} {0
40a0: 20 31 7d 0a 0a 23 20 32 30 31 38 2d 31 31 2d 30   1}..# 2018-11-0
40b0: 33 3a 20 54 69 63 6b 65 74 20 68 74 74 70 73 3a  3: Ticket https:
40c0: 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
40d0: 2f 73 72 63 2f 69 6e 66 6f 2f 31 61 38 34 36 36  /src/info/1a8466
40e0: 38 64 63 66 64 65 62 61 66 31 0a 23 20 41 73 73  8dcfdebaf1.# Ass
40f0: 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 68 65  ertion fault whe
4100: 6e 20 64 6f 69 6e 67 20 72 6f 77 2d 76 61 6c 75  n doing row-valu
4110: 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20  e operations on 
4120: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 23 20  a primary key.# 
4130: 63 6f 6e 74 61 69 6e 69 6e 67 20 64 75 70 6c 69  containing dupli
4140: 63 61 74 65 20 63 6f 6c 75 6d 6e 73 2e 0a 23 0a  cate columns..#.
4150: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
4160: 32 31 2e 30 20 7b 0a 20 20 44 52 4f 50 20 54 41  21.0 {.  DROP TA
4170: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 31  BLE IF EXISTS t1
4180: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
4190: 20 74 31 28 61 2c 62 2c 50 52 49 4d 41 52 59 20   t1(a,b,PRIMARY 
41a0: 4b 45 59 28 62 2c 62 29 29 3b 0a 20 20 49 4e 53  KEY(b,b));.  INS
41b0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
41c0: 45 53 28 31 2c 32 29 2c 28 33 2c 34 29 2c 28 35  ES(1,2),(3,4),(5
41d0: 2c 36 29 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20  ,6);.  SELECT * 
41e0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 61  FROM t1 WHERE (a
41f0: 2c 62 29 20 49 4e 20 28 56 41 4c 55 45 53 28 31  ,b) IN (VALUES(1
4200: 2c 32 29 29 3b 20 20 0a 7d 20 7b 31 20 32 7d 0a  ,2));  .} {1 2}.
4210: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.