/ Hex Artifact Content
Login

Artifact e4313baba80bf933e58eb89a7c617bec0f0c348c862b096ec4387f36e05ad0a6:


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 20 20 64 6f 5f 65  99999.56}.  do_e
24c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 66 75 6e 63  xecsql_test func
24d0: 2d 34 2e 33 39 20 7b 0a 20 20 20 20 53 45 4c 45  -4.39 {.    SELE
24e0: 43 54 20 72 6f 75 6e 64 28 31 65 35 30 30 29 2c  CT round(1e500),
24f0: 20 72 6f 75 6e 64 28 2d 31 65 35 30 30 29 3b 0a   round(-1e500);.
2500: 20 20 7d 20 7b 49 6e 66 20 2d 49 6e 66 7d 0a 7d    } {Inf -Inf}.}
2510: 0a 0a 23 20 54 65 73 74 20 74 68 65 20 75 70 70  ..# Test the upp
2520: 65 72 28 29 20 61 6e 64 20 6c 6f 77 65 72 28 29  er() and lower()
2530: 20 66 75 6e 63 74 69 6f 6e 73 0a 23 0a 64 6f 5f   functions.#.do_
2540: 74 65 73 74 20 66 75 6e 63 2d 35 2e 31 20 7b 0a  test func-5.1 {.
2550: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
2560: 54 20 75 70 70 65 72 28 74 31 29 20 46 52 4f 4d  T upper(t1) FROM
2570: 20 74 62 6c 31 7d 0a 7d 20 7b 54 48 49 53 20 50   tbl1}.} {THIS P
2580: 52 4f 47 52 41 4d 20 49 53 20 46 52 45 45 20 53  ROGRAM IS FREE S
2590: 4f 46 54 57 41 52 45 7d 0a 64 6f 5f 74 65 73 74  OFTWARE}.do_test
25a0: 20 66 75 6e 63 2d 35 2e 32 20 7b 0a 20 20 65 78   func-5.2 {.  ex
25b0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6c 6f  ecsql {SELECT lo
25c0: 77 65 72 28 75 70 70 65 72 28 74 31 29 29 20 46  wer(upper(t1)) F
25d0: 52 4f 4d 20 74 62 6c 31 7d 0a 7d 20 7b 74 68 69  ROM tbl1}.} {thi
25e0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 72 65  s program is fre
25f0: 65 20 73 6f 66 74 77 61 72 65 7d 0a 64 6f 5f 74  e software}.do_t
2600: 65 73 74 20 66 75 6e 63 2d 35 2e 33 20 7b 0a 20  est func-5.3 {. 
2610: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
2620: 20 75 70 70 65 72 28 61 29 2c 20 6c 6f 77 65 72   upper(a), lower
2630: 28 61 29 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b  (a) FROM t2}.} {
2640: 31 20 31 20 7b 7d 20 7b 7d 20 33 34 35 20 33 34  1 1 {} {} 345 34
2650: 35 20 7b 7d 20 7b 7d 20 36 37 38 39 30 20 36 37  5 {} {} 67890 67
2660: 38 39 30 7d 0a 69 66 63 61 70 61 62 6c 65 20 21  890}.ifcapable !
2670: 69 63 75 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  icu {.  do_test 
2680: 66 75 6e 63 2d 35 2e 34 20 7b 0a 20 20 20 20 63  func-5.4 {.    c
2690: 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20  atchsql {SELECT 
26a0: 75 70 70 65 72 28 61 2c 35 29 20 46 52 4f 4d 20  upper(a,5) FROM 
26b0: 74 32 7d 0a 20 20 7d 20 7b 31 20 7b 77 72 6f 6e  t2}.  } {1 {wron
26c0: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
26d0: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
26e0: 6e 20 75 70 70 65 72 28 29 7d 7d 0a 7d 0a 64 6f  n upper()}}.}.do
26f0: 5f 74 65 73 74 20 66 75 6e 63 2d 35 2e 35 20 7b  _test func-5.5 {
2700: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c  .  catchsql {SEL
2710: 45 43 54 20 75 70 70 65 72 28 2a 29 20 46 52 4f  ECT upper(*) FRO
2720: 4d 20 74 32 7d 0a 7d 20 7b 31 20 7b 77 72 6f 6e  M t2}.} {1 {wron
2730: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
2740: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
2750: 6e 20 75 70 70 65 72 28 29 7d 7d 0a 0a 23 20 54  n upper()}}..# T
2760: 65 73 74 20 74 68 65 20 63 6f 61 6c 65 73 63 65  est the coalesce
2770: 28 29 20 61 6e 64 20 6e 75 6c 6c 69 66 28 29 20  () and nullif() 
2780: 66 75 6e 63 74 69 6f 6e 73 0a 23 0a 64 6f 5f 74  functions.#.do_t
2790: 65 73 74 20 66 75 6e 63 2d 36 2e 31 20 7b 0a 20  est func-6.1 {. 
27a0: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
27b0: 20 63 6f 61 6c 65 73 63 65 28 61 2c 27 78 79 7a   coalesce(a,'xyz
27c0: 27 29 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31  ') FROM t2}.} {1
27d0: 20 78 79 7a 20 33 34 35 20 78 79 7a 20 36 37 38   xyz 345 xyz 678
27e0: 39 30 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  90}.do_test func
27f0: 2d 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -6.2 {.  execsql
2800: 20 7b 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63   {SELECT coalesc
2810: 65 28 75 70 70 65 72 28 61 29 2c 27 6e 69 6c 27  e(upper(a),'nil'
2820: 29 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20  ) FROM t2}.} {1 
2830: 6e 69 6c 20 33 34 35 20 6e 69 6c 20 36 37 38 39  nil 345 nil 6789
2840: 30 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  0}.do_test func-
2850: 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.3 {.  execsql 
2860: 7b 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65  {SELECT coalesce
2870: 28 6e 75 6c 6c 69 66 28 31 2c 31 29 2c 27 6e 69  (nullif(1,1),'ni
2880: 6c 27 29 7d 0a 7d 20 7b 6e 69 6c 7d 0a 64 6f 5f  l')}.} {nil}.do_
2890: 74 65 73 74 20 66 75 6e 63 2d 36 2e 34 20 7b 0a  test func-6.4 {.
28a0: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
28b0: 54 20 63 6f 61 6c 65 73 63 65 28 6e 75 6c 6c 69  T coalesce(nulli
28c0: 66 28 31 2c 32 29 2c 27 6e 69 6c 27 29 7d 0a 7d  f(1,2),'nil')}.}
28d0: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e   {1}.do_test fun
28e0: 63 2d 36 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  c-6.5 {.  execsq
28f0: 6c 20 7b 53 45 4c 45 43 54 20 63 6f 61 6c 65 73  l {SELECT coales
2900: 63 65 28 6e 75 6c 6c 69 66 28 31 2c 4e 55 4c 4c  ce(nullif(1,NULL
2910: 29 2c 27 6e 69 6c 27 29 7d 0a 7d 20 7b 31 7d 0a  ),'nil')}.} {1}.
2920: 0a 0a 23 20 54 65 73 74 20 74 68 65 20 6c 61 73  ..# Test the las
2930: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
2940: 20 66 75 6e 63 74 69 6f 6e 0a 23 0a 64 6f 5f 74   function.#.do_t
2950: 65 73 74 20 66 75 6e 63 2d 37 2e 31 20 7b 0a 20  est func-7.1 {. 
2960: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
2970: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
2980: 69 64 28 29 7d 0a 7d 20 5b 64 62 20 6c 61 73 74  id()}.} [db last
2990: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 5d 0a 0a  _insert_rowid]..
29a0: 23 20 54 65 73 74 73 20 66 6f 72 20 61 67 67 72  # Tests for aggr
29b0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
29c0: 61 6e 64 20 68 6f 77 20 74 68 65 79 20 68 61 6e  and how they han
29d0: 64 6c 65 20 4e 55 4c 4c 73 2e 0a 23 0a 69 66 63  dle NULLs..#.ifc
29e0: 61 70 61 62 6c 65 20 66 6c 6f 61 74 69 6e 67 70  apable floatingp
29f0: 6f 69 6e 74 20 7b 0a 20 20 64 6f 5f 74 65 73 74  oint {.  do_test
2a00: 20 66 75 6e 63 2d 38 2e 31 20 7b 0a 20 20 20 20   func-8.1 {.    
2a10: 69 66 63 61 70 61 62 6c 65 20 65 78 70 6c 61 69  ifcapable explai
2a20: 6e 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71  n {.      execsq
2a30: 6c 20 7b 45 58 50 4c 41 49 4e 20 53 45 4c 45 43  l {EXPLAIN SELEC
2a40: 54 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 32  T sum(a) FROM t2
2a50: 3b 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65  ;}.    }.    exe
2a60: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
2a70: 45 43 54 20 73 75 6d 28 61 29 2c 20 63 6f 75 6e  ECT sum(a), coun
2a80: 74 28 61 29 2c 20 72 6f 75 6e 64 28 61 76 67 28  t(a), round(avg(
2a90: 61 29 2c 32 29 2c 20 6d 69 6e 28 61 29 2c 20 6d  a),2), min(a), m
2aa0: 61 78 28 61 29 2c 20 63 6f 75 6e 74 28 2a 29 20  ax(a), count(*) 
2ab0: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20  FROM t2;.    }. 
2ac0: 20 7d 20 7b 36 38 32 33 36 20 33 20 32 32 37 34   } {68236 3 2274
2ad0: 35 2e 33 33 20 31 20 36 37 38 39 30 20 35 7d 0a  5.33 1 67890 5}.
2ae0: 7d 0a 69 66 63 61 70 61 62 6c 65 20 21 66 6c 6f  }.ifcapable !flo
2af0: 61 74 69 6e 67 70 6f 69 6e 74 20 7b 0a 20 20 64  atingpoint {.  d
2b00: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 38 2e 31 20  o_test func-8.1 
2b10: 7b 0a 20 20 20 20 69 66 63 61 70 61 62 6c 65 20  {.    ifcapable 
2b20: 65 78 70 6c 61 69 6e 20 7b 0a 20 20 20 20 20 20  explain {.      
2b30: 65 78 65 63 73 71 6c 20 7b 45 58 50 4c 41 49 4e  execsql {EXPLAIN
2b40: 20 53 45 4c 45 43 54 20 73 75 6d 28 61 29 20 46   SELECT sum(a) F
2b50: 52 4f 4d 20 74 32 3b 7d 0a 20 20 20 20 7d 0a 20  ROM t2;}.    }. 
2b60: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
2b70: 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28 61 29     SELECT sum(a)
2b80: 2c 20 63 6f 75 6e 74 28 61 29 2c 20 61 76 67 28  , count(a), avg(
2b90: 61 29 2c 20 6d 69 6e 28 61 29 2c 20 6d 61 78 28  a), min(a), max(
2ba0: 61 29 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  a), count(*) FRO
2bb0: 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t2;.    }.  } 
2bc0: 7b 36 38 32 33 36 20 33 20 32 32 37 34 35 2e 30  {68236 3 22745.0
2bd0: 20 31 20 36 37 38 39 30 20 35 7d 0a 7d 0a 64 6f   1 67890 5}.}.do
2be0: 5f 74 65 73 74 20 66 75 6e 63 2d 38 2e 32 20 7b  _test func-8.2 {
2bf0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2c00: 20 53 45 4c 45 43 54 20 6d 61 78 28 27 7a 2b 27   SELECT max('z+'
2c10: 7c 7c 61 7c 7c 27 61 62 63 64 65 66 67 68 69 6a  ||a||'abcdefghij
2c20: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
2c30: 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
2c40: 27 29 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a  ') FROM t2;.  }.
2c50: 7d 20 7b 7a 2b 36 37 38 39 30 61 62 63 64 65 66  } {z+67890abcdef
2c60: 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
2c70: 77 78 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c  wxyzABCDEFGHIJKL
2c80: 4d 4e 4f 50 7d 0a 0a 69 66 63 61 70 61 62 6c 65  MNOP}..ifcapable
2c90: 20 74 65 6d 70 64 62 20 7b 0a 20 20 64 6f 5f 74   tempdb {.  do_t
2ca0: 65 73 74 20 66 75 6e 63 2d 38 2e 33 20 7b 0a 20  est func-8.3 {. 
2cb0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
2cc0: 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 54     CREATE TEMP T
2cd0: 41 42 4c 45 20 74 33 20 41 53 20 53 45 4c 45 43  ABLE t3 AS SELEC
2ce0: 54 20 61 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  T a FROM t2 ORDE
2cf0: 52 20 42 59 20 61 20 44 45 53 43 3b 0a 20 20 20  R BY a DESC;.   
2d00: 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 27 7a     SELECT min('z
2d10: 2b 27 7c 7c 61 7c 7c 27 61 62 63 64 65 66 67 68  +'||a||'abcdefgh
2d20: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
2d30: 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e  yzABCDEFGHIJKLMN
2d40: 4f 50 27 29 20 46 52 4f 4d 20 74 33 3b 0a 20 20  OP') FROM t3;.  
2d50: 20 20 7d 0a 20 20 7d 20 7b 7a 2b 31 61 62 63 64    }.  } {z+1abcd
2d60: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
2d70: 75 76 77 78 79 7a 41 42 43 44 45 46 47 48 49 4a  uvwxyzABCDEFGHIJ
2d80: 4b 4c 4d 4e 4f 50 7d 0a 7d 20 65 6c 73 65 20 7b  KLMNOP}.} else {
2d90: 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .  do_test func-
2da0: 38 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  8.3 {.    execsq
2db0: 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45  l {.      CREATE
2dc0: 20 54 41 42 4c 45 20 74 33 20 41 53 20 53 45 4c   TABLE t3 AS SEL
2dd0: 45 43 54 20 61 20 46 52 4f 4d 20 74 32 20 4f 52  ECT a FROM t2 OR
2de0: 44 45 52 20 42 59 20 61 20 44 45 53 43 3b 0a 20  DER BY a DESC;. 
2df0: 20 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28       SELECT min(
2e00: 27 7a 2b 27 7c 7c 61 7c 7c 27 61 62 63 64 65 66  'z+'||a||'abcdef
2e10: 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
2e20: 77 78 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c  wxyzABCDEFGHIJKL
2e30: 4d 4e 4f 50 27 29 20 46 52 4f 4d 20 74 33 3b 0a  MNOP') FROM t3;.
2e40: 20 20 20 20 7d 0a 20 20 7d 20 7b 7a 2b 31 61 62      }.  } {z+1ab
2e50: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
2e60: 73 74 75 76 77 78 79 7a 41 42 43 44 45 46 47 48  stuvwxyzABCDEFGH
2e70: 49 4a 4b 4c 4d 4e 4f 50 7d 0a 7d 0a 64 6f 5f 74  IJKLMNOP}.}.do_t
2e80: 65 73 74 20 66 75 6e 63 2d 38 2e 34 20 7b 0a 20  est func-8.4 {. 
2e90: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
2ea0: 45 4c 45 43 54 20 6d 61 78 28 27 7a 2b 27 7c 7c  ELECT max('z+'||
2eb0: 61 7c 7c 27 61 62 63 64 65 66 67 68 69 6a 6b 6c  a||'abcdefghijkl
2ec0: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41 42  mnopqrstuvwxyzAB
2ed0: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 27 29  CDEFGHIJKLMNOP')
2ee0: 20 46 52 4f 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20   FROM t3;.  }.} 
2ef0: 7b 7a 2b 36 37 38 39 30 61 62 63 64 65 66 67 68  {z+67890abcdefgh
2f00: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
2f10: 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e  yzABCDEFGHIJKLMN
2f20: 4f 50 7d 0a 69 66 63 61 70 61 62 6c 65 20 63 6f  OP}.ifcapable co
2f30: 6d 70 6f 75 6e 64 20 7b 0a 20 20 64 6f 5f 74 65  mpound {.  do_te
2f40: 73 74 20 66 75 6e 63 2d 38 2e 35 20 7b 0a 20 20  st func-8.5 {.  
2f50: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2f60: 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 20    SELECT sum(x) 
2f70: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 27 39 32  FROM (SELECT '92
2f80: 32 33 33 37 32 30 33 36 27 20 7c 7c 20 27 38 35  23372036' || '85
2f90: 34 37 37 35 38 30 37 27 20 41 53 20 78 0a 20 20  4775807' AS x.  
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
2fc0: 4c 20 53 45 4c 45 43 54 20 2d 39 32 32 33 33 37  L SELECT -922337
2fd0: 32 30 33 36 38 35 34 37 37 35 38 30 37 29 0a 20  2036854775807). 
2fe0: 20 20 20 7d 0a 20 20 7d 20 7b 30 7d 0a 20 20 64     }.  } {0}.  d
2ff0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 38 2e 36 20  o_test func-8.6 
3000: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
3010: 20 20 20 20 20 20 53 45 4c 45 43 54 20 74 79 70        SELECT typ
3020: 65 6f 66 28 73 75 6d 28 78 29 29 20 46 52 4f 4d  eof(sum(x)) FROM
3030: 20 28 53 45 4c 45 43 54 20 27 39 32 32 33 33 37   (SELECT '922337
3040: 32 30 33 36 27 20 7c 7c 20 27 38 35 34 37 37 35  2036' || '854775
3050: 38 30 37 27 20 41 53 20 78 0a 20 20 20 20 20 20  807' AS x.      
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3070: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45      UNION ALL SE
3080: 4c 45 43 54 20 2d 39 32 32 33 33 37 32 30 33 36  LECT -9223372036
3090: 38 35 34 37 37 35 38 30 37 29 0a 20 20 20 20 7d  854775807).    }
30a0: 0a 20 20 7d 20 7b 69 6e 74 65 67 65 72 7d 0a 20  .  } {integer}. 
30b0: 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 38 2e   do_test func-8.
30c0: 37 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  7 {.    execsql 
30d0: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 74  {.      SELECT t
30e0: 79 70 65 6f 66 28 73 75 6d 28 78 29 29 20 46 52  ypeof(sum(x)) FR
30f0: 4f 4d 20 28 53 45 4c 45 43 54 20 27 39 32 32 33  OM (SELECT '9223
3100: 33 37 32 30 33 36 27 20 7c 7c 20 27 38 35 34 37  372036' || '8547
3110: 37 35 38 30 38 27 20 41 53 20 78 0a 20 20 20 20  75808' AS x.    
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3130: 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
3140: 53 45 4c 45 43 54 20 2d 39 32 32 33 33 37 32 30  SELECT -92233720
3150: 33 36 38 35 34 37 37 35 38 30 37 29 0a 20 20 20  36854775807).   
3160: 20 7d 0a 20 20 7d 20 7b 72 65 61 6c 7d 0a 69 66   }.  } {real}.if
3170: 63 61 70 61 62 6c 65 20 66 6c 6f 61 74 69 6e 67  capable floating
3180: 70 6f 69 6e 74 20 7b 0a 20 20 64 6f 5f 74 65 73  point {.  do_tes
3190: 74 20 66 75 6e 63 2d 38 2e 38 20 7b 0a 20 20 20  t func-8.8 {.   
31a0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
31b0: 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 3e 30   SELECT sum(x)>0
31c0: 2e 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .0 FROM (SELECT 
31d0: 27 39 32 32 33 33 37 32 30 33 36 27 20 7c 7c 20  '9223372036' || 
31e0: 27 38 35 34 37 37 35 38 30 38 27 20 41 53 20 78  '854775808' AS x
31f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3200: 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
3210: 20 41 4c 4c 20 53 45 4c 45 43 54 20 2d 39 32 32   ALL SELECT -922
3220: 33 33 37 32 30 33 36 38 35 30 30 30 30 30 30 30  3372036850000000
3230: 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 7d 0a  ).    }.  } {1}.
3240: 7d 0a 69 66 63 61 70 61 62 6c 65 20 21 66 6c 6f  }.ifcapable !flo
3250: 61 74 69 6e 67 70 6f 69 6e 74 20 7b 0a 20 20 64  atingpoint {.  d
3260: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 38 2e 38 20  o_test func-8.8 
3270: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
3280: 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d        SELECT sum
3290: 28 78 29 3e 30 20 46 52 4f 4d 20 28 53 45 4c 45  (x)>0 FROM (SELE
32a0: 43 54 20 27 39 32 32 33 33 37 32 30 33 36 27 20  CT '9223372036' 
32b0: 7c 7c 20 27 38 35 34 37 37 35 38 30 38 27 20 41  || '854775808' A
32c0: 53 20 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  S x.            
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e                UN
32e0: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2d  ION ALL SELECT -
32f0: 39 32 32 33 33 37 32 30 33 36 38 35 30 30 30 30  9223372036850000
3300: 30 30 30 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  000).    }.  } {
3310: 31 7d 0a 7d 0a 7d 0a 0a 23 20 48 6f 77 20 64 6f  1}.}.}..# How do
3320: 20 79 6f 75 20 74 65 73 74 20 74 68 65 20 72 61   you test the ra
3330: 6e 64 6f 6d 28 29 20 66 75 6e 63 74 69 6f 6e 20  ndom() function 
3340: 69 6e 20 61 20 6d 65 61 6e 69 6e 67 66 75 6c 2c  in a meaningful,
3350: 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 77   deterministic w
3360: 61 79 3f 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75  ay?.#.do_test fu
3370: 6e 63 2d 39 2e 31 20 7b 0a 20 20 65 78 65 63 73  nc-9.1 {.  execs
3380: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
3390: 72 61 6e 64 6f 6d 28 29 20 69 73 20 6e 6f 74 20  random() is not 
33a0: 6e 75 6c 6c 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a  null;.  }.} {1}.
33b0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 39 2e 32  do_test func-9.2
33c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
33d0: 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66     SELECT typeof
33e0: 28 72 61 6e 64 6f 6d 28 29 29 3b 0a 20 20 7d 0a  (random());.  }.
33f0: 7d 20 7b 69 6e 74 65 67 65 72 7d 0a 64 6f 5f 74  } {integer}.do_t
3400: 65 73 74 20 66 75 6e 63 2d 39 2e 33 20 7b 0a 20  est func-9.3 {. 
3410: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3420: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
3430: 28 33 32 29 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  (32) is not null
3440: 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  ;.  }.} {1}.do_t
3450: 65 73 74 20 66 75 6e 63 2d 39 2e 34 20 7b 0a 20  est func-9.4 {. 
3460: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3470: 45 4c 45 43 54 20 74 79 70 65 6f 66 28 72 61 6e  ELECT typeof(ran
3480: 64 6f 6d 62 6c 6f 62 28 33 32 29 29 3b 0a 20 20  domblob(32));.  
3490: 7d 0a 7d 20 7b 62 6c 6f 62 7d 0a 64 6f 5f 74 65  }.} {blob}.do_te
34a0: 73 74 20 66 75 6e 63 2d 39 2e 35 20 7b 0a 20 20  st func-9.5 {.  
34b0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
34c0: 4c 45 43 54 20 6c 65 6e 67 74 68 28 72 61 6e 64  LECT length(rand
34d0: 6f 6d 62 6c 6f 62 28 33 32 29 29 2c 20 6c 65 6e  omblob(32)), len
34e0: 67 74 68 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 2d  gth(randomblob(-
34f0: 35 29 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  5)),.           
3500: 6c 65 6e 67 74 68 28 72 61 6e 64 6f 6d 62 6c 6f  length(randomblo
3510: 62 28 32 30 30 30 29 29 0a 20 20 7d 0a 7d 20 7b  b(2000)).  }.} {
3520: 33 32 20 31 20 32 30 30 30 7d 0a 0a 23 20 54 68  32 1 2000}..# Th
3530: 65 20 22 68 65 78 28 29 22 20 66 75 6e 63 74 69  e "hex()" functi
3540: 6f 6e 20 77 61 73 20 61 64 64 65 64 20 69 6e 20  on was added in 
3550: 6f 72 64 65 72 20 74 6f 20 62 65 20 61 62 6c 65  order to be able
3560: 20 74 6f 20 72 65 6e 64 65 72 20 62 6c 6f 62 73   to render blobs
3570: 0a 23 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  .# generated by 
3580: 72 61 6e 64 6f 6d 62 6c 6f 62 28 29 2e 20 20 53  randomblob().  S
3590: 6f 20 74 68 69 73 20 73 65 65 6d 73 20 6c 69 6b  o this seems lik
35a0: 65 20 61 20 67 6f 6f 64 20 70 6c 61 63 65 20 74  e a good place t
35b0: 6f 20 74 65 73 74 0a 23 20 68 65 78 28 29 2e 0a  o test.# hex()..
35c0: 23 0a 69 66 63 61 70 61 62 6c 65 20 62 6c 6f 62  #.ifcapable blob
35d0: 6c 69 74 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  lit {.  do_test 
35e0: 66 75 6e 63 2d 39 2e 31 30 20 7b 0a 20 20 20 20  func-9.10 {.    
35f0: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
3600: 68 65 78 28 78 27 30 30 31 31 32 32 33 33 34 34  hex(x'0011223344
3610: 35 35 36 36 37 37 38 38 39 39 61 41 62 42 63 43  5566778899aAbBcC
3620: 64 44 65 45 66 46 27 29 7d 0a 20 20 7d 20 7b 30  dDeEfF')}.  } {0
3630: 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38  0112233445566778
3640: 38 39 39 41 41 42 42 43 43 44 44 45 45 46 46 7d  899AABBCCDDEEFF}
3650: 0a 7d 0a 73 65 74 20 65 6e 63 6f 64 69 6e 67 20  .}.set encoding 
3660: 5b 64 62 20 6f 6e 65 20 7b 50 52 41 47 4d 41 20  [db one {PRAGMA 
3670: 65 6e 63 6f 64 69 6e 67 7d 5d 0a 69 66 20 7b 24  encoding}].if {$
3680: 65 6e 63 6f 64 69 6e 67 3d 3d 22 55 54 46 2d 31  encoding=="UTF-1
3690: 36 6c 65 22 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  6le"} {.  do_tes
36a0: 74 20 66 75 6e 63 2d 39 2e 31 31 2d 75 74 66 31  t func-9.11-utf1
36b0: 36 6c 65 20 7b 0a 20 20 20 20 65 78 65 63 73 71  6le {.    execsq
36c0: 6c 20 7b 53 45 4c 45 43 54 20 68 65 78 28 72 65  l {SELECT hex(re
36d0: 70 6c 61 63 65 28 27 61 62 63 64 65 66 67 27 2c  place('abcdefg',
36e0: 27 65 66 27 2c 27 31 32 27 29 29 7d 0a 20 20 7d  'ef','12'))}.  }
36f0: 20 7b 36 31 30 30 36 32 30 30 36 33 30 30 36 34   {61006200630064
3700: 30 30 33 31 30 30 33 32 30 30 36 37 30 30 7d 0a  00310032006700}.
3710: 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 39    do_test func-9
3720: 2e 31 32 2d 75 74 66 31 36 6c 65 20 7b 0a 20 20  .12-utf16le {.  
3730: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
3740: 54 20 68 65 78 28 72 65 70 6c 61 63 65 28 27 61  T hex(replace('a
3750: 62 63 64 65 66 67 27 2c 27 27 2c 27 31 32 27 29  bcdefg','','12')
3760: 29 7d 0a 20 20 7d 20 7b 36 31 30 30 36 32 30 30  )}.  } {61006200
3770: 36 33 30 30 36 34 30 30 36 35 30 30 36 36 30 30  6300640065006600
3780: 36 37 30 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20  6700}.  do_test 
3790: 66 75 6e 63 2d 39 2e 31 33 2d 75 74 66 31 36 6c  func-9.13-utf16l
37a0: 65 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  e {.    execsql 
37b0: 7b 53 45 4c 45 43 54 20 68 65 78 28 72 65 70 6c  {SELECT hex(repl
37c0: 61 63 65 28 27 61 61 62 63 64 65 66 67 27 2c 27  ace('aabcdefg','
37d0: 61 27 2c 27 61 61 61 27 29 29 7d 0a 20 20 7d 20  a','aaa'))}.  } 
37e0: 7b 36 31 30 30 36 31 30 30 36 31 30 30 36 31 30  {610061006100610
37f0: 30 36 31 30 30 36 31 30 30 36 32 30 30 36 33 30  0610061006200630
3800: 30 36 34 30 30 36 35 30 30 36 36 30 30 36 37 30  0640065006600670
3810: 30 7d 0a 7d 20 65 6c 73 65 69 66 20 7b 24 65 6e  0}.} elseif {$en
3820: 63 6f 64 69 6e 67 3d 3d 22 55 54 46 2d 38 22 7d  coding=="UTF-8"}
3830: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e   {.  do_test fun
3840: 63 2d 39 2e 31 31 2d 75 74 66 38 20 7b 0a 20 20  c-9.11-utf8 {.  
3850: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
3860: 54 20 68 65 78 28 72 65 70 6c 61 63 65 28 27 61  T hex(replace('a
3870: 62 63 64 65 66 67 27 2c 27 65 66 27 2c 27 31 32  bcdefg','ef','12
3880: 27 29 29 7d 0a 20 20 7d 20 7b 36 31 36 32 36 33  '))}.  } {616263
3890: 36 34 33 31 33 32 36 37 7d 0a 20 20 64 6f 5f 74  64313267}.  do_t
38a0: 65 73 74 20 66 75 6e 63 2d 39 2e 31 32 2d 75 74  est func-9.12-ut
38b0: 66 38 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  f8 {.    execsql
38c0: 20 7b 53 45 4c 45 43 54 20 68 65 78 28 72 65 70   {SELECT hex(rep
38d0: 6c 61 63 65 28 27 61 62 63 64 65 66 67 27 2c 27  lace('abcdefg','
38e0: 27 2c 27 31 32 27 29 29 7d 0a 20 20 7d 20 7b 36  ','12'))}.  } {6
38f0: 31 36 32 36 33 36 34 36 35 36 36 36 37 7d 0a 20  1626364656667}. 
3900: 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 39 2e   do_test func-9.
3910: 31 33 2d 75 74 66 38 20 7b 0a 20 20 20 20 65 78  13-utf8 {.    ex
3920: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 68 65  ecsql {SELECT he
3930: 78 28 72 65 70 6c 61 63 65 28 27 61 61 62 63 64  x(replace('aabcd
3940: 65 66 67 27 2c 27 61 27 2c 27 61 61 61 27 29 29  efg','a','aaa'))
3950: 7d 0a 20 20 7d 20 7b 36 31 36 31 36 31 36 31 36  }.  } {616161616
3960: 31 36 31 36 32 36 33 36 34 36 35 36 36 36 37 7d  161626364656667}
3970: 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .}.do_execsql_te
3980: 73 74 20 66 75 6e 63 2d 39 2e 31 34 20 7b 0a 20  st func-9.14 {. 
3990: 20 57 49 54 48 20 52 45 43 55 52 53 49 56 45 20   WITH RECURSIVE 
39a0: 63 28 78 29 20 41 53 20 28 0a 20 20 20 20 20 56  c(x) AS (.     V
39b0: 41 4c 55 45 53 28 31 29 0a 20 20 20 20 20 55 4e  ALUES(1).     UN
39c0: 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 53 45 4c  ION ALL.     SEL
39d0: 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 63 20 57  ECT x+1 FROM c W
39e0: 48 45 52 45 20 78 3c 31 30 34 30 0a 20 20 29 0a  HERE x<1040.  ).
39f0: 20 20 53 45 4c 45 43 54 20 0a 20 20 20 20 63 6f    SELECT .    co
3a00: 75 6e 74 28 2a 29 2c 0a 20 20 20 20 73 75 6d 28  unt(*),.    sum(
3a10: 6c 65 6e 67 74 68 28 72 65 70 6c 61 63 65 28 70  length(replace(p
3a20: 72 69 6e 74 66 28 27 61 62 63 25 2e 2a 63 78 79  rintf('abc%.*cxy
3a30: 7a 27 2c 78 2c 27 6d 27 29 2c 27 6d 27 2c 27 6e  z',x,'m'),'m','n
3a40: 6e 6e 6e 27 29 29 2d 28 36 2b 78 2a 34 29 29 0a  nnn'))-(6+x*4)).
3a50: 20 20 46 52 4f 4d 20 63 3b 0a 7d 20 7b 31 30 34    FROM c;.} {104
3a60: 30 20 30 7d 0a 20 20 0a 23 20 55 73 65 20 74 68  0 0}.  .# Use th
3a70: 65 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74  e "sqlite_regist
3a80: 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  er_test_function
3a90: 22 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 77 68  " TCL command wh
3aa0: 69 63 68 20 69 73 20 70 61 72 74 20 6f 66 0a 23  ich is part of.#
3ab0: 20 74 68 65 20 74 65 78 74 20 66 69 78 74 75 72   the text fixtur
3ac0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65  e in order to ve
3ad0: 72 69 66 79 20 63 6f 72 72 65 63 74 20 6f 70 65  rify correct ope
3ae0: 72 61 74 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6f  ration of some o
3af0: 66 0a 23 20 74 68 65 20 75 73 65 72 2d 64 65 66  f.# the user-def
3b00: 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f  ined SQL functio
3b10: 6e 20 41 50 49 73 20 74 68 61 74 20 61 72 65 20  n APIs that are 
3b20: 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20  not used by the 
3b30: 62 75 69 6c 74 2d 69 6e 0a 23 20 66 75 6e 63 74  built-in.# funct
3b40: 69 6f 6e 73 2e 0a 23 0a 73 65 74 20 3a 3a 44 42  ions..#.set ::DB
3b50: 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63   [sqlite3_connec
3b60: 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62 5d  tion_pointer db]
3b70: 0a 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72  .sqlite_register
3b80: 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 24  _test_function $
3b90: 3a 3a 44 42 20 74 65 73 74 66 75 6e 63 0a 64 6f  ::DB testfunc.do
3ba0: 5f 74 65 73 74 20 66 75 6e 63 2d 31 30 2e 31 20  _test func-10.1 
3bb0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
3bc0: 20 20 20 53 45 4c 45 43 54 20 74 65 73 74 66 75     SELECT testfu
3bd0: 6e 63 28 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 20  nc(NULL,NULL);. 
3be0: 20 7d 0a 7d 20 7b 31 20 7b 66 69 72 73 74 20 61   }.} {1 {first a
3bf0: 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
3c00: 65 20 6f 6e 65 20 6f 66 3a 20 69 6e 74 20 69 6e  e one of: int in
3c10: 74 36 34 20 73 74 72 69 6e 67 20 64 6f 75 62 6c  t64 string doubl
3c20: 65 20 6e 75 6c 6c 20 76 61 6c 75 65 7d 7d 0a 64  e null value}}.d
3c30: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 30 2e 32  o_test func-10.2
3c40: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
3c50: 20 20 20 53 45 4c 45 43 54 20 74 65 73 74 66 75     SELECT testfu
3c60: 6e 63 28 0a 20 20 20 20 20 27 73 74 72 69 6e 67  nc(.     'string
3c70: 27 2c 20 27 61 62 63 64 65 66 67 68 69 6a 6b 6c  ', 'abcdefghijkl
3c80: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41 42  mnopqrstuvwxyzAB
3c90: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
3ca0: 53 54 55 56 57 58 59 5a 27 2c 0a 20 20 20 20 20  STUVWXYZ',.     
3cb0: 27 69 6e 74 27 2c 20 31 32 33 34 0a 20 20 20 20  'int', 1234.    
3cc0: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 32 33 34 7d 0a  );.  }.} {1234}.
3cd0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 30 2e  do_test func-10.
3ce0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
3cf0: 20 20 20 20 53 45 4c 45 43 54 20 74 65 73 74 66      SELECT testf
3d00: 75 6e 63 28 0a 20 20 20 20 20 27 73 74 72 69 6e  unc(.     'strin
3d10: 67 27 2c 20 27 61 62 63 64 65 66 67 68 69 6a 6b  g', 'abcdefghijk
3d20: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41  lmnopqrstuvwxyzA
3d30: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
3d40: 52 53 54 55 56 57 58 59 5a 27 2c 0a 20 20 20 20  RSTUVWXYZ',.    
3d50: 20 27 73 74 72 69 6e 67 27 2c 20 4e 55 4c 4c 0a   'string', NULL.
3d60: 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d      );.  }.} {{}
3d70: 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 66 6c 6f  }..ifcapable flo
3d80: 61 74 69 6e 67 70 6f 69 6e 74 20 7b 0a 20 20 64  atingpoint {.  d
3d90: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 30 2e 34  o_test func-10.4
3da0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3db0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 74 65  .      SELECT te
3dc0: 73 74 66 75 6e 63 28 0a 20 20 20 20 20 20 20 27  stfunc(.       '
3dd0: 73 74 72 69 6e 67 27 2c 20 27 61 62 63 64 65 66  string', 'abcdef
3de0: 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
3df0: 77 78 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c  wxyzABCDEFGHIJKL
3e00: 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 27 2c  MNOPQRSTUVWXYZ',
3e10: 0a 20 20 20 20 20 20 20 27 64 6f 75 62 6c 65 27  .       'double'
3e20: 2c 20 31 2e 32 33 34 0a 20 20 20 20 20 20 29 3b  , 1.234.      );
3e30: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 2e 32 33  .    }.  } {1.23
3e40: 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e  4}.  do_test fun
3e50: 63 2d 31 30 2e 35 20 7b 0a 20 20 20 20 65 78 65  c-10.5 {.    exe
3e60: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
3e70: 45 43 54 20 74 65 73 74 66 75 6e 63 28 0a 20 20  ECT testfunc(.  
3e80: 20 20 20 20 20 27 73 74 72 69 6e 67 27 2c 20 27       'string', '
3e90: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
3ea0: 71 72 73 74 75 76 77 78 79 7a 41 42 43 44 45 46  qrstuvwxyzABCDEF
3eb0: 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
3ec0: 57 58 59 5a 27 2c 0a 20 20 20 20 20 20 20 27 69  WXYZ',.       'i
3ed0: 6e 74 27 2c 20 31 32 33 34 2c 0a 20 20 20 20 20  nt', 1234,.     
3ee0: 20 20 27 73 74 72 69 6e 67 27 2c 20 27 61 62 63    'string', 'abc
3ef0: 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
3f00: 74 75 76 77 78 79 7a 41 42 43 44 45 46 47 48 49  tuvwxyzABCDEFGHI
3f10: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
3f20: 5a 27 2c 0a 20 20 20 20 20 20 20 27 73 74 72 69  Z',.       'stri
3f30: 6e 67 27 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  ng', NULL,.     
3f40: 20 20 27 73 74 72 69 6e 67 27 2c 20 27 61 62 63    'string', 'abc
3f50: 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
3f60: 74 75 76 77 78 79 7a 41 42 43 44 45 46 47 48 49  tuvwxyzABCDEFGHI
3f70: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
3f80: 5a 27 2c 0a 20 20 20 20 20 20 20 27 64 6f 75 62  Z',.       'doub
3f90: 6c 65 27 2c 20 31 2e 32 33 34 2c 0a 20 20 20 20  le', 1.234,.    
3fa0: 20 20 20 27 73 74 72 69 6e 67 27 2c 20 27 61 62     'string', 'ab
3fb0: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
3fc0: 73 74 75 76 77 78 79 7a 41 42 43 44 45 46 47 48  stuvwxyzABCDEFGH
3fd0: 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
3fe0: 59 5a 27 2c 0a 20 20 20 20 20 20 20 27 69 6e 74  YZ',.       'int
3ff0: 27 2c 20 31 32 33 34 2c 0a 20 20 20 20 20 20 20  ', 1234,.       
4000: 27 73 74 72 69 6e 67 27 2c 20 27 61 62 63 64 65  'string', 'abcde
4010: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
4020: 76 77 78 79 7a 41 42 43 44 45 46 47 48 49 4a 4b  vwxyzABCDEFGHIJK
4030: 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 27  LMNOPQRSTUVWXYZ'
4040: 2c 0a 20 20 20 20 20 20 20 27 73 74 72 69 6e 67  ,.       'string
4050: 27 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  ', NULL,.       
4060: 27 73 74 72 69 6e 67 27 2c 20 27 61 62 63 64 65  'string', 'abcde
4070: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
4080: 76 77 78 79 7a 41 42 43 44 45 46 47 48 49 4a 4b  vwxyzABCDEFGHIJK
4090: 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 27  LMNOPQRSTUVWXYZ'
40a0: 2c 0a 20 20 20 20 20 20 20 27 64 6f 75 62 6c 65  ,.       'double
40b0: 27 2c 20 31 2e 32 33 34 0a 20 20 20 20 20 20 29  ', 1.234.      )
40c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 2e 32  ;.    }.  } {1.2
40d0: 33 34 7d 0a 7d 0a 0a 23 20 54 65 73 74 20 74 68  34}.}..# Test th
40e0: 65 20 62 75 69 6c 74 2d 69 6e 20 73 71 6c 69 74  e built-in sqlit
40f0: 65 5f 76 65 72 73 69 6f 6e 28 2a 29 20 53 51 4c  e_version(*) SQL
4100: 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a 64 6f 5f   function..#.do_
4110: 74 65 73 74 20 66 75 6e 63 2d 31 31 2e 31 20 7b  test func-11.1 {
4120: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
4130: 20 53 45 4c 45 43 54 20 73 71 6c 69 74 65 5f 76   SELECT sqlite_v
4140: 65 72 73 69 6f 6e 28 2a 29 3b 0a 20 20 7d 0a 7d  ersion(*);.  }.}
4150: 20 5b 73 71 6c 69 74 65 33 20 2d 76 65 72 73 69   [sqlite3 -versi
4160: 6f 6e 5d 0a 0a 23 20 54 65 73 74 20 74 68 61 74  on]..# Test that
4170: 20 64 65 73 74 72 75 63 74 6f 72 73 20 70 61 73   destructors pas
4180: 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 20 62  sed to sqlite3 b
4190: 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  y calls to sqlit
41a0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 29  e3_result_text()
41b0: 0a 23 20 65 74 63 2e 20 61 72 65 20 63 61 6c 6c  .# etc. are call
41c0: 65 64 2e 20 54 68 65 73 65 20 74 65 73 74 73 20  ed. These tests 
41d0: 75 73 65 20 74 77 6f 20 73 70 65 63 69 61 6c 20  use two special 
41e0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
41f0: 63 74 69 6f 6e 73 0a 23 20 28 69 6d 70 6c 65 6d  ctions.# (implem
4200: 65 6e 74 65 64 20 69 6e 20 66 75 6e 63 2e 63 29  ented in func.c)
4210: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
4220: 69 6e 20 74 65 73 74 20 62 75 69 6c 64 73 2e 20  in test builds. 
4230: 0a 23 0a 23 20 46 75 6e 63 74 69 6f 6e 20 74 65  .#.# Function te
4240: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 28 29 20  st_destructor() 
4250: 74 61 6b 65 73 20 6f 6e 65 20 61 72 67 75 6d 65  takes one argume
4260: 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  nt and returns a
4270: 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 23 20 74   copy of the.# t
4280: 65 78 74 20 66 6f 72 6d 20 6f 66 20 74 68 61 74  ext form of that
4290: 20 61 72 67 75 6d 65 6e 74 2e 20 41 20 64 65 73   argument. A des
42a0: 74 72 75 63 74 6f 72 20 69 73 20 61 73 73 6f 63  tructor is assoc
42b0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 72  iated with the r
42c0: 65 74 75 72 6e 0a 23 20 76 61 6c 75 65 2e 20 46  eturn.# value. F
42d0: 75 6e 63 74 69 6f 6e 20 74 65 73 74 5f 64 65 73  unction test_des
42e0: 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 28 29 20  tructor_count() 
42f0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
4300: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
4310: 67 0a 23 20 64 65 73 74 72 75 63 74 6f 72 20 63  g.# destructor c
4320: 61 6c 6c 73 20 66 6f 72 20 76 61 6c 75 65 73 20  alls for values 
4330: 72 65 74 75 72 6e 65 64 20 62 79 20 74 65 73 74  returned by test
4340: 5f 64 65 73 74 72 75 63 74 6f 72 28 29 2e 0a 23  _destructor()..#
4350: 0a 69 66 20 7b 5b 64 62 20 65 76 61 6c 20 7b 50  .if {[db eval {P
4360: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 7d 5d  RAGMA encoding}]
4370: 3d 3d 22 55 54 46 2d 38 22 7d 20 7b 0a 20 20 64  =="UTF-8"} {.  d
4380: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 32 2e 31  o_test func-12.1
4390: 2d 75 74 66 38 20 7b 0a 20 20 20 20 65 78 65 63  -utf8 {.    exec
43a0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
43b0: 43 54 20 74 65 73 74 5f 64 65 73 74 72 75 63 74  CT test_destruct
43c0: 6f 72 28 27 68 65 6c 6c 6f 20 77 6f 72 6c 64 27  or('hello world'
43d0: 29 2c 20 74 65 73 74 5f 64 65 73 74 72 75 63 74  ), test_destruct
43e0: 6f 72 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 20 20  or_count();.    
43f0: 7d 0a 20 20 7d 20 7b 7b 68 65 6c 6c 6f 20 77 6f  }.  } {{hello wo
4400: 72 6c 64 7d 20 31 7d 0a 7d 20 65 6c 73 65 20 7b  rld} 1}.} else {
4410: 0a 20 20 20 20 69 66 63 61 70 61 62 6c 65 20 7b  .    ifcapable {
4420: 75 74 66 31 36 7d 20 7b 0a 20 20 20 20 20 20 64  utf16} {.      d
4430: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 32 2e 31  o_test func-12.1
4440: 2d 75 74 66 31 36 20 7b 0a 20 20 20 20 20 20 20  -utf16 {.       
4450: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
4460: 20 20 20 20 20 53 45 4c 45 43 54 20 74 65 73 74       SELECT test
4470: 5f 64 65 73 74 72 75 63 74 6f 72 31 36 28 27 68  _destructor16('h
4480: 65 6c 6c 6f 20 77 6f 72 6c 64 27 29 2c 20 74 65  ello world'), te
4490: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  st_destructor_co
44a0: 75 6e 74 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  unt();.        }
44b0: 0a 20 20 20 20 20 20 7d 20 7b 7b 68 65 6c 6c 6f  .      } {{hello
44c0: 20 77 6f 72 6c 64 7d 20 31 7d 0a 20 20 20 20 7d   world} 1}.    }
44d0: 0a 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .}.do_test func-
44e0: 31 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  12.2 {.  execsql
44f0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 65   {.    SELECT te
4500: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  st_destructor_co
4510: 75 6e 74 28 29 3b 0a 20 20 7d 0a 7d 20 7b 30 7d  unt();.  }.} {0}
4520: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 32  .do_test func-12
4530: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
4540: 0a 20 20 20 20 53 45 4c 45 43 54 20 74 65 73 74  .    SELECT test
4550: 5f 64 65 73 74 72 75 63 74 6f 72 28 27 68 65 6c  _destructor('hel
4560: 6c 6f 27 29 7c 7c 27 20 77 6f 72 6c 64 27 0a 20  lo')||' world'. 
4570: 20 7d 0a 7d 20 7b 7b 68 65 6c 6c 6f 20 77 6f 72   }.} {{hello wor
4580: 6c 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  ld}}.do_test fun
4590: 63 2d 31 32 2e 34 20 7b 0a 20 20 65 78 65 63 73  c-12.4 {.  execs
45a0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
45b0: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  test_destructor_
45c0: 63 6f 75 6e 74 28 29 3b 0a 20 20 7d 0a 7d 20 7b  count();.  }.} {
45d0: 30 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  0}.do_test func-
45e0: 31 32 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  12.5 {.  execsql
45f0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
4600: 42 4c 45 20 74 34 28 78 29 3b 0a 20 20 20 20 49  BLE t4(x);.    I
4610: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
4620: 4c 55 45 53 28 74 65 73 74 5f 64 65 73 74 72 75  LUES(test_destru
4630: 63 74 6f 72 28 27 68 65 6c 6c 6f 27 29 29 3b 0a  ctor('hello'));.
4640: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4650: 74 34 20 56 41 4c 55 45 53 28 74 65 73 74 5f 64  t4 VALUES(test_d
4660: 65 73 74 72 75 63 74 6f 72 28 27 77 6f 72 6c 64  estructor('world
4670: 27 29 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  '));.    SELECT 
4680: 6d 69 6e 28 74 65 73 74 5f 64 65 73 74 72 75 63  min(test_destruc
4690: 74 6f 72 28 78 29 29 2c 20 6d 61 78 28 74 65 73  tor(x)), max(tes
46a0: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 78 29 29  t_destructor(x))
46b0: 20 46 52 4f 4d 20 74 34 3b 0a 20 20 7d 0a 7d 20   FROM t4;.  }.} 
46c0: 7b 68 65 6c 6c 6f 20 77 6f 72 6c 64 7d 0a 64 6f  {hello world}.do
46d0: 5f 74 65 73 74 20 66 75 6e 63 2d 31 32 2e 36 20  _test func-12.6 
46e0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
46f0: 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f 64 65    SELECT test_de
4700: 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 28 29  structor_count()
4710: 3b 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74  ;.  }.} {0}.do_t
4720: 65 73 74 20 66 75 6e 63 2d 31 32 2e 37 20 7b 0a  est func-12.7 {.
4730: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4740: 44 52 4f 50 20 54 41 42 4c 45 20 74 34 3b 0a 20  DROP TABLE t4;. 
4750: 20 7d 0a 7d 20 7b 7d 0a 0a 0a 23 20 54 65 73 74   }.} {}...# Test
4760: 20 74 68 61 74 20 74 68 65 20 61 75 78 64 61 74   that the auxdat
4770: 61 20 41 50 49 20 66 6f 72 20 73 63 61 6c 61 72  a API for scalar
4780: 20 66 75 6e 63 74 69 6f 6e 73 20 77 6f 72 6b 73   functions works
4790: 2e 20 54 68 69 73 20 74 65 73 74 20 75 73 65 73  . This test uses
47a0: 0a 23 20 61 20 73 70 65 63 69 61 6c 20 75 73 65  .# a special use
47b0: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
47c0: 6f 6e 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  on only availabl
47d0: 65 20 69 6e 20 74 65 73 74 20 62 75 69 6c 64 73  e in test builds
47e0: 2c 0a 23 20 74 65 73 74 5f 61 75 78 64 61 74 61  ,.# test_auxdata
47f0: 28 29 2e 20 46 75 6e 63 74 69 6f 6e 20 74 65 73  (). Function tes
4800: 74 5f 61 75 78 64 61 74 61 28 29 20 74 61 6b 65  t_auxdata() take
4810: 73 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20  s any number of 
4820: 61 72 67 75 6d 65 6e 74 73 2e 0a 64 6f 5f 74 65  arguments..do_te
4830: 73 74 20 66 75 6e 63 2d 31 33 2e 31 20 7b 0a 20  st func-13.1 {. 
4840: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
4850: 45 4c 45 43 54 20 74 65 73 74 5f 61 75 78 64 61  ELECT test_auxda
4860: 74 61 28 27 68 65 6c 6c 6f 20 77 6f 72 6c 64 27  ta('hello world'
4870: 29 3b 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 0a 64 6f  );.  }.} {0}..do
4880: 5f 74 65 73 74 20 66 75 6e 63 2d 31 33 2e 32 20  _test func-13.2 
4890: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
48a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
48b0: 34 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  4(a, b);.    INS
48c0: 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
48d0: 45 53 28 27 61 62 63 27 2c 20 27 64 65 66 27 29  ES('abc', 'def')
48e0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
48f0: 4f 20 74 34 20 56 41 4c 55 45 53 28 27 67 68 69  O t4 VALUES('ghi
4900: 27 2c 20 27 6a 6b 6c 27 29 3b 0a 20 20 7d 0a 7d  ', 'jkl');.  }.}
4910: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63   {}.do_test func
4920: 2d 31 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -13.3 {.  execsq
4930: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74  l {.    SELECT t
4940: 65 73 74 5f 61 75 78 64 61 74 61 28 27 68 65 6c  est_auxdata('hel
4950: 6c 6f 20 77 6f 72 6c 64 27 29 20 46 52 4f 4d 20  lo world') FROM 
4960: 74 34 3b 0a 20 20 7d 0a 7d 20 7b 30 20 31 7d 0a  t4;.  }.} {0 1}.
4970: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 33 2e  do_test func-13.
4980: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
4990: 20 20 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f      SELECT test_
49a0: 61 75 78 64 61 74 61 28 27 68 65 6c 6c 6f 20 77  auxdata('hello w
49b0: 6f 72 6c 64 27 2c 20 31 32 33 29 20 46 52 4f 4d  orld', 123) FROM
49c0: 20 74 34 3b 0a 20 20 7d 0a 7d 20 7b 7b 30 20 30   t4;.  }.} {{0 0
49d0: 7d 20 7b 31 20 31 7d 7d 0a 64 6f 5f 74 65 73 74  } {1 1}}.do_test
49e0: 20 66 75 6e 63 2d 31 33 2e 35 20 7b 0a 20 20 65   func-13.5 {.  e
49f0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
4a00: 45 43 54 20 74 65 73 74 5f 61 75 78 64 61 74 61  ECT test_auxdata
4a10: 28 27 68 65 6c 6c 6f 20 77 6f 72 6c 64 27 2c 20  ('hello world', 
4a20: 61 29 20 46 52 4f 4d 20 74 34 3b 0a 20 20 7d 0a  a) FROM t4;.  }.
4a30: 7d 20 7b 7b 30 20 30 7d 20 7b 31 20 30 7d 7d 0a  } {{0 0} {1 0}}.
4a40: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 33 2e  do_test func-13.
4a50: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  6 {.  execsql {.
4a60: 20 20 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f      SELECT test_
4a70: 61 75 78 64 61 74 61 28 27 68 65 6c 6c 6f 27 7c  auxdata('hello'|
4a80: 7c 27 77 6f 72 6c 64 27 2c 20 61 29 20 46 52 4f  |'world', a) FRO
4a90: 4d 20 74 34 3b 0a 20 20 7d 0a 7d 20 7b 7b 30 20  M t4;.  }.} {{0 
4aa0: 30 7d 20 7b 31 20 30 7d 7d 0a 0a 23 20 54 65 73  0} {1 0}}..# Tes
4ab0: 74 20 74 68 61 74 20 61 75 78 69 6c 61 72 79 20  t that auxilary 
4ac0: 64 61 74 61 20 69 73 20 70 72 65 73 65 72 76 65  data is preserve
4ad0: 64 20 62 65 74 77 65 65 6e 20 63 61 6c 6c 73 20  d between calls 
4ae0: 66 6f 72 20 53 51 4c 20 76 61 72 69 61 62 6c 65  for SQL variable
4af0: 73 2e 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  s..do_test func-
4b00: 31 33 2e 37 20 7b 0a 20 20 73 65 74 20 44 42 20  13.7 {.  set DB 
4b10: 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74  [sqlite3_connect
4b20: 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62 5d 0a  ion_pointer db].
4b30: 20 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45 43    set sql "SELEC
4b40: 54 20 74 65 73 74 5f 61 75 78 64 61 74 61 28 20  T test_auxdata( 
4b50: 3f 20 2c 20 61 20 29 20 46 52 4f 4d 20 74 34 3b  ? , a ) FROM t4;
4b60: 22 0a 20 20 73 65 74 20 53 54 4d 54 20 5b 73 71  ".  set STMT [sq
4b70: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 24 44  lite3_prepare $D
4b80: 42 20 24 73 71 6c 20 2d 31 20 54 41 49 4c 5d 0a  B $sql -1 TAIL].
4b90: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
4ba0: 65 78 74 20 24 53 54 4d 54 20 31 20 68 65 6c 6c  ext $STMT 1 hell
4bb0: 6f 5c 30 30 30 20 2d 31 0a 20 20 73 65 74 20 72  o\000 -1.  set r
4bc0: 65 73 20 5b 6c 69 73 74 5d 0a 20 20 77 68 69 6c  es [list].  whil
4bd0: 65 20 7b 20 22 53 51 4c 49 54 45 5f 52 4f 57 22  e { "SQLITE_ROW"
4be0: 3d 3d 5b 73 71 6c 69 74 65 33 5f 73 74 65 70 20  ==[sqlite3_step 
4bf0: 24 53 54 4d 54 5d 20 7d 20 7b 0a 20 20 20 20 6c  $STMT] } {.    l
4c00: 61 70 70 65 6e 64 20 72 65 73 20 5b 73 71 6c 69  append res [sqli
4c10: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20  te3_column_text 
4c20: 24 53 54 4d 54 20 30 5d 0a 20 20 7d 0a 20 20 6c  $STMT 0].  }.  l
4c30: 61 70 70 65 6e 64 20 72 65 73 20 5b 73 71 6c 69  append res [sqli
4c40: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 53 54  te3_finalize $ST
4c50: 4d 54 5d 0a 7d 20 7b 7b 30 20 30 7d 20 7b 31 20  MT].} {{0 0} {1 
4c60: 30 7d 20 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 23  0} SQLITE_OK}..#
4c70: 20 54 65 73 74 20 74 68 61 74 20 61 75 78 69 6c   Test that auxil
4c80: 69 61 72 79 20 64 61 74 61 20 69 73 20 64 69 73  iary data is dis
4c90: 63 61 72 64 65 64 20 77 68 65 6e 20 61 20 73 74  carded when a st
4ca0: 61 74 65 6d 65 6e 74 20 69 73 20 72 65 73 65 74  atement is reset
4cb0: 2e 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
4cc0: 74 20 31 33 2e 38 2e 31 20 7b 0a 20 20 53 45 4c  t 13.8.1 {.  SEL
4cd0: 45 43 54 20 74 65 73 74 5f 61 75 78 64 61 74 61  ECT test_auxdata
4ce0: 28 27 63 6f 6e 73 74 61 6e 74 27 29 20 46 52 4f  ('constant') FRO
4cf0: 4d 20 74 34 3b 0a 7d 20 7b 30 20 31 7d 0a 64 6f  M t4;.} {0 1}.do
4d00: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 33  _execsql_test 13
4d10: 2e 38 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  .8.2 {.  SELECT 
4d20: 74 65 73 74 5f 61 75 78 64 61 74 61 28 27 63 6f  test_auxdata('co
4d30: 6e 73 74 61 6e 74 27 29 20 46 52 4f 4d 20 74 34  nstant') FROM t4
4d40: 3b 0a 7d 20 7b 30 20 31 7d 0a 64 62 20 63 61 63  ;.} {0 1}.db cac
4d50: 68 65 20 66 6c 75 73 68 0a 64 6f 5f 65 78 65 63  he flush.do_exec
4d60: 73 71 6c 5f 74 65 73 74 20 31 33 2e 38 2e 33 20  sql_test 13.8.3 
4d70: 7b 0a 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f  {.  SELECT test_
4d80: 61 75 78 64 61 74 61 28 27 63 6f 6e 73 74 61 6e  auxdata('constan
4d90: 74 27 29 20 46 52 4f 4d 20 74 34 3b 0a 7d 20 7b  t') FROM t4;.} {
4da0: 30 20 31 7d 0a 73 65 74 20 56 20 22 6f 6e 65 22  0 1}.set V "one"
4db0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
4dc0: 20 31 33 2e 38 2e 34 20 7b 0a 20 20 53 45 4c 45   13.8.4 {.  SELE
4dd0: 43 54 20 74 65 73 74 5f 61 75 78 64 61 74 61 28  CT test_auxdata(
4de0: 24 56 29 2c 20 24 56 20 46 52 4f 4d 20 74 34 3b  $V), $V FROM t4;
4df0: 0a 7d 20 7b 30 20 6f 6e 65 20 31 20 6f 6e 65 7d  .} {0 one 1 one}
4e00: 0a 73 65 74 20 56 20 22 74 77 6f 22 0a 64 6f 5f  .set V "two".do_
4e10: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 33 2e  execsql_test 13.
4e20: 38 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 74  8.5 {.  SELECT t
4e30: 65 73 74 5f 61 75 78 64 61 74 61 28 24 56 29 2c  est_auxdata($V),
4e40: 20 24 56 20 46 52 4f 4d 20 74 34 3b 0a 7d 20 7b   $V FROM t4;.} {
4e50: 30 20 74 77 6f 20 31 20 74 77 6f 7d 0a 64 62 20  0 two 1 two}.db 
4e60: 63 61 63 68 65 20 66 6c 75 73 68 0a 73 65 74 20  cache flush.set 
4e70: 56 20 22 74 68 72 65 65 22 0a 64 6f 5f 65 78 65  V "three".do_exe
4e80: 63 73 71 6c 5f 74 65 73 74 20 31 33 2e 38 2e 36  csql_test 13.8.6
4e90: 20 7b 0a 20 20 53 45 4c 45 43 54 20 74 65 73 74   {.  SELECT test
4ea0: 5f 61 75 78 64 61 74 61 28 24 56 29 2c 20 24 56  _auxdata($V), $V
4eb0: 20 46 52 4f 4d 20 74 34 3b 0a 7d 20 7b 30 20 74   FROM t4;.} {0 t
4ec0: 68 72 65 65 20 31 20 74 68 72 65 65 7d 0a 0a 0a  hree 1 three}...
4ed0: 23 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74  # Make sure that
4ee0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
4ef0: 20 61 20 76 65 72 79 20 6c 6f 6e 67 20 6e 61 6d   a very long nam
4f00: 65 20 69 73 20 72 65 6a 65 63 74 65 64 0a 64 6f  e is rejected.do
4f10: 5f 74 65 73 74 20 66 75 6e 63 2d 31 34 2e 31 20  _test func-14.1 
4f20: 7b 0a 20 20 63 61 74 63 68 20 7b 0a 20 20 20 20  {.  catch {.    
4f30: 64 62 20 66 75 6e 63 74 69 6f 6e 20 5b 73 74 72  db function [str
4f40: 69 6e 67 20 72 65 70 65 61 74 20 58 20 32 35 34  ing repeat X 254
4f50: 5d 20 7b 72 65 74 75 72 6e 20 22 68 65 6c 6c 6f  ] {return "hello
4f60: 22 7d 0a 20 20 7d 20 0a 7d 20 7b 30 7d 0a 64 6f  "}.  } .} {0}.do
4f70: 5f 74 65 73 74 20 66 75 6e 63 2d 31 34 2e 32 20  _test func-14.2 
4f80: 7b 0a 20 20 63 61 74 63 68 20 7b 0a 20 20 20 20  {.  catch {.    
4f90: 64 62 20 66 75 6e 63 74 69 6f 6e 20 5b 73 74 72  db function [str
4fa0: 69 6e 67 20 72 65 70 65 61 74 20 58 20 32 35 36  ing repeat X 256
4fb0: 5d 20 7b 72 65 74 75 72 6e 20 22 68 65 6c 6c 6f  ] {return "hello
4fc0: 22 7d 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 0a 64 6f  "}.  }.} {1}..do
4fd0: 5f 74 65 73 74 20 66 75 6e 63 2d 31 35 2e 31 20  _test func-15.1 
4fe0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 73 65  {.  catchsql {se
4ff0: 6c 65 63 74 20 74 65 73 74 5f 65 72 72 6f 72 28  lect test_error(
5000: 4e 55 4c 4c 29 7d 0a 7d 20 7b 31 20 7b 7d 7d 0a  NULL)}.} {1 {}}.
5010: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 35 2e  do_test func-15.
5020: 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  2 {.  catchsql {
5030: 73 65 6c 65 63 74 20 74 65 73 74 5f 65 72 72 6f  select test_erro
5040: 72 28 27 74 68 69 73 20 69 73 20 74 68 65 20 65  r('this is the e
5050: 72 72 6f 72 20 6d 65 73 73 61 67 65 27 29 7d 0a  rror message')}.
5060: 7d 20 7b 31 20 7b 74 68 69 73 20 69 73 20 74 68  } {1 {this is th
5070: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 7d  e error message}
5080: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31  }.do_test func-1
5090: 35 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  5.3 {.  catchsql
50a0: 20 7b 73 65 6c 65 63 74 20 74 65 73 74 5f 65 72   {select test_er
50b0: 72 6f 72 28 27 74 68 69 73 20 69 73 20 74 68 65  ror('this is the
50c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 27 2c   error message',
50d0: 31 32 29 7d 0a 7d 20 7b 31 20 7b 74 68 69 73 20  12)}.} {1 {this 
50e0: 69 73 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  is the error mes
50f0: 73 61 67 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  sage}}.do_test f
5100: 75 6e 63 2d 31 35 2e 34 20 7b 0a 20 20 64 62 20  unc-15.4 {.  db 
5110: 65 72 72 6f 72 63 6f 64 65 0a 7d 20 7b 31 32 7d  errorcode.} {12}
5120: 0a 0a 23 20 54 65 73 74 20 74 68 65 20 71 75 6f  ..# Test the quo
5130: 74 65 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  te function for 
5140: 42 4c 4f 42 20 61 6e 64 20 4e 55 4c 4c 20 76 61  BLOB and NULL va
5150: 6c 75 65 73 2e 0a 64 6f 5f 74 65 73 74 20 66 75  lues..do_test fu
5160: 6e 63 2d 31 36 2e 31 20 7b 0a 20 20 65 78 65 63  nc-16.1 {.  exec
5170: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
5180: 20 54 41 42 4c 45 20 74 62 6c 32 28 61 2c 20 62   TABLE tbl2(a, b
5190: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 53 54 4d  );.  }.  set STM
51a0: 54 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  T [sqlite3_prepa
51b0: 72 65 20 24 3a 3a 44 42 20 22 49 4e 53 45 52 54  re $::DB "INSERT
51c0: 20 49 4e 54 4f 20 74 62 6c 32 20 56 41 4c 55 45   INTO tbl2 VALUE
51d0: 53 28 3f 2c 20 3f 29 22 20 2d 31 20 54 41 49 4c  S(?, ?)" -1 TAIL
51e0: 5d 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ].  sqlite3_bind
51f0: 5f 62 6c 6f 62 20 24 3a 3a 53 54 4d 54 20 31 20  _blob $::STMT 1 
5200: 61 62 63 20 33 0a 20 20 73 71 6c 69 74 65 33 5f  abc 3.  sqlite3_
5210: 73 74 65 70 20 24 3a 3a 53 54 4d 54 0a 20 20 73  step $::STMT.  s
5220: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
5230: 24 3a 3a 53 54 4d 54 0a 20 20 65 78 65 63 73 71  $::STMT.  execsq
5240: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 71  l {.    SELECT q
5250: 75 6f 74 65 28 61 29 2c 20 71 75 6f 74 65 28 62  uote(a), quote(b
5260: 29 20 46 52 4f 4d 20 74 62 6c 32 3b 0a 20 20 7d  ) FROM tbl2;.  }
5270: 0a 7d 20 7b 58 27 36 31 36 32 36 33 27 20 4e 55  .} {X'616263' NU
5280: 4c 4c 7d 0a 0a 23 20 43 6f 72 72 65 63 74 6c 79  LL}..# Correctly
5290: 20 68 61 6e 64 6c 65 20 66 75 6e 63 74 69 6f 6e   handle function
52a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
52b0: 74 68 61 74 20 69 6e 63 6c 75 64 65 20 25 2e 20  that include %. 
52c0: 20 54 69 63 6b 65 74 20 23 31 33 35 34 0a 23 0a   Ticket #1354.#.
52d0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 37 2e  do_test func-17.
52e0: 31 20 7b 0a 20 20 70 72 6f 63 20 74 65 73 74 66  1 {.  proc testf
52f0: 75 6e 63 31 20 61 72 67 73 20 7b 65 72 72 6f 72  unc1 args {error
5300: 20 22 45 72 72 6f 72 20 25 64 20 77 69 74 68 20   "Error %d with 
5310: 25 73 20 70 65 72 63 65 6e 74 73 20 25 70 22 7d  %s percents %p"}
5320: 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 74  .  db function t
5330: 65 73 74 66 75 6e 63 31 20 3a 3a 74 65 73 74 66  estfunc1 ::testf
5340: 75 6e 63 31 0a 20 20 63 61 74 63 68 73 71 6c 20  unc1.  catchsql 
5350: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 65 73  {.    SELECT tes
5360: 74 66 75 6e 63 31 28 31 2c 32 2c 33 29 3b 0a 20  tfunc1(1,2,3);. 
5370: 20 7d 0a 7d 20 7b 31 20 7b 45 72 72 6f 72 20 25   }.} {1 {Error %
5380: 64 20 77 69 74 68 20 25 73 20 70 65 72 63 65 6e  d with %s percen
5390: 74 73 20 25 70 7d 7d 0a 0a 23 20 54 68 65 20 53  ts %p}}..# The S
53a0: 55 4d 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  UM function shou
53b0: 6c 64 20 72 65 74 75 72 6e 20 69 6e 74 65 67 65  ld return intege
53c0: 72 20 72 65 73 75 6c 74 73 20 77 68 65 6e 20 61  r results when a
53d0: 6c 6c 20 69 6e 70 75 74 73 20 61 72 65 20 69 6e  ll inputs are in
53e0: 74 65 67 65 72 2e 0a 23 0a 64 6f 5f 74 65 73 74  teger..#.do_test
53f0: 20 66 75 6e 63 2d 31 38 2e 31 20 7b 0a 20 20 65   func-18.1 {.  e
5400: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
5410: 41 54 45 20 54 41 42 4c 45 20 74 35 28 78 29 3b  ATE TABLE t5(x);
5420: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5430: 20 74 35 20 56 41 4c 55 45 53 28 31 29 3b 0a 20   t5 VALUES(1);. 
5440: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5450: 35 20 56 41 4c 55 45 53 28 2d 39 39 29 3b 0a 20  5 VALUES(-99);. 
5460: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5470: 35 20 56 41 4c 55 45 53 28 31 30 30 30 30 29 3b  5 VALUES(10000);
5480: 0a 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28  .    SELECT sum(
5490: 78 29 20 46 52 4f 4d 20 74 35 3b 0a 20 20 7d 0a  x) FROM t5;.  }.
54a0: 7d 20 7b 39 39 30 32 7d 0a 69 66 63 61 70 61 62  } {9902}.ifcapab
54b0: 6c 65 20 66 6c 6f 61 74 69 6e 67 70 6f 69 6e 74  le floatingpoint
54c0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e   {.  do_test fun
54d0: 63 2d 31 38 2e 32 20 7b 0a 20 20 20 20 65 78 65  c-18.2 {.    exe
54e0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53  csql {.      INS
54f0: 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55  ERT INTO t5 VALU
5500: 45 53 28 30 2e 30 29 3b 0a 20 20 20 20 20 20 53  ES(0.0);.      S
5510: 45 4c 45 43 54 20 73 75 6d 28 78 29 20 46 52 4f  ELECT sum(x) FRO
5520: 4d 20 74 35 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t5;.    }.  } 
5530: 7b 39 39 30 32 2e 30 7d 0a 7d 0a 0a 23 20 54 68  {9902.0}.}..# Th
5540: 65 20 73 75 6d 20 6f 66 20 6e 6f 74 68 69 6e 67  e sum of nothing
5550: 20 69 73 20 4e 55 4c 4c 2e 20 20 42 75 74 20 74   is NULL.  But t
5560: 68 65 20 73 75 6d 20 6f 66 20 61 6c 6c 20 4e 55  he sum of all NU
5570: 4c 4c 73 20 69 73 20 4e 55 4c 4c 2e 0a 23 0a 23  LLs is NULL..#.#
5580: 20 54 68 65 20 54 4f 54 41 4c 20 6f 66 20 6e 6f   The TOTAL of no
5590: 74 68 69 6e 67 20 69 73 20 30 2e 30 2e 0a 23 0a  thing is 0.0..#.
55a0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e  do_test func-18.
55b0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
55c0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
55d0: 74 35 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 73  t5;.    SELECT s
55e0: 75 6d 28 78 29 2c 20 74 6f 74 61 6c 28 78 29 20  um(x), total(x) 
55f0: 46 52 4f 4d 20 74 35 3b 0a 20 20 7d 0a 7d 20 7b  FROM t5;.  }.} {
5600: 7b 7d 20 30 2e 30 7d 0a 64 6f 5f 74 65 73 74 20  {} 0.0}.do_test 
5610: 66 75 6e 63 2d 31 38 2e 34 20 7b 0a 20 20 65 78  func-18.4 {.  ex
5620: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
5630: 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45  RT INTO t5 VALUE
5640: 53 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 45 4c  S(NULL);.    SEL
5650: 45 43 54 20 73 75 6d 28 78 29 2c 20 74 6f 74 61  ECT sum(x), tota
5660: 6c 28 78 29 20 46 52 4f 4d 20 74 35 0a 20 20 7d  l(x) FROM t5.  }
5670: 0a 7d 20 7b 7b 7d 20 30 2e 30 7d 0a 64 6f 5f 74  .} {{} 0.0}.do_t
5680: 65 73 74 20 66 75 6e 63 2d 31 38 2e 35 20 7b 0a  est func-18.5 {.
5690: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
56a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56  INSERT INTO t5 V
56b0: 41 4c 55 45 53 28 4e 55 4c 4c 29 3b 0a 20 20 20  ALUES(NULL);.   
56c0: 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 2c 20   SELECT sum(x), 
56d0: 74 6f 74 61 6c 28 78 29 20 46 52 4f 4d 20 74 35  total(x) FROM t5
56e0: 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 30 2e 30 7d 0a  .  }.} {{} 0.0}.
56f0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e  do_test func-18.
5700: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  6 {.  execsql {.
5710: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5720: 74 35 20 56 41 4c 55 45 53 28 31 32 33 29 3b 0a  t5 VALUES(123);.
5730: 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78      SELECT sum(x
5740: 29 2c 20 74 6f 74 61 6c 28 78 29 20 46 52 4f 4d  ), total(x) FROM
5750: 20 74 35 0a 20 20 7d 0a 7d 20 7b 31 32 33 20 31   t5.  }.} {123 1
5760: 32 33 2e 30 7d 0a 0a 23 20 54 69 63 6b 65 74 20  23.0}..# Ticket 
5770: 23 31 36 36 34 2c 20 23 31 36 36 39 2c 20 23 31  #1664, #1669, #1
5780: 36 37 30 2c 20 23 31 36 37 34 3a 20 41 6e 20 69  670, #1674: An i
5790: 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20  nteger overflow 
57a0: 6f 6e 20 53 55 4d 20 63 61 75 73 65 73 0a 23 20  on SUM causes.# 
57b0: 61 6e 20 65 72 72 6f 72 2e 20 54 68 65 20 6e 6f  an error. The no
57c0: 6e 2d 73 74 61 6e 64 61 72 64 20 54 4f 54 41 4c  n-standard TOTAL
57d0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74  () function cont
57e0: 69 6e 75 65 73 20 74 6f 20 67 69 76 65 20 61 20  inues to give a 
57f0: 68 65 6c 70 66 75 6c 0a 23 20 72 65 73 75 6c 74  helpful.# result
5800: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  ..#.do_test func
5810: 2d 31 38 2e 31 30 20 7b 0a 20 20 65 78 65 63 73  -18.10 {.  execs
5820: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
5830: 54 41 42 4c 45 20 74 36 28 78 20 49 4e 54 45 47  TABLE t6(x INTEG
5840: 45 52 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ER);.    INSERT 
5850: 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28 31  INTO t6 VALUES(1
5860: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
5870: 54 4f 20 74 36 20 56 41 4c 55 45 53 28 31 3c 3c  TO t6 VALUES(1<<
5880: 36 32 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  62);.    SELECT 
5890: 73 75 6d 28 78 29 20 2d 20 28 28 31 3c 3c 36 32  sum(x) - ((1<<62
58a0: 29 2b 31 29 20 66 72 6f 6d 20 74 36 3b 0a 20 20  )+1) from t6;.  
58b0: 7d 0a 7d 20 30 0a 64 6f 5f 74 65 73 74 20 66 75  }.} 0.do_test fu
58c0: 6e 63 2d 31 38 2e 31 31 20 7b 0a 20 20 65 78 65  nc-18.11 {.  exe
58d0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
58e0: 54 20 74 79 70 65 6f 66 28 73 75 6d 28 78 29 29  T typeof(sum(x))
58f0: 20 46 52 4f 4d 20 74 36 0a 20 20 7d 0a 7d 20 69   FROM t6.  }.} i
5900: 6e 74 65 67 65 72 0a 69 66 63 61 70 61 62 6c 65  nteger.ifcapable
5910: 20 66 6c 6f 61 74 69 6e 67 70 6f 69 6e 74 20 7b   floatingpoint {
5920: 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .  do_test func-
5930: 31 38 2e 31 32 20 7b 0a 20 20 20 20 63 61 74 63  18.12 {.    catc
5940: 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53  hsql {.      INS
5950: 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55  ERT INTO t6 VALU
5960: 45 53 28 31 3c 3c 36 32 29 3b 0a 20 20 20 20 20  ES(1<<62);.     
5970: 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 20 2d   SELECT sum(x) -
5980: 20 28 28 31 3c 3c 36 32 29 2a 32 2e 30 2b 31 29   ((1<<62)*2.0+1)
5990: 20 66 72 6f 6d 20 74 36 3b 0a 20 20 20 20 7d 0a   from t6;.    }.
59a0: 20 20 7d 20 7b 31 20 7b 69 6e 74 65 67 65 72 20    } {1 {integer 
59b0: 6f 76 65 72 66 6c 6f 77 7d 7d 0a 20 20 64 6f 5f  overflow}}.  do_
59c0: 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 33 20  test func-18.13 
59d0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
59e0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 74 6f 74        SELECT tot
59f0: 61 6c 28 78 29 20 2d 20 28 28 31 3c 3c 36 32 29  al(x) - ((1<<62)
5a00: 2a 32 2e 30 2b 31 29 20 46 52 4f 4d 20 74 36 0a  *2.0+1) FROM t6.
5a10: 20 20 20 20 7d 0a 20 20 7d 20 30 2e 30 0a 7d 0a      }.  } 0.0.}.
5a20: 69 66 63 61 70 61 62 6c 65 20 21 66 6c 6f 61 74  ifcapable !float
5a30: 69 6e 67 70 6f 69 6e 74 20 7b 0a 20 20 64 6f 5f  ingpoint {.  do_
5a40: 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 32 20  test func-18.12 
5a50: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
5a60: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
5a70: 54 4f 20 74 36 20 56 41 4c 55 45 53 28 31 3c 3c  TO t6 VALUES(1<<
5a80: 36 32 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  62);.      SELEC
5a90: 54 20 73 75 6d 28 78 29 20 2d 20 28 28 31 3c 3c  T sum(x) - ((1<<
5aa0: 36 32 29 2a 32 2b 31 29 20 66 72 6f 6d 20 74 36  62)*2+1) from t6
5ab0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b  ;.    }.  } {1 {
5ac0: 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77  integer overflow
5ad0: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e  }}.  do_test fun
5ae0: 63 2d 31 38 2e 31 33 20 7b 0a 20 20 20 20 65 78  c-18.13 {.    ex
5af0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
5b00: 4c 45 43 54 20 74 6f 74 61 6c 28 78 29 20 2d 20  LECT total(x) - 
5b10: 28 28 31 3c 3c 36 32 29 2a 32 2b 31 29 20 46 52  ((1<<62)*2+1) FR
5b20: 4f 4d 20 74 36 0a 20 20 20 20 7d 0a 20 20 7d 20  OM t6.    }.  } 
5b30: 30 2e 30 0a 7d 0a 69 66 20 7b 5b 77 6f 72 6b 69  0.0.}.if {[worki
5b40: 6e 67 5f 36 34 62 69 74 5f 69 6e 74 5d 7d 20 7b  ng_64bit_int]} {
5b50: 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .  do_test func-
5b60: 31 38 2e 31 34 20 7b 0a 20 20 20 20 65 78 65 63  18.14 {.    exec
5b70: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
5b80: 43 54 20 73 75 6d 28 2d 39 32 32 33 33 37 32 30  CT sum(-92233720
5b90: 33 36 38 35 34 37 37 35 38 30 35 29 3b 0a 20 20  36854775805);.  
5ba0: 20 20 7d 0a 20 20 7d 20 2d 39 32 32 33 33 37 32    }.  } -9223372
5bb0: 30 33 36 38 35 34 37 37 35 38 30 35 0a 7d 0a 69  036854775805.}.i
5bc0: 66 63 61 70 61 62 6c 65 20 63 6f 6d 70 6f 75 6e  fcapable compoun
5bd0: 64 26 26 73 75 62 71 75 65 72 79 20 7b 0a 0a 64  d&&subquery {..d
5be0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 31  o_test func-18.1
5bf0: 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  5 {.  catchsql {
5c00: 0a 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28  .    SELECT sum(
5c10: 78 29 20 46 52 4f 4d 20 0a 20 20 20 20 20 20 20  x) FROM .       
5c20: 28 53 45 4c 45 43 54 20 39 32 32 33 33 37 32 30  (SELECT 92233720
5c30: 33 36 38 35 34 37 37 35 38 30 37 20 41 53 20 78  36854775807 AS x
5c40: 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20   UNION ALL.     
5c50: 20 20 20 53 45 4c 45 43 54 20 31 30 20 41 53 20     SELECT 10 AS 
5c60: 78 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 69 6e  x);.  }.} {1 {in
5c70: 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 7d 7d  teger overflow}}
5c80: 0a 69 66 20 7b 5b 77 6f 72 6b 69 6e 67 5f 36 34  .if {[working_64
5c90: 62 69 74 5f 69 6e 74 5d 7d 20 7b 0a 20 20 64 6f  bit_int]} {.  do
5ca0: 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 36  _test func-18.16
5cb0: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
5cc0: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 73  {.      SELECT s
5cd0: 75 6d 28 78 29 20 46 52 4f 4d 20 0a 20 20 20 20  um(x) FROM .    
5ce0: 20 20 20 20 20 28 53 45 4c 45 43 54 20 39 32 32       (SELECT 922
5cf0: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
5d00: 20 41 53 20 78 20 55 4e 49 4f 4e 20 41 4c 4c 0a   AS x UNION ALL.
5d10: 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54            SELECT
5d20: 20 2d 31 30 20 41 53 20 78 29 3b 0a 20 20 20 20   -10 AS x);.    
5d30: 7d 0a 20 20 7d 20 7b 30 20 39 32 32 33 33 37 32  }.  } {0 9223372
5d40: 30 33 36 38 35 34 37 37 35 37 39 37 7d 0a 20 20  036854775797}.  
5d50: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e  do_test func-18.
5d60: 31 37 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  17 {.    catchsq
5d70: 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  l {.      SELECT
5d80: 20 73 75 6d 28 78 29 20 46 52 4f 4d 20 0a 20 20   sum(x) FROM .  
5d90: 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 2d         (SELECT -
5da0: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
5db0: 38 30 37 20 41 53 20 78 20 55 4e 49 4f 4e 20 41  807 AS x UNION A
5dc0: 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 53 45 4c  LL.          SEL
5dd0: 45 43 54 20 31 30 20 41 53 20 78 29 3b 0a 20 20  ECT 10 AS x);.  
5de0: 20 20 7d 0a 20 20 7d 20 7b 30 20 2d 39 32 32 33    }.  } {0 -9223
5df0: 33 37 32 30 33 36 38 35 34 37 37 35 37 39 37 7d  372036854775797}
5e00: 0a 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .}.do_test func-
5e10: 31 38 2e 31 38 20 7b 0a 20 20 63 61 74 63 68 73  18.18 {.  catchs
5e20: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
5e30: 73 75 6d 28 78 29 20 46 52 4f 4d 20 0a 20 20 20  sum(x) FROM .   
5e40: 20 20 20 20 28 53 45 4c 45 43 54 20 2d 39 32 32      (SELECT -922
5e50: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
5e60: 20 41 53 20 78 20 55 4e 49 4f 4e 20 41 4c 4c 0a   AS x UNION ALL.
5e70: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2d          SELECT -
5e80: 31 30 20 41 53 20 78 29 3b 0a 20 20 7d 0a 7d 20  10 AS x);.  }.} 
5e90: 7b 31 20 7b 69 6e 74 65 67 65 72 20 6f 76 65 72  {1 {integer over
5ea0: 66 6c 6f 77 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  flow}}.do_test f
5eb0: 75 6e 63 2d 31 38 2e 31 39 20 7b 0a 20 20 63 61  unc-18.19 {.  ca
5ec0: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
5ed0: 45 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d 20  ECT sum(x) FROM 
5ee0: 28 53 45 4c 45 43 54 20 39 20 41 53 20 78 20 55  (SELECT 9 AS x U
5ef0: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
5f00: 2d 31 30 20 41 53 20 78 29 3b 0a 20 20 7d 0a 7d  -10 AS x);.  }.}
5f10: 20 7b 30 20 2d 31 7d 0a 64 6f 5f 74 65 73 74 20   {0 -1}.do_test 
5f20: 66 75 6e 63 2d 31 38 2e 32 30 20 7b 0a 20 20 63  func-18.20 {.  c
5f30: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45  atchsql {.    SE
5f40: 4c 45 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d  LECT sum(x) FROM
5f50: 20 28 53 45 4c 45 43 54 20 2d 39 20 41 53 20 78   (SELECT -9 AS x
5f60: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
5f70: 54 20 31 30 20 41 53 20 78 29 3b 0a 20 20 7d 0a  T 10 AS x);.  }.
5f80: 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73 74 20  } {0 1}.do_test 
5f90: 66 75 6e 63 2d 31 38 2e 32 31 20 7b 0a 20 20 63  func-18.21 {.  c
5fa0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45  atchsql {.    SE
5fb0: 4c 45 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d  LECT sum(x) FROM
5fc0: 20 28 53 45 4c 45 43 54 20 2d 31 30 20 41 53 20   (SELECT -10 AS 
5fd0: 78 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  x UNION ALL SELE
5fe0: 43 54 20 39 20 41 53 20 78 29 3b 0a 20 20 7d 0a  CT 9 AS x);.  }.
5ff0: 7d 20 7b 30 20 2d 31 7d 0a 64 6f 5f 74 65 73 74  } {0 -1}.do_test
6000: 20 66 75 6e 63 2d 31 38 2e 32 32 20 7b 0a 20 20   func-18.22 {.  
6010: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
6020: 45 4c 45 43 54 20 73 75 6d 28 78 29 20 46 52 4f  ELECT sum(x) FRO
6030: 4d 20 28 53 45 4c 45 43 54 20 31 30 20 41 53 20  M (SELECT 10 AS 
6040: 78 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  x UNION ALL SELE
6050: 43 54 20 2d 39 20 41 53 20 78 29 3b 0a 20 20 7d  CT -9 AS x);.  }
6060: 0a 7d 20 7b 30 20 31 7d 0a 0a 7d 20 3b 23 20 69  .} {0 1}..} ;# i
6070: 66 63 61 70 61 62 6c 65 20 63 6f 6d 70 6f 75 6e  fcapable compoun
6080: 64 26 26 73 75 62 71 75 65 72 79 0a 0a 23 20 49  d&&subquery..# I
6090: 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20  nteger overflow 
60a0: 6f 6e 20 61 62 73 28 29 0a 23 0a 69 66 20 7b 5b  on abs().#.if {[
60b0: 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e  working_64bit_in
60c0: 74 5d 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  t]} {.  do_test 
60d0: 66 75 6e 63 2d 31 38 2e 33 31 20 7b 0a 20 20 20  func-18.31 {.   
60e0: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
60f0: 20 20 53 45 4c 45 43 54 20 61 62 73 28 2d 39 32    SELECT abs(-92
6100: 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
6110: 37 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 30  7);.    }.  } {0
6120: 20 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37   922337203685477
6130: 35 38 30 37 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20  5807}.}.do_test 
6140: 66 75 6e 63 2d 31 38 2e 33 32 20 7b 0a 20 20 63  func-18.32 {.  c
6150: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45  atchsql {.    SE
6160: 4c 45 43 54 20 61 62 73 28 2d 39 32 32 33 33 37  LECT abs(-922337
6170: 32 30 33 36 38 35 34 37 37 35 38 30 37 2d 31 29  2036854775807-1)
6180: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 69 6e 74 65  ;.  }.} {1 {inte
6190: 67 65 72 20 6f 76 65 72 66 6c 6f 77 7d 7d 0a 0a  ger overflow}}..
61a0: 23 20 54 68 65 20 4d 41 54 43 48 20 66 75 6e 63  # The MATCH func
61b0: 74 69 6f 6e 20 65 78 69 73 74 73 20 62 75 74 20  tion exists but 
61c0: 69 73 20 6f 6e 6c 79 20 61 20 73 74 75 62 20 61  is only a stub a
61d0: 6e 64 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73  nd always throws
61e0: 20 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 64 6f 5f   an error..#.do_
61f0: 74 65 73 74 20 66 75 6e 63 2d 31 39 2e 31 20 7b  test func-19.1 {
6200: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6210: 20 53 45 4c 45 43 54 20 6d 61 74 63 68 28 61 2c   SELECT match(a,
6220: 62 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  b) FROM t1 WHERE
6230: 20 30 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f   0;.  }.} {}.do_
6240: 74 65 73 74 20 66 75 6e 63 2d 31 39 2e 32 20 7b  test func-19.2 {
6250: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
6260: 20 20 53 45 4c 45 43 54 20 27 61 62 63 27 20 4d    SELECT 'abc' M
6270: 41 54 43 48 20 27 78 79 7a 27 3b 0a 20 20 7d 0a  ATCH 'xyz';.  }.
6280: 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20  } {1 {unable to 
6290: 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 4d 41 54  use function MAT
62a0: 43 48 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  CH in the reques
62b0: 74 65 64 20 63 6f 6e 74 65 78 74 7d 7d 0a 64 6f  ted context}}.do
62c0: 5f 74 65 73 74 20 66 75 6e 63 2d 31 39 2e 33 20  _test func-19.3 
62d0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
62e0: 20 20 20 53 45 4c 45 43 54 20 27 61 62 63 27 20     SELECT 'abc' 
62f0: 4e 4f 54 20 4d 41 54 43 48 20 27 78 79 7a 27 3b  NOT MATCH 'xyz';
6300: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c  .  }.} {1 {unabl
6310: 65 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f  e to use functio
6320: 6e 20 4d 41 54 43 48 20 69 6e 20 74 68 65 20 72  n MATCH in the r
6330: 65 71 75 65 73 74 65 64 20 63 6f 6e 74 65 78 74  equested context
6340: 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  }}.do_test func-
6350: 31 39 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71  19.4 {.  catchsq
6360: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6d  l {.    SELECT m
6370: 61 74 63 68 28 31 2c 32 2c 33 29 3b 0a 20 20 7d  atch(1,2,3);.  }
6380: 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 6e 75 6d  .} {1 {wrong num
6390: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
63a0: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 6d 61 74   to function mat
63b0: 63 68 28 29 7d 7d 0a 0a 23 20 53 6f 75 6e 64 65  ch()}}..# Sounde
63c0: 78 20 74 65 73 74 73 2e 0a 23 0a 69 66 20 7b 21  x tests..#.if {!
63d0: 5b 63 61 74 63 68 20 7b 64 62 20 65 76 61 6c 20  [catch {db eval 
63e0: 7b 53 45 4c 45 43 54 20 73 6f 75 6e 64 65 78 28  {SELECT soundex(
63f0: 27 68 65 6c 6c 6f 27 29 7d 7d 5d 7d 20 7b 0a 20  'hello')}}]} {. 
6400: 20 73 65 74 20 69 20 30 0a 20 20 66 6f 72 65 61   set i 0.  forea
6410: 63 68 20 7b 6e 61 6d 65 20 73 64 78 7d 20 7b 0a  ch {name sdx} {.
6420: 20 20 20 20 65 75 6c 65 72 20 20 20 20 20 20 20      euler       
6430: 20 45 34 36 30 0a 20 20 20 20 45 55 4c 45 52 20   E460.    EULER 
6440: 20 20 20 20 20 20 20 45 34 36 30 0a 20 20 20 20         E460.    
6450: 45 75 6c 65 72 20 20 20 20 20 20 20 20 45 34 36  Euler        E46
6460: 30 0a 20 20 20 20 65 6c 6c 65 72 79 20 20 20 20  0.    ellery    
6470: 20 20 20 45 34 36 30 0a 20 20 20 20 67 61 75 73     E460.    gaus
6480: 73 20 20 20 20 20 20 20 20 47 32 30 30 0a 20 20  s        G200.  
6490: 20 20 67 68 6f 73 68 20 20 20 20 20 20 20 20 47    ghosh        G
64a0: 32 30 30 0a 20 20 20 20 68 69 6c 62 65 72 74 20  200.    hilbert 
64b0: 20 20 20 20 20 48 34 31 36 0a 20 20 20 20 48 65       H416.    He
64c0: 69 6c 62 72 6f 6e 6e 20 20 20 20 48 34 31 36 0a  ilbronn    H416.
64d0: 20 20 20 20 6b 6e 75 74 68 20 20 20 20 20 20 20      knuth       
64e0: 20 4b 35 33 30 0a 20 20 20 20 6b 61 6e 74 20 20   K530.    kant  
64f0: 20 20 20 20 20 20 20 4b 35 33 30 0a 20 20 20 20         K530.    
6500: 4c 6c 6f 79 64 20 20 20 20 20 20 20 20 4c 33 30  Lloyd        L30
6510: 30 0a 20 20 20 20 4c 41 44 44 20 20 20 20 20 20  0.    LADD      
6520: 20 20 20 4c 33 30 30 0a 20 20 20 20 4c 75 6b 61     L300.    Luka
6530: 73 69 65 77 69 63 7a 20 20 4c 32 32 32 0a 20 20  siewicz  L222.  
6540: 20 20 4c 69 73 73 61 6a 6f 75 73 20 20 20 20 4c    Lissajous    L
6550: 32 32 32 0a 20 20 20 20 41 20 20 20 20 20 20 20  222.    A       
6560: 20 20 20 20 20 41 30 30 30 0a 20 20 20 20 31 32       A000.    12
6570: 33 34 35 20 20 20 20 20 20 20 20 3f 30 30 30 0a  345        ?000.
6580: 20 20 7d 20 7b 0a 20 20 20 20 69 6e 63 72 20 69    } {.    incr i
6590: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 66 75 6e  .    do_test fun
65a0: 63 2d 32 30 2e 24 69 20 7b 0a 20 20 20 20 20 20  c-20.$i {.      
65b0: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
65c0: 73 6f 75 6e 64 65 78 28 24 6e 61 6d 65 29 7d 0a  soundex($name)}.
65d0: 20 20 20 20 7d 20 24 73 64 78 0a 20 20 7d 0a 7d      } $sdx.  }.}
65e0: 0a 0a 23 20 54 65 73 74 73 20 6f 66 20 74 68 65  ..# Tests of the
65f0: 20 52 45 50 4c 41 43 45 20 66 75 6e 63 74 69 6f   REPLACE functio
6600: 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e  n..#.do_test fun
6610: 63 2d 32 31 2e 31 20 7b 0a 20 20 63 61 74 63 68  c-21.1 {.  catch
6620: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
6630: 20 72 65 70 6c 61 63 65 28 31 2c 32 29 3b 0a 20   replace(1,2);. 
6640: 20 7d 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 6e   }.} {1 {wrong n
6650: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
6660: 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 72  ts to function r
6670: 65 70 6c 61 63 65 28 29 7d 7d 0a 64 6f 5f 74 65  eplace()}}.do_te
6680: 73 74 20 66 75 6e 63 2d 32 31 2e 32 20 7b 0a 20  st func-21.2 {. 
6690: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
66a0: 53 45 4c 45 43 54 20 72 65 70 6c 61 63 65 28 31  SELECT replace(1
66b0: 2c 32 2c 33 2c 34 29 3b 0a 20 20 7d 0a 7d 20 7b  ,2,3,4);.  }.} {
66c0: 31 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  1 {wrong number 
66d0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
66e0: 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65  function replace
66f0: 28 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  ()}}.do_test fun
6700: 63 2d 32 31 2e 33 20 7b 0a 20 20 65 78 65 63 73  c-21.3 {.  execs
6710: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
6720: 74 79 70 65 6f 66 28 72 65 70 6c 61 63 65 28 22  typeof(replace("
6730: 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  This is the main
6740: 20 74 65 73 74 20 73 74 72 69 6e 67 22 2c 20 4e   test string", N
6750: 55 4c 4c 2c 20 22 41 4c 54 22 29 29 3b 0a 20 20  ULL, "ALT"));.  
6760: 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64 6f 5f 74 65  }.} {null}.do_te
6770: 73 74 20 66 75 6e 63 2d 32 31 2e 34 20 7b 0a 20  st func-21.4 {. 
6780: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
6790: 45 4c 45 43 54 20 74 79 70 65 6f 66 28 72 65 70  ELECT typeof(rep
67a0: 6c 61 63 65 28 4e 55 4c 4c 2c 20 22 6d 61 69 6e  lace(NULL, "main
67b0: 22 2c 20 22 41 4c 54 22 29 29 3b 0a 20 20 7d 0a  ", "ALT"));.  }.
67c0: 7d 20 7b 6e 75 6c 6c 7d 0a 64 6f 5f 74 65 73 74  } {null}.do_test
67d0: 20 66 75 6e 63 2d 32 31 2e 35 20 7b 0a 20 20 65   func-21.5 {.  e
67e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
67f0: 45 43 54 20 74 79 70 65 6f 66 28 72 65 70 6c 61  ECT typeof(repla
6800: 63 65 28 22 54 68 69 73 20 69 73 20 74 68 65 20  ce("This is the 
6810: 6d 61 69 6e 20 74 65 73 74 20 73 74 72 69 6e 67  main test string
6820: 22 2c 20 22 6d 61 69 6e 22 2c 20 4e 55 4c 4c 29  ", "main", NULL)
6830: 29 3b 0a 20 20 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a  );.  }.} {null}.
6840: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 31 2e  do_test func-21.
6850: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  6 {.  execsql {.
6860: 20 20 20 20 53 45 4c 45 43 54 20 72 65 70 6c 61      SELECT repla
6870: 63 65 28 22 54 68 69 73 20 69 73 20 74 68 65 20  ce("This is the 
6880: 6d 61 69 6e 20 74 65 73 74 20 73 74 72 69 6e 67  main test string
6890: 22 2c 20 22 6d 61 69 6e 22 2c 20 22 41 4c 54 22  ", "main", "ALT"
68a0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7b 54 68 69 73 20  );.  }.} {{This 
68b0: 69 73 20 74 68 65 20 41 4c 54 20 74 65 73 74 20  is the ALT test 
68c0: 73 74 72 69 6e 67 7d 7d 0a 64 6f 5f 74 65 73 74  string}}.do_test
68d0: 20 66 75 6e 63 2d 32 31 2e 37 20 7b 0a 20 20 65   func-21.7 {.  e
68e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
68f0: 45 43 54 20 72 65 70 6c 61 63 65 28 22 54 68 69  ECT replace("Thi
6900: 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 74 65  s is the main te
6910: 73 74 20 73 74 72 69 6e 67 22 2c 20 22 6d 61 69  st string", "mai
6920: 6e 22 2c 20 22 6c 61 72 67 65 72 2d 6d 61 69 6e  n", "larger-main
6930: 22 29 3b 0a 20 20 7d 0a 7d 20 7b 7b 54 68 69 73  ");.  }.} {{This
6940: 20 69 73 20 74 68 65 20 6c 61 72 67 65 72 2d 6d   is the larger-m
6950: 61 69 6e 20 74 65 73 74 20 73 74 72 69 6e 67 7d  ain test string}
6960: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  }.do_test func-2
6970: 31 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.8 {.  execsql 
6980: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 65 70  {.    SELECT rep
6990: 6c 61 63 65 28 22 61 61 61 61 61 61 61 22 2c 20  lace("aaaaaaa", 
69a0: 22 61 22 2c 20 22 30 31 32 33 34 35 36 37 38 39  "a", "0123456789
69b0: 22 29 3b 0a 20 20 7d 0a 7d 20 7b 30 31 32 33 34  ");.  }.} {01234
69c0: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
69d0: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
69e0: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
69f0: 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38  3456789012345678
6a00: 39 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 74 63  9}..ifcapable tc
6a10: 6c 76 61 72 20 7b 0a 20 20 64 6f 5f 74 65 73 74  lvar {.  do_test
6a20: 20 66 75 6e 63 2d 32 31 2e 39 20 7b 0a 20 20 20   func-21.9 {.   
6a30: 20 23 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78   # Attempt to ex
6a40: 70 6c 6f 69 74 20 61 20 62 75 66 66 65 72 2d 6f  ploit a buffer-o
6a50: 76 65 72 66 6c 6f 77 20 74 68 61 74 20 61 74 20  verflow that at 
6a60: 6f 6e 65 20 74 69 6d 65 20 65 78 69 73 74 65 64  one time existed
6a70: 20 0a 20 20 20 20 23 20 69 6e 20 74 68 65 20 52   .    # in the R
6a80: 45 50 4c 41 43 45 20 66 75 6e 63 74 69 6f 6e 2e  EPLACE function.
6a90: 20 0a 20 20 20 20 73 65 74 20 3a 3a 73 74 72 20   .    set ::str 
6aa0: 22 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20  "[string repeat 
6ab0: 41 20 32 39 39 39 38 5d 43 43 5b 73 74 72 69 6e  A 29998]CC[strin
6ac0: 67 20 72 65 70 65 61 74 20 41 20 33 35 35 33 37  g repeat A 35537
6ad0: 5d 22 0a 20 20 20 20 73 65 74 20 3a 3a 72 65 70  ]".    set ::rep
6ae0: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
6af0: 42 20 36 35 35 33 36 5d 0a 20 20 20 20 65 78 65  B 65536].    exe
6b00: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
6b10: 45 43 54 20 4c 45 4e 47 54 48 28 52 45 50 4c 41  ECT LENGTH(REPLA
6b20: 43 45 28 24 3a 3a 73 74 72 2c 20 27 43 27 2c 20  CE($::str, 'C', 
6b30: 24 3a 3a 72 65 70 29 29 3b 0a 20 20 20 20 7d 0a  $::rep));.    }.
6b40: 20 20 7d 20 5b 65 78 70 72 20 32 39 39 39 38 20    } [expr 29998 
6b50: 2b 20 32 2a 36 35 35 33 36 20 2b 20 33 35 35 33  + 2*65536 + 3553
6b60: 37 5d 0a 7d 0a 0a 23 20 54 65 73 74 73 20 66 6f  7].}..# Tests fo
6b70: 72 20 74 68 65 20 54 52 49 4d 2c 20 4c 54 52 49  r the TRIM, LTRI
6b80: 4d 20 61 6e 64 20 52 54 52 49 4d 20 66 75 6e 63  M and RTRIM func
6b90: 74 69 6f 6e 73 2e 0a 23 0a 64 6f 5f 74 65 73 74  tions..#.do_test
6ba0: 20 66 75 6e 63 2d 32 32 2e 31 20 7b 0a 20 20 63   func-22.1 {.  c
6bb0: 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20  atchsql {SELECT 
6bc0: 74 72 69 6d 28 31 2c 32 2c 33 29 7d 0a 7d 20 7b  trim(1,2,3)}.} {
6bd0: 31 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  1 {wrong number 
6be0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
6bf0: 66 75 6e 63 74 69 6f 6e 20 74 72 69 6d 28 29 7d  function trim()}
6c00: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  }.do_test func-2
6c10: 32 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  2.2 {.  catchsql
6c20: 20 7b 53 45 4c 45 43 54 20 6c 74 72 69 6d 28 31   {SELECT ltrim(1
6c30: 2c 32 2c 33 29 7d 0a 7d 20 7b 31 20 7b 77 72 6f  ,2,3)}.} {1 {wro
6c40: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
6c50: 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69  uments to functi
6c60: 6f 6e 20 6c 74 72 69 6d 28 29 7d 7d 0a 64 6f 5f  on ltrim()}}.do_
6c70: 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 33 20 7b  test func-22.3 {
6c80: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c  .  catchsql {SEL
6c90: 45 43 54 20 72 74 72 69 6d 28 31 2c 32 2c 33 29  ECT rtrim(1,2,3)
6ca0: 7d 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 6e 75  }.} {1 {wrong nu
6cb0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
6cc0: 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 72 74  s to function rt
6cd0: 72 69 6d 28 29 7d 7d 0a 64 6f 5f 74 65 73 74 20  rim()}}.do_test 
6ce0: 66 75 6e 63 2d 32 32 2e 34 20 7b 0a 20 20 65 78  func-22.4 {.  ex
6cf0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 74 72  ecsql {SELECT tr
6d00: 69 6d 28 27 20 20 68 69 20 20 27 29 3b 7d 0a 7d  im('  hi  ');}.}
6d10: 20 7b 68 69 7d 0a 64 6f 5f 74 65 73 74 20 66 75   {hi}.do_test fu
6d20: 6e 63 2d 32 32 2e 35 20 7b 0a 20 20 65 78 65 63  nc-22.5 {.  exec
6d30: 73 71 6c 20 7b 53 45 4c 45 43 54 20 6c 74 72 69  sql {SELECT ltri
6d40: 6d 28 27 20 20 68 69 20 20 27 29 3b 7d 0a 7d 20  m('  hi  ');}.} 
6d50: 7b 7b 68 69 20 20 7d 7d 0a 64 6f 5f 74 65 73 74  {{hi  }}.do_test
6d60: 20 66 75 6e 63 2d 32 32 2e 36 20 7b 0a 20 20 65   func-22.6 {.  e
6d70: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 72  xecsql {SELECT r
6d80: 74 72 69 6d 28 27 20 20 68 69 20 20 27 29 3b 7d  trim('  hi  ');}
6d90: 0a 7d 20 7b 7b 20 20 68 69 7d 7d 0a 64 6f 5f 74  .} {{  hi}}.do_t
6da0: 65 73 74 20 66 75 6e 63 2d 32 32 2e 37 20 7b 0a  est func-22.7 {.
6db0: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
6dc0: 54 20 74 72 69 6d 28 27 20 20 68 69 20 20 27 2c  T trim('  hi  ',
6dd0: 27 78 79 7a 27 29 3b 7d 0a 7d 20 7b 7b 20 20 68  'xyz');}.} {{  h
6de0: 69 20 20 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75  i  }}.do_test fu
6df0: 6e 63 2d 32 32 2e 38 20 7b 0a 20 20 65 78 65 63  nc-22.8 {.  exec
6e00: 73 71 6c 20 7b 53 45 4c 45 43 54 20 6c 74 72 69  sql {SELECT ltri
6e10: 6d 28 27 20 20 68 69 20 20 27 2c 27 78 79 7a 27  m('  hi  ','xyz'
6e20: 29 3b 7d 0a 7d 20 7b 7b 20 20 68 69 20 20 7d 7d  );}.} {{  hi  }}
6e30: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32  .do_test func-22
6e40: 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .9 {.  execsql {
6e50: 53 45 4c 45 43 54 20 72 74 72 69 6d 28 27 20 20  SELECT rtrim('  
6e60: 68 69 20 20 27 2c 27 78 79 7a 27 29 3b 7d 0a 7d  hi  ','xyz');}.}
6e70: 20 7b 7b 20 20 68 69 20 20 7d 7d 0a 64 6f 5f 74   {{  hi  }}.do_t
6e80: 65 73 74 20 66 75 6e 63 2d 32 32 2e 31 30 20 7b  est func-22.10 {
6e90: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
6ea0: 43 54 20 74 72 69 6d 28 27 78 79 78 7a 79 20 20  CT trim('xyxzy  
6eb0: 68 69 20 20 7a 7a 7a 79 27 2c 27 78 79 7a 27 29  hi  zzzy','xyz')
6ec0: 3b 7d 0a 7d 20 7b 7b 20 20 68 69 20 20 7d 7d 0a  ;}.} {{  hi  }}.
6ed0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32 2e  do_test func-22.
6ee0: 31 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  11 {.  execsql {
6ef0: 53 45 4c 45 43 54 20 6c 74 72 69 6d 28 27 78 79  SELECT ltrim('xy
6f00: 78 7a 79 20 20 68 69 20 20 7a 7a 7a 79 27 2c 27  xzy  hi  zzzy','
6f10: 78 79 7a 27 29 3b 7d 0a 7d 20 7b 7b 20 20 68 69  xyz');}.} {{  hi
6f20: 20 20 7a 7a 7a 79 7d 7d 0a 64 6f 5f 74 65 73 74    zzzy}}.do_test
6f30: 20 66 75 6e 63 2d 32 32 2e 31 32 20 7b 0a 20 20   func-22.12 {.  
6f40: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
6f50: 72 74 72 69 6d 28 27 78 79 78 7a 79 20 20 68 69  rtrim('xyxzy  hi
6f60: 20 20 7a 7a 7a 79 27 2c 27 78 79 7a 27 29 3b 7d    zzzy','xyz');}
6f70: 0a 7d 20 7b 7b 78 79 78 7a 79 20 20 68 69 20 20  .} {{xyxzy  hi  
6f80: 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  }}.do_test func-
6f90: 32 32 2e 31 33 20 7b 0a 20 20 65 78 65 63 73 71  22.13 {.  execsq
6fa0: 6c 20 7b 53 45 4c 45 43 54 20 74 72 69 6d 28 27  l {SELECT trim('
6fb0: 20 20 68 69 20 20 27 2c 27 27 29 3b 7d 0a 7d 20    hi  ','');}.} 
6fc0: 7b 7b 20 20 68 69 20 20 7d 7d 0a 69 66 20 7b 5b  {{  hi  }}.if {[
6fd0: 64 62 20 6f 6e 65 20 7b 50 52 41 47 4d 41 20 65  db one {PRAGMA e
6fe0: 6e 63 6f 64 69 6e 67 7d 5d 3d 3d 22 55 54 46 2d  ncoding}]=="UTF-
6ff0: 38 22 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  8"} {.  do_test 
7000: 66 75 6e 63 2d 32 32 2e 31 34 20 7b 0a 20 20 20  func-22.14 {.   
7010: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
7020: 20 68 65 78 28 74 72 69 6d 28 78 27 63 32 38 30   hex(trim(x'c280
7030: 65 31 62 66 62 66 66 34 38 66 62 66 62 66 36 38  e1bfbff48fbfbf68
7040: 36 39 27 2c 78 27 36 31 36 32 65 31 62 66 62 66  69',x'6162e1bfbf
7050: 63 32 38 30 27 29 29 7d 0a 20 20 7d 20 7b 46 34  c280'))}.  } {F4
7060: 38 46 42 46 42 46 36 38 36 39 7d 0a 20 20 64 6f  8FBFBF6869}.  do
7070: 5f 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 31 35  _test func-22.15
7080: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
7090: 53 45 4c 45 43 54 20 68 65 78 28 74 72 69 6d 28  SELECT hex(trim(
70a0: 78 27 36 38 36 39 63 32 38 30 65 31 62 66 62 66  x'6869c280e1bfbf
70b0: 66 34 38 66 62 66 62 66 36 31 27 2c 0a 20 20 20  f48fbfbf61',.   
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 20 20 20 20 20 20 20 20 20 78 27 36 31 36 32            x'6162
70e0: 65 31 62 66 62 66 63 32 38 30 66 34 38 66 62 66  e1bfbfc280f48fbf
70f0: 62 66 27 29 29 7d 0a 20 20 7d 20 7b 36 38 36 39  bf'))}.  } {6869
7100: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63  }.  do_test func
7110: 2d 32 32 2e 31 36 20 7b 0a 20 20 20 20 65 78 65  -22.16 {.    exe
7120: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 68 65 78  csql {SELECT hex
7130: 28 74 72 69 6d 28 78 27 63 65 62 31 63 65 62 32  (trim(x'ceb1ceb2
7140: 63 65 62 33 27 2c 78 27 63 65 62 31 27 29 29 3b  ceb3',x'ceb1'));
7150: 7d 0a 20 20 7d 20 7b 43 45 42 32 43 45 42 33 7d  }.  } {CEB2CEB3}
7160: 0a 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .}.do_test func-
7170: 32 32 2e 32 30 20 7b 0a 20 20 65 78 65 63 73 71  22.20 {.  execsq
7180: 6c 20 7b 53 45 4c 45 43 54 20 74 79 70 65 6f 66  l {SELECT typeof
7190: 28 74 72 69 6d 28 4e 55 4c 4c 29 29 3b 7d 0a 7d  (trim(NULL));}.}
71a0: 20 7b 6e 75 6c 6c 7d 0a 64 6f 5f 74 65 73 74 20   {null}.do_test 
71b0: 66 75 6e 63 2d 32 32 2e 32 31 20 7b 0a 20 20 65  func-22.21 {.  e
71c0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 74  xecsql {SELECT t
71d0: 79 70 65 6f 66 28 74 72 69 6d 28 4e 55 4c 4c 2c  ypeof(trim(NULL,
71e0: 27 78 79 7a 27 29 29 3b 7d 0a 7d 20 7b 6e 75 6c  'xyz'));}.} {nul
71f0: 6c 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  l}.do_test func-
7200: 32 32 2e 32 32 20 7b 0a 20 20 65 78 65 63 73 71  22.22 {.  execsq
7210: 6c 20 7b 53 45 4c 45 43 54 20 74 79 70 65 6f 66  l {SELECT typeof
7220: 28 74 72 69 6d 28 27 68 65 6c 6c 6f 27 2c 4e 55  (trim('hello',NU
7230: 4c 4c 29 29 3b 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a  LL));}.} {null}.
7240: 0a 23 20 54 68 69 73 20 69 73 20 74 6f 20 74 65  .# This is to te
7250: 73 74 20 74 68 65 20 64 65 70 72 65 63 61 74 65  st the deprecate
7260: 64 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  d sqlite3_aggreg
7270: 61 74 65 5f 63 6f 75 6e 74 28 29 20 41 50 49 2e  ate_count() API.
7280: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 64 65 70  .#.ifcapable dep
7290: 72 65 63 61 74 65 64 20 7b 0a 20 20 64 6f 5f 74  recated {.  do_t
72a0: 65 73 74 20 66 75 6e 63 2d 32 33 2e 31 20 7b 0a  est func-23.1 {.
72b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
72c0: 74 65 5f 61 67 67 72 65 67 61 74 65 20 64 62 0a  te_aggregate db.
72d0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
72e0: 20 20 20 20 53 45 4c 45 43 54 20 6c 65 67 61 63      SELECT legac
72f0: 79 5f 63 6f 75 6e 74 28 29 20 46 52 4f 4d 20 74  y_count() FROM t
7300: 36 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 33 7d  6;.    }.  } {3}
7310: 0a 7d 0a 0a 23 20 54 68 65 20 67 72 6f 75 70 5f  .}..# The group_
7320: 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f  concat() functio
7330: 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e  n..#.do_test fun
7340: 63 2d 32 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  c-24.1 {.  execs
7350: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
7360: 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 74 31 29  group_concat(t1)
7370: 20 46 52 4f 4d 20 74 62 6c 31 0a 20 20 7d 0a 7d   FROM tbl1.  }.}
7380: 20 7b 74 68 69 73 2c 70 72 6f 67 72 61 6d 2c 69   {this,program,i
7390: 73 2c 66 72 65 65 2c 73 6f 66 74 77 61 72 65 7d  s,free,software}
73a0: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 34  .do_test func-24
73b0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
73c0: 0a 20 20 20 20 53 45 4c 45 43 54 20 67 72 6f 75  .    SELECT grou
73d0: 70 5f 63 6f 6e 63 61 74 28 74 31 2c 27 20 27 29  p_concat(t1,' ')
73e0: 20 46 52 4f 4d 20 74 62 6c 31 0a 20 20 7d 0a 7d   FROM tbl1.  }.}
73f0: 20 7b 7b 74 68 69 73 20 70 72 6f 67 72 61 6d 20   {{this program 
7400: 69 73 20 66 72 65 65 20 73 6f 66 74 77 61 72 65  is free software
7410: 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  }}.do_test func-
7420: 32 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  24.3 {.  execsql
7430: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 67 72   {.    SELECT gr
7440: 6f 75 70 5f 63 6f 6e 63 61 74 28 74 31 2c 27 20  oup_concat(t1,' 
7450: 27 20 7c 7c 20 72 6f 77 69 64 20 7c 7c 20 27 20  ' || rowid || ' 
7460: 27 29 20 46 52 4f 4d 20 74 62 6c 31 0a 20 20 7d  ') FROM tbl1.  }
7470: 0a 7d 20 7b 7b 74 68 69 73 20 32 20 70 72 6f 67  .} {{this 2 prog
7480: 72 61 6d 20 33 20 69 73 20 34 20 66 72 65 65 20  ram 3 is 4 free 
7490: 35 20 73 6f 66 74 77 61 72 65 7d 7d 0a 64 6f 5f  5 software}}.do_
74a0: 74 65 73 74 20 66 75 6e 63 2d 32 34 2e 34 20 7b  test func-24.4 {
74b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
74c0: 20 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f   SELECT group_co
74d0: 6e 63 61 74 28 4e 55 4c 4c 2c 74 31 29 20 46 52  ncat(NULL,t1) FR
74e0: 4f 4d 20 74 62 6c 31 0a 20 20 7d 0a 7d 20 7b 7b  OM tbl1.  }.} {{
74f0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  }}.do_test func-
7500: 32 34 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  24.5 {.  execsql
7510: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 67 72   {.    SELECT gr
7520: 6f 75 70 5f 63 6f 6e 63 61 74 28 74 31 2c 4e 55  oup_concat(t1,NU
7530: 4c 4c 29 20 46 52 4f 4d 20 74 62 6c 31 0a 20 20  LL) FROM tbl1.  
7540: 7d 0a 7d 20 7b 74 68 69 73 70 72 6f 67 72 61 6d  }.} {thisprogram
7550: 69 73 66 72 65 65 73 6f 66 74 77 61 72 65 7d 0a  isfreesoftware}.
7560: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 34 2e  do_test func-24.
7570: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  6 {.  execsql {.
7580: 20 20 20 20 53 45 4c 45 43 54 20 27 42 45 47 49      SELECT 'BEGI
7590: 4e 2d 27 7c 7c 67 72 6f 75 70 5f 63 6f 6e 63 61  N-'||group_conca
75a0: 74 28 74 31 29 20 46 52 4f 4d 20 74 62 6c 31 0a  t(t1) FROM tbl1.
75b0: 20 20 7d 0a 7d 20 7b 42 45 47 49 4e 2d 74 68 69    }.} {BEGIN-thi
75c0: 73 2c 70 72 6f 67 72 61 6d 2c 69 73 2c 66 72 65  s,program,is,fre
75d0: 65 2c 73 6f 66 74 77 61 72 65 7d 0a 0a 23 20 54  e,software}..# T
75e0: 69 63 6b 65 74 20 23 33 31 37 39 3a 20 20 4d 61  icket #3179:  Ma
75f0: 6b 65 20 73 75 72 65 20 61 67 67 72 65 67 61 74  ke sure aggregat
7600: 65 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20  e functions can 
7610: 74 61 6b 65 20 6d 61 6e 79 20 61 72 67 75 6d 65  take many argume
7620: 6e 74 73 2e 0a 23 20 4e 6f 6e 65 20 6f 66 20 74  nts..# None of t
7630: 68 65 20 62 75 69 6c 74 2d 69 6e 20 61 67 67 72  he built-in aggr
7640: 65 67 61 74 65 73 20 64 6f 20 74 68 69 73 2c 20  egates do this, 
7650: 73 6f 20 75 73 65 20 74 68 65 20 6d 64 35 73 75  so use the md5su
7660: 6d 28 29 20 66 72 6f 6d 20 74 68 65 0a 23 20 74  m() from the.# t
7670: 65 73 74 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a  est extensions..
7680: 23 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c  #.unset -nocompl
7690: 61 69 6e 20 6d 69 64 61 72 67 73 0a 73 65 74 20  ain midargs.set 
76a0: 6d 69 64 61 72 67 73 20 7b 7d 0a 75 6e 73 65 74  midargs {}.unset
76b0: 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 6d 69 64   -nocomplain mid
76c0: 72 65 73 0a 73 65 74 20 6d 69 64 72 65 73 20 7b  res.set midres {
76d0: 7d 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c  }.unset -nocompl
76e0: 61 69 6e 20 72 65 73 75 6c 74 0a 66 6f 72 20 7b  ain result.for {
76f0: 73 65 74 20 69 20 31 7d 20 7b 24 69 3c 5b 73 71  set i 1} {$i<[sq
7700: 6c 69 74 65 33 5f 6c 69 6d 69 74 20 64 62 20 53  lite3_limit db S
7710: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
7720: 54 49 4f 4e 5f 41 52 47 20 2d 31 5d 7d 20 7b 69  TION_ARG -1]} {i
7730: 6e 63 72 20 69 7d 20 7b 0a 20 20 61 70 70 65 6e  ncr i} {.  appen
7740: 64 20 6d 69 64 61 72 67 73 20 2c 27 2f 24 69 27  d midargs ,'/$i'
7750: 0a 20 20 61 70 70 65 6e 64 20 6d 69 64 72 65 73  .  append midres
7760: 20 2f 24 69 0a 20 20 73 65 74 20 72 65 73 75 6c   /$i.  set resul
7770: 74 20 5b 6d 64 35 20 5c 0a 20 20 20 20 20 22 74  t [md5 \.     "t
7780: 68 69 73 24 7b 6d 69 64 72 65 73 7d 70 72 6f 67  his${midres}prog
7790: 72 61 6d 24 7b 6d 69 64 72 65 73 7d 69 73 24 7b  ram${midres}is${
77a0: 6d 69 64 72 65 73 7d 66 72 65 65 24 7b 6d 69 64  midres}free${mid
77b0: 72 65 73 7d 73 6f 66 74 77 61 72 65 24 7b 6d 69  res}software${mi
77c0: 64 72 65 73 7d 22 5d 0a 20 20 73 65 74 20 73 71  dres}"].  set sq
77d0: 6c 20 22 53 45 4c 45 43 54 20 6d 64 35 73 75 6d  l "SELECT md5sum
77e0: 28 74 31 24 6d 69 64 61 72 67 73 29 20 46 52 4f  (t1$midargs) FRO
77f0: 4d 20 74 62 6c 31 22 0a 20 20 64 6f 5f 74 65 73  M tbl1".  do_tes
7800: 74 20 66 75 6e 63 2d 32 34 2e 37 2e 24 69 20 7b  t func-24.7.$i {
7810: 0a 20 20 20 20 20 64 62 20 65 76 61 6c 20 24 3a  .     db eval $:
7820: 3a 73 71 6c 0a 20 20 7d 20 24 72 65 73 75 6c 74  :sql.  } $result
7830: 0a 7d 0a 0a 23 20 54 69 63 6b 65 74 20 23 33 38  .}..# Ticket #38
7840: 30 36 2e 20 20 49 66 20 74 68 65 20 69 6e 69 74  06.  If the init
7850: 69 61 6c 20 73 74 72 69 6e 67 20 69 6e 20 61 20  ial string in a 
7860: 67 72 6f 75 70 5f 63 6f 6e 63 61 74 20 69 73 20  group_concat is 
7870: 61 6e 20 65 6d 70 74 79 0a 23 20 73 74 72 69 6e  an empty.# strin
7880: 67 2c 20 74 68 65 20 73 65 70 61 72 61 74 6f 72  g, the separator
7890: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 73 68   that follows sh
78a0: 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 70 72  ould still be pr
78b0: 65 73 65 6e 74 2e 0a 23 0a 64 6f 5f 74 65 73 74  esent..#.do_test
78c0: 20 66 75 6e 63 2d 32 34 2e 38 20 7b 0a 20 20 65   func-24.8 {.  e
78d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
78e0: 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  ECT group_concat
78f0: 28 43 41 53 45 20 74 31 20 57 48 45 4e 20 27 74  (CASE t1 WHEN 't
7900: 68 69 73 27 20 54 48 45 4e 20 27 27 20 45 4c 53  his' THEN '' ELS
7910: 45 20 74 31 20 45 4e 44 29 20 46 52 4f 4d 20 74  E t1 END) FROM t
7920: 62 6c 31 0a 20 20 7d 0a 7d 20 7b 2c 70 72 6f 67  bl1.  }.} {,prog
7930: 72 61 6d 2c 69 73 2c 66 72 65 65 2c 73 6f 66 74  ram,is,free,soft
7940: 77 61 72 65 7d 0a 64 6f 5f 74 65 73 74 20 66 75  ware}.do_test fu
7950: 6e 63 2d 32 34 2e 39 20 7b 0a 20 20 65 78 65 63  nc-24.9 {.  exec
7960: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
7970: 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 43 41   group_concat(CA
7980: 53 45 20 57 48 45 4e 20 74 31 21 3d 27 73 6f 66  SE WHEN t1!='sof
7990: 74 77 61 72 65 27 20 54 48 45 4e 20 27 27 20 45  tware' THEN '' E
79a0: 4c 53 45 20 74 31 20 45 4e 44 29 20 46 52 4f 4d  LSE t1 END) FROM
79b0: 20 74 62 6c 31 0a 20 20 7d 0a 7d 20 7b 2c 2c 2c   tbl1.  }.} {,,,
79c0: 2c 73 6f 66 74 77 61 72 65 7d 0a 0a 23 20 54 69  ,software}..# Ti
79d0: 63 6b 65 74 20 23 33 39 32 33 2e 20 20 49 6e 69  cket #3923.  Ini
79e0: 74 69 61 6c 20 65 6d 70 74 79 20 73 74 72 69 6e  tial empty strin
79f0: 67 73 20 68 61 76 65 20 61 20 73 65 70 61 72 61  gs have a separa
7a00: 74 6f 72 2e 20 20 42 75 74 20 69 6e 69 74 69 61  tor.  But initia
7a10: 6c 0a 23 20 4e 55 4c 4c 73 20 64 6f 20 6e 6f 74  l.# NULLs do not
7a20: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  ..#.do_test func
7a30: 2d 32 34 2e 31 30 20 7b 0a 20 20 65 78 65 63 73  -24.10 {.  execs
7a40: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
7a50: 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 43 41 53  group_concat(CAS
7a60: 45 20 74 31 20 57 48 45 4e 20 27 74 68 69 73 27  E t1 WHEN 'this'
7a70: 20 54 48 45 4e 20 6e 75 6c 6c 20 45 4c 53 45 20   THEN null ELSE 
7a80: 74 31 20 45 4e 44 29 20 46 52 4f 4d 20 74 62 6c  t1 END) FROM tbl
7a90: 31 0a 20 20 7d 0a 7d 20 7b 70 72 6f 67 72 61 6d  1.  }.} {program
7aa0: 2c 69 73 2c 66 72 65 65 2c 73 6f 66 74 77 61 72  ,is,free,softwar
7ab0: 65 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  e}.do_test func-
7ac0: 32 34 2e 31 31 20 7b 0a 20 20 65 78 65 63 73 71  24.11 {.  execsq
7ad0: 6c 20 7b 0a 20 20 20 53 45 4c 45 43 54 20 67 72  l {.   SELECT gr
7ae0: 6f 75 70 5f 63 6f 6e 63 61 74 28 43 41 53 45 20  oup_concat(CASE 
7af0: 57 48 45 4e 20 74 31 21 3d 27 73 6f 66 74 77 61  WHEN t1!='softwa
7b00: 72 65 27 20 54 48 45 4e 20 6e 75 6c 6c 20 45 4c  re' THEN null EL
7b10: 53 45 20 74 31 20 45 4e 44 29 20 46 52 4f 4d 20  SE t1 END) FROM 
7b20: 74 62 6c 31 0a 20 20 7d 0a 7d 20 7b 73 6f 66 74  tbl1.  }.} {soft
7b30: 77 61 72 65 7d 0a 64 6f 5f 74 65 73 74 20 66 75  ware}.do_test fu
7b40: 6e 63 2d 32 34 2e 31 32 20 7b 0a 20 20 65 78 65  nc-24.12 {.  exe
7b50: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
7b60: 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 43  T group_concat(C
7b70: 41 53 45 20 74 31 20 57 48 45 4e 20 27 74 68 69  ASE t1 WHEN 'thi
7b80: 73 27 20 54 48 45 4e 20 27 27 0a 20 20 20 20 20  s' THEN ''.     
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ba0: 20 20 20 20 20 57 48 45 4e 20 27 70 72 6f 67 72       WHEN 'progr
7bb0: 61 6d 27 20 54 48 45 4e 20 6e 75 6c 6c 20 45 4c  am' THEN null EL
7bc0: 53 45 20 74 31 20 45 4e 44 29 20 46 52 4f 4d 20  SE t1 END) FROM 
7bd0: 74 62 6c 31 0a 20 20 7d 0a 7d 20 7b 2c 69 73 2c  tbl1.  }.} {,is,
7be0: 66 72 65 65 2c 73 6f 66 74 77 61 72 65 7d 0a 23  free,software}.#
7bf0: 20 54 65 73 74 73 20 74 6f 20 76 65 72 69 66 79   Tests to verify
7c00: 20 74 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77   ticket http://w
7c10: 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
7c20: 63 2f 74 6b 74 76 69 65 77 2f 35 35 37 34 36 66  c/tktview/55746f
7c30: 39 65 36 35 66 38 35 38 37 63 30 0a 64 6f 5f 74  9e65f8587c0.do_t
7c40: 65 73 74 20 66 75 6e 63 2d 32 34 2e 31 33 20 7b  est func-24.13 {
7c50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
7c60: 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 67   SELECT typeof(g
7c70: 72 6f 75 70 5f 63 6f 6e 63 61 74 28 78 29 29 20  roup_concat(x)) 
7c80: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 27 27 20  FROM (SELECT '' 
7c90: 41 53 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b 74 65  AS x);.  }.} {te
7ca0: 78 74 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  xt}.do_test func
7cb0: 2d 32 34 2e 31 34 20 7b 0a 20 20 65 78 65 63 73  -24.14 {.  execs
7cc0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
7cd0: 74 79 70 65 6f 66 28 67 72 6f 75 70 5f 63 6f 6e  typeof(group_con
7ce0: 63 61 74 28 78 2c 27 27 29 29 0a 20 20 20 20 20  cat(x,'')).     
7cf0: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 27 27   FROM (SELECT ''
7d00: 20 41 53 20 78 20 55 4e 49 4f 4e 20 41 4c 4c 20   AS x UNION ALL 
7d10: 53 45 4c 45 43 54 20 27 27 29 3b 0a 20 20 7d 0a  SELECT '');.  }.
7d20: 7d 20 7b 74 65 78 74 7d 0a 0a 0a 23 20 55 73 65  } {text}...# Use
7d30: 20 74 68 65 20 74 65 73 74 5f 69 73 6f 6c 61 74   the test_isolat
7d40: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  ion function to 
7d50: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
7d60: 79 70 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a  ype conversions.
7d70: 23 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72  # on function ar
7d80: 67 75 6d 65 6e 74 73 20 64 6f 20 6e 6f 74 20 65  guments do not e
7d90: 66 66 65 63 74 20 73 75 62 73 65 71 75 65 6e 74  ffect subsequent
7da0: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 23 0a 64 6f   arguments..#.do
7db0: 5f 74 65 73 74 20 66 75 6e 63 2d 32 35 2e 31 20  _test func-25.1 
7dc0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
7dd0: 45 43 54 20 74 65 73 74 5f 69 73 6f 6c 61 74 69  ECT test_isolati
7de0: 6f 6e 28 74 31 2c 74 31 29 20 46 52 4f 4d 20 74  on(t1,t1) FROM t
7df0: 62 6c 31 7d 0a 7d 20 7b 74 68 69 73 20 70 72 6f  bl1}.} {this pro
7e00: 67 72 61 6d 20 69 73 20 66 72 65 65 20 73 6f 66  gram is free sof
7e10: 74 77 61 72 65 7d 0a 0a 23 20 54 72 79 20 74 6f  tware}..# Try to
7e20: 20 6d 69 73 75 73 65 20 74 68 65 20 73 71 6c 69   misuse the sqli
7e30: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
7e40: 69 6f 6e 28 29 20 69 6e 74 65 72 66 61 63 65 2e  ion() interface.
7e50: 20 20 56 65 72 69 66 79 20 74 68 61 74 0a 23 20    Verify that.# 
7e60: 65 72 72 6f 72 73 20 61 72 65 20 72 65 74 75 72  errors are retur
7e70: 6e 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66  ned..#.do_test f
7e80: 75 6e 63 2d 32 36 2e 31 20 7b 0a 20 20 61 62 75  unc-26.1 {.  abu
7e90: 73 65 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  se_create_functi
7ea0: 6f 6e 20 64 62 0a 7d 20 7b 7d 0a 0a 23 20 54 68  on db.} {}..# Th
7eb0: 65 20 70 72 65 76 69 6f 75 73 20 74 65 73 74 20  e previous test 
7ec0: 28 66 75 6e 63 2d 32 36 2e 31 29 20 72 65 67 69  (func-26.1) regi
7ed0: 73 74 65 72 65 64 20 61 20 66 75 6e 63 74 69 6f  stered a functio
7ee0: 6e 20 77 69 74 68 20 61 20 76 65 72 79 20 6c 6f  n with a very lo
7ef0: 6e 67 0a 23 20 66 75 6e 63 74 69 6f 6e 20 6e 61  ng.# function na
7f00: 6d 65 20 74 68 61 74 20 74 61 6b 65 73 20 6d 61  me that takes ma
7f10: 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64  ny arguments and
7f20: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
7f30: 4e 55 4c 4c 2e 20 20 56 65 72 69 66 79 0a 23 20  NULL.  Verify.# 
7f40: 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
7f50: 6f 6e 20 77 6f 72 6b 73 20 63 6f 72 72 65 63 74  on works correct
7f60: 6c 79 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75  ly..#.do_test fu
7f70: 6e 63 2d 32 36 2e 32 20 7b 0a 20 20 73 65 74 20  nc-26.2 {.  set 
7f80: 61 20 7b 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20  a {}.  for {set 
7f90: 69 20 31 7d 20 7b 24 69 3c 3d 24 3a 3a 53 51 4c  i 1} {$i<=$::SQL
7fa0: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
7fb0: 5f 41 52 47 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  _ARG} {incr i} {
7fc0: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 61 20 24  .    lappend a $
7fd0: 69 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20  i.  }.  db eval 
7fe0: 22 0a 20 20 20 20 20 53 45 4c 45 43 54 20 6e 75  ".     SELECT nu
7ff0: 6c 6c 78 5f 31 32 33 34 35 36 37 38 39 5f 31 32  llx_123456789_12
8000: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8010: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8020: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8030: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8040: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_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 28 5b 6a  789_123456789([j
80f0: 6f 69 6e 20 24 61 20 2c 5d 29 3b 0a 20 20 22 0a  oin $a ,]);.  ".
8100: 7d 20 7b 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  } {{}}.do_test f
8110: 75 6e 63 2d 32 36 2e 33 20 7b 0a 20 20 73 65 74  unc-26.3 {.  set
8120: 20 61 20 7b 7d 0a 20 20 66 6f 72 20 7b 73 65 74   a {}.  for {set
8130: 20 69 20 31 7d 20 7b 24 69 3c 3d 24 3a 3a 53 51   i 1} {$i<=$::SQ
8140: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
8150: 4e 5f 41 52 47 2b 31 7d 20 7b 69 6e 63 72 20 69  N_ARG+1} {incr i
8160: 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  } {.    lappend 
8170: 61 20 24 69 0a 20 20 7d 0a 20 20 63 61 74 63 68  a $i.  }.  catch
8180: 73 71 6c 20 22 0a 20 20 20 20 20 53 45 4c 45 43  sql ".     SELEC
8190: 54 20 6e 75 6c 6c 78 5f 31 32 33 34 35 36 37 38  T nullx_12345678
81a0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
81b0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
81c0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
81d0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
81e0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
81f0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8200: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8210: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8220: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8230: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8240: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8250: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8260: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8270: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8280: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8290: 39 28 5b 6a 6f 69 6e 20 24 61 20 2c 5d 29 3b 0a  9([join $a ,]);.
82a0: 20 20 22 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61    ".} {1 {too ma
82b0: 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20  ny arguments on 
82c0: 66 75 6e 63 74 69 6f 6e 20 6e 75 6c 6c 78 5f 31  function nullx_1
82d0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
82e0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
82f0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8300: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8310: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8320: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8330: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8340: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8350: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8360: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8370: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8380: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8390: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
83a0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
83b0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
83c0: 32 33 34 35 36 37 38 39 7d 7d 0a 64 6f 5f 74 65  23456789}}.do_te
83d0: 73 74 20 66 75 6e 63 2d 32 36 2e 34 20 7b 0a 20  st func-26.4 {. 
83e0: 20 73 65 74 20 61 20 7b 7d 0a 20 20 66 6f 72 20   set a {}.  for 
83f0: 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 3c 3d 24  {set i 1} {$i<=$
8400: 3a 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  ::SQLITE_MAX_FUN
8410: 43 54 49 4f 4e 5f 41 52 47 2d 31 7d 20 7b 69 6e  CTION_ARG-1} {in
8420: 63 72 20 69 7d 20 7b 0a 20 20 20 20 6c 61 70 70  cr i} {.    lapp
8430: 65 6e 64 20 61 20 24 69 0a 20 20 7d 0a 20 20 63  end a $i.  }.  c
8440: 61 74 63 68 73 71 6c 20 22 0a 20 20 20 20 20 53  atchsql ".     S
8450: 45 4c 45 43 54 20 6e 75 6c 6c 78 5f 31 32 33 34  ELECT nullx_1234
8460: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8470: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8480: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8490: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
84a0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
84b0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
84c0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
84d0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
84e0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
84f0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8500: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8510: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8520: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8530: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8540: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8550: 35 36 37 38 39 28 5b 6a 6f 69 6e 20 24 61 20 2c  56789([join $a ,
8560: 5d 29 3b 0a 20 20 22 0a 7d 20 7b 31 20 7b 77 72  ]);.  ".} {1 {wr
8570: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
8580: 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
8590: 69 6f 6e 20 6e 75 6c 6c 78 5f 31 32 33 34 35 36  ion nullx_123456
85a0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
85b0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
85c0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
85d0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
85e0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
85f0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8600: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8610: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8620: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8630: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8640: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8650: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8660: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8670: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8680: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8690: 37 38 39 28 29 7d 7d 0a 64 6f 5f 74 65 73 74 20  789()}}.do_test 
86a0: 66 75 6e 63 2d 32 36 2e 35 20 7b 0a 20 20 63 61  func-26.5 {.  ca
86b0: 74 63 68 73 71 6c 20 22 0a 20 20 20 20 20 53 45  tchsql ".     SE
86c0: 4c 45 43 54 20 6e 75 6c 6c 78 5f 31 32 33 34 35  LECT nullx_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 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
87a0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
87b0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
87c0: 36 37 38 61 28 30 29 3b 0a 20 20 22 0a 7d 20 7b  678a(0);.  ".} {
87d0: 31 20 7b 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  1 {no such funct
87e0: 69 6f 6e 3a 20 6e 75 6c 6c 78 5f 31 32 33 34 35  ion: nullx_12345
87f0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8800: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8810: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8820: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8830: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8840: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8850: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8860: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8870: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8880: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8890: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
88a0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
88b0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
88c0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
88d0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
88e0: 36 37 38 61 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  678a}}.do_test f
88f0: 75 6e 63 2d 32 36 2e 36 20 7b 0a 20 20 63 61 74  unc-26.6 {.  cat
8900: 63 68 73 71 6c 20 22 0a 20 20 20 20 20 53 45 4c  chsql ".     SEL
8910: 45 43 54 20 6e 75 6c 6c 78 5f 31 32 33 34 35 36  ECT nullx_123456
8920: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8930: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8940: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
8950: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8960: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8970: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
8980: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
8990: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
89a0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
89b0: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
89c0: 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32  789_123456789_12
89d0: 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38  3456789_12345678
89e0: 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34  9_123456789_1234
89f0: 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f  56789_123456789_
8a00: 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36  123456789_123456
8a10: 37 38 39 61 28 30 29 3b 0a 20 20 22 0a 7d 20 7b  789a(0);.  ".} {
8a20: 31 20 7b 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  1 {no such funct
8a30: 69 6f 6e 3a 20 6e 75 6c 6c 78 5f 31 32 33 34 35  ion: nullx_12345
8a40: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8a50: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8a60: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8a70: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8a80: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8a90: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8aa0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8ab0: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8ac0: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8ad0: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8ae0: 36 37 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31  6789_123456789_1
8af0: 32 33 34 35 36 37 38 39 5f 31 32 33 34 35 36 37  23456789_1234567
8b00: 38 39 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33  89_123456789_123
8b10: 34 35 36 37 38 39 5f 31 32 33 34 35 36 37 38 39  456789_123456789
8b20: 5f 31 32 33 34 35 36 37 38 39 5f 31 32 33 34 35  _123456789_12345
8b30: 36 37 38 39 61 7d 7d 0a 0a 64 6f 5f 74 65 73 74  6789a}}..do_test
8b40: 20 66 75 6e 63 2d 32 37 2e 31 20 7b 0a 20 20 63   func-27.1 {.  c
8b50: 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20  atchsql {SELECT 
8b60: 63 6f 61 6c 65 73 63 65 28 29 7d 0a 7d 20 7b 31  coalesce()}.} {1
8b70: 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f   {wrong number o
8b80: 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
8b90: 75 6e 63 74 69 6f 6e 20 63 6f 61 6c 65 73 63 65  unction coalesce
8ba0: 28 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  ()}}.do_test fun
8bb0: 63 2d 32 37 2e 32 20 7b 0a 20 20 63 61 74 63 68  c-27.2 {.  catch
8bc0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 63 6f 61 6c  sql {SELECT coal
8bd0: 65 73 63 65 28 31 29 7d 0a 7d 20 7b 31 20 7b 77  esce(1)}.} {1 {w
8be0: 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
8bf0: 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63  rguments to func
8c00: 74 69 6f 6e 20 63 6f 61 6c 65 73 63 65 28 29 7d  tion coalesce()}
8c10: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  }.do_test func-2
8c20: 37 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  7.3 {.  catchsql
8c30: 20 7b 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63   {SELECT coalesc
8c40: 65 28 31 2c 32 29 7d 0a 7d 20 7b 30 20 31 7d 0a  e(1,2)}.} {0 1}.
8c50: 0a 23 20 54 69 63 6b 65 74 20 32 64 34 30 31 61  .# Ticket 2d401a
8c60: 39 34 32 38 37 62 35 0a 23 20 55 6e 6b 6e 6f 77  94287b5.# Unknow
8c70: 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 61 20  n function in a 
8c80: 44 45 46 41 55 4c 54 20 65 78 70 72 65 73 73 69  DEFAULT expressi
8c90: 6f 6e 20 63 61 75 73 65 73 20 61 20 73 65 67 66  on causes a segf
8ca0: 61 75 6c 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ault..#.do_test 
8cb0: 66 75 6e 63 2d 32 38 2e 31 20 7b 0a 20 20 64 62  func-28.1 {.  db
8cc0: 20 65 76 61 6c 20 7b 0a 20 20 20 20 43 52 45 41   eval {.    CREA
8cd0: 54 45 20 54 41 42 4c 45 20 74 32 38 28 78 2c 20  TE TABLE t28(x, 
8ce0: 79 20 44 45 46 41 55 4c 54 28 6e 6f 73 75 63 68  y DEFAULT(nosuch
8cf0: 66 75 6e 63 28 31 29 29 29 3b 0a 20 20 7d 0a 20  func(1)));.  }. 
8d00: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
8d10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 38 28  INSERT INTO t28(
8d20: 78 29 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20  x) VALUES(1);.  
8d30: 7d 0a 7d 20 7b 31 20 7b 75 6e 6b 6e 6f 77 6e 20  }.} {1 {unknown 
8d40: 66 75 6e 63 74 69 6f 6e 3a 20 6e 6f 73 75 63 68  function: nosuch
8d50: 66 75 6e 63 28 29 7d 7d 0a 0a 23 20 56 65 72 69  func()}}..# Veri
8d60: 66 79 20 74 68 61 74 20 74 68 65 20 6c 65 6e 67  fy that the leng
8d70: 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28  th() and typeof(
8d80: 29 20 66 75 6e 63 74 69 6f 6e 73 20 64 6f 20 6e  ) functions do n
8d90: 6f 74 20 61 63 74 75 61 6c 6c 79 20 6c 6f 61 64  ot actually load
8da0: 0a 23 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  .# the content o
8db0: 66 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  f their argument
8dc0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  ..#.do_test func
8dd0: 2d 32 39 2e 31 20 7b 0a 20 20 64 62 20 65 76 61  -29.1 {.  db eva
8de0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
8df0: 41 42 4c 45 20 74 32 39 28 69 64 20 49 4e 54 45  ABLE t29(id INTE
8e00: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
8e10: 20 78 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45   x, y);.    INSE
8e20: 52 54 20 49 4e 54 4f 20 74 32 39 20 56 41 4c 55  RT INTO t29 VALU
8e30: 45 53 28 31 2c 20 32 2c 20 33 29 2c 20 28 32 2c  ES(1, 2, 3), (2,
8e40: 20 4e 55 4c 4c 2c 20 34 29 2c 20 28 33 2c 20 34   NULL, 4), (3, 4
8e50: 2e 35 2c 20 35 29 3b 0a 20 20 20 20 49 4e 53 45  .5, 5);.    INSE
8e60: 52 54 20 49 4e 54 4f 20 74 32 39 20 56 41 4c 55  RT INTO t29 VALU
8e70: 45 53 28 34 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  ES(4, randomblob
8e80: 28 31 30 30 30 30 30 30 29 2c 20 36 29 3b 0a 20  (1000000), 6);. 
8e90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
8ea0: 32 39 20 56 41 4c 55 45 53 28 35 2c 20 22 68 65  29 VALUES(5, "he
8eb0: 6c 6c 6f 22 2c 20 37 29 3b 0a 20 20 7d 0a 20 20  llo", 7);.  }.  
8ec0: 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74  db close.  sqlit
8ed0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
8ee0: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
8ef0: 73 20 64 62 20 43 41 43 48 45 5f 4d 49 53 53 20  s db CACHE_MISS 
8f00: 31 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c  1.  db eval {SEL
8f10: 45 43 54 20 74 79 70 65 6f 66 28 78 29 2c 20 6c  ECT typeof(x), l
8f20: 65 6e 67 74 68 28 78 29 2c 20 74 79 70 65 6f 66  ength(x), typeof
8f30: 28 79 29 20 46 52 4f 4d 20 74 32 39 20 4f 52 44  (y) FROM t29 ORD
8f40: 45 52 20 42 59 20 69 64 7d 0a 7d 20 7b 69 6e 74  ER BY id}.} {int
8f50: 65 67 65 72 20 31 20 69 6e 74 65 67 65 72 20 6e  eger 1 integer n
8f60: 75 6c 6c 20 7b 7d 20 69 6e 74 65 67 65 72 20 72  ull {} integer r
8f70: 65 61 6c 20 33 20 69 6e 74 65 67 65 72 20 62 6c  eal 3 integer bl
8f80: 6f 62 20 31 30 30 30 30 30 30 20 69 6e 74 65 67  ob 1000000 integ
8f90: 65 72 20 74 65 78 74 20 35 20 69 6e 74 65 67 65  er text 5 intege
8fa0: 72 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  r}.do_test func-
8fb0: 32 39 2e 32 20 7b 0a 20 20 73 65 74 20 78 20 5b  29.2 {.  set x [
8fc0: 6c 69 6e 64 65 78 20 5b 73 71 6c 69 74 65 33 5f  lindex [sqlite3_
8fd0: 64 62 5f 73 74 61 74 75 73 20 64 62 20 43 41 43  db_status db CAC
8fe0: 48 45 5f 4d 49 53 53 20 31 5d 20 31 5d 0a 20 20  HE_MISS 1] 1].  
8ff0: 69 66 20 7b 24 78 3c 35 7d 20 7b 73 65 74 20 78  if {$x<5} {set x
9000: 20 31 7d 0a 20 20 73 65 74 20 78 0a 7d 20 7b 31   1}.  set x.} {1
9010: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32  }.do_test func-2
9020: 39 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  9.3 {.  db close
9030: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
9040: 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 5f  st.db.  sqlite3_
9050: 64 62 5f 73 74 61 74 75 73 20 64 62 20 43 41 43  db_status db CAC
9060: 48 45 5f 4d 49 53 53 20 31 0a 20 20 64 62 20 65  HE_MISS 1.  db e
9070: 76 61 6c 20 7b 53 45 4c 45 43 54 20 74 79 70 65  val {SELECT type
9080: 6f 66 28 2b 78 29 20 46 52 4f 4d 20 74 32 39 20  of(+x) FROM t29 
9090: 4f 52 44 45 52 20 42 59 20 69 64 7d 0a 7d 20 7b  ORDER BY id}.} {
90a0: 69 6e 74 65 67 65 72 20 6e 75 6c 6c 20 72 65 61  integer null rea
90b0: 6c 20 62 6c 6f 62 20 74 65 78 74 7d 0a 69 66 20  l blob text}.if 
90c0: 7b 5b 70 65 72 6d 75 74 61 74 69 6f 6e 5d 20 21  {[permutation] !
90d0: 3d 20 22 6d 6d 61 70 22 7d 20 7b 0a 20 20 69 66  = "mmap"} {.  if
90e0: 63 61 70 61 62 6c 65 20 21 64 69 72 65 63 74 5f  capable !direct_
90f0: 72 65 61 64 20 7b 0a 20 20 20 20 64 6f 5f 74 65  read {.    do_te
9100: 73 74 20 66 75 6e 63 2d 32 39 2e 34 20 7b 0a 20  st func-29.4 {. 
9110: 20 20 20 20 20 73 65 74 20 78 20 5b 6c 69 6e 64       set x [lind
9120: 65 78 20 5b 73 71 6c 69 74 65 33 5f 64 62 5f 73  ex [sqlite3_db_s
9130: 74 61 74 75 73 20 64 62 20 43 41 43 48 45 5f 4d  tatus db CACHE_M
9140: 49 53 53 20 31 5d 20 31 5d 0a 20 20 20 20 20 20  ISS 1] 1].      
9150: 69 66 20 7b 24 78 3e 31 30 30 7d 20 7b 73 65 74  if {$x>100} {set
9160: 20 78 20 6d 61 6e 79 7d 0a 20 20 20 20 20 20 73   x many}.      s
9170: 65 74 20 78 0a 20 20 20 20 7d 20 7b 6d 61 6e 79  et x.    } {many
9180: 7d 0a 20 20 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20  }.  }.}.do_test 
9190: 66 75 6e 63 2d 32 39 2e 35 20 7b 0a 20 20 64 62  func-29.5 {.  db
91a0: 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33   close.  sqlite3
91b0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 73 71   db test.db.  sq
91c0: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 20  lite3_db_status 
91d0: 64 62 20 43 41 43 48 45 5f 4d 49 53 53 20 31 0a  db CACHE_MISS 1.
91e0: 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43    db eval {SELEC
91f0: 54 20 73 75 6d 28 6c 65 6e 67 74 68 28 78 29 29  T sum(length(x))
9200: 20 46 52 4f 4d 20 74 32 39 7d 0a 7d 20 7b 31 30   FROM t29}.} {10
9210: 30 30 30 30 39 7d 0a 64 6f 5f 74 65 73 74 20 66  00009}.do_test f
9220: 75 6e 63 2d 32 39 2e 36 20 7b 0a 20 20 73 65 74  unc-29.6 {.  set
9230: 20 78 20 5b 6c 69 6e 64 65 78 20 5b 73 71 6c 69   x [lindex [sqli
9240: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 20 64 62  te3_db_status db
9250: 20 43 41 43 48 45 5f 4d 49 53 53 20 31 5d 20 31   CACHE_MISS 1] 1
9260: 5d 0a 20 20 69 66 20 7b 24 78 3c 35 7d 20 7b 73  ].  if {$x<5} {s
9270: 65 74 20 78 20 31 7d 0a 20 20 73 65 74 20 78 0a  et x 1}.  set x.
9280: 7d 20 7b 31 7d 0a 0a 23 20 54 68 65 20 4f 50 5f  } {1}..# The OP_
9290: 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 68 61  Column opcode ha
92a0: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
92b0: 6e 20 74 68 61 74 20 61 76 6f 69 64 73 20 6c 6f  n that avoids lo
92c0: 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 0a 23 20  ading content.# 
92d0: 66 6f 72 20 66 69 65 6c 64 73 20 77 69 74 68 20  for fields with 
92e0: 63 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3d 30  content-length=0
92f0: 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   when the conten
9300: 74 20 6f 66 66 73 65 74 20 69 73 20 6f 6e 20 61  t offset is on a
9310: 6e 20 6f 76 65 72 66 6c 6f 77 0a 23 20 70 61 67  n overflow.# pag
9320: 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  e.  Make sure th
9330: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77  e optimization w
9340: 6f 72 6b 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  orks..#.do_execs
9350: 71 6c 5f 74 65 73 74 20 66 75 6e 63 2d 32 39 2e  ql_test func-29.
9360: 31 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  10 {.  CREATE TA
9370: 42 4c 45 20 74 32 39 62 28 61 2c 62 2c 63 2c 64  BLE t29b(a,b,c,d
9380: 2c 65 2c 66 2c 67 2c 68 2c 69 29 3b 0a 20 20 49  ,e,f,g,h,i);.  I
9390: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 39 62 20  NSERT INTO t29b 
93a0: 0a 20 20 20 56 41 4c 55 45 53 28 31 2c 20 68 65  .   VALUES(1, he
93b0: 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 30  x(randomblob(200
93c0: 30 29 29 2c 20 6e 75 6c 6c 2c 20 30 2c 20 31 2c  0)), null, 0, 1,
93d0: 20 27 27 2c 20 7a 65 72 6f 62 6c 6f 62 28 30 29   '', zeroblob(0)
93e0: 2c 27 78 27 2c 78 27 30 31 27 29 3b 0a 20 20 53  ,'x',x'01');.  S
93f0: 45 4c 45 43 54 20 74 79 70 65 6f 66 28 63 29 2c  ELECT typeof(c),
9400: 20 74 79 70 65 6f 66 28 64 29 2c 20 74 79 70 65   typeof(d), type
9410: 6f 66 28 65 29 2c 20 74 79 70 65 6f 66 28 66 29  of(e), typeof(f)
9420: 2c 0a 20 20 20 20 20 20 20 20 20 74 79 70 65 6f  ,.         typeo
9430: 66 28 67 29 2c 20 74 79 70 65 6f 66 28 68 29 2c  f(g), typeof(h),
9440: 20 74 79 70 65 6f 66 28 69 29 20 46 52 4f 4d 20   typeof(i) FROM 
9450: 74 32 39 62 3b 0a 7d 20 7b 6e 75 6c 6c 20 69 6e  t29b;.} {null in
9460: 74 65 67 65 72 20 69 6e 74 65 67 65 72 20 74 65  teger integer te
9470: 78 74 20 62 6c 6f 62 20 74 65 78 74 20 62 6c 6f  xt blob text blo
9480: 62 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  b}.do_execsql_te
9490: 73 74 20 66 75 6e 63 2d 32 39 2e 31 31 20 7b 0a  st func-29.11 {.
94a0: 20 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28    SELECT length(
94b0: 66 29 2c 20 6c 65 6e 67 74 68 28 67 29 2c 20 6c  f), length(g), l
94c0: 65 6e 67 74 68 28 68 29 2c 20 6c 65 6e 67 74 68  ength(h), length
94d0: 28 69 29 20 46 52 4f 4d 20 74 32 39 62 3b 0a 7d  (i) FROM t29b;.}
94e0: 20 7b 30 20 30 20 31 20 31 7d 0a 64 6f 5f 65 78   {0 0 1 1}.do_ex
94f0: 65 63 73 71 6c 5f 74 65 73 74 20 66 75 6e 63 2d  ecsql_test func-
9500: 32 39 2e 31 32 20 7b 0a 20 20 53 45 4c 45 43 54  29.12 {.  SELECT
9510: 20 71 75 6f 74 65 28 66 29 2c 20 71 75 6f 74 65   quote(f), quote
9520: 28 67 29 2c 20 71 75 6f 74 65 28 68 29 2c 20 71  (g), quote(h), q
9530: 75 6f 74 65 28 69 29 20 46 52 4f 4d 20 74 32 39  uote(i) FROM t29
9540: 62 3b 0a 7d 20 7b 27 27 20 58 27 27 20 27 78 27  b;.} {'' X'' 'x'
9550: 20 58 27 30 31 27 7d 0a 0a 23 20 45 56 49 44 45   X'01'}..# EVIDE
9560: 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 37 30 31 2d  NCE-OF: R-29701-
9570: 35 30 37 31 31 20 54 68 65 20 75 6e 69 63 6f 64  50711 The unicod
9580: 65 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 72 65  e(X) function re
9590: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 65 72 69  turns the numeri
95a0: 63 0a 23 20 75 6e 69 63 6f 64 65 20 63 6f 64 65  c.# unicode code
95b0: 20 70 6f 69 6e 74 20 63 6f 72 72 65 73 70 6f 6e   point correspon
95c0: 64 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ding to the firs
95d0: 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  t character of t
95e0: 68 65 20 73 74 72 69 6e 67 0a 23 20 58 2e 0a 23  he string.# X..#
95f0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
9600: 52 2d 35 35 34 36 39 2d 36 32 31 33 30 20 54 68  R-55469-62130 Th
9610: 65 20 63 68 61 72 28 58 31 2c 58 32 2c 2e 2e 2e  e char(X1,X2,...
9620: 2c 58 4e 29 20 66 75 6e 63 74 69 6f 6e 20 72 65  ,XN) function re
9630: 74 75 72 6e 73 20 61 0a 23 20 73 74 72 69 6e 67  turns a.# string
9640: 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 63 68 61   composed of cha
9650: 72 61 63 74 65 72 73 20 68 61 76 69 6e 67 20 74  racters having t
9660: 68 65 20 75 6e 69 63 6f 64 65 20 63 6f 64 65 20  he unicode code 
9670: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 6f 66 0a  point values of.
9680: 23 20 69 6e 74 65 67 65 72 73 20 58 31 20 74 68  # integers X1 th
9690: 72 6f 75 67 68 20 58 4e 2c 20 72 65 73 70 65 63  rough XN, respec
96a0: 74 69 76 65 6c 79 2e 0a 23 0a 64 6f 5f 65 78 65  tively..#.do_exe
96b0: 63 73 71 6c 5f 74 65 73 74 20 66 75 6e 63 2d 33  csql_test func-3
96c0: 30 2e 31 20 7b 53 45 4c 45 43 54 20 75 6e 69 63  0.1 {SELECT unic
96d0: 6f 64 65 28 27 24 27 29 3b 7d 20 33 36 0a 64 6f  ode('$');} 36.do
96e0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 66 75  _execsql_test fu
96f0: 6e 63 2d 33 30 2e 32 20 5b 73 75 62 73 74 20 7b  nc-30.2 [subst {
9700: 53 45 4c 45 43 54 20 75 6e 69 63 6f 64 65 28 27  SELECT unicode('
9710: 5c 75 30 30 41 32 27 29 3b 7d 5d 20 31 36 32 0a  \u00A2');}] 162.
9720: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
9730: 66 75 6e 63 2d 33 30 2e 33 20 5b 73 75 62 73 74  func-30.3 [subst
9740: 20 7b 53 45 4c 45 43 54 20 75 6e 69 63 6f 64 65   {SELECT unicode
9750: 28 27 5c 75 32 30 41 43 27 29 3b 7d 5d 20 38 33  ('\u20AC');}] 83
9760: 36 34 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  64.do_execsql_te
9770: 73 74 20 66 75 6e 63 2d 33 30 2e 34 20 7b 53 45  st func-30.4 {SE
9780: 4c 45 43 54 20 63 68 61 72 28 33 36 2c 31 36 32  LECT char(36,162
9790: 2c 38 33 36 34 29 3b 7d 20 5b 73 75 62 73 74 20  ,8364);} [subst 
97a0: 7b 24 5c 75 30 30 41 32 5c 75 32 30 41 43 7d 5d  {$\u00A2\u20AC}]
97b0: 0a 0a 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20  ..for {set i 1} 
97c0: 7b 24 69 3c 30 78 64 38 30 30 7d 20 7b 69 6e 63  {$i<0xd800} {inc
97d0: 72 20 69 20 31 33 7d 20 7b 0a 20 20 64 6f 5f 65  r i 13} {.  do_e
97e0: 78 65 63 73 71 6c 5f 74 65 73 74 20 66 75 6e 63  xecsql_test func
97f0: 2d 33 30 2e 35 2e 24 69 20 7b 53 45 4c 45 43 54  -30.5.$i {SELECT
9800: 20 75 6e 69 63 6f 64 65 28 63 68 61 72 28 24 69   unicode(char($i
9810: 29 29 7d 20 24 69 0a 7d 0a 66 6f 72 20 7b 73 65  ))} $i.}.for {se
9820: 74 20 69 20 35 37 33 34 34 7d 20 7b 24 69 3c 3d  t i 57344} {$i<=
9830: 30 78 66 66 66 64 7d 20 7b 69 6e 63 72 20 69 20  0xfffd} {incr i 
9840: 31 37 7d 20 7b 0a 20 20 69 66 20 7b 24 69 3d 3d  17} {.  if {$i==
9850: 30 78 66 65 66 66 7d 20 63 6f 6e 74 69 6e 75 65  0xfeff} continue
9860: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
9870: 73 74 20 66 75 6e 63 2d 33 30 2e 35 2e 24 69 20  st func-30.5.$i 
9880: 7b 53 45 4c 45 43 54 20 75 6e 69 63 6f 64 65 28  {SELECT unicode(
9890: 63 68 61 72 28 24 69 29 29 7d 20 24 69 0a 7d 0a  char($i))} $i.}.
98a0: 66 6f 72 20 7b 73 65 74 20 69 20 36 35 35 33 36  for {set i 65536
98b0: 7d 20 7b 24 69 3c 3d 30 78 31 30 66 66 66 66 7d  } {$i<=0x10ffff}
98c0: 20 7b 69 6e 63 72 20 69 20 31 33 39 7d 20 7b 0a   {incr i 139} {.
98d0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
98e0: 74 20 66 75 6e 63 2d 33 30 2e 35 2e 24 69 20 7b  t func-30.5.$i {
98f0: 53 45 4c 45 43 54 20 75 6e 69 63 6f 64 65 28 63  SELECT unicode(c
9900: 68 61 72 28 24 69 29 29 7d 20 24 69 0a 7d 0a 0a  har($i))} $i.}..
9910: 23 20 54 65 73 74 20 63 68 61 72 28 29 2e 0a 23  # Test char()..#
9920: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9930: 20 66 75 6e 63 2d 33 31 2e 31 20 7b 20 0a 20 20   func-31.1 { .  
9940: 53 45 4c 45 43 54 20 63 68 61 72 28 29 2c 20 6c  SELECT char(), l
9950: 65 6e 67 74 68 28 63 68 61 72 28 29 29 2c 20 74  ength(char()), t
9960: 79 70 65 6f 66 28 63 68 61 72 28 29 29 20 0a 7d  ypeof(char()) .}
9970: 20 7b 7b 7d 20 30 20 74 65 78 74 7d 0a 0a 23 20   {{} 0 text}..# 
9980: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66 72  sqlite3_value_fr
9990: 6f 6d 62 69 6e 64 28 29 0a 23 0a 64 6f 5f 65 78  ombind().#.do_ex
99a0: 65 63 73 71 6c 5f 74 65 73 74 20 66 75 6e 63 2d  ecsql_test func-
99b0: 33 32 2e 31 30 30 20 7b 0a 20 20 53 45 4c 45 43  32.100 {.  SELEC
99c0: 54 20 74 65 73 74 5f 66 72 6f 6d 62 69 6e 64 28  T test_frombind(
99d0: 31 2c 32 2c 33 2c 34 29 3b 0a 7d 20 7b 30 7d 0a  1,2,3,4);.} {0}.
99e0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
99f0: 66 75 6e 63 2d 33 32 2e 31 31 30 20 7b 0a 20 20  func-32.110 {.  
9a00: 53 45 4c 45 43 54 20 74 65 73 74 5f 66 72 6f 6d  SELECT test_from
9a10: 62 69 6e 64 28 31 2c 32 2c 3f 2c 34 29 3b 0a 7d  bind(1,2,?,4);.}
9a20: 20 7b 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {4}.do_execsql_
9a30: 74 65 73 74 20 66 75 6e 63 2d 33 32 2e 31 32 30  test func-32.120
9a40: 20 7b 0a 20 20 53 45 4c 45 43 54 20 74 65 73 74   {.  SELECT test
9a50: 5f 66 72 6f 6d 62 69 6e 64 28 31 2c 28 3f 29 2c  _frombind(1,(?),
9a60: 34 2c 3f 2b 37 29 3b 0a 7d 20 7b 32 7d 0a 64 6f  4,?+7);.} {2}.do
9a70: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 66 75  _execsql_test fu
9a80: 6e 63 2d 33 32 2e 31 33 30 20 7b 0a 20 20 44 52  nc-32.130 {.  DR
9a90: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
9aa0: 54 53 20 74 31 3b 0a 20 20 43 52 45 41 54 45 20  TS t1;.  CREATE 
9ab0: 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 65  TABLE t1(a,b,c,e
9ac0: 2c 66 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  ,f);.  INSERT IN
9ad0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32  TO t1 VALUES(1,2
9ae0: 2e 35 2c 27 78 79 7a 27 2c 78 27 65 30 63 31 62  .5,'xyz',x'e0c1b
9af0: 32 61 33 27 2c 6e 75 6c 6c 29 3b 0a 20 20 53 45  2a3',null);.  SE
9b00: 4c 45 43 54 20 74 65 73 74 5f 66 72 6f 6d 62 69  LECT test_frombi
9b10: 6e 64 28 61 2c 62 2c 63 2c 65 2c 66 2c 24 78 79  nd(a,b,c,e,f,$xy
9b20: 7a 29 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 33  z) FROM t1;.} {3
9b30: 32 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  2}.do_execsql_te
9b40: 73 74 20 66 75 6e 63 2d 33 32 2e 31 34 30 20 7b  st func-32.140 {
9b50: 0a 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f 66  .  SELECT test_f
9b60: 72 6f 6d 62 69 6e 64 28 61 2c 62 2c 63 2c 65 2c  rombind(a,b,c,e,
9b70: 66 2c 24 78 79 7a 2b 66 29 20 46 52 4f 4d 20 74  f,$xyz+f) FROM t
9b80: 31 3b 0a 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63  1;.} {0}.do_exec
9b90: 73 71 6c 5f 74 65 73 74 20 66 75 6e 63 2d 33 32  sql_test func-32
9ba0: 2e 31 35 30 20 7b 0a 20 20 53 45 4c 45 43 54 20  .150 {.  SELECT 
9bb0: 74 65 73 74 5f 66 72 6f 6d 62 69 6e 64 28 78 2e  test_frombind(x.
9bc0: 61 2c 79 2e 62 2c 78 2e 63 2c 3a 31 32 33 2c 79  a,y.b,x.c,:123,y
9bd0: 2e 65 2c 78 2e 66 2c 24 78 79 7a 2b 79 2e 66 29  .e,x.f,$xyz+y.f)
9be0: 20 46 52 4f 4d 20 74 31 20 78 2c 20 74 31 20 79   FROM t1 x, t1 y
9bf0: 3b 0a 7d 20 7b 38 7d 0a 0a 0a 0a 0a 66 69 6e 69  ;.} {8}.....fini
9c00: 73 68 5f 74 65 73 74 0a                          sh_test.