/ Hex Artifact Content
Login

Artifact 09dda479bcfc568f99f3070413e9672a8eeedc1be9c5d819bf55d4788c2583b7:


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 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
01f0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
0200: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
0210: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73  dir/tester.tcl.s
0220: 65 74 20 74 65 73 74 70 72 65 66 69 78 20 66 75  et testprefix fu
0230: 6e 63 0a 0a 23 20 43 72 65 61 74 65 20 61 20 74  nc..# Create a t
0240: 61 62 6c 65 20 74 6f 20 77 6f 72 6b 20 77 69 74  able to work wit
0250: 68 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e  h..#.do_test fun
0260: 63 2d 30 2e 30 20 7b 0a 20 20 65 78 65 63 73 71  c-0.0 {.  execsq
0270: 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20  l {CREATE TABLE 
0280: 74 62 6c 31 28 74 31 20 74 65 78 74 29 7d 0a 20  tbl1(t1 text)}. 
0290: 20 66 6f 72 65 61 63 68 20 77 6f 72 64 20 7b 74   foreach word {t
02a0: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
02b0: 72 65 65 20 73 6f 66 74 77 61 72 65 7d 20 7b 0a  ree software} {.
02c0: 20 20 20 20 65 78 65 63 73 71 6c 20 22 49 4e 53      execsql "INS
02d0: 45 52 54 20 49 4e 54 4f 20 74 62 6c 31 20 56 41  ERT INTO tbl1 VA
02e0: 4c 55 45 53 28 27 24 77 6f 72 64 27 29 22 0a 20  LUES('$word')". 
02f0: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   }.  execsql {SE
0300: 4c 45 43 54 20 74 31 20 46 52 4f 4d 20 74 62 6c  LECT t1 FROM tbl
0310: 31 20 4f 52 44 45 52 20 42 59 20 74 31 7d 0a 7d  1 ORDER BY t1}.}
0320: 20 7b 66 72 65 65 20 69 73 20 70 72 6f 67 72 61   {free is progra
0330: 6d 20 73 6f 66 74 77 61 72 65 20 74 68 69 73 7d  m software this}
0340: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 30 2e  .do_test func-0.
0350: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
0360: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
0370: 45 20 74 32 28 61 29 3b 0a 20 20 20 20 20 49 4e  E t2(a);.     IN
0380: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
0390: 55 45 53 28 31 29 3b 0a 20 20 20 20 20 49 4e 53  UES(1);.     INS
03a0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
03b0: 45 53 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 49  ES(NULL);.     I
03c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
03d0: 4c 55 45 53 28 33 34 35 29 3b 0a 20 20 20 20 20  LUES(345);.     
03e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
03f0: 41 4c 55 45 53 28 4e 55 4c 4c 29 3b 0a 20 20 20  ALUES(NULL);.   
0400: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
0410: 20 56 41 4c 55 45 53 28 36 37 38 39 30 29 3b 0a   VALUES(67890);.
0420: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
0430: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t2;.  }.} {1 
0440: 7b 7d 20 33 34 35 20 7b 7d 20 36 37 38 39 30 7d  {} 345 {} 67890}
0450: 0a 0a 23 20 43 68 65 63 6b 20 6f 75 74 20 74 68  ..# Check out th
0460: 65 20 6c 65 6e 67 74 68 28 29 20 66 75 6e 63 74  e length() funct
0470: 69 6f 6e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75  ion.#.do_test fu
0480: 6e 63 2d 31 2e 30 20 7b 0a 20 20 65 78 65 63 73  nc-1.0 {.  execs
0490: 71 6c 20 7b 53 45 4c 45 43 54 20 6c 65 6e 67 74  ql {SELECT lengt
04a0: 68 28 74 31 29 20 46 52 4f 4d 20 74 62 6c 31 20  h(t1) FROM tbl1 
04b0: 4f 52 44 45 52 20 42 59 20 74 31 7d 0a 7d 20 7b  ORDER BY t1}.} {
04c0: 34 20 32 20 37 20 38 20 34 7d 0a 64 6f 5f 74 65  4 2 7 8 4}.do_te
04d0: 73 74 20 66 75 6e 63 2d 31 2e 31 20 7b 0a 20 20  st func-1.1 {.  
04e0: 73 65 74 20 72 20 5b 63 61 74 63 68 20 7b 65 78  set r [catch {ex
04f0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6c 65  ecsql {SELECT le
0500: 6e 67 74 68 28 2a 29 20 46 52 4f 4d 20 74 62 6c  ngth(*) FROM tbl
0510: 31 20 4f 52 44 45 52 20 42 59 20 74 31 7d 7d 20  1 ORDER BY t1}} 
0520: 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72  msg].  lappend r
0530: 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72 6f 6e   $msg.} {1 {wron
0540: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
0550: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
0560: 6e 20 6c 65 6e 67 74 68 28 29 7d 7d 0a 64 6f 5f  n length()}}.do_
0570: 74 65 73 74 20 66 75 6e 63 2d 31 2e 32 20 7b 0a  test func-1.2 {.
0580: 20 20 73 65 74 20 72 20 5b 63 61 74 63 68 20 7b    set r [catch {
0590: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
05a0: 6c 65 6e 67 74 68 28 74 31 2c 35 29 20 46 52 4f  length(t1,5) FRO
05b0: 4d 20 74 62 6c 31 20 4f 52 44 45 52 20 42 59 20  M tbl1 ORDER BY 
05c0: 74 31 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70  t1}} msg].  lapp
05d0: 65 6e 64 20 72 20 24 6d 73 67 0a 7d 20 7b 31 20  end r $msg.} {1 
05e0: 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  {wrong number of
05f0: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
0600: 6e 63 74 69 6f 6e 20 6c 65 6e 67 74 68 28 29 7d  nction length()}
0610: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31  }.do_test func-1
0620: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
0630: 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 74 31  SELECT length(t1
0640: 29 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  ), count(*) FROM
0650: 20 74 62 6c 31 20 47 52 4f 55 50 20 42 59 20 6c   tbl1 GROUP BY l
0660: 65 6e 67 74 68 28 74 31 29 0a 20 20 20 20 20 20  ength(t1).      
0670: 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 6c 65       ORDER BY le
0680: 6e 67 74 68 28 74 31 29 7d 0a 7d 20 7b 32 20 31  ngth(t1)}.} {2 1
0690: 20 34 20 32 20 37 20 31 20 38 20 31 7d 0a 64 6f   4 2 7 1 8 1}.do
06a0: 5f 74 65 73 74 20 66 75 6e 63 2d 31 2e 34 20 7b  _test func-1.4 {
06b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
06c0: 43 54 20 63 6f 61 6c 65 73 63 65 28 6c 65 6e 67  CT coalesce(leng
06d0: 74 68 28 61 29 2c 2d 31 29 20 46 52 4f 4d 20 74  th(a),-1) FROM t
06e0: 32 7d 0a 7d 20 7b 31 20 2d 31 20 33 20 2d 31 20  2}.} {1 -1 3 -1 
06f0: 35 7d 0a 0a 23 20 43 68 65 63 6b 20 6f 75 74 20  5}..# Check out 
0700: 74 68 65 20 73 75 62 73 74 72 28 29 20 66 75 6e  the substr() fun
0710: 63 74 69 6f 6e 0a 23 0a 64 6f 5f 74 65 73 74 20  ction.#.do_test 
0720: 66 75 6e 63 2d 32 2e 30 20 7b 0a 20 20 65 78 65  func-2.0 {.  exe
0730: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 73 75 62  csql {SELECT sub
0740: 73 74 72 28 74 31 2c 31 2c 32 29 20 46 52 4f 4d  str(t1,1,2) FROM
0750: 20 74 62 6c 31 20 4f 52 44 45 52 20 42 59 20 74   tbl1 ORDER BY t
0760: 31 7d 0a 7d 20 7b 66 72 20 69 73 20 70 72 20 73  1}.} {fr is pr s
0770: 6f 20 74 68 7d 0a 64 6f 5f 74 65 73 74 20 66 75  o th}.do_test fu
0780: 6e 63 2d 32 2e 31 20 7b 0a 20 20 65 78 65 63 73  nc-2.1 {.  execs
0790: 71 6c 20 7b 53 45 4c 45 43 54 20 73 75 62 73 74  ql {SELECT subst
07a0: 72 28 74 31 2c 32 2c 31 29 20 46 52 4f 4d 20 74  r(t1,2,1) FROM t
07b0: 62 6c 31 20 4f 52 44 45 52 20 42 59 20 74 31 7d  bl1 ORDER BY t1}
07c0: 0a 7d 20 7b 72 20 73 20 72 20 6f 20 68 7d 0a 64  .} {r s r o h}.d
07d0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 2e 32 20  o_test func-2.2 
07e0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
07f0: 45 43 54 20 73 75 62 73 74 72 28 74 31 2c 33 2c  ECT substr(t1,3,
0800: 33 29 20 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44  3) FROM tbl1 ORD
0810: 45 52 20 42 59 20 74 31 7d 0a 7d 20 7b 65 65 20  ER BY t1}.} {ee 
0820: 7b 7d 20 6f 67 72 20 66 74 77 20 69 73 7d 0a 64  {} ogr ftw is}.d
0830: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 2e 33 20  o_test func-2.3 
0840: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
0850: 45 43 54 20 73 75 62 73 74 72 28 74 31 2c 2d 31  ECT substr(t1,-1
0860: 2c 31 29 20 46 52 4f 4d 20 74 62 6c 31 20 4f 52  ,1) FROM tbl1 OR
0870: 44 45 52 20 42 59 20 74 31 7d 0a 7d 20 7b 65 20  DER BY t1}.} {e 
0880: 73 20 6d 20 65 20 73 7d 0a 64 6f 5f 74 65 73 74  s m e s}.do_test
0890: 20 66 75 6e 63 2d 32 2e 34 20 7b 0a 20 20 65 78   func-2.4 {.  ex
08a0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 73 75  ecsql {SELECT su
08b0: 62 73 74 72 28 74 31 2c 2d 31 2c 32 29 20 46 52  bstr(t1,-1,2) FR
08c0: 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52 20 42 59  OM tbl1 ORDER BY
08d0: 20 74 31 7d 0a 7d 20 7b 65 20 73 20 6d 20 65 20   t1}.} {e s m e 
08e0: 73 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  s}.do_test func-
08f0: 32 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.5 {.  execsql 
0900: 7b 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 74  {SELECT substr(t
0910: 31 2c 2d 32 2c 31 29 20 46 52 4f 4d 20 74 62 6c  1,-2,1) FROM tbl
0920: 31 20 4f 52 44 45 52 20 42 59 20 74 31 7d 0a 7d  1 ORDER BY t1}.}
0930: 20 7b 65 20 69 20 61 20 72 20 69 7d 0a 64 6f 5f   {e i a r i}.do_
0940: 74 65 73 74 20 66 75 6e 63 2d 32 2e 36 20 7b 0a  test func-2.6 {.
0950: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
0960: 54 20 73 75 62 73 74 72 28 74 31 2c 2d 32 2c 32  T substr(t1,-2,2
0970: 29 20 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44 45  ) FROM tbl1 ORDE
0980: 52 20 42 59 20 74 31 7d 0a 7d 20 7b 65 65 20 69  R BY t1}.} {ee i
0990: 73 20 61 6d 20 72 65 20 69 73 7d 0a 64 6f 5f 74  s am re is}.do_t
09a0: 65 73 74 20 66 75 6e 63 2d 32 2e 37 20 7b 0a 20  est func-2.7 {. 
09b0: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
09c0: 20 73 75 62 73 74 72 28 74 31 2c 2d 34 2c 32 29   substr(t1,-4,2)
09d0: 20 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52   FROM tbl1 ORDER
09e0: 20 42 59 20 74 31 7d 0a 7d 20 7b 66 72 20 7b 7d   BY t1}.} {fr {}
09f0: 20 67 72 20 77 61 20 74 68 7d 0a 64 6f 5f 74 65   gr wa th}.do_te
0a00: 73 74 20 66 75 6e 63 2d 32 2e 38 20 7b 0a 20 20  st func-2.8 {.  
0a10: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
0a20: 74 31 20 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44  t1 FROM tbl1 ORD
0a30: 45 52 20 42 59 20 73 75 62 73 74 72 28 74 31 2c  ER BY substr(t1,
0a40: 32 2c 32 30 29 7d 0a 7d 20 7b 74 68 69 73 20 73  2,20)}.} {this s
0a50: 6f 66 74 77 61 72 65 20 66 72 65 65 20 70 72 6f  oftware free pro
0a60: 67 72 61 6d 20 69 73 7d 0a 64 6f 5f 74 65 73 74  gram is}.do_test
0a70: 20 66 75 6e 63 2d 32 2e 39 20 7b 0a 20 20 65 78   func-2.9 {.  ex
0a80: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 73 75  ecsql {SELECT su
0a90: 62 73 74 72 28 61 2c 31 2c 31 29 20 46 52 4f 4d  bstr(a,1,1) FROM
0aa0: 20 74 32 7d 0a 7d 20 7b 31 20 7b 7d 20 33 20 7b   t2}.} {1 {} 3 {
0ab0: 7d 20 36 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  } 6}.do_test fun
0ac0: 63 2d 32 2e 31 30 20 7b 0a 20 20 65 78 65 63 73  c-2.10 {.  execs
0ad0: 71 6c 20 7b 53 45 4c 45 43 54 20 73 75 62 73 74  ql {SELECT subst
0ae0: 72 28 61 2c 32 2c 32 29 20 46 52 4f 4d 20 74 32  r(a,2,2) FROM t2
0af0: 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20 34 35 20 7b 7d  }.} {{} {} 45 {}
0b00: 20 37 38 7d 0a 0a 23 20 4f 6e 6c 79 20 64 6f 20   78}..# Only do 
0b10: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
0b20: 73 74 73 20 69 66 20 54 43 4c 20 68 61 73 20 55  sts if TCL has U
0b30: 54 46 2d 38 20 63 61 70 61 62 69 6c 69 74 69 65  TF-8 capabilitie
0b40: 73 0a 23 0a 69 66 20 7b 22 5c 75 31 32 33 34 22  s.#.if {"\u1234"
0b50: 21 3d 22 75 31 32 33 34 22 7d 20 7b 0a 0a 23 20  !="u1234"} {..# 
0b60: 50 75 74 20 73 6f 6d 65 20 55 54 46 2d 38 20 63  Put some UTF-8 c
0b70: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
0b80: 20 64 61 74 61 62 61 73 65 0a 23 0a 64 6f 5f 74   database.#.do_t
0b90: 65 73 74 20 66 75 6e 63 2d 33 2e 30 20 7b 0a 20  est func-3.0 {. 
0ba0: 20 65 78 65 63 73 71 6c 20 7b 44 45 4c 45 54 45   execsql {DELETE
0bb0: 20 46 52 4f 4d 20 74 62 6c 31 7d 0a 20 20 66 6f   FROM tbl1}.  fo
0bc0: 72 65 61 63 68 20 77 6f 72 64 20 22 63 6f 6e 74  reach word "cont
0bd0: 61 69 6e 73 20 55 54 46 2d 38 20 63 68 61 72 61  ains UTF-8 chara
0be0: 63 74 65 72 73 20 68 69 5c 75 31 32 33 34 68 6f  cters hi\u1234ho
0bf0: 22 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  " {.    execsql 
0c00: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c  "INSERT INTO tbl
0c10: 31 20 56 41 4c 55 45 53 28 27 24 77 6f 72 64 27  1 VALUES('$word'
0c20: 29 22 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  )".  }.  execsql
0c30: 20 7b 53 45 4c 45 43 54 20 74 31 20 46 52 4f 4d   {SELECT t1 FROM
0c40: 20 74 62 6c 31 20 4f 52 44 45 52 20 42 59 20 74   tbl1 ORDER BY t
0c50: 31 7d 0a 7d 20 22 55 54 46 2d 38 20 63 68 61 72  1}.} "UTF-8 char
0c60: 61 63 74 65 72 73 20 63 6f 6e 74 61 69 6e 73 20  acters contains 
0c70: 68 69 5c 75 31 32 33 34 68 6f 22 0a 64 6f 5f 74  hi\u1234ho".do_t
0c80: 65 73 74 20 66 75 6e 63 2d 33 2e 31 20 7b 0a 20  est func-3.1 {. 
0c90: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
0ca0: 20 6c 65 6e 67 74 68 28 74 31 29 20 46 52 4f 4d   length(t1) FROM
0cb0: 20 74 62 6c 31 20 4f 52 44 45 52 20 42 59 20 74   tbl1 ORDER BY t
0cc0: 31 7d 0a 7d 20 7b 35 20 31 30 20 38 20 35 7d 0a  1}.} {5 10 8 5}.
0cd0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 33 2e 32  do_test func-3.2
0ce0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
0cf0: 4c 45 43 54 20 73 75 62 73 74 72 28 74 31 2c 31  LECT substr(t1,1
0d00: 2c 32 29 20 46 52 4f 4d 20 74 62 6c 31 20 4f 52  ,2) FROM tbl1 OR
0d10: 44 45 52 20 42 59 20 74 31 7d 0a 7d 20 7b 55 54  DER BY t1}.} {UT
0d20: 20 63 68 20 63 6f 20 68 69 7d 0a 64 6f 5f 74 65   ch co hi}.do_te
0d30: 73 74 20 66 75 6e 63 2d 33 2e 33 20 7b 0a 20 20  st func-3.3 {.  
0d40: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
0d50: 73 75 62 73 74 72 28 74 31 2c 31 2c 33 29 20 46  substr(t1,1,3) F
0d60: 52 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52 20 42  ROM tbl1 ORDER B
0d70: 59 20 74 31 7d 0a 7d 20 22 55 54 46 20 63 68 61  Y t1}.} "UTF cha
0d80: 20 63 6f 6e 20 68 69 5c 75 31 32 33 34 22 0a 64   con hi\u1234".d
0d90: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 33 2e 34 20  o_test func-3.4 
0da0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
0db0: 45 43 54 20 73 75 62 73 74 72 28 74 31 2c 32 2c  ECT substr(t1,2,
0dc0: 32 29 20 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44  2) FROM tbl1 ORD
0dd0: 45 52 20 42 59 20 74 31 7d 0a 7d 20 22 54 46 20  ER BY t1}.} "TF 
0de0: 68 61 20 6f 6e 20 69 5c 75 31 32 33 34 22 0a 64  ha on i\u1234".d
0df0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 33 2e 35 20  o_test func-3.5 
0e00: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
0e10: 45 43 54 20 73 75 62 73 74 72 28 74 31 2c 32 2c  ECT substr(t1,2,
0e20: 33 29 20 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44  3) FROM tbl1 ORD
0e30: 45 52 20 42 59 20 74 31 7d 0a 7d 20 22 54 46 2d  ER BY t1}.} "TF-
0e40: 20 68 61 72 20 6f 6e 74 20 69 5c 75 31 32 33 34   har ont i\u1234
0e50: 68 22 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  h".do_test func-
0e60: 33 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.6 {.  execsql 
0e70: 7b 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 74  {SELECT substr(t
0e80: 31 2c 33 2c 32 29 20 46 52 4f 4d 20 74 62 6c 31  1,3,2) FROM tbl1
0e90: 20 4f 52 44 45 52 20 42 59 20 74 31 7d 0a 7d 20   ORDER BY t1}.} 
0ea0: 22 46 2d 20 61 72 20 6e 74 20 5c 75 31 32 33 34  "F- ar nt \u1234
0eb0: 68 22 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  h".do_test func-
0ec0: 33 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.7 {.  execsql 
0ed0: 7b 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 74  {SELECT substr(t
0ee0: 31 2c 34 2c 32 29 20 46 52 4f 4d 20 74 62 6c 31  1,4,2) FROM tbl1
0ef0: 20 4f 52 44 45 52 20 42 59 20 74 31 7d 0a 7d 20   ORDER BY t1}.} 
0f00: 22 2d 38 20 72 61 20 74 61 20 68 6f 22 0a 64 6f  "-8 ra ta ho".do
0f10: 5f 74 65 73 74 20 66 75 6e 63 2d 33 2e 38 20 7b  _test func-3.8 {
0f20: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
0f30: 43 54 20 73 75 62 73 74 72 28 74 31 2c 2d 31 2c  CT substr(t1,-1,
0f40: 31 29 20 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44  1) FROM tbl1 ORD
0f50: 45 52 20 42 59 20 74 31 7d 0a 7d 20 22 38 20 73  ER BY t1}.} "8 s
0f60: 20 73 20 6f 22 0a 64 6f 5f 74 65 73 74 20 66 75   s o".do_test fu
0f70: 6e 63 2d 33 2e 39 20 7b 0a 20 20 65 78 65 63 73  nc-3.9 {.  execs
0f80: 71 6c 20 7b 53 45 4c 45 43 54 20 73 75 62 73 74  ql {SELECT subst
0f90: 72 28 74 31 2c 2d 33 2c 32 29 20 46 52 4f 4d 20  r(t1,-3,2) FROM 
0fa0: 74 62 6c 31 20 4f 52 44 45 52 20 42 59 20 74 31  tbl1 ORDER BY t1
0fb0: 7d 0a 7d 20 22 46 2d 20 65 72 20 69 6e 20 5c 75  }.} "F- er in \u
0fc0: 31 32 33 34 68 22 0a 64 6f 5f 74 65 73 74 20 66  1234h".do_test f
0fd0: 75 6e 63 2d 33 2e 31 30 20 7b 0a 20 20 65 78 65  unc-3.10 {.  exe
0fe0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 73 75 62  csql {SELECT sub
0ff0: 73 74 72 28 74 31 2c 2d 34 2c 33 29 20 46 52 4f  str(t1,-4,3) FRO
1000: 4d 20 74 62 6c 31 20 4f 52 44 45 52 20 42 59 20  M tbl1 ORDER BY 
1010: 74 31 7d 0a 7d 20 22 54 46 2d 20 74 65 72 20 61  t1}.} "TF- ter a
1020: 69 6e 20 69 5c 75 31 32 33 34 68 22 0a 64 6f 5f  in i\u1234h".do_
1030: 74 65 73 74 20 66 75 6e 63 2d 33 2e 39 39 20 7b  test func-3.99 {
1040: 0a 20 20 65 78 65 63 73 71 6c 20 7b 44 45 4c 45  .  execsql {DELE
1050: 54 45 20 46 52 4f 4d 20 74 62 6c 31 7d 0a 20 20  TE FROM tbl1}.  
1060: 66 6f 72 65 61 63 68 20 77 6f 72 64 20 7b 74 68  foreach word {th
1070: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 72  is program is fr
1080: 65 65 20 73 6f 66 74 77 61 72 65 7d 20 7b 0a 20  ee software} {. 
1090: 20 20 20 65 78 65 63 73 71 6c 20 22 49 4e 53 45     execsql "INSE
10a0: 52 54 20 49 4e 54 4f 20 74 62 6c 31 20 56 41 4c  RT INTO tbl1 VAL
10b0: 55 45 53 28 27 24 77 6f 72 64 27 29 22 0a 20 20  UES('$word')".  
10c0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  }.  execsql {SEL
10d0: 45 43 54 20 74 31 20 46 52 4f 4d 20 74 62 6c 31  ECT t1 FROM tbl1
10e0: 7d 0a 7d 20 7b 74 68 69 73 20 70 72 6f 67 72 61  }.} {this progra
10f0: 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61  m is free softwa
1100: 72 65 7d 0a 0a 7d 20 3b 23 20 45 6e 64 20 5c 75  re}..} ;# End \u
1110: 31 32 33 34 21 3d 75 31 32 33 34 0a 0a 23 20 54  1234!=u1234..# T
1120: 65 73 74 20 74 68 65 20 61 62 73 28 29 20 61 6e  est the abs() an
1130: 64 20 72 6f 75 6e 64 28 29 20 66 75 6e 63 74 69  d round() functi
1140: 6f 6e 73 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65  ons..#.ifcapable
1150: 20 21 66 6c 6f 61 74 69 6e 67 70 6f 69 6e 74 20   !floatingpoint 
1160: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63  {.  do_test func
1170: 2d 34 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73  -4.1 {.    execs
1180: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
1190: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
11a0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
11b0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
11c0: 2c 32 2c 33 29 3b 0a 20 20 20 20 20 20 49 4e 53  ,2,3);.      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 32 2c 31 32 33 34 35 36 37 38 39 30 31  ES(2,12345678901
11f0: 32 33 34 2c 2d 31 32 33 34 35 36 37 38 39 30 29  234,-1234567890)
1200: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
1210: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
1220: 2d 32 2c 2d 35 29 3b 0a 20 20 20 20 7d 0a 20 20  -2,-5);.    }.  
1230: 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45    catchsql {SELE
1240: 43 54 20 61 62 73 28 61 2c 62 29 20 46 52 4f 4d  CT abs(a,b) FROM
1250: 20 74 31 7d 0a 20 20 7d 20 7b 31 20 7b 77 72 6f   t1}.  } {1 {wro
1260: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
1270: 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69  uments to functi
1280: 6f 6e 20 61 62 73 28 29 7d 7d 0a 7d 0a 69 66 63  on abs()}}.}.ifc
1290: 61 70 61 62 6c 65 20 66 6c 6f 61 74 69 6e 67 70  apable floatingp
12a0: 6f 69 6e 74 20 7b 0a 20 20 64 6f 5f 74 65 73 74  oint {.  do_test
12b0: 20 66 75 6e 63 2d 34 2e 31 20 7b 0a 20 20 20 20   func-4.1 {.    
12c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
12d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
12e0: 61 2c 62 2c 63 29 3b 0a 20 20 20 20 20 20 49 4e  a,b,c);.      IN
12f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1300: 55 45 53 28 31 2c 32 2c 33 29 3b 0a 20 20 20 20  UES(1,2,3);.    
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 32 2c 31 2e 32 33 34 35   VALUES(2,1.2345
1330: 36 37 38 39 30 31 32 33 34 2c 2d 31 32 33 34 35  678901234,-12345
1340: 2e 36 37 38 39 30 29 3b 0a 20 20 20 20 20 20 49  .67890);.      I
1350: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1360: 4c 55 45 53 28 33 2c 2d 32 2c 2d 35 29 3b 0a 20  LUES(3,-2,-5);. 
1370: 20 20 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71     }.    catchsq
1380: 6c 20 7b 53 45 4c 45 43 54 20 61 62 73 28 61 2c  l {SELECT abs(a,
1390: 62 29 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20  b) FROM t1}.  } 
13a0: 7b 31 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72  {1 {wrong number
13b0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
13c0: 20 66 75 6e 63 74 69 6f 6e 20 61 62 73 28 29 7d   function abs()}
13d0: 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  }.}.do_test func
13e0: 2d 34 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  -4.2 {.  catchsq
13f0: 6c 20 7b 53 45 4c 45 43 54 20 61 62 73 28 29 20  l {SELECT abs() 
1400: 46 52 4f 4d 20 74 31 7d 0a 7d 20 7b 31 20 7b 77  FROM t1}.} {1 {w
1410: 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
1420: 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63  rguments to func
1430: 74 69 6f 6e 20 61 62 73 28 29 7d 7d 0a 69 66 63  tion abs()}}.ifc
1440: 61 70 61 62 6c 65 20 66 6c 6f 61 74 69 6e 67 70  apable floatingp
1450: 6f 69 6e 74 20 7b 0a 20 20 64 6f 5f 74 65 73 74  oint {.  do_test
1460: 20 66 75 6e 63 2d 34 2e 33 20 7b 0a 20 20 20 20   func-4.3 {.    
1470: 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54  catchsql {SELECT
1480: 20 61 62 73 28 62 29 20 46 52 4f 4d 20 74 31 20   abs(b) FROM t1 
1490: 4f 52 44 45 52 20 42 59 20 61 7d 0a 20 20 7d 20  ORDER BY a}.  } 
14a0: 7b 30 20 7b 32 20 31 2e 32 33 34 35 36 37 38 39  {0 {2 1.23456789
14b0: 30 31 32 33 34 20 32 7d 7d 0a 20 20 64 6f 5f 74  01234 2}}.  do_t
14c0: 65 73 74 20 66 75 6e 63 2d 34 2e 34 20 7b 0a 20  est func-4.4 {. 
14d0: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c     catchsql {SEL
14e0: 45 43 54 20 61 62 73 28 63 29 20 46 52 4f 4d 20  ECT abs(c) FROM 
14f0: 74 31 20 4f 52 44 45 52 20 42 59 20 61 7d 0a 20  t1 ORDER BY a}. 
1500: 20 7d 20 7b 30 20 7b 33 20 31 32 33 34 35 2e 36   } {0 {3 12345.6
1510: 37 38 39 20 35 7d 7d 0a 7d 0a 69 66 63 61 70 61  789 5}}.}.ifcapa
1520: 62 6c 65 20 21 66 6c 6f 61 74 69 6e 67 70 6f 69  ble !floatingpoi
1530: 6e 74 20 7b 0a 20 20 69 66 20 7b 5b 77 6f 72 6b  nt {.  if {[work
1540: 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 5d 7d 20  ing_64bit_int]} 
1550: 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 66 75  {.    do_test fu
1560: 6e 63 2d 34 2e 33 20 7b 0a 20 20 20 20 20 20 63  nc-4.3 {.      c
1570: 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20  atchsql {SELECT 
1580: 61 62 73 28 62 29 20 46 52 4f 4d 20 74 31 20 4f  abs(b) FROM t1 O
1590: 52 44 45 52 20 42 59 20 61 7d 0a 20 20 20 20 7d  RDER BY a}.    }
15a0: 20 7b 30 20 7b 32 20 31 32 33 34 35 36 37 38 39   {0 {2 123456789
15b0: 30 31 32 33 34 20 32 7d 7d 0a 20 20 7d 0a 20 20  01234 2}}.  }.  
15c0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34 2e 34  do_test func-4.4
15d0: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
15e0: 7b 53 45 4c 45 43 54 20 61 62 73 28 63 29 20 46  {SELECT abs(c) F
15f0: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
1600: 61 7d 0a 20 20 7d 20 7b 30 20 7b 33 20 31 32 33  a}.  } {0 {3 123
1610: 34 35 36 37 38 39 30 20 35 7d 7d 0a 7d 0a 64 6f  4567890 5}}.}.do
1620: 5f 74 65 73 74 20 66 75 6e 63 2d 34 2e 34 2e 31  _test func-4.4.1
1630: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
1640: 4c 45 43 54 20 61 62 73 28 61 29 20 46 52 4f 4d  LECT abs(a) FROM
1650: 20 74 32 7d 0a 7d 20 7b 31 20 7b 7d 20 33 34 35   t2}.} {1 {} 345
1660: 20 7b 7d 20 36 37 38 39 30 7d 0a 64 6f 5f 74 65   {} 67890}.do_te
1670: 73 74 20 66 75 6e 63 2d 34 2e 34 2e 32 20 7b 0a  st func-4.4.2 {.
1680: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
1690: 54 20 61 62 73 28 74 31 29 20 46 52 4f 4d 20 74  T abs(t1) FROM t
16a0: 62 6c 31 7d 0a 7d 20 7b 30 2e 30 20 30 2e 30 20  bl1}.} {0.0 0.0 
16b0: 30 2e 30 20 30 2e 30 20 30 2e 30 7d 0a 0a 69 66  0.0 0.0 0.0}..if
16c0: 63 61 70 61 62 6c 65 20 66 6c 6f 61 74 69 6e 67  capable floating
16d0: 70 6f 69 6e 74 20 7b 0a 20 20 64 6f 5f 74 65 73  point {.  do_tes
16e0: 74 20 66 75 6e 63 2d 34 2e 35 20 7b 0a 20 20 20  t func-4.5 {.   
16f0: 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43   catchsql {SELEC
1700: 54 20 72 6f 75 6e 64 28 61 2c 62 2c 63 29 20 46  T round(a,b,c) F
1710: 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 7b  ROM t1}.  } {1 {
1720: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
1730: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
1740: 63 74 69 6f 6e 20 72 6f 75 6e 64 28 29 7d 7d 0a  ction round()}}.
1750: 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34    do_test func-4
1760: 2e 36 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .6 {.    catchsq
1770: 6c 20 7b 53 45 4c 45 43 54 20 72 6f 75 6e 64 28  l {SELECT round(
1780: 62 2c 32 29 20 46 52 4f 4d 20 74 31 20 4f 52 44  b,2) FROM t1 ORD
1790: 45 52 20 42 59 20 62 7d 0a 20 20 7d 20 7b 30 20  ER BY b}.  } {0 
17a0: 7b 2d 32 2e 30 20 31 2e 32 33 20 32 2e 30 7d 7d  {-2.0 1.23 2.0}}
17b0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .  do_test func-
17c0: 34 2e 37 20 7b 0a 20 20 20 20 63 61 74 63 68 73  4.7 {.    catchs
17d0: 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f 75 6e 64  ql {SELECT round
17e0: 28 62 2c 30 29 20 46 52 4f 4d 20 74 31 20 4f 52  (b,0) FROM t1 OR
17f0: 44 45 52 20 42 59 20 61 7d 0a 20 20 7d 20 7b 30  DER BY a}.  } {0
1800: 20 7b 32 2e 30 20 31 2e 30 20 2d 32 2e 30 7d 7d   {2.0 1.0 -2.0}}
1810: 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .  do_test func-
1820: 34 2e 38 20 7b 0a 20 20 20 20 63 61 74 63 68 73  4.8 {.    catchs
1830: 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f 75 6e 64  ql {SELECT round
1840: 28 63 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  (c) FROM t1 ORDE
1850: 52 20 42 59 20 61 7d 0a 20 20 7d 20 7b 30 20 7b  R BY a}.  } {0 {
1860: 33 2e 30 20 2d 31 32 33 34 36 2e 30 20 2d 35 2e  3.0 -12346.0 -5.
1870: 30 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 75  0}}.  do_test fu
1880: 6e 63 2d 34 2e 39 20 7b 0a 20 20 20 20 63 61 74  nc-4.9 {.    cat
1890: 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f  chsql {SELECT ro
18a0: 75 6e 64 28 63 2c 61 29 20 46 52 4f 4d 20 74 31  und(c,a) FROM t1
18b0: 20 4f 52 44 45 52 20 42 59 20 61 7d 0a 20 20 7d   ORDER BY a}.  }
18c0: 20 7b 30 20 7b 33 2e 30 20 2d 31 32 33 34 35 2e   {0 {3.0 -12345.
18d0: 36 38 20 2d 35 2e 30 7d 7d 0a 20 20 64 6f 5f 74  68 -5.0}}.  do_t
18e0: 65 73 74 20 66 75 6e 63 2d 34 2e 31 30 20 7b 0a  est func-4.10 {.
18f0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45      catchsql {SE
1900: 4c 45 43 54 20 27 78 27 20 7c 7c 20 72 6f 75 6e  LECT 'x' || roun
1910: 64 28 63 2c 61 29 20 7c 7c 20 27 79 27 20 46 52  d(c,a) || 'y' FR
1920: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61  OM t1 ORDER BY a
1930: 7d 0a 20 20 7d 20 7b 30 20 7b 78 33 2e 30 79 20  }.  } {0 {x3.0y 
1940: 78 2d 31 32 33 34 35 2e 36 38 79 20 78 2d 35 2e  x-12345.68y x-5.
1950: 30 79 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  0y}}.  do_test f
1960: 75 6e 63 2d 34 2e 31 31 20 7b 0a 20 20 20 20 63  unc-4.11 {.    c
1970: 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20  atchsql {SELECT 
1980: 72 6f 75 6e 64 28 29 20 46 52 4f 4d 20 74 31 20  round() FROM t1 
1990: 4f 52 44 45 52 20 42 59 20 61 7d 0a 20 20 7d 20  ORDER BY a}.  } 
19a0: 7b 31 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72  {1 {wrong number
19b0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
19c0: 20 66 75 6e 63 74 69 6f 6e 20 72 6f 75 6e 64 28   function round(
19d0: 29 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 75  )}}.  do_test fu
19e0: 6e 63 2d 34 2e 31 32 20 7b 0a 20 20 20 20 65 78  nc-4.12 {.    ex
19f0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f  ecsql {SELECT co
1a00: 61 6c 65 73 63 65 28 72 6f 75 6e 64 28 61 2c 32  alesce(round(a,2
1a10: 29 2c 27 6e 69 6c 27 29 20 46 52 4f 4d 20 74 32  ),'nil') FROM t2
1a20: 7d 0a 20 20 7d 20 7b 31 2e 30 20 6e 69 6c 20 33  }.  } {1.0 nil 3
1a30: 34 35 2e 30 20 6e 69 6c 20 36 37 38 39 30 2e 30  45.0 nil 67890.0
1a40: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63  }.  do_test func
1a50: 2d 34 2e 31 33 20 7b 0a 20 20 20 20 65 78 65 63  -4.13 {.    exec
1a60: 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f 75 6e  sql {SELECT roun
1a70: 64 28 74 31 2c 32 29 20 46 52 4f 4d 20 74 62 6c  d(t1,2) FROM tbl
1a80: 31 7d 0a 20 20 7d 20 7b 30 2e 30 20 30 2e 30 20  1}.  } {0.0 0.0 
1a90: 30 2e 30 20 30 2e 30 20 30 2e 30 7d 0a 20 20 64  0.0 0.0 0.0}.  d
1aa0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34 2e 31 34  o_test func-4.14
1ab0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
1ac0: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 72 6f  SELECT typeof(ro
1ad0: 75 6e 64 28 35 2e 31 2c 31 29 29 3b 7d 0a 20 20  und(5.1,1));}.  
1ae0: 7d 20 7b 72 65 61 6c 7d 0a 20 20 64 6f 5f 74 65  } {real}.  do_te
1af0: 73 74 20 66 75 6e 63 2d 34 2e 31 35 20 7b 0a 20  st func-4.15 {. 
1b00: 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45     execsql {SELE
1b10: 43 54 20 74 79 70 65 6f 66 28 72 6f 75 6e 64 28  CT typeof(round(
1b20: 35 2e 31 29 29 3b 7d 0a 20 20 7d 20 7b 72 65 61  5.1));}.  } {rea
1b30: 6c 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e  l}.  do_test fun
1b40: 63 2d 34 2e 31 36 20 7b 0a 20 20 20 20 63 61 74  c-4.16 {.    cat
1b50: 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f  chsql {SELECT ro
1b60: 75 6e 64 28 62 2c 32 2e 30 29 20 46 52 4f 4d 20  und(b,2.0) FROM 
1b70: 74 31 20 4f 52 44 45 52 20 42 59 20 62 7d 0a 20  t1 ORDER BY b}. 
1b80: 20 7d 20 7b 30 20 7b 2d 32 2e 30 20 31 2e 32 33   } {0 {-2.0 1.23
1b90: 20 32 2e 30 7d 7d 0a 20 20 23 20 56 65 72 69 66   2.0}}.  # Verif
1ba0: 79 20 73 6f 6d 65 20 76 61 6c 75 65 73 20 72 65  y some values re
1bb0: 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 6d 61  ported on the ma
1bc0: 69 6c 69 6e 67 20 6c 69 73 74 2e 0a 20 20 23 20  iling list..  # 
1bd0: 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 66 61  Some of these fa
1be0: 69 6c 20 6f 6e 20 4d 53 56 43 20 62 75 69 6c 64  il on MSVC build
1bf0: 73 20 77 69 74 68 20 36 34 2d 62 69 74 0a 20 20  s with 64-bit.  
1c00: 23 20 6c 6f 6e 67 20 64 6f 75 62 6c 65 73 2c 20  # long doubles, 
1c10: 62 75 74 20 6e 6f 74 20 6f 6e 20 47 43 43 20 62  but not on GCC b
1c20: 75 69 6c 64 73 20 77 69 74 68 20 38 30 2d 62 69  uilds with 80-bi
1c30: 74 0a 20 20 23 20 6c 6f 6e 67 20 64 6f 75 62 6c  t.  # long doubl
1c40: 65 73 2e 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  es..  for {set i
1c50: 20 31 7d 20 7b 24 69 3c 39 39 39 7d 20 7b 69 6e   1} {$i<999} {in
1c60: 63 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20  cr i} {.    set 
1c70: 78 31 20 5b 65 78 70 72 20 34 30 32 32 32 2e 35  x1 [expr 40222.5
1c80: 20 2b 20 24 69 5d 0a 20 20 20 20 73 65 74 20 78   + $i].    set x
1c90: 32 20 5b 65 78 70 72 20 34 30 32 32 33 2e 30 20  2 [expr 40223.0 
1ca0: 2b 20 24 69 5d 0a 20 20 20 20 64 6f 5f 74 65 73  + $i].    do_tes
1cb0: 74 20 66 75 6e 63 2d 34 2e 31 37 2e 24 69 20 7b  t func-4.17.$i {
1cc0: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b  .      execsql {
1cd0: 53 45 4c 45 43 54 20 72 6f 75 6e 64 28 24 78 31  SELECT round($x1
1ce0: 29 3b 7d 0a 20 20 20 20 7d 20 24 78 32 0a 20 20  );}.    } $x2.  
1cf0: 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 31  }.  for {set i 1
1d00: 7d 20 7b 24 69 3c 39 39 39 7d 20 7b 69 6e 63 72  } {$i<999} {incr
1d10: 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 78 31   i} {.    set x1
1d20: 20 5b 65 78 70 72 20 34 30 32 32 32 2e 30 35 20   [expr 40222.05 
1d30: 2b 20 24 69 5d 0a 20 20 20 20 73 65 74 20 78 32  + $i].    set x2
1d40: 20 5b 65 78 70 72 20 34 30 32 32 32 2e 31 30 20   [expr 40222.10 
1d50: 2b 20 24 69 5d 0a 20 20 20 20 64 6f 5f 74 65 73  + $i].    do_tes
1d60: 74 20 66 75 6e 63 2d 34 2e 31 38 2e 24 69 20 7b  t func-4.18.$i {
1d70: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b  .      execsql {
1d80: 53 45 4c 45 43 54 20 72 6f 75 6e 64 28 24 78 31  SELECT round($x1
1d90: 2c 31 29 3b 7d 0a 20 20 20 20 7d 20 24 78 32 0a  ,1);}.    } $x2.
1da0: 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 75    }.  do_test fu
1db0: 6e 63 2d 34 2e 32 30 20 7b 0a 20 20 20 20 65 78  nc-4.20 {.    ex
1dc0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f  ecsql {SELECT ro
1dd0: 75 6e 64 28 34 30 32 32 33 2e 34 39 39 39 39 39  und(40223.499999
1de0: 39 39 39 39 29 3b 7d 0a 20 20 7d 20 7b 34 30 32  9999);}.  } {402
1df0: 32 33 2e 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20  23.0}.  do_test 
1e00: 66 75 6e 63 2d 34 2e 32 31 20 7b 0a 20 20 20 20  func-4.21 {.    
1e10: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
1e20: 72 6f 75 6e 64 28 34 30 32 32 34 2e 34 39 39 39  round(40224.4999
1e30: 39 39 39 39 39 39 29 3b 7d 0a 20 20 7d 20 7b 34  999999);}.  } {4
1e40: 30 32 32 34 2e 30 7d 0a 20 20 64 6f 5f 74 65 73  0224.0}.  do_tes
1e50: 74 20 66 75 6e 63 2d 34 2e 32 32 20 7b 0a 20 20  t func-4.22 {.  
1e60: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
1e70: 54 20 72 6f 75 6e 64 28 34 30 32 32 35 2e 34 39  T round(40225.49
1e80: 39 39 39 39 39 39 39 39 29 3b 7d 0a 20 20 7d 20  99999999);}.  } 
1e90: 7b 34 30 32 32 35 2e 30 7d 0a 20 20 66 6f 72 20  {40225.0}.  for 
1ea0: 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 3c 31 30  {set i 1} {$i<10
1eb0: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
1ec0: 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34 2e   do_test func-4.
1ed0: 32 33 2e 24 69 20 7b 0a 20 20 20 20 20 20 65 78  23.$i {.      ex
1ee0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f  ecsql {SELECT ro
1ef0: 75 6e 64 28 34 30 32 32 33 2e 34 39 39 39 39 39  und(40223.499999
1f00: 39 39 39 39 2c 24 69 29 3b 7d 0a 20 20 20 20 7d  9999,$i);}.    }
1f10: 20 7b 34 30 32 32 33 2e 35 7d 0a 20 20 20 20 64   {40223.5}.    d
1f20: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34 2e 32 34  o_test func-4.24
1f30: 2e 24 69 20 7b 0a 20 20 20 20 20 20 65 78 65 63  .$i {.      exec
1f40: 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f 75 6e  sql {SELECT roun
1f50: 64 28 34 30 32 32 34 2e 34 39 39 39 39 39 39 39  d(40224.49999999
1f60: 39 39 2c 24 69 29 3b 7d 0a 20 20 20 20 7d 20 7b  99,$i);}.    } {
1f70: 34 30 32 32 34 2e 35 7d 0a 20 20 20 20 64 6f 5f  40224.5}.    do_
1f80: 74 65 73 74 20 66 75 6e 63 2d 34 2e 32 35 2e 24  test func-4.25.$
1f90: 69 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71  i {.      execsq
1fa0: 6c 20 7b 53 45 4c 45 43 54 20 72 6f 75 6e 64 28  l {SELECT round(
1fb0: 34 30 32 32 35 2e 34 39 39 39 39 39 39 39 39 39  40225.4999999999
1fc0: 2c 24 69 29 3b 7d 0a 20 20 20 20 7d 20 7b 34 30  ,$i);}.    } {40
1fd0: 32 32 35 2e 35 7d 0a 20 20 7d 0a 20 20 66 6f 72  225.5}.  }.  for
1fe0: 20 7b 73 65 74 20 69 20 31 30 7d 20 7b 24 69 3c   {set i 10} {$i<
1ff0: 33 32 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  32} {incr i} {. 
2000: 20 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d     do_test func-
2010: 34 2e 32 36 2e 24 69 20 7b 0a 20 20 20 20 20 20  4.26.$i {.      
2020: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
2030: 72 6f 75 6e 64 28 34 30 32 32 33 2e 34 39 39 39  round(40223.4999
2040: 39 39 39 39 39 39 2c 24 69 29 3b 7d 0a 20 20 20  999999,$i);}.   
2050: 20 7d 20 7b 34 30 32 32 33 2e 34 39 39 39 39 39   } {40223.499999
2060: 39 39 39 39 7d 0a 20 20 20 20 64 6f 5f 74 65 73  9999}.    do_tes
2070: 74 20 66 75 6e 63 2d 34 2e 32 37 2e 24 69 20 7b  t func-4.27.$i {
2080: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b  .      execsql {
2090: 53 45 4c 45 43 54 20 72 6f 75 6e 64 28 34 30 32  SELECT round(402
20a0: 32 34 2e 34 39 39 39 39 39 39 39 39 39 2c 24 69  24.4999999999,$i
20b0: 29 3b 7d 0a 20 20 20 20 7d 20 7b 34 30 32 32 34  );}.    } {40224
20c0: 2e 34 39 39 39 39 39 39 39 39 39 7d 0a 20 20 20  .4999999999}.   
20d0: 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34 2e   do_test func-4.
20e0: 32 38 2e 24 69 20 7b 0a 20 20 20 20 20 20 65 78  28.$i {.      ex
20f0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f  ecsql {SELECT ro
2100: 75 6e 64 28 34 30 32 32 35 2e 34 39 39 39 39 39  und(40225.499999
2110: 39 39 39 39 2c 24 69 29 3b 7d 0a 20 20 20 20 7d  9999,$i);}.    }
2120: 20 7b 34 30 32 32 35 2e 34 39 39 39 39 39 39 39   {40225.49999999
2130: 39 39 7d 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73  99}.  }.  do_tes
2140: 74 20 66 75 6e 63 2d 34 2e 32 39 20 7b 0a 20 20  t func-4.29 {.  
2150: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
2160: 54 20 72 6f 75 6e 64 28 31 32 33 34 35 36 37 38  T round(12345678
2170: 39 30 2e 35 29 3b 7d 0a 20 20 7d 20 7b 31 32 33  90.5);}.  } {123
2180: 34 35 36 37 38 39 31 2e 30 7d 0a 20 20 64 6f 5f  4567891.0}.  do_
2190: 74 65 73 74 20 66 75 6e 63 2d 34 2e 33 30 20 7b  test func-4.30 {
21a0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45  .    execsql {SE
21b0: 4c 45 43 54 20 72 6f 75 6e 64 28 31 32 33 34 35  LECT round(12345
21c0: 36 37 38 39 30 31 2e 35 29 3b 7d 0a 20 20 7d 20  678901.5);}.  } 
21d0: 7b 31 32 33 34 35 36 37 38 39 30 32 2e 30 7d 0a  {12345678902.0}.
21e0: 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34    do_test func-4
21f0: 2e 33 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .31 {.    execsq
2200: 6c 20 7b 53 45 4c 45 43 54 20 72 6f 75 6e 64 28  l {SELECT round(
2210: 31 32 33 34 35 36 37 38 39 30 31 32 2e 35 29 3b  123456789012.5);
2220: 7d 0a 20 20 7d 20 7b 31 32 33 34 35 36 37 38 39  }.  } {123456789
2230: 30 31 33 2e 30 7d 0a 20 20 64 6f 5f 74 65 73 74  013.0}.  do_test
2240: 20 66 75 6e 63 2d 34 2e 33 32 20 7b 0a 20 20 20   func-4.32 {.   
2250: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
2260: 20 72 6f 75 6e 64 28 31 32 33 34 35 36 37 38 39   round(123456789
2270: 30 31 32 33 2e 35 29 3b 7d 0a 20 20 7d 20 7b 31  0123.5);}.  } {1
2280: 32 33 34 35 36 37 38 39 30 31 32 34 2e 30 7d 0a  234567890124.0}.
2290: 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34    do_test func-4
22a0: 2e 33 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .33 {.    execsq
22b0: 6c 20 7b 53 45 4c 45 43 54 20 72 6f 75 6e 64 28  l {SELECT round(
22c0: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 2e 35  12345678901234.5
22d0: 29 3b 7d 0a 20 20 7d 20 7b 31 32 33 34 35 36 37  );}.  } {1234567
22e0: 38 39 30 31 32 33 35 2e 30 7d 0a 20 20 64 6f 5f  8901235.0}.  do_
22f0: 74 65 73 74 20 66 75 6e 63 2d 34 2e 33 34 20 7b  test func-4.34 {
2300: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45  .    execsql {SE
2310: 4c 45 43 54 20 72 6f 75 6e 64 28 31 32 33 34 35  LECT round(12345
2320: 36 37 38 39 30 31 32 33 2e 33 35 2c 31 29 3b 7d  67890123.35,1);}
2330: 0a 20 20 7d 20 7b 31 32 33 34 35 36 37 38 39 30  .  } {1234567890
2340: 31 32 33 2e 34 7d 0a 20 20 64 6f 5f 74 65 73 74  123.4}.  do_test
2350: 20 66 75 6e 63 2d 34 2e 33 35 20 7b 0a 20 20 20   func-4.35 {.   
2360: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
2370: 20 72 6f 75 6e 64 28 31 32 33 34 35 36 37 38 39   round(123456789
2380: 30 31 32 33 2e 34 34 35 2c 32 29 3b 7d 0a 20 20  0123.445,2);}.  
2390: 7d 20 7b 31 32 33 34 35 36 37 38 39 30 31 32 33  } {1234567890123
23a0: 2e 34 35 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  .45}.  do_test f
23b0: 75 6e 63 2d 34 2e 33 36 20 7b 0a 20 20 20 20 65  unc-4.36 {.    e
23c0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 72  xecsql {SELECT r
23d0: 6f 75 6e 64 28 39 39 39 39 39 39 39 39 39 39 39  ound(99999999999
23e0: 39 39 34 2e 35 29 3b 7d 0a 20 20 7d 20 7b 39 39  994.5);}.  } {99
23f0: 39 39 39 39 39 39 39 39 39 39 39 35 2e 30 7d 0a  999999999995.0}.
2400: 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34    do_test func-4
2410: 2e 33 37 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .37 {.    execsq
2420: 6c 20 7b 53 45 4c 45 43 54 20 72 6f 75 6e 64 28  l {SELECT round(
2430: 39 39 39 39 39 39 39 39 39 39 39 39 39 2e 35 35  9999999999999.55
2440: 2c 31 29 3b 7d 0a 20 20 7d 20 7b 39 39 39 39 39  ,1);}.  } {99999
2450: 39 39 39 39 39 39 39 39 2e 36 7d 0a 20 20 64 6f  99999999.6}.  do
2460: 5f 74 65 73 74 20 66 75 6e 63 2d 34 2e 33 38 20  _test func-4.38 
2470: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53  {.    execsql {S
2480: 45 4c 45 43 54 20 72 6f 75 6e 64 28 39 39 39 39  ELECT round(9999
2490: 39 39 39 39 39 39 39 39 39 2e 35 35 36 2c 32 29  999999999.556,2)
24a0: 3b 7d 0a 20 20 7d 20 7b 39 39 39 39 39 39 39 39  ;}.  } {99999999
24b0: 39 39 39 39 39 2e 35 36 7d 0a 7d 0a 0a 23 20 54  99999.56}.}..# T
24c0: 65 73 74 20 74 68 65 20 75 70 70 65 72 28 29 20  est the upper() 
24d0: 61 6e 64 20 6c 6f 77 65 72 28 29 20 66 75 6e 63  and lower() func
24e0: 74 69 6f 6e 73 0a 23 0a 64 6f 5f 74 65 73 74 20  tions.#.do_test 
24f0: 66 75 6e 63 2d 35 2e 31 20 7b 0a 20 20 65 78 65  func-5.1 {.  exe
2500: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 75 70 70  csql {SELECT upp
2510: 65 72 28 74 31 29 20 46 52 4f 4d 20 74 62 6c 31  er(t1) FROM tbl1
2520: 7d 0a 7d 20 7b 54 48 49 53 20 50 52 4f 47 52 41  }.} {THIS PROGRA
2530: 4d 20 49 53 20 46 52 45 45 20 53 4f 46 54 57 41  M IS FREE SOFTWA
2540: 52 45 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  RE}.do_test func
2550: 2d 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -5.2 {.  execsql
2560: 20 7b 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 75   {SELECT lower(u
2570: 70 70 65 72 28 74 31 29 29 20 46 52 4f 4d 20 74  pper(t1)) FROM t
2580: 62 6c 31 7d 0a 7d 20 7b 74 68 69 73 20 70 72 6f  bl1}.} {this pro
2590: 67 72 61 6d 20 69 73 20 66 72 65 65 20 73 6f 66  gram is free sof
25a0: 74 77 61 72 65 7d 0a 64 6f 5f 74 65 73 74 20 66  tware}.do_test f
25b0: 75 6e 63 2d 35 2e 33 20 7b 0a 20 20 65 78 65 63  unc-5.3 {.  exec
25c0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 75 70 70 65  sql {SELECT uppe
25d0: 72 28 61 29 2c 20 6c 6f 77 65 72 28 61 29 20 46  r(a), lower(a) F
25e0: 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20 31 20 7b  ROM t2}.} {1 1 {
25f0: 7d 20 7b 7d 20 33 34 35 20 33 34 35 20 7b 7d 20  } {} 345 345 {} 
2600: 7b 7d 20 36 37 38 39 30 20 36 37 38 39 30 7d 0a  {} 67890 67890}.
2610: 69 66 63 61 70 61 62 6c 65 20 21 69 63 75 20 7b  ifcapable !icu {
2620: 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .  do_test func-
2630: 35 2e 34 20 7b 0a 20 20 20 20 63 61 74 63 68 73  5.4 {.    catchs
2640: 71 6c 20 7b 53 45 4c 45 43 54 20 75 70 70 65 72  ql {SELECT upper
2650: 28 61 2c 35 29 20 46 52 4f 4d 20 74 32 7d 0a 20  (a,5) FROM t2}. 
2660: 20 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 6e 75 6d   } {1 {wrong num
2670: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2680: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 75 70 70   to function upp
2690: 65 72 28 29 7d 7d 0a 7d 0a 64 6f 5f 74 65 73 74  er()}}.}.do_test
26a0: 20 66 75 6e 63 2d 35 2e 35 20 7b 0a 20 20 63 61   func-5.5 {.  ca
26b0: 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 75  tchsql {SELECT u
26c0: 70 70 65 72 28 2a 29 20 46 52 4f 4d 20 74 32 7d  pper(*) FROM t2}
26d0: 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 6e 75 6d  .} {1 {wrong num
26e0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
26f0: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 75 70 70   to function upp
2700: 65 72 28 29 7d 7d 0a 0a 23 20 54 65 73 74 20 74  er()}}..# Test t
2710: 68 65 20 63 6f 61 6c 65 73 63 65 28 29 20 61 6e  he coalesce() an
2720: 64 20 6e 75 6c 6c 69 66 28 29 20 66 75 6e 63 74  d nullif() funct
2730: 69 6f 6e 73 0a 23 0a 64 6f 5f 74 65 73 74 20 66  ions.#.do_test f
2740: 75 6e 63 2d 36 2e 31 20 7b 0a 20 20 65 78 65 63  unc-6.1 {.  exec
2750: 73 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 61 6c  sql {SELECT coal
2760: 65 73 63 65 28 61 2c 27 78 79 7a 27 29 20 46 52  esce(a,'xyz') FR
2770: 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20 78 79 7a 20  OM t2}.} {1 xyz 
2780: 33 34 35 20 78 79 7a 20 36 37 38 39 30 7d 0a 64  345 xyz 67890}.d
2790: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 36 2e 32 20  o_test func-6.2 
27a0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
27b0: 45 43 54 20 63 6f 61 6c 65 73 63 65 28 75 70 70  ECT coalesce(upp
27c0: 65 72 28 61 29 2c 27 6e 69 6c 27 29 20 46 52 4f  er(a),'nil') FRO
27d0: 4d 20 74 32 7d 0a 7d 20 7b 31 20 6e 69 6c 20 33  M t2}.} {1 nil 3
27e0: 34 35 20 6e 69 6c 20 36 37 38 39 30 7d 0a 64 6f  45 nil 67890}.do
27f0: 5f 74 65 73 74 20 66 75 6e 63 2d 36 2e 33 20 7b  _test func-6.3 {
2800: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
2810: 43 54 20 63 6f 61 6c 65 73 63 65 28 6e 75 6c 6c  CT coalesce(null
2820: 69 66 28 31 2c 31 29 2c 27 6e 69 6c 27 29 7d 0a  if(1,1),'nil')}.
2830: 7d 20 7b 6e 69 6c 7d 0a 64 6f 5f 74 65 73 74 20  } {nil}.do_test 
2840: 66 75 6e 63 2d 36 2e 34 20 7b 0a 20 20 65 78 65  func-6.4 {.  exe
2850: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 61  csql {SELECT coa
2860: 6c 65 73 63 65 28 6e 75 6c 6c 69 66 28 31 2c 32  lesce(nullif(1,2
2870: 29 2c 27 6e 69 6c 27 29 7d 0a 7d 20 7b 31 7d 0a  ),'nil')}.} {1}.
2880: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 36 2e 35  do_test func-6.5
2890: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
28a0: 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28 6e 75  LECT coalesce(nu
28b0: 6c 6c 69 66 28 31 2c 4e 55 4c 4c 29 2c 27 6e 69  llif(1,NULL),'ni
28c0: 6c 27 29 7d 0a 7d 20 7b 31 7d 0a 0a 0a 23 20 54  l')}.} {1}...# T
28d0: 65 73 74 20 74 68 65 20 6c 61 73 74 5f 69 6e 73  est the last_ins
28e0: 65 72 74 5f 72 6f 77 69 64 28 29 20 66 75 6e 63  ert_rowid() func
28f0: 74 69 6f 6e 0a 23 0a 64 6f 5f 74 65 73 74 20 66  tion.#.do_test f
2900: 75 6e 63 2d 37 2e 31 20 7b 0a 20 20 65 78 65 63  unc-7.1 {.  exec
2910: 73 71 6c 20 7b 53 45 4c 45 43 54 20 6c 61 73 74  sql {SELECT last
2920: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 7d  _insert_rowid()}
2930: 0a 7d 20 5b 64 62 20 6c 61 73 74 5f 69 6e 73 65  .} [db last_inse
2940: 72 74 5f 72 6f 77 69 64 5d 0a 0a 23 20 54 65 73  rt_rowid]..# Tes
2950: 74 73 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ts for aggregate
2960: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 68   functions and h
2970: 6f 77 20 74 68 65 79 20 68 61 6e 64 6c 65 20 4e  ow they handle N
2980: 55 4c 4c 73 2e 0a 23 0a 69 66 63 61 70 61 62 6c  ULLs..#.ifcapabl
2990: 65 20 66 6c 6f 61 74 69 6e 67 70 6f 69 6e 74 20  e floatingpoint 
29a0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63  {.  do_test func
29b0: 2d 38 2e 31 20 7b 0a 20 20 20 20 69 66 63 61 70  -8.1 {.    ifcap
29c0: 61 62 6c 65 20 65 78 70 6c 61 69 6e 20 7b 0a 20  able explain {. 
29d0: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 45 58       execsql {EX
29e0: 50 4c 41 49 4e 20 53 45 4c 45 43 54 20 73 75 6d  PLAIN SELECT sum
29f0: 28 61 29 20 46 52 4f 4d 20 74 32 3b 7d 0a 20 20  (a) FROM t2;}.  
2a00: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
2a10: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 73  {.      SELECT s
2a20: 75 6d 28 61 29 2c 20 63 6f 75 6e 74 28 61 29 2c  um(a), count(a),
2a30: 20 72 6f 75 6e 64 28 61 76 67 28 61 29 2c 32 29   round(avg(a),2)
2a40: 2c 20 6d 69 6e 28 61 29 2c 20 6d 61 78 28 61 29  , min(a), max(a)
2a50: 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  , count(*) FROM 
2a60: 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 36  t2;.    }.  } {6
2a70: 38 32 33 36 20 33 20 32 32 37 34 35 2e 33 33 20  8236 3 22745.33 
2a80: 31 20 36 37 38 39 30 20 35 7d 0a 7d 0a 69 66 63  1 67890 5}.}.ifc
2a90: 61 70 61 62 6c 65 20 21 66 6c 6f 61 74 69 6e 67  apable !floating
2aa0: 70 6f 69 6e 74 20 7b 0a 20 20 64 6f 5f 74 65 73  point {.  do_tes
2ab0: 74 20 66 75 6e 63 2d 38 2e 31 20 7b 0a 20 20 20  t func-8.1 {.   
2ac0: 20 69 66 63 61 70 61 62 6c 65 20 65 78 70 6c 61   ifcapable expla
2ad0: 69 6e 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73  in {.      execs
2ae0: 71 6c 20 7b 45 58 50 4c 41 49 4e 20 53 45 4c 45  ql {EXPLAIN SELE
2af0: 43 54 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74  CT sum(a) FROM t
2b00: 32 3b 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 78  2;}.    }.    ex
2b10: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
2b20: 4c 45 43 54 20 73 75 6d 28 61 29 2c 20 63 6f 75  LECT sum(a), cou
2b30: 6e 74 28 61 29 2c 20 61 76 67 28 61 29 2c 20 6d  nt(a), avg(a), m
2b40: 69 6e 28 61 29 2c 20 6d 61 78 28 61 29 2c 20 63  in(a), max(a), c
2b50: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 3b  ount(*) FROM t2;
2b60: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 36 38 32 33  .    }.  } {6823
2b70: 36 20 33 20 32 32 37 34 35 2e 30 20 31 20 36 37  6 3 22745.0 1 67
2b80: 38 39 30 20 35 7d 0a 7d 0a 64 6f 5f 74 65 73 74  890 5}.}.do_test
2b90: 20 66 75 6e 63 2d 38 2e 32 20 7b 0a 20 20 65 78   func-8.2 {.  ex
2ba0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
2bb0: 43 54 20 6d 61 78 28 27 7a 2b 27 7c 7c 61 7c 7c  CT max('z+'||a||
2bc0: 27 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  'abcdefghijklmno
2bd0: 70 71 72 73 74 75 76 77 78 79 7a 41 42 43 44 45  pqrstuvwxyzABCDE
2be0: 46 47 48 49 4a 4b 4c 4d 4e 4f 50 27 29 20 46 52  FGHIJKLMNOP') FR
2bf0: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 7a 2b  OM t2;.  }.} {z+
2c00: 36 37 38 39 30 61 62 63 64 65 66 67 68 69 6a 6b  67890abcdefghijk
2c10: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41  lmnopqrstuvwxyzA
2c20: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 7d  BCDEFGHIJKLMNOP}
2c30: 0a 0a 69 66 63 61 70 61 62 6c 65 20 74 65 6d 70  ..ifcapable temp
2c40: 64 62 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66  db {.  do_test f
2c50: 75 6e 63 2d 38 2e 33 20 7b 0a 20 20 20 20 65 78  unc-8.3 {.    ex
2c60: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  ecsql {.      CR
2c70: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
2c80: 74 33 20 41 53 20 53 45 4c 45 43 54 20 61 20 46  t3 AS SELECT a F
2c90: 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
2ca0: 61 20 44 45 53 43 3b 0a 20 20 20 20 20 20 53 45  a DESC;.      SE
2cb0: 4c 45 43 54 20 6d 69 6e 28 27 7a 2b 27 7c 7c 61  LECT min('z+'||a
2cc0: 7c 7c 27 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  ||'abcdefghijklm
2cd0: 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41 42 43  nopqrstuvwxyzABC
2ce0: 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 27 29 20  DEFGHIJKLMNOP') 
2cf0: 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 7d 0a 20  FROM t3;.    }. 
2d00: 20 7d 20 7b 7a 2b 31 61 62 63 64 65 66 67 68 69   } {z+1abcdefghi
2d10: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
2d20: 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  zABCDEFGHIJKLMNO
2d30: 50 7d 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 64 6f  P}.} else {.  do
2d40: 5f 74 65 73 74 20 66 75 6e 63 2d 38 2e 33 20 7b  _test func-8.3 {
2d50: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
2d60: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
2d70: 45 20 74 33 20 41 53 20 53 45 4c 45 43 54 20 61  E t3 AS SELECT a
2d80: 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
2d90: 59 20 61 20 44 45 53 43 3b 0a 20 20 20 20 20 20  Y a DESC;.      
2da0: 53 45 4c 45 43 54 20 6d 69 6e 28 27 7a 2b 27 7c  SELECT min('z+'|
2db0: 7c 61 7c 7c 27 61 62 63 64 65 66 67 68 69 6a 6b  |a||'abcdefghijk
2dc0: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41  lmnopqrstuvwxyzA
2dd0: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 27  BCDEFGHIJKLMNOP'
2de0: 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 7d  ) FROM t3;.    }
2df0: 0a 20 20 7d 20 7b 7a 2b 31 61 62 63 64 65 66 67  .  } {z+1abcdefg
2e00: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
2e10: 78 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d  xyzABCDEFGHIJKLM
2e20: 4e 4f 50 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 66  NOP}.}.do_test f
2e30: 75 6e 63 2d 38 2e 34 20 7b 0a 20 20 65 78 65 63  unc-8.4 {.  exec
2e40: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
2e50: 20 6d 61 78 28 27 7a 2b 27 7c 7c 61 7c 7c 27 61   max('z+'||a||'a
2e60: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
2e70: 72 73 74 75 76 77 78 79 7a 41 42 43 44 45 46 47  rstuvwxyzABCDEFG
2e80: 48 49 4a 4b 4c 4d 4e 4f 50 27 29 20 46 52 4f 4d  HIJKLMNOP') FROM
2e90: 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 7a 2b 36 37   t3;.  }.} {z+67
2ea0: 38 39 30 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  890abcdefghijklm
2eb0: 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41 42 43  nopqrstuvwxyzABC
2ec0: 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 7d 0a 69  DEFGHIJKLMNOP}.i
2ed0: 66 63 61 70 61 62 6c 65 20 63 6f 6d 70 6f 75 6e  fcapable compoun
2ee0: 64 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75  d {.  do_test fu
2ef0: 6e 63 2d 38 2e 35 20 7b 0a 20 20 20 20 65 78 65  nc-8.5 {.    exe
2f00: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
2f10: 45 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d 20  ECT sum(x) FROM 
2f20: 28 53 45 4c 45 43 54 20 27 39 32 32 33 33 37 32  (SELECT '9223372
2f30: 30 33 36 27 20 7c 7c 20 27 38 35 34 37 37 35 38  036' || '8547758
2f40: 30 37 27 20 41 53 20 78 0a 20 20 20 20 20 20 20  07' AS x.       
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c     UNION ALL SEL
2f70: 45 43 54 20 2d 39 32 32 33 33 37 32 30 33 36 38  ECT -92233720368
2f80: 35 34 37 37 35 38 30 37 29 0a 20 20 20 20 7d 0a  54775807).    }.
2f90: 20 20 7d 20 7b 30 7d 0a 20 20 64 6f 5f 74 65 73    } {0}.  do_tes
2fa0: 74 20 66 75 6e 63 2d 38 2e 36 20 7b 0a 20 20 20  t func-8.6 {.   
2fb0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
2fc0: 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 73   SELECT typeof(s
2fd0: 75 6d 28 78 29 29 20 46 52 4f 4d 20 28 53 45 4c  um(x)) FROM (SEL
2fe0: 45 43 54 20 27 39 32 32 33 33 37 32 30 33 36 27  ECT '9223372036'
2ff0: 20 7c 7c 20 27 38 35 34 37 37 35 38 30 37 27 20   || '854775807' 
3000: 41 53 20 78 0a 20 20 20 20 20 20 20 20 20 20 20  AS x.           
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55                 U
3020: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
3030: 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
3040: 35 38 30 37 29 0a 20 20 20 20 7d 0a 20 20 7d 20  5807).    }.  } 
3050: 7b 69 6e 74 65 67 65 72 7d 0a 20 20 64 6f 5f 74  {integer}.  do_t
3060: 65 73 74 20 66 75 6e 63 2d 38 2e 37 20 7b 0a 20  est func-8.7 {. 
3070: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
3080: 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66     SELECT typeof
3090: 28 73 75 6d 28 78 29 29 20 46 52 4f 4d 20 28 53  (sum(x)) FROM (S
30a0: 45 4c 45 43 54 20 27 39 32 32 33 33 37 32 30 33  ELECT '922337203
30b0: 36 27 20 7c 7c 20 27 38 35 34 37 37 35 38 30 38  6' || '854775808
30c0: 27 20 41 53 20 78 0a 20 20 20 20 20 20 20 20 20  ' AS x.         
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
30f0: 54 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  T -9223372036854
3100: 37 37 35 38 30 37 29 0a 20 20 20 20 7d 0a 20 20  775807).    }.  
3110: 7d 20 7b 72 65 61 6c 7d 0a 69 66 63 61 70 61 62  } {real}.ifcapab
3120: 6c 65 20 66 6c 6f 61 74 69 6e 67 70 6f 69 6e 74  le floatingpoint
3130: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e   {.  do_test fun
3140: 63 2d 38 2e 38 20 7b 0a 20 20 20 20 65 78 65 63  c-8.8 {.    exec
3150: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
3160: 43 54 20 73 75 6d 28 78 29 3e 30 2e 30 20 46 52  CT sum(x)>0.0 FR
3170: 4f 4d 20 28 53 45 4c 45 43 54 20 27 39 32 32 33  OM (SELECT '9223
3180: 33 37 32 30 33 36 27 20 7c 7c 20 27 38 35 34 37  372036' || '8547
3190: 37 35 38 30 38 27 20 41 53 20 78 0a 20 20 20 20  75808' AS x.    
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b0: 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
31c0: 53 45 4c 45 43 54 20 2d 39 32 32 33 33 37 32 30  SELECT -92233720
31d0: 33 36 38 35 30 30 30 30 30 30 30 29 0a 20 20 20  36850000000).   
31e0: 20 7d 0a 20 20 7d 20 7b 31 7d 0a 7d 0a 69 66 63   }.  } {1}.}.ifc
31f0: 61 70 61 62 6c 65 20 21 66 6c 6f 61 74 69 6e 67  apable !floating
3200: 70 6f 69 6e 74 20 7b 0a 20 20 64 6f 5f 74 65 73  point {.  do_tes
3210: 74 20 66 75 6e 63 2d 38 2e 38 20 7b 0a 20 20 20  t func-8.8 {.   
3220: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
3230: 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 3e 30   SELECT sum(x)>0
3240: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 27 39   FROM (SELECT '9
3250: 32 32 33 33 37 32 30 33 36 27 20 7c 7c 20 27 38  223372036' || '8
3260: 35 34 37 37 35 38 30 38 27 20 41 53 20 78 0a 20  54775808' AS x. 
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
3290: 4c 4c 20 53 45 4c 45 43 54 20 2d 39 32 32 33 33  LL SELECT -92233
32a0: 37 32 30 33 36 38 35 30 30 30 30 30 30 30 29 0a  72036850000000).
32b0: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 7d 0a 7d 0a      }.  } {1}.}.
32c0: 7d 0a 0a 23 20 48 6f 77 20 64 6f 20 79 6f 75 20  }..# How do you 
32d0: 74 65 73 74 20 74 68 65 20 72 61 6e 64 6f 6d 28  test the random(
32e0: 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 61 20  ) function in a 
32f0: 6d 65 61 6e 69 6e 67 66 75 6c 2c 20 64 65 74 65  meaningful, dete
3300: 72 6d 69 6e 69 73 74 69 63 20 77 61 79 3f 0a 23  rministic way?.#
3310: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 39 2e  .do_test func-9.
3320: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
3330: 20 20 20 20 53 45 4c 45 43 54 20 72 61 6e 64 6f      SELECT rando
3340: 6d 28 29 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 3b  m() is not null;
3350: 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  .  }.} {1}.do_te
3360: 73 74 20 66 75 6e 63 2d 39 2e 32 20 7b 0a 20 20  st func-9.2 {.  
3370: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
3380: 4c 45 43 54 20 74 79 70 65 6f 66 28 72 61 6e 64  LECT typeof(rand
3390: 6f 6d 28 29 29 3b 0a 20 20 7d 0a 7d 20 7b 69 6e  om());.  }.} {in
33a0: 74 65 67 65 72 7d 0a 64 6f 5f 74 65 73 74 20 66  teger}.do_test f
33b0: 75 6e 63 2d 39 2e 33 20 7b 0a 20 20 65 78 65 63  unc-9.3 {.  exec
33c0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
33d0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 33 32 29 20   randomblob(32) 
33e0: 69 73 20 6e 6f 74 20 6e 75 6c 6c 3b 0a 20 20 7d  is not null;.  }
33f0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 66  .} {1}.do_test f
3400: 75 6e 63 2d 39 2e 34 20 7b 0a 20 20 65 78 65 63  unc-9.4 {.  exec
3410: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
3420: 20 74 79 70 65 6f 66 28 72 61 6e 64 6f 6d 62 6c   typeof(randombl
3430: 6f 62 28 33 32 29 29 3b 0a 20 20 7d 0a 7d 20 7b  ob(32));.  }.} {
3440: 62 6c 6f 62 7d 0a 64 6f 5f 74 65 73 74 20 66 75  blob}.do_test fu
3450: 6e 63 2d 39 2e 35 20 7b 0a 20 20 65 78 65 63 73  nc-9.5 {.  execs
3460: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
3470: 6c 65 6e 67 74 68 28 72 61 6e 64 6f 6d 62 6c 6f  length(randomblo
3480: 62 28 33 32 29 29 2c 20 6c 65 6e 67 74 68 28 72  b(32)), length(r
3490: 61 6e 64 6f 6d 62 6c 6f 62 28 2d 35 29 29 2c 0a  andomblob(-5)),.
34a0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e 67 74             lengt
34b0: 68 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  h(randomblob(200
34c0: 30 29 29 0a 20 20 7d 0a 7d 20 7b 33 32 20 31 20  0)).  }.} {32 1 
34d0: 32 30 30 30 7d 0a 0a 23 20 54 68 65 20 22 68 65  2000}..# The "he
34e0: 78 28 29 22 20 66 75 6e 63 74 69 6f 6e 20 77 61  x()" function wa
34f0: 73 20 61 64 64 65 64 20 69 6e 20 6f 72 64 65 72  s added in order
3500: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 72   to be able to r
3510: 65 6e 64 65 72 20 62 6c 6f 62 73 0a 23 20 67 65  ender blobs.# ge
3520: 6e 65 72 61 74 65 64 20 62 79 20 72 61 6e 64 6f  nerated by rando
3530: 6d 62 6c 6f 62 28 29 2e 20 20 53 6f 20 74 68 69  mblob().  So thi
3540: 73 20 73 65 65 6d 73 20 6c 69 6b 65 20 61 20 67  s seems like a g
3550: 6f 6f 64 20 70 6c 61 63 65 20 74 6f 20 74 65 73  ood place to tes
3560: 74 0a 23 20 68 65 78 28 29 2e 0a 23 0a 69 66 63  t.# hex()..#.ifc
3570: 61 70 61 62 6c 65 20 62 6c 6f 62 6c 69 74 20 7b  apable bloblit {
3580: 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .  do_test func-
3590: 39 2e 31 30 20 7b 0a 20 20 20 20 65 78 65 63 73  9.10 {.    execs
35a0: 71 6c 20 7b 53 45 4c 45 43 54 20 68 65 78 28 78  ql {SELECT hex(x
35b0: 27 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37  '001122334455667
35c0: 37 38 38 39 39 61 41 62 42 63 43 64 44 65 45 66  78899aAbBcCdDeEf
35d0: 46 27 29 7d 0a 20 20 7d 20 7b 30 30 31 31 32 32  F')}.  } {001122
35e0: 33 33 34 34 35 35 36 36 37 37 38 38 39 39 41 41  33445566778899AA
35f0: 42 42 43 43 44 44 45 45 46 46 7d 0a 7d 0a 73 65  BBCCDDEEFF}.}.se
3600: 74 20 65 6e 63 6f 64 69 6e 67 20 5b 64 62 20 6f  t encoding [db o
3610: 6e 65 20 7b 50 52 41 47 4d 41 20 65 6e 63 6f 64  ne {PRAGMA encod
3620: 69 6e 67 7d 5d 0a 69 66 20 7b 24 65 6e 63 6f 64  ing}].if {$encod
3630: 69 6e 67 3d 3d 22 55 54 46 2d 31 36 6c 65 22 7d  ing=="UTF-16le"}
3640: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e   {.  do_test fun
3650: 63 2d 39 2e 31 31 2d 75 74 66 31 36 6c 65 20 7b  c-9.11-utf16le {
3660: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45  .    execsql {SE
3670: 4c 45 43 54 20 68 65 78 28 72 65 70 6c 61 63 65  LECT hex(replace
3680: 28 27 61 62 63 64 65 66 67 27 2c 27 65 66 27 2c  ('abcdefg','ef',
3690: 27 31 32 27 29 29 7d 0a 20 20 7d 20 7b 36 31 30  '12'))}.  } {610
36a0: 30 36 32 30 30 36 33 30 30 36 34 30 30 33 31 30  0620063006400310
36b0: 30 33 32 30 30 36 37 30 30 7d 0a 20 20 64 6f 5f  032006700}.  do_
36c0: 74 65 73 74 20 66 75 6e 63 2d 39 2e 31 32 2d 75  test func-9.12-u
36d0: 74 66 31 36 6c 65 20 7b 0a 20 20 20 20 65 78 65  tf16le {.    exe
36e0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 68 65 78  csql {SELECT hex
36f0: 28 72 65 70 6c 61 63 65 28 27 61 62 63 64 65 66  (replace('abcdef
3700: 67 27 2c 27 27 2c 27 31 32 27 29 29 7d 0a 20 20  g','','12'))}.  
3710: 7d 20 7b 36 31 30 30 36 32 30 30 36 33 30 30 36  } {6100620063006
3720: 34 30 30 36 35 30 30 36 36 30 30 36 37 30 30 7d  400650066006700}
3730: 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .  do_test func-
3740: 39 2e 31 33 2d 75 74 66 31 36 6c 65 20 7b 0a 20  9.13-utf16le {. 
3750: 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45     execsql {SELE
3760: 43 54 20 68 65 78 28 72 65 70 6c 61 63 65 28 27  CT hex(replace('
3770: 61 61 62 63 64 65 66 67 27 2c 27 61 27 2c 27 61  aabcdefg','a','a
3780: 61 61 27 29 29 7d 0a 20 20 7d 20 7b 36 31 30 30  aa'))}.  } {6100
3790: 36 31 30 30 36 31 30 30 36 31 30 30 36 31 30 30  6100610061006100
37a0: 36 31 30 30 36 32 30 30 36 33 30 30 36 34 30 30  6100620063006400
37b0: 36 35 30 30 36 36 30 30 36 37 30 30 7d 0a 7d 20  650066006700}.} 
37c0: 65 6c 73 65 69 66 20 7b 24 65 6e 63 6f 64 69 6e  elseif {$encodin
37d0: 67 3d 3d 22 55 54 46 2d 38 22 7d 20 7b 0a 20 20  g=="UTF-8"} {.  
37e0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 39 2e 31  do_test func-9.1
37f0: 31 2d 75 74 66 38 20 7b 0a 20 20 20 20 65 78 65  1-utf8 {.    exe
3800: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 68 65 78  csql {SELECT hex
3810: 28 72 65 70 6c 61 63 65 28 27 61 62 63 64 65 66  (replace('abcdef
3820: 67 27 2c 27 65 66 27 2c 27 31 32 27 29 29 7d 0a  g','ef','12'))}.
3830: 20 20 7d 20 7b 36 31 36 32 36 33 36 34 33 31 33    } {61626364313
3840: 32 36 37 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  267}.  do_test f
3850: 75 6e 63 2d 39 2e 31 32 2d 75 74 66 38 20 7b 0a  unc-9.12-utf8 {.
3860: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c      execsql {SEL
3870: 45 43 54 20 68 65 78 28 72 65 70 6c 61 63 65 28  ECT hex(replace(
3880: 27 61 62 63 64 65 66 67 27 2c 27 27 2c 27 31 32  'abcdefg','','12
3890: 27 29 29 7d 0a 20 20 7d 20 7b 36 31 36 32 36 33  '))}.  } {616263
38a0: 36 34 36 35 36 36 36 37 7d 0a 20 20 64 6f 5f 74  64656667}.  do_t
38b0: 65 73 74 20 66 75 6e 63 2d 39 2e 31 33 2d 75 74  est func-9.13-ut
38c0: 66 38 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  f8 {.    execsql
38d0: 20 7b 53 45 4c 45 43 54 20 68 65 78 28 72 65 70   {SELECT hex(rep
38e0: 6c 61 63 65 28 27 61 61 62 63 64 65 66 67 27 2c  lace('aabcdefg',
38f0: 27 61 27 2c 27 61 61 61 27 29 29 7d 0a 20 20 7d  'a','aaa'))}.  }
3900: 20 7b 36 31 36 31 36 31 36 31 36 31 36 31 36 32   {61616161616162
3910: 36 33 36 34 36 35 36 36 36 37 7d 0a 7d 0a 64 6f  6364656667}.}.do
3920: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 66 75  _execsql_test fu
3930: 6e 63 2d 39 2e 31 34 20 7b 0a 20 20 57 49 54 48  nc-9.14 {.  WITH
3940: 20 52 45 43 55 52 53 49 56 45 20 63 28 78 29 20   RECURSIVE c(x) 
3950: 41 53 20 28 0a 20 20 20 20 20 56 41 4c 55 45 53  AS (.     VALUES
3960: 28 31 29 0a 20 20 20 20 20 55 4e 49 4f 4e 20 41  (1).     UNION A
3970: 4c 4c 0a 20 20 20 20 20 53 45 4c 45 43 54 20 78  LL.     SELECT x
3980: 2b 31 20 46 52 4f 4d 20 63 20 57 48 45 52 45 20  +1 FROM c WHERE 
3990: 78 3c 31 30 34 30 0a 20 20 29 0a 20 20 53 45 4c  x<1040.  ).  SEL
39a0: 45 43 54 20 0a 20 20 20 20 63 6f 75 6e 74 28 2a  ECT .    count(*
39b0: 29 2c 0a 20 20 20 20 73 75 6d 28 6c 65 6e 67 74  ),.    sum(lengt
39c0: 68 28 72 65 70 6c 61 63 65 28 70 72 69 6e 74 66  h(replace(printf
39d0: 28 27 61 62 63 25 2e 2a 63 78 79 7a 27 2c 78 2c  ('abc%.*cxyz',x,
39e0: 27 6d 27 29 2c 27 6d 27 2c 27 6e 6e 6e 6e 27 29  'm'),'m','nnnn')
39f0: 29 2d 28 36 2b 78 2a 34 29 29 0a 20 20 46 52 4f  )-(6+x*4)).  FRO
3a00: 4d 20 63 3b 0a 7d 20 7b 31 30 34 30 20 30 7d 0a  M c;.} {1040 0}.
3a10: 20 20 0a 23 20 55 73 65 20 74 68 65 20 22 73 71    .# Use the "sq
3a20: 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65  lite_register_te
3a30: 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20 54 43 4c  st_function" TCL
3a40: 20 63 6f 6d 6d 61 6e 64 20 77 68 69 63 68 20 69   command which i
3a50: 73 20 70 61 72 74 20 6f 66 0a 23 20 74 68 65 20  s part of.# the 
3a60: 74 65 78 74 20 66 69 78 74 75 72 65 20 69 6e 20  text fixture in 
3a70: 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 20  order to verify 
3a80: 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
3a90: 6e 20 6f 66 20 73 6f 6d 65 20 6f 66 0a 23 20 74  n of some of.# t
3aa0: 68 65 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  he user-defined 
3ab0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 41 50 49  SQL function API
3ac0: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 75  s that are not u
3ad0: 73 65 64 20 62 79 20 74 68 65 20 62 75 69 6c 74  sed by the built
3ae0: 2d 69 6e 0a 23 20 66 75 6e 63 74 69 6f 6e 73 2e  -in.# functions.
3af0: 0a 23 0a 73 65 74 20 3a 3a 44 42 20 5b 73 71 6c  .#.set ::DB [sql
3b00: 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f  ite3_connection_
3b10: 70 6f 69 6e 74 65 72 20 64 62 5d 0a 73 71 6c 69  pointer db].sqli
3b20: 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74  te_register_test
3b30: 5f 66 75 6e 63 74 69 6f 6e 20 24 3a 3a 44 42 20  _function $::DB 
3b40: 74 65 73 74 66 75 6e 63 0a 64 6f 5f 74 65 73 74  testfunc.do_test
3b50: 20 66 75 6e 63 2d 31 30 2e 31 20 7b 0a 20 20 63   func-10.1 {.  c
3b60: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45  atchsql {.    SE
3b70: 4c 45 43 54 20 74 65 73 74 66 75 6e 63 28 4e 55  LECT testfunc(NU
3b80: 4c 4c 2c 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 7d 20  LL,NULL);.  }.} 
3b90: 7b 31 20 7b 66 69 72 73 74 20 61 72 67 75 6d 65  {1 {first argume
3ba0: 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65  nt should be one
3bb0: 20 6f 66 3a 20 69 6e 74 20 69 6e 74 36 34 20 73   of: int int64 s
3bc0: 74 72 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c  tring double nul
3bd0: 6c 20 76 61 6c 75 65 7d 7d 0a 64 6f 5f 74 65 73  l value}}.do_tes
3be0: 74 20 66 75 6e 63 2d 31 30 2e 32 20 7b 0a 20 20  t func-10.2 {.  
3bf0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
3c00: 4c 45 43 54 20 74 65 73 74 66 75 6e 63 28 0a 20  LECT testfunc(. 
3c10: 20 20 20 20 27 73 74 72 69 6e 67 27 2c 20 27 61      'string', 'a
3c20: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
3c30: 72 73 74 75 76 77 78 79 7a 41 42 43 44 45 46 47  rstuvwxyzABCDEFG
3c40: 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
3c50: 58 59 5a 27 2c 0a 20 20 20 20 20 27 69 6e 74 27  XYZ',.     'int'
3c60: 2c 20 31 32 33 34 0a 20 20 20 20 29 3b 0a 20 20  , 1234.    );.  
3c70: 7d 0a 7d 20 7b 31 32 33 34 7d 0a 64 6f 5f 74 65  }.} {1234}.do_te
3c80: 73 74 20 66 75 6e 63 2d 31 30 2e 33 20 7b 0a 20  st func-10.3 {. 
3c90: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3ca0: 45 4c 45 43 54 20 74 65 73 74 66 75 6e 63 28 0a  ELECT testfunc(.
3cb0: 20 20 20 20 20 27 73 74 72 69 6e 67 27 2c 20 27       'string', '
3cc0: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
3cd0: 71 72 73 74 75 76 77 78 79 7a 41 42 43 44 45 46  qrstuvwxyzABCDEF
3ce0: 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
3cf0: 57 58 59 5a 27 2c 0a 20 20 20 20 20 27 73 74 72  WXYZ',.     'str
3d00: 69 6e 67 27 2c 20 4e 55 4c 4c 0a 20 20 20 20 29  ing', NULL.    )
3d10: 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 7d 0a 0a 69 66  ;.  }.} {{}}..if
3d20: 63 61 70 61 62 6c 65 20 66 6c 6f 61 74 69 6e 67  capable floating
3d30: 70 6f 69 6e 74 20 7b 0a 20 20 64 6f 5f 74 65 73  point {.  do_tes
3d40: 74 20 66 75 6e 63 2d 31 30 2e 34 20 7b 0a 20 20  t func-10.4 {.  
3d50: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3d60: 20 20 53 45 4c 45 43 54 20 74 65 73 74 66 75 6e    SELECT testfun
3d70: 63 28 0a 20 20 20 20 20 20 20 27 73 74 72 69 6e  c(.       'strin
3d80: 67 27 2c 20 27 61 62 63 64 65 66 67 68 69 6a 6b  g', 'abcdefghijk
3d90: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41  lmnopqrstuvwxyzA
3da0: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
3db0: 52 53 54 55 56 57 58 59 5a 27 2c 0a 20 20 20 20  RSTUVWXYZ',.    
3dc0: 20 20 20 27 64 6f 75 62 6c 65 27 2c 20 31 2e 32     'double', 1.2
3dd0: 33 34 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  34.      );.    
3de0: 7d 0a 20 20 7d 20 7b 31 2e 32 33 34 7d 0a 20 20  }.  } {1.234}.  
3df0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 30 2e  do_test func-10.
3e00: 35 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  5 {.    execsql 
3e10: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 74  {.      SELECT t
3e20: 65 73 74 66 75 6e 63 28 0a 20 20 20 20 20 20 20  estfunc(.       
3e30: 27 73 74 72 69 6e 67 27 2c 20 27 61 62 63 64 65  'string', 'abcde
3e40: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
3e50: 76 77 78 79 7a 41 42 43 44 45 46 47 48 49 4a 4b  vwxyzABCDEFGHIJK
3e60: 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 27  LMNOPQRSTUVWXYZ'
3e70: 2c 0a 20 20 20 20 20 20 20 27 69 6e 74 27 2c 20  ,.       'int', 
3e80: 31 32 33 34 2c 0a 20 20 20 20 20 20 20 27 73 74  1234,.       'st
3e90: 72 69 6e 67 27 2c 20 27 61 62 63 64 65 66 67 68  ring', 'abcdefgh
3ea0: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
3eb0: 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e  yzABCDEFGHIJKLMN
3ec0: 4f 50 51 52 53 54 55 56 57 58 59 5a 27 2c 0a 20  OPQRSTUVWXYZ',. 
3ed0: 20 20 20 20 20 20 27 73 74 72 69 6e 67 27 2c 20        'string', 
3ee0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 27 73 74  NULL,.       'st
3ef0: 72 69 6e 67 27 2c 20 27 61 62 63 64 65 66 67 68  ring', 'abcdefgh
3f00: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
3f10: 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e  yzABCDEFGHIJKLMN
3f20: 4f 50 51 52 53 54 55 56 57 58 59 5a 27 2c 0a 20  OPQRSTUVWXYZ',. 
3f30: 20 20 20 20 20 20 27 64 6f 75 62 6c 65 27 2c 20        'double', 
3f40: 31 2e 32 33 34 2c 0a 20 20 20 20 20 20 20 27 73  1.234,.       's
3f50: 74 72 69 6e 67 27 2c 20 27 61 62 63 64 65 66 67  tring', 'abcdefg
3f60: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
3f70: 78 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d  xyzABCDEFGHIJKLM
3f80: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 27 2c 0a  NOPQRSTUVWXYZ',.
3f90: 20 20 20 20 20 20 20 27 69 6e 74 27 2c 20 31 32         'int', 12
3fa0: 33 34 2c 0a 20 20 20 20 20 20 20 27 73 74 72 69  34,.       'stri
3fb0: 6e 67 27 2c 20 27 61 62 63 64 65 66 67 68 69 6a  ng', 'abcdefghij
3fc0: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
3fd0: 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
3fe0: 51 52 53 54 55 56 57 58 59 5a 27 2c 0a 20 20 20  QRSTUVWXYZ',.   
3ff0: 20 20 20 20 27 73 74 72 69 6e 67 27 2c 20 4e 55      'string', NU
4000: 4c 4c 2c 0a 20 20 20 20 20 20 20 27 73 74 72 69  LL,.       'stri
4010: 6e 67 27 2c 20 27 61 62 63 64 65 66 67 68 69 6a  ng', 'abcdefghij
4020: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
4030: 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
4040: 51 52 53 54 55 56 57 58 59 5a 27 2c 0a 20 20 20  QRSTUVWXYZ',.   
4050: 20 20 20 20 27 64 6f 75 62 6c 65 27 2c 20 31 2e      'double', 1.
4060: 32 33 34 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  234.      );.   
4070: 20 7d 0a 20 20 7d 20 7b 31 2e 32 33 34 7d 0a 7d   }.  } {1.234}.}
4080: 0a 0a 23 20 54 65 73 74 20 74 68 65 20 62 75 69  ..# Test the bui
4090: 6c 74 2d 69 6e 20 73 71 6c 69 74 65 5f 76 65 72  lt-in sqlite_ver
40a0: 73 69 6f 6e 28 2a 29 20 53 51 4c 20 66 75 6e 63  sion(*) SQL func
40b0: 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  tion..#.do_test 
40c0: 66 75 6e 63 2d 31 31 2e 31 20 7b 0a 20 20 65 78  func-11.1 {.  ex
40d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
40e0: 43 54 20 73 71 6c 69 74 65 5f 76 65 72 73 69 6f  CT sqlite_versio
40f0: 6e 28 2a 29 3b 0a 20 20 7d 0a 7d 20 5b 73 71 6c  n(*);.  }.} [sql
4100: 69 74 65 33 20 2d 76 65 72 73 69 6f 6e 5d 0a 0a  ite3 -version]..
4110: 23 20 54 65 73 74 20 74 68 61 74 20 64 65 73 74  # Test that dest
4120: 72 75 63 74 6f 72 73 20 70 61 73 73 65 64 20 74  ructors passed t
4130: 6f 20 73 71 6c 69 74 65 33 20 62 79 20 63 61 6c  o sqlite3 by cal
4140: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65  ls to sqlite3_re
4150: 73 75 6c 74 5f 74 65 78 74 28 29 0a 23 20 65 74  sult_text().# et
4160: 63 2e 20 61 72 65 20 63 61 6c 6c 65 64 2e 20 54  c. are called. T
4170: 68 65 73 65 20 74 65 73 74 73 20 75 73 65 20 74  hese tests use t
4180: 77 6f 20 73 70 65 63 69 61 6c 20 75 73 65 72 2d  wo special user-
4190: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
41a0: 73 0a 23 20 28 69 6d 70 6c 65 6d 65 6e 74 65 64  s.# (implemented
41b0: 20 69 6e 20 66 75 6e 63 2e 63 29 20 6f 6e 6c 79   in func.c) only
41c0: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 65   available in te
41d0: 73 74 20 62 75 69 6c 64 73 2e 20 0a 23 0a 23 20  st builds. .#.# 
41e0: 46 75 6e 63 74 69 6f 6e 20 74 65 73 74 5f 64 65  Function test_de
41f0: 73 74 72 75 63 74 6f 72 28 29 20 74 61 6b 65 73  structor() takes
4200: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 20 61 6e   one argument an
4210: 64 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79  d returns a copy
4220: 20 6f 66 20 74 68 65 0a 23 20 74 65 78 74 20 66   of the.# text f
4230: 6f 72 6d 20 6f 66 20 74 68 61 74 20 61 72 67 75  orm of that argu
4240: 6d 65 6e 74 2e 20 41 20 64 65 73 74 72 75 63 74  ment. A destruct
4250: 6f 72 20 69 73 20 61 73 73 6f 63 69 61 74 65 64  or is associated
4260: 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
4270: 0a 23 20 76 61 6c 75 65 2e 20 46 75 6e 63 74 69  .# value. Functi
4280: 6f 6e 20 74 65 73 74 5f 64 65 73 74 72 75 63 74  on test_destruct
4290: 6f 72 5f 63 6f 75 6e 74 28 29 20 72 65 74 75 72  or_count() retur
42a0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
42b0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 23 20 64   outstanding.# d
42c0: 65 73 74 72 75 63 74 6f 72 20 63 61 6c 6c 73 20  estructor calls 
42d0: 66 6f 72 20 76 61 6c 75 65 73 20 72 65 74 75 72  for values retur
42e0: 6e 65 64 20 62 79 20 74 65 73 74 5f 64 65 73 74  ned by test_dest
42f0: 72 75 63 74 6f 72 28 29 2e 0a 23 0a 69 66 20 7b  ructor()..#.if {
4300: 5b 64 62 20 65 76 61 6c 20 7b 50 52 41 47 4d 41  [db eval {PRAGMA
4310: 20 65 6e 63 6f 64 69 6e 67 7d 5d 3d 3d 22 55 54   encoding}]=="UT
4320: 46 2d 38 22 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  F-8"} {.  do_tes
4330: 74 20 66 75 6e 63 2d 31 32 2e 31 2d 75 74 66 38  t func-12.1-utf8
4340: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
4350: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 74 65  .      SELECT te
4360: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 28 27 68  st_destructor('h
4370: 65 6c 6c 6f 20 77 6f 72 6c 64 27 29 2c 20 74 65  ello world'), te
4380: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  st_destructor_co
4390: 75 6e 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  unt();.    }.  }
43a0: 20 7b 7b 68 65 6c 6c 6f 20 77 6f 72 6c 64 7d 20   {{hello world} 
43b0: 31 7d 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  1}.} else {.    
43c0: 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66 31 36  ifcapable {utf16
43d0: 7d 20 7b 0a 20 20 20 20 20 20 64 6f 5f 74 65 73  } {.      do_tes
43e0: 74 20 66 75 6e 63 2d 31 32 2e 31 2d 75 74 66 31  t func-12.1-utf1
43f0: 36 20 7b 0a 20 20 20 20 20 20 20 20 65 78 65 63  6 {.        exec
4400: 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 20 20  sql {.          
4410: 53 45 4c 45 43 54 20 74 65 73 74 5f 64 65 73 74  SELECT test_dest
4420: 72 75 63 74 6f 72 31 36 28 27 68 65 6c 6c 6f 20  ructor16('hello 
4430: 77 6f 72 6c 64 27 29 2c 20 74 65 73 74 5f 64 65  world'), test_de
4440: 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 28 29  structor_count()
4450: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4460: 20 20 7d 20 7b 7b 68 65 6c 6c 6f 20 77 6f 72 6c    } {{hello worl
4470: 64 7d 20 31 7d 0a 20 20 20 20 7d 0a 7d 0a 64 6f  d} 1}.    }.}.do
4480: 5f 74 65 73 74 20 66 75 6e 63 2d 31 32 2e 32 20  _test func-12.2 
4490: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
44a0: 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f 64 65    SELECT test_de
44b0: 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 28 29  structor_count()
44c0: 3b 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74  ;.  }.} {0}.do_t
44d0: 65 73 74 20 66 75 6e 63 2d 31 32 2e 33 20 7b 0a  est func-12.3 {.
44e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
44f0: 53 45 4c 45 43 54 20 74 65 73 74 5f 64 65 73 74  SELECT test_dest
4500: 72 75 63 74 6f 72 28 27 68 65 6c 6c 6f 27 29 7c  ructor('hello')|
4510: 7c 27 20 77 6f 72 6c 64 27 0a 20 20 7d 0a 7d 20  |' world'.  }.} 
4520: 7b 7b 68 65 6c 6c 6f 20 77 6f 72 6c 64 7d 7d 0a  {{hello world}}.
4530: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 32 2e  do_test func-12.
4540: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
4550: 20 20 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f      SELECT test_
4560: 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74  destructor_count
4570: 28 29 3b 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 64 6f  ();.  }.} {0}.do
4580: 5f 74 65 73 74 20 66 75 6e 63 2d 31 32 2e 35 20  _test func-12.5 
4590: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
45a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
45b0: 34 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  4(x);.    INSERT
45c0: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
45d0: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 28  test_destructor(
45e0: 27 68 65 6c 6c 6f 27 29 29 3b 0a 20 20 20 20 49  'hello'));.    I
45f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
4600: 4c 55 45 53 28 74 65 73 74 5f 64 65 73 74 72 75  LUES(test_destru
4610: 63 74 6f 72 28 27 77 6f 72 6c 64 27 29 29 3b 0a  ctor('world'));.
4620: 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 74      SELECT min(t
4630: 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 28 78  est_destructor(x
4640: 29 29 2c 20 6d 61 78 28 74 65 73 74 5f 64 65 73  )), max(test_des
4650: 74 72 75 63 74 6f 72 28 78 29 29 20 46 52 4f 4d  tructor(x)) FROM
4660: 20 74 34 3b 0a 20 20 7d 0a 7d 20 7b 68 65 6c 6c   t4;.  }.} {hell
4670: 6f 20 77 6f 72 6c 64 7d 0a 64 6f 5f 74 65 73 74  o world}.do_test
4680: 20 66 75 6e 63 2d 31 32 2e 36 20 7b 0a 20 20 65   func-12.6 {.  e
4690: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
46a0: 45 43 54 20 74 65 73 74 5f 64 65 73 74 72 75 63  ECT test_destruc
46b0: 74 6f 72 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 7d  tor_count();.  }
46c0: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 66  .} {0}.do_test f
46d0: 75 6e 63 2d 31 32 2e 37 20 7b 0a 20 20 65 78 65  unc-12.7 {.  exe
46e0: 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20  csql {.    DROP 
46f0: 54 41 42 4c 45 20 74 34 3b 0a 20 20 7d 0a 7d 20  TABLE t4;.  }.} 
4700: 7b 7d 0a 0a 0a 23 20 54 65 73 74 20 74 68 61 74  {}...# Test that
4710: 20 74 68 65 20 61 75 78 64 61 74 61 20 41 50 49   the auxdata API
4720: 20 66 6f 72 20 73 63 61 6c 61 72 20 66 75 6e 63   for scalar func
4730: 74 69 6f 6e 73 20 77 6f 72 6b 73 2e 20 54 68 69  tions works. Thi
4740: 73 20 74 65 73 74 20 75 73 65 73 0a 23 20 61 20  s test uses.# a 
4750: 73 70 65 63 69 61 6c 20 75 73 65 72 2d 64 65 66  special user-def
4760: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  ined function on
4770: 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ly available in 
4780: 74 65 73 74 20 62 75 69 6c 64 73 2c 0a 23 20 74  test builds,.# t
4790: 65 73 74 5f 61 75 78 64 61 74 61 28 29 2e 20 46  est_auxdata(). F
47a0: 75 6e 63 74 69 6f 6e 20 74 65 73 74 5f 61 75 78  unction test_aux
47b0: 64 61 74 61 28 29 20 74 61 6b 65 73 20 61 6e 79  data() takes any
47c0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
47d0: 65 6e 74 73 2e 0a 64 6f 5f 74 65 73 74 20 66 75  ents..do_test fu
47e0: 6e 63 2d 31 33 2e 31 20 7b 0a 20 20 65 78 65 63  nc-13.1 {.  exec
47f0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
4800: 20 74 65 73 74 5f 61 75 78 64 61 74 61 28 27 68   test_auxdata('h
4810: 65 6c 6c 6f 20 77 6f 72 6c 64 27 29 3b 0a 20 20  ello world');.  
4820: 7d 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74  }.} {0}..do_test
4830: 20 66 75 6e 63 2d 31 33 2e 32 20 7b 0a 20 20 65   func-13.2 {.  e
4840: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
4850: 41 54 45 20 54 41 42 4c 45 20 74 34 28 61 2c 20  ATE TABLE t4(a, 
4860: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
4870: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27 61  NTO t4 VALUES('a
4880: 62 63 27 2c 20 27 64 65 66 27 29 3b 0a 20 20 20  bc', 'def');.   
4890: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
48a0: 56 41 4c 55 45 53 28 27 67 68 69 27 2c 20 27 6a  VALUES('ghi', 'j
48b0: 6b 6c 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  kl');.  }.} {}.d
48c0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 33 2e 33  o_test func-13.3
48d0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
48e0: 20 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f 61     SELECT test_a
48f0: 75 78 64 61 74 61 28 27 68 65 6c 6c 6f 20 77 6f  uxdata('hello wo
4900: 72 6c 64 27 29 20 46 52 4f 4d 20 74 34 3b 0a 20  rld') FROM t4;. 
4910: 20 7d 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65   }.} {0 1}.do_te
4920: 73 74 20 66 75 6e 63 2d 31 33 2e 34 20 7b 0a 20  st func-13.4 {. 
4930: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
4940: 45 4c 45 43 54 20 74 65 73 74 5f 61 75 78 64 61  ELECT test_auxda
4950: 74 61 28 27 68 65 6c 6c 6f 20 77 6f 72 6c 64 27  ta('hello world'
4960: 2c 20 31 32 33 29 20 46 52 4f 4d 20 74 34 3b 0a  , 123) FROM t4;.
4970: 20 20 7d 0a 7d 20 7b 7b 30 20 30 7d 20 7b 31 20    }.} {{0 0} {1 
4980: 31 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  1}}.do_test func
4990: 2d 31 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  -13.5 {.  execsq
49a0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74  l {.    SELECT t
49b0: 65 73 74 5f 61 75 78 64 61 74 61 28 27 68 65 6c  est_auxdata('hel
49c0: 6c 6f 20 77 6f 72 6c 64 27 2c 20 61 29 20 46 52  lo world', a) FR
49d0: 4f 4d 20 74 34 3b 0a 20 20 7d 0a 7d 20 7b 7b 30  OM t4;.  }.} {{0
49e0: 20 30 7d 20 7b 31 20 30 7d 7d 0a 64 6f 5f 74 65   0} {1 0}}.do_te
49f0: 73 74 20 66 75 6e 63 2d 31 33 2e 36 20 7b 0a 20  st func-13.6 {. 
4a00: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
4a10: 45 4c 45 43 54 20 74 65 73 74 5f 61 75 78 64 61  ELECT test_auxda
4a20: 74 61 28 27 68 65 6c 6c 6f 27 7c 7c 27 77 6f 72  ta('hello'||'wor
4a30: 6c 64 27 2c 20 61 29 20 46 52 4f 4d 20 74 34 3b  ld', a) FROM t4;
4a40: 0a 20 20 7d 0a 7d 20 7b 7b 30 20 30 7d 20 7b 31  .  }.} {{0 0} {1
4a50: 20 30 7d 7d 0a 0a 23 20 54 65 73 74 20 74 68 61   0}}..# Test tha
4a60: 74 20 61 75 78 69 6c 61 72 79 20 64 61 74 61 20  t auxilary data 
4a70: 69 73 20 70 72 65 73 65 72 76 65 64 20 62 65 74  is preserved bet
4a80: 77 65 65 6e 20 63 61 6c 6c 73 20 66 6f 72 20 53  ween calls for S
4a90: 51 4c 20 76 61 72 69 61 62 6c 65 73 2e 0a 64 6f  QL variables..do
4aa0: 5f 74 65 73 74 20 66 75 6e 63 2d 31 33 2e 37 20  _test func-13.7 
4ab0: 7b 0a 20 20 73 65 74 20 44 42 20 5b 73 71 6c 69  {.  set DB [sqli
4ac0: 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70  te3_connection_p
4ad0: 6f 69 6e 74 65 72 20 64 62 5d 0a 20 20 73 65 74  ointer db].  set
4ae0: 20 73 71 6c 20 22 53 45 4c 45 43 54 20 74 65 73   sql "SELECT tes
4af0: 74 5f 61 75 78 64 61 74 61 28 20 3f 20 2c 20 61  t_auxdata( ? , a
4b00: 20 29 20 46 52 4f 4d 20 74 34 3b 22 0a 20 20 73   ) FROM t4;".  s
4b10: 65 74 20 53 54 4d 54 20 5b 73 71 6c 69 74 65 33  et STMT [sqlite3
4b20: 5f 70 72 65 70 61 72 65 20 24 44 42 20 24 73 71  _prepare $DB $sq
4b30: 6c 20 2d 31 20 54 41 49 4c 5d 0a 20 20 73 71 6c  l -1 TAIL].  sql
4b40: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 24  ite3_bind_text $
4b50: 53 54 4d 54 20 31 20 68 65 6c 6c 6f 5c 30 30 30  STMT 1 hello\000
4b60: 20 2d 31 0a 20 20 73 65 74 20 72 65 73 20 5b 6c   -1.  set res [l
4b70: 69 73 74 5d 0a 20 20 77 68 69 6c 65 20 7b 20 22  ist].  while { "
4b80: 53 51 4c 49 54 45 5f 52 4f 57 22 3d 3d 5b 73 71  SQLITE_ROW"==[sq
4b90: 6c 69 74 65 33 5f 73 74 65 70 20 24 53 54 4d 54  lite3_step $STMT
4ba0: 5d 20 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  ] } {.    lappen
4bb0: 64 20 72 65 73 20 5b 73 71 6c 69 74 65 33 5f 63  d res [sqlite3_c
4bc0: 6f 6c 75 6d 6e 5f 74 65 78 74 20 24 53 54 4d 54  olumn_text $STMT
4bd0: 20 30 5d 0a 20 20 7d 0a 20 20 6c 61 70 70 65 6e   0].  }.  lappen
4be0: 64 20 72 65 73 20 5b 73 71 6c 69 74 65 33 5f 66  d res [sqlite3_f
4bf0: 69 6e 61 6c 69 7a 65 20 24 53 54 4d 54 5d 0a 7d  inalize $STMT].}
4c00: 20 7b 7b 30 20 30 7d 20 7b 31 20 30 7d 20 53 51   {{0 0} {1 0} SQ
4c10: 4c 49 54 45 5f 4f 4b 7d 0a 0a 23 20 54 65 73 74  LITE_OK}..# Test
4c20: 20 74 68 61 74 20 61 75 78 69 6c 69 61 72 79 20   that auxiliary 
4c30: 64 61 74 61 20 69 73 20 64 69 73 63 61 72 64 65  data is discarde
4c40: 64 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65  d when a stateme
4c50: 6e 74 20 69 73 20 72 65 73 65 74 2e 0a 64 6f 5f  nt is reset..do_
4c60: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 33 2e  execsql_test 13.
4c70: 38 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 74  8.1 {.  SELECT t
4c80: 65 73 74 5f 61 75 78 64 61 74 61 28 27 63 6f 6e  est_auxdata('con
4c90: 73 74 61 6e 74 27 29 20 46 52 4f 4d 20 74 34 3b  stant') FROM t4;
4ca0: 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 65 78 65 63  .} {0 1}.do_exec
4cb0: 73 71 6c 5f 74 65 73 74 20 31 33 2e 38 2e 32 20  sql_test 13.8.2 
4cc0: 7b 0a 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f  {.  SELECT test_
4cd0: 61 75 78 64 61 74 61 28 27 63 6f 6e 73 74 61 6e  auxdata('constan
4ce0: 74 27 29 20 46 52 4f 4d 20 74 34 3b 0a 7d 20 7b  t') FROM t4;.} {
4cf0: 30 20 31 7d 0a 64 62 20 63 61 63 68 65 20 66 6c  0 1}.db cache fl
4d00: 75 73 68 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ush.do_execsql_t
4d10: 65 73 74 20 31 33 2e 38 2e 33 20 7b 0a 20 20 53  est 13.8.3 {.  S
4d20: 45 4c 45 43 54 20 74 65 73 74 5f 61 75 78 64 61  ELECT test_auxda
4d30: 74 61 28 27 63 6f 6e 73 74 61 6e 74 27 29 20 46  ta('constant') F
4d40: 52 4f 4d 20 74 34 3b 0a 7d 20 7b 30 20 31 7d 0a  ROM t4;.} {0 1}.
4d50: 73 65 74 20 56 20 22 6f 6e 65 22 0a 64 6f 5f 65  set V "one".do_e
4d60: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 33 2e 38  xecsql_test 13.8
4d70: 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 74 65  .4 {.  SELECT te
4d80: 73 74 5f 61 75 78 64 61 74 61 28 24 56 29 2c 20  st_auxdata($V), 
4d90: 24 56 20 46 52 4f 4d 20 74 34 3b 0a 7d 20 7b 30  $V FROM t4;.} {0
4da0: 20 6f 6e 65 20 31 20 6f 6e 65 7d 0a 73 65 74 20   one 1 one}.set 
4db0: 56 20 22 74 77 6f 22 0a 64 6f 5f 65 78 65 63 73  V "two".do_execs
4dc0: 71 6c 5f 74 65 73 74 20 31 33 2e 38 2e 35 20 7b  ql_test 13.8.5 {
4dd0: 0a 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f 61  .  SELECT test_a
4de0: 75 78 64 61 74 61 28 24 56 29 2c 20 24 56 20 46  uxdata($V), $V F
4df0: 52 4f 4d 20 74 34 3b 0a 7d 20 7b 30 20 74 77 6f  ROM t4;.} {0 two
4e00: 20 31 20 74 77 6f 7d 0a 64 62 20 63 61 63 68 65   1 two}.db cache
4e10: 20 66 6c 75 73 68 0a 73 65 74 20 56 20 22 74 68   flush.set V "th
4e20: 72 65 65 22 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ree".do_execsql_
4e30: 74 65 73 74 20 31 33 2e 38 2e 36 20 7b 0a 20 20  test 13.8.6 {.  
4e40: 53 45 4c 45 43 54 20 74 65 73 74 5f 61 75 78 64  SELECT test_auxd
4e50: 61 74 61 28 24 56 29 2c 20 24 56 20 46 52 4f 4d  ata($V), $V FROM
4e60: 20 74 34 3b 0a 7d 20 7b 30 20 74 68 72 65 65 20   t4;.} {0 three 
4e70: 31 20 74 68 72 65 65 7d 0a 0a 0a 23 20 4d 61 6b  1 three}...# Mak
4e80: 65 20 73 75 72 65 20 74 68 61 74 20 61 20 66 75  e sure that a fu
4e90: 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 76 65  nction with a ve
4ea0: 72 79 20 6c 6f 6e 67 20 6e 61 6d 65 20 69 73 20  ry long name is 
4eb0: 72 65 6a 65 63 74 65 64 0a 64 6f 5f 74 65 73 74  rejected.do_test
4ec0: 20 66 75 6e 63 2d 31 34 2e 31 20 7b 0a 20 20 63   func-14.1 {.  c
4ed0: 61 74 63 68 20 7b 0a 20 20 20 20 64 62 20 66 75  atch {.    db fu
4ee0: 6e 63 74 69 6f 6e 20 5b 73 74 72 69 6e 67 20 72  nction [string r
4ef0: 65 70 65 61 74 20 58 20 32 35 34 5d 20 7b 72 65  epeat X 254] {re
4f00: 74 75 72 6e 20 22 68 65 6c 6c 6f 22 7d 0a 20 20  turn "hello"}.  
4f10: 7d 20 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74  } .} {0}.do_test
4f20: 20 66 75 6e 63 2d 31 34 2e 32 20 7b 0a 20 20 63   func-14.2 {.  c
4f30: 61 74 63 68 20 7b 0a 20 20 20 20 64 62 20 66 75  atch {.    db fu
4f40: 6e 63 74 69 6f 6e 20 5b 73 74 72 69 6e 67 20 72  nction [string r
4f50: 65 70 65 61 74 20 58 20 32 35 36 5d 20 7b 72 65  epeat X 256] {re
4f60: 74 75 72 6e 20 22 68 65 6c 6c 6f 22 7d 0a 20 20  turn "hello"}.  
4f70: 7d 0a 7d 20 7b 31 7d 0a 0a 64 6f 5f 74 65 73 74  }.} {1}..do_test
4f80: 20 66 75 6e 63 2d 31 35 2e 31 20 7b 0a 20 20 63   func-15.1 {.  c
4f90: 61 74 63 68 73 71 6c 20 7b 73 65 6c 65 63 74 20  atchsql {select 
4fa0: 74 65 73 74 5f 65 72 72 6f 72 28 4e 55 4c 4c 29  test_error(NULL)
4fb0: 7d 0a 7d 20 7b 31 20 7b 7d 7d 0a 64 6f 5f 74 65  }.} {1 {}}.do_te
4fc0: 73 74 20 66 75 6e 63 2d 31 35 2e 32 20 7b 0a 20  st func-15.2 {. 
4fd0: 20 63 61 74 63 68 73 71 6c 20 7b 73 65 6c 65 63   catchsql {selec
4fe0: 74 20 74 65 73 74 5f 65 72 72 6f 72 28 27 74 68  t test_error('th
4ff0: 69 73 20 69 73 20 74 68 65 20 65 72 72 6f 72 20  is is the error 
5000: 6d 65 73 73 61 67 65 27 29 7d 0a 7d 20 7b 31 20  message')}.} {1 
5010: 7b 74 68 69 73 20 69 73 20 74 68 65 20 65 72 72  {this is the err
5020: 6f 72 20 6d 65 73 73 61 67 65 7d 7d 0a 64 6f 5f  or message}}.do_
5030: 74 65 73 74 20 66 75 6e 63 2d 31 35 2e 33 20 7b  test func-15.3 {
5040: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 73 65 6c  .  catchsql {sel
5050: 65 63 74 20 74 65 73 74 5f 65 72 72 6f 72 28 27  ect test_error('
5060: 74 68 69 73 20 69 73 20 74 68 65 20 65 72 72 6f  this is the erro
5070: 72 20 6d 65 73 73 61 67 65 27 2c 31 32 29 7d 0a  r message',12)}.
5080: 7d 20 7b 31 20 7b 74 68 69 73 20 69 73 20 74 68  } {1 {this is th
5090: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 7d  e error message}
50a0: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31  }.do_test func-1
50b0: 35 2e 34 20 7b 0a 20 20 64 62 20 65 72 72 6f 72  5.4 {.  db error
50c0: 63 6f 64 65 0a 7d 20 7b 31 32 7d 0a 0a 23 20 54  code.} {12}..# T
50d0: 65 73 74 20 74 68 65 20 71 75 6f 74 65 20 66 75  est the quote fu
50e0: 6e 63 74 69 6f 6e 20 66 6f 72 20 42 4c 4f 42 20  nction for BLOB 
50f0: 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  and NULL values.
5100: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 36  .do_test func-16
5110: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
5120: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5130: 45 20 74 62 6c 32 28 61 2c 20 62 29 3b 0a 20 20  E tbl2(a, b);.  
5140: 7d 0a 20 20 73 65 74 20 53 54 4d 54 20 5b 73 71  }.  set STMT [sq
5150: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 24 3a  lite3_prepare $:
5160: 3a 44 42 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  :DB "INSERT INTO
5170: 20 74 62 6c 32 20 56 41 4c 55 45 53 28 3f 2c 20   tbl2 VALUES(?, 
5180: 3f 29 22 20 2d 31 20 54 41 49 4c 5d 0a 20 20 73  ?)" -1 TAIL].  s
5190: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
51a0: 20 24 3a 3a 53 54 4d 54 20 31 20 61 62 63 20 33   $::STMT 1 abc 3
51b0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20  .  sqlite3_step 
51c0: 24 3a 3a 53 54 4d 54 0a 20 20 73 71 6c 69 74 65  $::STMT.  sqlite
51d0: 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54  3_finalize $::ST
51e0: 4d 54 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  MT.  execsql {. 
51f0: 20 20 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28     SELECT quote(
5200: 61 29 2c 20 71 75 6f 74 65 28 62 29 20 46 52 4f  a), quote(b) FRO
5210: 4d 20 74 62 6c 32 3b 0a 20 20 7d 0a 7d 20 7b 58  M tbl2;.  }.} {X
5220: 27 36 31 36 32 36 33 27 20 4e 55 4c 4c 7d 0a 0a  '616263' NULL}..
5230: 23 20 43 6f 72 72 65 63 74 6c 79 20 68 61 6e 64  # Correctly hand
5240: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 65 72 72 6f  le function erro
5250: 72 20 6d 65 73 73 61 67 65 73 20 74 68 61 74 20  r messages that 
5260: 69 6e 63 6c 75 64 65 20 25 2e 20 20 54 69 63 6b  include %.  Tick
5270: 65 74 20 23 31 33 35 34 0a 23 0a 64 6f 5f 74 65  et #1354.#.do_te
5280: 73 74 20 66 75 6e 63 2d 31 37 2e 31 20 7b 0a 20  st func-17.1 {. 
5290: 20 70 72 6f 63 20 74 65 73 74 66 75 6e 63 31 20   proc testfunc1 
52a0: 61 72 67 73 20 7b 65 72 72 6f 72 20 22 45 72 72  args {error "Err
52b0: 6f 72 20 25 64 20 77 69 74 68 20 25 73 20 70 65  or %d with %s pe
52c0: 72 63 65 6e 74 73 20 25 70 22 7d 0a 20 20 64 62  rcents %p"}.  db
52d0: 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 66 75   function testfu
52e0: 6e 63 31 20 3a 3a 74 65 73 74 66 75 6e 63 31 0a  nc1 ::testfunc1.
52f0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
5300: 20 53 45 4c 45 43 54 20 74 65 73 74 66 75 6e 63   SELECT testfunc
5310: 31 28 31 2c 32 2c 33 29 3b 0a 20 20 7d 0a 7d 20  1(1,2,3);.  }.} 
5320: 7b 31 20 7b 45 72 72 6f 72 20 25 64 20 77 69 74  {1 {Error %d wit
5330: 68 20 25 73 20 70 65 72 63 65 6e 74 73 20 25 70  h %s percents %p
5340: 7d 7d 0a 0a 23 20 54 68 65 20 53 55 4d 20 66 75  }}..# The SUM fu
5350: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 72 65  nction should re
5360: 74 75 72 6e 20 69 6e 74 65 67 65 72 20 72 65 73  turn integer res
5370: 75 6c 74 73 20 77 68 65 6e 20 61 6c 6c 20 69 6e  ults when all in
5380: 70 75 74 73 20 61 72 65 20 69 6e 74 65 67 65 72  puts are integer
5390: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  ..#.do_test func
53a0: 2d 31 38 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -18.1 {.  execsq
53b0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
53c0: 41 42 4c 45 20 74 35 28 78 29 3b 0a 20 20 20 20  ABLE t5(x);.    
53d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56  INSERT INTO t5 V
53e0: 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 49 4e  ALUES(1);.    IN
53f0: 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c  SERT INTO t5 VAL
5400: 55 45 53 28 2d 39 39 29 3b 0a 20 20 20 20 49 4e  UES(-99);.    IN
5410: 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c  SERT INTO t5 VAL
5420: 55 45 53 28 31 30 30 30 30 29 3b 0a 20 20 20 20  UES(10000);.    
5430: 53 45 4c 45 43 54 20 73 75 6d 28 78 29 20 46 52  SELECT sum(x) FR
5440: 4f 4d 20 74 35 3b 0a 20 20 7d 0a 7d 20 7b 39 39  OM t5;.  }.} {99
5450: 30 32 7d 0a 69 66 63 61 70 61 62 6c 65 20 66 6c  02}.ifcapable fl
5460: 6f 61 74 69 6e 67 70 6f 69 6e 74 20 7b 0a 20 20  oatingpoint {.  
5470: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e  do_test func-18.
5480: 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  2 {.    execsql 
5490: 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  {.      INSERT I
54a0: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 30 2e  NTO t5 VALUES(0.
54b0: 30 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  0);.      SELECT
54c0: 20 73 75 6d 28 78 29 20 46 52 4f 4d 20 74 35 3b   sum(x) FROM t5;
54d0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 39 39 30 32  .    }.  } {9902
54e0: 2e 30 7d 0a 7d 0a 0a 23 20 54 68 65 20 73 75 6d  .0}.}..# The sum
54f0: 20 6f 66 20 6e 6f 74 68 69 6e 67 20 69 73 20 4e   of nothing is N
5500: 55 4c 4c 2e 20 20 42 75 74 20 74 68 65 20 73 75  ULL.  But the su
5510: 6d 20 6f 66 20 61 6c 6c 20 4e 55 4c 4c 73 20 69  m of all NULLs i
5520: 73 20 4e 55 4c 4c 2e 0a 23 0a 23 20 54 68 65 20  s NULL..#.# The 
5530: 54 4f 54 41 4c 20 6f 66 20 6e 6f 74 68 69 6e 67  TOTAL of nothing
5540: 20 69 73 20 30 2e 30 2e 0a 23 0a 64 6f 5f 74 65   is 0.0..#.do_te
5550: 73 74 20 66 75 6e 63 2d 31 38 2e 33 20 7b 0a 20  st func-18.3 {. 
5560: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
5570: 45 4c 45 54 45 20 46 52 4f 4d 20 74 35 3b 0a 20  ELETE FROM t5;. 
5580: 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29     SELECT sum(x)
5590: 2c 20 74 6f 74 61 6c 28 78 29 20 46 52 4f 4d 20  , total(x) FROM 
55a0: 74 35 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 30 2e  t5;.  }.} {{} 0.
55b0: 30 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  0}.do_test func-
55c0: 31 38 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  18.4 {.  execsql
55d0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
55e0: 54 4f 20 74 35 20 56 41 4c 55 45 53 28 4e 55 4c  TO t5 VALUES(NUL
55f0: 4c 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 73  L);.    SELECT s
5600: 75 6d 28 78 29 2c 20 74 6f 74 61 6c 28 78 29 20  um(x), total(x) 
5610: 46 52 4f 4d 20 74 35 0a 20 20 7d 0a 7d 20 7b 7b  FROM t5.  }.} {{
5620: 7d 20 30 2e 30 7d 0a 64 6f 5f 74 65 73 74 20 66  } 0.0}.do_test f
5630: 75 6e 63 2d 31 38 2e 35 20 7b 0a 20 20 65 78 65  unc-18.5 {.  exe
5640: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
5650: 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53  T INTO t5 VALUES
5660: 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 45 4c 45  (NULL);.    SELE
5670: 43 54 20 73 75 6d 28 78 29 2c 20 74 6f 74 61 6c  CT sum(x), total
5680: 28 78 29 20 46 52 4f 4d 20 74 35 0a 20 20 7d 0a  (x) FROM t5.  }.
5690: 7d 20 7b 7b 7d 20 30 2e 30 7d 0a 64 6f 5f 74 65  } {{} 0.0}.do_te
56a0: 73 74 20 66 75 6e 63 2d 31 38 2e 36 20 7b 0a 20  st func-18.6 {. 
56b0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
56c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41  NSERT INTO t5 VA
56d0: 4c 55 45 53 28 31 32 33 29 3b 0a 20 20 20 20 53  LUES(123);.    S
56e0: 45 4c 45 43 54 20 73 75 6d 28 78 29 2c 20 74 6f  ELECT sum(x), to
56f0: 74 61 6c 28 78 29 20 46 52 4f 4d 20 74 35 0a 20  tal(x) FROM t5. 
5700: 20 7d 0a 7d 20 7b 31 32 33 20 31 32 33 2e 30 7d   }.} {123 123.0}
5710: 0a 0a 23 20 54 69 63 6b 65 74 20 23 31 36 36 34  ..# Ticket #1664
5720: 2c 20 23 31 36 36 39 2c 20 23 31 36 37 30 2c 20  , #1669, #1670, 
5730: 23 31 36 37 34 3a 20 41 6e 20 69 6e 74 65 67 65  #1674: An intege
5740: 72 20 6f 76 65 72 66 6c 6f 77 20 6f 6e 20 53 55  r overflow on SU
5750: 4d 20 63 61 75 73 65 73 0a 23 20 61 6e 20 65 72  M causes.# an er
5760: 72 6f 72 2e 20 54 68 65 20 6e 6f 6e 2d 73 74 61  ror. The non-sta
5770: 6e 64 61 72 64 20 54 4f 54 41 4c 28 29 20 66 75  ndard TOTAL() fu
5780: 6e 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  nction continues
5790: 20 74 6f 20 67 69 76 65 20 61 20 68 65 6c 70 66   to give a helpf
57a0: 75 6c 0a 23 20 72 65 73 75 6c 74 2e 0a 23 0a 64  ul.# result..#.d
57b0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 31  o_test func-18.1
57c0: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  0 {.  execsql {.
57d0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
57e0: 20 74 36 28 78 20 49 4e 54 45 47 45 52 29 3b 0a   t6(x INTEGER);.
57f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5800: 74 36 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20  t6 VALUES(1);.  
5810: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36    INSERT INTO t6
5820: 20 56 41 4c 55 45 53 28 31 3c 3c 36 32 29 3b 0a   VALUES(1<<62);.
5830: 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78      SELECT sum(x
5840: 29 20 2d 20 28 28 31 3c 3c 36 32 29 2b 31 29 20  ) - ((1<<62)+1) 
5850: 66 72 6f 6d 20 74 36 3b 0a 20 20 7d 0a 7d 20 30  from t6;.  }.} 0
5860: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38  .do_test func-18
5870: 2e 31 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .11 {.  execsql 
5880: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 79 70  {.    SELECT typ
5890: 65 6f 66 28 73 75 6d 28 78 29 29 20 46 52 4f 4d  eof(sum(x)) FROM
58a0: 20 74 36 0a 20 20 7d 0a 7d 20 69 6e 74 65 67 65   t6.  }.} intege
58b0: 72 0a 69 66 63 61 70 61 62 6c 65 20 66 6c 6f 61  r.ifcapable floa
58c0: 74 69 6e 67 70 6f 69 6e 74 20 7b 0a 20 20 64 6f  tingpoint {.  do
58d0: 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 32  _test func-18.12
58e0: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
58f0: 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  {.      INSERT I
5900: 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28 31 3c  NTO t6 VALUES(1<
5910: 3c 36 32 29 3b 0a 20 20 20 20 20 20 53 45 4c 45  <62);.      SELE
5920: 43 54 20 73 75 6d 28 78 29 20 2d 20 28 28 31 3c  CT sum(x) - ((1<
5930: 3c 36 32 29 2a 32 2e 30 2b 31 29 20 66 72 6f 6d  <62)*2.0+1) from
5940: 20 74 36 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   t6;.    }.  } {
5950: 31 20 7b 69 6e 74 65 67 65 72 20 6f 76 65 72 66  1 {integer overf
5960: 6c 6f 77 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  low}}.  do_test 
5970: 66 75 6e 63 2d 31 38 2e 31 33 20 7b 0a 20 20 20  func-18.13 {.   
5980: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
5990: 20 53 45 4c 45 43 54 20 74 6f 74 61 6c 28 78 29   SELECT total(x)
59a0: 20 2d 20 28 28 31 3c 3c 36 32 29 2a 32 2e 30 2b   - ((1<<62)*2.0+
59b0: 31 29 20 46 52 4f 4d 20 74 36 0a 20 20 20 20 7d  1) FROM t6.    }
59c0: 0a 20 20 7d 20 30 2e 30 0a 7d 0a 69 66 63 61 70  .  } 0.0.}.ifcap
59d0: 61 62 6c 65 20 21 66 6c 6f 61 74 69 6e 67 70 6f  able !floatingpo
59e0: 69 6e 74 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  int {.  do_test 
59f0: 66 75 6e 63 2d 31 38 2e 31 32 20 7b 0a 20 20 20  func-18.12 {.   
5a00: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
5a10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36    INSERT INTO t6
5a20: 20 56 41 4c 55 45 53 28 31 3c 3c 36 32 29 3b 0a   VALUES(1<<62);.
5a30: 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d        SELECT sum
5a40: 28 78 29 20 2d 20 28 28 31 3c 3c 36 32 29 2a 32  (x) - ((1<<62)*2
5a50: 2b 31 29 20 66 72 6f 6d 20 74 36 3b 0a 20 20 20  +1) from t6;.   
5a60: 20 7d 0a 20 20 7d 20 7b 31 20 7b 69 6e 74 65 67   }.  } {1 {integ
5a70: 65 72 20 6f 76 65 72 66 6c 6f 77 7d 7d 0a 20 20  er overflow}}.  
5a80: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e  do_test func-18.
5a90: 31 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  13 {.    execsql
5aa0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
5ab0: 74 6f 74 61 6c 28 78 29 20 2d 20 28 28 31 3c 3c  total(x) - ((1<<
5ac0: 36 32 29 2a 32 2b 31 29 20 46 52 4f 4d 20 74 36  62)*2+1) FROM t6
5ad0: 0a 20 20 20 20 7d 0a 20 20 7d 20 30 2e 30 0a 7d  .    }.  } 0.0.}
5ae0: 0a 69 66 20 7b 5b 77 6f 72 6b 69 6e 67 5f 36 34  .if {[working_64
5af0: 62 69 74 5f 69 6e 74 5d 7d 20 7b 0a 20 20 64 6f  bit_int]} {.  do
5b00: 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 34  _test func-18.14
5b10: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
5b20: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 75  .      SELECT su
5b30: 6d 28 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  m(-9223372036854
5b40: 37 37 35 38 30 35 29 3b 0a 20 20 20 20 7d 0a 20  775805);.    }. 
5b50: 20 7d 20 2d 39 32 32 33 33 37 32 30 33 36 38 35   } -922337203685
5b60: 34 37 37 35 38 30 35 0a 7d 0a 69 66 63 61 70 61  4775805.}.ifcapa
5b70: 62 6c 65 20 63 6f 6d 70 6f 75 6e 64 26 26 73 75  ble compound&&su
5b80: 62 71 75 65 72 79 20 7b 0a 0a 64 6f 5f 74 65 73  bquery {..do_tes
5b90: 74 20 66 75 6e 63 2d 31 38 2e 31 35 20 7b 0a 20  t func-18.15 {. 
5ba0: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
5bb0: 53 45 4c 45 43 54 20 73 75 6d 28 78 29 20 46 52  SELECT sum(x) FR
5bc0: 4f 4d 20 0a 20 20 20 20 20 20 20 28 53 45 4c 45  OM .       (SELE
5bd0: 43 54 20 39 32 32 33 33 37 32 30 33 36 38 35 34  CT 9223372036854
5be0: 37 37 35 38 30 37 20 41 53 20 78 20 55 4e 49 4f  775807 AS x UNIO
5bf0: 4e 20 41 4c 4c 0a 20 20 20 20 20 20 20 20 53 45  N ALL.        SE
5c00: 4c 45 43 54 20 31 30 20 41 53 20 78 29 3b 0a 20  LECT 10 AS x);. 
5c10: 20 7d 0a 7d 20 7b 31 20 7b 69 6e 74 65 67 65 72   }.} {1 {integer
5c20: 20 6f 76 65 72 66 6c 6f 77 7d 7d 0a 69 66 20 7b   overflow}}.if {
5c30: 5b 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69  [working_64bit_i
5c40: 6e 74 5d 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  nt]} {.  do_test
5c50: 20 66 75 6e 63 2d 31 38 2e 31 36 20 7b 0a 20 20   func-18.16 {.  
5c60: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
5c70: 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29     SELECT sum(x)
5c80: 20 46 52 4f 4d 20 0a 20 20 20 20 20 20 20 20 20   FROM .         
5c90: 28 53 45 4c 45 43 54 20 39 32 32 33 33 37 32 30  (SELECT 92233720
5ca0: 33 36 38 35 34 37 37 35 38 30 37 20 41 53 20 78  36854775807 AS x
5cb0: 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20   UNION ALL.     
5cc0: 20 20 20 20 20 53 45 4c 45 43 54 20 2d 31 30 20       SELECT -10 
5cd0: 41 53 20 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AS x);.    }.  }
5ce0: 20 7b 30 20 39 32 32 33 33 37 32 30 33 36 38 35   {0 922337203685
5cf0: 34 37 37 35 37 39 37 7d 0a 20 20 64 6f 5f 74 65  4775797}.  do_te
5d00: 73 74 20 66 75 6e 63 2d 31 38 2e 31 37 20 7b 0a  st func-18.17 {.
5d10: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20      catchsql {. 
5d20: 20 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28       SELECT sum(
5d30: 78 29 20 46 52 4f 4d 20 0a 20 20 20 20 20 20 20  x) FROM .       
5d40: 20 20 28 53 45 4c 45 43 54 20 2d 39 32 32 33 33    (SELECT -92233
5d50: 37 32 30 33 36 38 35 34 37 37 35 38 30 37 20 41  72036854775807 A
5d60: 53 20 78 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20  S x UNION ALL.  
5d70: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 31          SELECT 1
5d80: 30 20 41 53 20 78 29 3b 0a 20 20 20 20 7d 0a 20  0 AS x);.    }. 
5d90: 20 7d 20 7b 30 20 2d 39 32 32 33 33 37 32 30 33   } {0 -922337203
5da0: 36 38 35 34 37 37 35 37 39 37 7d 0a 7d 0a 64 6f  6854775797}.}.do
5db0: 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 38  _test func-18.18
5dc0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
5dd0: 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78      SELECT sum(x
5de0: 29 20 46 52 4f 4d 20 0a 20 20 20 20 20 20 20 28  ) FROM .       (
5df0: 53 45 4c 45 43 54 20 2d 39 32 32 33 33 37 32 30  SELECT -92233720
5e00: 33 36 38 35 34 37 37 35 38 30 37 20 41 53 20 78  36854775807 AS x
5e10: 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20   UNION ALL.     
5e20: 20 20 20 53 45 4c 45 43 54 20 2d 31 30 20 41 53     SELECT -10 AS
5e30: 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 69   x);.  }.} {1 {i
5e40: 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 7d  nteger overflow}
5e50: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31  }.do_test func-1
5e60: 38 2e 31 39 20 7b 0a 20 20 63 61 74 63 68 73 71  8.19 {.  catchsq
5e70: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 73  l {.    SELECT s
5e80: 75 6d 28 78 29 20 46 52 4f 4d 20 28 53 45 4c 45  um(x) FROM (SELE
5e90: 43 54 20 39 20 41 53 20 78 20 55 4e 49 4f 4e 20  CT 9 AS x UNION 
5ea0: 41 4c 4c 20 53 45 4c 45 43 54 20 2d 31 30 20 41  ALL SELECT -10 A
5eb0: 53 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 2d  S x);.  }.} {0 -
5ec0: 31 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  1}.do_test func-
5ed0: 31 38 2e 32 30 20 7b 0a 20 20 63 61 74 63 68 73  18.20 {.  catchs
5ee0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
5ef0: 73 75 6d 28 78 29 20 46 52 4f 4d 20 28 53 45 4c  sum(x) FROM (SEL
5f00: 45 43 54 20 2d 39 20 41 53 20 78 20 55 4e 49 4f  ECT -9 AS x UNIO
5f10: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 31 30 20  N ALL SELECT 10 
5f20: 41 53 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20  AS x);.  }.} {0 
5f30: 31 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  1}.do_test func-
5f40: 31 38 2e 32 31 20 7b 0a 20 20 63 61 74 63 68 73  18.21 {.  catchs
5f50: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
5f60: 73 75 6d 28 78 29 20 46 52 4f 4d 20 28 53 45 4c  sum(x) FROM (SEL
5f70: 45 43 54 20 2d 31 30 20 41 53 20 78 20 55 4e 49  ECT -10 AS x UNI
5f80: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 39 20  ON ALL SELECT 9 
5f90: 41 53 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20  AS x);.  }.} {0 
5fa0: 2d 31 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  -1}.do_test func
5fb0: 2d 31 38 2e 32 32 20 7b 0a 20 20 63 61 74 63 68  -18.22 {.  catch
5fc0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
5fd0: 20 73 75 6d 28 78 29 20 46 52 4f 4d 20 28 53 45   sum(x) FROM (SE
5fe0: 4c 45 43 54 20 31 30 20 41 53 20 78 20 55 4e 49  LECT 10 AS x UNI
5ff0: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2d 39  ON ALL SELECT -9
6000: 20 41 53 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b 30   AS x);.  }.} {0
6010: 20 31 7d 0a 0a 7d 20 3b 23 20 69 66 63 61 70 61   1}..} ;# ifcapa
6020: 62 6c 65 20 63 6f 6d 70 6f 75 6e 64 26 26 73 75  ble compound&&su
6030: 62 71 75 65 72 79 0a 0a 23 20 49 6e 74 65 67 65  bquery..# Intege
6040: 72 20 6f 76 65 72 66 6c 6f 77 20 6f 6e 20 61 62  r overflow on ab
6050: 73 28 29 0a 23 0a 69 66 20 7b 5b 77 6f 72 6b 69  s().#.if {[worki
6060: 6e 67 5f 36 34 62 69 74 5f 69 6e 74 5d 7d 20 7b  ng_64bit_int]} {
6070: 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .  do_test func-
6080: 31 38 2e 33 31 20 7b 0a 20 20 20 20 63 61 74 63  18.31 {.    catc
6090: 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  hsql {.      SEL
60a0: 45 43 54 20 61 62 73 28 2d 39 32 32 33 33 37 32  ECT abs(-9223372
60b0: 30 33 36 38 35 34 37 37 35 38 30 37 29 3b 0a 20  036854775807);. 
60c0: 20 20 20 7d 0a 20 20 7d 20 7b 30 20 39 32 32 33     }.  } {0 9223
60d0: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 7d  372036854775807}
60e0: 0a 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .}.do_test func-
60f0: 31 38 2e 33 32 20 7b 0a 20 20 63 61 74 63 68 73  18.32 {.  catchs
6100: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
6110: 61 62 73 28 2d 39 32 32 33 33 37 32 30 33 36 38  abs(-92233720368
6120: 35 34 37 37 35 38 30 37 2d 31 29 3b 0a 20 20 7d  54775807-1);.  }
6130: 0a 7d 20 7b 31 20 7b 69 6e 74 65 67 65 72 20 6f  .} {1 {integer o
6140: 76 65 72 66 6c 6f 77 7d 7d 0a 0a 23 20 54 68 65  verflow}}..# The
6150: 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 20   MATCH function 
6160: 65 78 69 73 74 73 20 62 75 74 20 69 73 20 6f 6e  exists but is on
6170: 6c 79 20 61 20 73 74 75 62 20 61 6e 64 20 61 6c  ly a stub and al
6180: 77 61 79 73 20 74 68 72 6f 77 73 20 61 6e 20 65  ways throws an e
6190: 72 72 6f 72 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  rror..#.do_test 
61a0: 66 75 6e 63 2d 31 39 2e 31 20 7b 0a 20 20 65 78  func-19.1 {.  ex
61b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
61c0: 43 54 20 6d 61 74 63 68 28 61 2c 62 29 20 46 52  CT match(a,b) FR
61d0: 4f 4d 20 74 31 20 57 48 45 52 45 20 30 3b 0a 20  OM t1 WHERE 0;. 
61e0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
61f0: 66 75 6e 63 2d 31 39 2e 32 20 7b 0a 20 20 63 61  func-19.2 {.  ca
6200: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
6210: 45 43 54 20 27 61 62 63 27 20 4d 41 54 43 48 20  ECT 'abc' MATCH 
6220: 27 78 79 7a 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20  'xyz';.  }.} {1 
6230: 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66  {unable to use f
6240: 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e  unction MATCH in
6250: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
6260: 6f 6e 74 65 78 74 7d 7d 0a 64 6f 5f 74 65 73 74  ontext}}.do_test
6270: 20 66 75 6e 63 2d 31 39 2e 33 20 7b 0a 20 20 63   func-19.3 {.  c
6280: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45  atchsql {.    SE
6290: 4c 45 43 54 20 27 61 62 63 27 20 4e 4f 54 20 4d  LECT 'abc' NOT M
62a0: 41 54 43 48 20 27 78 79 7a 27 3b 0a 20 20 7d 0a  ATCH 'xyz';.  }.
62b0: 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20  } {1 {unable to 
62c0: 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 4d 41 54  use function MAT
62d0: 43 48 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  CH in the reques
62e0: 74 65 64 20 63 6f 6e 74 65 78 74 7d 7d 0a 64 6f  ted context}}.do
62f0: 5f 74 65 73 74 20 66 75 6e 63 2d 31 39 2e 34 20  _test func-19.4 
6300: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
6310: 20 20 20 53 45 4c 45 43 54 20 6d 61 74 63 68 28     SELECT match(
6320: 31 2c 32 2c 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31  1,2,3);.  }.} {1
6330: 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f   {wrong number o
6340: 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
6350: 75 6e 63 74 69 6f 6e 20 6d 61 74 63 68 28 29 7d  unction match()}
6360: 7d 0a 0a 23 20 53 6f 75 6e 64 65 78 20 74 65 73  }..# Soundex tes
6370: 74 73 2e 0a 23 0a 69 66 20 7b 21 5b 63 61 74 63  ts..#.if {![catc
6380: 68 20 7b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  h {db eval {SELE
6390: 43 54 20 73 6f 75 6e 64 65 78 28 27 68 65 6c 6c  CT soundex('hell
63a0: 6f 27 29 7d 7d 5d 7d 20 7b 0a 20 20 73 65 74 20  o')}}]} {.  set 
63b0: 69 20 30 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e  i 0.  foreach {n
63c0: 61 6d 65 20 73 64 78 7d 20 7b 0a 20 20 20 20 65  ame sdx} {.    e
63d0: 75 6c 65 72 20 20 20 20 20 20 20 20 45 34 36 30  uler        E460
63e0: 0a 20 20 20 20 45 55 4c 45 52 20 20 20 20 20 20  .    EULER      
63f0: 20 20 45 34 36 30 0a 20 20 20 20 45 75 6c 65 72    E460.    Euler
6400: 20 20 20 20 20 20 20 20 45 34 36 30 0a 20 20 20          E460.   
6410: 20 65 6c 6c 65 72 79 20 20 20 20 20 20 20 45 34   ellery       E4
6420: 36 30 0a 20 20 20 20 67 61 75 73 73 20 20 20 20  60.    gauss    
6430: 20 20 20 20 47 32 30 30 0a 20 20 20 20 67 68 6f      G200.    gho
6440: 73 68 20 20 20 20 20 20 20 20 47 32 30 30 0a 20  sh        G200. 
6450: 20 20 20 68 69 6c 62 65 72 74 20 20 20 20 20 20     hilbert      
6460: 48 34 31 36 0a 20 20 20 20 48 65 69 6c 62 72 6f  H416.    Heilbro
6470: 6e 6e 20 20 20 20 48 34 31 36 0a 20 20 20 20 6b  nn    H416.    k
6480: 6e 75 74 68 20 20 20 20 20 20 20 20 4b 35 33 30  nuth        K530
6490: 0a 20 20 20 20 6b 61 6e 74 20 20 20 20 20 20 20  .    kant       
64a0: 20 20 4b 35 33 30 0a 20 20 20 20 4c 6c 6f 79 64    K530.    Lloyd
64b0: 20 20 20 20 20 20 20 20 4c 33 30 30 0a 20 20 20          L300.   
64c0: 20 4c 41 44 44 20 20 20 20 20 20 20 20 20 4c 33   LADD         L3
64d0: 30 30 0a 20 20 20 20 4c 75 6b 61 73 69 65 77 69  00.    Lukasiewi
64e0: 63 7a 20 20 4c 32 32 32 0a 20 20 20 20 4c 69 73  cz  L222.    Lis
64f0: 73 61 6a 6f 75 73 20 20 20 20 4c 32 32 32 0a 20  sajous    L222. 
6500: 20 20 20 41 20 20 20 20 20 20 20 20 20 20 20 20     A            
6510: 41 30 30 30 0a 20 20 20 20 31 32 33 34 35 20 20  A000.    12345  
6520: 20 20 20 20 20 20 3f 30 30 30 0a 20 20 7d 20 7b        ?000.  } {
6530: 0a 20 20 20 20 69 6e 63 72 20 69 0a 20 20 20 20  .    incr i.    
6540: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 30 2e  do_test func-20.
6550: 24 69 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73  $i {.      execs
6560: 71 6c 20 7b 53 45 4c 45 43 54 20 73 6f 75 6e 64  ql {SELECT sound
6570: 65 78 28 24 6e 61 6d 65 29 7d 0a 20 20 20 20 7d  ex($name)}.    }
6580: 20 24 73 64 78 0a 20 20 7d 0a 7d 0a 0a 23 20 54   $sdx.  }.}..# T
6590: 65 73 74 73 20 6f 66 20 74 68 65 20 52 45 50 4c  ests of the REPL
65a0: 41 43 45 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a  ACE function..#.
65b0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 31 2e  do_test func-21.
65c0: 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  1 {.  catchsql {
65d0: 0a 20 20 20 20 53 45 4c 45 43 54 20 72 65 70 6c  .    SELECT repl
65e0: 61 63 65 28 31 2c 32 29 3b 0a 20 20 7d 0a 7d 20  ace(1,2);.  }.} 
65f0: 7b 31 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72  {1 {wrong number
6600: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
6610: 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63   function replac
6620: 65 28 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75  e()}}.do_test fu
6630: 6e 63 2d 32 31 2e 32 20 7b 0a 20 20 63 61 74 63  nc-21.2 {.  catc
6640: 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  hsql {.    SELEC
6650: 54 20 72 65 70 6c 61 63 65 28 31 2c 32 2c 33 2c  T replace(1,2,3,
6660: 34 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 77 72  4);.  }.} {1 {wr
6670: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
6680: 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
6690: 69 6f 6e 20 72 65 70 6c 61 63 65 28 29 7d 7d 0a  ion replace()}}.
66a0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 31 2e  do_test func-21.
66b0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
66c0: 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f      SELECT typeo
66d0: 66 28 72 65 70 6c 61 63 65 28 22 54 68 69 73 20  f(replace("This 
66e0: 69 73 20 74 68 65 20 6d 61 69 6e 20 74 65 73 74  is the main test
66f0: 20 73 74 72 69 6e 67 22 2c 20 4e 55 4c 4c 2c 20   string", NULL, 
6700: 22 41 4c 54 22 29 29 3b 0a 20 20 7d 0a 7d 20 7b  "ALT"));.  }.} {
6710: 6e 75 6c 6c 7d 0a 64 6f 5f 74 65 73 74 20 66 75  null}.do_test fu
6720: 6e 63 2d 32 31 2e 34 20 7b 0a 20 20 65 78 65 63  nc-21.4 {.  exec
6730: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
6740: 20 74 79 70 65 6f 66 28 72 65 70 6c 61 63 65 28   typeof(replace(
6750: 4e 55 4c 4c 2c 20 22 6d 61 69 6e 22 2c 20 22 41  NULL, "main", "A
6760: 4c 54 22 29 29 3b 0a 20 20 7d 0a 7d 20 7b 6e 75  LT"));.  }.} {nu
6770: 6c 6c 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  ll}.do_test func
6780: 2d 32 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  -21.5 {.  execsq
6790: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74  l {.    SELECT t
67a0: 79 70 65 6f 66 28 72 65 70 6c 61 63 65 28 22 54  ypeof(replace("T
67b0: 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20  his is the main 
67c0: 74 65 73 74 20 73 74 72 69 6e 67 22 2c 20 22 6d  test string", "m
67d0: 61 69 6e 22 2c 20 4e 55 4c 4c 29 29 3b 0a 20 20  ain", NULL));.  
67e0: 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64 6f 5f 74 65  }.} {null}.do_te
67f0: 73 74 20 66 75 6e 63 2d 32 31 2e 36 20 7b 0a 20  st func-21.6 {. 
6800: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
6810: 45 4c 45 43 54 20 72 65 70 6c 61 63 65 28 22 54  ELECT replace("T
6820: 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20  his is the main 
6830: 74 65 73 74 20 73 74 72 69 6e 67 22 2c 20 22 6d  test string", "m
6840: 61 69 6e 22 2c 20 22 41 4c 54 22 29 3b 0a 20 20  ain", "ALT");.  
6850: 7d 0a 7d 20 7b 7b 54 68 69 73 20 69 73 20 74 68  }.} {{This is th
6860: 65 20 41 4c 54 20 74 65 73 74 20 73 74 72 69 6e  e ALT test strin
6870: 67 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  g}}.do_test func
6880: 2d 32 31 2e 37 20 7b 0a 20 20 65 78 65 63 73 71  -21.7 {.  execsq
6890: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72  l {.    SELECT r
68a0: 65 70 6c 61 63 65 28 22 54 68 69 73 20 69 73 20  eplace("This is 
68b0: 74 68 65 20 6d 61 69 6e 20 74 65 73 74 20 73 74  the main test st
68c0: 72 69 6e 67 22 2c 20 22 6d 61 69 6e 22 2c 20 22  ring", "main", "
68d0: 6c 61 72 67 65 72 2d 6d 61 69 6e 22 29 3b 0a 20  larger-main");. 
68e0: 20 7d 0a 7d 20 7b 7b 54 68 69 73 20 69 73 20 74   }.} {{This is t
68f0: 68 65 20 6c 61 72 67 65 72 2d 6d 61 69 6e 20 74  he larger-main t
6900: 65 73 74 20 73 74 72 69 6e 67 7d 7d 0a 64 6f 5f  est string}}.do_
6910: 74 65 73 74 20 66 75 6e 63 2d 32 31 2e 38 20 7b  test func-21.8 {
6920: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6930: 20 53 45 4c 45 43 54 20 72 65 70 6c 61 63 65 28   SELECT replace(
6940: 22 61 61 61 61 61 61 61 22 2c 20 22 61 22 2c 20  "aaaaaaa", "a", 
6950: 22 30 31 32 33 34 35 36 37 38 39 22 29 3b 0a 20  "0123456789");. 
6960: 20 7d 0a 7d 20 7b 30 31 32 33 34 35 36 37 38 39   }.} {0123456789
6970: 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35  0123456789012345
6980: 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31  6789012345678901
6990: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
69a0: 38 39 30 31 32 33 34 35 36 37 38 39 7d 0a 0a 69  890123456789}..i
69b0: 66 63 61 70 61 62 6c 65 20 74 63 6c 76 61 72 20  fcapable tclvar 
69c0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63  {.  do_test func
69d0: 2d 32 31 2e 39 20 7b 0a 20 20 20 20 23 20 41 74  -21.9 {.    # At
69e0: 74 65 6d 70 74 20 74 6f 20 65 78 70 6c 6f 69 74  tempt to exploit
69f0: 20 61 20 62 75 66 66 65 72 2d 6f 76 65 72 66 6c   a buffer-overfl
6a00: 6f 77 20 74 68 61 74 20 61 74 20 6f 6e 65 20 74  ow that at one t
6a10: 69 6d 65 20 65 78 69 73 74 65 64 20 0a 20 20 20  ime existed .   
6a20: 20 23 20 69 6e 20 74 68 65 20 52 45 50 4c 41 43   # in the REPLAC
6a30: 45 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 20 20 20  E function. .   
6a40: 20 73 65 74 20 3a 3a 73 74 72 20 22 5b 73 74 72   set ::str "[str
6a50: 69 6e 67 20 72 65 70 65 61 74 20 41 20 32 39 39  ing repeat A 299
6a60: 39 38 5d 43 43 5b 73 74 72 69 6e 67 20 72 65 70  98]CC[string rep
6a70: 65 61 74 20 41 20 33 35 35 33 37 5d 22 0a 20 20  eat A 35537]".  
6a80: 20 20 73 65 74 20 3a 3a 72 65 70 20 5b 73 74 72    set ::rep [str
6a90: 69 6e 67 20 72 65 70 65 61 74 20 42 20 36 35 35  ing repeat B 655
6aa0: 33 36 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  36].    execsql 
6ab0: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 4c  {.      SELECT L
6ac0: 45 4e 47 54 48 28 52 45 50 4c 41 43 45 28 24 3a  ENGTH(REPLACE($:
6ad0: 3a 73 74 72 2c 20 27 43 27 2c 20 24 3a 3a 72 65  :str, 'C', $::re
6ae0: 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 5b  p));.    }.  } [
6af0: 65 78 70 72 20 32 39 39 39 38 20 2b 20 32 2a 36  expr 29998 + 2*6
6b00: 35 35 33 36 20 2b 20 33 35 35 33 37 5d 0a 7d 0a  5536 + 35537].}.
6b10: 0a 23 20 54 65 73 74 73 20 66 6f 72 20 74 68 65  .# Tests for the
6b20: 20 54 52 49 4d 2c 20 4c 54 52 49 4d 20 61 6e 64   TRIM, LTRIM and
6b30: 20 52 54 52 49 4d 20 66 75 6e 63 74 69 6f 6e 73   RTRIM functions
6b40: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  ..#.do_test func
6b50: 2d 32 32 2e 31 20 7b 0a 20 20 63 61 74 63 68 73  -22.1 {.  catchs
6b60: 71 6c 20 7b 53 45 4c 45 43 54 20 74 72 69 6d 28  ql {SELECT trim(
6b70: 31 2c 32 2c 33 29 7d 0a 7d 20 7b 31 20 7b 77 72  1,2,3)}.} {1 {wr
6b80: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
6b90: 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
6ba0: 69 6f 6e 20 74 72 69 6d 28 29 7d 7d 0a 64 6f 5f  ion trim()}}.do_
6bb0: 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 32 20 7b  test func-22.2 {
6bc0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c  .  catchsql {SEL
6bd0: 45 43 54 20 6c 74 72 69 6d 28 31 2c 32 2c 33 29  ECT ltrim(1,2,3)
6be0: 7d 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 6e 75  }.} {1 {wrong nu
6bf0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
6c00: 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 6c 74  s to function lt
6c10: 72 69 6d 28 29 7d 7d 0a 64 6f 5f 74 65 73 74 20  rim()}}.do_test 
6c20: 66 75 6e 63 2d 32 32 2e 33 20 7b 0a 20 20 63 61  func-22.3 {.  ca
6c30: 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 72  tchsql {SELECT r
6c40: 74 72 69 6d 28 31 2c 32 2c 33 29 7d 0a 7d 20 7b  trim(1,2,3)}.} {
6c50: 31 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  1 {wrong number 
6c60: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
6c70: 66 75 6e 63 74 69 6f 6e 20 72 74 72 69 6d 28 29  function rtrim()
6c80: 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  }}.do_test func-
6c90: 32 32 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  22.4 {.  execsql
6ca0: 20 7b 53 45 4c 45 43 54 20 74 72 69 6d 28 27 20   {SELECT trim(' 
6cb0: 20 68 69 20 20 27 29 3b 7d 0a 7d 20 7b 68 69 7d   hi  ');}.} {hi}
6cc0: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32  .do_test func-22
6cd0: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
6ce0: 53 45 4c 45 43 54 20 6c 74 72 69 6d 28 27 20 20  SELECT ltrim('  
6cf0: 68 69 20 20 27 29 3b 7d 0a 7d 20 7b 7b 68 69 20  hi  ');}.} {{hi 
6d00: 20 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63   }}.do_test func
6d10: 2d 32 32 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  -22.6 {.  execsq
6d20: 6c 20 7b 53 45 4c 45 43 54 20 72 74 72 69 6d 28  l {SELECT rtrim(
6d30: 27 20 20 68 69 20 20 27 29 3b 7d 0a 7d 20 7b 7b  '  hi  ');}.} {{
6d40: 20 20 68 69 7d 7d 0a 64 6f 5f 74 65 73 74 20 66    hi}}.do_test f
6d50: 75 6e 63 2d 32 32 2e 37 20 7b 0a 20 20 65 78 65  unc-22.7 {.  exe
6d60: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 74 72 69  csql {SELECT tri
6d70: 6d 28 27 20 20 68 69 20 20 27 2c 27 78 79 7a 27  m('  hi  ','xyz'
6d80: 29 3b 7d 0a 7d 20 7b 7b 20 20 68 69 20 20 7d 7d  );}.} {{  hi  }}
6d90: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32  .do_test func-22
6da0: 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .8 {.  execsql {
6db0: 53 45 4c 45 43 54 20 6c 74 72 69 6d 28 27 20 20  SELECT ltrim('  
6dc0: 68 69 20 20 27 2c 27 78 79 7a 27 29 3b 7d 0a 7d  hi  ','xyz');}.}
6dd0: 20 7b 7b 20 20 68 69 20 20 7d 7d 0a 64 6f 5f 74   {{  hi  }}.do_t
6de0: 65 73 74 20 66 75 6e 63 2d 32 32 2e 39 20 7b 0a  est func-22.9 {.
6df0: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
6e00: 54 20 72 74 72 69 6d 28 27 20 20 68 69 20 20 27  T rtrim('  hi  '
6e10: 2c 27 78 79 7a 27 29 3b 7d 0a 7d 20 7b 7b 20 20  ,'xyz');}.} {{  
6e20: 68 69 20 20 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  hi  }}.do_test f
6e30: 75 6e 63 2d 32 32 2e 31 30 20 7b 0a 20 20 65 78  unc-22.10 {.  ex
6e40: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 74 72  ecsql {SELECT tr
6e50: 69 6d 28 27 78 79 78 7a 79 20 20 68 69 20 20 7a  im('xyxzy  hi  z
6e60: 7a 7a 79 27 2c 27 78 79 7a 27 29 3b 7d 0a 7d 20  zzy','xyz');}.} 
6e70: 7b 7b 20 20 68 69 20 20 7d 7d 0a 64 6f 5f 74 65  {{  hi  }}.do_te
6e80: 73 74 20 66 75 6e 63 2d 32 32 2e 31 31 20 7b 0a  st func-22.11 {.
6e90: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
6ea0: 54 20 6c 74 72 69 6d 28 27 78 79 78 7a 79 20 20  T ltrim('xyxzy  
6eb0: 68 69 20 20 7a 7a 7a 79 27 2c 27 78 79 7a 27 29  hi  zzzy','xyz')
6ec0: 3b 7d 0a 7d 20 7b 7b 20 20 68 69 20 20 7a 7a 7a  ;}.} {{  hi  zzz
6ed0: 79 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  y}}.do_test func
6ee0: 2d 32 32 2e 31 32 20 7b 0a 20 20 65 78 65 63 73  -22.12 {.  execs
6ef0: 71 6c 20 7b 53 45 4c 45 43 54 20 72 74 72 69 6d  ql {SELECT rtrim
6f00: 28 27 78 79 78 7a 79 20 20 68 69 20 20 7a 7a 7a  ('xyxzy  hi  zzz
6f10: 79 27 2c 27 78 79 7a 27 29 3b 7d 0a 7d 20 7b 7b  y','xyz');}.} {{
6f20: 78 79 78 7a 79 20 20 68 69 20 20 7d 7d 0a 64 6f  xyxzy  hi  }}.do
6f30: 5f 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 31 33  _test func-22.13
6f40: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
6f50: 4c 45 43 54 20 74 72 69 6d 28 27 20 20 68 69 20  LECT trim('  hi 
6f60: 20 27 2c 27 27 29 3b 7d 0a 7d 20 7b 7b 20 20 68   ','');}.} {{  h
6f70: 69 20 20 7d 7d 0a 69 66 20 7b 5b 64 62 20 6f 6e  i  }}.if {[db on
6f80: 65 20 7b 50 52 41 47 4d 41 20 65 6e 63 6f 64 69  e {PRAGMA encodi
6f90: 6e 67 7d 5d 3d 3d 22 55 54 46 2d 38 22 7d 20 7b  ng}]=="UTF-8"} {
6fa0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .  do_test func-
6fb0: 32 32 2e 31 34 20 7b 0a 20 20 20 20 65 78 65 63  22.14 {.    exec
6fc0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 68 65 78 28  sql {SELECT hex(
6fd0: 74 72 69 6d 28 78 27 63 32 38 30 65 31 62 66 62  trim(x'c280e1bfb
6fe0: 66 66 34 38 66 62 66 62 66 36 38 36 39 27 2c 78  ff48fbfbf6869',x
6ff0: 27 36 31 36 32 65 31 62 66 62 66 63 32 38 30 27  '6162e1bfbfc280'
7000: 29 29 7d 0a 20 20 7d 20 7b 46 34 38 46 42 46 42  ))}.  } {F48FBFB
7010: 46 36 38 36 39 7d 0a 20 20 64 6f 5f 74 65 73 74  F6869}.  do_test
7020: 20 66 75 6e 63 2d 32 32 2e 31 35 20 7b 0a 20 20   func-22.15 {.  
7030: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
7040: 54 20 68 65 78 28 74 72 69 6d 28 78 27 36 38 36  T hex(trim(x'686
7050: 39 63 32 38 30 65 31 62 66 62 66 66 34 38 66 62  9c280e1bfbff48fb
7060: 66 62 66 36 31 27 2c 0a 20 20 20 20 20 20 20 20  fbf61',.        
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 20 20 20 78 27 36 31 36 32 65 31 62 66 62       x'6162e1bfb
7090: 66 63 32 38 30 66 34 38 66 62 66 62 66 27 29 29  fc280f48fbfbf'))
70a0: 7d 0a 20 20 7d 20 7b 36 38 36 39 7d 0a 20 20 64  }.  } {6869}.  d
70b0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 31  o_test func-22.1
70c0: 36 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  6 {.    execsql 
70d0: 7b 53 45 4c 45 43 54 20 68 65 78 28 74 72 69 6d  {SELECT hex(trim
70e0: 28 78 27 63 65 62 31 63 65 62 32 63 65 62 33 27  (x'ceb1ceb2ceb3'
70f0: 2c 78 27 63 65 62 31 27 29 29 3b 7d 0a 20 20 7d  ,x'ceb1'));}.  }
7100: 20 7b 43 45 42 32 43 45 42 33 7d 0a 7d 0a 64 6f   {CEB2CEB3}.}.do
7110: 5f 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 32 30  _test func-22.20
7120: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
7130: 4c 45 43 54 20 74 79 70 65 6f 66 28 74 72 69 6d  LECT typeof(trim
7140: 28 4e 55 4c 4c 29 29 3b 7d 0a 7d 20 7b 6e 75 6c  (NULL));}.} {nul
7150: 6c 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  l}.do_test func-
7160: 32 32 2e 32 31 20 7b 0a 20 20 65 78 65 63 73 71  22.21 {.  execsq
7170: 6c 20 7b 53 45 4c 45 43 54 20 74 79 70 65 6f 66  l {SELECT typeof
7180: 28 74 72 69 6d 28 4e 55 4c 4c 2c 27 78 79 7a 27  (trim(NULL,'xyz'
7190: 29 29 3b 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64 6f  ));}.} {null}.do
71a0: 5f 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 32 32  _test func-22.22
71b0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
71c0: 4c 45 43 54 20 74 79 70 65 6f 66 28 74 72 69 6d  LECT typeof(trim
71d0: 28 27 68 65 6c 6c 6f 27 2c 4e 55 4c 4c 29 29 3b  ('hello',NULL));
71e0: 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a 0a 23 20 54 68  }.} {null}..# Th
71f0: 69 73 20 69 73 20 74 6f 20 74 65 73 74 20 74 68  is is to test th
7200: 65 20 64 65 70 72 65 63 61 74 65 64 20 73 71 6c  e deprecated sql
7210: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
7220: 6f 75 6e 74 28 29 20 41 50 49 2e 0a 23 0a 69 66  ount() API..#.if
7230: 63 61 70 61 62 6c 65 20 64 65 70 72 65 63 61 74  capable deprecat
7240: 65 64 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66  ed {.  do_test f
7250: 75 6e 63 2d 32 33 2e 31 20 7b 0a 20 20 20 20 73  unc-23.1 {.    s
7260: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67  qlite3_create_ag
7270: 67 72 65 67 61 74 65 20 64 62 0a 20 20 20 20 65  gregate db.    e
7280: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
7290: 45 4c 45 43 54 20 6c 65 67 61 63 79 5f 63 6f 75  ELECT legacy_cou
72a0: 6e 74 28 29 20 46 52 4f 4d 20 74 36 3b 0a 20 20  nt() FROM t6;.  
72b0: 20 20 7d 0a 20 20 7d 20 7b 33 7d 0a 7d 0a 0a 23    }.  } {3}.}..#
72c0: 20 54 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61   The group_conca
72d0: 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a  t() function..#.
72e0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 34 2e  do_test func-24.
72f0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
7300: 20 20 20 20 53 45 4c 45 43 54 20 67 72 6f 75 70      SELECT group
7310: 5f 63 6f 6e 63 61 74 28 74 31 29 20 46 52 4f 4d  _concat(t1) FROM
7320: 20 74 62 6c 31 0a 20 20 7d 0a 7d 20 7b 74 68 69   tbl1.  }.} {thi
7330: 73 2c 70 72 6f 67 72 61 6d 2c 69 73 2c 66 72 65  s,program,is,fre
7340: 65 2c 73 6f 66 74 77 61 72 65 7d 0a 64 6f 5f 74  e,software}.do_t
7350: 65 73 74 20 66 75 6e 63 2d 32 34 2e 32 20 7b 0a  est func-24.2 {.
7360: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
7370: 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e  SELECT group_con
7380: 63 61 74 28 74 31 2c 27 20 27 29 20 46 52 4f 4d  cat(t1,' ') FROM
7390: 20 74 62 6c 31 0a 20 20 7d 0a 7d 20 7b 7b 74 68   tbl1.  }.} {{th
73a0: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 72  is program is fr
73b0: 65 65 20 73 6f 66 74 77 61 72 65 7d 7d 0a 64 6f  ee software}}.do
73c0: 5f 74 65 73 74 20 66 75 6e 63 2d 32 34 2e 33 20  _test func-24.3 
73d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
73e0: 20 20 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63    SELECT group_c
73f0: 6f 6e 63 61 74 28 74 31 2c 27 20 27 20 7c 7c 20  oncat(t1,' ' || 
7400: 72 6f 77 69 64 20 7c 7c 20 27 20 27 29 20 46 52  rowid || ' ') FR
7410: 4f 4d 20 74 62 6c 31 0a 20 20 7d 0a 7d 20 7b 7b  OM tbl1.  }.} {{
7420: 74 68 69 73 20 32 20 70 72 6f 67 72 61 6d 20 33  this 2 program 3
7430: 20 69 73 20 34 20 66 72 65 65 20 35 20 73 6f 66   is 4 free 5 sof
7440: 74 77 61 72 65 7d 7d 0a 64 6f 5f 74 65 73 74 20  tware}}.do_test 
7450: 66 75 6e 63 2d 32 34 2e 34 20 7b 0a 20 20 65 78  func-24.4 {.  ex
7460: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
7470: 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  CT group_concat(
7480: 4e 55 4c 4c 2c 74 31 29 20 46 52 4f 4d 20 74 62  NULL,t1) FROM tb
7490: 6c 31 0a 20 20 7d 0a 7d 20 7b 7b 7d 7d 0a 64 6f  l1.  }.} {{}}.do
74a0: 5f 74 65 73 74 20 66 75 6e 63 2d 32 34 2e 35 20  _test func-24.5 
74b0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
74c0: 20 20 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63    SELECT group_c
74d0: 6f 6e 63 61 74 28 74 31 2c 4e 55 4c 4c 29 20 46  oncat(t1,NULL) F
74e0: 52 4f 4d 20 74 62 6c 31 0a 20 20 7d 0a 7d 20 7b  ROM tbl1.  }.} {
74f0: 74 68 69 73 70 72 6f 67 72 61 6d 69 73 66 72 65  thisprogramisfre
7500: 65 73 6f 66 74 77 61 72 65 7d 0a 64 6f 5f 74 65  esoftware}.do_te
7510: 73 74 20 66 75 6e 63 2d 32 34 2e 36 20 7b 0a 20  st func-24.6 {. 
7520: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
7530: 45 4c 45 43 54 20 27 42 45 47 49 4e 2d 27 7c 7c  ELECT 'BEGIN-'||
7540: 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 74 31 29  group_concat(t1)
7550: 20 46 52 4f 4d 20 74 62 6c 31 0a 20 20 7d 0a 7d   FROM tbl1.  }.}
7560: 20 7b 42 45 47 49 4e 2d 74 68 69 73 2c 70 72 6f   {BEGIN-this,pro
7570: 67 72 61 6d 2c 69 73 2c 66 72 65 65 2c 73 6f 66  gram,is,free,sof
7580: 74 77 61 72 65 7d 0a 0a 23 20 54 69 63 6b 65 74  tware}..# Ticket
7590: 20 23 33 31 37 39 3a 20 20 4d 61 6b 65 20 73 75   #3179:  Make su
75a0: 72 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  re aggregate fun
75b0: 63 74 69 6f 6e 73 20 63 61 6e 20 74 61 6b 65 20  ctions can take 
75c0: 6d 61 6e 79 20 61 72 67 75 6d 65 6e 74 73 2e 0a  many arguments..
75d0: 23 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 62 75  # None of the bu
75e0: 69 6c 74 2d 69 6e 20 61 67 67 72 65 67 61 74 65  ilt-in aggregate
75f0: 73 20 64 6f 20 74 68 69 73 2c 20 73 6f 20 75 73  s do this, so us
7600: 65 20 74 68 65 20 6d 64 35 73 75 6d 28 29 20 66  e the md5sum() f
7610: 72 6f 6d 20 74 68 65 0a 23 20 74 65 73 74 20 65  rom the.# test e
7620: 78 74 65 6e 73 69 6f 6e 73 2e 0a 23 0a 75 6e 73  xtensions..#.uns
7630: 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 6d  et -nocomplain m
7640: 69 64 61 72 67 73 0a 73 65 74 20 6d 69 64 61 72  idargs.set midar
7650: 67 73 20 7b 7d 0a 75 6e 73 65 74 20 2d 6e 6f 63  gs {}.unset -noc
7660: 6f 6d 70 6c 61 69 6e 20 6d 69 64 72 65 73 0a 73  omplain midres.s
7670: 65 74 20 6d 69 64 72 65 73 20 7b 7d 0a 75 6e 73  et midres {}.uns
7680: 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 72  et -nocomplain r
7690: 65 73 75 6c 74 0a 66 6f 72 20 7b 73 65 74 20 69  esult.for {set i
76a0: 20 31 7d 20 7b 24 69 3c 5b 73 71 6c 69 74 65 33   1} {$i<[sqlite3
76b0: 5f 6c 69 6d 69 74 20 64 62 20 53 51 4c 49 54 45  _limit db SQLITE
76c0: 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
76d0: 41 52 47 20 2d 31 5d 7d 20 7b 69 6e 63 72 20 69  ARG -1]} {incr i
76e0: 7d 20 7b 0a 20 20 61 70 70 65 6e 64 20 6d 69 64  } {.  append mid
76f0: 61 72 67 73 20 2c 27 2f 24 69 27 0a 20 20 61 70  args ,'/$i'.  ap
7700: 70 65 6e 64 20 6d 69 64 72 65 73 20 2f 24 69 0a  pend midres /$i.
7710: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6d 64    set result [md
7720: 35 20 5c 0a 20 20 20 20 20 22 74 68 69 73 24 7b  5 \.     "this${
7730: 6d 69 64 72 65 73 7d 70 72 6f 67 72 61 6d 24 7b  midres}program${
7740: 6d 69 64 72 65 73 7d 69 73 24 7b 6d 69 64 72 65  midres}is${midre
7750: 73 7d 66 72 65 65 24 7b 6d 69 64 72 65 73 7d 73  s}free${midres}s
7760: 6f 66 74 77 61 72 65 24 7b 6d 69 64 72 65 73 7d  oftware${midres}
7770: 22 5d 0a 20 20 73 65 74 20 73 71 6c 20 22 53 45  "].  set sql "SE
7780: 4c 45 43 54 20 6d 64 35 73 75 6d 28 74 31 24 6d  LECT md5sum(t1$m
7790: 69 64 61 72 67 73 29 20 46 52 4f 4d 20 74 62 6c  idargs) FROM tbl
77a0: 31 22 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e  1".  do_test fun
77b0: 63 2d 32 34 2e 37 2e 24 69 20 7b 0a 20 20 20 20  c-24.7.$i {.    
77c0: 20 64 62 20 65 76 61 6c 20 24 3a 3a 73 71 6c 0a   db eval $::sql.
77d0: 20 20 7d 20 24 72 65 73 75 6c 74 0a 7d 0a 0a 23    } $result.}..#
77e0: 20 54 69 63 6b 65 74 20 23 33 38 30 36 2e 20 20   Ticket #3806.  
77f0: 49 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73  If the initial s
7800: 74 72 69 6e 67 20 69 6e 20 61 20 67 72 6f 75 70  tring in a group
7810: 5f 63 6f 6e 63 61 74 20 69 73 20 61 6e 20 65 6d  _concat is an em
7820: 70 74 79 0a 23 20 73 74 72 69 6e 67 2c 20 74 68  pty.# string, th
7830: 65 20 73 65 70 61 72 61 74 6f 72 20 74 68 61 74  e separator that
7840: 20 66 6f 6c 6c 6f 77 73 20 73 68 6f 75 6c 64 20   follows should 
7850: 73 74 69 6c 6c 20 62 65 20 70 72 65 73 65 6e 74  still be present
7860: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  ..#.do_test func
7870: 2d 32 34 2e 38 20 7b 0a 20 20 65 78 65 63 73 71  -24.8 {.  execsq
7880: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 67  l {.    SELECT g
7890: 72 6f 75 70 5f 63 6f 6e 63 61 74 28 43 41 53 45  roup_concat(CASE
78a0: 20 74 31 20 57 48 45 4e 20 27 74 68 69 73 27 20   t1 WHEN 'this' 
78b0: 54 48 45 4e 20 27 27 20 45 4c 53 45 20 74 31 20  THEN '' ELSE t1 
78c0: 45 4e 44 29 20 46 52 4f 4d 20 74 62 6c 31 0a 20  END) FROM tbl1. 
78d0: 20 7d 0a 7d 20 7b 2c 70 72 6f 67 72 61 6d 2c 69   }.} {,program,i
78e0: 73 2c 66 72 65 65 2c 73 6f 66 74 77 61 72 65 7d  s,free,software}
78f0: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 34  .do_test func-24
7900: 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .9 {.  execsql {
7910: 0a 20 20 20 20 53 45 4c 45 43 54 20 67 72 6f 75  .    SELECT grou
7920: 70 5f 63 6f 6e 63 61 74 28 43 41 53 45 20 57 48  p_concat(CASE WH
7930: 45 4e 20 74 31 21 3d 27 73 6f 66 74 77 61 72 65  EN t1!='software
7940: 27 20 54 48 45 4e 20 27 27 20 45 4c 53 45 20 74  ' THEN '' ELSE t
7950: 31 20 45 4e 44 29 20 46 52 4f 4d 20 74 62 6c 31  1 END) FROM tbl1
7960: 0a 20 20 7d 0a 7d 20 7b 2c 2c 2c 2c 73 6f 66 74  .  }.} {,,,,soft
7970: 77 61 72 65 7d 0a 0a 23 20 54 69 63 6b 65 74 20  ware}..# Ticket 
7980: 23 33 39 32 33 2e 20 20 49 6e 69 74 69 61 6c 20  #3923.  Initial 
7990: 65 6d 70 74 79 20 73 74 72 69 6e 67 73 20 68 61  empty strings ha
79a0: 76 65 20 61 20 73 65 70 61 72 61 74 6f 72 2e 20  ve a separator. 
79b0: 20 42 75 74 20 69 6e 69 74 69 61 6c 0a 23 20 4e   But initial.# N
79c0: 55 4c 4c 73 20 64 6f 20 6e 6f 74 2e 0a 23 0a 64  ULLs do not..#.d
79d0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 34 2e 31  o_test func-24.1
79e0: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  0 {.  execsql {.
79f0: 20 20 20 20 53 45 4c 45 43 54 20 67 72 6f 75 70      SELECT group
7a00: 5f 63 6f 6e 63 61 74 28 43 41 53 45 20 74 31 20  _concat(CASE t1 
7a10: 57 48 45 4e 20 27 74 68 69 73 27 20 54 48 45 4e  WHEN 'this' THEN
7a20: 20 6e 75 6c 6c 20 45 4c 53 45 20 74 31 20 45 4e   null ELSE t1 EN
7a30: 44 29 20 46 52 4f 4d 20 74 62 6c 31 0a 20 20 7d  D) FROM tbl1.  }
7a40: 0a 7d 20 7b 70 72 6f 67 72 61 6d 2c 69 73 2c 66  .} {program,is,f
7a50: 72 65 65 2c 73 6f 66 74 77 61 72 65 7d 0a 64 6f  ree,software}.do
7a60: 5f 74 65 73 74 20 66 75 6e 63 2d 32 34 2e 31 31  _test func-24.11
7a70: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
7a80: 20 20 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63    SELECT group_c
7a90: 6f 6e 63 61 74 28 43 41 53 45 20 57 48 45 4e 20  oncat(CASE WHEN 
7aa0: 74 31 21 3d 27 73 6f 66 74 77 61 72 65 27 20 54  t1!='software' T
7ab0: 48 45 4e 20 6e 75 6c 6c 20 45 4c 53 45 20 74 31  HEN null ELSE t1
7ac0: 20 45 4e 44 29 20 46 52 4f 4d 20 74 62 6c 31 0a   END) FROM tbl1.
7ad0: 20 20 7d 0a 7d 20 7b 73 6f 66 74 77 61 72 65 7d    }.} {software}
7ae0: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 34  .do_test func-24
7af0: 2e 31 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .12 {.  execsql 
7b00: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 67 72 6f  {.    SELECT gro
7b10: 75 70 5f 63 6f 6e 63 61 74 28 43 41 53 45 20 74  up_concat(CASE t
7b20: 31 20 57 48 45 4e 20 27 74 68 69 73 27 20 54 48  1 WHEN 'this' TH
7b30: 45 4e 20 27 27 0a 20 20 20 20 20 20 20 20 20 20  EN ''.          
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b50: 57 48 45 4e 20 27 70 72 6f 67 72 61 6d 27 20 54  WHEN 'program' T
7b60: 48 45 4e 20 6e 75 6c 6c 20 45 4c 53 45 20 74 31  HEN null ELSE t1
7b70: 20 45 4e 44 29 20 46 52 4f 4d 20 74 62 6c 31 0a   END) FROM tbl1.
7b80: 20 20 7d 0a 7d 20 7b 2c 69 73 2c 66 72 65 65 2c    }.} {,is,free,
7b90: 73 6f 66 74 77 61 72 65 7d 0a 23 20 54 65 73 74  software}.# Test
7ba0: 73 20 74 6f 20 76 65 72 69 66 79 20 74 69 63 6b  s to verify tick
7bb0: 65 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71  et http://www.sq
7bc0: 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 74 6b 74  lite.org/src/tkt
7bd0: 76 69 65 77 2f 35 35 37 34 36 66 39 65 36 35 66  view/55746f9e65f
7be0: 38 35 38 37 63 30 0a 64 6f 5f 74 65 73 74 20 66  8587c0.do_test f
7bf0: 75 6e 63 2d 32 34 2e 31 33 20 7b 0a 20 20 65 78  unc-24.13 {.  ex
7c00: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
7c10: 43 54 20 74 79 70 65 6f 66 28 67 72 6f 75 70 5f  CT typeof(group_
7c20: 63 6f 6e 63 61 74 28 78 29 29 20 46 52 4f 4d 20  concat(x)) FROM 
7c30: 28 53 45 4c 45 43 54 20 27 27 20 41 53 20 78 29  (SELECT '' AS x)
7c40: 3b 0a 20 20 7d 0a 7d 20 7b 74 65 78 74 7d 0a 64  ;.  }.} {text}.d
7c50: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 34 2e 31  o_test func-24.1
7c60: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
7c70: 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f      SELECT typeo
7c80: 66 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 78  f(group_concat(x
7c90: 2c 27 27 29 29 0a 20 20 20 20 20 20 46 52 4f 4d  ,'')).      FROM
7ca0: 20 28 53 45 4c 45 43 54 20 27 27 20 41 53 20 78   (SELECT '' AS x
7cb0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
7cc0: 54 20 27 27 29 3b 0a 20 20 7d 0a 7d 20 7b 74 65  T '');.  }.} {te
7cd0: 78 74 7d 0a 0a 0a 23 20 55 73 65 20 74 68 65 20  xt}...# Use the 
7ce0: 74 65 73 74 5f 69 73 6f 6c 61 74 69 6f 6e 20 66  test_isolation f
7cf0: 75 6e 63 74 69 6f 6e 20 74 6f 20 6d 61 6b 65 20  unction to make 
7d00: 73 75 72 65 20 74 68 61 74 20 74 79 70 65 20 63  sure that type c
7d10: 6f 6e 76 65 72 73 69 6f 6e 73 0a 23 20 6f 6e 20  onversions.# on 
7d20: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
7d30: 74 73 20 64 6f 20 6e 6f 74 20 65 66 66 65 63 74  ts do not effect
7d40: 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75   subsequent argu
7d50: 6d 65 6e 74 73 2e 0a 23 0a 64 6f 5f 74 65 73 74  ments..#.do_test
7d60: 20 66 75 6e 63 2d 32 35 2e 31 20 7b 0a 20 20 65   func-25.1 {.  e
7d70: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 74  xecsql {SELECT t
7d80: 65 73 74 5f 69 73 6f 6c 61 74 69 6f 6e 28 74 31  est_isolation(t1
7d90: 2c 74 31 29 20 46 52 4f 4d 20 74 62 6c 31 7d 0a  ,t1) FROM tbl1}.
7da0: 7d 20 7b 74 68 69 73 20 70 72 6f 67 72 61 6d 20  } {this program 
7db0: 69 73 20 66 72 65 65 20 73 6f 66 74 77 61 72 65  is free software
7dc0: 7d 0a 0a 23 20 54 72 79 20 74 6f 20 6d 69 73 75  }..# Try to misu
7dd0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  se the sqlite3_c
7de0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
7df0: 20 69 6e 74 65 72 66 61 63 65 2e 20 20 56 65 72   interface.  Ver
7e00: 69 66 79 20 74 68 61 74 0a 23 20 65 72 72 6f 72  ify that.# error
7e10: 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 2e 0a  s are returned..
7e20: 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  #.do_test func-2
7e30: 36 2e 31 20 7b 0a 20 20 61 62 75 73 65 5f 63 72  6.1 {.  abuse_cr
7e40: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 64 62  eate_function db
7e50: 0a 7d 20 7b 7d 0a 0a 23 20 54 68 65 20 70 72 65  .} {}..# The pre
7e60: 76 69 6f 75 73 20 74 65 73 74 20 28 66 75 6e 63  vious test (func
7e70: 2d 32 36 2e 31 29 20 72 65 67 69 73 74 65 72 65  -26.1) registere
7e80: 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  d a function wit
7e90: 68 20 61 20 76 65 72 79 20 6c 6f 6e 67 0a 23 20  h a very long.# 
7ea0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 74 68  function name th
7eb0: 61 74 20 74 61 6b 65 73 20 6d 61 6e 79 20 61 72  at takes many ar
7ec0: 67 75 6d 65 6e 74 73 20 61 6e 64 20 61 6c 77 61  guments and alwa
7ed0: 79 73 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ys returns NULL.
7ee0: 20 20 56 65 72 69 66 79 0a 23 20 74 68 61 74 20    Verify.# that 
7ef0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  this function wo
7f00: 72 6b 73 20 63 6f 72 72 65 63 74 6c 79 2e 0a 23  rks correctly..#
7f10: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 36  .do_test func-26
7f20: 2e 32 20 7b 0a 20 20 73 65 74 20 61 20 7b 7d 0a  .2 {.  set a {}.
7f30: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20    for {set i 1} 
7f40: 7b 24 69 3c 3d 24 3a 3a 53 51 4c 49 54 45 5f 4d  {$i<=$::SQLITE_M
7f50: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 7d  AX_FUNCTION_ARG}
7f60: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
7f70: 6c 61 70 70 65 6e 64 20 61 20 24 69 0a 20 20 7d  lappend a $i.  }
7f80: 0a 20 20 64 62 20 65 76 61 6c 20 22 0a 20 20 20  .  db eval ".   
7f90: 20 20 53 45 4c 45 43 54 20 6e 75 6c 6c 78 5f 31    SELECT nullx_1
7fa0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
7fb0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
7fc0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
7fd0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
7fe0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
7ff0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8000: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8010: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8020: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8030: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8040: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8050: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8060: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8070: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8080: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8090: 32 33 34 35 36 37 38 39 28 5b 6a 6f 69 6e 20 24  23456789([join $
80a0: 61 20 2c 5d 29 3b 0a 20 20 22 0a 7d 20 7b 7b 7d  a ,]);.  ".} {{}
80b0: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  }.do_test func-2
80c0: 36 2e 33 20 7b 0a 20 20 73 65 74 20 61 20 7b 7d  6.3 {.  set a {}
80d0: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 31 7d  .  for {set i 1}
80e0: 20 7b 24 69 3c 3d 24 3a 3a 53 51 4c 49 54 45 5f   {$i<=$::SQLITE_
80f0: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
8100: 2b 31 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  +1} {incr i} {. 
8110: 20 20 20 6c 61 70 70 65 6e 64 20 61 20 24 69 0a     lappend a $i.
8120: 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 22    }.  catchsql "
8130: 0a 20 20 20 20 20 53 45 4c 45 43 54 20 6e 75 6c  .     SELECT nul
8140: 6c 78 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  lx_123456789_123
8150: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8160: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8170: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8180: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8190: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
81a0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
81b0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
81c0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
81d0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
81e0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
81f0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8200: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8210: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8220: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8230: 38 39 5f 31 32 33 34 35 36 37 38 39 28 5b 6a 6f  89_123456789([jo
8240: 69 6e 20 24 61 20 2c 5d 29 3b 0a 20 20 22 0a 7d  in $a ,]);.  ".}
8250: 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 61 72   {1 {too many ar
8260: 67 75 6d 65 6e 74 73 20 6f 6e 20 66 75 6e 63 74  guments on funct
8270: 69 6f 6e 20 6e 75 6c 6c 78 5f 31 32 33 34 35 36  ion nullx_123456
8280: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8290: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
82a0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
82b0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
82c0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
82d0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
82e0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
82f0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8300: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8310: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8320: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8330: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8340: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8350: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8360: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8370: 37 38 39 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75  789}}.do_test fu
8380: 6e 63 2d 32 36 2e 34 20 7b 0a 20 20 73 65 74 20  nc-26.4 {.  set 
8390: 61 20 7b 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20  a {}.  for {set 
83a0: 69 20 31 7d 20 7b 24 69 3c 3d 24 3a 3a 53 51 4c  i 1} {$i<=$::SQL
83b0: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
83c0: 5f 41 52 47 2d 31 7d 20 7b 69 6e 63 72 20 69 7d  _ARG-1} {incr i}
83d0: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 61   {.    lappend a
83e0: 20 24 69 0a 20 20 7d 0a 20 20 63 61 74 63 68 73   $i.  }.  catchs
83f0: 71 6c 20 22 0a 20 20 20 20 20 53 45 4c 45 43 54  ql ".     SELECT
8400: 20 6e 75 6c 6c 78 5f 31 32 33 34 35 36 37 38 39   nullx_123456789
8410: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8420: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8430: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8440: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8450: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8460: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8470: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8480: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8490: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
84a0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
84b0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
84c0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
84d0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
84e0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
84f0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8500: 28 5b 6a 6f 69 6e 20 24 61 20 2c 5d 29 3b 0a 20  ([join $a ,]);. 
8510: 20 22 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 6e   ".} {1 {wrong n
8520: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
8530: 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 6e  ts to function n
8540: 75 6c 6c 78 5f 31 32 33 34 35 36 37 38 39 5f 31  ullx_123456789_1
8550: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8560: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8570: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8580: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8590: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
85a0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
85b0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
85c0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
85d0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
85e0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
85f0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8600: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8610: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8620: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8630: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 28 29  6789_123456789()
8640: 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  }}.do_test func-
8650: 32 36 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71  26.5 {.  catchsq
8660: 6c 20 22 0a 20 20 20 20 20 53 45 4c 45 43 54 20  l ".     SELECT 
8670: 6e 75 6c 6c 78 5f 31 32 33 34 35 36 37 38 39 5f  nullx_123456789_
8680: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8690: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
86a0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
86b0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
86c0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
86d0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
86e0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
86f0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8700: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8710: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8720: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8730: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8740: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8750: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8760: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 61 28  56789_12345678a(
8770: 30 29 3b 0a 20 20 22 0a 7d 20 7b 31 20 7b 6e 6f  0);.  ".} {1 {no
8780: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20   such function: 
8790: 6e 75 6c 6c 78 5f 31 32 33 34 35 36 37 38 39 5f  nullx_123456789_
87a0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
87b0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
87c0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
87d0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
87e0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
87f0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8800: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8810: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8820: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8830: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8840: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8850: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8860: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8870: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8880: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 61 7d  56789_12345678a}
8890: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  }.do_test func-2
88a0: 36 2e 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  6.6 {.  catchsql
88b0: 20 22 0a 20 20 20 20 20 53 45 4c 45 43 54 20 6e   ".     SELECT n
88c0: 75 6c 6c 78 5f 31 32 33 34 35 36 37 38 39 5f 31  ullx_123456789_1
88d0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
88e0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
88f0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8900: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8910: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8920: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8930: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8940: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8950: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8960: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8970: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8980: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8990: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
89a0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
89b0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 61 28  6789_123456789a(
89c0: 30 29 3b 0a 20 20 22 0a 7d 20 7b 31 20 7b 6e 6f  0);.  ".} {1 {no
89d0: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20   such function: 
89e0: 6e 75 6c 6c 78 5f 31 32 33 34 35 36 37 38 39 5f  nullx_123456789_
89f0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8a00: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8a10: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8a20: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8a30: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8a40: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8a50: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8a60: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8a70: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8a80: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8a90: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8aa0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8ab0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8ac0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8ad0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 61  56789_123456789a
8ae0: 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  }}..do_test func
8af0: 2d 32 37 2e 31 20 7b 0a 20 20 63 61 74 63 68 73  -27.1 {.  catchs
8b00: 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 61 6c 65  ql {SELECT coale
8b10: 73 63 65 28 29 7d 0a 7d 20 7b 31 20 7b 77 72 6f  sce()}.} {1 {wro
8b20: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
8b30: 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69  uments to functi
8b40: 6f 6e 20 63 6f 61 6c 65 73 63 65 28 29 7d 7d 0a  on coalesce()}}.
8b50: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 37 2e  do_test func-27.
8b60: 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  2 {.  catchsql {
8b70: 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28  SELECT coalesce(
8b80: 31 29 7d 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20  1)}.} {1 {wrong 
8b90: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
8ba0: 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20  nts to function 
8bb0: 63 6f 61 6c 65 73 63 65 28 29 7d 7d 0a 64 6f 5f  coalesce()}}.do_
8bc0: 74 65 73 74 20 66 75 6e 63 2d 32 37 2e 33 20 7b  test func-27.3 {
8bd0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c  .  catchsql {SEL
8be0: 45 43 54 20 63 6f 61 6c 65 73 63 65 28 31 2c 32  ECT coalesce(1,2
8bf0: 29 7d 0a 7d 20 7b 30 20 31 7d 0a 0a 23 20 54 69  )}.} {0 1}..# Ti
8c00: 63 6b 65 74 20 32 64 34 30 31 61 39 34 32 38 37  cket 2d401a94287
8c10: 62 35 0a 23 20 55 6e 6b 6e 6f 77 6e 20 66 75 6e  b5.# Unknown fun
8c20: 63 74 69 6f 6e 20 69 6e 20 61 20 44 45 46 41 55  ction in a DEFAU
8c30: 4c 54 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  LT expression ca
8c40: 75 73 65 73 20 61 20 73 65 67 66 61 75 6c 74 2e  uses a segfault.
8c50: 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .#.do_test func-
8c60: 32 38 2e 31 20 7b 0a 20 20 64 62 20 65 76 61 6c  28.1 {.  db eval
8c70: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
8c80: 42 4c 45 20 74 32 38 28 78 2c 20 79 20 44 45 46  BLE t28(x, y DEF
8c90: 41 55 4c 54 28 6e 6f 73 75 63 68 66 75 6e 63 28  AULT(nosuchfunc(
8ca0: 31 29 29 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63  1)));.  }.  catc
8cb0: 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  hsql {.    INSER
8cc0: 54 20 49 4e 54 4f 20 74 32 38 28 78 29 20 56 41  T INTO t28(x) VA
8cd0: 4c 55 45 53 28 31 29 3b 0a 20 20 7d 0a 7d 20 7b  LUES(1);.  }.} {
8ce0: 31 20 7b 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74  1 {unknown funct
8cf0: 69 6f 6e 3a 20 6e 6f 73 75 63 68 66 75 6e 63 28  ion: nosuchfunc(
8d00: 29 7d 7d 0a 0a 23 20 56 65 72 69 66 79 20 74 68  )}}..# Verify th
8d10: 61 74 20 74 68 65 20 6c 65 6e 67 74 68 28 29 20  at the length() 
8d20: 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e  and typeof() fun
8d30: 63 74 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 61 63  ctions do not ac
8d40: 74 75 61 6c 6c 79 20 6c 6f 61 64 0a 23 20 74 68  tually load.# th
8d50: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
8d60: 69 72 20 61 72 67 75 6d 65 6e 74 2e 0a 23 0a 64  ir argument..#.d
8d70: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 39 2e 31  o_test func-29.1
8d80: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20   {.  db eval {. 
8d90: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
8da0: 74 32 39 28 69 64 20 49 4e 54 45 47 45 52 20 50  t29(id INTEGER P
8db0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 78 2c 20 79  RIMARY KEY, x, y
8dc0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
8dd0: 54 4f 20 74 32 39 20 56 41 4c 55 45 53 28 31 2c  TO t29 VALUES(1,
8de0: 20 32 2c 20 33 29 2c 20 28 32 2c 20 4e 55 4c 4c   2, 3), (2, NULL
8df0: 2c 20 34 29 2c 20 28 33 2c 20 34 2e 35 2c 20 35  , 4), (3, 4.5, 5
8e00: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
8e10: 54 4f 20 74 32 39 20 56 41 4c 55 45 53 28 34 2c  TO t29 VALUES(4,
8e20: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30   randomblob(1000
8e30: 30 30 30 29 2c 20 36 29 3b 0a 20 20 20 20 49 4e  000), 6);.    IN
8e40: 53 45 52 54 20 49 4e 54 4f 20 74 32 39 20 56 41  SERT INTO t29 VA
8e50: 4c 55 45 53 28 35 2c 20 22 68 65 6c 6c 6f 22 2c  LUES(5, "hello",
8e60: 20 37 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c   7);.  }.  db cl
8e70: 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62  ose.  sqlite3 db
8e80: 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74   test.db.  sqlit
8e90: 65 33 5f 64 62 5f 73 74 61 74 75 73 20 64 62 20  e3_db_status db 
8ea0: 43 41 43 48 45 5f 4d 49 53 53 20 31 0a 20 20 64  CACHE_MISS 1.  d
8eb0: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 74  b eval {SELECT t
8ec0: 79 70 65 6f 66 28 78 29 2c 20 6c 65 6e 67 74 68  ypeof(x), length
8ed0: 28 78 29 2c 20 74 79 70 65 6f 66 28 79 29 20 46  (x), typeof(y) F
8ee0: 52 4f 4d 20 74 32 39 20 4f 52 44 45 52 20 42 59  ROM t29 ORDER BY
8ef0: 20 69 64 7d 0a 7d 20 7b 69 6e 74 65 67 65 72 20   id}.} {integer 
8f00: 31 20 69 6e 74 65 67 65 72 20 6e 75 6c 6c 20 7b  1 integer null {
8f10: 7d 20 69 6e 74 65 67 65 72 20 72 65 61 6c 20 33  } integer real 3
8f20: 20 69 6e 74 65 67 65 72 20 62 6c 6f 62 20 31 30   integer blob 10
8f30: 30 30 30 30 30 20 69 6e 74 65 67 65 72 20 74 65  00000 integer te
8f40: 78 74 20 35 20 69 6e 74 65 67 65 72 7d 0a 64 6f  xt 5 integer}.do
8f50: 5f 74 65 73 74 20 66 75 6e 63 2d 32 39 2e 32 20  _test func-29.2 
8f60: 7b 0a 20 20 73 65 74 20 78 20 5b 6c 69 6e 64 65  {.  set x [linde
8f70: 78 20 5b 73 71 6c 69 74 65 33 5f 64 62 5f 73 74  x [sqlite3_db_st
8f80: 61 74 75 73 20 64 62 20 43 41 43 48 45 5f 4d 49  atus db CACHE_MI
8f90: 53 53 20 31 5d 20 31 5d 0a 20 20 69 66 20 7b 24  SS 1] 1].  if {$
8fa0: 78 3c 35 7d 20 7b 73 65 74 20 78 20 31 7d 0a 20  x<5} {set x 1}. 
8fb0: 20 73 65 74 20 78 0a 7d 20 7b 31 7d 0a 64 6f 5f   set x.} {1}.do_
8fc0: 74 65 73 74 20 66 75 6e 63 2d 32 39 2e 33 20 7b  test func-29.3 {
8fd0: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71  .  db close.  sq
8fe0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
8ff0: 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74  .  sqlite3_db_st
9000: 61 74 75 73 20 64 62 20 43 41 43 48 45 5f 4d 49  atus db CACHE_MI
9010: 53 53 20 31 0a 20 20 64 62 20 65 76 61 6c 20 7b  SS 1.  db eval {
9020: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 2b 78  SELECT typeof(+x
9030: 29 20 46 52 4f 4d 20 74 32 39 20 4f 52 44 45 52  ) FROM t29 ORDER
9040: 20 42 59 20 69 64 7d 0a 7d 20 7b 69 6e 74 65 67   BY id}.} {integ
9050: 65 72 20 6e 75 6c 6c 20 72 65 61 6c 20 62 6c 6f  er null real blo
9060: 62 20 74 65 78 74 7d 0a 69 66 20 7b 5b 70 65 72  b text}.if {[per
9070: 6d 75 74 61 74 69 6f 6e 5d 20 21 3d 20 22 6d 6d  mutation] != "mm
9080: 61 70 22 7d 20 7b 0a 20 20 69 66 63 61 70 61 62  ap"} {.  ifcapab
9090: 6c 65 20 21 64 69 72 65 63 74 5f 72 65 61 64 20  le !direct_read 
90a0: 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 66 75  {.    do_test fu
90b0: 6e 63 2d 32 39 2e 34 20 7b 0a 20 20 20 20 20 20  nc-29.4 {.      
90c0: 73 65 74 20 78 20 5b 6c 69 6e 64 65 78 20 5b 73  set x [lindex [s
90d0: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
90e0: 20 64 62 20 43 41 43 48 45 5f 4d 49 53 53 20 31   db CACHE_MISS 1
90f0: 5d 20 31 5d 0a 20 20 20 20 20 20 69 66 20 7b 24  ] 1].      if {$
9100: 78 3e 31 30 30 7d 20 7b 73 65 74 20 78 20 6d 61  x>100} {set x ma
9110: 6e 79 7d 0a 20 20 20 20 20 20 73 65 74 20 78 0a  ny}.      set x.
9120: 20 20 20 20 7d 20 7b 6d 61 6e 79 7d 0a 20 20 7d      } {many}.  }
9130: 0a 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .}.do_test func-
9140: 32 39 2e 35 20 7b 0a 20 20 64 62 20 63 6c 6f 73  29.5 {.  db clos
9150: 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  e.  sqlite3 db t
9160: 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  est.db.  sqlite3
9170: 5f 64 62 5f 73 74 61 74 75 73 20 64 62 20 43 41  _db_status db CA
9180: 43 48 45 5f 4d 49 53 53 20 31 0a 20 20 64 62 20  CHE_MISS 1.  db 
9190: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 73 75 6d  eval {SELECT sum
91a0: 28 6c 65 6e 67 74 68 28 78 29 29 20 46 52 4f 4d  (length(x)) FROM
91b0: 20 74 32 39 7d 0a 7d 20 7b 31 30 30 30 30 30 39   t29}.} {1000009
91c0: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  }.do_test func-2
91d0: 39 2e 36 20 7b 0a 20 20 73 65 74 20 78 20 5b 6c  9.6 {.  set x [l
91e0: 69 6e 64 65 78 20 5b 73 71 6c 69 74 65 33 5f 64  index [sqlite3_d
91f0: 62 5f 73 74 61 74 75 73 20 64 62 20 43 41 43 48  b_status db CACH
9200: 45 5f 4d 49 53 53 20 31 5d 20 31 5d 0a 20 20 69  E_MISS 1] 1].  i
9210: 66 20 7b 24 78 3c 35 7d 20 7b 73 65 74 20 78 20  f {$x<5} {set x 
9220: 31 7d 0a 20 20 73 65 74 20 78 0a 7d 20 7b 31 7d  1}.  set x.} {1}
9230: 0a 0a 23 20 54 68 65 20 4f 50 5f 43 6f 6c 75 6d  ..# The OP_Colum
9240: 6e 20 6f 70 63 6f 64 65 20 68 61 73 20 61 6e 20  n opcode has an 
9250: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61  optimization tha
9260: 74 20 61 76 6f 69 64 73 20 6c 6f 61 64 69 6e 67  t avoids loading
9270: 20 63 6f 6e 74 65 6e 74 0a 23 20 66 6f 72 20 66   content.# for f
9280: 69 65 6c 64 73 20 77 69 74 68 20 63 6f 6e 74 65  ields with conte
9290: 6e 74 2d 6c 65 6e 67 74 68 3d 30 20 77 68 65 6e  nt-length=0 when
92a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 66   the content off
92b0: 73 65 74 20 69 73 20 6f 6e 20 61 6e 20 6f 76 65  set is on an ove
92c0: 72 66 6c 6f 77 0a 23 20 70 61 67 65 2e 20 20 4d  rflow.# page.  M
92d0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 70 74  ake sure the opt
92e0: 69 6d 69 7a 61 74 69 6f 6e 20 77 6f 72 6b 73 2e  imization works.
92f0: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
9300: 73 74 20 66 75 6e 63 2d 32 39 2e 31 30 20 7b 0a  st func-29.10 {.
9310: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
9320: 32 39 62 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 2c  29b(a,b,c,d,e,f,
9330: 67 2c 68 2c 69 29 3b 0a 20 20 49 4e 53 45 52 54  g,h,i);.  INSERT
9340: 20 49 4e 54 4f 20 74 32 39 62 20 0a 20 20 20 56   INTO t29b .   V
9350: 41 4c 55 45 53 28 31 2c 20 68 65 78 28 72 61 6e  ALUES(1, hex(ran
9360: 64 6f 6d 62 6c 6f 62 28 32 30 30 30 29 29 2c 20  domblob(2000)), 
9370: 6e 75 6c 6c 2c 20 30 2c 20 31 2c 20 27 27 2c 20  null, 0, 1, '', 
9380: 7a 65 72 6f 62 6c 6f 62 28 30 29 2c 27 78 27 2c  zeroblob(0),'x',
9390: 78 27 30 31 27 29 3b 0a 20 20 53 45 4c 45 43 54  x'01');.  SELECT
93a0: 20 74 79 70 65 6f 66 28 63 29 2c 20 74 79 70 65   typeof(c), type
93b0: 6f 66 28 64 29 2c 20 74 79 70 65 6f 66 28 65 29  of(d), typeof(e)
93c0: 2c 20 74 79 70 65 6f 66 28 66 29 2c 0a 20 20 20  , typeof(f),.   
93d0: 20 20 20 20 20 20 74 79 70 65 6f 66 28 67 29 2c        typeof(g),
93e0: 20 74 79 70 65 6f 66 28 68 29 2c 20 74 79 70 65   typeof(h), type
93f0: 6f 66 28 69 29 20 46 52 4f 4d 20 74 32 39 62 3b  of(i) FROM t29b;
9400: 0a 7d 20 7b 6e 75 6c 6c 20 69 6e 74 65 67 65 72  .} {null integer
9410: 20 69 6e 74 65 67 65 72 20 74 65 78 74 20 62 6c   integer text bl
9420: 6f 62 20 74 65 78 74 20 62 6c 6f 62 7d 0a 64 6f  ob text blob}.do
9430: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 66 75  _execsql_test fu
9440: 6e 63 2d 32 39 2e 31 31 20 7b 0a 20 20 53 45 4c  nc-29.11 {.  SEL
9450: 45 43 54 20 6c 65 6e 67 74 68 28 66 29 2c 20 6c  ECT length(f), l
9460: 65 6e 67 74 68 28 67 29 2c 20 6c 65 6e 67 74 68  ength(g), length
9470: 28 68 29 2c 20 6c 65 6e 67 74 68 28 69 29 20 46  (h), length(i) F
9480: 52 4f 4d 20 74 32 39 62 3b 0a 7d 20 7b 30 20 30  ROM t29b;.} {0 0
9490: 20 31 20 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   1 1}.do_execsql
94a0: 5f 74 65 73 74 20 66 75 6e 63 2d 32 39 2e 31 32  _test func-29.12
94b0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 71 75 6f 74   {.  SELECT quot
94c0: 65 28 66 29 2c 20 71 75 6f 74 65 28 67 29 2c 20  e(f), quote(g), 
94d0: 71 75 6f 74 65 28 68 29 2c 20 71 75 6f 74 65 28  quote(h), quote(
94e0: 69 29 20 46 52 4f 4d 20 74 32 39 62 3b 0a 7d 20  i) FROM t29b;.} 
94f0: 7b 27 27 20 58 27 27 20 27 78 27 20 58 27 30 31  {'' X'' 'x' X'01
9500: 27 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  '}..# EVIDENCE-O
9510: 46 3a 20 52 2d 32 39 37 30 31 2d 35 30 37 31 31  F: R-29701-50711
9520: 20 54 68 65 20 75 6e 69 63 6f 64 65 28 58 29 20   The unicode(X) 
9530: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
9540: 20 74 68 65 20 6e 75 6d 65 72 69 63 0a 23 20 75   the numeric.# u
9550: 6e 69 63 6f 64 65 20 63 6f 64 65 20 70 6f 69 6e  nicode code poin
9560: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
9570: 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 68 61  to the first cha
9580: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 73 74  racter of the st
9590: 72 69 6e 67 0a 23 20 58 2e 0a 23 0a 23 20 45 56  ring.# X..#.# EV
95a0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 34  IDENCE-OF: R-554
95b0: 36 39 2d 36 32 31 33 30 20 54 68 65 20 63 68 61  69-62130 The cha
95c0: 72 28 58 31 2c 58 32 2c 2e 2e 2e 2c 58 4e 29 20  r(X1,X2,...,XN) 
95d0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
95e0: 20 61 0a 23 20 73 74 72 69 6e 67 20 63 6f 6d 70   a.# string comp
95f0: 6f 73 65 64 20 6f 66 20 63 68 61 72 61 63 74 65  osed of characte
9600: 72 73 20 68 61 76 69 6e 67 20 74 68 65 20 75 6e  rs having the un
9610: 69 63 6f 64 65 20 63 6f 64 65 20 70 6f 69 6e 74  icode code point
9620: 20 76 61 6c 75 65 73 20 6f 66 0a 23 20 69 6e 74   values of.# int
9630: 65 67 65 72 73 20 58 31 20 74 68 72 6f 75 67 68  egers X1 through
9640: 20 58 4e 2c 20 72 65 73 70 65 63 74 69 76 65 6c   XN, respectivel
9650: 79 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  y..#.do_execsql_
9660: 74 65 73 74 20 66 75 6e 63 2d 33 30 2e 31 20 7b  test func-30.1 {
9670: 53 45 4c 45 43 54 20 75 6e 69 63 6f 64 65 28 27  SELECT unicode('
9680: 24 27 29 3b 7d 20 33 36 0a 64 6f 5f 65 78 65 63  $');} 36.do_exec
9690: 73 71 6c 5f 74 65 73 74 20 66 75 6e 63 2d 33 30  sql_test func-30
96a0: 2e 32 20 5b 73 75 62 73 74 20 7b 53 45 4c 45 43  .2 [subst {SELEC
96b0: 54 20 75 6e 69 63 6f 64 65 28 27 5c 75 30 30 41  T unicode('\u00A
96c0: 32 27 29 3b 7d 5d 20 31 36 32 0a 64 6f 5f 65 78  2');}] 162.do_ex
96d0: 65 63 73 71 6c 5f 74 65 73 74 20 66 75 6e 63 2d  ecsql_test func-
96e0: 33 30 2e 33 20 5b 73 75 62 73 74 20 7b 53 45 4c  30.3 [subst {SEL
96f0: 45 43 54 20 75 6e 69 63 6f 64 65 28 27 5c 75 32  ECT unicode('\u2
9700: 30 41 43 27 29 3b 7d 5d 20 38 33 36 34 0a 64 6f  0AC');}] 8364.do
9710: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 66 75  _execsql_test fu
9720: 6e 63 2d 33 30 2e 34 20 7b 53 45 4c 45 43 54 20  nc-30.4 {SELECT 
9730: 63 68 61 72 28 33 36 2c 31 36 32 2c 38 33 36 34  char(36,162,8364
9740: 29 3b 7d 20 5b 73 75 62 73 74 20 7b 24 5c 75 30  );} [subst {$\u0
9750: 30 41 32 5c 75 32 30 41 43 7d 5d 0a 0a 66 6f 72  0A2\u20AC}]..for
9760: 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 3c 30   {set i 1} {$i<0
9770: 78 64 38 30 30 7d 20 7b 69 6e 63 72 20 69 20 31  xd800} {incr i 1
9780: 33 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71  3} {.  do_execsq
9790: 6c 5f 74 65 73 74 20 66 75 6e 63 2d 33 30 2e 35  l_test func-30.5
97a0: 2e 24 69 20 7b 53 45 4c 45 43 54 20 75 6e 69 63  .$i {SELECT unic
97b0: 6f 64 65 28 63 68 61 72 28 24 69 29 29 7d 20 24  ode(char($i))} $
97c0: 69 0a 7d 0a 66 6f 72 20 7b 73 65 74 20 69 20 35  i.}.for {set i 5
97d0: 37 33 34 34 7d 20 7b 24 69 3c 3d 30 78 66 66 66  7344} {$i<=0xfff
97e0: 64 7d 20 7b 69 6e 63 72 20 69 20 31 37 7d 20 7b  d} {incr i 17} {
97f0: 0a 20 20 69 66 20 7b 24 69 3d 3d 30 78 66 65 66  .  if {$i==0xfef
9800: 66 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20 64 6f  f} continue.  do
9810: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 66 75  _execsql_test fu
9820: 6e 63 2d 33 30 2e 35 2e 24 69 20 7b 53 45 4c 45  nc-30.5.$i {SELE
9830: 43 54 20 75 6e 69 63 6f 64 65 28 63 68 61 72 28  CT unicode(char(
9840: 24 69 29 29 7d 20 24 69 0a 7d 0a 66 6f 72 20 7b  $i))} $i.}.for {
9850: 73 65 74 20 69 20 36 35 35 33 36 7d 20 7b 24 69  set i 65536} {$i
9860: 3c 3d 30 78 31 30 66 66 66 66 7d 20 7b 69 6e 63  <=0x10ffff} {inc
9870: 72 20 69 20 31 33 39 7d 20 7b 0a 20 20 64 6f 5f  r i 139} {.  do_
9880: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 66 75 6e  execsql_test fun
9890: 63 2d 33 30 2e 35 2e 24 69 20 7b 53 45 4c 45 43  c-30.5.$i {SELEC
98a0: 54 20 75 6e 69 63 6f 64 65 28 63 68 61 72 28 24  T unicode(char($
98b0: 69 29 29 7d 20 24 69 0a 7d 0a 0a 23 20 54 65 73  i))} $i.}..# Tes
98c0: 74 20 63 68 61 72 28 29 2e 0a 23 0a 64 6f 5f 65  t char()..#.do_e
98d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 66 75 6e 63  xecsql_test func
98e0: 2d 33 31 2e 31 20 7b 20 0a 20 20 53 45 4c 45 43  -31.1 { .  SELEC
98f0: 54 20 63 68 61 72 28 29 2c 20 6c 65 6e 67 74 68  T char(), length
9900: 28 63 68 61 72 28 29 29 2c 20 74 79 70 65 6f 66  (char()), typeof
9910: 28 63 68 61 72 28 29 29 20 0a 7d 20 7b 7b 7d 20  (char()) .} {{} 
9920: 30 20 74 65 78 74 7d 0a 66 69 6e 69 73 68 5f 74  0 text}.finish_t
9930: 65 73 74 0a                                      est.