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