xref: /PHP-5.3/ext/sqlite/libsqlite/src/func.c (revision 7f293b91)
1 /*
2 ** 2002 February 23
3 **
4 ** The author disclaims copyright to this source code.  In place of
5 ** a legal notice, here is a blessing:
6 **
7 **    May you do good and not evil.
8 **    May you find forgiveness for yourself and forgive others.
9 **    May you share freely, never taking more than you give.
10 **
11 *************************************************************************
12 ** This file contains the C functions that implement various SQL
13 ** functions of SQLite.
14 **
15 ** There is only one exported symbol in this file - the function
16 ** sqliteRegisterBuildinFunctions() found at the bottom of the file.
17 ** All other code has file scope.
18 **
19 ** $Id$
20 */
21 #include <ctype.h>
22 #include <math.h>
23 #include <stdlib.h>
24 #include <assert.h>
25 #include "sqliteInt.h"
26 #include "os.h"
27 
28 /*
29 ** Implementation of the non-aggregate min() and max() functions
30 */
minmaxFunc(sqlite_func * context,int argc,const char ** argv)31 static void minmaxFunc(sqlite_func *context, int argc, const char **argv){
32   const char *zBest;
33   int i;
34   int (*xCompare)(const char*, const char*);
35   int mask;    /* 0 for min() or 0xffffffff for max() */
36 
37   if( argc==0 ) return;
38   mask = (int)sqlite_user_data(context);
39   zBest = argv[0];
40   if( zBest==0 ) return;
41   if( argv[1][0]=='n' ){
42     xCompare = sqliteCompare;
43   }else{
44     xCompare = strcmp;
45   }
46   for(i=2; i<argc; i+=2){
47     if( argv[i]==0 ) return;
48     if( (xCompare(argv[i], zBest)^mask)<0 ){
49       zBest = argv[i];
50     }
51   }
52   sqlite_set_result_string(context, zBest, -1);
53 }
54 
55 /*
56 ** Return the type of the argument.
57 */
typeofFunc(sqlite_func * context,int argc,const char ** argv)58 static void typeofFunc(sqlite_func *context, int argc, const char **argv){
59   assert( argc==2 );
60   sqlite_set_result_string(context, argv[1], -1);
61 }
62 
63 /*
64 ** Implementation of the length() function
65 */
lengthFunc(sqlite_func * context,int argc,const char ** argv)66 static void lengthFunc(sqlite_func *context, int argc, const char **argv){
67   const char *z;
68   int len;
69 
70   assert( argc==1 );
71   z = argv[0];
72   if( z==0 ) return;
73 #ifdef SQLITE_UTF8
74   for(len=0; *z; z++){ if( (0xc0&*z)!=0x80 ) len++; }
75 #else
76   len = strlen(z);
77 #endif
78   sqlite_set_result_int(context, len);
79 }
80 
81 /*
82 ** Implementation of the abs() function
83 */
absFunc(sqlite_func * context,int argc,const char ** argv)84 static void absFunc(sqlite_func *context, int argc, const char **argv){
85   const char *z;
86   assert( argc==1 );
87   z = argv[0];
88   if( z==0 ) return;
89   if( z[0]=='-' && isdigit(z[1]) ) z++;
90   sqlite_set_result_string(context, z, -1);
91 }
92 
93 /*
94 ** Implementation of the substr() function
95 */
substrFunc(sqlite_func * context,int argc,const char ** argv)96 static void substrFunc(sqlite_func *context, int argc, const char **argv){
97   const char *z;
98 #ifdef SQLITE_UTF8
99   const char *z2;
100   int i;
101 #endif
102   int p1, p2, len;
103   assert( argc==3 );
104   z = argv[0];
105   if( z==0 ) return;
106   p1 = atoi(argv[1]?argv[1]:0);
107   p2 = atoi(argv[2]?argv[2]:0);
108 #ifdef SQLITE_UTF8
109   for(len=0, z2=z; *z2; z2++){ if( (0xc0&*z2)!=0x80 ) len++; }
110 #else
111   len = strlen(z);
112 #endif
113   if( p1<0 ){
114     p1 += len;
115     if( p1<0 ){
116       p2 += p1;
117       p1 = 0;
118     }
119   }else if( p1>0 ){
120     p1--;
121   }
122   if( p1+p2>len ){
123     p2 = len-p1;
124   }
125 #ifdef SQLITE_UTF8
126   for(i=0; i<p1 && z[i]; i++){
127     if( (z[i]&0xc0)==0x80 ) p1++;
128   }
129   while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p1++; }
130   for(; i<p1+p2 && z[i]; i++){
131     if( (z[i]&0xc0)==0x80 ) p2++;
132   }
133   while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p2++; }
134 #endif
135   if( p2<0 ) p2 = 0;
136   sqlite_set_result_string(context, &z[p1], p2);
137 }
138 
139 /*
140 ** Implementation of the round() function
141 */
roundFunc(sqlite_func * context,int argc,const char ** argv)142 static void roundFunc(sqlite_func *context, int argc, const char **argv){
143   int n;
144   double r;
145   char zBuf[100];
146   assert( argc==1 || argc==2 );
147   if( argv[0]==0 || (argc==2 && argv[1]==0) ) return;
148   n = argc==2 ? atoi(argv[1]) : 0;
149   if( n>30 ) n = 30;
150   if( n<0 ) n = 0;
151   r = sqliteAtoF(argv[0], 0);
152   sprintf(zBuf,"%.*f",n,r);
153   sqlite_set_result_string(context, zBuf, -1);
154 }
155 
156 /*
157 ** Implementation of the upper() and lower() SQL functions.
158 */
upperFunc(sqlite_func * context,int argc,const char ** argv)159 static void upperFunc(sqlite_func *context, int argc, const char **argv){
160   unsigned char *z;
161   int i;
162   if( argc<1 || argv[0]==0 ) return;
163   z = (unsigned char*)sqlite_set_result_string(context, argv[0], -1);
164   if( z==0 ) return;
165   for(i=0; z[i]; i++){
166     if( islower(z[i]) ) z[i] = toupper(z[i]);
167   }
168 }
lowerFunc(sqlite_func * context,int argc,const char ** argv)169 static void lowerFunc(sqlite_func *context, int argc, const char **argv){
170   unsigned char *z;
171   int i;
172   if( argc<1 || argv[0]==0 ) return;
173   z = (unsigned char*)sqlite_set_result_string(context, argv[0], -1);
174   if( z==0 ) return;
175   for(i=0; z[i]; i++){
176     if( isupper(z[i]) ) z[i] = tolower(z[i]);
177   }
178 }
179 
180 /*
181 ** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
182 ** All three do the same thing.  They return the first non-NULL
183 ** argument.
184 */
ifnullFunc(sqlite_func * context,int argc,const char ** argv)185 static void ifnullFunc(sqlite_func *context, int argc, const char **argv){
186   int i;
187   for(i=0; i<argc; i++){
188     if( argv[i] ){
189       sqlite_set_result_string(context, argv[i], -1);
190       break;
191     }
192   }
193 }
194 
195 /*
196 ** Implementation of random().  Return a random integer.
197 */
randomFunc(sqlite_func * context,int argc,const char ** argv)198 static void randomFunc(sqlite_func *context, int argc, const char **argv){
199   int r;
200   sqliteRandomness(sizeof(r), &r);
201   sqlite_set_result_int(context, r);
202 }
203 
204 /*
205 ** Implementation of the last_insert_rowid() SQL function.  The return
206 ** value is the same as the sqlite_last_insert_rowid() API function.
207 */
last_insert_rowid(sqlite_func * context,int arg,const char ** argv)208 static void last_insert_rowid(sqlite_func *context, int arg, const char **argv){
209   sqlite *db = sqlite_user_data(context);
210   sqlite_set_result_int(context, sqlite_last_insert_rowid(db));
211 }
212 
213 /*
214 ** Implementation of the change_count() SQL function.  The return
215 ** value is the same as the sqlite_changes() API function.
216 */
change_count(sqlite_func * context,int arg,const char ** argv)217 static void change_count(sqlite_func *context, int arg, const char **argv){
218   sqlite *db = sqlite_user_data(context);
219   sqlite_set_result_int(context, sqlite_changes(db));
220 }
221 
222 /*
223 ** Implementation of the last_statement_change_count() SQL function.  The
224 ** return value is the same as the sqlite_last_statement_changes() API function.
225 */
last_statement_change_count(sqlite_func * context,int arg,const char ** argv)226 static void last_statement_change_count(sqlite_func *context, int arg,
227                                         const char **argv){
228   sqlite *db = sqlite_user_data(context);
229   sqlite_set_result_int(context, sqlite_last_statement_changes(db));
230 }
231 
232 /*
233 ** Implementation of the like() SQL function.  This function implements
234 ** the build-in LIKE operator.  The first argument to the function is the
235 ** string and the second argument is the pattern.  So, the SQL statements:
236 **
237 **       A LIKE B
238 **
239 ** is implemented as like(A,B).
240 */
likeFunc(sqlite_func * context,int arg,const char ** argv)241 static void likeFunc(sqlite_func *context, int arg, const char **argv){
242   if( argv[0]==0 || argv[1]==0 ) return;
243   sqlite_set_result_int(context,
244     sqliteLikeCompare((const unsigned char*)argv[0],
245                       (const unsigned char*)argv[1]));
246 }
247 
248 /*
249 ** Implementation of the glob() SQL function.  This function implements
250 ** the build-in GLOB operator.  The first argument to the function is the
251 ** string and the second argument is the pattern.  So, the SQL statements:
252 **
253 **       A GLOB B
254 **
255 ** is implemented as glob(A,B).
256 */
globFunc(sqlite_func * context,int arg,const char ** argv)257 static void globFunc(sqlite_func *context, int arg, const char **argv){
258   if( argv[0]==0 || argv[1]==0 ) return;
259   sqlite_set_result_int(context,
260     sqliteGlobCompare((const unsigned char*)argv[0],
261                       (const unsigned char*)argv[1]));
262 }
263 
264 /*
265 ** Implementation of the NULLIF(x,y) function.  The result is the first
266 ** argument if the arguments are different.  The result is NULL if the
267 ** arguments are equal to each other.
268 */
nullifFunc(sqlite_func * context,int argc,const char ** argv)269 static void nullifFunc(sqlite_func *context, int argc, const char **argv){
270   if( argv[0]!=0 && sqliteCompare(argv[0],argv[1])!=0 ){
271     sqlite_set_result_string(context, argv[0], -1);
272   }
273 }
274 
275 /*
276 ** Implementation of the VERSION(*) function.  The result is the version
277 ** of the SQLite library that is running.
278 */
versionFunc(sqlite_func * context,int argc,const char ** argv)279 static void versionFunc(sqlite_func *context, int argc, const char **argv){
280   sqlite_set_result_string(context, sqlite_version, -1);
281 }
282 
283 /*
284 ** EXPERIMENTAL - This is not an official function.  The interface may
285 ** change.  This function may disappear.  Do not write code that depends
286 ** on this function.
287 **
288 ** Implementation of the QUOTE() function.  This function takes a single
289 ** argument.  If the argument is numeric, the return value is the same as
290 ** the argument.  If the argument is NULL, the return value is the string
291 ** "NULL".  Otherwise, the argument is enclosed in single quotes with
292 ** single-quote escapes.
293 */
quoteFunc(sqlite_func * context,int argc,const char ** argv)294 static void quoteFunc(sqlite_func *context, int argc, const char **argv){
295   if( argc<1 ) return;
296   if( argv[0]==0 ){
297     sqlite_set_result_string(context, "NULL", 4);
298   }else if( sqliteIsNumber(argv[0]) ){
299     sqlite_set_result_string(context, argv[0], -1);
300   }else{
301     int i,j,n;
302     char *z;
303     for(i=n=0; argv[0][i]; i++){ if( argv[0][i]=='\'' ) n++; }
304     z = sqliteMalloc( i+n+3 );
305     if( z==0 ) return;
306     z[0] = '\'';
307     for(i=0, j=1; argv[0][i]; i++){
308       z[j++] = argv[0][i];
309       if( argv[0][i]=='\'' ){
310         z[j++] = '\'';
311       }
312     }
313     z[j++] = '\'';
314     z[j] = 0;
315     sqlite_set_result_string(context, z, j);
316     sqliteFree(z);
317   }
318 }
319 
320 #ifdef SQLITE_SOUNDEX
321 /*
322 ** Compute the soundex encoding of a word.
323 */
soundexFunc(sqlite_func * context,int argc,const char ** argv)324 static void soundexFunc(sqlite_func *context, int argc, const char **argv){
325   char zResult[8];
326   const char *zIn;
327   int i, j;
328   static const unsigned char iCode[] = {
329     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
330     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
331     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
332     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
333     0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
334     1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
335     0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
336     1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
337   };
338   assert( argc==1 );
339   zIn = argv[0];
340   for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
341   if( zIn[i] ){
342     zResult[0] = toupper(zIn[i]);
343     for(j=1; j<4 && zIn[i]; i++){
344       int code = iCode[zIn[i]&0x7f];
345       if( code>0 ){
346         zResult[j++] = code + '0';
347       }
348     }
349     while( j<4 ){
350       zResult[j++] = '0';
351     }
352     zResult[j] = 0;
353     sqlite_set_result_string(context, zResult, 4);
354   }else{
355     sqlite_set_result_string(context, "?000", 4);
356   }
357 }
358 #endif
359 
360 #ifdef SQLITE_TEST
361 /*
362 ** This function generates a string of random characters.  Used for
363 ** generating test data.
364 */
randStr(sqlite_func * context,int argc,const char ** argv)365 static void randStr(sqlite_func *context, int argc, const char **argv){
366   static const unsigned char zSrc[] =
367      "abcdefghijklmnopqrstuvwxyz"
368      "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
369      "0123456789"
370      ".-!,:*^+=_|?/<> ";
371   int iMin, iMax, n, r, i;
372   unsigned char zBuf[1000];
373   if( argc>=1 ){
374     iMin = atoi(argv[0]);
375     if( iMin<0 ) iMin = 0;
376     if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
377   }else{
378     iMin = 1;
379   }
380   if( argc>=2 ){
381     iMax = atoi(argv[1]);
382     if( iMax<iMin ) iMax = iMin;
383     if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
384   }else{
385     iMax = 50;
386   }
387   n = iMin;
388   if( iMax>iMin ){
389     sqliteRandomness(sizeof(r), &r);
390     r &= 0x7fffffff;
391     n += r%(iMax + 1 - iMin);
392   }
393   assert( n<sizeof(zBuf) );
394   sqliteRandomness(n, zBuf);
395   for(i=0; i<n; i++){
396     zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
397   }
398   zBuf[n] = 0;
399   sqlite_set_result_string(context, zBuf, n);
400 }
401 #endif
402 
403 /*
404 ** An instance of the following structure holds the context of a
405 ** sum() or avg() aggregate computation.
406 */
407 typedef struct SumCtx SumCtx;
408 struct SumCtx {
409   double sum;     /* Sum of terms */
410   int cnt;        /* Number of elements summed */
411 };
412 
413 /*
414 ** Routines used to compute the sum or average.
415 */
sumStep(sqlite_func * context,int argc,const char ** argv)416 static void sumStep(sqlite_func *context, int argc, const char **argv){
417   SumCtx *p;
418   if( argc<1 ) return;
419   p = sqlite_aggregate_context(context, sizeof(*p));
420   if( p && argv[0] ){
421     p->sum += sqliteAtoF(argv[0], 0);
422     p->cnt++;
423   }
424 }
sumFinalize(sqlite_func * context)425 static void sumFinalize(sqlite_func *context){
426   SumCtx *p;
427   p = sqlite_aggregate_context(context, sizeof(*p));
428   sqlite_set_result_double(context, p ? p->sum : 0.0);
429 }
avgFinalize(sqlite_func * context)430 static void avgFinalize(sqlite_func *context){
431   SumCtx *p;
432   p = sqlite_aggregate_context(context, sizeof(*p));
433   if( p && p->cnt>0 ){
434     sqlite_set_result_double(context, p->sum/(double)p->cnt);
435   }
436 }
437 
438 /*
439 ** An instance of the following structure holds the context of a
440 ** variance or standard deviation computation.
441 */
442 typedef struct StdDevCtx StdDevCtx;
443 struct StdDevCtx {
444   double sum;     /* Sum of terms */
445   double sum2;    /* Sum of the squares of terms */
446   int cnt;        /* Number of terms counted */
447 };
448 
449 #if 0   /* Omit because math library is required */
450 /*
451 ** Routines used to compute the standard deviation as an aggregate.
452 */
453 static void stdDevStep(sqlite_func *context, int argc, const char **argv){
454   StdDevCtx *p;
455   double x;
456   if( argc<1 ) return;
457   p = sqlite_aggregate_context(context, sizeof(*p));
458   if( p && argv[0] ){
459     x = sqliteAtoF(argv[0], 0);
460     p->sum += x;
461     p->sum2 += x*x;
462     p->cnt++;
463   }
464 }
465 static void stdDevFinalize(sqlite_func *context){
466   double rN = sqlite_aggregate_count(context);
467   StdDevCtx *p = sqlite_aggregate_context(context, sizeof(*p));
468   if( p && p->cnt>1 ){
469     double rCnt = cnt;
470     sqlite_set_result_double(context,
471        sqrt((p->sum2 - p->sum*p->sum/rCnt)/(rCnt-1.0)));
472   }
473 }
474 #endif
475 
476 /*
477 ** The following structure keeps track of state information for the
478 ** count() aggregate function.
479 */
480 typedef struct CountCtx CountCtx;
481 struct CountCtx {
482   int n;
483 };
484 
485 /*
486 ** Routines to implement the count() aggregate function.
487 */
countStep(sqlite_func * context,int argc,const char ** argv)488 static void countStep(sqlite_func *context, int argc, const char **argv){
489   CountCtx *p;
490   p = sqlite_aggregate_context(context, sizeof(*p));
491   if( (argc==0 || argv[0]) && p ){
492     p->n++;
493   }
494 }
countFinalize(sqlite_func * context)495 static void countFinalize(sqlite_func *context){
496   CountCtx *p;
497   p = sqlite_aggregate_context(context, sizeof(*p));
498   sqlite_set_result_int(context, p ? p->n : 0);
499 }
500 
501 /*
502 ** This function tracks state information for the min() and max()
503 ** aggregate functions.
504 */
505 typedef struct MinMaxCtx MinMaxCtx;
506 struct MinMaxCtx {
507   char *z;         /* The best so far */
508   char zBuf[28];   /* Space that can be used for storage */
509 };
510 
511 /*
512 ** Routines to implement min() and max() aggregate functions.
513 */
minmaxStep(sqlite_func * context,int argc,const char ** argv)514 static void minmaxStep(sqlite_func *context, int argc, const char **argv){
515   MinMaxCtx *p;
516   int (*xCompare)(const char*, const char*);
517   int mask;    /* 0 for min() or 0xffffffff for max() */
518 
519   assert( argc==2 );
520   if( argv[0]==0 ) return;  /* Ignore NULL values */
521   if( argv[1][0]=='n' ){
522     xCompare = sqliteCompare;
523   }else{
524     xCompare = strcmp;
525   }
526   mask = (int)sqlite_user_data(context);
527   assert( mask==0 || mask==-1 );
528   p = sqlite_aggregate_context(context, sizeof(*p));
529   if( p==0 || argc<1 ) return;
530   if( p->z==0 || (xCompare(argv[0],p->z)^mask)<0 ){
531     int len;
532     if( p->zBuf[0] ){
533       sqliteFree(p->z);
534     }
535     len = strlen(argv[0]);
536     if( len < sizeof(p->zBuf)-1 ){
537       p->z = &p->zBuf[1];
538       p->zBuf[0] = 0;
539     }else{
540       p->z = sqliteMalloc( len+1 );
541       p->zBuf[0] = 1;
542       if( p->z==0 ) return;
543     }
544     strcpy(p->z, argv[0]);
545   }
546 }
minMaxFinalize(sqlite_func * context)547 static void minMaxFinalize(sqlite_func *context){
548   MinMaxCtx *p;
549   p = sqlite_aggregate_context(context, sizeof(*p));
550   if( p && p->z && p->zBuf[0]<2 ){
551     sqlite_set_result_string(context, p->z, strlen(p->z));
552   }
553   if( p && p->zBuf[0] ){
554     sqliteFree(p->z);
555   }
556 }
557 
558 /*
559 ** This function registered all of the above C functions as SQL
560 ** functions.  This should be the only routine in this file with
561 ** external linkage.
562 */
sqliteRegisterBuiltinFunctions(sqlite * db)563 void sqliteRegisterBuiltinFunctions(sqlite *db){
564   static struct {
565      char *zName;
566      signed char nArg;
567      signed char dataType;
568      u8 argType;               /* 0: none.  1: db  2: (-1) */
569      void (*xFunc)(sqlite_func*,int,const char**);
570   } aFuncs[] = {
571     { "min",       -1, SQLITE_ARGS,    0, minmaxFunc },
572     { "min",        0, 0,              0, 0          },
573     { "max",       -1, SQLITE_ARGS,    2, minmaxFunc },
574     { "max",        0, 0,              2, 0          },
575     { "typeof",     1, SQLITE_TEXT,    0, typeofFunc },
576     { "length",     1, SQLITE_NUMERIC, 0, lengthFunc },
577     { "substr",     3, SQLITE_TEXT,    0, substrFunc },
578     { "abs",        1, SQLITE_NUMERIC, 0, absFunc    },
579     { "round",      1, SQLITE_NUMERIC, 0, roundFunc  },
580     { "round",      2, SQLITE_NUMERIC, 0, roundFunc  },
581     { "upper",      1, SQLITE_TEXT,    0, upperFunc  },
582     { "lower",      1, SQLITE_TEXT,    0, lowerFunc  },
583     { "coalesce",  -1, SQLITE_ARGS,    0, ifnullFunc },
584     { "coalesce",   0, 0,              0, 0          },
585     { "coalesce",   1, 0,              0, 0          },
586     { "ifnull",     2, SQLITE_ARGS,    0, ifnullFunc },
587     { "random",    -1, SQLITE_NUMERIC, 0, randomFunc },
588     { "like",       2, SQLITE_NUMERIC, 0, likeFunc   },
589     { "glob",       2, SQLITE_NUMERIC, 0, globFunc   },
590     { "nullif",     2, SQLITE_ARGS,    0, nullifFunc },
591     { "sqlite_version",0,SQLITE_TEXT,  0, versionFunc},
592     { "quote",      1, SQLITE_ARGS,    0, quoteFunc  },
593     { "last_insert_rowid", 0, SQLITE_NUMERIC, 1, last_insert_rowid },
594     { "change_count",      0, SQLITE_NUMERIC, 1, change_count      },
595     { "last_statement_change_count",
596                            0, SQLITE_NUMERIC, 1, last_statement_change_count },
597 #ifdef SQLITE_SOUNDEX
598     { "soundex",    1, SQLITE_TEXT,    0, soundexFunc},
599 #endif
600 #ifdef SQLITE_TEST
601     { "randstr",    2, SQLITE_TEXT,    0, randStr    },
602 #endif
603   };
604   static struct {
605     char *zName;
606     signed char nArg;
607     signed char dataType;
608     u8 argType;
609     void (*xStep)(sqlite_func*,int,const char**);
610     void (*xFinalize)(sqlite_func*);
611   } aAggs[] = {
612     { "min",    1, 0,              0, minmaxStep,   minMaxFinalize },
613     { "max",    1, 0,              2, minmaxStep,   minMaxFinalize },
614     { "sum",    1, SQLITE_NUMERIC, 0, sumStep,      sumFinalize    },
615     { "avg",    1, SQLITE_NUMERIC, 0, sumStep,      avgFinalize    },
616     { "count",  0, SQLITE_NUMERIC, 0, countStep,    countFinalize  },
617     { "count",  1, SQLITE_NUMERIC, 0, countStep,    countFinalize  },
618 #if 0
619     { "stddev", 1, SQLITE_NUMERIC, 0, stdDevStep,   stdDevFinalize },
620 #endif
621   };
622   static const char *azTypeFuncs[] = { "min", "max", "typeof" };
623   int i;
624 
625   for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
626     void *pArg;
627     switch( aFuncs[i].argType ){
628       case 0:  pArg = 0;           break;
629       case 1:  pArg = db;          break;
630       case 2:  pArg = (void*)(-1); break;
631     }
632     sqlite_create_function(db, aFuncs[i].zName,
633            aFuncs[i].nArg, aFuncs[i].xFunc, pArg);
634     if( aFuncs[i].xFunc ){
635       sqlite_function_type(db, aFuncs[i].zName, aFuncs[i].dataType);
636     }
637   }
638   for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
639     void *pArg;
640     switch( aAggs[i].argType ){
641       case 0:  pArg = 0;           break;
642       case 1:  pArg = db;          break;
643       case 2:  pArg = (void*)(-1); break;
644     }
645     sqlite_create_aggregate(db, aAggs[i].zName,
646            aAggs[i].nArg, aAggs[i].xStep, aAggs[i].xFinalize, pArg);
647     sqlite_function_type(db, aAggs[i].zName, aAggs[i].dataType);
648   }
649   for(i=0; i<sizeof(azTypeFuncs)/sizeof(azTypeFuncs[0]); i++){
650     int n = strlen(azTypeFuncs[i]);
651     FuncDef *p = sqliteHashFind(&db->aFunc, azTypeFuncs[i], n);
652     while( p ){
653       p->includeTypes = 1;
654       p = p->pNext;
655     }
656   }
657   sqliteRegisterDateTimeFunctions(db);
658 }
659