Annotation of embedaddon/php/ext/sqlite/libsqlite/src/func.c, revision 1.1.1.1

1.1       misho       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: func.c 195361 2005-09-07 15:11:33Z iliaa $
                     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: */
                     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: */
                     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: */
                     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: */
                     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: */
                     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: */
                    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: */
                    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: }
                    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: */
                    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: */
                    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: */
                    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: */
                    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: */
                    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: */
                    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: */
                    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: */
                    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: */
                    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: */
                    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: */
                    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: */
                    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: */
                    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: }
                    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: }
                    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: */
                    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: }   
                    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: */
                    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: }
                    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: */
                    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: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>