/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 019d706b2458dfdf239c74cc31143446de1ee44a:


0000: 23 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72  # 2001 September
0010: 20 31 35 0a 23 0a 23 20 54 68 65 20 61 75 74 68   15.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .#**************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73  *********.# This
0170: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0180: 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74   regression test
0190: 73 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62  s for SQLite lib
01a0: 72 61 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63  rary.  The.# foc
01b0: 75 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  us of this file 
01c0: 69 73 20 74 65 73 74 69 6e 67 20 62 75 69 6c 74  is testing built
01d0: 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 23  -in functions..#
01e0: 0a 23 20 24 49 64 3a 20 66 75 6e 63 2e 74 65 73  .# $Id: func.tes
01f0: 74 2c 76 20 31 2e 35 39 20 32 30 30 37 2f 30 33  t,v 1.59 2007/03
0200: 2f 31 37 20 31 37 3a 35 32 3a 34 32 20 64 72 68  /17 17:52:42 drh
0210: 20 45 78 70 20 24 0a 0a 73 65 74 20 74 65 73 74   Exp $..set test
0220: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0230: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0240: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
0250: 2e 74 63 6c 0a 0a 23 20 43 72 65 61 74 65 20 61  .tcl..# Create a
0260: 20 74 61 62 6c 65 20 74 6f 20 77 6f 72 6b 20 77   table to work w
0270: 69 74 68 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66  ith..#.do_test f
0280: 75 6e 63 2d 30 2e 30 20 7b 0a 20 20 65 78 65 63  unc-0.0 {.  exec
0290: 73 71 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c  sql {CREATE TABL
02a0: 45 20 74 62 6c 31 28 74 31 20 74 65 78 74 29 7d  E tbl1(t1 text)}
02b0: 0a 20 20 66 6f 72 65 61 63 68 20 77 6f 72 64 20  .  foreach word 
02c0: 7b 74 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73  {this program is
02d0: 20 66 72 65 65 20 73 6f 66 74 77 61 72 65 7d 20   free software} 
02e0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 49  {.    execsql "I
02f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 31 20  NSERT INTO tbl1 
0300: 56 41 4c 55 45 53 28 27 24 77 6f 72 64 27 29 22  VALUES('$word')"
0310: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
0320: 53 45 4c 45 43 54 20 74 31 20 46 52 4f 4d 20 74  SELECT t1 FROM t
0330: 62 6c 31 20 4f 52 44 45 52 20 42 59 20 74 31 7d  bl1 ORDER BY t1}
0340: 0a 7d 20 7b 66 72 65 65 20 69 73 20 70 72 6f 67  .} {free is prog
0350: 72 61 6d 20 73 6f 66 74 77 61 72 65 20 74 68 69  ram software thi
0360: 73 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  s}.do_test func-
0370: 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  0.1 {.  execsql 
0380: 7b 0a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  {.     CREATE TA
0390: 42 4c 45 20 74 32 28 61 29 3b 0a 20 20 20 20 20  BLE t2(a);.     
03a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
03b0: 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 20 49  ALUES(1);.     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 4e 55 4c 4c 29 3b 0a 20 20 20 20  LUES(NULL);.    
03e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
03f0: 56 41 4c 55 45 53 28 33 34 35 29 3b 0a 20 20 20  VALUES(345);.   
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 4e 55 4c 4c 29 3b 0a 20   VALUES(NULL);. 
0420: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0430: 74 32 20 56 41 4c 55 45 53 28 36 37 38 39 30 29  t2 VALUES(67890)
0440: 3b 0a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  ;.     SELECT * 
0450: 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b  FROM t2;.  }.} {
0460: 31 20 7b 7d 20 33 34 35 20 7b 7d 20 36 37 38 39  1 {} 345 {} 6789
0470: 30 7d 0a 0a 23 20 43 68 65 63 6b 20 6f 75 74 20  0}..# Check out 
0480: 74 68 65 20 6c 65 6e 67 74 68 28 29 20 66 75 6e  the length() fun
0490: 63 74 69 6f 6e 0a 23 0a 64 6f 5f 74 65 73 74 20  ction.#.do_test 
04a0: 66 75 6e 63 2d 31 2e 30 20 7b 0a 20 20 65 78 65  func-1.0 {.  exe
04b0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6c 65 6e  csql {SELECT len
04c0: 67 74 68 28 74 31 29 20 46 52 4f 4d 20 74 62 6c  gth(t1) FROM tbl
04d0: 31 20 4f 52 44 45 52 20 42 59 20 74 31 7d 0a 7d  1 ORDER BY t1}.}
04e0: 20 7b 34 20 32 20 37 20 38 20 34 7d 0a 64 6f 5f   {4 2 7 8 4}.do_
04f0: 74 65 73 74 20 66 75 6e 63 2d 31 2e 31 20 7b 0a  test func-1.1 {.
0500: 20 20 73 65 74 20 72 20 5b 63 61 74 63 68 20 7b    set r [catch {
0510: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
0520: 6c 65 6e 67 74 68 28 2a 29 20 46 52 4f 4d 20 74  length(*) FROM t
0530: 62 6c 31 20 4f 52 44 45 52 20 42 59 20 74 31 7d  bl1 ORDER BY t1}
0540: 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64  } msg].  lappend
0550: 20 72 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 77 72   r $msg.} {1 {wr
0560: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
0570: 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
0580: 69 6f 6e 20 6c 65 6e 67 74 68 28 29 7d 7d 0a 64  ion length()}}.d
0590: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 2e 32 20  o_test func-1.2 
05a0: 7b 0a 20 20 73 65 74 20 72 20 5b 63 61 74 63 68  {.  set r [catch
05b0: 20 7b 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43   {execsql {SELEC
05c0: 54 20 6c 65 6e 67 74 68 28 74 31 2c 35 29 20 46  T length(t1,5) F
05d0: 52 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52 20 42  ROM tbl1 ORDER B
05e0: 59 20 74 31 7d 7d 20 6d 73 67 5d 0a 20 20 6c 61  Y t1}} msg].  la
05f0: 70 70 65 6e 64 20 72 20 24 6d 73 67 0a 7d 20 7b  ppend r $msg.} {
0600: 31 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  1 {wrong number 
0610: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
0620: 66 75 6e 63 74 69 6f 6e 20 6c 65 6e 67 74 68 28  function length(
0630: 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  )}}.do_test func
0640: 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.3 {.  execsql
0650: 20 7b 53 45 4c 45 43 54 20 6c 65 6e 67 74 68 28   {SELECT length(
0660: 74 31 29 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52  t1), count(*) FR
0670: 4f 4d 20 74 62 6c 31 20 47 52 4f 55 50 20 42 59  OM tbl1 GROUP BY
0680: 20 6c 65 6e 67 74 68 28 74 31 29 0a 20 20 20 20   length(t1).    
0690: 20 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20         ORDER BY 
06a0: 6c 65 6e 67 74 68 28 74 31 29 7d 0a 7d 20 7b 32  length(t1)}.} {2
06b0: 20 31 20 34 20 32 20 37 20 31 20 38 20 31 7d 0a   1 4 2 7 1 8 1}.
06c0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 2e 34  do_test func-1.4
06d0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
06e0: 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28 6c 65  LECT coalesce(le
06f0: 6e 67 74 68 28 61 29 2c 2d 31 29 20 46 52 4f 4d  ngth(a),-1) FROM
0700: 20 74 32 7d 0a 7d 20 7b 31 20 2d 31 20 33 20 2d   t2}.} {1 -1 3 -
0710: 31 20 35 7d 0a 0a 23 20 43 68 65 63 6b 20 6f 75  1 5}..# Check ou
0720: 74 20 74 68 65 20 73 75 62 73 74 72 28 29 20 66  t the substr() f
0730: 75 6e 63 74 69 6f 6e 0a 23 0a 64 6f 5f 74 65 73  unction.#.do_tes
0740: 74 20 66 75 6e 63 2d 32 2e 30 20 7b 0a 20 20 65  t func-2.0 {.  e
0750: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 73  xecsql {SELECT s
0760: 75 62 73 74 72 28 74 31 2c 31 2c 32 29 20 46 52  ubstr(t1,1,2) FR
0770: 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52 20 42 59  OM tbl1 ORDER BY
0780: 20 74 31 7d 0a 7d 20 7b 66 72 20 69 73 20 70 72   t1}.} {fr is pr
0790: 20 73 6f 20 74 68 7d 0a 64 6f 5f 74 65 73 74 20   so th}.do_test 
07a0: 66 75 6e 63 2d 32 2e 31 20 7b 0a 20 20 65 78 65  func-2.1 {.  exe
07b0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 73 75 62  csql {SELECT sub
07c0: 73 74 72 28 74 31 2c 32 2c 31 29 20 46 52 4f 4d  str(t1,2,1) FROM
07d0: 20 74 62 6c 31 20 4f 52 44 45 52 20 42 59 20 74   tbl1 ORDER BY t
07e0: 31 7d 0a 7d 20 7b 72 20 73 20 72 20 6f 20 68 7d  1}.} {r s r o h}
07f0: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 2e  .do_test func-2.
0800: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  2 {.  execsql {S
0810: 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 31 2c  ELECT substr(t1,
0820: 33 2c 33 29 20 46 52 4f 4d 20 74 62 6c 31 20 4f  3,3) FROM tbl1 O
0830: 52 44 45 52 20 42 59 20 74 31 7d 0a 7d 20 7b 65  RDER BY t1}.} {e
0840: 65 20 7b 7d 20 6f 67 72 20 66 74 77 20 69 73 7d  e {} ogr ftw is}
0850: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 2e  .do_test func-2.
0860: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  3 {.  execsql {S
0870: 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 31 2c  ELECT substr(t1,
0880: 2d 31 2c 31 29 20 46 52 4f 4d 20 74 62 6c 31 20  -1,1) FROM tbl1 
0890: 4f 52 44 45 52 20 42 59 20 74 31 7d 0a 7d 20 7b  ORDER BY t1}.} {
08a0: 65 20 73 20 6d 20 65 20 73 7d 0a 64 6f 5f 74 65  e s m e s}.do_te
08b0: 73 74 20 66 75 6e 63 2d 32 2e 34 20 7b 0a 20 20  st func-2.4 {.  
08c0: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
08d0: 73 75 62 73 74 72 28 74 31 2c 2d 31 2c 32 29 20  substr(t1,-1,2) 
08e0: 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52 20  FROM tbl1 ORDER 
08f0: 42 59 20 74 31 7d 0a 7d 20 7b 65 20 73 20 6d 20  BY t1}.} {e s m 
0900: 65 20 73 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  e s}.do_test fun
0910: 63 2d 32 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  c-2.5 {.  execsq
0920: 6c 20 7b 53 45 4c 45 43 54 20 73 75 62 73 74 72  l {SELECT substr
0930: 28 74 31 2c 2d 32 2c 31 29 20 46 52 4f 4d 20 74  (t1,-2,1) FROM t
0940: 62 6c 31 20 4f 52 44 45 52 20 42 59 20 74 31 7d  bl1 ORDER BY t1}
0950: 0a 7d 20 7b 65 20 69 20 61 20 72 20 69 7d 0a 64  .} {e i a r i}.d
0960: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 2e 36 20  o_test func-2.6 
0970: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
0980: 45 43 54 20 73 75 62 73 74 72 28 74 31 2c 2d 32  ECT substr(t1,-2
0990: 2c 32 29 20 46 52 4f 4d 20 74 62 6c 31 20 4f 52  ,2) FROM tbl1 OR
09a0: 44 45 52 20 42 59 20 74 31 7d 0a 7d 20 7b 65 65  DER BY t1}.} {ee
09b0: 20 69 73 20 61 6d 20 72 65 20 69 73 7d 0a 64 6f   is am re is}.do
09c0: 5f 74 65 73 74 20 66 75 6e 63 2d 32 2e 37 20 7b  _test func-2.7 {
09d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
09e0: 43 54 20 73 75 62 73 74 72 28 74 31 2c 2d 34 2c  CT substr(t1,-4,
09f0: 32 29 20 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44  2) FROM tbl1 ORD
0a00: 45 52 20 42 59 20 74 31 7d 0a 7d 20 7b 66 72 20  ER BY t1}.} {fr 
0a10: 7b 7d 20 67 72 20 77 61 20 74 68 7d 0a 64 6f 5f  {} gr wa th}.do_
0a20: 74 65 73 74 20 66 75 6e 63 2d 32 2e 38 20 7b 0a  test func-2.8 {.
0a30: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
0a40: 54 20 74 31 20 46 52 4f 4d 20 74 62 6c 31 20 4f  T t1 FROM tbl1 O
0a50: 52 44 45 52 20 42 59 20 73 75 62 73 74 72 28 74  RDER BY substr(t
0a60: 31 2c 32 2c 32 30 29 7d 0a 7d 20 7b 74 68 69 73  1,2,20)}.} {this
0a70: 20 73 6f 66 74 77 61 72 65 20 66 72 65 65 20 70   software free p
0a80: 72 6f 67 72 61 6d 20 69 73 7d 0a 64 6f 5f 74 65  rogram is}.do_te
0a90: 73 74 20 66 75 6e 63 2d 32 2e 39 20 7b 0a 20 20  st func-2.9 {.  
0aa0: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
0ab0: 73 75 62 73 74 72 28 61 2c 31 2c 31 29 20 46 52  substr(a,1,1) FR
0ac0: 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20 7b 7d 20 33  OM t2}.} {1 {} 3
0ad0: 20 7b 7d 20 36 7d 0a 64 6f 5f 74 65 73 74 20 66   {} 6}.do_test f
0ae0: 75 6e 63 2d 32 2e 31 30 20 7b 0a 20 20 65 78 65  unc-2.10 {.  exe
0af0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 73 75 62  csql {SELECT sub
0b00: 73 74 72 28 61 2c 32 2c 32 29 20 46 52 4f 4d 20  str(a,2,2) FROM 
0b10: 74 32 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20 34 35 20  t2}.} {{} {} 45 
0b20: 7b 7d 20 37 38 7d 0a 0a 23 20 4f 6e 6c 79 20 64  {} 78}..# Only d
0b30: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
0b40: 74 65 73 74 73 20 69 66 20 54 43 4c 20 68 61 73  tests if TCL has
0b50: 20 55 54 46 2d 38 20 63 61 70 61 62 69 6c 69 74   UTF-8 capabilit
0b60: 69 65 73 0a 23 0a 69 66 20 7b 22 5c 75 31 32 33  ies.#.if {"\u123
0b70: 34 22 21 3d 22 75 31 32 33 34 22 7d 20 7b 0a 0a  4"!="u1234"} {..
0b80: 23 20 50 75 74 20 73 6f 6d 65 20 55 54 46 2d 38  # Put some UTF-8
0b90: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
0ba0: 68 65 20 64 61 74 61 62 61 73 65 0a 23 0a 64 6f  he database.#.do
0bb0: 5f 74 65 73 74 20 66 75 6e 63 2d 33 2e 30 20 7b  _test func-3.0 {
0bc0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 44 45 4c 45  .  execsql {DELE
0bd0: 54 45 20 46 52 4f 4d 20 74 62 6c 31 7d 0a 20 20  TE FROM tbl1}.  
0be0: 66 6f 72 65 61 63 68 20 77 6f 72 64 20 22 63 6f  foreach word "co
0bf0: 6e 74 61 69 6e 73 20 55 54 46 2d 38 20 63 68 61  ntains UTF-8 cha
0c00: 72 61 63 74 65 72 73 20 68 69 5c 75 31 32 33 34  racters hi\u1234
0c10: 68 6f 22 20 7b 0a 20 20 20 20 65 78 65 63 73 71  ho" {.    execsq
0c20: 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  l "INSERT INTO t
0c30: 62 6c 31 20 56 41 4c 55 45 53 28 27 24 77 6f 72  bl1 VALUES('$wor
0c40: 64 27 29 22 0a 20 20 7d 0a 20 20 65 78 65 63 73  d')".  }.  execs
0c50: 71 6c 20 7b 53 45 4c 45 43 54 20 74 31 20 46 52  ql {SELECT t1 FR
0c60: 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52 20 42 59  OM tbl1 ORDER BY
0c70: 20 74 31 7d 0a 7d 20 22 55 54 46 2d 38 20 63 68   t1}.} "UTF-8 ch
0c80: 61 72 61 63 74 65 72 73 20 63 6f 6e 74 61 69 6e  aracters contain
0c90: 73 20 68 69 5c 75 31 32 33 34 68 6f 22 0a 64 6f  s hi\u1234ho".do
0ca0: 5f 74 65 73 74 20 66 75 6e 63 2d 33 2e 31 20 7b  _test func-3.1 {
0cb0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
0cc0: 43 54 20 6c 65 6e 67 74 68 28 74 31 29 20 46 52  CT length(t1) FR
0cd0: 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52 20 42 59  OM tbl1 ORDER BY
0ce0: 20 74 31 7d 0a 7d 20 7b 35 20 31 30 20 38 20 35   t1}.} {5 10 8 5
0cf0: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 33  }.do_test func-3
0d00: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
0d10: 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 31  SELECT substr(t1
0d20: 2c 31 2c 32 29 20 46 52 4f 4d 20 74 62 6c 31 20  ,1,2) FROM tbl1 
0d30: 4f 52 44 45 52 20 42 59 20 74 31 7d 0a 7d 20 7b  ORDER BY t1}.} {
0d40: 55 54 20 63 68 20 63 6f 20 68 69 7d 0a 64 6f 5f  UT ch co hi}.do_
0d50: 74 65 73 74 20 66 75 6e 63 2d 33 2e 33 20 7b 0a  test func-3.3 {.
0d60: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
0d70: 54 20 73 75 62 73 74 72 28 74 31 2c 31 2c 33 29  T substr(t1,1,3)
0d80: 20 46 52 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52   FROM tbl1 ORDER
0d90: 20 42 59 20 74 31 7d 0a 7d 20 22 55 54 46 20 63   BY t1}.} "UTF c
0da0: 68 61 20 63 6f 6e 20 68 69 5c 75 31 32 33 34 22  ha con hi\u1234"
0db0: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 33 2e  .do_test func-3.
0dc0: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  4 {.  execsql {S
0dd0: 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 31 2c  ELECT substr(t1,
0de0: 32 2c 32 29 20 46 52 4f 4d 20 74 62 6c 31 20 4f  2,2) FROM tbl1 O
0df0: 52 44 45 52 20 42 59 20 74 31 7d 0a 7d 20 22 54  RDER BY t1}.} "T
0e00: 46 20 68 61 20 6f 6e 20 69 5c 75 31 32 33 34 22  F ha on i\u1234"
0e10: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 33 2e  .do_test func-3.
0e20: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  5 {.  execsql {S
0e30: 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 31 2c  ELECT substr(t1,
0e40: 32 2c 33 29 20 46 52 4f 4d 20 74 62 6c 31 20 4f  2,3) FROM tbl1 O
0e50: 52 44 45 52 20 42 59 20 74 31 7d 0a 7d 20 22 54  RDER BY t1}.} "T
0e60: 46 2d 20 68 61 72 20 6f 6e 74 20 69 5c 75 31 32  F- har ont i\u12
0e70: 33 34 68 22 0a 64 6f 5f 74 65 73 74 20 66 75 6e  34h".do_test fun
0e80: 63 2d 33 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  c-3.6 {.  execsq
0e90: 6c 20 7b 53 45 4c 45 43 54 20 73 75 62 73 74 72  l {SELECT substr
0ea0: 28 74 31 2c 33 2c 32 29 20 46 52 4f 4d 20 74 62  (t1,3,2) FROM tb
0eb0: 6c 31 20 4f 52 44 45 52 20 42 59 20 74 31 7d 0a  l1 ORDER BY t1}.
0ec0: 7d 20 22 46 2d 20 61 72 20 6e 74 20 5c 75 31 32  } "F- ar nt \u12
0ed0: 33 34 68 22 0a 64 6f 5f 74 65 73 74 20 66 75 6e  34h".do_test fun
0ee0: 63 2d 33 2e 37 20 7b 0a 20 20 65 78 65 63 73 71  c-3.7 {.  execsq
0ef0: 6c 20 7b 53 45 4c 45 43 54 20 73 75 62 73 74 72  l {SELECT substr
0f00: 28 74 31 2c 34 2c 32 29 20 46 52 4f 4d 20 74 62  (t1,4,2) FROM tb
0f10: 6c 31 20 4f 52 44 45 52 20 42 59 20 74 31 7d 0a  l1 ORDER BY t1}.
0f20: 7d 20 22 2d 38 20 72 61 20 74 61 20 68 6f 22 0a  } "-8 ra ta ho".
0f30: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 33 2e 38  do_test func-3.8
0f40: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
0f50: 4c 45 43 54 20 73 75 62 73 74 72 28 74 31 2c 2d  LECT substr(t1,-
0f60: 31 2c 31 29 20 46 52 4f 4d 20 74 62 6c 31 20 4f  1,1) FROM tbl1 O
0f70: 52 44 45 52 20 42 59 20 74 31 7d 0a 7d 20 22 38  RDER BY t1}.} "8
0f80: 20 73 20 73 20 6f 22 0a 64 6f 5f 74 65 73 74 20   s s o".do_test 
0f90: 66 75 6e 63 2d 33 2e 39 20 7b 0a 20 20 65 78 65  func-3.9 {.  exe
0fa0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 73 75 62  csql {SELECT sub
0fb0: 73 74 72 28 74 31 2c 2d 33 2c 32 29 20 46 52 4f  str(t1,-3,2) FRO
0fc0: 4d 20 74 62 6c 31 20 4f 52 44 45 52 20 42 59 20  M tbl1 ORDER BY 
0fd0: 74 31 7d 0a 7d 20 22 46 2d 20 65 72 20 69 6e 20  t1}.} "F- er in 
0fe0: 5c 75 31 32 33 34 68 22 0a 64 6f 5f 74 65 73 74  \u1234h".do_test
0ff0: 20 66 75 6e 63 2d 33 2e 31 30 20 7b 0a 20 20 65   func-3.10 {.  e
1000: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 73  xecsql {SELECT s
1010: 75 62 73 74 72 28 74 31 2c 2d 34 2c 33 29 20 46  ubstr(t1,-4,3) F
1020: 52 4f 4d 20 74 62 6c 31 20 4f 52 44 45 52 20 42  ROM tbl1 ORDER B
1030: 59 20 74 31 7d 0a 7d 20 22 54 46 2d 20 74 65 72  Y t1}.} "TF- ter
1040: 20 61 69 6e 20 69 5c 75 31 32 33 34 68 22 0a 64   ain i\u1234h".d
1050: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 33 2e 39 39  o_test func-3.99
1060: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 44 45   {.  execsql {DE
1070: 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 31 7d 0a  LETE FROM tbl1}.
1080: 20 20 66 6f 72 65 61 63 68 20 77 6f 72 64 20 7b    foreach word {
1090: 74 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20  this program is 
10a0: 66 72 65 65 20 73 6f 66 74 77 61 72 65 7d 20 7b  free software} {
10b0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 49 4e  .    execsql "IN
10c0: 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 31 20 56  SERT INTO tbl1 V
10d0: 41 4c 55 45 53 28 27 24 77 6f 72 64 27 29 22 0a  ALUES('$word')".
10e0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 53    }.  execsql {S
10f0: 45 4c 45 43 54 20 74 31 20 46 52 4f 4d 20 74 62  ELECT t1 FROM tb
1100: 6c 31 7d 0a 7d 20 7b 74 68 69 73 20 70 72 6f 67  l1}.} {this prog
1110: 72 61 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74  ram is free soft
1120: 77 61 72 65 7d 0a 0a 7d 20 3b 23 20 45 6e 64 20  ware}..} ;# End 
1130: 5c 75 31 32 33 34 21 3d 75 31 32 33 34 0a 0a 23  \u1234!=u1234..#
1140: 20 54 65 73 74 20 74 68 65 20 61 62 73 28 29 20   Test the abs() 
1150: 61 6e 64 20 72 6f 75 6e 64 28 29 20 66 75 6e 63  and round() func
1160: 74 69 6f 6e 73 2e 0a 23 0a 64 6f 5f 74 65 73 74  tions..#.do_test
1170: 20 66 75 6e 63 2d 34 2e 31 20 7b 0a 20 20 65 78   func-4.1 {.  ex
1180: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
1190: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c  TE TABLE t1(a,b,
11a0: 63 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  c);.    INSERT I
11b0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
11c0: 32 2c 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  2,3);.    INSERT
11d0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
11e0: 32 2c 31 2e 32 33 34 35 36 37 38 39 30 31 32 33  2,1.234567890123
11f0: 34 2c 2d 31 32 33 34 35 2e 36 37 38 39 30 29 3b  4,-12345.67890);
1200: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1210: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 2d 32 2c   t1 VALUES(3,-2,
1220: 2d 35 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68  -5);.  }.  catch
1230: 73 71 6c 20 7b 53 45 4c 45 43 54 20 61 62 73 28  sql {SELECT abs(
1240: 61 2c 62 29 20 46 52 4f 4d 20 74 31 7d 0a 7d 20  a,b) FROM t1}.} 
1250: 7b 31 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72  {1 {wrong number
1260: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
1270: 20 66 75 6e 63 74 69 6f 6e 20 61 62 73 28 29 7d   function abs()}
1280: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34  }.do_test func-4
1290: 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .2 {.  catchsql 
12a0: 7b 53 45 4c 45 43 54 20 61 62 73 28 29 20 46 52  {SELECT abs() FR
12b0: 4f 4d 20 74 31 7d 0a 7d 20 7b 31 20 7b 77 72 6f  OM t1}.} {1 {wro
12c0: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
12d0: 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69  uments to functi
12e0: 6f 6e 20 61 62 73 28 29 7d 7d 0a 64 6f 5f 74 65  on abs()}}.do_te
12f0: 73 74 20 66 75 6e 63 2d 34 2e 33 20 7b 0a 20 20  st func-4.3 {.  
1300: 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54  catchsql {SELECT
1310: 20 61 62 73 28 62 29 20 46 52 4f 4d 20 74 31 20   abs(b) FROM t1 
1320: 4f 52 44 45 52 20 42 59 20 61 7d 0a 7d 20 7b 30  ORDER BY a}.} {0
1330: 20 7b 32 20 31 2e 32 33 34 35 36 37 38 39 30 31   {2 1.2345678901
1340: 32 33 34 20 32 7d 7d 0a 64 6f 5f 74 65 73 74 20  234 2}}.do_test 
1350: 66 75 6e 63 2d 34 2e 34 20 7b 0a 20 20 63 61 74  func-4.4 {.  cat
1360: 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 61 62  chsql {SELECT ab
1370: 73 28 63 29 20 46 52 4f 4d 20 74 31 20 4f 52 44  s(c) FROM t1 ORD
1380: 45 52 20 42 59 20 61 7d 0a 7d 20 7b 30 20 7b 33  ER BY a}.} {0 {3
1390: 20 31 32 33 34 35 2e 36 37 38 39 20 35 7d 7d 0a   12345.6789 5}}.
13a0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34 2e 34  do_test func-4.4
13b0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
13c0: 53 45 4c 45 43 54 20 61 62 73 28 61 29 20 46 52  SELECT abs(a) FR
13d0: 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20 7b 7d 20 33  OM t2}.} {1 {} 3
13e0: 34 35 20 7b 7d 20 36 37 38 39 30 7d 0a 64 6f 5f  45 {} 67890}.do_
13f0: 74 65 73 74 20 66 75 6e 63 2d 34 2e 34 2e 32 20  test func-4.4.2 
1400: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
1410: 45 43 54 20 61 62 73 28 74 31 29 20 46 52 4f 4d  ECT abs(t1) FROM
1420: 20 74 62 6c 31 7d 0a 7d 20 7b 30 2e 30 20 30 2e   tbl1}.} {0.0 0.
1430: 30 20 30 2e 30 20 30 2e 30 20 30 2e 30 7d 0a 0a  0 0.0 0.0 0.0}..
1440: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34 2e 35  do_test func-4.5
1450: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53   {.  catchsql {S
1460: 45 4c 45 43 54 20 72 6f 75 6e 64 28 61 2c 62 2c  ELECT round(a,b,
1470: 63 29 20 46 52 4f 4d 20 74 31 7d 0a 7d 20 7b 31  c) FROM t1}.} {1
1480: 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f   {wrong number o
1490: 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
14a0: 75 6e 63 74 69 6f 6e 20 72 6f 75 6e 64 28 29 7d  unction round()}
14b0: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34  }.do_test func-4
14c0: 2e 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .6 {.  catchsql 
14d0: 7b 53 45 4c 45 43 54 20 72 6f 75 6e 64 28 62 2c  {SELECT round(b,
14e0: 32 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52  2) FROM t1 ORDER
14f0: 20 42 59 20 62 7d 0a 7d 20 7b 30 20 7b 2d 32 2e   BY b}.} {0 {-2.
1500: 30 20 31 2e 32 33 20 32 2e 30 7d 7d 0a 64 6f 5f  0 1.23 2.0}}.do_
1510: 74 65 73 74 20 66 75 6e 63 2d 34 2e 37 20 7b 0a  test func-4.7 {.
1520: 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45    catchsql {SELE
1530: 43 54 20 72 6f 75 6e 64 28 62 2c 30 29 20 46 52  CT round(b,0) FR
1540: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61  OM t1 ORDER BY a
1550: 7d 0a 7d 20 7b 30 20 7b 32 2e 30 20 31 2e 30 20  }.} {0 {2.0 1.0 
1560: 2d 32 2e 30 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  -2.0}}.do_test f
1570: 75 6e 63 2d 34 2e 38 20 7b 0a 20 20 63 61 74 63  unc-4.8 {.  catc
1580: 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f 75  hsql {SELECT rou
1590: 6e 64 28 63 29 20 46 52 4f 4d 20 74 31 20 4f 52  nd(c) FROM t1 OR
15a0: 44 45 52 20 42 59 20 61 7d 0a 7d 20 7b 30 20 7b  DER BY a}.} {0 {
15b0: 33 2e 30 20 2d 31 32 33 34 36 2e 30 20 2d 35 2e  3.0 -12346.0 -5.
15c0: 30 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  0}}.do_test func
15d0: 2d 34 2e 39 20 7b 0a 20 20 63 61 74 63 68 73 71  -4.9 {.  catchsq
15e0: 6c 20 7b 53 45 4c 45 43 54 20 72 6f 75 6e 64 28  l {SELECT round(
15f0: 63 2c 61 29 20 46 52 4f 4d 20 74 31 20 4f 52 44  c,a) FROM t1 ORD
1600: 45 52 20 42 59 20 61 7d 0a 7d 20 7b 30 20 7b 33  ER BY a}.} {0 {3
1610: 2e 30 20 2d 31 32 33 34 35 2e 36 38 20 2d 35 2e  .0 -12345.68 -5.
1620: 30 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  0}}.do_test func
1630: 2d 34 2e 31 30 20 7b 0a 20 20 63 61 74 63 68 73  -4.10 {.  catchs
1640: 71 6c 20 7b 53 45 4c 45 43 54 20 27 78 27 20 7c  ql {SELECT 'x' |
1650: 7c 20 72 6f 75 6e 64 28 63 2c 61 29 20 7c 7c 20  | round(c,a) || 
1660: 27 79 27 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  'y' FROM t1 ORDE
1670: 52 20 42 59 20 61 7d 0a 7d 20 7b 30 20 7b 78 33  R BY a}.} {0 {x3
1680: 2e 30 79 20 78 2d 31 32 33 34 35 2e 36 38 79 20  .0y x-12345.68y 
1690: 78 2d 35 2e 30 79 7d 7d 0a 64 6f 5f 74 65 73 74  x-5.0y}}.do_test
16a0: 20 66 75 6e 63 2d 34 2e 31 31 20 7b 0a 20 20 63   func-4.11 {.  c
16b0: 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54 20  atchsql {SELECT 
16c0: 72 6f 75 6e 64 28 29 20 46 52 4f 4d 20 74 31 20  round() FROM t1 
16d0: 4f 52 44 45 52 20 42 59 20 61 7d 0a 7d 20 7b 31  ORDER BY a}.} {1
16e0: 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f   {wrong number o
16f0: 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
1700: 75 6e 63 74 69 6f 6e 20 72 6f 75 6e 64 28 29 7d  unction round()}
1710: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34  }.do_test func-4
1720: 2e 31 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .12 {.  execsql 
1730: 7b 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65  {SELECT coalesce
1740: 28 72 6f 75 6e 64 28 61 2c 32 29 2c 27 6e 69 6c  (round(a,2),'nil
1750: 27 29 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31  ') FROM t2}.} {1
1760: 2e 30 20 6e 69 6c 20 33 34 35 2e 30 20 6e 69 6c  .0 nil 345.0 nil
1770: 20 36 37 38 39 30 2e 30 7d 0a 64 6f 5f 74 65 73   67890.0}.do_tes
1780: 74 20 66 75 6e 63 2d 34 2e 31 33 20 7b 0a 20 20  t func-4.13 {.  
1790: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
17a0: 72 6f 75 6e 64 28 74 31 2c 32 29 20 46 52 4f 4d  round(t1,2) FROM
17b0: 20 74 62 6c 31 7d 0a 7d 20 7b 30 2e 30 20 30 2e   tbl1}.} {0.0 0.
17c0: 30 20 30 2e 30 20 30 2e 30 20 30 2e 30 7d 0a 64  0 0.0 0.0 0.0}.d
17d0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 34 2e 31 34  o_test func-4.14
17e0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
17f0: 4c 45 43 54 20 74 79 70 65 6f 66 28 72 6f 75 6e  LECT typeof(roun
1800: 64 28 35 2e 31 2c 31 29 29 3b 7d 0a 7d 20 7b 72  d(5.1,1));}.} {r
1810: 65 61 6c 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  eal}.do_test fun
1820: 63 2d 34 2e 31 35 20 7b 0a 20 20 65 78 65 63 73  c-4.15 {.  execs
1830: 71 6c 20 7b 53 45 4c 45 43 54 20 74 79 70 65 6f  ql {SELECT typeo
1840: 66 28 72 6f 75 6e 64 28 35 2e 31 29 29 3b 7d 0a  f(round(5.1));}.
1850: 7d 20 7b 72 65 61 6c 7d 0a 0a 0a 23 20 54 65 73  } {real}...# Tes
1860: 74 20 74 68 65 20 75 70 70 65 72 28 29 20 61 6e  t the upper() an
1870: 64 20 6c 6f 77 65 72 28 29 20 66 75 6e 63 74 69  d lower() functi
1880: 6f 6e 73 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75  ons.#.do_test fu
1890: 6e 63 2d 35 2e 31 20 7b 0a 20 20 65 78 65 63 73  nc-5.1 {.  execs
18a0: 71 6c 20 7b 53 45 4c 45 43 54 20 75 70 70 65 72  ql {SELECT upper
18b0: 28 74 31 29 20 46 52 4f 4d 20 74 62 6c 31 7d 0a  (t1) FROM tbl1}.
18c0: 7d 20 7b 54 48 49 53 20 50 52 4f 47 52 41 4d 20  } {THIS PROGRAM 
18d0: 49 53 20 46 52 45 45 20 53 4f 46 54 57 41 52 45  IS FREE SOFTWARE
18e0: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 35  }.do_test func-5
18f0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
1900: 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 75 70 70  SELECT lower(upp
1910: 65 72 28 74 31 29 29 20 46 52 4f 4d 20 74 62 6c  er(t1)) FROM tbl
1920: 31 7d 0a 7d 20 7b 74 68 69 73 20 70 72 6f 67 72  1}.} {this progr
1930: 61 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 77  am is free softw
1940: 61 72 65 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  are}.do_test fun
1950: 63 2d 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  c-5.3 {.  execsq
1960: 6c 20 7b 53 45 4c 45 43 54 20 75 70 70 65 72 28  l {SELECT upper(
1970: 61 29 2c 20 6c 6f 77 65 72 28 61 29 20 46 52 4f  a), lower(a) FRO
1980: 4d 20 74 32 7d 0a 7d 20 7b 31 20 31 20 7b 7d 20  M t2}.} {1 1 {} 
1990: 7b 7d 20 33 34 35 20 33 34 35 20 7b 7d 20 7b 7d  {} 345 345 {} {}
19a0: 20 36 37 38 39 30 20 36 37 38 39 30 7d 0a 64 6f   67890 67890}.do
19b0: 5f 74 65 73 74 20 66 75 6e 63 2d 35 2e 34 20 7b  _test func-5.4 {
19c0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c  .  catchsql {SEL
19d0: 45 43 54 20 75 70 70 65 72 28 61 2c 35 29 20 46  ECT upper(a,5) F
19e0: 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20 7b 77 72  ROM t2}.} {1 {wr
19f0: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
1a00: 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
1a10: 69 6f 6e 20 75 70 70 65 72 28 29 7d 7d 0a 64 6f  ion upper()}}.do
1a20: 5f 74 65 73 74 20 66 75 6e 63 2d 35 2e 35 20 7b  _test func-5.5 {
1a30: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c  .  catchsql {SEL
1a40: 45 43 54 20 75 70 70 65 72 28 2a 29 20 46 52 4f  ECT upper(*) FRO
1a50: 4d 20 74 32 7d 0a 7d 20 7b 31 20 7b 77 72 6f 6e  M t2}.} {1 {wron
1a60: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
1a70: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
1a80: 6e 20 75 70 70 65 72 28 29 7d 7d 0a 0a 23 20 54  n upper()}}..# T
1a90: 65 73 74 20 74 68 65 20 63 6f 61 6c 65 73 63 65  est the coalesce
1aa0: 28 29 20 61 6e 64 20 6e 75 6c 6c 69 66 28 29 20  () and nullif() 
1ab0: 66 75 6e 63 74 69 6f 6e 73 0a 23 0a 64 6f 5f 74  functions.#.do_t
1ac0: 65 73 74 20 66 75 6e 63 2d 36 2e 31 20 7b 0a 20  est func-6.1 {. 
1ad0: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
1ae0: 20 63 6f 61 6c 65 73 63 65 28 61 2c 27 78 79 7a   coalesce(a,'xyz
1af0: 27 29 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31  ') FROM t2}.} {1
1b00: 20 78 79 7a 20 33 34 35 20 78 79 7a 20 36 37 38   xyz 345 xyz 678
1b10: 39 30 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  90}.do_test func
1b20: 2d 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -6.2 {.  execsql
1b30: 20 7b 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63   {SELECT coalesc
1b40: 65 28 75 70 70 65 72 28 61 29 2c 27 6e 69 6c 27  e(upper(a),'nil'
1b50: 29 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20  ) FROM t2}.} {1 
1b60: 6e 69 6c 20 33 34 35 20 6e 69 6c 20 36 37 38 39  nil 345 nil 6789
1b70: 30 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  0}.do_test func-
1b80: 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.3 {.  execsql 
1b90: 7b 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65  {SELECT coalesce
1ba0: 28 6e 75 6c 6c 69 66 28 31 2c 31 29 2c 27 6e 69  (nullif(1,1),'ni
1bb0: 6c 27 29 7d 0a 7d 20 7b 6e 69 6c 7d 0a 64 6f 5f  l')}.} {nil}.do_
1bc0: 74 65 73 74 20 66 75 6e 63 2d 36 2e 34 20 7b 0a  test func-6.4 {.
1bd0: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
1be0: 54 20 63 6f 61 6c 65 73 63 65 28 6e 75 6c 6c 69  T coalesce(nulli
1bf0: 66 28 31 2c 32 29 2c 27 6e 69 6c 27 29 7d 0a 7d  f(1,2),'nil')}.}
1c00: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e   {1}.do_test fun
1c10: 63 2d 36 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  c-6.5 {.  execsq
1c20: 6c 20 7b 53 45 4c 45 43 54 20 63 6f 61 6c 65 73  l {SELECT coales
1c30: 63 65 28 6e 75 6c 6c 69 66 28 31 2c 4e 55 4c 4c  ce(nullif(1,NULL
1c40: 29 2c 27 6e 69 6c 27 29 7d 0a 7d 20 7b 31 7d 0a  ),'nil')}.} {1}.
1c50: 0a 0a 23 20 54 65 73 74 20 74 68 65 20 6c 61 73  ..# Test the las
1c60: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
1c70: 20 66 75 6e 63 74 69 6f 6e 0a 23 0a 64 6f 5f 74   function.#.do_t
1c80: 65 73 74 20 66 75 6e 63 2d 37 2e 31 20 7b 0a 20  est func-7.1 {. 
1c90: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
1ca0: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
1cb0: 69 64 28 29 7d 0a 7d 20 5b 64 62 20 6c 61 73 74  id()}.} [db last
1cc0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 5d 0a 0a  _insert_rowid]..
1cd0: 23 20 54 65 73 74 73 20 66 6f 72 20 61 67 67 72  # Tests for aggr
1ce0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1cf0: 61 6e 64 20 68 6f 77 20 74 68 65 79 20 68 61 6e  and how they han
1d00: 64 6c 65 20 4e 55 4c 4c 73 2e 0a 23 0a 64 6f 5f  dle NULLs..#.do_
1d10: 74 65 73 74 20 66 75 6e 63 2d 38 2e 31 20 7b 0a  test func-8.1 {.
1d20: 20 20 69 66 63 61 70 61 62 6c 65 20 65 78 70 6c    ifcapable expl
1d30: 61 69 6e 20 7b 0a 20 20 20 20 65 78 65 63 73 71  ain {.    execsq
1d40: 6c 20 7b 45 58 50 4c 41 49 4e 20 53 45 4c 45 43  l {EXPLAIN SELEC
1d50: 54 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 32  T sum(a) FROM t2
1d60: 3b 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  ;}.  }.  execsql
1d70: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 75   {.    SELECT su
1d80: 6d 28 61 29 2c 20 63 6f 75 6e 74 28 61 29 2c 20  m(a), count(a), 
1d90: 72 6f 75 6e 64 28 61 76 67 28 61 29 2c 32 29 2c  round(avg(a),2),
1da0: 20 6d 69 6e 28 61 29 2c 20 6d 61 78 28 61 29 2c   min(a), max(a),
1db0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1dc0: 32 3b 0a 20 20 7d 0a 7d 20 7b 36 38 32 33 36 20  2;.  }.} {68236 
1dd0: 33 20 32 32 37 34 35 2e 33 33 20 31 20 36 37 38  3 22745.33 1 678
1de0: 39 30 20 35 7d 0a 64 6f 5f 74 65 73 74 20 66 75  90 5}.do_test fu
1df0: 6e 63 2d 38 2e 32 20 7b 0a 20 20 65 78 65 63 73  nc-8.2 {.  execs
1e00: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
1e10: 6d 61 78 28 27 7a 2b 27 7c 7c 61 7c 7c 27 61 62  max('z+'||a||'ab
1e20: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
1e30: 73 74 75 76 77 78 79 7a 41 42 43 44 45 46 47 48  stuvwxyzABCDEFGH
1e40: 49 4a 4b 4c 4d 4e 4f 50 27 29 20 46 52 4f 4d 20  IJKLMNOP') FROM 
1e50: 74 32 3b 0a 20 20 7d 0a 7d 20 7b 7a 2b 36 37 38  t2;.  }.} {z+678
1e60: 39 30 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e  90abcdefghijklmn
1e70: 6f 70 71 72 73 74 75 76 77 78 79 7a 41 42 43 44  opqrstuvwxyzABCD
1e80: 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 7d 0a 0a 69  EFGHIJKLMNOP}..i
1e90: 66 63 61 70 61 62 6c 65 20 74 65 6d 70 64 62 20  fcapable tempdb 
1ea0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 66 75 6e 63  {.  do_test func
1eb0: 2d 38 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73  -8.3 {.    execs
1ec0: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
1ed0: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 74 33 20  E TEMP TABLE t3 
1ee0: 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  AS SELECT a FROM
1ef0: 20 74 32 20 4f 52 44 45 52 20 42 59 20 61 20 44   t2 ORDER BY a D
1f00: 45 53 43 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  ESC;.      SELEC
1f10: 54 20 6d 69 6e 28 27 7a 2b 27 7c 7c 61 7c 7c 27  T min('z+'||a||'
1f20: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
1f30: 71 72 73 74 75 76 77 78 79 7a 41 42 43 44 45 46  qrstuvwxyzABCDEF
1f40: 47 48 49 4a 4b 4c 4d 4e 4f 50 27 29 20 46 52 4f  GHIJKLMNOP') FRO
1f50: 4d 20 74 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t3;.    }.  } 
1f60: 7b 7a 2b 31 61 62 63 64 65 66 67 68 69 6a 6b 6c  {z+1abcdefghijkl
1f70: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41 42  mnopqrstuvwxyzAB
1f80: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 7d 0a  CDEFGHIJKLMNOP}.
1f90: 7d 20 65 6c 73 65 20 7b 0a 20 20 64 6f 5f 74 65  } else {.  do_te
1fa0: 73 74 20 66 75 6e 63 2d 38 2e 33 20 7b 0a 20 20  st func-8.3 {.  
1fb0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1fc0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1fd0: 33 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52  3 AS SELECT a FR
1fe0: 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 61  OM t2 ORDER BY a
1ff0: 20 44 45 53 43 3b 0a 20 20 20 20 20 20 53 45 4c   DESC;.      SEL
2000: 45 43 54 20 6d 69 6e 28 27 7a 2b 27 7c 7c 61 7c  ECT min('z+'||a|
2010: 7c 27 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e  |'abcdefghijklmn
2020: 6f 70 71 72 73 74 75 76 77 78 79 7a 41 42 43 44  opqrstuvwxyzABCD
2030: 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 27 29 20 46  EFGHIJKLMNOP') F
2040: 52 4f 4d 20 74 33 3b 0a 20 20 20 20 7d 0a 20 20  ROM t3;.    }.  
2050: 7d 20 7b 7a 2b 31 61 62 63 64 65 66 67 68 69 6a  } {z+1abcdefghij
2060: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
2070: 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
2080: 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  }.}.do_test func
2090: 2d 38 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  -8.4 {.  execsql
20a0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6d 61   {.    SELECT ma
20b0: 78 28 27 7a 2b 27 7c 7c 61 7c 7c 27 61 62 63 64  x('z+'||a||'abcd
20c0: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
20d0: 75 76 77 78 79 7a 41 42 43 44 45 46 47 48 49 4a  uvwxyzABCDEFGHIJ
20e0: 4b 4c 4d 4e 4f 50 27 29 20 46 52 4f 4d 20 74 33  KLMNOP') FROM t3
20f0: 3b 0a 20 20 7d 0a 7d 20 7b 7a 2b 36 37 38 39 30  ;.  }.} {z+67890
2100: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
2110: 71 72 73 74 75 76 77 78 79 7a 41 42 43 44 45 46  qrstuvwxyzABCDEF
2120: 47 48 49 4a 4b 4c 4d 4e 4f 50 7d 0a 0a 23 20 48  GHIJKLMNOP}..# H
2130: 6f 77 20 64 6f 20 79 6f 75 20 74 65 73 74 20 74  ow do you test t
2140: 68 65 20 72 61 6e 64 6f 6d 28 29 20 66 75 6e 63  he random() func
2150: 74 69 6f 6e 20 69 6e 20 61 20 6d 65 61 6e 69 6e  tion in a meanin
2160: 67 66 75 6c 2c 20 64 65 74 65 72 6d 69 6e 69 73  gful, determinis
2170: 74 69 63 20 77 61 79 3f 0a 23 0a 64 6f 5f 74 65  tic way?.#.do_te
2180: 73 74 20 66 75 6e 63 2d 39 2e 31 20 7b 0a 20 20  st func-9.1 {.  
2190: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
21a0: 4c 45 43 54 20 72 61 6e 64 6f 6d 28 29 20 69 73  LECT random() is
21b0: 20 6e 6f 74 20 6e 75 6c 6c 3b 0a 20 20 7d 0a 7d   not null;.  }.}
21c0: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e   {1}.do_test fun
21d0: 63 2d 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  c-9.2 {.  execsq
21e0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74  l {.    SELECT t
21f0: 79 70 65 6f 66 28 72 61 6e 64 6f 6d 28 29 29 3b  ypeof(random());
2200: 0a 20 20 7d 0a 7d 20 7b 69 6e 74 65 67 65 72 7d  .  }.} {integer}
2210: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 39 2e  .do_test func-9.
2220: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
2230: 20 20 20 20 53 45 4c 45 43 54 20 72 61 6e 64 6f      SELECT rando
2240: 6d 62 6c 6f 62 28 33 32 29 20 69 73 20 6e 6f 74  mblob(32) is not
2250: 20 6e 75 6c 6c 3b 0a 20 20 7d 0a 7d 20 7b 31 7d   null;.  }.} {1}
2260: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 39 2e  .do_test func-9.
2270: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
2280: 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f      SELECT typeo
2290: 66 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 33 32 29  f(randomblob(32)
22a0: 29 3b 0a 20 20 7d 0a 7d 20 7b 62 6c 6f 62 7d 0a  );.  }.} {blob}.
22b0: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 39 2e 35  do_test func-9.5
22c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
22d0: 20 20 20 53 45 4c 45 43 54 20 6c 65 6e 67 74 68     SELECT length
22e0: 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 33 32 29 29  (randomblob(32))
22f0: 2c 20 6c 65 6e 67 74 68 28 72 61 6e 64 6f 6d 62  , length(randomb
2300: 6c 6f 62 28 2d 35 29 29 2c 0a 20 20 20 20 20 20  lob(-5)),.      
2310: 20 20 20 20 20 6c 65 6e 67 74 68 28 72 61 6e 64       length(rand
2320: 6f 6d 62 6c 6f 62 28 32 30 30 30 29 29 0a 20 20  omblob(2000)).  
2330: 7d 0a 7d 20 7b 33 32 20 31 20 32 30 30 30 7d 0a  }.} {32 1 2000}.
2340: 0a 23 20 54 68 65 20 22 68 65 78 28 29 22 20 66  .# The "hex()" f
2350: 75 6e 63 74 69 6f 6e 20 77 61 73 20 61 64 64 65  unction was adde
2360: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  d in order to be
2370: 20 61 62 6c 65 20 74 6f 20 72 65 6e 64 65 72 20   able to render 
2380: 62 6c 6f 62 73 0a 23 20 67 65 6e 65 72 61 74 65  blobs.# generate
2390: 64 20 62 79 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  d by randomblob(
23a0: 29 2e 20 20 53 6f 20 74 68 69 73 20 73 65 65 6d  ).  So this seem
23b0: 73 20 6c 69 6b 65 20 61 20 67 6f 6f 64 20 70 6c  s like a good pl
23c0: 61 63 65 20 74 6f 20 74 65 73 74 0a 23 20 68 65  ace to test.# he
23d0: 78 28 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66  x()..#.do_test f
23e0: 75 6e 63 2d 39 2e 31 30 20 7b 0a 20 20 65 78 65  unc-9.10 {.  exe
23f0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 68 65 78  csql {SELECT hex
2400: 28 78 27 30 30 31 31 32 32 33 33 34 34 35 35 36  (x'0011223344556
2410: 36 37 37 38 38 39 39 61 41 62 42 63 43 64 44 65  6778899aAbBcCdDe
2420: 45 66 46 27 29 7d 0a 7d 20 7b 30 30 31 31 32 32  EfF')}.} {001122
2430: 33 33 34 34 35 35 36 36 37 37 38 38 39 39 41 41  33445566778899AA
2440: 42 42 43 43 44 44 45 45 46 46 7d 0a 0a 23 20 55  BBCCDDEEFF}..# U
2450: 73 65 20 74 68 65 20 22 73 71 6c 69 74 65 5f 72  se the "sqlite_r
2460: 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e  egister_test_fun
2470: 63 74 69 6f 6e 22 20 54 43 4c 20 63 6f 6d 6d 61  ction" TCL comma
2480: 6e 64 20 77 68 69 63 68 20 69 73 20 70 61 72 74  nd which is part
2490: 20 6f 66 0a 23 20 74 68 65 20 74 65 78 74 20 66   of.# the text f
24a0: 69 78 74 75 72 65 20 69 6e 20 6f 72 64 65 72 20  ixture in order 
24b0: 74 6f 20 76 65 72 69 66 79 20 63 6f 72 72 65 63  to verify correc
24c0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 73  t operation of s
24d0: 6f 6d 65 20 6f 66 0a 23 20 74 68 65 20 75 73 65  ome of.# the use
24e0: 72 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75  r-defined SQL fu
24f0: 6e 63 74 69 6f 6e 20 41 50 49 73 20 74 68 61 74  nction APIs that
2500: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79   are not used by
2510: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 0a 23 20   the built-in.# 
2520: 66 75 6e 63 74 69 6f 6e 73 2e 0a 23 0a 73 65 74  functions..#.set
2530: 20 3a 3a 44 42 20 5b 73 71 6c 69 74 65 33 5f 63   ::DB [sqlite3_c
2540: 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65  onnection_pointe
2550: 72 20 64 62 5d 0a 73 71 6c 69 74 65 5f 72 65 67  r db].sqlite_reg
2560: 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74  ister_test_funct
2570: 69 6f 6e 20 24 3a 3a 44 42 20 74 65 73 74 66 75  ion $::DB testfu
2580: 6e 63 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  nc.do_test func-
2590: 31 30 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71  10.1 {.  catchsq
25a0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74  l {.    SELECT t
25b0: 65 73 74 66 75 6e 63 28 4e 55 4c 4c 2c 4e 55 4c  estfunc(NULL,NUL
25c0: 4c 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 66 69  L);.  }.} {1 {fi
25d0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  rst argument sho
25e0: 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 69  uld be one of: i
25f0: 6e 74 20 69 6e 74 36 34 20 73 74 72 69 6e 67 20  nt int64 string 
2600: 64 6f 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75  double null valu
2610: 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  e}}.do_test func
2620: 2d 31 30 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -10.2 {.  execsq
2630: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74  l {.    SELECT t
2640: 65 73 74 66 75 6e 63 28 0a 20 20 20 20 20 27 73  estfunc(.     's
2650: 74 72 69 6e 67 27 2c 20 27 61 62 63 64 65 66 67  tring', 'abcdefg
2660: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
2670: 78 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d  xyzABCDEFGHIJKLM
2680: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 27 2c 0a  NOPQRSTUVWXYZ',.
2690: 20 20 20 20 20 27 69 6e 74 27 2c 20 31 32 33 34       'int', 1234
26a0: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 31  .    );.  }.} {1
26b0: 32 33 34 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  234}.do_test fun
26c0: 63 2d 31 30 2e 33 20 7b 0a 20 20 65 78 65 63 73  c-10.3 {.  execs
26d0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
26e0: 74 65 73 74 66 75 6e 63 28 0a 20 20 20 20 20 27  testfunc(.     '
26f0: 73 74 72 69 6e 67 27 2c 20 27 61 62 63 64 65 66  string', 'abcdef
2700: 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
2710: 77 78 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c  wxyzABCDEFGHIJKL
2720: 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 27 2c  MNOPQRSTUVWXYZ',
2730: 0a 20 20 20 20 20 27 73 74 72 69 6e 67 27 2c 20  .     'string', 
2740: 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  NULL.    );.  }.
2750: 7d 20 7b 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  } {{}}.do_test f
2760: 75 6e 63 2d 31 30 2e 34 20 7b 0a 20 20 65 78 65  unc-10.4 {.  exe
2770: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2780: 54 20 74 65 73 74 66 75 6e 63 28 0a 20 20 20 20  T testfunc(.    
2790: 20 27 73 74 72 69 6e 67 27 2c 20 27 61 62 63 64   'string', 'abcd
27a0: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
27b0: 75 76 77 78 79 7a 41 42 43 44 45 46 47 48 49 4a  uvwxyzABCDEFGHIJ
27c0: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
27d0: 27 2c 0a 20 20 20 20 20 27 64 6f 75 62 6c 65 27  ',.     'double'
27e0: 2c 20 31 2e 32 33 34 0a 20 20 20 20 29 3b 0a 20  , 1.234.    );. 
27f0: 20 7d 0a 7d 20 7b 31 2e 32 33 34 7d 0a 64 6f 5f   }.} {1.234}.do_
2800: 74 65 73 74 20 66 75 6e 63 2d 31 30 2e 35 20 7b  test func-10.5 {
2810: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2820: 20 53 45 4c 45 43 54 20 74 65 73 74 66 75 6e 63   SELECT testfunc
2830: 28 0a 20 20 20 20 20 27 73 74 72 69 6e 67 27 2c  (.     'string',
2840: 20 27 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   'abcdefghijklmn
2850: 6f 70 71 72 73 74 75 76 77 78 79 7a 41 42 43 44  opqrstuvwxyzABCD
2860: 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
2870: 55 56 57 58 59 5a 27 2c 0a 20 20 20 20 20 27 69  UVWXYZ',.     'i
2880: 6e 74 27 2c 20 31 32 33 34 2c 0a 20 20 20 20 20  nt', 1234,.     
2890: 27 73 74 72 69 6e 67 27 2c 20 27 61 62 63 64 65  'string', 'abcde
28a0: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
28b0: 76 77 78 79 7a 41 42 43 44 45 46 47 48 49 4a 4b  vwxyzABCDEFGHIJK
28c0: 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 27  LMNOPQRSTUVWXYZ'
28d0: 2c 0a 20 20 20 20 20 27 73 74 72 69 6e 67 27 2c  ,.     'string',
28e0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 27 73 74 72   NULL,.     'str
28f0: 69 6e 67 27 2c 20 27 61 62 63 64 65 66 67 68 69  ing', 'abcdefghi
2900: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
2910: 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  zABCDEFGHIJKLMNO
2920: 50 51 52 53 54 55 56 57 58 59 5a 27 2c 0a 20 20  PQRSTUVWXYZ',.  
2930: 20 20 20 27 64 6f 75 62 6c 65 27 2c 20 31 2e 32     'double', 1.2
2940: 33 34 2c 0a 20 20 20 20 20 27 73 74 72 69 6e 67  34,.     'string
2950: 27 2c 20 27 61 62 63 64 65 66 67 68 69 6a 6b 6c  ', 'abcdefghijkl
2960: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 41 42  mnopqrstuvwxyzAB
2970: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
2980: 53 54 55 56 57 58 59 5a 27 2c 0a 20 20 20 20 20  STUVWXYZ',.     
2990: 27 69 6e 74 27 2c 20 31 32 33 34 2c 0a 20 20 20  'int', 1234,.   
29a0: 20 20 27 73 74 72 69 6e 67 27 2c 20 27 61 62 63    'string', 'abc
29b0: 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
29c0: 74 75 76 77 78 79 7a 41 42 43 44 45 46 47 48 49  tuvwxyzABCDEFGHI
29d0: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
29e0: 5a 27 2c 0a 20 20 20 20 20 27 73 74 72 69 6e 67  Z',.     'string
29f0: 27 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 27 73  ', NULL,.     's
2a00: 74 72 69 6e 67 27 2c 20 27 61 62 63 64 65 66 67  tring', 'abcdefg
2a10: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
2a20: 78 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d  xyzABCDEFGHIJKLM
2a30: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 27 2c 0a  NOPQRSTUVWXYZ',.
2a40: 20 20 20 20 20 27 64 6f 75 62 6c 65 27 2c 20 31       'double', 1
2a50: 2e 32 33 34 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  .234.    );.  }.
2a60: 7d 20 7b 31 2e 32 33 34 7d 0a 0a 23 20 54 65 73  } {1.234}..# Tes
2a70: 74 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 73  t the built-in s
2a80: 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 28 2a 29  qlite_version(*)
2a90: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 23   SQL function..#
2aa0: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 31  .do_test func-11
2ab0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
2ac0: 0a 20 20 20 20 53 45 4c 45 43 54 20 73 71 6c 69  .    SELECT sqli
2ad0: 74 65 5f 76 65 72 73 69 6f 6e 28 2a 29 3b 0a 20  te_version(*);. 
2ae0: 20 7d 0a 7d 20 5b 73 71 6c 69 74 65 33 20 2d 76   }.} [sqlite3 -v
2af0: 65 72 73 69 6f 6e 5d 0a 0a 23 20 54 65 73 74 20  ersion]..# Test 
2b00: 74 68 61 74 20 64 65 73 74 72 75 63 74 6f 72 73  that destructors
2b10: 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
2b20: 65 33 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  e3 by calls to s
2b30: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
2b40: 78 74 28 29 0a 23 20 65 74 63 2e 20 61 72 65 20  xt().# etc. are 
2b50: 63 61 6c 6c 65 64 2e 20 54 68 65 73 65 20 74 65  called. These te
2b60: 73 74 73 20 75 73 65 20 74 77 6f 20 73 70 65 63  sts use two spec
2b70: 69 61 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ial user-defined
2b80: 20 66 75 6e 63 74 69 6f 6e 73 0a 23 20 28 69 6d   functions.# (im
2b90: 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 66 75 6e  plemented in fun
2ba0: 63 2e 63 29 20 6f 6e 6c 79 20 61 76 61 69 6c 61  c.c) only availa
2bb0: 62 6c 65 20 69 6e 20 74 65 73 74 20 62 75 69 6c  ble in test buil
2bc0: 64 73 2e 20 0a 23 0a 23 20 46 75 6e 63 74 69 6f  ds. .#.# Functio
2bd0: 6e 20 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f  n test_destructo
2be0: 72 28 29 20 74 61 6b 65 73 20 6f 6e 65 20 61 72  r() takes one ar
2bf0: 67 75 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72  gument and retur
2c00: 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ns a copy of the
2c10: 0a 23 20 74 65 78 74 20 66 6f 72 6d 20 6f 66 20  .# text form of 
2c20: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 2e 20 41  that argument. A
2c30: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 61   destructor is a
2c40: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2c50: 68 65 20 72 65 74 75 72 6e 0a 23 20 76 61 6c 75  he return.# valu
2c60: 65 2e 20 46 75 6e 63 74 69 6f 6e 20 74 65 73 74  e. Function test
2c70: 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e  _destructor_coun
2c80: 74 28 29 20 72 65 74 75 72 6e 73 20 74 68 65 20  t() returns the 
2c90: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  number of outsta
2ca0: 6e 64 69 6e 67 0a 23 20 64 65 73 74 72 75 63 74  nding.# destruct
2cb0: 6f 72 20 63 61 6c 6c 73 20 66 6f 72 20 76 61 6c  or calls for val
2cc0: 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ues returned by 
2cd0: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 28  test_destructor(
2ce0: 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e  )..#.do_test fun
2cf0: 63 2d 31 32 2e 31 20 7b 0a 20 20 65 78 65 63 73  c-12.1 {.  execs
2d00: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2d10: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 28  test_destructor(
2d20: 27 68 65 6c 6c 6f 20 77 6f 72 6c 64 27 29 2c 20  'hello world'), 
2d30: 74 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  test_destructor_
2d40: 63 6f 75 6e 74 28 29 3b 0a 20 20 7d 0a 7d 20 7b  count();.  }.} {
2d50: 7b 68 65 6c 6c 6f 20 77 6f 72 6c 64 7d 20 31 7d  {hello world} 1}
2d60: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 32  .do_test func-12
2d70: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
2d80: 0a 20 20 20 20 53 45 4c 45 43 54 20 74 65 73 74  .    SELECT test
2d90: 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e  _destructor_coun
2da0: 74 28 29 3b 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 64  t();.  }.} {0}.d
2db0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 32 2e 33  o_test func-12.3
2dc0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2dd0: 20 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f 64     SELECT test_d
2de0: 65 73 74 72 75 63 74 6f 72 28 27 68 65 6c 6c 6f  estructor('hello
2df0: 27 29 7c 7c 27 20 77 6f 72 6c 64 27 2c 20 74 65  ')||' world', te
2e00: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  st_destructor_co
2e10: 75 6e 74 28 29 3b 0a 20 20 7d 0a 7d 20 7b 7b 68  unt();.  }.} {{h
2e20: 65 6c 6c 6f 20 77 6f 72 6c 64 7d 20 30 7d 0a 64  ello world} 0}.d
2e30: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 32 2e 34  o_test func-12.4
2e40: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2e50: 20 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f 64     SELECT test_d
2e60: 65 73 74 72 75 63 74 6f 72 5f 63 6f 75 6e 74 28  estructor_count(
2e70: 29 3b 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f  );.  }.} {0}.do_
2e80: 74 65 73 74 20 66 75 6e 63 2d 31 32 2e 35 20 7b  test func-12.5 {
2e90: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2ea0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34   CREATE TABLE t4
2eb0: 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (x);.    INSERT 
2ec0: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 74  INTO t4 VALUES(t
2ed0: 65 73 74 5f 64 65 73 74 72 75 63 74 6f 72 28 27  est_destructor('
2ee0: 68 65 6c 6c 6f 27 29 29 3b 0a 20 20 20 20 49 4e  hello'));.    IN
2ef0: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
2f00: 55 45 53 28 74 65 73 74 5f 64 65 73 74 72 75 63  UES(test_destruc
2f10: 74 6f 72 28 27 77 6f 72 6c 64 27 29 29 3b 0a 20  tor('world'));. 
2f20: 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 74 65     SELECT min(te
2f30: 73 74 5f 64 65 73 74 72 75 63 74 6f 72 28 78 29  st_destructor(x)
2f40: 29 2c 20 6d 61 78 28 74 65 73 74 5f 64 65 73 74  ), max(test_dest
2f50: 72 75 63 74 6f 72 28 78 29 29 20 46 52 4f 4d 20  ructor(x)) FROM 
2f60: 74 34 3b 0a 20 20 7d 0a 7d 20 7b 68 65 6c 6c 6f  t4;.  }.} {hello
2f70: 20 77 6f 72 6c 64 7d 0a 64 6f 5f 74 65 73 74 20   world}.do_test 
2f80: 66 75 6e 63 2d 31 32 2e 36 20 7b 0a 20 20 65 78  func-12.6 {.  ex
2f90: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
2fa0: 43 54 20 74 65 73 74 5f 64 65 73 74 72 75 63 74  CT test_destruct
2fb0: 6f 72 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 7d 0a  or_count();.  }.
2fc0: 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 66 75  } {0}.do_test fu
2fd0: 6e 63 2d 31 32 2e 37 20 7b 0a 20 20 65 78 65 63  nc-12.7 {.  exec
2fe0: 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54  sql {.    DROP T
2ff0: 41 42 4c 45 20 74 34 3b 0a 20 20 7d 0a 7d 20 7b  ABLE t4;.  }.} {
3000: 7d 0a 0a 23 20 54 65 73 74 20 74 68 61 74 20 74  }..# Test that t
3010: 68 65 20 61 75 78 64 61 74 61 20 41 50 49 20 66  he auxdata API f
3020: 6f 72 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  or scalar functi
3030: 6f 6e 73 20 77 6f 72 6b 73 2e 20 54 68 69 73 20  ons works. This 
3040: 74 65 73 74 20 75 73 65 73 0a 23 20 61 20 73 70  test uses.# a sp
3050: 65 63 69 61 6c 20 75 73 65 72 2d 64 65 66 69 6e  ecial user-defin
3060: 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79  ed function only
3070: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 65   available in te
3080: 73 74 20 62 75 69 6c 64 73 2c 0a 23 20 74 65 73  st builds,.# tes
3090: 74 5f 61 75 78 64 61 74 61 28 29 2e 20 46 75 6e  t_auxdata(). Fun
30a0: 63 74 69 6f 6e 20 74 65 73 74 5f 61 75 78 64 61  ction test_auxda
30b0: 74 61 28 29 20 74 61 6b 65 73 20 61 6e 79 20 6e  ta() takes any n
30c0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
30d0: 74 73 2e 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  ts..do_test func
30e0: 2d 31 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -13.1 {.  execsq
30f0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74  l {.    SELECT t
3100: 65 73 74 5f 61 75 78 64 61 74 61 28 27 68 65 6c  est_auxdata('hel
3110: 6c 6f 20 77 6f 72 6c 64 27 29 3b 0a 20 20 7d 0a  lo world');.  }.
3120: 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 66  } {0}..do_test f
3130: 75 6e 63 2d 31 33 2e 32 20 7b 0a 20 20 65 78 65  unc-13.2 {.  exe
3140: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
3150: 45 20 54 41 42 4c 45 20 74 34 28 61 2c 20 62 29  E TABLE t4(a, b)
3160: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
3170: 4f 20 74 34 20 56 41 4c 55 45 53 28 27 61 62 63  O t4 VALUES('abc
3180: 27 2c 20 27 64 65 66 27 29 3b 0a 20 20 20 20 49  ', 'def');.    I
3190: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
31a0: 4c 55 45 53 28 27 67 68 69 27 2c 20 27 6a 6b 6c  LUES('ghi', 'jkl
31b0: 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ');.  }.} {}.do_
31c0: 74 65 73 74 20 66 75 6e 63 2d 31 33 2e 33 20 7b  test func-13.3 {
31d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
31e0: 20 53 45 4c 45 43 54 20 74 65 73 74 5f 61 75 78   SELECT test_aux
31f0: 64 61 74 61 28 27 68 65 6c 6c 6f 20 77 6f 72 6c  data('hello worl
3200: 64 27 29 20 46 52 4f 4d 20 74 34 3b 0a 20 20 7d  d') FROM t4;.  }
3210: 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73 74  .} {0 1}.do_test
3220: 20 66 75 6e 63 2d 31 33 2e 34 20 7b 0a 20 20 65   func-13.4 {.  e
3230: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
3240: 45 43 54 20 74 65 73 74 5f 61 75 78 64 61 74 61  ECT test_auxdata
3250: 28 27 68 65 6c 6c 6f 20 77 6f 72 6c 64 27 2c 20  ('hello world', 
3260: 31 32 33 29 20 46 52 4f 4d 20 74 34 3b 0a 20 20  123) FROM t4;.  
3270: 7d 0a 7d 20 7b 7b 30 20 30 7d 20 7b 31 20 31 7d  }.} {{0 0} {1 1}
3280: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31  }.do_test func-1
3290: 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.5 {.  execsql 
32a0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 65 73  {.    SELECT tes
32b0: 74 5f 61 75 78 64 61 74 61 28 27 68 65 6c 6c 6f  t_auxdata('hello
32c0: 20 77 6f 72 6c 64 27 2c 20 61 29 20 46 52 4f 4d   world', a) FROM
32d0: 20 74 34 3b 0a 20 20 7d 0a 7d 20 7b 7b 30 20 30   t4;.  }.} {{0 0
32e0: 7d 20 7b 31 20 30 7d 7d 0a 64 6f 5f 74 65 73 74  } {1 0}}.do_test
32f0: 20 66 75 6e 63 2d 31 33 2e 36 20 7b 0a 20 20 65   func-13.6 {.  e
3300: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
3310: 45 43 54 20 74 65 73 74 5f 61 75 78 64 61 74 61  ECT test_auxdata
3320: 28 27 68 65 6c 6c 6f 27 7c 7c 27 77 6f 72 6c 64  ('hello'||'world
3330: 27 2c 20 61 29 20 46 52 4f 4d 20 74 34 3b 0a 20  ', a) FROM t4;. 
3340: 20 7d 0a 7d 20 7b 7b 30 20 30 7d 20 7b 31 20 30   }.} {{0 0} {1 0
3350: 7d 7d 0a 0a 23 20 54 65 73 74 20 74 68 61 74 20  }}..# Test that 
3360: 61 75 78 69 6c 61 72 79 20 64 61 74 61 20 69 73  auxilary data is
3370: 20 70 72 65 73 65 72 76 65 64 20 62 65 74 77 65   preserved betwe
3380: 65 6e 20 63 61 6c 6c 73 20 66 6f 72 20 53 51 4c  en calls for SQL
3390: 20 76 61 72 69 61 62 6c 65 73 2e 0a 64 6f 5f 74   variables..do_t
33a0: 65 73 74 20 66 75 6e 63 2d 31 33 2e 37 20 7b 0a  est func-13.7 {.
33b0: 20 20 73 65 74 20 44 42 20 5b 73 71 6c 69 74 65    set DB [sqlite
33c0: 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69  3_connection_poi
33d0: 6e 74 65 72 20 64 62 5d 0a 20 20 73 65 74 20 73  nter db].  set s
33e0: 71 6c 20 22 53 45 4c 45 43 54 20 74 65 73 74 5f  ql "SELECT test_
33f0: 61 75 78 64 61 74 61 28 20 3f 20 2c 20 61 20 29  auxdata( ? , a )
3400: 20 46 52 4f 4d 20 74 34 3b 22 0a 20 20 73 65 74   FROM t4;".  set
3410: 20 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f 70   STMT [sqlite3_p
3420: 72 65 70 61 72 65 20 24 44 42 20 24 73 71 6c 20  repare $DB $sql 
3430: 2d 31 20 54 41 49 4c 5d 0a 20 20 73 71 6c 69 74  -1 TAIL].  sqlit
3440: 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 24 53 54  e3_bind_text $ST
3450: 4d 54 20 31 20 68 65 6c 6c 6f 20 2d 31 0a 20 20  MT 1 hello -1.  
3460: 73 65 74 20 72 65 73 20 5b 6c 69 73 74 5d 0a 20  set res [list]. 
3470: 20 77 68 69 6c 65 20 7b 20 22 53 51 4c 49 54 45   while { "SQLITE
3480: 5f 52 4f 57 22 3d 3d 5b 73 71 6c 69 74 65 33 5f  _ROW"==[sqlite3_
3490: 73 74 65 70 20 24 53 54 4d 54 5d 20 7d 20 7b 0a  step $STMT] } {.
34a0: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 20      lappend res 
34b0: 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  [sqlite3_column_
34c0: 74 65 78 74 20 24 53 54 4d 54 20 30 5d 0a 20 20  text $STMT 0].  
34d0: 7d 0a 20 20 6c 61 70 70 65 6e 64 20 72 65 73 20  }.  lappend res 
34e0: 5b 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a  [sqlite3_finaliz
34f0: 65 20 24 53 54 4d 54 5d 0a 7d 20 7b 7b 30 20 30  e $STMT].} {{0 0
3500: 7d 20 7b 31 20 30 7d 20 53 51 4c 49 54 45 5f 4f  } {1 0} SQLITE_O
3510: 4b 7d 0a 0a 23 20 4d 61 6b 65 20 73 75 72 65 20  K}..# Make sure 
3520: 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  that a function 
3530: 77 69 74 68 20 61 20 76 65 72 79 20 6c 6f 6e 67  with a very long
3540: 20 6e 61 6d 65 20 69 73 20 72 65 6a 65 63 74 65   name is rejecte
3550: 64 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31  d.do_test func-1
3560: 34 2e 31 20 7b 0a 20 20 63 61 74 63 68 20 7b 0a  4.1 {.  catch {.
3570: 20 20 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20      db function 
3580: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 58  [string repeat X
3590: 20 32 35 34 5d 20 7b 72 65 74 75 72 6e 20 22 68   254] {return "h
35a0: 65 6c 6c 6f 22 7d 0a 20 20 7d 20 0a 7d 20 7b 30  ello"}.  } .} {0
35b0: 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31  }.do_test func-1
35c0: 34 2e 32 20 7b 0a 20 20 63 61 74 63 68 20 7b 0a  4.2 {.  catch {.
35d0: 20 20 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20      db function 
35e0: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 58  [string repeat X
35f0: 20 32 35 36 5d 20 7b 72 65 74 75 72 6e 20 22 68   256] {return "h
3600: 65 6c 6c 6f 22 7d 0a 20 20 7d 0a 7d 20 7b 31 7d  ello"}.  }.} {1}
3610: 0a 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31  ..do_test func-1
3620: 35 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  5.1 {.  catchsql
3630: 20 7b 0a 20 20 20 20 73 65 6c 65 63 74 20 74 65   {.    select te
3640: 73 74 5f 65 72 72 6f 72 28 4e 55 4c 4c 29 3b 0a  st_error(NULL);.
3650: 20 20 7d 0a 7d 20 7b 31 20 7b 7d 7d 0a 0a 23 20    }.} {1 {}}..# 
3660: 54 65 73 74 20 74 68 65 20 71 75 6f 74 65 20 66  Test the quote f
3670: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 42 4c 4f 42  unction for BLOB
3680: 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73   and NULL values
3690: 2e 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31  ..do_test func-1
36a0: 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.1 {.  execsql 
36b0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
36c0: 4c 45 20 74 62 6c 32 28 61 2c 20 62 29 3b 0a 20  LE tbl2(a, b);. 
36d0: 20 7d 0a 20 20 73 65 74 20 53 54 4d 54 20 5b 73   }.  set STMT [s
36e0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 24  qlite3_prepare $
36f0: 3a 3a 44 42 20 22 49 4e 53 45 52 54 20 49 4e 54  ::DB "INSERT INT
3700: 4f 20 74 62 6c 32 20 56 41 4c 55 45 53 28 3f 2c  O tbl2 VALUES(?,
3710: 20 3f 29 22 20 2d 31 20 54 41 49 4c 5d 0a 20 20   ?)" -1 TAIL].  
3720: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
3730: 62 20 24 3a 3a 53 54 4d 54 20 31 20 61 62 63 20  b $::STMT 1 abc 
3740: 33 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  3.  sqlite3_step
3750: 20 24 3a 3a 53 54 4d 54 0a 20 20 73 71 6c 69 74   $::STMT.  sqlit
3760: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53  e3_finalize $::S
3770: 54 4d 54 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  TMT.  execsql {.
3780: 20 20 20 20 53 45 4c 45 43 54 20 71 75 6f 74 65      SELECT quote
3790: 28 61 29 2c 20 71 75 6f 74 65 28 62 29 20 46 52  (a), quote(b) FR
37a0: 4f 4d 20 74 62 6c 32 3b 0a 20 20 7d 0a 7d 20 7b  OM tbl2;.  }.} {
37b0: 58 27 36 31 36 32 36 33 27 20 4e 55 4c 4c 7d 0a  X'616263' NULL}.
37c0: 0a 23 20 43 6f 72 72 65 63 74 6c 79 20 68 61 6e  .# Correctly han
37d0: 64 6c 65 20 66 75 6e 63 74 69 6f 6e 20 65 72 72  dle function err
37e0: 6f 72 20 6d 65 73 73 61 67 65 73 20 74 68 61 74  or messages that
37f0: 20 69 6e 63 6c 75 64 65 20 25 2e 20 20 54 69 63   include %.  Tic
3800: 6b 65 74 20 23 31 33 35 34 0a 23 0a 64 6f 5f 74  ket #1354.#.do_t
3810: 65 73 74 20 66 75 6e 63 2d 31 37 2e 31 20 7b 0a  est func-17.1 {.
3820: 20 20 70 72 6f 63 20 74 65 73 74 66 75 6e 63 31    proc testfunc1
3830: 20 61 72 67 73 20 7b 65 72 72 6f 72 20 22 45 72   args {error "Er
3840: 72 6f 72 20 25 64 20 77 69 74 68 20 25 73 20 70  ror %d with %s p
3850: 65 72 63 65 6e 74 73 20 25 70 22 7d 0a 20 20 64  ercents %p"}.  d
3860: 62 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 66  b function testf
3870: 75 6e 63 31 20 3a 3a 74 65 73 74 66 75 6e 63 31  unc1 ::testfunc1
3880: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
3890: 20 20 53 45 4c 45 43 54 20 74 65 73 74 66 75 6e    SELECT testfun
38a0: 63 31 28 31 2c 32 2c 33 29 3b 0a 20 20 7d 0a 7d  c1(1,2,3);.  }.}
38b0: 20 7b 31 20 7b 45 72 72 6f 72 20 25 64 20 77 69   {1 {Error %d wi
38c0: 74 68 20 25 73 20 70 65 72 63 65 6e 74 73 20 25  th %s percents %
38d0: 70 7d 7d 0a 0a 23 20 54 68 65 20 53 55 4d 20 66  p}}..# The SUM f
38e0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 72  unction should r
38f0: 65 74 75 72 6e 20 69 6e 74 65 67 65 72 20 72 65  eturn integer re
3900: 73 75 6c 74 73 20 77 68 65 6e 20 61 6c 6c 20 69  sults when all i
3910: 6e 70 75 74 73 20 61 72 65 20 69 6e 74 65 67 65  nputs are intege
3920: 72 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e  r..#.do_test fun
3930: 63 2d 31 38 2e 31 20 7b 0a 20 20 65 78 65 63 73  c-18.1 {.  execs
3940: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
3950: 54 41 42 4c 45 20 74 35 28 78 29 3b 0a 20 20 20  TABLE t5(x);.   
3960: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20   INSERT INTO t5 
3970: 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 49  VALUES(1);.    I
3980: 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41  NSERT INTO t5 VA
3990: 4c 55 45 53 28 2d 39 39 29 3b 0a 20 20 20 20 49  LUES(-99);.    I
39a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41  NSERT INTO t5 VA
39b0: 4c 55 45 53 28 31 30 30 30 30 29 3b 0a 20 20 20  LUES(10000);.   
39c0: 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 20 46   SELECT sum(x) F
39d0: 52 4f 4d 20 74 35 3b 0a 20 20 7d 0a 7d 20 7b 39  ROM t5;.  }.} {9
39e0: 39 30 32 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  902}.do_test fun
39f0: 63 2d 31 38 2e 32 20 7b 0a 20 20 65 78 65 63 73  c-18.2 {.  execs
3a00: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
3a10: 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 30  INTO t5 VALUES(0
3a20: 2e 30 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  .0);.    SELECT 
3a30: 73 75 6d 28 78 29 20 46 52 4f 4d 20 74 35 3b 0a  sum(x) FROM t5;.
3a40: 20 20 7d 0a 7d 20 7b 39 39 30 32 2e 30 7d 0a 0a    }.} {9902.0}..
3a50: 23 20 54 68 65 20 73 75 6d 20 6f 66 20 6e 6f 74  # The sum of not
3a60: 68 69 6e 67 20 69 73 20 4e 55 4c 4c 2e 20 20 42  hing is NULL.  B
3a70: 75 74 20 74 68 65 20 73 75 6d 20 6f 66 20 61 6c  ut the sum of al
3a80: 6c 20 4e 55 4c 4c 73 20 69 73 20 4e 55 4c 4c 2e  l NULLs is NULL.
3a90: 0a 23 0a 23 20 54 68 65 20 54 4f 54 41 4c 20 6f  .#.# The TOTAL o
3aa0: 66 20 6e 6f 74 68 69 6e 67 20 69 73 20 30 2e 30  f nothing is 0.0
3ab0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  ..#.do_test func
3ac0: 2d 31 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -18.3 {.  execsq
3ad0: 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
3ae0: 52 4f 4d 20 74 35 3b 0a 20 20 20 20 53 45 4c 45  ROM t5;.    SELE
3af0: 43 54 20 73 75 6d 28 78 29 2c 20 74 6f 74 61 6c  CT sum(x), total
3b00: 28 78 29 20 46 52 4f 4d 20 74 35 3b 0a 20 20 7d  (x) FROM t5;.  }
3b10: 0a 7d 20 7b 7b 7d 20 30 2e 30 7d 0a 64 6f 5f 74  .} {{} 0.0}.do_t
3b20: 65 73 74 20 66 75 6e 63 2d 31 38 2e 34 20 7b 0a  est func-18.4 {.
3b30: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3b40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56  INSERT INTO t5 V
3b50: 41 4c 55 45 53 28 4e 55 4c 4c 29 3b 0a 20 20 20  ALUES(NULL);.   
3b60: 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 2c 20   SELECT sum(x), 
3b70: 74 6f 74 61 6c 28 78 29 20 46 52 4f 4d 20 74 35  total(x) FROM t5
3b80: 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 30 2e 30 7d 0a  .  }.} {{} 0.0}.
3b90: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e  do_test func-18.
3ba0: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
3bb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3bc0: 74 35 20 56 41 4c 55 45 53 28 4e 55 4c 4c 29 3b  t5 VALUES(NULL);
3bd0: 0a 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28  .    SELECT sum(
3be0: 78 29 2c 20 74 6f 74 61 6c 28 78 29 20 46 52 4f  x), total(x) FRO
3bf0: 4d 20 74 35 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 30  M t5.  }.} {{} 0
3c00: 2e 30 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  .0}.do_test func
3c10: 2d 31 38 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  -18.6 {.  execsq
3c20: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
3c30: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 31 32  NTO t5 VALUES(12
3c40: 33 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 73  3);.    SELECT s
3c50: 75 6d 28 78 29 2c 20 74 6f 74 61 6c 28 78 29 20  um(x), total(x) 
3c60: 46 52 4f 4d 20 74 35 0a 20 20 7d 0a 7d 20 7b 31  FROM t5.  }.} {1
3c70: 32 33 20 31 32 33 2e 30 7d 0a 0a 23 20 54 69 63  23 123.0}..# Tic
3c80: 6b 65 74 20 23 31 36 36 34 2c 20 23 31 36 36 39  ket #1664, #1669
3c90: 2c 20 23 31 36 37 30 2c 20 23 31 36 37 34 3a 20  , #1670, #1674: 
3ca0: 41 6e 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66  An integer overf
3cb0: 6c 6f 77 20 6f 6e 20 53 55 4d 20 63 61 75 73 65  low on SUM cause
3cc0: 73 0a 23 20 61 6e 20 65 72 72 6f 72 2e 20 54 68  s.# an error. Th
3cd0: 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 54  e non-standard T
3ce0: 4f 54 41 4c 28 29 20 66 75 6e 63 74 69 6f 6e 20  OTAL() function 
3cf0: 63 6f 6e 74 69 6e 75 65 73 20 74 6f 20 67 69 76  continues to giv
3d00: 65 20 61 20 68 65 6c 70 66 75 6c 0a 23 20 72 65  e a helpful.# re
3d10: 73 75 6c 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  sult..#.do_test 
3d20: 66 75 6e 63 2d 31 38 2e 31 30 20 7b 0a 20 20 65  func-18.10 {.  e
3d30: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
3d40: 41 54 45 20 54 41 42 4c 45 20 74 36 28 78 20 49  ATE TABLE t6(x I
3d50: 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 49 4e 53  NTEGER);.    INS
3d60: 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55  ERT INTO t6 VALU
3d70: 45 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  ES(1);.    INSER
3d80: 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53  T INTO t6 VALUES
3d90: 28 31 3c 3c 36 32 29 3b 0a 20 20 20 20 53 45 4c  (1<<62);.    SEL
3da0: 45 43 54 20 73 75 6d 28 78 29 20 2d 20 28 28 31  ECT sum(x) - ((1
3db0: 3c 3c 36 32 29 2b 31 29 20 66 72 6f 6d 20 74 36  <<62)+1) from t6
3dc0: 3b 0a 20 20 7d 0a 7d 20 30 0a 64 6f 5f 74 65 73  ;.  }.} 0.do_tes
3dd0: 74 20 66 75 6e 63 2d 31 38 2e 31 31 20 7b 0a 20  t func-18.11 {. 
3de0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3df0: 45 4c 45 43 54 20 74 79 70 65 6f 66 28 73 75 6d  ELECT typeof(sum
3e00: 28 78 29 29 20 46 52 4f 4d 20 74 36 0a 20 20 7d  (x)) FROM t6.  }
3e10: 0a 7d 20 69 6e 74 65 67 65 72 0a 64 6f 5f 74 65  .} integer.do_te
3e20: 73 74 20 66 75 6e 63 2d 31 38 2e 31 32 20 7b 0a  st func-18.12 {.
3e30: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
3e40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20   INSERT INTO t6 
3e50: 56 41 4c 55 45 53 28 31 3c 3c 36 32 29 3b 0a 20  VALUES(1<<62);. 
3e60: 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29     SELECT sum(x)
3e70: 20 2d 20 28 28 31 3c 3c 36 32 29 2a 32 2e 30 2b   - ((1<<62)*2.0+
3e80: 31 29 20 66 72 6f 6d 20 74 36 3b 0a 20 20 7d 0a  1) from t6;.  }.
3e90: 7d 20 7b 31 20 7b 69 6e 74 65 67 65 72 20 6f 76  } {1 {integer ov
3ea0: 65 72 66 6c 6f 77 7d 7d 0a 64 6f 5f 74 65 73 74  erflow}}.do_test
3eb0: 20 66 75 6e 63 2d 31 38 2e 31 33 20 7b 0a 20 20   func-18.13 {.  
3ec0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
3ed0: 4c 45 43 54 20 74 6f 74 61 6c 28 78 29 20 2d 20  LECT total(x) - 
3ee0: 28 28 31 3c 3c 36 32 29 2a 32 2e 30 2b 31 29 20  ((1<<62)*2.0+1) 
3ef0: 46 52 4f 4d 20 74 36 0a 20 20 7d 0a 7d 20 30 2e  FROM t6.  }.} 0.
3f00: 30 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31  0.do_test func-1
3f10: 38 2e 31 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  8.14 {.  execsql
3f20: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 75   {.    SELECT su
3f30: 6d 28 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  m(-9223372036854
3f40: 37 37 35 38 30 35 29 3b 0a 20 20 7d 0a 7d 20 2d  775805);.  }.} -
3f50: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
3f60: 38 30 35 0a 0a 69 66 63 61 70 61 62 6c 65 20 63  805..ifcapable c
3f70: 6f 6d 70 6f 75 6e 64 26 26 73 75 62 71 75 65 72  ompound&&subquer
3f80: 79 20 7b 0a 0a 64 6f 5f 74 65 73 74 20 66 75 6e  y {..do_test fun
3f90: 63 2d 31 38 2e 31 35 20 7b 0a 20 20 63 61 74 63  c-18.15 {.  catc
3fa0: 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  hsql {.    SELEC
3fb0: 54 20 73 75 6d 28 78 29 20 46 52 4f 4d 20 0a 20  T sum(x) FROM . 
3fc0: 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 39 32        (SELECT 92
3fd0: 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
3fe0: 37 20 41 53 20 78 20 55 4e 49 4f 4e 20 41 4c 4c  7 AS x UNION ALL
3ff0: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
4000: 31 30 20 41 53 20 78 29 3b 0a 20 20 7d 0a 7d 20  10 AS x);.  }.} 
4010: 7b 31 20 7b 69 6e 74 65 67 65 72 20 6f 76 65 72  {1 {integer over
4020: 66 6c 6f 77 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  flow}}.do_test f
4030: 75 6e 63 2d 31 38 2e 31 36 20 7b 0a 20 20 63 61  unc-18.16 {.  ca
4040: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
4050: 45 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d 20  ECT sum(x) FROM 
4060: 0a 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20  .       (SELECT 
4070: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
4080: 38 30 37 20 41 53 20 78 20 55 4e 49 4f 4e 20 41  807 AS x UNION A
4090: 4c 4c 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  LL.        SELEC
40a0: 54 20 2d 31 30 20 41 53 20 78 29 3b 0a 20 20 7d  T -10 AS x);.  }
40b0: 0a 7d 20 7b 30 20 39 32 32 33 33 37 32 30 33 36  .} {0 9223372036
40c0: 38 35 34 37 37 35 37 39 37 7d 0a 64 6f 5f 74 65  854775797}.do_te
40d0: 73 74 20 66 75 6e 63 2d 31 38 2e 31 37 20 7b 0a  st func-18.17 {.
40e0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
40f0: 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 20 46   SELECT sum(x) F
4100: 52 4f 4d 20 0a 20 20 20 20 20 20 20 28 53 45 4c  ROM .       (SEL
4110: 45 43 54 20 2d 39 32 32 33 33 37 32 30 33 36 38  ECT -92233720368
4120: 35 34 37 37 35 38 30 37 20 41 53 20 78 20 55 4e  54775807 AS x UN
4130: 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 20 20  ION ALL.        
4140: 53 45 4c 45 43 54 20 31 30 20 41 53 20 78 29 3b  SELECT 10 AS x);
4150: 0a 20 20 7d 0a 7d 20 7b 30 20 2d 39 32 32 33 33  .  }.} {0 -92233
4160: 37 32 30 33 36 38 35 34 37 37 35 37 39 37 7d 0a  72036854775797}.
4170: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e  do_test func-18.
4180: 31 38 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  18 {.  catchsql 
4190: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d  {.    SELECT sum
41a0: 28 78 29 20 46 52 4f 4d 20 0a 20 20 20 20 20 20  (x) FROM .      
41b0: 20 28 53 45 4c 45 43 54 20 2d 39 32 32 33 33 37   (SELECT -922337
41c0: 32 30 33 36 38 35 34 37 37 35 38 30 37 20 41 53  2036854775807 AS
41d0: 20 78 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20   x UNION ALL.   
41e0: 20 20 20 20 20 53 45 4c 45 43 54 20 2d 31 30 20       SELECT -10 
41f0: 41 53 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20  AS x);.  }.} {1 
4200: 7b 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f  {integer overflo
4210: 77 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  w}}.do_test func
4220: 2d 31 38 2e 31 39 20 7b 0a 20 20 63 61 74 63 68  -18.19 {.  catch
4230: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
4240: 20 73 75 6d 28 78 29 20 46 52 4f 4d 20 28 53 45   sum(x) FROM (SE
4250: 4c 45 43 54 20 39 20 41 53 20 78 20 55 4e 49 4f  LECT 9 AS x UNIO
4260: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2d 31 30  N ALL SELECT -10
4270: 20 41 53 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b 30   AS x);.  }.} {0
4280: 20 2d 31 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e   -1}.do_test fun
4290: 63 2d 31 38 2e 32 30 20 7b 0a 20 20 63 61 74 63  c-18.20 {.  catc
42a0: 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  hsql {.    SELEC
42b0: 54 20 73 75 6d 28 78 29 20 46 52 4f 4d 20 28 53  T sum(x) FROM (S
42c0: 45 4c 45 43 54 20 2d 39 20 41 53 20 78 20 55 4e  ELECT -9 AS x UN
42d0: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 31  ION ALL SELECT 1
42e0: 30 20 41 53 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b  0 AS x);.  }.} {
42f0: 30 20 31 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  0 1}.do_test fun
4300: 63 2d 31 38 2e 32 31 20 7b 0a 20 20 63 61 74 63  c-18.21 {.  catc
4310: 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  hsql {.    SELEC
4320: 54 20 73 75 6d 28 78 29 20 46 52 4f 4d 20 28 53  T sum(x) FROM (S
4330: 45 4c 45 43 54 20 2d 31 30 20 41 53 20 78 20 55  ELECT -10 AS x U
4340: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
4350: 39 20 41 53 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b  9 AS x);.  }.} {
4360: 30 20 2d 31 7d 0a 64 6f 5f 74 65 73 74 20 66 75  0 -1}.do_test fu
4370: 6e 63 2d 31 38 2e 32 32 20 7b 0a 20 20 63 61 74  nc-18.22 {.  cat
4380: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  chsql {.    SELE
4390: 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d 20 28  CT sum(x) FROM (
43a0: 53 45 4c 45 43 54 20 31 30 20 41 53 20 78 20 55  SELECT 10 AS x U
43b0: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
43c0: 2d 39 20 41 53 20 78 29 3b 0a 20 20 7d 0a 7d 20  -9 AS x);.  }.} 
43d0: 7b 30 20 31 7d 0a 0a 7d 20 3b 23 20 69 66 63 61  {0 1}..} ;# ifca
43e0: 70 61 62 6c 65 20 63 6f 6d 70 6f 75 6e 64 26 26  pable compound&&
43f0: 73 75 62 71 75 65 72 79 0a 0a 23 20 49 6e 74 65  subquery..# Inte
4400: 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 6f 6e 20  ger overflow on 
4410: 61 62 73 28 29 0a 23 0a 64 6f 5f 74 65 73 74 20  abs().#.do_test 
4420: 66 75 6e 63 2d 31 38 2e 33 31 20 7b 0a 20 20 63  func-18.31 {.  c
4430: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45  atchsql {.    SE
4440: 4c 45 43 54 20 61 62 73 28 2d 39 32 32 33 33 37  LECT abs(-922337
4450: 32 30 33 36 38 35 34 37 37 35 38 30 37 29 3b 0a  2036854775807);.
4460: 20 20 7d 0a 7d 20 7b 30 20 39 32 32 33 33 37 32    }.} {0 9223372
4470: 30 33 36 38 35 34 37 37 35 38 30 37 7d 0a 64 6f  036854775807}.do
4480: 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 33 32  _test func-18.32
4490: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
44a0: 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 2d      SELECT abs(-
44b0: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
44c0: 38 30 37 2d 31 29 3b 0a 20 20 7d 0a 7d 20 7b 31  807-1);.  }.} {1
44d0: 20 7b 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c   {integer overfl
44e0: 6f 77 7d 7d 0a 0a 23 20 54 68 65 20 4d 41 54 43  ow}}..# The MATC
44f0: 48 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74  H function exist
4500: 73 20 62 75 74 20 69 73 20 6f 6e 6c 79 20 61 20  s but is only a 
4510: 73 74 75 62 20 61 6e 64 20 61 6c 77 61 79 73 20  stub and always 
4520: 74 68 72 6f 77 73 20 61 6e 20 65 72 72 6f 72 2e  throws an error.
4530: 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .#.do_test func-
4540: 31 39 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  19.1 {.  execsql
4550: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6d 61   {.    SELECT ma
4560: 74 63 68 28 61 2c 62 29 20 46 52 4f 4d 20 74 31  tch(a,b) FROM t1
4570: 20 57 48 45 52 45 20 30 3b 0a 20 20 7d 0a 7d 20   WHERE 0;.  }.} 
4580: 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  {}.do_test func-
4590: 31 39 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  19.2 {.  catchsq
45a0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 27  l {.    SELECT '
45b0: 61 62 63 27 20 4d 41 54 43 48 20 27 78 79 7a 27  abc' MATCH 'xyz'
45c0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 75 6e 61 62  ;.  }.} {1 {unab
45d0: 6c 65 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69  le to use functi
45e0: 6f 6e 20 4d 41 54 43 48 20 69 6e 20 74 68 65 20  on MATCH in the 
45f0: 72 65 71 75 65 73 74 65 64 20 63 6f 6e 74 65 78  requested contex
4600: 74 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  t}}.do_test func
4610: 2d 31 39 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  -19.3 {.  catchs
4620: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
4630: 27 61 62 63 27 20 4e 4f 54 20 4d 41 54 43 48 20  'abc' NOT MATCH 
4640: 27 78 79 7a 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20  'xyz';.  }.} {1 
4650: 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66  {unable to use f
4660: 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e  unction MATCH in
4670: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
4680: 6f 6e 74 65 78 74 7d 7d 0a 64 6f 5f 74 65 73 74  ontext}}.do_test
4690: 20 66 75 6e 63 2d 31 39 2e 34 20 7b 0a 20 20 63   func-19.4 {.  c
46a0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45  atchsql {.    SE
46b0: 4c 45 43 54 20 6d 61 74 63 68 28 31 2c 32 2c 33  LECT match(1,2,3
46c0: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 77 72 6f  );.  }.} {1 {wro
46d0: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
46e0: 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69  uments to functi
46f0: 6f 6e 20 6d 61 74 63 68 28 29 7d 7d 0a 0a 23 20  on match()}}..# 
4700: 53 6f 75 6e 64 65 78 20 74 65 73 74 73 2e 0a 23  Soundex tests..#
4710: 0a 69 66 20 7b 21 5b 63 61 74 63 68 20 7b 64 62  .if {![catch {db
4720: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 73 6f   eval {SELECT so
4730: 75 6e 64 65 78 28 27 68 65 6c 6c 6f 27 29 7d 7d  undex('hello')}}
4740: 5d 7d 20 7b 0a 20 20 73 65 74 20 69 20 30 0a 20  ]} {.  set i 0. 
4750: 20 66 6f 72 65 61 63 68 20 7b 6e 61 6d 65 20 73   foreach {name s
4760: 64 78 7d 20 7b 0a 20 20 20 20 65 75 6c 65 72 20  dx} {.    euler 
4770: 20 20 20 20 20 20 20 45 34 36 30 0a 20 20 20 20         E460.    
4780: 45 55 4c 45 52 20 20 20 20 20 20 20 20 45 34 36  EULER        E46
4790: 30 0a 20 20 20 20 45 75 6c 65 72 20 20 20 20 20  0.    Euler     
47a0: 20 20 20 45 34 36 30 0a 20 20 20 20 65 6c 6c 65     E460.    elle
47b0: 72 79 20 20 20 20 20 20 20 45 34 36 30 0a 20 20  ry       E460.  
47c0: 20 20 67 61 75 73 73 20 20 20 20 20 20 20 20 47    gauss        G
47d0: 32 30 30 0a 20 20 20 20 67 68 6f 73 68 20 20 20  200.    ghosh   
47e0: 20 20 20 20 20 47 32 30 30 0a 20 20 20 20 68 69       G200.    hi
47f0: 6c 62 65 72 74 20 20 20 20 20 20 48 34 31 36 0a  lbert      H416.
4800: 20 20 20 20 48 65 69 6c 62 72 6f 6e 6e 20 20 20      Heilbronn   
4810: 20 48 34 31 36 0a 20 20 20 20 6b 6e 75 74 68 20   H416.    knuth 
4820: 20 20 20 20 20 20 20 4b 35 33 30 0a 20 20 20 20         K530.    
4830: 6b 61 6e 74 20 20 20 20 20 20 20 20 20 4b 35 33  kant         K53
4840: 30 0a 20 20 20 20 4c 6c 6f 79 64 20 20 20 20 20  0.    Lloyd     
4850: 20 20 20 4c 33 30 30 0a 20 20 20 20 4c 41 44 44     L300.    LADD
4860: 20 20 20 20 20 20 20 20 20 4c 33 30 30 0a 20 20           L300.  
4870: 20 20 4c 75 6b 61 73 69 65 77 69 63 7a 20 20 4c    Lukasiewicz  L
4880: 32 32 32 0a 20 20 20 20 4c 69 73 73 61 6a 6f 75  222.    Lissajou
4890: 73 20 20 20 20 4c 32 32 32 0a 20 20 20 20 41 20  s    L222.    A 
48a0: 20 20 20 20 20 20 20 20 20 20 20 41 30 30 30 0a             A000.
48b0: 20 20 20 20 31 32 33 34 35 20 20 20 20 20 20 20      12345       
48c0: 20 3f 30 30 30 0a 20 20 7d 20 7b 0a 20 20 20 20   ?000.  } {.    
48d0: 69 6e 63 72 20 69 0a 20 20 20 20 64 6f 5f 74 65  incr i.    do_te
48e0: 73 74 20 66 75 6e 63 2d 32 30 2e 24 69 20 7b 0a  st func-20.$i {.
48f0: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 53        execsql {S
4900: 45 4c 45 43 54 20 73 6f 75 6e 64 65 78 28 24 6e  ELECT soundex($n
4910: 61 6d 65 29 7d 0a 20 20 20 20 7d 20 24 73 64 78  ame)}.    } $sdx
4920: 0a 20 20 7d 0a 7d 0a 0a 23 20 54 65 73 74 73 20  .  }.}..# Tests 
4930: 6f 66 20 74 68 65 20 52 45 50 4c 41 43 45 20 66  of the REPLACE f
4940: 75 6e 63 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65  unction..#.do_te
4950: 73 74 20 66 75 6e 63 2d 32 31 2e 31 20 7b 0a 20  st func-21.1 {. 
4960: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
4970: 53 45 4c 45 43 54 20 72 65 70 6c 61 63 65 28 31  SELECT replace(1
4980: 2c 32 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 77  ,2);.  }.} {1 {w
4990: 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
49a0: 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63  rguments to func
49b0: 74 69 6f 6e 20 72 65 70 6c 61 63 65 28 29 7d 7d  tion replace()}}
49c0: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 31  .do_test func-21
49d0: 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .2 {.  catchsql 
49e0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 65 70  {.    SELECT rep
49f0: 6c 61 63 65 28 31 2c 32 2c 33 2c 34 29 3b 0a 20  lace(1,2,3,4);. 
4a00: 20 7d 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 6e   }.} {1 {wrong n
4a10: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
4a20: 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 72  ts to function r
4a30: 65 70 6c 61 63 65 28 29 7d 7d 0a 64 6f 5f 74 65  eplace()}}.do_te
4a40: 73 74 20 66 75 6e 63 2d 32 31 2e 33 20 7b 0a 20  st func-21.3 {. 
4a50: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
4a60: 45 4c 45 43 54 20 74 79 70 65 6f 66 28 72 65 70  ELECT typeof(rep
4a70: 6c 61 63 65 28 22 54 68 69 73 20 69 73 20 74 68  lace("This is th
4a80: 65 20 6d 61 69 6e 20 74 65 73 74 20 73 74 72 69  e main test stri
4a90: 6e 67 22 2c 20 4e 55 4c 4c 2c 20 22 41 4c 54 22  ng", NULL, "ALT"
4aa0: 29 29 3b 0a 20 20 7d 0a 7d 20 7b 6e 75 6c 6c 7d  ));.  }.} {null}
4ab0: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 31  .do_test func-21
4ac0: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
4ad0: 0a 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65  .    SELECT type
4ae0: 6f 66 28 72 65 70 6c 61 63 65 28 4e 55 4c 4c 2c  of(replace(NULL,
4af0: 20 22 6d 61 69 6e 22 2c 20 22 41 4c 54 22 29 29   "main", "ALT"))
4b00: 3b 0a 20 20 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64  ;.  }.} {null}.d
4b10: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 31 2e 35  o_test func-21.5
4b20: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4b30: 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66     SELECT typeof
4b40: 28 72 65 70 6c 61 63 65 28 22 54 68 69 73 20 69  (replace("This i
4b50: 73 20 74 68 65 20 6d 61 69 6e 20 74 65 73 74 20  s the main test 
4b60: 73 74 72 69 6e 67 22 2c 20 22 6d 61 69 6e 22 2c  string", "main",
4b70: 20 4e 55 4c 4c 29 29 3b 0a 20 20 7d 0a 7d 20 7b   NULL));.  }.} {
4b80: 6e 75 6c 6c 7d 0a 64 6f 5f 74 65 73 74 20 66 75  null}.do_test fu
4b90: 6e 63 2d 32 31 2e 36 20 7b 0a 20 20 65 78 65 63  nc-21.6 {.  exec
4ba0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
4bb0: 20 72 65 70 6c 61 63 65 28 22 54 68 69 73 20 69   replace("This i
4bc0: 73 20 74 68 65 20 6d 61 69 6e 20 74 65 73 74 20  s the main test 
4bd0: 73 74 72 69 6e 67 22 2c 20 22 6d 61 69 6e 22 2c  string", "main",
4be0: 20 22 41 4c 54 22 29 3b 0a 20 20 7d 0a 7d 20 7b   "ALT");.  }.} {
4bf0: 7b 54 68 69 73 20 69 73 20 74 68 65 20 41 4c 54  {This is the ALT
4c00: 20 74 65 73 74 20 73 74 72 69 6e 67 7d 7d 0a 64   test string}}.d
4c10: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 31 2e 37  o_test func-21.7
4c20: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4c30: 20 20 20 53 45 4c 45 43 54 20 72 65 70 6c 61 63     SELECT replac
4c40: 65 28 22 54 68 69 73 20 69 73 20 74 68 65 20 6d  e("This is the m
4c50: 61 69 6e 20 74 65 73 74 20 73 74 72 69 6e 67 22  ain test string"
4c60: 2c 20 22 6d 61 69 6e 22 2c 20 22 6c 61 72 67 65  , "main", "large
4c70: 72 2d 6d 61 69 6e 22 29 3b 0a 20 20 7d 0a 7d 20  r-main");.  }.} 
4c80: 7b 7b 54 68 69 73 20 69 73 20 74 68 65 20 6c 61  {{This is the la
4c90: 72 67 65 72 2d 6d 61 69 6e 20 74 65 73 74 20 73  rger-main test s
4ca0: 74 72 69 6e 67 7d 7d 0a 64 6f 5f 74 65 73 74 20  tring}}.do_test 
4cb0: 66 75 6e 63 2d 32 31 2e 38 20 7b 0a 20 20 65 78  func-21.8 {.  ex
4cc0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
4cd0: 43 54 20 72 65 70 6c 61 63 65 28 22 61 61 61 61  CT replace("aaaa
4ce0: 61 61 61 22 2c 20 22 61 22 2c 20 22 30 31 32 33  aaa", "a", "0123
4cf0: 34 35 36 37 38 39 22 29 3b 0a 20 20 7d 0a 7d 20  456789");.  }.} 
4d00: 7b 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34  {012345678901234
4d10: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30  5678901234567890
4d20: 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
4d30: 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32  7890123456789012
4d40: 33 34 35 36 37 38 39 7d 0a 0a 23 20 54 65 73 74  3456789}..# Test
4d50: 73 20 66 6f 72 20 74 68 65 20 54 52 49 4d 2c 20  s for the TRIM, 
4d60: 4c 54 52 49 4d 20 61 6e 64 20 52 54 52 49 4d 20  LTRIM and RTRIM 
4d70: 66 75 6e 63 74 69 6f 6e 73 2e 0a 23 0a 64 6f 5f  functions..#.do_
4d80: 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 31 20 7b  test func-22.1 {
4d90: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c  .  catchsql {SEL
4da0: 45 43 54 20 74 72 69 6d 28 31 2c 32 2c 33 29 7d  ECT trim(1,2,3)}
4db0: 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 6e 75 6d  .} {1 {wrong num
4dc0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
4dd0: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 74 72 69   to function tri
4de0: 6d 28 29 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75  m()}}.do_test fu
4df0: 6e 63 2d 32 32 2e 32 20 7b 0a 20 20 63 61 74 63  nc-22.2 {.  catc
4e00: 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 6c 74 72  hsql {SELECT ltr
4e10: 69 6d 28 31 2c 32 2c 33 29 7d 0a 7d 20 7b 31 20  im(1,2,3)}.} {1 
4e20: 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  {wrong number of
4e30: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
4e40: 6e 63 74 69 6f 6e 20 6c 74 72 69 6d 28 29 7d 7d  nction ltrim()}}
4e50: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32  .do_test func-22
4e60: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
4e70: 7b 53 45 4c 45 43 54 20 72 74 72 69 6d 28 31 2c  {SELECT rtrim(1,
4e80: 32 2c 33 29 7d 0a 7d 20 7b 31 20 7b 77 72 6f 6e  2,3)}.} {1 {wron
4e90: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
4ea0: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
4eb0: 6e 20 72 74 72 69 6d 28 29 7d 7d 0a 64 6f 5f 74  n rtrim()}}.do_t
4ec0: 65 73 74 20 66 75 6e 63 2d 32 32 2e 34 20 7b 0a  est func-22.4 {.
4ed0: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
4ee0: 54 20 74 72 69 6d 28 27 20 20 68 69 20 20 27 29  T trim('  hi  ')
4ef0: 3b 7d 0a 7d 20 7b 68 69 7d 0a 64 6f 5f 74 65 73  ;}.} {hi}.do_tes
4f00: 74 20 66 75 6e 63 2d 32 32 2e 35 20 7b 0a 20 20  t func-22.5 {.  
4f10: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
4f20: 6c 74 72 69 6d 28 27 20 20 68 69 20 20 27 29 3b  ltrim('  hi  ');
4f30: 7d 0a 7d 20 7b 7b 68 69 20 20 7d 7d 0a 64 6f 5f  }.} {{hi  }}.do_
4f40: 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 36 20 7b  test func-22.6 {
4f50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
4f60: 43 54 20 72 74 72 69 6d 28 27 20 20 68 69 20 20  CT rtrim('  hi  
4f70: 27 29 3b 7d 0a 7d 20 7b 7b 20 20 68 69 7d 7d 0a  ');}.} {{  hi}}.
4f80: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32 2e  do_test func-22.
4f90: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  7 {.  execsql {S
4fa0: 45 4c 45 43 54 20 74 72 69 6d 28 27 20 20 68 69  ELECT trim('  hi
4fb0: 20 20 27 2c 27 78 79 7a 27 29 3b 7d 0a 7d 20 7b    ','xyz');}.} {
4fc0: 7b 20 20 68 69 20 20 7d 7d 0a 64 6f 5f 74 65 73  {  hi  }}.do_tes
4fd0: 74 20 66 75 6e 63 2d 32 32 2e 38 20 7b 0a 20 20  t func-22.8 {.  
4fe0: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
4ff0: 6c 74 72 69 6d 28 27 20 20 68 69 20 20 27 2c 27  ltrim('  hi  ','
5000: 78 79 7a 27 29 3b 7d 0a 7d 20 7b 7b 20 20 68 69  xyz');}.} {{  hi
5010: 20 20 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e    }}.do_test fun
5020: 63 2d 32 32 2e 39 20 7b 0a 20 20 65 78 65 63 73  c-22.9 {.  execs
5030: 71 6c 20 7b 53 45 4c 45 43 54 20 72 74 72 69 6d  ql {SELECT rtrim
5040: 28 27 20 20 68 69 20 20 27 2c 27 78 79 7a 27 29  ('  hi  ','xyz')
5050: 3b 7d 0a 7d 20 7b 7b 20 20 68 69 20 20 7d 7d 0a  ;}.} {{  hi  }}.
5060: 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32 2e  do_test func-22.
5070: 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  10 {.  execsql {
5080: 53 45 4c 45 43 54 20 74 72 69 6d 28 27 78 79 78  SELECT trim('xyx
5090: 7a 79 20 20 68 69 20 20 7a 7a 7a 79 27 2c 27 78  zy  hi  zzzy','x
50a0: 79 7a 27 29 3b 7d 0a 7d 20 7b 7b 20 20 68 69 20  yz');}.} {{  hi 
50b0: 20 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63   }}.do_test func
50c0: 2d 32 32 2e 31 31 20 7b 0a 20 20 65 78 65 63 73  -22.11 {.  execs
50d0: 71 6c 20 7b 53 45 4c 45 43 54 20 6c 74 72 69 6d  ql {SELECT ltrim
50e0: 28 27 78 79 78 7a 79 20 20 68 69 20 20 7a 7a 7a  ('xyxzy  hi  zzz
50f0: 79 27 2c 27 78 79 7a 27 29 3b 7d 0a 7d 20 7b 7b  y','xyz');}.} {{
5100: 20 20 68 69 20 20 7a 7a 7a 79 7d 7d 0a 64 6f 5f    hi  zzzy}}.do_
5110: 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 31 32 20  test func-22.12 
5120: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
5130: 45 43 54 20 72 74 72 69 6d 28 27 78 79 78 7a 79  ECT rtrim('xyxzy
5140: 20 20 68 69 20 20 7a 7a 7a 79 27 2c 27 78 79 7a    hi  zzzy','xyz
5150: 27 29 3b 7d 0a 7d 20 7b 7b 78 79 78 7a 79 20 20  ');}.} {{xyxzy  
5160: 68 69 20 20 7d 7d 0a 64 6f 5f 74 65 73 74 20 66  hi  }}.do_test f
5170: 75 6e 63 2d 32 32 2e 31 33 20 7b 0a 20 20 65 78  unc-22.13 {.  ex
5180: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 74 72  ecsql {SELECT tr
5190: 69 6d 28 27 20 20 68 69 20 20 27 2c 27 27 29 3b  im('  hi  ','');
51a0: 7d 0a 7d 20 7b 7b 20 20 68 69 20 20 7d 7d 0a 64  }.} {{  hi  }}.d
51b0: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 32  o_test func-22.2
51c0: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  0 {.  execsql {S
51d0: 45 4c 45 43 54 20 74 79 70 65 6f 66 28 74 72 69  ELECT typeof(tri
51e0: 6d 28 4e 55 4c 4c 29 29 3b 7d 0a 7d 20 7b 6e 75  m(NULL));}.} {nu
51f0: 6c 6c 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  ll}.do_test func
5200: 2d 32 32 2e 32 31 20 7b 0a 20 20 65 78 65 63 73  -22.21 {.  execs
5210: 71 6c 20 7b 53 45 4c 45 43 54 20 74 79 70 65 6f  ql {SELECT typeo
5220: 66 28 74 72 69 6d 28 4e 55 4c 4c 2c 27 78 79 7a  f(trim(NULL,'xyz
5230: 27 29 29 3b 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64  '));}.} {null}.d
5240: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 32 32 2e 32  o_test func-22.2
5250: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  2 {.  execsql {S
5260: 45 4c 45 43 54 20 74 79 70 65 6f 66 28 74 72 69  ELECT typeof(tri
5270: 6d 28 27 68 65 6c 6c 6f 27 2c 4e 55 4c 4c 29 29  m('hello',NULL))
5280: 3b 7d 0a 7d 20 7b 6e 75 6c 6c 7d 0a 0a 66 69 6e  ;}.} {null}..fin
5290: 69 73 68 5f 74 65 73 74 0a                       ish_test.