/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact d7268d193dd33d5505df965399d3a594e76ae13f:


0000: 23 20 32 30 30 35 20 4a 61 6e 75 61 72 79 20 31  # 2005 January 1
0010: 39 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  9.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an 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 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73  *********.# This
0170: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0180: 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74   regression test
0190: 73 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62  s for SQLite lib
01a0: 72 61 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63  rary.  The.# foc
01b0: 75 73 20 6f 66 20 74 68 69 73 20 73 63 72 69 70  us of this scrip
01c0: 74 20 69 73 20 74 65 73 74 69 6e 67 20 63 6f 72  t is testing cor
01d0: 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 69  related subqueri
01e0: 65 73 0a 23 0a 23 20 24 49 64 3a 20 73 75 62 71  es.#.# $Id: subq
01f0: 75 65 72 79 2e 74 65 73 74 2c 76 20 31 2e 31 37  uery.test,v 1.17
0200: 20 32 30 30 39 2f 30 31 2f 30 39 20 30 31 3a 31   2009/01/09 01:1
0210: 32 3a 32 38 20 64 72 68 20 45 78 70 20 24 0a 23  2:28 drh Exp $.#
0220: 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
0230: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
0240: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
0250: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a  dir/tester.tcl..
0260: 69 66 63 61 70 61 62 6c 65 20 21 73 75 62 71 75  ifcapable !subqu
0270: 65 72 79 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74  ery {.  finish_t
0280: 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a  est.  return.}..
0290: 64 6f 5f 74 65 73 74 20 73 75 62 71 75 65 72 79  do_test subquery
02a0: 2d 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.1 {.  execsql
02b0: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
02c0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
02d0: 31 28 61 2c 62 29 3b 0a 20 20 20 20 49 4e 53 45  1(a,b);.    INSE
02e0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
02f0: 53 28 31 2c 32 29 3b 0a 20 20 20 20 49 4e 53 45  S(1,2);.    INSE
0300: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0310: 53 28 33 2c 34 29 3b 0a 20 20 20 20 49 4e 53 45  S(3,4);.    INSE
0320: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0330: 53 28 35 2c 36 29 3b 0a 20 20 20 20 49 4e 53 45  S(5,6);.    INSE
0340: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0350: 53 28 37 2c 38 29 3b 0a 20 20 20 20 43 52 45 41  S(7,8);.    CREA
0360: 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c 79 29  TE TABLE t2(x,y)
0370: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0380: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 31 29  O t2 VALUES(1,1)
0390: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
03a0: 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 39 29  O t2 VALUES(3,9)
03b0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
03c0: 4f 20 74 32 20 56 41 4c 55 45 53 28 35 2c 32 35  O t2 VALUES(5,25
03d0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
03e0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 37 2c 34  TO t2 VALUES(7,4
03f0: 39 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  9);.    COMMIT;.
0400: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    }.  execsql {.
0410: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 28 53      SELECT a, (S
0420: 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 32 20  ELECT y FROM t2 
0430: 57 48 45 52 45 20 78 3d 61 29 20 46 52 4f 4d 20  WHERE x=a) FROM 
0440: 74 31 20 57 48 45 52 45 20 62 3c 38 0a 20 20 7d  t1 WHERE b<8.  }
0450: 0a 7d 20 7b 31 20 31 20 33 20 39 20 35 20 32 35  .} {1 1 3 9 5 25
0460: 7d 0a 64 6f 5f 74 65 73 74 20 73 75 62 71 75 65  }.do_test subque
0470: 72 79 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  ry-1.2 {.  execs
0480: 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
0490: 74 31 20 53 45 54 20 62 3d 62 2b 28 53 45 4c 45  t1 SET b=b+(SELE
04a0: 43 54 20 79 20 46 52 4f 4d 20 74 32 20 57 48 45  CT y FROM t2 WHE
04b0: 52 45 20 78 3d 61 29 3b 0a 20 20 20 20 53 45 4c  RE x=a);.    SEL
04c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
04d0: 20 7d 0a 7d 20 7b 31 20 33 20 33 20 31 33 20 35   }.} {1 3 3 13 5
04e0: 20 33 31 20 37 20 35 37 7d 0a 0a 64 6f 5f 74 65   31 7 57}..do_te
04f0: 73 74 20 73 75 62 71 75 65 72 79 2d 31 2e 33 20  st subquery-1.3 
0500: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0510: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
0520: 74 31 20 57 48 45 52 45 20 45 58 49 53 54 53 28  t1 WHERE EXISTS(
0530: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
0540: 20 57 48 45 52 45 20 79 3d 61 29 0a 20 20 7d 0a   WHERE y=a).  }.
0550: 7d 20 7b 33 7d 0a 64 6f 5f 74 65 73 74 20 73 75  } {3}.do_test su
0560: 62 71 75 65 72 79 2d 31 2e 34 20 7b 0a 20 20 65  bquery-1.4 {.  e
0570: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
0580: 45 43 54 20 62 20 46 52 4f 4d 20 74 31 20 57 48  ECT b FROM t1 WH
0590: 45 52 45 20 4e 4f 54 20 45 58 49 53 54 53 28 53  ERE NOT EXISTS(S
05a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
05b0: 57 48 45 52 45 20 79 3d 61 29 0a 20 20 7d 0a 7d  WHERE y=a).  }.}
05c0: 20 7b 31 33 20 33 31 20 35 37 7d 0a 0a 23 20 53   {13 31 57}..# S
05d0: 69 6d 70 6c 65 20 74 65 73 74 73 20 74 6f 20 6d  imple tests to m
05e0: 61 6b 65 20 73 75 72 65 20 63 6f 72 72 65 6c 61  ake sure correla
05f0: 74 65 64 20 73 75 62 71 75 65 72 69 65 73 20 69  ted subqueries i
0600: 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 0a  n WHERE clauses.
0610: 23 20 61 72 65 20 75 73 65 64 20 62 79 20 74 68  # are used by th
0620: 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65  e query optimize
0630: 72 20 63 6f 72 72 65 63 74 6c 79 2e 0a 64 6f 5f  r correctly..do_
0640: 74 65 73 74 20 73 75 62 71 75 65 72 79 2d 31 2e  test subquery-1.
0650: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
0660: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 78 20      SELECT a, x 
0670: 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52  FROM t1, t2 WHER
0680: 45 20 74 31 2e 61 20 3d 20 28 53 45 4c 45 43 54  E t1.a = (SELECT
0690: 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20   x);.  }.} {1 1 
06a0: 33 20 33 20 35 20 35 20 37 20 37 7d 0a 64 6f 5f  3 3 5 5 7 7}.do_
06b0: 74 65 73 74 20 73 75 62 71 75 65 72 79 2d 31 2e  test subquery-1.
06c0: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  6 {.  execsql {.
06d0: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
06e0: 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20   i1 ON t1(a);.  
06f0: 20 20 53 45 4c 45 43 54 20 61 2c 20 78 20 46 52    SELECT a, x FR
0700: 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20  OM t1, t2 WHERE 
0710: 74 31 2e 61 20 3d 20 28 53 45 4c 45 43 54 20 78  t1.a = (SELECT x
0720: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 33 20  );.  }.} {1 1 3 
0730: 33 20 35 20 35 20 37 20 37 7d 0a 64 6f 5f 74 65  3 5 5 7 7}.do_te
0740: 73 74 20 73 75 62 71 75 65 72 79 2d 31 2e 37 20  st subquery-1.7 
0750: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0760: 20 20 53 45 4c 45 43 54 20 61 2c 20 78 20 46 52    SELECT a, x FR
0770: 4f 4d 20 74 32 2c 20 74 31 20 57 48 45 52 45 20  OM t2, t1 WHERE 
0780: 74 31 2e 61 20 3d 20 28 53 45 4c 45 43 54 20 78  t1.a = (SELECT x
0790: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 33 20  );.  }.} {1 1 3 
07a0: 33 20 35 20 35 20 37 20 37 7d 0a 0a 23 20 54 72  3 5 5 7 7}..# Tr
07b0: 79 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 69  y an aggregate i
07c0: 6e 20 62 6f 74 68 20 74 68 65 20 73 75 62 71 75  n both the subqu
07d0: 65 72 79 20 61 6e 64 20 74 68 65 20 70 61 72 65  ery and the pare
07e0: 6e 74 20 71 75 65 72 79 2e 0a 64 6f 5f 74 65 73  nt query..do_tes
07f0: 74 20 73 75 62 71 75 65 72 79 2d 31 2e 38 20 7b  t subquery-1.8 {
0800: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0810: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
0820: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
0830: 20 3e 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74   > (SELECT count
0840: 28 2a 29 20 46 52 4f 4d 20 74 32 29 3b 0a 20 20  (*) FROM t2);.  
0850: 7d 0a 7d 20 7b 32 7d 0a 0a 23 20 54 65 73 74 20  }.} {2}..# Test 
0860: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
0870: 71 75 65 72 79 20 64 69 73 61 62 6c 65 73 20 74  query disables t
0880: 68 65 20 22 6f 6e 6c 79 20 6f 70 65 6e 20 74 68  he "only open th
0890: 65 20 69 6e 64 65 78 22 20 6f 70 74 69 6d 69 7a  e index" optimiz
08a0: 61 74 69 6f 6e 2e 0a 64 6f 5f 74 65 73 74 20 73  ation..do_test s
08b0: 75 62 71 75 65 72 79 2d 31 2e 39 2e 31 20 7b 0a  ubquery-1.9.1 {.
08c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
08d0: 53 45 4c 45 43 54 20 28 79 2a 32 29 3e 62 20 46  SELECT (y*2)>b F
08e0: 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45  ROM t1, t2 WHERE
08f0: 20 61 3d 78 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31   a=x;.  }.} {0 1
0900: 20 31 20 31 7d 0a 64 6f 5f 74 65 73 74 20 73 75   1 1}.do_test su
0910: 62 71 75 65 72 79 2d 31 2e 39 2e 32 20 7b 0a 20  bquery-1.9.2 {. 
0920: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
0930: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
0940: 57 48 45 52 45 20 28 53 45 4c 45 43 54 20 28 79  WHERE (SELECT (y
0950: 2a 32 29 3e 62 20 46 52 4f 4d 20 74 32 20 57 48  *2)>b FROM t2 WH
0960: 45 52 45 20 61 3d 78 29 3b 20 0a 20 20 7d 0a 7d  ERE a=x); .  }.}
0970: 20 7b 33 20 35 20 37 7d 0a 0a 23 20 54 65 73 74   {3 5 7}..# Test
0980: 20 74 68 61 74 20 74 68 65 20 66 6c 61 74 74 65   that the flatte
0990: 6e 69 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ning optimizatio
09a0: 6e 20 77 6f 72 6b 73 20 77 69 74 68 20 73 75 62  n works with sub
09b0: 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
09c0: 73 2e 0a 64 6f 5f 74 65 73 74 20 73 75 62 71 75  s..do_test subqu
09d0: 65 72 79 2d 31 2e 31 30 2e 31 20 7b 0a 20 20 65  ery-1.10.1 {.  e
09e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
09f0: 45 43 54 20 28 53 45 4c 45 43 54 20 61 29 2c 20  ECT (SELECT a), 
0a00: 62 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d  b FROM t1;.  }.}
0a10: 20 7b 31 20 33 20 33 20 31 33 20 35 20 33 31 20   {1 3 3 13 5 31 
0a20: 37 20 35 37 7d 0a 64 6f 5f 74 65 73 74 20 73 75  7 57}.do_test su
0a30: 62 71 75 65 72 79 2d 31 2e 31 30 2e 32 20 7b 0a  bquery-1.10.2 {.
0a40: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0a50: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
0a60: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 61 29  ELECT (SELECT a)
0a70: 2c 20 62 20 46 52 4f 4d 20 74 31 29 3b 0a 20 20  , b FROM t1);.  
0a80: 7d 0a 7d 20 7b 31 20 33 20 33 20 31 33 20 35 20  }.} {1 3 3 13 5 
0a90: 33 31 20 37 20 35 37 7d 0a 64 6f 5f 74 65 73 74  31 7 57}.do_test
0aa0: 20 73 75 62 71 75 65 72 79 2d 31 2e 31 30 2e 33   subquery-1.10.3
0ab0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0ac0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0ad0: 20 28 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54   (SELECT (SELECT
0ae0: 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 31 29   sum(a) FROM t1)
0af0: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 36 7d 0a 64 6f  );.  }.} {16}.do
0b00: 5f 74 65 73 74 20 73 75 62 71 75 65 72 79 2d 31  _test subquery-1
0b10: 2e 31 30 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  .10.4 {.  execsq
0b20: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
0b30: 41 42 4c 45 20 74 35 20 28 76 61 6c 20 69 6e 74  ABLE t5 (val int
0b40: 2c 20 70 65 72 69 6f 64 20 74 65 78 74 20 50 52  , period text PR
0b50: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
0b60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56  INSERT INTO t5 V
0b70: 41 4c 55 45 53 28 35 2c 20 27 32 30 30 31 2d 33  ALUES(5, '2001-3
0b80: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
0b90: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 31 30  NTO t5 VALUES(10
0ba0: 2c 20 27 32 30 30 31 2d 34 27 29 3b 0a 20 20 20  , '2001-4');.   
0bb0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20   INSERT INTO t5 
0bc0: 56 41 4c 55 45 53 28 31 35 2c 20 27 32 30 30 32  VALUES(15, '2002
0bd0: 2d 31 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  -1');.    INSERT
0be0: 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28   INTO t5 VALUES(
0bf0: 35 2c 20 27 32 30 30 32 2d 32 27 29 3b 0a 20 20  5, '2002-2');.  
0c00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35    INSERT INTO t5
0c10: 20 56 41 4c 55 45 53 28 31 30 2c 20 27 32 30 30   VALUES(10, '200
0c20: 32 2d 33 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  2-3');.    INSER
0c30: 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53  T INTO t5 VALUES
0c40: 28 31 35 2c 20 27 32 30 30 32 2d 34 27 29 3b 0a  (15, '2002-4');.
0c50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0c60: 74 35 20 56 41 4c 55 45 53 28 31 30 2c 20 27 32  t5 VALUES(10, '2
0c70: 30 30 33 2d 31 27 29 3b 0a 20 20 20 20 49 4e 53  003-1');.    INS
0c80: 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55  ERT INTO t5 VALU
0c90: 45 53 28 35 2c 20 27 32 30 30 33 2d 32 27 29 3b  ES(5, '2003-2');
0ca0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0cb0: 20 74 35 20 56 41 4c 55 45 53 28 32 35 2c 20 27   t5 VALUES(25, '
0cc0: 32 30 30 33 2d 33 27 29 3b 0a 20 20 20 20 49 4e  2003-3');.    IN
0cd0: 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c  SERT INTO t5 VAL
0ce0: 55 45 53 28 35 2c 20 27 32 30 30 33 2d 34 27 29  UES(5, '2003-4')
0cf0: 3b 0a 0a 20 20 20 20 53 45 4c 45 43 54 20 70 65  ;..    SELECT pe
0d00: 72 69 6f 64 2c 20 76 73 75 6d 0a 20 20 20 20 46  riod, vsum.    F
0d10: 52 4f 4d 20 28 53 45 4c 45 43 54 20 0a 20 20 20  ROM (SELECT .   
0d20: 20 20 20 61 2e 70 65 72 69 6f 64 2c 0a 20 20 20     a.period,.   
0d30: 20 20 20 28 73 65 6c 65 63 74 20 73 75 6d 28 76     (select sum(v
0d40: 61 6c 29 20 66 72 6f 6d 20 74 35 20 77 68 65 72  al) from t5 wher
0d50: 65 20 70 65 72 69 6f 64 20 62 65 74 77 65 65 6e  e period between
0d60: 20 61 2e 70 65 72 69 6f 64 20 61 6e 64 20 27 32   a.period and '2
0d70: 30 30 32 2d 34 27 29 20 76 73 75 6d 0a 20 20 20  002-4') vsum.   
0d80: 20 20 20 46 52 4f 4d 20 74 35 20 61 20 77 68 65     FROM t5 a whe
0d90: 72 65 20 61 2e 70 65 72 69 6f 64 20 62 65 74 77  re a.period betw
0da0: 65 65 6e 20 27 32 30 30 32 2d 31 27 20 61 6e 64  een '2002-1' and
0db0: 20 27 32 30 30 32 2d 34 27 29 0a 20 20 20 20 57   '2002-4').    W
0dc0: 48 45 52 45 20 76 73 75 6d 20 3c 20 34 35 20 3b  HERE vsum < 45 ;
0dd0: 0a 20 20 7d 0a 7d 20 7b 32 30 30 32 2d 32 20 33  .  }.} {2002-2 3
0de0: 30 20 32 30 30 32 2d 33 20 32 35 20 32 30 30 32  0 2002-3 25 2002
0df0: 2d 34 20 31 35 7d 0a 64 6f 5f 74 65 73 74 20 73  -4 15}.do_test s
0e00: 75 62 71 75 65 72 79 2d 31 2e 31 30 2e 35 20 7b  ubquery-1.10.5 {
0e10: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0e20: 20 53 45 4c 45 43 54 20 70 65 72 69 6f 64 2c 20   SELECT period, 
0e30: 76 73 75 6d 20 66 72 6f 6d 0a 20 20 20 20 20 20  vsum from.      
0e40: 28 73 65 6c 65 63 74 20 61 2e 70 65 72 69 6f 64  (select a.period
0e50: 2c 0a 20 20 20 20 20 20 28 73 65 6c 65 63 74 20  ,.      (select 
0e60: 73 75 6d 28 76 61 6c 29 20 66 72 6f 6d 20 74 35  sum(val) from t5
0e70: 20 77 68 65 72 65 20 70 65 72 69 6f 64 20 62 65   where period be
0e80: 74 77 65 65 6e 20 61 2e 70 65 72 69 6f 64 20 61  tween a.period a
0e90: 6e 64 20 27 32 30 30 32 2d 34 27 29 20 76 73 75  nd '2002-4') vsu
0ea0: 6d 0a 20 20 20 20 46 52 4f 4d 20 74 35 20 61 20  m.    FROM t5 a 
0eb0: 77 68 65 72 65 20 61 2e 70 65 72 69 6f 64 20 62  where a.period b
0ec0: 65 74 77 65 65 6e 20 27 32 30 30 32 2d 31 27 20  etween '2002-1' 
0ed0: 61 6e 64 20 27 32 30 30 32 2d 34 27 29 20 0a 20  and '2002-4') . 
0ee0: 20 20 20 57 48 45 52 45 20 76 73 75 6d 20 3c 20     WHERE vsum < 
0ef0: 34 35 20 3b 0a 20 20 7d 0a 7d 20 7b 32 30 30 32  45 ;.  }.} {2002
0f00: 2d 32 20 33 30 20 32 30 30 32 2d 33 20 32 35 20  -2 30 2002-3 25 
0f10: 32 30 30 32 2d 34 20 31 35 7d 0a 64 6f 5f 74 65  2002-4 15}.do_te
0f20: 73 74 20 73 75 62 71 75 65 72 79 2d 31 2e 31 30  st subquery-1.10
0f30: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
0f40: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
0f50: 74 35 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 0a 0a  t5;.  }.} {}....
0f60: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
0fb0: 69 6e 67 20 74 65 73 74 20 63 61 73 65 73 20 2d  ing test cases -
0fc0: 20 73 75 62 71 75 65 72 79 2d 32 2e 2a 20 2d 20   subquery-2.* - 
0fd0: 61 72 65 20 6e 6f 74 20 6c 6f 67 69 63 61 6c 6c  are not logicall
0fe0: 79 0a 23 20 6f 72 67 61 6e 69 7a 65 64 2e 20 54  y.# organized. T
0ff0: 68 65 79 27 72 65 20 68 65 72 65 20 6c 61 72 67  hey're here larg
1000: 65 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 79  ely because they
1010: 20 77 65 72 65 20 66 61 69 6c 69 6e 67 20 64 75   were failing du
1020: 72 69 6e 67 0a 23 20 6f 6e 65 20 73 74 61 67 65  ring.# one stage
1030: 20 6f 66 20 64 65 76 65 6c 6f 70 6d 65 6e 74 20   of development 
1040: 6f 66 20 73 75 62 2d 71 75 65 72 69 65 73 2e 0a  of sub-queries..
1050: 23 0a 64 6f 5f 74 65 73 74 20 73 75 62 71 75 65  #.do_test subque
1060: 72 79 2d 32 2e 31 20 7b 0a 20 20 65 78 65 63 73  ry-2.1 {.  execs
1070: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
1080: 28 53 45 4c 45 43 54 20 31 30 29 3b 0a 20 20 7d  (SELECT 10);.  }
1090: 0a 7d 20 7b 31 30 7d 0a 64 6f 5f 74 65 73 74 20  .} {10}.do_test 
10a0: 73 75 62 71 75 65 72 79 2d 32 2e 32 2e 31 20 7b  subquery-2.2.1 {
10b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
10c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
10d0: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
10e0: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
10f0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c  NTO t3 VALUES(1,
1100: 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   2);.    INSERT 
1110: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 33  INTO t3 VALUES(3
1120: 2c 20 31 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  , 1);.  }.} {}.d
1130: 6f 5f 74 65 73 74 20 73 75 62 71 75 65 72 79 2d  o_test subquery-
1140: 32 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  2.2.2 {.  execsq
1150: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
1160: 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 61   FROM t3 WHERE a
1170: 20 49 4e 20 28 53 45 4c 45 43 54 20 62 20 46 52   IN (SELECT b FR
1180: 4f 4d 20 74 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31  OM t3);.  }.} {1
1190: 20 32 7d 0a 64 6f 5f 74 65 73 74 20 73 75 62 71   2}.do_test subq
11a0: 75 65 72 79 2d 32 2e 32 2e 33 20 7b 0a 20 20 65  uery-2.2.3 {.  e
11b0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
11c0: 50 20 54 41 42 4c 45 20 74 33 3b 0a 20 20 7d 0a  P TABLE t3;.  }.
11d0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 75 62  } {}.do_test sub
11e0: 71 75 65 72 79 2d 32 2e 33 2e 31 20 7b 0a 20 20  query-2.3.1 {.  
11f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
1200: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 20  EATE TABLE t3(a 
1210: 54 45 58 54 29 3b 0a 20 20 20 20 49 4e 53 45 52  TEXT);.    INSER
1220: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
1230: 28 27 31 30 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  ('10');.  }.} {}
1240: 0a 64 6f 5f 74 65 73 74 20 73 75 62 71 75 65 72  .do_test subquer
1250: 79 2d 32 2e 33 2e 32 20 7b 0a 20 20 65 78 65 63  y-2.3.2 {.  exec
1260: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
1270: 20 61 20 49 4e 20 28 31 30 2e 30 2c 20 32 30 29   a IN (10.0, 20)
1280: 20 46 52 4f 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20   FROM t3;.  }.} 
1290: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 73 75 62 71  {0}.do_test subq
12a0: 75 65 72 79 2d 32 2e 33 2e 33 20 7b 0a 20 20 65  uery-2.3.3 {.  e
12b0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
12c0: 50 20 54 41 42 4c 45 20 74 33 3b 0a 20 20 7d 0a  P TABLE t3;.  }.
12d0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 75 62  } {}.do_test sub
12e0: 71 75 65 72 79 2d 32 2e 34 2e 31 20 7b 0a 20 20  query-2.4.1 {.  
12f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
1300: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 20  EATE TABLE t3(a 
1310: 54 45 58 54 29 3b 0a 20 20 20 20 49 4e 53 45 52  TEXT);.    INSER
1320: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
1330: 28 27 58 58 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  ('XX');.  }.} {}
1340: 0a 64 6f 5f 74 65 73 74 20 73 75 62 71 75 65 72  .do_test subquer
1350: 79 2d 32 2e 34 2e 32 20 7b 0a 20 20 65 78 65 63  y-2.4.2 {.  exec
1360: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
1370: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1380: 33 20 57 48 45 52 45 20 61 20 49 4e 20 28 53 45  3 WHERE a IN (SE
1390: 4c 45 43 54 20 27 58 58 27 29 0a 20 20 7d 0a 7d  LECT 'XX').  }.}
13a0: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 73 75 62   {1}.do_test sub
13b0: 71 75 65 72 79 2d 32 2e 34 2e 33 20 7b 0a 20 20  query-2.4.3 {.  
13c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52  execsql {.    DR
13d0: 4f 50 20 54 41 42 4c 45 20 74 33 3b 0a 20 20 7d  OP TABLE t3;.  }
13e0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 75  .} {}.do_test su
13f0: 62 71 75 65 72 79 2d 32 2e 35 2e 31 20 7b 0a 20  bquery-2.5.1 {. 
1400: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
1410: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
1420: 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 49   INTEGER);.    I
1430: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
1440: 4c 55 45 53 28 31 30 29 3b 0a 0a 20 20 20 20 43  LUES(10);..    C
1450: 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 78  REATE TABLE t4(x
1460: 20 54 45 58 54 29 3b 0a 20 20 20 20 49 4e 53 45   TEXT);.    INSE
1470: 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45  RT INTO t4 VALUE
1480: 53 28 27 31 30 2e 30 27 29 3b 0a 20 20 7d 0a 7d  S('10.0');.  }.}
1490: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 75 62 71   {}.do_test subq
14a0: 75 65 72 79 2d 32 2e 35 2e 32 20 7b 0a 20 20 23  uery-2.5.2 {.  #
14b0: 20 49 6e 20 74 68 65 20 65 78 70 72 20 22 78 20   In the expr "x 
14c0: 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
14d0: 4d 20 74 33 29 22 20 74 68 65 20 52 48 53 20 6f  M t3)" the RHS o
14e0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
14f0: 72 0a 20 20 23 20 68 61 73 20 74 65 78 74 20 61  r.  # has text a
1500: 66 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65 20  ffinity and the 
1510: 4c 48 53 20 68 61 73 20 69 6e 74 65 67 65 72 20  LHS has integer 
1520: 61 66 66 69 6e 69 74 79 2e 20 20 54 68 65 20 72  affinity.  The r
1530: 75 6c 65 20 69 73 0a 20 20 23 20 74 68 61 74 20  ule is.  # that 
1540: 77 65 20 74 72 79 20 74 6f 20 63 6f 6e 76 65 72  we try to conver
1550: 74 20 62 6f 74 68 20 73 69 64 65 73 20 74 6f 20  t both sides to 
1560: 61 6e 20 69 6e 74 65 67 65 72 20 62 65 66 6f 72  an integer befor
1570: 65 20 64 6f 69 6e 67 20 74 68 65 0a 20 20 23 20  e doing the.  # 
1580: 63 6f 6d 70 61 72 69 73 69 6f 6e 2e 20 20 48 65  comparision.  He
1590: 6e 63 65 2c 20 74 68 65 20 69 6e 74 65 67 65 72  nce, the integer
15a0: 20 76 61 6c 75 65 20 31 30 20 69 6e 20 74 33 20   value 10 in t3 
15b0: 77 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65 71 75  will compare equ
15c0: 61 6c 0a 20 20 23 20 74 6f 20 74 68 65 20 73 74  al.  # to the st
15d0: 72 69 6e 67 20 76 61 6c 75 65 20 27 31 30 2e 30  ring value '10.0
15e0: 27 20 69 6e 20 74 34 20 62 65 63 61 75 73 65 20  ' in t4 because 
15f0: 74 68 65 20 74 34 20 76 61 6c 75 65 20 77 69 6c  the t4 value wil
1600: 6c 20 62 65 0a 20 20 23 20 63 6f 6e 76 65 72 74  l be.  # convert
1610: 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67  ed into an integ
1620: 65 72 2e 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  er..  execsql {.
1630: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1640: 4d 20 74 34 20 57 48 45 52 45 20 78 20 49 4e 20  M t4 WHERE x IN 
1650: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74  (SELECT a FROM t
1660: 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 30 2e 30 7d  3);.  }.} {10.0}
1670: 0a 64 6f 5f 74 65 73 74 20 73 75 62 71 75 65 72  .do_test subquer
1680: 79 2d 32 2e 35 2e 33 2e 31 20 7b 0a 20 20 23 20  y-2.5.3.1 {.  # 
1690: 54 68 65 20 74 34 69 20 69 6e 64 65 78 20 63 61  The t4i index ca
16a0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 74 6f 20  nnot be used to 
16b0: 72 65 73 6f 6c 76 65 20 74 68 65 20 22 78 20 49  resolve the "x I
16c0: 4e 20 28 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 61  N (...)" constra
16d0: 69 6e 74 0a 20 20 23 20 62 65 63 61 75 73 65 20  int.  # because 
16e0: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  the constraint h
16f0: 61 73 20 69 6e 74 65 67 65 72 20 61 66 66 69 6e  as integer affin
1700: 69 74 79 20 62 75 74 20 74 34 69 20 68 61 73 20  ity but t4i has 
1710: 74 65 78 74 20 61 66 66 69 6e 69 74 79 2e 0a 20  text affinity.. 
1720: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
1730: 52 45 41 54 45 20 49 4e 44 45 58 20 74 34 69 20  REATE INDEX t4i 
1740: 4f 4e 20 74 34 28 78 29 3b 0a 20 20 20 20 53 45  ON t4(x);.    SE
1750: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20 57  LECT * FROM t4 W
1760: 48 45 52 45 20 78 20 49 4e 20 28 53 45 4c 45 43  HERE x IN (SELEC
1770: 54 20 61 20 46 52 4f 4d 20 74 33 29 3b 0a 20 20  T a FROM t3);.  
1780: 7d 0a 7d 20 7b 31 30 2e 30 7d 0a 64 6f 5f 74 65  }.} {10.0}.do_te
1790: 73 74 20 73 75 62 71 75 65 72 79 2d 32 2e 35 2e  st subquery-2.5.
17a0: 33 2e 32 20 7b 0a 20 20 23 20 56 65 72 69 66 79  3.2 {.  # Verify
17b0: 20 74 68 61 74 20 74 68 65 20 74 34 69 20 69 6e   that the t4i in
17c0: 64 65 78 20 77 61 73 20 6e 6f 74 20 75 73 65 64  dex was not used
17d0: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
17e0: 20 71 75 65 72 79 0a 20 20 65 78 65 63 73 71 6c   query.  execsql
17f0: 20 7b 0a 20 20 20 20 45 58 50 4c 41 49 4e 20 51   {.    EXPLAIN Q
1800: 55 45 52 59 20 50 4c 41 4e 0a 20 20 20 20 53 45  UERY PLAN.    SE
1810: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20 57  LECT * FROM t4 W
1820: 48 45 52 45 20 78 20 49 4e 20 28 53 45 4c 45 43  HERE x IN (SELEC
1830: 54 20 61 20 46 52 4f 4d 20 74 33 29 3b 0a 20 20  T a FROM t3);.  
1840: 7d 0a 7d 20 7b 7e 2f 74 34 69 2f 7d 0a 64 6f 5f  }.} {~/t4i/}.do_
1850: 74 65 73 74 20 73 75 62 71 75 65 72 79 2d 32 2e  test subquery-2.
1860: 35 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.4 {.  execsql 
1870: 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  {.    DROP TABLE
1880: 20 74 33 3b 0a 20 20 20 20 44 52 4f 50 20 54 41   t3;.    DROP TA
1890: 42 4c 45 20 74 34 3b 0a 20 20 7d 0a 7d 20 7b 7d  BLE t4;.  }.} {}
18a0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18e0: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
18f0: 6f 77 69 6e 67 20 74 65 73 74 20 63 61 73 65 73  owing test cases
1900: 20 2d 20 73 75 62 71 75 65 72 79 2d 33 2e 2a 20   - subquery-3.* 
1910: 2d 20 74 65 73 74 20 74 69 63 6b 65 74 73 20 74  - test tickets t
1920: 68 61 74 0a 23 20 77 65 72 65 20 72 61 69 73 65  hat.# were raise
1930: 64 20 64 75 72 69 6e 67 20 64 65 76 65 6c 6f 70  d during develop
1940: 6d 65 6e 74 20 6f 66 20 63 6f 72 72 65 6c 61 74  ment of correlat
1950: 65 64 20 73 75 62 71 75 65 72 69 65 73 2e 0a 23  ed subqueries..#
1960: 0a 0a 23 20 54 69 63 6b 65 74 20 31 30 38 33 0a  ..# Ticket 1083.
1970: 69 66 63 61 70 61 62 6c 65 20 76 69 65 77 20 7b  ifcapable view {
1980: 0a 20 20 64 6f 5f 74 65 73 74 20 73 75 62 71 75  .  do_test subqu
1990: 65 72 79 2d 33 2e 31 20 7b 0a 20 20 20 20 63 61  ery-3.1 {.    ca
19a0: 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 41  tchsql { DROP TA
19b0: 42 4c 45 20 74 31 3b 20 7d 0a 20 20 20 20 63 61  BLE t1; }.    ca
19c0: 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 41  tchsql { DROP TA
19d0: 42 4c 45 20 74 32 3b 20 7d 0a 20 20 20 20 65 78  BLE t2; }.    ex
19e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  ecsql {.      CR
19f0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
1a00: 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  b);.      INSERT
1a10: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1a20: 31 2c 32 29 3b 0a 20 20 20 20 20 20 43 52 45 41  1,2);.      CREA
1a30: 54 45 20 56 49 45 57 20 76 31 20 41 53 20 53 45  TE VIEW v1 AS SE
1a40: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31 20 57  LECT b FROM t1 W
1a50: 48 45 52 45 20 61 3e 30 3b 0a 20 20 20 20 20 20  HERE a>0;.      
1a60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
1a70: 70 2c 71 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  p,q);.      INSE
1a80: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
1a90: 53 28 32 2c 39 29 3b 0a 20 20 20 20 20 20 53 45  S(2,9);.      SE
1aa0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 76 31 20 57  LECT * FROM v1 W
1ab0: 48 45 52 45 20 45 58 49 53 54 53 28 53 45 4c 45  HERE EXISTS(SELE
1ac0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45  CT * FROM t2 WHE
1ad0: 52 45 20 70 3d 76 31 2e 62 29 3b 0a 20 20 20 20  RE p=v1.b);.    
1ae0: 7d 0a 20 20 7d 20 7b 32 7d 0a 20 20 64 6f 5f 74  }.  } {2}.  do_t
1af0: 65 73 74 20 73 75 62 71 75 65 72 79 2d 33 2e 31  est subquery-3.1
1b00: 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .1 {.    execsql
1b10: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
1b20: 2a 20 46 52 4f 4d 20 76 31 20 57 48 45 52 45 20  * FROM v1 WHERE 
1b30: 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 31 29  EXISTS(SELECT 1)
1b40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 32 7d 0a  ;.    }.  } {2}.
1b50: 7d 20 65 6c 73 65 20 7b 0a 20 20 63 61 74 63 68  } else {.  catch
1b60: 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45  sql { DROP TABLE
1b70: 20 74 31 3b 20 7d 0a 20 20 63 61 74 63 68 73 71   t1; }.  catchsq
1b80: 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 74  l { DROP TABLE t
1b90: 32 3b 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  2; }.  execsql {
1ba0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
1bb0: 45 20 74 31 28 61 2c 62 29 3b 0a 20 20 20 20 49  E t1(a,b);.    I
1bc0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1bd0: 4c 55 45 53 28 31 2c 32 29 3b 0a 20 20 20 20 43  LUES(1,2);.    C
1be0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 70  REATE TABLE t2(p
1bf0: 2c 71 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ,q);.    INSERT 
1c00: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 32  INTO t2 VALUES(2
1c10: 2c 39 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 20 54 69  ,9);.  }.}..# Ti
1c20: 63 6b 65 74 20 31 30 38 34 0a 64 6f 5f 74 65 73  cket 1084.do_tes
1c30: 74 20 73 75 62 71 75 65 72 79 2d 33 2e 32 20 7b  t subquery-3.2 {
1c40: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
1c50: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1c60: 31 28 61 2c 62 29 3b 0a 20 20 20 20 49 4e 53 45  1(a,b);.    INSE
1c70: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1c80: 53 28 31 2c 32 29 3b 0a 20 20 7d 0a 20 20 65 78  S(1,2);.  }.  ex
1c90: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
1ca0: 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 61 29  CT (SELECT t1.a)
1cb0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
1cc0: 7b 31 7d 0a 0a 23 20 54 65 73 74 20 43 61 73 65  {1}..# Test Case
1cd0: 73 20 73 75 62 71 75 65 72 79 2d 33 2e 33 2e 2a  s subquery-3.3.*
1ce0: 20 74 65 73 74 20 63 6f 72 72 65 6c 61 74 65 64   test correlated
1cf0: 20 73 75 62 71 75 65 72 69 65 73 20 77 68 65 72   subqueries wher
1d00: 65 20 74 68 65 0a 23 20 70 61 72 65 6e 74 20 71  e the.# parent q
1d10: 75 65 72 79 20 69 73 20 61 6e 20 61 67 67 72 65  uery is an aggre
1d20: 67 61 74 65 20 71 75 65 72 79 2e 20 54 69 63 6b  gate query. Tick
1d30: 65 74 20 23 31 31 30 35 20 69 73 20 61 6e 20 65  et #1105 is an e
1d40: 78 61 6d 70 6c 65 0a 23 20 6f 66 20 73 75 63 68  xample.# of such
1d50: 20 61 20 71 75 65 72 79 2e 0a 23 0a 64 6f 5f 74   a query..#.do_t
1d60: 65 73 74 20 73 75 62 71 75 65 72 79 2d 33 2e 33  est subquery-3.3
1d70: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
1d80: 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 28  .    SELECT a, (
1d90: 53 45 4c 45 43 54 20 62 29 20 46 52 4f 4d 20 74  SELECT b) FROM t
1da0: 31 20 47 52 4f 55 50 20 42 59 20 61 3b 0a 20 20  1 GROUP BY a;.  
1db0: 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73  }.} {1 2}.do_tes
1dc0: 74 20 73 75 62 71 75 65 72 79 2d 33 2e 33 2e 32  t subquery-3.3.2
1dd0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 44   {.  catchsql {D
1de0: 52 4f 50 20 54 41 42 4c 45 20 74 32 7d 0a 20 20  ROP TABLE t2}.  
1df0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
1e00: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 63 2c  EATE TABLE t2(c,
1e10: 20 64 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   d);.    INSERT 
1e20: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31  INTO t2 VALUES(1
1e30: 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e  , 'one');.    IN
1e40: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
1e50: 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20  UES(2, 'two');. 
1e60: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 28 53 45     SELECT a, (SE
1e70: 4c 45 43 54 20 64 20 46 52 4f 4d 20 74 32 20 57  LECT d FROM t2 W
1e80: 48 45 52 45 20 61 3d 63 29 20 46 52 4f 4d 20 74  HERE a=c) FROM t
1e90: 31 20 47 52 4f 55 50 20 42 59 20 61 3b 0a 20 20  1 GROUP BY a;.  
1ea0: 7d 0a 7d 20 7b 31 20 6f 6e 65 7d 0a 64 6f 5f 74  }.} {1 one}.do_t
1eb0: 65 73 74 20 73 75 62 71 75 65 72 79 2d 33 2e 33  est subquery-3.3
1ec0: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
1ed0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1ee0: 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 34 29   t1 VALUES(2, 4)
1ef0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78  ;.    SELECT max
1f00: 28 61 29 2c 20 28 53 45 4c 45 43 54 20 64 20 46  (a), (SELECT d F
1f10: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 61 3d 63  ROM t2 WHERE a=c
1f20: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d  ) FROM t1;.  }.}
1f30: 20 7b 32 20 74 77 6f 7d 0a 64 6f 5f 74 65 73 74   {2 two}.do_test
1f40: 20 73 75 62 71 75 65 72 79 2d 33 2e 33 2e 34 20   subquery-3.3.4 
1f50: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1f60: 20 20 53 45 4c 45 43 54 20 61 2c 20 28 53 45 4c    SELECT a, (SEL
1f70: 45 43 54 20 28 53 45 4c 45 43 54 20 64 20 46 52  ECT (SELECT d FR
1f80: 4f 4d 20 74 32 20 57 48 45 52 45 20 61 3d 63 29  OM t2 WHERE a=c)
1f90: 29 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20  ) FROM t1 GROUP 
1fa0: 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 31 20 6f  BY a;.  }.} {1 o
1fb0: 6e 65 20 32 20 74 77 6f 7d 0a 64 6f 5f 74 65 73  ne 2 two}.do_tes
1fc0: 74 20 73 75 62 71 75 65 72 79 2d 33 2e 33 2e 35  t subquery-3.3.5
1fd0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1fe0: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 28 53 45     SELECT a, (SE
1ff0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2000: 4f 4d 20 74 32 20 57 48 45 52 45 20 61 3d 63 29  OM t2 WHERE a=c)
2010: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
2020: 7b 31 20 31 20 32 20 31 7d 0a 0a 23 20 54 68 65  {1 1 2 1}..# The
2030: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
2040: 20 63 68 65 63 6b 20 66 6f 72 20 61 67 67 72 65   check for aggre
2050: 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 20  gate subqueries 
2060: 69 6e 20 61 6e 20 61 67 67 72 65 67 61 74 65 0a  in an aggregate.
2070: 23 20 71 75 65 72 79 2e 0a 23 0a 64 6f 5f 74 65  # query..#.do_te
2080: 73 74 20 73 75 62 71 75 65 72 79 2d 33 2e 34 2e  st subquery-3.4.
2090: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
20a0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
20b0: 20 74 33 34 28 78 2c 79 29 3b 0a 20 20 20 20 49   t34(x,y);.    I
20c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 34 20 56  NSERT INTO t34 V
20d0: 41 4c 55 45 53 28 31 30 36 2c 34 29 2c 20 28 31  ALUES(106,4), (1
20e0: 30 37 2c 33 29 2c 20 28 31 30 36 2c 35 29 2c 20  07,3), (106,5), 
20f0: 28 31 30 37 2c 35 29 3b 0a 20 20 20 20 53 45 4c  (107,5);.    SEL
2100: 45 43 54 20 61 2e 78 2c 20 61 76 67 28 61 2e 79  ECT a.x, avg(a.y
2110: 29 0a 20 20 20 20 20 20 46 52 4f 4d 20 74 33 34  ).      FROM t34
2120: 20 41 53 20 61 0a 20 20 20 20 20 47 52 4f 55 50   AS a.     GROUP
2130: 20 42 59 20 61 2e 78 0a 20 20 20 20 20 48 41 56   BY a.x.     HAV
2140: 49 4e 47 20 4e 4f 54 20 45 58 49 53 54 53 28 20  ING NOT EXISTS( 
2150: 53 45 4c 45 43 54 20 62 2e 78 2c 20 61 76 67 28  SELECT b.x, avg(
2160: 62 2e 79 29 0a 20 20 20 20 20 20 20 20 20 20 20  b.y).           
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
2180: 52 4f 4d 20 74 33 34 20 41 53 20 62 0a 20 20 20  ROM t34 AS b.   
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 47 52 4f 55 50 20 42 59 20 62        GROUP BY b
21b0: 2e 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  .x.             
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56 49              HAVI
21d0: 4e 47 20 61 76 67 28 61 2e 79 29 20 3e 20 61 76  NG avg(a.y) > av
21e0: 67 28 62 2e 79 29 29 3b 0a 20 20 7d 0a 7d 20 7b  g(b.y));.  }.} {
21f0: 31 30 37 20 34 2e 30 7d 0a 64 6f 5f 74 65 73 74  107 4.0}.do_test
2200: 20 73 75 62 71 75 65 72 79 2d 33 2e 34 2e 32 20   subquery-3.4.2 
2210: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2220: 20 20 53 45 4c 45 43 54 20 61 2e 78 2c 20 61 76    SELECT a.x, av
2230: 67 28 61 2e 79 29 20 41 53 20 61 76 67 31 0a 20  g(a.y) AS avg1. 
2240: 20 20 20 20 20 46 52 4f 4d 20 74 33 34 20 41 53       FROM t34 AS
2250: 20 61 0a 20 20 20 20 20 47 52 4f 55 50 20 42 59   a.     GROUP BY
2260: 20 61 2e 78 0a 20 20 20 20 20 48 41 56 49 4e 47   a.x.     HAVING
2270: 20 4e 4f 54 20 45 58 49 53 54 53 28 20 53 45 4c   NOT EXISTS( SEL
2280: 45 43 54 20 62 2e 78 2c 20 61 76 67 28 62 2e 79  ECT b.x, avg(b.y
2290: 29 20 41 53 20 61 76 67 32 0a 20 20 20 20 20 20  ) AS avg2.      
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 20 20 46 52 4f 4d 20 74 33 34 20 41 53 20      FROM t34 AS 
22c0: 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b.              
22d0: 20 20 20 20 20 20 20 20 20 20 20 47 52 4f 55 50             GROUP
22e0: 20 42 59 20 62 2e 78 0a 20 20 20 20 20 20 20 20   BY b.x.        
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 48 41 56 49 4e 47 20 61 76 67 31 20 3e 20 61   HAVING avg1 > a
2310: 76 67 32 29 3b 0a 20 20 7d 0a 7d 20 7b 31 30 37  vg2);.  }.} {107
2320: 20 34 2e 30 7d 0a 64 6f 5f 74 65 73 74 20 73 75   4.0}.do_test su
2330: 62 71 75 65 72 79 2d 33 2e 34 2e 33 20 7b 0a 20  bquery-3.4.3 {. 
2340: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
2350: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 61 2e 78  ELECT.       a.x
2360: 2c 0a 20 20 20 20 20 20 20 61 76 67 28 61 2e 79  ,.       avg(a.y
2370: 29 2c 0a 20 20 20 20 20 20 20 4e 4f 54 20 45 58  ),.       NOT EX
2380: 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 62 2e  ISTS ( SELECT b.
2390: 78 2c 20 61 76 67 28 62 2e 79 29 0a 20 20 20 20  x, avg(b.y).    
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b0: 20 20 46 52 4f 4d 20 74 33 34 20 41 53 20 62 0a    FROM t34 AS b.
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 20 20 20 20 20 20 47 52 4f 55 50 20 42 59 20 62        GROUP BY b
23e0: 2e 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  .x.             
23f0: 20 20 20 20 20 20 20 20 48 41 56 49 4e 47 20 61          HAVING a
2400: 76 67 28 61 2e 79 29 20 3e 20 61 76 67 28 62 2e  vg(a.y) > avg(b.
2410: 79 29 29 2c 0a 20 20 20 20 20 20 20 45 58 49 53  y)),.       EXIS
2420: 54 53 20 28 20 53 45 4c 45 43 54 20 63 2e 78 2c  TS ( SELECT c.x,
2430: 20 61 76 67 28 63 2e 79 29 0a 20 20 20 20 20 20   avg(c.y).      
2440: 20 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d              FROM
2450: 20 74 33 34 20 41 53 20 63 0a 20 20 20 20 20 20   t34 AS c.      
2460: 20 20 20 20 20 20 20 20 20 20 20 20 47 52 4f 55              GROU
2470: 50 20 42 59 20 63 2e 78 0a 20 20 20 20 20 20 20  P BY c.x.       
2480: 20 20 20 20 20 20 20 20 20 20 48 41 56 49 4e 47            HAVING
2490: 20 61 76 67 28 61 2e 79 29 20 3e 20 61 76 67 28   avg(a.y) > avg(
24a0: 63 2e 79 29 29 0a 20 20 20 20 20 20 46 52 4f 4d  c.y)).      FROM
24b0: 20 74 33 34 20 41 53 20 61 0a 20 20 20 20 20 47   t34 AS a.     G
24c0: 52 4f 55 50 20 42 59 20 61 2e 78 0a 20 20 20 20  ROUP BY a.x.    
24d0: 20 4f 52 44 45 52 20 42 59 20 61 2e 78 3b 0a 20   ORDER BY a.x;. 
24e0: 20 7d 0a 7d 20 7b 31 30 36 20 34 2e 35 20 30 20   }.} {106 4.5 0 
24f0: 31 20 31 30 37 20 34 2e 30 20 31 20 30 7d 0a 0a  1 107 4.0 1 0}..
2500: 64 6f 5f 74 65 73 74 20 73 75 62 71 75 65 72 79  do_test subquery
2510: 2d 33 2e 35 2e 31 20 7b 0a 20 20 65 78 65 63 73  -3.5.1 {.  execs
2520: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
2530: 54 41 42 4c 45 20 74 33 35 61 28 78 29 3b 20 49  TABLE t35a(x); I
2540: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 35 61 20  NSERT INTO t35a 
2550: 56 41 4c 55 45 53 28 31 29 2c 28 32 29 2c 28 33  VALUES(1),(2),(3
2560: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
2570: 42 4c 45 20 74 33 35 62 28 79 29 3b 20 49 4e 53  BLE t35b(y); INS
2580: 45 52 54 20 49 4e 54 4f 20 74 33 35 62 20 56 41  ERT INTO t35b VA
2590: 4c 55 45 53 28 39 38 29 2c 20 28 39 39 29 3b 0a  LUES(98), (99);.
25a0: 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 28      SELECT max((
25b0: 53 45 4c 45 43 54 20 61 76 67 28 79 29 20 46 52  SELECT avg(y) FR
25c0: 4f 4d 20 74 33 35 62 29 29 20 46 52 4f 4d 20 74  OM t35b)) FROM t
25d0: 33 35 61 3b 0a 20 20 7d 0a 7d 20 7b 39 38 2e 35  35a;.  }.} {98.5
25e0: 7d 0a 64 6f 5f 74 65 73 74 20 73 75 62 71 75 65  }.do_test subque
25f0: 72 79 2d 33 2e 35 2e 32 20 7b 0a 20 20 65 78 65  ry-3.5.2 {.  exe
2600: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2610: 54 20 6d 61 78 28 28 53 45 4c 45 43 54 20 63 6f  T max((SELECT co
2620: 75 6e 74 28 79 29 20 46 52 4f 4d 20 74 33 35 62  unt(y) FROM t35b
2630: 29 29 20 46 52 4f 4d 20 74 33 35 61 3b 0a 20 20  )) FROM t35a;.  
2640: 7d 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74 20  }.} {2}.do_test 
2650: 73 75 62 71 75 65 72 79 2d 33 2e 35 2e 33 20 7b  subquery-3.5.3 {
2660: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2670: 20 53 45 4c 45 43 54 20 6d 61 78 28 28 53 45 4c   SELECT max((SEL
2680: 45 43 54 20 63 6f 75 6e 74 28 29 20 46 52 4f 4d  ECT count() FROM
2690: 20 74 33 35 62 29 29 20 46 52 4f 4d 20 74 33 35   t35b)) FROM t35
26a0: 61 3b 0a 20 20 7d 0a 7d 20 7b 32 7d 0a 64 6f 5f  a;.  }.} {2}.do_
26b0: 74 65 73 74 20 73 75 62 71 75 65 72 79 2d 33 2e  test subquery-3.
26c0: 35 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  5.4 {.  catchsql
26d0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6d 61   {.    SELECT ma
26e0: 78 28 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  x((SELECT count(
26f0: 78 29 20 46 52 4f 4d 20 74 33 35 62 29 29 20 46  x) FROM t35b)) F
2700: 52 4f 4d 20 74 33 35 61 3b 0a 20 20 7d 0a 7d 20  ROM t35a;.  }.} 
2710: 7b 31 20 7b 6d 69 73 75 73 65 20 6f 66 20 61 67  {1 {misuse of ag
2720: 67 72 65 67 61 74 65 3a 20 63 6f 75 6e 74 28 29  gregate: count()
2730: 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 75 62 71 75  }}.do_test subqu
2740: 65 72 79 2d 33 2e 35 2e 35 20 7b 0a 20 20 63 61  ery-3.5.5 {.  ca
2750: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
2760: 45 43 54 20 6d 61 78 28 28 53 45 4c 45 43 54 20  ECT max((SELECT 
2770: 63 6f 75 6e 74 28 78 29 20 46 52 4f 4d 20 74 33  count(x) FROM t3
2780: 35 62 29 29 20 46 52 4f 4d 20 74 33 35 61 3b 0a  5b)) FROM t35a;.
2790: 20 20 7d 0a 7d 20 7b 31 20 7b 6d 69 73 75 73 65    }.} {1 {misuse
27a0: 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 63   of aggregate: c
27b0: 6f 75 6e 74 28 29 7d 7d 0a 64 6f 5f 74 65 73 74  ount()}}.do_test
27c0: 20 73 75 62 71 75 65 72 79 2d 33 2e 35 2e 36 20   subquery-3.5.6 
27d0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
27e0: 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 28 53     SELECT max((S
27f0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
2800: 4c 45 43 54 20 63 6f 75 6e 74 28 78 29 20 41 53  LECT count(x) AS
2810: 20 61 20 46 52 4f 4d 20 74 33 35 62 29 29 29 20   a FROM t35b))) 
2820: 46 52 4f 4d 20 74 33 35 61 3b 0a 20 20 7d 0a 7d  FROM t35a;.  }.}
2830: 20 7b 31 20 7b 6d 69 73 75 73 65 20 6f 66 20 61   {1 {misuse of a
2840: 67 67 72 65 67 61 74 65 3a 20 63 6f 75 6e 74 28  ggregate: count(
2850: 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 73 75 62 71  )}}.do_test subq
2860: 75 65 72 79 2d 33 2e 35 2e 37 20 7b 0a 20 20 65  uery-3.5.7 {.  e
2870: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
2880: 45 43 54 20 6d 61 78 28 28 53 45 4c 45 43 54 20  ECT max((SELECT 
2890: 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  a FROM (SELECT c
28a0: 6f 75 6e 74 28 79 29 20 41 53 20 61 20 46 52 4f  ount(y) AS a FRO
28b0: 4d 20 74 33 35 62 29 29 29 20 46 52 4f 4d 20 74  M t35b))) FROM t
28c0: 33 35 61 3b 0a 20 20 7d 0a 7d 20 7b 32 7d 0a 0a  35a;.  }.} {2}..
28d0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
28e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2910: 2d 2d 2d 2d 0a 23 20 54 68 65 73 65 20 74 65 73  ----.# These tes
2920: 74 73 20 2d 20 73 75 62 71 75 65 72 79 2d 34 2e  ts - subquery-4.
2930: 2a 20 2d 20 75 73 65 20 74 68 65 20 54 43 4c 20  * - use the TCL 
2940: 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20  statement cache 
2950: 74 6f 20 74 72 79 20 0a 23 20 61 6e 64 20 65 78  to try .# and ex
2960: 70 6f 73 65 20 62 75 67 73 20 74 6f 20 64 6f 20  pose bugs to do 
2970: 77 69 74 68 20 72 65 2d 75 73 69 6e 67 20 73 74  with re-using st
2980: 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 68 61  atements that ha
2990: 76 65 20 62 65 65 6e 20 0a 23 20 70 61 73 73 65  ve been .# passe
29a0: 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 73  d to sqlite3_res
29b0: 65 74 28 29 2e 0a 23 0a 23 20 4f 6e 65 20 70 72  et()..#.# One pr
29c0: 6f 62 6c 65 6d 20 77 61 73 20 74 68 61 74 20 56  oblem was that V
29d0: 44 42 45 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  DBE memory cells
29e0: 20 77 65 72 65 20 6e 6f 74 20 62 65 69 6e 67 20   were not being 
29f0: 69 6e 69 74 69 61 6c 69 7a 65 64 0a 23 20 74 6f  initialized.# to
2a00: 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 73 65 63   NULL on the sec
2a10: 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ond and subseque
2a20: 6e 74 20 65 78 65 63 75 74 69 6f 6e 73 2e 0a 23  nt executions..#
2a30: 0a 64 6f 5f 74 65 73 74 20 73 75 62 71 75 65 72  .do_test subquer
2a40: 79 2d 34 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63  y-4.1.1 {.  exec
2a50: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
2a60: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
2a70: 74 31 29 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64  t1);.  }.} {1}.d
2a80: 6f 5f 74 65 73 74 20 73 75 62 71 75 65 72 79 2d  o_test subquery-
2a90: 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.2 {.  execsql 
2aa0: 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
2ab0: 4d 20 74 31 3b 0a 20 20 20 20 53 45 4c 45 43 54  M t1;.    SELECT
2ac0: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
2ad0: 74 31 29 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 7d 0a  t1);.  }.} {{}}.
2ae0: 64 6f 5f 74 65 73 74 20 73 75 62 71 75 65 72 79  do_test subquery
2af0: 2d 34 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73  -4.2.1 {.  execs
2b00: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
2b10: 54 41 42 4c 45 20 74 33 28 61 20 50 52 49 4d 41  TABLE t3(a PRIMA
2b20: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53  RY KEY);.    INS
2b30: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
2b40: 45 53 28 31 30 29 3b 0a 20 20 7d 0a 20 20 65 78  ES(10);.  }.  ex
2b50: 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e  ecsql {INSERT IN
2b60: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 28 53 45  TO t3 VALUES((SE
2b70: 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d  LECT max(a) FROM
2b80: 20 74 33 29 2b 31 29 7d 0a 7d 20 7b 7d 0a 64 6f   t3)+1)}.} {}.do
2b90: 5f 74 65 73 74 20 73 75 62 71 75 65 72 79 2d 34  _test subquery-4
2ba0: 2e 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .2.2 {.  execsql
2bb0: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33   {INSERT INTO t3
2bc0: 20 56 41 4c 55 45 53 28 28 53 45 4c 45 43 54 20   VALUES((SELECT 
2bd0: 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 33 29 2b  max(a) FROM t3)+
2be0: 31 29 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d  1)}.} {}..#-----
2bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
2c30: 54 68 65 20 73 75 62 71 75 65 72 79 2d 35 2e 2a  The subquery-5.*
2c40: 20 74 65 73 74 73 20 6d 61 6b 65 20 73 75 72 65   tests make sure
2c50: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73   string literals
2c60: 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65   in double-quote
2c70: 73 0a 23 20 61 72 65 20 68 61 6e 64 6c 65 64 20  s.# are handled 
2c80: 65 66 66 69 63 69 65 6e 74 6c 79 2e 20 20 44 6f  efficiently.  Do
2c90: 75 62 6c 65 2d 71 75 6f 74 65 20 6c 69 74 65 72  uble-quote liter
2ca0: 61 6c 73 20 61 72 65 20 66 69 72 73 74 20 63 68  als are first ch
2cb0: 65 63 6b 65 64 0a 23 20 74 6f 20 73 65 65 20 69  ecked.# to see i
2cc0: 66 20 74 68 65 79 20 6d 61 74 63 68 20 61 6e 79  f they match any
2cd0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
2ce0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  If there is not 
2cf0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 23 20 6d 61  column name.# ma
2d00: 74 63 68 20 74 68 65 6e 20 74 68 6f 73 65 20 6c  tch then those l
2d10: 69 74 65 72 61 6c 73 20 61 72 65 20 75 73 65 64  iterals are used
2d20: 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61   a string consta
2d30: 6e 74 73 2e 20 20 57 68 65 6e 20 61 0a 23 20 64  nts.  When a.# d
2d40: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
2d50: 69 6e 67 20 61 70 70 65 61 72 73 2c 20 77 65 20  ing appears, we 
2d60: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 73 75 72  want to make sur
2d70: 65 20 74 68 61 74 20 74 68 65 20 73 65 61 72 63  e that the searc
2d80: 68 0a 23 20 66 6f 72 20 61 20 6d 61 74 63 68 69  h.# for a matchi
2d90: 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 64  ng column name d
2da0: 69 64 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 20  id not cause an 
2db0: 6f 74 68 65 72 77 69 73 65 20 73 74 61 74 69 63  otherwise static
2dc0: 20 73 75 62 71 75 65 72 79 0a 23 20 74 6f 20 62   subquery.# to b
2dd0: 65 63 6f 6d 65 20 61 20 64 79 6e 61 6d 69 63 20  ecome a dynamic 
2de0: 28 63 6f 72 72 65 6c 61 74 65 64 29 20 73 75 62  (correlated) sub
2df0: 71 75 65 72 79 2e 0a 23 0a 64 6f 5f 74 65 73 74  query..#.do_test
2e00: 20 73 75 62 71 75 65 72 79 2d 35 2e 31 20 7b 0a   subquery-5.1 {.
2e10: 20 20 70 72 6f 63 20 63 61 6c 6c 63 6e 74 70 72    proc callcntpr
2e20: 6f 63 20 7b 6e 7d 20 7b 0a 20 20 20 20 69 6e 63  oc {n} {.    inc
2e30: 72 20 3a 3a 63 61 6c 6c 63 6e 74 0a 20 20 20 20  r ::callcnt.    
2e40: 72 65 74 75 72 6e 20 24 6e 0a 20 20 7d 0a 20 20  return $n.  }.  
2e50: 73 65 74 20 63 61 6c 6c 63 6e 74 20 30 0a 20 20  set callcnt 0.  
2e60: 64 62 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  db function call
2e70: 63 6e 74 20 63 61 6c 6c 63 6e 74 70 72 6f 63 0a  cnt callcntproc.
2e80: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2e90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28  CREATE TABLE t4(
2ea0: 78 2c 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  x,y);.    INSERT
2eb0: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
2ec0: 27 6f 6e 65 27 2c 31 29 3b 0a 20 20 20 20 49 4e  'one',1);.    IN
2ed0: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
2ee0: 55 45 53 28 27 74 77 6f 27 2c 32 29 3b 0a 20 20  UES('two',2);.  
2ef0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
2f00: 20 56 41 4c 55 45 53 28 27 74 68 72 65 65 27 2c   VALUES('three',
2f10: 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  3);.    INSERT I
2f20: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27 66  NTO t4 VALUES('f
2f30: 6f 75 72 27 2c 34 29 3b 0a 20 20 20 20 43 52 45  our',4);.    CRE
2f40: 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c 62  ATE TABLE t5(a,b
2f50: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2f60: 54 4f 20 74 35 20 56 41 4c 55 45 53 28 31 2c 31  TO t5 VALUES(1,1
2f70: 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1);.    INSERT I
2f80: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 32 2c  NTO t5 VALUES(2,
2f90: 32 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  22);.    INSERT 
2fa0: 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 33  INTO t5 VALUES(3
2fb0: 2c 33 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ,33);.    INSERT
2fc0: 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28   INTO t5 VALUES(
2fd0: 34 2c 34 34 29 3b 0a 20 20 20 20 53 45 4c 45 43  4,44);.    SELEC
2fe0: 54 20 62 20 46 52 4f 4d 20 74 35 20 57 48 45 52  T b FROM t5 WHER
2ff0: 45 20 61 20 49 4e 20 0a 20 20 20 20 20 20 20 28  E a IN .       (
3000: 53 45 4c 45 43 54 20 63 61 6c 6c 63 6e 74 28 79  SELECT callcnt(y
3010: 29 2b 30 20 46 52 4f 4d 20 74 34 20 57 48 45 52  )+0 FROM t4 WHER
3020: 45 20 78 3d 22 74 77 6f 22 29 0a 20 20 7d 0a 7d  E x="two").  }.}
3030: 20 7b 32 32 7d 0a 64 6f 5f 74 65 73 74 20 73 75   {22}.do_test su
3040: 62 71 75 65 72 79 2d 35 2e 32 20 7b 0a 20 20 23  bquery-5.2 {.  #
3050: 20 54 68 69 73 20 69 73 20 74 68 65 20 6b 65 79   This is the key
3060: 20 74 65 73 74 2e 20 20 54 68 65 20 73 75 62 71   test.  The subq
3070: 75 65 72 79 20 73 68 6f 75 6c 64 20 68 61 76 65  uery should have
3080: 20 6f 6e 6c 79 20 72 75 6e 20 6f 6e 63 65 2e 20   only run once. 
3090: 20 49 66 0a 20 20 23 20 54 68 65 20 64 6f 75 62   If.  # The doub
30a0: 6c 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69  le-quoted identi
30b0: 66 69 65 72 20 22 74 77 6f 22 20 77 65 72 65 20  fier "two" were 
30c0: 63 61 75 73 69 6e 67 20 74 68 65 20 73 75 62 71  causing the subq
30d0: 75 65 72 79 20 74 6f 20 62 65 0a 20 20 23 20 70  uery to be.  # p
30e0: 72 6f 63 65 73 73 65 64 20 61 73 20 61 20 63 6f  rocessed as a co
30f0: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
3100: 79 2c 20 74 68 65 6e 20 69 74 20 77 6f 75 6c 64  y, then it would
3110: 20 68 61 76 65 20 72 75 6e 20 34 20 74 69 6d 65   have run 4 time
3120: 73 2e 0a 20 20 73 65 74 20 63 61 6c 6c 63 6e 74  s..  set callcnt
3130: 0a 7d 20 7b 31 7d 0a 0a 0a 23 20 54 69 63 6b 65  .} {1}...# Ticke
3140: 74 20 23 31 33 38 30 2e 20 20 4d 61 6b 65 20 73  t #1380.  Make s
3150: 75 72 65 20 63 6f 72 72 65 6c 61 74 65 64 20 73  ure correlated s
3160: 75 62 71 75 65 72 69 65 73 20 6f 6e 20 61 6e 20  ubqueries on an 
3170: 49 4e 20 63 6c 61 75 73 65 20 77 6f 72 6b 0a 23  IN clause work.#
3180: 20 63 6f 72 72 65 63 74 6c 79 20 77 68 65 6e 20   correctly when 
3190: 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69  the left-hand si
31a0: 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
31b0: 72 61 74 6f 72 20 69 73 20 63 6f 6e 73 74 61 6e  rator is constan
31c0: 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 73 75 62  t..#.do_test sub
31d0: 71 75 65 72 79 2d 36 2e 31 20 7b 0a 20 20 73 65  query-6.1 {.  se
31e0: 74 20 63 61 6c 6c 63 6e 74 20 30 0a 20 20 65 78  t callcnt 0.  ex
31f0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
3200: 43 54 20 78 20 46 52 4f 4d 20 74 34 20 57 48 45  CT x FROM t4 WHE
3210: 52 45 20 31 20 49 4e 20 28 53 45 4c 45 43 54 20  RE 1 IN (SELECT 
3220: 63 61 6c 6c 63 6e 74 28 63 6f 75 6e 74 28 2a 29  callcnt(count(*)
3230: 29 20 46 52 4f 4d 20 74 35 20 57 48 45 52 45 20  ) FROM t5 WHERE 
3240: 61 3d 79 29 0a 20 20 7d 0a 7d 20 7b 6f 6e 65 20  a=y).  }.} {one 
3250: 74 77 6f 20 74 68 72 65 65 20 66 6f 75 72 7d 0a  two three four}.
3260: 64 6f 5f 74 65 73 74 20 73 75 62 71 75 65 72 79  do_test subquery
3270: 2d 36 2e 32 20 7b 0a 20 20 73 65 74 20 63 61 6c  -6.2 {.  set cal
3280: 6c 63 6e 74 0a 7d 20 7b 34 7d 0a 64 6f 5f 74 65  lcnt.} {4}.do_te
3290: 73 74 20 73 75 62 71 75 65 72 79 2d 36 2e 33 20  st subquery-6.3 
32a0: 7b 0a 20 20 73 65 74 20 63 61 6c 6c 63 6e 74 20  {.  set callcnt 
32b0: 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  0.  execsql {.  
32c0: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
32d0: 74 34 20 57 48 45 52 45 20 31 20 49 4e 20 28 53  t4 WHERE 1 IN (S
32e0: 45 4c 45 43 54 20 63 61 6c 6c 63 6e 74 28 63 6f  ELECT callcnt(co
32f0: 75 6e 74 28 2a 29 29 20 46 52 4f 4d 20 74 35 20  unt(*)) FROM t5 
3300: 57 48 45 52 45 20 61 3d 31 29 0a 20 20 7d 0a 7d  WHERE a=1).  }.}
3310: 20 7b 6f 6e 65 20 74 77 6f 20 74 68 72 65 65 20   {one two three 
3320: 66 6f 75 72 7d 0a 64 6f 5f 74 65 73 74 20 73 75  four}.do_test su
3330: 62 71 75 65 72 79 2d 36 2e 34 20 7b 0a 20 20 73  bquery-6.4 {.  s
3340: 65 74 20 63 61 6c 6c 63 6e 74 0a 7d 20 7b 31 7d  et callcnt.} {1}
3350: 0a 0a 69 66 20 30 20 7b 20 20 20 23 23 23 23 23  ..if 0 {   #####
3360: 23 23 23 23 23 23 23 23 20 20 64 69 73 61 62 6c  ########  disabl
3370: 65 20 75 6e 74 69 6c 20 77 65 20 67 65 74 20 23  e until we get #
3380: 32 36 35 32 20 66 69 78 65 64 0a 23 20 54 69 63  2652 fixed.# Tic
3390: 6b 65 74 20 23 32 36 35 32 2e 20 20 41 6c 6c 6f  ket #2652.  Allo
33a0: 77 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  w aggregate func
33b0: 74 69 6f 6e 73 20 6f 66 20 6f 75 74 65 72 20 71  tions of outer q
33c0: 75 65 72 69 65 73 20 69 6e 73 69 64 65 0a 23 20  ueries inside.# 
33d0: 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  a non-aggregate 
33e0: 73 75 62 71 75 65 72 79 2e 0a 23 0a 64 6f 5f 74  subquery..#.do_t
33f0: 65 73 74 20 73 75 62 71 75 65 72 79 2d 37 2e 31  est subquery-7.1
3400: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
3410: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
3420: 74 37 28 63 37 29 3b 0a 20 20 20 20 49 4e 53 45  t7(c7);.    INSE
3430: 52 54 20 49 4e 54 4f 20 74 37 20 56 41 4c 55 45  RT INTO t7 VALUE
3440: 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  S(1);.    INSERT
3450: 20 49 4e 54 4f 20 74 37 20 56 41 4c 55 45 53 28   INTO t7 VALUES(
3460: 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
3470: 4e 54 4f 20 74 37 20 56 41 4c 55 45 53 28 33 29  NTO t7 VALUES(3)
3480: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
3490: 4c 45 20 74 38 28 63 38 29 3b 0a 20 20 20 20 49  LE t8(c8);.    I
34a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 20 56 41  NSERT INTO t8 VA
34b0: 4c 55 45 53 28 31 30 30 29 3b 0a 20 20 20 20 49  LUES(100);.    I
34c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 20 56 41  NSERT INTO t8 VA
34d0: 4c 55 45 53 28 32 30 30 29 3b 0a 20 20 20 20 49  LUES(200);.    I
34e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 20 56 41  NSERT INTO t8 VA
34f0: 4c 55 45 53 28 33 30 30 29 3b 0a 20 20 20 20 43  LUES(300);.    C
3500: 52 45 41 54 45 20 54 41 42 4c 45 20 74 39 28 63  REATE TABLE t9(c
3510: 39 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  9);.    INSERT I
3520: 4e 54 4f 20 74 39 20 56 41 4c 55 45 53 28 31 30  NTO t9 VALUES(10
3530: 30 30 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  000);.    INSERT
3540: 20 49 4e 54 4f 20 74 39 20 56 41 4c 55 45 53 28   INTO t9 VALUES(
3550: 32 30 30 30 30 29 3b 0a 20 20 20 20 49 4e 53 45  20000);.    INSE
3560: 52 54 20 49 4e 54 4f 20 74 39 20 56 41 4c 55 45  RT INTO t9 VALUE
3570: 53 28 33 30 30 30 30 29 3b 0a 0a 20 20 20 20 53  S(30000);..    S
3580: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 37  ELECT (SELECT c7
3590: 2b 63 38 20 46 52 4f 4d 20 74 37 29 20 46 52 4f  +c8 FROM t7) FRO
35a0: 4d 20 74 38 3b 0a 20 20 7d 0a 7d 20 7b 31 30 31  M t8;.  }.} {101
35b0: 20 32 30 31 20 33 30 31 7d 0a 64 6f 5f 74 65 73   201 301}.do_tes
35c0: 74 20 73 75 62 71 75 65 72 79 2d 37 2e 32 20 7b  t subquery-7.2 {
35d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
35e0: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
35f0: 6d 61 78 28 63 37 29 2b 63 38 20 46 52 4f 4d 20  max(c7)+c8 FROM 
3600: 74 37 29 20 46 52 4f 4d 20 74 38 3b 0a 20 20 7d  t7) FROM t8;.  }
3610: 0a 7d 20 7b 31 30 33 20 32 30 33 20 33 30 33 7d  .} {103 203 303}
3620: 0a 64 6f 5f 74 65 73 74 20 73 75 62 71 75 65 72  .do_test subquer
3630: 79 2d 37 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  y-7.3 {.  execsq
3640: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 28  l {.    SELECT (
3650: 53 45 4c 45 43 54 20 63 37 2b 6d 61 78 28 63 38  SELECT c7+max(c8
3660: 29 20 46 52 4f 4d 20 74 38 29 20 46 52 4f 4d 20  ) FROM t8) FROM 
3670: 74 37 0a 20 20 7d 0a 7d 20 7b 33 30 31 7d 0a 64  t7.  }.} {301}.d
3680: 6f 5f 74 65 73 74 20 73 75 62 71 75 65 72 79 2d  o_test subquery-
3690: 37 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.4 {.  execsql 
36a0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 28 53 45  {.    SELECT (SE
36b0: 4c 45 43 54 20 6d 61 78 28 63 37 29 2b 6d 61 78  LECT max(c7)+max
36c0: 28 63 38 29 20 46 52 4f 4d 20 74 38 29 20 46 52  (c8) FROM t8) FR
36d0: 4f 4d 20 74 37 0a 20 20 7d 0a 7d 20 7b 33 30 33  OM t7.  }.} {303
36e0: 7d 0a 64 6f 5f 74 65 73 74 20 73 75 62 71 75 65  }.do_test subque
36f0: 72 79 2d 37 2e 35 20 7b 0a 20 20 65 78 65 63 73  ry-7.5 {.  execs
3700: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
3710: 28 53 45 4c 45 43 54 20 63 38 20 46 52 4f 4d 20  (SELECT c8 FROM 
3720: 74 38 20 57 48 45 52 45 20 72 6f 77 69 64 3d 6d  t8 WHERE rowid=m
3730: 61 78 28 63 37 29 29 20 46 52 4f 4d 20 74 37 0a  ax(c7)) FROM t7.
3740: 20 20 7d 0a 7d 20 7b 33 30 30 7d 0a 64 6f 5f 74    }.} {300}.do_t
3750: 65 73 74 20 73 75 62 71 75 65 72 79 2d 37 2e 36  est subquery-7.6
3760: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
3770: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
3780: 54 20 28 53 45 4c 45 43 54 20 6d 61 78 28 63 37  T (SELECT max(c7
3790: 2b 63 38 2b 63 39 29 20 46 52 4f 4d 20 74 39 29  +c8+c9) FROM t9)
37a0: 20 46 52 4f 4d 20 74 38 29 20 46 52 4f 4d 20 74   FROM t8) FROM t
37b0: 37 0a 20 20 7d 0a 7d 20 7b 33 30 31 30 31 20 33  7.  }.} {30101 3
37c0: 30 31 30 32 20 33 30 31 30 33 7d 0a 64 6f 5f 74  0102 30103}.do_t
37d0: 65 73 74 20 73 75 62 71 75 65 72 79 2d 37 2e 37  est subquery-7.7
37e0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
37f0: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
3800: 54 20 28 53 45 4c 45 43 54 20 63 37 2b 6d 61 78  T (SELECT c7+max
3810: 28 63 38 2b 63 39 29 20 46 52 4f 4d 20 74 39 29  (c8+c9) FROM t9)
3820: 20 46 52 4f 4d 20 74 38 29 20 46 52 4f 4d 20 74   FROM t8) FROM t
3830: 37 0a 20 20 7d 0a 7d 20 7b 33 30 31 30 31 20 33  7.  }.} {30101 3
3840: 30 31 30 32 20 33 30 31 30 33 7d 0a 64 6f 5f 74  0102 30103}.do_t
3850: 65 73 74 20 73 75 62 71 75 65 72 79 2d 37 2e 38  est subquery-7.8
3860: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
3870: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
3880: 54 20 28 53 45 4c 45 43 54 20 6d 61 78 28 63 37  T (SELECT max(c7
3890: 29 2b 63 38 2b 63 39 20 46 52 4f 4d 20 74 39 29  )+c8+c9 FROM t9)
38a0: 20 46 52 4f 4d 20 74 38 29 20 46 52 4f 4d 20 74   FROM t8) FROM t
38b0: 37 0a 20 20 7d 0a 7d 20 7b 31 30 31 30 33 7d 0a  7.  }.} {10103}.
38c0: 64 6f 5f 74 65 73 74 20 73 75 62 71 75 65 72 79  do_test subquery
38d0: 2d 37 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c  -7.9 {.  execsql
38e0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 28 53   {.    SELECT (S
38f0: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 37  ELECT (SELECT c7
3900: 2b 6d 61 78 28 63 38 29 2b 63 39 20 46 52 4f 4d  +max(c8)+c9 FROM
3910: 20 74 39 29 20 46 52 4f 4d 20 74 38 29 20 46 52   t9) FROM t8) FR
3920: 4f 4d 20 74 37 0a 20 20 7d 0a 7d 20 7b 31 30 33  OM t7.  }.} {103
3930: 30 31 20 31 30 33 30 32 20 31 30 33 30 33 7d 0a  01 10302 10303}.
3940: 64 6f 5f 74 65 73 74 20 73 75 62 71 75 65 72 79  do_test subquery
3950: 2d 37 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71  -7.10 {.  execsq
3960: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 28  l {.    SELECT (
3970: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
3980: 37 2b 63 38 2b 6d 61 78 28 63 39 29 20 46 52 4f  7+c8+max(c9) FRO
3990: 4d 20 74 39 29 20 46 52 4f 4d 20 74 38 29 20 46  M t9) FROM t8) F
39a0: 52 4f 4d 20 74 37 0a 20 20 7d 0a 7d 20 7b 33 30  ROM t7.  }.} {30
39b0: 31 30 31 20 33 30 31 30 32 20 33 30 31 30 33 7d  101 30102 30103}
39c0: 0a 64 6f 5f 74 65 73 74 20 73 75 62 71 75 65 72  .do_test subquer
39d0: 79 2d 37 2e 31 31 20 7b 0a 20 20 65 78 65 63 73  y-7.11 {.  execs
39e0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
39f0: 28 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20  (SELECT (SELECT 
3a00: 6d 61 78 28 63 37 29 2b 6d 61 78 28 63 38 29 2b  max(c7)+max(c8)+
3a10: 6d 61 78 28 63 39 29 20 46 52 4f 4d 20 74 39 29  max(c9) FROM t9)
3a20: 20 46 52 4f 4d 20 74 38 29 20 46 52 4f 4d 20 74   FROM t8) FROM t
3a30: 37 0a 20 20 7d 0a 7d 20 7b 33 30 33 30 33 7d 0a  7.  }.} {30303}.
3a40: 7d 20 20 3b 23 23 23 23 23 23 23 23 23 23 23 23  }  ;############
3a50: 23 20 44 69 73 61 62 6c 65 64 0a 0a 23 20 32 30  # Disabled..# 20
3a60: 31 35 2d 30 34 2d 32 31 2e 0a 23 20 56 65 72 69  15-04-21..# Veri
3a70: 66 79 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79  fy that a memory
3a80: 20 6c 65 61 6b 20 69 6e 20 74 68 65 20 74 61 62   leak in the tab
3a90: 6c 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 61  le column type a
3aa0: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 61 6e 61  nd collation ana
3ab0: 6c 79 73 69 73 0a 23 20 69 73 20 70 6c 75 67 67  lysis.# is plugg
3ac0: 65 64 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ed..#.do_execsql
3ad0: 5f 74 65 73 74 20 73 75 62 71 75 65 72 79 2d 38  _test subquery-8
3ae0: 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .1 {.  CREATE TA
3af0: 42 4c 45 20 74 38 28 61 20 54 45 58 54 2c 20 62  BLE t8(a TEXT, b
3b00: 20 49 4e 54 29 3b 0a 20 20 53 45 4c 45 43 54 20   INT);.  SELECT 
3b10: 28 53 45 4c 45 43 54 20 30 20 46 52 4f 4d 20 28  (SELECT 0 FROM (
3b20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3b30: 29 29 20 41 53 20 78 20 57 48 45 52 45 20 78 3b  )) AS x WHERE x;
3b40: 0a 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43  .  SELECT (SELEC
3b50: 54 20 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T 0 FROM (SELECT
3b60: 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
3b70: 30 29 29 29 20 41 53 20 78 20 57 48 45 52 45 20  0))) AS x WHERE 
3b80: 78 3b 0a 7d 20 7b 7d 0a 0a 66 69 6e 69 73 68 5f  x;.} {}..finish_
3b90: 74 65 73 74 0a                                   test.