/ Hex Artifact Content
Login

Artifact 70ea3d5b10d40cbc87a19b0819d2842dbcdb31f2:


0000: 23 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72  # 2001 September
0010: 20 31 35 0a 23 0a 23 20 54 68 65 20 61 75 74 68   15.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 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 66 69 6c 65 20  us of this file 
01c0: 69 73 20 74 65 73 74 69 6e 67 20 62 75 69 6c 74  is testing built
01d0: 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 23  -in functions..#
01e0: 0a 23 20 24 49 64 3a 20 66 75 6e 63 2e 74 65 73  .# $Id: func.tes
01f0: 74 2c 76 20 31 2e 39 31 20 32 30 30 39 2f 30 32  t,v 1.91 2009/02
0200: 2f 30 34 20 30 33 3a 35 39 3a 32 35 20 73 68 61  /04 03:59:25 sha
0210: 6e 65 20 45 78 70 20 24 0a 0a 73 65 74 20 74 65  ne Exp $..set te
0220: 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e  stdir [file dirn
0230: 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72  ame $argv0].sour
0240: 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74  ce $testdir/test
0250: 65 72 2e 74 63 6c 0a 0a 23 20 43 72 65 61 74 65  er.tcl..# Create
0260: 20 61 20 74 61 62 6c 65 20 74 6f 20 77 6f 72 6b   a table to work
0270: 20 77 69 74 68 2e 0a 23 0a 64 6f 5f 74 65 73 74   with..#.do_test
0280: 20 66 75 6e 63 2d 30 2e 30 20 7b 0a 20 20 65 78   func-0.0 {.  ex
0290: 65 63 73 71 6c 20 7b 43 52 45 41 54 45 20 54 41  ecsql {CREATE TA
02a0: 42 4c 45 20 74 62 6c 31 28 74 31 20 74 65 78 74  BLE tbl1(t1 text
02b0: 29 7d 0a 20 20 66 6f 72 65 61 63 68 20 77 6f 72  )}.  foreach wor
02c0: 64 20 7b 74 68 69 73 20 70 72 6f 67 72 61 6d 20  d {this program 
02d0: 69 73 20 66 72 65 65 20 73 6f 66 74 77 61 72 65  is free software
02e0: 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  } {.    execsql 
02f0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c  "INSERT INTO tbl
0300: 31 20 56 41 4c 55 45 53 28 27 24 77 6f 72 64 27  1 VALUES('$word'
0310: 29 22 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  )".  }.  execsql
0320: 20 7b 53 45 4c 45 43 54 20 74 31 20 46 52 4f 4d   {SELECT t1 FROM
0330: 20 74 62 6c 31 20 4f 52 44 45 52 20 42 59 20 74   tbl1 ORDER BY t
0340: 31 7d 0a 7d 20 7b 66 72 65 65 20 69 73 20 70 72  1}.} {free is pr
0350: 6f 67 72 61 6d 20 73 6f 66 74 77 61 72 65 20 74  ogram software t
0360: 68 69 73 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  his}.do_test fun
0370: 63 2d 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  c-0.1 {.  execsq
0380: 6c 20 7b 0a 20 20 20 20 20 43 52 45 41 54 45 20  l {.     CREATE 
0390: 54 41 42 4c 45 20 74 32 28 61 29 3b 0a 20 20 20  TABLE t2(a);.   
03a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
03b0: 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20   VALUES(1);.    
03c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
03d0: 56 41 4c 55 45 53 28 4e 55 4c 4c 29 3b 0a 20 20  VALUES(NULL);.  
03e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
03f0: 32 20 56 41 4c 55 45 53 28 33 34 35 29 3b 0a 20  2 VALUES(345);. 
0400: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0410: 74 32 20 56 41 4c 55 45 53 28 4e 55 4c 4c 29 3b  t2 VALUES(NULL);
0420: 0a 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  .     INSERT INT
0430: 4f 20 74 32 20 56 41 4c 55 45 53 28 36 37 38 39  O t2 VALUES(6789
0440: 30 29 3b 0a 20 20 20 20 20 53 45 4c 45 43 54 20  0);.     SELECT 
0450: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d  * FROM t2;.  }.}
0460: 20 7b 31 20 7b 7d 20 33 34 35 20 7b 7d 20 36 37   {1 {} 345 {} 67
0470: 38 39 30 7d 0a 0a 23 20 43 68 65 63 6b 20 6f 75  890}..# Check ou
0480: 74 20 74 68 65 20 6c 65 6e 67 74 68 28 29 20 66  t the length() f
0490: 75 6e 63 74 69 6f 6e 0a 23 0a 64 6f 5f 74 65 73  unction.#.do_tes
04a0: 74 20 66 75 6e 63 2d 31 2e 30 20 7b 0a 20 20 65  t func-1.0 {.  e
04b0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6c  xecsql {SELECT l
04c0: 65 6e 67 74 68 28 74 31 29 20 46 52 4f 4d 20 74  ength(t1) FROM t
04d0: 62 6c 31 20 4f 52 44 45 52 20 42 59 20 74 31 7d  bl1 ORDER BY t1}
04e0: 0a 7d 20 7b 34 20 32 20 37 20 38 20 34 7d 0a 64  .} {4 2 7 8 4}.d
04f0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 2e 31 20  o_test func-1.1 
0500: 7b 0a 20 20 73 65 74 20 72 20 5b 63 61 74 63 68  {.  set r [catch
0510: 20 7b 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43   {execsql {SELEC
0520: 54 20 6c 65 6e 67 74 68 28 2a 29 20 46 52 4f 4d  T length(*) FROM
0530: 20 74 62 6c 31 20 4f 52 44 45 52 20 42 59 20 74   tbl1 ORDER BY t
0540: 31 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65  1}} msg].  lappe
0550: 6e 64 20 72 20 24 6d 73 67 0a 7d 20 7b 31 20 7b  nd r $msg.} {1 {
0560: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
0570: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
0580: 63 74 69 6f 6e 20 6c 65 6e 67 74 68 28 29 7d 7d  ction length()}}
0590: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 2e  .do_test func-1.
05a0: 32 20 7b 0a 20 20 73 65 74 20 72 20 5b 63 61 74  2 {.  set r [cat
05b0: 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 53 45 4c  ch {execsql {SEL
05c0: 45 43 54 20 6c 65 6e 67 74 68 28 74 31 2c 35 29  ECT length(t1,5)
05d0: 20 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52   FROM tbl1 ORDER
05e0: 20 42 59 20 74 31 7d 7d 20 6d 73 67 5d 0a 20 20   BY t1}} msg].  
05f0: 6c 61 70 70 65 6e 64 20 72 20 24 6d 73 67 0a 7d  lappend r $msg.}
0600: 20 7b 31 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65   {1 {wrong numbe
0610: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  r of arguments t
0620: 6f 20 66 75 6e 63 74 69 6f 6e 20 6c 65 6e 67 74  o function lengt
0630: 68 28 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75  h()}}.do_test fu
0640: 6e 63 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63 73  nc-1.3 {.  execs
0650: 71 6c 20 7b 53 45 4c 45 43 54 20 6c 65 6e 67 74  ql {SELECT lengt
0660: 68 28 74 31 29 2c 20 63 6f 75 6e 74 28 2a 29 20  h(t1), count(*) 
0670: 46 52 4f 4d 20 74 62 6c 31 20 47 52 4f 55 50 20  FROM tbl1 GROUP 
0680: 42 59 20 6c 65 6e 67 74 68 28 74 31 29 0a 20 20  BY length(t1).  
0690: 20 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42           ORDER B
06a0: 59 20 6c 65 6e 67 74 68 28 74 31 29 7d 0a 7d 20  Y length(t1)}.} 
06b0: 7b 32 20 31 20 34 20 32 20 37 20 31 20 38 20 31  {2 1 4 2 7 1 8 1
06c0: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31  }.do_test func-1
06d0: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
06e0: 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28  SELECT coalesce(
06f0: 6c 65 6e 67 74 68 28 61 29 2c 2d 31 29 20 46 52  length(a),-1) FR
0700: 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20 2d 31 20 33  OM t2}.} {1 -1 3
0710: 20 2d 31 20 35 7d 0a 0a 23 20 43 68 65 63 6b 20   -1 5}..# Check 
0720: 6f 75 74 20 74 68 65 20 73 75 62 73 74 72 28 29  out the substr()
0730: 20 66 75 6e 63 74 69 6f 6e 0a 23 0a 64 6f 5f 74   function.#.do_t
0740: 65 73 74 20 66 75 6e 63 2d 32 2e 30 20 7b 0a 20  est func-2.0 {. 
0750: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
0760: 20 73 75 62 73 74 72 28 74 31 2c 31 2c 32 29 20   substr(t1,1,2) 
0770: 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52 20  FROM tbl1 ORDER 
0780: 42 59 20 74 31 7d 0a 7d 20 7b 66 72 20 69 73 20  BY t1}.} {fr is 
0790: 70 72 20 73 6f 20 74 68 7d 0a 64 6f 5f 74 65 73  pr so th}.do_tes
07a0: 74 20 66 75 6e 63 2d 32 2e 31 20 7b 0a 20 20 65  t func-2.1 {.  e
07b0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 73  xecsql {SELECT s
07c0: 75 62 73 74 72 28 74 31 2c 32 2c 31 29 20 46 52  ubstr(t1,2,1) FR
07d0: 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52 20 42 59  OM tbl1 ORDER BY
07e0: 20 74 31 7d 0a 7d 20 7b 72 20 73 20 72 20 6f 20   t1}.} {r s r o 
07f0: 68 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  h}.do_test func-
0800: 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.2 {.  execsql 
0810: 7b 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 74  {SELECT substr(t
0820: 31 2c 33 2c 33 29 20 46 52 4f 4d 20 74 62 6c 31  1,3,3) FROM tbl1
0830: 20 4f 52 44 45 52 20 42 59 20 74 31 7d 0a 7d 20   ORDER BY t1}.} 
0840: 7b 65 65 20 7b 7d 20 6f 67 72 20 66 74 77 20 69  {ee {} ogr ftw i
0850: 73 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  s}.do_test func-
0860: 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.3 {.  execsql 
0870: 7b 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 74  {SELECT substr(t
0880: 31 2c 2d 31 2c 31 29 20 46 52 4f 4d 20 74 62 6c  1,-1,1) FROM tbl
0890: 31 20 4f 52 44 45 52 20 42 59 20 74 31 7d 0a 7d  1 ORDER BY t1}.}
08a0: 20 7b 65 20 73 20 6d 20 65 20 73 7d 0a 64 6f 5f   {e s m e s}.do_
08b0: 74 65 73 74 20 66 75 6e 63 2d 32 2e 34 20 7b 0a  test func-2.4 {.
08c0: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
08d0: 54 20 73 75 62 73 74 72 28 74 31 2c 2d 31 2c 32  T substr(t1,-1,2
08e0: 29 20 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44 45  ) FROM tbl1 ORDE
08f0: 52 20 42 59 20 74 31 7d 0a 7d 20 7b 65 20 73 20  R BY t1}.} {e s 
0900: 6d 20 65 20 73 7d 0a 64 6f 5f 74 65 73 74 20 66  m e s}.do_test f
0910: 75 6e 63 2d 32 2e 35 20 7b 0a 20 20 65 78 65 63  unc-2.5 {.  exec
0920: 73 71 6c 20 7b 53 45 4c 45 43 54 20 73 75 62 73  sql {SELECT subs
0930: 74 72 28 74 31 2c 2d 32 2c 31 29 20 46 52 4f 4d  tr(t1,-2,1) FROM
0940: 20 74 62 6c 31 20 4f 52 44 45 52 20 42 59 20 74   tbl1 ORDER BY t
0950: 31 7d 0a 7d 20 7b 65 20 69 20 61 20 72 20 69 7d  1}.} {e i a r i}
0960: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 2e  .do_test func-2.
0970: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  6 {.  execsql {S
0980: 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 31 2c  ELECT substr(t1,
0990: 2d 32 2c 32 29 20 46 52 4f 4d 20 74 62 6c 31 20  -2,2) FROM tbl1 
09a0: 4f 52 44 45 52 20 42 59 20 74 31 7d 0a 7d 20 7b  ORDER BY t1}.} {
09b0: 65 65 20 69 73 20 61 6d 20 72 65 20 69 73 7d 0a  ee is am re is}.
09c0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 2e 37  do_test func-2.7
09d0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
09e0: 4c 45 43 54 20 73 75 62 73 74 72 28 74 31 2c 2d  LECT substr(t1,-
09f0: 34 2c 32 29 20 46 52 4f 4d 20 74 62 6c 31 20 4f  4,2) FROM tbl1 O
0a00: 52 44 45 52 20 42 59 20 74 31 7d 0a 7d 20 7b 66  RDER BY t1}.} {f
0a10: 72 20 7b 7d 20 67 72 20 77 61 20 74 68 7d 0a 64  r {} gr wa th}.d
0a20: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 2e 38 20  o_test func-2.8 
0a30: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
0a40: 45 43 54 20 74 31 20 46 52 4f 4d 20 74 62 6c 31  ECT t1 FROM tbl1
0a50: 20 4f 52 44 45 52 20 42 59 20 73 75 62 73 74 72   ORDER BY substr
0a60: 28 74 31 2c 32 2c 32 30 29 7d 0a 7d 20 7b 74 68  (t1,2,20)}.} {th
0a70: 69 73 20 73 6f 66 74 77 61 72 65 20 66 72 65 65  is software free
0a80: 20 70 72 6f 67 72 61 6d 20 69 73 7d 0a 64 6f 5f   program is}.do_
0a90: 74 65 73 74 20 66 75 6e 63 2d 32 2e 39 20 7b 0a  test func-2.9 {.
0aa0: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
0ab0: 54 20 73 75 62 73 74 72 28 61 2c 31 2c 31 29 20  T substr(a,1,1) 
0ac0: 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20 7b 7d  FROM t2}.} {1 {}
0ad0: 20 33 20 7b 7d 20 36 7d 0a 64 6f 5f 74 65 73 74   3 {} 6}.do_test
0ae0: 20 66 75 6e 63 2d 32 2e 31 30 20 7b 0a 20 20 65   func-2.10 {.  e
0af0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 73  xecsql {SELECT s
0b00: 75 62 73 74 72 28 61 2c 32 2c 32 29 20 46 52 4f  ubstr(a,2,2) FRO
0b10: 4d 20 74 32 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20 34  M t2}.} {{} {} 4
0b20: 35 20 7b 7d 20 37 38 7d 0a 0a 23 20 4f 6e 6c 79  5 {} 78}..# Only
0b30: 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
0b40: 67 20 74 65 73 74 73 20 69 66 20 54 43 4c 20 68  g tests if TCL h
0b50: 61 73 20 55 54 46 2d 38 20 63 61 70 61 62 69 6c  as UTF-8 capabil
0b60: 69 74 69 65 73 0a 23 0a 69 66 20 7b 22 5c 75 31  ities.#.if {"\u1
0b70: 32 33 34 22 21 3d 22 75 31 32 33 34 22 7d 20 7b  234"!="u1234"} {
0b80: 0a 0a 23 20 50 75 74 20 73 6f 6d 65 20 55 54 46  ..# Put some UTF
0b90: 2d 38 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  -8 characters in
0ba0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 23 0a   the database.#.
0bb0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 33 2e 30  do_test func-3.0
0bc0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 44 45   {.  execsql {DE
0bd0: 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 31 7d 0a  LETE FROM tbl1}.
0be0: 20 20 66 6f 72 65 61 63 68 20 77 6f 72 64 20 22    foreach word "
0bf0: 63 6f 6e 74 61 69 6e 73 20 55 54 46 2d 38 20 63  contains UTF-8 c
0c00: 68 61 72 61 63 74 65 72 73 20 68 69 5c 75 31 32  haracters hi\u12
0c10: 33 34 68 6f 22 20 7b 0a 20 20 20 20 65 78 65 63  34ho" {.    exec
0c20: 73 71 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  sql "INSERT INTO
0c30: 20 74 62 6c 31 20 56 41 4c 55 45 53 28 27 24 77   tbl1 VALUES('$w
0c40: 6f 72 64 27 29 22 0a 20 20 7d 0a 20 20 65 78 65  ord')".  }.  exe
0c50: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 74 31 20  csql {SELECT t1 
0c60: 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52 20  FROM tbl1 ORDER 
0c70: 42 59 20 74 31 7d 0a 7d 20 22 55 54 46 2d 38 20  BY t1}.} "UTF-8 
0c80: 63 68 61 72 61 63 74 65 72 73 20 63 6f 6e 74 61  characters conta
0c90: 69 6e 73 20 68 69 5c 75 31 32 33 34 68 6f 22 0a  ins hi\u1234ho".
0ca0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 33 2e 31  do_test func-3.1
0cb0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
0cc0: 4c 45 43 54 20 6c 65 6e 67 74 68 28 74 31 29 20  LECT length(t1) 
0cd0: 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52 20  FROM tbl1 ORDER 
0ce0: 42 59 20 74 31 7d 0a 7d 20 7b 35 20 31 30 20 38  BY t1}.} {5 10 8
0cf0: 20 35 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63   5}.do_test func
0d00: 2d 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -3.2 {.  execsql
0d10: 20 7b 53 45 4c 45 43 54 20 73 75 62 73 74 72 28   {SELECT substr(
0d20: 74 31 2c 31 2c 32 29 20 46 52 4f 4d 20 74 62 6c  t1,1,2) FROM tbl
0d30: 31 20 4f 52 44 45 52 20 42 59 20 74 31 7d 0a 7d  1 ORDER BY t1}.}
0d40: 20 7b 55 54 20 63 68 20 63 6f 20 68 69 7d 0a 64   {UT ch co hi}.d
0d50: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 33 2e 33 20  o_test func-3.3 
0d60: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
0d70: 45 43 54 20 73 75 62 73 74 72 28 74 31 2c 31 2c  ECT substr(t1,1,
0d80: 33 29 20 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44  3) FROM tbl1 ORD
0d90: 45 52 20 42 59 20 74 31 7d 0a 7d 20 22 55 54 46  ER BY t1}.} "UTF
0da0: 20 63 68 61 20 63 6f 6e 20 68 69 5c 75 31 32 33   cha con hi\u123
0db0: 34 22 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  4".do_test func-
0dc0: 33 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.4 {.  execsql 
0dd0: 7b 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 74  {SELECT substr(t
0de0: 31 2c 32 2c 32 29 20 46 52 4f 4d 20 74 62 6c 31  1,2,2) FROM tbl1
0df0: 20 4f 52 44 45 52 20 42 59 20 74 31 7d 0a 7d 20   ORDER BY t1}.} 
0e00: 22 54 46 20 68 61 20 6f 6e 20 69 5c 75 31 32 33  "TF ha on i\u123
0e10: 34 22 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  4".do_test func-
0e20: 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.5 {.  execsql 
0e30: 7b 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 74  {SELECT substr(t
0e40: 31 2c 32 2c 33 29 20 46 52 4f 4d 20 74 62 6c 31  1,2,3) FROM tbl1
0e50: 20 4f 52 44 45 52 20 42 59 20 74 31 7d 0a 7d 20   ORDER BY t1}.} 
0e60: 22 54 46 2d 20 68 61 72 20 6f 6e 74 20 69 5c 75  "TF- har ont i\u
0e70: 31 32 33 34 68 22 0a 64 6f 5f 74 65 73 74 20 66  1234h".do_test f
0e80: 75 6e 63 2d 33 2e 36 20 7b 0a 20 20 65 78 65 63  unc-3.6 {.  exec
0e90: 73 71 6c 20 7b 53 45 4c 45 43 54 20 73 75 62 73  sql {SELECT subs
0ea0: 74 72 28 74 31 2c 33 2c 32 29 20 46 52 4f 4d 20  tr(t1,3,2) FROM 
0eb0: 74 62 6c 31 20 4f 52 44 45 52 20 42 59 20 74 31  tbl1 ORDER BY t1
0ec0: 7d 0a 7d 20 22 46 2d 20 61 72 20 6e 74 20 5c 75  }.} "F- ar nt \u
0ed0: 31 32 33 34 68 22 0a 64 6f 5f 74 65 73 74 20 66  1234h".do_test f
0ee0: 75 6e 63 2d 33 2e 37 20 7b 0a 20 20 65 78 65 63  unc-3.7 {.  exec
0ef0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 73 75 62 73  sql {SELECT subs
0f00: 74 72 28 74 31 2c 34 2c 32 29 20 46 52 4f 4d 20  tr(t1,4,2) FROM 
0f10: 74 62 6c 31 20 4f 52 44 45 52 20 42 59 20 74 31  tbl1 ORDER BY t1
0f20: 7d 0a 7d 20 22 2d 38 20 72 61 20 74 61 20 68 6f  }.} "-8 ra ta ho
0f30: 22 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 33  ".do_test func-3
0f40: 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .8 {.  execsql {
0f50: 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 31  SELECT substr(t1
0f60: 2c 2d 31 2c 31 29 20 46 52 4f 4d 20 74 62 6c 31  ,-1,1) FROM tbl1
0f70: 20 4f 52 44 45 52 20 42 59 20 74 31 7d 0a 7d 20   ORDER BY t1}.} 
0f80: 22 38 20 73 20 73 20 6f 22 0a 64 6f 5f 74 65 73  "8 s s o".do_tes
0f90: 74 20 66 75 6e 63 2d 33 2e 39 20 7b 0a 20 20 65  t func-3.9 {.  e
0fa0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 73  xecsql {SELECT s
0fb0: 75 62 73 74 72 28 74 31 2c 2d 33 2c 32 29 20 46  ubstr(t1,-3,2) F
0fc0: 52 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52 20 42  ROM tbl1 ORDER B
0fd0: 59 20 74 31 7d 0a 7d 20 22 46 2d 20 65 72 20 69  Y t1}.} "F- er i
0fe0: 6e 20 5c 75 31 32 33 34 68 22 0a 64 6f 5f 74 65  n \u1234h".do_te
0ff0: 73 74 20 66 75 6e 63 2d 33 2e 31 30 20 7b 0a 20  st func-3.10 {. 
1000: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
1010: 20 73 75 62 73 74 72 28 74 31 2c 2d 34 2c 33 29   substr(t1,-4,3)
1020: 20 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52   FROM tbl1 ORDER
1030: 20 42 59 20 74 31 7d 0a 7d 20 22 54 46 2d 20 74   BY t1}.} "TF- t
1040: 65 72 20 61 69 6e 20 69 5c 75 31 32 33 34 68 22  er ain i\u1234h"
1050: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 33 2e  .do_test func-3.
1060: 39 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  99 {.  execsql {
1070: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 31  DELETE FROM tbl1
1080: 7d 0a 20 20 66 6f 72 65 61 63 68 20 77 6f 72 64  }.  foreach word
1090: 20 7b 74 68 69 73 20 70 72 6f 67 72 61 6d 20 69   {this program i
10a0: 73 20 66 72 65 65 20 73 6f 66 74 77 61 72 65 7d  s free software}
10b0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22   {.    execsql "
10c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 31  INSERT INTO tbl1
10d0: 20 56 41 4c 55 45 53 28 27 24 77 6f 72 64 27 29   VALUES('$word')
10e0: 22 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ".  }.  execsql 
10f0: 7b 53 45 4c 45 43 54 20 74 31 20 46 52 4f 4d 20  {SELECT t1 FROM 
1100: 74 62 6c 31 7d 0a 7d 20 7b 74 68 69 73 20 70 72  tbl1}.} {this pr
1110: 6f 67 72 61 6d 20 69 73 20 66 72 65 65 20 73 6f  ogram is free so
1120: 66 74 77 61 72 65 7d 0a 0a 7d 20 3b 23 20 45 6e  ftware}..} ;# En
1130: 64 20 5c 75 31 32 33 34 21 3d 75 31 32 33 34 0a  d \u1234!=u1234.
1140: 0a 23 20 54 65 73 74 20 74 68 65 20 61 62 73 28  .# Test the abs(
1150: 29 20 61 6e 64 20 72 6f 75 6e 64 28 29 20 66 75  ) and round() fu
1160: 6e 63 74 69 6f 6e 73 2e 0a 23 0a 69 66 63 61 70  nctions..#.ifcap
1170: 61 62 6c 65 20 21 66 6c 6f 61 74 69 6e 67 70 6f  able !floatingpo
1180: 69 6e 74 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  int {.  do_test 
1190: 66 75 6e 63 2d 34 2e 31 20 7b 0a 20 20 20 20 65  func-4.1 {.    e
11a0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  xecsql {.      C
11b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
11c0: 2c 62 2c 63 29 3b 0a 20 20 20 20 20 20 49 4e 53  ,b,c);.      INS
11d0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
11e0: 45 53 28 31 2c 32 2c 33 29 3b 0a 20 20 20 20 20  ES(1,2,3);.     
11f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1200: 56 41 4c 55 45 53 28 32 2c 31 32 33 34 35 36 37  VALUES(2,1234567
1210: 38 39 30 31 32 33 34 2c 2d 31 32 33 34 35 36 37  8901234,-1234567
1220: 38 39 30 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  890);.      INSE
1230: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1240: 53 28 33 2c 2d 32 2c 2d 35 29 3b 0a 20 20 20 20  S(3,-2,-5);.    
1250: 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  }.    catchsql {
1260: 53 45 4c 45 43 54 20 61 62 73 28 61 2c 62 29 20  SELECT abs(a,b) 
1270: 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20  FROM t1}.  } {1 
1280: 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  {wrong number of
1290: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
12a0: 6e 63 74 69 6f 6e 20 61 62 73 28 29 7d 7d 0a 7d  nction abs()}}.}
12b0: 0a 69 66 63 61 70 61 62 6c 65 20 66 6c 6f 61 74  .ifcapable float
12c0: 69 6e 67 70 6f 69 6e 74 20 7b 0a 20 20 64 6f 5f  ingpoint {.  do_
12d0: 74 65 73 74 20 66 75 6e 63 2d 34 2e 31 20 7b 0a  test func-4.1 {.
12e0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
12f0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1300: 20 74 31 28 61 2c 62 2c 63 29 3b 0a 20 20 20 20   t1(a,b,c);.    
1310: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1320: 20 56 41 4c 55 45 53 28 31 2c 32 2c 33 29 3b 0a   VALUES(1,2,3);.
1330: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1340: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 31 2e  O t1 VALUES(2,1.
1350: 32 33 34 35 36 37 38 39 30 31 32 33 34 2c 2d 31  2345678901234,-1
1360: 32 33 34 35 2e 36 37 38 39 30 29 3b 0a 20 20 20  2345.67890);.   
1370: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1380: 31 20 56 41 4c 55 45 53 28 33 2c 2d 32 2c 2d 35  1 VALUES(3,-2,-5
1390: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 74  );.    }.    cat
13a0: 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 61 62  chsql {SELECT ab
13b0: 73 28 61 2c 62 29 20 46 52 4f 4d 20 74 31 7d 0a  s(a,b) FROM t1}.
13c0: 20 20 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 6e 75    } {1 {wrong nu
13d0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
13e0: 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 61 62  s to function ab
13f0: 73 28 29 7d 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20  s()}}.}.do_test 
1400: 66 75 6e 63 2d 34 2e 32 20 7b 0a 20 20 63 61 74  func-4.2 {.  cat
1410: 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 61 62  chsql {SELECT ab
1420: 73 28 29 20 46 52 4f 4d 20 74 31 7d 0a 7d 20 7b  s() FROM t1}.} {
1430: 31 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  1 {wrong number 
1440: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
1450: 66 75 6e 63 74 69 6f 6e 20 61 62 73 28 29 7d 7d  function abs()}}
1460: 0a 69 66 63 61 70 61 62 6c 65 20 66 6c 6f 61 74  .ifcapable float
1470: 69 6e 67 70 6f 69 6e 74 20 7b 0a 20 20 64 6f 5f  ingpoint {.  do_
1480: 74 65 73 74 20 66 75 6e 63 2d 34 2e 33 20 7b 0a  test func-4.3 {.
1490: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45      catchsql {SE
14a0: 4c 45 43 54 20 61 62 73 28 62 29 20 46 52 4f 4d  LECT abs(b) FROM
14b0: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 7d 0a   t1 ORDER BY a}.
14c0: 20 20 7d 20 7b 30 20 7b 32 20 31 2e 32 33 34 35    } {0 {2 1.2345
14d0: 36 37 38 39 30 31 32 33 34 20 32 7d 7d 0a 20 20  678901234 2}}.  
14e0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34 2e 34  do_test func-4.4
14f0: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
1500: 7b 53 45 4c 45 43 54 20 61 62 73 28 63 29 20 46  {SELECT abs(c) F
1510: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
1520: 61 7d 0a 20 20 7d 20 7b 30 20 7b 33 20 31 32 33  a}.  } {0 {3 123
1530: 34 35 2e 36 37 38 39 20 35 7d 7d 0a 7d 0a 69 66  45.6789 5}}.}.if
1540: 63 61 70 61 62 6c 65 20 21 66 6c 6f 61 74 69 6e  capable !floatin
1550: 67 70 6f 69 6e 74 20 7b 0a 20 20 69 66 20 7b 5b  gpoint {.  if {[
1560: 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e  working_64bit_in
1570: 74 5d 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73  t]} {.    do_tes
1580: 74 20 66 75 6e 63 2d 34 2e 33 20 7b 0a 20 20 20  t func-4.3 {.   
1590: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c     catchsql {SEL
15a0: 45 43 54 20 61 62 73 28 62 29 20 46 52 4f 4d 20  ECT abs(b) FROM 
15b0: 74 31 20 4f 52 44 45 52 20 42 59 20 61 7d 0a 20  t1 ORDER BY a}. 
15c0: 20 20 20 7d 20 7b 30 20 7b 32 20 31 32 33 34 35     } {0 {2 12345
15d0: 36 37 38 39 30 31 32 33 34 20 32 7d 7d 0a 20 20  678901234 2}}.  
15e0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63  }.  do_test func
15f0: 2d 34 2e 34 20 7b 0a 20 20 20 20 63 61 74 63 68  -4.4 {.    catch
1600: 73 71 6c 20 7b 53 45 4c 45 43 54 20 61 62 73 28  sql {SELECT abs(
1610: 63 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52  c) FROM t1 ORDER
1620: 20 42 59 20 61 7d 0a 20 20 7d 20 7b 30 20 7b 33   BY a}.  } {0 {3
1630: 20 31 32 33 34 35 36 37 38 39 30 20 35 7d 7d 0a   1234567890 5}}.
1640: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34  }.do_test func-4
1650: 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .4.1 {.  execsql
1660: 20 7b 53 45 4c 45 43 54 20 61 62 73 28 61 29 20   {SELECT abs(a) 
1670: 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20 7b 7d  FROM t2}.} {1 {}
1680: 20 33 34 35 20 7b 7d 20 36 37 38 39 30 7d 0a 64   345 {} 67890}.d
1690: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34 2e 34 2e  o_test func-4.4.
16a0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  2 {.  execsql {S
16b0: 45 4c 45 43 54 20 61 62 73 28 74 31 29 20 46 52  ELECT abs(t1) FR
16c0: 4f 4d 20 74 62 6c 31 7d 0a 7d 20 7b 30 2e 30 20  OM tbl1}.} {0.0 
16d0: 30 2e 30 20 30 2e 30 20 30 2e 30 20 30 2e 30 7d  0.0 0.0 0.0 0.0}
16e0: 0a 0a 69 66 63 61 70 61 62 6c 65 20 66 6c 6f 61  ..ifcapable floa
16f0: 74 69 6e 67 70 6f 69 6e 74 20 7b 0a 20 20 64 6f  tingpoint {.  do
1700: 5f 74 65 73 74 20 66 75 6e 63 2d 34 2e 35 20 7b  _test func-4.5 {
1710: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 53  .    catchsql {S
1720: 45 4c 45 43 54 20 72 6f 75 6e 64 28 61 2c 62 2c  ELECT round(a,b,
1730: 63 29 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20  c) FROM t1}.  } 
1740: 7b 31 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72  {1 {wrong number
1750: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
1760: 20 66 75 6e 63 74 69 6f 6e 20 72 6f 75 6e 64 28   function round(
1770: 29 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 75  )}}.  do_test fu
1780: 6e 63 2d 34 2e 36 20 7b 0a 20 20 20 20 63 61 74  nc-4.6 {.    cat
1790: 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f  chsql {SELECT ro
17a0: 75 6e 64 28 62 2c 32 29 20 46 52 4f 4d 20 74 31  und(b,2) FROM t1
17b0: 20 4f 52 44 45 52 20 42 59 20 62 7d 0a 20 20 7d   ORDER BY b}.  }
17c0: 20 7b 30 20 7b 2d 32 2e 30 20 31 2e 32 33 20 32   {0 {-2.0 1.23 2
17d0: 2e 30 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  .0}}.  do_test f
17e0: 75 6e 63 2d 34 2e 37 20 7b 0a 20 20 20 20 63 61  unc-4.7 {.    ca
17f0: 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 72  tchsql {SELECT r
1800: 6f 75 6e 64 28 62 2c 30 29 20 46 52 4f 4d 20 74  ound(b,0) FROM t
1810: 31 20 4f 52 44 45 52 20 42 59 20 61 7d 0a 20 20  1 ORDER BY a}.  
1820: 7d 20 7b 30 20 7b 32 2e 30 20 31 2e 30 20 2d 32  } {0 {2.0 1.0 -2
1830: 2e 30 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  .0}}.  do_test f
1840: 75 6e 63 2d 34 2e 38 20 7b 0a 20 20 20 20 63 61  unc-4.8 {.    ca
1850: 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 72  tchsql {SELECT r
1860: 6f 75 6e 64 28 63 29 20 46 52 4f 4d 20 74 31 20  ound(c) FROM t1 
1870: 4f 52 44 45 52 20 42 59 20 61 7d 0a 20 20 7d 20  ORDER BY a}.  } 
1880: 7b 30 20 7b 33 2e 30 20 2d 31 32 33 34 36 2e 30  {0 {3.0 -12346.0
1890: 20 2d 35 2e 30 7d 7d 0a 20 20 64 6f 5f 74 65 73   -5.0}}.  do_tes
18a0: 74 20 66 75 6e 63 2d 34 2e 39 20 7b 0a 20 20 20  t func-4.9 {.   
18b0: 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43   catchsql {SELEC
18c0: 54 20 72 6f 75 6e 64 28 63 2c 61 29 20 46 52 4f  T round(c,a) FRO
18d0: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 7d  M t1 ORDER BY a}
18e0: 0a 20 20 7d 20 7b 30 20 7b 33 2e 30 20 2d 31 32  .  } {0 {3.0 -12
18f0: 33 34 35 2e 36 38 20 2d 35 2e 30 7d 7d 0a 20 20  345.68 -5.0}}.  
1900: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34 2e 31  do_test func-4.1
1910: 30 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  0 {.    catchsql
1920: 20 7b 53 45 4c 45 43 54 20 27 78 27 20 7c 7c 20   {SELECT 'x' || 
1930: 72 6f 75 6e 64 28 63 2c 61 29 20 7c 7c 20 27 79  round(c,a) || 'y
1940: 27 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  ' FROM t1 ORDER 
1950: 42 59 20 61 7d 0a 20 20 7d 20 7b 30 20 7b 78 33  BY a}.  } {0 {x3
1960: 2e 30 79 20 78 2d 31 32 33 34 35 2e 36 38 79 20  .0y x-12345.68y 
1970: 78 2d 35 2e 30 79 7d 7d 0a 20 20 64 6f 5f 74 65  x-5.0y}}.  do_te
1980: 73 74 20 66 75 6e 63 2d 34 2e 31 31 20 7b 0a 20  st func-4.11 {. 
1990: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c     catchsql {SEL
19a0: 45 43 54 20 72 6f 75 6e 64 28 29 20 46 52 4f 4d  ECT round() FROM
19b0: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 7d 0a   t1 ORDER BY a}.
19c0: 20 20 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 6e 75    } {1 {wrong nu
19d0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
19e0: 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 72 6f  s to function ro
19f0: 75 6e 64 28 29 7d 7d 0a 20 20 64 6f 5f 74 65 73  und()}}.  do_tes
1a00: 74 20 66 75 6e 63 2d 34 2e 31 32 20 7b 0a 20 20  t func-4.12 {.  
1a10: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
1a20: 54 20 63 6f 61 6c 65 73 63 65 28 72 6f 75 6e 64  T coalesce(round
1a30: 28 61 2c 32 29 2c 27 6e 69 6c 27 29 20 46 52 4f  (a,2),'nil') FRO
1a40: 4d 20 74 32 7d 0a 20 20 7d 20 7b 31 2e 30 20 6e  M t2}.  } {1.0 n
1a50: 69 6c 20 33 34 35 2e 30 20 6e 69 6c 20 36 37 38  il 345.0 nil 678
1a60: 39 30 2e 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20  90.0}.  do_test 
1a70: 66 75 6e 63 2d 34 2e 31 33 20 7b 0a 20 20 20 20  func-4.13 {.    
1a80: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
1a90: 72 6f 75 6e 64 28 74 31 2c 32 29 20 46 52 4f 4d  round(t1,2) FROM
1aa0: 20 74 62 6c 31 7d 0a 20 20 7d 20 7b 30 2e 30 20   tbl1}.  } {0.0 
1ab0: 30 2e 30 20 30 2e 30 20 30 2e 30 20 30 2e 30 7d  0.0 0.0 0.0 0.0}
1ac0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .  do_test func-
1ad0: 34 2e 31 34 20 7b 0a 20 20 20 20 65 78 65 63 73  4.14 {.    execs
1ae0: 71 6c 20 7b 53 45 4c 45 43 54 20 74 79 70 65 6f  ql {SELECT typeo
1af0: 66 28 72 6f 75 6e 64 28 35 2e 31 2c 31 29 29 3b  f(round(5.1,1));
1b00: 7d 0a 20 20 7d 20 7b 72 65 61 6c 7d 0a 20 20 64  }.  } {real}.  d
1b10: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34 2e 31 35  o_test func-4.15
1b20: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
1b30: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 72 6f  SELECT typeof(ro
1b40: 75 6e 64 28 35 2e 31 29 29 3b 7d 0a 20 20 7d 20  und(5.1));}.  } 
1b50: 7b 72 65 61 6c 7d 0a 20 20 64 6f 5f 74 65 73 74  {real}.  do_test
1b60: 20 66 75 6e 63 2d 34 2e 31 36 20 7b 0a 20 20 20   func-4.16 {.   
1b70: 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43   catchsql {SELEC
1b80: 54 20 72 6f 75 6e 64 28 62 2c 32 2e 30 29 20 46  T round(b,2.0) F
1b90: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
1ba0: 62 7d 0a 20 20 7d 20 7b 30 20 7b 2d 32 2e 30 20  b}.  } {0 {-2.0 
1bb0: 31 2e 32 33 20 32 2e 30 7d 7d 0a 7d 0a 0a 23 20  1.23 2.0}}.}..# 
1bc0: 54 65 73 74 20 74 68 65 20 75 70 70 65 72 28 29  Test the upper()
1bd0: 20 61 6e 64 20 6c 6f 77 65 72 28 29 20 66 75 6e   and lower() fun
1be0: 63 74 69 6f 6e 73 0a 23 0a 64 6f 5f 74 65 73 74  ctions.#.do_test
1bf0: 20 66 75 6e 63 2d 35 2e 31 20 7b 0a 20 20 65 78   func-5.1 {.  ex
1c00: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 75 70  ecsql {SELECT up
1c10: 70 65 72 28 74 31 29 20 46 52 4f 4d 20 74 62 6c  per(t1) FROM tbl
1c20: 31 7d 0a 7d 20 7b 54 48 49 53 20 50 52 4f 47 52  1}.} {THIS PROGR
1c30: 41 4d 20 49 53 20 46 52 45 45 20 53 4f 46 54 57  AM IS FREE SOFTW
1c40: 41 52 45 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  ARE}.do_test fun
1c50: 63 2d 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  c-5.2 {.  execsq
1c60: 6c 20 7b 53 45 4c 45 43 54 20 6c 6f 77 65 72 28  l {SELECT lower(
1c70: 75 70 70 65 72 28 74 31 29 29 20 46 52 4f 4d 20  upper(t1)) FROM 
1c80: 74 62 6c 31 7d 0a 7d 20 7b 74 68 69 73 20 70 72  tbl1}.} {this pr
1c90: 6f 67 72 61 6d 20 69 73 20 66 72 65 65 20 73 6f  ogram is free so
1ca0: 66 74 77 61 72 65 7d 0a 64 6f 5f 74 65 73 74 20  ftware}.do_test 
1cb0: 66 75 6e 63 2d 35 2e 33 20 7b 0a 20 20 65 78 65  func-5.3 {.  exe
1cc0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 75 70 70  csql {SELECT upp
1cd0: 65 72 28 61 29 2c 20 6c 6f 77 65 72 28 61 29 20  er(a), lower(a) 
1ce0: 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20 31 20  FROM t2}.} {1 1 
1cf0: 7b 7d 20 7b 7d 20 33 34 35 20 33 34 35 20 7b 7d  {} {} 345 345 {}
1d00: 20 7b 7d 20 36 37 38 39 30 20 36 37 38 39 30 7d   {} 67890 67890}
1d10: 0a 69 66 63 61 70 61 62 6c 65 20 21 69 63 75 20  .ifcapable !icu 
1d20: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63  {.  do_test func
1d30: 2d 35 2e 34 20 7b 0a 20 20 20 20 63 61 74 63 68  -5.4 {.    catch
1d40: 73 71 6c 20 7b 53 45 4c 45 43 54 20 75 70 70 65  sql {SELECT uppe
1d50: 72 28 61 2c 35 29 20 46 52 4f 4d 20 74 32 7d 0a  r(a,5) FROM t2}.
1d60: 20 20 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 6e 75    } {1 {wrong nu
1d70: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1d80: 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 75 70  s to function up
1d90: 70 65 72 28 29 7d 7d 0a 7d 0a 64 6f 5f 74 65 73  per()}}.}.do_tes
1da0: 74 20 66 75 6e 63 2d 35 2e 35 20 7b 0a 20 20 63  t func-5.5 {.  c
1db0: 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20  atchsql {SELECT 
1dc0: 75 70 70 65 72 28 2a 29 20 46 52 4f 4d 20 74 32  upper(*) FROM t2
1dd0: 7d 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 6e 75  }.} {1 {wrong nu
1de0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1df0: 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 75 70  s to function up
1e00: 70 65 72 28 29 7d 7d 0a 0a 23 20 54 65 73 74 20  per()}}..# Test 
1e10: 74 68 65 20 63 6f 61 6c 65 73 63 65 28 29 20 61  the coalesce() a
1e20: 6e 64 20 6e 75 6c 6c 69 66 28 29 20 66 75 6e 63  nd nullif() func
1e30: 74 69 6f 6e 73 0a 23 0a 64 6f 5f 74 65 73 74 20  tions.#.do_test 
1e40: 66 75 6e 63 2d 36 2e 31 20 7b 0a 20 20 65 78 65  func-6.1 {.  exe
1e50: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 61  csql {SELECT coa
1e60: 6c 65 73 63 65 28 61 2c 27 78 79 7a 27 29 20 46  lesce(a,'xyz') F
1e70: 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20 78 79 7a  ROM t2}.} {1 xyz
1e80: 20 33 34 35 20 78 79 7a 20 36 37 38 39 30 7d 0a   345 xyz 67890}.
1e90: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 36 2e 32  do_test func-6.2
1ea0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
1eb0: 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28 75 70  LECT coalesce(up
1ec0: 70 65 72 28 61 29 2c 27 6e 69 6c 27 29 20 46 52  per(a),'nil') FR
1ed0: 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20 6e 69 6c 20  OM t2}.} {1 nil 
1ee0: 33 34 35 20 6e 69 6c 20 36 37 38 39 30 7d 0a 64  345 nil 67890}.d
1ef0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 36 2e 33 20  o_test func-6.3 
1f00: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
1f10: 45 43 54 20 63 6f 61 6c 65 73 63 65 28 6e 75 6c  ECT coalesce(nul
1f20: 6c 69 66 28 31 2c 31 29 2c 27 6e 69 6c 27 29 7d  lif(1,1),'nil')}
1f30: 0a 7d 20 7b 6e 69 6c 7d 0a 64 6f 5f 74 65 73 74  .} {nil}.do_test
1f40: 20 66 75 6e 63 2d 36 2e 34 20 7b 0a 20 20 65 78   func-6.4 {.  ex
1f50: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f  ecsql {SELECT co
1f60: 61 6c 65 73 63 65 28 6e 75 6c 6c 69 66 28 31 2c  alesce(nullif(1,
1f70: 32 29 2c 27 6e 69 6c 27 29 7d 0a 7d 20 7b 31 7d  2),'nil')}.} {1}
1f80: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 36 2e  .do_test func-6.
1f90: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  5 {.  execsql {S
1fa0: 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28 6e  ELECT coalesce(n
1fb0: 75 6c 6c 69 66 28 31 2c 4e 55 4c 4c 29 2c 27 6e  ullif(1,NULL),'n
1fc0: 69 6c 27 29 7d 0a 7d 20 7b 31 7d 0a 0a 0a 23 20  il')}.} {1}...# 
1fd0: 54 65 73 74 20 74 68 65 20 6c 61 73 74 5f 69 6e  Test the last_in
1fe0: 73 65 72 74 5f 72 6f 77 69 64 28 29 20 66 75 6e  sert_rowid() fun
1ff0: 63 74 69 6f 6e 0a 23 0a 64 6f 5f 74 65 73 74 20  ction.#.do_test 
2000: 66 75 6e 63 2d 37 2e 31 20 7b 0a 20 20 65 78 65  func-7.1 {.  exe
2010: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6c 61 73  csql {SELECT las
2020: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
2030: 7d 0a 7d 20 5b 64 62 20 6c 61 73 74 5f 69 6e 73  }.} [db last_ins
2040: 65 72 74 5f 72 6f 77 69 64 5d 0a 0a 23 20 54 65  ert_rowid]..# Te
2050: 73 74 73 20 66 6f 72 20 61 67 67 72 65 67 61 74  sts for aggregat
2060: 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
2070: 68 6f 77 20 74 68 65 79 20 68 61 6e 64 6c 65 20  how they handle 
2080: 4e 55 4c 4c 73 2e 0a 23 0a 69 66 63 61 70 61 62  NULLs..#.ifcapab
2090: 6c 65 20 66 6c 6f 61 74 69 6e 67 70 6f 69 6e 74  le floatingpoint
20a0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e   {.  do_test fun
20b0: 63 2d 38 2e 31 20 7b 0a 20 20 20 20 69 66 63 61  c-8.1 {.    ifca
20c0: 70 61 62 6c 65 20 65 78 70 6c 61 69 6e 20 7b 0a  pable explain {.
20d0: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 45        execsql {E
20e0: 58 50 4c 41 49 4e 20 53 45 4c 45 43 54 20 73 75  XPLAIN SELECT su
20f0: 6d 28 61 29 20 46 52 4f 4d 20 74 32 3b 7d 0a 20  m(a) FROM t2;}. 
2100: 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c     }.    execsql
2110: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
2120: 73 75 6d 28 61 29 2c 20 63 6f 75 6e 74 28 61 29  sum(a), count(a)
2130: 2c 20 72 6f 75 6e 64 28 61 76 67 28 61 29 2c 32  , round(avg(a),2
2140: 29 2c 20 6d 69 6e 28 61 29 2c 20 6d 61 78 28 61  ), min(a), max(a
2150: 29 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  ), count(*) FROM
2160: 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   t2;.    }.  } {
2170: 36 38 32 33 36 20 33 20 32 32 37 34 35 2e 33 33  68236 3 22745.33
2180: 20 31 20 36 37 38 39 30 20 35 7d 0a 7d 0a 69 66   1 67890 5}.}.if
2190: 63 61 70 61 62 6c 65 20 21 66 6c 6f 61 74 69 6e  capable !floatin
21a0: 67 70 6f 69 6e 74 20 7b 0a 20 20 64 6f 5f 74 65  gpoint {.  do_te
21b0: 73 74 20 66 75 6e 63 2d 38 2e 31 20 7b 0a 20 20  st func-8.1 {.  
21c0: 20 20 69 66 63 61 70 61 62 6c 65 20 65 78 70 6c    ifcapable expl
21d0: 61 69 6e 20 7b 0a 20 20 20 20 20 20 65 78 65 63  ain {.      exec
21e0: 73 71 6c 20 7b 45 58 50 4c 41 49 4e 20 53 45 4c  sql {EXPLAIN SEL
21f0: 45 43 54 20 73 75 6d 28 61 29 20 46 52 4f 4d 20  ECT sum(a) FROM 
2200: 74 32 3b 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65  t2;}.    }.    e
2210: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
2220: 45 4c 45 43 54 20 73 75 6d 28 61 29 2c 20 63 6f  ELECT sum(a), co
2230: 75 6e 74 28 61 29 2c 20 61 76 67 28 61 29 2c 20  unt(a), avg(a), 
2240: 6d 69 6e 28 61 29 2c 20 6d 61 78 28 61 29 2c 20  min(a), max(a), 
2250: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
2260: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 36 38 32  ;.    }.  } {682
2270: 33 36 20 33 20 32 32 37 34 35 2e 30 20 31 20 36  36 3 22745.0 1 6
2280: 37 38 39 30 20 35 7d 0a 7d 0a 64 6f 5f 74 65 73  7890 5}.}.do_tes
2290: 74 20 66 75 6e 63 2d 38 2e 32 20 7b 0a 20 20 65  t func-8.2 {.  e
22a0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
22b0: 45 43 54 20 6d 61 78 28 27 7a 2b 27 7c 7c 61 7c  ECT max('z+'||a|
22c0: 7c 27 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e  |'abcdefghijklmn
22d0: 6f 70 71 72 73 74 75 76 77 78 79 7a 41 42 43 44  opqrstuvwxyzABCD
22e0: 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 27 29 20 46  EFGHIJKLMNOP') F
22f0: 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 7a  ROM t2;.  }.} {z
2300: 2b 36 37 38 39 30 61 62 63 64 65 66 67 68 69 6a  +67890abcdefghij
2310: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
2320: 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
2330: 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 74 65 6d  }..ifcapable tem
2340: 70 64 62 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  pdb {.  do_test 
2350: 66 75 6e 63 2d 38 2e 33 20 7b 0a 20 20 20 20 65  func-8.3 {.    e
2360: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  xecsql {.      C
2370: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
2380: 20 74 33 20 41 53 20 53 45 4c 45 43 54 20 61 20   t3 AS SELECT a 
2390: 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
23a0: 20 61 20 44 45 53 43 3b 0a 20 20 20 20 20 20 53   a DESC;.      S
23b0: 45 4c 45 43 54 20 6d 69 6e 28 27 7a 2b 27 7c 7c  ELECT min('z+'||
23c0: 61 7c 7c 27 61 62 63 64 65 66 67 68 69 6a 6b 6c  a||'abcdefghijkl
23d0: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41 42  mnopqrstuvwxyzAB
23e0: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 27 29  CDEFGHIJKLMNOP')
23f0: 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 7d 0a   FROM t3;.    }.
2400: 20 20 7d 20 7b 7a 2b 31 61 62 63 64 65 66 67 68    } {z+1abcdefgh
2410: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
2420: 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e  yzABCDEFGHIJKLMN
2430: 4f 50 7d 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 64  OP}.} else {.  d
2440: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 38 2e 33 20  o_test func-8.3 
2450: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
2460: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
2470: 4c 45 20 74 33 20 41 53 20 53 45 4c 45 43 54 20  LE t3 AS SELECT 
2480: 61 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  a FROM t2 ORDER 
2490: 42 59 20 61 20 44 45 53 43 3b 0a 20 20 20 20 20  BY a DESC;.     
24a0: 20 53 45 4c 45 43 54 20 6d 69 6e 28 27 7a 2b 27   SELECT min('z+'
24b0: 7c 7c 61 7c 7c 27 61 62 63 64 65 66 67 68 69 6a  ||a||'abcdefghij
24c0: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
24d0: 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
24e0: 27 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20  ') FROM t3;.    
24f0: 7d 0a 20 20 7d 20 7b 7a 2b 31 61 62 63 64 65 66  }.  } {z+1abcdef
2500: 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
2510: 77 78 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c  wxyzABCDEFGHIJKL
2520: 4d 4e 4f 50 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20  MNOP}.}.do_test 
2530: 66 75 6e 63 2d 38 2e 34 20 7b 0a 20 20 65 78 65  func-8.4 {.  exe
2540: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2550: 54 20 6d 61 78 28 27 7a 2b 27 7c 7c 61 7c 7c 27  T max('z+'||a||'
2560: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
2570: 71 72 73 74 75 76 77 78 79 7a 41 42 43 44 45 46  qrstuvwxyzABCDEF
2580: 47 48 49 4a 4b 4c 4d 4e 4f 50 27 29 20 46 52 4f  GHIJKLMNOP') FRO
2590: 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 7a 2b 36  M t3;.  }.} {z+6
25a0: 37 38 39 30 61 62 63 64 65 66 67 68 69 6a 6b 6c  7890abcdefghijkl
25b0: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41 42  mnopqrstuvwxyzAB
25c0: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 7d 0a  CDEFGHIJKLMNOP}.
25d0: 69 66 63 61 70 61 62 6c 65 20 63 6f 6d 70 6f 75  ifcapable compou
25e0: 6e 64 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66  nd {.  do_test f
25f0: 75 6e 63 2d 38 2e 35 20 7b 0a 20 20 20 20 65 78  unc-8.5 {.    ex
2600: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
2610: 4c 45 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d  LECT sum(x) FROM
2620: 20 28 53 45 4c 45 43 54 20 27 39 32 32 33 33 37   (SELECT '922337
2630: 32 30 33 36 27 20 7c 7c 20 27 38 35 34 37 37 35  2036' || '854775
2640: 38 30 37 27 20 41 53 20 78 0a 20 20 20 20 20 20  807' AS x.      
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45      UNION ALL SE
2670: 4c 45 43 54 20 2d 39 32 32 33 33 37 32 30 33 36  LECT -9223372036
2680: 38 35 34 37 37 35 38 30 37 29 0a 20 20 20 20 7d  854775807).    }
2690: 0a 20 20 7d 20 7b 30 7d 0a 20 20 64 6f 5f 74 65  .  } {0}.  do_te
26a0: 73 74 20 66 75 6e 63 2d 38 2e 36 20 7b 0a 20 20  st func-8.6 {.  
26b0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
26c0: 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28    SELECT typeof(
26d0: 73 75 6d 28 78 29 29 20 46 52 4f 4d 20 28 53 45  sum(x)) FROM (SE
26e0: 4c 45 43 54 20 27 39 32 32 33 33 37 32 30 33 36  LECT '9223372036
26f0: 27 20 7c 7c 20 27 38 35 34 37 37 35 38 30 37 27  ' || '854775807'
2700: 20 41 53 20 78 0a 20 20 20 20 20 20 20 20 20 20   AS x.          
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
2730: 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37   -92233720368547
2740: 37 35 38 30 37 29 0a 20 20 20 20 7d 0a 20 20 7d  75807).    }.  }
2750: 20 7b 69 6e 74 65 67 65 72 7d 0a 20 20 64 6f 5f   {integer}.  do_
2760: 74 65 73 74 20 66 75 6e 63 2d 38 2e 37 20 7b 0a  test func-8.7 {.
2770: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
2780: 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f      SELECT typeo
2790: 66 28 73 75 6d 28 78 29 29 20 46 52 4f 4d 20 28  f(sum(x)) FROM (
27a0: 53 45 4c 45 43 54 20 27 39 32 32 33 33 37 32 30  SELECT '92233720
27b0: 33 36 27 20 7c 7c 20 27 38 35 34 37 37 35 38 30  36' || '85477580
27c0: 38 27 20 41 53 20 78 0a 20 20 20 20 20 20 20 20  8' AS x.        
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45    UNION ALL SELE
27f0: 43 54 20 2d 39 32 32 33 33 37 32 30 33 36 38 35  CT -922337203685
2800: 34 37 37 35 38 30 37 29 0a 20 20 20 20 7d 0a 20  4775807).    }. 
2810: 20 7d 20 7b 72 65 61 6c 7d 0a 69 66 63 61 70 61   } {real}.ifcapa
2820: 62 6c 65 20 66 6c 6f 61 74 69 6e 67 70 6f 69 6e  ble floatingpoin
2830: 74 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75  t {.  do_test fu
2840: 6e 63 2d 38 2e 38 20 7b 0a 20 20 20 20 65 78 65  nc-8.8 {.    exe
2850: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
2860: 45 43 54 20 73 75 6d 28 78 29 3e 30 2e 30 20 46  ECT sum(x)>0.0 F
2870: 52 4f 4d 20 28 53 45 4c 45 43 54 20 27 39 32 32  ROM (SELECT '922
2880: 33 33 37 32 30 33 36 27 20 7c 7c 20 27 38 35 34  3372036' || '854
2890: 37 37 35 38 30 38 27 20 41 53 20 78 0a 20 20 20  775808' AS x.   
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
28c0: 20 53 45 4c 45 43 54 20 2d 39 32 32 33 33 37 32   SELECT -9223372
28d0: 30 33 36 38 35 30 30 30 30 30 30 30 29 0a 20 20  036850000000).  
28e0: 20 20 7d 0a 20 20 7d 20 7b 31 7d 0a 7d 0a 69 66    }.  } {1}.}.if
28f0: 63 61 70 61 62 6c 65 20 21 66 6c 6f 61 74 69 6e  capable !floatin
2900: 67 70 6f 69 6e 74 20 7b 0a 20 20 64 6f 5f 74 65  gpoint {.  do_te
2910: 73 74 20 66 75 6e 63 2d 38 2e 38 20 7b 0a 20 20  st func-8.8 {.  
2920: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2930: 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 3e    SELECT sum(x)>
2940: 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 27  0 FROM (SELECT '
2950: 39 32 32 33 33 37 32 30 33 36 27 20 7c 7c 20 27  9223372036' || '
2960: 38 35 34 37 37 35 38 30 38 27 20 41 53 20 78 0a  854775808' AS x.
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
2990: 41 4c 4c 20 53 45 4c 45 43 54 20 2d 39 32 32 33  ALL SELECT -9223
29a0: 33 37 32 30 33 36 38 35 30 30 30 30 30 30 30 29  372036850000000)
29b0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 7d 0a 7d  .    }.  } {1}.}
29c0: 0a 7d 0a 0a 23 20 48 6f 77 20 64 6f 20 79 6f 75  .}..# How do you
29d0: 20 74 65 73 74 20 74 68 65 20 72 61 6e 64 6f 6d   test the random
29e0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 61  () function in a
29f0: 20 6d 65 61 6e 69 6e 67 66 75 6c 2c 20 64 65 74   meaningful, det
2a00: 65 72 6d 69 6e 69 73 74 69 63 20 77 61 79 3f 0a  erministic way?.
2a10: 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 39  #.do_test func-9
2a20: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
2a30: 0a 20 20 20 20 53 45 4c 45 43 54 20 72 61 6e 64  .    SELECT rand
2a40: 6f 6d 28 29 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  om() is not null
2a50: 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  ;.  }.} {1}.do_t
2a60: 65 73 74 20 66 75 6e 63 2d 39 2e 32 20 7b 0a 20  est func-9.2 {. 
2a70: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
2a80: 45 4c 45 43 54 20 74 79 70 65 6f 66 28 72 61 6e  ELECT typeof(ran
2a90: 64 6f 6d 28 29 29 3b 0a 20 20 7d 0a 7d 20 7b 69  dom());.  }.} {i
2aa0: 6e 74 65 67 65 72 7d 0a 64 6f 5f 74 65 73 74 20  nteger}.do_test 
2ab0: 66 75 6e 63 2d 39 2e 33 20 7b 0a 20 20 65 78 65  func-9.3 {.  exe
2ac0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2ad0: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 33 32 29  T randomblob(32)
2ae0: 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 3b 0a 20 20   is not null;.  
2af0: 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  }.} {1}.do_test 
2b00: 66 75 6e 63 2d 39 2e 34 20 7b 0a 20 20 65 78 65  func-9.4 {.  exe
2b10: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2b20: 54 20 74 79 70 65 6f 66 28 72 61 6e 64 6f 6d 62  T typeof(randomb
2b30: 6c 6f 62 28 33 32 29 29 3b 0a 20 20 7d 0a 7d 20  lob(32));.  }.} 
2b40: 7b 62 6c 6f 62 7d 0a 64 6f 5f 74 65 73 74 20 66  {blob}.do_test f
2b50: 75 6e 63 2d 39 2e 35 20 7b 0a 20 20 65 78 65 63  unc-9.5 {.  exec
2b60: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
2b70: 20 6c 65 6e 67 74 68 28 72 61 6e 64 6f 6d 62 6c   length(randombl
2b80: 6f 62 28 33 32 29 29 2c 20 6c 65 6e 67 74 68 28  ob(32)), length(
2b90: 72 61 6e 64 6f 6d 62 6c 6f 62 28 2d 35 29 29 2c  randomblob(-5)),
2ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e 67  .           leng
2bb0: 74 68 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30  th(randomblob(20
2bc0: 30 30 29 29 0a 20 20 7d 0a 7d 20 7b 33 32 20 31  00)).  }.} {32 1
2bd0: 20 32 30 30 30 7d 0a 0a 23 20 54 68 65 20 22 68   2000}..# The "h
2be0: 65 78 28 29 22 20 66 75 6e 63 74 69 6f 6e 20 77  ex()" function w
2bf0: 61 73 20 61 64 64 65 64 20 69 6e 20 6f 72 64 65  as added in orde
2c00: 72 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  r to be able to 
2c10: 72 65 6e 64 65 72 20 62 6c 6f 62 73 0a 23 20 67  render blobs.# g
2c20: 65 6e 65 72 61 74 65 64 20 62 79 20 72 61 6e 64  enerated by rand
2c30: 6f 6d 62 6c 6f 62 28 29 2e 20 20 53 6f 20 74 68  omblob().  So th
2c40: 69 73 20 73 65 65 6d 73 20 6c 69 6b 65 20 61 20  is seems like a 
2c50: 67 6f 6f 64 20 70 6c 61 63 65 20 74 6f 20 74 65  good place to te
2c60: 73 74 0a 23 20 68 65 78 28 29 2e 0a 23 0a 69 66  st.# hex()..#.if
2c70: 63 61 70 61 62 6c 65 20 62 6c 6f 62 6c 69 74 20  capable bloblit 
2c80: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63  {.  do_test func
2c90: 2d 39 2e 31 30 20 7b 0a 20 20 20 20 65 78 65 63  -9.10 {.    exec
2ca0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 68 65 78 28  sql {SELECT hex(
2cb0: 78 27 30 30 31 31 32 32 33 33 34 34 35 35 36 36  x'00112233445566
2cc0: 37 37 38 38 39 39 61 41 62 42 63 43 64 44 65 45  778899aAbBcCdDeE
2cd0: 66 46 27 29 7d 0a 20 20 7d 20 7b 30 30 31 31 32  fF')}.  } {00112
2ce0: 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 41  233445566778899A
2cf0: 41 42 42 43 43 44 44 45 45 46 46 7d 0a 7d 0a 73  ABBCCDDEEFF}.}.s
2d00: 65 74 20 65 6e 63 6f 64 69 6e 67 20 5b 64 62 20  et encoding [db 
2d10: 6f 6e 65 20 7b 50 52 41 47 4d 41 20 65 6e 63 6f  one {PRAGMA enco
2d20: 64 69 6e 67 7d 5d 0a 69 66 20 7b 24 65 6e 63 6f  ding}].if {$enco
2d30: 64 69 6e 67 3d 3d 22 55 54 46 2d 31 36 6c 65 22  ding=="UTF-16le"
2d40: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75  } {.  do_test fu
2d50: 6e 63 2d 39 2e 31 31 2d 75 74 66 31 36 6c 65 20  nc-9.11-utf16le 
2d60: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53  {.    execsql {S
2d70: 45 4c 45 43 54 20 68 65 78 28 72 65 70 6c 61 63  ELECT hex(replac
2d80: 65 28 27 61 62 63 64 65 66 67 27 2c 27 65 66 27  e('abcdefg','ef'
2d90: 2c 27 31 32 27 29 29 7d 0a 20 20 7d 20 7b 36 31  ,'12'))}.  } {61
2da0: 30 30 36 32 30 30 36 33 30 30 36 34 30 30 33 31  0062006300640031
2db0: 30 30 33 32 30 30 36 37 30 30 7d 0a 20 20 64 6f  0032006700}.  do
2dc0: 5f 74 65 73 74 20 66 75 6e 63 2d 39 2e 31 32 2d  _test func-9.12-
2dd0: 75 74 66 31 36 6c 65 20 7b 0a 20 20 20 20 65 78  utf16le {.    ex
2de0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 68 65  ecsql {SELECT he
2df0: 78 28 72 65 70 6c 61 63 65 28 27 61 62 63 64 65  x(replace('abcde
2e00: 66 67 27 2c 27 27 2c 27 31 32 27 29 29 7d 0a 20  fg','','12'))}. 
2e10: 20 7d 20 7b 36 31 30 30 36 32 30 30 36 33 30 30   } {610062006300
2e20: 36 34 30 30 36 35 30 30 36 36 30 30 36 37 30 30  6400650066006700
2e30: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63  }.  do_test func
2e40: 2d 39 2e 31 33 2d 75 74 66 31 36 6c 65 20 7b 0a  -9.13-utf16le {.
2e50: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c      execsql {SEL
2e60: 45 43 54 20 68 65 78 28 72 65 70 6c 61 63 65 28  ECT hex(replace(
2e70: 27 61 61 62 63 64 65 66 67 27 2c 27 61 27 2c 27  'aabcdefg','a','
2e80: 61 61 61 27 29 29 7d 0a 20 20 7d 20 7b 36 31 30  aaa'))}.  } {610
2e90: 30 36 31 30 30 36 31 30 30 36 31 30 30 36 31 30  0610061006100610
2ea0: 30 36 31 30 30 36 32 30 30 36 33 30 30 36 34 30  0610062006300640
2eb0: 30 36 35 30 30 36 36 30 30 36 37 30 30 7d 0a 7d  0650066006700}.}
2ec0: 20 65 6c 73 65 69 66 20 7b 24 65 6e 63 6f 64 69   elseif {$encodi
2ed0: 6e 67 3d 3d 22 55 54 46 2d 38 22 7d 20 7b 0a 20  ng=="UTF-8"} {. 
2ee0: 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 39 2e   do_test func-9.
2ef0: 31 31 2d 75 74 66 38 20 7b 0a 20 20 20 20 65 78  11-utf8 {.    ex
2f00: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 68 65  ecsql {SELECT he
2f10: 78 28 72 65 70 6c 61 63 65 28 27 61 62 63 64 65  x(replace('abcde
2f20: 66 67 27 2c 27 65 66 27 2c 27 31 32 27 29 29 7d  fg','ef','12'))}
2f30: 0a 20 20 7d 20 7b 36 31 36 32 36 33 36 34 33 31  .  } {6162636431
2f40: 33 32 36 37 7d 0a 20 20 64 6f 5f 74 65 73 74 20  3267}.  do_test 
2f50: 66 75 6e 63 2d 39 2e 31 32 2d 75 74 66 38 20 7b  func-9.12-utf8 {
2f60: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45  .    execsql {SE
2f70: 4c 45 43 54 20 68 65 78 28 72 65 70 6c 61 63 65  LECT hex(replace
2f80: 28 27 61 62 63 64 65 66 67 27 2c 27 27 2c 27 31  ('abcdefg','','1
2f90: 32 27 29 29 7d 0a 20 20 7d 20 7b 36 31 36 32 36  2'))}.  } {61626
2fa0: 33 36 34 36 35 36 36 36 37 7d 0a 20 20 64 6f 5f  364656667}.  do_
2fb0: 74 65 73 74 20 66 75 6e 63 2d 39 2e 31 33 2d 75  test func-9.13-u
2fc0: 74 66 38 20 7b 0a 20 20 20 20 65 78 65 63 73 71  tf8 {.    execsq
2fd0: 6c 20 7b 53 45 4c 45 43 54 20 68 65 78 28 72 65  l {SELECT hex(re
2fe0: 70 6c 61 63 65 28 27 61 61 62 63 64 65 66 67 27  place('aabcdefg'
2ff0: 2c 27 61 27 2c 27 61 61 61 27 29 29 7d 0a 20 20  ,'a','aaa'))}.  
3000: 7d 20 7b 36 31 36 31 36 31 36 31 36 31 36 31 36  } {6161616161616
3010: 32 36 33 36 34 36 35 36 36 36 37 7d 0a 7d 0a 20  26364656667}.}. 
3020: 20 0a 23 20 55 73 65 20 74 68 65 20 22 73 71 6c   .# Use the "sql
3030: 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65 73  ite_register_tes
3040: 74 5f 66 75 6e 63 74 69 6f 6e 22 20 54 43 4c 20  t_function" TCL 
3050: 63 6f 6d 6d 61 6e 64 20 77 68 69 63 68 20 69 73  command which is
3060: 20 70 61 72 74 20 6f 66 0a 23 20 74 68 65 20 74   part of.# the t
3070: 65 78 74 20 66 69 78 74 75 72 65 20 69 6e 20 6f  ext fixture in o
3080: 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 20 63  rder to verify c
3090: 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
30a0: 20 6f 66 20 73 6f 6d 65 20 6f 66 0a 23 20 74 68   of some of.# th
30b0: 65 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 53  e user-defined S
30c0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 41 50 49 73  QL function APIs
30d0: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 75 73   that are not us
30e0: 65 64 20 62 79 20 74 68 65 20 62 75 69 6c 74 2d  ed by the built-
30f0: 69 6e 0a 23 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  in.# functions..
3100: 23 0a 73 65 74 20 3a 3a 44 42 20 5b 73 71 6c 69  #.set ::DB [sqli
3110: 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70  te3_connection_p
3120: 6f 69 6e 74 65 72 20 64 62 5d 0a 73 71 6c 69 74  ointer db].sqlit
3130: 65 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f  e_register_test_
3140: 66 75 6e 63 74 69 6f 6e 20 24 3a 3a 44 42 20 74  function $::DB t
3150: 65 73 74 66 75 6e 63 0a 64 6f 5f 74 65 73 74 20  estfunc.do_test 
3160: 66 75 6e 63 2d 31 30 2e 31 20 7b 0a 20 20 63 61  func-10.1 {.  ca
3170: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
3180: 45 43 54 20 74 65 73 74 66 75 6e 63 28 4e 55 4c  ECT testfunc(NUL
3190: 4c 2c 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 7d 20 7b  L,NULL);.  }.} {
31a0: 31 20 7b 66 69 72 73 74 20 61 72 67 75 6d 65 6e  1 {first argumen
31b0: 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  t should be one 
31c0: 6f 66 3a 20 69 6e 74 20 69 6e 74 36 34 20 73 74  of: int int64 st
31d0: 72 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c  ring double null
31e0: 20 76 61 6c 75 65 7d 7d 0a 64 6f 5f 74 65 73 74   value}}.do_test
31f0: 20 66 75 6e 63 2d 31 30 2e 32 20 7b 0a 20 20 65   func-10.2 {.  e
3200: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
3210: 45 43 54 20 74 65 73 74 66 75 6e 63 28 0a 20 20  ECT testfunc(.  
3220: 20 20 20 27 73 74 72 69 6e 67 27 2c 20 27 61 62     'string', 'ab
3230: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
3240: 73 74 75 76 77 78 79 7a 41 42 43 44 45 46 47 48  stuvwxyzABCDEFGH
3250: 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
3260: 59 5a 27 2c 0a 20 20 20 20 20 27 69 6e 74 27 2c  YZ',.     'int',
3270: 20 31 32 33 34 0a 20 20 20 20 29 3b 0a 20 20 7d   1234.    );.  }
3280: 0a 7d 20 7b 31 32 33 34 7d 0a 64 6f 5f 74 65 73  .} {1234}.do_tes
3290: 74 20 66 75 6e 63 2d 31 30 2e 33 20 7b 0a 20 20  t func-10.3 {.  
32a0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
32b0: 4c 45 43 54 20 74 65 73 74 66 75 6e 63 28 0a 20  LECT testfunc(. 
32c0: 20 20 20 20 27 73 74 72 69 6e 67 27 2c 20 27 61      'string', 'a
32d0: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
32e0: 72 73 74 75 76 77 78 79 7a 41 42 43 44 45 46 47  rstuvwxyzABCDEFG
32f0: 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
3300: 58 59 5a 27 2c 0a 20 20 20 20 20 27 73 74 72 69  XYZ',.     'stri
3310: 6e 67 27 2c 20 4e 55 4c 4c 0a 20 20 20 20 29 3b  ng', NULL.    );
3320: 0a 20 20 7d 0a 7d 20 7b 7b 7d 7d 0a 0a 69 66 63  .  }.} {{}}..ifc
3330: 61 70 61 62 6c 65 20 66 6c 6f 61 74 69 6e 67 70  apable floatingp
3340: 6f 69 6e 74 20 7b 0a 20 20 64 6f 5f 74 65 73 74  oint {.  do_test
3350: 20 66 75 6e 63 2d 31 30 2e 34 20 7b 0a 20 20 20   func-10.4 {.   
3360: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
3370: 20 53 45 4c 45 43 54 20 74 65 73 74 66 75 6e 63   SELECT testfunc
3380: 28 0a 20 20 20 20 20 20 20 27 73 74 72 69 6e 67  (.       'string
3390: 27 2c 20 27 61 62 63 64 65 66 67 68 69 6a 6b 6c  ', 'abcdefghijkl
33a0: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41 42  mnopqrstuvwxyzAB
33b0: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
33c0: 53 54 55 56 57 58 59 5a 27 2c 0a 20 20 20 20 20  STUVWXYZ',.     
33d0: 20 20 27 64 6f 75 62 6c 65 27 2c 20 31 2e 32 33    'double', 1.23
33e0: 34 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  4.      );.    }
33f0: 0a 20 20 7d 20 7b 31 2e 32 33 34 7d 0a 20 20 64  .  } {1.234}.  d
3400: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 30 2e 35  o_test func-10.5
3410: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3420: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 74 65  .      SELECT te
3430: 73 74 66 75 6e 63 28 0a 20 20 20 20 20 20 20 27  stfunc(.       '
3440: 73 74 72 69 6e 67 27 2c 20 27 61 62 63 64 65 66  string', 'abcdef
3450: 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
3460: 77 78 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c  wxyzABCDEFGHIJKL
3470: 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 27 2c  MNOPQRSTUVWXYZ',
3480: 0a 20 20 20 20 20 20 20 27 69 6e 74 27 2c 20 31  .       'int', 1
3490: 32 33 34 2c 0a 20 20 20 20 20 20 20 27 73 74 72  234,.       'str
34a0: 69 6e 67 27 2c 20 27 61 62 63 64 65 66 67 68 69  ing', 'abcdefghi
34b0: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
34c0: 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  zABCDEFGHIJKLMNO
34d0: 50 51 52 53 54 55 56 57 58 59 5a 27 2c 0a 20 20  PQRSTUVWXYZ',.  
34e0: 20 20 20 20 20 27 73 74 72 69 6e 67 27 2c 20 4e       'string', N
34f0: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 27 73 74 72  ULL,.       'str
3500: 69 6e 67 27 2c 20 27 61 62 63 64 65 66 67 68 69  ing', 'abcdefghi
3510: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
3520: 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  zABCDEFGHIJKLMNO
3530: 50 51 52 53 54 55 56 57 58 59 5a 27 2c 0a 20 20  PQRSTUVWXYZ',.  
3540: 20 20 20 20 20 27 64 6f 75 62 6c 65 27 2c 20 31       'double', 1
3550: 2e 32 33 34 2c 0a 20 20 20 20 20 20 20 27 73 74  .234,.       'st
3560: 72 69 6e 67 27 2c 20 27 61 62 63 64 65 66 67 68  ring', 'abcdefgh
3570: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
3580: 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e  yzABCDEFGHIJKLMN
3590: 4f 50 51 52 53 54 55 56 57 58 59 5a 27 2c 0a 20  OPQRSTUVWXYZ',. 
35a0: 20 20 20 20 20 20 27 69 6e 74 27 2c 20 31 32 33        'int', 123
35b0: 34 2c 0a 20 20 20 20 20 20 20 27 73 74 72 69 6e  4,.       'strin
35c0: 67 27 2c 20 27 61 62 63 64 65 66 67 68 69 6a 6b  g', 'abcdefghijk
35d0: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41  lmnopqrstuvwxyzA
35e0: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
35f0: 52 53 54 55 56 57 58 59 5a 27 2c 0a 20 20 20 20  RSTUVWXYZ',.    
3600: 20 20 20 27 73 74 72 69 6e 67 27 2c 20 4e 55 4c     'string', NUL
3610: 4c 2c 0a 20 20 20 20 20 20 20 27 73 74 72 69 6e  L,.       'strin
3620: 67 27 2c 20 27 61 62 63 64 65 66 67 68 69 6a 6b  g', 'abcdefghijk
3630: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41  lmnopqrstuvwxyzA
3640: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
3650: 52 53 54 55 56 57 58 59 5a 27 2c 0a 20 20 20 20  RSTUVWXYZ',.    
3660: 20 20 20 27 64 6f 75 62 6c 65 27 2c 20 31 2e 32     'double', 1.2
3670: 33 34 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  34.      );.    
3680: 7d 0a 20 20 7d 20 7b 31 2e 32 33 34 7d 0a 7d 0a  }.  } {1.234}.}.
3690: 0a 23 20 54 65 73 74 20 74 68 65 20 62 75 69 6c  .# Test the buil
36a0: 74 2d 69 6e 20 73 71 6c 69 74 65 5f 76 65 72 73  t-in sqlite_vers
36b0: 69 6f 6e 28 2a 29 20 53 51 4c 20 66 75 6e 63 74  ion(*) SQL funct
36c0: 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66  ion..#.do_test f
36d0: 75 6e 63 2d 31 31 2e 31 20 7b 0a 20 20 65 78 65  unc-11.1 {.  exe
36e0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
36f0: 54 20 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e  T sqlite_version
3700: 28 2a 29 3b 0a 20 20 7d 0a 7d 20 5b 73 71 6c 69  (*);.  }.} [sqli
3710: 74 65 33 20 2d 76 65 72 73 69 6f 6e 5d 0a 0a 23  te3 -version]..#
3720: 20 54 65 73 74 20 74 68 61 74 20 64 65 73 74 72   Test that destr
3730: 75 63 74 6f 72 73 20 70 61 73 73 65 64 20 74 6f  uctors passed to
3740: 20 73 71 6c 69 74 65 33 20 62 79 20 63 61 6c 6c   sqlite3 by call
3750: 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 73  s to sqlite3_res
3760: 75 6c 74 5f 74 65 78 74 28 29 0a 23 20 65 74 63  ult_text().# etc
3770: 2e 20 61 72 65 20 63 61 6c 6c 65 64 2e 20 54 68  . are called. Th
3780: 65 73 65 20 74 65 73 74 73 20 75 73 65 20 74 77  ese tests use tw
3790: 6f 20 73 70 65 63 69 61 6c 20 75 73 65 72 2d 64  o special user-d
37a0: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
37b0: 0a 23 20 28 69 6d 70 6c 65 6d 65 6e 74 65 64 20  .# (implemented 
37c0: 69 6e 20 66 75 6e 63 2e 63 29 20 6f 6e 6c 79 20  in func.c) only 
37d0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 65 73  available in tes
37e0: 74 20 62 75 69 6c 64 73 2e 20 0a 23 0a 23 20 46  t builds. .#.# F
37f0: 75 6e 63 74 69 6f 6e 20 74 65 73 74 5f 64 65 73  unction test_des
3800: 74 72 75 63 74 6f 72 28 29 20 74 61 6b 65 73 20  tructor() takes 
3810: 6f 6e 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  one argument and
3820: 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20   returns a copy 
3830: 6f 66 20 74 68 65 0a 23 20 74 65 78 74 20 66 6f  of the.# text fo
3840: 72 6d 20 6f 66 20 74 68 61 74 20 61 72 67 75 6d  rm of that argum
3850: 65 6e 74 2e 20 41 20 64 65 73 74 72 75 63 74 6f  ent. A destructo
3860: 72 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20  r is associated 
3870: 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 0a  with the return.
3880: 23 20 76 61 6c 75 65 2e 20 46 75 6e 63 74 69 6f  # value. Functio
3890: 6e 20 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f  n test_destructo
38a0: 72 5f 63 6f 75 6e 74 28 29 20 72 65 74 75 72 6e  r_count() return
38b0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
38c0: 6f 75 74 73 74 61 6e 64 69 6e 67 0a 23 20 64 65  outstanding.# de
38d0: 73 74 72 75 63 74 6f 72 20 63 61 6c 6c 73 20 66  structor calls f
38e0: 6f 72 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e  or values return
38f0: 65 64 20 62 79 20 74 65 73 74 5f 64 65 73 74 72  ed by test_destr
3900: 75 63 74 6f 72 28 29 2e 0a 23 0a 69 66 20 7b 5b  uctor()..#.if {[
3910: 64 62 20 65 76 61 6c 20 7b 50 52 41 47 4d 41 20  db eval {PRAGMA 
3920: 65 6e 63 6f 64 69 6e 67 7d 5d 3d 3d 22 55 54 46  encoding}]=="UTF
3930: 2d 38 22 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  -8"} {.  do_test
3940: 20 66 75 6e 63 2d 31 32 2e 31 2d 75 74 66 38 20   func-12.1-utf8 
3950: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
3960: 20 20 20 20 20 20 53 45 4c 45 43 54 20 74 65 73        SELECT tes
3970: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 27 68 65  t_destructor('he
3980: 6c 6c 6f 20 77 6f 72 6c 64 27 29 2c 20 74 65 73  llo world'), tes
3990: 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75  t_destructor_cou
39a0: 6e 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  nt();.    }.  } 
39b0: 7b 7b 68 65 6c 6c 6f 20 77 6f 72 6c 64 7d 20 31  {{hello world} 1
39c0: 7d 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69  }.} else {.    i
39d0: 66 63 61 70 61 62 6c 65 20 7b 75 74 66 31 36 7d  fcapable {utf16}
39e0: 20 7b 0a 20 20 20 20 20 20 64 6f 5f 74 65 73 74   {.      do_test
39f0: 20 66 75 6e 63 2d 31 32 2e 31 2d 75 74 66 31 36   func-12.1-utf16
3a00: 20 7b 0a 20 20 20 20 20 20 20 20 65 78 65 63 73   {.        execs
3a10: 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 20 20 53  ql {.          S
3a20: 45 4c 45 43 54 20 74 65 73 74 5f 64 65 73 74 72  ELECT test_destr
3a30: 75 63 74 6f 72 31 36 28 27 68 65 6c 6c 6f 20 77  uctor16('hello w
3a40: 6f 72 6c 64 27 29 2c 20 74 65 73 74 5f 64 65 73  orld'), test_des
3a50: 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 28 29 3b  tructor_count();
3a60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3a70: 20 7d 20 7b 7b 68 65 6c 6c 6f 20 77 6f 72 6c 64   } {{hello world
3a80: 7d 20 31 7d 0a 20 20 20 20 7d 0a 7d 0a 64 6f 5f  } 1}.    }.}.do_
3a90: 74 65 73 74 20 66 75 6e 63 2d 31 32 2e 32 20 7b  test func-12.2 {
3aa0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3ab0: 20 53 45 4c 45 43 54 20 74 65 73 74 5f 64 65 73   SELECT test_des
3ac0: 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 28 29 3b  tructor_count();
3ad0: 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65  .  }.} {0}.do_te
3ae0: 73 74 20 66 75 6e 63 2d 31 32 2e 33 20 7b 0a 20  st func-12.3 {. 
3af0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3b00: 45 4c 45 43 54 20 74 65 73 74 5f 64 65 73 74 72  ELECT test_destr
3b10: 75 63 74 6f 72 28 27 68 65 6c 6c 6f 27 29 7c 7c  uctor('hello')||
3b20: 27 20 77 6f 72 6c 64 27 0a 20 20 7d 0a 7d 20 7b  ' world'.  }.} {
3b30: 7b 68 65 6c 6c 6f 20 77 6f 72 6c 64 7d 7d 0a 64  {hello world}}.d
3b40: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 32 2e 34  o_test func-12.4
3b50: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
3b60: 20 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f 64     SELECT test_d
3b70: 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 28  estructor_count(
3b80: 29 3b 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f  );.  }.} {0}.do_
3b90: 74 65 73 74 20 66 75 6e 63 2d 31 32 2e 35 20 7b  test func-12.5 {
3ba0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3bb0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34   CREATE TABLE t4
3bc0: 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (x);.    INSERT 
3bd0: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 74  INTO t4 VALUES(t
3be0: 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 28 27  est_destructor('
3bf0: 68 65 6c 6c 6f 27 29 29 3b 0a 20 20 20 20 49 4e  hello'));.    IN
3c00: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
3c10: 55 45 53 28 74 65 73 74 5f 64 65 73 74 72 75 63  UES(test_destruc
3c20: 74 6f 72 28 27 77 6f 72 6c 64 27 29 29 3b 0a 20  tor('world'));. 
3c30: 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 74 65     SELECT min(te
3c40: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 28 78 29  st_destructor(x)
3c50: 29 2c 20 6d 61 78 28 74 65 73 74 5f 64 65 73 74  ), max(test_dest
3c60: 72 75 63 74 6f 72 28 78 29 29 20 46 52 4f 4d 20  ructor(x)) FROM 
3c70: 74 34 3b 0a 20 20 7d 0a 7d 20 7b 68 65 6c 6c 6f  t4;.  }.} {hello
3c80: 20 77 6f 72 6c 64 7d 0a 64 6f 5f 74 65 73 74 20   world}.do_test 
3c90: 66 75 6e 63 2d 31 32 2e 36 20 7b 0a 20 20 65 78  func-12.6 {.  ex
3ca0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
3cb0: 43 54 20 74 65 73 74 5f 64 65 73 74 72 75 63 74  CT test_destruct
3cc0: 6f 72 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 7d 0a  or_count();.  }.
3cd0: 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 66 75  } {0}.do_test fu
3ce0: 6e 63 2d 31 32 2e 37 20 7b 0a 20 20 65 78 65 63  nc-12.7 {.  exec
3cf0: 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54  sql {.    DROP T
3d00: 41 42 4c 45 20 74 34 3b 0a 20 20 7d 0a 7d 20 7b  ABLE t4;.  }.} {
3d10: 7d 0a 0a 0a 23 20 54 65 73 74 20 74 68 61 74 20  }...# Test that 
3d20: 74 68 65 20 61 75 78 64 61 74 61 20 41 50 49 20  the auxdata API 
3d30: 66 6f 72 20 73 63 61 6c 61 72 20 66 75 6e 63 74  for scalar funct
3d40: 69 6f 6e 73 20 77 6f 72 6b 73 2e 20 54 68 69 73  ions works. This
3d50: 20 74 65 73 74 20 75 73 65 73 0a 23 20 61 20 73   test uses.# a s
3d60: 70 65 63 69 61 6c 20 75 73 65 72 2d 64 65 66 69  pecial user-defi
3d70: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c  ned function onl
3d80: 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  y available in t
3d90: 65 73 74 20 62 75 69 6c 64 73 2c 0a 23 20 74 65  est builds,.# te
3da0: 73 74 5f 61 75 78 64 61 74 61 28 29 2e 20 46 75  st_auxdata(). Fu
3db0: 6e 63 74 69 6f 6e 20 74 65 73 74 5f 61 75 78 64  nction test_auxd
3dc0: 61 74 61 28 29 20 74 61 6b 65 73 20 61 6e 79 20  ata() takes any 
3dd0: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
3de0: 6e 74 73 2e 0a 64 6f 5f 74 65 73 74 20 66 75 6e  nts..do_test fun
3df0: 63 2d 31 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  c-13.1 {.  execs
3e00: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
3e10: 74 65 73 74 5f 61 75 78 64 61 74 61 28 27 68 65  test_auxdata('he
3e20: 6c 6c 6f 20 77 6f 72 6c 64 27 29 3b 0a 20 20 7d  llo world');.  }
3e30: 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20  .} {0}..do_test 
3e40: 66 75 6e 63 2d 31 33 2e 32 20 7b 0a 20 20 65 78  func-13.2 {.  ex
3e50: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
3e60: 54 45 20 54 41 42 4c 45 20 74 34 28 61 2c 20 62  TE TABLE t4(a, b
3e70: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3e80: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27 61 62  TO t4 VALUES('ab
3e90: 63 27 2c 20 27 64 65 66 27 29 3b 0a 20 20 20 20  c', 'def');.    
3ea0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
3eb0: 41 4c 55 45 53 28 27 67 68 69 27 2c 20 27 6a 6b  ALUES('ghi', 'jk
3ec0: 6c 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  l');.  }.} {}.do
3ed0: 5f 74 65 73 74 20 66 75 6e 63 2d 31 33 2e 33 20  _test func-13.3 
3ee0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
3ef0: 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f 61 75    SELECT test_au
3f00: 78 64 61 74 61 28 27 68 65 6c 6c 6f 20 77 6f 72  xdata('hello wor
3f10: 6c 64 27 29 20 46 52 4f 4d 20 74 34 3b 0a 20 20  ld') FROM t4;.  
3f20: 7d 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73  }.} {0 1}.do_tes
3f30: 74 20 66 75 6e 63 2d 31 33 2e 34 20 7b 0a 20 20  t func-13.4 {.  
3f40: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
3f50: 4c 45 43 54 20 74 65 73 74 5f 61 75 78 64 61 74  LECT test_auxdat
3f60: 61 28 27 68 65 6c 6c 6f 20 77 6f 72 6c 64 27 2c  a('hello world',
3f70: 20 31 32 33 29 20 46 52 4f 4d 20 74 34 3b 0a 20   123) FROM t4;. 
3f80: 20 7d 0a 7d 20 7b 7b 30 20 30 7d 20 7b 31 20 31   }.} {{0 0} {1 1
3f90: 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  }}.do_test func-
3fa0: 31 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  13.5 {.  execsql
3fb0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 65   {.    SELECT te
3fc0: 73 74 5f 61 75 78 64 61 74 61 28 27 68 65 6c 6c  st_auxdata('hell
3fd0: 6f 20 77 6f 72 6c 64 27 2c 20 61 29 20 46 52 4f  o world', a) FRO
3fe0: 4d 20 74 34 3b 0a 20 20 7d 0a 7d 20 7b 7b 30 20  M t4;.  }.} {{0 
3ff0: 30 7d 20 7b 31 20 30 7d 7d 0a 64 6f 5f 74 65 73  0} {1 0}}.do_tes
4000: 74 20 66 75 6e 63 2d 31 33 2e 36 20 7b 0a 20 20  t func-13.6 {.  
4010: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
4020: 4c 45 43 54 20 74 65 73 74 5f 61 75 78 64 61 74  LECT test_auxdat
4030: 61 28 27 68 65 6c 6c 6f 27 7c 7c 27 77 6f 72 6c  a('hello'||'worl
4040: 64 27 2c 20 61 29 20 46 52 4f 4d 20 74 34 3b 0a  d', a) FROM t4;.
4050: 20 20 7d 0a 7d 20 7b 7b 30 20 30 7d 20 7b 31 20    }.} {{0 0} {1 
4060: 30 7d 7d 0a 0a 23 20 54 65 73 74 20 74 68 61 74  0}}..# Test that
4070: 20 61 75 78 69 6c 61 72 79 20 64 61 74 61 20 69   auxilary data i
4080: 73 20 70 72 65 73 65 72 76 65 64 20 62 65 74 77  s preserved betw
4090: 65 65 6e 20 63 61 6c 6c 73 20 66 6f 72 20 53 51  een calls for SQ
40a0: 4c 20 76 61 72 69 61 62 6c 65 73 2e 0a 64 6f 5f  L variables..do_
40b0: 74 65 73 74 20 66 75 6e 63 2d 31 33 2e 37 20 7b  test func-13.7 {
40c0: 0a 20 20 73 65 74 20 44 42 20 5b 73 71 6c 69 74  .  set DB [sqlit
40d0: 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e3_connection_po
40e0: 69 6e 74 65 72 20 64 62 5d 0a 20 20 73 65 74 20  inter db].  set 
40f0: 73 71 6c 20 22 53 45 4c 45 43 54 20 74 65 73 74  sql "SELECT test
4100: 5f 61 75 78 64 61 74 61 28 20 3f 20 2c 20 61 20  _auxdata( ? , a 
4110: 29 20 46 52 4f 4d 20 74 34 3b 22 0a 20 20 73 65  ) FROM t4;".  se
4120: 74 20 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f  t STMT [sqlite3_
4130: 70 72 65 70 61 72 65 20 24 44 42 20 24 73 71 6c  prepare $DB $sql
4140: 20 2d 31 20 54 41 49 4c 5d 0a 20 20 73 71 6c 69   -1 TAIL].  sqli
4150: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 24 53  te3_bind_text $S
4160: 54 4d 54 20 31 20 68 65 6c 6c 6f 5c 30 30 30 20  TMT 1 hello\000 
4170: 2d 31 0a 20 20 73 65 74 20 72 65 73 20 5b 6c 69  -1.  set res [li
4180: 73 74 5d 0a 20 20 77 68 69 6c 65 20 7b 20 22 53  st].  while { "S
4190: 51 4c 49 54 45 5f 52 4f 57 22 3d 3d 5b 73 71 6c  QLITE_ROW"==[sql
41a0: 69 74 65 33 5f 73 74 65 70 20 24 53 54 4d 54 5d  ite3_step $STMT]
41b0: 20 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64   } {.    lappend
41c0: 20 72 65 73 20 5b 73 71 6c 69 74 65 33 5f 63 6f   res [sqlite3_co
41d0: 6c 75 6d 6e 5f 74 65 78 74 20 24 53 54 4d 54 20  lumn_text $STMT 
41e0: 30 5d 0a 20 20 7d 0a 20 20 6c 61 70 70 65 6e 64  0].  }.  lappend
41f0: 20 72 65 73 20 5b 73 71 6c 69 74 65 33 5f 66 69   res [sqlite3_fi
4200: 6e 61 6c 69 7a 65 20 24 53 54 4d 54 5d 0a 7d 20  nalize $STMT].} 
4210: 7b 7b 30 20 30 7d 20 7b 31 20 30 7d 20 53 51 4c  {{0 0} {1 0} SQL
4220: 49 54 45 5f 4f 4b 7d 0a 0a 23 20 4d 61 6b 65 20  ITE_OK}..# Make 
4230: 73 75 72 65 20 74 68 61 74 20 61 20 66 75 6e 63  sure that a func
4240: 74 69 6f 6e 20 77 69 74 68 20 61 20 76 65 72 79  tion with a very
4250: 20 6c 6f 6e 67 20 6e 61 6d 65 20 69 73 20 72 65   long name is re
4260: 6a 65 63 74 65 64 0a 64 6f 5f 74 65 73 74 20 66  jected.do_test f
4270: 75 6e 63 2d 31 34 2e 31 20 7b 0a 20 20 63 61 74  unc-14.1 {.  cat
4280: 63 68 20 7b 0a 20 20 20 20 64 62 20 66 75 6e 63  ch {.    db func
4290: 74 69 6f 6e 20 5b 73 74 72 69 6e 67 20 72 65 70  tion [string rep
42a0: 65 61 74 20 58 20 32 35 34 5d 20 7b 72 65 74 75  eat X 254] {retu
42b0: 72 6e 20 22 68 65 6c 6c 6f 22 7d 0a 20 20 7d 20  rn "hello"}.  } 
42c0: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 66  .} {0}.do_test f
42d0: 75 6e 63 2d 31 34 2e 32 20 7b 0a 20 20 63 61 74  unc-14.2 {.  cat
42e0: 63 68 20 7b 0a 20 20 20 20 64 62 20 66 75 6e 63  ch {.    db func
42f0: 74 69 6f 6e 20 5b 73 74 72 69 6e 67 20 72 65 70  tion [string rep
4300: 65 61 74 20 58 20 32 35 36 5d 20 7b 72 65 74 75  eat X 256] {retu
4310: 72 6e 20 22 68 65 6c 6c 6f 22 7d 0a 20 20 7d 0a  rn "hello"}.  }.
4320: 7d 20 7b 31 7d 0a 0a 64 6f 5f 74 65 73 74 20 66  } {1}..do_test f
4330: 75 6e 63 2d 31 35 2e 31 20 7b 0a 20 20 63 61 74  unc-15.1 {.  cat
4340: 63 68 73 71 6c 20 7b 73 65 6c 65 63 74 20 74 65  chsql {select te
4350: 73 74 5f 65 72 72 6f 72 28 4e 55 4c 4c 29 7d 0a  st_error(NULL)}.
4360: 7d 20 7b 31 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74  } {1 {}}.do_test
4370: 20 66 75 6e 63 2d 31 35 2e 32 20 7b 0a 20 20 63   func-15.2 {.  c
4380: 61 74 63 68 73 71 6c 20 7b 73 65 6c 65 63 74 20  atchsql {select 
4390: 74 65 73 74 5f 65 72 72 6f 72 28 27 74 68 69 73  test_error('this
43a0: 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 6d 65   is the error me
43b0: 73 73 61 67 65 27 29 7d 0a 7d 20 7b 31 20 7b 74  ssage')}.} {1 {t
43c0: 68 69 73 20 69 73 20 74 68 65 20 65 72 72 6f 72  his is the error
43d0: 20 6d 65 73 73 61 67 65 7d 7d 0a 64 6f 5f 74 65   message}}.do_te
43e0: 73 74 20 66 75 6e 63 2d 31 35 2e 33 20 7b 0a 20  st func-15.3 {. 
43f0: 20 63 61 74 63 68 73 71 6c 20 7b 73 65 6c 65 63   catchsql {selec
4400: 74 20 74 65 73 74 5f 65 72 72 6f 72 28 27 74 68  t test_error('th
4410: 69 73 20 69 73 20 74 68 65 20 65 72 72 6f 72 20  is is the error 
4420: 6d 65 73 73 61 67 65 27 2c 31 32 29 7d 0a 7d 20  message',12)}.} 
4430: 7b 31 20 7b 74 68 69 73 20 69 73 20 74 68 65 20  {1 {this is the 
4440: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 7d 7d 0a  error message}}.
4450: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 35 2e  do_test func-15.
4460: 34 20 7b 0a 20 20 64 62 20 65 72 72 6f 72 63 6f  4 {.  db errorco
4470: 64 65 0a 7d 20 7b 31 32 7d 0a 0a 23 20 54 65 73  de.} {12}..# Tes
4480: 74 20 74 68 65 20 71 75 6f 74 65 20 66 75 6e 63  t the quote func
4490: 74 69 6f 6e 20 66 6f 72 20 42 4c 4f 42 20 61 6e  tion for BLOB an
44a0: 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 64  d NULL values..d
44b0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 36 2e 31  o_test func-16.1
44c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
44d0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
44e0: 74 62 6c 32 28 61 2c 20 62 29 3b 0a 20 20 7d 0a  tbl2(a, b);.  }.
44f0: 20 20 73 65 74 20 53 54 4d 54 20 5b 73 71 6c 69    set STMT [sqli
4500: 74 65 33 5f 70 72 65 70 61 72 65 20 24 3a 3a 44  te3_prepare $::D
4510: 42 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  B "INSERT INTO t
4520: 62 6c 32 20 56 41 4c 55 45 53 28 3f 2c 20 3f 29  bl2 VALUES(?, ?)
4530: 22 20 2d 31 20 54 41 49 4c 5d 0a 20 20 73 71 6c  " -1 TAIL].  sql
4540: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 24  ite3_bind_blob $
4550: 3a 3a 53 54 4d 54 20 31 20 61 62 63 20 33 0a 20  ::STMT 1 abc 3. 
4560: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a   sqlite3_step $:
4570: 3a 53 54 4d 54 0a 20 20 73 71 6c 69 74 65 33 5f  :STMT.  sqlite3_
4580: 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54 4d 54  finalize $::STMT
4590: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
45a0: 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 61 29   SELECT quote(a)
45b0: 2c 20 71 75 6f 74 65 28 62 29 20 46 52 4f 4d 20  , quote(b) FROM 
45c0: 74 62 6c 32 3b 0a 20 20 7d 0a 7d 20 7b 58 27 36  tbl2;.  }.} {X'6
45d0: 31 36 32 36 33 27 20 4e 55 4c 4c 7d 0a 0a 23 20  16263' NULL}..# 
45e0: 43 6f 72 72 65 63 74 6c 79 20 68 61 6e 64 6c 65  Correctly handle
45f0: 20 66 75 6e 63 74 69 6f 6e 20 65 72 72 6f 72 20   function error 
4600: 6d 65 73 73 61 67 65 73 20 74 68 61 74 20 69 6e  messages that in
4610: 63 6c 75 64 65 20 25 2e 20 20 54 69 63 6b 65 74  clude %.  Ticket
4620: 20 23 31 33 35 34 0a 23 0a 64 6f 5f 74 65 73 74   #1354.#.do_test
4630: 20 66 75 6e 63 2d 31 37 2e 31 20 7b 0a 20 20 70   func-17.1 {.  p
4640: 72 6f 63 20 74 65 73 74 66 75 6e 63 31 20 61 72  roc testfunc1 ar
4650: 67 73 20 7b 65 72 72 6f 72 20 22 45 72 72 6f 72  gs {error "Error
4660: 20 25 64 20 77 69 74 68 20 25 73 20 70 65 72 63   %d with %s perc
4670: 65 6e 74 73 20 25 70 22 7d 0a 20 20 64 62 20 66  ents %p"}.  db f
4680: 75 6e 63 74 69 6f 6e 20 74 65 73 74 66 75 6e 63  unction testfunc
4690: 31 20 3a 3a 74 65 73 74 66 75 6e 63 31 0a 20 20  1 ::testfunc1.  
46a0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
46b0: 45 4c 45 43 54 20 74 65 73 74 66 75 6e 63 31 28  ELECT testfunc1(
46c0: 31 2c 32 2c 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31  1,2,3);.  }.} {1
46d0: 20 7b 45 72 72 6f 72 20 25 64 20 77 69 74 68 20   {Error %d with 
46e0: 25 73 20 70 65 72 63 65 6e 74 73 20 25 70 7d 7d  %s percents %p}}
46f0: 0a 0a 23 20 54 68 65 20 53 55 4d 20 66 75 6e 63  ..# The SUM func
4700: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 72 65 74 75  tion should retu
4710: 72 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c  rn integer resul
4720: 74 73 20 77 68 65 6e 20 61 6c 6c 20 69 6e 70 75  ts when all inpu
4730: 74 73 20 61 72 65 20 69 6e 74 65 67 65 72 2e 0a  ts are integer..
4740: 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31  #.do_test func-1
4750: 38 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.1 {.  execsql 
4760: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
4770: 4c 45 20 74 35 28 78 29 3b 0a 20 20 20 20 49 4e  LE t5(x);.    IN
4780: 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c  SERT INTO t5 VAL
4790: 55 45 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45  UES(1);.    INSE
47a0: 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45  RT INTO t5 VALUE
47b0: 53 28 2d 39 39 29 3b 0a 20 20 20 20 49 4e 53 45  S(-99);.    INSE
47c0: 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45  RT INTO t5 VALUE
47d0: 53 28 31 30 30 30 30 29 3b 0a 20 20 20 20 53 45  S(10000);.    SE
47e0: 4c 45 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d  LECT sum(x) FROM
47f0: 20 74 35 3b 0a 20 20 7d 0a 7d 20 7b 39 39 30 32   t5;.  }.} {9902
4800: 7d 0a 69 66 63 61 70 61 62 6c 65 20 66 6c 6f 61  }.ifcapable floa
4810: 74 69 6e 67 70 6f 69 6e 74 20 7b 0a 20 20 64 6f  tingpoint {.  do
4820: 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 32 20  _test func-18.2 
4830: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
4840: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4850: 4f 20 74 35 20 56 41 4c 55 45 53 28 30 2e 30 29  O t5 VALUES(0.0)
4860: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 73  ;.      SELECT s
4870: 75 6d 28 78 29 20 46 52 4f 4d 20 74 35 3b 0a 20  um(x) FROM t5;. 
4880: 20 20 20 7d 0a 20 20 7d 20 7b 39 39 30 32 2e 30     }.  } {9902.0
4890: 7d 0a 7d 0a 0a 23 20 54 68 65 20 73 75 6d 20 6f  }.}..# The sum o
48a0: 66 20 6e 6f 74 68 69 6e 67 20 69 73 20 4e 55 4c  f nothing is NUL
48b0: 4c 2e 20 20 42 75 74 20 74 68 65 20 73 75 6d 20  L.  But the sum 
48c0: 6f 66 20 61 6c 6c 20 4e 55 4c 4c 73 20 69 73 20  of all NULLs is 
48d0: 4e 55 4c 4c 2e 0a 23 0a 23 20 54 68 65 20 54 4f  NULL..#.# The TO
48e0: 54 41 4c 20 6f 66 20 6e 6f 74 68 69 6e 67 20 69  TAL of nothing i
48f0: 73 20 30 2e 30 2e 0a 23 0a 64 6f 5f 74 65 73 74  s 0.0..#.do_test
4900: 20 66 75 6e 63 2d 31 38 2e 33 20 7b 0a 20 20 65   func-18.3 {.  e
4910: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
4920: 45 54 45 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20  ETE FROM t5;.   
4930: 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 2c 20   SELECT sum(x), 
4940: 74 6f 74 61 6c 28 78 29 20 46 52 4f 4d 20 74 35  total(x) FROM t5
4950: 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 30 2e 30 7d  ;.  }.} {{} 0.0}
4960: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38  .do_test func-18
4970: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
4980: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
4990: 20 74 35 20 56 41 4c 55 45 53 28 4e 55 4c 4c 29   t5 VALUES(NULL)
49a0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d  ;.    SELECT sum
49b0: 28 78 29 2c 20 74 6f 74 61 6c 28 78 29 20 46 52  (x), total(x) FR
49c0: 4f 4d 20 74 35 0a 20 20 7d 0a 7d 20 7b 7b 7d 20  OM t5.  }.} {{} 
49d0: 30 2e 30 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  0.0}.do_test fun
49e0: 63 2d 31 38 2e 35 20 7b 0a 20 20 65 78 65 63 73  c-18.5 {.  execs
49f0: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
4a00: 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 4e  INTO t5 VALUES(N
4a10: 55 4c 4c 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  ULL);.    SELECT
4a20: 20 73 75 6d 28 78 29 2c 20 74 6f 74 61 6c 28 78   sum(x), total(x
4a30: 29 20 46 52 4f 4d 20 74 35 0a 20 20 7d 0a 7d 20  ) FROM t5.  }.} 
4a40: 7b 7b 7d 20 30 2e 30 7d 0a 64 6f 5f 74 65 73 74  {{} 0.0}.do_test
4a50: 20 66 75 6e 63 2d 31 38 2e 36 20 7b 0a 20 20 65   func-18.6 {.  e
4a60: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
4a70: 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55  ERT INTO t5 VALU
4a80: 45 53 28 31 32 33 29 3b 0a 20 20 20 20 53 45 4c  ES(123);.    SEL
4a90: 45 43 54 20 73 75 6d 28 78 29 2c 20 74 6f 74 61  ECT sum(x), tota
4aa0: 6c 28 78 29 20 46 52 4f 4d 20 74 35 0a 20 20 7d  l(x) FROM t5.  }
4ab0: 0a 7d 20 7b 31 32 33 20 31 32 33 2e 30 7d 0a 0a  .} {123 123.0}..
4ac0: 23 20 54 69 63 6b 65 74 20 23 31 36 36 34 2c 20  # Ticket #1664, 
4ad0: 23 31 36 36 39 2c 20 23 31 36 37 30 2c 20 23 31  #1669, #1670, #1
4ae0: 36 37 34 3a 20 41 6e 20 69 6e 74 65 67 65 72 20  674: An integer 
4af0: 6f 76 65 72 66 6c 6f 77 20 6f 6e 20 53 55 4d 20  overflow on SUM 
4b00: 63 61 75 73 65 73 0a 23 20 61 6e 20 65 72 72 6f  causes.# an erro
4b10: 72 2e 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64  r. The non-stand
4b20: 61 72 64 20 54 4f 54 41 4c 28 29 20 66 75 6e 63  ard TOTAL() func
4b30: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 74  tion continues t
4b40: 6f 20 67 69 76 65 20 61 20 68 65 6c 70 66 75 6c  o give a helpful
4b50: 0a 23 20 72 65 73 75 6c 74 2e 0a 23 0a 64 6f 5f  .# result..#.do_
4b60: 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 30 20  test func-18.10 
4b70: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
4b80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
4b90: 36 28 78 20 49 4e 54 45 47 45 52 29 3b 0a 20 20  6(x INTEGER);.  
4ba0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36    INSERT INTO t6
4bb0: 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20   VALUES(1);.    
4bc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56  INSERT INTO t6 V
4bd0: 41 4c 55 45 53 28 31 3c 3c 36 32 29 3b 0a 20 20  ALUES(1<<62);.  
4be0: 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 20    SELECT sum(x) 
4bf0: 2d 20 28 28 31 3c 3c 36 32 29 2b 31 29 20 66 72  - ((1<<62)+1) fr
4c00: 6f 6d 20 74 36 3b 0a 20 20 7d 0a 7d 20 30 0a 64  om t6;.  }.} 0.d
4c10: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 31  o_test func-18.1
4c20: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
4c30: 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f      SELECT typeo
4c40: 66 28 73 75 6d 28 78 29 29 20 46 52 4f 4d 20 74  f(sum(x)) FROM t
4c50: 36 0a 20 20 7d 0a 7d 20 69 6e 74 65 67 65 72 0a  6.  }.} integer.
4c60: 69 66 63 61 70 61 62 6c 65 20 66 6c 6f 61 74 69  ifcapable floati
4c70: 6e 67 70 6f 69 6e 74 20 7b 0a 20 20 64 6f 5f 74  ngpoint {.  do_t
4c80: 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 32 20 7b  est func-18.12 {
4c90: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  .    catchsql {.
4ca0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4cb0: 4f 20 74 36 20 56 41 4c 55 45 53 28 31 3c 3c 36  O t6 VALUES(1<<6
4cc0: 32 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  2);.      SELECT
4cd0: 20 73 75 6d 28 78 29 20 2d 20 28 28 31 3c 3c 36   sum(x) - ((1<<6
4ce0: 32 29 2a 32 2e 30 2b 31 29 20 66 72 6f 6d 20 74  2)*2.0+1) from t
4cf0: 36 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  6;.    }.  } {1 
4d00: 7b 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f  {integer overflo
4d10: 77 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 75  w}}.  do_test fu
4d20: 6e 63 2d 31 38 2e 31 33 20 7b 0a 20 20 20 20 65  nc-18.13 {.    e
4d30: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
4d40: 45 4c 45 43 54 20 74 6f 74 61 6c 28 78 29 20 2d  ELECT total(x) -
4d50: 20 28 28 31 3c 3c 36 32 29 2a 32 2e 30 2b 31 29   ((1<<62)*2.0+1)
4d60: 20 46 52 4f 4d 20 74 36 0a 20 20 20 20 7d 0a 20   FROM t6.    }. 
4d70: 20 7d 20 30 2e 30 0a 7d 0a 69 66 63 61 70 61 62   } 0.0.}.ifcapab
4d80: 6c 65 20 21 66 6c 6f 61 74 69 6e 67 70 6f 69 6e  le !floatingpoin
4d90: 74 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75  t {.  do_test fu
4da0: 6e 63 2d 31 38 2e 31 32 20 7b 0a 20 20 20 20 63  nc-18.12 {.    c
4db0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20  atchsql {.      
4dc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56  INSERT INTO t6 V
4dd0: 41 4c 55 45 53 28 31 3c 3c 36 32 29 3b 0a 20 20  ALUES(1<<62);.  
4de0: 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78      SELECT sum(x
4df0: 29 20 2d 20 28 28 31 3c 3c 36 32 29 2a 32 2b 31  ) - ((1<<62)*2+1
4e00: 29 20 66 72 6f 6d 20 74 36 3b 0a 20 20 20 20 7d  ) from t6;.    }
4e10: 0a 20 20 7d 20 7b 31 20 7b 69 6e 74 65 67 65 72  .  } {1 {integer
4e20: 20 6f 76 65 72 66 6c 6f 77 7d 7d 0a 20 20 64 6f   overflow}}.  do
4e30: 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 33  _test func-18.13
4e40: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
4e50: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 74 6f  .      SELECT to
4e60: 74 61 6c 28 78 29 20 2d 20 28 28 31 3c 3c 36 32  tal(x) - ((1<<62
4e70: 29 2a 32 2b 31 29 20 46 52 4f 4d 20 74 36 0a 20  )*2+1) FROM t6. 
4e80: 20 20 20 7d 0a 20 20 7d 20 30 2e 30 0a 7d 0a 69     }.  } 0.0.}.i
4e90: 66 20 7b 5b 77 6f 72 6b 69 6e 67 5f 36 34 62 69  f {[working_64bi
4ea0: 74 5f 69 6e 74 5d 7d 20 7b 0a 20 20 64 6f 5f 74  t_int]} {.  do_t
4eb0: 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 34 20 7b  est func-18.14 {
4ec0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
4ed0: 20 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28       SELECT sum(
4ee0: 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
4ef0: 35 38 30 35 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  5805);.    }.  }
4f00: 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37   -92233720368547
4f10: 37 35 38 30 35 0a 7d 0a 69 66 63 61 70 61 62 6c  75805.}.ifcapabl
4f20: 65 20 63 6f 6d 70 6f 75 6e 64 26 26 73 75 62 71  e compound&&subq
4f30: 75 65 72 79 20 7b 0a 0a 64 6f 5f 74 65 73 74 20  uery {..do_test 
4f40: 66 75 6e 63 2d 31 38 2e 31 35 20 7b 0a 20 20 63  func-18.15 {.  c
4f50: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45  atchsql {.    SE
4f60: 4c 45 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d  LECT sum(x) FROM
4f70: 20 0a 20 20 20 20 20 20 20 28 53 45 4c 45 43 54   .       (SELECT
4f80: 20 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37   922337203685477
4f90: 35 38 30 37 20 41 53 20 78 20 55 4e 49 4f 4e 20  5807 AS x UNION 
4fa0: 41 4c 4c 0a 20 20 20 20 20 20 20 20 53 45 4c 45  ALL.        SELE
4fb0: 43 54 20 31 30 20 41 53 20 78 29 3b 0a 20 20 7d  CT 10 AS x);.  }
4fc0: 0a 7d 20 7b 31 20 7b 69 6e 74 65 67 65 72 20 6f  .} {1 {integer o
4fd0: 76 65 72 66 6c 6f 77 7d 7d 0a 69 66 20 7b 5b 77  verflow}}.if {[w
4fe0: 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74  orking_64bit_int
4ff0: 5d 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66  ]} {.  do_test f
5000: 75 6e 63 2d 31 38 2e 31 36 20 7b 0a 20 20 20 20  unc-18.16 {.    
5010: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20  catchsql {.     
5020: 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 20 46   SELECT sum(x) F
5030: 52 4f 4d 20 0a 20 20 20 20 20 20 20 20 20 28 53  ROM .         (S
5040: 45 4c 45 43 54 20 39 32 32 33 33 37 32 30 33 36  ELECT 9223372036
5050: 38 35 34 37 37 35 38 30 37 20 41 53 20 78 20 55  854775807 AS x U
5060: 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 20  NION ALL.       
5070: 20 20 20 53 45 4c 45 43 54 20 2d 31 30 20 41 53     SELECT -10 AS
5080: 20 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   x);.    }.  } {
5090: 30 20 39 32 32 33 33 37 32 30 33 36 38 35 34 37  0 92233720368547
50a0: 37 35 37 39 37 7d 0a 20 20 64 6f 5f 74 65 73 74  75797}.  do_test
50b0: 20 66 75 6e 63 2d 31 38 2e 31 37 20 7b 0a 20 20   func-18.17 {.  
50c0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
50d0: 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29     SELECT sum(x)
50e0: 20 46 52 4f 4d 20 0a 20 20 20 20 20 20 20 20 20   FROM .         
50f0: 28 53 45 4c 45 43 54 20 2d 39 32 32 33 33 37 32  (SELECT -9223372
5100: 30 33 36 38 35 34 37 37 35 38 30 37 20 41 53 20  036854775807 AS 
5110: 78 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20  x UNION ALL.    
5120: 20 20 20 20 20 20 53 45 4c 45 43 54 20 31 30 20        SELECT 10 
5130: 41 53 20 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AS x);.    }.  }
5140: 20 7b 30 20 2d 39 32 32 33 33 37 32 30 33 36 38   {0 -92233720368
5150: 35 34 37 37 35 37 39 37 7d 0a 7d 0a 64 6f 5f 74  54775797}.}.do_t
5160: 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 38 20 7b  est func-18.18 {
5170: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
5180: 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 20    SELECT sum(x) 
5190: 46 52 4f 4d 20 0a 20 20 20 20 20 20 20 28 53 45  FROM .       (SE
51a0: 4c 45 43 54 20 2d 39 32 32 33 33 37 32 30 33 36  LECT -9223372036
51b0: 38 35 34 37 37 35 38 30 37 20 41 53 20 78 20 55  854775807 AS x U
51c0: 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 20  NION ALL.       
51d0: 20 53 45 4c 45 43 54 20 2d 31 30 20 41 53 20 78   SELECT -10 AS x
51e0: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 69 6e 74  );.  }.} {1 {int
51f0: 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 7d 7d 0a  eger overflow}}.
5200: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e  do_test func-18.
5210: 31 39 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  19 {.  catchsql 
5220: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d  {.    SELECT sum
5230: 28 78 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  (x) FROM (SELECT
5240: 20 39 20 41 53 20 78 20 55 4e 49 4f 4e 20 41 4c   9 AS x UNION AL
5250: 4c 20 53 45 4c 45 43 54 20 2d 31 30 20 41 53 20  L SELECT -10 AS 
5260: 78 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 2d 31 7d  x);.  }.} {0 -1}
5270: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38  .do_test func-18
5280: 2e 32 30 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  .20 {.  catchsql
5290: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 75   {.    SELECT su
52a0: 6d 28 78 29 20 46 52 4f 4d 20 28 53 45 4c 45 43  m(x) FROM (SELEC
52b0: 54 20 2d 39 20 41 53 20 78 20 55 4e 49 4f 4e 20  T -9 AS x UNION 
52c0: 41 4c 4c 20 53 45 4c 45 43 54 20 31 30 20 41 53  ALL SELECT 10 AS
52d0: 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31 7d   x);.  }.} {0 1}
52e0: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38  .do_test func-18
52f0: 2e 32 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  .21 {.  catchsql
5300: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 75   {.    SELECT su
5310: 6d 28 78 29 20 46 52 4f 4d 20 28 53 45 4c 45 43  m(x) FROM (SELEC
5320: 54 20 2d 31 30 20 41 53 20 78 20 55 4e 49 4f 4e  T -10 AS x UNION
5330: 20 41 4c 4c 20 53 45 4c 45 43 54 20 39 20 41 53   ALL SELECT 9 AS
5340: 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 2d 31   x);.  }.} {0 -1
5350: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31  }.do_test func-1
5360: 38 2e 32 32 20 7b 0a 20 20 63 61 74 63 68 73 71  8.22 {.  catchsq
5370: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 73  l {.    SELECT s
5380: 75 6d 28 78 29 20 46 52 4f 4d 20 28 53 45 4c 45  um(x) FROM (SELE
5390: 43 54 20 31 30 20 41 53 20 78 20 55 4e 49 4f 4e  CT 10 AS x UNION
53a0: 20 41 4c 4c 20 53 45 4c 45 43 54 20 2d 39 20 41   ALL SELECT -9 A
53b0: 53 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31  S x);.  }.} {0 1
53c0: 7d 0a 0a 7d 20 3b 23 20 69 66 63 61 70 61 62 6c  }..} ;# ifcapabl
53d0: 65 20 63 6f 6d 70 6f 75 6e 64 26 26 73 75 62 71  e compound&&subq
53e0: 75 65 72 79 0a 0a 23 20 49 6e 74 65 67 65 72 20  uery..# Integer 
53f0: 6f 76 65 72 66 6c 6f 77 20 6f 6e 20 61 62 73 28  overflow on abs(
5400: 29 0a 23 0a 69 66 20 7b 5b 77 6f 72 6b 69 6e 67  ).#.if {[working
5410: 5f 36 34 62 69 74 5f 69 6e 74 5d 7d 20 7b 0a 20  _64bit_int]} {. 
5420: 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38   do_test func-18
5430: 2e 33 31 20 7b 0a 20 20 20 20 63 61 74 63 68 73  .31 {.    catchs
5440: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
5450: 54 20 61 62 73 28 2d 39 32 32 33 33 37 32 30 33  T abs(-922337203
5460: 36 38 35 34 37 37 35 38 30 37 29 3b 0a 20 20 20  6854775807);.   
5470: 20 7d 0a 20 20 7d 20 7b 30 20 39 32 32 33 33 37   }.  } {0 922337
5480: 32 30 33 36 38 35 34 37 37 35 38 30 37 7d 0a 7d  2036854775807}.}
5490: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38  .do_test func-18
54a0: 2e 33 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  .32 {.  catchsql
54b0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 62   {.    SELECT ab
54c0: 73 28 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  s(-9223372036854
54d0: 37 37 35 38 30 37 2d 31 29 3b 0a 20 20 7d 0a 7d  775807-1);.  }.}
54e0: 20 7b 31 20 7b 69 6e 74 65 67 65 72 20 6f 76 65   {1 {integer ove
54f0: 72 66 6c 6f 77 7d 7d 0a 0a 23 20 54 68 65 20 4d  rflow}}..# The M
5500: 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 20 65 78  ATCH function ex
5510: 69 73 74 73 20 62 75 74 20 69 73 20 6f 6e 6c 79  ists but is only
5520: 20 61 20 73 74 75 62 20 61 6e 64 20 61 6c 77 61   a stub and alwa
5530: 79 73 20 74 68 72 6f 77 73 20 61 6e 20 65 72 72  ys throws an err
5540: 6f 72 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75  or..#.do_test fu
5550: 6e 63 2d 31 39 2e 31 20 7b 0a 20 20 65 78 65 63  nc-19.1 {.  exec
5560: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
5570: 20 6d 61 74 63 68 28 61 2c 62 29 20 46 52 4f 4d   match(a,b) FROM
5580: 20 74 31 20 57 48 45 52 45 20 30 3b 0a 20 20 7d   t1 WHERE 0;.  }
5590: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 75  .} {}.do_test fu
55a0: 6e 63 2d 31 39 2e 32 20 7b 0a 20 20 63 61 74 63  nc-19.2 {.  catc
55b0: 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  hsql {.    SELEC
55c0: 54 20 27 61 62 63 27 20 4d 41 54 43 48 20 27 78  T 'abc' MATCH 'x
55d0: 79 7a 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 75  yz';.  }.} {1 {u
55e0: 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66 75 6e  nable to use fun
55f0: 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20 74  ction MATCH in t
5600: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6e  he requested con
5610: 74 65 78 74 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  text}}.do_test f
5620: 75 6e 63 2d 31 39 2e 33 20 7b 0a 20 20 63 61 74  unc-19.3 {.  cat
5630: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  chsql {.    SELE
5640: 43 54 20 27 61 62 63 27 20 4e 4f 54 20 4d 41 54  CT 'abc' NOT MAT
5650: 43 48 20 27 78 79 7a 27 3b 0a 20 20 7d 0a 7d 20  CH 'xyz';.  }.} 
5660: 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73  {1 {unable to us
5670: 65 20 66 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48  e function MATCH
5680: 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
5690: 64 20 63 6f 6e 74 65 78 74 7d 7d 0a 64 6f 5f 74  d context}}.do_t
56a0: 65 73 74 20 66 75 6e 63 2d 31 39 2e 34 20 7b 0a  est func-19.4 {.
56b0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
56c0: 20 53 45 4c 45 43 54 20 6d 61 74 63 68 28 31 2c   SELECT match(1,
56d0: 32 2c 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  2,3);.  }.} {1 {
56e0: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
56f0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
5700: 63 74 69 6f 6e 20 6d 61 74 63 68 28 29 7d 7d 0a  ction match()}}.
5710: 0a 23 20 53 6f 75 6e 64 65 78 20 74 65 73 74 73  .# Soundex tests
5720: 2e 0a 23 0a 69 66 20 7b 21 5b 63 61 74 63 68 20  ..#.if {![catch 
5730: 7b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54  {db eval {SELECT
5740: 20 73 6f 75 6e 64 65 78 28 27 68 65 6c 6c 6f 27   soundex('hello'
5750: 29 7d 7d 5d 7d 20 7b 0a 20 20 73 65 74 20 69 20  )}}]} {.  set i 
5760: 30 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 61 6d  0.  foreach {nam
5770: 65 20 73 64 78 7d 20 7b 0a 20 20 20 20 65 75 6c  e sdx} {.    eul
5780: 65 72 20 20 20 20 20 20 20 20 45 34 36 30 0a 20  er        E460. 
5790: 20 20 20 45 55 4c 45 52 20 20 20 20 20 20 20 20     EULER        
57a0: 45 34 36 30 0a 20 20 20 20 45 75 6c 65 72 20 20  E460.    Euler  
57b0: 20 20 20 20 20 20 45 34 36 30 0a 20 20 20 20 65        E460.    e
57c0: 6c 6c 65 72 79 20 20 20 20 20 20 20 45 34 36 30  llery       E460
57d0: 0a 20 20 20 20 67 61 75 73 73 20 20 20 20 20 20  .    gauss      
57e0: 20 20 47 32 30 30 0a 20 20 20 20 67 68 6f 73 68    G200.    ghosh
57f0: 20 20 20 20 20 20 20 20 47 32 30 30 0a 20 20 20          G200.   
5800: 20 68 69 6c 62 65 72 74 20 20 20 20 20 20 48 34   hilbert      H4
5810: 31 36 0a 20 20 20 20 48 65 69 6c 62 72 6f 6e 6e  16.    Heilbronn
5820: 20 20 20 20 48 34 31 36 0a 20 20 20 20 6b 6e 75      H416.    knu
5830: 74 68 20 20 20 20 20 20 20 20 4b 35 33 30 0a 20  th        K530. 
5840: 20 20 20 6b 61 6e 74 20 20 20 20 20 20 20 20 20     kant         
5850: 4b 35 33 30 0a 20 20 20 20 4c 6c 6f 79 64 20 20  K530.    Lloyd  
5860: 20 20 20 20 20 20 4c 33 30 30 0a 20 20 20 20 4c        L300.    L
5870: 41 44 44 20 20 20 20 20 20 20 20 20 4c 33 30 30  ADD         L300
5880: 0a 20 20 20 20 4c 75 6b 61 73 69 65 77 69 63 7a  .    Lukasiewicz
5890: 20 20 4c 32 32 32 0a 20 20 20 20 4c 69 73 73 61    L222.    Lissa
58a0: 6a 6f 75 73 20 20 20 20 4c 32 32 32 0a 20 20 20  jous    L222.   
58b0: 20 41 20 20 20 20 20 20 20 20 20 20 20 20 41 30   A            A0
58c0: 30 30 0a 20 20 20 20 31 32 33 34 35 20 20 20 20  00.    12345    
58d0: 20 20 20 20 3f 30 30 30 0a 20 20 7d 20 7b 0a 20      ?000.  } {. 
58e0: 20 20 20 69 6e 63 72 20 69 0a 20 20 20 20 64 6f     incr i.    do
58f0: 5f 74 65 73 74 20 66 75 6e 63 2d 32 30 2e 24 69  _test func-20.$i
5900: 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c   {.      execsql
5910: 20 7b 53 45 4c 45 43 54 20 73 6f 75 6e 64 65 78   {SELECT soundex
5920: 28 24 6e 61 6d 65 29 7d 0a 20 20 20 20 7d 20 24  ($name)}.    } $
5930: 73 64 78 0a 20 20 7d 0a 7d 0a 0a 23 20 54 65 73  sdx.  }.}..# Tes
5940: 74 73 20 6f 66 20 74 68 65 20 52 45 50 4c 41 43  ts of the REPLAC
5950: 45 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a 64 6f  E function..#.do
5960: 5f 74 65 73 74 20 66 75 6e 63 2d 32 31 2e 31 20  _test func-21.1 
5970: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
5980: 20 20 20 53 45 4c 45 43 54 20 72 65 70 6c 61 63     SELECT replac
5990: 65 28 31 2c 32 29 3b 0a 20 20 7d 0a 7d 20 7b 31  e(1,2);.  }.} {1
59a0: 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f   {wrong number o
59b0: 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
59c0: 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 28  unction replace(
59d0: 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  )}}.do_test func
59e0: 2d 32 31 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  -21.2 {.  catchs
59f0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
5a00: 72 65 70 6c 61 63 65 28 31 2c 32 2c 33 2c 34 29  replace(1,2,3,4)
5a10: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 77 72 6f 6e  ;.  }.} {1 {wron
5a20: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
5a30: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
5a40: 6e 20 72 65 70 6c 61 63 65 28 29 7d 7d 0a 64 6f  n replace()}}.do
5a50: 5f 74 65 73 74 20 66 75 6e 63 2d 32 31 2e 33 20  _test func-21.3 
5a60: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
5a70: 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28    SELECT typeof(
5a80: 72 65 70 6c 61 63 65 28 22 54 68 69 73 20 69 73  replace("This is
5a90: 20 74 68 65 20 6d 61 69 6e 20 74 65 73 74 20 73   the main test s
5aa0: 74 72 69 6e 67 22 2c 20 4e 55 4c 4c 2c 20 22 41  tring", NULL, "A
5ab0: 4c 54 22 29 29 3b 0a 20 20 7d 0a 7d 20 7b 6e 75  LT"));.  }.} {nu
5ac0: 6c 6c 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  ll}.do_test func
5ad0: 2d 32 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  -21.4 {.  execsq
5ae0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74  l {.    SELECT t
5af0: 79 70 65 6f 66 28 72 65 70 6c 61 63 65 28 4e 55  ypeof(replace(NU
5b00: 4c 4c 2c 20 22 6d 61 69 6e 22 2c 20 22 41 4c 54  LL, "main", "ALT
5b10: 22 29 29 3b 0a 20 20 7d 0a 7d 20 7b 6e 75 6c 6c  "));.  }.} {null
5b20: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  }.do_test func-2
5b30: 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.5 {.  execsql 
5b40: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 79 70  {.    SELECT typ
5b50: 65 6f 66 28 72 65 70 6c 61 63 65 28 22 54 68 69  eof(replace("Thi
5b60: 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 74 65  s is the main te
5b70: 73 74 20 73 74 72 69 6e 67 22 2c 20 22 6d 61 69  st string", "mai
5b80: 6e 22 2c 20 4e 55 4c 4c 29 29 3b 0a 20 20 7d 0a  n", NULL));.  }.
5b90: 7d 20 7b 6e 75 6c 6c 7d 0a 64 6f 5f 74 65 73 74  } {null}.do_test
5ba0: 20 66 75 6e 63 2d 32 31 2e 36 20 7b 0a 20 20 65   func-21.6 {.  e
5bb0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
5bc0: 45 43 54 20 72 65 70 6c 61 63 65 28 22 54 68 69  ECT replace("Thi
5bd0: 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 74 65  s is the main te
5be0: 73 74 20 73 74 72 69 6e 67 22 2c 20 22 6d 61 69  st string", "mai
5bf0: 6e 22 2c 20 22 41 4c 54 22 29 3b 0a 20 20 7d 0a  n", "ALT");.  }.
5c00: 7d 20 7b 7b 54 68 69 73 20 69 73 20 74 68 65 20  } {{This is the 
5c10: 41 4c 54 20 74 65 73 74 20 73 74 72 69 6e 67 7d  ALT test string}
5c20: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  }.do_test func-2
5c30: 31 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.7 {.  execsql 
5c40: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 65 70  {.    SELECT rep
5c50: 6c 61 63 65 28 22 54 68 69 73 20 69 73 20 74 68  lace("This is th
5c60: 65 20 6d 61 69 6e 20 74 65 73 74 20 73 74 72 69  e main test stri
5c70: 6e 67 22 2c 20 22 6d 61 69 6e 22 2c 20 22 6c 61  ng", "main", "la
5c80: 72 67 65 72 2d 6d 61 69 6e 22 29 3b 0a 20 20 7d  rger-main");.  }
5c90: 0a 7d 20 7b 7b 54 68 69 73 20 69 73 20 74 68 65  .} {{This is the
5ca0: 20 6c 61 72 67 65 72 2d 6d 61 69 6e 20 74 65 73   larger-main tes
5cb0: 74 20 73 74 72 69 6e 67 7d 7d 0a 64 6f 5f 74 65  t string}}.do_te
5cc0: 73 74 20 66 75 6e 63 2d 32 31 2e 38 20 7b 0a 20  st func-21.8 {. 
5cd0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
5ce0: 45 4c 45 43 54 20 72 65 70 6c 61 63 65 28 22 61  ELECT replace("a
5cf0: 61 61 61 61 61 61 22 2c 20 22 61 22 2c 20 22 30  aaaaaa", "a", "0
5d00: 31 32 33 34 35 36 37 38 39 22 29 3b 0a 20 20 7d  123456789");.  }
5d10: 0a 7d 20 7b 30 31 32 33 34 35 36 37 38 39 30 31  .} {012345678901
5d20: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
5d30: 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33  8901234567890123
5d40: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
5d50: 30 31 32 33 34 35 36 37 38 39 7d 0a 0a 69 66 63  0123456789}..ifc
5d60: 61 70 61 62 6c 65 20 74 63 6c 76 61 72 20 7b 0a  apable tclvar {.
5d70: 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32    do_test func-2
5d80: 31 2e 39 20 7b 0a 20 20 20 20 23 20 41 74 74 65  1.9 {.    # Atte
5d90: 6d 70 74 20 74 6f 20 65 78 70 6c 6f 69 74 20 61  mpt to exploit a
5da0: 20 62 75 66 66 65 72 2d 6f 76 65 72 66 6c 6f 77   buffer-overflow
5db0: 20 74 68 61 74 20 61 74 20 6f 6e 65 20 74 69 6d   that at one tim
5dc0: 65 20 65 78 69 73 74 65 64 20 0a 20 20 20 20 23  e existed .    #
5dd0: 20 69 6e 20 74 68 65 20 52 45 50 4c 41 43 45 20   in the REPLACE 
5de0: 66 75 6e 63 74 69 6f 6e 2e 20 0a 20 20 20 20 73  function. .    s
5df0: 65 74 20 3a 3a 73 74 72 20 22 5b 73 74 72 69 6e  et ::str "[strin
5e00: 67 20 72 65 70 65 61 74 20 41 20 32 39 39 39 38  g repeat A 29998
5e10: 5d 43 43 5b 73 74 72 69 6e 67 20 72 65 70 65 61  ]CC[string repea
5e20: 74 20 41 20 33 35 35 33 37 5d 22 0a 20 20 20 20  t A 35537]".    
5e30: 73 65 74 20 3a 3a 72 65 70 20 5b 73 74 72 69 6e  set ::rep [strin
5e40: 67 20 72 65 70 65 61 74 20 42 20 36 35 35 33 36  g repeat B 65536
5e50: 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  ].    execsql {.
5e60: 20 20 20 20 20 20 53 45 4c 45 43 54 20 4c 45 4e        SELECT LEN
5e70: 47 54 48 28 52 45 50 4c 41 43 45 28 24 3a 3a 73  GTH(REPLACE($::s
5e80: 74 72 2c 20 27 43 27 2c 20 24 3a 3a 72 65 70 29  tr, 'C', $::rep)
5e90: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 65 78  );.    }.  } [ex
5ea0: 70 72 20 32 39 39 39 38 20 2b 20 32 2a 36 35 35  pr 29998 + 2*655
5eb0: 33 36 20 2b 20 33 35 35 33 37 5d 0a 7d 0a 0a 23  36 + 35537].}..#
5ec0: 20 54 65 73 74 73 20 66 6f 72 20 74 68 65 20 54   Tests for the T
5ed0: 52 49 4d 2c 20 4c 54 52 49 4d 20 61 6e 64 20 52  RIM, LTRIM and R
5ee0: 54 52 49 4d 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  TRIM functions..
5ef0: 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  #.do_test func-2
5f00: 32 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  2.1 {.  catchsql
5f10: 20 7b 53 45 4c 45 43 54 20 74 72 69 6d 28 31 2c   {SELECT trim(1,
5f20: 32 2c 33 29 7d 0a 7d 20 7b 31 20 7b 77 72 6f 6e  2,3)}.} {1 {wron
5f30: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
5f40: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
5f50: 6e 20 74 72 69 6d 28 29 7d 7d 0a 64 6f 5f 74 65  n trim()}}.do_te
5f60: 73 74 20 66 75 6e 63 2d 32 32 2e 32 20 7b 0a 20  st func-22.2 {. 
5f70: 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43   catchsql {SELEC
5f80: 54 20 6c 74 72 69 6d 28 31 2c 32 2c 33 29 7d 0a  T ltrim(1,2,3)}.
5f90: 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 6e 75 6d 62  } {1 {wrong numb
5fa0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
5fb0: 74 6f 20 66 75 6e 63 74 69 6f 6e 20 6c 74 72 69  to function ltri
5fc0: 6d 28 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75  m()}}.do_test fu
5fd0: 6e 63 2d 32 32 2e 33 20 7b 0a 20 20 63 61 74 63  nc-22.3 {.  catc
5fe0: 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 74 72  hsql {SELECT rtr
5ff0: 69 6d 28 31 2c 32 2c 33 29 7d 0a 7d 20 7b 31 20  im(1,2,3)}.} {1 
6000: 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  {wrong number of
6010: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
6020: 6e 63 74 69 6f 6e 20 72 74 72 69 6d 28 29 7d 7d  nction rtrim()}}
6030: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32  .do_test func-22
6040: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
6050: 53 45 4c 45 43 54 20 74 72 69 6d 28 27 20 20 68  SELECT trim('  h
6060: 69 20 20 27 29 3b 7d 0a 7d 20 7b 68 69 7d 0a 64  i  ');}.} {hi}.d
6070: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 35  o_test func-22.5
6080: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
6090: 4c 45 43 54 20 6c 74 72 69 6d 28 27 20 20 68 69  LECT ltrim('  hi
60a0: 20 20 27 29 3b 7d 0a 7d 20 7b 7b 68 69 20 20 7d    ');}.} {{hi  }
60b0: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  }.do_test func-2
60c0: 32 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.6 {.  execsql 
60d0: 7b 53 45 4c 45 43 54 20 72 74 72 69 6d 28 27 20  {SELECT rtrim(' 
60e0: 20 68 69 20 20 27 29 3b 7d 0a 7d 20 7b 7b 20 20   hi  ');}.} {{  
60f0: 68 69 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  hi}}.do_test fun
6100: 63 2d 32 32 2e 37 20 7b 0a 20 20 65 78 65 63 73  c-22.7 {.  execs
6110: 71 6c 20 7b 53 45 4c 45 43 54 20 74 72 69 6d 28  ql {SELECT trim(
6120: 27 20 20 68 69 20 20 27 2c 27 78 79 7a 27 29 3b  '  hi  ','xyz');
6130: 7d 0a 7d 20 7b 7b 20 20 68 69 20 20 7d 7d 0a 64  }.} {{  hi  }}.d
6140: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 38  o_test func-22.8
6150: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
6160: 4c 45 43 54 20 6c 74 72 69 6d 28 27 20 20 68 69  LECT ltrim('  hi
6170: 20 20 27 2c 27 78 79 7a 27 29 3b 7d 0a 7d 20 7b    ','xyz');}.} {
6180: 7b 20 20 68 69 20 20 7d 7d 0a 64 6f 5f 74 65 73  {  hi  }}.do_tes
6190: 74 20 66 75 6e 63 2d 32 32 2e 39 20 7b 0a 20 20  t func-22.9 {.  
61a0: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
61b0: 72 74 72 69 6d 28 27 20 20 68 69 20 20 27 2c 27  rtrim('  hi  ','
61c0: 78 79 7a 27 29 3b 7d 0a 7d 20 7b 7b 20 20 68 69  xyz');}.} {{  hi
61d0: 20 20 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e    }}.do_test fun
61e0: 63 2d 32 32 2e 31 30 20 7b 0a 20 20 65 78 65 63  c-22.10 {.  exec
61f0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 74 72 69 6d  sql {SELECT trim
6200: 28 27 78 79 78 7a 79 20 20 68 69 20 20 7a 7a 7a  ('xyxzy  hi  zzz
6210: 79 27 2c 27 78 79 7a 27 29 3b 7d 0a 7d 20 7b 7b  y','xyz');}.} {{
6220: 20 20 68 69 20 20 7d 7d 0a 64 6f 5f 74 65 73 74    hi  }}.do_test
6230: 20 66 75 6e 63 2d 32 32 2e 31 31 20 7b 0a 20 20   func-22.11 {.  
6240: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
6250: 6c 74 72 69 6d 28 27 78 79 78 7a 79 20 20 68 69  ltrim('xyxzy  hi
6260: 20 20 7a 7a 7a 79 27 2c 27 78 79 7a 27 29 3b 7d    zzzy','xyz');}
6270: 0a 7d 20 7b 7b 20 20 68 69 20 20 7a 7a 7a 79 7d  .} {{  hi  zzzy}
6280: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  }.do_test func-2
6290: 32 2e 31 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  2.12 {.  execsql
62a0: 20 7b 53 45 4c 45 43 54 20 72 74 72 69 6d 28 27   {SELECT rtrim('
62b0: 78 79 78 7a 79 20 20 68 69 20 20 7a 7a 7a 79 27  xyxzy  hi  zzzy'
62c0: 2c 27 78 79 7a 27 29 3b 7d 0a 7d 20 7b 7b 78 79  ,'xyz');}.} {{xy
62d0: 78 7a 79 20 20 68 69 20 20 7d 7d 0a 64 6f 5f 74  xzy  hi  }}.do_t
62e0: 65 73 74 20 66 75 6e 63 2d 32 32 2e 31 33 20 7b  est func-22.13 {
62f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
6300: 43 54 20 74 72 69 6d 28 27 20 20 68 69 20 20 27  CT trim('  hi  '
6310: 2c 27 27 29 3b 7d 0a 7d 20 7b 7b 20 20 68 69 20  ,'');}.} {{  hi 
6320: 20 7d 7d 0a 69 66 20 7b 5b 64 62 20 6f 6e 65 20   }}.if {[db one 
6330: 7b 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67  {PRAGMA encoding
6340: 7d 5d 3d 3d 22 55 54 46 2d 38 22 7d 20 7b 0a 20  }]=="UTF-8"} {. 
6350: 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32   do_test func-22
6360: 2e 31 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .14 {.    execsq
6370: 6c 20 7b 53 45 4c 45 43 54 20 68 65 78 28 74 72  l {SELECT hex(tr
6380: 69 6d 28 78 27 63 32 38 30 65 31 62 66 62 66 66  im(x'c280e1bfbff
6390: 34 38 66 62 66 62 66 36 38 36 39 27 2c 78 27 36  48fbfbf6869',x'6
63a0: 31 36 32 65 31 62 66 62 66 63 32 38 30 27 29 29  162e1bfbfc280'))
63b0: 7d 0a 20 20 7d 20 7b 46 34 38 46 42 46 42 46 36  }.  } {F48FBFBF6
63c0: 38 36 39 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  869}.  do_test f
63d0: 75 6e 63 2d 32 32 2e 31 35 20 7b 0a 20 20 20 20  unc-22.15 {.    
63e0: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
63f0: 68 65 78 28 74 72 69 6d 28 78 27 36 38 36 39 63  hex(trim(x'6869c
6400: 32 38 30 65 31 62 66 62 66 66 34 38 66 62 66 62  280e1bfbff48fbfb
6410: 66 36 31 27 2c 0a 20 20 20 20 20 20 20 20 20 20  f61',.          
6420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6430: 20 20 20 78 27 36 31 36 32 65 31 62 66 62 66 63     x'6162e1bfbfc
6440: 32 38 30 66 34 38 66 62 66 62 66 27 29 29 7d 0a  280f48fbfbf'))}.
6450: 20 20 7d 20 7b 36 38 36 39 7d 0a 20 20 64 6f 5f    } {6869}.  do_
6460: 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 31 36 20  test func-22.16 
6470: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53  {.    execsql {S
6480: 45 4c 45 43 54 20 68 65 78 28 74 72 69 6d 28 78  ELECT hex(trim(x
6490: 27 63 65 62 31 63 65 62 32 63 65 62 33 27 2c 78  'ceb1ceb2ceb3',x
64a0: 27 63 65 62 31 27 29 29 3b 7d 0a 20 20 7d 20 7b  'ceb1'));}.  } {
64b0: 43 45 42 32 43 45 42 33 7d 0a 7d 0a 64 6f 5f 74  CEB2CEB3}.}.do_t
64c0: 65 73 74 20 66 75 6e 63 2d 32 32 2e 32 30 20 7b  est func-22.20 {
64d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
64e0: 43 54 20 74 79 70 65 6f 66 28 74 72 69 6d 28 4e  CT typeof(trim(N
64f0: 55 4c 4c 29 29 3b 7d 0a 7d 20 7b 6e 75 6c 6c 7d  ULL));}.} {null}
6500: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32  .do_test func-22
6510: 2e 32 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .21 {.  execsql 
6520: 7b 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 74  {SELECT typeof(t
6530: 72 69 6d 28 4e 55 4c 4c 2c 27 78 79 7a 27 29 29  rim(NULL,'xyz'))
6540: 3b 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64 6f 5f 74  ;}.} {null}.do_t
6550: 65 73 74 20 66 75 6e 63 2d 32 32 2e 32 32 20 7b  est func-22.22 {
6560: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
6570: 43 54 20 74 79 70 65 6f 66 28 74 72 69 6d 28 27  CT typeof(trim('
6580: 68 65 6c 6c 6f 27 2c 4e 55 4c 4c 29 29 3b 7d 0a  hello',NULL));}.
6590: 7d 20 7b 6e 75 6c 6c 7d 0a 0a 23 20 54 68 69 73  } {null}..# This
65a0: 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 65 20   is to test the 
65b0: 64 65 70 72 65 63 61 74 65 64 20 73 71 6c 69 74  deprecated sqlit
65c0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75  e3_aggregate_cou
65d0: 6e 74 28 29 20 41 50 49 2e 0a 23 0a 69 66 63 61  nt() API..#.ifca
65e0: 70 61 62 6c 65 20 64 65 70 72 65 63 61 74 65 64  pable deprecated
65f0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e   {.  do_test fun
6600: 63 2d 32 33 2e 31 20 7b 0a 20 20 20 20 73 71 6c  c-23.1 {.    sql
6610: 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72  ite3_create_aggr
6620: 65 67 61 74 65 20 64 62 0a 20 20 20 20 65 78 65  egate db.    exe
6630: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
6640: 45 43 54 20 6c 65 67 61 63 79 5f 63 6f 75 6e 74  ECT legacy_count
6650: 28 29 20 46 52 4f 4d 20 74 36 3b 0a 20 20 20 20  () FROM t6;.    
6660: 7d 0a 20 20 7d 20 7b 33 7d 0a 7d 0a 0a 23 20 54  }.  } {3}.}..# T
6670: 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  he group_concat(
6680: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a 64 6f  ) function..#.do
6690: 5f 74 65 73 74 20 66 75 6e 63 2d 32 34 2e 31 20  _test func-24.1 
66a0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
66b0: 20 20 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63    SELECT group_c
66c0: 6f 6e 63 61 74 28 74 31 29 20 46 52 4f 4d 20 74  oncat(t1) FROM t
66d0: 62 6c 31 0a 20 20 7d 0a 7d 20 7b 74 68 69 73 2c  bl1.  }.} {this,
66e0: 70 72 6f 67 72 61 6d 2c 69 73 2c 66 72 65 65 2c  program,is,free,
66f0: 73 6f 66 74 77 61 72 65 7d 0a 64 6f 5f 74 65 73  software}.do_tes
6700: 74 20 66 75 6e 63 2d 32 34 2e 32 20 7b 0a 20 20  t func-24.2 {.  
6710: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
6720: 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61  LECT group_conca
6730: 74 28 74 31 2c 27 20 27 29 20 46 52 4f 4d 20 74  t(t1,' ') FROM t
6740: 62 6c 31 0a 20 20 7d 0a 7d 20 7b 7b 74 68 69 73  bl1.  }.} {{this
6750: 20 70 72 6f 67 72 61 6d 20 69 73 20 66 72 65 65   program is free
6760: 20 73 6f 66 74 77 61 72 65 7d 7d 0a 64 6f 5f 74   software}}.do_t
6770: 65 73 74 20 66 75 6e 63 2d 32 34 2e 33 20 7b 0a  est func-24.3 {.
6780: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6790: 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e  SELECT group_con
67a0: 63 61 74 28 74 31 2c 27 20 27 20 7c 7c 20 72 6f  cat(t1,' ' || ro
67b0: 77 69 64 20 7c 7c 20 27 20 27 29 20 46 52 4f 4d  wid || ' ') FROM
67c0: 20 74 62 6c 31 0a 20 20 7d 0a 7d 20 7b 7b 74 68   tbl1.  }.} {{th
67d0: 69 73 20 32 20 70 72 6f 67 72 61 6d 20 33 20 69  is 2 program 3 i
67e0: 73 20 34 20 66 72 65 65 20 35 20 73 6f 66 74 77  s 4 free 5 softw
67f0: 61 72 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75  are}}.do_test fu
6800: 6e 63 2d 32 34 2e 34 20 7b 0a 20 20 65 78 65 63  nc-24.4 {.  exec
6810: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
6820: 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 4e 55   group_concat(NU
6830: 4c 4c 2c 74 31 29 20 46 52 4f 4d 20 74 62 6c 31  LL,t1) FROM tbl1
6840: 0a 20 20 7d 0a 7d 20 7b 7b 7d 7d 0a 64 6f 5f 74  .  }.} {{}}.do_t
6850: 65 73 74 20 66 75 6e 63 2d 32 34 2e 35 20 7b 0a  est func-24.5 {.
6860: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6870: 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e  SELECT group_con
6880: 63 61 74 28 74 31 2c 4e 55 4c 4c 29 20 46 52 4f  cat(t1,NULL) FRO
6890: 4d 20 74 62 6c 31 0a 20 20 7d 0a 7d 20 7b 74 68  M tbl1.  }.} {th
68a0: 69 73 70 72 6f 67 72 61 6d 69 73 66 72 65 65 73  isprogramisfrees
68b0: 6f 66 74 77 61 72 65 7d 0a 64 6f 5f 74 65 73 74  oftware}.do_test
68c0: 20 66 75 6e 63 2d 32 34 2e 36 20 7b 0a 20 20 65   func-24.6 {.  e
68d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
68e0: 45 43 54 20 27 42 45 47 49 4e 2d 27 7c 7c 67 72  ECT 'BEGIN-'||gr
68f0: 6f 75 70 5f 63 6f 6e 63 61 74 28 74 31 29 20 46  oup_concat(t1) F
6900: 52 4f 4d 20 74 62 6c 31 0a 20 20 7d 0a 7d 20 7b  ROM tbl1.  }.} {
6910: 42 45 47 49 4e 2d 74 68 69 73 2c 70 72 6f 67 72  BEGIN-this,progr
6920: 61 6d 2c 69 73 2c 66 72 65 65 2c 73 6f 66 74 77  am,is,free,softw
6930: 61 72 65 7d 0a 0a 23 20 54 69 63 6b 65 74 20 23  are}..# Ticket #
6940: 33 31 37 39 3a 20 20 4d 61 6b 65 20 73 75 72 65  3179:  Make sure
6950: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
6960: 69 6f 6e 73 20 63 61 6e 20 74 61 6b 65 20 6d 61  ions can take ma
6970: 6e 79 20 61 72 67 75 6d 65 6e 74 73 2e 0a 23 20  ny arguments..# 
6980: 4e 6f 6e 65 20 6f 66 20 74 68 65 20 62 75 69 6c  None of the buil
6990: 74 2d 69 6e 20 61 67 67 72 65 67 61 74 65 73 20  t-in aggregates 
69a0: 64 6f 20 74 68 69 73 2c 20 73 6f 20 75 73 65 20  do this, so use 
69b0: 74 68 65 20 6d 64 35 73 75 6d 28 29 20 66 72 6f  the md5sum() fro
69c0: 6d 20 74 68 65 0a 23 20 74 65 73 74 20 65 78 74  m the.# test ext
69d0: 65 6e 73 69 6f 6e 73 2e 0a 23 0a 75 6e 73 65 74  ensions..#.unset
69e0: 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 6d 69 64   -nocomplain mid
69f0: 61 72 67 73 0a 73 65 74 20 6d 69 64 61 72 67 73  args.set midargs
6a00: 20 7b 7d 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d   {}.unset -nocom
6a10: 70 6c 61 69 6e 20 6d 69 64 72 65 73 0a 73 65 74  plain midres.set
6a20: 20 6d 69 64 72 65 73 20 7b 7d 0a 75 6e 73 65 74   midres {}.unset
6a30: 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 72 65 73   -nocomplain res
6a40: 75 6c 74 0a 66 6f 72 20 7b 73 65 74 20 69 20 31  ult.for {set i 1
6a50: 7d 20 7b 24 69 3c 5b 73 71 6c 69 74 65 33 5f 6c  } {$i<[sqlite3_l
6a60: 69 6d 69 74 20 64 62 20 53 51 4c 49 54 45 5f 4c  imit db SQLITE_L
6a70: 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
6a80: 47 20 2d 31 5d 7d 20 7b 69 6e 63 72 20 69 7d 20  G -1]} {incr i} 
6a90: 7b 0a 20 20 61 70 70 65 6e 64 20 6d 69 64 61 72  {.  append midar
6aa0: 67 73 20 2c 27 2f 24 69 27 0a 20 20 61 70 70 65  gs ,'/$i'.  appe
6ab0: 6e 64 20 6d 69 64 72 65 73 20 2f 24 69 0a 20 20  nd midres /$i.  
6ac0: 73 65 74 20 72 65 73 75 6c 74 20 5b 6d 64 35 20  set result [md5 
6ad0: 5c 0a 20 20 20 20 20 22 74 68 69 73 24 7b 6d 69  \.     "this${mi
6ae0: 64 72 65 73 7d 70 72 6f 67 72 61 6d 24 7b 6d 69  dres}program${mi
6af0: 64 72 65 73 7d 69 73 24 7b 6d 69 64 72 65 73 7d  dres}is${midres}
6b00: 66 72 65 65 24 7b 6d 69 64 72 65 73 7d 73 6f 66  free${midres}sof
6b10: 74 77 61 72 65 24 7b 6d 69 64 72 65 73 7d 22 5d  tware${midres}"]
6b20: 0a 20 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45  .  set sql "SELE
6b30: 43 54 20 6d 64 35 73 75 6d 28 74 31 24 6d 69 64  CT md5sum(t1$mid
6b40: 61 72 67 73 29 20 46 52 4f 4d 20 74 62 6c 31 22  args) FROM tbl1"
6b50: 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .  do_test func-
6b60: 32 34 2e 37 2e 24 69 20 7b 0a 20 20 20 20 20 64  24.7.$i {.     d
6b70: 62 20 65 76 61 6c 20 24 3a 3a 73 71 6c 0a 20 20  b eval $::sql.  
6b80: 7d 20 24 72 65 73 75 6c 74 0a 7d 0a 0a 23 20 55  } $result.}..# U
6b90: 73 65 20 74 68 65 20 74 65 73 74 5f 69 73 6f 6c  se the test_isol
6ba0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74  ation function t
6bb0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
6bc0: 20 74 79 70 65 20 63 6f 6e 76 65 72 73 69 6f 6e   type conversion
6bd0: 73 0a 23 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  s.# on function 
6be0: 61 72 67 75 6d 65 6e 74 73 20 64 6f 20 6e 6f 74  arguments do not
6bf0: 20 65 66 66 65 63 74 20 73 75 62 73 65 71 75 65   effect subseque
6c00: 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 23 0a  nt arguments..#.
6c10: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 35 2e  do_test func-25.
6c20: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  1 {.  execsql {S
6c30: 45 4c 45 43 54 20 74 65 73 74 5f 69 73 6f 6c 61  ELECT test_isola
6c40: 74 69 6f 6e 28 74 31 2c 74 31 29 20 46 52 4f 4d  tion(t1,t1) FROM
6c50: 20 74 62 6c 31 7d 0a 7d 20 7b 74 68 69 73 20 70   tbl1}.} {this p
6c60: 72 6f 67 72 61 6d 20 69 73 20 66 72 65 65 20 73  rogram is free s
6c70: 6f 66 74 77 61 72 65 7d 0a 0a 23 20 54 72 79 20  oftware}..# Try 
6c80: 74 6f 20 6d 69 73 75 73 65 20 74 68 65 20 73 71  to misuse the sq
6c90: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6ca0: 63 74 69 6f 6e 28 29 20 69 6e 74 65 72 66 61 63  ction() interfac
6cb0: 65 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 0a  e.  Verify that.
6cc0: 23 20 65 72 72 6f 72 73 20 61 72 65 20 72 65 74  # errors are ret
6cd0: 75 72 6e 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74  urned..#.do_test
6ce0: 20 66 75 6e 63 2d 32 36 2e 31 20 7b 0a 20 20 61   func-26.1 {.  a
6cf0: 62 75 73 65 5f 63 72 65 61 74 65 5f 66 75 6e 63  buse_create_func
6d00: 74 69 6f 6e 20 64 62 0a 7d 20 7b 7d 0a 0a 23 20  tion db.} {}..# 
6d10: 54 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 73  The previous tes
6d20: 74 20 28 66 75 6e 63 2d 32 36 2e 31 29 20 72 65  t (func-26.1) re
6d30: 67 69 73 74 65 72 65 64 20 61 20 66 75 6e 63 74  gistered a funct
6d40: 69 6f 6e 20 77 69 74 68 20 61 20 76 65 72 79 20  ion with a very 
6d50: 6c 6f 6e 67 0a 23 20 66 75 6e 63 74 69 6f 6e 20  long.# function 
6d60: 6e 61 6d 65 20 74 68 61 74 20 74 61 6b 65 73 20  name that takes 
6d70: 6d 61 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 61  many arguments a
6d80: 6e 64 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  nd always return
6d90: 73 20 4e 55 4c 4c 2e 20 20 56 65 72 69 66 79 0a  s NULL.  Verify.
6da0: 23 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  # that this func
6db0: 74 69 6f 6e 20 77 6f 72 6b 73 20 63 6f 72 72 65  tion works corre
6dc0: 63 74 6c 79 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ctly..#.do_test 
6dd0: 66 75 6e 63 2d 32 36 2e 32 20 7b 0a 20 20 73 65  func-26.2 {.  se
6de0: 74 20 61 20 7b 7d 0a 20 20 66 6f 72 20 7b 73 65  t a {}.  for {se
6df0: 74 20 69 20 31 7d 20 7b 24 69 3c 3d 24 3a 3a 53  t i 1} {$i<=$::S
6e00: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
6e10: 4f 4e 5f 41 52 47 7d 20 7b 69 6e 63 72 20 69 7d  ON_ARG} {incr i}
6e20: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 61   {.    lappend a
6e30: 20 24 69 0a 20 20 7d 0a 20 20 64 62 20 65 76 61   $i.  }.  db eva
6e40: 6c 20 22 0a 20 20 20 20 20 53 45 4c 45 43 54 20  l ".     SELECT 
6e50: 6e 75 6c 6c 78 5f 31 32 33 34 35 36 37 38 39 5f  nullx_123456789_
6e60: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
6e70: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
6e80: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
6e90: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
6ea0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
6eb0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
6ec0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
6ed0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
6ee0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
6ef0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
6f00: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
6f10: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
6f20: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
6f30: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
6f40: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 28  56789_123456789(
6f50: 5b 6a 6f 69 6e 20 24 61 20 2c 5d 29 3b 0a 20 20  [join $a ,]);.  
6f60: 22 0a 7d 20 7b 7b 7d 7d 0a 64 6f 5f 74 65 73 74  ".} {{}}.do_test
6f70: 20 66 75 6e 63 2d 32 36 2e 33 20 7b 0a 20 20 73   func-26.3 {.  s
6f80: 65 74 20 61 20 7b 7d 0a 20 20 66 6f 72 20 7b 73  et a {}.  for {s
6f90: 65 74 20 69 20 31 7d 20 7b 24 69 3c 3d 24 3a 3a  et i 1} {$i<=$::
6fa0: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
6fb0: 49 4f 4e 5f 41 52 47 2b 31 7d 20 7b 69 6e 63 72  ION_ARG+1} {incr
6fc0: 20 69 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e   i} {.    lappen
6fd0: 64 20 61 20 24 69 0a 20 20 7d 0a 20 20 63 61 74  d a $i.  }.  cat
6fe0: 63 68 73 71 6c 20 22 0a 20 20 20 20 20 53 45 4c  chsql ".     SEL
6ff0: 45 43 54 20 6e 75 6c 6c 78 5f 31 32 33 34 35 36  ECT nullx_123456
7000: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
7010: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
7020: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
7030: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
7040: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
7050: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
7060: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
7070: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
7080: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
7090: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
70a0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
70b0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
70c0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
70d0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
70e0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
70f0: 37 38 39 28 5b 6a 6f 69 6e 20 24 61 20 2c 5d 29  789([join $a ,])
7100: 3b 0a 20 20 22 0a 7d 20 7b 31 20 7b 74 6f 6f 20  ;.  ".} {1 {too 
7110: 6d 61 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 6f  many arguments o
7120: 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 75 6c 6c 78  n function nullx
7130: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
7140: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
7150: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
7160: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
7170: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
7180: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
7190: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
71a0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
71b0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
71c0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
71d0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
71e0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
71f0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
7200: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
7210: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
7220: 5f 31 32 33 34 35 36 37 38 39 7d 7d 0a 64 6f 5f  _123456789}}.do_
7230: 74 65 73 74 20 66 75 6e 63 2d 32 36 2e 34 20 7b  test func-26.4 {
7240: 0a 20 20 73 65 74 20 61 20 7b 7d 0a 20 20 66 6f  .  set a {}.  fo
7250: 72 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 3c  r {set i 1} {$i<
7260: 3d 24 3a 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 46  =$::SQLITE_MAX_F
7270: 55 4e 43 54 49 4f 4e 5f 41 52 47 2d 31 7d 20 7b  UNCTION_ARG-1} {
7280: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 6c 61  incr i} {.    la
7290: 70 70 65 6e 64 20 61 20 24 69 0a 20 20 7d 0a 20  ppend a $i.  }. 
72a0: 20 63 61 74 63 68 73 71 6c 20 22 0a 20 20 20 20   catchsql ".    
72b0: 20 53 45 4c 45 43 54 20 6e 75 6c 6c 78 5f 31 32   SELECT nullx_12
72c0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
72d0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
72e0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
72f0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
7300: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
7310: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
7320: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
7330: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
7340: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
7350: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
7360: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
7370: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
7380: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
7390: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
73a0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
73b0: 33 34 35 36 37 38 39 28 5b 6a 6f 69 6e 20 24 61  3456789([join $a
73c0: 20 2c 5d 29 3b 0a 20 20 22 0a 7d 20 7b 31 20 7b   ,]);.  ".} {1 {
73d0: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
73e0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
73f0: 63 74 69 6f 6e 20 6e 75 6c 6c 78 5f 31 32 33 34  ction nullx_1234
7400: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
7410: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
7420: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
7430: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
7440: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
7450: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
7460: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
7470: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
7480: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
7490: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
74a0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
74b0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
74c0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
74d0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
74e0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
74f0: 35 36 37 38 39 28 29 7d 7d 0a 64 6f 5f 74 65 73  56789()}}.do_tes
7500: 74 20 66 75 6e 63 2d 32 36 2e 35 20 7b 0a 20 20  t func-26.5 {.  
7510: 63 61 74 63 68 73 71 6c 20 22 0a 20 20 20 20 20  catchsql ".     
7520: 53 45 4c 45 43 54 20 6e 75 6c 6c 78 5f 31 32 33  SELECT nullx_123
7530: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
7540: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
7550: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
7560: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
7570: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
7580: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
7590: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
75a0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
75b0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
75c0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
75d0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
75e0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
75f0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
7600: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
7610: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
7620: 34 35 36 37 38 61 28 30 29 3b 0a 20 20 22 0a 7d  45678a(0);.  ".}
7630: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 66 75 6e   {1 {no such fun
7640: 63 74 69 6f 6e 3a 20 6e 75 6c 6c 78 5f 31 32 33  ction: nullx_123
7650: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
7660: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
7670: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
7680: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
7690: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
76a0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
76b0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
76c0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
76d0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
76e0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
76f0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
7700: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
7710: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
7720: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
7730: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
7740: 34 35 36 37 38 61 7d 7d 0a 64 6f 5f 74 65 73 74  45678a}}.do_test
7750: 20 66 75 6e 63 2d 32 36 2e 36 20 7b 0a 20 20 63   func-26.6 {.  c
7760: 61 74 63 68 73 71 6c 20 22 0a 20 20 20 20 20 53  atchsql ".     S
7770: 45 4c 45 43 54 20 6e 75 6c 6c 78 5f 31 32 33 34  ELECT nullx_1234
7780: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
7790: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
77a0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
77b0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
77c0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
77d0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
77e0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
77f0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
7800: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
7810: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
7820: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
7830: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
7840: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
7850: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
7860: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
7870: 35 36 37 38 39 61 28 30 29 3b 0a 20 20 22 0a 7d  56789a(0);.  ".}
7880: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 66 75 6e   {1 {no such fun
7890: 63 74 69 6f 6e 3a 20 6e 75 6c 6c 78 5f 31 32 33  ction: nullx_123
78a0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
78b0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
78c0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
78d0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
78e0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
78f0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
7900: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
7910: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
7920: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
7930: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
7940: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
7950: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
7960: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
7970: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
7980: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
7990: 34 35 36 37 38 39 61 7d 7d 0a 0a 64 6f 5f 74 65  456789a}}..do_te
79a0: 73 74 20 66 75 6e 63 2d 32 37 2e 31 20 7b 0a 20  st func-27.1 {. 
79b0: 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43   catchsql {SELEC
79c0: 54 20 63 6f 61 6c 65 73 63 65 28 29 7d 0a 7d 20  T coalesce()}.} 
79d0: 7b 31 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72  {1 {wrong number
79e0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
79f0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 61 6c 65 73   function coales
7a00: 63 65 28 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  ce()}}.do_test f
7a10: 75 6e 63 2d 32 37 2e 32 20 7b 0a 20 20 63 61 74  unc-27.2 {.  cat
7a20: 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f  chsql {SELECT co
7a30: 61 6c 65 73 63 65 28 31 29 7d 0a 7d 20 7b 31 20  alesce(1)}.} {1 
7a40: 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  {wrong number of
7a50: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
7a60: 6e 63 74 69 6f 6e 20 63 6f 61 6c 65 73 63 65 28  nction coalesce(
7a70: 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  )}}.do_test func
7a80: 2d 32 37 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  -27.3 {.  catchs
7a90: 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 61 6c 65  ql {SELECT coale
7aa0: 73 63 65 28 31 2c 32 29 7d 0a 7d 20 7b 30 20 31  sce(1,2)}.} {0 1
7ab0: 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     }..finish_test.