/ Hex Artifact Content
Login

Artifact 50a9fb379f9747fd0d40ea6d8fa3a101361bb537:


0000: 23 20 32 30 31 35 2d 30 38 2d 31 39 0a 23 0a 23  # 2015-08-19.#.#
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 68 69 73 20 66 69 6c  **.# .# This fil
0170: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 65 73  e implements tes
0180: 74 73 20 66 6f 72 20 74 61 62 6c 65 2d 76 61 6c  ts for table-val
0190: 75 65 64 2d 66 75 6e 63 74 69 6f 6e 73 20 69 6d  ued-functions im
01a0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 0a  plemented using.
01b0: 23 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74  # eponymous virt
01c0: 75 61 6c 20 74 61 62 6c 65 73 2e 0a 23 0a 0a 73  ual tables..#..s
01d0: 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65  et testdir [file
01e0: 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d   dirname $argv0]
01f0: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
0200: 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 65 74 20  /tester.tcl.set 
0210: 74 65 73 74 70 72 65 66 69 78 20 74 61 62 66 75  testprefix tabfu
0220: 6e 63 30 31 0a 0a 69 66 63 61 70 61 62 6c 65 20  nc01..ifcapable 
0230: 21 76 74 61 62 20 7b 0a 20 20 66 69 6e 69 73 68  !vtab {.  finish
0240: 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d  _test.  return.}
0250: 0a 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65 78 74  .load_static_ext
0260: 65 6e 73 69 6f 6e 20 64 62 20 73 65 72 69 65 73  ension db series
0270: 0a 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65 78 74  .load_static_ext
0280: 65 6e 73 69 6f 6e 20 64 62 20 63 61 72 72 61 79  ension db carray
0290: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
02a0: 74 20 74 61 62 66 75 6e 63 30 31 2d 31 2e 31 20  t tabfunc01-1.1 
02b0: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 2c 20 27 7c  {.  SELECT *, '|
02c0: 27 20 46 52 4f 4d 20 67 65 6e 65 72 61 74 65 5f  ' FROM generate_
02d0: 73 65 72 69 65 73 20 57 48 45 52 45 20 73 74 61  series WHERE sta
02e0: 72 74 3d 31 20 41 4e 44 20 73 74 6f 70 3d 39 20  rt=1 AND stop=9 
02f0: 41 4e 44 20 73 74 65 70 3d 32 3b 0a 7d 20 7b 31  AND step=2;.} {1
0300: 20 7c 20 33 20 7c 20 35 20 7c 20 37 20 7c 20 39   | 3 | 5 | 7 | 9
0310: 20 7c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   |}.do_execsql_t
0320: 65 73 74 20 74 61 62 66 75 6e 63 30 31 2d 31 2e  est tabfunc01-1.
0330: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 2c 20  2 {.  SELECT *, 
0340: 27 7c 27 20 46 52 4f 4d 20 67 65 6e 65 72 61 74  '|' FROM generat
0350: 65 5f 73 65 72 69 65 73 20 4c 49 4d 49 54 20 35  e_series LIMIT 5
0360: 3b 0a 7d 20 7b 30 20 7c 20 31 20 7c 20 32 20 7c  ;.} {0 | 1 | 2 |
0370: 20 33 20 7c 20 34 20 7c 7d 0a 64 6f 5f 63 61 74   3 | 4 |}.do_cat
0380: 63 68 73 71 6c 5f 74 65 73 74 20 74 61 62 66 75  chsql_test tabfu
0390: 6e 63 30 31 2d 31 2e 33 20 7b 0a 20 20 43 52 45  nc01-1.3 {.  CRE
03a0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
03b0: 45 20 74 31 20 55 53 49 4e 47 20 67 65 6e 65 72  E t1 USING gener
03c0: 61 74 65 5f 73 65 72 69 65 73 3b 0a 7d 20 7b 31  ate_series;.} {1
03d0: 20 7b 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65   {no such module
03e0: 3a 20 67 65 6e 65 72 61 74 65 5f 73 65 72 69 65  : generate_serie
03f0: 73 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  s}}.do_execsql_t
0400: 65 73 74 20 74 61 62 66 75 6e 63 30 31 2d 31 2e  est tabfunc01-1.
0410: 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  4 {.  SELECT * F
0420: 52 4f 4d 20 67 65 6e 65 72 61 74 65 5f 73 65 72  ROM generate_ser
0430: 69 65 73 28 31 2c 39 2c 32 29 3b 0a 7d 20 7b 31  ies(1,9,2);.} {1
0440: 20 33 20 35 20 37 20 39 7d 0a 64 6f 5f 65 78 65   3 5 7 9}.do_exe
0450: 63 73 71 6c 5f 74 65 73 74 20 74 61 62 66 75 6e  csql_test tabfun
0460: 63 30 31 2d 31 2e 35 20 7b 0a 20 20 53 45 4c 45  c01-1.5 {.  SELE
0470: 43 54 20 2a 20 46 52 4f 4d 20 67 65 6e 65 72 61  CT * FROM genera
0480: 74 65 5f 73 65 72 69 65 73 28 31 2c 39 29 3b 0a  te_series(1,9);.
0490: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
04a0: 20 38 20 39 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   8 9}.do_execsql
04b0: 5f 74 65 73 74 20 74 61 62 66 75 6e 63 30 31 2d  _test tabfunc01-
04c0: 31 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  1.6 {.  SELECT *
04d0: 20 46 52 4f 4d 20 67 65 6e 65 72 61 74 65 5f 73   FROM generate_s
04e0: 65 72 69 65 73 28 31 2c 31 30 29 20 57 48 45 52  eries(1,10) WHER
04f0: 45 20 73 74 65 70 3d 33 3b 0a 7d 20 7b 31 20 34  E step=3;.} {1 4
0500: 20 37 20 31 30 7d 0a 64 6f 5f 63 61 74 63 68 73   7 10}.do_catchs
0510: 71 6c 5f 74 65 73 74 20 74 61 62 66 75 6e 63 30  ql_test tabfunc0
0520: 31 2d 31 2e 37 20 7b 0a 20 20 53 45 4c 45 43 54  1-1.7 {.  SELECT
0530: 20 2a 20 46 52 4f 4d 20 67 65 6e 65 72 61 74 65   * FROM generate
0540: 5f 73 65 72 69 65 73 28 31 2c 39 2c 32 2c 31 31  _series(1,9,2,11
0550: 29 3b 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e  );.} {1 {too man
0560: 79 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 67  y arguments on g
0570: 65 6e 65 72 61 74 65 5f 73 65 72 69 65 73 28 29  enerate_series()
0580: 20 2d 20 6d 61 78 20 33 7d 7d 0a 0a 64 6f 5f 65   - max 3}}..do_e
0590: 78 65 63 73 71 6c 5f 74 65 73 74 20 74 61 62 66  xecsql_test tabf
05a0: 75 6e 63 30 31 2d 31 2e 38 20 7b 0a 20 20 53 45  unc01-1.8 {.  SE
05b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 67 65 6e 65  LECT * FROM gene
05c0: 72 61 74 65 5f 73 65 72 69 65 73 28 30 2c 33 32  rate_series(0,32
05d0: 2c 35 29 20 4f 52 44 45 52 20 42 59 20 72 6f 77  ,5) ORDER BY row
05e0: 69 64 20 44 45 53 43 3b 0a 7d 20 7b 33 30 20 32  id DESC;.} {30 2
05f0: 35 20 32 30 20 31 35 20 31 30 20 35 20 30 7d 0a  5 20 15 10 5 0}.
0600: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0610: 74 61 62 66 75 6e 63 30 31 2d 31 2e 39 20 7b 0a  tabfunc01-1.9 {.
0620: 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20    SELECT rowid, 
0630: 2a 20 46 52 4f 4d 20 67 65 6e 65 72 61 74 65 5f  * FROM generate_
0640: 73 65 72 69 65 73 28 30 2c 33 32 2c 35 29 20 4f  series(0,32,5) O
0650: 52 44 45 52 20 42 59 20 76 61 6c 75 65 20 44 45  RDER BY value DE
0660: 53 43 3b 0a 7d 20 7b 31 20 33 30 20 32 20 32 35  SC;.} {1 30 2 25
0670: 20 33 20 32 30 20 34 20 31 35 20 35 20 31 30 20   3 20 4 15 5 10 
0680: 36 20 35 20 37 20 30 7d 0a 64 6f 5f 65 78 65 63  6 5 7 0}.do_exec
0690: 73 71 6c 5f 74 65 73 74 20 74 61 62 66 75 6e 63  sql_test tabfunc
06a0: 30 31 2d 31 2e 31 30 20 7b 0a 20 20 53 45 4c 45  01-1.10 {.  SELE
06b0: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
06c0: 20 67 65 6e 65 72 61 74 65 5f 73 65 72 69 65 73   generate_series
06d0: 28 30 2c 33 32 2c 35 29 20 4f 52 44 45 52 20 42  (0,32,5) ORDER B
06e0: 59 20 2b 76 61 6c 75 65 20 44 45 53 43 3b 0a 7d  Y +value DESC;.}
06f0: 20 7b 37 20 33 30 20 36 20 32 35 20 35 20 32 30   {7 30 6 25 5 20
0700: 20 34 20 31 35 20 33 20 31 30 20 32 20 35 20 31   4 15 3 10 2 5 1
0710: 20 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   0}..do_execsql_
0720: 74 65 73 74 20 74 61 62 66 75 6e 63 30 31 2d 31  test tabfunc01-1
0730: 2e 32 30 20 7b 0a 20 20 43 52 45 41 54 45 20 56  .20 {.  CREATE V
0740: 49 45 57 20 76 31 28 61 2c 62 29 20 41 53 20 56  IEW v1(a,b) AS V
0750: 41 4c 55 45 53 28 31 2c 32 29 2c 28 33 2c 34 29  ALUES(1,2),(3,4)
0760: 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ;.  SELECT * FRO
0770: 4d 20 76 31 3b 0a 7d 20 7b 31 20 32 20 33 20 34  M v1;.} {1 2 3 4
0780: 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  }.do_catchsql_te
0790: 73 74 20 74 61 62 66 75 6e 63 30 31 2d 31 2e 32  st tabfunc01-1.2
07a0: 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  1.1 {.  SELECT *
07b0: 20 46 52 4f 4d 20 76 31 28 35 35 29 3b 0a 7d 20   FROM v1(55);.} 
07c0: 7b 31 20 7b 27 76 31 27 20 69 73 20 6e 6f 74 20  {1 {'v1' is not 
07d0: 61 20 66 75 6e 63 74 69 6f 6e 7d 7d 0a 64 6f 5f  a function}}.do_
07e0: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 74 61  catchsql_test ta
07f0: 62 66 75 6e 63 30 31 2d 31 2e 32 31 2e 32 20 7b  bfunc01-1.21.2 {
0800: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
0810: 20 76 31 28 29 3b 0a 7d 20 7b 31 20 7b 27 76 31   v1();.} {1 {'v1
0820: 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63 74  ' is not a funct
0830: 69 6f 6e 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  ion}}.do_execsql
0840: 5f 74 65 73 74 20 74 61 62 66 75 6e 63 30 31 2d  _test tabfunc01-
0850: 31 2e 32 32 20 7b 0a 20 20 43 52 45 41 54 45 20  1.22 {.  CREATE 
0860: 56 49 45 57 20 76 32 28 78 29 20 41 53 20 53 45  VIEW v2(x) AS SE
0870: 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20  LECT value FROM 
0880: 67 65 6e 65 72 61 74 65 5f 73 65 72 69 65 73 28  generate_series(
0890: 31 2c 35 29 3b 0a 20 20 53 45 4c 45 43 54 20 2a  1,5);.  SELECT *
08a0: 20 46 52 4f 4d 20 76 32 3b 0a 7d 20 7b 31 20 32   FROM v2;.} {1 2
08b0: 20 33 20 34 20 35 7d 0a 64 6f 5f 63 61 74 63 68   3 4 5}.do_catch
08c0: 73 71 6c 5f 74 65 73 74 20 74 61 62 66 75 6e 63  sql_test tabfunc
08d0: 30 31 2d 31 2e 32 33 2e 31 20 7b 0a 20 20 53 45  01-1.23.1 {.  SE
08e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 76 32 28 35  LECT * FROM v2(5
08f0: 35 29 3b 0a 7d 20 7b 31 20 7b 27 76 32 27 20 69  5);.} {1 {'v2' i
0900: 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e  s not a function
0910: 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  }}.do_catchsql_t
0920: 65 73 74 20 74 61 62 66 75 6e 63 30 31 2d 31 2e  est tabfunc01-1.
0930: 32 33 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  23.2 {.  SELECT 
0940: 2a 20 46 52 4f 4d 20 76 32 28 29 3b 0a 7d 20 7b  * FROM v2();.} {
0950: 31 20 7b 27 76 32 27 20 69 73 20 6e 6f 74 20 61  1 {'v2' is not a
0960: 20 66 75 6e 63 74 69 6f 6e 7d 7d 0a 64 6f 5f 65   function}}.do_e
0970: 78 65 63 73 71 6c 5f 74 65 73 74 20 74 61 62 66  xecsql_test tabf
0980: 75 6e 63 30 31 2d 31 2e 32 34 20 7b 0a 20 20 43  unc01-1.24 {.  C
0990: 52 45 41 54 45 20 54 41 42 4c 45 20 74 30 28 78  REATE TABLE t0(x
09a0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
09b0: 20 74 30 28 78 29 20 56 41 4c 55 45 53 28 31 32   t0(x) VALUES(12
09c0: 33 29 2c 28 34 35 36 29 2c 28 37 38 39 29 3b 0a  3),(456),(789);.
09d0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
09e0: 74 30 20 4f 52 44 45 52 20 42 59 20 78 3b 0a 7d  t0 ORDER BY x;.}
09f0: 20 7b 31 32 33 20 34 35 36 20 37 38 39 7d 0a 64   {123 456 789}.d
0a00: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
0a10: 74 61 62 66 75 6e 63 30 31 2d 31 2e 32 35 20 7b  tabfunc01-1.25 {
0a20: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
0a30: 20 74 30 28 35 35 29 20 4f 52 44 45 52 20 42 59   t0(55) ORDER BY
0a40: 20 78 3b 0a 7d 20 7b 31 20 7b 27 74 30 27 20 69   x;.} {1 {'t0' i
0a50: 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e  s not a function
0a60: 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  }}.do_catchsql_t
0a70: 65 73 74 20 74 61 62 66 75 6e 63 30 31 2d 31 2e  est tabfunc01-1.
0a80: 32 36 20 7b 0a 20 20 57 49 54 48 20 77 30 20 41  26 {.  WITH w0 A
0a90: 53 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  S (SELECT * FROM
0aa0: 20 74 30 29 0a 20 20 49 4e 53 45 52 54 20 49 4e   t0).  INSERT IN
0ab0: 54 4f 20 74 30 28 78 29 20 53 45 4c 45 43 54 20  TO t0(x) SELECT 
0ac0: 2a 20 46 52 4f 4d 20 77 30 28 29 0a 7d 20 7b 31  * FROM w0().} {1
0ad0: 20 7b 27 77 30 27 20 69 73 20 6e 6f 74 20 61 20   {'w0' is not a 
0ae0: 66 75 6e 63 74 69 6f 6e 7d 7d 0a 0a 64 6f 5f 65  function}}..do_e
0af0: 78 65 63 73 71 6c 5f 74 65 73 74 20 74 61 62 66  xecsql_test tabf
0b00: 75 6e 63 30 31 2d 32 2e 31 20 7b 0a 20 20 43 52  unc01-2.1 {.  CR
0b10: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
0b20: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0b30: 74 31 28 78 29 20 56 41 4c 55 45 53 28 32 29 2c  t1(x) VALUES(2),
0b40: 28 33 29 3b 0a 20 20 53 45 4c 45 43 54 20 2a 2c  (3);.  SELECT *,
0b50: 20 27 7c 27 20 46 52 4f 4d 20 74 31 2c 20 67 65   '|' FROM t1, ge
0b60: 6e 65 72 61 74 65 5f 73 65 72 69 65 73 28 31 2c  nerate_series(1,
0b70: 78 29 20 4f 52 44 45 52 20 42 59 20 31 2c 20 32  x) ORDER BY 1, 2
0b80: 0a 7d 20 7b 32 20 31 20 7c 20 32 20 32 20 7c 20  .} {2 1 | 2 2 | 
0b90: 33 20 31 20 7c 20 33 20 32 20 7c 20 33 20 33 20  3 1 | 3 2 | 3 3 
0ba0: 7c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  |}.do_execsql_te
0bb0: 73 74 20 74 61 62 66 75 6e 63 30 31 2d 32 2e 32  st tabfunc01-2.2
0bc0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 2c 20 27   {.  SELECT *, '
0bd0: 7c 27 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  |' FROM (SELECT 
0be0: 78 20 46 52 4f 4d 20 74 31 29 20 41 53 20 79 2c  x FROM t1) AS y,
0bf0: 20 67 65 6e 65 72 61 74 65 5f 73 65 72 69 65 73   generate_series
0c00: 28 31 2c 79 2e 78 29 0a 20 20 4f 52 44 45 52 20  (1,y.x).  ORDER 
0c10: 42 59 20 31 2c 20 32 3b 0a 7d 20 7b 32 20 31 20  BY 1, 2;.} {2 1 
0c20: 7c 20 32 20 32 20 7c 20 33 20 31 20 7c 20 33 20  | 2 2 | 3 1 | 3 
0c30: 32 20 7c 20 33 20 33 20 7c 7d 0a 0a 64 6f 5f 65  2 | 3 3 |}..do_e
0c40: 78 65 63 73 71 6c 5f 74 65 73 74 20 74 61 62 66  xecsql_test tabf
0c50: 75 6e 63 30 31 2d 32 2e 35 30 20 7b 0a 20 20 53  unc01-2.50 {.  S
0c60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 67 65 6e  ELECT * FROM gen
0c70: 65 72 61 74 65 5f 73 65 72 69 65 73 28 29 20 4c  erate_series() L
0c80: 49 4d 49 54 20 35 3b 0a 7d 20 7b 30 20 31 20 32  IMIT 5;.} {0 1 2
0c90: 20 33 20 34 7d 0a 0a 64 6f 5f 65 78 65 63 73 71   3 4}..do_execsq
0ca0: 6c 5f 74 65 73 74 20 74 61 62 66 75 6e 63 30 31  l_test tabfunc01
0cb0: 2d 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20  -3.1 {.  SELECT 
0cc0: 44 49 53 54 49 4e 43 54 20 76 61 6c 75 65 20 46  DISTINCT value F
0cd0: 52 4f 4d 20 67 65 6e 65 72 61 74 65 5f 73 65 72  ROM generate_ser
0ce0: 69 65 73 28 31 2c 78 29 2c 20 74 31 20 4f 52 44  ies(1,x), t1 ORD
0cf0: 45 52 20 42 59 20 31 3b 0a 7d 20 7b 31 20 32 20  ER BY 1;.} {1 2 
0d00: 33 7d 0a 0a 23 20 45 70 6f 6e 79 6d 6f 75 73 20  3}..# Eponymous 
0d10: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 65 78  virtual table ex
0d20: 69 73 74 73 20 69 6e 20 74 68 65 20 22 6d 61 69  ists in the "mai
0d30: 6e 22 20 73 63 68 65 6d 61 20 6f 6e 6c 79 0a 23  n" schema only.#
0d40: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0d50: 20 74 61 62 66 75 6e 63 30 31 2d 34 2e 31 20 7b   tabfunc01-4.1 {
0d60: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
0d70: 20 6d 61 69 6e 2e 67 65 6e 65 72 61 74 65 5f 73   main.generate_s
0d80: 65 72 69 65 73 28 31 2c 34 29 0a 7d 20 7b 31 20  eries(1,4).} {1 
0d90: 32 20 33 20 34 7d 0a 64 6f 5f 63 61 74 63 68 73  2 3 4}.do_catchs
0da0: 71 6c 5f 74 65 73 74 20 74 61 62 66 75 6e 63 30  ql_test tabfunc0
0db0: 31 2d 34 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  1-4.2 {.  SELECT
0dc0: 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 67 65 6e   * FROM temp.gen
0dd0: 65 72 61 74 65 5f 73 65 72 69 65 73 28 31 2c 34  erate_series(1,4
0de0: 29 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20  ).} {1 {no such 
0df0: 74 61 62 6c 65 3a 20 74 65 6d 70 2e 67 65 6e 65  table: temp.gene
0e00: 72 61 74 65 5f 73 65 72 69 65 73 7d 7d 0a 64 6f  rate_series}}.do
0e10: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 74  _catchsql_test t
0e20: 61 62 66 75 6e 63 30 31 2d 34 2e 33 20 7b 0a 20  abfunc01-4.3 {. 
0e30: 20 41 54 54 41 43 48 20 27 3a 6d 65 6d 6f 72 79   ATTACH ':memory
0e40: 3a 27 20 41 53 20 61 75 78 31 3b 0a 20 20 43 52  :' AS aux1;.  CR
0e50: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 31 2e  EATE TABLE aux1.
0e60: 74 31 28 61 2c 62 2c 63 29 3b 0a 20 20 53 45 4c  t1(a,b,c);.  SEL
0e70: 45 43 54 20 2a 20 46 52 4f 4d 20 61 75 78 31 2e  ECT * FROM aux1.
0e80: 67 65 6e 65 72 61 74 65 5f 73 65 72 69 65 73 28  generate_series(
0e90: 31 2c 34 29 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75  1,4).} {1 {no su
0ea0: 63 68 20 74 61 62 6c 65 3a 20 61 75 78 31 2e 67  ch table: aux1.g
0eb0: 65 6e 65 72 61 74 65 5f 73 65 72 69 65 73 7d 7d  enerate_series}}
0ec0: 0a 0a 23 20 54 68 65 20 6e 65 78 74 20 73 65 72  ..# The next ser
0ed0: 69 65 73 20 6f 66 20 74 65 73 74 73 20 69 73 20  ies of tests is 
0ee0: 76 65 72 69 66 79 69 6e 67 20 74 68 61 74 20 76  verifying that v
0ef0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 72 65  irtual table are
0f00: 20 61 62 6c 65 0a 23 20 74 6f 20 6f 70 74 69 6d   able.# to optim
0f10: 69 7a 65 20 74 68 65 20 49 4e 20 6f 70 65 72 61  ize the IN opera
0f20: 74 6f 72 2c 20 65 76 65 6e 20 6f 6e 20 74 65 72  tor, even on ter
0f30: 6d 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ms that are not 
0f40: 6d 61 72 6b 65 64 20 22 6f 6d 69 74 22 2e 0a 23  marked "omit"..#
0f50: 20 57 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61   When the genera
0f60: 74 65 5f 73 65 72 69 65 73 20 76 69 72 74 75 61  te_series virtua
0f70: 6c 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 69  l table is compi
0f80: 6c 65 64 20 66 6f 72 20 74 68 65 20 74 65 73 74  led for the test
0f90: 66 69 78 74 75 72 65 2c 0a 23 20 74 68 65 20 73  fixture,.# the s
0fa0: 70 65 63 69 61 6c 20 2d 44 53 51 4c 49 54 45 5f  pecial -DSQLITE_
0fb0: 53 45 52 49 45 53 5f 43 4f 4e 53 54 52 41 49 4e  SERIES_CONSTRAIN
0fc0: 54 5f 56 45 52 49 46 59 3d 31 20 6f 70 74 69 6f  T_VERIFY=1 optio
0fd0: 6e 20 69 73 20 75 73 65 64 2c 20 77 68 69 63 68  n is used, which
0fe0: 0a 23 20 63 61 75 73 65 73 20 74 68 65 20 78 42  .# causes the xB
0ff0: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20  estIndex method 
1000: 6f 66 20 67 65 6e 65 72 61 74 65 5f 73 65 72 69  of generate_seri
1010: 65 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65 0a  es to leave the.
1020: 23 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  # sqlite3_index_
1030: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
1040: 2e 6f 6d 69 74 20 66 6c 61 67 20 73 65 74 20 74  .omit flag set t
1050: 6f 20 30 2c 20 77 68 69 63 68 20 73 68 6f 75 6c  o 0, which shoul
1060: 64 20 63 61 75 73 65 0a 23 20 74 68 65 20 53 51  d cause.# the SQ
1070: 4c 69 74 65 20 63 6f 72 65 20 74 6f 20 76 65 72  Lite core to ver
1080: 69 66 79 20 74 68 65 20 73 74 61 72 74 3d 2c 20  ify the start=, 
1090: 73 74 6f 70 3d 2c 20 61 6e 64 20 73 74 65 70 3d  stop=, and step=
10a0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 0a   constraints on.
10b0: 23 20 65 61 63 68 20 73 74 65 70 20 6f 66 20 6f  # each step of o
10c0: 75 74 70 75 74 2e 20 20 41 74 20 6f 6e 65 20 70  utput.  At one p
10d0: 6f 69 6e 74 2c 20 74 68 65 20 49 4e 20 6f 70 65  oint, the IN ope
10e0: 72 61 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20  rator could not 
10f0: 62 65 20 75 73 65 64 0a 23 20 62 79 20 76 69 72  be used.# by vir
1100: 74 75 61 6c 20 74 61 62 6c 65 73 20 75 6e 6c 65  tual tables unle
1110: 73 73 20 6f 6d 69 74 20 77 61 73 20 73 65 74 2e  ss omit was set.
1120: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1130: 73 74 20 74 61 62 66 75 6e 63 30 31 2d 35 30 30  st tabfunc01-500
1140: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
1150: 4f 4d 20 67 65 6e 65 72 61 74 65 5f 73 65 72 69  OM generate_seri
1160: 65 73 20 57 48 45 52 45 20 73 74 61 72 74 20 49  es WHERE start I
1170: 4e 20 28 31 2c 37 29 20 41 4e 44 20 73 74 6f 70  N (1,7) AND stop
1180: 3d 32 30 20 41 4e 44 20 73 74 65 70 3d 31 30 0a  =20 AND step=10.
1190: 20 20 4f 52 44 45 52 20 42 59 20 2b 31 3b 0a 7d    ORDER BY +1;.}
11a0: 20 7b 31 20 37 20 31 31 20 31 37 7d 0a 0a 23 20   {1 7 11 17}..# 
11b0: 54 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e  Table-valued fun
11c0: 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 52 48  ctions on the RH
11d0: 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61  S of an IN opera
11e0: 74 6f 72 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  tor.#.do_execsql
11f0: 5f 74 65 73 74 20 74 61 62 66 75 6e 63 30 31 2d  _test tabfunc01-
1200: 36 30 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  600 {.  CREATE T
1210: 41 42 4c 45 20 74 36 30 30 28 61 20 49 4e 54 45  ABLE t600(a INTE
1220: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1230: 20 62 20 54 45 58 54 29 3b 0a 20 20 57 49 54 48   b TEXT);.  WITH
1240: 20 52 45 43 55 52 53 49 56 45 20 63 28 78 29 20   RECURSIVE c(x) 
1250: 41 53 20 28 56 41 4c 55 45 53 28 31 29 20 55 4e  AS (VALUES(1) UN
1260: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 78  ION ALL SELECT x
1270: 2b 31 20 46 52 4f 4d 20 63 20 57 48 45 52 45 20  +1 FROM c WHERE 
1280: 78 3c 31 30 30 29 0a 20 20 20 20 49 4e 53 45 52  x<100).    INSER
1290: 54 20 49 4e 54 4f 20 74 36 30 30 28 61 2c 62 29  T INTO t600(a,b)
12a0: 20 53 45 4c 45 43 54 20 78 2c 20 70 72 69 6e 74   SELECT x, print
12b0: 66 28 27 28 25 30 33 64 29 27 2c 78 29 20 46 52  f('(%03d)',x) FR
12c0: 4f 4d 20 63 3b 0a 20 20 53 45 4c 45 43 54 20 62  OM c;.  SELECT b
12d0: 20 46 52 4f 4d 20 74 36 30 30 20 57 48 45 52 45   FROM t600 WHERE
12e0: 20 61 20 49 4e 20 67 65 6e 65 72 61 74 65 5f 73   a IN generate_s
12f0: 65 72 69 65 73 28 32 2c 35 32 2c 31 30 29 3b 0a  eries(2,52,10);.
1300: 7d 20 7b 28 30 30 32 29 20 28 30 31 32 29 20 28  } {(002) (012) (
1310: 30 32 32 29 20 28 30 33 32 29 20 28 30 34 32 29  022) (032) (042)
1320: 20 28 30 35 32 29 7d 0a 0a 0a 64 6f 5f 74 65 73   (052)}...do_tes
1330: 74 20 74 61 62 66 75 6e 63 30 31 2d 37 30 30 20  t tabfunc01-700 
1340: 7b 0a 20 20 73 65 74 20 50 54 52 20 5b 69 6e 74  {.  set PTR [int
1350: 61 72 72 61 79 5f 61 64 64 72 20 35 20 37 20 31  array_addr 5 7 1
1360: 33 20 31 37 20 32 33 5d 0a 20 20 64 62 20 65 76  3 17 23].  db ev
1370: 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  al {.    SELECT 
1380: 62 20 46 52 4f 4d 20 74 36 30 30 2c 20 63 61 72  b FROM t600, car
1390: 72 61 79 28 24 50 54 52 2c 35 29 20 57 48 45 52  ray($PTR,5) WHER
13a0: 45 20 61 3d 76 61 6c 75 65 3b 0a 20 20 7d 0a 7d  E a=value;.  }.}
13b0: 20 7b 28 30 30 35 29 20 28 30 30 37 29 20 28 30   {(005) (007) (0
13c0: 31 33 29 20 28 30 31 37 29 20 28 30 32 33 29 7d  13) (017) (023)}
13d0: 0a 64 6f 5f 74 65 73 74 20 74 61 62 66 75 6e 63  .do_test tabfunc
13e0: 30 31 2d 37 30 31 20 7b 0a 20 20 64 62 20 65 76  01-701 {.  db ev
13f0: 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  al {.    SELECT 
1400: 62 20 46 52 4f 4d 20 74 36 30 30 20 57 48 45 52  b FROM t600 WHER
1410: 45 20 61 20 49 4e 20 63 61 72 72 61 79 28 24 50  E a IN carray($P
1420: 54 52 2c 35 2c 27 69 6e 74 33 32 27 29 3b 0a 20  TR,5,'int32');. 
1430: 20 7d 0a 7d 20 7b 28 30 30 35 29 20 28 30 30 37   }.} {(005) (007
1440: 29 20 28 30 31 33 29 20 28 30 31 37 29 20 28 30  ) (013) (017) (0
1450: 32 33 29 7d 0a 64 6f 5f 74 65 73 74 20 74 61 62  23)}.do_test tab
1460: 66 75 6e 63 30 31 2d 37 30 32 20 7b 0a 20 20 64  func01-702 {.  d
1470: 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c  b eval {.    SEL
1480: 45 43 54 20 62 20 46 52 4f 4d 20 74 36 30 30 20  ECT b FROM t600 
1490: 57 48 45 52 45 20 61 20 49 4e 20 63 61 72 72 61  WHERE a IN carra
14a0: 79 28 24 50 54 52 2c 34 2c 27 69 6e 74 33 32 27  y($PTR,4,'int32'
14b0: 29 3b 0a 20 20 7d 0a 7d 20 7b 28 30 30 35 29 20  );.  }.} {(005) 
14c0: 28 30 30 37 29 20 28 30 31 33 29 20 28 30 31 37  (007) (013) (017
14d0: 29 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  )}.do_catchsql_t
14e0: 65 73 74 20 74 61 62 66 75 6e 63 30 31 2d 37 31  est tabfunc01-71
14f0: 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 62 20 46  0 {.  SELECT b F
1500: 52 4f 4d 20 74 36 30 30 20 57 48 45 52 45 20 61  ROM t600 WHERE a
1510: 20 49 4e 20 63 61 72 72 61 79 28 24 50 54 52 2c   IN carray($PTR,
1520: 35 2c 27 69 6e 74 33 33 27 29 3b 0a 7d 20 7b 31  5,'int33');.} {1
1530: 20 7b 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 74 79   {unknown dataty
1540: 70 65 3a 20 27 69 6e 74 33 33 27 7d 7d 0a 0a 64  pe: 'int33'}}..d
1550: 6f 5f 74 65 73 74 20 74 61 62 66 75 6e 63 30 31  o_test tabfunc01
1560: 2d 37 32 30 20 7b 0a 20 20 73 65 74 20 50 54 52  -720 {.  set PTR
1570: 20 5b 69 6e 74 36 34 61 72 72 61 79 5f 61 64 64   [int64array_add
1580: 72 20 35 20 37 20 31 33 20 31 37 20 32 33 5d 0a  r 5 7 13 17 23].
1590: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20    db eval {.    
15a0: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 36  SELECT b FROM t6
15b0: 30 30 2c 20 63 61 72 72 61 79 28 24 50 54 52 2c  00, carray($PTR,
15c0: 35 2c 27 69 6e 74 36 34 27 29 20 57 48 45 52 45  5,'int64') WHERE
15d0: 20 61 3d 76 61 6c 75 65 3b 0a 20 20 7d 0a 7d 20   a=value;.  }.} 
15e0: 7b 28 30 30 35 29 20 28 30 30 37 29 20 28 30 31  {(005) (007) (01
15f0: 33 29 20 28 30 31 37 29 20 28 30 32 33 29 7d 0a  3) (017) (023)}.
1600: 0a 64 6f 5f 74 65 73 74 20 74 61 62 66 75 6e 63  .do_test tabfunc
1610: 30 31 2d 37 33 30 20 7b 0a 20 20 73 65 74 20 50  01-730 {.  set P
1620: 54 52 20 5b 64 6f 75 62 6c 65 61 72 72 61 79 5f  TR [doublearray_
1630: 61 64 64 72 20 35 2e 30 20 37 2e 30 20 31 33 2e  addr 5.0 7.0 13.
1640: 30 20 31 37 2e 30 20 32 33 2e 30 5d 0a 20 20 64  0 17.0 23.0].  d
1650: 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c  b eval {.    SEL
1660: 45 43 54 20 62 20 46 52 4f 4d 20 74 36 30 30 2c  ECT b FROM t600,
1670: 20 63 61 72 72 61 79 28 24 50 54 52 2c 35 2c 27   carray($PTR,5,'
1680: 64 6f 75 62 6c 65 27 29 20 57 48 45 52 45 20 61  double') WHERE a
1690: 3d 76 61 6c 75 65 3b 0a 20 20 7d 0a 7d 20 7b 28  =value;.  }.} {(
16a0: 30 30 35 29 20 28 30 30 37 29 20 28 30 31 33 29  005) (007) (013)
16b0: 20 28 30 31 37 29 20 28 30 32 33 29 7d 0a 0a 64   (017) (023)}..d
16c0: 6f 5f 74 65 73 74 20 74 61 62 66 75 6e 63 30 31  o_test tabfunc01
16d0: 2d 37 34 30 20 7b 0a 20 20 73 65 74 20 50 54 52  -740 {.  set PTR
16e0: 20 5b 74 65 78 74 61 72 72 61 79 5f 61 64 64 72   [textarray_addr
16f0: 20 35 20 37 20 31 33 20 31 37 20 32 33 5d 0a 20   5 7 13 17 23]. 
1700: 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 53   db eval {.    S
1710: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 36 30  ELECT b FROM t60
1720: 30 2c 20 63 61 72 72 61 79 28 24 50 54 52 2c 35  0, carray($PTR,5
1730: 2c 27 63 68 61 72 2a 27 29 20 57 48 45 52 45 20  ,'char*') WHERE 
1740: 61 3d 76 61 6c 75 65 3b 0a 20 20 7d 0a 7d 20 7b  a=value;.  }.} {
1750: 28 30 30 35 29 20 28 30 30 37 29 20 28 30 31 33  (005) (007) (013
1760: 29 20 28 30 31 37 29 20 28 30 32 33 29 7d 0a 0a  ) (017) (023)}..
1770: 0a 69 6e 74 61 72 72 61 79 5f 61 64 64 72 0a 69  .intarray_addr.i
1780: 6e 74 36 34 61 72 72 61 79 5f 61 64 64 72 0a 64  nt64array_addr.d
1790: 6f 75 62 6c 65 61 72 72 61 79 5f 61 64 64 72 0a  oublearray_addr.
17a0: 74 65 78 74 61 72 72 61 79 5f 61 64 64 72 0a 0a  textarray_addr..
17b0: 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.