/ Hex Artifact Content
Login

Artifact c2cbfc23d554c5bf8678d0fb271aa4f8ef94839c:


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 20 20  6364656667}.}.  
3920: 0a 23 20 55 73 65 20 74 68 65 20 22 73 71 6c 69  .# Use the "sqli
3930: 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74  te_register_test
3940: 5f 66 75 6e 63 74 69 6f 6e 22 20 54 43 4c 20 63  _function" TCL c
3950: 6f 6d 6d 61 6e 64 20 77 68 69 63 68 20 69 73 20  ommand which is 
3960: 70 61 72 74 20 6f 66 0a 23 20 74 68 65 20 74 65  part of.# the te
3970: 78 74 20 66 69 78 74 75 72 65 20 69 6e 20 6f 72  xt fixture in or
3980: 64 65 72 20 74 6f 20 76 65 72 69 66 79 20 63 6f  der to verify co
3990: 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
39a0: 6f 66 20 73 6f 6d 65 20 6f 66 0a 23 20 74 68 65  of some of.# the
39b0: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 53 51   user-defined SQ
39c0: 4c 20 66 75 6e 63 74 69 6f 6e 20 41 50 49 73 20  L function APIs 
39d0: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 75 73 65  that are not use
39e0: 64 20 62 79 20 74 68 65 20 62 75 69 6c 74 2d 69  d by the built-i
39f0: 6e 0a 23 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 23  n.# functions..#
3a00: 0a 73 65 74 20 3a 3a 44 42 20 5b 73 71 6c 69 74  .set ::DB [sqlit
3a10: 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e3_connection_po
3a20: 69 6e 74 65 72 20 64 62 5d 0a 73 71 6c 69 74 65  inter db].sqlite
3a30: 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66  _register_test_f
3a40: 75 6e 63 74 69 6f 6e 20 24 3a 3a 44 42 20 74 65  unction $::DB te
3a50: 73 74 66 75 6e 63 0a 64 6f 5f 74 65 73 74 20 66  stfunc.do_test f
3a60: 75 6e 63 2d 31 30 2e 31 20 7b 0a 20 20 63 61 74  unc-10.1 {.  cat
3a70: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  chsql {.    SELE
3a80: 43 54 20 74 65 73 74 66 75 6e 63 28 4e 55 4c 4c  CT testfunc(NULL
3a90: 2c 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 7d 20 7b 31  ,NULL);.  }.} {1
3aa0: 20 7b 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74   {first argument
3ab0: 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f   should be one o
3ac0: 66 3a 20 69 6e 74 20 69 6e 74 36 34 20 73 74 72  f: int int64 str
3ad0: 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20  ing double null 
3ae0: 76 61 6c 75 65 7d 7d 0a 64 6f 5f 74 65 73 74 20  value}}.do_test 
3af0: 66 75 6e 63 2d 31 30 2e 32 20 7b 0a 20 20 65 78  func-10.2 {.  ex
3b00: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
3b10: 43 54 20 74 65 73 74 66 75 6e 63 28 0a 20 20 20  CT testfunc(.   
3b20: 20 20 27 73 74 72 69 6e 67 27 2c 20 27 61 62 63    'string', 'abc
3b30: 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
3b40: 74 75 76 77 78 79 7a 41 42 43 44 45 46 47 48 49  tuvwxyzABCDEFGHI
3b50: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
3b60: 5a 27 2c 0a 20 20 20 20 20 27 69 6e 74 27 2c 20  Z',.     'int', 
3b70: 31 32 33 34 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  1234.    );.  }.
3b80: 7d 20 7b 31 32 33 34 7d 0a 64 6f 5f 74 65 73 74  } {1234}.do_test
3b90: 20 66 75 6e 63 2d 31 30 2e 33 20 7b 0a 20 20 65   func-10.3 {.  e
3ba0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
3bb0: 45 43 54 20 74 65 73 74 66 75 6e 63 28 0a 20 20  ECT testfunc(.  
3bc0: 20 20 20 27 73 74 72 69 6e 67 27 2c 20 27 61 62     'string', 'ab
3bd0: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
3be0: 73 74 75 76 77 78 79 7a 41 42 43 44 45 46 47 48  stuvwxyzABCDEFGH
3bf0: 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
3c00: 59 5a 27 2c 0a 20 20 20 20 20 27 73 74 72 69 6e  YZ',.     'strin
3c10: 67 27 2c 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a  g', NULL.    );.
3c20: 20 20 7d 0a 7d 20 7b 7b 7d 7d 0a 0a 69 66 63 61    }.} {{}}..ifca
3c30: 70 61 62 6c 65 20 66 6c 6f 61 74 69 6e 67 70 6f  pable floatingpo
3c40: 69 6e 74 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  int {.  do_test 
3c50: 66 75 6e 63 2d 31 30 2e 34 20 7b 0a 20 20 20 20  func-10.4 {.    
3c60: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
3c70: 53 45 4c 45 43 54 20 74 65 73 74 66 75 6e 63 28  SELECT testfunc(
3c80: 0a 20 20 20 20 20 20 20 27 73 74 72 69 6e 67 27  .       'string'
3c90: 2c 20 27 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  , 'abcdefghijklm
3ca0: 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41 42 43  nopqrstuvwxyzABC
3cb0: 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
3cc0: 54 55 56 57 58 59 5a 27 2c 0a 20 20 20 20 20 20  TUVWXYZ',.      
3cd0: 20 27 64 6f 75 62 6c 65 27 2c 20 31 2e 32 33 34   'double', 1.234
3ce0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
3cf0: 20 20 7d 20 7b 31 2e 32 33 34 7d 0a 20 20 64 6f    } {1.234}.  do
3d00: 5f 74 65 73 74 20 66 75 6e 63 2d 31 30 2e 35 20  _test func-10.5 
3d10: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
3d20: 20 20 20 20 20 20 53 45 4c 45 43 54 20 74 65 73        SELECT tes
3d30: 74 66 75 6e 63 28 0a 20 20 20 20 20 20 20 27 73  tfunc(.       's
3d40: 74 72 69 6e 67 27 2c 20 27 61 62 63 64 65 66 67  tring', 'abcdefg
3d50: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
3d60: 78 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d  xyzABCDEFGHIJKLM
3d70: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 27 2c 0a  NOPQRSTUVWXYZ',.
3d80: 20 20 20 20 20 20 20 27 69 6e 74 27 2c 20 31 32         'int', 12
3d90: 33 34 2c 0a 20 20 20 20 20 20 20 27 73 74 72 69  34,.       'stri
3da0: 6e 67 27 2c 20 27 61 62 63 64 65 66 67 68 69 6a  ng', 'abcdefghij
3db0: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
3dc0: 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
3dd0: 51 52 53 54 55 56 57 58 59 5a 27 2c 0a 20 20 20  QRSTUVWXYZ',.   
3de0: 20 20 20 20 27 73 74 72 69 6e 67 27 2c 20 4e 55      'string', NU
3df0: 4c 4c 2c 0a 20 20 20 20 20 20 20 27 73 74 72 69  LL,.       'stri
3e00: 6e 67 27 2c 20 27 61 62 63 64 65 66 67 68 69 6a  ng', 'abcdefghij
3e10: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
3e20: 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
3e30: 51 52 53 54 55 56 57 58 59 5a 27 2c 0a 20 20 20  QRSTUVWXYZ',.   
3e40: 20 20 20 20 27 64 6f 75 62 6c 65 27 2c 20 31 2e      'double', 1.
3e50: 32 33 34 2c 0a 20 20 20 20 20 20 20 27 73 74 72  234,.       'str
3e60: 69 6e 67 27 2c 20 27 61 62 63 64 65 66 67 68 69  ing', 'abcdefghi
3e70: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
3e80: 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  zABCDEFGHIJKLMNO
3e90: 50 51 52 53 54 55 56 57 58 59 5a 27 2c 0a 20 20  PQRSTUVWXYZ',.  
3ea0: 20 20 20 20 20 27 69 6e 74 27 2c 20 31 32 33 34       'int', 1234
3eb0: 2c 0a 20 20 20 20 20 20 20 27 73 74 72 69 6e 67  ,.       'string
3ec0: 27 2c 20 27 61 62 63 64 65 66 67 68 69 6a 6b 6c  ', 'abcdefghijkl
3ed0: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41 42  mnopqrstuvwxyzAB
3ee0: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
3ef0: 53 54 55 56 57 58 59 5a 27 2c 0a 20 20 20 20 20  STUVWXYZ',.     
3f00: 20 20 27 73 74 72 69 6e 67 27 2c 20 4e 55 4c 4c    'string', NULL
3f10: 2c 0a 20 20 20 20 20 20 20 27 73 74 72 69 6e 67  ,.       'string
3f20: 27 2c 20 27 61 62 63 64 65 66 67 68 69 6a 6b 6c  ', 'abcdefghijkl
3f30: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41 42  mnopqrstuvwxyzAB
3f40: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
3f50: 53 54 55 56 57 58 59 5a 27 2c 0a 20 20 20 20 20  STUVWXYZ',.     
3f60: 20 20 27 64 6f 75 62 6c 65 27 2c 20 31 2e 32 33    'double', 1.23
3f70: 34 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  4.      );.    }
3f80: 0a 20 20 7d 20 7b 31 2e 32 33 34 7d 0a 7d 0a 0a  .  } {1.234}.}..
3f90: 23 20 54 65 73 74 20 74 68 65 20 62 75 69 6c 74  # Test the built
3fa0: 2d 69 6e 20 73 71 6c 69 74 65 5f 76 65 72 73 69  -in sqlite_versi
3fb0: 6f 6e 28 2a 29 20 53 51 4c 20 66 75 6e 63 74 69  on(*) SQL functi
3fc0: 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75  on..#.do_test fu
3fd0: 6e 63 2d 31 31 2e 31 20 7b 0a 20 20 65 78 65 63  nc-11.1 {.  exec
3fe0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
3ff0: 20 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 28   sqlite_version(
4000: 2a 29 3b 0a 20 20 7d 0a 7d 20 5b 73 71 6c 69 74  *);.  }.} [sqlit
4010: 65 33 20 2d 76 65 72 73 69 6f 6e 5d 0a 0a 23 20  e3 -version]..# 
4020: 54 65 73 74 20 74 68 61 74 20 64 65 73 74 72 75  Test that destru
4030: 63 74 6f 72 73 20 70 61 73 73 65 64 20 74 6f 20  ctors passed to 
4040: 73 71 6c 69 74 65 33 20 62 79 20 63 61 6c 6c 73  sqlite3 by calls
4050: 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 73 75   to sqlite3_resu
4060: 6c 74 5f 74 65 78 74 28 29 0a 23 20 65 74 63 2e  lt_text().# etc.
4070: 20 61 72 65 20 63 61 6c 6c 65 64 2e 20 54 68 65   are called. The
4080: 73 65 20 74 65 73 74 73 20 75 73 65 20 74 77 6f  se tests use two
4090: 20 73 70 65 63 69 61 6c 20 75 73 65 72 2d 64 65   special user-de
40a0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 0a  fined functions.
40b0: 23 20 28 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  # (implemented i
40c0: 6e 20 66 75 6e 63 2e 63 29 20 6f 6e 6c 79 20 61  n func.c) only a
40d0: 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 65 73 74  vailable in test
40e0: 20 62 75 69 6c 64 73 2e 20 0a 23 0a 23 20 46 75   builds. .#.# Fu
40f0: 6e 63 74 69 6f 6e 20 74 65 73 74 5f 64 65 73 74  nction test_dest
4100: 72 75 63 74 6f 72 28 29 20 74 61 6b 65 73 20 6f  ructor() takes o
4110: 6e 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  ne argument and 
4120: 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f  returns a copy o
4130: 66 20 74 68 65 0a 23 20 74 65 78 74 20 66 6f 72  f the.# text for
4140: 6d 20 6f 66 20 74 68 61 74 20 61 72 67 75 6d 65  m of that argume
4150: 6e 74 2e 20 41 20 64 65 73 74 72 75 63 74 6f 72  nt. A destructor
4160: 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77   is associated w
4170: 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 0a 23  ith the return.#
4180: 20 76 61 6c 75 65 2e 20 46 75 6e 63 74 69 6f 6e   value. Function
4190: 20 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72   test_destructor
41a0: 5f 63 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73  _count() returns
41b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
41c0: 75 74 73 74 61 6e 64 69 6e 67 0a 23 20 64 65 73  utstanding.# des
41d0: 74 72 75 63 74 6f 72 20 63 61 6c 6c 73 20 66 6f  tructor calls fo
41e0: 72 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  r values returne
41f0: 64 20 62 79 20 74 65 73 74 5f 64 65 73 74 72 75  d by test_destru
4200: 63 74 6f 72 28 29 2e 0a 23 0a 69 66 20 7b 5b 64  ctor()..#.if {[d
4210: 62 20 65 76 61 6c 20 7b 50 52 41 47 4d 41 20 65  b eval {PRAGMA e
4220: 6e 63 6f 64 69 6e 67 7d 5d 3d 3d 22 55 54 46 2d  ncoding}]=="UTF-
4230: 38 22 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  8"} {.  do_test 
4240: 66 75 6e 63 2d 31 32 2e 31 2d 75 74 66 38 20 7b  func-12.1-utf8 {
4250: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
4260: 20 20 20 20 20 53 45 4c 45 43 54 20 74 65 73 74       SELECT test
4270: 5f 64 65 73 74 72 75 63 74 6f 72 28 27 68 65 6c  _destructor('hel
4280: 6c 6f 20 77 6f 72 6c 64 27 29 2c 20 74 65 73 74  lo world'), test
4290: 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e  _destructor_coun
42a0: 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  t();.    }.  } {
42b0: 7b 68 65 6c 6c 6f 20 77 6f 72 6c 64 7d 20 31 7d  {hello world} 1}
42c0: 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66  .} else {.    if
42d0: 63 61 70 61 62 6c 65 20 7b 75 74 66 31 36 7d 20  capable {utf16} 
42e0: 7b 0a 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20  {.      do_test 
42f0: 66 75 6e 63 2d 31 32 2e 31 2d 75 74 66 31 36 20  func-12.1-utf16 
4300: 7b 0a 20 20 20 20 20 20 20 20 65 78 65 63 73 71  {.        execsq
4310: 6c 20 7b 0a 20 20 20 20 20 20 20 20 20 20 53 45  l {.          SE
4320: 4c 45 43 54 20 74 65 73 74 5f 64 65 73 74 72 75  LECT test_destru
4330: 63 74 6f 72 31 36 28 27 68 65 6c 6c 6f 20 77 6f  ctor16('hello wo
4340: 72 6c 64 27 29 2c 20 74 65 73 74 5f 64 65 73 74  rld'), test_dest
4350: 72 75 63 74 6f 72 5f 63 6f 75 6e 74 28 29 3b 0a  ructor_count();.
4360: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4370: 7d 20 7b 7b 68 65 6c 6c 6f 20 77 6f 72 6c 64 7d  } {{hello world}
4380: 20 31 7d 0a 20 20 20 20 7d 0a 7d 0a 64 6f 5f 74   1}.    }.}.do_t
4390: 65 73 74 20 66 75 6e 63 2d 31 32 2e 32 20 7b 0a  est func-12.2 {.
43a0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
43b0: 53 45 4c 45 43 54 20 74 65 73 74 5f 64 65 73 74  SELECT test_dest
43c0: 72 75 63 74 6f 72 5f 63 6f 75 6e 74 28 29 3b 0a  ructor_count();.
43d0: 20 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73    }.} {0}.do_tes
43e0: 74 20 66 75 6e 63 2d 31 32 2e 33 20 7b 0a 20 20  t func-12.3 {.  
43f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
4400: 4c 45 43 54 20 74 65 73 74 5f 64 65 73 74 72 75  LECT test_destru
4410: 63 74 6f 72 28 27 68 65 6c 6c 6f 27 29 7c 7c 27  ctor('hello')||'
4420: 20 77 6f 72 6c 64 27 0a 20 20 7d 0a 7d 20 7b 7b   world'.  }.} {{
4430: 68 65 6c 6c 6f 20 77 6f 72 6c 64 7d 7d 0a 64 6f  hello world}}.do
4440: 5f 74 65 73 74 20 66 75 6e 63 2d 31 32 2e 34 20  _test func-12.4 
4450: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
4460: 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f 64 65    SELECT test_de
4470: 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 28 29  structor_count()
4480: 3b 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74  ;.  }.} {0}.do_t
4490: 65 73 74 20 66 75 6e 63 2d 31 32 2e 35 20 7b 0a  est func-12.5 {.
44a0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
44b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28  CREATE TABLE t4(
44c0: 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x);.    INSERT I
44d0: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 74 65  NTO t4 VALUES(te
44e0: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 28 27 68  st_destructor('h
44f0: 65 6c 6c 6f 27 29 29 3b 0a 20 20 20 20 49 4e 53  ello'));.    INS
4500: 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
4510: 45 53 28 74 65 73 74 5f 64 65 73 74 72 75 63 74  ES(test_destruct
4520: 6f 72 28 27 77 6f 72 6c 64 27 29 29 3b 0a 20 20  or('world'));.  
4530: 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 74 65 73    SELECT min(tes
4540: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 78 29 29  t_destructor(x))
4550: 2c 20 6d 61 78 28 74 65 73 74 5f 64 65 73 74 72  , max(test_destr
4560: 75 63 74 6f 72 28 78 29 29 20 46 52 4f 4d 20 74  uctor(x)) FROM t
4570: 34 3b 0a 20 20 7d 0a 7d 20 7b 68 65 6c 6c 6f 20  4;.  }.} {hello 
4580: 77 6f 72 6c 64 7d 0a 64 6f 5f 74 65 73 74 20 66  world}.do_test f
4590: 75 6e 63 2d 31 32 2e 36 20 7b 0a 20 20 65 78 65  unc-12.6 {.  exe
45a0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
45b0: 54 20 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f  T test_destructo
45c0: 72 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 7d 0a 7d  r_count();.  }.}
45d0: 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e   {0}.do_test fun
45e0: 63 2d 31 32 2e 37 20 7b 0a 20 20 65 78 65 63 73  c-12.7 {.  execs
45f0: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41  ql {.    DROP TA
4600: 42 4c 45 20 74 34 3b 0a 20 20 7d 0a 7d 20 7b 7d  BLE t4;.  }.} {}
4610: 0a 0a 0a 23 20 54 65 73 74 20 74 68 61 74 20 74  ...# Test that t
4620: 68 65 20 61 75 78 64 61 74 61 20 41 50 49 20 66  he auxdata API f
4630: 6f 72 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  or scalar functi
4640: 6f 6e 73 20 77 6f 72 6b 73 2e 20 54 68 69 73 20  ons works. This 
4650: 74 65 73 74 20 75 73 65 73 0a 23 20 61 20 73 70  test uses.# a sp
4660: 65 63 69 61 6c 20 75 73 65 72 2d 64 65 66 69 6e  ecial user-defin
4670: 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79  ed function only
4680: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 65   available in te
4690: 73 74 20 62 75 69 6c 64 73 2c 0a 23 20 74 65 73  st builds,.# tes
46a0: 74 5f 61 75 78 64 61 74 61 28 29 2e 20 46 75 6e  t_auxdata(). Fun
46b0: 63 74 69 6f 6e 20 74 65 73 74 5f 61 75 78 64 61  ction test_auxda
46c0: 74 61 28 29 20 74 61 6b 65 73 20 61 6e 79 20 6e  ta() takes any n
46d0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
46e0: 74 73 2e 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  ts..do_test func
46f0: 2d 31 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -13.1 {.  execsq
4700: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74  l {.    SELECT t
4710: 65 73 74 5f 61 75 78 64 61 74 61 28 27 68 65 6c  est_auxdata('hel
4720: 6c 6f 20 77 6f 72 6c 64 27 29 3b 0a 20 20 7d 0a  lo world');.  }.
4730: 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 66  } {0}..do_test f
4740: 75 6e 63 2d 31 33 2e 32 20 7b 0a 20 20 65 78 65  unc-13.2 {.  exe
4750: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
4760: 45 20 54 41 42 4c 45 20 74 34 28 61 2c 20 62 29  E TABLE t4(a, b)
4770: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4780: 4f 20 74 34 20 56 41 4c 55 45 53 28 27 61 62 63  O t4 VALUES('abc
4790: 27 2c 20 27 64 65 66 27 29 3b 0a 20 20 20 20 49  ', 'def');.    I
47a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
47b0: 4c 55 45 53 28 27 67 68 69 27 2c 20 27 6a 6b 6c  LUES('ghi', 'jkl
47c0: 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ');.  }.} {}.do_
47d0: 74 65 73 74 20 66 75 6e 63 2d 31 33 2e 33 20 7b  test func-13.3 {
47e0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
47f0: 20 53 45 4c 45 43 54 20 74 65 73 74 5f 61 75 78   SELECT test_aux
4800: 64 61 74 61 28 27 68 65 6c 6c 6f 20 77 6f 72 6c  data('hello worl
4810: 64 27 29 20 46 52 4f 4d 20 74 34 3b 0a 20 20 7d  d') FROM t4;.  }
4820: 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73 74  .} {0 1}.do_test
4830: 20 66 75 6e 63 2d 31 33 2e 34 20 7b 0a 20 20 65   func-13.4 {.  e
4840: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
4850: 45 43 54 20 74 65 73 74 5f 61 75 78 64 61 74 61  ECT test_auxdata
4860: 28 27 68 65 6c 6c 6f 20 77 6f 72 6c 64 27 2c 20  ('hello world', 
4870: 31 32 33 29 20 46 52 4f 4d 20 74 34 3b 0a 20 20  123) FROM t4;.  
4880: 7d 0a 7d 20 7b 7b 30 20 30 7d 20 7b 31 20 31 7d  }.} {{0 0} {1 1}
4890: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31  }.do_test func-1
48a0: 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.5 {.  execsql 
48b0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 65 73  {.    SELECT tes
48c0: 74 5f 61 75 78 64 61 74 61 28 27 68 65 6c 6c 6f  t_auxdata('hello
48d0: 20 77 6f 72 6c 64 27 2c 20 61 29 20 46 52 4f 4d   world', a) FROM
48e0: 20 74 34 3b 0a 20 20 7d 0a 7d 20 7b 7b 30 20 30   t4;.  }.} {{0 0
48f0: 7d 20 7b 31 20 30 7d 7d 0a 64 6f 5f 74 65 73 74  } {1 0}}.do_test
4900: 20 66 75 6e 63 2d 31 33 2e 36 20 7b 0a 20 20 65   func-13.6 {.  e
4910: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
4920: 45 43 54 20 74 65 73 74 5f 61 75 78 64 61 74 61  ECT test_auxdata
4930: 28 27 68 65 6c 6c 6f 27 7c 7c 27 77 6f 72 6c 64  ('hello'||'world
4940: 27 2c 20 61 29 20 46 52 4f 4d 20 74 34 3b 0a 20  ', a) FROM t4;. 
4950: 20 7d 0a 7d 20 7b 7b 30 20 30 7d 20 7b 31 20 30   }.} {{0 0} {1 0
4960: 7d 7d 0a 0a 23 20 54 65 73 74 20 74 68 61 74 20  }}..# Test that 
4970: 61 75 78 69 6c 61 72 79 20 64 61 74 61 20 69 73  auxilary data is
4980: 20 70 72 65 73 65 72 76 65 64 20 62 65 74 77 65   preserved betwe
4990: 65 6e 20 63 61 6c 6c 73 20 66 6f 72 20 53 51 4c  en calls for SQL
49a0: 20 76 61 72 69 61 62 6c 65 73 2e 0a 64 6f 5f 74   variables..do_t
49b0: 65 73 74 20 66 75 6e 63 2d 31 33 2e 37 20 7b 0a  est func-13.7 {.
49c0: 20 20 73 65 74 20 44 42 20 5b 73 71 6c 69 74 65    set DB [sqlite
49d0: 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69  3_connection_poi
49e0: 6e 74 65 72 20 64 62 5d 0a 20 20 73 65 74 20 73  nter db].  set s
49f0: 71 6c 20 22 53 45 4c 45 43 54 20 74 65 73 74 5f  ql "SELECT test_
4a00: 61 75 78 64 61 74 61 28 20 3f 20 2c 20 61 20 29  auxdata( ? , a )
4a10: 20 46 52 4f 4d 20 74 34 3b 22 0a 20 20 73 65 74   FROM t4;".  set
4a20: 20 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f 70   STMT [sqlite3_p
4a30: 72 65 70 61 72 65 20 24 44 42 20 24 73 71 6c 20  repare $DB $sql 
4a40: 2d 31 20 54 41 49 4c 5d 0a 20 20 73 71 6c 69 74  -1 TAIL].  sqlit
4a50: 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 24 53 54  e3_bind_text $ST
4a60: 4d 54 20 31 20 68 65 6c 6c 6f 5c 30 30 30 20 2d  MT 1 hello\000 -
4a70: 31 0a 20 20 73 65 74 20 72 65 73 20 5b 6c 69 73  1.  set res [lis
4a80: 74 5d 0a 20 20 77 68 69 6c 65 20 7b 20 22 53 51  t].  while { "SQ
4a90: 4c 49 54 45 5f 52 4f 57 22 3d 3d 5b 73 71 6c 69  LITE_ROW"==[sqli
4aa0: 74 65 33 5f 73 74 65 70 20 24 53 54 4d 54 5d 20  te3_step $STMT] 
4ab0: 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  } {.    lappend 
4ac0: 72 65 73 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c  res [sqlite3_col
4ad0: 75 6d 6e 5f 74 65 78 74 20 24 53 54 4d 54 20 30  umn_text $STMT 0
4ae0: 5d 0a 20 20 7d 0a 20 20 6c 61 70 70 65 6e 64 20  ].  }.  lappend 
4af0: 72 65 73 20 5b 73 71 6c 69 74 65 33 5f 66 69 6e  res [sqlite3_fin
4b00: 61 6c 69 7a 65 20 24 53 54 4d 54 5d 0a 7d 20 7b  alize $STMT].} {
4b10: 7b 30 20 30 7d 20 7b 31 20 30 7d 20 53 51 4c 49  {0 0} {1 0} SQLI
4b20: 54 45 5f 4f 4b 7d 0a 0a 23 20 54 65 73 74 20 74  TE_OK}..# Test t
4b30: 68 61 74 20 61 75 78 69 6c 69 61 72 79 20 64 61  hat auxiliary da
4b40: 74 61 20 69 73 20 64 69 73 63 61 72 64 65 64 20  ta is discarded 
4b50: 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  when a statement
4b60: 20 69 73 20 72 65 73 65 74 2e 0a 64 6f 5f 65 78   is reset..do_ex
4b70: 65 63 73 71 6c 5f 74 65 73 74 20 31 33 2e 38 2e  ecsql_test 13.8.
4b80: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 74 65 73  1 {.  SELECT tes
4b90: 74 5f 61 75 78 64 61 74 61 28 27 63 6f 6e 73 74  t_auxdata('const
4ba0: 61 6e 74 27 29 20 46 52 4f 4d 20 74 34 3b 0a 7d  ant') FROM t4;.}
4bb0: 20 7b 30 20 31 7d 0a 64 6f 5f 65 78 65 63 73 71   {0 1}.do_execsq
4bc0: 6c 5f 74 65 73 74 20 31 33 2e 38 2e 32 20 7b 0a  l_test 13.8.2 {.
4bd0: 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f 61 75    SELECT test_au
4be0: 78 64 61 74 61 28 27 63 6f 6e 73 74 61 6e 74 27  xdata('constant'
4bf0: 29 20 46 52 4f 4d 20 74 34 3b 0a 7d 20 7b 30 20  ) FROM t4;.} {0 
4c00: 31 7d 0a 64 62 20 63 61 63 68 65 20 66 6c 75 73  1}.db cache flus
4c10: 68 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  h.do_execsql_tes
4c20: 74 20 31 33 2e 38 2e 33 20 7b 0a 20 20 53 45 4c  t 13.8.3 {.  SEL
4c30: 45 43 54 20 74 65 73 74 5f 61 75 78 64 61 74 61  ECT test_auxdata
4c40: 28 27 63 6f 6e 73 74 61 6e 74 27 29 20 46 52 4f  ('constant') FRO
4c50: 4d 20 74 34 3b 0a 7d 20 7b 30 20 31 7d 0a 73 65  M t4;.} {0 1}.se
4c60: 74 20 56 20 22 6f 6e 65 22 0a 64 6f 5f 65 78 65  t V "one".do_exe
4c70: 63 73 71 6c 5f 74 65 73 74 20 31 33 2e 38 2e 34  csql_test 13.8.4
4c80: 20 7b 0a 20 20 53 45 4c 45 43 54 20 74 65 73 74   {.  SELECT test
4c90: 5f 61 75 78 64 61 74 61 28 24 56 29 2c 20 24 56  _auxdata($V), $V
4ca0: 20 46 52 4f 4d 20 74 34 3b 0a 7d 20 7b 30 20 6f   FROM t4;.} {0 o
4cb0: 6e 65 20 31 20 6f 6e 65 7d 0a 73 65 74 20 56 20  ne 1 one}.set V 
4cc0: 22 74 77 6f 22 0a 64 6f 5f 65 78 65 63 73 71 6c  "two".do_execsql
4cd0: 5f 74 65 73 74 20 31 33 2e 38 2e 35 20 7b 0a 20  _test 13.8.5 {. 
4ce0: 20 53 45 4c 45 43 54 20 74 65 73 74 5f 61 75 78   SELECT test_aux
4cf0: 64 61 74 61 28 24 56 29 2c 20 24 56 20 46 52 4f  data($V), $V FRO
4d00: 4d 20 74 34 3b 0a 7d 20 7b 30 20 74 77 6f 20 31  M t4;.} {0 two 1
4d10: 20 74 77 6f 7d 0a 64 62 20 63 61 63 68 65 20 66   two}.db cache f
4d20: 6c 75 73 68 0a 73 65 74 20 56 20 22 74 68 72 65  lush.set V "thre
4d30: 65 22 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  e".do_execsql_te
4d40: 73 74 20 31 33 2e 38 2e 36 20 7b 0a 20 20 53 45  st 13.8.6 {.  SE
4d50: 4c 45 43 54 20 74 65 73 74 5f 61 75 78 64 61 74  LECT test_auxdat
4d60: 61 28 24 56 29 2c 20 24 56 20 46 52 4f 4d 20 74  a($V), $V FROM t
4d70: 34 3b 0a 7d 20 7b 30 20 74 68 72 65 65 20 31 20  4;.} {0 three 1 
4d80: 74 68 72 65 65 7d 0a 0a 0a 23 20 4d 61 6b 65 20  three}...# Make 
4d90: 73 75 72 65 20 74 68 61 74 20 61 20 66 75 6e 63  sure that a func
4da0: 74 69 6f 6e 20 77 69 74 68 20 61 20 76 65 72 79  tion with a very
4db0: 20 6c 6f 6e 67 20 6e 61 6d 65 20 69 73 20 72 65   long name is re
4dc0: 6a 65 63 74 65 64 0a 64 6f 5f 74 65 73 74 20 66  jected.do_test f
4dd0: 75 6e 63 2d 31 34 2e 31 20 7b 0a 20 20 63 61 74  unc-14.1 {.  cat
4de0: 63 68 20 7b 0a 20 20 20 20 64 62 20 66 75 6e 63  ch {.    db func
4df0: 74 69 6f 6e 20 5b 73 74 72 69 6e 67 20 72 65 70  tion [string rep
4e00: 65 61 74 20 58 20 32 35 34 5d 20 7b 72 65 74 75  eat X 254] {retu
4e10: 72 6e 20 22 68 65 6c 6c 6f 22 7d 0a 20 20 7d 20  rn "hello"}.  } 
4e20: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 66  .} {0}.do_test f
4e30: 75 6e 63 2d 31 34 2e 32 20 7b 0a 20 20 63 61 74  unc-14.2 {.  cat
4e40: 63 68 20 7b 0a 20 20 20 20 64 62 20 66 75 6e 63  ch {.    db func
4e50: 74 69 6f 6e 20 5b 73 74 72 69 6e 67 20 72 65 70  tion [string rep
4e60: 65 61 74 20 58 20 32 35 36 5d 20 7b 72 65 74 75  eat X 256] {retu
4e70: 72 6e 20 22 68 65 6c 6c 6f 22 7d 0a 20 20 7d 0a  rn "hello"}.  }.
4e80: 7d 20 7b 31 7d 0a 0a 64 6f 5f 74 65 73 74 20 66  } {1}..do_test f
4e90: 75 6e 63 2d 31 35 2e 31 20 7b 0a 20 20 63 61 74  unc-15.1 {.  cat
4ea0: 63 68 73 71 6c 20 7b 73 65 6c 65 63 74 20 74 65  chsql {select te
4eb0: 73 74 5f 65 72 72 6f 72 28 4e 55 4c 4c 29 7d 0a  st_error(NULL)}.
4ec0: 7d 20 7b 31 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74  } {1 {}}.do_test
4ed0: 20 66 75 6e 63 2d 31 35 2e 32 20 7b 0a 20 20 63   func-15.2 {.  c
4ee0: 61 74 63 68 73 71 6c 20 7b 73 65 6c 65 63 74 20  atchsql {select 
4ef0: 74 65 73 74 5f 65 72 72 6f 72 28 27 74 68 69 73  test_error('this
4f00: 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 6d 65   is the error me
4f10: 73 73 61 67 65 27 29 7d 0a 7d 20 7b 31 20 7b 74  ssage')}.} {1 {t
4f20: 68 69 73 20 69 73 20 74 68 65 20 65 72 72 6f 72  his is the error
4f30: 20 6d 65 73 73 61 67 65 7d 7d 0a 64 6f 5f 74 65   message}}.do_te
4f40: 73 74 20 66 75 6e 63 2d 31 35 2e 33 20 7b 0a 20  st func-15.3 {. 
4f50: 20 63 61 74 63 68 73 71 6c 20 7b 73 65 6c 65 63   catchsql {selec
4f60: 74 20 74 65 73 74 5f 65 72 72 6f 72 28 27 74 68  t test_error('th
4f70: 69 73 20 69 73 20 74 68 65 20 65 72 72 6f 72 20  is is the error 
4f80: 6d 65 73 73 61 67 65 27 2c 31 32 29 7d 0a 7d 20  message',12)}.} 
4f90: 7b 31 20 7b 74 68 69 73 20 69 73 20 74 68 65 20  {1 {this is the 
4fa0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 7d 7d 0a  error message}}.
4fb0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 35 2e  do_test func-15.
4fc0: 34 20 7b 0a 20 20 64 62 20 65 72 72 6f 72 63 6f  4 {.  db errorco
4fd0: 64 65 0a 7d 20 7b 31 32 7d 0a 0a 23 20 54 65 73  de.} {12}..# Tes
4fe0: 74 20 74 68 65 20 71 75 6f 74 65 20 66 75 6e 63  t the quote func
4ff0: 74 69 6f 6e 20 66 6f 72 20 42 4c 4f 42 20 61 6e  tion for BLOB an
5000: 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 64  d NULL values..d
5010: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 36 2e 31  o_test func-16.1
5020: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5030: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5040: 74 62 6c 32 28 61 2c 20 62 29 3b 0a 20 20 7d 0a  tbl2(a, b);.  }.
5050: 20 20 73 65 74 20 53 54 4d 54 20 5b 73 71 6c 69    set STMT [sqli
5060: 74 65 33 5f 70 72 65 70 61 72 65 20 24 3a 3a 44  te3_prepare $::D
5070: 42 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  B "INSERT INTO t
5080: 62 6c 32 20 56 41 4c 55 45 53 28 3f 2c 20 3f 29  bl2 VALUES(?, ?)
5090: 22 20 2d 31 20 54 41 49 4c 5d 0a 20 20 73 71 6c  " -1 TAIL].  sql
50a0: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 24  ite3_bind_blob $
50b0: 3a 3a 53 54 4d 54 20 31 20 61 62 63 20 33 0a 20  ::STMT 1 abc 3. 
50c0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a   sqlite3_step $:
50d0: 3a 53 54 4d 54 0a 20 20 73 71 6c 69 74 65 33 5f  :STMT.  sqlite3_
50e0: 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54 4d 54  finalize $::STMT
50f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5100: 20 53 45 4c 45 43 54 20 71 75 6f 74 65 28 61 29   SELECT quote(a)
5110: 2c 20 71 75 6f 74 65 28 62 29 20 46 52 4f 4d 20  , quote(b) FROM 
5120: 74 62 6c 32 3b 0a 20 20 7d 0a 7d 20 7b 58 27 36  tbl2;.  }.} {X'6
5130: 31 36 32 36 33 27 20 4e 55 4c 4c 7d 0a 0a 23 20  16263' NULL}..# 
5140: 43 6f 72 72 65 63 74 6c 79 20 68 61 6e 64 6c 65  Correctly handle
5150: 20 66 75 6e 63 74 69 6f 6e 20 65 72 72 6f 72 20   function error 
5160: 6d 65 73 73 61 67 65 73 20 74 68 61 74 20 69 6e  messages that in
5170: 63 6c 75 64 65 20 25 2e 20 20 54 69 63 6b 65 74  clude %.  Ticket
5180: 20 23 31 33 35 34 0a 23 0a 64 6f 5f 74 65 73 74   #1354.#.do_test
5190: 20 66 75 6e 63 2d 31 37 2e 31 20 7b 0a 20 20 70   func-17.1 {.  p
51a0: 72 6f 63 20 74 65 73 74 66 75 6e 63 31 20 61 72  roc testfunc1 ar
51b0: 67 73 20 7b 65 72 72 6f 72 20 22 45 72 72 6f 72  gs {error "Error
51c0: 20 25 64 20 77 69 74 68 20 25 73 20 70 65 72 63   %d with %s perc
51d0: 65 6e 74 73 20 25 70 22 7d 0a 20 20 64 62 20 66  ents %p"}.  db f
51e0: 75 6e 63 74 69 6f 6e 20 74 65 73 74 66 75 6e 63  unction testfunc
51f0: 31 20 3a 3a 74 65 73 74 66 75 6e 63 31 0a 20 20  1 ::testfunc1.  
5200: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
5210: 45 4c 45 43 54 20 74 65 73 74 66 75 6e 63 31 28  ELECT testfunc1(
5220: 31 2c 32 2c 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31  1,2,3);.  }.} {1
5230: 20 7b 45 72 72 6f 72 20 25 64 20 77 69 74 68 20   {Error %d with 
5240: 25 73 20 70 65 72 63 65 6e 74 73 20 25 70 7d 7d  %s percents %p}}
5250: 0a 0a 23 20 54 68 65 20 53 55 4d 20 66 75 6e 63  ..# The SUM func
5260: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 72 65 74 75  tion should retu
5270: 72 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c  rn integer resul
5280: 74 73 20 77 68 65 6e 20 61 6c 6c 20 69 6e 70 75  ts when all inpu
5290: 74 73 20 61 72 65 20 69 6e 74 65 67 65 72 2e 0a  ts are integer..
52a0: 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31  #.do_test func-1
52b0: 38 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.1 {.  execsql 
52c0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
52d0: 4c 45 20 74 35 28 78 29 3b 0a 20 20 20 20 49 4e  LE t5(x);.    IN
52e0: 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c  SERT INTO t5 VAL
52f0: 55 45 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45  UES(1);.    INSE
5300: 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45  RT INTO t5 VALUE
5310: 53 28 2d 39 39 29 3b 0a 20 20 20 20 49 4e 53 45  S(-99);.    INSE
5320: 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45  RT INTO t5 VALUE
5330: 53 28 31 30 30 30 30 29 3b 0a 20 20 20 20 53 45  S(10000);.    SE
5340: 4c 45 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d  LECT sum(x) FROM
5350: 20 74 35 3b 0a 20 20 7d 0a 7d 20 7b 39 39 30 32   t5;.  }.} {9902
5360: 7d 0a 69 66 63 61 70 61 62 6c 65 20 66 6c 6f 61  }.ifcapable floa
5370: 74 69 6e 67 70 6f 69 6e 74 20 7b 0a 20 20 64 6f  tingpoint {.  do
5380: 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 32 20  _test func-18.2 
5390: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
53a0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
53b0: 4f 20 74 35 20 56 41 4c 55 45 53 28 30 2e 30 29  O t5 VALUES(0.0)
53c0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 73  ;.      SELECT s
53d0: 75 6d 28 78 29 20 46 52 4f 4d 20 74 35 3b 0a 20  um(x) FROM t5;. 
53e0: 20 20 20 7d 0a 20 20 7d 20 7b 39 39 30 32 2e 30     }.  } {9902.0
53f0: 7d 0a 7d 0a 0a 23 20 54 68 65 20 73 75 6d 20 6f  }.}..# The sum o
5400: 66 20 6e 6f 74 68 69 6e 67 20 69 73 20 4e 55 4c  f nothing is NUL
5410: 4c 2e 20 20 42 75 74 20 74 68 65 20 73 75 6d 20  L.  But the sum 
5420: 6f 66 20 61 6c 6c 20 4e 55 4c 4c 73 20 69 73 20  of all NULLs is 
5430: 4e 55 4c 4c 2e 0a 23 0a 23 20 54 68 65 20 54 4f  NULL..#.# The TO
5440: 54 41 4c 20 6f 66 20 6e 6f 74 68 69 6e 67 20 69  TAL of nothing i
5450: 73 20 30 2e 30 2e 0a 23 0a 64 6f 5f 74 65 73 74  s 0.0..#.do_test
5460: 20 66 75 6e 63 2d 31 38 2e 33 20 7b 0a 20 20 65   func-18.3 {.  e
5470: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
5480: 45 54 45 20 46 52 4f 4d 20 74 35 3b 0a 20 20 20  ETE FROM t5;.   
5490: 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 2c 20   SELECT sum(x), 
54a0: 74 6f 74 61 6c 28 78 29 20 46 52 4f 4d 20 74 35  total(x) FROM t5
54b0: 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 30 2e 30 7d  ;.  }.} {{} 0.0}
54c0: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38  .do_test func-18
54d0: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
54e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
54f0: 20 74 35 20 56 41 4c 55 45 53 28 4e 55 4c 4c 29   t5 VALUES(NULL)
5500: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d  ;.    SELECT sum
5510: 28 78 29 2c 20 74 6f 74 61 6c 28 78 29 20 46 52  (x), total(x) FR
5520: 4f 4d 20 74 35 0a 20 20 7d 0a 7d 20 7b 7b 7d 20  OM t5.  }.} {{} 
5530: 30 2e 30 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  0.0}.do_test fun
5540: 63 2d 31 38 2e 35 20 7b 0a 20 20 65 78 65 63 73  c-18.5 {.  execs
5550: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
5560: 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 4e  INTO t5 VALUES(N
5570: 55 4c 4c 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  ULL);.    SELECT
5580: 20 73 75 6d 28 78 29 2c 20 74 6f 74 61 6c 28 78   sum(x), total(x
5590: 29 20 46 52 4f 4d 20 74 35 0a 20 20 7d 0a 7d 20  ) FROM t5.  }.} 
55a0: 7b 7b 7d 20 30 2e 30 7d 0a 64 6f 5f 74 65 73 74  {{} 0.0}.do_test
55b0: 20 66 75 6e 63 2d 31 38 2e 36 20 7b 0a 20 20 65   func-18.6 {.  e
55c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
55d0: 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55  ERT INTO t5 VALU
55e0: 45 53 28 31 32 33 29 3b 0a 20 20 20 20 53 45 4c  ES(123);.    SEL
55f0: 45 43 54 20 73 75 6d 28 78 29 2c 20 74 6f 74 61  ECT sum(x), tota
5600: 6c 28 78 29 20 46 52 4f 4d 20 74 35 0a 20 20 7d  l(x) FROM t5.  }
5610: 0a 7d 20 7b 31 32 33 20 31 32 33 2e 30 7d 0a 0a  .} {123 123.0}..
5620: 23 20 54 69 63 6b 65 74 20 23 31 36 36 34 2c 20  # Ticket #1664, 
5630: 23 31 36 36 39 2c 20 23 31 36 37 30 2c 20 23 31  #1669, #1670, #1
5640: 36 37 34 3a 20 41 6e 20 69 6e 74 65 67 65 72 20  674: An integer 
5650: 6f 76 65 72 66 6c 6f 77 20 6f 6e 20 53 55 4d 20  overflow on SUM 
5660: 63 61 75 73 65 73 0a 23 20 61 6e 20 65 72 72 6f  causes.# an erro
5670: 72 2e 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64  r. The non-stand
5680: 61 72 64 20 54 4f 54 41 4c 28 29 20 66 75 6e 63  ard TOTAL() func
5690: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 74  tion continues t
56a0: 6f 20 67 69 76 65 20 61 20 68 65 6c 70 66 75 6c  o give a helpful
56b0: 0a 23 20 72 65 73 75 6c 74 2e 0a 23 0a 64 6f 5f  .# result..#.do_
56c0: 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 30 20  test func-18.10 
56d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
56e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
56f0: 36 28 78 20 49 4e 54 45 47 45 52 29 3b 0a 20 20  6(x INTEGER);.  
5700: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36    INSERT INTO t6
5710: 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20   VALUES(1);.    
5720: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56  INSERT INTO t6 V
5730: 41 4c 55 45 53 28 31 3c 3c 36 32 29 3b 0a 20 20  ALUES(1<<62);.  
5740: 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 20    SELECT sum(x) 
5750: 2d 20 28 28 31 3c 3c 36 32 29 2b 31 29 20 66 72  - ((1<<62)+1) fr
5760: 6f 6d 20 74 36 3b 0a 20 20 7d 0a 7d 20 30 0a 64  om t6;.  }.} 0.d
5770: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 31  o_test func-18.1
5780: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
5790: 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f      SELECT typeo
57a0: 66 28 73 75 6d 28 78 29 29 20 46 52 4f 4d 20 74  f(sum(x)) FROM t
57b0: 36 0a 20 20 7d 0a 7d 20 69 6e 74 65 67 65 72 0a  6.  }.} integer.
57c0: 69 66 63 61 70 61 62 6c 65 20 66 6c 6f 61 74 69  ifcapable floati
57d0: 6e 67 70 6f 69 6e 74 20 7b 0a 20 20 64 6f 5f 74  ngpoint {.  do_t
57e0: 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 32 20 7b  est func-18.12 {
57f0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  .    catchsql {.
5800: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
5810: 4f 20 74 36 20 56 41 4c 55 45 53 28 31 3c 3c 36  O t6 VALUES(1<<6
5820: 32 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  2);.      SELECT
5830: 20 73 75 6d 28 78 29 20 2d 20 28 28 31 3c 3c 36   sum(x) - ((1<<6
5840: 32 29 2a 32 2e 30 2b 31 29 20 66 72 6f 6d 20 74  2)*2.0+1) from t
5850: 36 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  6;.    }.  } {1 
5860: 7b 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f  {integer overflo
5870: 77 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 75  w}}.  do_test fu
5880: 6e 63 2d 31 38 2e 31 33 20 7b 0a 20 20 20 20 65  nc-18.13 {.    e
5890: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
58a0: 45 4c 45 43 54 20 74 6f 74 61 6c 28 78 29 20 2d  ELECT total(x) -
58b0: 20 28 28 31 3c 3c 36 32 29 2a 32 2e 30 2b 31 29   ((1<<62)*2.0+1)
58c0: 20 46 52 4f 4d 20 74 36 0a 20 20 20 20 7d 0a 20   FROM t6.    }. 
58d0: 20 7d 20 30 2e 30 0a 7d 0a 69 66 63 61 70 61 62   } 0.0.}.ifcapab
58e0: 6c 65 20 21 66 6c 6f 61 74 69 6e 67 70 6f 69 6e  le !floatingpoin
58f0: 74 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75  t {.  do_test fu
5900: 6e 63 2d 31 38 2e 31 32 20 7b 0a 20 20 20 20 63  nc-18.12 {.    c
5910: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20  atchsql {.      
5920: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56  INSERT INTO t6 V
5930: 41 4c 55 45 53 28 31 3c 3c 36 32 29 3b 0a 20 20  ALUES(1<<62);.  
5940: 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78      SELECT sum(x
5950: 29 20 2d 20 28 28 31 3c 3c 36 32 29 2a 32 2b 31  ) - ((1<<62)*2+1
5960: 29 20 66 72 6f 6d 20 74 36 3b 0a 20 20 20 20 7d  ) from t6;.    }
5970: 0a 20 20 7d 20 7b 31 20 7b 69 6e 74 65 67 65 72  .  } {1 {integer
5980: 20 6f 76 65 72 66 6c 6f 77 7d 7d 0a 20 20 64 6f   overflow}}.  do
5990: 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 33  _test func-18.13
59a0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
59b0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 74 6f  .      SELECT to
59c0: 74 61 6c 28 78 29 20 2d 20 28 28 31 3c 3c 36 32  tal(x) - ((1<<62
59d0: 29 2a 32 2b 31 29 20 46 52 4f 4d 20 74 36 0a 20  )*2+1) FROM t6. 
59e0: 20 20 20 7d 0a 20 20 7d 20 30 2e 30 0a 7d 0a 69     }.  } 0.0.}.i
59f0: 66 20 7b 5b 77 6f 72 6b 69 6e 67 5f 36 34 62 69  f {[working_64bi
5a00: 74 5f 69 6e 74 5d 7d 20 7b 0a 20 20 64 6f 5f 74  t_int]} {.  do_t
5a10: 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 34 20 7b  est func-18.14 {
5a20: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
5a30: 20 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28       SELECT sum(
5a40: 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
5a50: 35 38 30 35 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  5805);.    }.  }
5a60: 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37   -92233720368547
5a70: 37 35 38 30 35 0a 7d 0a 69 66 63 61 70 61 62 6c  75805.}.ifcapabl
5a80: 65 20 63 6f 6d 70 6f 75 6e 64 26 26 73 75 62 71  e compound&&subq
5a90: 75 65 72 79 20 7b 0a 0a 64 6f 5f 74 65 73 74 20  uery {..do_test 
5aa0: 66 75 6e 63 2d 31 38 2e 31 35 20 7b 0a 20 20 63  func-18.15 {.  c
5ab0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45  atchsql {.    SE
5ac0: 4c 45 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d  LECT sum(x) FROM
5ad0: 20 0a 20 20 20 20 20 20 20 28 53 45 4c 45 43 54   .       (SELECT
5ae0: 20 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37   922337203685477
5af0: 35 38 30 37 20 41 53 20 78 20 55 4e 49 4f 4e 20  5807 AS x UNION 
5b00: 41 4c 4c 0a 20 20 20 20 20 20 20 20 53 45 4c 45  ALL.        SELE
5b10: 43 54 20 31 30 20 41 53 20 78 29 3b 0a 20 20 7d  CT 10 AS x);.  }
5b20: 0a 7d 20 7b 31 20 7b 69 6e 74 65 67 65 72 20 6f  .} {1 {integer o
5b30: 76 65 72 66 6c 6f 77 7d 7d 0a 69 66 20 7b 5b 77  verflow}}.if {[w
5b40: 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74  orking_64bit_int
5b50: 5d 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66  ]} {.  do_test f
5b60: 75 6e 63 2d 31 38 2e 31 36 20 7b 0a 20 20 20 20  unc-18.16 {.    
5b70: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20  catchsql {.     
5b80: 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 20 46   SELECT sum(x) F
5b90: 52 4f 4d 20 0a 20 20 20 20 20 20 20 20 20 28 53  ROM .         (S
5ba0: 45 4c 45 43 54 20 39 32 32 33 33 37 32 30 33 36  ELECT 9223372036
5bb0: 38 35 34 37 37 35 38 30 37 20 41 53 20 78 20 55  854775807 AS x U
5bc0: 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 20  NION ALL.       
5bd0: 20 20 20 53 45 4c 45 43 54 20 2d 31 30 20 41 53     SELECT -10 AS
5be0: 20 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   x);.    }.  } {
5bf0: 30 20 39 32 32 33 33 37 32 30 33 36 38 35 34 37  0 92233720368547
5c00: 37 35 37 39 37 7d 0a 20 20 64 6f 5f 74 65 73 74  75797}.  do_test
5c10: 20 66 75 6e 63 2d 31 38 2e 31 37 20 7b 0a 20 20   func-18.17 {.  
5c20: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
5c30: 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29     SELECT sum(x)
5c40: 20 46 52 4f 4d 20 0a 20 20 20 20 20 20 20 20 20   FROM .         
5c50: 28 53 45 4c 45 43 54 20 2d 39 32 32 33 33 37 32  (SELECT -9223372
5c60: 30 33 36 38 35 34 37 37 35 38 30 37 20 41 53 20  036854775807 AS 
5c70: 78 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20  x UNION ALL.    
5c80: 20 20 20 20 20 20 53 45 4c 45 43 54 20 31 30 20        SELECT 10 
5c90: 41 53 20 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AS x);.    }.  }
5ca0: 20 7b 30 20 2d 39 32 32 33 33 37 32 30 33 36 38   {0 -92233720368
5cb0: 35 34 37 37 35 37 39 37 7d 0a 7d 0a 64 6f 5f 74  54775797}.}.do_t
5cc0: 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 38 20 7b  est func-18.18 {
5cd0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
5ce0: 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 20    SELECT sum(x) 
5cf0: 46 52 4f 4d 20 0a 20 20 20 20 20 20 20 28 53 45  FROM .       (SE
5d00: 4c 45 43 54 20 2d 39 32 32 33 33 37 32 30 33 36  LECT -9223372036
5d10: 38 35 34 37 37 35 38 30 37 20 41 53 20 78 20 55  854775807 AS x U
5d20: 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 20  NION ALL.       
5d30: 20 53 45 4c 45 43 54 20 2d 31 30 20 41 53 20 78   SELECT -10 AS x
5d40: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 69 6e 74  );.  }.} {1 {int
5d50: 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 7d 7d 0a  eger overflow}}.
5d60: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e  do_test func-18.
5d70: 31 39 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  19 {.  catchsql 
5d80: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d  {.    SELECT sum
5d90: 28 78 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  (x) FROM (SELECT
5da0: 20 39 20 41 53 20 78 20 55 4e 49 4f 4e 20 41 4c   9 AS x UNION AL
5db0: 4c 20 53 45 4c 45 43 54 20 2d 31 30 20 41 53 20  L SELECT -10 AS 
5dc0: 78 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 2d 31 7d  x);.  }.} {0 -1}
5dd0: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38  .do_test func-18
5de0: 2e 32 30 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  .20 {.  catchsql
5df0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 75   {.    SELECT su
5e00: 6d 28 78 29 20 46 52 4f 4d 20 28 53 45 4c 45 43  m(x) FROM (SELEC
5e10: 54 20 2d 39 20 41 53 20 78 20 55 4e 49 4f 4e 20  T -9 AS x UNION 
5e20: 41 4c 4c 20 53 45 4c 45 43 54 20 31 30 20 41 53  ALL SELECT 10 AS
5e30: 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31 7d   x);.  }.} {0 1}
5e40: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38  .do_test func-18
5e50: 2e 32 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  .21 {.  catchsql
5e60: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 75   {.    SELECT su
5e70: 6d 28 78 29 20 46 52 4f 4d 20 28 53 45 4c 45 43  m(x) FROM (SELEC
5e80: 54 20 2d 31 30 20 41 53 20 78 20 55 4e 49 4f 4e  T -10 AS x UNION
5e90: 20 41 4c 4c 20 53 45 4c 45 43 54 20 39 20 41 53   ALL SELECT 9 AS
5ea0: 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 2d 31   x);.  }.} {0 -1
5eb0: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31  }.do_test func-1
5ec0: 38 2e 32 32 20 7b 0a 20 20 63 61 74 63 68 73 71  8.22 {.  catchsq
5ed0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 73  l {.    SELECT s
5ee0: 75 6d 28 78 29 20 46 52 4f 4d 20 28 53 45 4c 45  um(x) FROM (SELE
5ef0: 43 54 20 31 30 20 41 53 20 78 20 55 4e 49 4f 4e  CT 10 AS x UNION
5f00: 20 41 4c 4c 20 53 45 4c 45 43 54 20 2d 39 20 41   ALL SELECT -9 A
5f10: 53 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31  S x);.  }.} {0 1
5f20: 7d 0a 0a 7d 20 3b 23 20 69 66 63 61 70 61 62 6c  }..} ;# ifcapabl
5f30: 65 20 63 6f 6d 70 6f 75 6e 64 26 26 73 75 62 71  e compound&&subq
5f40: 75 65 72 79 0a 0a 23 20 49 6e 74 65 67 65 72 20  uery..# Integer 
5f50: 6f 76 65 72 66 6c 6f 77 20 6f 6e 20 61 62 73 28  overflow on abs(
5f60: 29 0a 23 0a 69 66 20 7b 5b 77 6f 72 6b 69 6e 67  ).#.if {[working
5f70: 5f 36 34 62 69 74 5f 69 6e 74 5d 7d 20 7b 0a 20  _64bit_int]} {. 
5f80: 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38   do_test func-18
5f90: 2e 33 31 20 7b 0a 20 20 20 20 63 61 74 63 68 73  .31 {.    catchs
5fa0: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
5fb0: 54 20 61 62 73 28 2d 39 32 32 33 33 37 32 30 33  T abs(-922337203
5fc0: 36 38 35 34 37 37 35 38 30 37 29 3b 0a 20 20 20  6854775807);.   
5fd0: 20 7d 0a 20 20 7d 20 7b 30 20 39 32 32 33 33 37   }.  } {0 922337
5fe0: 32 30 33 36 38 35 34 37 37 35 38 30 37 7d 0a 7d  2036854775807}.}
5ff0: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38  .do_test func-18
6000: 2e 33 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  .32 {.  catchsql
6010: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 62   {.    SELECT ab
6020: 73 28 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  s(-9223372036854
6030: 37 37 35 38 30 37 2d 31 29 3b 0a 20 20 7d 0a 7d  775807-1);.  }.}
6040: 20 7b 31 20 7b 69 6e 74 65 67 65 72 20 6f 76 65   {1 {integer ove
6050: 72 66 6c 6f 77 7d 7d 0a 0a 23 20 54 68 65 20 4d  rflow}}..# The M
6060: 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 20 65 78  ATCH function ex
6070: 69 73 74 73 20 62 75 74 20 69 73 20 6f 6e 6c 79  ists but is only
6080: 20 61 20 73 74 75 62 20 61 6e 64 20 61 6c 77 61   a stub and alwa
6090: 79 73 20 74 68 72 6f 77 73 20 61 6e 20 65 72 72  ys throws an err
60a0: 6f 72 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75  or..#.do_test fu
60b0: 6e 63 2d 31 39 2e 31 20 7b 0a 20 20 65 78 65 63  nc-19.1 {.  exec
60c0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
60d0: 20 6d 61 74 63 68 28 61 2c 62 29 20 46 52 4f 4d   match(a,b) FROM
60e0: 20 74 31 20 57 48 45 52 45 20 30 3b 0a 20 20 7d   t1 WHERE 0;.  }
60f0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 75  .} {}.do_test fu
6100: 6e 63 2d 31 39 2e 32 20 7b 0a 20 20 63 61 74 63  nc-19.2 {.  catc
6110: 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  hsql {.    SELEC
6120: 54 20 27 61 62 63 27 20 4d 41 54 43 48 20 27 78  T 'abc' MATCH 'x
6130: 79 7a 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 75  yz';.  }.} {1 {u
6140: 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66 75 6e  nable to use fun
6150: 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20 74  ction MATCH in t
6160: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6e  he requested con
6170: 74 65 78 74 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  text}}.do_test f
6180: 75 6e 63 2d 31 39 2e 33 20 7b 0a 20 20 63 61 74  unc-19.3 {.  cat
6190: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  chsql {.    SELE
61a0: 43 54 20 27 61 62 63 27 20 4e 4f 54 20 4d 41 54  CT 'abc' NOT MAT
61b0: 43 48 20 27 78 79 7a 27 3b 0a 20 20 7d 0a 7d 20  CH 'xyz';.  }.} 
61c0: 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73  {1 {unable to us
61d0: 65 20 66 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48  e function MATCH
61e0: 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
61f0: 64 20 63 6f 6e 74 65 78 74 7d 7d 0a 64 6f 5f 74  d context}}.do_t
6200: 65 73 74 20 66 75 6e 63 2d 31 39 2e 34 20 7b 0a  est func-19.4 {.
6210: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
6220: 20 53 45 4c 45 43 54 20 6d 61 74 63 68 28 31 2c   SELECT match(1,
6230: 32 2c 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  2,3);.  }.} {1 {
6240: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
6250: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
6260: 63 74 69 6f 6e 20 6d 61 74 63 68 28 29 7d 7d 0a  ction match()}}.
6270: 0a 23 20 53 6f 75 6e 64 65 78 20 74 65 73 74 73  .# Soundex tests
6280: 2e 0a 23 0a 69 66 20 7b 21 5b 63 61 74 63 68 20  ..#.if {![catch 
6290: 7b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54  {db eval {SELECT
62a0: 20 73 6f 75 6e 64 65 78 28 27 68 65 6c 6c 6f 27   soundex('hello'
62b0: 29 7d 7d 5d 7d 20 7b 0a 20 20 73 65 74 20 69 20  )}}]} {.  set i 
62c0: 30 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 61 6d  0.  foreach {nam
62d0: 65 20 73 64 78 7d 20 7b 0a 20 20 20 20 65 75 6c  e sdx} {.    eul
62e0: 65 72 20 20 20 20 20 20 20 20 45 34 36 30 0a 20  er        E460. 
62f0: 20 20 20 45 55 4c 45 52 20 20 20 20 20 20 20 20     EULER        
6300: 45 34 36 30 0a 20 20 20 20 45 75 6c 65 72 20 20  E460.    Euler  
6310: 20 20 20 20 20 20 45 34 36 30 0a 20 20 20 20 65        E460.    e
6320: 6c 6c 65 72 79 20 20 20 20 20 20 20 45 34 36 30  llery       E460
6330: 0a 20 20 20 20 67 61 75 73 73 20 20 20 20 20 20  .    gauss      
6340: 20 20 47 32 30 30 0a 20 20 20 20 67 68 6f 73 68    G200.    ghosh
6350: 20 20 20 20 20 20 20 20 47 32 30 30 0a 20 20 20          G200.   
6360: 20 68 69 6c 62 65 72 74 20 20 20 20 20 20 48 34   hilbert      H4
6370: 31 36 0a 20 20 20 20 48 65 69 6c 62 72 6f 6e 6e  16.    Heilbronn
6380: 20 20 20 20 48 34 31 36 0a 20 20 20 20 6b 6e 75      H416.    knu
6390: 74 68 20 20 20 20 20 20 20 20 4b 35 33 30 0a 20  th        K530. 
63a0: 20 20 20 6b 61 6e 74 20 20 20 20 20 20 20 20 20     kant         
63b0: 4b 35 33 30 0a 20 20 20 20 4c 6c 6f 79 64 20 20  K530.    Lloyd  
63c0: 20 20 20 20 20 20 4c 33 30 30 0a 20 20 20 20 4c        L300.    L
63d0: 41 44 44 20 20 20 20 20 20 20 20 20 4c 33 30 30  ADD         L300
63e0: 0a 20 20 20 20 4c 75 6b 61 73 69 65 77 69 63 7a  .    Lukasiewicz
63f0: 20 20 4c 32 32 32 0a 20 20 20 20 4c 69 73 73 61    L222.    Lissa
6400: 6a 6f 75 73 20 20 20 20 4c 32 32 32 0a 20 20 20  jous    L222.   
6410: 20 41 20 20 20 20 20 20 20 20 20 20 20 20 41 30   A            A0
6420: 30 30 0a 20 20 20 20 31 32 33 34 35 20 20 20 20  00.    12345    
6430: 20 20 20 20 3f 30 30 30 0a 20 20 7d 20 7b 0a 20      ?000.  } {. 
6440: 20 20 20 69 6e 63 72 20 69 0a 20 20 20 20 64 6f     incr i.    do
6450: 5f 74 65 73 74 20 66 75 6e 63 2d 32 30 2e 24 69  _test func-20.$i
6460: 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c   {.      execsql
6470: 20 7b 53 45 4c 45 43 54 20 73 6f 75 6e 64 65 78   {SELECT soundex
6480: 28 24 6e 61 6d 65 29 7d 0a 20 20 20 20 7d 20 24  ($name)}.    } $
6490: 73 64 78 0a 20 20 7d 0a 7d 0a 0a 23 20 54 65 73  sdx.  }.}..# Tes
64a0: 74 73 20 6f 66 20 74 68 65 20 52 45 50 4c 41 43  ts of the REPLAC
64b0: 45 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a 64 6f  E function..#.do
64c0: 5f 74 65 73 74 20 66 75 6e 63 2d 32 31 2e 31 20  _test func-21.1 
64d0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
64e0: 20 20 20 53 45 4c 45 43 54 20 72 65 70 6c 61 63     SELECT replac
64f0: 65 28 31 2c 32 29 3b 0a 20 20 7d 0a 7d 20 7b 31  e(1,2);.  }.} {1
6500: 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f   {wrong number o
6510: 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
6520: 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 28  unction replace(
6530: 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  )}}.do_test func
6540: 2d 32 31 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  -21.2 {.  catchs
6550: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
6560: 72 65 70 6c 61 63 65 28 31 2c 32 2c 33 2c 34 29  replace(1,2,3,4)
6570: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 77 72 6f 6e  ;.  }.} {1 {wron
6580: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
6590: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
65a0: 6e 20 72 65 70 6c 61 63 65 28 29 7d 7d 0a 64 6f  n replace()}}.do
65b0: 5f 74 65 73 74 20 66 75 6e 63 2d 32 31 2e 33 20  _test func-21.3 
65c0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
65d0: 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28    SELECT typeof(
65e0: 72 65 70 6c 61 63 65 28 22 54 68 69 73 20 69 73  replace("This is
65f0: 20 74 68 65 20 6d 61 69 6e 20 74 65 73 74 20 73   the main test s
6600: 74 72 69 6e 67 22 2c 20 4e 55 4c 4c 2c 20 22 41  tring", NULL, "A
6610: 4c 54 22 29 29 3b 0a 20 20 7d 0a 7d 20 7b 6e 75  LT"));.  }.} {nu
6620: 6c 6c 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  ll}.do_test func
6630: 2d 32 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  -21.4 {.  execsq
6640: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74  l {.    SELECT t
6650: 79 70 65 6f 66 28 72 65 70 6c 61 63 65 28 4e 55  ypeof(replace(NU
6660: 4c 4c 2c 20 22 6d 61 69 6e 22 2c 20 22 41 4c 54  LL, "main", "ALT
6670: 22 29 29 3b 0a 20 20 7d 0a 7d 20 7b 6e 75 6c 6c  "));.  }.} {null
6680: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  }.do_test func-2
6690: 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.5 {.  execsql 
66a0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 79 70  {.    SELECT typ
66b0: 65 6f 66 28 72 65 70 6c 61 63 65 28 22 54 68 69  eof(replace("Thi
66c0: 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 74 65  s is the main te
66d0: 73 74 20 73 74 72 69 6e 67 22 2c 20 22 6d 61 69  st string", "mai
66e0: 6e 22 2c 20 4e 55 4c 4c 29 29 3b 0a 20 20 7d 0a  n", NULL));.  }.
66f0: 7d 20 7b 6e 75 6c 6c 7d 0a 64 6f 5f 74 65 73 74  } {null}.do_test
6700: 20 66 75 6e 63 2d 32 31 2e 36 20 7b 0a 20 20 65   func-21.6 {.  e
6710: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
6720: 45 43 54 20 72 65 70 6c 61 63 65 28 22 54 68 69  ECT replace("Thi
6730: 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 74 65  s is the main te
6740: 73 74 20 73 74 72 69 6e 67 22 2c 20 22 6d 61 69  st string", "mai
6750: 6e 22 2c 20 22 41 4c 54 22 29 3b 0a 20 20 7d 0a  n", "ALT");.  }.
6760: 7d 20 7b 7b 54 68 69 73 20 69 73 20 74 68 65 20  } {{This is the 
6770: 41 4c 54 20 74 65 73 74 20 73 74 72 69 6e 67 7d  ALT test string}
6780: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  }.do_test func-2
6790: 31 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.7 {.  execsql 
67a0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 65 70  {.    SELECT rep
67b0: 6c 61 63 65 28 22 54 68 69 73 20 69 73 20 74 68  lace("This is th
67c0: 65 20 6d 61 69 6e 20 74 65 73 74 20 73 74 72 69  e main test stri
67d0: 6e 67 22 2c 20 22 6d 61 69 6e 22 2c 20 22 6c 61  ng", "main", "la
67e0: 72 67 65 72 2d 6d 61 69 6e 22 29 3b 0a 20 20 7d  rger-main");.  }
67f0: 0a 7d 20 7b 7b 54 68 69 73 20 69 73 20 74 68 65  .} {{This is the
6800: 20 6c 61 72 67 65 72 2d 6d 61 69 6e 20 74 65 73   larger-main tes
6810: 74 20 73 74 72 69 6e 67 7d 7d 0a 64 6f 5f 74 65  t string}}.do_te
6820: 73 74 20 66 75 6e 63 2d 32 31 2e 38 20 7b 0a 20  st func-21.8 {. 
6830: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
6840: 45 4c 45 43 54 20 72 65 70 6c 61 63 65 28 22 61  ELECT replace("a
6850: 61 61 61 61 61 61 22 2c 20 22 61 22 2c 20 22 30  aaaaaa", "a", "0
6860: 31 32 33 34 35 36 37 38 39 22 29 3b 0a 20 20 7d  123456789");.  }
6870: 0a 7d 20 7b 30 31 32 33 34 35 36 37 38 39 30 31  .} {012345678901
6880: 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37  2345678901234567
6890: 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33  8901234567890123
68a0: 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39  4567890123456789
68b0: 30 31 32 33 34 35 36 37 38 39 7d 0a 0a 69 66 63  0123456789}..ifc
68c0: 61 70 61 62 6c 65 20 74 63 6c 76 61 72 20 7b 0a  apable tclvar {.
68d0: 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32    do_test func-2
68e0: 31 2e 39 20 7b 0a 20 20 20 20 23 20 41 74 74 65  1.9 {.    # Atte
68f0: 6d 70 74 20 74 6f 20 65 78 70 6c 6f 69 74 20 61  mpt to exploit a
6900: 20 62 75 66 66 65 72 2d 6f 76 65 72 66 6c 6f 77   buffer-overflow
6910: 20 74 68 61 74 20 61 74 20 6f 6e 65 20 74 69 6d   that at one tim
6920: 65 20 65 78 69 73 74 65 64 20 0a 20 20 20 20 23  e existed .    #
6930: 20 69 6e 20 74 68 65 20 52 45 50 4c 41 43 45 20   in the REPLACE 
6940: 66 75 6e 63 74 69 6f 6e 2e 20 0a 20 20 20 20 73  function. .    s
6950: 65 74 20 3a 3a 73 74 72 20 22 5b 73 74 72 69 6e  et ::str "[strin
6960: 67 20 72 65 70 65 61 74 20 41 20 32 39 39 39 38  g repeat A 29998
6970: 5d 43 43 5b 73 74 72 69 6e 67 20 72 65 70 65 61  ]CC[string repea
6980: 74 20 41 20 33 35 35 33 37 5d 22 0a 20 20 20 20  t A 35537]".    
6990: 73 65 74 20 3a 3a 72 65 70 20 5b 73 74 72 69 6e  set ::rep [strin
69a0: 67 20 72 65 70 65 61 74 20 42 20 36 35 35 33 36  g repeat B 65536
69b0: 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  ].    execsql {.
69c0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 4c 45 4e        SELECT LEN
69d0: 47 54 48 28 52 45 50 4c 41 43 45 28 24 3a 3a 73  GTH(REPLACE($::s
69e0: 74 72 2c 20 27 43 27 2c 20 24 3a 3a 72 65 70 29  tr, 'C', $::rep)
69f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 65 78  );.    }.  } [ex
6a00: 70 72 20 32 39 39 39 38 20 2b 20 32 2a 36 35 35  pr 29998 + 2*655
6a10: 33 36 20 2b 20 33 35 35 33 37 5d 0a 7d 0a 0a 23  36 + 35537].}..#
6a20: 20 54 65 73 74 73 20 66 6f 72 20 74 68 65 20 54   Tests for the T
6a30: 52 49 4d 2c 20 4c 54 52 49 4d 20 61 6e 64 20 52  RIM, LTRIM and R
6a40: 54 52 49 4d 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  TRIM functions..
6a50: 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  #.do_test func-2
6a60: 32 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  2.1 {.  catchsql
6a70: 20 7b 53 45 4c 45 43 54 20 74 72 69 6d 28 31 2c   {SELECT trim(1,
6a80: 32 2c 33 29 7d 0a 7d 20 7b 31 20 7b 77 72 6f 6e  2,3)}.} {1 {wron
6a90: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
6aa0: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
6ab0: 6e 20 74 72 69 6d 28 29 7d 7d 0a 64 6f 5f 74 65  n trim()}}.do_te
6ac0: 73 74 20 66 75 6e 63 2d 32 32 2e 32 20 7b 0a 20  st func-22.2 {. 
6ad0: 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43   catchsql {SELEC
6ae0: 54 20 6c 74 72 69 6d 28 31 2c 32 2c 33 29 7d 0a  T ltrim(1,2,3)}.
6af0: 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 6e 75 6d 62  } {1 {wrong numb
6b00: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
6b10: 74 6f 20 66 75 6e 63 74 69 6f 6e 20 6c 74 72 69  to function ltri
6b20: 6d 28 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75  m()}}.do_test fu
6b30: 6e 63 2d 32 32 2e 33 20 7b 0a 20 20 63 61 74 63  nc-22.3 {.  catc
6b40: 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 74 72  hsql {SELECT rtr
6b50: 69 6d 28 31 2c 32 2c 33 29 7d 0a 7d 20 7b 31 20  im(1,2,3)}.} {1 
6b60: 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  {wrong number of
6b70: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
6b80: 6e 63 74 69 6f 6e 20 72 74 72 69 6d 28 29 7d 7d  nction rtrim()}}
6b90: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32  .do_test func-22
6ba0: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
6bb0: 53 45 4c 45 43 54 20 74 72 69 6d 28 27 20 20 68  SELECT trim('  h
6bc0: 69 20 20 27 29 3b 7d 0a 7d 20 7b 68 69 7d 0a 64  i  ');}.} {hi}.d
6bd0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 35  o_test func-22.5
6be0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
6bf0: 4c 45 43 54 20 6c 74 72 69 6d 28 27 20 20 68 69  LECT ltrim('  hi
6c00: 20 20 27 29 3b 7d 0a 7d 20 7b 7b 68 69 20 20 7d    ');}.} {{hi  }
6c10: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  }.do_test func-2
6c20: 32 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.6 {.  execsql 
6c30: 7b 53 45 4c 45 43 54 20 72 74 72 69 6d 28 27 20  {SELECT rtrim(' 
6c40: 20 68 69 20 20 27 29 3b 7d 0a 7d 20 7b 7b 20 20   hi  ');}.} {{  
6c50: 68 69 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  hi}}.do_test fun
6c60: 63 2d 32 32 2e 37 20 7b 0a 20 20 65 78 65 63 73  c-22.7 {.  execs
6c70: 71 6c 20 7b 53 45 4c 45 43 54 20 74 72 69 6d 28  ql {SELECT trim(
6c80: 27 20 20 68 69 20 20 27 2c 27 78 79 7a 27 29 3b  '  hi  ','xyz');
6c90: 7d 0a 7d 20 7b 7b 20 20 68 69 20 20 7d 7d 0a 64  }.} {{  hi  }}.d
6ca0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 38  o_test func-22.8
6cb0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
6cc0: 4c 45 43 54 20 6c 74 72 69 6d 28 27 20 20 68 69  LECT ltrim('  hi
6cd0: 20 20 27 2c 27 78 79 7a 27 29 3b 7d 0a 7d 20 7b    ','xyz');}.} {
6ce0: 7b 20 20 68 69 20 20 7d 7d 0a 64 6f 5f 74 65 73  {  hi  }}.do_tes
6cf0: 74 20 66 75 6e 63 2d 32 32 2e 39 20 7b 0a 20 20  t func-22.9 {.  
6d00: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
6d10: 72 74 72 69 6d 28 27 20 20 68 69 20 20 27 2c 27  rtrim('  hi  ','
6d20: 78 79 7a 27 29 3b 7d 0a 7d 20 7b 7b 20 20 68 69  xyz');}.} {{  hi
6d30: 20 20 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e    }}.do_test fun
6d40: 63 2d 32 32 2e 31 30 20 7b 0a 20 20 65 78 65 63  c-22.10 {.  exec
6d50: 73 71 6c 20 7b 53 45 4c 45 43 54 20 74 72 69 6d  sql {SELECT trim
6d60: 28 27 78 79 78 7a 79 20 20 68 69 20 20 7a 7a 7a  ('xyxzy  hi  zzz
6d70: 79 27 2c 27 78 79 7a 27 29 3b 7d 0a 7d 20 7b 7b  y','xyz');}.} {{
6d80: 20 20 68 69 20 20 7d 7d 0a 64 6f 5f 74 65 73 74    hi  }}.do_test
6d90: 20 66 75 6e 63 2d 32 32 2e 31 31 20 7b 0a 20 20   func-22.11 {.  
6da0: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
6db0: 6c 74 72 69 6d 28 27 78 79 78 7a 79 20 20 68 69  ltrim('xyxzy  hi
6dc0: 20 20 7a 7a 7a 79 27 2c 27 78 79 7a 27 29 3b 7d    zzzy','xyz');}
6dd0: 0a 7d 20 7b 7b 20 20 68 69 20 20 7a 7a 7a 79 7d  .} {{  hi  zzzy}
6de0: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  }.do_test func-2
6df0: 32 2e 31 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  2.12 {.  execsql
6e00: 20 7b 53 45 4c 45 43 54 20 72 74 72 69 6d 28 27   {SELECT rtrim('
6e10: 78 79 78 7a 79 20 20 68 69 20 20 7a 7a 7a 79 27  xyxzy  hi  zzzy'
6e20: 2c 27 78 79 7a 27 29 3b 7d 0a 7d 20 7b 7b 78 79  ,'xyz');}.} {{xy
6e30: 78 7a 79 20 20 68 69 20 20 7d 7d 0a 64 6f 5f 74  xzy  hi  }}.do_t
6e40: 65 73 74 20 66 75 6e 63 2d 32 32 2e 31 33 20 7b  est func-22.13 {
6e50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
6e60: 43 54 20 74 72 69 6d 28 27 20 20 68 69 20 20 27  CT trim('  hi  '
6e70: 2c 27 27 29 3b 7d 0a 7d 20 7b 7b 20 20 68 69 20  ,'');}.} {{  hi 
6e80: 20 7d 7d 0a 69 66 20 7b 5b 64 62 20 6f 6e 65 20   }}.if {[db one 
6e90: 7b 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67  {PRAGMA encoding
6ea0: 7d 5d 3d 3d 22 55 54 46 2d 38 22 7d 20 7b 0a 20  }]=="UTF-8"} {. 
6eb0: 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32   do_test func-22
6ec0: 2e 31 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .14 {.    execsq
6ed0: 6c 20 7b 53 45 4c 45 43 54 20 68 65 78 28 74 72  l {SELECT hex(tr
6ee0: 69 6d 28 78 27 63 32 38 30 65 31 62 66 62 66 66  im(x'c280e1bfbff
6ef0: 34 38 66 62 66 62 66 36 38 36 39 27 2c 78 27 36  48fbfbf6869',x'6
6f00: 31 36 32 65 31 62 66 62 66 63 32 38 30 27 29 29  162e1bfbfc280'))
6f10: 7d 0a 20 20 7d 20 7b 46 34 38 46 42 46 42 46 36  }.  } {F48FBFBF6
6f20: 38 36 39 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66  869}.  do_test f
6f30: 75 6e 63 2d 32 32 2e 31 35 20 7b 0a 20 20 20 20  unc-22.15 {.    
6f40: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
6f50: 68 65 78 28 74 72 69 6d 28 78 27 36 38 36 39 63  hex(trim(x'6869c
6f60: 32 38 30 65 31 62 66 62 66 66 34 38 66 62 66 62  280e1bfbff48fbfb
6f70: 66 36 31 27 2c 0a 20 20 20 20 20 20 20 20 20 20  f61',.          
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f90: 20 20 20 78 27 36 31 36 32 65 31 62 66 62 66 63     x'6162e1bfbfc
6fa0: 32 38 30 66 34 38 66 62 66 62 66 27 29 29 7d 0a  280f48fbfbf'))}.
6fb0: 20 20 7d 20 7b 36 38 36 39 7d 0a 20 20 64 6f 5f    } {6869}.  do_
6fc0: 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 31 36 20  test func-22.16 
6fd0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53  {.    execsql {S
6fe0: 45 4c 45 43 54 20 68 65 78 28 74 72 69 6d 28 78  ELECT hex(trim(x
6ff0: 27 63 65 62 31 63 65 62 32 63 65 62 33 27 2c 78  'ceb1ceb2ceb3',x
7000: 27 63 65 62 31 27 29 29 3b 7d 0a 20 20 7d 20 7b  'ceb1'));}.  } {
7010: 43 45 42 32 43 45 42 33 7d 0a 7d 0a 64 6f 5f 74  CEB2CEB3}.}.do_t
7020: 65 73 74 20 66 75 6e 63 2d 32 32 2e 32 30 20 7b  est func-22.20 {
7030: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
7040: 43 54 20 74 79 70 65 6f 66 28 74 72 69 6d 28 4e  CT typeof(trim(N
7050: 55 4c 4c 29 29 3b 7d 0a 7d 20 7b 6e 75 6c 6c 7d  ULL));}.} {null}
7060: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32  .do_test func-22
7070: 2e 32 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .21 {.  execsql 
7080: 7b 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 74  {SELECT typeof(t
7090: 72 69 6d 28 4e 55 4c 4c 2c 27 78 79 7a 27 29 29  rim(NULL,'xyz'))
70a0: 3b 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64 6f 5f 74  ;}.} {null}.do_t
70b0: 65 73 74 20 66 75 6e 63 2d 32 32 2e 32 32 20 7b  est func-22.22 {
70c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
70d0: 43 54 20 74 79 70 65 6f 66 28 74 72 69 6d 28 27  CT typeof(trim('
70e0: 68 65 6c 6c 6f 27 2c 4e 55 4c 4c 29 29 3b 7d 0a  hello',NULL));}.
70f0: 7d 20 7b 6e 75 6c 6c 7d 0a 0a 23 20 54 68 69 73  } {null}..# This
7100: 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 65 20   is to test the 
7110: 64 65 70 72 65 63 61 74 65 64 20 73 71 6c 69 74  deprecated sqlit
7120: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75  e3_aggregate_cou
7130: 6e 74 28 29 20 41 50 49 2e 0a 23 0a 69 66 63 61  nt() API..#.ifca
7140: 70 61 62 6c 65 20 64 65 70 72 65 63 61 74 65 64  pable deprecated
7150: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e   {.  do_test fun
7160: 63 2d 32 33 2e 31 20 7b 0a 20 20 20 20 73 71 6c  c-23.1 {.    sql
7170: 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72  ite3_create_aggr
7180: 65 67 61 74 65 20 64 62 0a 20 20 20 20 65 78 65  egate db.    exe
7190: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
71a0: 45 43 54 20 6c 65 67 61 63 79 5f 63 6f 75 6e 74  ECT legacy_count
71b0: 28 29 20 46 52 4f 4d 20 74 36 3b 0a 20 20 20 20  () FROM t6;.    
71c0: 7d 0a 20 20 7d 20 7b 33 7d 0a 7d 0a 0a 23 20 54  }.  } {3}.}..# T
71d0: 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  he group_concat(
71e0: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a 64 6f  ) function..#.do
71f0: 5f 74 65 73 74 20 66 75 6e 63 2d 32 34 2e 31 20  _test func-24.1 
7200: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
7210: 20 20 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63    SELECT group_c
7220: 6f 6e 63 61 74 28 74 31 29 20 46 52 4f 4d 20 74  oncat(t1) FROM t
7230: 62 6c 31 0a 20 20 7d 0a 7d 20 7b 74 68 69 73 2c  bl1.  }.} {this,
7240: 70 72 6f 67 72 61 6d 2c 69 73 2c 66 72 65 65 2c  program,is,free,
7250: 73 6f 66 74 77 61 72 65 7d 0a 64 6f 5f 74 65 73  software}.do_tes
7260: 74 20 66 75 6e 63 2d 32 34 2e 32 20 7b 0a 20 20  t func-24.2 {.  
7270: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
7280: 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61  LECT group_conca
7290: 74 28 74 31 2c 27 20 27 29 20 46 52 4f 4d 20 74  t(t1,' ') FROM t
72a0: 62 6c 31 0a 20 20 7d 0a 7d 20 7b 7b 74 68 69 73  bl1.  }.} {{this
72b0: 20 70 72 6f 67 72 61 6d 20 69 73 20 66 72 65 65   program is free
72c0: 20 73 6f 66 74 77 61 72 65 7d 7d 0a 64 6f 5f 74   software}}.do_t
72d0: 65 73 74 20 66 75 6e 63 2d 32 34 2e 33 20 7b 0a  est func-24.3 {.
72e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
72f0: 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e  SELECT group_con
7300: 63 61 74 28 74 31 2c 27 20 27 20 7c 7c 20 72 6f  cat(t1,' ' || ro
7310: 77 69 64 20 7c 7c 20 27 20 27 29 20 46 52 4f 4d  wid || ' ') FROM
7320: 20 74 62 6c 31 0a 20 20 7d 0a 7d 20 7b 7b 74 68   tbl1.  }.} {{th
7330: 69 73 20 32 20 70 72 6f 67 72 61 6d 20 33 20 69  is 2 program 3 i
7340: 73 20 34 20 66 72 65 65 20 35 20 73 6f 66 74 77  s 4 free 5 softw
7350: 61 72 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75  are}}.do_test fu
7360: 6e 63 2d 32 34 2e 34 20 7b 0a 20 20 65 78 65 63  nc-24.4 {.  exec
7370: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
7380: 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 4e 55   group_concat(NU
7390: 4c 4c 2c 74 31 29 20 46 52 4f 4d 20 74 62 6c 31  LL,t1) FROM tbl1
73a0: 0a 20 20 7d 0a 7d 20 7b 7b 7d 7d 0a 64 6f 5f 74  .  }.} {{}}.do_t
73b0: 65 73 74 20 66 75 6e 63 2d 32 34 2e 35 20 7b 0a  est func-24.5 {.
73c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
73d0: 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e  SELECT group_con
73e0: 63 61 74 28 74 31 2c 4e 55 4c 4c 29 20 46 52 4f  cat(t1,NULL) FRO
73f0: 4d 20 74 62 6c 31 0a 20 20 7d 0a 7d 20 7b 74 68  M tbl1.  }.} {th
7400: 69 73 70 72 6f 67 72 61 6d 69 73 66 72 65 65 73  isprogramisfrees
7410: 6f 66 74 77 61 72 65 7d 0a 64 6f 5f 74 65 73 74  oftware}.do_test
7420: 20 66 75 6e 63 2d 32 34 2e 36 20 7b 0a 20 20 65   func-24.6 {.  e
7430: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
7440: 45 43 54 20 27 42 45 47 49 4e 2d 27 7c 7c 67 72  ECT 'BEGIN-'||gr
7450: 6f 75 70 5f 63 6f 6e 63 61 74 28 74 31 29 20 46  oup_concat(t1) F
7460: 52 4f 4d 20 74 62 6c 31 0a 20 20 7d 0a 7d 20 7b  ROM tbl1.  }.} {
7470: 42 45 47 49 4e 2d 74 68 69 73 2c 70 72 6f 67 72  BEGIN-this,progr
7480: 61 6d 2c 69 73 2c 66 72 65 65 2c 73 6f 66 74 77  am,is,free,softw
7490: 61 72 65 7d 0a 0a 23 20 54 69 63 6b 65 74 20 23  are}..# Ticket #
74a0: 33 31 37 39 3a 20 20 4d 61 6b 65 20 73 75 72 65  3179:  Make sure
74b0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
74c0: 69 6f 6e 73 20 63 61 6e 20 74 61 6b 65 20 6d 61  ions can take ma
74d0: 6e 79 20 61 72 67 75 6d 65 6e 74 73 2e 0a 23 20  ny arguments..# 
74e0: 4e 6f 6e 65 20 6f 66 20 74 68 65 20 62 75 69 6c  None of the buil
74f0: 74 2d 69 6e 20 61 67 67 72 65 67 61 74 65 73 20  t-in aggregates 
7500: 64 6f 20 74 68 69 73 2c 20 73 6f 20 75 73 65 20  do this, so use 
7510: 74 68 65 20 6d 64 35 73 75 6d 28 29 20 66 72 6f  the md5sum() fro
7520: 6d 20 74 68 65 0a 23 20 74 65 73 74 20 65 78 74  m the.# test ext
7530: 65 6e 73 69 6f 6e 73 2e 0a 23 0a 75 6e 73 65 74  ensions..#.unset
7540: 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 6d 69 64   -nocomplain mid
7550: 61 72 67 73 0a 73 65 74 20 6d 69 64 61 72 67 73  args.set midargs
7560: 20 7b 7d 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d   {}.unset -nocom
7570: 70 6c 61 69 6e 20 6d 69 64 72 65 73 0a 73 65 74  plain midres.set
7580: 20 6d 69 64 72 65 73 20 7b 7d 0a 75 6e 73 65 74   midres {}.unset
7590: 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 72 65 73   -nocomplain res
75a0: 75 6c 74 0a 66 6f 72 20 7b 73 65 74 20 69 20 31  ult.for {set i 1
75b0: 7d 20 7b 24 69 3c 5b 73 71 6c 69 74 65 33 5f 6c  } {$i<[sqlite3_l
75c0: 69 6d 69 74 20 64 62 20 53 51 4c 49 54 45 5f 4c  imit db SQLITE_L
75d0: 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
75e0: 47 20 2d 31 5d 7d 20 7b 69 6e 63 72 20 69 7d 20  G -1]} {incr i} 
75f0: 7b 0a 20 20 61 70 70 65 6e 64 20 6d 69 64 61 72  {.  append midar
7600: 67 73 20 2c 27 2f 24 69 27 0a 20 20 61 70 70 65  gs ,'/$i'.  appe
7610: 6e 64 20 6d 69 64 72 65 73 20 2f 24 69 0a 20 20  nd midres /$i.  
7620: 73 65 74 20 72 65 73 75 6c 74 20 5b 6d 64 35 20  set result [md5 
7630: 5c 0a 20 20 20 20 20 22 74 68 69 73 24 7b 6d 69  \.     "this${mi
7640: 64 72 65 73 7d 70 72 6f 67 72 61 6d 24 7b 6d 69  dres}program${mi
7650: 64 72 65 73 7d 69 73 24 7b 6d 69 64 72 65 73 7d  dres}is${midres}
7660: 66 72 65 65 24 7b 6d 69 64 72 65 73 7d 73 6f 66  free${midres}sof
7670: 74 77 61 72 65 24 7b 6d 69 64 72 65 73 7d 22 5d  tware${midres}"]
7680: 0a 20 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45  .  set sql "SELE
7690: 43 54 20 6d 64 35 73 75 6d 28 74 31 24 6d 69 64  CT md5sum(t1$mid
76a0: 61 72 67 73 29 20 46 52 4f 4d 20 74 62 6c 31 22  args) FROM tbl1"
76b0: 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .  do_test func-
76c0: 32 34 2e 37 2e 24 69 20 7b 0a 20 20 20 20 20 64  24.7.$i {.     d
76d0: 62 20 65 76 61 6c 20 24 3a 3a 73 71 6c 0a 20 20  b eval $::sql.  
76e0: 7d 20 24 72 65 73 75 6c 74 0a 7d 0a 0a 23 20 54  } $result.}..# T
76f0: 69 63 6b 65 74 20 23 33 38 30 36 2e 20 20 49 66  icket #3806.  If
7700: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73 74 72   the initial str
7710: 69 6e 67 20 69 6e 20 61 20 67 72 6f 75 70 5f 63  ing in a group_c
7720: 6f 6e 63 61 74 20 69 73 20 61 6e 20 65 6d 70 74  oncat is an empt
7730: 79 0a 23 20 73 74 72 69 6e 67 2c 20 74 68 65 20  y.# string, the 
7740: 73 65 70 61 72 61 74 6f 72 20 74 68 61 74 20 66  separator that f
7750: 6f 6c 6c 6f 77 73 20 73 68 6f 75 6c 64 20 73 74  ollows should st
7760: 69 6c 6c 20 62 65 20 70 72 65 73 65 6e 74 2e 0a  ill be present..
7770: 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  #.do_test func-2
7780: 34 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.8 {.  execsql 
7790: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 67 72 6f  {.    SELECT gro
77a0: 75 70 5f 63 6f 6e 63 61 74 28 43 41 53 45 20 74  up_concat(CASE t
77b0: 31 20 57 48 45 4e 20 27 74 68 69 73 27 20 54 48  1 WHEN 'this' TH
77c0: 45 4e 20 27 27 20 45 4c 53 45 20 74 31 20 45 4e  EN '' ELSE t1 EN
77d0: 44 29 20 46 52 4f 4d 20 74 62 6c 31 0a 20 20 7d  D) FROM tbl1.  }
77e0: 0a 7d 20 7b 2c 70 72 6f 67 72 61 6d 2c 69 73 2c  .} {,program,is,
77f0: 66 72 65 65 2c 73 6f 66 74 77 61 72 65 7d 0a 64  free,software}.d
7800: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 34 2e 39  o_test func-24.9
7810: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
7820: 20 20 20 53 45 4c 45 43 54 20 67 72 6f 75 70 5f     SELECT group_
7830: 63 6f 6e 63 61 74 28 43 41 53 45 20 57 48 45 4e  concat(CASE WHEN
7840: 20 74 31 21 3d 27 73 6f 66 74 77 61 72 65 27 20   t1!='software' 
7850: 54 48 45 4e 20 27 27 20 45 4c 53 45 20 74 31 20  THEN '' ELSE t1 
7860: 45 4e 44 29 20 46 52 4f 4d 20 74 62 6c 31 0a 20  END) FROM tbl1. 
7870: 20 7d 0a 7d 20 7b 2c 2c 2c 2c 73 6f 66 74 77 61   }.} {,,,,softwa
7880: 72 65 7d 0a 0a 23 20 54 69 63 6b 65 74 20 23 33  re}..# Ticket #3
7890: 39 32 33 2e 20 20 49 6e 69 74 69 61 6c 20 65 6d  923.  Initial em
78a0: 70 74 79 20 73 74 72 69 6e 67 73 20 68 61 76 65  pty strings have
78b0: 20 61 20 73 65 70 61 72 61 74 6f 72 2e 20 20 42   a separator.  B
78c0: 75 74 20 69 6e 69 74 69 61 6c 0a 23 20 4e 55 4c  ut initial.# NUL
78d0: 4c 73 20 64 6f 20 6e 6f 74 2e 0a 23 0a 64 6f 5f  Ls do not..#.do_
78e0: 74 65 73 74 20 66 75 6e 63 2d 32 34 2e 31 30 20  test func-24.10 
78f0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
7900: 20 20 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63    SELECT group_c
7910: 6f 6e 63 61 74 28 43 41 53 45 20 74 31 20 57 48  oncat(CASE t1 WH
7920: 45 4e 20 27 74 68 69 73 27 20 54 48 45 4e 20 6e  EN 'this' THEN n
7930: 75 6c 6c 20 45 4c 53 45 20 74 31 20 45 4e 44 29  ull ELSE t1 END)
7940: 20 46 52 4f 4d 20 74 62 6c 31 0a 20 20 7d 0a 7d   FROM tbl1.  }.}
7950: 20 7b 70 72 6f 67 72 61 6d 2c 69 73 2c 66 72 65   {program,is,fre
7960: 65 2c 73 6f 66 74 77 61 72 65 7d 0a 64 6f 5f 74  e,software}.do_t
7970: 65 73 74 20 66 75 6e 63 2d 32 34 2e 31 31 20 7b  est func-24.11 {
7980: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
7990: 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e  SELECT group_con
79a0: 63 61 74 28 43 41 53 45 20 57 48 45 4e 20 74 31  cat(CASE WHEN t1
79b0: 21 3d 27 73 6f 66 74 77 61 72 65 27 20 54 48 45  !='software' THE
79c0: 4e 20 6e 75 6c 6c 20 45 4c 53 45 20 74 31 20 45  N null ELSE t1 E
79d0: 4e 44 29 20 46 52 4f 4d 20 74 62 6c 31 0a 20 20  ND) FROM tbl1.  
79e0: 7d 0a 7d 20 7b 73 6f 66 74 77 61 72 65 7d 0a 64  }.} {software}.d
79f0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 34 2e 31  o_test func-24.1
7a00: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
7a10: 20 20 20 20 53 45 4c 45 43 54 20 67 72 6f 75 70      SELECT group
7a20: 5f 63 6f 6e 63 61 74 28 43 41 53 45 20 74 31 20  _concat(CASE t1 
7a30: 57 48 45 4e 20 27 74 68 69 73 27 20 54 48 45 4e  WHEN 'this' THEN
7a40: 20 27 27 0a 20 20 20 20 20 20 20 20 20 20 20 20   ''.            
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
7a60: 45 4e 20 27 70 72 6f 67 72 61 6d 27 20 54 48 45  EN 'program' THE
7a70: 4e 20 6e 75 6c 6c 20 45 4c 53 45 20 74 31 20 45  N null ELSE t1 E
7a80: 4e 44 29 20 46 52 4f 4d 20 74 62 6c 31 0a 20 20  ND) FROM tbl1.  
7a90: 7d 0a 7d 20 7b 2c 69 73 2c 66 72 65 65 2c 73 6f  }.} {,is,free,so
7aa0: 66 74 77 61 72 65 7d 0a 0a 0a 23 20 55 73 65 20  ftware}...# Use 
7ab0: 74 68 65 20 74 65 73 74 5f 69 73 6f 6c 61 74 69  the test_isolati
7ac0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6d  on function to m
7ad0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 79  ake sure that ty
7ae0: 70 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 23  pe conversions.#
7af0: 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   on function arg
7b00: 75 6d 65 6e 74 73 20 64 6f 20 6e 6f 74 20 65 66  uments do not ef
7b10: 66 65 63 74 20 73 75 62 73 65 71 75 65 6e 74 20  fect subsequent 
7b20: 61 72 67 75 6d 65 6e 74 73 2e 0a 23 0a 64 6f 5f  arguments..#.do_
7b30: 74 65 73 74 20 66 75 6e 63 2d 32 35 2e 31 20 7b  test func-25.1 {
7b40: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
7b50: 43 54 20 74 65 73 74 5f 69 73 6f 6c 61 74 69 6f  CT test_isolatio
7b60: 6e 28 74 31 2c 74 31 29 20 46 52 4f 4d 20 74 62  n(t1,t1) FROM tb
7b70: 6c 31 7d 0a 7d 20 7b 74 68 69 73 20 70 72 6f 67  l1}.} {this prog
7b80: 72 61 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74  ram is free soft
7b90: 77 61 72 65 7d 0a 0a 23 20 54 72 79 20 74 6f 20  ware}..# Try to 
7ba0: 6d 69 73 75 73 65 20 74 68 65 20 73 71 6c 69 74  misuse the sqlit
7bb0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7bc0: 6f 6e 28 29 20 69 6e 74 65 72 66 61 63 65 2e 20  on() interface. 
7bd0: 20 56 65 72 69 66 79 20 74 68 61 74 0a 23 20 65   Verify that.# e
7be0: 72 72 6f 72 73 20 61 72 65 20 72 65 74 75 72 6e  rrors are return
7bf0: 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75  ed..#.do_test fu
7c00: 6e 63 2d 32 36 2e 31 20 7b 0a 20 20 61 62 75 73  nc-26.1 {.  abus
7c10: 65 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  e_create_functio
7c20: 6e 20 64 62 0a 7d 20 7b 7d 0a 0a 23 20 54 68 65  n db.} {}..# The
7c30: 20 70 72 65 76 69 6f 75 73 20 74 65 73 74 20 28   previous test (
7c40: 66 75 6e 63 2d 32 36 2e 31 29 20 72 65 67 69 73  func-26.1) regis
7c50: 74 65 72 65 64 20 61 20 66 75 6e 63 74 69 6f 6e  tered a function
7c60: 20 77 69 74 68 20 61 20 76 65 72 79 20 6c 6f 6e   with a very lon
7c70: 67 0a 23 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  g.# function nam
7c80: 65 20 74 68 61 74 20 74 61 6b 65 73 20 6d 61 6e  e that takes man
7c90: 79 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20  y arguments and 
7ca0: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 4e  always returns N
7cb0: 55 4c 4c 2e 20 20 56 65 72 69 66 79 0a 23 20 74  ULL.  Verify.# t
7cc0: 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
7cd0: 6e 20 77 6f 72 6b 73 20 63 6f 72 72 65 63 74 6c  n works correctl
7ce0: 79 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e  y..#.do_test fun
7cf0: 63 2d 32 36 2e 32 20 7b 0a 20 20 73 65 74 20 61  c-26.2 {.  set a
7d00: 20 7b 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69   {}.  for {set i
7d10: 20 31 7d 20 7b 24 69 3c 3d 24 3a 3a 53 51 4c 49   1} {$i<=$::SQLI
7d20: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
7d30: 41 52 47 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  ARG} {incr i} {.
7d40: 20 20 20 20 6c 61 70 70 65 6e 64 20 61 20 24 69      lappend a $i
7d50: 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20 22  .  }.  db eval "
7d60: 0a 20 20 20 20 20 53 45 4c 45 43 54 20 6e 75 6c  .     SELECT nul
7d70: 6c 78 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  lx_123456789_123
7d80: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
7d90: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
7da0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
7db0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
7dc0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
7dd0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
7de0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
7df0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
7e00: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
7e10: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
7e20: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
7e30: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
7e40: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
7e50: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
7e60: 38 39 5f 31 32 33 34 35 36 37 38 39 28 5b 6a 6f  89_123456789([jo
7e70: 69 6e 20 24 61 20 2c 5d 29 3b 0a 20 20 22 0a 7d  in $a ,]);.  ".}
7e80: 20 7b 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75   {{}}.do_test fu
7e90: 6e 63 2d 32 36 2e 33 20 7b 0a 20 20 73 65 74 20  nc-26.3 {.  set 
7ea0: 61 20 7b 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20  a {}.  for {set 
7eb0: 69 20 31 7d 20 7b 24 69 3c 3d 24 3a 3a 53 51 4c  i 1} {$i<=$::SQL
7ec0: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
7ed0: 5f 41 52 47 2b 31 7d 20 7b 69 6e 63 72 20 69 7d  _ARG+1} {incr i}
7ee0: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 61   {.    lappend a
7ef0: 20 24 69 0a 20 20 7d 0a 20 20 63 61 74 63 68 73   $i.  }.  catchs
7f00: 71 6c 20 22 0a 20 20 20 20 20 53 45 4c 45 43 54  ql ".     SELECT
7f10: 20 6e 75 6c 6c 78 5f 31 32 33 34 35 36 37 38 39   nullx_123456789
7f20: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
7f30: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
7f40: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
7f50: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
7f60: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
7f70: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
7f80: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
7f90: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
7fa0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
7fb0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
7fc0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
7fd0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
7fe0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
7ff0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8000: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8010: 28 5b 6a 6f 69 6e 20 24 61 20 2c 5d 29 3b 0a 20  ([join $a ,]);. 
8020: 20 22 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e   ".} {1 {too man
8030: 79 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 66  y arguments on f
8040: 75 6e 63 74 69 6f 6e 20 6e 75 6c 6c 78 5f 31 32  unction nullx_12
8050: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8060: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8070: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8080: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8090: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
80a0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
80b0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
80c0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
80d0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
80e0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
80f0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8100: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8110: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8120: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8130: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8140: 33 34 35 36 37 38 39 7d 7d 0a 64 6f 5f 74 65 73  3456789}}.do_tes
8150: 74 20 66 75 6e 63 2d 32 36 2e 34 20 7b 0a 20 20  t func-26.4 {.  
8160: 73 65 74 20 61 20 7b 7d 0a 20 20 66 6f 72 20 7b  set a {}.  for {
8170: 73 65 74 20 69 20 31 7d 20 7b 24 69 3c 3d 24 3a  set i 1} {$i<=$:
8180: 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43  :SQLITE_MAX_FUNC
8190: 54 49 4f 4e 5f 41 52 47 2d 31 7d 20 7b 69 6e 63  TION_ARG-1} {inc
81a0: 72 20 69 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65  r i} {.    lappe
81b0: 6e 64 20 61 20 24 69 0a 20 20 7d 0a 20 20 63 61  nd a $i.  }.  ca
81c0: 74 63 68 73 71 6c 20 22 0a 20 20 20 20 20 53 45  tchsql ".     SE
81d0: 4c 45 43 54 20 6e 75 6c 6c 78 5f 31 32 33 34 35  LECT nullx_12345
81e0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
81f0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8200: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8210: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8220: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8230: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8240: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8250: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8260: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8270: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8280: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8290: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
82a0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
82b0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
82c0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
82d0: 36 37 38 39 28 5b 6a 6f 69 6e 20 24 61 20 2c 5d  6789([join $a ,]
82e0: 29 3b 0a 20 20 22 0a 7d 20 7b 31 20 7b 77 72 6f  );.  ".} {1 {wro
82f0: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
8300: 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69  uments to functi
8310: 6f 6e 20 6e 75 6c 6c 78 5f 31 32 33 34 35 36 37  on nullx_1234567
8320: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8330: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8340: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8350: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8360: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8370: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8380: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8390: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
83a0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
83b0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
83c0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
83d0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
83e0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
83f0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8400: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8410: 38 39 28 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  89()}}.do_test f
8420: 75 6e 63 2d 32 36 2e 35 20 7b 0a 20 20 63 61 74  unc-26.5 {.  cat
8430: 63 68 73 71 6c 20 22 0a 20 20 20 20 20 53 45 4c  chsql ".     SEL
8440: 45 43 54 20 6e 75 6c 6c 78 5f 31 32 33 34 35 36  ECT nullx_123456
8450: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8460: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8470: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8480: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8490: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
84a0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
84b0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
84c0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
84d0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
84e0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
84f0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8500: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8510: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8520: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8530: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8540: 37 38 61 28 30 29 3b 0a 20 20 22 0a 7d 20 7b 31  78a(0);.  ".} {1
8550: 20 7b 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69   {no such functi
8560: 6f 6e 3a 20 6e 75 6c 6c 78 5f 31 32 33 34 35 36  on: nullx_123456
8570: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8580: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8590: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
85a0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
85b0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
85c0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
85d0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
85e0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
85f0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8600: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8610: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8620: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8630: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8640: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8650: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8660: 37 38 61 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75  78a}}.do_test fu
8670: 6e 63 2d 32 36 2e 36 20 7b 0a 20 20 63 61 74 63  nc-26.6 {.  catc
8680: 68 73 71 6c 20 22 0a 20 20 20 20 20 53 45 4c 45  hsql ".     SELE
8690: 43 54 20 6e 75 6c 6c 78 5f 31 32 33 34 35 36 37  CT nullx_1234567
86a0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
86b0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
86c0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
86d0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
86e0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
86f0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8700: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8710: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8720: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8730: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8740: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8750: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8760: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8770: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8780: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8790: 38 39 61 28 30 29 3b 0a 20 20 22 0a 7d 20 7b 31  89a(0);.  ".} {1
87a0: 20 7b 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69   {no such functi
87b0: 6f 6e 3a 20 6e 75 6c 6c 78 5f 31 32 33 34 35 36  on: nullx_123456
87c0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
87d0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
87e0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
87f0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8800: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8810: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8820: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8830: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8840: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8850: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8860: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8870: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8880: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8890: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
88a0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
88b0: 37 38 39 61 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20  789a}}..do_test 
88c0: 66 75 6e 63 2d 32 37 2e 31 20 7b 0a 20 20 63 61  func-27.1 {.  ca
88d0: 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 63  tchsql {SELECT c
88e0: 6f 61 6c 65 73 63 65 28 29 7d 0a 7d 20 7b 31 20  oalesce()}.} {1 
88f0: 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  {wrong number of
8900: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
8910: 6e 63 74 69 6f 6e 20 63 6f 61 6c 65 73 63 65 28  nction coalesce(
8920: 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  )}}.do_test func
8930: 2d 32 37 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  -27.2 {.  catchs
8940: 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 61 6c 65  ql {SELECT coale
8950: 73 63 65 28 31 29 7d 0a 7d 20 7b 31 20 7b 77 72  sce(1)}.} {1 {wr
8960: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
8970: 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
8980: 69 6f 6e 20 63 6f 61 6c 65 73 63 65 28 29 7d 7d  ion coalesce()}}
8990: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 37  .do_test func-27
89a0: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
89b0: 7b 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65  {SELECT coalesce
89c0: 28 31 2c 32 29 7d 0a 7d 20 7b 30 20 31 7d 0a 0a  (1,2)}.} {0 1}..
89d0: 23 20 54 69 63 6b 65 74 20 32 64 34 30 31 61 39  # Ticket 2d401a9
89e0: 34 32 38 37 62 35 0a 23 20 55 6e 6b 6e 6f 77 6e  4287b5.# Unknown
89f0: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 61 20 44   function in a D
8a00: 45 46 41 55 4c 54 20 65 78 70 72 65 73 73 69 6f  EFAULT expressio
8a10: 6e 20 63 61 75 73 65 73 20 61 20 73 65 67 66 61  n causes a segfa
8a20: 75 6c 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66  ult..#.do_test f
8a30: 75 6e 63 2d 32 38 2e 31 20 7b 0a 20 20 64 62 20  unc-28.1 {.  db 
8a40: 65 76 61 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  eval {.    CREAT
8a50: 45 20 54 41 42 4c 45 20 74 32 38 28 78 2c 20 79  E TABLE t28(x, y
8a60: 20 44 45 46 41 55 4c 54 28 6e 6f 73 75 63 68 66   DEFAULT(nosuchf
8a70: 75 6e 63 28 31 29 29 29 3b 0a 20 20 7d 0a 20 20  unc(1)));.  }.  
8a80: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49  catchsql {.    I
8a90: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 38 28 78  NSERT INTO t28(x
8aa0: 29 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 7d  ) VALUES(1);.  }
8ab0: 0a 7d 20 7b 31 20 7b 75 6e 6b 6e 6f 77 6e 20 66  .} {1 {unknown f
8ac0: 75 6e 63 74 69 6f 6e 3a 20 6e 6f 73 75 63 68 66  unction: nosuchf
8ad0: 75 6e 63 28 29 7d 7d 0a 0a 23 20 56 65 72 69 66  unc()}}..# Verif
8ae0: 79 20 74 68 61 74 20 74 68 65 20 6c 65 6e 67 74  y that the lengt
8af0: 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29  h() and typeof()
8b00: 20 66 75 6e 63 74 69 6f 6e 73 20 64 6f 20 6e 6f   functions do no
8b10: 74 20 61 63 74 75 61 6c 6c 79 20 6c 6f 61 64 0a  t actually load.
8b20: 23 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  # the content of
8b30: 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 2e   their argument.
8b40: 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .#.do_test func-
8b50: 32 39 2e 31 20 7b 0a 20 20 64 62 20 65 76 61 6c  29.1 {.  db eval
8b60: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
8b70: 42 4c 45 20 74 32 39 28 69 64 20 49 4e 54 45 47  BLE t29(id INTEG
8b80: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
8b90: 78 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52  x, y);.    INSER
8ba0: 54 20 49 4e 54 4f 20 74 32 39 20 56 41 4c 55 45  T INTO t29 VALUE
8bb0: 53 28 31 2c 20 32 2c 20 33 29 2c 20 28 32 2c 20  S(1, 2, 3), (2, 
8bc0: 4e 55 4c 4c 2c 20 34 29 2c 20 28 33 2c 20 34 2e  NULL, 4), (3, 4.
8bd0: 35 2c 20 35 29 3b 0a 20 20 20 20 49 4e 53 45 52  5, 5);.    INSER
8be0: 54 20 49 4e 54 4f 20 74 32 39 20 56 41 4c 55 45  T INTO t29 VALUE
8bf0: 53 28 34 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  S(4, randomblob(
8c00: 31 30 30 30 30 30 30 29 2c 20 36 29 3b 0a 20 20  1000000), 6);.  
8c10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
8c20: 39 20 56 41 4c 55 45 53 28 35 2c 20 22 68 65 6c  9 VALUES(5, "hel
8c30: 6c 6f 22 2c 20 37 29 3b 0a 20 20 7d 0a 20 20 64  lo", 7);.  }.  d
8c40: 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65  b close.  sqlite
8c50: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 73  3 db test.db.  s
8c60: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
8c70: 20 64 62 20 43 41 43 48 45 5f 4d 49 53 53 20 31   db CACHE_MISS 1
8c80: 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  .  db eval {SELE
8c90: 43 54 20 74 79 70 65 6f 66 28 78 29 2c 20 6c 65  CT typeof(x), le
8ca0: 6e 67 74 68 28 78 29 2c 20 74 79 70 65 6f 66 28  ngth(x), typeof(
8cb0: 79 29 20 46 52 4f 4d 20 74 32 39 20 4f 52 44 45  y) FROM t29 ORDE
8cc0: 52 20 42 59 20 69 64 7d 0a 7d 20 7b 69 6e 74 65  R BY id}.} {inte
8cd0: 67 65 72 20 31 20 69 6e 74 65 67 65 72 20 6e 75  ger 1 integer nu
8ce0: 6c 6c 20 7b 7d 20 69 6e 74 65 67 65 72 20 72 65  ll {} integer re
8cf0: 61 6c 20 33 20 69 6e 74 65 67 65 72 20 62 6c 6f  al 3 integer blo
8d00: 62 20 31 30 30 30 30 30 30 20 69 6e 74 65 67 65  b 1000000 intege
8d10: 72 20 74 65 78 74 20 35 20 69 6e 74 65 67 65 72  r text 5 integer
8d20: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  }.do_test func-2
8d30: 39 2e 32 20 7b 0a 20 20 73 65 74 20 78 20 5b 6c  9.2 {.  set x [l
8d40: 69 6e 64 65 78 20 5b 73 71 6c 69 74 65 33 5f 64  index [sqlite3_d
8d50: 62 5f 73 74 61 74 75 73 20 64 62 20 43 41 43 48  b_status db CACH
8d60: 45 5f 4d 49 53 53 20 31 5d 20 31 5d 0a 20 20 69  E_MISS 1] 1].  i
8d70: 66 20 7b 24 78 3c 35 7d 20 7b 73 65 74 20 78 20  f {$x<5} {set x 
8d80: 31 7d 0a 20 20 73 65 74 20 78 0a 7d 20 7b 31 7d  1}.  set x.} {1}
8d90: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 39  .do_test func-29
8da0: 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .3 {.  db close.
8db0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
8dc0: 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 5f 64  t.db.  sqlite3_d
8dd0: 62 5f 73 74 61 74 75 73 20 64 62 20 43 41 43 48  b_status db CACH
8de0: 45 5f 4d 49 53 53 20 31 0a 20 20 64 62 20 65 76  E_MISS 1.  db ev
8df0: 61 6c 20 7b 53 45 4c 45 43 54 20 74 79 70 65 6f  al {SELECT typeo
8e00: 66 28 2b 78 29 20 46 52 4f 4d 20 74 32 39 20 4f  f(+x) FROM t29 O
8e10: 52 44 45 52 20 42 59 20 69 64 7d 0a 7d 20 7b 69  RDER BY id}.} {i
8e20: 6e 74 65 67 65 72 20 6e 75 6c 6c 20 72 65 61 6c  nteger null real
8e30: 20 62 6c 6f 62 20 74 65 78 74 7d 0a 69 66 20 7b   blob text}.if {
8e40: 5b 70 65 72 6d 75 74 61 74 69 6f 6e 5d 20 21 3d  [permutation] !=
8e50: 20 22 6d 6d 61 70 22 7d 20 7b 0a 20 20 69 66 63   "mmap"} {.  ifc
8e60: 61 70 61 62 6c 65 20 21 64 69 72 65 63 74 5f 72  apable !direct_r
8e70: 65 61 64 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73  ead {.    do_tes
8e80: 74 20 66 75 6e 63 2d 32 39 2e 34 20 7b 0a 20 20  t func-29.4 {.  
8e90: 20 20 20 20 73 65 74 20 78 20 5b 6c 69 6e 64 65      set x [linde
8ea0: 78 20 5b 73 71 6c 69 74 65 33 5f 64 62 5f 73 74  x [sqlite3_db_st
8eb0: 61 74 75 73 20 64 62 20 43 41 43 48 45 5f 4d 49  atus db CACHE_MI
8ec0: 53 53 20 31 5d 20 31 5d 0a 20 20 20 20 20 20 69  SS 1] 1].      i
8ed0: 66 20 7b 24 78 3e 31 30 30 7d 20 7b 73 65 74 20  f {$x>100} {set 
8ee0: 78 20 6d 61 6e 79 7d 0a 20 20 20 20 20 20 73 65  x many}.      se
8ef0: 74 20 78 0a 20 20 20 20 7d 20 7b 6d 61 6e 79 7d  t x.    } {many}
8f00: 0a 20 20 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 66  .  }.}.do_test f
8f10: 75 6e 63 2d 32 39 2e 35 20 7b 0a 20 20 64 62 20  unc-29.5 {.  db 
8f20: 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20  close.  sqlite3 
8f30: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c  db test.db.  sql
8f40: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 20 64  ite3_db_status d
8f50: 62 20 43 41 43 48 45 5f 4d 49 53 53 20 31 0a 20  b CACHE_MISS 1. 
8f60: 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54   db eval {SELECT
8f70: 20 73 75 6d 28 6c 65 6e 67 74 68 28 78 29 29 20   sum(length(x)) 
8f80: 46 52 4f 4d 20 74 32 39 7d 0a 7d 20 7b 31 30 30  FROM t29}.} {100
8f90: 30 30 30 39 7d 0a 64 6f 5f 74 65 73 74 20 66 75  0009}.do_test fu
8fa0: 6e 63 2d 32 39 2e 36 20 7b 0a 20 20 73 65 74 20  nc-29.6 {.  set 
8fb0: 78 20 5b 6c 69 6e 64 65 78 20 5b 73 71 6c 69 74  x [lindex [sqlit
8fc0: 65 33 5f 64 62 5f 73 74 61 74 75 73 20 64 62 20  e3_db_status db 
8fd0: 43 41 43 48 45 5f 4d 49 53 53 20 31 5d 20 31 5d  CACHE_MISS 1] 1]
8fe0: 0a 20 20 69 66 20 7b 24 78 3c 35 7d 20 7b 73 65  .  if {$x<5} {se
8ff0: 74 20 78 20 31 7d 0a 20 20 73 65 74 20 78 0a 7d  t x 1}.  set x.}
9000: 20 7b 31 7d 0a 0a 23 20 54 68 65 20 4f 50 5f 43   {1}..# The OP_C
9010: 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 68 61 73  olumn opcode has
9020: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
9030: 20 74 68 61 74 20 61 76 6f 69 64 73 20 6c 6f 61   that avoids loa
9040: 64 69 6e 67 20 63 6f 6e 74 65 6e 74 0a 23 20 66  ding content.# f
9050: 6f 72 20 66 69 65 6c 64 73 20 77 69 74 68 20 63  or fields with c
9060: 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3d 30 20  ontent-length=0 
9070: 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
9080: 20 6f 66 66 73 65 74 20 69 73 20 6f 6e 20 61 6e   offset is on an
9090: 20 6f 76 65 72 66 6c 6f 77 0a 23 20 70 61 67 65   overflow.# page
90a0: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
90b0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 6f   optimization wo
90c0: 72 6b 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  rks..#.do_execsq
90d0: 6c 5f 74 65 73 74 20 66 75 6e 63 2d 32 39 2e 31  l_test func-29.1
90e0: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
90f0: 4c 45 20 74 32 39 62 28 61 2c 62 2c 63 2c 64 2c  LE t29b(a,b,c,d,
9100: 65 2c 66 2c 67 2c 68 2c 69 29 3b 0a 20 20 49 4e  e,f,g,h,i);.  IN
9110: 53 45 52 54 20 49 4e 54 4f 20 74 32 39 62 20 0a  SERT INTO t29b .
9120: 20 20 20 56 41 4c 55 45 53 28 31 2c 20 68 65 78     VALUES(1, hex
9130: 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30 30  (randomblob(2000
9140: 29 29 2c 20 6e 75 6c 6c 2c 20 30 2c 20 31 2c 20  )), null, 0, 1, 
9150: 27 27 2c 20 7a 65 72 6f 62 6c 6f 62 28 30 29 2c  '', zeroblob(0),
9160: 27 78 27 2c 78 27 30 31 27 29 3b 0a 20 20 53 45  'x',x'01');.  SE
9170: 4c 45 43 54 20 74 79 70 65 6f 66 28 63 29 2c 20  LECT typeof(c), 
9180: 74 79 70 65 6f 66 28 64 29 2c 20 74 79 70 65 6f  typeof(d), typeo
9190: 66 28 65 29 2c 20 74 79 70 65 6f 66 28 66 29 2c  f(e), typeof(f),
91a0: 0a 20 20 20 20 20 20 20 20 20 74 79 70 65 6f 66  .         typeof
91b0: 28 67 29 2c 20 74 79 70 65 6f 66 28 68 29 2c 20  (g), typeof(h), 
91c0: 74 79 70 65 6f 66 28 69 29 20 46 52 4f 4d 20 74  typeof(i) FROM t
91d0: 32 39 62 3b 0a 7d 20 7b 6e 75 6c 6c 20 69 6e 74  29b;.} {null int
91e0: 65 67 65 72 20 69 6e 74 65 67 65 72 20 74 65 78  eger integer tex
91f0: 74 20 62 6c 6f 62 20 74 65 78 74 20 62 6c 6f 62  t blob text blob
9200: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
9210: 74 20 66 75 6e 63 2d 32 39 2e 31 31 20 7b 0a 20  t func-29.11 {. 
9220: 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28 66   SELECT length(f
9230: 29 2c 20 6c 65 6e 67 74 68 28 67 29 2c 20 6c 65  ), length(g), le
9240: 6e 67 74 68 28 68 29 2c 20 6c 65 6e 67 74 68 28  ngth(h), length(
9250: 69 29 20 46 52 4f 4d 20 74 32 39 62 3b 0a 7d 20  i) FROM t29b;.} 
9260: 7b 30 20 30 20 31 20 31 7d 0a 64 6f 5f 65 78 65  {0 0 1 1}.do_exe
9270: 63 73 71 6c 5f 74 65 73 74 20 66 75 6e 63 2d 32  csql_test func-2
9280: 39 2e 31 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  9.12 {.  SELECT 
9290: 71 75 6f 74 65 28 66 29 2c 20 71 75 6f 74 65 28  quote(f), quote(
92a0: 67 29 2c 20 71 75 6f 74 65 28 68 29 2c 20 71 75  g), quote(h), qu
92b0: 6f 74 65 28 69 29 20 46 52 4f 4d 20 74 32 39 62  ote(i) FROM t29b
92c0: 3b 0a 7d 20 7b 27 27 20 58 27 27 20 27 78 27 20  ;.} {'' X'' 'x' 
92d0: 58 27 30 31 27 7d 0a 0a 23 20 45 56 49 44 45 4e  X'01'}..# EVIDEN
92e0: 43 45 2d 4f 46 3a 20 52 2d 32 39 37 30 31 2d 35  CE-OF: R-29701-5
92f0: 30 37 31 31 20 54 68 65 20 75 6e 69 63 6f 64 65  0711 The unicode
9300: 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  (X) function ret
9310: 75 72 6e 73 20 74 68 65 20 6e 75 6d 65 72 69 63  urns the numeric
9320: 0a 23 20 75 6e 69 63 6f 64 65 20 63 6f 64 65 20  .# unicode code 
9330: 70 6f 69 6e 74 20 63 6f 72 72 65 73 70 6f 6e 64  point correspond
9340: 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
9350: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
9360: 65 20 73 74 72 69 6e 67 0a 23 20 58 2e 0a 23 0a  e string.# X..#.
9370: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
9380: 2d 35 35 34 36 39 2d 36 32 31 33 30 20 54 68 65  -55469-62130 The
9390: 20 63 68 61 72 28 58 31 2c 58 32 2c 2e 2e 2e 2c   char(X1,X2,...,
93a0: 58 4e 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  XN) function ret
93b0: 75 72 6e 73 20 61 0a 23 20 73 74 72 69 6e 67 20  urns a.# string 
93c0: 63 6f 6d 70 6f 73 65 64 20 6f 66 20 63 68 61 72  composed of char
93d0: 61 63 74 65 72 73 20 68 61 76 69 6e 67 20 74 68  acters having th
93e0: 65 20 75 6e 69 63 6f 64 65 20 63 6f 64 65 20 70  e unicode code p
93f0: 6f 69 6e 74 20 76 61 6c 75 65 73 20 6f 66 0a 23  oint values of.#
9400: 20 69 6e 74 65 67 65 72 73 20 58 31 20 74 68 72   integers X1 thr
9410: 6f 75 67 68 20 58 4e 2c 20 72 65 73 70 65 63 74  ough XN, respect
9420: 69 76 65 6c 79 2e 0a 23 0a 64 6f 5f 65 78 65 63  ively..#.do_exec
9430: 73 71 6c 5f 74 65 73 74 20 66 75 6e 63 2d 33 30  sql_test func-30
9440: 2e 31 20 7b 53 45 4c 45 43 54 20 75 6e 69 63 6f  .1 {SELECT unico
9450: 64 65 28 27 24 27 29 3b 7d 20 33 36 0a 64 6f 5f  de('$');} 36.do_
9460: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 66 75 6e  execsql_test fun
9470: 63 2d 33 30 2e 32 20 5b 73 75 62 73 74 20 7b 53  c-30.2 [subst {S
9480: 45 4c 45 43 54 20 75 6e 69 63 6f 64 65 28 27 5c  ELECT unicode('\
9490: 75 30 30 41 32 27 29 3b 7d 5d 20 31 36 32 0a 64  u00A2');}] 162.d
94a0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 66  o_execsql_test f
94b0: 75 6e 63 2d 33 30 2e 33 20 5b 73 75 62 73 74 20  unc-30.3 [subst 
94c0: 7b 53 45 4c 45 43 54 20 75 6e 69 63 6f 64 65 28  {SELECT unicode(
94d0: 27 5c 75 32 30 41 43 27 29 3b 7d 5d 20 38 33 36  '\u20AC');}] 836
94e0: 34 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  4.do_execsql_tes
94f0: 74 20 66 75 6e 63 2d 33 30 2e 34 20 7b 53 45 4c  t func-30.4 {SEL
9500: 45 43 54 20 63 68 61 72 28 33 36 2c 31 36 32 2c  ECT char(36,162,
9510: 38 33 36 34 29 3b 7d 20 5b 73 75 62 73 74 20 7b  8364);} [subst {
9520: 24 5c 75 30 30 41 32 5c 75 32 30 41 43 7d 5d 0a  $\u00A2\u20AC}].
9530: 0a 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b  .for {set i 1} {
9540: 24 69 3c 30 78 64 38 30 30 7d 20 7b 69 6e 63 72  $i<0xd800} {incr
9550: 20 69 20 31 33 7d 20 7b 0a 20 20 64 6f 5f 65 78   i 13} {.  do_ex
9560: 65 63 73 71 6c 5f 74 65 73 74 20 66 75 6e 63 2d  ecsql_test func-
9570: 33 30 2e 35 2e 24 69 20 7b 53 45 4c 45 43 54 20  30.5.$i {SELECT 
9580: 75 6e 69 63 6f 64 65 28 63 68 61 72 28 24 69 29  unicode(char($i)
9590: 29 7d 20 24 69 0a 7d 0a 66 6f 72 20 7b 73 65 74  )} $i.}.for {set
95a0: 20 69 20 35 37 33 34 34 7d 20 7b 24 69 3c 3d 30   i 57344} {$i<=0
95b0: 78 66 66 66 64 7d 20 7b 69 6e 63 72 20 69 20 31  xfffd} {incr i 1
95c0: 37 7d 20 7b 0a 20 20 69 66 20 7b 24 69 3d 3d 30  7} {.  if {$i==0
95d0: 78 66 65 66 66 7d 20 63 6f 6e 74 69 6e 75 65 0a  xfeff} continue.
95e0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
95f0: 74 20 66 75 6e 63 2d 33 30 2e 35 2e 24 69 20 7b  t func-30.5.$i {
9600: 53 45 4c 45 43 54 20 75 6e 69 63 6f 64 65 28 63  SELECT unicode(c
9610: 68 61 72 28 24 69 29 29 7d 20 24 69 0a 7d 0a 66  har($i))} $i.}.f
9620: 6f 72 20 7b 73 65 74 20 69 20 36 35 35 33 36 7d  or {set i 65536}
9630: 20 7b 24 69 3c 3d 30 78 31 30 66 66 66 66 7d 20   {$i<=0x10ffff} 
9640: 7b 69 6e 63 72 20 69 20 31 33 39 7d 20 7b 0a 20  {incr i 139} {. 
9650: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
9660: 20 66 75 6e 63 2d 33 30 2e 35 2e 24 69 20 7b 53   func-30.5.$i {S
9670: 45 4c 45 43 54 20 75 6e 69 63 6f 64 65 28 63 68  ELECT unicode(ch
9680: 61 72 28 24 69 29 29 7d 20 24 69 0a 7d 0a 0a 23  ar($i))} $i.}..#
9690: 20 54 65 73 74 20 63 68 61 72 28 29 2e 0a 23 0a   Test char()..#.
96a0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
96b0: 66 75 6e 63 2d 33 31 2e 31 20 7b 20 0a 20 20 53  func-31.1 { .  S
96c0: 45 4c 45 43 54 20 63 68 61 72 28 29 2c 20 6c 65  ELECT char(), le
96d0: 6e 67 74 68 28 63 68 61 72 28 29 29 2c 20 74 79  ngth(char()), ty
96e0: 70 65 6f 66 28 63 68 61 72 28 29 29 20 0a 7d 20  peof(char()) .} 
96f0: 7b 7b 7d 20 30 20 74 65 78 74 7d 0a 66 69 6e 69  {{} 0 text}.fini
9700: 73 68 5f 74 65 73 74 0a                          sh_test.