xref: /sqlite-3.40.0/src/func.c (revision c3a20c19)
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 *************************************************************************
1260ec914cSpeter.d.reid ** This file contains the C-language implementations for many of the SQL
13ede7ae31Sdrh ** functions of SQLite.  (Some function, and in particular the date and
14ede7ae31Sdrh ** time functions, are implemented separately.)
15dc04c583Sdrh */
16b659e9bfSdrh #include "sqliteInt.h"
17d3a149efSdrh #include <stdlib.h>
180bce8354Sdrh #include <assert.h>
1988208050Sdanielk1977 #include "vdbeInt.h"
200bce8354Sdrh 
2155ef4d97Sdrh /*
2255ef4d97Sdrh ** Return the collating function associated with a function.
2355ef4d97Sdrh */
24dc1bdc4fSdanielk1977 static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
25a9e03b1bSdrh   VdbeOp *pOp;
26a9e03b1bSdrh   assert( context->pVdbe!=0 );
27a9e03b1bSdrh   pOp = &context->pVdbe->aOp[context->iOp-1];
28a15cc47fSdrh   assert( pOp->opcode==OP_CollSeq );
29a15cc47fSdrh   assert( pOp->p4type==P4_COLLSEQ );
30a15cc47fSdrh   return pOp->p4.pColl;
31dc1bdc4fSdanielk1977 }
32dc1bdc4fSdanielk1977 
330bce8354Sdrh /*
347a95789cSdrh ** Indicate that the accumulator load should be skipped on this
357a95789cSdrh ** iteration of the aggregate loop.
367a95789cSdrh */
377a95789cSdrh static void sqlite3SkipAccumulatorLoad(sqlite3_context *context){
3821d59784Sdrh   assert( context->isError<=0 );
3921d59784Sdrh   context->isError = -1;
407a95789cSdrh   context->skipFlag = 1;
417a95789cSdrh }
427a95789cSdrh 
437a95789cSdrh /*
440bce8354Sdrh ** Implementation of the non-aggregate min() and max() functions
450bce8354Sdrh */
46f9b596ebSdrh static void minmaxFunc(
47f9b596ebSdrh   sqlite3_context *context,
48f9b596ebSdrh   int argc,
49f9b596ebSdrh   sqlite3_value **argv
50f9b596ebSdrh ){
510bce8354Sdrh   int i;
52268380caSdrh   int mask;    /* 0 for min() or 0xffffffff for max() */
53f9b596ebSdrh   int iBest;
54dc1bdc4fSdanielk1977   CollSeq *pColl;
550bce8354Sdrh 
5665595cd6Sdrh   assert( argc>1 );
57c44af71cSdrh   mask = sqlite3_user_data(context)==0 ? 0 : -1;
58dc1bdc4fSdanielk1977   pColl = sqlite3GetFuncCollSeq(context);
59dc1bdc4fSdanielk1977   assert( pColl );
60c572ef7fSdanielk1977   assert( mask==-1 || mask==0 );
61f9b596ebSdrh   iBest = 0;
629c054830Sdrh   if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
63f9b596ebSdrh   for(i=1; i<argc; i++){
649c054830Sdrh     if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
65dc1bdc4fSdanielk1977     if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
6665595cd6Sdrh       testcase( mask==0 );
67f9b596ebSdrh       iBest = i;
680bce8354Sdrh     }
690bce8354Sdrh   }
70f4479501Sdrh   sqlite3_result_value(context, argv[iBest]);
710bce8354Sdrh }
720bce8354Sdrh 
73268380caSdrh /*
74268380caSdrh ** Return the type of the argument.
75268380caSdrh */
76f9b596ebSdrh static void typeofFunc(
77f9b596ebSdrh   sqlite3_context *context,
7862c14b34Sdanielk1977   int NotUsed,
79f9b596ebSdrh   sqlite3_value **argv
80f9b596ebSdrh ){
819d8e401cSdrh   static const char *azType[] = { "integer", "real", "text", "blob", "null" };
829d8e401cSdrh   int i = sqlite3_value_type(argv[0]) - 1;
8362c14b34Sdanielk1977   UNUSED_PARAMETER(NotUsed);
849d8e401cSdrh   assert( i>=0 && i<ArraySize(azType) );
859d8e401cSdrh   assert( SQLITE_INTEGER==1 );
869d8e401cSdrh   assert( SQLITE_FLOAT==2 );
879d8e401cSdrh   assert( SQLITE_TEXT==3 );
889d8e401cSdrh   assert( SQLITE_BLOB==4 );
899d8e401cSdrh   assert( SQLITE_NULL==5 );
903cef3649Sdrh   /* EVIDENCE-OF: R-01470-60482 The sqlite3_value_type(V) interface returns
913cef3649Sdrh   ** the datatype code for the initial datatype of the sqlite3_value object
923cef3649Sdrh   ** V. The returned value is one of SQLITE_INTEGER, SQLITE_FLOAT,
933cef3649Sdrh   ** SQLITE_TEXT, SQLITE_BLOB, or SQLITE_NULL. */
949d8e401cSdrh   sqlite3_result_text(context, azType[i], -1, SQLITE_STATIC);
950bce8354Sdrh }
960bce8354Sdrh 
975708d2deSdrh 
985708d2deSdrh /*
990bce8354Sdrh ** Implementation of the length() function
1000bce8354Sdrh */
101f9b596ebSdrh static void lengthFunc(
102f9b596ebSdrh   sqlite3_context *context,
103f9b596ebSdrh   int argc,
104f9b596ebSdrh   sqlite3_value **argv
105f9b596ebSdrh ){
1060bce8354Sdrh   assert( argc==1 );
107f3d3c27aSdanielk1977   UNUSED_PARAMETER(argc);
108f9b596ebSdrh   switch( sqlite3_value_type(argv[0]) ){
1099c054830Sdrh     case SQLITE_BLOB:
1109c054830Sdrh     case SQLITE_INTEGER:
1119c054830Sdrh     case SQLITE_FLOAT: {
112f4479501Sdrh       sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
113f9b596ebSdrh       break;
114f9b596ebSdrh     }
1159c054830Sdrh     case SQLITE_TEXT: {
1162646da7eSdrh       const unsigned char *z = sqlite3_value_text(argv[0]);
1177ea3469eSdrh       const unsigned char *z0;
1187ea3469eSdrh       unsigned char c;
1197a521cfbSdrh       if( z==0 ) return;
1207ea3469eSdrh       z0 = z;
1217ea3469eSdrh       while( (c = *z)!=0 ){
1227ea3469eSdrh         z++;
1237ea3469eSdrh         if( c>=0xc0 ){
1247ea3469eSdrh           while( (*z & 0xc0)==0x80 ){ z++; z0++; }
1254a919118Sdrh         }
1267ea3469eSdrh       }
1277ea3469eSdrh       sqlite3_result_int(context, (int)(z-z0));
128f9b596ebSdrh       break;
129f9b596ebSdrh     }
130f9b596ebSdrh     default: {
131f9b596ebSdrh       sqlite3_result_null(context);
132f9b596ebSdrh       break;
133f9b596ebSdrh     }
134f9b596ebSdrh   }
1350bce8354Sdrh }
1360bce8354Sdrh 
1370bce8354Sdrh /*
1382ba3cccfSdrh ** Implementation of the abs() function.
1392ba3cccfSdrh **
1402ba3cccfSdrh ** IMP: R-23979-26855 The abs(X) function returns the absolute value of
1412ba3cccfSdrh ** the numeric argument X.
1420bce8354Sdrh */
1430ae8b831Sdanielk1977 static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
1440bce8354Sdrh   assert( argc==1 );
145f3d3c27aSdanielk1977   UNUSED_PARAMETER(argc);
146f9b596ebSdrh   switch( sqlite3_value_type(argv[0]) ){
1479c054830Sdrh     case SQLITE_INTEGER: {
148f93bbbeaSdanielk1977       i64 iVal = sqlite3_value_int64(argv[0]);
14952fc849aSdrh       if( iVal<0 ){
150693e6719Sdrh         if( iVal==SMALLEST_INT64 ){
151eb091cdfSdrh           /* IMP: R-31676-45509 If X is the integer -9223372036854775808
152eb091cdfSdrh           ** then abs(X) throws an integer overflow error since there is no
1532ba3cccfSdrh           ** equivalent positive 64-bit two complement value. */
15452fc849aSdrh           sqlite3_result_error(context, "integer overflow", -1);
15552fc849aSdrh           return;
15652fc849aSdrh         }
15752fc849aSdrh         iVal = -iVal;
15852fc849aSdrh       }
159f93bbbeaSdanielk1977       sqlite3_result_int64(context, iVal);
160f9b596ebSdrh       break;
161f9b596ebSdrh     }
1629c054830Sdrh     case SQLITE_NULL: {
1632ba3cccfSdrh       /* IMP: R-37434-19929 Abs(X) returns NULL if X is NULL. */
164f9b596ebSdrh       sqlite3_result_null(context);
165f9b596ebSdrh       break;
166f9b596ebSdrh     }
167f9b596ebSdrh     default: {
1682ba3cccfSdrh       /* Because sqlite3_value_double() returns 0.0 if the argument is not
1692ba3cccfSdrh       ** something that can be converted into a number, we have:
170643091f0Sdrh       ** IMP: R-01992-00519 Abs(X) returns 0.0 if X is a string or blob
171643091f0Sdrh       ** that cannot be converted to a numeric value.
1722ba3cccfSdrh       */
173f93bbbeaSdanielk1977       double rVal = sqlite3_value_double(argv[0]);
17452fc849aSdrh       if( rVal<0 ) rVal = -rVal;
175f93bbbeaSdanielk1977       sqlite3_result_double(context, rVal);
176f9b596ebSdrh       break;
177f9b596ebSdrh     }
178f9b596ebSdrh   }
1790bce8354Sdrh }
1800bce8354Sdrh 
1810bce8354Sdrh /*
182d55e0729Sdrh ** Implementation of the instr() function.
183d55e0729Sdrh **
184d55e0729Sdrh ** instr(haystack,needle) finds the first occurrence of needle
185d55e0729Sdrh ** in haystack and returns the number of previous characters plus 1,
186d55e0729Sdrh ** or 0 if needle does not occur within haystack.
187d55e0729Sdrh **
188d55e0729Sdrh ** If both haystack and needle are BLOBs, then the result is one more than
189d55e0729Sdrh ** the number of bytes in haystack prior to the first occurrence of needle,
190d55e0729Sdrh ** or 0 if needle never occurs in haystack.
191d55e0729Sdrh */
192d55e0729Sdrh static void instrFunc(
193d55e0729Sdrh   sqlite3_context *context,
194d55e0729Sdrh   int argc,
195d55e0729Sdrh   sqlite3_value **argv
196d55e0729Sdrh ){
197d55e0729Sdrh   const unsigned char *zHaystack;
198d55e0729Sdrh   const unsigned char *zNeedle;
199d55e0729Sdrh   int nHaystack;
200d55e0729Sdrh   int nNeedle;
201d55e0729Sdrh   int typeHaystack, typeNeedle;
202d55e0729Sdrh   int N = 1;
203d55e0729Sdrh   int isText;
204d55e0729Sdrh 
20568c804b9Sdrh   UNUSED_PARAMETER(argc);
206d55e0729Sdrh   typeHaystack = sqlite3_value_type(argv[0]);
207d55e0729Sdrh   typeNeedle = sqlite3_value_type(argv[1]);
208d55e0729Sdrh   if( typeHaystack==SQLITE_NULL || typeNeedle==SQLITE_NULL ) return;
209d55e0729Sdrh   nHaystack = sqlite3_value_bytes(argv[0]);
210d55e0729Sdrh   nNeedle = sqlite3_value_bytes(argv[1]);
211895decf6Sdan   if( nNeedle>0 ){
212d55e0729Sdrh     if( typeHaystack==SQLITE_BLOB && typeNeedle==SQLITE_BLOB ){
213d55e0729Sdrh       zHaystack = sqlite3_value_blob(argv[0]);
214d55e0729Sdrh       zNeedle = sqlite3_value_blob(argv[1]);
215d55e0729Sdrh       isText = 0;
216d55e0729Sdrh     }else{
217d55e0729Sdrh       zHaystack = sqlite3_value_text(argv[0]);
218d55e0729Sdrh       zNeedle = sqlite3_value_text(argv[1]);
219d55e0729Sdrh       isText = 1;
220d55e0729Sdrh     }
221b30574bcSdrh     if( zNeedle==0 || (nHaystack && zHaystack==0) ) return;
222d55e0729Sdrh     while( nNeedle<=nHaystack && memcmp(zHaystack, zNeedle, nNeedle)!=0 ){
223d55e0729Sdrh       N++;
224d55e0729Sdrh       do{
225d55e0729Sdrh         nHaystack--;
226d55e0729Sdrh         zHaystack++;
227d55e0729Sdrh       }while( isText && (zHaystack[0]&0xc0)==0x80 );
228d55e0729Sdrh     }
229d55e0729Sdrh     if( nNeedle>nHaystack ) N = 0;
230895decf6Sdan   }
231d55e0729Sdrh   sqlite3_result_int(context, N);
232d55e0729Sdrh }
233d55e0729Sdrh 
234d55e0729Sdrh /*
235a5c1416dSdrh ** Implementation of the printf() function.
236a5c1416dSdrh */
237a5c1416dSdrh static void printfFunc(
238a5c1416dSdrh   sqlite3_context *context,
239a5c1416dSdrh   int argc,
240a5c1416dSdrh   sqlite3_value **argv
241a5c1416dSdrh ){
242a5c1416dSdrh   PrintfArguments x;
243a5c1416dSdrh   StrAccum str;
244a5c1416dSdrh   const char *zFormat;
245a5c1416dSdrh   int n;
246c0490572Sdrh   sqlite3 *db = sqlite3_context_db_handle(context);
247a5c1416dSdrh 
248a5c1416dSdrh   if( argc>=1 && (zFormat = (const char*)sqlite3_value_text(argv[0]))!=0 ){
249a5c1416dSdrh     x.nArg = argc-1;
250a5c1416dSdrh     x.nUsed = 0;
251a5c1416dSdrh     x.apArg = argv+1;
252c0490572Sdrh     sqlite3StrAccumInit(&str, db, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]);
2535f4a686fSdrh     str.printfFlags = SQLITE_PRINTF_SQLFUNC;
2540cdbe1aeSdrh     sqlite3_str_appendf(&str, zFormat, &x);
255a5c1416dSdrh     n = str.nChar;
256a5c1416dSdrh     sqlite3_result_text(context, sqlite3StrAccumFinish(&str), n,
257a5c1416dSdrh                         SQLITE_DYNAMIC);
258a5c1416dSdrh   }
259a5c1416dSdrh }
260a5c1416dSdrh 
261a5c1416dSdrh /*
262f764e6fcSdrh ** Implementation of the substr() function.
263f764e6fcSdrh **
264f764e6fcSdrh ** substr(x,p1,p2)  returns p2 characters of x[] beginning with p1.
265f764e6fcSdrh ** p1 is 1-indexed.  So substr(x,1,1) returns the first character
266f764e6fcSdrh ** of x.  If x is text, then we actually count UTF-8 characters.
267f764e6fcSdrh ** If x is a blob, then we count bytes.
268f764e6fcSdrh **
269f764e6fcSdrh ** If p1 is negative, then we begin abs(p1) from the end of x[].
270779b8f12Sshaneh **
271f7b5496eSdrh ** If p2 is negative, return the p2 characters preceding p1.
2720bce8354Sdrh */
273f9b596ebSdrh static void substrFunc(
274f9b596ebSdrh   sqlite3_context *context,
275f9b596ebSdrh   int argc,
276f9b596ebSdrh   sqlite3_value **argv
277f9b596ebSdrh ){
2782646da7eSdrh   const unsigned char *z;
2792646da7eSdrh   const unsigned char *z2;
280023ae03aSdrh   int len;
281f764e6fcSdrh   int p0type;
282023ae03aSdrh   i64 p1, p2;
28365595cd6Sdrh   int negP2 = 0;
284f9b596ebSdrh 
28564f31519Sdrh   assert( argc==3 || argc==2 );
2868198d254Sdrh   if( sqlite3_value_type(argv[1])==SQLITE_NULL
2878198d254Sdrh    || (argc==3 && sqlite3_value_type(argv[2])==SQLITE_NULL)
2888198d254Sdrh   ){
2898198d254Sdrh     return;
2908198d254Sdrh   }
291f764e6fcSdrh   p0type = sqlite3_value_type(argv[0]);
2924adc4cb9Sdrh   p1 = sqlite3_value_int(argv[1]);
293f764e6fcSdrh   if( p0type==SQLITE_BLOB ){
294f764e6fcSdrh     len = sqlite3_value_bytes(argv[0]);
295f764e6fcSdrh     z = sqlite3_value_blob(argv[0]);
296f764e6fcSdrh     if( z==0 ) return;
2971f0feef8Sdrh     assert( len==sqlite3_value_bytes(argv[0]) );
298f764e6fcSdrh   }else{
2994f26d6c4Sdrh     z = sqlite3_value_text(argv[0]);
3000bce8354Sdrh     if( z==0 ) return;
3014a919118Sdrh     len = 0;
3024adc4cb9Sdrh     if( p1<0 ){
3034a919118Sdrh       for(z2=z; *z2; len++){
3044a919118Sdrh         SQLITE_SKIP_UTF8(z2);
3054a919118Sdrh       }
306f764e6fcSdrh     }
3074adc4cb9Sdrh   }
308883ad049Sdrh #ifdef SQLITE_SUBSTR_COMPATIBILITY
309883ad049Sdrh   /* If SUBSTR_COMPATIBILITY is defined then substr(X,0,N) work the same as
310883ad049Sdrh   ** as substr(X,1,N) - it returns the first N characters of X.  This
311883ad049Sdrh   ** is essentially a back-out of the bug-fix in check-in [5fc125d362df4b8]
312883ad049Sdrh   ** from 2009-02-02 for compatibility of applications that exploited the
313883ad049Sdrh   ** old buggy behavior. */
314883ad049Sdrh   if( p1==0 ) p1 = 1; /* <rdar://problem/6778339> */
315883ad049Sdrh #endif
31664f31519Sdrh   if( argc==3 ){
31751ad0ecdSdanielk1977     p2 = sqlite3_value_int(argv[2]);
31865595cd6Sdrh     if( p2<0 ){
31965595cd6Sdrh       p2 = -p2;
32065595cd6Sdrh       negP2 = 1;
32165595cd6Sdrh     }
32264f31519Sdrh   }else{
323bb4957f8Sdrh     p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH];
32464f31519Sdrh   }
3250bce8354Sdrh   if( p1<0 ){
32689425d5eSdrh     p1 += len;
327653bc759Sdrh     if( p1<0 ){
328653bc759Sdrh       p2 += p1;
32965595cd6Sdrh       if( p2<0 ) p2 = 0;
330653bc759Sdrh       p1 = 0;
331653bc759Sdrh     }
3320bce8354Sdrh   }else if( p1>0 ){
3330bce8354Sdrh     p1--;
33465595cd6Sdrh   }else if( p2>0 ){
33565595cd6Sdrh     p2--;
3360bce8354Sdrh   }
33765595cd6Sdrh   if( negP2 ){
33865595cd6Sdrh     p1 -= p2;
3394e79c594Sdrh     if( p1<0 ){
3404e79c594Sdrh       p2 += p1;
3414e79c594Sdrh       p1 = 0;
3424e79c594Sdrh     }
3434e79c594Sdrh   }
34465595cd6Sdrh   assert( p1>=0 && p2>=0 );
345f764e6fcSdrh   if( p0type!=SQLITE_BLOB ){
3464a919118Sdrh     while( *z && p1 ){
3474a919118Sdrh       SQLITE_SKIP_UTF8(z);
3484a919118Sdrh       p1--;
3490bce8354Sdrh     }
3504a919118Sdrh     for(z2=z; *z2 && p2; p2--){
3514a919118Sdrh       SQLITE_SKIP_UTF8(z2);
3520bce8354Sdrh     }
353bbf483f8Sdrh     sqlite3_result_text64(context, (char*)z, z2-z, SQLITE_TRANSIENT,
354bbf483f8Sdrh                           SQLITE_UTF8);
355f764e6fcSdrh   }else{
3564adc4cb9Sdrh     if( p1+p2>len ){
3574adc4cb9Sdrh       p2 = len-p1;
3584adc4cb9Sdrh       if( p2<0 ) p2 = 0;
3594adc4cb9Sdrh     }
360bbf483f8Sdrh     sqlite3_result_blob64(context, (char*)&z[p1], (u64)p2, SQLITE_TRANSIENT);
361f764e6fcSdrh   }
3620bce8354Sdrh }
3630bce8354Sdrh 
3640bce8354Sdrh /*
3650bce8354Sdrh ** Implementation of the round() function
3660bce8354Sdrh */
367fbd60f82Sshane #ifndef SQLITE_OMIT_FLOATING_POINT
3680ae8b831Sdanielk1977 static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
36951ad0ecdSdanielk1977   int n = 0;
3700bce8354Sdrh   double r;
37150d654daSdrh   char *zBuf;
3720bce8354Sdrh   assert( argc==1 || argc==2 );
37351ad0ecdSdanielk1977   if( argc==2 ){
3749c054830Sdrh     if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
37551ad0ecdSdanielk1977     n = sqlite3_value_int(argv[1]);
3760bce8354Sdrh     if( n>30 ) n = 30;
3770bce8354Sdrh     if( n<0 ) n = 0;
37851ad0ecdSdanielk1977   }
379d589a92aSdrh   if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
3804f26d6c4Sdrh   r = sqlite3_value_double(argv[0]);
381147e176aSshaneh   /* If Y==0 and X will fit in a 64-bit int,
382147e176aSshaneh   ** handle the rounding directly,
383147e176aSshaneh   ** otherwise use printf.
384147e176aSshaneh   */
385147e176aSshaneh   if( n==0 && r>=0 && r<LARGEST_INT64-1 ){
386147e176aSshaneh     r = (double)((sqlite_int64)(r+0.5));
387147e176aSshaneh   }else if( n==0 && r<0 && (-r)<LARGEST_INT64-1 ){
388147e176aSshaneh     r = -(double)((sqlite_int64)((-r)+0.5));
389147e176aSshaneh   }else{
39050d654daSdrh     zBuf = sqlite3_mprintf("%.*f",n,r);
39150d654daSdrh     if( zBuf==0 ){
39250d654daSdrh       sqlite3_result_error_nomem(context);
393147e176aSshaneh       return;
394147e176aSshaneh     }
3959339da1fSdrh     sqlite3AtoF(zBuf, &r, sqlite3Strlen30(zBuf), SQLITE_UTF8);
39650d654daSdrh     sqlite3_free(zBuf);
3970bce8354Sdrh   }
398147e176aSshaneh   sqlite3_result_double(context, r);
39950d654daSdrh }
400fbd60f82Sshane #endif
401dc04c583Sdrh 
40226783a58Sdanielk1977 /*
403f3cdcdccSdrh ** Allocate nByte bytes of space using sqlite3Malloc(). If the
40426783a58Sdanielk1977 ** allocation fails, call sqlite3_result_error_nomem() to notify
40527e62dbeSdrh ** the database handle that malloc() has failed and return NULL.
40627e62dbeSdrh ** If nByte is larger than the maximum string or blob length, then
40727e62dbeSdrh ** raise an SQLITE_TOOBIG exception and return NULL.
40826783a58Sdanielk1977 */
409b1a6c3c1Sdrh static void *contextMalloc(sqlite3_context *context, i64 nByte){
410bb4957f8Sdrh   char *z;
41127e62dbeSdrh   sqlite3 *db = sqlite3_context_db_handle(context);
412ef31c6aaSdrh   assert( nByte>0 );
41327e62dbeSdrh   testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] );
41427e62dbeSdrh   testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
41527e62dbeSdrh   if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
416bb4957f8Sdrh     sqlite3_result_error_toobig(context);
417bb4957f8Sdrh     z = 0;
418bb4957f8Sdrh   }else{
419da4ca9d1Sdrh     z = sqlite3Malloc(nByte);
420ef31c6aaSdrh     if( !z ){
421a1644fd8Sdanielk1977       sqlite3_result_error_nomem(context);
422a1644fd8Sdanielk1977     }
423bb4957f8Sdrh   }
424a1644fd8Sdanielk1977   return z;
425a1644fd8Sdanielk1977 }
426a1644fd8Sdanielk1977 
427dc04c583Sdrh /*
428dc04c583Sdrh ** Implementation of the upper() and lower() SQL functions.
429dc04c583Sdrh */
4300ae8b831Sdanielk1977 static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
4317a521cfbSdrh   char *z1;
4327a521cfbSdrh   const char *z2;
4339310ef23Sdrh   int i, n;
4341d34fdecSdrh   UNUSED_PARAMETER(argc);
4357a521cfbSdrh   z2 = (char*)sqlite3_value_text(argv[0]);
4361f0feef8Sdrh   n = sqlite3_value_bytes(argv[0]);
4371f0feef8Sdrh   /* Verify that the call to _bytes() does not invalidate the _text() pointer */
4381f0feef8Sdrh   assert( z2==(char*)sqlite3_value_text(argv[0]) );
4397a521cfbSdrh   if( z2 ){
440b1a6c3c1Sdrh     z1 = contextMalloc(context, ((i64)n)+1);
4417a521cfbSdrh     if( z1 ){
442df901d34Sdrh       for(i=0; i<n; i++){
443df901d34Sdrh         z1[i] = (char)sqlite3Toupper(z2[i]);
444dc04c583Sdrh       }
445df901d34Sdrh       sqlite3_result_text(context, z1, n, sqlite3_free);
4467a521cfbSdrh     }
4477a521cfbSdrh   }
448dc04c583Sdrh }
4490ae8b831Sdanielk1977 static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
450df901d34Sdrh   char *z1;
4517a521cfbSdrh   const char *z2;
4529310ef23Sdrh   int i, n;
4531d34fdecSdrh   UNUSED_PARAMETER(argc);
4547a521cfbSdrh   z2 = (char*)sqlite3_value_text(argv[0]);
4551f0feef8Sdrh   n = sqlite3_value_bytes(argv[0]);
4561f0feef8Sdrh   /* Verify that the call to _bytes() does not invalidate the _text() pointer */
4571f0feef8Sdrh   assert( z2==(char*)sqlite3_value_text(argv[0]) );
4587a521cfbSdrh   if( z2 ){
459b1a6c3c1Sdrh     z1 = contextMalloc(context, ((i64)n)+1);
4607a521cfbSdrh     if( z1 ){
461df901d34Sdrh       for(i=0; i<n; i++){
462df901d34Sdrh         z1[i] = sqlite3Tolower(z2[i]);
463dc04c583Sdrh       }
464df901d34Sdrh       sqlite3_result_text(context, z1, n, sqlite3_free);
4657a521cfbSdrh     }
4667a521cfbSdrh   }
467dc04c583Sdrh }
468dc04c583Sdrh 
469ae6bb957Sdrh /*
470cca9f3d2Sdrh ** Some functions like COALESCE() and IFNULL() and UNLIKELY() are implemented
471cca9f3d2Sdrh ** as VDBE code so that unused argument values do not have to be computed.
472cca9f3d2Sdrh ** However, we still need some kind of function implementation for this
473cca9f3d2Sdrh ** routines in the function table.  The noopFunc macro provides this.
474cca9f3d2Sdrh ** noopFunc will never be called so it doesn't matter what the implementation
475cca9f3d2Sdrh ** is.  We might as well use the "version()" function as a substitute.
476ae6bb957Sdrh */
477cca9f3d2Sdrh #define noopFunc versionFunc   /* Substitute function - never called */
4783212e182Sdrh 
4793212e182Sdrh /*
480f9ffac96Sdrh ** Implementation of random().  Return a random integer.
481f9ffac96Sdrh */
482f9b596ebSdrh static void randomFunc(
483f9b596ebSdrh   sqlite3_context *context,
48462c14b34Sdanielk1977   int NotUsed,
48562c14b34Sdanielk1977   sqlite3_value **NotUsed2
486f9b596ebSdrh ){
48752fc849aSdrh   sqlite_int64 r;
48862c14b34Sdanielk1977   UNUSED_PARAMETER2(NotUsed, NotUsed2);
4892fa1868fSdrh   sqlite3_randomness(sizeof(r), &r);
4903034e3d3Sdrh   if( r<0 ){
4913034e3d3Sdrh     /* We need to prevent a random number of 0x8000000000000000
4923034e3d3Sdrh     ** (or -9223372036854775808) since when you do abs() of that
4933034e3d3Sdrh     ** number of you get the same value back again.  To do this
4943034e3d3Sdrh     ** in a way that is testable, mask the sign bit off of negative
4953034e3d3Sdrh     ** values, resulting in a positive value.  Then take the
4963034e3d3Sdrh     ** 2s complement of that positive value.  The end result can
4973034e3d3Sdrh     ** therefore be no less than -9223372036854775807.
4983034e3d3Sdrh     */
499af8001bfSdrh     r = -(r & LARGEST_INT64);
5003034e3d3Sdrh   }
50152fc849aSdrh   sqlite3_result_int64(context, r);
502f9ffac96Sdrh }
503f9ffac96Sdrh 
504f9ffac96Sdrh /*
505137c728fSdrh ** Implementation of randomblob(N).  Return a random blob
506137c728fSdrh ** that is N bytes long.
50763cf66f0Sdrh */
508137c728fSdrh static void randomBlob(
50963cf66f0Sdrh   sqlite3_context *context,
51063cf66f0Sdrh   int argc,
51163cf66f0Sdrh   sqlite3_value **argv
51263cf66f0Sdrh ){
513137c728fSdrh   int n;
514137c728fSdrh   unsigned char *p;
51563cf66f0Sdrh   assert( argc==1 );
516f3d3c27aSdanielk1977   UNUSED_PARAMETER(argc);
51763cf66f0Sdrh   n = sqlite3_value_int(argv[0]);
518023ae03aSdrh   if( n<1 ){
519023ae03aSdrh     n = 1;
520023ae03aSdrh   }
521a1644fd8Sdanielk1977   p = contextMalloc(context, n);
52202d85836Sdrh   if( p ){
5232fa1868fSdrh     sqlite3_randomness(n, p);
52417435752Sdrh     sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
52502d85836Sdrh   }
52663cf66f0Sdrh }
52763cf66f0Sdrh 
52863cf66f0Sdrh /*
5296ed41ad7Sdrh ** Implementation of the last_insert_rowid() SQL function.  The return
53024b03fd0Sdanielk1977 ** value is the same as the sqlite3_last_insert_rowid() API function.
5316ed41ad7Sdrh */
53251ad0ecdSdanielk1977 static void last_insert_rowid(
5330ae8b831Sdanielk1977   sqlite3_context *context,
53462c14b34Sdanielk1977   int NotUsed,
53562c14b34Sdanielk1977   sqlite3_value **NotUsed2
53651ad0ecdSdanielk1977 ){
537fa4a4b91Sdrh   sqlite3 *db = sqlite3_context_db_handle(context);
53862c14b34Sdanielk1977   UNUSED_PARAMETER2(NotUsed, NotUsed2);
539ab2f1f95Sdrh   /* IMP: R-51513-12026 The last_insert_rowid() SQL function is a
540ab2f1f95Sdrh   ** wrapper around the sqlite3_last_insert_rowid() C/C++ interface
541ab2f1f95Sdrh   ** function. */
542f9b596ebSdrh   sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
5436ed41ad7Sdrh }
5446ed41ad7Sdrh 
545f146a776Srdc /*
546ab2f1f95Sdrh ** Implementation of the changes() SQL function.
547ab2f1f95Sdrh **
548ab2f1f95Sdrh ** IMP: R-62073-11209 The changes() SQL function is a wrapper
549ab2f1f95Sdrh ** around the sqlite3_changes() C/C++ function and hence follows the same
550ab2f1f95Sdrh ** rules for counting changes.
551f146a776Srdc */
552b28af71aSdanielk1977 static void changes(
553f9b596ebSdrh   sqlite3_context *context,
55462c14b34Sdanielk1977   int NotUsed,
55562c14b34Sdanielk1977   sqlite3_value **NotUsed2
556f9b596ebSdrh ){
557fa4a4b91Sdrh   sqlite3 *db = sqlite3_context_db_handle(context);
55862c14b34Sdanielk1977   UNUSED_PARAMETER2(NotUsed, NotUsed2);
559f4479501Sdrh   sqlite3_result_int(context, sqlite3_changes(db));
560b0c374ffSrdc }
561f146a776Srdc 
562f146a776Srdc /*
563b28af71aSdanielk1977 ** Implementation of the total_changes() SQL function.  The return value is
564b28af71aSdanielk1977 ** the same as the sqlite3_total_changes() API function.
565f146a776Srdc */
566b28af71aSdanielk1977 static void total_changes(
5670ae8b831Sdanielk1977   sqlite3_context *context,
56862c14b34Sdanielk1977   int NotUsed,
56962c14b34Sdanielk1977   sqlite3_value **NotUsed2
57051ad0ecdSdanielk1977 ){
571fa4a4b91Sdrh   sqlite3 *db = sqlite3_context_db_handle(context);
57262c14b34Sdanielk1977   UNUSED_PARAMETER2(NotUsed, NotUsed2);
573ab2f1f95Sdrh   /* IMP: R-52756-41993 This function is a wrapper around the
574ab2f1f95Sdrh   ** sqlite3_total_changes() C/C++ interface. */
575b28af71aSdanielk1977   sqlite3_result_int(context, sqlite3_total_changes(db));
576b0c374ffSrdc }
577b0c374ffSrdc 
5786ed41ad7Sdrh /*
5794e5ffc5fSdrh ** A structure defining how to do GLOB-style comparisons.
580d02eb1fdSdanielk1977 */
5814e5ffc5fSdrh struct compareInfo {
58207e83472Sdrh   u8 matchAll;          /* "*" or "%" */
58307e83472Sdrh   u8 matchOne;          /* "?" or "_" */
58407e83472Sdrh   u8 matchSet;          /* "[" or 0 */
58507e83472Sdrh   u8 noCase;            /* true to ignore case differences */
586d02eb1fdSdanielk1977 };
58755ef4d97Sdrh 
588b9175aedSdrh /*
589b9175aedSdrh ** For LIKE and GLOB matching on EBCDIC machines, assume that every
590b0870486Sdrh ** character is exactly one byte in size.  Also, provde the Utf8Read()
591b0870486Sdrh ** macro for fast reading of the next character in the common case where
592b0870486Sdrh ** the next character is ASCII.
593b9175aedSdrh */
594b9175aedSdrh #if defined(SQLITE_EBCDIC)
59542610961Sdrh # define sqlite3Utf8Read(A)        (*((*A)++))
596b0870486Sdrh # define Utf8Read(A)               (*(A++))
597b9175aedSdrh #else
598b0870486Sdrh # define Utf8Read(A)               (A[0]<0x80?*(A++):sqlite3Utf8Read(&A))
599b9175aedSdrh #endif
600b9175aedSdrh 
6014e5ffc5fSdrh static const struct compareInfo globInfo = { '*', '?', '[', 0 };
60270031fa3Sdrh /* The correct SQL-92 behavior is for the LIKE operator to ignore
60370031fa3Sdrh ** case.  Thus  'a' LIKE 'A' would be true. */
60455ef4d97Sdrh static const struct compareInfo likeInfoNorm = { '%', '_',   0, 1 };
60570031fa3Sdrh /* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
60670031fa3Sdrh ** is case sensitive causing 'a' LIKE 'A' to be false */
60755ef4d97Sdrh static const struct compareInfo likeInfoAlt = { '%', '_',   0, 0 };
608d02eb1fdSdanielk1977 
609d02eb1fdSdanielk1977 /*
610698a01caSdrh ** Possible error returns from patternMatch()
611698a01caSdrh */
612698a01caSdrh #define SQLITE_MATCH             0
613698a01caSdrh #define SQLITE_NOMATCH           1
614698a01caSdrh #define SQLITE_NOWILDCARDMATCH   2
615698a01caSdrh 
616698a01caSdrh /*
617698a01caSdrh ** Compare two UTF-8 strings for equality where the first string is
618698a01caSdrh ** a GLOB or LIKE expression.  Return values:
619698a01caSdrh **
620698a01caSdrh **    SQLITE_MATCH:            Match
621698a01caSdrh **    SQLITE_NOMATCH:          No match
622698a01caSdrh **    SQLITE_NOWILDCARDMATCH:  No match in spite of having * or % wildcards.
6230ac65892Sdrh **
6244e5ffc5fSdrh ** Globbing rules:
6250ac65892Sdrh **
6264e5ffc5fSdrh **      '*'       Matches any sequence of zero or more characters.
627d02eb1fdSdanielk1977 **
6284e5ffc5fSdrh **      '?'       Matches exactly one character.
6294e5ffc5fSdrh **
6304e5ffc5fSdrh **     [...]      Matches one character from the enclosed list of
6314e5ffc5fSdrh **                characters.
6324e5ffc5fSdrh **
6334e5ffc5fSdrh **     [^...]     Matches one character not in the enclosed list.
6344e5ffc5fSdrh **
6354e5ffc5fSdrh ** With the [...] and [^...] matching, a ']' character can be included
6364e5ffc5fSdrh ** in the list by making it the first character after '[' or '^'.  A
6374e5ffc5fSdrh ** range of characters can be specified using '-'.  Example:
6384e5ffc5fSdrh ** "[a-z]" matches any single lower-case letter.  To match a '-', make
6394e5ffc5fSdrh ** it the last character in the list.
6404e5ffc5fSdrh **
6419fdfdc89Sdrh ** Like matching rules:
6429fdfdc89Sdrh **
6439fdfdc89Sdrh **      '%'       Matches any sequence of zero or more characters
6449fdfdc89Sdrh **
6459fdfdc89Sdrh ***     '_'       Matches any one character
6469fdfdc89Sdrh **
6479fdfdc89Sdrh **      Ec        Where E is the "esc" character and c is any other
6489fdfdc89Sdrh **                character, including '%', '_', and esc, match exactly c.
6499fdfdc89Sdrh **
650b0870486Sdrh ** The comments within this routine usually assume glob matching.
6519fdfdc89Sdrh **
6524e5ffc5fSdrh ** This routine is usually quick, but can be N**2 in the worst case.
6530ac65892Sdrh */
6547c6303c0Sdanielk1977 static int patternCompare(
6554e5ffc5fSdrh   const u8 *zPattern,              /* The glob pattern */
6564e5ffc5fSdrh   const u8 *zString,               /* The string to compare against the glob */
6577c6303c0Sdanielk1977   const struct compareInfo *pInfo, /* Information about how to do the compare */
658698a01caSdrh   u32 matchOther                   /* The escape char (LIKE) or '[' (GLOB) */
65951ad0ecdSdanielk1977 ){
6609fdfdc89Sdrh   u32 c, c2;                       /* Next pattern and input string chars */
6619fdfdc89Sdrh   u32 matchOne = pInfo->matchOne;  /* "?" or "_" */
6629fdfdc89Sdrh   u32 matchAll = pInfo->matchAll;  /* "*" or "%" */
6639fdfdc89Sdrh   u8 noCase = pInfo->noCase;       /* True if uppercase==lowercase */
6649fdfdc89Sdrh   const u8 *zEscaped = 0;          /* One past the last escaped input char */
665d02eb1fdSdanielk1977 
666b0870486Sdrh   while( (c = Utf8Read(zPattern))!=0 ){
6679fdfdc89Sdrh     if( c==matchAll ){  /* Match "*" */
6689fdfdc89Sdrh       /* Skip over multiple "*" characters in the pattern.  If there
6699fdfdc89Sdrh       ** are also "?" characters, skip those as well, but consume a
6709fdfdc89Sdrh       ** single character of the input string for each "?" skipped */
671b0870486Sdrh       while( (c=Utf8Read(zPattern)) == matchAll || c == matchOne ){
67242610961Sdrh         if( c==matchOne && sqlite3Utf8Read(&zString)==0 ){
673698a01caSdrh           return SQLITE_NOWILDCARDMATCH;
674d02eb1fdSdanielk1977         }
6754e5ffc5fSdrh       }
67666150956Sdrh       if( c==0 ){
677698a01caSdrh         return SQLITE_MATCH;   /* "*" at the end of the pattern matches */
67888b3322fSdrh       }else if( c==matchOther ){
67907e83472Sdrh         if( pInfo->matchSet==0 ){
68042610961Sdrh           c = sqlite3Utf8Read(&zPattern);
681698a01caSdrh           if( c==0 ) return SQLITE_NOWILDCARDMATCH;
68288b3322fSdrh         }else{
6839fdfdc89Sdrh           /* "[...]" immediately follows the "*".  We have to do a slow
6849fdfdc89Sdrh           ** recursive search in this case, but it is an unusual case. */
68588b3322fSdrh           assert( matchOther<0x80 );  /* '[' is a single-byte character */
686698a01caSdrh           while( *zString ){
687698a01caSdrh             int bMatch = patternCompare(&zPattern[-1],zString,pInfo,matchOther);
688698a01caSdrh             if( bMatch!=SQLITE_NOMATCH ) return bMatch;
6894a919118Sdrh             SQLITE_SKIP_UTF8(zString);
6904e5ffc5fSdrh           }
691698a01caSdrh           return SQLITE_NOWILDCARDMATCH;
69266150956Sdrh         }
69388b3322fSdrh       }
6949fdfdc89Sdrh 
6959fdfdc89Sdrh       /* At this point variable c contains the first character of the
6969fdfdc89Sdrh       ** pattern string past the "*".  Search in the input string for the
6971a4a7376Sdan       ** first matching character and recursively continue the match from
6989fdfdc89Sdrh       ** that point.
6999fdfdc89Sdrh       **
7009fdfdc89Sdrh       ** For a case-insensitive search, set variable cx to be the same as
7019fdfdc89Sdrh       ** c but in the other case and search the input string for either
7029fdfdc89Sdrh       ** c or cx.
7039fdfdc89Sdrh       */
7049fdfdc89Sdrh       if( c<=0x80 ){
705eba21f9eSdrh         char zStop[3];
706698a01caSdrh         int bMatch;
7079fdfdc89Sdrh         if( noCase ){
708eba21f9eSdrh           zStop[0] = sqlite3Toupper(c);
709eba21f9eSdrh           zStop[1] = sqlite3Tolower(c);
710eba21f9eSdrh           zStop[2] = 0;
711ad7dd425Sdanielk1977         }else{
712eba21f9eSdrh           zStop[0] = c;
713eba21f9eSdrh           zStop[1] = 0;
71466150956Sdrh         }
715eba21f9eSdrh         while(1){
716eba21f9eSdrh           zString += strcspn((const char*)zString, zStop);
717eba21f9eSdrh           if( zString[0]==0 ) break;
718eba21f9eSdrh           zString++;
719698a01caSdrh           bMatch = patternCompare(zPattern,zString,pInfo,matchOther);
720698a01caSdrh           if( bMatch!=SQLITE_NOMATCH ) return bMatch;
7214e5ffc5fSdrh         }
72288b3322fSdrh       }else{
723698a01caSdrh         int bMatch;
724b0870486Sdrh         while( (c2 = Utf8Read(zString))!=0 ){
7259fdfdc89Sdrh           if( c2!=c ) continue;
726698a01caSdrh           bMatch = patternCompare(zPattern,zString,pInfo,matchOther);
727698a01caSdrh           if( bMatch!=SQLITE_NOMATCH ) return bMatch;
72866150956Sdrh         }
72988b3322fSdrh       }
730698a01caSdrh       return SQLITE_NOWILDCARDMATCH;
7319fdfdc89Sdrh     }
73288b3322fSdrh     if( c==matchOther ){
73307e83472Sdrh       if( pInfo->matchSet==0 ){
73488b3322fSdrh         c = sqlite3Utf8Read(&zPattern);
735698a01caSdrh         if( c==0 ) return SQLITE_NOMATCH;
7369fdfdc89Sdrh         zEscaped = zPattern;
73788b3322fSdrh       }else{
7381aa4f3e5Sdrh         u32 prior_c = 0;
7399fdfdc89Sdrh         int seen = 0;
7409fdfdc89Sdrh         int invert = 0;
74142610961Sdrh         c = sqlite3Utf8Read(&zString);
742698a01caSdrh         if( c==0 ) return SQLITE_NOMATCH;
74342610961Sdrh         c2 = sqlite3Utf8Read(&zPattern);
74466150956Sdrh         if( c2=='^' ){
74566150956Sdrh           invert = 1;
74642610961Sdrh           c2 = sqlite3Utf8Read(&zPattern);
74766150956Sdrh         }
7484e5ffc5fSdrh         if( c2==']' ){
7494e5ffc5fSdrh           if( c==']' ) seen = 1;
75042610961Sdrh           c2 = sqlite3Utf8Read(&zPattern);
7514e5ffc5fSdrh         }
75266150956Sdrh         while( c2 && c2!=']' ){
75366150956Sdrh           if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
75442610961Sdrh             c2 = sqlite3Utf8Read(&zPattern);
7554e5ffc5fSdrh             if( c>=prior_c && c<=c2 ) seen = 1;
7564e5ffc5fSdrh             prior_c = 0;
75766150956Sdrh           }else{
75866150956Sdrh             if( c==c2 ){
7594e5ffc5fSdrh               seen = 1;
76066150956Sdrh             }
7614e5ffc5fSdrh             prior_c = c2;
762d02eb1fdSdanielk1977           }
76342610961Sdrh           c2 = sqlite3Utf8Read(&zPattern);
764d02eb1fdSdanielk1977         }
76566150956Sdrh         if( c2==0 || (seen ^ invert)==0 ){
766698a01caSdrh           return SQLITE_NOMATCH;
76766150956Sdrh         }
76888b3322fSdrh         continue;
769328d913cSdrh       }
77088b3322fSdrh     }
771b0870486Sdrh     c2 = Utf8Read(zString);
77288b3322fSdrh     if( c==c2 ) continue;
773c80937a5Sdrh     if( noCase  && sqlite3Tolower(c)==sqlite3Tolower(c2) && c<0x80 && c2<0x80 ){
7749fdfdc89Sdrh       continue;
7759fdfdc89Sdrh     }
7769fdfdc89Sdrh     if( c==matchOne && zPattern!=zEscaped && c2!=0 ) continue;
777698a01caSdrh     return SQLITE_NOMATCH;
7780ac65892Sdrh   }
779698a01caSdrh   return *zString==0 ? SQLITE_MATCH : SQLITE_NOMATCH;
7804e5ffc5fSdrh }
7814e5ffc5fSdrh 
78255ef4d97Sdrh /*
783698a01caSdrh ** The sqlite3_strglob() interface.  Return 0 on a match (like strcmp()) and
784698a01caSdrh ** non-zero if there is no match.
78556282a5bSdrh */
78656282a5bSdrh int sqlite3_strglob(const char *zGlobPattern, const char *zString){
787698a01caSdrh   return patternCompare((u8*)zGlobPattern, (u8*)zString, &globInfo, '[');
78856282a5bSdrh }
78956282a5bSdrh 
79056282a5bSdrh /*
791698a01caSdrh ** The sqlite3_strlike() interface.  Return 0 on a match and non-zero for
792698a01caSdrh ** a miss - like strcmp().
7938b4a94adSdrh */
7948b4a94adSdrh int sqlite3_strlike(const char *zPattern, const char *zStr, unsigned int esc){
795698a01caSdrh   return patternCompare((u8*)zPattern, (u8*)zStr, &likeInfoNorm, esc);
7968b4a94adSdrh }
7978b4a94adSdrh 
7988b4a94adSdrh /*
79955ef4d97Sdrh ** Count the number of times that the LIKE operator (or GLOB which is
80055ef4d97Sdrh ** just a variation of LIKE) gets called.  This is used for testing
80155ef4d97Sdrh ** only.
80255ef4d97Sdrh */
80355ef4d97Sdrh #ifdef SQLITE_TEST
80455ef4d97Sdrh int sqlite3_like_count = 0;
80555ef4d97Sdrh #endif
80655ef4d97Sdrh 
8073f6b0874Sdanielk1977 
8083f6b0874Sdanielk1977 /*
8093f6b0874Sdanielk1977 ** Implementation of the like() SQL function.  This function implements
8103f6b0874Sdanielk1977 ** the build-in LIKE operator.  The first argument to the function is the
8113f6b0874Sdanielk1977 ** pattern and the second argument is the string.  So, the SQL statements:
8123f6b0874Sdanielk1977 **
8133f6b0874Sdanielk1977 **       A LIKE B
8143f6b0874Sdanielk1977 **
8153f6b0874Sdanielk1977 ** is implemented as like(B,A).
8163f6b0874Sdanielk1977 **
81755ef4d97Sdrh ** This same function (with a different compareInfo structure) computes
81855ef4d97Sdrh ** the GLOB operator.
8193f6b0874Sdanielk1977 */
8203f6b0874Sdanielk1977 static void likeFunc(
8213f6b0874Sdanielk1977   sqlite3_context *context,
8223f6b0874Sdanielk1977   int argc,
8233f6b0874Sdanielk1977   sqlite3_value **argv
8243f6b0874Sdanielk1977 ){
825beb818d1Sdrh   const unsigned char *zA, *zB;
82607e83472Sdrh   u32 escape;
82727e62dbeSdrh   int nPat;
828bb4957f8Sdrh   sqlite3 *db = sqlite3_context_db_handle(context);
82907e83472Sdrh   struct compareInfo *pInfo = sqlite3_user_data(context);
830beb818d1Sdrh 
83141d2e66eSdrh #ifdef SQLITE_LIKE_DOESNT_MATCH_BLOBS
83241d2e66eSdrh   if( sqlite3_value_type(argv[0])==SQLITE_BLOB
83341d2e66eSdrh    || sqlite3_value_type(argv[1])==SQLITE_BLOB
83441d2e66eSdrh   ){
83541d2e66eSdrh #ifdef SQLITE_TEST
83641d2e66eSdrh     sqlite3_like_count++;
83741d2e66eSdrh #endif
83841d2e66eSdrh     sqlite3_result_int(context, 0);
83941d2e66eSdrh     return;
84041d2e66eSdrh   }
84141d2e66eSdrh #endif
8421f0feef8Sdrh   zB = sqlite3_value_text(argv[0]);
8431f0feef8Sdrh   zA = sqlite3_value_text(argv[1]);
8441f0feef8Sdrh 
845beb818d1Sdrh   /* Limit the length of the LIKE or GLOB pattern to avoid problems
846beb818d1Sdrh   ** of deep recursion and N*N behavior in patternCompare().
847beb818d1Sdrh   */
84827e62dbeSdrh   nPat = sqlite3_value_bytes(argv[0]);
84927e62dbeSdrh   testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] );
85027e62dbeSdrh   testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 );
85127e62dbeSdrh   if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
852beb818d1Sdrh     sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
853beb818d1Sdrh     return;
854beb818d1Sdrh   }
8551f0feef8Sdrh   assert( zB==sqlite3_value_text(argv[0]) );  /* Encoding did not change */
856beb818d1Sdrh 
8577c6303c0Sdanielk1977   if( argc==3 ){
8587c6303c0Sdanielk1977     /* The escape character string must consist of a single UTF-8 character.
8597c6303c0Sdanielk1977     ** Otherwise, return an error.
8607c6303c0Sdanielk1977     */
8617c6303c0Sdanielk1977     const unsigned char *zEsc = sqlite3_value_text(argv[2]);
8627a521cfbSdrh     if( zEsc==0 ) return;
863ee85813cSdrh     if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
8647c6303c0Sdanielk1977       sqlite3_result_error(context,
8657c6303c0Sdanielk1977           "ESCAPE expression must be a single character", -1);
8667c6303c0Sdanielk1977       return;
8677c6303c0Sdanielk1977     }
86842610961Sdrh     escape = sqlite3Utf8Read(&zEsc);
86907e83472Sdrh   }else{
87007e83472Sdrh     escape = pInfo->matchSet;
8717c6303c0Sdanielk1977   }
8723f6b0874Sdanielk1977   if( zA && zB ){
87355ef4d97Sdrh #ifdef SQLITE_TEST
87455ef4d97Sdrh     sqlite3_like_count++;
87555ef4d97Sdrh #endif
876f49759bfSdrh     sqlite3_result_int(context,
877f49759bfSdrh                       patternCompare(zB, zA, pInfo, escape)==SQLITE_MATCH);
87851ad0ecdSdanielk1977   }
8798912d106Sdrh }
8808912d106Sdrh 
8818912d106Sdrh /*
8828912d106Sdrh ** Implementation of the NULLIF(x,y) function.  The result is the first
8838912d106Sdrh ** argument if the arguments are different.  The result is NULL if the
8848912d106Sdrh ** arguments are equal to each other.
8858912d106Sdrh */
886f9b596ebSdrh static void nullifFunc(
887f9b596ebSdrh   sqlite3_context *context,
88862c14b34Sdanielk1977   int NotUsed,
889f9b596ebSdrh   sqlite3_value **argv
890f9b596ebSdrh ){
891dc1bdc4fSdanielk1977   CollSeq *pColl = sqlite3GetFuncCollSeq(context);
89262c14b34Sdanielk1977   UNUSED_PARAMETER(NotUsed);
893dc1bdc4fSdanielk1977   if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
894f4479501Sdrh     sqlite3_result_value(context, argv[0]);
8958912d106Sdrh   }
8960ac65892Sdrh }
8970ac65892Sdrh 
898647cb0e1Sdrh /*
89947baebc2Sdrh ** Implementation of the sqlite_version() function.  The result is the version
900647cb0e1Sdrh ** of the SQLite library that is running.
901647cb0e1Sdrh */
902f9b596ebSdrh static void versionFunc(
903f9b596ebSdrh   sqlite3_context *context,
90462c14b34Sdanielk1977   int NotUsed,
90562c14b34Sdanielk1977   sqlite3_value **NotUsed2
906f9b596ebSdrh ){
90762c14b34Sdanielk1977   UNUSED_PARAMETER2(NotUsed, NotUsed2);
908ab2f1f95Sdrh   /* IMP: R-48699-48617 This function is an SQL wrapper around the
909ab2f1f95Sdrh   ** sqlite3_libversion() C-interface. */
910ab2f1f95Sdrh   sqlite3_result_text(context, sqlite3_libversion(), -1, SQLITE_STATIC);
911647cb0e1Sdrh }
912647cb0e1Sdrh 
91347baebc2Sdrh /*
91447baebc2Sdrh ** Implementation of the sqlite_source_id() function. The result is a string
91547baebc2Sdrh ** that identifies the particular version of the source code used to build
91647baebc2Sdrh ** SQLite.
91747baebc2Sdrh */
91847baebc2Sdrh static void sourceidFunc(
91947baebc2Sdrh   sqlite3_context *context,
92047baebc2Sdrh   int NotUsed,
92147baebc2Sdrh   sqlite3_value **NotUsed2
92247baebc2Sdrh ){
92347baebc2Sdrh   UNUSED_PARAMETER2(NotUsed, NotUsed2);
924ab2f1f95Sdrh   /* IMP: R-24470-31136 This function is an SQL wrapper around the
925ab2f1f95Sdrh   ** sqlite3_sourceid() C interface. */
926ab2f1f95Sdrh   sqlite3_result_text(context, sqlite3_sourceid(), -1, SQLITE_STATIC);
92747baebc2Sdrh }
92847baebc2Sdrh 
929bdea6d13Sshaneh /*
9303ca84ef6Sdrh ** Implementation of the sqlite_log() function.  This is a wrapper around
9313ca84ef6Sdrh ** sqlite3_log().  The return value is NULL.  The function exists purely for
9323ca84ef6Sdrh ** its side-effects.
9333ca84ef6Sdrh */
934840561f2Sdrh static void errlogFunc(
9353ca84ef6Sdrh   sqlite3_context *context,
9363ca84ef6Sdrh   int argc,
9373ca84ef6Sdrh   sqlite3_value **argv
9383ca84ef6Sdrh ){
9393ca84ef6Sdrh   UNUSED_PARAMETER(argc);
9403ca84ef6Sdrh   UNUSED_PARAMETER(context);
9413ca84ef6Sdrh   sqlite3_log(sqlite3_value_int(argv[0]), "%s", sqlite3_value_text(argv[1]));
9423ca84ef6Sdrh }
9433ca84ef6Sdrh 
9443ca84ef6Sdrh /*
945dc97a8cdSshaneh ** Implementation of the sqlite_compileoption_used() function.
946dc97a8cdSshaneh ** The result is an integer that identifies if the compiler option
947dc97a8cdSshaneh ** was used to build SQLite.
948bdea6d13Sshaneh */
949dc97a8cdSshaneh #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
950dc97a8cdSshaneh static void compileoptionusedFunc(
951bdea6d13Sshaneh   sqlite3_context *context,
952dc97a8cdSshaneh   int argc,
953dc97a8cdSshaneh   sqlite3_value **argv
954bdea6d13Sshaneh ){
955dc97a8cdSshaneh   const char *zOptName;
956dc97a8cdSshaneh   assert( argc==1 );
957dc97a8cdSshaneh   UNUSED_PARAMETER(argc);
958a3e414cdSdrh   /* IMP: R-39564-36305 The sqlite_compileoption_used() SQL
959a3e414cdSdrh   ** function is a wrapper around the sqlite3_compileoption_used() C/C++
960a3e414cdSdrh   ** function.
961a3e414cdSdrh   */
962264a2d4dSdrh   if( (zOptName = (const char*)sqlite3_value_text(argv[0]))!=0 ){
963dc97a8cdSshaneh     sqlite3_result_int(context, sqlite3_compileoption_used(zOptName));
964bdea6d13Sshaneh   }
965dc97a8cdSshaneh }
966dc97a8cdSshaneh #endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
967dc97a8cdSshaneh 
968dc97a8cdSshaneh /*
969dc97a8cdSshaneh ** Implementation of the sqlite_compileoption_get() function.
970dc97a8cdSshaneh ** The result is a string that identifies the compiler options
971dc97a8cdSshaneh ** used to build SQLite.
972dc97a8cdSshaneh */
973dc97a8cdSshaneh #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
974dc97a8cdSshaneh static void compileoptiongetFunc(
975dc97a8cdSshaneh   sqlite3_context *context,
976dc97a8cdSshaneh   int argc,
977dc97a8cdSshaneh   sqlite3_value **argv
978dc97a8cdSshaneh ){
979dc97a8cdSshaneh   int n;
980dc97a8cdSshaneh   assert( argc==1 );
981dc97a8cdSshaneh   UNUSED_PARAMETER(argc);
982a3e414cdSdrh   /* IMP: R-04922-24076 The sqlite_compileoption_get() SQL function
983a3e414cdSdrh   ** is a wrapper around the sqlite3_compileoption_get() C/C++ function.
984a3e414cdSdrh   */
985dc97a8cdSshaneh   n = sqlite3_value_int(argv[0]);
986dc97a8cdSshaneh   sqlite3_result_text(context, sqlite3_compileoption_get(n), -1, SQLITE_STATIC);
987dc97a8cdSshaneh }
988dc97a8cdSshaneh #endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
989bdea6d13Sshaneh 
990137c728fSdrh /* Array for converting from half-bytes (nybbles) into ASCII hex
991137c728fSdrh ** digits. */
992137c728fSdrh static const char hexdigits[] = {
993137c728fSdrh   '0', '1', '2', '3', '4', '5', '6', '7',
994137c728fSdrh   '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
995137c728fSdrh };
996d641d646Sdanielk1977 
99747394703Sdrh /*
99847394703Sdrh ** Implementation of the QUOTE() function.  This function takes a single
99947394703Sdrh ** argument.  If the argument is numeric, the return value is the same as
100047394703Sdrh ** the argument.  If the argument is NULL, the return value is the string
100147394703Sdrh ** "NULL".  Otherwise, the argument is enclosed in single quotes with
100247394703Sdrh ** single-quote escapes.
100347394703Sdrh */
10040ae8b831Sdanielk1977 static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
1005a0df4ccfSdrh   assert( argc==1 );
10061d34fdecSdrh   UNUSED_PARAMETER(argc);
1007f9b596ebSdrh   switch( sqlite3_value_type(argv[0]) ){
10089c054830Sdrh     case SQLITE_FLOAT: {
100972b3fbc7Sdrh       double r1, r2;
101072b3fbc7Sdrh       char zBuf[50];
10112b434a7eSmistachkin       r1 = sqlite3_value_double(argv[0]);
101272b3fbc7Sdrh       sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.15g", r1);
101372b3fbc7Sdrh       sqlite3AtoF(zBuf, &r2, 20, SQLITE_UTF8);
101472b3fbc7Sdrh       if( r1!=r2 ){
101572b3fbc7Sdrh         sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.20e", r1);
101672b3fbc7Sdrh       }
101772b3fbc7Sdrh       sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
101872b3fbc7Sdrh       break;
101972b3fbc7Sdrh     }
102072b3fbc7Sdrh     case SQLITE_INTEGER: {
1021f4479501Sdrh       sqlite3_result_value(context, argv[0]);
1022f9b596ebSdrh       break;
1023f9b596ebSdrh     }
10243f41e976Sdanielk1977     case SQLITE_BLOB: {
10253f41e976Sdanielk1977       char *zText = 0;
10263f41e976Sdanielk1977       char const *zBlob = sqlite3_value_blob(argv[0]);
10271f0feef8Sdrh       int nBlob = sqlite3_value_bytes(argv[0]);
10281f0feef8Sdrh       assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
1029b1a6c3c1Sdrh       zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
1030a1644fd8Sdanielk1977       if( zText ){
10313f41e976Sdanielk1977         int i;
10323f41e976Sdanielk1977         for(i=0; i<nBlob; i++){
10333f41e976Sdanielk1977           zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
10343f41e976Sdanielk1977           zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
10353f41e976Sdanielk1977         }
10363f41e976Sdanielk1977         zText[(nBlob*2)+2] = '\'';
10373f41e976Sdanielk1977         zText[(nBlob*2)+3] = '\0';
10383f41e976Sdanielk1977         zText[0] = 'X';
10393f41e976Sdanielk1977         zText[1] = '\'';
1040d8123366Sdanielk1977         sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
104117435752Sdrh         sqlite3_free(zText);
10423f41e976Sdanielk1977       }
10433f41e976Sdanielk1977       break;
10443f41e976Sdanielk1977     }
10459c054830Sdrh     case SQLITE_TEXT: {
1046023ae03aSdrh       int i,j;
1047023ae03aSdrh       u64 n;
10482646da7eSdrh       const unsigned char *zArg = sqlite3_value_text(argv[0]);
104947394703Sdrh       char *z;
1050f9b596ebSdrh 
10517a521cfbSdrh       if( zArg==0 ) return;
1052023ae03aSdrh       for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
1053b1a6c3c1Sdrh       z = contextMalloc(context, ((i64)i)+((i64)n)+3);
1054a1644fd8Sdanielk1977       if( z ){
105547394703Sdrh         z[0] = '\'';
105651ad0ecdSdanielk1977         for(i=0, j=1; zArg[i]; i++){
105751ad0ecdSdanielk1977           z[j++] = zArg[i];
105851ad0ecdSdanielk1977           if( zArg[i]=='\'' ){
105947394703Sdrh             z[j++] = '\'';
106047394703Sdrh           }
106147394703Sdrh         }
106247394703Sdrh         z[j++] = '\'';
106347394703Sdrh         z[j] = 0;
1064a1644fd8Sdanielk1977         sqlite3_result_text(context, z, j, sqlite3_free);
1065a1644fd8Sdanielk1977       }
1066a0df4ccfSdrh       break;
1067a0df4ccfSdrh     }
1068a0df4ccfSdrh     default: {
1069a0df4ccfSdrh       assert( sqlite3_value_type(argv[0])==SQLITE_NULL );
1070a0df4ccfSdrh       sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
1071a0df4ccfSdrh       break;
107247394703Sdrh     }
107347394703Sdrh   }
1074f9b596ebSdrh }
107547394703Sdrh 
1076137c728fSdrh /*
1077d495d8c9Sdrh ** The unicode() function.  Return the integer unicode code-point value
1078d495d8c9Sdrh ** for the first character of the input string.
1079d495d8c9Sdrh */
1080d495d8c9Sdrh static void unicodeFunc(
1081d495d8c9Sdrh   sqlite3_context *context,
1082d495d8c9Sdrh   int argc,
1083d495d8c9Sdrh   sqlite3_value **argv
1084d495d8c9Sdrh ){
1085d495d8c9Sdrh   const unsigned char *z = sqlite3_value_text(argv[0]);
10861d59d036Sdrh   (void)argc;
1087d495d8c9Sdrh   if( z && z[0] ) sqlite3_result_int(context, sqlite3Utf8Read(&z));
1088d495d8c9Sdrh }
1089d495d8c9Sdrh 
1090d495d8c9Sdrh /*
1091d495d8c9Sdrh ** The char() function takes zero or more arguments, each of which is
1092d495d8c9Sdrh ** an integer.  It constructs a string where each character of the string
1093d495d8c9Sdrh ** is the unicode character for the corresponding integer argument.
1094d495d8c9Sdrh */
1095d495d8c9Sdrh static void charFunc(
1096d495d8c9Sdrh   sqlite3_context *context,
1097d495d8c9Sdrh   int argc,
1098d495d8c9Sdrh   sqlite3_value **argv
1099d495d8c9Sdrh ){
1100d495d8c9Sdrh   unsigned char *z, *zOut;
1101d495d8c9Sdrh   int i;
1102f3cdcdccSdrh   zOut = z = sqlite3_malloc64( argc*4+1 );
1103d495d8c9Sdrh   if( z==0 ){
1104d495d8c9Sdrh     sqlite3_result_error_nomem(context);
1105d495d8c9Sdrh     return;
1106d495d8c9Sdrh   }
1107d495d8c9Sdrh   for(i=0; i<argc; i++){
1108c9545442Smistachkin     sqlite3_int64 x;
1109d495d8c9Sdrh     unsigned c;
1110d495d8c9Sdrh     x = sqlite3_value_int64(argv[i]);
1111d495d8c9Sdrh     if( x<0 || x>0x10ffff ) x = 0xfffd;
1112d495d8c9Sdrh     c = (unsigned)(x & 0x1fffff);
1113fe7a5d11Sdrh     if( c<0x00080 ){
1114fe7a5d11Sdrh       *zOut++ = (u8)(c&0xFF);
1115fe7a5d11Sdrh     }else if( c<0x00800 ){
1116fe7a5d11Sdrh       *zOut++ = 0xC0 + (u8)((c>>6)&0x1F);
1117fe7a5d11Sdrh       *zOut++ = 0x80 + (u8)(c & 0x3F);
1118fe7a5d11Sdrh     }else if( c<0x10000 ){
1119fe7a5d11Sdrh       *zOut++ = 0xE0 + (u8)((c>>12)&0x0F);
1120fe7a5d11Sdrh       *zOut++ = 0x80 + (u8)((c>>6) & 0x3F);
1121fe7a5d11Sdrh       *zOut++ = 0x80 + (u8)(c & 0x3F);
1122d495d8c9Sdrh     }else{
1123fe7a5d11Sdrh       *zOut++ = 0xF0 + (u8)((c>>18) & 0x07);
1124fe7a5d11Sdrh       *zOut++ = 0x80 + (u8)((c>>12) & 0x3F);
1125fe7a5d11Sdrh       *zOut++ = 0x80 + (u8)((c>>6) & 0x3F);
1126fe7a5d11Sdrh       *zOut++ = 0x80 + (u8)(c & 0x3F);
1127fe7a5d11Sdrh     }                                                    \
1128d495d8c9Sdrh   }
1129bbf483f8Sdrh   sqlite3_result_text64(context, (char*)z, zOut-z, sqlite3_free, SQLITE_UTF8);
1130d495d8c9Sdrh }
1131d495d8c9Sdrh 
1132d495d8c9Sdrh /*
1133137c728fSdrh ** The hex() function.  Interpret the argument as a blob.  Return
1134137c728fSdrh ** a hexadecimal rendering as text.
1135137c728fSdrh */
1136137c728fSdrh static void hexFunc(
1137137c728fSdrh   sqlite3_context *context,
1138137c728fSdrh   int argc,
1139137c728fSdrh   sqlite3_value **argv
1140137c728fSdrh ){
1141137c728fSdrh   int i, n;
1142137c728fSdrh   const unsigned char *pBlob;
1143137c728fSdrh   char *zHex, *z;
1144137c728fSdrh   assert( argc==1 );
1145f3d3c27aSdanielk1977   UNUSED_PARAMETER(argc);
11461f0feef8Sdrh   pBlob = sqlite3_value_blob(argv[0]);
1147137c728fSdrh   n = sqlite3_value_bytes(argv[0]);
11481f0feef8Sdrh   assert( pBlob==sqlite3_value_blob(argv[0]) );  /* No encoding change */
1149b1a6c3c1Sdrh   z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
1150a1644fd8Sdanielk1977   if( zHex ){
1151137c728fSdrh     for(i=0; i<n; i++, pBlob++){
1152137c728fSdrh       unsigned char c = *pBlob;
1153137c728fSdrh       *(z++) = hexdigits[(c>>4)&0xf];
1154137c728fSdrh       *(z++) = hexdigits[c&0xf];
1155137c728fSdrh     }
1156137c728fSdrh     *z = 0;
1157137c728fSdrh     sqlite3_result_text(context, zHex, n*2, sqlite3_free);
1158137c728fSdrh   }
1159a1644fd8Sdanielk1977 }
1160137c728fSdrh 
116126b6d90dSdrh /*
11628cff382eSdrh ** The zeroblob(N) function returns a zero-filled blob of size N bytes.
11638cff382eSdrh */
11648cff382eSdrh static void zeroblobFunc(
11658cff382eSdrh   sqlite3_context *context,
11668cff382eSdrh   int argc,
11678cff382eSdrh   sqlite3_value **argv
11688cff382eSdrh ){
116998640a3fSdrh   i64 n;
1170a4d5ae8fSdan   int rc;
11718cff382eSdrh   assert( argc==1 );
1172f3d3c27aSdanielk1977   UNUSED_PARAMETER(argc);
117398640a3fSdrh   n = sqlite3_value_int64(argv[0]);
117453e66c3cSdrh   if( n<0 ) n = 0;
1175a4d5ae8fSdan   rc = sqlite3_result_zeroblob64(context, n); /* IMP: R-00293-64994 */
1176a4d5ae8fSdan   if( rc ){
1177a4d5ae8fSdan     sqlite3_result_error_code(context, rc);
11788cff382eSdrh   }
117998640a3fSdrh }
11808cff382eSdrh 
11818cff382eSdrh /*
118226b6d90dSdrh ** The replace() function.  Three arguments are all strings: call
118326b6d90dSdrh ** them A, B, and C. The result is also a string which is derived
1184f7b5496eSdrh ** from A by replacing every occurrence of B with C.  The match
118526b6d90dSdrh ** must be exact.  Collating sequences are not used.
118626b6d90dSdrh */
118726b6d90dSdrh static void replaceFunc(
118826b6d90dSdrh   sqlite3_context *context,
118926b6d90dSdrh   int argc,
119026b6d90dSdrh   sqlite3_value **argv
119126b6d90dSdrh ){
119226b6d90dSdrh   const unsigned char *zStr;        /* The input string A */
119326b6d90dSdrh   const unsigned char *zPattern;    /* The pattern string B */
119426b6d90dSdrh   const unsigned char *zRep;        /* The replacement string C */
119526b6d90dSdrh   unsigned char *zOut;              /* The output */
119626b6d90dSdrh   int nStr;                /* Size of zStr */
119726b6d90dSdrh   int nPattern;            /* Size of zPattern */
119826b6d90dSdrh   int nRep;                /* Size of zRep */
11992e6400baSdrh   i64 nOut;                /* Maximum size of zOut */
120026b6d90dSdrh   int loopLimit;           /* Last zStr[] that might match zPattern[] */
120126b6d90dSdrh   int i, j;                /* Loop counters */
1202f3139520Sdrh   unsigned cntExpand;      /* Number zOut expansions */
1203f3139520Sdrh   sqlite3 *db = sqlite3_context_db_handle(context);
120426b6d90dSdrh 
120526b6d90dSdrh   assert( argc==3 );
1206f3d3c27aSdanielk1977   UNUSED_PARAMETER(argc);
120726b6d90dSdrh   zStr = sqlite3_value_text(argv[0]);
12087a521cfbSdrh   if( zStr==0 ) return;
12091f0feef8Sdrh   nStr = sqlite3_value_bytes(argv[0]);
12101f0feef8Sdrh   assert( zStr==sqlite3_value_text(argv[0]) );  /* No encoding change */
121126b6d90dSdrh   zPattern = sqlite3_value_text(argv[1]);
1212a605fe8dSdrh   if( zPattern==0 ){
12132333606eSdrh     assert( sqlite3_value_type(argv[1])==SQLITE_NULL
12142333606eSdrh             || sqlite3_context_db_handle(context)->mallocFailed );
1215a605fe8dSdrh     return;
1216a605fe8dSdrh   }
1217a605fe8dSdrh   if( zPattern[0]==0 ){
1218a605fe8dSdrh     assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
1219a605fe8dSdrh     sqlite3_result_value(context, argv[0]);
1220a605fe8dSdrh     return;
1221a605fe8dSdrh   }
12221f0feef8Sdrh   nPattern = sqlite3_value_bytes(argv[1]);
12231f0feef8Sdrh   assert( zPattern==sqlite3_value_text(argv[1]) );  /* No encoding change */
122426b6d90dSdrh   zRep = sqlite3_value_text(argv[2]);
12257a521cfbSdrh   if( zRep==0 ) return;
12261f0feef8Sdrh   nRep = sqlite3_value_bytes(argv[2]);
12271f0feef8Sdrh   assert( zRep==sqlite3_value_text(argv[2]) );
12282e6400baSdrh   nOut = nStr + 1;
12292e6400baSdrh   assert( nOut<SQLITE_MAX_LENGTH );
1230b1a6c3c1Sdrh   zOut = contextMalloc(context, (i64)nOut);
12312e6400baSdrh   if( zOut==0 ){
12322e6400baSdrh     return;
123326b6d90dSdrh   }
123426b6d90dSdrh   loopLimit = nStr - nPattern;
1235f3139520Sdrh   cntExpand = 0;
123626b6d90dSdrh   for(i=j=0; i<=loopLimit; i++){
123726b6d90dSdrh     if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
123826b6d90dSdrh       zOut[j++] = zStr[i];
123926b6d90dSdrh     }else{
1240f3139520Sdrh       if( nRep>nPattern ){
12412e6400baSdrh         nOut += nRep - nPattern;
1242c86d82f2Sdrh         testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
1243c86d82f2Sdrh         testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
124427e62dbeSdrh         if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
1245a0206bc8Sdrh           sqlite3_result_error_toobig(context);
1246b975598eSdrh           sqlite3_free(zOut);
124717374e8fSdanielk1977           return;
124817374e8fSdanielk1977         }
1249f3139520Sdrh         cntExpand++;
1250f3139520Sdrh         if( (cntExpand&(cntExpand-1))==0 ){
1251f3139520Sdrh           /* Grow the size of the output buffer only on substitutions
1252f3139520Sdrh           ** whose index is a power of two: 1, 2, 4, 8, 16, 32, ... */
1253f3139520Sdrh           u8 *zOld;
12544a50aac5Sdrh           zOld = zOut;
1255f3139520Sdrh           zOut = sqlite3_realloc64(zOut, (int)nOut + (nOut - nStr - 1));
12562e6400baSdrh           if( zOut==0 ){
1257a1644fd8Sdanielk1977             sqlite3_result_error_nomem(context);
1258b975598eSdrh             sqlite3_free(zOld);
12592e6400baSdrh             return;
12602e6400baSdrh           }
1261f3139520Sdrh         }
1262f3139520Sdrh       }
126326b6d90dSdrh       memcpy(&zOut[j], zRep, nRep);
126426b6d90dSdrh       j += nRep;
126526b6d90dSdrh       i += nPattern-1;
126626b6d90dSdrh     }
126726b6d90dSdrh   }
1268f3139520Sdrh   assert( j+nStr-i+1<=nOut );
126926b6d90dSdrh   memcpy(&zOut[j], &zStr[i], nStr-i);
127026b6d90dSdrh   j += nStr - i;
127126b6d90dSdrh   assert( j<=nOut );
127226b6d90dSdrh   zOut[j] = 0;
127326b6d90dSdrh   sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
127426b6d90dSdrh }
127526b6d90dSdrh 
1276309b3386Sdrh /*
1277309b3386Sdrh ** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
1278309b3386Sdrh ** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
1279309b3386Sdrh */
1280309b3386Sdrh static void trimFunc(
1281309b3386Sdrh   sqlite3_context *context,
1282309b3386Sdrh   int argc,
1283309b3386Sdrh   sqlite3_value **argv
1284309b3386Sdrh ){
1285309b3386Sdrh   const unsigned char *zIn;         /* Input string */
1286309b3386Sdrh   const unsigned char *zCharSet;    /* Set of characters to trim */
1287309b3386Sdrh   int nIn;                          /* Number of bytes in input */
12887209c697Sdrh   int flags;                        /* 1: trimleft  2: trimright  3: trim */
1289d1e3a616Sdrh   int i;                            /* Loop counter */
12901bd10f8aSdrh   unsigned char *aLen = 0;          /* Length of each character in zCharSet */
12911bd10f8aSdrh   unsigned char **azChar = 0;       /* Individual characters in zCharSet */
1292d1e3a616Sdrh   int nChar;                        /* Number of characters in zCharSet */
1293d1e3a616Sdrh 
1294309b3386Sdrh   if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
1295309b3386Sdrh     return;
1296309b3386Sdrh   }
1297309b3386Sdrh   zIn = sqlite3_value_text(argv[0]);
12987a521cfbSdrh   if( zIn==0 ) return;
12991f0feef8Sdrh   nIn = sqlite3_value_bytes(argv[0]);
13001f0feef8Sdrh   assert( zIn==sqlite3_value_text(argv[0]) );
1301309b3386Sdrh   if( argc==1 ){
1302d1e3a616Sdrh     static const unsigned char lenOne[] = { 1 };
1303a4de4532Sdanielk1977     static unsigned char * const azOne[] = { (u8*)" " };
1304d1e3a616Sdrh     nChar = 1;
13058cff382eSdrh     aLen = (u8*)lenOne;
1306bc67da48Sdanielk1977     azChar = (unsigned char **)azOne;
1307d1e3a616Sdrh     zCharSet = 0;
13087a521cfbSdrh   }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
1309309b3386Sdrh     return;
1310d1e3a616Sdrh   }else{
1311d1e3a616Sdrh     const unsigned char *z;
1312d1e3a616Sdrh     for(z=zCharSet, nChar=0; *z; nChar++){
13134a919118Sdrh       SQLITE_SKIP_UTF8(z);
1314309b3386Sdrh     }
1315d1e3a616Sdrh     if( nChar>0 ){
1316b1a6c3c1Sdrh       azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
1317d1e3a616Sdrh       if( azChar==0 ){
1318d1e3a616Sdrh         return;
1319d1e3a616Sdrh       }
1320d1e3a616Sdrh       aLen = (unsigned char*)&azChar[nChar];
1321d1e3a616Sdrh       for(z=zCharSet, nChar=0; *z; nChar++){
1322bc67da48Sdanielk1977         azChar[nChar] = (unsigned char *)z;
13234a919118Sdrh         SQLITE_SKIP_UTF8(z);
13243abbd39aSdrh         aLen[nChar] = (u8)(z - azChar[nChar]);
1325d1e3a616Sdrh       }
1326d1e3a616Sdrh     }
1327d1e3a616Sdrh   }
1328d1e3a616Sdrh   if( nChar>0 ){
13291fc4129dSshane     flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
1330309b3386Sdrh     if( flags & 1 ){
1331d1e3a616Sdrh       while( nIn>0 ){
13321bd10f8aSdrh         int len = 0;
1333d1e3a616Sdrh         for(i=0; i<nChar; i++){
1334d1e3a616Sdrh           len = aLen[i];
133527e62dbeSdrh           if( len<=nIn && memcmp(zIn, azChar[i], len)==0 ) break;
1336d1e3a616Sdrh         }
1337d1e3a616Sdrh         if( i>=nChar ) break;
1338d1e3a616Sdrh         zIn += len;
1339d1e3a616Sdrh         nIn -= len;
1340309b3386Sdrh       }
1341309b3386Sdrh     }
1342309b3386Sdrh     if( flags & 2 ){
1343d1e3a616Sdrh       while( nIn>0 ){
13441bd10f8aSdrh         int len = 0;
1345d1e3a616Sdrh         for(i=0; i<nChar; i++){
1346d1e3a616Sdrh           len = aLen[i];
1347d1e3a616Sdrh           if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
1348309b3386Sdrh         }
1349d1e3a616Sdrh         if( i>=nChar ) break;
1350d1e3a616Sdrh         nIn -= len;
1351d1e3a616Sdrh       }
1352d1e3a616Sdrh     }
1353d1e3a616Sdrh     if( zCharSet ){
1354d1e3a616Sdrh       sqlite3_free(azChar);
1355309b3386Sdrh     }
1356309b3386Sdrh   }
1357309b3386Sdrh   sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
1358309b3386Sdrh }
135926b6d90dSdrh 
1360a4de4532Sdanielk1977 
1361cc15313cSdrh #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
1362cc15313cSdrh /*
1363cc15313cSdrh ** The "unknown" function is automatically substituted in place of
1364cc15313cSdrh ** any unrecognized function name when doing an EXPLAIN or EXPLAIN QUERY PLAN
1365cc15313cSdrh ** when the SQLITE_ENABLE_UNKNOWN_FUNCTION compile-time option is used.
1366cc15313cSdrh ** When the "sqlite3" command-line shell is built using this functionality,
1367cc15313cSdrh ** that allows an EXPLAIN or EXPLAIN QUERY PLAN for complex queries
1368cc15313cSdrh ** involving application-defined functions to be examined in a generic
1369cc15313cSdrh ** sqlite3 shell.
1370cc15313cSdrh */
1371cc15313cSdrh static void unknownFunc(
1372cc15313cSdrh   sqlite3_context *context,
1373cc15313cSdrh   int argc,
1374cc15313cSdrh   sqlite3_value **argv
1375cc15313cSdrh ){
1376cc15313cSdrh   /* no-op */
1377cc15313cSdrh }
1378cc15313cSdrh #endif /*SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION*/
1379cc15313cSdrh 
1380cc15313cSdrh 
13812ba3cccfSdrh /* IMP: R-25361-16150 This function is omitted from SQLite by default. It
13822ba3cccfSdrh ** is only available if the SQLITE_SOUNDEX compile-time option is used
13832ba3cccfSdrh ** when SQLite is built.
13842ba3cccfSdrh */
1385d24cc427Sdrh #ifdef SQLITE_SOUNDEX
1386d24cc427Sdrh /*
1387d24cc427Sdrh ** Compute the soundex encoding of a word.
13882ba3cccfSdrh **
13892ba3cccfSdrh ** IMP: R-59782-00072 The soundex(X) function returns a string that is the
13902ba3cccfSdrh ** soundex encoding of the string X.
1391d24cc427Sdrh */
1392137c728fSdrh static void soundexFunc(
1393137c728fSdrh   sqlite3_context *context,
1394137c728fSdrh   int argc,
1395137c728fSdrh   sqlite3_value **argv
1396137c728fSdrh ){
1397d24cc427Sdrh   char zResult[8];
13984c755c0fSdrh   const u8 *zIn;
1399d24cc427Sdrh   int i, j;
1400d24cc427Sdrh   static const unsigned char iCode[] = {
1401d24cc427Sdrh     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1402d24cc427Sdrh     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1403d24cc427Sdrh     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1404d24cc427Sdrh     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1405d24cc427Sdrh     0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1406d24cc427Sdrh     1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1407d24cc427Sdrh     0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1408d24cc427Sdrh     1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1409d24cc427Sdrh   };
1410d24cc427Sdrh   assert( argc==1 );
14114c755c0fSdrh   zIn = (u8*)sqlite3_value_text(argv[0]);
1412bdf67e0eSdrh   if( zIn==0 ) zIn = (u8*)"";
1413dc86e2b2Sdrh   for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
1414d24cc427Sdrh   if( zIn[i] ){
1415bdf67e0eSdrh     u8 prevcode = iCode[zIn[i]&0x7f];
141678ca0e7eSdanielk1977     zResult[0] = sqlite3Toupper(zIn[i]);
1417d24cc427Sdrh     for(j=1; j<4 && zIn[i]; i++){
1418d24cc427Sdrh       int code = iCode[zIn[i]&0x7f];
1419d24cc427Sdrh       if( code>0 ){
1420bdf67e0eSdrh         if( code!=prevcode ){
1421bdf67e0eSdrh           prevcode = code;
1422d24cc427Sdrh           zResult[j++] = code + '0';
1423d24cc427Sdrh         }
1424bdf67e0eSdrh       }else{
1425bdf67e0eSdrh         prevcode = 0;
1426bdf67e0eSdrh       }
1427d24cc427Sdrh     }
1428d24cc427Sdrh     while( j<4 ){
1429d24cc427Sdrh       zResult[j++] = '0';
1430d24cc427Sdrh     }
1431d24cc427Sdrh     zResult[j] = 0;
1432d8123366Sdanielk1977     sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
1433d24cc427Sdrh   }else{
14342ba3cccfSdrh     /* IMP: R-64894-50321 The string "?000" is returned if the argument
14352ba3cccfSdrh     ** is NULL or contains no ASCII alphabetic characters. */
1436d8123366Sdanielk1977     sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
1437d24cc427Sdrh   }
1438d24cc427Sdrh }
14392ba3cccfSdrh #endif /* SQLITE_SOUNDEX */
1440d24cc427Sdrh 
1441fdb83b2fSdrh #ifndef SQLITE_OMIT_LOAD_EXTENSION
1442fdb83b2fSdrh /*
1443fdb83b2fSdrh ** A function that loads a shared-library extension then returns NULL.
1444fdb83b2fSdrh */
1445fdb83b2fSdrh static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
144665fd59f7Sdanielk1977   const char *zFile = (const char *)sqlite3_value_text(argv[0]);
14477a521cfbSdrh   const char *zProc;
1448fa4a4b91Sdrh   sqlite3 *db = sqlite3_context_db_handle(context);
1449fdb83b2fSdrh   char *zErrMsg = 0;
1450fdb83b2fSdrh 
1451191dd061Sdrh   /* Disallow the load_extension() SQL function unless the SQLITE_LoadExtFunc
14521a55dedfSdrh   ** flag is set.  See the sqlite3_enable_load_extension() API.
14531a55dedfSdrh   */
1454f602a161Sdrh   if( (db->flags & SQLITE_LoadExtFunc)==0 ){
1455f602a161Sdrh     sqlite3_result_error(context, "not authorized", -1);
1456f602a161Sdrh     return;
1457f602a161Sdrh   }
14581a55dedfSdrh 
1459fdb83b2fSdrh   if( argc==2 ){
146065fd59f7Sdanielk1977     zProc = (const char *)sqlite3_value_text(argv[1]);
14617a521cfbSdrh   }else{
14627a521cfbSdrh     zProc = 0;
1463fdb83b2fSdrh   }
14647a521cfbSdrh   if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
1465fdb83b2fSdrh     sqlite3_result_error(context, zErrMsg, -1);
1466fdb83b2fSdrh     sqlite3_free(zErrMsg);
1467fdb83b2fSdrh   }
1468fdb83b2fSdrh }
1469fdb83b2fSdrh #endif
1470fdb83b2fSdrh 
147101427a62Sdanielk1977 
14720ac65892Sdrh /*
1473d3a149efSdrh ** An instance of the following structure holds the context of a
1474dd5baa95Sdrh ** sum() or avg() aggregate computation.
1475dd5baa95Sdrh */
1476dd5baa95Sdrh typedef struct SumCtx SumCtx;
1477dd5baa95Sdrh struct SumCtx {
14788c08e861Sdrh   double rSum;      /* Floating point sum */
14798c08e861Sdrh   i64 iSum;         /* Integer sum */
1480cf85a51cSdrh   i64 cnt;          /* Number of elements summed */
14818c08e861Sdrh   u8 overflow;      /* True if integer overflow seen */
14828c08e861Sdrh   u8 approx;        /* True if non-integer value was input to the sum */
1483dd5baa95Sdrh };
1484dd5baa95Sdrh 
1485dd5baa95Sdrh /*
1486a97fdd3bSdrh ** Routines used to compute the sum, average, and total.
1487a97fdd3bSdrh **
1488a97fdd3bSdrh ** The SUM() function follows the (broken) SQL standard which means
1489a97fdd3bSdrh ** that it returns NULL if it sums over no inputs.  TOTAL returns
1490a97fdd3bSdrh ** 0.0 in that case.  In addition, TOTAL always returns a float where
1491a97fdd3bSdrh ** SUM might return an integer if it never encounters a floating point
1492c806d857Sdrh ** value.  TOTAL never fails, but SUM might through an exception if
1493c806d857Sdrh ** it overflows an integer.
1494dd5baa95Sdrh */
14950ae8b831Sdanielk1977 static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
1496dd5baa95Sdrh   SumCtx *p;
14973d1d95e6Sdrh   int type;
14983f219f46Sdrh   assert( argc==1 );
1499f3d3c27aSdanielk1977   UNUSED_PARAMETER(argc);
15004f26d6c4Sdrh   p = sqlite3_aggregate_context(context, sizeof(*p));
150129d72108Sdrh   type = sqlite3_value_numeric_type(argv[0]);
15023d1d95e6Sdrh   if( p && type!=SQLITE_NULL ){
1503739105c7Sdrh     p->cnt++;
150429d72108Sdrh     if( type==SQLITE_INTEGER ){
15058c08e861Sdrh       i64 v = sqlite3_value_int64(argv[0]);
15068c08e861Sdrh       p->rSum += v;
1507158b9cb9Sdrh       if( (p->approx|p->overflow)==0 && sqlite3AddInt64(&p->iSum, v) ){
1508158b9cb9Sdrh         p->overflow = 1;
150929d72108Sdrh       }
151029d72108Sdrh     }else{
15118c08e861Sdrh       p->rSum += sqlite3_value_double(argv[0]);
151229d72108Sdrh       p->approx = 1;
15133f219f46Sdrh     }
1514739105c7Sdrh   }
1515dd5baa95Sdrh }
1516*c3a20c19Sdan static void sumInverse(sqlite3_context *context, int argc, sqlite3_value**argv){
1517*c3a20c19Sdan   SumCtx *p;
1518*c3a20c19Sdan   int type;
1519*c3a20c19Sdan   assert( argc==1 );
1520*c3a20c19Sdan   UNUSED_PARAMETER(argc);
1521*c3a20c19Sdan   p = sqlite3_aggregate_context(context, sizeof(*p));
1522*c3a20c19Sdan   type = sqlite3_value_numeric_type(argv[0]);
1523*c3a20c19Sdan   if( p && type!=SQLITE_NULL ){
1524*c3a20c19Sdan     p->cnt--;
1525*c3a20c19Sdan     if( type==SQLITE_INTEGER ){
1526*c3a20c19Sdan       i64 v = sqlite3_value_int64(argv[0]);
1527*c3a20c19Sdan       p->rSum -= v;
1528*c3a20c19Sdan       if( (p->approx|p->overflow)==0 && sqlite3AddInt64(&p->iSum, -1*v) ){
1529*c3a20c19Sdan         p->overflow = 1;
1530*c3a20c19Sdan       }
1531*c3a20c19Sdan     }else{
1532*c3a20c19Sdan       p->rSum += sqlite3_value_double(argv[0]);
1533*c3a20c19Sdan       p->approx = 1;
1534*c3a20c19Sdan     }
1535*c3a20c19Sdan   }
1536*c3a20c19Sdan }
15370ae8b831Sdanielk1977 static void sumFinalize(sqlite3_context *context){
1538dd5baa95Sdrh   SumCtx *p;
1539abfcea25Sdrh   p = sqlite3_aggregate_context(context, 0);
1540c2bd913aSdrh   if( p && p->cnt>0 ){
15418c08e861Sdrh     if( p->overflow ){
15428c08e861Sdrh       sqlite3_result_error(context,"integer overflow",-1);
15438c08e861Sdrh     }else if( p->approx ){
15448c08e861Sdrh       sqlite3_result_double(context, p->rSum);
1545c2bd913aSdrh     }else{
15468c08e861Sdrh       sqlite3_result_int64(context, p->iSum);
15473d1d95e6Sdrh     }
1548dd5baa95Sdrh   }
1549c2bd913aSdrh }
15500ae8b831Sdanielk1977 static void avgFinalize(sqlite3_context *context){
1551dd5baa95Sdrh   SumCtx *p;
1552abfcea25Sdrh   p = sqlite3_aggregate_context(context, 0);
1553739105c7Sdrh   if( p && p->cnt>0 ){
15548c08e861Sdrh     sqlite3_result_double(context, p->rSum/(double)p->cnt);
1555dd5baa95Sdrh   }
1556dd5baa95Sdrh }
1557a97fdd3bSdrh static void totalFinalize(sqlite3_context *context){
1558a97fdd3bSdrh   SumCtx *p;
1559a97fdd3bSdrh   p = sqlite3_aggregate_context(context, 0);
1560fbd60f82Sshane   /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
1561fbd60f82Sshane   sqlite3_result_double(context, p ? p->rSum : (double)0);
1562a97fdd3bSdrh }
1563dd5baa95Sdrh 
1564dd5baa95Sdrh /*
15650bce8354Sdrh ** The following structure keeps track of state information for the
15660bce8354Sdrh ** count() aggregate function.
15670bce8354Sdrh */
15680bce8354Sdrh typedef struct CountCtx CountCtx;
15690bce8354Sdrh struct CountCtx {
1570fc6ad39cSdrh   i64 n;
15710bce8354Sdrh };
1572dd5baa95Sdrh 
15730bce8354Sdrh /*
15740bce8354Sdrh ** Routines to implement the count() aggregate function.
15750bce8354Sdrh */
15760ae8b831Sdanielk1977 static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
15770bce8354Sdrh   CountCtx *p;
15784f26d6c4Sdrh   p = sqlite3_aggregate_context(context, sizeof(*p));
15799c054830Sdrh   if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
15800bce8354Sdrh     p->n++;
15810bce8354Sdrh   }
15822e79c3d5Sdrh 
1583d3264c7cSdrh #ifndef SQLITE_OMIT_DEPRECATED
15842e79c3d5Sdrh   /* The sqlite3_aggregate_count() function is deprecated.  But just to make
15852e79c3d5Sdrh   ** sure it still operates correctly, verify that its count agrees with our
15862e79c3d5Sdrh   ** internal count when using count(*) and when the total count can be
15872e79c3d5Sdrh   ** expressed as a 32-bit integer. */
15882e79c3d5Sdrh   assert( argc==1 || p==0 || p->n>0x7fffffff
15892e79c3d5Sdrh           || p->n==sqlite3_aggregate_count(context) );
1590d3264c7cSdrh #endif
15910bce8354Sdrh }
15920ae8b831Sdanielk1977 static void countFinalize(sqlite3_context *context){
15930bce8354Sdrh   CountCtx *p;
1594abfcea25Sdrh   p = sqlite3_aggregate_context(context, 0);
1595fc6ad39cSdrh   sqlite3_result_int64(context, p ? p->n : 0);
15960bce8354Sdrh }
15970bce8354Sdrh 
15980bce8354Sdrh /*
15990bce8354Sdrh ** Routines to implement min() and max() aggregate functions.
16000bce8354Sdrh */
160162c14b34Sdanielk1977 static void minmaxStep(
160262c14b34Sdanielk1977   sqlite3_context *context,
160362c14b34Sdanielk1977   int NotUsed,
160462c14b34Sdanielk1977   sqlite3_value **argv
160562c14b34Sdanielk1977 ){
160688208050Sdanielk1977   Mem *pArg  = (Mem *)argv[0];
16079eb516c0Sdrh   Mem *pBest;
160862c14b34Sdanielk1977   UNUSED_PARAMETER(NotUsed);
16099eb516c0Sdrh 
16109eb516c0Sdrh   pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
16113aeab9e4Sdanielk1977   if( !pBest ) return;
1612268380caSdrh 
161394a6d998Sdrh   if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
161494a6d998Sdrh     if( pBest->flags ) sqlite3SkipAccumulatorLoad(context);
161594a6d998Sdrh   }else if( pBest->flags ){
16169eb516c0Sdrh     int max;
16179eb516c0Sdrh     int cmp;
1618dc1bdc4fSdanielk1977     CollSeq *pColl = sqlite3GetFuncCollSeq(context);
16197e18c259Sdanielk1977     /* This step function is used for both the min() and max() aggregates,
16207e18c259Sdanielk1977     ** the only difference between the two being that the sense of the
16217e18c259Sdanielk1977     ** comparison is inverted. For the max() aggregate, the
16227e18c259Sdanielk1977     ** sqlite3_user_data() function returns (void *)-1. For min() it
16237e18c259Sdanielk1977     ** returns (void *)db, where db is the sqlite3* database pointer.
16247e18c259Sdanielk1977     ** Therefore the next statement sets variable 'max' to 1 for the max()
16257e18c259Sdanielk1977     ** aggregate, or 0 for min().
16267e18c259Sdanielk1977     */
1627309b3386Sdrh     max = sqlite3_user_data(context)!=0;
1628dc1bdc4fSdanielk1977     cmp = sqlite3MemCompare(pBest, pArg, pColl);
162988208050Sdanielk1977     if( (max && cmp<0) || (!max && cmp>0) ){
1630b21c8cd4Sdrh       sqlite3VdbeMemCopy(pBest, pArg);
16317a95789cSdrh     }else{
16327a95789cSdrh       sqlite3SkipAccumulatorLoad(context);
163388208050Sdanielk1977     }
16340bce8354Sdrh   }else{
1635035e563bSdrh     pBest->db = sqlite3_context_db_handle(context);
1636b21c8cd4Sdrh     sqlite3VdbeMemCopy(pBest, pArg);
16370bce8354Sdrh   }
16380bce8354Sdrh }
16390ae8b831Sdanielk1977 static void minMaxFinalize(sqlite3_context *context){
164088208050Sdanielk1977   sqlite3_value *pRes;
1641abfcea25Sdrh   pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1642abfcea25Sdrh   if( pRes ){
164394a6d998Sdrh     if( pRes->flags ){
1644f4479501Sdrh       sqlite3_result_value(context, pRes);
16450bce8354Sdrh     }
1646b20e56b4Sdanielk1977     sqlite3VdbeMemRelease(pRes);
16470bce8354Sdrh   }
1648abfcea25Sdrh }
1649dd5baa95Sdrh 
1650b0689696Sdrh /*
1651b0689696Sdrh ** group_concat(EXPR, ?SEPARATOR?)
1652b0689696Sdrh */
1653b0689696Sdrh static void groupConcatStep(
1654b0689696Sdrh   sqlite3_context *context,
1655b0689696Sdrh   int argc,
1656b0689696Sdrh   sqlite3_value **argv
1657b0689696Sdrh ){
1658b0689696Sdrh   const char *zVal;
1659ade86483Sdrh   StrAccum *pAccum;
1660b0689696Sdrh   const char *zSep;
166107d3117aSdrh   int nVal, nSep;
166207d3117aSdrh   assert( argc==1 || argc==2 );
166307d3117aSdrh   if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1664ade86483Sdrh   pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1665ade86483Sdrh 
1666ade86483Sdrh   if( pAccum ){
1667bb4957f8Sdrh     sqlite3 *db = sqlite3_context_db_handle(context);
1668c0490572Sdrh     int firstTerm = pAccum->mxAlloc==0;
1669bb4957f8Sdrh     pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
16708bfd7190Sdrh     if( !firstTerm ){
167107d3117aSdrh       if( argc==2 ){
167207d3117aSdrh         zSep = (char*)sqlite3_value_text(argv[1]);
167307d3117aSdrh         nSep = sqlite3_value_bytes(argv[1]);
1674b0689696Sdrh       }else{
1675b0689696Sdrh         zSep = ",";
1676ade86483Sdrh         nSep = 1;
1677b0689696Sdrh       }
16780cdbe1aeSdrh       if( zSep ) sqlite3_str_append(pAccum, zSep, nSep);
1679b0689696Sdrh     }
168007d3117aSdrh     zVal = (char*)sqlite3_value_text(argv[0]);
168107d3117aSdrh     nVal = sqlite3_value_bytes(argv[0]);
16820cdbe1aeSdrh     if( zVal ) sqlite3_str_append(pAccum, zVal, nVal);
1683b0689696Sdrh   }
1684b0689696Sdrh }
1685b0689696Sdrh static void groupConcatFinalize(sqlite3_context *context){
1686ade86483Sdrh   StrAccum *pAccum;
1687ade86483Sdrh   pAccum = sqlite3_aggregate_context(context, 0);
1688ade86483Sdrh   if( pAccum ){
16890cdbe1aeSdrh     if( pAccum->accError==SQLITE_TOOBIG ){
1690ade86483Sdrh       sqlite3_result_error_toobig(context);
16910cdbe1aeSdrh     }else if( pAccum->accError==SQLITE_NOMEM ){
1692ade86483Sdrh       sqlite3_result_error_nomem(context);
1693ade86483Sdrh     }else{
1694ade86483Sdrh       sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1695ade86483Sdrh                           sqlite3_free);
1696b0689696Sdrh     }
1697b0689696Sdrh   }
1698ade86483Sdrh }
1699e2f781b9Sdan static void groupConcatValue(sqlite3_context *context){
1700e2f781b9Sdan   sqlite3_str *pAccum;
1701e2f781b9Sdan   pAccum = (sqlite3_str*)sqlite3_aggregate_context(context, 0);
1702e2f781b9Sdan   if( pAccum ){
1703e2f781b9Sdan     if( pAccum->accError==SQLITE_TOOBIG ){
1704e2f781b9Sdan       sqlite3_result_error_toobig(context);
1705e2f781b9Sdan     }else if( pAccum->accError==SQLITE_NOMEM ){
1706e2f781b9Sdan       sqlite3_result_error_nomem(context);
1707e2f781b9Sdan     }else{
1708e2f781b9Sdan       const char *zText = sqlite3_str_value(pAccum);
1709e2f781b9Sdan       sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
1710e2f781b9Sdan     }
1711e2f781b9Sdan   }
1712e2f781b9Sdan }
17134e5ffc5fSdrh 
1714d3a149efSdrh /*
1715a4741840Sdrh ** This routine does per-connection function registration.  Most
1716a4741840Sdrh ** of the built-in functions above are part of the global function set.
1717a4741840Sdrh ** This routine only deals with those that are not global.
1718dc04c583Sdrh */
171980738d9cSdrh void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3 *db){
1720832a58a6Sdanielk1977   int rc = sqlite3_overload_function(db, "MATCH", 2);
1721832a58a6Sdanielk1977   assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1722832a58a6Sdanielk1977   if( rc==SQLITE_NOMEM ){
17234a642b60Sdrh     sqlite3OomFault(db);
1724832a58a6Sdanielk1977   }
1725832a58a6Sdanielk1977 }
172655ef4d97Sdrh 
172755ef4d97Sdrh /*
172855ef4d97Sdrh ** Set the LIKEOPT flag on the 2-argument function with the given name.
172955ef4d97Sdrh */
17301bd10f8aSdrh static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
173155ef4d97Sdrh   FuncDef *pDef;
173280738d9cSdrh   pDef = sqlite3FindFunction(db, zName, 2, SQLITE_UTF8, 0);
1733d27135adSdrh   if( ALWAYS(pDef) ){
1734d36e1041Sdrh     pDef->funcFlags |= flagVal;
173555ef4d97Sdrh   }
173655ef4d97Sdrh }
173755ef4d97Sdrh 
173855ef4d97Sdrh /*
173955ef4d97Sdrh ** Register the built-in LIKE and GLOB functions.  The caseSensitive
174055ef4d97Sdrh ** parameter determines whether or not the LIKE operator is case
174155ef4d97Sdrh ** sensitive.  GLOB is always case sensitive.
174255ef4d97Sdrh */
174355ef4d97Sdrh void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
174455ef4d97Sdrh   struct compareInfo *pInfo;
174555ef4d97Sdrh   if( caseSensitive ){
174655ef4d97Sdrh     pInfo = (struct compareInfo*)&likeInfoAlt;
174755ef4d97Sdrh   }else{
174855ef4d97Sdrh     pInfo = (struct compareInfo*)&likeInfoNorm;
174955ef4d97Sdrh   }
1750901e994bSdrh   sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0);
1751901e994bSdrh   sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0);
1752901e994bSdrh   sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
1753d2199f0fSdan       (struct compareInfo*)&globInfo, likeFunc, 0, 0, 0);
1754d64fe2f3Sdrh   setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1755d64fe2f3Sdrh   setLikeOptFlag(db, "like",
1756d64fe2f3Sdrh       caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
175755ef4d97Sdrh }
175855ef4d97Sdrh 
175955ef4d97Sdrh /*
176055ef4d97Sdrh ** pExpr points to an expression which implements a function.  If
176155ef4d97Sdrh ** it is appropriate to apply the LIKE optimization to that function
17621d42ea71Sdrh ** then set aWc[0] through aWc[2] to the wildcard characters and the
17631d42ea71Sdrh ** escape character and then return TRUE.  If the function is not a
17641d42ea71Sdrh ** LIKE-style function then return FALSE.
17651d42ea71Sdrh **
17661d42ea71Sdrh ** The expression "a LIKE b ESCAPE c" is only considered a valid LIKE
17671d42ea71Sdrh ** operator if c is a string literal that is exactly one byte in length.
17681d42ea71Sdrh ** That one byte is stored in aWc[3].  aWc[3] is set to zero if there is
17691d42ea71Sdrh ** no ESCAPE clause.
177016897072Sdrh **
177116897072Sdrh ** *pIsNocase is set to true if uppercase and lowercase are equivalent for
177216897072Sdrh ** the function (default for LIKE).  If the function makes the distinction
177316897072Sdrh ** between uppercase and lowercase (as does GLOB) then *pIsNocase is set to
177416897072Sdrh ** false.
177555ef4d97Sdrh */
1776d64fe2f3Sdrh int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
177755ef4d97Sdrh   FuncDef *pDef;
17781d42ea71Sdrh   int nExpr;
17791d42ea71Sdrh   if( pExpr->op!=TK_FUNCTION || !pExpr->x.pList ){
178055ef4d97Sdrh     return 0;
178155ef4d97Sdrh   }
17826ab3a2ecSdanielk1977   assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
17831d42ea71Sdrh   nExpr = pExpr->x.pList->nExpr;
17841d42ea71Sdrh   pDef = sqlite3FindFunction(db, pExpr->u.zToken, nExpr, SQLITE_UTF8, 0);
1785d36e1041Sdrh   if( NEVER(pDef==0) || (pDef->funcFlags & SQLITE_FUNC_LIKE)==0 ){
178655ef4d97Sdrh     return 0;
178755ef4d97Sdrh   }
17881d42ea71Sdrh   if( nExpr<3 ){
17891d42ea71Sdrh     aWc[3] = 0;
17901d42ea71Sdrh   }else{
17911d42ea71Sdrh     Expr *pEscape = pExpr->x.pList->a[2].pExpr;
17921d42ea71Sdrh     char *zEscape;
17931d42ea71Sdrh     if( pEscape->op!=TK_STRING ) return 0;
17941d42ea71Sdrh     zEscape = pEscape->u.zToken;
17951d42ea71Sdrh     if( zEscape[0]==0 || zEscape[1]!=0 ) return 0;
17961d42ea71Sdrh     aWc[3] = zEscape[0];
17971d42ea71Sdrh   }
179855ef4d97Sdrh 
179955ef4d97Sdrh   /* The memcpy() statement assumes that the wildcard characters are
180055ef4d97Sdrh   ** the first three statements in the compareInfo structure.  The
180155ef4d97Sdrh   ** asserts() that follow verify that assumption
180255ef4d97Sdrh   */
180355ef4d97Sdrh   memcpy(aWc, pDef->pUserData, 3);
180455ef4d97Sdrh   assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
180555ef4d97Sdrh   assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
180655ef4d97Sdrh   assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
1807d36e1041Sdrh   *pIsNocase = (pDef->funcFlags & SQLITE_FUNC_CASE)==0;
180855ef4d97Sdrh   return 1;
1809dc04c583Sdrh }
18108c0a791aSdanielk1977 
181193ce741bSdanielk1977 /*
181260ec914cSpeter.d.reid ** All of the FuncDef structures in the aBuiltinFunc[] array above
181393ce741bSdanielk1977 ** to the global function hash table.  This occurs at start-time (as
181493ce741bSdanielk1977 ** a consequence of calling sqlite3_initialize()).
181593ce741bSdanielk1977 **
181693ce741bSdanielk1977 ** After this routine runs
181793ce741bSdanielk1977 */
181880738d9cSdrh void sqlite3RegisterBuiltinFunctions(void){
18198c0a791aSdanielk1977   /*
1820777c5386Sdrh   ** The following array holds FuncDef structures for all of the functions
1821777c5386Sdrh   ** defined in this file.
18228c0a791aSdanielk1977   **
1823777c5386Sdrh   ** The array cannot be constant since changes are made to the
1824777c5386Sdrh   ** FuncDef.pHash elements at start-time.  The elements of this array
1825777c5386Sdrh   ** are read-only after initialization is complete.
182680738d9cSdrh   **
182780738d9cSdrh   ** For peak efficiency, put the most frequently used function last.
18288c0a791aSdanielk1977   */
182980738d9cSdrh   static FuncDef aBuiltinFunc[] = {
183080738d9cSdrh #ifdef SQLITE_SOUNDEX
183180738d9cSdrh     FUNCTION(soundex,            1, 0, 0, soundexFunc      ),
183280738d9cSdrh #endif
183380738d9cSdrh #ifndef SQLITE_OMIT_LOAD_EXTENSION
183480738d9cSdrh     VFUNCTION(load_extension,    1, 0, 0, loadExt          ),
183580738d9cSdrh     VFUNCTION(load_extension,    2, 0, 0, loadExt          ),
183680738d9cSdrh #endif
183780738d9cSdrh #if SQLITE_USER_AUTHENTICATION
183880738d9cSdrh     FUNCTION(sqlite_crypt,       2, 0, 0, sqlite3CryptFunc ),
183980738d9cSdrh #endif
184080738d9cSdrh #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
184180738d9cSdrh     DFUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc  ),
184280738d9cSdrh     DFUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc  ),
184380738d9cSdrh #endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
184480738d9cSdrh     FUNCTION2(unlikely,          1, 0, 0, noopFunc,  SQLITE_FUNC_UNLIKELY),
184580738d9cSdrh     FUNCTION2(likelihood,        2, 0, 0, noopFunc,  SQLITE_FUNC_UNLIKELY),
184680738d9cSdrh     FUNCTION2(likely,            1, 0, 0, noopFunc,  SQLITE_FUNC_UNLIKELY),
184754240751Sdrh #ifdef SQLITE_DEBUG
1848a1a523a5Sdrh     FUNCTION2(affinity,          1, 0, 0, noopFunc,  SQLITE_FUNC_AFFINITY),
184954240751Sdrh #endif
1850092457b1Sdrh #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
185135100fb1Sdrh     FUNCTION2(sqlite_offset,     1, 0, 0, noopFunc,  SQLITE_FUNC_OFFSET|
18522fc865c1Sdrh                                                      SQLITE_FUNC_TYPEOF),
1853092457b1Sdrh #endif
18548c0a791aSdanielk1977     FUNCTION(ltrim,              1, 1, 0, trimFunc         ),
18558c0a791aSdanielk1977     FUNCTION(ltrim,              2, 1, 0, trimFunc         ),
18568c0a791aSdanielk1977     FUNCTION(rtrim,              1, 2, 0, trimFunc         ),
18578c0a791aSdanielk1977     FUNCTION(rtrim,              2, 2, 0, trimFunc         ),
18588c0a791aSdanielk1977     FUNCTION(trim,               1, 3, 0, trimFunc         ),
18598c0a791aSdanielk1977     FUNCTION(trim,               2, 3, 0, trimFunc         ),
18608c0a791aSdanielk1977     FUNCTION(min,               -1, 0, 1, minmaxFunc       ),
18618c0a791aSdanielk1977     FUNCTION(min,                0, 0, 1, 0                ),
18629588ad95Sdrh     AGGREGATE2(min,              1, 0, 1, minmaxStep,      minMaxFinalize,
18639588ad95Sdrh                                           SQLITE_FUNC_MINMAX ),
18648c0a791aSdanielk1977     FUNCTION(max,               -1, 1, 1, minmaxFunc       ),
18658c0a791aSdanielk1977     FUNCTION(max,                0, 1, 1, 0                ),
18669588ad95Sdrh     AGGREGATE2(max,              1, 1, 1, minmaxStep,      minMaxFinalize,
18679588ad95Sdrh                                           SQLITE_FUNC_MINMAX ),
1868a748fdccSdrh     FUNCTION2(typeof,            1, 0, 0, typeofFunc,  SQLITE_FUNC_TYPEOF),
1869a748fdccSdrh     FUNCTION2(length,            1, 0, 0, lengthFunc,  SQLITE_FUNC_LENGTH),
1870d55e0729Sdrh     FUNCTION(instr,              2, 0, 0, instrFunc        ),
1871a5c1416dSdrh     FUNCTION(printf,            -1, 0, 0, printfFunc       ),
1872d495d8c9Sdrh     FUNCTION(unicode,            1, 0, 0, unicodeFunc      ),
1873d495d8c9Sdrh     FUNCTION(char,              -1, 0, 0, charFunc         ),
18748c0a791aSdanielk1977     FUNCTION(abs,                1, 0, 0, absFunc          ),
1875fbd60f82Sshane #ifndef SQLITE_OMIT_FLOATING_POINT
18768c0a791aSdanielk1977     FUNCTION(round,              1, 0, 0, roundFunc        ),
18778c0a791aSdanielk1977     FUNCTION(round,              2, 0, 0, roundFunc        ),
1878fbd60f82Sshane #endif
18798c0a791aSdanielk1977     FUNCTION(upper,              1, 0, 0, upperFunc        ),
18808c0a791aSdanielk1977     FUNCTION(lower,              1, 0, 0, lowerFunc        ),
18818c0a791aSdanielk1977     FUNCTION(hex,                1, 0, 0, hexFunc          ),
1882cca9f3d2Sdrh     FUNCTION2(ifnull,            2, 0, 0, noopFunc,  SQLITE_FUNC_COALESCE),
1883b1fba286Sdrh     VFUNCTION(random,            0, 0, 0, randomFunc       ),
1884b1fba286Sdrh     VFUNCTION(randomblob,        1, 0, 0, randomBlob       ),
18858c0a791aSdanielk1977     FUNCTION(nullif,             2, 0, 1, nullifFunc       ),
188603bf26d9Sdrh     DFUNCTION(sqlite_version,    0, 0, 0, versionFunc      ),
188703bf26d9Sdrh     DFUNCTION(sqlite_source_id,  0, 0, 0, sourceidFunc     ),
1888840561f2Sdrh     FUNCTION(sqlite_log,         2, 0, 0, errlogFunc       ),
18898c0a791aSdanielk1977     FUNCTION(quote,              1, 0, 0, quoteFunc        ),
1890b1fba286Sdrh     VFUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1891b1fba286Sdrh     VFUNCTION(changes,           0, 0, 0, changes          ),
1892b1fba286Sdrh     VFUNCTION(total_changes,     0, 0, 0, total_changes    ),
18938c0a791aSdanielk1977     FUNCTION(replace,            3, 0, 0, replaceFunc      ),
18948c0a791aSdanielk1977     FUNCTION(zeroblob,           1, 0, 0, zeroblobFunc     ),
189580738d9cSdrh     FUNCTION(substr,             2, 0, 0, substrFunc       ),
189680738d9cSdrh     FUNCTION(substr,             3, 0, 0, substrFunc       ),
1897*c3a20c19Sdan     WAGGREGATE(sum,        1, 0, 0, sumStep, sumInverse,   sumFinalize),
1898*c3a20c19Sdan     WAGGREGATE(total,      1, 0, 0, sumStep, sumInverse,   totalFinalize    ),
1899*c3a20c19Sdan     WAGGREGATE(avg,        1, 0, 0, sumStep, sumInverse,   avgFinalize    ),
19009588ad95Sdrh     AGGREGATE2(count,            0, 0, 0, countStep,       countFinalize,
19019588ad95Sdrh                SQLITE_FUNC_COUNT  ),
1902*c3a20c19Sdan     WAGGREGATE(count,             1, 0, 0, countStep, 0,    countFinalize  ),
1903e2f781b9Sdan     AGGREGATE(group_concat,      1, 0, 0, groupConcatStep, groupConcatFinalize,
1904e2f781b9Sdan         groupConcatValue),
1905e2f781b9Sdan     AGGREGATE(group_concat,      2, 0, 0, groupConcatStep, groupConcatFinalize,
1906e2f781b9Sdan         groupConcatValue),
19078c0a791aSdanielk1977 
19088c0a791aSdanielk1977     LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
19098c0a791aSdanielk1977 #ifdef SQLITE_CASE_SENSITIVE_LIKE
19108c0a791aSdanielk1977     LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
19118c0a791aSdanielk1977     LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
19128c0a791aSdanielk1977 #else
19138c0a791aSdanielk1977     LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
19148c0a791aSdanielk1977     LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
19158c0a791aSdanielk1977 #endif
1916cc15313cSdrh #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
1917cc15313cSdrh     FUNCTION(unknown,           -1, 0, 0, unknownFunc      ),
1918cc15313cSdrh #endif
191980738d9cSdrh     FUNCTION(coalesce,           1, 0, 0, 0                ),
192080738d9cSdrh     FUNCTION(coalesce,           0, 0, 0, 0                ),
192180738d9cSdrh     FUNCTION2(coalesce,         -1, 0, 0, noopFunc,  SQLITE_FUNC_COALESCE),
19228c0a791aSdanielk1977   };
1923545f587fSdrh #ifndef SQLITE_OMIT_ALTERTABLE
1924545f587fSdrh   sqlite3AlterFunctions();
1925545f587fSdrh #endif
19260106e378Sdan #if defined(SQLITE_ENABLE_STAT3) || defined(SQLITE_ENABLE_STAT4)
19270106e378Sdan   sqlite3AnalyzeFunctions();
19280106e378Sdan #endif
192980738d9cSdrh   sqlite3RegisterDateTimeFunctions();
193080738d9cSdrh   sqlite3InsertBuiltinFuncs(aBuiltinFunc, ArraySize(aBuiltinFunc));
193180738d9cSdrh 
193280738d9cSdrh #if 0  /* Enable to print out how the built-in functions are hashed */
193380738d9cSdrh   {
193480738d9cSdrh     int i;
193580738d9cSdrh     FuncDef *p;
193680738d9cSdrh     for(i=0; i<SQLITE_FUNC_HASH_SZ; i++){
193780738d9cSdrh       printf("FUNC-HASH %02d:", i);
193880738d9cSdrh       for(p=sqlite3BuiltinFunctions.a[i]; p; p=p->u.pHash){
193980738d9cSdrh         int n = sqlite3Strlen30(p->zName);
194080738d9cSdrh         int h = p->zName[0] + n;
194180738d9cSdrh         printf(" %s(%d)", p->zName, h);
194280738d9cSdrh       }
194380738d9cSdrh       printf("\n");
194480738d9cSdrh     }
194580738d9cSdrh   }
194680738d9cSdrh #endif
194770a8ca3cSdrh }
1948