/ Hex Artifact Content
Login

Artifact 71938e2ac704d8ce12f11810d475597640656ae9:


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 37 20 32 30 30 37 2f 30 31  t,v 1.57 2007/01
0200: 2f 32 39 20 31 37 3a 35 38 3a 32 38 20 64 72 68  /29 17:58:28 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 62 74 72 65 65 5f 62 72 65 61 6b 70  ts..btree_breakp
30e0: 6f 69 6e 74 0a 64 6f 5f 74 65 73 74 20 66 75 6e  oint.do_test fun
30f0: 63 2d 31 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  c-13.1 {.  execs
3100: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
3110: 74 65 73 74 5f 61 75 78 64 61 74 61 28 27 68 65  test_auxdata('he
3120: 6c 6c 6f 20 77 6f 72 6c 64 27 29 3b 0a 20 20 7d  llo world');.  }
3130: 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20  .} {0}..do_test 
3140: 66 75 6e 63 2d 31 33 2e 32 20 7b 0a 20 20 65 78  func-13.2 {.  ex
3150: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
3160: 54 45 20 54 41 42 4c 45 20 74 34 28 61 2c 20 62  TE TABLE t4(a, b
3170: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3180: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27 61 62  TO t4 VALUES('ab
3190: 63 27 2c 20 27 64 65 66 27 29 3b 0a 20 20 20 20  c', 'def');.    
31a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
31b0: 41 4c 55 45 53 28 27 67 68 69 27 2c 20 27 6a 6b  ALUES('ghi', 'jk
31c0: 6c 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  l');.  }.} {}.do
31d0: 5f 74 65 73 74 20 66 75 6e 63 2d 31 33 2e 33 20  _test func-13.3 
31e0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
31f0: 20 20 53 45 4c 45 43 54 20 74 65 73 74 5f 61 75    SELECT test_au
3200: 78 64 61 74 61 28 27 68 65 6c 6c 6f 20 77 6f 72  xdata('hello wor
3210: 6c 64 27 29 20 46 52 4f 4d 20 74 34 3b 0a 20 20  ld') FROM t4;.  
3220: 7d 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73  }.} {0 1}.do_tes
3230: 74 20 66 75 6e 63 2d 31 33 2e 34 20 7b 0a 20 20  t func-13.4 {.  
3240: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
3250: 4c 45 43 54 20 74 65 73 74 5f 61 75 78 64 61 74  LECT test_auxdat
3260: 61 28 27 68 65 6c 6c 6f 20 77 6f 72 6c 64 27 2c  a('hello world',
3270: 20 31 32 33 29 20 46 52 4f 4d 20 74 34 3b 0a 20   123) FROM t4;. 
3280: 20 7d 0a 7d 20 7b 7b 30 20 30 7d 20 7b 31 20 31   }.} {{0 0} {1 1
3290: 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  }}.do_test func-
32a0: 31 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  13.5 {.  execsql
32b0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 65   {.    SELECT te
32c0: 73 74 5f 61 75 78 64 61 74 61 28 27 68 65 6c 6c  st_auxdata('hell
32d0: 6f 20 77 6f 72 6c 64 27 2c 20 61 29 20 46 52 4f  o world', a) FRO
32e0: 4d 20 74 34 3b 0a 20 20 7d 0a 7d 20 7b 7b 30 20  M t4;.  }.} {{0 
32f0: 30 7d 20 7b 31 20 30 7d 7d 0a 64 6f 5f 74 65 73  0} {1 0}}.do_tes
3300: 74 20 66 75 6e 63 2d 31 33 2e 36 20 7b 0a 20 20  t func-13.6 {.  
3310: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
3320: 4c 45 43 54 20 74 65 73 74 5f 61 75 78 64 61 74  LECT test_auxdat
3330: 61 28 27 68 65 6c 6c 6f 27 7c 7c 27 77 6f 72 6c  a('hello'||'worl
3340: 64 27 2c 20 61 29 20 46 52 4f 4d 20 74 34 3b 0a  d', a) FROM t4;.
3350: 20 20 7d 0a 7d 20 7b 7b 30 20 30 7d 20 7b 31 20    }.} {{0 0} {1 
3360: 30 7d 7d 0a 0a 23 20 54 65 73 74 20 74 68 61 74  0}}..# Test that
3370: 20 61 75 78 69 6c 61 72 79 20 64 61 74 61 20 69   auxilary data i
3380: 73 20 70 72 65 73 65 72 76 65 64 20 62 65 74 77  s preserved betw
3390: 65 65 6e 20 63 61 6c 6c 73 20 66 6f 72 20 53 51  een calls for SQ
33a0: 4c 20 76 61 72 69 61 62 6c 65 73 2e 0a 64 6f 5f  L variables..do_
33b0: 74 65 73 74 20 66 75 6e 63 2d 31 33 2e 37 20 7b  test func-13.7 {
33c0: 0a 20 20 73 65 74 20 44 42 20 5b 73 71 6c 69 74  .  set DB [sqlit
33d0: 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e3_connection_po
33e0: 69 6e 74 65 72 20 64 62 5d 0a 20 20 73 65 74 20  inter db].  set 
33f0: 73 71 6c 20 22 53 45 4c 45 43 54 20 74 65 73 74  sql "SELECT test
3400: 5f 61 75 78 64 61 74 61 28 20 3f 20 2c 20 61 20  _auxdata( ? , a 
3410: 29 20 46 52 4f 4d 20 74 34 3b 22 0a 20 20 73 65  ) FROM t4;".  se
3420: 74 20 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f  t STMT [sqlite3_
3430: 70 72 65 70 61 72 65 20 24 44 42 20 24 73 71 6c  prepare $DB $sql
3440: 20 2d 31 20 54 41 49 4c 5d 0a 20 20 73 71 6c 69   -1 TAIL].  sqli
3450: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 24 53  te3_bind_text $S
3460: 54 4d 54 20 31 20 68 65 6c 6c 6f 20 2d 31 0a 20  TMT 1 hello -1. 
3470: 20 73 65 74 20 72 65 73 20 5b 6c 69 73 74 5d 0a   set res [list].
3480: 20 20 77 68 69 6c 65 20 7b 20 22 53 51 4c 49 54    while { "SQLIT
3490: 45 5f 52 4f 57 22 3d 3d 5b 73 71 6c 69 74 65 33  E_ROW"==[sqlite3
34a0: 5f 73 74 65 70 20 24 53 54 4d 54 5d 20 7d 20 7b  _step $STMT] } {
34b0: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73  .    lappend res
34c0: 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   [sqlite3_column
34d0: 5f 74 65 78 74 20 24 53 54 4d 54 20 30 5d 0a 20  _text $STMT 0]. 
34e0: 20 7d 0a 20 20 6c 61 70 70 65 6e 64 20 72 65 73   }.  lappend res
34f0: 20 5b 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69   [sqlite3_finali
3500: 7a 65 20 24 53 54 4d 54 5d 0a 7d 20 7b 7b 30 20  ze $STMT].} {{0 
3510: 30 7d 20 7b 31 20 30 7d 20 53 51 4c 49 54 45 5f  0} {1 0} SQLITE_
3520: 4f 4b 7d 0a 0a 23 20 4d 61 6b 65 20 73 75 72 65  OK}..# Make sure
3530: 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e   that a function
3540: 20 77 69 74 68 20 61 20 76 65 72 79 20 6c 6f 6e   with a very lon
3550: 67 20 6e 61 6d 65 20 69 73 20 72 65 6a 65 63 74  g name is reject
3560: 65 64 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  ed.do_test func-
3570: 31 34 2e 31 20 7b 0a 20 20 63 61 74 63 68 20 7b  14.1 {.  catch {
3580: 0a 20 20 20 20 64 62 20 66 75 6e 63 74 69 6f 6e  .    db function
3590: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
35a0: 58 20 32 35 34 5d 20 7b 72 65 74 75 72 6e 20 22  X 254] {return "
35b0: 68 65 6c 6c 6f 22 7d 0a 20 20 7d 20 0a 7d 20 7b  hello"}.  } .} {
35c0: 30 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  0}.do_test func-
35d0: 31 34 2e 32 20 7b 0a 20 20 63 61 74 63 68 20 7b  14.2 {.  catch {
35e0: 0a 20 20 20 20 64 62 20 66 75 6e 63 74 69 6f 6e  .    db function
35f0: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
3600: 58 20 32 35 36 5d 20 7b 72 65 74 75 72 6e 20 22  X 256] {return "
3610: 68 65 6c 6c 6f 22 7d 0a 20 20 7d 0a 7d 20 7b 31  hello"}.  }.} {1
3620: 7d 0a 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  }..do_test func-
3630: 31 35 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71  15.1 {.  catchsq
3640: 6c 20 7b 0a 20 20 20 20 73 65 6c 65 63 74 20 74  l {.    select t
3650: 65 73 74 5f 65 72 72 6f 72 28 4e 55 4c 4c 29 3b  est_error(NULL);
3660: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 7d 7d 0a 0a 23  .  }.} {1 {}}..#
3670: 20 54 65 73 74 20 74 68 65 20 71 75 6f 74 65 20   Test the quote 
3680: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 42 4c 4f  function for BLO
3690: 42 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65  B and NULL value
36a0: 73 2e 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  s..do_test func-
36b0: 31 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  16.1 {.  execsql
36c0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
36d0: 42 4c 45 20 74 62 6c 32 28 61 2c 20 62 29 3b 0a  BLE tbl2(a, b);.
36e0: 20 20 7d 0a 20 20 73 65 74 20 53 54 4d 54 20 5b    }.  set STMT [
36f0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20  sqlite3_prepare 
3700: 24 3a 3a 44 42 20 22 49 4e 53 45 52 54 20 49 4e  $::DB "INSERT IN
3710: 54 4f 20 74 62 6c 32 20 56 41 4c 55 45 53 28 3f  TO tbl2 VALUES(?
3720: 2c 20 3f 29 22 20 2d 31 20 54 41 49 4c 5d 0a 20  , ?)" -1 TAIL]. 
3730: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
3740: 6f 62 20 24 3a 3a 53 54 4d 54 20 31 20 61 62 63  ob $::STMT 1 abc
3750: 20 33 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65   3.  sqlite3_ste
3760: 70 20 24 3a 3a 53 54 4d 54 0a 20 20 73 71 6c 69  p $::STMT.  sqli
3770: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a  te3_finalize $::
3780: 53 54 4d 54 0a 20 20 65 78 65 63 73 71 6c 20 7b  STMT.  execsql {
3790: 0a 20 20 20 20 53 45 4c 45 43 54 20 71 75 6f 74  .    SELECT quot
37a0: 65 28 61 29 2c 20 71 75 6f 74 65 28 62 29 20 46  e(a), quote(b) F
37b0: 52 4f 4d 20 74 62 6c 32 3b 0a 20 20 7d 0a 7d 20  ROM tbl2;.  }.} 
37c0: 7b 58 27 36 31 36 32 36 33 27 20 4e 55 4c 4c 7d  {X'616263' NULL}
37d0: 0a 0a 23 20 43 6f 72 72 65 63 74 6c 79 20 68 61  ..# Correctly ha
37e0: 6e 64 6c 65 20 66 75 6e 63 74 69 6f 6e 20 65 72  ndle function er
37f0: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 74 68 61  ror messages tha
3800: 74 20 69 6e 63 6c 75 64 65 20 25 2e 20 20 54 69  t include %.  Ti
3810: 63 6b 65 74 20 23 31 33 35 34 0a 23 0a 64 6f 5f  cket #1354.#.do_
3820: 74 65 73 74 20 66 75 6e 63 2d 31 37 2e 31 20 7b  test func-17.1 {
3830: 0a 20 20 70 72 6f 63 20 74 65 73 74 66 75 6e 63  .  proc testfunc
3840: 31 20 61 72 67 73 20 7b 65 72 72 6f 72 20 22 45  1 args {error "E
3850: 72 72 6f 72 20 25 64 20 77 69 74 68 20 25 73 20  rror %d with %s 
3860: 70 65 72 63 65 6e 74 73 20 25 70 22 7d 0a 20 20  percents %p"}.  
3870: 64 62 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  db function test
3880: 66 75 6e 63 31 20 3a 3a 74 65 73 74 66 75 6e 63  func1 ::testfunc
3890: 31 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  1.  catchsql {. 
38a0: 20 20 20 53 45 4c 45 43 54 20 74 65 73 74 66 75     SELECT testfu
38b0: 6e 63 31 28 31 2c 32 2c 33 29 3b 0a 20 20 7d 0a  nc1(1,2,3);.  }.
38c0: 7d 20 7b 31 20 7b 45 72 72 6f 72 20 25 64 20 77  } {1 {Error %d w
38d0: 69 74 68 20 25 73 20 70 65 72 63 65 6e 74 73 20  ith %s percents 
38e0: 25 70 7d 7d 0a 0a 23 20 54 68 65 20 53 55 4d 20  %p}}..# The SUM 
38f0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
3900: 72 65 74 75 72 6e 20 69 6e 74 65 67 65 72 20 72  return integer r
3910: 65 73 75 6c 74 73 20 77 68 65 6e 20 61 6c 6c 20  esults when all 
3920: 69 6e 70 75 74 73 20 61 72 65 20 69 6e 74 65 67  inputs are integ
3930: 65 72 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75  er..#.do_test fu
3940: 6e 63 2d 31 38 2e 31 20 7b 0a 20 20 65 78 65 63  nc-18.1 {.  exec
3950: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
3960: 20 54 41 42 4c 45 20 74 35 28 78 29 3b 0a 20 20   TABLE t5(x);.  
3970: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35    INSERT INTO t5
3980: 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20   VALUES(1);.    
3990: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56  INSERT INTO t5 V
39a0: 41 4c 55 45 53 28 2d 39 39 29 3b 0a 20 20 20 20  ALUES(-99);.    
39b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56  INSERT INTO t5 V
39c0: 41 4c 55 45 53 28 31 30 30 30 30 29 3b 0a 20 20  ALUES(10000);.  
39d0: 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 20    SELECT sum(x) 
39e0: 46 52 4f 4d 20 74 35 3b 0a 20 20 7d 0a 7d 20 7b  FROM t5;.  }.} {
39f0: 39 39 30 32 7d 0a 64 6f 5f 74 65 73 74 20 66 75  9902}.do_test fu
3a00: 6e 63 2d 31 38 2e 32 20 7b 0a 20 20 65 78 65 63  nc-18.2 {.  exec
3a10: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
3a20: 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28   INTO t5 VALUES(
3a30: 30 2e 30 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  0.0);.    SELECT
3a40: 20 73 75 6d 28 78 29 20 46 52 4f 4d 20 74 35 3b   sum(x) FROM t5;
3a50: 0a 20 20 7d 0a 7d 20 7b 39 39 30 32 2e 30 7d 0a  .  }.} {9902.0}.
3a60: 0a 23 20 54 68 65 20 73 75 6d 20 6f 66 20 6e 6f  .# The sum of no
3a70: 74 68 69 6e 67 20 69 73 20 4e 55 4c 4c 2e 20 20  thing is NULL.  
3a80: 42 75 74 20 74 68 65 20 73 75 6d 20 6f 66 20 61  But the sum of a
3a90: 6c 6c 20 4e 55 4c 4c 73 20 69 73 20 4e 55 4c 4c  ll NULLs is NULL
3aa0: 2e 0a 23 0a 23 20 54 68 65 20 54 4f 54 41 4c 20  ..#.# The TOTAL 
3ab0: 6f 66 20 6e 6f 74 68 69 6e 67 20 69 73 20 30 2e  of nothing is 0.
3ac0: 30 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e  0..#.do_test fun
3ad0: 63 2d 31 38 2e 33 20 7b 0a 20 20 65 78 65 63 73  c-18.3 {.  execs
3ae0: 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
3af0: 46 52 4f 4d 20 74 35 3b 0a 20 20 20 20 53 45 4c  FROM t5;.    SEL
3b00: 45 43 54 20 73 75 6d 28 78 29 2c 20 74 6f 74 61  ECT sum(x), tota
3b10: 6c 28 78 29 20 46 52 4f 4d 20 74 35 3b 0a 20 20  l(x) FROM t5;.  
3b20: 7d 0a 7d 20 7b 7b 7d 20 30 2e 30 7d 0a 64 6f 5f  }.} {{} 0.0}.do_
3b30: 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 34 20 7b  test func-18.4 {
3b40: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3b50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20   INSERT INTO t5 
3b60: 56 41 4c 55 45 53 28 4e 55 4c 4c 29 3b 0a 20 20  VALUES(NULL);.  
3b70: 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 2c    SELECT sum(x),
3b80: 20 74 6f 74 61 6c 28 78 29 20 46 52 4f 4d 20 74   total(x) FROM t
3b90: 35 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 30 2e 30 7d  5.  }.} {{} 0.0}
3ba0: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38  .do_test func-18
3bb0: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
3bc0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3bd0: 20 74 35 20 56 41 4c 55 45 53 28 4e 55 4c 4c 29   t5 VALUES(NULL)
3be0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d  ;.    SELECT sum
3bf0: 28 78 29 2c 20 74 6f 74 61 6c 28 78 29 20 46 52  (x), total(x) FR
3c00: 4f 4d 20 74 35 0a 20 20 7d 0a 7d 20 7b 7b 7d 20  OM t5.  }.} {{} 
3c10: 30 2e 30 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  0.0}.do_test fun
3c20: 63 2d 31 38 2e 36 20 7b 0a 20 20 65 78 65 63 73  c-18.6 {.  execs
3c30: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
3c40: 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 31  INTO t5 VALUES(1
3c50: 32 33 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  23);.    SELECT 
3c60: 73 75 6d 28 78 29 2c 20 74 6f 74 61 6c 28 78 29  sum(x), total(x)
3c70: 20 46 52 4f 4d 20 74 35 0a 20 20 7d 0a 7d 20 7b   FROM t5.  }.} {
3c80: 31 32 33 20 31 32 33 2e 30 7d 0a 0a 23 20 54 69  123 123.0}..# Ti
3c90: 63 6b 65 74 20 23 31 36 36 34 2c 20 23 31 36 36  cket #1664, #166
3ca0: 39 2c 20 23 31 36 37 30 2c 20 23 31 36 37 34 3a  9, #1670, #1674:
3cb0: 20 41 6e 20 69 6e 74 65 67 65 72 20 6f 76 65 72   An integer over
3cc0: 66 6c 6f 77 20 6f 6e 20 53 55 4d 20 63 61 75 73  flow on SUM caus
3cd0: 65 73 0a 23 20 61 6e 20 65 72 72 6f 72 2e 20 54  es.# an error. T
3ce0: 68 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20  he non-standard 
3cf0: 54 4f 54 41 4c 28 29 20 66 75 6e 63 74 69 6f 6e  TOTAL() function
3d00: 20 63 6f 6e 74 69 6e 75 65 73 20 74 6f 20 67 69   continues to gi
3d10: 76 65 20 61 20 68 65 6c 70 66 75 6c 0a 23 20 72  ve a helpful.# r
3d20: 65 73 75 6c 74 2e 0a 23 0a 64 6f 5f 74 65 73 74  esult..#.do_test
3d30: 20 66 75 6e 63 2d 31 38 2e 31 30 20 7b 0a 20 20   func-18.10 {.  
3d40: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
3d50: 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 78 20  EATE TABLE t6(x 
3d60: 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 49 4e  INTEGER);.    IN
3d70: 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c  SERT INTO t6 VAL
3d80: 55 45 53 28 31 29 3b 0a 20 20 20 20 49 4e 53 45  UES(1);.    INSE
3d90: 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45  RT INTO t6 VALUE
3da0: 53 28 31 3c 3c 36 32 29 3b 0a 20 20 20 20 53 45  S(1<<62);.    SE
3db0: 4c 45 43 54 20 73 75 6d 28 78 29 20 2d 20 28 28  LECT sum(x) - ((
3dc0: 31 3c 3c 36 32 29 2b 31 29 20 66 72 6f 6d 20 74  1<<62)+1) from t
3dd0: 36 3b 0a 20 20 7d 0a 7d 20 30 0a 64 6f 5f 74 65  6;.  }.} 0.do_te
3de0: 73 74 20 66 75 6e 63 2d 31 38 2e 31 31 20 7b 0a  st func-18.11 {.
3df0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3e00: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 73 75  SELECT typeof(su
3e10: 6d 28 78 29 29 20 46 52 4f 4d 20 74 36 0a 20 20  m(x)) FROM t6.  
3e20: 7d 0a 7d 20 69 6e 74 65 67 65 72 0a 64 6f 5f 74  }.} integer.do_t
3e30: 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 32 20 7b  est func-18.12 {
3e40: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
3e50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36    INSERT INTO t6
3e60: 20 56 41 4c 55 45 53 28 31 3c 3c 36 32 29 3b 0a   VALUES(1<<62);.
3e70: 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78      SELECT sum(x
3e80: 29 20 2d 20 28 28 31 3c 3c 36 32 29 2a 32 2e 30  ) - ((1<<62)*2.0
3e90: 2b 31 29 20 66 72 6f 6d 20 74 36 3b 0a 20 20 7d  +1) from t6;.  }
3ea0: 0a 7d 20 7b 31 20 7b 69 6e 74 65 67 65 72 20 6f  .} {1 {integer o
3eb0: 76 65 72 66 6c 6f 77 7d 7d 0a 64 6f 5f 74 65 73  verflow}}.do_tes
3ec0: 74 20 66 75 6e 63 2d 31 38 2e 31 33 20 7b 0a 20  t func-18.13 {. 
3ed0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3ee0: 45 4c 45 43 54 20 74 6f 74 61 6c 28 78 29 20 2d  ELECT total(x) -
3ef0: 20 28 28 31 3c 3c 36 32 29 2a 32 2e 30 2b 31 29   ((1<<62)*2.0+1)
3f00: 20 46 52 4f 4d 20 74 36 0a 20 20 7d 0a 7d 20 30   FROM t6.  }.} 0
3f10: 2e 30 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d  .0.do_test func-
3f20: 31 38 2e 31 34 20 7b 0a 20 20 65 78 65 63 73 71  18.14 {.  execsq
3f30: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 73  l {.    SELECT s
3f40: 75 6d 28 2d 39 32 32 33 33 37 32 30 33 36 38 35  um(-922337203685
3f50: 34 37 37 35 38 30 35 29 3b 0a 20 20 7d 0a 7d 20  4775805);.  }.} 
3f60: 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
3f70: 35 38 30 35 0a 0a 69 66 63 61 70 61 62 6c 65 20  5805..ifcapable 
3f80: 63 6f 6d 70 6f 75 6e 64 26 26 73 75 62 71 75 65  compound&&subque
3f90: 72 79 20 7b 0a 0a 64 6f 5f 74 65 73 74 20 66 75  ry {..do_test fu
3fa0: 6e 63 2d 31 38 2e 31 35 20 7b 0a 20 20 63 61 74  nc-18.15 {.  cat
3fb0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  chsql {.    SELE
3fc0: 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d 20 0a  CT sum(x) FROM .
3fd0: 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 39         (SELECT 9
3fe0: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
3ff0: 30 37 20 41 53 20 78 20 55 4e 49 4f 4e 20 41 4c  07 AS x UNION AL
4000: 4c 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  L.        SELECT
4010: 20 31 30 20 41 53 20 78 29 3b 0a 20 20 7d 0a 7d   10 AS x);.  }.}
4020: 20 7b 31 20 7b 69 6e 74 65 67 65 72 20 6f 76 65   {1 {integer ove
4030: 72 66 6c 6f 77 7d 7d 0a 64 6f 5f 74 65 73 74 20  rflow}}.do_test 
4040: 66 75 6e 63 2d 31 38 2e 31 36 20 7b 0a 20 20 63  func-18.16 {.  c
4050: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45  atchsql {.    SE
4060: 4c 45 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d  LECT sum(x) FROM
4070: 20 0a 20 20 20 20 20 20 20 28 53 45 4c 45 43 54   .       (SELECT
4080: 20 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37   922337203685477
4090: 35 38 30 37 20 41 53 20 78 20 55 4e 49 4f 4e 20  5807 AS x UNION 
40a0: 41 4c 4c 0a 20 20 20 20 20 20 20 20 53 45 4c 45  ALL.        SELE
40b0: 43 54 20 2d 31 30 20 41 53 20 78 29 3b 0a 20 20  CT -10 AS x);.  
40c0: 7d 0a 7d 20 7b 30 20 39 32 32 33 33 37 32 30 33  }.} {0 922337203
40d0: 36 38 35 34 37 37 35 37 39 37 7d 0a 64 6f 5f 74  6854775797}.do_t
40e0: 65 73 74 20 66 75 6e 63 2d 31 38 2e 31 37 20 7b  est func-18.17 {
40f0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
4100: 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 20    SELECT sum(x) 
4110: 46 52 4f 4d 20 0a 20 20 20 20 20 20 20 28 53 45  FROM .       (SE
4120: 4c 45 43 54 20 2d 39 32 32 33 33 37 32 30 33 36  LECT -9223372036
4130: 38 35 34 37 37 35 38 30 37 20 41 53 20 78 20 55  854775807 AS x U
4140: 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 20  NION ALL.       
4150: 20 53 45 4c 45 43 54 20 31 30 20 41 53 20 78 29   SELECT 10 AS x)
4160: 3b 0a 20 20 7d 0a 7d 20 7b 30 20 2d 39 32 32 33  ;.  }.} {0 -9223
4170: 33 37 32 30 33 36 38 35 34 37 37 35 37 39 37 7d  372036854775797}
4180: 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38  .do_test func-18
4190: 2e 31 38 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  .18 {.  catchsql
41a0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 75   {.    SELECT su
41b0: 6d 28 78 29 20 46 52 4f 4d 20 0a 20 20 20 20 20  m(x) FROM .     
41c0: 20 20 28 53 45 4c 45 43 54 20 2d 39 32 32 33 33    (SELECT -92233
41d0: 37 32 30 33 36 38 35 34 37 37 35 38 30 37 20 41  72036854775807 A
41e0: 53 20 78 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20  S x UNION ALL.  
41f0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2d 31 30        SELECT -10
4200: 20 41 53 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b 31   AS x);.  }.} {1
4210: 20 7b 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c   {integer overfl
4220: 6f 77 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  ow}}.do_test fun
4230: 63 2d 31 38 2e 31 39 20 7b 0a 20 20 63 61 74 63  c-18.19 {.  catc
4240: 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  hsql {.    SELEC
4250: 54 20 73 75 6d 28 78 29 20 46 52 4f 4d 20 28 53  T sum(x) FROM (S
4260: 45 4c 45 43 54 20 39 20 41 53 20 78 20 55 4e 49  ELECT 9 AS x UNI
4270: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2d 31  ON ALL SELECT -1
4280: 30 20 41 53 20 78 29 3b 0a 20 20 7d 0a 7d 20 7b  0 AS x);.  }.} {
4290: 30 20 2d 31 7d 0a 64 6f 5f 74 65 73 74 20 66 75  0 -1}.do_test fu
42a0: 6e 63 2d 31 38 2e 32 30 20 7b 0a 20 20 63 61 74  nc-18.20 {.  cat
42b0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  chsql {.    SELE
42c0: 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d 20 28  CT sum(x) FROM (
42d0: 53 45 4c 45 43 54 20 2d 39 20 41 53 20 78 20 55  SELECT -9 AS x U
42e0: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
42f0: 31 30 20 41 53 20 78 29 3b 0a 20 20 7d 0a 7d 20  10 AS x);.  }.} 
4300: 7b 30 20 31 7d 0a 64 6f 5f 74 65 73 74 20 66 75  {0 1}.do_test fu
4310: 6e 63 2d 31 38 2e 32 31 20 7b 0a 20 20 63 61 74  nc-18.21 {.  cat
4320: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  chsql {.    SELE
4330: 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d 20 28  CT sum(x) FROM (
4340: 53 45 4c 45 43 54 20 2d 31 30 20 41 53 20 78 20  SELECT -10 AS x 
4350: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
4360: 20 39 20 41 53 20 78 29 3b 0a 20 20 7d 0a 7d 20   9 AS x);.  }.} 
4370: 7b 30 20 2d 31 7d 0a 64 6f 5f 74 65 73 74 20 66  {0 -1}.do_test f
4380: 75 6e 63 2d 31 38 2e 32 32 20 7b 0a 20 20 63 61  unc-18.22 {.  ca
4390: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
43a0: 45 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d 20  ECT sum(x) FROM 
43b0: 28 53 45 4c 45 43 54 20 31 30 20 41 53 20 78 20  (SELECT 10 AS x 
43c0: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
43d0: 20 2d 39 20 41 53 20 78 29 3b 0a 20 20 7d 0a 7d   -9 AS x);.  }.}
43e0: 20 7b 30 20 31 7d 0a 0a 7d 20 3b 23 20 69 66 63   {0 1}..} ;# ifc
43f0: 61 70 61 62 6c 65 20 63 6f 6d 70 6f 75 6e 64 26  apable compound&
4400: 26 73 75 62 71 75 65 72 79 0a 0a 23 20 49 6e 74  &subquery..# Int
4410: 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 6f 6e  eger overflow on
4420: 20 61 62 73 28 29 0a 23 0a 64 6f 5f 74 65 73 74   abs().#.do_test
4430: 20 66 75 6e 63 2d 31 38 2e 33 31 20 7b 0a 20 20   func-18.31 {.  
4440: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
4450: 45 4c 45 43 54 20 61 62 73 28 2d 39 32 32 33 33  ELECT abs(-92233
4460: 37 32 30 33 36 38 35 34 37 37 35 38 30 37 29 3b  72036854775807);
4470: 0a 20 20 7d 0a 7d 20 7b 30 20 39 32 32 33 33 37  .  }.} {0 922337
4480: 32 30 33 36 38 35 34 37 37 35 38 30 37 7d 0a 64  2036854775807}.d
4490: 6f 5f 74 65 73 74 20 66 75 6e 63 2d 31 38 2e 33  o_test func-18.3
44a0: 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  2 {.  catchsql {
44b0: 0a 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28  .    SELECT abs(
44c0: 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
44d0: 35 38 30 37 2d 31 29 3b 0a 20 20 7d 0a 7d 20 7b  5807-1);.  }.} {
44e0: 31 20 7b 69 6e 74 65 67 65 72 20 6f 76 65 72 66  1 {integer overf
44f0: 6c 6f 77 7d 7d 0a 0a 23 20 54 68 65 20 4d 41 54  low}}..# The MAT
4500: 43 48 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  CH function exis
4510: 74 73 20 62 75 74 20 69 73 20 6f 6e 6c 79 20 61  ts but is only a
4520: 20 73 74 75 62 20 61 6e 64 20 61 6c 77 61 79 73   stub and always
4530: 20 74 68 72 6f 77 73 20 61 6e 20 65 72 72 6f 72   throws an error
4540: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63  ..#.do_test func
4550: 2d 31 39 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -19.1 {.  execsq
4560: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6d  l {.    SELECT m
4570: 61 74 63 68 28 61 2c 62 29 20 46 52 4f 4d 20 74  atch(a,b) FROM t
4580: 31 20 57 48 45 52 45 20 30 3b 0a 20 20 7d 0a 7d  1 WHERE 0;.  }.}
4590: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e 63   {}.do_test func
45a0: 2d 31 39 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  -19.2 {.  catchs
45b0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
45c0: 27 61 62 63 27 20 4d 41 54 43 48 20 27 78 79 7a  'abc' MATCH 'xyz
45d0: 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 75 6e 61  ';.  }.} {1 {una
45e0: 62 6c 65 20 74 6f 20 75 73 65 20 66 75 6e 63 74  ble to use funct
45f0: 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20 74 68 65  ion MATCH in the
4600: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6e 74 65   requested conte
4610: 78 74 7d 7d 0a 64 6f 5f 74 65 73 74 20 66 75 6e  xt}}.do_test fun
4620: 63 2d 31 39 2e 33 20 7b 0a 20 20 63 61 74 63 68  c-19.3 {.  catch
4630: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
4640: 20 27 61 62 63 27 20 4e 4f 54 20 4d 41 54 43 48   'abc' NOT MATCH
4650: 20 27 78 79 7a 27 3b 0a 20 20 7d 0a 7d 20 7b 31   'xyz';.  }.} {1
4660: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20   {unable to use 
4670: 66 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20 69  function MATCH i
4680: 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
4690: 63 6f 6e 74 65 78 74 7d 7d 0a 64 6f 5f 74 65 73  context}}.do_tes
46a0: 74 20 66 75 6e 63 2d 31 39 2e 34 20 7b 0a 20 20  t func-19.4 {.  
46b0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
46c0: 45 4c 45 43 54 20 6d 61 74 63 68 28 31 2c 32 2c  ELECT match(1,2,
46d0: 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 77 72  3);.  }.} {1 {wr
46e0: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
46f0: 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
4700: 69 6f 6e 20 6d 61 74 63 68 28 29 7d 7d 0a 0a 23  ion match()}}..#
4710: 20 53 6f 75 6e 64 65 78 20 74 65 73 74 73 2e 0a   Soundex tests..
4720: 23 0a 69 66 20 7b 21 5b 63 61 74 63 68 20 7b 64  #.if {![catch {d
4730: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 73  b eval {SELECT s
4740: 6f 75 6e 64 65 78 28 27 68 65 6c 6c 6f 27 29 7d  oundex('hello')}
4750: 7d 5d 7d 20 7b 0a 20 20 73 65 74 20 69 20 30 0a  }]} {.  set i 0.
4760: 20 20 66 6f 72 65 61 63 68 20 7b 6e 61 6d 65 20    foreach {name 
4770: 73 64 78 7d 20 7b 0a 20 20 20 20 65 75 6c 65 72  sdx} {.    euler
4780: 20 20 20 20 20 20 20 20 45 34 36 30 0a 20 20 20          E460.   
4790: 20 45 55 4c 45 52 20 20 20 20 20 20 20 20 45 34   EULER        E4
47a0: 36 30 0a 20 20 20 20 45 75 6c 65 72 20 20 20 20  60.    Euler    
47b0: 20 20 20 20 45 34 36 30 0a 20 20 20 20 65 6c 6c      E460.    ell
47c0: 65 72 79 20 20 20 20 20 20 20 45 34 36 30 0a 20  ery       E460. 
47d0: 20 20 20 67 61 75 73 73 20 20 20 20 20 20 20 20     gauss        
47e0: 47 32 30 30 0a 20 20 20 20 67 68 6f 73 68 20 20  G200.    ghosh  
47f0: 20 20 20 20 20 20 47 32 30 30 0a 20 20 20 20 68        G200.    h
4800: 69 6c 62 65 72 74 20 20 20 20 20 20 48 34 31 36  ilbert      H416
4810: 0a 20 20 20 20 48 65 69 6c 62 72 6f 6e 6e 20 20  .    Heilbronn  
4820: 20 20 48 34 31 36 0a 20 20 20 20 6b 6e 75 74 68    H416.    knuth
4830: 20 20 20 20 20 20 20 20 4b 35 33 30 0a 20 20 20          K530.   
4840: 20 6b 61 6e 74 20 20 20 20 20 20 20 20 20 4b 35   kant         K5
4850: 33 30 0a 20 20 20 20 4c 6c 6f 79 64 20 20 20 20  30.    Lloyd    
4860: 20 20 20 20 4c 33 30 30 0a 20 20 20 20 4c 41 44      L300.    LAD
4870: 44 20 20 20 20 20 20 20 20 20 4c 33 30 30 0a 20  D         L300. 
4880: 20 20 20 4c 75 6b 61 73 69 65 77 69 63 7a 20 20     Lukasiewicz  
4890: 4c 32 32 32 0a 20 20 20 20 4c 69 73 73 61 6a 6f  L222.    Lissajo
48a0: 75 73 20 20 20 20 4c 32 32 32 0a 20 20 20 20 41  us    L222.    A
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 41 30 30 30              A000
48c0: 0a 20 20 20 20 31 32 33 34 35 20 20 20 20 20 20  .    12345      
48d0: 20 20 3f 30 30 30 0a 20 20 7d 20 7b 0a 20 20 20    ?000.  } {.   
48e0: 20 69 6e 63 72 20 69 0a 20 20 20 20 64 6f 5f 74   incr i.    do_t
48f0: 65 73 74 20 66 75 6e 63 2d 32 30 2e 24 69 20 7b  est func-20.$i {
4900: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b  .      execsql {
4910: 53 45 4c 45 43 54 20 73 6f 75 6e 64 65 78 28 24  SELECT soundex($
4920: 6e 61 6d 65 29 7d 0a 20 20 20 20 7d 20 24 73 64  name)}.    } $sd
4930: 78 0a 20 20 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f  x.  }.}..finish_
4940: 74 65 73 74 0a                                   test.