xref: /sqlite-3.40.0/src/func.c (revision ec1bd0bd)
1dc04c583Sdrh /*
2dc04c583Sdrh ** 2002 February 23
3dc04c583Sdrh **
4dc04c583Sdrh ** The author disclaims copyright to this source code.  In place of
5dc04c583Sdrh ** a legal notice, here is a blessing:
6dc04c583Sdrh **
7dc04c583Sdrh **    May you do good and not evil.
8dc04c583Sdrh **    May you find forgiveness for yourself and forgive others.
9dc04c583Sdrh **    May you share freely, never taking more than you give.
10dc04c583Sdrh **
11dc04c583Sdrh *************************************************************************
12dc04c583Sdrh ** This file contains the C functions that implement various SQL
13dc04c583Sdrh ** functions of SQLite.
14dc04c583Sdrh **
15dc04c583Sdrh ** There is only one exported symbol in this file - the function
16dc04c583Sdrh ** sqliteRegisterBuildinFunctions() found at the bottom of the file.
17dc04c583Sdrh ** All other code has file scope.
18dc04c583Sdrh **
19*ec1bd0bdSdrh ** $Id: func.c,v 1.30 2003/08/26 11:41:27 drh Exp $
20dc04c583Sdrh */
21dc04c583Sdrh #include <ctype.h>
22d3a149efSdrh #include <math.h>
23d3a149efSdrh #include <stdlib.h>
240bce8354Sdrh #include <assert.h>
250bce8354Sdrh #include "sqliteInt.h"
26771d8c3bSdrh #include "os.h"
270bce8354Sdrh 
280bce8354Sdrh /*
290bce8354Sdrh ** Implementation of the non-aggregate min() and max() functions
300bce8354Sdrh */
310bce8354Sdrh static void minFunc(sqlite_func *context, int argc, const char **argv){
320bce8354Sdrh   const char *zBest;
330bce8354Sdrh   int i;
340bce8354Sdrh 
3589425d5eSdrh   if( argc==0 ) return;
360bce8354Sdrh   zBest = argv[0];
378912d106Sdrh   if( zBest==0 ) return;
380bce8354Sdrh   for(i=1; i<argc; i++){
398912d106Sdrh     if( argv[i]==0 ) return;
400bce8354Sdrh     if( sqliteCompare(argv[i], zBest)<0 ){
410bce8354Sdrh       zBest = argv[i];
420bce8354Sdrh     }
430bce8354Sdrh   }
440bce8354Sdrh   sqlite_set_result_string(context, zBest, -1);
450bce8354Sdrh }
460bce8354Sdrh static void maxFunc(sqlite_func *context, int argc, const char **argv){
470bce8354Sdrh   const char *zBest;
480bce8354Sdrh   int i;
490bce8354Sdrh 
5089425d5eSdrh   if( argc==0 ) return;
510bce8354Sdrh   zBest = argv[0];
528912d106Sdrh   if( zBest==0 ) return;
530bce8354Sdrh   for(i=1; i<argc; i++){
548912d106Sdrh     if( argv[i]==0 ) return;
550bce8354Sdrh     if( sqliteCompare(argv[i], zBest)>0 ){
560bce8354Sdrh       zBest = argv[i];
570bce8354Sdrh     }
580bce8354Sdrh   }
590bce8354Sdrh   sqlite_set_result_string(context, zBest, -1);
600bce8354Sdrh }
610bce8354Sdrh 
620bce8354Sdrh /*
630bce8354Sdrh ** Implementation of the length() function
640bce8354Sdrh */
650bce8354Sdrh static void lengthFunc(sqlite_func *context, int argc, const char **argv){
660bce8354Sdrh   const char *z;
670bce8354Sdrh   int len;
680bce8354Sdrh 
690bce8354Sdrh   assert( argc==1 );
700bce8354Sdrh   z = argv[0];
718912d106Sdrh   if( z==0 ) return;
720bce8354Sdrh #ifdef SQLITE_UTF8
730bce8354Sdrh   for(len=0; *z; z++){ if( (0xc0&*z)!=0x80 ) len++; }
740bce8354Sdrh #else
750bce8354Sdrh   len = strlen(z);
760bce8354Sdrh #endif
770bce8354Sdrh   sqlite_set_result_int(context, len);
780bce8354Sdrh }
790bce8354Sdrh 
800bce8354Sdrh /*
810bce8354Sdrh ** Implementation of the abs() function
820bce8354Sdrh */
830bce8354Sdrh static void absFunc(sqlite_func *context, int argc, const char **argv){
840bce8354Sdrh   const char *z;
850bce8354Sdrh   assert( argc==1 );
860bce8354Sdrh   z = argv[0];
878912d106Sdrh   if( z==0 ) return;
888912d106Sdrh   if( z[0]=='-' && isdigit(z[1]) ) z++;
890bce8354Sdrh   sqlite_set_result_string(context, z, -1);
900bce8354Sdrh }
910bce8354Sdrh 
920bce8354Sdrh /*
930bce8354Sdrh ** Implementation of the substr() function
940bce8354Sdrh */
950bce8354Sdrh static void substrFunc(sqlite_func *context, int argc, const char **argv){
960bce8354Sdrh   const char *z;
970bce8354Sdrh #ifdef SQLITE_UTF8
980bce8354Sdrh   const char *z2;
990bce8354Sdrh   int i;
1000bce8354Sdrh #endif
1010bce8354Sdrh   int p1, p2, len;
1020bce8354Sdrh   assert( argc==3 );
1030bce8354Sdrh   z = argv[0];
1040bce8354Sdrh   if( z==0 ) return;
1050bce8354Sdrh   p1 = atoi(argv[1]?argv[1]:0);
1060bce8354Sdrh   p2 = atoi(argv[2]?argv[2]:0);
1070bce8354Sdrh #ifdef SQLITE_UTF8
10847c8a679Sdrh   for(len=0, z2=z; *z2; z2++){ if( (0xc0&*z2)!=0x80 ) len++; }
1090bce8354Sdrh #else
1100bce8354Sdrh   len = strlen(z);
1110bce8354Sdrh #endif
1120bce8354Sdrh   if( p1<0 ){
11389425d5eSdrh     p1 += len;
114653bc759Sdrh     if( p1<0 ){
115653bc759Sdrh       p2 += p1;
116653bc759Sdrh       p1 = 0;
117653bc759Sdrh     }
1180bce8354Sdrh   }else if( p1>0 ){
1190bce8354Sdrh     p1--;
1200bce8354Sdrh   }
1210bce8354Sdrh   if( p1+p2>len ){
1220bce8354Sdrh     p2 = len-p1;
1230bce8354Sdrh   }
1240bce8354Sdrh #ifdef SQLITE_UTF8
1250bce8354Sdrh   for(i=0; i<p1; i++){
1260bce8354Sdrh     assert( z[i] );
12747c8a679Sdrh     if( (z[i]&0xc0)==0x80 ) p1++;
1280bce8354Sdrh   }
12947c8a679Sdrh   while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p1++; }
1300bce8354Sdrh   for(; i<p1+p2; i++){
1310bce8354Sdrh     assert( z[i] );
13247c8a679Sdrh     if( (z[i]&0xc0)==0x80 ) p2++;
1330bce8354Sdrh   }
13447c8a679Sdrh   while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p2++; }
1350bce8354Sdrh #endif
136653bc759Sdrh   if( p2<0 ) p2 = 0;
1370bce8354Sdrh   sqlite_set_result_string(context, &z[p1], p2);
1380bce8354Sdrh }
1390bce8354Sdrh 
1400bce8354Sdrh /*
1410bce8354Sdrh ** Implementation of the round() function
1420bce8354Sdrh */
1430bce8354Sdrh static void roundFunc(sqlite_func *context, int argc, const char **argv){
1440bce8354Sdrh   int n;
1450bce8354Sdrh   double r;
1460bce8354Sdrh   char zBuf[100];
1470bce8354Sdrh   assert( argc==1 || argc==2 );
1488912d106Sdrh   if( argv[0]==0 || (argc==2 && argv[1]==0) ) return;
1498912d106Sdrh   n = argc==2 ? atoi(argv[1]) : 0;
1500bce8354Sdrh   if( n>30 ) n = 30;
1510bce8354Sdrh   if( n<0 ) n = 0;
1528912d106Sdrh   r = atof(argv[0]);
1530bce8354Sdrh   sprintf(zBuf,"%.*f",n,r);
1540bce8354Sdrh   sqlite_set_result_string(context, zBuf, -1);
1550bce8354Sdrh }
156dc04c583Sdrh 
157dc04c583Sdrh /*
158dc04c583Sdrh ** Implementation of the upper() and lower() SQL functions.
159dc04c583Sdrh */
1601350b030Sdrh static void upperFunc(sqlite_func *context, int argc, const char **argv){
161dc04c583Sdrh   char *z;
162dc04c583Sdrh   int i;
163dc04c583Sdrh   if( argc<1 || argv[0]==0 ) return;
164dc04c583Sdrh   z = sqlite_set_result_string(context, argv[0], -1);
165dc04c583Sdrh   if( z==0 ) return;
166dc04c583Sdrh   for(i=0; z[i]; i++){
167dc04c583Sdrh     if( islower(z[i]) ) z[i] = toupper(z[i]);
168dc04c583Sdrh   }
169dc04c583Sdrh }
1701350b030Sdrh static void lowerFunc(sqlite_func *context, int argc, const char **argv){
171dc04c583Sdrh   char *z;
172dc04c583Sdrh   int i;
173dc04c583Sdrh   if( argc<1 || argv[0]==0 ) return;
174dc04c583Sdrh   z = sqlite_set_result_string(context, argv[0], -1);
175dc04c583Sdrh   if( z==0 ) return;
176dc04c583Sdrh   for(i=0; z[i]; i++){
177dc04c583Sdrh     if( isupper(z[i]) ) z[i] = tolower(z[i]);
178dc04c583Sdrh   }
179dc04c583Sdrh }
180dc04c583Sdrh 
181dc04c583Sdrh /*
182fbc99082Sdrh ** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
183fbc99082Sdrh ** All three do the same thing.  They return the first argument
184fbc99082Sdrh ** non-NULL argument.
1853212e182Sdrh */
1863212e182Sdrh static void ifnullFunc(sqlite_func *context, int argc, const char **argv){
187fbc99082Sdrh   int i;
188fbc99082Sdrh   for(i=0; i<argc; i++){
189fbc99082Sdrh     if( argv[i] ){
190fbc99082Sdrh       sqlite_set_result_string(context, argv[i], -1);
191fbc99082Sdrh       break;
192fbc99082Sdrh     }
193fbc99082Sdrh   }
1943212e182Sdrh }
1953212e182Sdrh 
1963212e182Sdrh /*
197f9ffac96Sdrh ** Implementation of random().  Return a random integer.
198f9ffac96Sdrh */
199f9ffac96Sdrh static void randomFunc(sqlite_func *context, int argc, const char **argv){
200f9ffac96Sdrh   sqlite_set_result_int(context, sqliteRandomInteger());
201f9ffac96Sdrh }
202f9ffac96Sdrh 
203f9ffac96Sdrh /*
2046ed41ad7Sdrh ** Implementation of the last_insert_rowid() SQL function.  The return
2056ed41ad7Sdrh ** value is the same as the sqlite_last_insert_rowid() API function.
2066ed41ad7Sdrh */
2070ac65892Sdrh static void last_insert_rowid(sqlite_func *context, int arg, const char **argv){
2086ed41ad7Sdrh   sqlite *db = sqlite_user_data(context);
2096ed41ad7Sdrh   sqlite_set_result_int(context, sqlite_last_insert_rowid(db));
2106ed41ad7Sdrh }
2116ed41ad7Sdrh 
2126ed41ad7Sdrh /*
2130ac65892Sdrh ** Implementation of the like() SQL function.  This function implements
2140ac65892Sdrh ** the build-in LIKE operator.  The first argument to the function is the
2150ac65892Sdrh ** string and the second argument is the pattern.  So, the SQL statements:
2160ac65892Sdrh **
2170ac65892Sdrh **       A LIKE B
2180ac65892Sdrh **
2190ac65892Sdrh ** is implemented as like(A,B).
2200ac65892Sdrh */
2210ac65892Sdrh static void likeFunc(sqlite_func *context, int arg, const char **argv){
2228912d106Sdrh   if( argv[0]==0 || argv[1]==0 ) return;
223*ec1bd0bdSdrh   sqlite_set_result_int(context,
224*ec1bd0bdSdrh     sqliteLikeCompare((const unsigned char*)argv[0],
225*ec1bd0bdSdrh                       (const unsigned char*)argv[1]));
2260ac65892Sdrh }
2270ac65892Sdrh 
2280ac65892Sdrh /*
2290ac65892Sdrh ** Implementation of the glob() SQL function.  This function implements
2300ac65892Sdrh ** the build-in GLOB operator.  The first argument to the function is the
2310ac65892Sdrh ** string and the second argument is the pattern.  So, the SQL statements:
2320ac65892Sdrh **
2330ac65892Sdrh **       A GLOB B
2340ac65892Sdrh **
2350ac65892Sdrh ** is implemented as glob(A,B).
2360ac65892Sdrh */
2370ac65892Sdrh static void globFunc(sqlite_func *context, int arg, const char **argv){
2388912d106Sdrh   if( argv[0]==0 || argv[1]==0 ) return;
239*ec1bd0bdSdrh   sqlite_set_result_int(context,
240*ec1bd0bdSdrh     sqliteGlobCompare((const unsigned char*)argv[0],
241*ec1bd0bdSdrh                       (const unsigned char*)argv[1]));
2428912d106Sdrh }
2438912d106Sdrh 
2448912d106Sdrh /*
2458912d106Sdrh ** Implementation of the NULLIF(x,y) function.  The result is the first
2468912d106Sdrh ** argument if the arguments are different.  The result is NULL if the
2478912d106Sdrh ** arguments are equal to each other.
2488912d106Sdrh */
2498912d106Sdrh static void nullifFunc(sqlite_func *context, int argc, const char **argv){
2508912d106Sdrh   if( argv[0]!=0 && sqliteCompare(argv[0],argv[1])!=0 ){
2518912d106Sdrh     sqlite_set_result_string(context, argv[0], -1);
2528912d106Sdrh   }
2530ac65892Sdrh }
2540ac65892Sdrh 
255647cb0e1Sdrh /*
256647cb0e1Sdrh ** Implementation of the VERSION(*) function.  The result is the version
257647cb0e1Sdrh ** of the SQLite library that is running.
258647cb0e1Sdrh */
259647cb0e1Sdrh static void versionFunc(sqlite_func *context, int argc, const char **argv){
260647cb0e1Sdrh   sqlite_set_result_string(context, sqlite_version, -1);
261647cb0e1Sdrh }
262647cb0e1Sdrh 
26347394703Sdrh /*
26447394703Sdrh ** EXPERIMENTAL - This is not an official function.  The interface may
26547394703Sdrh ** change.  This function may disappear.  Do not write code that depends
26647394703Sdrh ** on this function.
26747394703Sdrh **
26847394703Sdrh ** Implementation of the QUOTE() function.  This function takes a single
26947394703Sdrh ** argument.  If the argument is numeric, the return value is the same as
27047394703Sdrh ** the argument.  If the argument is NULL, the return value is the string
27147394703Sdrh ** "NULL".  Otherwise, the argument is enclosed in single quotes with
27247394703Sdrh ** single-quote escapes.
27347394703Sdrh */
27447394703Sdrh static void quoteFunc(sqlite_func *context, int argc, const char **argv){
27547394703Sdrh   if( argc<1 ) return;
27647394703Sdrh   if( argv[0]==0 ){
27747394703Sdrh     sqlite_set_result_string(context, "NULL", 4);
27847394703Sdrh   }else if( sqliteIsNumber(argv[0]) ){
27947394703Sdrh     sqlite_set_result_string(context, argv[0], -1);
28047394703Sdrh   }else{
28147394703Sdrh     int i,j,n;
28247394703Sdrh     char *z;
28347394703Sdrh     for(i=n=0; argv[0][i]; i++){ if( argv[0][i]=='\'' ) n++; }
28447394703Sdrh     z = sqliteMalloc( i+n+3 );
28547394703Sdrh     if( z==0 ) return;
28647394703Sdrh     z[0] = '\'';
28747394703Sdrh     for(i=0, j=1; argv[0][i]; i++){
28847394703Sdrh       z[j++] = argv[0][i];
28947394703Sdrh       if( argv[0][i]=='\'' ){
29047394703Sdrh         z[j++] = '\'';
29147394703Sdrh       }
29247394703Sdrh     }
29347394703Sdrh     z[j++] = '\'';
29447394703Sdrh     z[j] = 0;
29547394703Sdrh     sqlite_set_result_string(context, z, j);
29647394703Sdrh     sqliteFree(z);
29747394703Sdrh   }
29847394703Sdrh }
29947394703Sdrh 
300d24cc427Sdrh #ifdef SQLITE_SOUNDEX
301d24cc427Sdrh /*
302d24cc427Sdrh ** Compute the soundex encoding of a word.
303d24cc427Sdrh */
304d24cc427Sdrh static void soundexFunc(sqlite_func *context, int argc, const char **argv){
305d24cc427Sdrh   char zResult[8];
306d24cc427Sdrh   const char *zIn;
307d24cc427Sdrh   int i, j;
308d24cc427Sdrh   static const unsigned char iCode[] = {
309d24cc427Sdrh     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
310d24cc427Sdrh     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
311d24cc427Sdrh     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
312d24cc427Sdrh     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
313d24cc427Sdrh     0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
314d24cc427Sdrh     1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
315d24cc427Sdrh     0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
316d24cc427Sdrh     1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
317d24cc427Sdrh   };
318d24cc427Sdrh   assert( argc==1 );
319d24cc427Sdrh   zIn = argv[0];
320d24cc427Sdrh   for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
321d24cc427Sdrh   if( zIn[i] ){
322d24cc427Sdrh     zResult[0] = toupper(zIn[i]);
323d24cc427Sdrh     for(j=1; j<4 && zIn[i]; i++){
324d24cc427Sdrh       int code = iCode[zIn[i]&0x7f];
325d24cc427Sdrh       if( code>0 ){
326d24cc427Sdrh         zResult[j++] = code + '0';
327d24cc427Sdrh       }
328d24cc427Sdrh     }
329d24cc427Sdrh     while( j<4 ){
330d24cc427Sdrh       zResult[j++] = '0';
331d24cc427Sdrh     }
332d24cc427Sdrh     zResult[j] = 0;
333d24cc427Sdrh     sqlite_set_result_string(context, zResult, 4);
334d24cc427Sdrh   }else{
335937dd84dSdrh     sqlite_set_result_string(context, "?000", 4);
336d24cc427Sdrh   }
337d24cc427Sdrh }
338d24cc427Sdrh #endif
339d24cc427Sdrh 
340193a6b41Sdrh #ifdef SQLITE_TEST
341193a6b41Sdrh /*
342193a6b41Sdrh ** This function generates a string of random characters.  Used for
343193a6b41Sdrh ** generating test data.
344193a6b41Sdrh */
345193a6b41Sdrh static void randStr(sqlite_func *context, int argc, const char **argv){
346193a6b41Sdrh   static const char zSrc[] =
347193a6b41Sdrh      "abcdefghijklmnopqrstuvwxyz"
348193a6b41Sdrh      "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
349193a6b41Sdrh      "0123456789"
350193a6b41Sdrh      ".-!,:*^+=_|?/<> ";
351193a6b41Sdrh   int iMin, iMax, n, r, i;
352193a6b41Sdrh   char zBuf[1000];
353193a6b41Sdrh   if( argc>=1 ){
354193a6b41Sdrh     iMin = atoi(argv[0]);
355193a6b41Sdrh     if( iMin<0 ) iMin = 0;
356193a6b41Sdrh     if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
357193a6b41Sdrh   }else{
358193a6b41Sdrh     iMin = 1;
359193a6b41Sdrh   }
360193a6b41Sdrh   if( argc>=2 ){
361193a6b41Sdrh     iMax = atoi(argv[1]);
362193a6b41Sdrh     if( iMax<iMin ) iMax = iMin;
363193a6b41Sdrh     if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf);
364193a6b41Sdrh   }else{
365193a6b41Sdrh     iMax = 50;
366193a6b41Sdrh   }
367193a6b41Sdrh   n = iMin;
368193a6b41Sdrh   if( iMax>iMin ){
36939581966Sdrh     r = sqliteRandomInteger() & 0x7fffffff;
370193a6b41Sdrh     n += r%(iMax + 1 - iMin);
371193a6b41Sdrh   }
372193a6b41Sdrh   r = 0;
373193a6b41Sdrh   for(i=0; i<n; i++){
374193a6b41Sdrh     r = (r + sqliteRandomByte())% (sizeof(zSrc)-1);
375193a6b41Sdrh     zBuf[i] = zSrc[r];
376193a6b41Sdrh   }
377193a6b41Sdrh   zBuf[n] = 0;
378193a6b41Sdrh   sqlite_set_result_string(context, zBuf, n);
379193a6b41Sdrh }
380193a6b41Sdrh #endif
381193a6b41Sdrh 
3820ac65892Sdrh /*
383d3a149efSdrh ** An instance of the following structure holds the context of a
384dd5baa95Sdrh ** sum() or avg() aggregate computation.
385dd5baa95Sdrh */
386dd5baa95Sdrh typedef struct SumCtx SumCtx;
387dd5baa95Sdrh struct SumCtx {
388dd5baa95Sdrh   double sum;     /* Sum of terms */
389739105c7Sdrh   int cnt;        /* Number of elements summed */
390dd5baa95Sdrh };
391dd5baa95Sdrh 
392dd5baa95Sdrh /*
393dd5baa95Sdrh ** Routines used to compute the sum or average.
394dd5baa95Sdrh */
395dd5baa95Sdrh static void sumStep(sqlite_func *context, int argc, const char **argv){
396dd5baa95Sdrh   SumCtx *p;
397dd5baa95Sdrh   if( argc<1 ) return;
398dd5baa95Sdrh   p = sqlite_aggregate_context(context, sizeof(*p));
399739105c7Sdrh   if( p && argv[0] ){
400739105c7Sdrh     p->sum += atof(argv[0]);
401739105c7Sdrh     p->cnt++;
402739105c7Sdrh   }
403dd5baa95Sdrh }
404dd5baa95Sdrh static void sumFinalize(sqlite_func *context){
405dd5baa95Sdrh   SumCtx *p;
406dd5baa95Sdrh   p = sqlite_aggregate_context(context, sizeof(*p));
40789425d5eSdrh   sqlite_set_result_double(context, p ? p->sum : 0.0);
408dd5baa95Sdrh }
409dd5baa95Sdrh static void avgFinalize(sqlite_func *context){
410dd5baa95Sdrh   SumCtx *p;
411dd5baa95Sdrh   p = sqlite_aggregate_context(context, sizeof(*p));
412739105c7Sdrh   if( p && p->cnt>0 ){
413739105c7Sdrh     sqlite_set_result_double(context, p->sum/(double)p->cnt);
414dd5baa95Sdrh   }
415dd5baa95Sdrh }
416dd5baa95Sdrh 
417dd5baa95Sdrh /*
418dd5baa95Sdrh ** An instance of the following structure holds the context of a
419a2ed5601Sdrh ** variance or standard deviation computation.
420d3a149efSdrh */
421d3a149efSdrh typedef struct StdDevCtx StdDevCtx;
422d3a149efSdrh struct StdDevCtx {
423d3a149efSdrh   double sum;     /* Sum of terms */
424d3a149efSdrh   double sum2;    /* Sum of the squares of terms */
425739105c7Sdrh   int cnt;        /* Number of terms counted */
426d3a149efSdrh };
427d3a149efSdrh 
428ef2daf54Sdrh #if 0   /* Omit because math library is required */
429d3a149efSdrh /*
430d3a149efSdrh ** Routines used to compute the standard deviation as an aggregate.
431d3a149efSdrh */
4321350b030Sdrh static void stdDevStep(sqlite_func *context, int argc, const char **argv){
433d3a149efSdrh   StdDevCtx *p;
434d3a149efSdrh   double x;
4351350b030Sdrh   if( argc<1 ) return;
4361350b030Sdrh   p = sqlite_aggregate_context(context, sizeof(*p));
437739105c7Sdrh   if( p && argv[0] ){
438739105c7Sdrh     x = atof(argv[0]);
439d3a149efSdrh     p->sum += x;
440d3a149efSdrh     p->sum2 += x*x;
441739105c7Sdrh     p->cnt++;
442739105c7Sdrh   }
443d3a149efSdrh }
4441350b030Sdrh static void stdDevFinalize(sqlite_func *context){
445dd5baa95Sdrh   double rN = sqlite_aggregate_count(context);
4461350b030Sdrh   StdDevCtx *p = sqlite_aggregate_context(context, sizeof(*p));
447739105c7Sdrh   if( p && p->cnt>1 ){
448739105c7Sdrh     double rCnt = cnt;
449d3a149efSdrh     sqlite_set_result_double(context,
450739105c7Sdrh        sqrt((p->sum2 - p->sum*p->sum/rCnt)/(rCnt-1.0)));
451d3a149efSdrh   }
452d3a149efSdrh }
453ef2daf54Sdrh #endif
454d3a149efSdrh 
4550bce8354Sdrh /*
4560bce8354Sdrh ** The following structure keeps track of state information for the
4570bce8354Sdrh ** count() aggregate function.
4580bce8354Sdrh */
4590bce8354Sdrh typedef struct CountCtx CountCtx;
4600bce8354Sdrh struct CountCtx {
4610bce8354Sdrh   int n;
4620bce8354Sdrh };
463dd5baa95Sdrh 
4640bce8354Sdrh /*
4650bce8354Sdrh ** Routines to implement the count() aggregate function.
4660bce8354Sdrh */
4670bce8354Sdrh static void countStep(sqlite_func *context, int argc, const char **argv){
4680bce8354Sdrh   CountCtx *p;
4690bce8354Sdrh   p = sqlite_aggregate_context(context, sizeof(*p));
4700bce8354Sdrh   if( (argc==0 || argv[0]) && p ){
4710bce8354Sdrh     p->n++;
4720bce8354Sdrh   }
4730bce8354Sdrh }
4740bce8354Sdrh static void countFinalize(sqlite_func *context){
4750bce8354Sdrh   CountCtx *p;
4760bce8354Sdrh   p = sqlite_aggregate_context(context, sizeof(*p));
477f55f25f0Sdrh   sqlite_set_result_int(context, p ? p->n : 0);
4780bce8354Sdrh }
4790bce8354Sdrh 
4800bce8354Sdrh /*
4810bce8354Sdrh ** This function tracks state information for the min() and max()
4820bce8354Sdrh ** aggregate functions.
4830bce8354Sdrh */
4840bce8354Sdrh typedef struct MinMaxCtx MinMaxCtx;
4850bce8354Sdrh struct MinMaxCtx {
4860bce8354Sdrh   char *z;         /* The best so far */
4870bce8354Sdrh   char zBuf[28];   /* Space that can be used for storage */
4880bce8354Sdrh };
4890bce8354Sdrh 
4900bce8354Sdrh /*
4910bce8354Sdrh ** Routines to implement min() and max() aggregate functions.
4920bce8354Sdrh */
4930bce8354Sdrh static void minStep(sqlite_func *context, int argc, const char **argv){
4940bce8354Sdrh   MinMaxCtx *p;
4950bce8354Sdrh   p = sqlite_aggregate_context(context, sizeof(*p));
496739105c7Sdrh   if( p==0 || argc<1 || argv[0]==0 ) return;
497f570f011Sdrh   if( p->z==0 || sqliteCompare(argv[0],p->z)<0 ){
4988912d106Sdrh     int len;
4990bce8354Sdrh     if( p->z && p->z!=p->zBuf ){
5000bce8354Sdrh       sqliteFree(p->z);
5010bce8354Sdrh     }
5028912d106Sdrh     len = strlen(argv[0]);
5030bce8354Sdrh     if( len < sizeof(p->zBuf) ){
5040bce8354Sdrh       p->z = p->zBuf;
5050bce8354Sdrh     }else{
5060bce8354Sdrh       p->z = sqliteMalloc( len+1 );
5070bce8354Sdrh       if( p->z==0 ) return;
5080bce8354Sdrh     }
5090bce8354Sdrh     strcpy(p->z, argv[0]);
5100bce8354Sdrh   }
5110bce8354Sdrh }
5120bce8354Sdrh static void maxStep(sqlite_func *context, int argc, const char **argv){
5130bce8354Sdrh   MinMaxCtx *p;
5140bce8354Sdrh   p = sqlite_aggregate_context(context, sizeof(*p));
515739105c7Sdrh   if( p==0 || argc<1 || argv[0]==0 ) return;
516f570f011Sdrh   if( p->z==0 || sqliteCompare(argv[0],p->z)>0 ){
5178912d106Sdrh     int len;
5180bce8354Sdrh     if( p->z && p->z!=p->zBuf ){
5190bce8354Sdrh       sqliteFree(p->z);
5200bce8354Sdrh     }
5218912d106Sdrh     len = strlen(argv[0]);
5220bce8354Sdrh     if( len < sizeof(p->zBuf) ){
5230bce8354Sdrh       p->z = p->zBuf;
5240bce8354Sdrh     }else{
5250bce8354Sdrh       p->z = sqliteMalloc( len+1 );
5260bce8354Sdrh       if( p->z==0 ) return;
5270bce8354Sdrh     }
5280bce8354Sdrh     strcpy(p->z, argv[0]);
5290bce8354Sdrh   }
5300bce8354Sdrh }
5310bce8354Sdrh static void minMaxFinalize(sqlite_func *context){
5320bce8354Sdrh   MinMaxCtx *p;
5330bce8354Sdrh   p = sqlite_aggregate_context(context, sizeof(*p));
534739105c7Sdrh   if( p && p->z ){
5350bce8354Sdrh     sqlite_set_result_string(context, p->z, strlen(p->z));
5360bce8354Sdrh   }
5370bce8354Sdrh   if( p && p->z && p->z!=p->zBuf ){
5380bce8354Sdrh     sqliteFree(p->z);
5390bce8354Sdrh   }
5400bce8354Sdrh }
541dd5baa95Sdrh 
542771d8c3bSdrh /****************************************************************************
543771d8c3bSdrh ** Time and date functions.
544771d8c3bSdrh **
545771d8c3bSdrh ** SQLite processes all times and dates as Julian Day numbers.  The
546771d8c3bSdrh ** dates and times are stored as the number of days since noon
54787adaa9aSdrh ** in Greenwich on November 24, 4714 B.C. according to the Gregorian
54887adaa9aSdrh ** calendar system.
54987adaa9aSdrh **
550771d8c3bSdrh ** This implement requires years to be expressed as a 4-digit number
551771d8c3bSdrh ** which means that only dates between 0000-01-01 and 9999-12-31 can
552771d8c3bSdrh ** be represented, even though julian day numbers allow a much wider
553771d8c3bSdrh ** range of dates.
554771d8c3bSdrh **
555771d8c3bSdrh ** The Gregorian calendar system is used for all dates and times,
55687adaa9aSdrh ** even those that predate the Gregorian calendar.  Historians usually
557771d8c3bSdrh ** use the Julian calendar for dates prior to 1582-10-15 and for some
558771d8c3bSdrh ** dates afterwards, depending on locale.  Beware of this difference.
559771d8c3bSdrh **
560771d8c3bSdrh ** The conversion algorithms are implemented based on descriptions
561771d8c3bSdrh ** in the following text:
562771d8c3bSdrh **
563771d8c3bSdrh **      Jean Meeus
564771d8c3bSdrh **      Astronomical Algorithms, 2nd Edition, 1998
565771d8c3bSdrh **      ISBM 0-943396-61-1
566771d8c3bSdrh **      Willmann-Bell, Inc
567771d8c3bSdrh **      Richmond, Virginia (USA)
568771d8c3bSdrh */
569771d8c3bSdrh #ifndef SQLITE_OMIT_DATETIME_FUNCS
570771d8c3bSdrh 
571771d8c3bSdrh /*
572771d8c3bSdrh ** Convert N digits from zDate into an integer.  Return
573771d8c3bSdrh ** -1 if zDate does not begin with N digits.
574771d8c3bSdrh */
575771d8c3bSdrh static int getDigits(const char *zDate, int N){
576771d8c3bSdrh   int val = 0;
577771d8c3bSdrh   while( N-- ){
578771d8c3bSdrh     if( !isdigit(*zDate) ) return -1;
579771d8c3bSdrh     val = val*10 + *zDate - '0';
580771d8c3bSdrh     zDate++;
581771d8c3bSdrh   }
582771d8c3bSdrh   return val;
583771d8c3bSdrh }
584771d8c3bSdrh 
585771d8c3bSdrh /*
58687adaa9aSdrh ** Parse times of the form HH:MM:SS or HH:MM.  Store the
587771d8c3bSdrh ** result (in days) in *prJD.
588771d8c3bSdrh **
589771d8c3bSdrh ** Return 1 if there is a parsing error and 0 on success.
590771d8c3bSdrh */
591771d8c3bSdrh static int parseHhMmSs(const char *zDate, double *prJD){
592771d8c3bSdrh   int h, m, s;
593771d8c3bSdrh   h = getDigits(zDate, 2);
594771d8c3bSdrh   if( h<0 || zDate[2]!=':' ) return 1;
595771d8c3bSdrh   zDate += 3;
596771d8c3bSdrh   m = getDigits(zDate, 2);
597771d8c3bSdrh   if( m<0 || m>59 ) return 1;
598771d8c3bSdrh   zDate += 2;
599771d8c3bSdrh   if( *zDate==':' ){
600771d8c3bSdrh     s = getDigits(&zDate[1], 2);
601771d8c3bSdrh     if( s<0 || s>59 ) return 1;
602771d8c3bSdrh     zDate += 3;
603771d8c3bSdrh   }else{
604771d8c3bSdrh     s = 0;
605771d8c3bSdrh   }
606771d8c3bSdrh   while( isspace(*zDate) ){ zDate++; }
607771d8c3bSdrh   *prJD = (h*3600.0 + m*60.0 + s)/86400.0;
608771d8c3bSdrh   return 0;
609771d8c3bSdrh }
610771d8c3bSdrh 
611771d8c3bSdrh /*
612771d8c3bSdrh ** Parse dates of the form
613771d8c3bSdrh **
614771d8c3bSdrh **     YYYY-MM-DD HH:MM:SS
615771d8c3bSdrh **     YYYY-MM-DD HH:MM
616771d8c3bSdrh **     YYYY-MM-DD
617771d8c3bSdrh **
618771d8c3bSdrh ** Write the result as a julian day number in *prJD.  Return 0
619771d8c3bSdrh ** on success and 1 if the input string is not a well-formed
620771d8c3bSdrh ** date.
621771d8c3bSdrh */
622771d8c3bSdrh static int parseYyyyMmDd(const char *zDate, double *prJD){
623771d8c3bSdrh   int Y, M, D;
624771d8c3bSdrh   double rTime;
625771d8c3bSdrh   int A, B, X1, X2;
626771d8c3bSdrh 
627771d8c3bSdrh   Y = getDigits(zDate, 4);
628771d8c3bSdrh   if( Y<0 || zDate[4]!='-' ) return 1;
629771d8c3bSdrh   zDate += 5;
630771d8c3bSdrh   M = getDigits(zDate, 2);
631771d8c3bSdrh   if( M<=0 || M>12 || zDate[2]!='-' ) return 1;
632771d8c3bSdrh   zDate += 3;
633771d8c3bSdrh   D = getDigits(zDate, 2);
634771d8c3bSdrh   if( D<=0 || D>31 ) return 1;
635771d8c3bSdrh   zDate += 2;
636771d8c3bSdrh   while( isspace(*zDate) ){ zDate++; }
637771d8c3bSdrh   if( isdigit(*zDate) ){
638771d8c3bSdrh     if( parseHhMmSs(zDate, &rTime) ) return 1;
639771d8c3bSdrh   }else if( *zDate==0 ){
640771d8c3bSdrh     rTime = 0.0;
641771d8c3bSdrh   }else{
642771d8c3bSdrh     return 1;
643771d8c3bSdrh   }
644771d8c3bSdrh 
645771d8c3bSdrh   /* The year, month, and day are now stored in Y, M, and D.  Convert
646771d8c3bSdrh   ** these into the Julian Day number.  See Meeus page 61.
647771d8c3bSdrh   */
648771d8c3bSdrh   if( M<=2 ){
649771d8c3bSdrh     Y--;
650771d8c3bSdrh     M += 12;
651771d8c3bSdrh   }
652771d8c3bSdrh   A = Y/100;
653771d8c3bSdrh   B = 2 - A + (A/4);
654771d8c3bSdrh   X1 = 365.25*(Y+4716);
655771d8c3bSdrh   X2 = 30.6001*(M+1);
656771d8c3bSdrh   *prJD = X1 + X2 + D + B - 1524.5 + rTime;
657771d8c3bSdrh   return 0;
658771d8c3bSdrh }
659771d8c3bSdrh 
660771d8c3bSdrh /*
661771d8c3bSdrh ** Attempt to parse the given string into a Julian Day Number.  Return
662771d8c3bSdrh ** the number of errors.
663771d8c3bSdrh **
664771d8c3bSdrh ** The following are acceptable forms for the input string:
665771d8c3bSdrh **
666771d8c3bSdrh **      YYYY-MM-DD
667771d8c3bSdrh **      YYYY-MM-DD HH:MM
668771d8c3bSdrh **      YYYY-MM-DD HH:MM:SS
669771d8c3bSdrh **      HH:MM
670771d8c3bSdrh **      HH:MM:SS
671771d8c3bSdrh **      DDDD.DD
672771d8c3bSdrh **      now
673771d8c3bSdrh */
674771d8c3bSdrh static int parseDateOrTime(const char *zDate, double *prJD){
675771d8c3bSdrh   int i;
676771d8c3bSdrh   for(i=0; isdigit(zDate[i]); i++){}
677771d8c3bSdrh   if( i==4 && zDate[i]=='-' ){
678771d8c3bSdrh     return parseYyyyMmDd(zDate, prJD);
679771d8c3bSdrh   }else if( i==2 && zDate[i]==':' ){
680771d8c3bSdrh     return parseHhMmSs(zDate, prJD);
681771d8c3bSdrh   }else if( i==0 && sqliteStrICmp(zDate,"now")==0 ){
682771d8c3bSdrh     return sqliteOsCurrentTime(prJD);
683771d8c3bSdrh   }else if( sqliteIsNumber(zDate) ){
684771d8c3bSdrh     *prJD = atof(zDate);
685771d8c3bSdrh     return 0;
686771d8c3bSdrh   }
687771d8c3bSdrh   return 1;
688771d8c3bSdrh }
689771d8c3bSdrh 
690771d8c3bSdrh /*
69187adaa9aSdrh ** A structure for holding date and time.
69287adaa9aSdrh */
69387adaa9aSdrh typedef struct DateTime DateTime;
69487adaa9aSdrh struct DateTime {
69587adaa9aSdrh   double rJD;    /* The julian day number */
69687adaa9aSdrh   int Y, M, D;   /* Year, month, and day */
69787adaa9aSdrh   int h, m, s;   /* Hour minute and second */
69887adaa9aSdrh };
69987adaa9aSdrh 
70087adaa9aSdrh /*
70187adaa9aSdrh ** Break up a julian day number into year, month, day, hour, minute, second.
702771d8c3bSdrh ** This function assume the Gregorian calendar - even for dates prior
703771d8c3bSdrh ** to the invention of the Gregorian calendar in 1582.
704771d8c3bSdrh **
705771d8c3bSdrh ** See Meeus page 63.
70687adaa9aSdrh **
70787adaa9aSdrh ** If mode==1 only the year, month, and day are computed.  If mode==2
70887adaa9aSdrh ** then only the hour, minute, and second are computed.  If mode==3 then
70987adaa9aSdrh ** everything is computed.  If mode==0, this routine is a no-op.
710771d8c3bSdrh */
71187adaa9aSdrh static void decomposeDate(DateTime *p, int mode){
71287adaa9aSdrh   int Z;
71387adaa9aSdrh   Z = p->rJD + 0.5;
71487adaa9aSdrh   if( mode & 1 ){
71587adaa9aSdrh     int A, B, C, D, E, X1;
716771d8c3bSdrh     A = (Z - 1867216.25)/36524.25;
717771d8c3bSdrh     A = Z + 1 + A - (A/4);
718771d8c3bSdrh     B = A + 1524;
719771d8c3bSdrh     C = (B - 122.1)/365.25;
720771d8c3bSdrh     D = 365.25*C;
721771d8c3bSdrh     E = (B-D)/30.6001;
722771d8c3bSdrh     X1 = 30.6001*E;
72387adaa9aSdrh     p->D = B - D - X1;
72487adaa9aSdrh     p->M = E<14 ? E-1 : E-13;
72587adaa9aSdrh     p->Y = p->M>2 ? C - 4716 : C - 4715;
72687adaa9aSdrh   }
72787adaa9aSdrh   if( mode & 2 ){
72887adaa9aSdrh     p->s = (p->rJD + 0.5 - Z)*86400.0;
72987adaa9aSdrh     p->h = p->s/3600;
73087adaa9aSdrh     p->s -= p->h*3600;
73187adaa9aSdrh     p->m = p->s/60;
73287adaa9aSdrh     p->s -= p->m*60;
73387adaa9aSdrh   }
734771d8c3bSdrh }
735771d8c3bSdrh 
736771d8c3bSdrh /*
73787adaa9aSdrh ** Check to see that all arguments are valid date strings.  If any
73887adaa9aSdrh ** argument is not a valid date string, return 0.  If all arguments
73987adaa9aSdrh ** are valid, return 1 and write into *p->rJD the sum of the julian day
74087adaa9aSdrh ** numbers for all date strings.
74187adaa9aSdrh **
74287adaa9aSdrh ** A "valid" date string is one that is accepted by parseDateOrTime().
74387adaa9aSdrh **
74487adaa9aSdrh ** The mode argument is passed through to decomposeDate() in order to
74587adaa9aSdrh ** fill in the year, month, day, hour, minute, and second of the *p
74687adaa9aSdrh ** structure, if desired.
747771d8c3bSdrh */
74887adaa9aSdrh static int isDate(int argc, const char **argv, DateTime *p, int mode){
749771d8c3bSdrh   double r;
750771d8c3bSdrh   int i;
75187adaa9aSdrh   p->rJD = 0.0;
752771d8c3bSdrh   for(i=0; i<argc; i++){
753771d8c3bSdrh     if( argv[i]==0 ) return 0;
754771d8c3bSdrh     if( parseDateOrTime(argv[i], &r) ) return 0;
75587adaa9aSdrh     p->rJD += r;
756771d8c3bSdrh   }
75787adaa9aSdrh   decomposeDate(p, mode);
758771d8c3bSdrh   return 1;
759771d8c3bSdrh }
760771d8c3bSdrh 
76187adaa9aSdrh 
762771d8c3bSdrh /*
763771d8c3bSdrh ** The following routines implement the various date and time functions
764771d8c3bSdrh ** of SQLite.
765771d8c3bSdrh */
766771d8c3bSdrh static void juliandayFunc(sqlite_func *context, int argc, const char **argv){
76787adaa9aSdrh   DateTime x;
76887adaa9aSdrh   if( isDate(argc, argv, &x, 0) ){
76987adaa9aSdrh     sqlite_set_result_double(context, x.rJD);
770771d8c3bSdrh   }
771771d8c3bSdrh }
772771d8c3bSdrh static void timestampFunc(sqlite_func *context, int argc, const char **argv){
77387adaa9aSdrh   DateTime x;
77487adaa9aSdrh   if( isDate(argc, argv, &x, 3) ){
775771d8c3bSdrh     char zBuf[100];
77687adaa9aSdrh     sprintf(zBuf, "%04d-%02d-%02d %02d:%02d:%02d",x.Y, x.M, x.D, x.h, x.m, x.s);
777771d8c3bSdrh     sqlite_set_result_string(context, zBuf, -1);
778771d8c3bSdrh   }
779771d8c3bSdrh }
780771d8c3bSdrh static void timeFunc(sqlite_func *context, int argc, const char **argv){
78187adaa9aSdrh   DateTime x;
78287adaa9aSdrh   if( isDate(argc, argv, &x, 2) ){
783771d8c3bSdrh     char zBuf[100];
78487adaa9aSdrh     sprintf(zBuf, "%02d:%02d:%02d", x.h, x.m, x.s);
785771d8c3bSdrh     sqlite_set_result_string(context, zBuf, -1);
786771d8c3bSdrh   }
787771d8c3bSdrh }
788771d8c3bSdrh static void dateFunc(sqlite_func *context, int argc, const char **argv){
78987adaa9aSdrh   DateTime x;
79087adaa9aSdrh   if( isDate(argc, argv, &x, 1) ){
791771d8c3bSdrh     char zBuf[100];
79287adaa9aSdrh     sprintf(zBuf, "%04d-%02d-%02d", x.Y, x.M, x.D);
793771d8c3bSdrh     sqlite_set_result_string(context, zBuf, -1);
794771d8c3bSdrh   }
795771d8c3bSdrh }
796771d8c3bSdrh static void yearFunc(sqlite_func *context, int argc, const char **argv){
79787adaa9aSdrh   DateTime x;
79887adaa9aSdrh   if( isDate(argc, argv, &x, 1) ){
79987adaa9aSdrh     sqlite_set_result_int(context, x.Y);
800771d8c3bSdrh   }
801771d8c3bSdrh }
802771d8c3bSdrh static void monthFunc(sqlite_func *context, int argc, const char **argv){
80387adaa9aSdrh   DateTime x;
80487adaa9aSdrh   if( isDate(argc, argv, &x, 1) ){
80587adaa9aSdrh     sqlite_set_result_int(context, x.M);
806771d8c3bSdrh   }
807771d8c3bSdrh }
808771d8c3bSdrh static void dayofweekFunc(sqlite_func *context, int argc, const char **argv){
80987adaa9aSdrh   DateTime x;
81087adaa9aSdrh   if( isDate(argc, argv, &x, 0) ){
81187adaa9aSdrh     int Z = x.rJD + 1.5;
812771d8c3bSdrh     sqlite_set_result_int(context, Z % 7);
813771d8c3bSdrh   }
814771d8c3bSdrh }
815771d8c3bSdrh static void dayofmonthFunc(sqlite_func *context, int argc, const char **argv){
81687adaa9aSdrh   DateTime x;
81787adaa9aSdrh   if( isDate(argc, argv, &x, 1) ){
81887adaa9aSdrh     sqlite_set_result_int(context, x.D);
819771d8c3bSdrh   }
820771d8c3bSdrh }
821771d8c3bSdrh static void secondFunc(sqlite_func *context, int argc, const char **argv){
82287adaa9aSdrh   DateTime x;
82387adaa9aSdrh   if( isDate(argc, argv, &x, 2) ){
82487adaa9aSdrh     sqlite_set_result_int(context, x.s);
825771d8c3bSdrh   }
826771d8c3bSdrh }
827771d8c3bSdrh static void minuteFunc(sqlite_func *context, int argc, const char **argv){
82887adaa9aSdrh   DateTime x;
82987adaa9aSdrh   if( isDate(argc, argv, &x, 2) ){
83087adaa9aSdrh     sqlite_set_result_int(context, x.m);
831771d8c3bSdrh   }
832771d8c3bSdrh }
833771d8c3bSdrh static void hourFunc(sqlite_func *context, int argc, const char **argv){
83487adaa9aSdrh   DateTime x;
83587adaa9aSdrh   if( isDate(argc, argv, &x, 2) ){
83687adaa9aSdrh     sqlite_set_result_int(context, x.h);
837771d8c3bSdrh   }
838771d8c3bSdrh }
839771d8c3bSdrh #endif /* !defined(SQLITE_OMIT_DATETIME_FUNCS) */
840771d8c3bSdrh /***************************************************************************/
841771d8c3bSdrh 
842d3a149efSdrh /*
843a2ed5601Sdrh ** This function registered all of the above C functions as SQL
844a2ed5601Sdrh ** functions.  This should be the only routine in this file with
845a2ed5601Sdrh ** external linkage.
846dc04c583Sdrh */
84728f4b688Sdrh void sqliteRegisterBuiltinFunctions(sqlite *db){
8480bce8354Sdrh   static struct {
8490bce8354Sdrh      char *zName;
8500bce8354Sdrh      int nArg;
851c9b84a1fSdrh      int dataType;
8520bce8354Sdrh      void (*xFunc)(sqlite_func*,int,const char**);
8530bce8354Sdrh   } aFuncs[] = {
854c9b84a1fSdrh     { "min",       -1, SQLITE_ARGS,    minFunc    },
855c9b84a1fSdrh     { "min",        0, 0,              0          },
856c9b84a1fSdrh     { "max",       -1, SQLITE_ARGS,    maxFunc    },
857c9b84a1fSdrh     { "max",        0, 0,              0          },
858c9b84a1fSdrh     { "length",     1, SQLITE_NUMERIC, lengthFunc },
859c9b84a1fSdrh     { "substr",     3, SQLITE_TEXT,    substrFunc },
860c9b84a1fSdrh     { "abs",        1, SQLITE_NUMERIC, absFunc    },
861c9b84a1fSdrh     { "round",      1, SQLITE_NUMERIC, roundFunc  },
862c9b84a1fSdrh     { "round",      2, SQLITE_NUMERIC, roundFunc  },
863c9b84a1fSdrh     { "upper",      1, SQLITE_TEXT,    upperFunc  },
864c9b84a1fSdrh     { "lower",      1, SQLITE_TEXT,    lowerFunc  },
865c9b84a1fSdrh     { "coalesce",  -1, SQLITE_ARGS,    ifnullFunc },
866c9b84a1fSdrh     { "coalesce",   0, 0,              0          },
867c9b84a1fSdrh     { "coalesce",   1, 0,              0          },
868c9b84a1fSdrh     { "ifnull",     2, SQLITE_ARGS,    ifnullFunc },
869c9b84a1fSdrh     { "random",    -1, SQLITE_NUMERIC, randomFunc },
870c9b84a1fSdrh     { "like",       2, SQLITE_NUMERIC, likeFunc   },
871c9b84a1fSdrh     { "glob",       2, SQLITE_NUMERIC, globFunc   },
872c9b84a1fSdrh     { "nullif",     2, SQLITE_ARGS,    nullifFunc },
873647cb0e1Sdrh     { "sqlite_version",0,SQLITE_TEXT,  versionFunc},
87447394703Sdrh     { "quote",      1, SQLITE_ARGS,    quoteFunc  },
875771d8c3bSdrh #ifndef SQLITE_OMIT_DATETIME_FUNCS
876771d8c3bSdrh     { "julianday", -1, SQLITE_NUMERIC, juliandayFunc   },
877771d8c3bSdrh     { "timestamp", -1, SQLITE_TEXT,    timestampFunc   },
878771d8c3bSdrh     { "time",      -1, SQLITE_TEXT,    timeFunc        },
879771d8c3bSdrh     { "date",      -1, SQLITE_TEXT,    dateFunc        },
880771d8c3bSdrh     { "year",      -1, SQLITE_NUMERIC, yearFunc        },
881771d8c3bSdrh     { "month",     -1, SQLITE_NUMERIC, monthFunc       },
882771d8c3bSdrh     { "dayofmonth",-1, SQLITE_NUMERIC, dayofmonthFunc  },
883771d8c3bSdrh     { "dayofweek", -1, SQLITE_NUMERIC, dayofweekFunc   },
884771d8c3bSdrh     { "hour",      -1, SQLITE_NUMERIC, hourFunc        },
885771d8c3bSdrh     { "minute",    -1, SQLITE_NUMERIC, minuteFunc      },
886771d8c3bSdrh     { "second",    -1, SQLITE_NUMERIC, secondFunc      },
887771d8c3bSdrh #endif
888d24cc427Sdrh #ifdef SQLITE_SOUNDEX
889d24cc427Sdrh     { "soundex",    1, SQLITE_TEXT,    soundexFunc},
890d24cc427Sdrh #endif
891193a6b41Sdrh #ifdef SQLITE_TEST
892193a6b41Sdrh     { "randstr",    2, SQLITE_TEXT,    randStr    },
893193a6b41Sdrh #endif
8940bce8354Sdrh   };
8950bce8354Sdrh   static struct {
8960bce8354Sdrh     char *zName;
8970bce8354Sdrh     int nArg;
898c9b84a1fSdrh     int dataType;
8990bce8354Sdrh     void (*xStep)(sqlite_func*,int,const char**);
9000bce8354Sdrh     void (*xFinalize)(sqlite_func*);
9010bce8354Sdrh   } aAggs[] = {
902c9b84a1fSdrh     { "min",    1, 0,              minStep,      minMaxFinalize },
903c9b84a1fSdrh     { "max",    1, 0,              maxStep,      minMaxFinalize },
904c9b84a1fSdrh     { "sum",    1, SQLITE_NUMERIC, sumStep,      sumFinalize    },
905c9b84a1fSdrh     { "avg",    1, SQLITE_NUMERIC, sumStep,      avgFinalize    },
906c9b84a1fSdrh     { "count",  0, SQLITE_NUMERIC, countStep,    countFinalize  },
907c9b84a1fSdrh     { "count",  1, SQLITE_NUMERIC, countStep,    countFinalize  },
908ef2daf54Sdrh #if 0
909c9b84a1fSdrh     { "stddev", 1, SQLITE_NUMERIC, stdDevStep,   stdDevFinalize },
910ef2daf54Sdrh #endif
9110bce8354Sdrh   };
9120bce8354Sdrh   int i;
9130bce8354Sdrh 
9140bce8354Sdrh   for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
9150bce8354Sdrh     sqlite_create_function(db, aFuncs[i].zName,
9160bce8354Sdrh            aFuncs[i].nArg, aFuncs[i].xFunc, 0);
917c9b84a1fSdrh     if( aFuncs[i].xFunc ){
918c9b84a1fSdrh       sqlite_function_type(db, aFuncs[i].zName, aFuncs[i].dataType);
919c9b84a1fSdrh     }
9200bce8354Sdrh   }
9216ed41ad7Sdrh   sqlite_create_function(db, "last_insert_rowid", 0,
9226ed41ad7Sdrh            last_insert_rowid, db);
923c9b84a1fSdrh   sqlite_function_type(db, "last_insert_rowid", SQLITE_NUMERIC);
9240bce8354Sdrh   for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
9250bce8354Sdrh     sqlite_create_aggregate(db, aAggs[i].zName,
9260bce8354Sdrh            aAggs[i].nArg, aAggs[i].xStep, aAggs[i].xFinalize, 0);
927c9b84a1fSdrh     sqlite_function_type(db, aAggs[i].zName, aAggs[i].dataType);
9280bce8354Sdrh   }
929dc04c583Sdrh }
930