/ Hex Artifact Content
Login

Artifact 6194a899cdbba561d0439c0d6cc7bcdf4fc413e7:


0000: 23 20 32 30 31 33 2d 30 34 2d 32 35 0a 23 0a 23  # 2013-04-25.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u 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 0a 23 20 0a 23 20 54 65 73 74 20 63 61 73  **.# .# Test cas
0170: 65 73 20 66 6f 72 20 74 72 61 6e 73 69 74 69 76  es for transitiv
0180: 65 5f 63 6c 6f 73 75 72 65 20 76 69 72 74 75 61  e_closure virtua
0190: 6c 20 74 61 62 6c 65 2e 0a 0a 73 65 74 20 74 65  l table...set te
01a0: 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e  stdir [file dirn
01b0: 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72  ame $argv0].sour
01c0: 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74  ce $testdir/test
01d0: 65 72 2e 74 63 6c 0a 73 65 74 20 74 65 73 74 70  er.tcl.set testp
01e0: 72 65 66 69 78 20 63 6c 6f 73 75 72 65 30 31 0a  refix closure01.
01f0: 0a 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65 78 74  .load_static_ext
0200: 65 6e 73 69 6f 6e 20 64 62 20 63 6c 6f 73 75 72  ension db closur
0210: 65 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  e..do_execsql_te
0220: 73 74 20 31 2e 30 20 7b 0a 20 20 42 45 47 49 4e  st 1.0 {.  BEGIN
0230: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
0240: 20 74 31 28 78 20 49 4e 54 45 47 45 52 20 50 52   t1(x INTEGER PR
0250: 49 4d 41 52 59 20 4b 45 59 2c 20 79 20 49 4e 54  IMARY KEY, y INT
0260: 45 47 45 52 29 3b 0a 20 20 43 52 45 41 54 45 20  EGER);.  CREATE 
0270: 49 4e 44 45 58 20 74 31 79 20 4f 4e 20 74 31 28  INDEX t1y ON t1(
0280: 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  y);.  INSERT INT
0290: 4f 20 74 31 28 78 29 20 56 41 4c 55 45 53 28 31  O t1(x) VALUES(1
02a0: 29 2c 28 32 29 3b 0a 20 20 49 4e 53 45 52 54 20  ),(2);.  INSERT 
02b0: 49 4e 54 4f 20 74 31 28 78 29 20 53 45 4c 45 43  INTO t1(x) SELEC
02c0: 54 20 78 2b 32 20 46 52 4f 4d 20 74 31 3b 0a 20  T x+2 FROM t1;. 
02d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
02e0: 78 29 20 53 45 4c 45 43 54 20 78 2b 34 20 46 52  x) SELECT x+4 FR
02f0: 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52 54 20  OM t1;.  INSERT 
0300: 49 4e 54 4f 20 74 31 28 78 29 20 53 45 4c 45 43  INTO t1(x) SELEC
0310: 54 20 78 2b 38 20 46 52 4f 4d 20 74 31 3b 0a 20  T x+8 FROM t1;. 
0320: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
0330: 78 29 20 53 45 4c 45 43 54 20 78 2b 31 36 20 46  x) SELECT x+16 F
0340: 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52 54  ROM t1;.  INSERT
0350: 20 49 4e 54 4f 20 74 31 28 78 29 20 53 45 4c 45   INTO t1(x) SELE
0360: 43 54 20 78 2b 33 32 20 46 52 4f 4d 20 74 31 3b  CT x+32 FROM t1;
0370: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0380: 31 28 78 29 20 53 45 4c 45 43 54 20 78 2b 36 34  1(x) SELECT x+64
0390: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45   FROM t1;.  INSE
03a0: 52 54 20 49 4e 54 4f 20 74 31 28 78 29 20 53 45  RT INTO t1(x) SE
03b0: 4c 45 43 54 20 78 2b 31 32 38 20 46 52 4f 4d 20  LECT x+128 FROM 
03c0: 74 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  t1;.  INSERT INT
03d0: 4f 20 74 31 28 78 29 20 53 45 4c 45 43 54 20 78  O t1(x) SELECT x
03e0: 2b 32 35 36 20 46 52 4f 4d 20 74 31 3b 0a 20 20  +256 FROM t1;.  
03f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 78  INSERT INTO t1(x
0400: 29 20 53 45 4c 45 43 54 20 78 2b 35 31 32 20 46  ) SELECT x+512 F
0410: 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52 54  ROM t1;.  INSERT
0420: 20 49 4e 54 4f 20 74 31 28 78 29 20 53 45 4c 45   INTO t1(x) SELE
0430: 43 54 20 78 2b 31 30 32 34 20 46 52 4f 4d 20 74  CT x+1024 FROM t
0440: 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  1;.  INSERT INTO
0450: 20 74 31 28 78 29 20 53 45 4c 45 43 54 20 78 2b   t1(x) SELECT x+
0460: 32 30 34 38 20 46 52 4f 4d 20 74 31 3b 0a 20 20  2048 FROM t1;.  
0470: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 78  INSERT INTO t1(x
0480: 29 20 53 45 4c 45 43 54 20 78 2b 34 30 39 36 20  ) SELECT x+4096 
0490: 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52  FROM t1;.  INSER
04a0: 54 20 49 4e 54 4f 20 74 31 28 78 29 20 53 45 4c  T INTO t1(x) SEL
04b0: 45 43 54 20 78 2b 38 31 39 32 20 46 52 4f 4d 20  ECT x+8192 FROM 
04c0: 74 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  t1;.  INSERT INT
04d0: 4f 20 74 31 28 78 29 20 53 45 4c 45 43 54 20 78  O t1(x) SELECT x
04e0: 2b 31 36 33 38 34 20 46 52 4f 4d 20 74 31 3b 0a  +16384 FROM t1;.
04f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0500: 28 78 29 20 53 45 4c 45 43 54 20 78 2b 33 32 37  (x) SELECT x+327
0510: 36 38 20 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e  68 FROM t1;.  IN
0520: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 78 29 20  SERT INTO t1(x) 
0530: 53 45 4c 45 43 54 20 78 2b 36 35 35 33 36 20 46  SELECT x+65536 F
0540: 52 4f 4d 20 74 31 3b 0a 20 20 55 50 44 41 54 45  ROM t1;.  UPDATE
0550: 20 74 31 20 53 45 54 20 79 3d 78 2f 32 20 57 48   t1 SET y=x/2 WH
0560: 45 52 45 20 78 3e 31 3b 0a 20 20 43 4f 4d 4d 49  ERE x>1;.  COMMI
0570: 54 3b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  T;.  CREATE VIRT
0580: 55 41 4c 20 54 41 42 4c 45 20 63 78 20 0a 20 20  UAL TABLE cx .  
0590: 20 55 53 49 4e 47 20 74 72 61 6e 73 69 74 69 76   USING transitiv
05a0: 65 5f 63 6c 6f 73 75 72 65 28 74 61 62 6c 65 6e  e_closure(tablen
05b0: 61 6d 65 3d 74 31 2c 20 69 64 63 6f 6c 75 6d 6e  ame=t1, idcolumn
05c0: 3d 78 2c 20 70 61 72 65 6e 74 63 6f 6c 75 6d 6e  =x, parentcolumn
05d0: 3d 79 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 54 68 65  =y);.} {}..# The
05e0: 20 65 6e 74 69 72 65 20 74 61 62 6c 65 0a 64 6f   entire table.do
05f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
0600: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75  1 {.  SELECT cou
0610: 6e 74 28 2a 29 2c 20 64 65 70 74 68 20 46 52 4f  nt(*), depth FRO
0620: 4d 20 63 78 20 57 48 45 52 45 20 72 6f 6f 74 3d  M cx WHERE root=
0630: 31 20 47 52 4f 55 50 20 42 59 20 64 65 70 74 68  1 GROUP BY depth
0640: 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 7d 20 7b   ORDER BY 1;.} {
0650: 2f 31 20 30 20 31 20 31 37 20 32 20 31 20 34 20  /1 0 1 17 2 1 4 
0660: 32 20 38 20 33 20 31 36 20 34 20 2e 2a 20 36 35  2 8 3 16 4 .* 65
0670: 35 33 36 20 31 36 2f 7d 0a 0a 23 20 64 65 73 63  536 16/}..# desc
0680: 65 6e 64 65 6e 74 73 20 6f 66 20 33 32 37 36 38  endents of 32768
0690: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
06a0: 20 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20   1.2 {.  SELECT 
06b0: 2a 20 46 52 4f 4d 20 63 78 20 57 48 45 52 45 20  * FROM cx WHERE 
06c0: 72 6f 6f 74 3d 33 32 37 36 38 20 4f 52 44 45 52  root=32768 ORDER
06d0: 20 42 59 20 69 64 3b 0a 7d 20 7b 33 32 37 36 38   BY id;.} {32768
06e0: 20 30 20 36 35 35 33 36 20 31 20 36 35 35 33 37   0 65536 1 65537
06f0: 20 31 20 31 33 31 30 37 32 20 32 7d 0a 0a 23 20   1 131072 2}..# 
0700: 64 65 73 63 65 6e 64 65 6e 74 73 20 6f 66 20 31  descendents of 1
0710: 36 33 38 34 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  6384.do_execsql_
0720: 74 65 73 74 20 31 2e 33 20 7b 0a 20 20 53 45 4c  test 1.3 {.  SEL
0730: 45 43 54 20 2a 20 46 52 4f 4d 20 63 78 20 57 48  ECT * FROM cx WH
0740: 45 52 45 20 72 6f 6f 74 3d 31 36 33 38 34 20 41  ERE root=16384 A
0750: 4e 44 20 64 65 70 74 68 3c 3d 32 20 4f 52 44 45  ND depth<=2 ORDE
0760: 52 20 42 59 20 69 64 3b 0a 7d 20 7b 31 36 33 38  R BY id;.} {1638
0770: 34 20 30 20 33 32 37 36 38 20 31 20 33 32 37 36  4 0 32768 1 3276
0780: 39 20 31 20 36 35 35 33 36 20 32 20 36 35 35 33  9 1 65536 2 6553
0790: 37 20 32 20 36 35 35 33 38 20 32 20 36 35 35 33  7 2 65538 2 6553
07a0: 39 20 32 7d 0a 0a 23 20 63 68 69 6c 64 72 65 6e  9 2}..# children
07b0: 20 6f 66 20 31 36 33 38 34 0a 64 6f 5f 65 78 65   of 16384.do_exe
07c0: 63 73 71 6c 5f 74 65 73 74 20 31 2e 34 20 7b 0a  csql_test 1.4 {.
07d0: 20 20 53 45 4c 45 43 54 20 69 64 2c 20 64 65 70    SELECT id, dep
07e0: 74 68 2c 20 72 6f 6f 74 2c 20 74 61 62 6c 65 6e  th, root, tablen
07f0: 61 6d 65 2c 20 69 64 63 6f 6c 75 6d 6e 2c 20 70  ame, idcolumn, p
0800: 61 72 65 6e 74 63 6f 6c 75 6d 6e 20 46 52 4f 4d  arentcolumn FROM
0810: 20 63 78 0a 20 20 20 57 48 45 52 45 20 72 6f 6f   cx.   WHERE roo
0820: 74 3d 31 36 33 38 34 0a 20 20 20 20 20 41 4e 44  t=16384.     AND
0830: 20 64 65 70 74 68 3d 31 0a 20 20 20 4f 52 44 45   depth=1.   ORDE
0840: 52 20 42 59 20 69 64 3b 0a 7d 20 7b 33 32 37 36  R BY id;.} {3276
0850: 38 20 31 20 7b 7d 20 74 31 20 78 20 79 20 33 32  8 1 {} t1 x y 32
0860: 37 36 39 20 31 20 7b 7d 20 74 31 20 78 20 79 7d  769 1 {} t1 x y}
0870: 0a 0a 23 20 67 72 65 61 74 2d 67 72 61 6e 64 70  ..# great-grandp
0880: 61 72 65 6e 74 20 6f 66 20 31 36 33 38 34 0a 64  arent of 16384.d
0890: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
08a0: 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 69 64  .5 {.  SELECT id
08b0: 2c 20 64 65 70 74 68 2c 20 72 6f 6f 74 2c 20 74  , depth, root, t
08c0: 61 62 6c 65 6e 61 6d 65 2c 20 69 64 63 6f 6c 75  ablename, idcolu
08d0: 6d 6e 2c 20 70 61 72 65 6e 74 63 6f 6c 75 6d 6e  mn, parentcolumn
08e0: 20 46 52 4f 4d 20 63 78 0a 20 20 20 57 48 45 52   FROM cx.   WHER
08f0: 45 20 72 6f 6f 74 3d 31 36 33 38 34 0a 20 20 20  E root=16384.   
0900: 20 20 41 4e 44 20 64 65 70 74 68 3d 33 0a 20 20    AND depth=3.  
0910: 20 20 20 41 4e 44 20 69 64 63 6f 6c 75 6d 6e 3d     AND idcolumn=
0920: 27 59 27 0a 20 20 20 20 20 41 4e 44 20 70 61 72  'Y'.     AND par
0930: 65 6e 74 63 6f 6c 75 6d 6e 3d 27 58 27 3b 0a 7d  entcolumn='X';.}
0940: 20 7b 32 30 34 38 20 33 20 7b 7d 20 74 31 20 59   {2048 3 {} t1 Y
0950: 20 58 7d 0a 0a 23 20 64 65 70 74 68 3c 35 0a 64   X}..# depth<5.d
0960: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
0970: 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f  .6 {.  SELECT co
0980: 75 6e 74 28 2a 29 2c 20 64 65 70 74 68 20 46 52  unt(*), depth FR
0990: 4f 4d 20 63 78 20 57 48 45 52 45 20 72 6f 6f 74  OM cx WHERE root
09a0: 3d 31 20 41 4e 44 20 64 65 70 74 68 3c 35 0a 20  =1 AND depth<5. 
09b0: 20 20 47 52 4f 55 50 20 42 59 20 64 65 70 74 68    GROUP BY depth
09c0: 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 7d 20 7b   ORDER BY 1;.} {
09d0: 31 20 30 20 32 20 31 20 34 20 32 20 38 20 33 20  1 0 2 1 4 2 8 3 
09e0: 31 36 20 34 7d 0a 0a 23 20 64 65 70 74 68 3c 3d  16 4}..# depth<=
09f0: 35 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  5.do_execsql_tes
0a00: 74 20 31 2e 37 20 7b 0a 20 20 53 45 4c 45 43 54  t 1.7 {.  SELECT
0a10: 20 63 6f 75 6e 74 28 2a 29 2c 20 64 65 70 74 68   count(*), depth
0a20: 20 46 52 4f 4d 20 63 78 20 57 48 45 52 45 20 72   FROM cx WHERE r
0a30: 6f 6f 74 3d 31 20 41 4e 44 20 64 65 70 74 68 3c  oot=1 AND depth<
0a40: 3d 35 0a 20 20 20 47 52 4f 55 50 20 42 59 20 64  =5.   GROUP BY d
0a50: 65 70 74 68 20 4f 52 44 45 52 20 42 59 20 31 3b  epth ORDER BY 1;
0a60: 0a 7d 20 7b 31 20 30 20 32 20 31 20 34 20 32 20  .} {1 0 2 1 4 2 
0a70: 38 20 33 20 31 36 20 34 20 33 32 20 35 7d 0a 0a  8 3 16 4 32 5}..
0a80: 23 20 64 65 70 74 68 3d 3d 35 0a 64 6f 5f 65 78  # depth==5.do_ex
0a90: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 38 20 7b  ecsql_test 1.8 {
0aa0: 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  .  SELECT count(
0ab0: 2a 29 2c 20 64 65 70 74 68 20 46 52 4f 4d 20 63  *), depth FROM c
0ac0: 78 20 57 48 45 52 45 20 72 6f 6f 74 3d 31 20 41  x WHERE root=1 A
0ad0: 4e 44 20 64 65 70 74 68 3d 35 0a 20 20 20 47 52  ND depth=5.   GR
0ae0: 4f 55 50 20 42 59 20 64 65 70 74 68 20 4f 52 44  OUP BY depth ORD
0af0: 45 52 20 42 59 20 31 3b 0a 7d 20 7b 33 32 20 35  ER BY 1;.} {32 5
0b00: 7d 0a 0a 23 20 64 65 70 74 68 20 42 45 54 57 45  }..# depth BETWE
0b10: 45 4e 20 33 20 41 4e 44 20 35 0a 64 6f 5f 65 78  EN 3 AND 5.do_ex
0b20: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 39 20 7b  ecsql_test 1.9 {
0b30: 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  .  SELECT count(
0b40: 2a 29 2c 20 64 65 70 74 68 20 46 52 4f 4d 20 63  *), depth FROM c
0b50: 78 20 57 48 45 52 45 20 72 6f 6f 74 3d 31 20 41  x WHERE root=1 A
0b60: 4e 44 20 64 65 70 74 68 20 42 45 54 57 45 45 4e  ND depth BETWEEN
0b70: 20 33 20 41 4e 44 20 35 0a 20 20 20 47 52 4f 55   3 AND 5.   GROU
0b80: 50 20 42 59 20 64 65 70 74 68 20 4f 52 44 45 52  P BY depth ORDER
0b90: 20 42 59 20 31 3b 0a 7d 20 7b 38 20 33 20 31 36   BY 1;.} {8 3 16
0ba0: 20 34 20 33 32 20 35 7d 0a 0a 23 20 64 65 70 74   4 32 5}..# dept
0bb0: 68 3d 3d 35 20 77 69 74 68 20 6d 69 6e 28 29 20  h==5 with min() 
0bc0: 61 6e 64 20 6d 61 78 28 29 0a 64 6f 5f 65 78 65  and max().do_exe
0bd0: 63 73 71 6c 5f 74 65 73 74 20 31 2e 31 30 20 7b  csql_test 1.10 {
0be0: 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  .  SELECT count(
0bf0: 2a 29 2c 20 6d 69 6e 28 69 64 29 2c 20 6d 61 78  *), min(id), max
0c00: 28 69 64 29 20 46 52 4f 4d 20 63 78 20 57 48 45  (id) FROM cx WHE
0c10: 52 45 20 72 6f 6f 74 3d 31 20 41 4e 44 20 64 65  RE root=1 AND de
0c20: 70 74 68 3d 35 3b 0a 7d 20 7b 33 32 20 33 32 20  pth=5;.} {32 32 
0c30: 36 33 7d 0a 0a 23 20 43 72 65 61 74 65 20 61 20  63}..# Create a 
0c40: 6d 75 63 68 20 73 6d 61 6c 6c 65 72 20 74 61 62  much smaller tab
0c50: 6c 65 20 74 32 20 77 69 74 68 20 6f 6e 6c 79 20  le t2 with only 
0c60: 33 32 20 65 6c 65 6d 65 6e 74 73 20 0a 64 62 20  32 elements .db 
0c70: 65 76 61 6c 20 7b 0a 20 20 43 52 45 41 54 45 20  eval {.  CREATE 
0c80: 54 41 42 4c 45 20 74 32 28 78 20 49 4e 54 45 47  TABLE t2(x INTEG
0c90: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
0ca0: 79 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 49 4e  y INTEGER);.  IN
0cb0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
0cc0: 45 43 54 20 78 2c 20 79 20 46 52 4f 4d 20 74 31  ECT x, y FROM t1
0cd0: 20 57 48 45 52 45 20 78 3c 33 32 3b 0a 20 20 43   WHERE x<32;.  C
0ce0: 52 45 41 54 45 20 49 4e 44 45 58 20 74 32 79 20  REATE INDEX t2y 
0cf0: 4f 4e 20 74 32 28 79 29 3b 0a 20 20 43 52 45 41  ON t2(y);.  CREA
0d00: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
0d10: 20 63 32 20 0a 20 20 20 55 53 49 4e 47 20 74 72   c2 .   USING tr
0d20: 61 6e 73 69 74 69 76 65 5f 63 6c 6f 73 75 72 65  ansitive_closure
0d30: 28 74 61 62 6c 65 6e 61 6d 65 3d 74 32 2c 20 69  (tablename=t2, i
0d40: 64 63 6f 6c 75 6d 6e 3d 78 2c 20 70 61 72 65 6e  dcolumn=x, paren
0d50: 74 63 6f 6c 75 6d 6e 3d 79 29 3b 0a 7d 0a 0a 23  tcolumn=y);.}..#
0d60: 20 74 32 20 66 75 6c 6c 2d 74 61 62 6c 65 0a 64   t2 full-table.d
0d70: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
0d80: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f  .1 {.  SELECT co
0d90: 75 6e 74 28 2a 29 2c 20 6d 69 6e 28 69 64 29 2c  unt(*), min(id),
0da0: 20 6d 61 78 28 69 64 29 20 46 52 4f 4d 20 63 32   max(id) FROM c2
0db0: 20 57 48 45 52 45 20 72 6f 6f 74 3d 31 3b 0a 7d   WHERE root=1;.}
0dc0: 20 7b 33 31 20 31 20 33 31 7d 0a 23 20 74 32 20   {31 1 31}.# t2 
0dd0: 72 6f 6f 74 3d 31 30 0a 64 6f 5f 65 78 65 63 73  root=10.do_execs
0de0: 71 6c 5f 74 65 73 74 20 32 2e 32 20 7b 0a 20 20  ql_test 2.2 {.  
0df0: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 63  SELECT id FROM c
0e00: 32 20 57 48 45 52 45 20 72 6f 6f 74 3d 31 30 3b  2 WHERE root=10;
0e10: 0a 7d 20 7b 31 30 20 32 30 20 32 31 7d 0a 23 20  .} {10 20 21}.# 
0e20: 74 32 20 72 6f 6f 74 3d 31 31 0a 64 6f 5f 65 78  t2 root=11.do_ex
0e30: 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 33 20 7b  ecsql_test 2.3 {
0e40: 0a 20 20 53 45 4c 45 43 54 20 69 64 20 46 52 4f  .  SELECT id FRO
0e50: 4d 20 63 32 20 57 48 45 52 45 20 72 6f 6f 74 3d  M c2 WHERE root=
0e60: 31 32 3b 0a 7d 20 7b 31 32 20 32 34 20 32 35 7d  12;.} {12 24 25}
0e70: 0a 23 20 74 32 20 72 6f 6f 74 20 49 4e 20 5b 31  .# t2 root IN [1
0e80: 30 2c 31 32 5d 0a 64 6f 5f 65 78 65 63 73 71 6c  0,12].do_execsql
0e90: 5f 74 65 73 74 20 32 2e 34 20 7b 0a 20 20 53 45  _test 2.4 {.  SE
0ea0: 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 63 32 20  LECT id FROM c2 
0eb0: 57 48 45 52 45 20 72 6f 6f 74 20 49 4e 20 28 31  WHERE root IN (1
0ec0: 30 2c 31 32 29 20 4f 52 44 45 52 20 42 59 20 69  0,12) ORDER BY i
0ed0: 64 3b 0a 7d 20 7b 31 30 20 31 32 20 32 30 20 32  d;.} {10 12 20 2
0ee0: 31 20 32 34 20 32 35 7d 0a 23 20 74 32 20 72 6f  1 24 25}.# t2 ro
0ef0: 6f 74 20 49 4e 20 5b 31 30 2c 31 32 5d 20 28 73  ot IN [10,12] (s
0f00: 6f 72 74 65 64 29 0a 64 6f 5f 65 78 65 63 73 71  orted).do_execsq
0f10: 6c 5f 74 65 73 74 20 32 2e 35 20 7b 0a 20 20 53  l_test 2.5 {.  S
0f20: 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 63 32  ELECT id FROM c2
0f30: 20 57 48 45 52 45 20 72 6f 6f 74 20 49 4e 20 28   WHERE root IN (
0f40: 31 30 2c 31 32 29 20 4f 52 44 45 52 20 42 59 20  10,12) ORDER BY 
0f50: 2b 69 64 3b 0a 7d 20 7b 31 30 20 31 32 20 32 30  +id;.} {10 12 20
0f60: 20 32 31 20 32 34 20 32 35 7d 0a 0a 23 20 74 32   21 24 25}..# t2
0f70: 20 63 32 75 70 20 66 72 6f 6d 20 32 30 0a 64 6f   c2up from 20.do
0f80: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
0f90: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52  0 {.  CREATE VIR
0fa0: 54 55 41 4c 20 54 41 42 4c 45 20 63 32 75 70 20  TUAL TABLE c2up 
0fb0: 55 53 49 4e 47 20 74 72 61 6e 73 69 74 69 76 65  USING transitive
0fc0: 5f 63 6c 6f 73 75 72 65 28 0a 20 20 20 20 74 61  _closure(.    ta
0fd0: 62 6c 65 6e 61 6d 65 20 3d 20 74 32 2c 0a 20 20  blename = t2,.  
0fe0: 20 20 69 64 63 6f 6c 75 6d 6e 20 3d 20 79 2c 0a    idcolumn = y,.
0ff0: 20 20 20 20 70 61 72 65 6e 74 63 6f 6c 75 6d 6e      parentcolumn
1000: 20 3d 20 78 0a 20 20 29 3b 0a 20 20 53 45 4c 45   = x.  );.  SELE
1010: 43 54 20 69 64 20 46 52 4f 4d 20 63 32 75 70 20  CT id FROM c2up 
1020: 57 48 45 52 45 20 72 6f 6f 74 3d 32 30 3b 0a 7d  WHERE root=20;.}
1030: 20 7b 31 20 32 20 35 20 31 30 20 32 30 7d 0a 0a   {1 2 5 10 20}..
1040: 23 20 63 78 20 61 73 20 63 32 75 70 0a 64 6f 5f  # cx as c2up.do_
1050: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 31  execsql_test 3.1
1060: 20 7b 0a 20 20 53 45 4c 45 43 54 20 69 64 20 46   {.  SELECT id F
1070: 52 4f 4d 20 63 78 0a 20 20 20 57 48 45 52 45 20  ROM cx.   WHERE 
1080: 72 6f 6f 74 3d 32 30 0a 20 20 20 20 20 41 4e 44  root=20.     AND
1090: 20 74 61 62 6c 65 6e 61 6d 65 3d 27 74 32 27 0a   tablename='t2'.
10a0: 20 20 20 20 20 41 4e 44 20 69 64 63 6f 6c 75 6d       AND idcolum
10b0: 6e 3d 27 79 27 0a 20 20 20 20 20 41 4e 44 20 70  n='y'.     AND p
10c0: 61 72 65 6e 74 63 6f 6c 75 6d 6e 3d 27 78 27 3b  arentcolumn='x';
10d0: 0a 7d 20 7b 31 20 32 20 35 20 31 30 20 32 30 7d  .} {1 2 5 10 20}
10e0: 0a 0a 23 20 74 32 20 66 69 72 73 74 20 63 6f 75  ..# t2 first cou
10f0: 73 69 6e 73 20 6f 66 20 32 30 0a 64 6f 5f 65 78  sins of 20.do_ex
1100: 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 32 20 7b  ecsql_test 3.2 {
1110: 0a 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e  .  SELECT DISTIN
1120: 43 54 20 69 64 20 46 52 4f 4d 20 63 32 0a 20 20  CT id FROM c2.  
1130: 20 57 48 45 52 45 20 72 6f 6f 74 20 49 4e 20 28   WHERE root IN (
1140: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 63  SELECT id FROM c
1150: 32 75 70 0a 20 20 20 20 20 20 20 20 20 20 20 20  2up.            
1160: 20 20 20 20 20 20 20 57 48 45 52 45 20 72 6f 6f         WHERE roo
1170: 74 3d 32 30 20 41 4e 44 20 64 65 70 74 68 3c 3d  t=20 AND depth<=
1180: 32 29 0a 20 20 20 4f 52 44 45 52 20 42 59 20 69  2).   ORDER BY i
1190: 64 3b 0a 7d 20 7b 35 20 31 30 20 31 31 20 32 30  d;.} {5 10 11 20
11a0: 20 32 31 20 32 32 20 32 33 7d 0a 0a 23 20 74 32   21 22 23}..# t2
11b0: 20 66 69 72 73 74 20 63 6f 75 73 69 6e 73 20 6f   first cousins o
11c0: 66 20 32 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  f 20.do_execsql_
11d0: 74 65 73 74 20 33 2e 33 20 7b 0a 20 20 53 45 4c  test 3.3 {.  SEL
11e0: 45 43 54 20 69 64 20 46 52 4f 4d 20 63 32 0a 20  ECT id FROM c2. 
11f0: 20 20 57 48 45 52 45 20 72 6f 6f 74 3d 28 53 45    WHERE root=(SE
1200: 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 63 32 75  LECT id FROM c2u
1210: 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p.              
1220: 20 57 48 45 52 45 20 72 6f 6f 74 3d 32 30 20 41   WHERE root=20 A
1230: 4e 44 20 64 65 70 74 68 3d 32 29 0a 20 20 20 20  ND depth=2).    
1240: 20 41 4e 44 20 64 65 70 74 68 3d 32 0a 20 20 45   AND depth=2.  E
1250: 58 43 45 50 54 0a 20 20 53 45 4c 45 43 54 20 69  XCEPT.  SELECT i
1260: 64 20 46 52 4f 4d 20 63 32 0a 20 20 20 57 48 45  d FROM c2.   WHE
1270: 52 45 20 72 6f 6f 74 3d 28 53 45 4c 45 43 54 20  RE root=(SELECT 
1280: 69 64 20 46 52 4f 4d 20 63 32 75 70 0a 20 20 20  id FROM c2up.   
1290: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
12a0: 45 20 72 6f 6f 74 3d 32 30 20 41 4e 44 20 64 65  E root=20 AND de
12b0: 70 74 68 3d 31 29 0a 20 20 20 20 20 41 4e 44 20  pth=1).     AND 
12c0: 64 65 70 74 68 3c 3d 31 0a 20 20 20 4f 52 44 45  depth<=1.   ORDE
12d0: 52 20 42 59 20 69 64 3b 0a 7d 20 7b 32 32 20 32  R BY id;.} {22 2
12e0: 33 7d 0a 0a 23 20 6d 69 73 73 69 6e 67 20 74 61  3}..# missing ta
12f0: 62 6c 65 6e 61 6d 65 2e 0a 64 6f 5f 74 65 73 74  blename..do_test
1300: 20 34 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71   4.1 {.  catchsq
1310: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 69  l {.    SELECT i
1320: 64 20 46 52 4f 4d 20 63 78 0a 20 20 20 20 20 57  d FROM cx.     W
1330: 48 45 52 45 20 72 6f 6f 74 3d 32 30 0a 20 20 20  HERE root=20.   
1340: 20 20 20 20 41 4e 44 20 74 61 62 6c 65 6e 61 6d      AND tablenam
1350: 65 3d 27 74 33 27 0a 20 20 20 20 20 20 20 41 4e  e='t3'.       AN
1360: 44 20 69 64 63 6f 6c 75 6d 6e 3d 27 79 27 0a 20  D idcolumn='y'. 
1370: 20 20 20 20 20 20 41 4e 44 20 70 61 72 65 6e 74        AND parent
1380: 63 6f 6c 75 6d 6e 3d 27 78 27 3b 0a 20 20 7d 0a  column='x';.  }.
1390: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61  } {1 {no such ta
13a0: 62 6c 65 3a 20 74 33 7d 7d 0a 0a 23 20 6d 69 73  ble: t3}}..# mis
13b0: 73 69 6e 67 20 69 64 63 6f 6c 75 6d 6e 0a 64 6f  sing idcolumn.do
13c0: 5f 74 65 73 74 20 34 2e 32 20 7b 0a 20 20 63 61  _test 4.2 {.  ca
13d0: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
13e0: 45 43 54 20 69 64 20 46 52 4f 4d 20 63 78 0a 20  ECT id FROM cx. 
13f0: 20 20 20 20 57 48 45 52 45 20 72 6f 6f 74 3d 32      WHERE root=2
1400: 30 0a 20 20 20 20 20 20 20 41 4e 44 20 74 61 62  0.       AND tab
1410: 6c 65 6e 61 6d 65 3d 27 74 32 27 0a 20 20 20 20  lename='t2'.    
1420: 20 20 20 41 4e 44 20 69 64 63 6f 6c 75 6d 6e 3d     AND idcolumn=
1430: 27 78 79 7a 27 0a 20 20 20 20 20 20 20 41 4e 44  'xyz'.       AND
1440: 20 70 61 72 65 6e 74 63 6f 6c 75 6d 6e 3d 27 78   parentcolumn='x
1450: 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20  ';.  }.} {1 {no 
1460: 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 74 32 2e  such column: t2.
1470: 78 79 7a 7d 7d 0a 0a 23 20 6d 69 73 73 69 6e 67  xyz}}..# missing
1480: 20 70 61 72 65 6e 74 63 6f 6c 75 6d 6e 0a 64 6f   parentcolumn.do
1490: 5f 74 65 73 74 20 34 2e 33 20 7b 0a 20 20 63 61  _test 4.3 {.  ca
14a0: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
14b0: 45 43 54 20 69 64 20 46 52 4f 4d 20 63 78 0a 20  ECT id FROM cx. 
14c0: 20 20 20 20 57 48 45 52 45 20 72 6f 6f 74 3d 32      WHERE root=2
14d0: 30 0a 20 20 20 20 20 20 20 41 4e 44 20 74 61 62  0.       AND tab
14e0: 6c 65 6e 61 6d 65 3d 27 74 32 27 0a 20 20 20 20  lename='t2'.    
14f0: 20 20 20 41 4e 44 20 69 64 63 6f 6c 75 6d 6e 3d     AND idcolumn=
1500: 27 78 27 0a 20 20 20 20 20 20 20 41 4e 44 20 70  'x'.       AND p
1510: 61 72 65 6e 74 63 6f 6c 75 6d 6e 3d 27 70 71 72  arentcolumn='pqr
1520: 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20  ';.  }.} {1 {no 
1530: 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 74 32 2e  such column: t2.
1540: 70 71 72 7d 7d 0a 0a 23 20 67 65 6e 65 72 69 63  pqr}}..# generic
1550: 20 63 6c 6f 73 75 72 65 0a 64 6f 5f 65 78 65 63   closure.do_exec
1560: 73 71 6c 5f 74 65 73 74 20 35 2e 31 20 7b 0a 20  sql_test 5.1 {. 
1570: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
1580: 54 41 42 4c 45 20 74 65 6d 70 2e 63 6c 6f 73 75  TABLE temp.closu
1590: 72 65 20 55 53 49 4e 47 20 74 72 61 6e 73 69 74  re USING transit
15a0: 69 76 65 5f 63 6c 6f 73 75 72 65 3b 0a 20 20 53  ive_closure;.  S
15b0: 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 63 6c  ELECT id FROM cl
15c0: 6f 73 75 72 65 0a 20 20 20 57 48 45 52 45 20 72  osure.   WHERE r
15d0: 6f 6f 74 3d 31 0a 20 20 20 20 20 41 4e 44 20 64  oot=1.     AND d
15e0: 65 70 74 68 3d 33 0a 20 20 20 20 20 41 4e 44 20  epth=3.     AND 
15f0: 74 61 62 6c 65 6e 61 6d 65 3d 27 74 31 27 0a 20  tablename='t1'. 
1600: 20 20 20 20 41 4e 44 20 69 64 63 6f 6c 75 6d 6e      AND idcolumn
1610: 3d 27 78 27 0a 20 20 20 20 20 41 4e 44 20 70 61  ='x'.     AND pa
1620: 72 65 6e 74 63 6f 6c 75 6d 6e 3d 27 79 27 0a 20  rentcolumn='y'. 
1630: 20 4f 52 44 45 52 20 42 59 20 69 64 3b 0a 7d 20   ORDER BY id;.} 
1640: 7b 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33  {8 9 10 11 12 13
1650: 20 31 34 20 31 35 7d 0a 0a 66 69 6e 69 73 68 5f   14 15}..finish_
1660: 74 65 73 74 0a                                   test.