/ Hex Artifact Content
Login

Artifact 9a3fd5ab3e9b3c976ad1b3d7646aab725114f2ac26b59395d0778b33bab6cdaf:


0000: 23 20 32 30 31 37 2d 30 37 2d 31 35 0a 23 0a 23  # 2017-07-15.#.#
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 54 68 69 73 20 66 69 6c 65 20 69  **.# This file i
0170: 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65 73  mplements regres
0180: 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20 53  sion tests for S
0190: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20 20  QLite library.  
01a0: 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66 20 74  The.# focus of t
01b0: 68 69 73 20 66 69 6c 65 20 69 73 20 74 68 65 20  his file is the 
01c0: 22 73 77 61 72 6d 76 74 61 62 22 20 65 78 74 65  "swarmvtab" exte
01d0: 6e 73 69 6f 6e 0a 23 0a 0a 73 65 74 20 74 65 73  nsion.#..set tes
01e0: 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61  tdir [file dirna
01f0: 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63  me $argv0].sourc
0200: 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65  e $testdir/teste
0210: 72 2e 74 63 6c 0a 73 65 74 20 74 65 73 74 70 72  r.tcl.set testpr
0220: 65 66 69 78 20 73 77 61 72 6d 76 74 61 62 0a 64  efix swarmvtab.d
0230: 6f 5f 6e 6f 74 5f 75 73 65 5f 63 6f 64 65 63 0a  o_not_use_codec.
0240: 0a 69 66 63 61 70 61 62 6c 65 20 21 76 74 61 62  .ifcapable !vtab
0250: 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74   {.  finish_test
0260: 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 6c 6f 61  .  return.}..loa
0270: 64 5f 73 74 61 74 69 63 5f 65 78 74 65 6e 73 69  d_static_extensi
0280: 6f 6e 20 64 62 20 75 6e 69 6f 6e 76 74 61 62 0a  on db unionvtab.
0290: 0a 73 65 74 20 6e 46 69 6c 65 20 24 73 71 6c 69  .set nFile $sqli
02a0: 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  te_open_file_cou
02b0: 6e 74 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  nt..do_execsql_t
02c0: 65 73 74 20 31 2e 30 20 7b 0a 20 20 43 52 45 41  est 1.0 {.  CREA
02d0: 54 45 20 54 41 42 4c 45 20 74 30 28 61 20 49 4e  TE TABLE t0(a IN
02e0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
02f0: 59 2c 20 62 20 54 45 58 54 29 3b 0a 20 20 57 49  Y, b TEXT);.  WI
0300: 54 48 20 73 28 69 29 20 41 53 20 28 20 53 45 4c  TH s(i) AS ( SEL
0310: 45 43 54 20 31 20 55 4e 49 4f 4e 20 41 4c 4c 20  ECT 1 UNION ALL 
0320: 53 45 4c 45 43 54 20 69 2b 31 20 46 52 4f 4d 20  SELECT i+1 FROM 
0330: 73 20 57 48 45 52 45 20 69 3c 34 30 30 29 20 0a  s WHERE i<400) .
0340: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 30    INSERT INTO t0
0350: 20 53 45 4c 45 43 54 20 69 2c 20 68 65 78 28 72   SELECT i, hex(r
0360: 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 29 29 20 46  andomblob(50)) F
0370: 52 4f 4d 20 73 3b 0a 0a 20 20 43 52 45 41 54 45  ROM s;..  CREATE
0380: 20 54 41 42 4c 45 20 64 69 72 28 66 2c 20 74 2c   TABLE dir(f, t,
0390: 20 69 6d 69 6e 2c 20 69 6d 61 78 29 3b 0a 7d 0a   imin, imax);.}.
03a0: 0a 64 6f 5f 74 65 73 74 20 31 2e 31 20 7b 0a 20  .do_test 1.1 {. 
03b0: 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b   for {set i 0} {
03c0: 24 69 20 3c 20 34 30 7d 20 7b 69 6e 63 72 20 69  $i < 40} {incr i
03d0: 7d 20 7b 0a 20 20 20 20 73 65 74 20 69 4d 69 6e  } {.    set iMin
03e0: 20 5b 65 78 70 72 20 24 69 2a 31 30 20 2b 20 31   [expr $i*10 + 1
03f0: 5d 0a 20 20 20 20 73 65 74 20 69 4d 61 78 20 5b  ].    set iMax [
0400: 65 78 70 72 20 24 69 4d 69 6e 2b 39 5d 0a 0a 20  expr $iMin+9].. 
0410: 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 22     forcedelete "
0420: 74 65 73 74 2e 64 62 24 69 22 0a 20 20 20 20 65  test.db$i".    e
0430: 78 65 63 73 71 6c 20 5b 73 75 62 73 74 20 7b 0a  xecsql [subst {.
0440: 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65        ATTACH 'te
0450: 73 74 2e 64 62 24 69 27 20 41 53 20 61 75 78 3b  st.db$i' AS aux;
0460: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
0470: 42 4c 45 20 61 75 78 2e 74 24 69 20 28 61 20 49  BLE aux.t$i (a I
0480: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0490: 45 59 2c 20 62 20 54 45 58 54 29 3b 0a 20 20 20  EY, b TEXT);.   
04a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
04b0: 75 78 2e 74 24 69 20 53 45 4c 45 43 54 20 2a 20  ux.t$i SELECT * 
04c0: 46 52 4f 4d 20 74 30 20 57 48 45 52 45 20 61 20  FROM t0 WHERE a 
04d0: 42 45 54 57 45 45 4e 20 24 69 4d 69 6e 20 41 4e  BETWEEN $iMin AN
04e0: 44 20 24 69 4d 61 78 3b 0a 20 20 20 20 20 20 44  D $iMax;.      D
04f0: 45 54 41 43 48 20 61 75 78 3b 0a 20 20 20 20 20  ETACH aux;.     
0500: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 69 72   INSERT INTO dir
0510: 20 56 41 4c 55 45 53 28 27 74 65 73 74 2e 64 62   VALUES('test.db
0520: 24 69 27 2c 20 27 74 24 69 27 2c 20 24 69 4d 69  $i', 't$i', $iMi
0530: 6e 2c 20 24 69 4d 61 78 29 3b 0a 20 20 20 20 7d  n, $iMax);.    }
0540: 5d 0a 20 20 7d 0a 0a 20 20 65 78 65 63 73 71 6c  ].  }..  execsql
0550: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49   {.    CREATE VI
0560: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65 6d 70  RTUAL TABLE temp
0570: 2e 73 31 20 55 53 49 4e 47 20 73 77 61 72 6d 76  .s1 USING swarmv
0580: 74 61 62 28 27 53 45 4c 45 43 54 20 2a 20 46 52  tab('SELECT * FR
0590: 4f 4d 20 64 69 72 27 29 3b 0a 20 20 7d 0a 7d 20  OM dir');.  }.} 
05a0: 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {}..do_execsql_t
05b0: 65 73 74 20 31 2e 32 20 7b 20 0a 20 20 44 52 4f  est 1.2 { .  DRO
05c0: 50 20 54 41 42 4c 45 20 73 31 3b 20 0a 7d 20 7b  P TABLE s1; .} {
05d0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
05e0: 73 74 20 31 2e 33 20 7b 0a 20 20 43 52 45 41 54  st 1.3 {.  CREAT
05f0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
0600: 74 65 6d 70 2e 73 31 20 55 53 49 4e 47 20 73 77  temp.s1 USING sw
0610: 61 72 6d 76 74 61 62 28 27 53 45 4c 45 43 54 20  armvtab('SELECT 
0620: 2a 20 46 52 4f 4d 20 64 69 72 27 29 3b 0a 20 20  * FROM dir');.  
0630: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
0640: 46 52 4f 4d 20 73 31 20 57 48 45 52 45 20 72 6f  FROM s1 WHERE ro
0650: 77 69 64 3c 35 30 3b 0a 7d 20 7b 34 39 7d 0a 0a  wid<50;.} {49}..
0660: 70 72 6f 63 20 64 6f 5f 63 6f 6d 70 61 72 65 5f  proc do_compare_
0670: 74 65 73 74 20 7b 74 6e 20 77 68 65 72 65 7d 20  test {tn where} 
0680: 7b 0a 20 20 73 65 74 20 73 71 6c 20 5b 73 75 62  {.  set sql [sub
0690: 73 74 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  st {.    SELECT 
06a0: 28 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f  (SELECT group_co
06b0: 6e 63 61 74 28 61 20 7c 7c 20 27 2c 27 20 7c 7c  ncat(a || ',' ||
06c0: 20 62 2c 20 27 2c 27 29 20 46 52 4f 4d 20 74 30   b, ',') FROM t0
06d0: 20 57 48 45 52 45 20 24 77 68 65 72 65 29 20 0a   WHERE $where) .
06e0: 20 20 20 20 20 20 20 20 20 20 20 49 53 20 0a 20             IS . 
06f0: 20 20 20 20 20 20 20 20 20 20 28 53 45 4c 45 43            (SELEC
0700: 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 61  T group_concat(a
0710: 20 7c 7c 20 27 2c 27 20 7c 7c 20 62 2c 20 27 2c   || ',' || b, ',
0720: 27 29 20 46 52 4f 4d 20 73 31 20 57 48 45 52 45  ') FROM s1 WHERE
0730: 20 24 77 68 65 72 65 29 0a 20 20 7d 5d 0a 0a 20   $where).  }].. 
0740: 20 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20 64   uplevel [list d
0750: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 24  o_execsql_test $
0760: 74 6e 20 24 73 71 6c 20 31 5d 0a 7d 0a 0a 64 6f  tn $sql 1].}..do
0770: 5f 63 6f 6d 70 61 72 65 5f 74 65 73 74 20 31 2e  _compare_test 1.
0780: 34 2e 31 20 22 72 6f 77 69 64 20 3d 20 37 30 30  4.1 "rowid = 700
0790: 22 0a 64 6f 5f 63 6f 6d 70 61 72 65 5f 74 65 73  ".do_compare_tes
07a0: 74 20 31 2e 34 2e 32 20 22 72 6f 77 69 64 20 3d  t 1.4.2 "rowid =
07b0: 20 2d 31 22 0a 64 6f 5f 63 6f 6d 70 61 72 65 5f   -1".do_compare_
07c0: 74 65 73 74 20 31 2e 34 2e 33 20 22 72 6f 77 69  test 1.4.3 "rowi
07d0: 64 20 3d 20 30 22 0a 64 6f 5f 63 6f 6d 70 61 72  d = 0".do_compar
07e0: 65 5f 74 65 73 74 20 31 2e 34 2e 34 20 22 72 6f  e_test 1.4.4 "ro
07f0: 77 69 64 20 3d 20 35 35 22 0a 64 6f 5f 63 6f 6d  wid = 55".do_com
0800: 70 61 72 65 5f 74 65 73 74 20 31 2e 34 2e 35 20  pare_test 1.4.5 
0810: 22 72 6f 77 69 64 20 42 45 54 57 45 45 4e 20 32  "rowid BETWEEN 2
0820: 30 20 41 4e 44 20 31 30 30 22 0a 64 6f 5f 63 6f  0 AND 100".do_co
0830: 6d 70 61 72 65 5f 74 65 73 74 20 31 2e 34 2e 36  mpare_test 1.4.6
0840: 20 22 72 6f 77 69 64 20 3e 20 33 35 30 22 0a 64   "rowid > 350".d
0850: 6f 5f 63 6f 6d 70 61 72 65 5f 74 65 73 74 20 31  o_compare_test 1
0860: 2e 34 2e 37 20 22 72 6f 77 69 64 20 3e 3d 20 33  .4.7 "rowid >= 3
0870: 35 30 22 0a 64 6f 5f 63 6f 6d 70 61 72 65 5f 74  50".do_compare_t
0880: 65 73 74 20 31 2e 34 2e 38 20 22 72 6f 77 69 64  est 1.4.8 "rowid
0890: 20 3e 3d 20 32 30 30 22 0a 64 6f 5f 63 6f 6d 70   >= 200".do_comp
08a0: 61 72 65 5f 74 65 73 74 20 31 2e 34 2e 39 20 22  are_test 1.4.9 "
08b0: 31 22 0a 0a 23 20 4d 75 6c 74 69 70 6c 65 20 73  1"..# Multiple s
08c0: 69 6d 75 6c 74 61 6e 65 6f 75 73 20 63 75 72 73  imultaneous curs
08d0: 6f 72 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  ors..#.do_execsq
08e0: 6c 5f 74 65 73 74 20 31 2e 35 2e 31 2e 28 35 2d  l_test 1.5.1.(5-
08f0: 73 65 63 6f 6e 64 73 2d 6f 72 2d 73 6f 29 20 7b  seconds-or-so) {
0900: 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  .  SELECT count(
0910: 2a 29 20 46 52 4f 4d 20 73 31 20 61 2c 20 73 31  *) FROM s1 a, s1
0920: 20 62 20 57 48 45 52 45 20 62 2e 72 6f 77 69 64   b WHERE b.rowid
0930: 3c 3d 32 30 30 3b 0a 7d 20 7b 38 30 30 30 30 7d  <=200;.} {80000}
0940: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0950: 20 31 2e 35 2e 32 20 7b 0a 20 20 53 45 4c 45 43   1.5.2 {.  SELEC
0960: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
0970: 73 31 20 61 2c 20 73 31 20 62 2c 20 73 31 20 63  s1 a, s1 b, s1 c
0980: 20 0a 20 20 57 48 45 52 45 20 61 2e 72 6f 77 69   .  WHERE a.rowi
0990: 64 3d 62 2e 72 6f 77 69 64 20 41 4e 44 20 62 2e  d=b.rowid AND b.
09a0: 72 6f 77 69 64 3d 63 2e 72 6f 77 69 64 3b 0a 7d  rowid=c.rowid;.}
09b0: 20 7b 34 30 30 7d 0a 0a 23 20 45 6d 70 74 79 20   {400}..# Empty 
09c0: 73 6f 75 72 63 65 20 74 61 62 6c 65 73 2e 0a 23  source tables..#
09d0: 0a 64 6f 5f 74 65 73 74 20 31 2e 36 2e 30 20 7b  .do_test 1.6.0 {
09e0: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  .  for {set i 0}
09f0: 20 7b 24 69 20 3c 20 32 30 7d 20 7b 69 6e 63 72   {$i < 20} {incr
0a00: 20 69 7d 20 7b 0a 20 20 20 20 73 71 6c 69 74 65   i} {.    sqlite
0a10: 33 20 64 62 32 20 74 65 73 74 2e 64 62 24 69 0a  3 db2 test.db$i.
0a20: 20 20 20 20 64 62 32 20 65 76 61 6c 20 22 20 44      db2 eval " D
0a30: 45 4c 45 54 45 20 46 52 4f 4d 20 74 24 69 20 22  ELETE FROM t$i "
0a40: 0a 20 20 20 20 64 62 32 20 63 6c 6f 73 65 0a 20  .    db2 close. 
0a50: 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 44   }.  db eval { D
0a60: 45 4c 45 54 45 20 46 52 4f 4d 20 74 30 20 57 48  ELETE FROM t0 WH
0a70: 45 52 45 20 72 6f 77 69 64 3c 3d 32 30 30 20 7d  ERE rowid<=200 }
0a80: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 63 6f 6d 70 61 72  .} {}..do_compar
0a90: 65 5f 74 65 73 74 20 31 2e 36 2e 31 20 22 72 6f  e_test 1.6.1 "ro
0aa0: 77 69 64 20 3d 20 37 30 30 22 0a 64 6f 5f 63 6f  wid = 700".do_co
0ab0: 6d 70 61 72 65 5f 74 65 73 74 20 31 2e 36 2e 32  mpare_test 1.6.2
0ac0: 20 22 72 6f 77 69 64 20 3d 20 2d 31 22 0a 64 6f   "rowid = -1".do
0ad0: 5f 63 6f 6d 70 61 72 65 5f 74 65 73 74 20 31 2e  _compare_test 1.
0ae0: 36 2e 33 20 22 72 6f 77 69 64 20 3d 20 30 22 0a  6.3 "rowid = 0".
0af0: 64 6f 5f 63 6f 6d 70 61 72 65 5f 74 65 73 74 20  do_compare_test 
0b00: 31 2e 36 2e 34 20 22 72 6f 77 69 64 20 3d 20 35  1.6.4 "rowid = 5
0b10: 35 22 0a 64 6f 5f 63 6f 6d 70 61 72 65 5f 74 65  5".do_compare_te
0b20: 73 74 20 31 2e 36 2e 35 20 22 72 6f 77 69 64 20  st 1.6.5 "rowid 
0b30: 42 45 54 57 45 45 4e 20 32 30 20 41 4e 44 20 31  BETWEEN 20 AND 1
0b40: 30 30 22 0a 64 6f 5f 63 6f 6d 70 61 72 65 5f 74  00".do_compare_t
0b50: 65 73 74 20 31 2e 36 2e 36 20 22 72 6f 77 69 64  est 1.6.6 "rowid
0b60: 20 3e 20 33 35 30 22 0a 64 6f 5f 63 6f 6d 70 61   > 350".do_compa
0b70: 72 65 5f 74 65 73 74 20 31 2e 36 2e 37 20 22 72  re_test 1.6.7 "r
0b80: 6f 77 69 64 20 3e 3d 20 33 35 30 22 0a 64 6f 5f  owid >= 350".do_
0b90: 63 6f 6d 70 61 72 65 5f 74 65 73 74 20 31 2e 36  compare_test 1.6
0ba0: 2e 38 20 22 72 6f 77 69 64 20 3e 3d 20 32 30 30  .8 "rowid >= 200
0bb0: 22 0a 64 6f 5f 63 6f 6d 70 61 72 65 5f 74 65 73  ".do_compare_tes
0bc0: 74 20 31 2e 36 2e 39 20 22 31 22 0a 64 6f 5f 63  t 1.6.9 "1".do_c
0bd0: 6f 6d 70 61 72 65 5f 74 65 73 74 20 31 2e 36 2e  ompare_test 1.6.
0be0: 31 30 20 22 72 6f 77 69 64 20 3e 3d 20 35 22 0a  10 "rowid >= 5".
0bf0: 0a 64 6f 5f 74 65 73 74 20 31 2e 78 20 7b 0a 20  .do_test 1.x {. 
0c00: 20 73 65 74 20 73 71 6c 69 74 65 5f 6f 70 65 6e   set sqlite_open
0c10: 5f 66 69 6c 65 5f 63 6f 75 6e 74 0a 7d 20 5b 65  _file_count.} [e
0c20: 78 70 72 20 24 6e 46 69 6c 65 2b 39 5d 0a 0a 64  xpr $nFile+9]..d
0c30: 6f 5f 74 65 73 74 20 31 2e 79 20 7b 20 64 62 20  o_test 1.y { db 
0c40: 63 6c 6f 73 65 20 7d 20 7b 7d 0a 0a 23 20 44 65  close } {}..# De
0c50: 6c 65 74 65 20 61 6c 6c 20 74 68 65 20 64 61 74  lete all the dat
0c60: 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61  abase files crea
0c70: 74 65 64 20 61 62 6f 76 65 2e 0a 23 0a 66 6f 72  ted above..#.for
0c80: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
0c90: 20 34 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 20   40} {incr i} { 
0ca0: 66 6f 72 63 65 64 65 6c 65 74 65 20 22 74 65 73  forcedelete "tes
0cb0: 74 2e 64 62 24 69 22 20 7d 0a 0a 23 2d 2d 2d 2d  t.db$i" }..#----
0cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d00: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 6f 6d  -----.# Test som
0d10: 65 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  e error conditio
0d20: 6e 73 3a 0a 23 0a 23 20 20 20 32 2e 31 3a 20 44  ns:.#.#   2.1: D
0d30: 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65  atabase file doe
0d40: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 23 20 20  s not exist..#  
0d50: 20 32 2e 32 3a 20 54 61 62 6c 65 20 64 6f 65 73   2.2: Table does
0d60: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 23 20 20 20   not exist..#   
0d70: 32 2e 33 3a 20 54 61 62 6c 65 20 73 63 68 65 6d  2.3: Table schem
0d80: 61 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  a does not match
0d90: 2e 0a 23 20 20 20 32 2e 34 3a 20 53 79 6e 74 61  ..#   2.4: Synta
0da0: 78 20 65 72 72 6f 72 20 69 6e 20 53 45 4c 45 43  x error in SELEC
0db0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 72  T statement..#.r
0dc0: 65 73 65 74 5f 64 62 0a 6c 6f 61 64 5f 73 74 61  eset_db.load_sta
0dd0: 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20 64 62  tic_extension db
0de0: 20 75 6e 69 6f 6e 76 74 61 62 0a 64 6f 5f 74 65   unionvtab.do_te
0df0: 73 74 20 32 2e 30 2e 31 20 7b 0a 20 20 64 62 20  st 2.0.1 {.  db 
0e00: 65 76 61 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  eval {.    CREAT
0e10: 45 20 54 41 42 4c 45 20 74 30 28 61 20 49 4e 54  E TABLE t0(a INT
0e20: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
0e30: 2c 20 62 20 54 45 58 54 29 3b 0a 20 20 20 20 57  , b TEXT);.    W
0e40: 49 54 48 20 73 28 69 29 20 41 53 20 28 20 53 45  ITH s(i) AS ( SE
0e50: 4c 45 43 54 20 31 20 55 4e 49 4f 4e 20 41 4c 4c  LECT 1 UNION ALL
0e60: 20 53 45 4c 45 43 54 20 69 2b 31 20 46 52 4f 4d   SELECT i+1 FROM
0e70: 20 73 20 57 48 45 52 45 20 69 3c 34 30 30 29 20   s WHERE i<400) 
0e80: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
0e90: 54 4f 20 74 30 20 53 45 4c 45 43 54 20 69 2c 20  TO t0 SELECT i, 
0ea0: 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 35  hex(randomblob(5
0eb0: 30 29 29 20 46 52 4f 4d 20 73 3b 0a 20 20 20 20  0)) FROM s;.    
0ec0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 69 72  CREATE TABLE dir
0ed0: 28 66 2c 20 74 2c 20 69 6d 69 6e 2c 20 69 6d 61  (f, t, imin, ima
0ee0: 78 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 20 7b  x);.  }..  for {
0ef0: 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 34  set i 0} {$i < 4
0f00: 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  0} {incr i} {.  
0f10: 20 20 73 65 74 20 69 4d 69 6e 20 5b 65 78 70 72    set iMin [expr
0f20: 20 24 69 2a 31 30 20 2b 20 31 5d 0a 20 20 20 20   $i*10 + 1].    
0f30: 73 65 74 20 69 4d 61 78 20 5b 65 78 70 72 20 24  set iMax [expr $
0f40: 69 4d 69 6e 2b 39 5d 0a 0a 20 20 20 20 66 6f 72  iMin+9]..    for
0f50: 63 65 64 65 6c 65 74 65 20 22 74 65 73 74 2e 64  cedelete "test.d
0f60: 62 24 69 22 0a 20 20 20 20 64 62 20 65 76 61 6c  b$i".    db eval
0f70: 20 5b 73 75 62 73 74 20 7b 0a 20 20 20 20 20 20   [subst {.      
0f80: 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62 24  ATTACH 'test.db$
0f90: 69 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 20  i' AS aux;.     
0fa0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
0fb0: 78 2e 74 24 69 20 28 61 20 49 4e 54 45 47 45 52  x.t$i (a INTEGER
0fc0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20   PRIMARY KEY, b 
0fd0: 54 45 58 54 29 3b 0a 20 20 20 20 20 20 49 4e 53  TEXT);.      INS
0fe0: 45 52 54 20 49 4e 54 4f 20 61 75 78 2e 74 24 69  ERT INTO aux.t$i
0ff0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1000: 30 20 57 48 45 52 45 20 61 20 42 45 54 57 45 45  0 WHERE a BETWEE
1010: 4e 20 24 69 4d 69 6e 20 41 4e 44 20 24 69 4d 61  N $iMin AND $iMa
1020: 78 3b 0a 20 20 20 20 20 20 44 45 54 41 43 48 20  x;.      DETACH 
1030: 61 75 78 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  aux;.      INSER
1040: 54 20 49 4e 54 4f 20 64 69 72 20 56 41 4c 55 45  T INTO dir VALUE
1050: 53 28 27 74 65 73 74 2e 64 62 24 69 27 2c 20 27  S('test.db$i', '
1060: 74 24 69 27 2c 20 24 69 4d 69 6e 2c 20 24 69 4d  t$i', $iMin, $iM
1070: 61 78 29 3b 0a 20 20 20 20 7d 5d 0a 20 20 7d 0a  ax);.    }].  }.
1080: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1090: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
10a0: 41 42 4c 45 20 74 65 6d 70 2e 73 31 20 55 53 49  ABLE temp.s1 USI
10b0: 4e 47 20 73 77 61 72 6d 76 74 61 62 28 27 53 45  NG swarmvtab('SE
10c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 69 72 27  LECT * FROM dir'
10d0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f  );.  }.} {}..do_
10e0: 74 65 73 74 20 32 2e 30 2e 32 20 7b 0a 20 20 66  test 2.0.2 {.  f
10f0: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
1100: 64 62 35 0a 0a 20 20 73 71 6c 69 74 65 33 20 64  db5..  sqlite3 d
1110: 62 32 20 74 65 73 74 2e 64 62 31 35 0a 20 20 64  b2 test.db15.  d
1120: 62 32 20 65 76 61 6c 20 7b 20 44 52 4f 50 20 54  b2 eval { DROP T
1130: 41 42 4c 45 20 74 31 35 20 7d 0a 20 20 64 62 32  ABLE t15 }.  db2
1140: 20 63 6c 6f 73 65 0a 0a 20 20 73 71 6c 69 74 65   close..  sqlite
1150: 33 20 64 62 32 20 74 65 73 74 2e 64 62 32 35 0a  3 db2 test.db25.
1160: 20 20 64 62 32 20 65 76 61 6c 20 7b 20 0a 20 20    db2 eval { .  
1170: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 35    DROP TABLE t25
1180: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
1190: 4c 45 20 74 32 35 28 78 2c 20 79 2c 20 7a 20 50  LE t25(x, y, z P
11a0: 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 7d  RIMARY KEY);.  }
11b0: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 20 7b  .  db2 close.} {
11c0: 7d 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  }..do_catchsql_t
11d0: 65 73 74 20 32 2e 31 20 7b 0a 20 20 53 45 4c 45  est 2.1 {.  SELE
11e0: 43 54 20 2a 20 46 52 4f 4d 20 73 31 20 57 48 45  CT * FROM s1 WHE
11f0: 52 45 20 72 6f 77 69 64 20 42 45 54 57 45 45 4e  RE rowid BETWEEN
1200: 20 31 20 41 4e 44 20 31 30 30 3b 0a 7d 20 7b 31   1 AND 100;.} {1
1210: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   {unable to open
1220: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 7d 7d   database file}}
1230: 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73  .do_catchsql_tes
1240: 74 20 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  t 2.2 {.  SELECT
1250: 20 2a 20 46 52 4f 4d 20 73 31 20 57 48 45 52 45   * FROM s1 WHERE
1260: 20 72 6f 77 69 64 20 42 45 54 57 45 45 4e 20 31   rowid BETWEEN 1
1270: 30 31 20 41 4e 44 20 32 30 30 3b 0a 7d 20 7b 31  01 AND 200;.} {1
1280: 20 7b 6e 6f 20 73 75 63 68 20 72 6f 77 69 64 20   {no such rowid 
1290: 74 61 62 6c 65 3a 20 74 31 35 7d 7d 0a 64 6f 5f  table: t15}}.do_
12a0: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 32 2e  catchsql_test 2.
12b0: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  3 {.  SELECT * F
12c0: 52 4f 4d 20 73 31 20 57 48 45 52 45 20 72 6f 77  ROM s1 WHERE row
12d0: 69 64 20 42 45 54 57 45 45 4e 20 32 30 31 20 41  id BETWEEN 201 A
12e0: 4e 44 20 33 30 30 3b 0a 7d 20 7b 31 20 7b 73 6f  ND 300;.} {1 {so
12f0: 75 72 63 65 20 74 61 62 6c 65 20 73 63 68 65 6d  urce table schem
1300: 61 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 0a 64 6f  a mismatch}}..do
1310: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 32  _catchsql_test 2
1320: 2e 34 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49  .4 {.  CREATE VI
1330: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65 6d 70  RTUAL TABLE temp
1340: 2e 78 31 20 55 53 49 4e 47 20 73 77 61 72 6d 76  .x1 USING swarmv
1350: 74 61 62 28 27 53 45 4c 45 43 54 20 2a 20 46 52  tab('SELECT * FR
1360: 4f 4d 64 69 72 27 29 3b 0a 7d 20 7b 31 20 7b 73  OMdir');.} {1 {s
1370: 71 6c 20 65 72 72 6f 72 3a 20 6e 65 61 72 20 22  ql error: near "
1380: 46 52 4f 4d 64 69 72 22 3a 20 73 79 6e 74 61 78  FROMdir": syntax
1390: 20 65 72 72 6f 72 7d 7d 0a 64 6f 5f 63 61 74 63   error}}.do_catc
13a0: 68 73 71 6c 5f 74 65 73 74 20 32 2e 35 20 7b 0a  hsql_test 2.5 {.
13b0: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
13c0: 20 54 41 42 4c 45 20 74 65 6d 70 2e 78 31 20 55   TABLE temp.x1 U
13d0: 53 49 4e 47 20 73 77 61 72 6d 76 74 61 62 28 27  SING swarmvtab('
13e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 64 69 72  SELECT * FROMdir
13f0: 27 2c 20 27 66 65 74 63 68 64 62 27 29 3b 0a 7d  ', 'fetchdb');.}
1400: 20 7b 31 20 7b 73 71 6c 20 65 72 72 6f 72 3a 20   {1 {sql error: 
1410: 6e 65 61 72 20 22 46 52 4f 4d 64 69 72 22 3a 20  near "FROMdir": 
1420: 73 79 6e 74 61 78 20 65 72 72 6f 72 7d 7d 0a 0a  syntax error}}..
1430: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
1440: 69 20 3c 20 34 30 7d 20 7b 69 6e 63 72 20 69 7d  i < 40} {incr i}
1450: 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65   {.  forcedelete
1460: 20 22 74 65 73 74 2e 64 62 24 69 22 0a 7d 0a 0a   "test.db$i".}..
1470: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
1480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
14c0: 74 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66  t the outcome of
14d0: 20 74 68 65 20 66 65 74 63 68 20 66 75 6e 63 74   the fetch funct
14e0: 69 6f 6e 20 74 68 72 6f 77 69 6e 67 20 61 6e 20  ion throwing an 
14f0: 65 78 63 65 70 74 69 6f 6e 2e 0a 23 0a 70 72 6f  exception..#.pro
1500: 63 20 66 65 74 63 68 5f 64 62 20 7b 66 69 6c 65  c fetch_db {file
1510: 7d 20 7b 0a 20 20 65 72 72 6f 72 20 22 66 65 74  } {.  error "fet
1520: 63 68 5f 64 62 20 65 72 72 6f 72 21 22 0a 7d 0a  ch_db error!".}.
1530: 0a 64 62 20 66 75 6e 63 20 66 65 74 63 68 5f 64  .db func fetch_d
1540: 62 20 66 65 74 63 68 5f 64 62 0a 0a 64 6f 5f 63  b fetch_db..do_c
1550: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 33 2e 31  atchsql_test 3.1
1560: 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54   {.  CREATE VIRT
1570: 55 41 4c 20 54 41 42 4c 45 20 74 65 6d 70 2e 78  UAL TABLE temp.x
1580: 79 7a 20 55 53 49 4e 47 20 73 77 61 72 6d 76 74  yz USING swarmvt
1590: 61 62 28 0a 20 20 20 20 27 56 41 4c 55 45 53 0a  ab(.    'VALUES.
15a0: 20 20 20 20 20 20 20 20 28 22 74 65 73 74 2e 64          ("test.d
15b0: 62 31 22 2c 20 22 74 31 22 2c 20 31 2c 20 31 30  b1", "t1", 1, 10
15c0: 29 2c 0a 20 20 20 20 20 20 20 20 28 22 74 65 73  ),.        ("tes
15d0: 74 2e 64 62 32 22 2c 20 22 74 31 22 2c 20 31 31  t.db2", "t1", 11
15e0: 2c 20 32 30 29 0a 20 20 20 20 27 2c 20 27 66 65  , 20).    ', 'fe
15f0: 74 63 68 5f 64 62 5f 6e 6f 5f 73 75 63 68 5f 66  tch_db_no_such_f
1600: 75 6e 63 74 69 6f 6e 27 0a 20 20 29 3b 0a 7d 20  unction'.  );.} 
1610: 7b 31 20 7b 73 71 6c 20 65 72 72 6f 72 3a 20 6e  {1 {sql error: n
1620: 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a  o such function:
1630: 20 66 65 74 63 68 5f 64 62 5f 6e 6f 5f 73 75 63   fetch_db_no_suc
1640: 68 5f 66 75 6e 63 74 69 6f 6e 7d 7d 0a 0a 64 6f  h_function}}..do
1650: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 33  _catchsql_test 3
1660: 2e 32 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49  .2 {.  CREATE VI
1670: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65 6d 70  RTUAL TABLE temp
1680: 2e 78 79 7a 20 55 53 49 4e 47 20 73 77 61 72 6d  .xyz USING swarm
1690: 76 74 61 62 28 0a 20 20 20 20 27 56 41 4c 55 45  vtab(.    'VALUE
16a0: 53 0a 20 20 20 20 20 20 20 20 28 22 74 65 73 74  S.        ("test
16b0: 2e 64 62 31 22 2c 20 22 74 31 22 2c 20 31 2c 20  .db1", "t1", 1, 
16c0: 31 30 29 2c 0a 20 20 20 20 20 20 20 20 28 22 74  10),.        ("t
16d0: 65 73 74 2e 64 62 32 22 2c 20 22 74 31 22 2c 20  est.db2", "t1", 
16e0: 31 31 2c 20 32 30 29 0a 20 20 20 20 27 2c 20 27  11, 20).    ', '
16f0: 66 65 74 63 68 5f 64 62 27 0a 20 20 29 3b 0a 7d  fetch_db'.  );.}
1700: 20 7b 31 20 7b 66 65 74 63 68 5f 64 62 20 65 72   {1 {fetch_db er
1710: 72 6f 72 21 7d 7d 0a 0a 64 6f 5f 65 78 65 63 73  ror!}}..do_execs
1720: 71 6c 5f 74 65 73 74 20 33 2e 33 2e 31 20 7b 0a  ql_test 3.3.1 {.
1730: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
1740: 62 31 27 20 41 53 20 61 75 78 3b 0a 20 20 43 52  b1' AS aux;.  CR
1750: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74  EATE TABLE aux.t
1760: 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d  1(a INTEGER PRIM
1770: 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 49  ARY KEY, b);.  I
1780: 4e 53 45 52 54 20 49 4e 54 4f 20 61 75 78 2e 74  NSERT INTO aux.t
1790: 31 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c  1 VALUES(1, NULL
17a0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
17b0: 20 61 75 78 2e 74 31 20 56 41 4c 55 45 53 28 32   aux.t1 VALUES(2
17c0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52  , NULL);.  INSER
17d0: 54 20 49 4e 54 4f 20 61 75 78 2e 74 31 20 56 41  T INTO aux.t1 VA
17e0: 4c 55 45 53 28 39 2c 20 4e 55 4c 4c 29 3b 0a 20  LUES(9, NULL);. 
17f0: 20 44 45 54 41 43 48 20 61 75 78 3b 0a 20 20 43   DETACH aux;.  C
1800: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
1810: 42 4c 45 20 74 65 6d 70 2e 78 79 7a 20 55 53 49  BLE temp.xyz USI
1820: 4e 47 20 73 77 61 72 6d 76 74 61 62 28 0a 20 20  NG swarmvtab(.  
1830: 20 20 27 56 41 4c 55 45 53 0a 20 20 20 20 20 20    'VALUES.      
1840: 20 20 28 22 74 65 73 74 2e 64 62 31 22 2c 20 22    ("test.db1", "
1850: 74 31 22 2c 20 31 2c 20 31 30 29 2c 0a 20 20 20  t1", 1, 10),.   
1860: 20 20 20 20 20 28 22 74 65 73 74 2e 64 62 32 22       ("test.db2"
1870: 2c 20 22 74 31 22 2c 20 31 31 2c 20 32 30 29 0a  , "t1", 11, 20).
1880: 20 20 20 20 27 2c 20 27 66 65 74 63 68 5f 64 62      ', 'fetch_db
1890: 27 0a 20 20 29 3b 0a 7d 20 7b 7d 0a 0a 64 6f 5f  '.  );.} {}..do_
18a0: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 33 2e  catchsql_test 3.
18b0: 33 2e 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  3.2 { SELECT * F
18c0: 52 4f 4d 20 78 79 7a 20 7d 20 7b 31 20 7b 66 65  ROM xyz } {1 {fe
18d0: 74 63 68 5f 64 62 20 65 72 72 6f 72 21 7d 7d 0a  tch_db error!}}.
18e0: 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     ...finish_test.