/ Hex Artifact Content
Login

Artifact 32861d6a933ded868035f2ec79aeb993a2a46eb7a6d282ae13415a4c2e369463:


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 30 20 30 20   2 2} .    "0 0 
1570: 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20  0 {SEARCH TABLE 
1580: 78 79 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52  xy USING INTEGER
1590: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 28 72 6f   PRIMARY KEY (ro
15a0: 77 69 64 3d 3f 29 7d 22 0a 0a 20 20 32 20 22 53  wid=?)}"..  2 "S
15b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 79 20  ELECT * FROM xy 
15c0: 57 48 45 52 45 20 28 6b 2c 20 6a 29 20 3c 20 28  WHERE (k, j) < (
15d0: 32 2c 20 33 29 22 20 7b 31 20 31 20 31 20 32 20  2, 3)" {1 1 1 2 
15e0: 32 20 32 7d 0a 20 20 20 20 22 30 20 30 20 30 20  2 2}.    "0 0 0 
15f0: 7b 53 43 41 4e 20 54 41 42 4c 45 20 78 79 7d 22  {SCAN TABLE xy}"
1600: 0a 0a 20 20 33 20 22 53 45 4c 45 43 54 20 2a 20  ..  3 "SELECT * 
1610: 46 52 4f 4d 20 78 79 20 57 48 45 52 45 20 28 69  FROM xy WHERE (i
1620: 2c 20 6a 29 20 3c 20 28 32 2c 20 33 29 22 20 7b  , j) < (2, 3)" {
1630: 31 20 31 20 31 20 32 20 32 20 32 7d 0a 20 20 20  1 1 1 2 2 2}.   
1640: 20 22 30 20 30 20 30 20 7b 53 45 41 52 43 48 20   "0 0 0 {SEARCH 
1650: 54 41 42 4c 45 20 78 79 20 55 53 49 4e 47 20 49  TABLE xy USING I
1660: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1670: 45 59 20 28 72 6f 77 69 64 3c 3f 29 7d 22 0a 0a  EY (rowid<?)}"..
1680: 20 20 34 20 22 53 45 4c 45 43 54 20 2a 20 46 52    4 "SELECT * FR
1690: 4f 4d 20 78 79 20 57 48 45 52 45 20 28 69 2c 20  OM xy WHERE (i, 
16a0: 6a 29 20 3e 20 28 32 2c 20 31 29 22 20 7b 32 20  j) > (2, 1)" {2 
16b0: 32 20 32 20 33 20 33 20 33 20 34 20 34 20 34 7d  2 2 3 3 3 4 4 4}
16c0: 0a 20 20 20 20 22 30 20 30 20 30 20 7b 53 45 41  .    "0 0 0 {SEA
16d0: 52 43 48 20 54 41 42 4c 45 20 78 79 20 55 53 49  RCH TABLE xy USI
16e0: 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
16f0: 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3e 3f 29  RY KEY (rowid>?)
1700: 7d 22 0a 0a 20 20 35 20 22 53 45 4c 45 43 54 20  }"..  5 "SELECT 
1710: 2a 20 46 52 4f 4d 20 78 79 20 57 48 45 52 45 20  * FROM xy WHERE 
1720: 28 69 2c 20 6a 29 20 3e 20 28 27 32 27 2c 20 31  (i, j) > ('2', 1
1730: 29 22 20 7b 32 20 32 20 32 20 33 20 33 20 33 20  )" {2 2 2 3 3 3 
1740: 34 20 34 20 34 7d 0a 20 20 20 20 22 30 20 30 20  4 4 4}.    "0 0 
1750: 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20  0 {SEARCH TABLE 
1760: 78 79 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52  xy USING INTEGER
1770: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 28 72 6f   PRIMARY KEY (ro
1780: 77 69 64 3e 3f 29 7d 22 0a 0a 7d 20 7b 0a 20 20  wid>?)}"..} {.  
1790: 64 6f 5f 65 71 70 5f 74 65 73 74 20 37 2e 24 74  do_eqp_test 7.$t
17a0: 6e 2e 31 20 24 73 71 6c 20 24 65 71 70 0a 20 20  n.1 $sql $eqp.  
17b0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
17c0: 37 2e 24 74 6e 2e 32 20 24 73 71 6c 20 24 72 65  7.$tn.2 $sql $re
17d0: 73 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  s.}..do_execsql_
17e0: 74 65 73 74 20 38 2e 30 20 7b 0a 20 20 43 52 45  test 8.0 {.  CRE
17f0: 41 54 45 20 54 41 42 4c 45 20 6a 31 28 61 29 3b  ATE TABLE j1(a);
1800: 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .}.do_execsql_te
1810: 73 74 20 38 2e 31 20 7b 0a 20 20 53 45 4c 45 43  st 8.1 {.  SELEC
1820: 54 20 2a 20 46 52 4f 4d 20 6a 31 20 57 48 45 52  T * FROM j1 WHER
1830: 45 20 28 73 65 6c 65 63 74 20 6d 69 6e 28 61 29  E (select min(a)
1840: 20 46 52 4f 4d 20 6a 31 29 20 49 4e 20 28 3f 2c   FROM j1) IN (?,
1850: 20 3f 2c 20 3f 29 0a 7d 0a 0a 64 6f 5f 65 78 65   ?, ?).}..do_exe
1860: 63 73 71 6c 5f 74 65 73 74 20 39 2e 30 20 7b 0a  csql_test 9.0 {.
1870: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1880: 32 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d  2(a INTEGER PRIM
1890: 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a  ARY KEY, b, c);.
18a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
18b0: 20 56 41 4c 55 45 53 28 31 2c 20 31 2c 20 31 29   VALUES(1, 1, 1)
18c0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
18d0: 74 32 20 56 41 4c 55 45 53 28 32 2c 20 32 2c 20  t2 VALUES(2, 2, 
18e0: 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  2);.  INSERT INT
18f0: 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20 33  O t2 VALUES(3, 3
1900: 2c 20 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 3);.  INSERT I
1910: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 34 2c  NTO t2 VALUES(4,
1920: 20 34 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52 54   4, 4);.  INSERT
1930: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1940: 35 2c 20 35 2c 20 35 29 3b 0a 7d 0a 0a 66 6f 72  5, 5, 5);.}..for
1950: 65 61 63 68 20 7b 74 6e 20 71 20 72 65 73 7d 20  each {tn q res} 
1960: 7b 0a 20 20 31 20 22 28 61 2c 20 62 29 20 3e 20  {.  1 "(a, b) > 
1970: 28 32 2c 20 31 29 22 20 7b 32 20 33 20 34 20 35  (2, 1)" {2 3 4 5
1980: 7d 0a 20 20 32 20 22 28 61 2c 20 62 29 20 3e 20  }.  2 "(a, b) > 
1990: 28 32 2c 20 32 29 22 20 7b 33 20 34 20 35 7d 0a  (2, 2)" {3 4 5}.
19a0: 20 20 33 20 22 28 61 2c 20 62 29 20 3c 20 28 34    3 "(a, b) < (4
19b0: 2c 20 35 29 22 20 7b 31 20 32 20 33 20 34 7d 0a  , 5)" {1 2 3 4}.
19c0: 20 20 34 20 22 28 61 2c 20 62 29 20 3c 20 28 34    4 "(a, b) < (4
19d0: 2c 20 33 29 22 20 7b 31 20 32 20 33 7d 0a 7d 20  , 3)" {1 2 3}.} 
19e0: 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {.  do_execsql_t
19f0: 65 73 74 20 39 2e 24 74 6e 20 22 53 45 4c 45 43  est 9.$tn "SELEC
1a00: 54 20 63 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T c FROM t2 WHER
1a10: 45 20 24 71 22 20 24 72 65 73 0a 7d 20 0a 0a 64  E $q" $res.} ..d
1a20: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
1a30: 30 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  0.0 {.  CREATE T
1a40: 41 42 4c 45 20 64 75 61 6c 28 64 75 6d 6d 79 29  ABLE dual(dummy)
1a50: 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 75  ; INSERT INTO du
1a60: 61 6c 28 64 75 6d 6d 79 29 20 56 41 4c 55 45 53  al(dummy) VALUES
1a70: 28 27 58 27 29 3b 0a 20 20 43 52 45 41 54 45 20  ('X');.  CREATE 
1a80: 54 41 42 4c 45 20 74 33 28 61 20 54 45 58 54 2c  TABLE t3(a TEXT,
1a90: 62 20 54 45 58 54 2c 63 20 54 45 58 54 2c 64 20  b TEXT,c TEXT,d 
1aa0: 54 45 58 54 2c 65 20 54 45 58 54 2c 66 20 54 45  TEXT,e TEXT,f TE
1ab0: 58 54 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e  XT);.  CREATE IN
1ac0: 44 45 58 20 74 33 78 20 4f 4e 20 74 33 28 62 2c  DEX t3x ON t3(b,
1ad0: 63 2c 64 2c 65 2c 66 29 3b 0a 0a 20 20 53 45 4c  c,d,e,f);..  SEL
1ae0: 45 43 54 20 61 20 46 52 4f 4d 20 74 33 0a 20 20  ECT a FROM t3.  
1af0: 20 20 57 48 45 52 45 20 28 63 2c 64 29 20 49 4e    WHERE (c,d) IN
1b00: 20 28 53 45 4c 45 43 54 20 27 63 27 2c 27 64 27   (SELECT 'c','d'
1b10: 20 46 52 4f 4d 20 64 75 61 6c 29 0a 20 20 20 20   FROM dual).    
1b20: 41 4e 44 20 28 61 2c 62 2c 65 29 20 49 4e 20 28  AND (a,b,e) IN (
1b30: 53 45 4c 45 43 54 20 27 61 27 2c 27 62 27 2c 27  SELECT 'a','b','
1b40: 64 27 20 46 52 4f 4d 20 64 75 61 6c 29 3b 0a 7d  d' FROM dual);.}
1b50: 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  ..do_catchsql_te
1b60: 73 74 20 31 31 2e 31 20 7b 0a 20 20 43 52 45 41  st 11.1 {.  CREA
1b70: 54 45 20 54 41 42 4c 45 20 74 31 31 28 61 29 3b  TE TABLE t11(a);
1b80: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
1b90: 20 74 31 31 20 57 48 45 52 45 20 28 61 2c 61 29   t11 WHERE (a,a)
1ba0: 3c 3d 31 3b 0a 7d 20 7b 31 20 7b 72 6f 77 20 76  <=1;.} {1 {row v
1bb0: 61 6c 75 65 20 6d 69 73 75 73 65 64 7d 7d 0a 64  alue misused}}.d
1bc0: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
1bd0: 31 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  11.2 {.  SELECT 
1be0: 2a 20 46 52 4f 4d 20 74 31 31 20 57 48 45 52 45  * FROM t11 WHERE
1bf0: 20 28 61 2c 61 29 3c 31 3b 0a 7d 20 7b 31 20 7b   (a,a)<1;.} {1 {
1c00: 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65  row value misuse
1c10: 64 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f  d}}.do_catchsql_
1c20: 74 65 73 74 20 31 31 2e 33 20 7b 0a 20 20 53 45  test 11.3 {.  SE
1c30: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 31 20  LECT * FROM t11 
1c40: 57 48 45 52 45 20 28 61 2c 61 29 3e 3d 31 3b 0a  WHERE (a,a)>=1;.
1c50: 7d 20 7b 31 20 7b 72 6f 77 20 76 61 6c 75 65 20  } {1 {row value 
1c60: 6d 69 73 75 73 65 64 7d 7d 0a 64 6f 5f 63 61 74  misused}}.do_cat
1c70: 63 68 73 71 6c 5f 74 65 73 74 20 31 31 2e 34 20  chsql_test 11.4 
1c80: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
1c90: 4d 20 74 31 31 20 57 48 45 52 45 20 28 61 2c 61  M t11 WHERE (a,a
1ca0: 29 3e 31 3b 0a 7d 20 7b 31 20 7b 72 6f 77 20 76  )>1;.} {1 {row v
1cb0: 61 6c 75 65 20 6d 69 73 75 73 65 64 7d 7d 0a 64  alue misused}}.d
1cc0: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
1cd0: 31 31 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20  11.5 {.  SELECT 
1ce0: 2a 20 46 52 4f 4d 20 74 31 31 20 57 48 45 52 45  * FROM t11 WHERE
1cf0: 20 28 61 2c 61 29 3d 3d 31 3b 0a 7d 20 7b 31 20   (a,a)==1;.} {1 
1d00: 7b 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  {row value misus
1d10: 65 64 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  ed}}.do_catchsql
1d20: 5f 74 65 73 74 20 31 31 2e 36 20 7b 0a 20 20 53  _test 11.6 {.  S
1d30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 31  ELECT * FROM t11
1d40: 20 57 48 45 52 45 20 28 61 2c 61 29 3c 3e 31 3b   WHERE (a,a)<>1;
1d50: 0a 7d 20 7b 31 20 7b 72 6f 77 20 76 61 6c 75 65  .} {1 {row value
1d60: 20 6d 69 73 75 73 65 64 7d 7d 0a 64 6f 5f 63 61   misused}}.do_ca
1d70: 74 63 68 73 71 6c 5f 74 65 73 74 20 31 31 2e 37  tchsql_test 11.7
1d80: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
1d90: 4f 4d 20 74 31 31 20 57 48 45 52 45 20 28 61 2c  OM t11 WHERE (a,
1da0: 61 29 20 49 53 20 31 3b 0a 7d 20 7b 31 20 7b 72  a) IS 1;.} {1 {r
1db0: 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
1dc0: 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  }}.do_catchsql_t
1dd0: 65 73 74 20 31 31 2e 38 20 7b 0a 20 20 53 45 4c  est 11.8 {.  SEL
1de0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 31 20 57  ECT * FROM t11 W
1df0: 48 45 52 45 20 28 61 2c 61 29 20 49 53 20 4e 4f  HERE (a,a) IS NO
1e00: 54 20 31 3b 0a 7d 20 7b 31 20 7b 72 6f 77 20 76  T 1;.} {1 {row v
1e10: 61 6c 75 65 20 6d 69 73 75 73 65 64 7d 7d 0a 0a  alue misused}}..
1e20: 23 20 32 30 31 36 2d 31 30 2d 32 37 3a 20 68 74  # 2016-10-27: ht
1e30: 74 70 73 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  tps://www.sqlite
1e40: 2e 6f 72 67 2f 73 72 63 2f 74 6b 74 76 69 65 77  .org/src/tktview
1e50: 2f 66 65 66 34 62 62 34 62 64 39 31 38 35 65 63  /fef4bb4bd9185ec
1e60: 38 66 0a 23 20 49 6e 63 6f 72 72 65 63 74 20 72  8f.# Incorrect r
1e70: 65 73 75 6c 74 20 66 72 6f 6d 20 61 20 4c 45 46  esult from a LEF
1e80: 54 20 4a 4f 49 4e 20 77 69 74 68 20 61 20 72 6f  T JOIN with a ro
1e90: 77 2d 76 61 6c 75 65 20 63 6f 6e 73 74 72 61 69  w-value constrai
1ea0: 6e 74 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  nt.#.do_execsql_
1eb0: 74 65 73 74 20 31 32 2e 31 20 7b 0a 20 20 44 52  test 12.1 {.  DR
1ec0: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
1ed0: 54 53 20 74 31 3b 0a 20 20 43 52 45 41 54 45 20  TS t1;.  CREATE 
1ee0: 54 41 42 4c 45 20 74 31 28 61 2c 62 29 3b 20 49  TABLE t1(a,b); I
1ef0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1f00: 4c 55 45 53 28 31 2c 32 29 3b 0a 20 20 44 52 4f  LUES(1,2);.  DRO
1f10: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
1f20: 53 20 74 32 3b 0a 20 20 43 52 45 41 54 45 20 54  S t2;.  CREATE T
1f30: 41 42 4c 45 20 74 32 28 78 2c 79 29 3b 20 49 4e  ABLE t2(x,y); IN
1f40: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
1f50: 55 45 53 28 33 2c 34 29 3b 0a 20 20 53 45 4c 45  UES(3,4);.  SELE
1f60: 43 54 20 2a 2c 27 78 27 20 46 52 4f 4d 20 74 31  CT *,'x' FROM t1
1f70: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
1f80: 20 28 61 2c 62 29 3d 28 78 2c 79 29 3b 0a 7d 20   (a,b)=(x,y);.} 
1f90: 7b 31 20 32 20 7b 7d 20 7b 7d 20 78 7d 0a 0a 0a  {1 2 {} {} x}...
1fa0: 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d  foreach {tn sql}
1fb0: 20 7b 0a 20 20 30 20 22 53 45 4c 45 43 54 20 28   {.  0 "SELECT (
1fc0: 31 2c 32 29 20 41 53 20 78 20 57 48 45 52 45 20  1,2) AS x WHERE 
1fd0: 78 3d 33 22 0a 20 20 31 20 22 53 45 4c 45 43 54  x=3".  1 "SELECT
1fe0: 20 28 31 2c 32 29 20 42 45 54 57 45 45 4e 20 31   (1,2) BETWEEN 1
1ff0: 20 41 4e 44 20 32 22 0a 20 20 32 20 22 53 45 4c   AND 2".  2 "SEL
2000: 45 43 54 20 31 20 42 45 54 57 45 45 4e 20 28 31  ECT 1 BETWEEN (1
2010: 2c 32 29 20 41 4e 44 20 32 22 0a 20 20 33 20 22  ,2) AND 2".  3 "
2020: 53 45 4c 45 43 54 20 32 20 42 45 54 57 45 45 4e  SELECT 2 BETWEEN
2030: 20 31 20 41 4e 44 20 28 31 2c 32 29 22 0a 20 20   1 AND (1,2)".  
2040: 34 20 22 53 45 4c 45 43 54 20 28 31 2c 32 29 20  4 "SELECT (1,2) 
2050: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 29 20  FROM (SELECT 1) 
2060: 4f 52 44 45 52 20 42 59 20 31 22 0a 20 20 35 20  ORDER BY 1".  5 
2070: 22 53 45 4c 45 43 54 20 28 31 2c 32 29 20 46 52  "SELECT (1,2) FR
2080: 4f 4d 20 28 53 45 4c 45 43 54 20 31 29 20 47 52  OM (SELECT 1) GR
2090: 4f 55 50 20 42 59 20 31 22 0a 7d 20 7b 0a 20 20  OUP BY 1".} {.  
20a0: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
20b0: 20 31 33 2e 24 74 6e 20 24 73 71 6c 20 7b 31 20   13.$tn $sql {1 
20c0: 7b 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  {row value misus
20d0: 65 64 7d 7d 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73  ed}}.}..do_execs
20e0: 71 6c 5f 74 65 73 74 20 31 34 2e 30 20 7b 0a 20  ql_test 14.0 {. 
20f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
2100: 32 28 78 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  2(x);.  INSERT I
2110: 4e 54 4f 20 74 31 32 20 56 41 4c 55 45 53 28 32  NTO t12 VALUES(2
2120: 29 2c 20 28 34 29 3b 0a 7d 0a 64 6f 5f 65 78 65  ), (4);.}.do_exe
2130: 63 73 71 6c 5f 74 65 73 74 20 31 34 2e 31 20 22  csql_test 14.1 "
2140: 53 45 4c 45 43 54 20 31 20 57 48 45 52 45 20 28  SELECT 1 WHERE (
2150: 32 2c 32 29 20 42 45 54 57 45 45 4e 20 28 31 2c  2,2) BETWEEN (1,
2160: 31 29 20 41 4e 44 20 28 33 2c 33 29 22 20 31 0a  1) AND (3,3)" 1.
2170: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2180: 31 34 2e 32 20 22 53 45 4c 45 43 54 20 43 41 53  14.2 "SELECT CAS
2190: 45 20 28 32 2c 32 29 20 57 48 45 4e 20 28 31 2c  E (2,2) WHEN (1,
21a0: 20 31 29 20 54 48 45 4e 20 32 20 45 4c 53 45 20   1) THEN 2 ELSE 
21b0: 31 20 45 4e 44 22 20 31 0a 64 6f 5f 65 78 65 63  1 END" 1.do_exec
21c0: 73 71 6c 5f 74 65 73 74 20 31 34 2e 33 20 22 53  sql_test 14.3 "S
21d0: 45 4c 45 43 54 20 43 41 53 45 20 28 53 45 4c 45  ELECT CASE (SELE
21e0: 43 54 20 32 2c 32 29 20 57 48 45 4e 20 28 31 2c  CT 2,2) WHEN (1,
21f0: 20 31 29 20 54 48 45 4e 20 32 20 45 4c 53 45 20   1) THEN 2 ELSE 
2200: 31 20 45 4e 44 22 20 31 0a 64 6f 5f 65 78 65 63  1 END" 1.do_exec
2210: 73 71 6c 5f 74 65 73 74 20 31 34 2e 34 20 22 53  sql_test 14.4 "S
2220: 45 4c 45 43 54 20 31 20 57 48 45 52 45 20 28 53  ELECT 1 WHERE (S
2230: 45 4c 45 43 54 20 32 2c 32 29 20 42 45 54 57 45  ELECT 2,2) BETWE
2240: 45 4e 20 28 31 2c 31 29 20 41 4e 44 20 28 33 2c  EN (1,1) AND (3,
2250: 33 29 22 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  3)" 1.do_execsql
2260: 5f 74 65 73 74 20 31 34 2e 35 20 22 53 45 4c 45  _test 14.5 "SELE
2270: 43 54 20 31 20 46 52 4f 4d 20 74 31 32 20 57 48  CT 1 FROM t12 WH
2280: 45 52 45 20 28 78 2c 31 29 20 42 45 54 57 45 45  ERE (x,1) BETWEE
2290: 4e 20 28 31 2c 31 29 20 41 4e 44 20 28 33 2c 33  N (1,1) AND (3,3
22a0: 29 22 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  )" 1.do_execsql_
22b0: 74 65 73 74 20 31 34 2e 36 20 7b 0a 20 20 53 45  test 14.6 {.  SE
22c0: 4c 45 43 54 20 31 20 46 52 4f 4d 20 74 31 32 20  LECT 1 FROM t12 
22d0: 57 48 45 52 45 20 28 31 2c 78 29 20 42 45 54 57  WHERE (1,x) BETW
22e0: 45 45 4e 20 28 31 2c 31 29 20 41 4e 44 20 28 33  EEN (1,1) AND (3
22f0: 2c 33 29 0a 7d 20 7b 31 20 31 7d 0a 0a 23 2d 2d  ,3).} {1 1}..#--
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 2d  ----------------
2320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2340: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
2350: 68 61 74 20 65 72 72 6f 72 73 20 61 72 65 20 6e  hat errors are n
2360: 6f 74 20 63 6f 6e 63 65 61 6c 65 64 20 62 79 20  ot concealed by 
2370: 74 68 65 20 53 45 4c 45 43 54 20 66 6c 61 74 74  the SELECT flatt
2380: 65 6e 69 6e 67 20 6f 72 0a 23 20 57 48 45 52 45  ening or.# WHERE
2390: 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77  -clause push-dow
23a0: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  n optimizations.
23b0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
23c0: 20 31 34 2e 31 20 7b 0a 20 20 43 52 45 41 54 45   14.1 {.  CREATE
23d0: 20 54 41 42 4c 45 20 78 31 28 61 20 50 52 49 4d   TABLE x1(a PRIM
23e0: 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 43  ARY KEY, b);.  C
23f0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 32 28 61  REATE TABLE x2(a
2400: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
2410: 20 4b 45 59 2c 20 62 29 3b 0a 7d 0a 0a 66 6f 72   KEY, b);.}..for
2420: 65 61 63 68 20 7b 74 6e 20 6e 20 73 71 6c 7d 20  each {tn n sql} 
2430: 7b 0a 20 20 31 20 30 20 22 53 45 4c 45 43 54 20  {.  1 0 "SELECT 
2440: 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 28  * FROM (SELECT (
2450: 31 2c 20 31 29 20 41 53 20 63 20 46 52 4f 4d 20  1, 1) AS c FROM 
2460: 78 31 29 20 57 48 45 52 45 20 63 3d 31 22 0a 20  x1) WHERE c=1". 
2470: 20 32 20 32 20 22 53 45 4c 45 43 54 20 2a 20 46   2 2 "SELECT * F
2480: 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 20 41 53  ROM (SELECT 1 AS
2490: 20 78 2c 20 28 53 45 4c 45 43 54 20 38 2c 39 29   x, (SELECT 8,9)
24a0: 20 41 53 20 79 29 20 57 48 45 52 45 20 79 3c 31   AS y) WHERE y<1
24b0: 22 0a 20 20 33 20 33 20 22 53 45 4c 45 43 54 20  ".  3 3 "SELECT 
24c0: 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 31  * FROM (SELECT 1
24d0: 20 41 53 20 78 2c 20 28 53 45 4c 45 43 54 20 38   AS x, (SELECT 8
24e0: 2c 39 2c 31 30 29 20 41 53 20 79 29 20 57 48 45  ,9,10) AS y) WHE
24f0: 52 45 20 79 3c 31 22 0a 20 20 34 20 30 20 22 53  RE y<1".  4 0 "S
2500: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
2510: 4c 45 43 54 20 28 61 2c 20 62 29 20 41 53 20 63  LECT (a, b) AS c
2520: 20 46 52 4f 4d 20 78 31 29 2c 20 78 32 20 57 48   FROM x1), x2 WH
2530: 45 52 45 20 63 3d 61 22 0a 20 20 35 20 30 20 22  ERE c=a".  5 0 "
2540: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
2550: 45 4c 45 43 54 20 61 20 41 53 20 63 2c 20 28 31  ELECT a AS c, (1
2560: 2c 20 32 2c 20 33 29 20 46 52 4f 4d 20 78 31 29  , 2, 3) FROM x1)
2570: 2c 20 78 32 20 57 48 45 52 45 20 63 3d 61 22 0a  , x2 WHERE c=a".
2580: 20 20 36 20 30 20 22 53 45 4c 45 43 54 20 2a 20    6 0 "SELECT * 
2590: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 20 41  FROM (SELECT 1 A
25a0: 53 20 63 2c 20 28 31 2c 20 32 2c 20 33 29 20 46  S c, (1, 2, 3) F
25b0: 52 4f 4d 20 78 31 29 20 57 48 45 52 45 20 63 3d  ROM x1) WHERE c=
25c0: 31 22 0a 7d 20 7b 0a 20 20 69 66 20 7b 24 6e 3d  1".} {.  if {$n=
25d0: 3d 30 7d 20 7b 0a 20 20 20 20 73 65 74 20 65 72  =0} {.    set er
25e0: 72 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73  r "row value mis
25f0: 75 73 65 64 22 0a 20 20 7d 20 65 6c 73 65 20 7b  used".  } else {
2600: 0a 20 20 20 20 73 65 74 20 65 72 72 20 22 73 75  .    set err "su
2610: 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
2620: 20 24 6e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78   $n columns - ex
2630: 70 65 63 74 65 64 20 31 22 0a 20 20 7d 0a 20 20  pected 1".  }.  
2640: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
2650: 20 31 34 2e 32 2e 24 74 6e 20 24 73 71 6c 20 5b   14.2.$tn $sql [
2660: 6c 69 73 74 20 31 20 24 65 72 72 5d 0a 7d 0a 0a  list 1 $err].}..
2670: 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
26c0: 73 74 20 66 6f 72 20 76 65 63 74 6f 72 20 73 69  st for vector si
26d0: 7a 65 20 6d 69 73 6d 61 74 63 68 65 73 20 63 6f  ze mismatches co
26e0: 6e 63 65 61 6c 65 64 20 62 79 20 75 6e 65 78 70  ncealed by unexp
26f0: 61 6e 64 65 64 20 73 75 62 71 75 65 72 69 65 73  anded subqueries
2700: 2e 0a 23 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f  ..#.do_catchsql_
2710: 74 65 73 74 20 31 35 2e 31 20 7b 0a 20 20 44 45  test 15.1 {.  DE
2720: 54 41 43 48 20 28 53 45 4c 45 43 54 20 2a 20 46  TACH (SELECT * F
2730: 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 2c 32 29  ROM (SELECT 1,2)
2740: 29 3c 33 3b 0a 7d 20 7b 31 20 7b 72 6f 77 20 76  )<3;.} {1 {row v
2750: 61 6c 75 65 20 6d 69 73 75 73 65 64 7d 7d 0a 64  alue misused}}.d
2760: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
2770: 31 35 2e 32 20 7b 0a 20 20 55 50 44 41 54 45 20  15.2 {.  UPDATE 
2780: 78 31 20 53 45 54 20 61 3d 28 53 45 4c 45 43 54  x1 SET a=(SELECT
2790: 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
27a0: 62 2c 32 29 29 3c 33 3b 0a 7d 20 7b 31 20 7b 72  b,2))<3;.} {1 {r
27b0: 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
27c0: 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  }}.do_catchsql_t
27d0: 65 73 74 20 31 35 2e 33 20 7b 0a 20 20 55 50 44  est 15.3 {.  UPD
27e0: 41 54 45 20 78 31 20 53 45 54 20 61 3d 4e 55 4c  ATE x1 SET a=NUL
27f0: 4c 20 57 48 45 52 45 20 20 61 3c 28 53 45 4c 45  L WHERE  a<(SELE
2800: 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
2810: 54 20 62 2c 32 29 29 3b 0a 7d 20 7b 31 20 7b 73  T b,2));.} {1 {s
2820: 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e  ub-select return
2830: 73 20 32 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78  s 2 columns - ex
2840: 70 65 63 74 65 64 20 31 7d 7d 0a 64 6f 5f 63 61  pected 1}}.do_ca
2850: 74 63 68 73 71 6c 5f 74 65 73 74 20 31 35 2e 34  tchsql_test 15.4
2860: 20 7b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d   {.  DELETE FROM
2870: 20 78 31 20 57 48 45 52 45 20 20 61 3c 28 53 45   x1 WHERE  a<(SE
2880: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
2890: 45 43 54 20 62 2c 32 29 29 3b 0a 7d 20 7b 31 20  ECT b,2));.} {1 
28a0: 7b 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75  {sub-select retu
28b0: 72 6e 73 20 32 20 63 6f 6c 75 6d 6e 73 20 2d 20  rns 2 columns - 
28c0: 65 78 70 65 63 74 65 64 20 31 7d 7d 0a 64 6f 5f  expected 1}}.do_
28d0: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 31 35  catchsql_test 15
28e0: 2e 35 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e  .5 {.  INSERT IN
28f0: 54 4f 20 78 31 28 61 2c 62 29 20 56 41 4c 55 45  TO x1(a,b) VALUE
2900: 53 28 31 2c 28 53 45 4c 45 43 54 20 2a 20 46 52  S(1,(SELECT * FR
2910: 4f 4d 20 28 53 45 4c 45 43 54 20 31 2c 32 29 29  OM (SELECT 1,2))
2920: 3c 33 29 3b 0a 7d 20 7b 31 20 7b 72 6f 77 20 76  <3);.} {1 {row v
2930: 61 6c 75 65 20 6d 69 73 75 73 65 64 7d 7d 0a 0a  alue misused}}..
2940: 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52 6f 77  ----------.# Row
2990: 2d 76 61 6c 75 65 73 20 75 73 65 64 20 69 6e 20  -values used in 
29a0: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
29b0: 73 20 77 69 74 68 69 6e 20 54 52 49 47 47 45 52  s within TRIGGER
29c0: 73 0a 23 0a 23 20 54 69 63 6b 65 74 20 68 74 74  s.#.# Ticket htt
29d0: 70 73 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e  ps://www.sqlite.
29e0: 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 38 63 39  org/src/info/8c9
29f0: 34 35 38 65 37 30 33 36 36 36 65 31 61 0a 23 0a  458e703666e1a.#.
2a00: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2a10: 31 36 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  16.1 {.  CREATE 
2a20: 54 41 42 4c 45 20 74 31 36 61 28 61 2c 62 2c 63  TABLE t16a(a,b,c
2a30: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
2a40: 20 74 31 36 61 20 56 41 4c 55 45 53 28 31 2c 32   t16a VALUES(1,2
2a50: 2c 33 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41  ,3);.  CREATE TA
2a60: 42 4c 45 20 74 31 36 62 28 78 29 3b 0a 20 20 49  BLE t16b(x);.  I
2a70: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 36 62 28  NSERT INTO t16b(
2a80: 78 29 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20  x) VALUES(1);.  
2a90: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
2aa0: 31 36 72 20 41 46 54 45 52 20 55 50 44 41 54 45  16r AFTER UPDATE
2ab0: 20 4f 4e 20 74 31 36 62 20 42 45 47 49 4e 0a 20   ON t16b BEGIN. 
2ac0: 20 20 20 20 55 50 44 41 54 45 20 74 31 36 61 20      UPDATE t16a 
2ad0: 53 45 54 20 28 61 2c 62 2c 63 29 3d 28 53 45 4c  SET (a,b,c)=(SEL
2ae0: 45 43 54 20 6e 65 77 2e 78 2c 6e 65 77 2e 78 2b  ECT new.x,new.x+
2af0: 31 2c 6e 65 77 2e 78 2b 32 29 3b 0a 20 20 45 4e  1,new.x+2);.  EN
2b00: 44 3b 0a 20 20 55 50 44 41 54 45 20 74 31 36 62  D;.  UPDATE t16b
2b10: 20 53 45 54 20 78 3d 37 3b 0a 20 20 53 45 4c 45   SET x=7;.  SELE
2b20: 43 54 20 2a 20 46 52 4f 4d 20 74 31 36 61 3b 0a  CT * FROM t16a;.
2b30: 7d 20 7b 37 20 38 20 39 7d 0a 64 6f 5f 65 78 65  } {7 8 9}.do_exe
2b40: 63 73 71 6c 5f 74 65 73 74 20 31 36 2e 32 20 7b  csql_test 16.2 {
2b50: 0a 20 20 55 50 44 41 54 45 20 74 31 36 62 20 53  .  UPDATE t16b S
2b60: 45 54 20 78 3d 39 37 3b 0a 20 20 53 45 4c 45 43  ET x=97;.  SELEC
2b70: 54 20 2a 20 46 52 4f 4d 20 74 31 36 61 3b 0a 7d  T * FROM t16a;.}
2b80: 20 7b 39 37 20 39 38 20 39 39 7d 0a 0a 64 6f 5f   {97 98 99}..do_
2b90: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 36 2e  execsql_test 16.
2ba0: 33 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  3 {.  CREATE TAB
2bb0: 4c 45 20 74 31 36 63 28 61 2c 20 62 2c 20 63 2c  LE t16c(a, b, c,
2bc0: 20 64 2c 20 65 29 3b 0a 20 20 49 4e 53 45 52 54   d, e);.  INSERT
2bd0: 20 49 4e 54 4f 20 74 31 36 63 20 56 41 4c 55 45   INTO t16c VALUE
2be0: 53 28 31 2c 20 27 61 27 2c 20 27 62 27 2c 20 27  S(1, 'a', 'b', '
2bf0: 63 27 2c 20 27 64 27 29 3b 0a 20 20 43 52 45 41  c', 'd');.  CREA
2c00: 54 45 20 54 52 49 47 47 45 52 20 74 31 36 63 31  TE TRIGGER t16c1
2c10: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
2c20: 20 74 31 36 63 20 42 45 47 49 4e 0a 20 20 20 20   t16c BEGIN.    
2c30: 55 50 44 41 54 45 20 74 31 36 63 20 53 45 54 20  UPDATE t16c SET 
2c40: 28 63 2c 20 64 29 20 3d 20 28 53 45 4c 45 43 54  (c, d) = (SELECT
2c50: 20 27 41 27 2c 20 27 42 27 29 2c 20 28 65 2c 20   'A', 'B'), (e, 
2c60: 62 29 20 3d 20 28 53 45 4c 45 43 54 20 27 43 27  b) = (SELECT 'C'
2c70: 2c 20 27 44 27 29 0a 20 20 20 20 20 20 57 48 45  , 'D').      WHE
2c80: 52 45 20 61 20 3d 20 6e 65 77 2e 61 2d 31 3b 0a  RE a = new.a-1;.
2c90: 20 20 45 4e 44 3b 0a 0a 20 20 53 45 4c 45 43 54    END;..  SELECT
2ca0: 20 2a 20 46 52 4f 4d 20 74 31 36 63 3b 0a 7d 20   * FROM t16c;.} 
2cb0: 7b 31 20 61 20 62 20 63 20 64 7d 0a 0a 64 6f 5f  {1 a b c d}..do_
2cc0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 36 2e  execsql_test 16.
2cd0: 34 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  4 {.  INSERT INT
2ce0: 4f 20 74 31 36 63 20 56 41 4c 55 45 53 28 32 2c  O t16c VALUES(2,
2cf0: 20 27 77 27 2c 20 27 78 27 2c 20 27 79 27 2c 20   'w', 'x', 'y', 
2d00: 27 7a 27 29 3b 0a 20 20 53 45 4c 45 43 54 20 2a  'z');.  SELECT *
2d10: 20 46 52 4f 4d 20 74 31 36 63 3b 0a 7d 20 7b 0a   FROM t16c;.} {.
2d20: 20 20 31 20 44 20 41 20 42 20 43 20 0a 20 20 32    1 D A B C .  2
2d30: 20 77 20 78 20 79 20 7a 0a 7d 0a 0a 64 6f 5f 65   w x y z.}..do_e
2d40: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 36 2e 35  xecsql_test 16.5
2d50: 20 7b 0a 20 20 44 52 4f 50 20 54 52 49 47 47 45   {.  DROP TRIGGE
2d60: 52 20 74 31 36 63 31 3b 0a 20 20 50 52 41 47 4d  R t16c1;.  PRAGM
2d70: 41 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67  A recursive_trig
2d80: 67 65 72 73 20 3d 20 31 3b 0a 20 20 49 4e 53 45  gers = 1;.  INSE
2d90: 52 54 20 49 4e 54 4f 20 74 31 36 63 20 56 41 4c  RT INTO t16c VAL
2da0: 55 45 53 28 33 2c 20 27 69 27 2c 20 27 69 69 27  UES(3, 'i', 'ii'
2db0: 2c 20 27 69 69 69 27 2c 20 27 69 76 27 29 3b 0a  , 'iii', 'iv');.
2dc0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
2dd0: 20 74 31 36 63 31 20 41 46 54 45 52 20 55 50 44   t16c1 AFTER UPD
2de0: 41 54 45 20 4f 4e 20 74 31 36 63 20 57 48 45 4e  ATE ON t16c WHEN
2df0: 20 6e 65 77 2e 61 3e 31 20 42 45 47 49 4e 0a 20   new.a>1 BEGIN. 
2e00: 20 20 20 55 50 44 41 54 45 20 74 31 36 63 20 53     UPDATE t16c S
2e10: 45 54 20 28 65 2c 20 64 29 20 3d 20 28 0a 20 20  ET (e, d) = (.  
2e20: 20 20 20 20 53 45 4c 45 43 54 20 62 2c 20 63 20      SELECT b, c 
2e30: 46 52 4f 4d 20 74 31 36 63 20 57 48 45 52 45 20  FROM t16c WHERE 
2e40: 61 20 3d 20 6e 65 77 2e 61 2d 31 0a 20 20 20 20  a = new.a-1.    
2e50: 29 2c 20 28 63 2c 20 62 29 20 3d 20 28 0a 20 20  ), (c, b) = (.  
2e60: 20 20 20 20 53 45 4c 45 43 54 20 64 2c 20 65 20      SELECT d, e 
2e70: 46 52 4f 4d 20 74 31 36 63 20 57 48 45 52 45 20  FROM t16c WHERE 
2e80: 61 20 3d 20 6e 65 77 2e 61 2d 31 0a 20 20 20 20  a = new.a-1.    
2e90: 29 20 57 48 45 52 45 20 61 20 3d 20 6e 65 77 2e  ) WHERE a = new.
2ea0: 61 2d 31 3b 0a 20 20 45 4e 44 3b 0a 0a 20 20 55  a-1;.  END;..  U
2eb0: 50 44 41 54 45 20 74 31 36 63 20 53 45 54 20 61  PDATE t16c SET a
2ec0: 3d 61 20 57 48 45 52 45 20 61 3d 33 3b 0a 20 20  =a WHERE a=3;.  
2ed0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2ee0: 36 63 3b 0a 7d 20 7b 0a 20 20 31 20 43 20 42 20  6c;.} {.  1 C B 
2ef0: 41 20 44 0a 20 20 32 20 7a 20 79 20 78 20 77 0a  A D.  2 z y x w.
2f00: 20 20 33 20 69 20 69 69 20 69 69 69 20 69 76 0a    3 i ii iii iv.
2f10: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
2f20: 73 74 20 31 37 2e 30 20 7b 0a 20 20 43 52 45 41  st 17.0 {.  CREA
2f30: 54 45 20 54 41 42 4c 45 20 62 31 28 61 2c 20 62  TE TABLE b1(a, b
2f40: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
2f50: 45 20 62 32 28 78 29 3b 0a 7d 0a 0a 64 6f 5f 65  E b2(x);.}..do_e
2f60: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 37 2e 31  xecsql_test 17.1
2f70: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
2f80: 4f 4d 20 62 32 20 43 52 4f 53 53 20 4a 4f 49 4e  OM b2 CROSS JOIN
2f90: 20 62 31 20 0a 20 20 57 48 45 52 45 20 62 32 2e   b1 .  WHERE b2.
2fa0: 78 3d 62 31 2e 61 20 41 4e 44 20 28 62 31 2e 61  x=b1.a AND (b1.a
2fb0: 2c 20 32 29 20 0a 20 20 49 4e 20 28 56 41 4c 55  , 2) .  IN (VALU
2fc0: 45 53 28 31 2c 20 32 29 29 3b 0a 7d 20 7b 7d 0a  ES(1, 2));.} {}.
2fd0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2fe0: 20 31 38 2e 30 20 7b 0a 20 20 43 52 45 41 54 45   18.0 {.  CREATE
2ff0: 20 54 41 42 4c 45 20 62 33 20 28 20 61 2c 20 62   TABLE b3 ( a, b
3000: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 20 28 61  , PRIMARY KEY (a
3010: 2c 20 62 29 20 29 3b 0a 20 20 43 52 45 41 54 45  , b) );.  CREATE
3020: 20 54 41 42 4c 45 20 62 34 20 28 20 61 20 29 3b   TABLE b4 ( a );
3030: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
3040: 62 35 20 28 20 61 2c 20 62 20 29 3b 0a 20 20 49  b5 ( a, b );.  I
3050: 4e 53 45 52 54 20 49 4e 54 4f 20 62 33 20 56 41  NSERT INTO b3 VA
3060: 4c 55 45 53 20 28 31 2c 20 31 29 2c 20 28 31 2c  LUES (1, 1), (1,
3070: 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   2);.  INSERT IN
3080: 54 4f 20 62 34 20 56 41 4c 55 45 53 20 28 31 29  TO b4 VALUES (1)
3090: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
30a0: 62 35 20 56 41 4c 55 45 53 20 28 31 2c 20 31 29  b5 VALUES (1, 1)
30b0: 2c 20 28 31 2c 20 32 29 3b 0a 7d 0a 0a 64 6f 5f  , (1, 2);.}..do_
30c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 38 2e  execsql_test 18.
30d0: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  1 {.  SELECT * F
30e0: 52 4f 4d 20 62 33 20 57 48 45 52 45 20 28 53 45  ROM b3 WHERE (SE
30f0: 4c 45 43 54 20 62 33 2e 61 2c 20 62 33 2e 62 29  LECT b3.a, b3.b)
3100: 20 49 4e 20 28 20 53 45 4c 45 43 54 20 61 2c 20   IN ( SELECT a, 
3110: 62 20 46 52 4f 4d 20 62 35 20 29 0a 7d 20 7b 31  b FROM b5 ).} {1
3120: 20 31 20 31 20 32 7d 0a 64 6f 5f 65 78 65 63 73   1 1 2}.do_execs
3130: 71 6c 5f 74 65 73 74 20 31 38 2e 32 20 7b 0a 20  ql_test 18.2 {. 
3140: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62   SELECT * FROM b
3150: 33 20 57 48 45 52 45 20 28 56 41 4c 55 45 53 28  3 WHERE (VALUES(
3160: 62 33 2e 61 2c 20 62 33 2e 62 29 29 20 49 4e 20  b3.a, b3.b)) IN 
3170: 28 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52  ( SELECT a, b FR
3180: 4f 4d 20 62 35 20 29 3b 0a 7d 20 7b 31 20 31 20  OM b5 );.} {1 1 
3190: 31 20 32 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  1 2}.do_execsql_
31a0: 74 65 73 74 20 31 38 2e 33 20 7b 0a 20 20 53 45  test 18.3 {.  SE
31b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 33 20 57  LECT * FROM b3 W
31c0: 48 45 52 45 20 28 62 33 2e 61 2c 20 62 33 2e 62  HERE (b3.a, b3.b
31d0: 29 20 49 4e 20 28 20 53 45 4c 45 43 54 20 61 2c  ) IN ( SELECT a,
31e0: 20 62 20 46 52 4f 4d 20 62 35 20 29 3b 20 0a 7d   b FROM b5 ); .}
31f0: 20 7b 31 20 31 20 31 20 32 7d 0a 64 6f 5f 65 78   {1 1 1 2}.do_ex
3200: 65 63 73 71 6c 5f 74 65 73 74 20 31 38 2e 34 20  ecsql_test 18.4 
3210: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
3220: 4d 20 62 33 20 4a 4f 49 4e 20 62 34 20 4f 4e 20  M b3 JOIN b4 ON 
3230: 62 34 2e 61 20 3d 20 62 33 2e 61 0a 20 20 57 48  b4.a = b3.a.  WH
3240: 45 52 45 20 28 53 45 4c 45 43 54 20 62 33 2e 61  ERE (SELECT b3.a
3250: 2c 20 62 33 2e 62 29 20 49 4e 20 28 20 53 45 4c  , b3.b) IN ( SEL
3260: 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 62 35  ECT a, b FROM b5
3270: 20 29 3b 20 0a 7d 20 7b 31 20 31 20 31 20 31 20   ); .} {1 1 1 1 
3280: 32 20 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  2 1}.do_execsql_
3290: 74 65 73 74 20 31 38 2e 35 20 7b 0a 20 20 53 45  test 18.5 {.  SE
32a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 33 20 4a  LECT * FROM b3 J
32b0: 4f 49 4e 20 62 34 20 4f 4e 20 62 34 2e 61 20 3d  OIN b4 ON b4.a =
32c0: 20 62 33 2e 61 0a 20 20 57 48 45 52 45 20 28 56   b3.a.  WHERE (V
32d0: 41 4c 55 45 53 28 62 33 2e 61 2c 20 62 33 2e 62  ALUES(b3.a, b3.b
32e0: 29 29 20 49 4e 20 28 20 53 45 4c 45 43 54 20 61  )) IN ( SELECT a
32f0: 2c 20 62 20 46 52 4f 4d 20 62 35 20 29 3b 20 0a  , b FROM b5 ); .
3300: 7d 20 7b 31 20 31 20 31 20 31 20 32 20 31 7d 0a  } {1 1 1 1 2 1}.
3310: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3320: 31 38 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20  18.6 {.  SELECT 
3330: 2a 20 46 52 4f 4d 20 62 33 20 4a 4f 49 4e 20 62  * FROM b3 JOIN b
3340: 34 20 4f 4e 20 62 34 2e 61 20 3d 20 62 33 2e 61  4 ON b4.a = b3.a
3350: 0a 20 20 57 48 45 52 45 20 28 62 33 2e 61 2c 20  .  WHERE (b3.a, 
3360: 62 33 2e 62 29 20 49 4e 20 28 20 53 45 4c 45 43  b3.b) IN ( SELEC
3370: 54 20 61 2c 20 62 20 46 52 4f 4d 20 62 35 20 29  T a, b FROM b5 )
3380: 3b 20 0a 7d 20 7b 31 20 31 20 31 20 31 20 32 20  ; .} {1 1 1 1 2 
3390: 31 7d 0a 0a 20 0a 23 20 32 30 31 38 2d 30 32 2d  1}.. .# 2018-02-
33a0: 31 33 20 54 69 63 6b 65 74 20 68 74 74 70 73 3a  13 Ticket https:
33b0: 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
33c0: 2f 73 72 63 2f 74 6b 74 76 69 65 77 2f 66 34 38  /src/tktview/f48
33d0: 34 62 36 35 66 33 64 36 32 33 30 35 39 33 63 33  4b65f3d6230593c3
33e0: 0a 23 20 49 6e 63 6f 72 72 65 63 74 20 72 65 73  .# Incorrect res
33f0: 75 6c 74 20 66 72 6f 6d 20 61 20 72 6f 77 2d 76  ult from a row-v
3400: 61 6c 75 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20  alue comparison 
3410: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
3420: 75 73 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  use..#.do_execsq
3430: 6c 5f 74 65 73 74 20 31 39 2e 31 20 7b 0a 20 20  l_test 19.1 {.  
3440: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
3450: 49 53 54 53 20 74 31 3b 0a 20 20 43 52 45 41 54  ISTS t1;.  CREAT
3460: 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
3470: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
3480: 2c 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  ,b);.  INSERT IN
3490: 54 4f 20 74 31 28 61 2c 62 29 20 56 41 4c 55 45  TO t1(a,b) VALUE
34a0: 53 28 31 2c 31 31 29 2c 28 32 2c 32 32 29 2c 28  S(1,11),(2,22),(
34b0: 33 2c 33 33 29 2c 28 34 2c 34 34 29 3b 0a 20 20  3,33),(4,44);.  
34c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
34d0: 20 57 48 45 52 45 20 28 61 2c 62 29 3e 28 30 2c   WHERE (a,b)>(0,
34e0: 30 29 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 7d  0) ORDER BY a;.}
34f0: 20 7b 31 20 31 31 20 32 20 32 32 20 33 20 33 33   {1 11 2 22 3 33
3500: 20 34 20 34 34 7d 0a 64 6f 5f 65 78 65 63 73 71   4 44}.do_execsq
3510: 6c 5f 74 65 73 74 20 31 39 2e 32 20 7b 0a 20 20  l_test 19.2 {.  
3520: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3530: 20 57 48 45 52 45 20 28 61 2c 62 29 3e 3d 28 30   WHERE (a,b)>=(0
3540: 2c 30 29 20 4f 52 44 45 52 20 42 59 20 61 3b 0a  ,0) ORDER BY a;.
3550: 7d 20 7b 31 20 31 31 20 32 20 32 32 20 33 20 33  } {1 11 2 22 3 3
3560: 33 20 34 20 34 34 7d 0a 64 6f 5f 65 78 65 63 73  3 4 44}.do_execs
3570: 71 6c 5f 74 65 73 74 20 31 39 2e 33 20 7b 0a 20  ql_test 19.3 {. 
3580: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3590: 31 20 57 48 45 52 45 20 28 61 2c 62 29 3c 28 35  1 WHERE (a,b)<(5
35a0: 2c 30 29 20 4f 52 44 45 52 20 42 59 20 61 20 44  ,0) ORDER BY a D
35b0: 45 53 43 3b 0a 7d 20 7b 34 20 34 34 20 33 20 33  ESC;.} {4 44 3 3
35c0: 33 20 32 20 32 32 20 31 20 31 31 7d 0a 64 6f 5f  3 2 22 1 11}.do_
35d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 39 2e  execsql_test 19.
35e0: 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  4 {.  SELECT * F
35f0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 61 2c  ROM t1 WHERE (a,
3600: 62 29 3c 3d 28 35 2c 30 29 20 4f 52 44 45 52 20  b)<=(5,0) ORDER 
3610: 42 59 20 61 20 44 45 53 43 3b 0a 7d 20 7b 34 20  BY a DESC;.} {4 
3620: 34 34 20 33 20 33 33 20 32 20 32 32 20 31 20 31  44 3 33 2 22 1 1
3630: 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  1}.do_execsql_te
3640: 73 74 20 31 39 2e 35 20 7b 0a 20 20 53 45 4c 45  st 19.5 {.  SELE
3650: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
3660: 52 45 20 28 61 2c 62 29 3e 28 33 2c 30 29 20 4f  RE (a,b)>(3,0) O
3670: 52 44 45 52 20 42 59 20 61 3b 0a 7d 20 7b 33 20  RDER BY a;.} {3 
3680: 33 33 20 34 20 34 34 7d 0a 64 6f 5f 65 78 65 63  33 4 44}.do_exec
3690: 73 71 6c 5f 74 65 73 74 20 31 39 2e 36 20 7b 0a  sql_test 19.6 {.
36a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
36b0: 74 31 20 57 48 45 52 45 20 28 61 2c 62 29 3e 3d  t1 WHERE (a,b)>=
36c0: 28 33 2c 30 29 20 4f 52 44 45 52 20 42 59 20 61  (3,0) ORDER BY a
36d0: 3b 0a 7d 20 7b 33 20 33 33 20 34 20 34 34 7d 0a  ;.} {3 33 4 44}.
36e0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
36f0: 31 39 2e 37 20 7b 0a 20 20 53 45 4c 45 43 54 20  19.7 {.  SELECT 
3700: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
3710: 28 61 2c 62 29 3c 28 33 2c 30 29 20 4f 52 44 45  (a,b)<(3,0) ORDE
3720: 52 20 42 59 20 61 20 44 45 53 43 3b 0a 7d 20 7b  R BY a DESC;.} {
3730: 32 20 32 32 20 31 20 31 31 7d 0a 64 6f 5f 65 78  2 22 1 11}.do_ex
3740: 65 63 73 71 6c 5f 74 65 73 74 20 31 39 2e 38 20  ecsql_test 19.8 
3750: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
3760: 4d 20 74 31 20 57 48 45 52 45 20 28 61 2c 62 29  M t1 WHERE (a,b)
3770: 3c 3d 28 33 2c 30 29 20 4f 52 44 45 52 20 42 59  <=(3,0) ORDER BY
3780: 20 61 20 44 45 53 43 3b 0a 7d 20 7b 32 20 32 32   a DESC;.} {2 22
3790: 20 31 20 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71   1 11}.do_execsq
37a0: 6c 5f 74 65 73 74 20 31 39 2e 39 20 7b 0a 20 20  l_test 19.9 {.  
37b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
37c0: 20 57 48 45 52 45 20 28 61 2c 62 29 3e 28 33 2c   WHERE (a,b)>(3,
37d0: 33 32 29 20 4f 52 44 45 52 20 42 59 20 61 3b 0a  32) ORDER BY a;.
37e0: 7d 20 7b 33 20 33 33 20 34 20 34 34 7d 0a 64 6f  } {3 33 4 44}.do
37f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 39  _execsql_test 19
3800: 2e 31 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  .10 {.  SELECT *
3810: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28   FROM t1 WHERE (
3820: 61 2c 62 29 3e 28 33 2c 33 33 29 20 4f 52 44 45  a,b)>(3,33) ORDE
3830: 52 20 42 59 20 61 3b 0a 7d 20 7b 34 20 34 34 7d  R BY a;.} {4 44}
3840: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3850: 20 31 39 2e 31 31 20 7b 0a 20 20 53 45 4c 45 43   19.11 {.  SELEC
3860: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
3870: 45 20 28 61 2c 62 29 3e 3d 28 33 2c 33 33 29 20  E (a,b)>=(3,33) 
3880: 4f 52 44 45 52 20 42 59 20 61 3b 0a 7d 20 7b 33  ORDER BY a;.} {3
3890: 20 33 33 20 34 20 34 34 7d 0a 64 6f 5f 65 78 65   33 4 44}.do_exe
38a0: 63 73 71 6c 5f 74 65 73 74 20 31 39 2e 31 32 20  csql_test 19.12 
38b0: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
38c0: 4d 20 74 31 20 57 48 45 52 45 20 28 61 2c 62 29  M t1 WHERE (a,b)
38d0: 3e 3d 28 33 2c 33 34 29 20 4f 52 44 45 52 20 42  >=(3,34) ORDER B
38e0: 59 20 61 3b 0a 7d 20 7b 34 20 34 34 7d 0a 64 6f  Y a;.} {4 44}.do
38f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 39  _execsql_test 19
3900: 2e 31 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  .13 {.  SELECT *
3910: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28   FROM t1 WHERE (
3920: 61 2c 62 29 3c 28 33 2c 33 34 29 20 4f 52 44 45  a,b)<(3,34) ORDE
3930: 52 20 42 59 20 61 20 44 45 53 43 3b 0a 7d 20 7b  R BY a DESC;.} {
3940: 33 20 33 33 20 32 20 32 32 20 31 20 31 31 7d 0a  3 33 2 22 1 11}.
3950: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3960: 31 39 2e 31 34 20 7b 0a 20 20 53 45 4c 45 43 54  19.14 {.  SELECT
3970: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
3980: 20 28 61 2c 62 29 3c 28 33 2c 33 33 29 20 4f 52   (a,b)<(3,33) OR
3990: 44 45 52 20 42 59 20 61 20 44 45 53 43 3b 0a 7d  DER BY a DESC;.}
39a0: 20 7b 32 20 32 32 20 31 20 31 31 7d 0a 64 6f 5f   {2 22 1 11}.do_
39b0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 39 2e  execsql_test 19.
39c0: 31 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  15 {.  SELECT * 
39d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 61  FROM t1 WHERE (a
39e0: 2c 62 29 3c 3d 28 33 2c 33 33 29 20 4f 52 44 45  ,b)<=(3,33) ORDE
39f0: 52 20 42 59 20 61 20 44 45 53 43 3b 0a 7d 20 7b  R BY a DESC;.} {
3a00: 33 20 33 33 20 32 20 32 32 20 31 20 31 31 7d 0a  3 33 2 22 1 11}.
3a10: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3a20: 31 39 2e 31 36 20 7b 0a 20 20 53 45 4c 45 43 54  19.16 {.  SELECT
3a30: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
3a40: 20 28 61 2c 62 29 3c 3d 28 33 2c 33 32 29 20 4f   (a,b)<=(3,32) O
3a50: 52 44 45 52 20 42 59 20 61 20 44 45 53 43 3b 0a  RDER BY a DESC;.
3a60: 7d 20 7b 32 20 32 32 20 31 20 31 31 7d 0a 64 6f  } {2 22 1 11}.do
3a70: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 39  _execsql_test 19
3a80: 2e 32 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  .21 {.  SELECT *
3a90: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28   FROM t1 WHERE (
3aa0: 30 2c 30 29 3c 28 61 2c 62 29 20 4f 52 44 45 52  0,0)<(a,b) ORDER
3ab0: 20 42 59 20 61 3b 0a 7d 20 7b 31 20 31 31 20 32   BY a;.} {1 11 2
3ac0: 20 32 32 20 33 20 33 33 20 34 20 34 34 7d 0a 64   22 3 33 4 44}.d
3ad0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
3ae0: 39 2e 32 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  9.22 {.  SELECT 
3af0: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
3b00: 28 30 2c 30 29 3c 3d 28 61 2c 62 29 20 4f 52 44  (0,0)<=(a,b) ORD
3b10: 45 52 20 42 59 20 61 3b 0a 7d 20 7b 31 20 31 31  ER BY a;.} {1 11
3b20: 20 32 20 32 32 20 33 20 33 33 20 34 20 34 34 7d   2 22 3 33 4 44}
3b30: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3b40: 20 31 39 2e 32 33 20 7b 0a 20 20 53 45 4c 45 43   19.23 {.  SELEC
3b50: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
3b60: 45 20 28 35 2c 30 29 3e 28 61 2c 62 29 20 4f 52  E (5,0)>(a,b) OR
3b70: 44 45 52 20 42 59 20 61 20 44 45 53 43 3b 0a 7d  DER BY a DESC;.}
3b80: 20 7b 34 20 34 34 20 33 20 33 33 20 32 20 32 32   {4 44 3 33 2 22
3b90: 20 31 20 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71   1 11}.do_execsq
3ba0: 6c 5f 74 65 73 74 20 31 39 2e 32 34 20 7b 0a 20  l_test 19.24 {. 
3bb0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3bc0: 31 20 57 48 45 52 45 20 28 35 2c 30 29 3e 3d 28  1 WHERE (5,0)>=(
3bd0: 61 2c 62 29 20 4f 52 44 45 52 20 42 59 20 61 20  a,b) ORDER BY a 
3be0: 44 45 53 43 3b 0a 7d 20 7b 34 20 34 34 20 33 20  DESC;.} {4 44 3 
3bf0: 33 33 20 32 20 32 32 20 31 20 31 31 7d 0a 64 6f  33 2 22 1 11}.do
3c00: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 39  _execsql_test 19
3c10: 2e 32 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  .25 {.  SELECT *
3c20: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28   FROM t1 WHERE (
3c30: 33 2c 30 29 3c 28 61 2c 62 29 20 4f 52 44 45 52  3,0)<(a,b) ORDER
3c40: 20 42 59 20 61 3b 0a 7d 20 7b 33 20 33 33 20 34   BY a;.} {3 33 4
3c50: 20 34 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   44}.do_execsql_
3c60: 74 65 73 74 20 31 39 2e 32 36 20 7b 0a 20 20 53  test 19.26 {.  S
3c70: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
3c80: 57 48 45 52 45 20 28 33 2c 30 29 3c 3d 28 61 2c  WHERE (3,0)<=(a,
3c90: 62 29 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 7d  b) ORDER BY a;.}
3ca0: 20 7b 33 20 33 33 20 34 20 34 34 7d 0a 64 6f 5f   {3 33 4 44}.do_
3cb0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 39 2e  execsql_test 19.
3cc0: 32 37 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  27 {.  SELECT * 
3cd0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 33  FROM t1 WHERE (3
3ce0: 2c 30 29 3e 28 61 2c 62 29 20 4f 52 44 45 52 20  ,0)>(a,b) ORDER 
3cf0: 42 59 20 61 20 44 45 53 43 3b 0a 7d 20 7b 32 20  BY a DESC;.} {2 
3d00: 32 32 20 31 20 31 31 7d 0a 64 6f 5f 65 78 65 63  22 1 11}.do_exec
3d10: 73 71 6c 5f 74 65 73 74 20 31 39 2e 32 38 20 7b  sql_test 19.28 {
3d20: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
3d30: 20 74 31 20 57 48 45 52 45 20 28 33 2c 30 29 3e   t1 WHERE (3,0)>
3d40: 3d 28 61 2c 62 29 20 4f 52 44 45 52 20 42 59 20  =(a,b) ORDER BY 
3d50: 61 20 44 45 53 43 3b 0a 7d 20 7b 32 20 32 32 20  a DESC;.} {2 22 
3d60: 31 20 31 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  1 11}.do_execsql
3d70: 5f 74 65 73 74 20 31 39 2e 32 39 20 7b 0a 20 20  _test 19.29 {.  
3d80: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3d90: 20 57 48 45 52 45 20 28 33 2c 33 32 29 3c 28 61   WHERE (3,32)<(a
3da0: 2c 62 29 20 4f 52 44 45 52 20 42 59 20 61 3b 0a  ,b) ORDER BY a;.
3db0: 7d 20 7b 33 20 33 33 20 34 20 34 34 7d 0a 64 6f  } {3 33 4 44}.do
3dc0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 39  _execsql_test 19
3dd0: 2e 33 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  .30 {.  SELECT *
3de0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28   FROM t1 WHERE (
3df0: 33 2c 33 33 29 3c 28 61 2c 62 29 20 4f 52 44 45  3,33)<(a,b) ORDE
3e00: 52 20 42 59 20 61 3b 0a 7d 20 7b 34 20 34 34 7d  R BY a;.} {4 44}
3e10: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3e20: 20 31 39 2e 33 31 20 7b 0a 20 20 53 45 4c 45 43   19.31 {.  SELEC
3e30: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
3e40: 45 20 28 33 2c 33 33 29 3c 3d 28 61 2c 62 29 20  E (3,33)<=(a,b) 
3e50: 4f 52 44 45 52 20 42 59 20 61 3b 0a 7d 20 7b 33  ORDER BY a;.} {3
3e60: 20 33 33 20 34 20 34 34 7d 0a 64 6f 5f 65 78 65   33 4 44}.do_exe
3e70: 63 73 71 6c 5f 74 65 73 74 20 31 39 2e 33 32 20  csql_test 19.32 
3e80: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
3e90: 4d 20 74 31 20 57 48 45 52 45 20 28 33 2c 33 34  M t1 WHERE (3,34
3ea0: 29 3c 3d 28 61 2c 62 29 20 4f 52 44 45 52 20 42  )<=(a,b) ORDER B
3eb0: 59 20 61 3b 0a 7d 20 7b 34 20 34 34 7d 0a 64 6f  Y a;.} {4 44}.do
3ec0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 39  _execsql_test 19
3ed0: 2e 33 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  .33 {.  SELECT *
3ee0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28   FROM t1 WHERE (
3ef0: 33 2c 33 34 29 3e 28 61 2c 62 29 20 4f 52 44 45  3,34)>(a,b) ORDE
3f00: 52 20 42 59 20 61 20 44 45 53 43 3b 0a 7d 20 7b  R BY a DESC;.} {
3f10: 33 20 33 33 20 32 20 32 32 20 31 20 31 31 7d 0a  3 33 2 22 1 11}.
3f20: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3f30: 31 39 2e 33 34 20 7b 0a 20 20 53 45 4c 45 43 54  19.34 {.  SELECT
3f40: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
3f50: 20 28 33 2c 33 33 29 3e 28 61 2c 62 29 20 4f 52   (3,33)>(a,b) OR
3f60: 44 45 52 20 42 59 20 61 20 44 45 53 43 3b 0a 7d  DER BY a DESC;.}
3f70: 20 7b 32 20 32 32 20 31 20 31 31 7d 0a 64 6f 5f   {2 22 1 11}.do_
3f80: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 39 2e  execsql_test 19.
3f90: 33 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  35 {.  SELECT * 
3fa0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 33  FROM t1 WHERE (3
3fb0: 2c 33 33 29 3e 3d 28 61 2c 62 29 20 4f 52 44 45  ,33)>=(a,b) ORDE
3fc0: 52 20 42 59 20 61 20 44 45 53 43 3b 0a 7d 20 7b  R BY a DESC;.} {
3fd0: 33 20 33 33 20 32 20 32 32 20 31 20 31 31 7d 0a  3 33 2 22 1 11}.
3fe0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3ff0: 31 39 2e 33 36 20 7b 0a 20 20 53 45 4c 45 43 54  19.36 {.  SELECT
4000: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
4010: 20 28 33 2c 33 32 29 3e 3d 28 61 2c 62 29 20 4f   (3,32)>=(a,b) O
4020: 52 44 45 52 20 42 59 20 61 20 44 45 53 43 3b 0a  RDER BY a DESC;.
4030: 7d 20 7b 32 20 32 32 20 31 20 31 31 7d 0a 0a 23  } {2 22 1 11}..#
4040: 20 32 30 31 38 2d 30 32 2d 31 38 3a 20 4d 65 6d   2018-02-18: Mem
4050: 6f 72 79 20 6c 65 61 6b 20 6e 65 78 74 65 64 20  ory leak nexted 
4060: 72 6f 77 2d 76 61 6c 75 65 2e 20 20 44 65 74 65  row-value.  Dete
4070: 63 74 65 64 20 62 79 20 4f 53 53 46 75 7a 7a 2e  cted by OSSFuzz.
4080: 0a 23 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  .#.do_catchsql_t
4090: 65 73 74 20 32 30 2e 31 20 7b 0a 20 20 53 45 4c  est 20.1 {.  SEL
40a0: 45 43 54 20 31 20 57 48 45 52 45 20 28 32 2c 28  ECT 1 WHERE (2,(
40b0: 32 2c 30 29 29 20 49 53 20 28 32 2c 28 32 2c 30  2,0)) IS (2,(2,0
40c0: 29 29 3b 0a 7d 20 7b 30 20 31 7d 0a 0a 66 69 6e  ));.} {0 1}..fin
40d0: 69 73 68 5f 74 65 73 74 0a                       ish_test.