blob: 3227dca3f7c075e6f0ca7b3d7106bf8cfad73636 [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]);
drh50d654d2009-06-03 01:24:54 +0000274 zBuf = sqlite3_mprintf("%.*f",n,r);
275 if( zBuf==0 ){
276 sqlite3_result_error_nomem(context);
277 }else{
278 sqlite3AtoF(zBuf, &r);
279 sqlite3_free(zBuf);
280 sqlite3_result_double(context, r);
281 }
drh0bce8352002-02-28 00:41:10 +0000282}
shanefbd60f82009-02-04 03:59:25 +0000283#endif
drhdc04c582002-02-24 01:55:15 +0000284
danielk197726783a52007-08-29 14:06:22 +0000285/*
286** Allocate nByte bytes of space using sqlite3_malloc(). If the
287** allocation fails, call sqlite3_result_error_nomem() to notify
drh27e62db2009-04-02 10:16:17 +0000288** the database handle that malloc() has failed and return NULL.
289** If nByte is larger than the maximum string or blob length, then
290** raise an SQLITE_TOOBIG exception and return NULL.
danielk197726783a52007-08-29 14:06:22 +0000291*/
drhb1a6c3c2008-03-20 16:30:17 +0000292static void *contextMalloc(sqlite3_context *context, i64 nByte){
drhbb4957f2008-03-20 14:03:29 +0000293 char *z;
drh27e62db2009-04-02 10:16:17 +0000294 sqlite3 *db = sqlite3_context_db_handle(context);
drhef31c6a2009-04-02 09:07:12 +0000295 assert( nByte>0 );
drh27e62db2009-04-02 10:16:17 +0000296 testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] );
297 testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
298 if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drhbb4957f2008-03-20 14:03:29 +0000299 sqlite3_result_error_toobig(context);
300 z = 0;
301 }else{
drh1bd10f82008-12-10 21:19:56 +0000302 z = sqlite3Malloc((int)nByte);
drhef31c6a2009-04-02 09:07:12 +0000303 if( !z ){
drhbb4957f2008-03-20 14:03:29 +0000304 sqlite3_result_error_nomem(context);
305 }
danielk1977a1644fd2007-08-29 12:31:25 +0000306 }
307 return z;
308}
309
drhdc04c582002-02-24 01:55:15 +0000310/*
311** Implementation of the upper() and lower() SQL functions.
312*/
danielk19770ae8b832004-05-25 12:05:56 +0000313static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000314 char *z1;
315 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000316 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000317 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000318 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000319 n = sqlite3_value_bytes(argv[0]);
320 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
321 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000322 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000323 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000324 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000325 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000326 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000327 z1[i] = (char)sqlite3Toupper(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000328 }
329 sqlite3_result_text(context, z1, -1, sqlite3_free);
330 }
drhdc04c582002-02-24 01:55:15 +0000331 }
332}
danielk19770ae8b832004-05-25 12:05:56 +0000333static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197778ca0e72009-01-20 16:53:39 +0000334 u8 *z1;
drh7a521cf2007-04-25 18:23:52 +0000335 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000336 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000337 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000338 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000339 n = sqlite3_value_bytes(argv[0]);
340 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
341 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000342 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000343 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000344 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000345 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000346 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000347 z1[i] = sqlite3Tolower(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000348 }
danielk197778ca0e72009-01-20 16:53:39 +0000349 sqlite3_result_text(context, (char *)z1, -1, sqlite3_free);
drh7a521cf2007-04-25 18:23:52 +0000350 }
drhdc04c582002-02-24 01:55:15 +0000351 }
352}
353
drhae6bb952009-11-11 00:24:31 +0000354
355#if 0 /* This function is never used. */
356/*
357** The COALESCE() and IFNULL() functions used to be implemented as shown
358** here. But now they are implemented as VDBE code so that unused arguments
359** do not have to be computed. This legacy implementation is retained as
360** comment.
361*/
drhdc04c582002-02-24 01:55:15 +0000362/*
drhfbc99082002-02-28 03:14:18 +0000363** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000364** All three do the same thing. They return the first non-NULL
365** argument.
drh3212e182002-02-28 00:46:26 +0000366*/
drhf9b596e2004-05-26 16:54:42 +0000367static void ifnullFunc(
368 sqlite3_context *context,
369 int argc,
370 sqlite3_value **argv
371){
drhfbc99082002-02-28 03:14:18 +0000372 int i;
373 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000374 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000375 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000376 break;
377 }
378 }
drh3212e182002-02-28 00:46:26 +0000379}
drhae6bb952009-11-11 00:24:31 +0000380#endif /* NOT USED */
381#define ifnullFunc versionFunc /* Substitute function - never called */
drh3212e182002-02-28 00:46:26 +0000382
383/*
drhf9ffac92002-03-02 19:00:31 +0000384** Implementation of random(). Return a random integer.
385*/
drhf9b596e2004-05-26 16:54:42 +0000386static void randomFunc(
387 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000388 int NotUsed,
389 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000390){
drh52fc8492006-02-23 21:43:55 +0000391 sqlite_int64 r;
danielk197762c14b32008-11-19 09:05:26 +0000392 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drh2fa18682008-03-19 14:15:34 +0000393 sqlite3_randomness(sizeof(r), &r);
drh3034e3d2009-04-02 14:05:21 +0000394 if( r<0 ){
395 /* We need to prevent a random number of 0x8000000000000000
396 ** (or -9223372036854775808) since when you do abs() of that
397 ** number of you get the same value back again. To do this
398 ** in a way that is testable, mask the sign bit off of negative
399 ** values, resulting in a positive value. Then take the
400 ** 2s complement of that positive value. The end result can
401 ** therefore be no less than -9223372036854775807.
402 */
403 r = -(r ^ (((sqlite3_int64)1)<<63));
404 }
drh52fc8492006-02-23 21:43:55 +0000405 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000406}
407
408/*
drh137c7282007-01-29 17:58:28 +0000409** Implementation of randomblob(N). Return a random blob
410** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000411*/
drh137c7282007-01-29 17:58:28 +0000412static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000413 sqlite3_context *context,
414 int argc,
415 sqlite3_value **argv
416){
drh137c7282007-01-29 17:58:28 +0000417 int n;
418 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000419 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000420 UNUSED_PARAMETER(argc);
drh63cf66f2007-01-29 15:50:05 +0000421 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000422 if( n<1 ){
423 n = 1;
424 }
danielk1977a1644fd2007-08-29 12:31:25 +0000425 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000426 if( p ){
drh2fa18682008-03-19 14:15:34 +0000427 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000428 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000429 }
drh63cf66f2007-01-29 15:50:05 +0000430}
431
432/*
drh6ed41ad2002-04-06 14:10:47 +0000433** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000434** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000435*/
danielk197751ad0ec2004-05-24 12:39:02 +0000436static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000437 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000438 int NotUsed,
439 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000440){
drhfa4a4b92008-03-19 21:45:51 +0000441 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000442 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf9b596e2004-05-26 16:54:42 +0000443 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000444}
445
rdcf146a772004-02-25 22:51:06 +0000446/*
danielk1977b28af712004-06-21 06:50:26 +0000447** Implementation of the changes() SQL function. The return value is the
448** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000449*/
danielk1977b28af712004-06-21 06:50:26 +0000450static void changes(
drhf9b596e2004-05-26 16:54:42 +0000451 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000452 int NotUsed,
453 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000454){
drhfa4a4b92008-03-19 21:45:51 +0000455 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000456 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf4479502004-05-27 03:12:53 +0000457 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000458}
rdcf146a772004-02-25 22:51:06 +0000459
460/*
danielk1977b28af712004-06-21 06:50:26 +0000461** Implementation of the total_changes() SQL function. The return value is
462** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000463*/
danielk1977b28af712004-06-21 06:50:26 +0000464static void total_changes(
465 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000466 int NotUsed,
467 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000468){
drhfa4a4b92008-03-19 21:45:51 +0000469 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000470 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977b28af712004-06-21 06:50:26 +0000471 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000472}
473
drh6ed41ad2002-04-06 14:10:47 +0000474/*
drh4e5ffc52004-08-31 00:52:37 +0000475** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000476*/
drh4e5ffc52004-08-31 00:52:37 +0000477struct compareInfo {
478 u8 matchAll;
479 u8 matchOne;
480 u8 matchSet;
481 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000482};
drh55ef4d92005-08-14 01:20:37 +0000483
drhb9175ae2007-12-07 18:39:04 +0000484/*
485** For LIKE and GLOB matching on EBCDIC machines, assume that every
486** character is exactly one byte in size. Also, all characters are
487** able to participate in upper-case-to-lower-case mappings in EBCDIC
488** whereas only characters less than 0x80 do in ASCII.
489*/
490#if defined(SQLITE_EBCDIC)
drh769e97e2009-04-01 16:33:37 +0000491# define sqlite3Utf8Read(A,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000492# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000493#else
drh6ed4b782007-12-10 18:07:20 +0000494# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000495#endif
496
drh4e5ffc52004-08-31 00:52:37 +0000497static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000498/* The correct SQL-92 behavior is for the LIKE operator to ignore
499** case. Thus 'a' LIKE 'A' would be true. */
500static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
501/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
502** is case sensitive causing 'a' LIKE 'A' to be false */
503static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000504
505/*
drh4e5ffc52004-08-31 00:52:37 +0000506** Compare two UTF-8 strings for equality where the first string can
507** potentially be a "glob" expression. Return true (1) if they
508** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000509**
drh4e5ffc52004-08-31 00:52:37 +0000510** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000511**
drh4e5ffc52004-08-31 00:52:37 +0000512** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000513**
drh4e5ffc52004-08-31 00:52:37 +0000514** '?' Matches exactly one character.
515**
516** [...] Matches one character from the enclosed list of
517** characters.
518**
519** [^...] Matches one character not in the enclosed list.
520**
521** With the [...] and [^...] matching, a ']' character can be included
522** in the list by making it the first character after '[' or '^'. A
523** range of characters can be specified using '-'. Example:
524** "[a-z]" matches any single lower-case letter. To match a '-', make
525** it the last character in the list.
526**
527** This routine is usually quick, but can be N**2 in the worst case.
528**
529** Hints: to match '*' or '?', put them in "[]". Like this:
530**
531** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000532*/
danielk19777c6303c2004-11-17 16:41:29 +0000533static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000534 const u8 *zPattern, /* The glob pattern */
535 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000536 const struct compareInfo *pInfo, /* Information about how to do the compare */
537 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000538){
drh66150952007-07-23 19:12:41 +0000539 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000540 int invert;
541 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000542 u8 matchOne = pInfo->matchOne;
543 u8 matchAll = pInfo->matchAll;
544 u8 matchSet = pInfo->matchSet;
545 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000546 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000547
drh769e97e2009-04-01 16:33:37 +0000548 while( (c = sqlite3Utf8Read(zPattern,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000549 if( !prevEscape && c==matchAll ){
drh769e97e2009-04-01 16:33:37 +0000550 while( (c=sqlite3Utf8Read(zPattern,&zPattern)) == matchAll
drh66150952007-07-23 19:12:41 +0000551 || c == matchOne ){
drh769e97e2009-04-01 16:33:37 +0000552 if( c==matchOne && sqlite3Utf8Read(zString, &zString)==0 ){
drh66150952007-07-23 19:12:41 +0000553 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000554 }
danielk1977ad7dd422004-06-06 12:41:49 +0000555 }
drh66150952007-07-23 19:12:41 +0000556 if( c==0 ){
557 return 1;
558 }else if( c==esc ){
drh769e97e2009-04-01 16:33:37 +0000559 c = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000560 if( c==0 ){
561 return 0;
562 }
563 }else if( c==matchSet ){
564 assert( esc==0 ); /* This is GLOB, not LIKE */
565 assert( matchSet<0x80 ); /* '[' is a single-byte character */
566 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000567 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000568 }
569 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000570 }
drh769e97e2009-04-01 16:33:37 +0000571 while( (c2 = sqlite3Utf8Read(zString,&zString))!=0 ){
drh66150952007-07-23 19:12:41 +0000572 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000573 GlogUpperToLower(c2);
574 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000575 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000576 c2 = sqlite3Utf8Read(zString, &zString);
drh6ed4b782007-12-10 18:07:20 +0000577 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000578 }
drh66150952007-07-23 19:12:41 +0000579 }else{
580 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000581 c2 = sqlite3Utf8Read(zString, &zString);
drh66150952007-07-23 19:12:41 +0000582 }
drh4e5ffc52004-08-31 00:52:37 +0000583 }
drh66150952007-07-23 19:12:41 +0000584 if( c2==0 ) return 0;
585 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
586 }
587 return 0;
588 }else if( !prevEscape && c==matchOne ){
drh769e97e2009-04-01 16:33:37 +0000589 if( sqlite3Utf8Read(zString, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000590 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000591 }
drh4e5ffc52004-08-31 00:52:37 +0000592 }else if( c==matchSet ){
593 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000594 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000595 seen = 0;
596 invert = 0;
drh769e97e2009-04-01 16:33:37 +0000597 c = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000598 if( c==0 ) return 0;
drh769e97e2009-04-01 16:33:37 +0000599 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000600 if( c2=='^' ){
601 invert = 1;
drh769e97e2009-04-01 16:33:37 +0000602 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000603 }
drh4e5ffc52004-08-31 00:52:37 +0000604 if( c2==']' ){
605 if( c==']' ) seen = 1;
drh769e97e2009-04-01 16:33:37 +0000606 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000607 }
drh66150952007-07-23 19:12:41 +0000608 while( c2 && c2!=']' ){
609 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
drh769e97e2009-04-01 16:33:37 +0000610 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000611 if( c>=prior_c && c<=c2 ) seen = 1;
612 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000613 }else{
drh66150952007-07-23 19:12:41 +0000614 if( c==c2 ){
615 seen = 1;
616 }
drh4e5ffc52004-08-31 00:52:37 +0000617 prior_c = c2;
618 }
drh769e97e2009-04-01 16:33:37 +0000619 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000620 }
drh66150952007-07-23 19:12:41 +0000621 if( c2==0 || (seen ^ invert)==0 ){
622 return 0;
623 }
624 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000625 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000626 }else{
drh769e97e2009-04-01 16:33:37 +0000627 c2 = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000628 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000629 GlogUpperToLower(c);
630 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000631 }
drh66150952007-07-23 19:12:41 +0000632 if( c!=c2 ){
633 return 0;
634 }
danielk19777c6303c2004-11-17 16:41:29 +0000635 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000636 }
danielk197751ad0ec2004-05-24 12:39:02 +0000637 }
drh4e5ffc52004-08-31 00:52:37 +0000638 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000639}
drh4e5ffc52004-08-31 00:52:37 +0000640
drh55ef4d92005-08-14 01:20:37 +0000641/*
642** Count the number of times that the LIKE operator (or GLOB which is
643** just a variation of LIKE) gets called. This is used for testing
644** only.
645*/
646#ifdef SQLITE_TEST
647int sqlite3_like_count = 0;
648#endif
649
danielk19773f6b0872004-06-17 05:36:44 +0000650
651/*
652** Implementation of the like() SQL function. This function implements
653** the build-in LIKE operator. The first argument to the function is the
654** pattern and the second argument is the string. So, the SQL statements:
655**
656** A LIKE B
657**
658** is implemented as like(B,A).
659**
drh55ef4d92005-08-14 01:20:37 +0000660** This same function (with a different compareInfo structure) computes
661** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000662*/
663static void likeFunc(
664 sqlite3_context *context,
665 int argc,
666 sqlite3_value **argv
667){
drhbeb818d2007-05-08 15:34:47 +0000668 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000669 int escape = 0;
drh27e62db2009-04-02 10:16:17 +0000670 int nPat;
drhbb4957f2008-03-20 14:03:29 +0000671 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000672
drh1f0feef2007-05-15 13:27:07 +0000673 zB = sqlite3_value_text(argv[0]);
674 zA = sqlite3_value_text(argv[1]);
675
drhbeb818d2007-05-08 15:34:47 +0000676 /* Limit the length of the LIKE or GLOB pattern to avoid problems
677 ** of deep recursion and N*N behavior in patternCompare().
678 */
drh27e62db2009-04-02 10:16:17 +0000679 nPat = sqlite3_value_bytes(argv[0]);
680 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] );
681 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 );
682 if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000683 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
684 return;
685 }
drh1f0feef2007-05-15 13:27:07 +0000686 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000687
danielk19777c6303c2004-11-17 16:41:29 +0000688 if( argc==3 ){
689 /* The escape character string must consist of a single UTF-8 character.
690 ** Otherwise, return an error.
691 */
692 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000693 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000694 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000695 sqlite3_result_error(context,
696 "ESCAPE expression must be a single character", -1);
697 return;
698 }
drh769e97e2009-04-01 16:33:37 +0000699 escape = sqlite3Utf8Read(zEsc, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000700 }
danielk19773f6b0872004-06-17 05:36:44 +0000701 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000702 struct compareInfo *pInfo = sqlite3_user_data(context);
703#ifdef SQLITE_TEST
704 sqlite3_like_count++;
705#endif
drhbeb818d2007-05-08 15:34:47 +0000706
danielk1977b56fe1f2007-05-09 08:24:44 +0000707 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000708 }
drh8912d102002-05-26 21:34:58 +0000709}
710
711/*
712** Implementation of the NULLIF(x,y) function. The result is the first
713** argument if the arguments are different. The result is NULL if the
714** arguments are equal to each other.
715*/
drhf9b596e2004-05-26 16:54:42 +0000716static void nullifFunc(
717 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000718 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +0000719 sqlite3_value **argv
720){
danielk1977dc1bdc42004-06-11 10:51:27 +0000721 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk197762c14b32008-11-19 09:05:26 +0000722 UNUSED_PARAMETER(NotUsed);
danielk1977dc1bdc42004-06-11 10:51:27 +0000723 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000724 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000725 }
drh0ac65892002-04-20 14:24:41 +0000726}
727
drh647cb0e2002-11-04 19:32:25 +0000728/*
drh47baebc2009-08-14 16:01:24 +0000729** Implementation of the sqlite_version() function. The result is the version
drh647cb0e2002-11-04 19:32:25 +0000730** of the SQLite library that is running.
731*/
drhf9b596e2004-05-26 16:54:42 +0000732static void versionFunc(
733 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000734 int NotUsed,
735 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000736){
danielk197762c14b32008-11-19 09:05:26 +0000737 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977d8123362004-06-12 09:25:12 +0000738 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000739}
740
drh47baebc2009-08-14 16:01:24 +0000741/*
742** Implementation of the sqlite_source_id() function. The result is a string
743** that identifies the particular version of the source code used to build
744** SQLite.
745*/
746static void sourceidFunc(
747 sqlite3_context *context,
748 int NotUsed,
749 sqlite3_value **NotUsed2
750){
751 UNUSED_PARAMETER2(NotUsed, NotUsed2);
752 sqlite3_result_text(context, SQLITE_SOURCE_ID, -1, SQLITE_STATIC);
753}
754
drh137c7282007-01-29 17:58:28 +0000755/* Array for converting from half-bytes (nybbles) into ASCII hex
756** digits. */
757static const char hexdigits[] = {
758 '0', '1', '2', '3', '4', '5', '6', '7',
759 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
760};
danielk1977d641d642004-11-18 15:44:29 +0000761
drh47394702003-08-20 01:03:33 +0000762/*
763** EXPERIMENTAL - This is not an official function. The interface may
764** change. This function may disappear. Do not write code that depends
765** on this function.
766**
767** Implementation of the QUOTE() function. This function takes a single
768** argument. If the argument is numeric, the return value is the same as
769** the argument. If the argument is NULL, the return value is the string
770** "NULL". Otherwise, the argument is enclosed in single quotes with
771** single-quote escapes.
772*/
danielk19770ae8b832004-05-25 12:05:56 +0000773static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drha0df4cc2009-02-02 17:29:59 +0000774 assert( argc==1 );
drh1d34fde2009-02-03 15:50:33 +0000775 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000776 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000777 case SQLITE_INTEGER:
778 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000779 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000780 break;
781 }
danielk19773f41e972004-06-08 00:39:01 +0000782 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000783 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000784 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000785 int nBlob = sqlite3_value_bytes(argv[0]);
786 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000787 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000788 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000789 int i;
790 for(i=0; i<nBlob; i++){
791 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
792 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
793 }
794 zText[(nBlob*2)+2] = '\'';
795 zText[(nBlob*2)+3] = '\0';
796 zText[0] = 'X';
797 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000798 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000799 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000800 }
801 break;
802 }
drh9c054832004-05-31 18:51:57 +0000803 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000804 int i,j;
805 u64 n;
drh2646da72005-12-09 20:02:05 +0000806 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000807 char *z;
808
drh7a521cf2007-04-25 18:23:52 +0000809 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000810 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000811 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000812 if( z ){
813 z[0] = '\'';
814 for(i=0, j=1; zArg[i]; i++){
815 z[j++] = zArg[i];
816 if( zArg[i]=='\'' ){
817 z[j++] = '\'';
818 }
drhf9b596e2004-05-26 16:54:42 +0000819 }
danielk1977a1644fd2007-08-29 12:31:25 +0000820 z[j++] = '\'';
821 z[j] = 0;
822 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000823 }
drha0df4cc2009-02-02 17:29:59 +0000824 break;
825 }
826 default: {
827 assert( sqlite3_value_type(argv[0])==SQLITE_NULL );
828 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
829 break;
drhf9b596e2004-05-26 16:54:42 +0000830 }
drh47394702003-08-20 01:03:33 +0000831 }
832}
833
drh137c7282007-01-29 17:58:28 +0000834/*
835** The hex() function. Interpret the argument as a blob. Return
836** a hexadecimal rendering as text.
837*/
838static void hexFunc(
839 sqlite3_context *context,
840 int argc,
841 sqlite3_value **argv
842){
843 int i, n;
844 const unsigned char *pBlob;
845 char *zHex, *z;
846 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000847 UNUSED_PARAMETER(argc);
drh1f0feef2007-05-15 13:27:07 +0000848 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000849 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000850 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000851 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000852 if( zHex ){
853 for(i=0; i<n; i++, pBlob++){
854 unsigned char c = *pBlob;
855 *(z++) = hexdigits[(c>>4)&0xf];
856 *(z++) = hexdigits[c&0xf];
857 }
858 *z = 0;
859 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000860 }
drh137c7282007-01-29 17:58:28 +0000861}
862
drh26b6d902007-03-17 13:27:54 +0000863/*
drh8cff3822007-05-02 02:08:28 +0000864** The zeroblob(N) function returns a zero-filled blob of size N bytes.
865*/
866static void zeroblobFunc(
867 sqlite3_context *context,
868 int argc,
869 sqlite3_value **argv
870){
drh98640a32007-06-07 19:08:32 +0000871 i64 n;
drh27e62db2009-04-02 10:16:17 +0000872 sqlite3 *db = sqlite3_context_db_handle(context);
drh8cff3822007-05-02 02:08:28 +0000873 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000874 UNUSED_PARAMETER(argc);
drh98640a32007-06-07 19:08:32 +0000875 n = sqlite3_value_int64(argv[0]);
drh27e62db2009-04-02 10:16:17 +0000876 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH] );
877 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
878 if( n>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drh98640a32007-06-07 19:08:32 +0000879 sqlite3_result_error_toobig(context);
880 }else{
drh1bd10f82008-12-10 21:19:56 +0000881 sqlite3_result_zeroblob(context, (int)n);
drh98640a32007-06-07 19:08:32 +0000882 }
drh8cff3822007-05-02 02:08:28 +0000883}
884
885/*
drh26b6d902007-03-17 13:27:54 +0000886** The replace() function. Three arguments are all strings: call
887** them A, B, and C. The result is also a string which is derived
888** from A by replacing every occurance of B with C. The match
889** must be exact. Collating sequences are not used.
890*/
891static void replaceFunc(
892 sqlite3_context *context,
893 int argc,
894 sqlite3_value **argv
895){
896 const unsigned char *zStr; /* The input string A */
897 const unsigned char *zPattern; /* The pattern string B */
898 const unsigned char *zRep; /* The replacement string C */
899 unsigned char *zOut; /* The output */
900 int nStr; /* Size of zStr */
901 int nPattern; /* Size of zPattern */
902 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000903 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000904 int loopLimit; /* Last zStr[] that might match zPattern[] */
905 int i, j; /* Loop counters */
906
907 assert( argc==3 );
danielk1977f3d3c272008-11-19 16:52:44 +0000908 UNUSED_PARAMETER(argc);
drh26b6d902007-03-17 13:27:54 +0000909 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000910 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000911 nStr = sqlite3_value_bytes(argv[0]);
912 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000913 zPattern = sqlite3_value_text(argv[1]);
drha605fe82009-02-01 18:08:40 +0000914 if( zPattern==0 ){
drh23336062009-02-03 13:19:12 +0000915 assert( sqlite3_value_type(argv[1])==SQLITE_NULL
916 || sqlite3_context_db_handle(context)->mallocFailed );
drha605fe82009-02-01 18:08:40 +0000917 return;
918 }
919 if( zPattern[0]==0 ){
920 assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
921 sqlite3_result_value(context, argv[0]);
922 return;
923 }
drh1f0feef2007-05-15 13:27:07 +0000924 nPattern = sqlite3_value_bytes(argv[1]);
925 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000926 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000927 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000928 nRep = sqlite3_value_bytes(argv[2]);
929 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000930 nOut = nStr + 1;
931 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +0000932 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +0000933 if( zOut==0 ){
934 return;
drh26b6d902007-03-17 13:27:54 +0000935 }
drh26b6d902007-03-17 13:27:54 +0000936 loopLimit = nStr - nPattern;
937 for(i=j=0; i<=loopLimit; i++){
938 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
939 zOut[j++] = zStr[i];
940 }else{
drh4a50aac2007-08-23 02:47:53 +0000941 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +0000942 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +0000943 nOut += nRep - nPattern;
drh27e62db2009-04-02 10:16:17 +0000944 testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
945 testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
946 if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +0000947 sqlite3_result_error_toobig(context);
drh633e6d52008-07-28 19:34:53 +0000948 sqlite3DbFree(db, zOut);
danielk197717374e82007-05-08 14:39:04 +0000949 return;
950 }
drh4a50aac2007-08-23 02:47:53 +0000951 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000952 zOut = sqlite3_realloc(zOut, (int)nOut);
953 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000954 sqlite3_result_error_nomem(context);
drh633e6d52008-07-28 19:34:53 +0000955 sqlite3DbFree(db, zOld);
drh2e6400b2007-05-08 15:46:18 +0000956 return;
957 }
drh26b6d902007-03-17 13:27:54 +0000958 memcpy(&zOut[j], zRep, nRep);
959 j += nRep;
960 i += nPattern-1;
961 }
962 }
drh2e6400b2007-05-08 15:46:18 +0000963 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000964 memcpy(&zOut[j], &zStr[i], nStr-i);
965 j += nStr - i;
966 assert( j<=nOut );
967 zOut[j] = 0;
968 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
969}
970
drh309b3382007-03-17 17:52:42 +0000971/*
972** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
973** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
974*/
975static void trimFunc(
976 sqlite3_context *context,
977 int argc,
978 sqlite3_value **argv
979){
980 const unsigned char *zIn; /* Input string */
981 const unsigned char *zCharSet; /* Set of characters to trim */
982 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +0000983 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +0000984 int i; /* Loop counter */
drh1bd10f82008-12-10 21:19:56 +0000985 unsigned char *aLen = 0; /* Length of each character in zCharSet */
986 unsigned char **azChar = 0; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000987 int nChar; /* Number of characters in zCharSet */
988
drh309b3382007-03-17 17:52:42 +0000989 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
990 return;
991 }
992 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000993 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000994 nIn = sqlite3_value_bytes(argv[0]);
995 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000996 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000997 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +0000998 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000999 nChar = 1;
drh8cff3822007-05-02 02:08:28 +00001000 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +00001001 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +00001002 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +00001003 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +00001004 return;
drhd1e3a612007-04-27 21:59:52 +00001005 }else{
1006 const unsigned char *z;
1007 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +00001008 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +00001009 }
1010 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +00001011 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +00001012 if( azChar==0 ){
1013 return;
1014 }
1015 aLen = (unsigned char*)&azChar[nChar];
1016 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +00001017 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +00001018 SQLITE_SKIP_UTF8(z);
drh3abbd392008-12-10 23:04:13 +00001019 aLen[nChar] = (u8)(z - azChar[nChar]);
drhd1e3a612007-04-27 21:59:52 +00001020 }
1021 }
drh309b3382007-03-17 17:52:42 +00001022 }
drhd1e3a612007-04-27 21:59:52 +00001023 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +00001024 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +00001025 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +00001026 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +00001027 int len = 0;
drhd1e3a612007-04-27 21:59:52 +00001028 for(i=0; i<nChar; i++){
1029 len = aLen[i];
drh27e62db2009-04-02 10:16:17 +00001030 if( len<=nIn && memcmp(zIn, azChar[i], len)==0 ) break;
drhd1e3a612007-04-27 21:59:52 +00001031 }
1032 if( i>=nChar ) break;
1033 zIn += len;
1034 nIn -= len;
drh309b3382007-03-17 17:52:42 +00001035 }
1036 }
1037 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +00001038 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +00001039 int len = 0;
drhd1e3a612007-04-27 21:59:52 +00001040 for(i=0; i<nChar; i++){
1041 len = aLen[i];
1042 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
1043 }
1044 if( i>=nChar ) break;
1045 nIn -= len;
drh309b3382007-03-17 17:52:42 +00001046 }
1047 }
drhd1e3a612007-04-27 21:59:52 +00001048 if( zCharSet ){
1049 sqlite3_free(azChar);
1050 }
drh309b3382007-03-17 17:52:42 +00001051 }
1052 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
1053}
drh26b6d902007-03-17 13:27:54 +00001054
danielk1977a4de4532008-09-02 15:44:08 +00001055
drh2ba3ccc2009-12-08 02:06:08 +00001056/* IMP: R-25361-16150 This function is omitted from SQLite by default. It
1057** is only available if the SQLITE_SOUNDEX compile-time option is used
1058** when SQLite is built.
1059*/
drhd24cc422003-03-27 12:51:24 +00001060#ifdef SQLITE_SOUNDEX
1061/*
1062** Compute the soundex encoding of a word.
drh2ba3ccc2009-12-08 02:06:08 +00001063**
1064** IMP: R-59782-00072 The soundex(X) function returns a string that is the
1065** soundex encoding of the string X.
drhd24cc422003-03-27 12:51:24 +00001066*/
drh137c7282007-01-29 17:58:28 +00001067static void soundexFunc(
1068 sqlite3_context *context,
1069 int argc,
1070 sqlite3_value **argv
1071){
drhd24cc422003-03-27 12:51:24 +00001072 char zResult[8];
drh4c755c02004-08-08 20:22:17 +00001073 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +00001074 int i, j;
1075 static const unsigned char iCode[] = {
1076 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1077 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1078 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1079 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1080 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1081 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1082 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1083 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1084 };
1085 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +00001086 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +00001087 if( zIn==0 ) zIn = (u8*)"";
drhdc86e2b2009-01-24 11:30:42 +00001088 for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
drhd24cc422003-03-27 12:51:24 +00001089 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +00001090 u8 prevcode = iCode[zIn[i]&0x7f];
danielk197778ca0e72009-01-20 16:53:39 +00001091 zResult[0] = sqlite3Toupper(zIn[i]);
drhd24cc422003-03-27 12:51:24 +00001092 for(j=1; j<4 && zIn[i]; i++){
1093 int code = iCode[zIn[i]&0x7f];
1094 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +00001095 if( code!=prevcode ){
1096 prevcode = code;
1097 zResult[j++] = code + '0';
1098 }
1099 }else{
1100 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +00001101 }
1102 }
1103 while( j<4 ){
1104 zResult[j++] = '0';
1105 }
1106 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001107 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +00001108 }else{
drh2ba3ccc2009-12-08 02:06:08 +00001109 /* IMP: R-64894-50321 The string "?000" is returned if the argument
1110 ** is NULL or contains no ASCII alphabetic characters. */
danielk1977d8123362004-06-12 09:25:12 +00001111 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +00001112 }
1113}
drh2ba3ccc2009-12-08 02:06:08 +00001114#endif /* SQLITE_SOUNDEX */
drhd24cc422003-03-27 12:51:24 +00001115
drhfdb83b22006-06-17 14:12:47 +00001116#ifndef SQLITE_OMIT_LOAD_EXTENSION
1117/*
1118** A function that loads a shared-library extension then returns NULL.
1119*/
1120static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001121 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001122 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001123 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001124 char *zErrMsg = 0;
1125
1126 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001127 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001128 }else{
1129 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001130 }
drh7a521cf2007-04-25 18:23:52 +00001131 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001132 sqlite3_result_error(context, zErrMsg, -1);
1133 sqlite3_free(zErrMsg);
1134 }
1135}
1136#endif
1137
danielk197701427a62005-01-11 13:02:33 +00001138
drh0ac65892002-04-20 14:24:41 +00001139/*
drhd3a149e2002-02-24 17:12:53 +00001140** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001141** sum() or avg() aggregate computation.
1142*/
1143typedef struct SumCtx SumCtx;
1144struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001145 double rSum; /* Floating point sum */
1146 i64 iSum; /* Integer sum */
1147 i64 cnt; /* Number of elements summed */
1148 u8 overflow; /* True if integer overflow seen */
1149 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001150};
1151
1152/*
drha97fdd32006-01-12 22:17:50 +00001153** Routines used to compute the sum, average, and total.
1154**
1155** The SUM() function follows the (broken) SQL standard which means
1156** that it returns NULL if it sums over no inputs. TOTAL returns
1157** 0.0 in that case. In addition, TOTAL always returns a float where
1158** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001159** value. TOTAL never fails, but SUM might through an exception if
1160** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001161*/
danielk19770ae8b832004-05-25 12:05:56 +00001162static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001163 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001164 int type;
drh3f219f42005-09-08 19:45:57 +00001165 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001166 UNUSED_PARAMETER(argc);
drh4f26d6c2004-05-26 23:25:30 +00001167 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001168 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001169 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001170 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001171 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001172 i64 v = sqlite3_value_int64(argv[0]);
1173 p->rSum += v;
1174 if( (p->approx|p->overflow)==0 ){
1175 i64 iNewSum = p->iSum + v;
drh1bd10f82008-12-10 21:19:56 +00001176 int s1 = (int)(p->iSum >> (sizeof(i64)*8-1));
1177 int s2 = (int)(v >> (sizeof(i64)*8-1));
1178 int s3 = (int)(iNewSum >> (sizeof(i64)*8-1));
1179 p->overflow = ((s1&s2&~s3) | (~s1&~s2&s3))?1:0;
drh8c08e862006-02-11 17:34:00 +00001180 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001181 }
1182 }else{
drh8c08e862006-02-11 17:34:00 +00001183 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001184 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001185 }
drh739105c2002-05-29 23:22:23 +00001186 }
drhdd5baa92002-02-27 19:50:59 +00001187}
danielk19770ae8b832004-05-25 12:05:56 +00001188static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001189 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001190 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001191 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001192 if( p->overflow ){
1193 sqlite3_result_error(context,"integer overflow",-1);
1194 }else if( p->approx ){
1195 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001196 }else{
drh8c08e862006-02-11 17:34:00 +00001197 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001198 }
drh3d1d95e2005-09-08 10:37:01 +00001199 }
drhdd5baa92002-02-27 19:50:59 +00001200}
danielk19770ae8b832004-05-25 12:05:56 +00001201static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001202 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001203 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001204 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001205 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001206 }
1207}
drha97fdd32006-01-12 22:17:50 +00001208static void totalFinalize(sqlite3_context *context){
1209 SumCtx *p;
1210 p = sqlite3_aggregate_context(context, 0);
shanefbd60f82009-02-04 03:59:25 +00001211 /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
1212 sqlite3_result_double(context, p ? p->rSum : (double)0);
drha97fdd32006-01-12 22:17:50 +00001213}
drhdd5baa92002-02-27 19:50:59 +00001214
1215/*
drh0bce8352002-02-28 00:41:10 +00001216** The following structure keeps track of state information for the
1217** count() aggregate function.
1218*/
1219typedef struct CountCtx CountCtx;
1220struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001221 i64 n;
drh0bce8352002-02-28 00:41:10 +00001222};
drhdd5baa92002-02-27 19:50:59 +00001223
drh0bce8352002-02-28 00:41:10 +00001224/*
1225** Routines to implement the count() aggregate function.
1226*/
danielk19770ae8b832004-05-25 12:05:56 +00001227static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001228 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001229 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001230 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001231 p->n++;
1232 }
drh2e79c3d2009-04-08 23:04:14 +00001233
drhd3264c72009-04-15 13:39:47 +00001234#ifndef SQLITE_OMIT_DEPRECATED
drh2e79c3d2009-04-08 23:04:14 +00001235 /* The sqlite3_aggregate_count() function is deprecated. But just to make
1236 ** sure it still operates correctly, verify that its count agrees with our
1237 ** internal count when using count(*) and when the total count can be
1238 ** expressed as a 32-bit integer. */
1239 assert( argc==1 || p==0 || p->n>0x7fffffff
1240 || p->n==sqlite3_aggregate_count(context) );
drhd3264c72009-04-15 13:39:47 +00001241#endif
drh0bce8352002-02-28 00:41:10 +00001242}
danielk19770ae8b832004-05-25 12:05:56 +00001243static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001244 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001245 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001246 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001247}
1248
1249/*
drh0bce8352002-02-28 00:41:10 +00001250** Routines to implement min() and max() aggregate functions.
1251*/
danielk197762c14b32008-11-19 09:05:26 +00001252static void minmaxStep(
1253 sqlite3_context *context,
1254 int NotUsed,
1255 sqlite3_value **argv
1256){
danielk197788208052004-05-25 01:13:20 +00001257 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001258 Mem *pBest;
danielk197762c14b32008-11-19 09:05:26 +00001259 UNUSED_PARAMETER(NotUsed);
drh9eb516c2004-07-18 20:52:32 +00001260
1261 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1262 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001263 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001264
danielk197788208052004-05-25 01:13:20 +00001265 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001266 int max;
1267 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001268 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001269 /* This step function is used for both the min() and max() aggregates,
1270 ** the only difference between the two being that the sense of the
1271 ** comparison is inverted. For the max() aggregate, the
1272 ** sqlite3_user_data() function returns (void *)-1. For min() it
1273 ** returns (void *)db, where db is the sqlite3* database pointer.
1274 ** Therefore the next statement sets variable 'max' to 1 for the max()
1275 ** aggregate, or 0 for min().
1276 */
drh309b3382007-03-17 17:52:42 +00001277 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001278 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001279 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001280 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001281 }
drh268380c2004-02-25 13:47:31 +00001282 }else{
drhb21c8cd2007-08-21 19:33:56 +00001283 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001284 }
1285}
danielk19770ae8b832004-05-25 12:05:56 +00001286static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001287 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001288 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1289 if( pRes ){
drhd27135a2009-04-02 13:36:37 +00001290 if( ALWAYS(pRes->flags) ){
drhabfcea22005-09-06 20:36:48 +00001291 sqlite3_result_value(context, pRes);
1292 }
1293 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001294 }
1295}
drhdd5baa92002-02-27 19:50:59 +00001296
drhb0689692007-11-01 17:38:30 +00001297/*
1298** group_concat(EXPR, ?SEPARATOR?)
1299*/
1300static void groupConcatStep(
1301 sqlite3_context *context,
1302 int argc,
1303 sqlite3_value **argv
1304){
1305 const char *zVal;
drhade86482007-11-28 22:36:40 +00001306 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001307 const char *zSep;
drh07d31172009-02-02 21:57:05 +00001308 int nVal, nSep;
1309 assert( argc==1 || argc==2 );
1310 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001311 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1312
1313 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001314 sqlite3 *db = sqlite3_context_db_handle(context);
drh8bfd7192009-06-19 16:44:41 +00001315 int firstTerm = pAccum->useMalloc==0;
drhade86482007-11-28 22:36:40 +00001316 pAccum->useMalloc = 1;
drhbb4957f2008-03-20 14:03:29 +00001317 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drh8bfd7192009-06-19 16:44:41 +00001318 if( !firstTerm ){
drh07d31172009-02-02 21:57:05 +00001319 if( argc==2 ){
1320 zSep = (char*)sqlite3_value_text(argv[1]);
1321 nSep = sqlite3_value_bytes(argv[1]);
drhb0689692007-11-01 17:38:30 +00001322 }else{
1323 zSep = ",";
drhade86482007-11-28 22:36:40 +00001324 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001325 }
drhade86482007-11-28 22:36:40 +00001326 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001327 }
drh07d31172009-02-02 21:57:05 +00001328 zVal = (char*)sqlite3_value_text(argv[0]);
1329 nVal = sqlite3_value_bytes(argv[0]);
1330 sqlite3StrAccumAppend(pAccum, zVal, nVal);
drhb0689692007-11-01 17:38:30 +00001331 }
1332}
1333static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001334 StrAccum *pAccum;
1335 pAccum = sqlite3_aggregate_context(context, 0);
1336 if( pAccum ){
1337 if( pAccum->tooBig ){
1338 sqlite3_result_error_toobig(context);
1339 }else if( pAccum->mallocFailed ){
1340 sqlite3_result_error_nomem(context);
1341 }else{
1342 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1343 sqlite3_free);
1344 }
drhb0689692007-11-01 17:38:30 +00001345 }
1346}
drh4e5ffc52004-08-31 00:52:37 +00001347
drhd3a149e2002-02-24 17:12:53 +00001348/*
drha2ed5602002-02-26 23:55:31 +00001349** This function registered all of the above C functions as SQL
1350** functions. This should be the only routine in this file with
1351** external linkage.
drhdc04c582002-02-24 01:55:15 +00001352*/
drh9bb575f2004-09-06 17:24:11 +00001353void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh1f01ec12005-02-15 21:36:18 +00001354#ifndef SQLITE_OMIT_ALTERTABLE
1355 sqlite3AlterFunctions(db);
1356#endif
danielk19771e536952007-08-16 10:09:01 +00001357 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001358 int rc = sqlite3_overload_function(db, "MATCH", 2);
1359 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1360 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001361 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001362 }
1363 }
drh55ef4d92005-08-14 01:20:37 +00001364}
1365
1366/*
1367** Set the LIKEOPT flag on the 2-argument function with the given name.
1368*/
drh1bd10f82008-12-10 21:19:56 +00001369static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
drh55ef4d92005-08-14 01:20:37 +00001370 FuncDef *pDef;
drhea678832008-12-10 19:26:22 +00001371 pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
1372 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001373 if( ALWAYS(pDef) ){
drhd64fe2f2005-08-28 17:00:23 +00001374 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001375 }
1376}
1377
1378/*
1379** Register the built-in LIKE and GLOB functions. The caseSensitive
1380** parameter determines whether or not the LIKE operator is case
1381** sensitive. GLOB is always case sensitive.
1382*/
1383void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1384 struct compareInfo *pInfo;
1385 if( caseSensitive ){
1386 pInfo = (struct compareInfo*)&likeInfoAlt;
1387 }else{
1388 pInfo = (struct compareInfo*)&likeInfoNorm;
1389 }
danielk1977717811c2009-03-27 15:26:03 +00001390 sqlite3CreateFunc(db, "like", 2, SQLITE_ANY, pInfo, likeFunc, 0, 0);
1391 sqlite3CreateFunc(db, "like", 3, SQLITE_ANY, pInfo, likeFunc, 0, 0);
1392 sqlite3CreateFunc(db, "glob", 2, SQLITE_ANY,
drh55ef4d92005-08-14 01:20:37 +00001393 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001394 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1395 setLikeOptFlag(db, "like",
1396 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001397}
1398
1399/*
1400** pExpr points to an expression which implements a function. If
1401** it is appropriate to apply the LIKE optimization to that function
1402** then set aWc[0] through aWc[2] to the wildcard characters and
1403** return TRUE. If the function is not a LIKE-style function then
1404** return FALSE.
1405*/
drhd64fe2f2005-08-28 17:00:23 +00001406int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001407 FuncDef *pDef;
danielk19776ab3a2e2009-02-19 14:39:25 +00001408 if( pExpr->op!=TK_FUNCTION
1409 || !pExpr->x.pList
1410 || pExpr->x.pList->nExpr!=2
1411 ){
drh55ef4d92005-08-14 01:20:37 +00001412 return 0;
1413 }
danielk19776ab3a2e2009-02-19 14:39:25 +00001414 assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
drh33e619f2009-05-28 01:00:55 +00001415 pDef = sqlite3FindFunction(db, pExpr->u.zToken,
1416 sqlite3Strlen30(pExpr->u.zToken),
drhb7916a72009-05-27 10:31:29 +00001417 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001418 if( NEVER(pDef==0) || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001419 return 0;
1420 }
1421
1422 /* The memcpy() statement assumes that the wildcard characters are
1423 ** the first three statements in the compareInfo structure. The
1424 ** asserts() that follow verify that assumption
1425 */
1426 memcpy(aWc, pDef->pUserData, 3);
1427 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1428 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1429 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001430 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001431 return 1;
drhdc04c582002-02-24 01:55:15 +00001432}
danielk19778c0a7912008-08-20 14:49:23 +00001433
drh70a8ca32008-08-21 18:49:27 +00001434/*
drh777c5382008-08-21 20:21:34 +00001435** All all of the FuncDef structures in the aBuiltinFunc[] array above
1436** to the global function hash table. This occurs at start-time (as
1437** a consequence of calling sqlite3_initialize()).
1438**
1439** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001440*/
1441void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001442 /*
1443 ** The following array holds FuncDef structures for all of the functions
1444 ** defined in this file.
1445 **
1446 ** The array cannot be constant since changes are made to the
1447 ** FuncDef.pHash elements at start-time. The elements of this array
1448 ** are read-only after initialization is complete.
1449 */
1450 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1451 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1452 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1453 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1454 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1455 FUNCTION(trim, 1, 3, 0, trimFunc ),
1456 FUNCTION(trim, 2, 3, 0, trimFunc ),
1457 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1458 FUNCTION(min, 0, 0, 1, 0 ),
1459 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1460 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1461 FUNCTION(max, 0, 1, 1, 0 ),
1462 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1463 FUNCTION(typeof, 1, 0, 0, typeofFunc ),
1464 FUNCTION(length, 1, 0, 0, lengthFunc ),
1465 FUNCTION(substr, 2, 0, 0, substrFunc ),
1466 FUNCTION(substr, 3, 0, 0, substrFunc ),
1467 FUNCTION(abs, 1, 0, 0, absFunc ),
shanefbd60f82009-02-04 03:59:25 +00001468#ifndef SQLITE_OMIT_FLOATING_POINT
danielk197793ce7412008-09-01 19:14:02 +00001469 FUNCTION(round, 1, 0, 0, roundFunc ),
1470 FUNCTION(round, 2, 0, 0, roundFunc ),
shanefbd60f82009-02-04 03:59:25 +00001471#endif
danielk197793ce7412008-09-01 19:14:02 +00001472 FUNCTION(upper, 1, 0, 0, upperFunc ),
1473 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1474 FUNCTION(coalesce, 1, 0, 0, 0 ),
danielk197793ce7412008-09-01 19:14:02 +00001475 FUNCTION(coalesce, 0, 0, 0, 0 ),
drhae6bb952009-11-11 00:24:31 +00001476/* FUNCTION(coalesce, -1, 0, 0, ifnullFunc ), */
1477 {-1,SQLITE_UTF8,SQLITE_FUNC_COALESCE,0,0,ifnullFunc,0,0,"coalesce",0},
danielk197793ce7412008-09-01 19:14:02 +00001478 FUNCTION(hex, 1, 0, 0, hexFunc ),
drhae6bb952009-11-11 00:24:31 +00001479/* FUNCTION(ifnull, 2, 0, 0, ifnullFunc ), */
1480 {2,SQLITE_UTF8,SQLITE_FUNC_COALESCE,0,0,ifnullFunc,0,0,"ifnull",0},
drh9373b012009-02-02 01:50:39 +00001481 FUNCTION(random, 0, 0, 0, randomFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001482 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1483 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1484 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
drh47baebc2009-08-14 16:01:24 +00001485 FUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001486 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1487 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1488 FUNCTION(changes, 0, 0, 0, changes ),
1489 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1490 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1491 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1492 #ifdef SQLITE_SOUNDEX
1493 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1494 #endif
1495 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1496 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1497 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1498 #endif
1499 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1500 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1501 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
danielk1977a5533162009-02-24 10:01:51 +00001502 /* AGGREGATE(count, 0, 0, 0, countStep, countFinalize ), */
1503 {0,SQLITE_UTF8,SQLITE_FUNC_COUNT,0,0,0,countStep,countFinalize,"count",0},
danielk197793ce7412008-09-01 19:14:02 +00001504 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
drh07d31172009-02-02 21:57:05 +00001505 AGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize),
1506 AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize),
danielk197793ce7412008-09-01 19:14:02 +00001507
1508 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1509 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1510 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1511 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1512 #else
1513 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1514 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1515 #endif
1516 };
1517
drh70a8ca32008-08-21 18:49:27 +00001518 int i;
danielk197793ce7412008-09-01 19:14:02 +00001519 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001520 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001521
drh70a8ca32008-08-21 18:49:27 +00001522 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001523 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001524 }
drh777c5382008-08-21 20:21:34 +00001525 sqlite3RegisterDateTimeFunctions();
drh70a8ca32008-08-21 18:49:27 +00001526}