blob: e75fa47e7a478039dbede0aa0287397cf44e6108 [file] [log] [blame]
drhdc04c582002-02-24 01:55:15 +00001/*
2** 2002 February 23
3**
4** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
6**
7** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
10**
11*************************************************************************
12** This file contains the C functions that implement various SQL
13** functions of SQLite.
14**
15** There is only one exported symbol in this file - the function
16** sqliteRegisterBuildinFunctions() found at the bottom of the file.
17** All other code has file scope.
drhdc04c582002-02-24 01:55:15 +000018*/
drhb659e9b2005-01-28 01:29:08 +000019#include "sqliteInt.h"
drhd3a149e2002-02-24 17:12:53 +000020#include <stdlib.h>
drh0bce8352002-02-28 00:41:10 +000021#include <assert.h>
danielk197788208052004-05-25 01:13:20 +000022#include "vdbeInt.h"
drh0bce8352002-02-28 00:41:10 +000023
drh55ef4d92005-08-14 01:20:37 +000024/*
25** Return the collating function associated with a function.
26*/
danielk1977dc1bdc42004-06-11 10:51:27 +000027static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
28 return context->pColl;
29}
30
drh0bce8352002-02-28 00:41:10 +000031/*
32** Implementation of the non-aggregate min() and max() functions
33*/
drhf9b596e2004-05-26 16:54:42 +000034static void minmaxFunc(
35 sqlite3_context *context,
36 int argc,
37 sqlite3_value **argv
38){
drh0bce8352002-02-28 00:41:10 +000039 int i;
drh268380c2004-02-25 13:47:31 +000040 int mask; /* 0 for min() or 0xffffffff for max() */
drhf9b596e2004-05-26 16:54:42 +000041 int iBest;
danielk1977dc1bdc42004-06-11 10:51:27 +000042 CollSeq *pColl;
drh0bce8352002-02-28 00:41:10 +000043
drh65595cd2009-02-02 16:32:55 +000044 assert( argc>1 );
drhc44af712004-09-02 15:53:56 +000045 mask = sqlite3_user_data(context)==0 ? 0 : -1;
danielk1977dc1bdc42004-06-11 10:51:27 +000046 pColl = sqlite3GetFuncCollSeq(context);
47 assert( pColl );
danielk1977c572ef72004-05-27 09:28:41 +000048 assert( mask==-1 || mask==0 );
drhf9b596e2004-05-26 16:54:42 +000049 iBest = 0;
drh9c054832004-05-31 18:51:57 +000050 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhf9b596e2004-05-26 16:54:42 +000051 for(i=1; i<argc; i++){
drh9c054832004-05-31 18:51:57 +000052 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
danielk1977dc1bdc42004-06-11 10:51:27 +000053 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
drh65595cd2009-02-02 16:32:55 +000054 testcase( mask==0 );
drhf9b596e2004-05-26 16:54:42 +000055 iBest = i;
drh0bce8352002-02-28 00:41:10 +000056 }
57 }
drhf4479502004-05-27 03:12:53 +000058 sqlite3_result_value(context, argv[iBest]);
drh0bce8352002-02-28 00:41:10 +000059}
drh0bce8352002-02-28 00:41:10 +000060
drh268380c2004-02-25 13:47:31 +000061/*
62** Return the type of the argument.
63*/
drhf9b596e2004-05-26 16:54:42 +000064static void typeofFunc(
65 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +000066 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +000067 sqlite3_value **argv
68){
danielk197735bb9d02004-05-24 12:55:54 +000069 const char *z = 0;
danielk197762c14b32008-11-19 09:05:26 +000070 UNUSED_PARAMETER(NotUsed);
danielk197735bb9d02004-05-24 12:55:54 +000071 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000072 case SQLITE_INTEGER: z = "integer"; break;
73 case SQLITE_TEXT: z = "text"; break;
74 case SQLITE_FLOAT: z = "real"; break;
75 case SQLITE_BLOB: z = "blob"; break;
drh65595cd2009-02-02 16:32:55 +000076 default: z = "null"; break;
danielk197735bb9d02004-05-24 12:55:54 +000077 }
danielk1977d8123362004-06-12 09:25:12 +000078 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000079}
80
drh5708d2d2005-06-22 10:53:59 +000081
82/*
drh0bce8352002-02-28 00:41:10 +000083** Implementation of the length() function
84*/
drhf9b596e2004-05-26 16:54:42 +000085static void lengthFunc(
86 sqlite3_context *context,
87 int argc,
88 sqlite3_value **argv
89){
drh0bce8352002-02-28 00:41:10 +000090 int len;
91
92 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +000093 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +000094 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000095 case SQLITE_BLOB:
96 case SQLITE_INTEGER:
97 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +000098 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +000099 break;
100 }
drh9c054832004-05-31 18:51:57 +0000101 case SQLITE_TEXT: {
drh2646da72005-12-09 20:02:05 +0000102 const unsigned char *z = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000103 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000104 len = 0;
105 while( *z ){
106 len++;
107 SQLITE_SKIP_UTF8(z);
108 }
drhf4479502004-05-27 03:12:53 +0000109 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000110 break;
111 }
112 default: {
113 sqlite3_result_null(context);
114 break;
115 }
116 }
drh0bce8352002-02-28 00:41:10 +0000117}
118
119/*
drh2ba3ccc2009-12-08 02:06:08 +0000120** Implementation of the abs() function.
121**
122** IMP: R-23979-26855 The abs(X) function returns the absolute value of
123** the numeric argument X.
drh0bce8352002-02-28 00:41:10 +0000124*/
danielk19770ae8b832004-05-25 12:05:56 +0000125static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000126 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000127 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000128 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000129 case SQLITE_INTEGER: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000130 i64 iVal = sqlite3_value_int64(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000131 if( iVal<0 ){
132 if( (iVal<<1)==0 ){
drh2ba3ccc2009-12-08 02:06:08 +0000133 /* IMP: R-35460-15084 If X is the integer -9223372036854775807 then
134 ** abs(X) throws an integer overflow error since there is no
135 ** equivalent positive 64-bit two complement value. */
drh52fc8492006-02-23 21:43:55 +0000136 sqlite3_result_error(context, "integer overflow", -1);
137 return;
138 }
139 iVal = -iVal;
140 }
danielk1977f93bbbe2004-05-27 10:30:52 +0000141 sqlite3_result_int64(context, iVal);
drhf9b596e2004-05-26 16:54:42 +0000142 break;
143 }
drh9c054832004-05-31 18:51:57 +0000144 case SQLITE_NULL: {
drh2ba3ccc2009-12-08 02:06:08 +0000145 /* IMP: R-37434-19929 Abs(X) returns NULL if X is NULL. */
drhf9b596e2004-05-26 16:54:42 +0000146 sqlite3_result_null(context);
147 break;
148 }
149 default: {
drh2ba3ccc2009-12-08 02:06:08 +0000150 /* Because sqlite3_value_double() returns 0.0 if the argument is not
151 ** something that can be converted into a number, we have:
152 ** IMP: R-57326-31541 Abs(X) return 0.0 if X is a string or blob that
153 ** cannot be converted to a numeric value.
154 */
danielk1977f93bbbe2004-05-27 10:30:52 +0000155 double rVal = sqlite3_value_double(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000156 if( rVal<0 ) rVal = -rVal;
danielk1977f93bbbe2004-05-27 10:30:52 +0000157 sqlite3_result_double(context, rVal);
drhf9b596e2004-05-26 16:54:42 +0000158 break;
159 }
160 }
drh0bce8352002-02-28 00:41:10 +0000161}
162
163/*
drhf764e6f2007-05-15 01:13:47 +0000164** Implementation of the substr() function.
165**
166** substr(x,p1,p2) returns p2 characters of x[] beginning with p1.
167** p1 is 1-indexed. So substr(x,1,1) returns the first character
168** of x. If x is text, then we actually count UTF-8 characters.
169** If x is a blob, then we count bytes.
170**
171** If p1 is negative, then we begin abs(p1) from the end of x[].
shaneh779b8f12009-11-12 05:04:50 +0000172**
173** If p2 is negative, return the p2 characters preceeding p1.
drh0bce8352002-02-28 00:41:10 +0000174*/
drhf9b596e2004-05-26 16:54:42 +0000175static void substrFunc(
176 sqlite3_context *context,
177 int argc,
178 sqlite3_value **argv
179){
drh2646da72005-12-09 20:02:05 +0000180 const unsigned char *z;
181 const unsigned char *z2;
drh023ae032007-05-08 12:12:16 +0000182 int len;
drhf764e6f2007-05-15 01:13:47 +0000183 int p0type;
drh023ae032007-05-08 12:12:16 +0000184 i64 p1, p2;
drh65595cd2009-02-02 16:32:55 +0000185 int negP2 = 0;
drhf9b596e2004-05-26 16:54:42 +0000186
drh64f31512007-10-12 19:11:55 +0000187 assert( argc==3 || argc==2 );
drh8198d252009-02-01 19:42:37 +0000188 if( sqlite3_value_type(argv[1])==SQLITE_NULL
189 || (argc==3 && sqlite3_value_type(argv[2])==SQLITE_NULL)
190 ){
191 return;
192 }
drhf764e6f2007-05-15 01:13:47 +0000193 p0type = sqlite3_value_type(argv[0]);
drh4adc4cb2009-11-11 20:53:31 +0000194 p1 = sqlite3_value_int(argv[1]);
drhf764e6f2007-05-15 01:13:47 +0000195 if( p0type==SQLITE_BLOB ){
196 len = sqlite3_value_bytes(argv[0]);
197 z = sqlite3_value_blob(argv[0]);
198 if( z==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000199 assert( len==sqlite3_value_bytes(argv[0]) );
drhf764e6f2007-05-15 01:13:47 +0000200 }else{
201 z = sqlite3_value_text(argv[0]);
202 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000203 len = 0;
drh4adc4cb2009-11-11 20:53:31 +0000204 if( p1<0 ){
205 for(z2=z; *z2; len++){
206 SQLITE_SKIP_UTF8(z2);
207 }
drh4a919112007-05-15 11:55:09 +0000208 }
drhf764e6f2007-05-15 01:13:47 +0000209 }
drh64f31512007-10-12 19:11:55 +0000210 if( argc==3 ){
211 p2 = sqlite3_value_int(argv[2]);
drh65595cd2009-02-02 16:32:55 +0000212 if( p2<0 ){
213 p2 = -p2;
214 negP2 = 1;
215 }
drh64f31512007-10-12 19:11:55 +0000216 }else{
drhbb4957f2008-03-20 14:03:29 +0000217 p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH];
drh64f31512007-10-12 19:11:55 +0000218 }
drh0bce8352002-02-28 00:41:10 +0000219 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000220 p1 += len;
drh653bc752002-02-28 03:31:10 +0000221 if( p1<0 ){
222 p2 += p1;
drh65595cd2009-02-02 16:32:55 +0000223 if( p2<0 ) p2 = 0;
drh653bc752002-02-28 03:31:10 +0000224 p1 = 0;
225 }
drh0bce8352002-02-28 00:41:10 +0000226 }else if( p1>0 ){
227 p1--;
drh65595cd2009-02-02 16:32:55 +0000228 }else if( p2>0 ){
229 p2--;
drh0bce8352002-02-28 00:41:10 +0000230 }
drh65595cd2009-02-02 16:32:55 +0000231 if( negP2 ){
232 p1 -= p2;
drh4e79c592009-02-01 19:23:32 +0000233 if( p1<0 ){
234 p2 += p1;
235 p1 = 0;
236 }
237 }
drh65595cd2009-02-02 16:32:55 +0000238 assert( p1>=0 && p2>=0 );
drhf764e6f2007-05-15 01:13:47 +0000239 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000240 while( *z && p1 ){
241 SQLITE_SKIP_UTF8(z);
242 p1--;
drhf764e6f2007-05-15 01:13:47 +0000243 }
drh4a919112007-05-15 11:55:09 +0000244 for(z2=z; *z2 && p2; p2--){
245 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000246 }
drh1bd10f82008-12-10 21:19:56 +0000247 sqlite3_result_text(context, (char*)z, (int)(z2-z), SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000248 }else{
drh4adc4cb2009-11-11 20:53:31 +0000249 if( p1+p2>len ){
250 p2 = len-p1;
251 if( p2<0 ) p2 = 0;
252 }
drh1bd10f82008-12-10 21:19:56 +0000253 sqlite3_result_blob(context, (char*)&z[p1], (int)p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000254 }
drh0bce8352002-02-28 00:41:10 +0000255}
256
257/*
258** Implementation of the round() function
259*/
shanefbd60f82009-02-04 03:59:25 +0000260#ifndef SQLITE_OMIT_FLOATING_POINT
danielk19770ae8b832004-05-25 12:05:56 +0000261static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000262 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000263 double r;
drh50d654d2009-06-03 01:24:54 +0000264 char *zBuf;
drh0bce8352002-02-28 00:41:10 +0000265 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000266 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000267 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000268 n = sqlite3_value_int(argv[1]);
269 if( n>30 ) n = 30;
270 if( n<0 ) n = 0;
271 }
drhd589a922006-03-02 03:02:48 +0000272 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000273 r = sqlite3_value_double(argv[0]);
shaneh147e1762010-02-17 04:19:27 +0000274 /* If Y==0 and X will fit in a 64-bit int,
275 ** handle the rounding directly,
276 ** otherwise use printf.
277 */
278 if( n==0 && r>=0 && r<LARGEST_INT64-1 ){
279 r = (double)((sqlite_int64)(r+0.5));
280 }else if( n==0 && r<0 && (-r)<LARGEST_INT64-1 ){
281 r = -(double)((sqlite_int64)((-r)+0.5));
drh50d654d2009-06-03 01:24:54 +0000282 }else{
shaneh147e1762010-02-17 04:19:27 +0000283 zBuf = sqlite3_mprintf("%.*f",n,r);
284 if( zBuf==0 ){
285 sqlite3_result_error_nomem(context);
286 return;
287 }
drh9339da12010-09-30 00:50:49 +0000288 sqlite3AtoF(zBuf, &r, sqlite3Strlen30(zBuf), SQLITE_UTF8);
drh50d654d2009-06-03 01:24:54 +0000289 sqlite3_free(zBuf);
drh50d654d2009-06-03 01:24:54 +0000290 }
shaneh147e1762010-02-17 04:19:27 +0000291 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000292}
shanefbd60f82009-02-04 03:59:25 +0000293#endif
drhdc04c582002-02-24 01:55:15 +0000294
danielk197726783a52007-08-29 14:06:22 +0000295/*
296** Allocate nByte bytes of space using sqlite3_malloc(). If the
297** allocation fails, call sqlite3_result_error_nomem() to notify
drh27e62db2009-04-02 10:16:17 +0000298** the database handle that malloc() has failed and return NULL.
299** If nByte is larger than the maximum string or blob length, then
300** raise an SQLITE_TOOBIG exception and return NULL.
danielk197726783a52007-08-29 14:06:22 +0000301*/
drhb1a6c3c2008-03-20 16:30:17 +0000302static void *contextMalloc(sqlite3_context *context, i64 nByte){
drhbb4957f2008-03-20 14:03:29 +0000303 char *z;
drh27e62db2009-04-02 10:16:17 +0000304 sqlite3 *db = sqlite3_context_db_handle(context);
drhef31c6a2009-04-02 09:07:12 +0000305 assert( nByte>0 );
drh27e62db2009-04-02 10:16:17 +0000306 testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] );
307 testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
308 if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drhbb4957f2008-03-20 14:03:29 +0000309 sqlite3_result_error_toobig(context);
310 z = 0;
311 }else{
drh1bd10f82008-12-10 21:19:56 +0000312 z = sqlite3Malloc((int)nByte);
drhef31c6a2009-04-02 09:07:12 +0000313 if( !z ){
drhbb4957f2008-03-20 14:03:29 +0000314 sqlite3_result_error_nomem(context);
315 }
danielk1977a1644fd2007-08-29 12:31:25 +0000316 }
317 return z;
318}
319
drhdc04c582002-02-24 01:55:15 +0000320/*
321** Implementation of the upper() and lower() SQL functions.
322*/
danielk19770ae8b832004-05-25 12:05:56 +0000323static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000324 char *z1;
325 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000326 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000327 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000328 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000329 n = sqlite3_value_bytes(argv[0]);
330 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
331 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000332 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000333 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000334 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000335 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000336 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000337 z1[i] = (char)sqlite3Toupper(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000338 }
339 sqlite3_result_text(context, z1, -1, sqlite3_free);
340 }
drhdc04c582002-02-24 01:55:15 +0000341 }
342}
danielk19770ae8b832004-05-25 12:05:56 +0000343static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197778ca0e72009-01-20 16:53:39 +0000344 u8 *z1;
drh7a521cf2007-04-25 18:23:52 +0000345 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000346 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000347 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000348 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000349 n = sqlite3_value_bytes(argv[0]);
350 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
351 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000352 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000353 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000354 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000355 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000356 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000357 z1[i] = sqlite3Tolower(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000358 }
danielk197778ca0e72009-01-20 16:53:39 +0000359 sqlite3_result_text(context, (char *)z1, -1, sqlite3_free);
drh7a521cf2007-04-25 18:23:52 +0000360 }
drhdc04c582002-02-24 01:55:15 +0000361 }
362}
363
drhae6bb952009-11-11 00:24:31 +0000364
365#if 0 /* This function is never used. */
366/*
367** The COALESCE() and IFNULL() functions used to be implemented as shown
368** here. But now they are implemented as VDBE code so that unused arguments
369** do not have to be computed. This legacy implementation is retained as
370** comment.
371*/
drhdc04c582002-02-24 01:55:15 +0000372/*
drhfbc99082002-02-28 03:14:18 +0000373** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000374** All three do the same thing. They return the first non-NULL
375** argument.
drh3212e182002-02-28 00:46:26 +0000376*/
drhf9b596e2004-05-26 16:54:42 +0000377static void ifnullFunc(
378 sqlite3_context *context,
379 int argc,
380 sqlite3_value **argv
381){
drhfbc99082002-02-28 03:14:18 +0000382 int i;
383 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000384 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000385 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000386 break;
387 }
388 }
drh3212e182002-02-28 00:46:26 +0000389}
drhae6bb952009-11-11 00:24:31 +0000390#endif /* NOT USED */
391#define ifnullFunc versionFunc /* Substitute function - never called */
drh3212e182002-02-28 00:46:26 +0000392
393/*
drhf9ffac92002-03-02 19:00:31 +0000394** Implementation of random(). Return a random integer.
395*/
drhf9b596e2004-05-26 16:54:42 +0000396static void randomFunc(
397 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000398 int NotUsed,
399 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000400){
drh52fc8492006-02-23 21:43:55 +0000401 sqlite_int64 r;
danielk197762c14b32008-11-19 09:05:26 +0000402 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drh2fa18682008-03-19 14:15:34 +0000403 sqlite3_randomness(sizeof(r), &r);
drh3034e3d2009-04-02 14:05:21 +0000404 if( r<0 ){
405 /* We need to prevent a random number of 0x8000000000000000
406 ** (or -9223372036854775808) since when you do abs() of that
407 ** number of you get the same value back again. To do this
408 ** in a way that is testable, mask the sign bit off of negative
409 ** values, resulting in a positive value. Then take the
410 ** 2s complement of that positive value. The end result can
411 ** therefore be no less than -9223372036854775807.
412 */
413 r = -(r ^ (((sqlite3_int64)1)<<63));
414 }
drh52fc8492006-02-23 21:43:55 +0000415 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000416}
417
418/*
drh137c7282007-01-29 17:58:28 +0000419** Implementation of randomblob(N). Return a random blob
420** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000421*/
drh137c7282007-01-29 17:58:28 +0000422static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000423 sqlite3_context *context,
424 int argc,
425 sqlite3_value **argv
426){
drh137c7282007-01-29 17:58:28 +0000427 int n;
428 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000429 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000430 UNUSED_PARAMETER(argc);
drh63cf66f2007-01-29 15:50:05 +0000431 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000432 if( n<1 ){
433 n = 1;
434 }
danielk1977a1644fd2007-08-29 12:31:25 +0000435 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000436 if( p ){
drh2fa18682008-03-19 14:15:34 +0000437 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000438 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000439 }
drh63cf66f2007-01-29 15:50:05 +0000440}
441
442/*
drh6ed41ad2002-04-06 14:10:47 +0000443** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000444** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000445*/
danielk197751ad0ec2004-05-24 12:39:02 +0000446static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000447 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000448 int NotUsed,
449 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000450){
drhfa4a4b92008-03-19 21:45:51 +0000451 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000452 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000453 /* IMP: R-51513-12026 The last_insert_rowid() SQL function is a
454 ** wrapper around the sqlite3_last_insert_rowid() C/C++ interface
455 ** function. */
drhf9b596e2004-05-26 16:54:42 +0000456 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000457}
458
rdcf146a772004-02-25 22:51:06 +0000459/*
drhab2f1f92010-01-11 18:26:42 +0000460** Implementation of the changes() SQL function.
461**
462** IMP: R-62073-11209 The changes() SQL function is a wrapper
463** around the sqlite3_changes() C/C++ function and hence follows the same
464** rules for counting changes.
rdcf146a772004-02-25 22:51:06 +0000465*/
danielk1977b28af712004-06-21 06:50:26 +0000466static void changes(
drhf9b596e2004-05-26 16:54:42 +0000467 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000468 int NotUsed,
469 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000470){
drhfa4a4b92008-03-19 21:45:51 +0000471 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000472 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf4479502004-05-27 03:12:53 +0000473 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000474}
rdcf146a772004-02-25 22:51:06 +0000475
476/*
danielk1977b28af712004-06-21 06:50:26 +0000477** Implementation of the total_changes() SQL function. The return value is
478** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000479*/
danielk1977b28af712004-06-21 06:50:26 +0000480static void total_changes(
481 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000482 int NotUsed,
483 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000484){
drhfa4a4b92008-03-19 21:45:51 +0000485 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000486 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000487 /* IMP: R-52756-41993 This function is a wrapper around the
488 ** sqlite3_total_changes() C/C++ interface. */
danielk1977b28af712004-06-21 06:50:26 +0000489 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000490}
491
drh6ed41ad2002-04-06 14:10:47 +0000492/*
drh4e5ffc52004-08-31 00:52:37 +0000493** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000494*/
drh4e5ffc52004-08-31 00:52:37 +0000495struct compareInfo {
496 u8 matchAll;
497 u8 matchOne;
498 u8 matchSet;
499 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000500};
drh55ef4d92005-08-14 01:20:37 +0000501
drhb9175ae2007-12-07 18:39:04 +0000502/*
503** For LIKE and GLOB matching on EBCDIC machines, assume that every
504** character is exactly one byte in size. Also, all characters are
505** able to participate in upper-case-to-lower-case mappings in EBCDIC
506** whereas only characters less than 0x80 do in ASCII.
507*/
508#if defined(SQLITE_EBCDIC)
drh769e97e2009-04-01 16:33:37 +0000509# define sqlite3Utf8Read(A,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000510# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000511#else
drh6ed4b782007-12-10 18:07:20 +0000512# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000513#endif
514
drh4e5ffc52004-08-31 00:52:37 +0000515static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000516/* The correct SQL-92 behavior is for the LIKE operator to ignore
517** case. Thus 'a' LIKE 'A' would be true. */
518static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
519/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
520** is case sensitive causing 'a' LIKE 'A' to be false */
521static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000522
523/*
drh4e5ffc52004-08-31 00:52:37 +0000524** Compare two UTF-8 strings for equality where the first string can
525** potentially be a "glob" expression. Return true (1) if they
526** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000527**
drh4e5ffc52004-08-31 00:52:37 +0000528** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000529**
drh4e5ffc52004-08-31 00:52:37 +0000530** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000531**
drh4e5ffc52004-08-31 00:52:37 +0000532** '?' Matches exactly one character.
533**
534** [...] Matches one character from the enclosed list of
535** characters.
536**
537** [^...] Matches one character not in the enclosed list.
538**
539** With the [...] and [^...] matching, a ']' character can be included
540** in the list by making it the first character after '[' or '^'. A
541** range of characters can be specified using '-'. Example:
542** "[a-z]" matches any single lower-case letter. To match a '-', make
543** it the last character in the list.
544**
545** This routine is usually quick, but can be N**2 in the worst case.
546**
547** Hints: to match '*' or '?', put them in "[]". Like this:
548**
549** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000550*/
danielk19777c6303c2004-11-17 16:41:29 +0000551static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000552 const u8 *zPattern, /* The glob pattern */
553 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000554 const struct compareInfo *pInfo, /* Information about how to do the compare */
555 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000556){
drh66150952007-07-23 19:12:41 +0000557 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000558 int invert;
559 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000560 u8 matchOne = pInfo->matchOne;
561 u8 matchAll = pInfo->matchAll;
562 u8 matchSet = pInfo->matchSet;
563 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000564 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000565
drh769e97e2009-04-01 16:33:37 +0000566 while( (c = sqlite3Utf8Read(zPattern,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000567 if( !prevEscape && c==matchAll ){
drh769e97e2009-04-01 16:33:37 +0000568 while( (c=sqlite3Utf8Read(zPattern,&zPattern)) == matchAll
drh66150952007-07-23 19:12:41 +0000569 || c == matchOne ){
drh769e97e2009-04-01 16:33:37 +0000570 if( c==matchOne && sqlite3Utf8Read(zString, &zString)==0 ){
drh66150952007-07-23 19:12:41 +0000571 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000572 }
danielk1977ad7dd422004-06-06 12:41:49 +0000573 }
drh66150952007-07-23 19:12:41 +0000574 if( c==0 ){
575 return 1;
576 }else if( c==esc ){
drh769e97e2009-04-01 16:33:37 +0000577 c = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000578 if( c==0 ){
579 return 0;
580 }
581 }else if( c==matchSet ){
582 assert( esc==0 ); /* This is GLOB, not LIKE */
583 assert( matchSet<0x80 ); /* '[' is a single-byte character */
584 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000585 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000586 }
587 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000588 }
drh769e97e2009-04-01 16:33:37 +0000589 while( (c2 = sqlite3Utf8Read(zString,&zString))!=0 ){
drh66150952007-07-23 19:12:41 +0000590 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000591 GlogUpperToLower(c2);
592 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000593 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000594 c2 = sqlite3Utf8Read(zString, &zString);
drh6ed4b782007-12-10 18:07:20 +0000595 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000596 }
drh66150952007-07-23 19:12:41 +0000597 }else{
598 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000599 c2 = sqlite3Utf8Read(zString, &zString);
drh66150952007-07-23 19:12:41 +0000600 }
drh4e5ffc52004-08-31 00:52:37 +0000601 }
drh66150952007-07-23 19:12:41 +0000602 if( c2==0 ) return 0;
603 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
604 }
605 return 0;
606 }else if( !prevEscape && c==matchOne ){
drh769e97e2009-04-01 16:33:37 +0000607 if( sqlite3Utf8Read(zString, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000608 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000609 }
drh4e5ffc52004-08-31 00:52:37 +0000610 }else if( c==matchSet ){
611 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000612 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000613 seen = 0;
614 invert = 0;
drh769e97e2009-04-01 16:33:37 +0000615 c = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000616 if( c==0 ) return 0;
drh769e97e2009-04-01 16:33:37 +0000617 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000618 if( c2=='^' ){
619 invert = 1;
drh769e97e2009-04-01 16:33:37 +0000620 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000621 }
drh4e5ffc52004-08-31 00:52:37 +0000622 if( c2==']' ){
623 if( c==']' ) seen = 1;
drh769e97e2009-04-01 16:33:37 +0000624 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000625 }
drh66150952007-07-23 19:12:41 +0000626 while( c2 && c2!=']' ){
627 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
drh769e97e2009-04-01 16:33:37 +0000628 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000629 if( c>=prior_c && c<=c2 ) seen = 1;
630 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000631 }else{
drh66150952007-07-23 19:12:41 +0000632 if( c==c2 ){
633 seen = 1;
634 }
drh4e5ffc52004-08-31 00:52:37 +0000635 prior_c = c2;
636 }
drh769e97e2009-04-01 16:33:37 +0000637 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000638 }
drh66150952007-07-23 19:12:41 +0000639 if( c2==0 || (seen ^ invert)==0 ){
640 return 0;
641 }
642 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000643 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000644 }else{
drh769e97e2009-04-01 16:33:37 +0000645 c2 = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000646 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000647 GlogUpperToLower(c);
648 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000649 }
drh66150952007-07-23 19:12:41 +0000650 if( c!=c2 ){
651 return 0;
652 }
danielk19777c6303c2004-11-17 16:41:29 +0000653 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000654 }
danielk197751ad0ec2004-05-24 12:39:02 +0000655 }
drh4e5ffc52004-08-31 00:52:37 +0000656 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000657}
drh4e5ffc52004-08-31 00:52:37 +0000658
drh55ef4d92005-08-14 01:20:37 +0000659/*
660** Count the number of times that the LIKE operator (or GLOB which is
661** just a variation of LIKE) gets called. This is used for testing
662** only.
663*/
664#ifdef SQLITE_TEST
665int sqlite3_like_count = 0;
666#endif
667
danielk19773f6b0872004-06-17 05:36:44 +0000668
669/*
670** Implementation of the like() SQL function. This function implements
671** the build-in LIKE operator. The first argument to the function is the
672** pattern and the second argument is the string. So, the SQL statements:
673**
674** A LIKE B
675**
676** is implemented as like(B,A).
677**
drh55ef4d92005-08-14 01:20:37 +0000678** This same function (with a different compareInfo structure) computes
679** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000680*/
681static void likeFunc(
682 sqlite3_context *context,
683 int argc,
684 sqlite3_value **argv
685){
drhbeb818d2007-05-08 15:34:47 +0000686 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000687 int escape = 0;
drh27e62db2009-04-02 10:16:17 +0000688 int nPat;
drhbb4957f2008-03-20 14:03:29 +0000689 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000690
drh1f0feef2007-05-15 13:27:07 +0000691 zB = sqlite3_value_text(argv[0]);
692 zA = sqlite3_value_text(argv[1]);
693
drhbeb818d2007-05-08 15:34:47 +0000694 /* Limit the length of the LIKE or GLOB pattern to avoid problems
695 ** of deep recursion and N*N behavior in patternCompare().
696 */
drh27e62db2009-04-02 10:16:17 +0000697 nPat = sqlite3_value_bytes(argv[0]);
698 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] );
699 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 );
700 if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000701 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
702 return;
703 }
drh1f0feef2007-05-15 13:27:07 +0000704 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000705
danielk19777c6303c2004-11-17 16:41:29 +0000706 if( argc==3 ){
707 /* The escape character string must consist of a single UTF-8 character.
708 ** Otherwise, return an error.
709 */
710 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000711 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000712 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000713 sqlite3_result_error(context,
714 "ESCAPE expression must be a single character", -1);
715 return;
716 }
drh769e97e2009-04-01 16:33:37 +0000717 escape = sqlite3Utf8Read(zEsc, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000718 }
danielk19773f6b0872004-06-17 05:36:44 +0000719 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000720 struct compareInfo *pInfo = sqlite3_user_data(context);
721#ifdef SQLITE_TEST
722 sqlite3_like_count++;
723#endif
drhbeb818d2007-05-08 15:34:47 +0000724
danielk1977b56fe1f2007-05-09 08:24:44 +0000725 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000726 }
drh8912d102002-05-26 21:34:58 +0000727}
728
729/*
730** Implementation of the NULLIF(x,y) function. The result is the first
731** argument if the arguments are different. The result is NULL if the
732** arguments are equal to each other.
733*/
drhf9b596e2004-05-26 16:54:42 +0000734static void nullifFunc(
735 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000736 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +0000737 sqlite3_value **argv
738){
danielk1977dc1bdc42004-06-11 10:51:27 +0000739 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk197762c14b32008-11-19 09:05:26 +0000740 UNUSED_PARAMETER(NotUsed);
danielk1977dc1bdc42004-06-11 10:51:27 +0000741 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000742 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000743 }
drh0ac65892002-04-20 14:24:41 +0000744}
745
drh647cb0e2002-11-04 19:32:25 +0000746/*
drh47baebc2009-08-14 16:01:24 +0000747** Implementation of the sqlite_version() function. The result is the version
drh647cb0e2002-11-04 19:32:25 +0000748** of the SQLite library that is running.
749*/
drhf9b596e2004-05-26 16:54:42 +0000750static void versionFunc(
751 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000752 int NotUsed,
753 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000754){
danielk197762c14b32008-11-19 09:05:26 +0000755 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000756 /* IMP: R-48699-48617 This function is an SQL wrapper around the
757 ** sqlite3_libversion() C-interface. */
758 sqlite3_result_text(context, sqlite3_libversion(), -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000759}
760
drh47baebc2009-08-14 16:01:24 +0000761/*
762** Implementation of the sqlite_source_id() function. The result is a string
763** that identifies the particular version of the source code used to build
764** SQLite.
765*/
766static void sourceidFunc(
767 sqlite3_context *context,
768 int NotUsed,
769 sqlite3_value **NotUsed2
770){
771 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000772 /* IMP: R-24470-31136 This function is an SQL wrapper around the
773 ** sqlite3_sourceid() C interface. */
774 sqlite3_result_text(context, sqlite3_sourceid(), -1, SQLITE_STATIC);
drh47baebc2009-08-14 16:01:24 +0000775}
776
shanehbdea6d12010-02-23 04:19:54 +0000777/*
drh3ca84ef2011-04-25 18:03:10 +0000778** Implementation of the sqlite_log() function. This is a wrapper around
779** sqlite3_log(). The return value is NULL. The function exists purely for
780** its side-effects.
781*/
782static void logFunc(
783 sqlite3_context *context,
784 int argc,
785 sqlite3_value **argv
786){
787 UNUSED_PARAMETER(argc);
788 UNUSED_PARAMETER(context);
789 sqlite3_log(sqlite3_value_int(argv[0]), "%s", sqlite3_value_text(argv[1]));
790}
791
792/*
shanehdc97a8c2010-02-23 20:08:35 +0000793** Implementation of the sqlite_compileoption_used() function.
794** The result is an integer that identifies if the compiler option
795** was used to build SQLite.
shanehbdea6d12010-02-23 04:19:54 +0000796*/
shanehdc97a8c2010-02-23 20:08:35 +0000797#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
798static void compileoptionusedFunc(
shanehbdea6d12010-02-23 04:19:54 +0000799 sqlite3_context *context,
shanehdc97a8c2010-02-23 20:08:35 +0000800 int argc,
801 sqlite3_value **argv
shanehbdea6d12010-02-23 04:19:54 +0000802){
shanehdc97a8c2010-02-23 20:08:35 +0000803 const char *zOptName;
804 assert( argc==1 );
805 UNUSED_PARAMETER(argc);
drha3e414c2010-08-03 18:06:25 +0000806 /* IMP: R-39564-36305 The sqlite_compileoption_used() SQL
807 ** function is a wrapper around the sqlite3_compileoption_used() C/C++
808 ** function.
809 */
drh264a2d42010-02-25 15:28:41 +0000810 if( (zOptName = (const char*)sqlite3_value_text(argv[0]))!=0 ){
shanehdc97a8c2010-02-23 20:08:35 +0000811 sqlite3_result_int(context, sqlite3_compileoption_used(zOptName));
shanehdc97a8c2010-02-23 20:08:35 +0000812 }
shanehbdea6d12010-02-23 04:19:54 +0000813}
shanehdc97a8c2010-02-23 20:08:35 +0000814#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
815
816/*
817** Implementation of the sqlite_compileoption_get() function.
818** The result is a string that identifies the compiler options
819** used to build SQLite.
820*/
821#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
822static void compileoptiongetFunc(
823 sqlite3_context *context,
824 int argc,
825 sqlite3_value **argv
826){
827 int n;
828 assert( argc==1 );
829 UNUSED_PARAMETER(argc);
drha3e414c2010-08-03 18:06:25 +0000830 /* IMP: R-04922-24076 The sqlite_compileoption_get() SQL function
831 ** is a wrapper around the sqlite3_compileoption_get() C/C++ function.
832 */
shanehdc97a8c2010-02-23 20:08:35 +0000833 n = sqlite3_value_int(argv[0]);
834 sqlite3_result_text(context, sqlite3_compileoption_get(n), -1, SQLITE_STATIC);
835}
836#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
shanehbdea6d12010-02-23 04:19:54 +0000837
drh137c7282007-01-29 17:58:28 +0000838/* Array for converting from half-bytes (nybbles) into ASCII hex
839** digits. */
840static const char hexdigits[] = {
841 '0', '1', '2', '3', '4', '5', '6', '7',
842 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
843};
danielk1977d641d642004-11-18 15:44:29 +0000844
drh47394702003-08-20 01:03:33 +0000845/*
846** EXPERIMENTAL - This is not an official function. The interface may
847** change. This function may disappear. Do not write code that depends
848** on this function.
849**
850** Implementation of the QUOTE() function. This function takes a single
851** argument. If the argument is numeric, the return value is the same as
852** the argument. If the argument is NULL, the return value is the string
853** "NULL". Otherwise, the argument is enclosed in single quotes with
854** single-quote escapes.
855*/
danielk19770ae8b832004-05-25 12:05:56 +0000856static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drha0df4cc2009-02-02 17:29:59 +0000857 assert( argc==1 );
drh1d34fde2009-02-03 15:50:33 +0000858 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000859 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000860 case SQLITE_INTEGER:
861 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000862 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000863 break;
864 }
danielk19773f41e972004-06-08 00:39:01 +0000865 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000866 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000867 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000868 int nBlob = sqlite3_value_bytes(argv[0]);
869 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000870 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000871 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000872 int i;
873 for(i=0; i<nBlob; i++){
874 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
875 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
876 }
877 zText[(nBlob*2)+2] = '\'';
878 zText[(nBlob*2)+3] = '\0';
879 zText[0] = 'X';
880 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000881 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000882 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000883 }
884 break;
885 }
drh9c054832004-05-31 18:51:57 +0000886 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000887 int i,j;
888 u64 n;
drh2646da72005-12-09 20:02:05 +0000889 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000890 char *z;
891
drh7a521cf2007-04-25 18:23:52 +0000892 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000893 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000894 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000895 if( z ){
896 z[0] = '\'';
897 for(i=0, j=1; zArg[i]; i++){
898 z[j++] = zArg[i];
899 if( zArg[i]=='\'' ){
900 z[j++] = '\'';
901 }
drhf9b596e2004-05-26 16:54:42 +0000902 }
danielk1977a1644fd2007-08-29 12:31:25 +0000903 z[j++] = '\'';
904 z[j] = 0;
905 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000906 }
drha0df4cc2009-02-02 17:29:59 +0000907 break;
908 }
909 default: {
910 assert( sqlite3_value_type(argv[0])==SQLITE_NULL );
911 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
912 break;
drhf9b596e2004-05-26 16:54:42 +0000913 }
drh47394702003-08-20 01:03:33 +0000914 }
915}
916
drh137c7282007-01-29 17:58:28 +0000917/*
918** The hex() function. Interpret the argument as a blob. Return
919** a hexadecimal rendering as text.
920*/
921static void hexFunc(
922 sqlite3_context *context,
923 int argc,
924 sqlite3_value **argv
925){
926 int i, n;
927 const unsigned char *pBlob;
928 char *zHex, *z;
929 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000930 UNUSED_PARAMETER(argc);
drh1f0feef2007-05-15 13:27:07 +0000931 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000932 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000933 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000934 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000935 if( zHex ){
936 for(i=0; i<n; i++, pBlob++){
937 unsigned char c = *pBlob;
938 *(z++) = hexdigits[(c>>4)&0xf];
939 *(z++) = hexdigits[c&0xf];
940 }
941 *z = 0;
942 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000943 }
drh137c7282007-01-29 17:58:28 +0000944}
945
drh26b6d902007-03-17 13:27:54 +0000946/*
drh8cff3822007-05-02 02:08:28 +0000947** The zeroblob(N) function returns a zero-filled blob of size N bytes.
948*/
949static void zeroblobFunc(
950 sqlite3_context *context,
951 int argc,
952 sqlite3_value **argv
953){
drh98640a32007-06-07 19:08:32 +0000954 i64 n;
drh27e62db2009-04-02 10:16:17 +0000955 sqlite3 *db = sqlite3_context_db_handle(context);
drh8cff3822007-05-02 02:08:28 +0000956 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000957 UNUSED_PARAMETER(argc);
drh98640a32007-06-07 19:08:32 +0000958 n = sqlite3_value_int64(argv[0]);
drh27e62db2009-04-02 10:16:17 +0000959 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH] );
960 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
961 if( n>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drh98640a32007-06-07 19:08:32 +0000962 sqlite3_result_error_toobig(context);
963 }else{
drhab2f1f92010-01-11 18:26:42 +0000964 sqlite3_result_zeroblob(context, (int)n); /* IMP: R-00293-64994 */
drh98640a32007-06-07 19:08:32 +0000965 }
drh8cff3822007-05-02 02:08:28 +0000966}
967
968/*
drh26b6d902007-03-17 13:27:54 +0000969** The replace() function. Three arguments are all strings: call
970** them A, B, and C. The result is also a string which is derived
971** from A by replacing every occurance of B with C. The match
972** must be exact. Collating sequences are not used.
973*/
974static void replaceFunc(
975 sqlite3_context *context,
976 int argc,
977 sqlite3_value **argv
978){
979 const unsigned char *zStr; /* The input string A */
980 const unsigned char *zPattern; /* The pattern string B */
981 const unsigned char *zRep; /* The replacement string C */
982 unsigned char *zOut; /* The output */
983 int nStr; /* Size of zStr */
984 int nPattern; /* Size of zPattern */
985 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000986 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000987 int loopLimit; /* Last zStr[] that might match zPattern[] */
988 int i, j; /* Loop counters */
989
990 assert( argc==3 );
danielk1977f3d3c272008-11-19 16:52:44 +0000991 UNUSED_PARAMETER(argc);
drh26b6d902007-03-17 13:27:54 +0000992 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000993 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000994 nStr = sqlite3_value_bytes(argv[0]);
995 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000996 zPattern = sqlite3_value_text(argv[1]);
drha605fe82009-02-01 18:08:40 +0000997 if( zPattern==0 ){
drh23336062009-02-03 13:19:12 +0000998 assert( sqlite3_value_type(argv[1])==SQLITE_NULL
999 || sqlite3_context_db_handle(context)->mallocFailed );
drha605fe82009-02-01 18:08:40 +00001000 return;
1001 }
1002 if( zPattern[0]==0 ){
1003 assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
1004 sqlite3_result_value(context, argv[0]);
1005 return;
1006 }
drh1f0feef2007-05-15 13:27:07 +00001007 nPattern = sqlite3_value_bytes(argv[1]);
1008 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +00001009 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +00001010 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +00001011 nRep = sqlite3_value_bytes(argv[2]);
1012 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +00001013 nOut = nStr + 1;
1014 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +00001015 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +00001016 if( zOut==0 ){
1017 return;
drh26b6d902007-03-17 13:27:54 +00001018 }
drh26b6d902007-03-17 13:27:54 +00001019 loopLimit = nStr - nPattern;
1020 for(i=j=0; i<=loopLimit; i++){
1021 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
1022 zOut[j++] = zStr[i];
1023 }else{
drh4a50aac2007-08-23 02:47:53 +00001024 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +00001025 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +00001026 nOut += nRep - nPattern;
drh27e62db2009-04-02 10:16:17 +00001027 testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
1028 testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
1029 if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +00001030 sqlite3_result_error_toobig(context);
drhb9755982010-07-24 16:34:37 +00001031 sqlite3_free(zOut);
danielk197717374e82007-05-08 14:39:04 +00001032 return;
1033 }
drh4a50aac2007-08-23 02:47:53 +00001034 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +00001035 zOut = sqlite3_realloc(zOut, (int)nOut);
1036 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +00001037 sqlite3_result_error_nomem(context);
drhb9755982010-07-24 16:34:37 +00001038 sqlite3_free(zOld);
drh2e6400b2007-05-08 15:46:18 +00001039 return;
1040 }
drh26b6d902007-03-17 13:27:54 +00001041 memcpy(&zOut[j], zRep, nRep);
1042 j += nRep;
1043 i += nPattern-1;
1044 }
1045 }
drh2e6400b2007-05-08 15:46:18 +00001046 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +00001047 memcpy(&zOut[j], &zStr[i], nStr-i);
1048 j += nStr - i;
1049 assert( j<=nOut );
1050 zOut[j] = 0;
1051 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
1052}
1053
drh309b3382007-03-17 17:52:42 +00001054/*
1055** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
1056** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
1057*/
1058static void trimFunc(
1059 sqlite3_context *context,
1060 int argc,
1061 sqlite3_value **argv
1062){
1063 const unsigned char *zIn; /* Input string */
1064 const unsigned char *zCharSet; /* Set of characters to trim */
1065 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +00001066 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +00001067 int i; /* Loop counter */
drh1bd10f82008-12-10 21:19:56 +00001068 unsigned char *aLen = 0; /* Length of each character in zCharSet */
1069 unsigned char **azChar = 0; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +00001070 int nChar; /* Number of characters in zCharSet */
1071
drh309b3382007-03-17 17:52:42 +00001072 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
1073 return;
1074 }
1075 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001076 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +00001077 nIn = sqlite3_value_bytes(argv[0]);
1078 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +00001079 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +00001080 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +00001081 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +00001082 nChar = 1;
drh8cff3822007-05-02 02:08:28 +00001083 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +00001084 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +00001085 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +00001086 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +00001087 return;
drhd1e3a612007-04-27 21:59:52 +00001088 }else{
1089 const unsigned char *z;
1090 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +00001091 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +00001092 }
1093 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +00001094 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +00001095 if( azChar==0 ){
1096 return;
1097 }
1098 aLen = (unsigned char*)&azChar[nChar];
1099 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +00001100 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +00001101 SQLITE_SKIP_UTF8(z);
drh3abbd392008-12-10 23:04:13 +00001102 aLen[nChar] = (u8)(z - azChar[nChar]);
drhd1e3a612007-04-27 21:59:52 +00001103 }
1104 }
drh309b3382007-03-17 17:52:42 +00001105 }
drhd1e3a612007-04-27 21:59:52 +00001106 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +00001107 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +00001108 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +00001109 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +00001110 int len = 0;
drhd1e3a612007-04-27 21:59:52 +00001111 for(i=0; i<nChar; i++){
1112 len = aLen[i];
drh27e62db2009-04-02 10:16:17 +00001113 if( len<=nIn && memcmp(zIn, azChar[i], len)==0 ) break;
drhd1e3a612007-04-27 21:59:52 +00001114 }
1115 if( i>=nChar ) break;
1116 zIn += len;
1117 nIn -= len;
drh309b3382007-03-17 17:52:42 +00001118 }
1119 }
1120 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +00001121 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +00001122 int len = 0;
drhd1e3a612007-04-27 21:59:52 +00001123 for(i=0; i<nChar; i++){
1124 len = aLen[i];
1125 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
1126 }
1127 if( i>=nChar ) break;
1128 nIn -= len;
drh309b3382007-03-17 17:52:42 +00001129 }
1130 }
drhd1e3a612007-04-27 21:59:52 +00001131 if( zCharSet ){
1132 sqlite3_free(azChar);
1133 }
drh309b3382007-03-17 17:52:42 +00001134 }
1135 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
1136}
drh26b6d902007-03-17 13:27:54 +00001137
danielk1977a4de4532008-09-02 15:44:08 +00001138
drh2ba3ccc2009-12-08 02:06:08 +00001139/* IMP: R-25361-16150 This function is omitted from SQLite by default. It
1140** is only available if the SQLITE_SOUNDEX compile-time option is used
1141** when SQLite is built.
1142*/
drhd24cc422003-03-27 12:51:24 +00001143#ifdef SQLITE_SOUNDEX
1144/*
1145** Compute the soundex encoding of a word.
drh2ba3ccc2009-12-08 02:06:08 +00001146**
1147** IMP: R-59782-00072 The soundex(X) function returns a string that is the
1148** soundex encoding of the string X.
drhd24cc422003-03-27 12:51:24 +00001149*/
drh137c7282007-01-29 17:58:28 +00001150static void soundexFunc(
1151 sqlite3_context *context,
1152 int argc,
1153 sqlite3_value **argv
1154){
drhd24cc422003-03-27 12:51:24 +00001155 char zResult[8];
drh4c755c02004-08-08 20:22:17 +00001156 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +00001157 int i, j;
1158 static const unsigned char iCode[] = {
1159 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1160 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1161 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1162 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1163 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1164 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1165 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1166 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1167 };
1168 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +00001169 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +00001170 if( zIn==0 ) zIn = (u8*)"";
drhdc86e2b2009-01-24 11:30:42 +00001171 for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
drhd24cc422003-03-27 12:51:24 +00001172 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +00001173 u8 prevcode = iCode[zIn[i]&0x7f];
danielk197778ca0e72009-01-20 16:53:39 +00001174 zResult[0] = sqlite3Toupper(zIn[i]);
drhd24cc422003-03-27 12:51:24 +00001175 for(j=1; j<4 && zIn[i]; i++){
1176 int code = iCode[zIn[i]&0x7f];
1177 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +00001178 if( code!=prevcode ){
1179 prevcode = code;
1180 zResult[j++] = code + '0';
1181 }
1182 }else{
1183 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +00001184 }
1185 }
1186 while( j<4 ){
1187 zResult[j++] = '0';
1188 }
1189 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001190 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +00001191 }else{
drh2ba3ccc2009-12-08 02:06:08 +00001192 /* IMP: R-64894-50321 The string "?000" is returned if the argument
1193 ** is NULL or contains no ASCII alphabetic characters. */
danielk1977d8123362004-06-12 09:25:12 +00001194 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +00001195 }
1196}
drh2ba3ccc2009-12-08 02:06:08 +00001197#endif /* SQLITE_SOUNDEX */
drhd24cc422003-03-27 12:51:24 +00001198
drhfdb83b22006-06-17 14:12:47 +00001199#ifndef SQLITE_OMIT_LOAD_EXTENSION
1200/*
1201** A function that loads a shared-library extension then returns NULL.
1202*/
1203static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001204 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001205 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001206 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001207 char *zErrMsg = 0;
1208
1209 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001210 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001211 }else{
1212 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001213 }
drh7a521cf2007-04-25 18:23:52 +00001214 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001215 sqlite3_result_error(context, zErrMsg, -1);
1216 sqlite3_free(zErrMsg);
1217 }
1218}
1219#endif
1220
danielk197701427a62005-01-11 13:02:33 +00001221
drh0ac65892002-04-20 14:24:41 +00001222/*
drhd3a149e2002-02-24 17:12:53 +00001223** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001224** sum() or avg() aggregate computation.
1225*/
1226typedef struct SumCtx SumCtx;
1227struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001228 double rSum; /* Floating point sum */
1229 i64 iSum; /* Integer sum */
1230 i64 cnt; /* Number of elements summed */
1231 u8 overflow; /* True if integer overflow seen */
1232 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001233};
1234
1235/*
drha97fdd32006-01-12 22:17:50 +00001236** Routines used to compute the sum, average, and total.
1237**
1238** The SUM() function follows the (broken) SQL standard which means
1239** that it returns NULL if it sums over no inputs. TOTAL returns
1240** 0.0 in that case. In addition, TOTAL always returns a float where
1241** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001242** value. TOTAL never fails, but SUM might through an exception if
1243** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001244*/
danielk19770ae8b832004-05-25 12:05:56 +00001245static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001246 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001247 int type;
drh3f219f42005-09-08 19:45:57 +00001248 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001249 UNUSED_PARAMETER(argc);
drh4f26d6c2004-05-26 23:25:30 +00001250 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001251 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001252 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001253 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001254 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001255 i64 v = sqlite3_value_int64(argv[0]);
1256 p->rSum += v;
drh158b9cb2011-03-05 20:59:46 +00001257 if( (p->approx|p->overflow)==0 && sqlite3AddInt64(&p->iSum, v) ){
1258 p->overflow = 1;
drh29d72102006-02-09 22:13:41 +00001259 }
1260 }else{
drh8c08e862006-02-11 17:34:00 +00001261 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001262 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001263 }
drh739105c2002-05-29 23:22:23 +00001264 }
drhdd5baa92002-02-27 19:50:59 +00001265}
danielk19770ae8b832004-05-25 12:05:56 +00001266static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001267 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001268 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001269 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001270 if( p->overflow ){
1271 sqlite3_result_error(context,"integer overflow",-1);
1272 }else if( p->approx ){
1273 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001274 }else{
drh8c08e862006-02-11 17:34:00 +00001275 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001276 }
drh3d1d95e2005-09-08 10:37:01 +00001277 }
drhdd5baa92002-02-27 19:50:59 +00001278}
danielk19770ae8b832004-05-25 12:05:56 +00001279static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001280 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001281 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001282 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001283 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001284 }
1285}
drha97fdd32006-01-12 22:17:50 +00001286static void totalFinalize(sqlite3_context *context){
1287 SumCtx *p;
1288 p = sqlite3_aggregate_context(context, 0);
shanefbd60f82009-02-04 03:59:25 +00001289 /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
1290 sqlite3_result_double(context, p ? p->rSum : (double)0);
drha97fdd32006-01-12 22:17:50 +00001291}
drhdd5baa92002-02-27 19:50:59 +00001292
1293/*
drh0bce8352002-02-28 00:41:10 +00001294** The following structure keeps track of state information for the
1295** count() aggregate function.
1296*/
1297typedef struct CountCtx CountCtx;
1298struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001299 i64 n;
drh0bce8352002-02-28 00:41:10 +00001300};
drhdd5baa92002-02-27 19:50:59 +00001301
drh0bce8352002-02-28 00:41:10 +00001302/*
1303** Routines to implement the count() aggregate function.
1304*/
danielk19770ae8b832004-05-25 12:05:56 +00001305static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001306 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001307 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001308 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001309 p->n++;
1310 }
drh2e79c3d2009-04-08 23:04:14 +00001311
drhd3264c72009-04-15 13:39:47 +00001312#ifndef SQLITE_OMIT_DEPRECATED
drh2e79c3d2009-04-08 23:04:14 +00001313 /* The sqlite3_aggregate_count() function is deprecated. But just to make
1314 ** sure it still operates correctly, verify that its count agrees with our
1315 ** internal count when using count(*) and when the total count can be
1316 ** expressed as a 32-bit integer. */
1317 assert( argc==1 || p==0 || p->n>0x7fffffff
1318 || p->n==sqlite3_aggregate_count(context) );
drhd3264c72009-04-15 13:39:47 +00001319#endif
drh0bce8352002-02-28 00:41:10 +00001320}
danielk19770ae8b832004-05-25 12:05:56 +00001321static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001322 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001323 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001324 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001325}
1326
1327/*
drh0bce8352002-02-28 00:41:10 +00001328** Routines to implement min() and max() aggregate functions.
1329*/
danielk197762c14b32008-11-19 09:05:26 +00001330static void minmaxStep(
1331 sqlite3_context *context,
1332 int NotUsed,
1333 sqlite3_value **argv
1334){
danielk197788208052004-05-25 01:13:20 +00001335 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001336 Mem *pBest;
danielk197762c14b32008-11-19 09:05:26 +00001337 UNUSED_PARAMETER(NotUsed);
drh9eb516c2004-07-18 20:52:32 +00001338
1339 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1340 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001341 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001342
danielk197788208052004-05-25 01:13:20 +00001343 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001344 int max;
1345 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001346 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001347 /* This step function is used for both the min() and max() aggregates,
1348 ** the only difference between the two being that the sense of the
1349 ** comparison is inverted. For the max() aggregate, the
1350 ** sqlite3_user_data() function returns (void *)-1. For min() it
1351 ** returns (void *)db, where db is the sqlite3* database pointer.
1352 ** Therefore the next statement sets variable 'max' to 1 for the max()
1353 ** aggregate, or 0 for min().
1354 */
drh309b3382007-03-17 17:52:42 +00001355 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001356 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001357 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001358 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001359 }
drh268380c2004-02-25 13:47:31 +00001360 }else{
drhb21c8cd2007-08-21 19:33:56 +00001361 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001362 }
1363}
danielk19770ae8b832004-05-25 12:05:56 +00001364static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001365 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001366 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1367 if( pRes ){
drhd27135a2009-04-02 13:36:37 +00001368 if( ALWAYS(pRes->flags) ){
drhabfcea22005-09-06 20:36:48 +00001369 sqlite3_result_value(context, pRes);
1370 }
1371 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001372 }
1373}
drhdd5baa92002-02-27 19:50:59 +00001374
drhb0689692007-11-01 17:38:30 +00001375/*
1376** group_concat(EXPR, ?SEPARATOR?)
1377*/
1378static void groupConcatStep(
1379 sqlite3_context *context,
1380 int argc,
1381 sqlite3_value **argv
1382){
1383 const char *zVal;
drhade86482007-11-28 22:36:40 +00001384 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001385 const char *zSep;
drh07d31172009-02-02 21:57:05 +00001386 int nVal, nSep;
1387 assert( argc==1 || argc==2 );
1388 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001389 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1390
1391 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001392 sqlite3 *db = sqlite3_context_db_handle(context);
drh8bfd7192009-06-19 16:44:41 +00001393 int firstTerm = pAccum->useMalloc==0;
drhb9755982010-07-24 16:34:37 +00001394 pAccum->useMalloc = 2;
drhbb4957f2008-03-20 14:03:29 +00001395 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drh8bfd7192009-06-19 16:44:41 +00001396 if( !firstTerm ){
drh07d31172009-02-02 21:57:05 +00001397 if( argc==2 ){
1398 zSep = (char*)sqlite3_value_text(argv[1]);
1399 nSep = sqlite3_value_bytes(argv[1]);
drhb0689692007-11-01 17:38:30 +00001400 }else{
1401 zSep = ",";
drhade86482007-11-28 22:36:40 +00001402 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001403 }
drhade86482007-11-28 22:36:40 +00001404 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001405 }
drh07d31172009-02-02 21:57:05 +00001406 zVal = (char*)sqlite3_value_text(argv[0]);
1407 nVal = sqlite3_value_bytes(argv[0]);
1408 sqlite3StrAccumAppend(pAccum, zVal, nVal);
drhb0689692007-11-01 17:38:30 +00001409 }
1410}
1411static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001412 StrAccum *pAccum;
1413 pAccum = sqlite3_aggregate_context(context, 0);
1414 if( pAccum ){
1415 if( pAccum->tooBig ){
1416 sqlite3_result_error_toobig(context);
1417 }else if( pAccum->mallocFailed ){
1418 sqlite3_result_error_nomem(context);
1419 }else{
1420 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1421 sqlite3_free);
1422 }
drhb0689692007-11-01 17:38:30 +00001423 }
1424}
drh4e5ffc52004-08-31 00:52:37 +00001425
drhd3a149e2002-02-24 17:12:53 +00001426/*
drha4741842010-04-25 20:58:37 +00001427** This routine does per-connection function registration. Most
1428** of the built-in functions above are part of the global function set.
1429** This routine only deals with those that are not global.
drhdc04c582002-02-24 01:55:15 +00001430*/
drh9bb575f2004-09-06 17:24:11 +00001431void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drha4741842010-04-25 20:58:37 +00001432 int rc = sqlite3_overload_function(db, "MATCH", 2);
1433 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1434 if( rc==SQLITE_NOMEM ){
1435 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001436 }
drh55ef4d92005-08-14 01:20:37 +00001437}
1438
1439/*
1440** Set the LIKEOPT flag on the 2-argument function with the given name.
1441*/
drh1bd10f82008-12-10 21:19:56 +00001442static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
drh55ef4d92005-08-14 01:20:37 +00001443 FuncDef *pDef;
drhea678832008-12-10 19:26:22 +00001444 pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
1445 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001446 if( ALWAYS(pDef) ){
drhd64fe2f2005-08-28 17:00:23 +00001447 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001448 }
1449}
1450
1451/*
1452** Register the built-in LIKE and GLOB functions. The caseSensitive
1453** parameter determines whether or not the LIKE operator is case
1454** sensitive. GLOB is always case sensitive.
1455*/
1456void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1457 struct compareInfo *pInfo;
1458 if( caseSensitive ){
1459 pInfo = (struct compareInfo*)&likeInfoAlt;
1460 }else{
1461 pInfo = (struct compareInfo*)&likeInfoNorm;
1462 }
drh901e9942010-12-15 18:54:37 +00001463 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0);
1464 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0);
1465 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
dand2199f02010-08-27 17:48:52 +00001466 (struct compareInfo*)&globInfo, likeFunc, 0, 0, 0);
drhd64fe2f2005-08-28 17:00:23 +00001467 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1468 setLikeOptFlag(db, "like",
1469 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001470}
1471
1472/*
1473** pExpr points to an expression which implements a function. If
1474** it is appropriate to apply the LIKE optimization to that function
1475** then set aWc[0] through aWc[2] to the wildcard characters and
1476** return TRUE. If the function is not a LIKE-style function then
1477** return FALSE.
1478*/
drhd64fe2f2005-08-28 17:00:23 +00001479int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001480 FuncDef *pDef;
danielk19776ab3a2e2009-02-19 14:39:25 +00001481 if( pExpr->op!=TK_FUNCTION
1482 || !pExpr->x.pList
1483 || pExpr->x.pList->nExpr!=2
1484 ){
drh55ef4d92005-08-14 01:20:37 +00001485 return 0;
1486 }
danielk19776ab3a2e2009-02-19 14:39:25 +00001487 assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
drh33e619f2009-05-28 01:00:55 +00001488 pDef = sqlite3FindFunction(db, pExpr->u.zToken,
1489 sqlite3Strlen30(pExpr->u.zToken),
drhb7916a72009-05-27 10:31:29 +00001490 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001491 if( NEVER(pDef==0) || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001492 return 0;
1493 }
1494
1495 /* The memcpy() statement assumes that the wildcard characters are
1496 ** the first three statements in the compareInfo structure. The
1497 ** asserts() that follow verify that assumption
1498 */
1499 memcpy(aWc, pDef->pUserData, 3);
1500 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1501 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1502 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001503 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001504 return 1;
drhdc04c582002-02-24 01:55:15 +00001505}
danielk19778c0a7912008-08-20 14:49:23 +00001506
drh70a8ca32008-08-21 18:49:27 +00001507/*
drh777c5382008-08-21 20:21:34 +00001508** All all of the FuncDef structures in the aBuiltinFunc[] array above
1509** to the global function hash table. This occurs at start-time (as
1510** a consequence of calling sqlite3_initialize()).
1511**
1512** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001513*/
1514void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001515 /*
1516 ** The following array holds FuncDef structures for all of the functions
1517 ** defined in this file.
1518 **
1519 ** The array cannot be constant since changes are made to the
1520 ** FuncDef.pHash elements at start-time. The elements of this array
1521 ** are read-only after initialization is complete.
1522 */
1523 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1524 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1525 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1526 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1527 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1528 FUNCTION(trim, 1, 3, 0, trimFunc ),
1529 FUNCTION(trim, 2, 3, 0, trimFunc ),
1530 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1531 FUNCTION(min, 0, 0, 1, 0 ),
1532 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1533 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1534 FUNCTION(max, 0, 1, 1, 0 ),
1535 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1536 FUNCTION(typeof, 1, 0, 0, typeofFunc ),
1537 FUNCTION(length, 1, 0, 0, lengthFunc ),
1538 FUNCTION(substr, 2, 0, 0, substrFunc ),
1539 FUNCTION(substr, 3, 0, 0, substrFunc ),
1540 FUNCTION(abs, 1, 0, 0, absFunc ),
shanefbd60f82009-02-04 03:59:25 +00001541#ifndef SQLITE_OMIT_FLOATING_POINT
danielk197793ce7412008-09-01 19:14:02 +00001542 FUNCTION(round, 1, 0, 0, roundFunc ),
1543 FUNCTION(round, 2, 0, 0, roundFunc ),
shanefbd60f82009-02-04 03:59:25 +00001544#endif
danielk197793ce7412008-09-01 19:14:02 +00001545 FUNCTION(upper, 1, 0, 0, upperFunc ),
1546 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1547 FUNCTION(coalesce, 1, 0, 0, 0 ),
danielk197793ce7412008-09-01 19:14:02 +00001548 FUNCTION(coalesce, 0, 0, 0, 0 ),
drhae6bb952009-11-11 00:24:31 +00001549/* FUNCTION(coalesce, -1, 0, 0, ifnullFunc ), */
drh6ac78a02010-09-28 14:26:36 +00001550 {-1,SQLITE_UTF8,SQLITE_FUNC_COALESCE,0,0,ifnullFunc,0,0,"coalesce",0,0},
danielk197793ce7412008-09-01 19:14:02 +00001551 FUNCTION(hex, 1, 0, 0, hexFunc ),
drhae6bb952009-11-11 00:24:31 +00001552/* FUNCTION(ifnull, 2, 0, 0, ifnullFunc ), */
drh6ac78a02010-09-28 14:26:36 +00001553 {2,SQLITE_UTF8,SQLITE_FUNC_COALESCE,0,0,ifnullFunc,0,0,"ifnull",0,0},
drh9373b012009-02-02 01:50:39 +00001554 FUNCTION(random, 0, 0, 0, randomFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001555 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1556 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1557 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
drh47baebc2009-08-14 16:01:24 +00001558 FUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ),
drh3ca84ef2011-04-25 18:03:10 +00001559 FUNCTION(sqlite_log, 2, 0, 0, logFunc ),
shanehdc97a8c2010-02-23 20:08:35 +00001560#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
drh8bb76d32010-02-26 16:37:47 +00001561 FUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc ),
1562 FUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc ),
shanehdc97a8c2010-02-23 20:08:35 +00001563#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
danielk197793ce7412008-09-01 19:14:02 +00001564 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1565 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1566 FUNCTION(changes, 0, 0, 0, changes ),
1567 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1568 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1569 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1570 #ifdef SQLITE_SOUNDEX
1571 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1572 #endif
1573 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1574 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1575 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1576 #endif
1577 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1578 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1579 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
danielk1977a5533162009-02-24 10:01:51 +00001580 /* AGGREGATE(count, 0, 0, 0, countStep, countFinalize ), */
drh6ac78a02010-09-28 14:26:36 +00001581 {0,SQLITE_UTF8,SQLITE_FUNC_COUNT,0,0,0,countStep,countFinalize,"count",0,0},
danielk197793ce7412008-09-01 19:14:02 +00001582 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
drh07d31172009-02-02 21:57:05 +00001583 AGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize),
1584 AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize),
danielk197793ce7412008-09-01 19:14:02 +00001585
1586 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1587 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1588 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1589 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1590 #else
1591 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1592 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1593 #endif
1594 };
1595
drh70a8ca32008-08-21 18:49:27 +00001596 int i;
danielk197793ce7412008-09-01 19:14:02 +00001597 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001598 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001599
drh70a8ca32008-08-21 18:49:27 +00001600 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001601 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001602 }
drh777c5382008-08-21 20:21:34 +00001603 sqlite3RegisterDateTimeFunctions();
drh545f5872010-04-24 14:02:59 +00001604#ifndef SQLITE_OMIT_ALTERTABLE
1605 sqlite3AlterFunctions();
1606#endif
drh70a8ca32008-08-21 18:49:27 +00001607}