blob: c1d3e9060fa8c831e6e18f85e9c72789bbbfc061 [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);
drhab2f1f92010-01-11 18:26:42 +0000443 /* IMP: R-51513-12026 The last_insert_rowid() SQL function is a
444 ** wrapper around the sqlite3_last_insert_rowid() C/C++ interface
445 ** function. */
drhf9b596e2004-05-26 16:54:42 +0000446 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000447}
448
rdcf146a772004-02-25 22:51:06 +0000449/*
drhab2f1f92010-01-11 18:26:42 +0000450** Implementation of the changes() SQL function.
451**
452** IMP: R-62073-11209 The changes() SQL function is a wrapper
453** around the sqlite3_changes() C/C++ function and hence follows the same
454** rules for counting changes.
rdcf146a772004-02-25 22:51:06 +0000455*/
danielk1977b28af712004-06-21 06:50:26 +0000456static void changes(
drhf9b596e2004-05-26 16:54:42 +0000457 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000458 int NotUsed,
459 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000460){
drhfa4a4b92008-03-19 21:45:51 +0000461 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000462 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf4479502004-05-27 03:12:53 +0000463 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000464}
rdcf146a772004-02-25 22:51:06 +0000465
466/*
danielk1977b28af712004-06-21 06:50:26 +0000467** Implementation of the total_changes() SQL function. The return value is
468** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000469*/
danielk1977b28af712004-06-21 06:50:26 +0000470static void total_changes(
471 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000472 int NotUsed,
473 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000474){
drhfa4a4b92008-03-19 21:45:51 +0000475 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000476 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000477 /* IMP: R-52756-41993 This function is a wrapper around the
478 ** sqlite3_total_changes() C/C++ interface. */
danielk1977b28af712004-06-21 06:50:26 +0000479 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000480}
481
drh6ed41ad2002-04-06 14:10:47 +0000482/*
drh4e5ffc52004-08-31 00:52:37 +0000483** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000484*/
drh4e5ffc52004-08-31 00:52:37 +0000485struct compareInfo {
486 u8 matchAll;
487 u8 matchOne;
488 u8 matchSet;
489 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000490};
drh55ef4d92005-08-14 01:20:37 +0000491
drhb9175ae2007-12-07 18:39:04 +0000492/*
493** For LIKE and GLOB matching on EBCDIC machines, assume that every
494** character is exactly one byte in size. Also, all characters are
495** able to participate in upper-case-to-lower-case mappings in EBCDIC
496** whereas only characters less than 0x80 do in ASCII.
497*/
498#if defined(SQLITE_EBCDIC)
drh769e97e2009-04-01 16:33:37 +0000499# define sqlite3Utf8Read(A,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000500# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000501#else
drh6ed4b782007-12-10 18:07:20 +0000502# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000503#endif
504
drh4e5ffc52004-08-31 00:52:37 +0000505static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000506/* The correct SQL-92 behavior is for the LIKE operator to ignore
507** case. Thus 'a' LIKE 'A' would be true. */
508static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
509/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
510** is case sensitive causing 'a' LIKE 'A' to be false */
511static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000512
513/*
drh4e5ffc52004-08-31 00:52:37 +0000514** Compare two UTF-8 strings for equality where the first string can
515** potentially be a "glob" expression. Return true (1) if they
516** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000517**
drh4e5ffc52004-08-31 00:52:37 +0000518** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000519**
drh4e5ffc52004-08-31 00:52:37 +0000520** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000521**
drh4e5ffc52004-08-31 00:52:37 +0000522** '?' Matches exactly one character.
523**
524** [...] Matches one character from the enclosed list of
525** characters.
526**
527** [^...] Matches one character not in the enclosed list.
528**
529** With the [...] and [^...] matching, a ']' character can be included
530** in the list by making it the first character after '[' or '^'. A
531** range of characters can be specified using '-'. Example:
532** "[a-z]" matches any single lower-case letter. To match a '-', make
533** it the last character in the list.
534**
535** This routine is usually quick, but can be N**2 in the worst case.
536**
537** Hints: to match '*' or '?', put them in "[]". Like this:
538**
539** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000540*/
danielk19777c6303c2004-11-17 16:41:29 +0000541static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000542 const u8 *zPattern, /* The glob pattern */
543 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000544 const struct compareInfo *pInfo, /* Information about how to do the compare */
545 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000546){
drh66150952007-07-23 19:12:41 +0000547 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000548 int invert;
549 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000550 u8 matchOne = pInfo->matchOne;
551 u8 matchAll = pInfo->matchAll;
552 u8 matchSet = pInfo->matchSet;
553 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000554 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000555
drh769e97e2009-04-01 16:33:37 +0000556 while( (c = sqlite3Utf8Read(zPattern,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000557 if( !prevEscape && c==matchAll ){
drh769e97e2009-04-01 16:33:37 +0000558 while( (c=sqlite3Utf8Read(zPattern,&zPattern)) == matchAll
drh66150952007-07-23 19:12:41 +0000559 || c == matchOne ){
drh769e97e2009-04-01 16:33:37 +0000560 if( c==matchOne && sqlite3Utf8Read(zString, &zString)==0 ){
drh66150952007-07-23 19:12:41 +0000561 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000562 }
danielk1977ad7dd422004-06-06 12:41:49 +0000563 }
drh66150952007-07-23 19:12:41 +0000564 if( c==0 ){
565 return 1;
566 }else if( c==esc ){
drh769e97e2009-04-01 16:33:37 +0000567 c = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000568 if( c==0 ){
569 return 0;
570 }
571 }else if( c==matchSet ){
572 assert( esc==0 ); /* This is GLOB, not LIKE */
573 assert( matchSet<0x80 ); /* '[' is a single-byte character */
574 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000575 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000576 }
577 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000578 }
drh769e97e2009-04-01 16:33:37 +0000579 while( (c2 = sqlite3Utf8Read(zString,&zString))!=0 ){
drh66150952007-07-23 19:12:41 +0000580 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000581 GlogUpperToLower(c2);
582 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000583 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000584 c2 = sqlite3Utf8Read(zString, &zString);
drh6ed4b782007-12-10 18:07:20 +0000585 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000586 }
drh66150952007-07-23 19:12:41 +0000587 }else{
588 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000589 c2 = sqlite3Utf8Read(zString, &zString);
drh66150952007-07-23 19:12:41 +0000590 }
drh4e5ffc52004-08-31 00:52:37 +0000591 }
drh66150952007-07-23 19:12:41 +0000592 if( c2==0 ) return 0;
593 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
594 }
595 return 0;
596 }else if( !prevEscape && c==matchOne ){
drh769e97e2009-04-01 16:33:37 +0000597 if( sqlite3Utf8Read(zString, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000598 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000599 }
drh4e5ffc52004-08-31 00:52:37 +0000600 }else if( c==matchSet ){
601 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000602 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000603 seen = 0;
604 invert = 0;
drh769e97e2009-04-01 16:33:37 +0000605 c = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000606 if( c==0 ) return 0;
drh769e97e2009-04-01 16:33:37 +0000607 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000608 if( c2=='^' ){
609 invert = 1;
drh769e97e2009-04-01 16:33:37 +0000610 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000611 }
drh4e5ffc52004-08-31 00:52:37 +0000612 if( c2==']' ){
613 if( c==']' ) seen = 1;
drh769e97e2009-04-01 16:33:37 +0000614 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000615 }
drh66150952007-07-23 19:12:41 +0000616 while( c2 && c2!=']' ){
617 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
drh769e97e2009-04-01 16:33:37 +0000618 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000619 if( c>=prior_c && c<=c2 ) seen = 1;
620 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000621 }else{
drh66150952007-07-23 19:12:41 +0000622 if( c==c2 ){
623 seen = 1;
624 }
drh4e5ffc52004-08-31 00:52:37 +0000625 prior_c = c2;
626 }
drh769e97e2009-04-01 16:33:37 +0000627 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000628 }
drh66150952007-07-23 19:12:41 +0000629 if( c2==0 || (seen ^ invert)==0 ){
630 return 0;
631 }
632 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000633 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000634 }else{
drh769e97e2009-04-01 16:33:37 +0000635 c2 = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000636 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000637 GlogUpperToLower(c);
638 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000639 }
drh66150952007-07-23 19:12:41 +0000640 if( c!=c2 ){
641 return 0;
642 }
danielk19777c6303c2004-11-17 16:41:29 +0000643 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000644 }
danielk197751ad0ec2004-05-24 12:39:02 +0000645 }
drh4e5ffc52004-08-31 00:52:37 +0000646 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000647}
drh4e5ffc52004-08-31 00:52:37 +0000648
drh55ef4d92005-08-14 01:20:37 +0000649/*
650** Count the number of times that the LIKE operator (or GLOB which is
651** just a variation of LIKE) gets called. This is used for testing
652** only.
653*/
654#ifdef SQLITE_TEST
655int sqlite3_like_count = 0;
656#endif
657
danielk19773f6b0872004-06-17 05:36:44 +0000658
659/*
660** Implementation of the like() SQL function. This function implements
661** the build-in LIKE operator. The first argument to the function is the
662** pattern and the second argument is the string. So, the SQL statements:
663**
664** A LIKE B
665**
666** is implemented as like(B,A).
667**
drh55ef4d92005-08-14 01:20:37 +0000668** This same function (with a different compareInfo structure) computes
669** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000670*/
671static void likeFunc(
672 sqlite3_context *context,
673 int argc,
674 sqlite3_value **argv
675){
drhbeb818d2007-05-08 15:34:47 +0000676 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000677 int escape = 0;
drh27e62db2009-04-02 10:16:17 +0000678 int nPat;
drhbb4957f2008-03-20 14:03:29 +0000679 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000680
drh1f0feef2007-05-15 13:27:07 +0000681 zB = sqlite3_value_text(argv[0]);
682 zA = sqlite3_value_text(argv[1]);
683
drhbeb818d2007-05-08 15:34:47 +0000684 /* Limit the length of the LIKE or GLOB pattern to avoid problems
685 ** of deep recursion and N*N behavior in patternCompare().
686 */
drh27e62db2009-04-02 10:16:17 +0000687 nPat = sqlite3_value_bytes(argv[0]);
688 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] );
689 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 );
690 if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000691 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
692 return;
693 }
drh1f0feef2007-05-15 13:27:07 +0000694 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000695
danielk19777c6303c2004-11-17 16:41:29 +0000696 if( argc==3 ){
697 /* The escape character string must consist of a single UTF-8 character.
698 ** Otherwise, return an error.
699 */
700 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000701 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000702 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000703 sqlite3_result_error(context,
704 "ESCAPE expression must be a single character", -1);
705 return;
706 }
drh769e97e2009-04-01 16:33:37 +0000707 escape = sqlite3Utf8Read(zEsc, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000708 }
danielk19773f6b0872004-06-17 05:36:44 +0000709 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000710 struct compareInfo *pInfo = sqlite3_user_data(context);
711#ifdef SQLITE_TEST
712 sqlite3_like_count++;
713#endif
drhbeb818d2007-05-08 15:34:47 +0000714
danielk1977b56fe1f2007-05-09 08:24:44 +0000715 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000716 }
drh8912d102002-05-26 21:34:58 +0000717}
718
719/*
720** Implementation of the NULLIF(x,y) function. The result is the first
721** argument if the arguments are different. The result is NULL if the
722** arguments are equal to each other.
723*/
drhf9b596e2004-05-26 16:54:42 +0000724static void nullifFunc(
725 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000726 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +0000727 sqlite3_value **argv
728){
danielk1977dc1bdc42004-06-11 10:51:27 +0000729 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk197762c14b32008-11-19 09:05:26 +0000730 UNUSED_PARAMETER(NotUsed);
danielk1977dc1bdc42004-06-11 10:51:27 +0000731 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000732 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000733 }
drh0ac65892002-04-20 14:24:41 +0000734}
735
drh647cb0e2002-11-04 19:32:25 +0000736/*
drh47baebc2009-08-14 16:01:24 +0000737** Implementation of the sqlite_version() function. The result is the version
drh647cb0e2002-11-04 19:32:25 +0000738** of the SQLite library that is running.
739*/
drhf9b596e2004-05-26 16:54:42 +0000740static void versionFunc(
741 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000742 int NotUsed,
743 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000744){
danielk197762c14b32008-11-19 09:05:26 +0000745 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000746 /* IMP: R-48699-48617 This function is an SQL wrapper around the
747 ** sqlite3_libversion() C-interface. */
748 sqlite3_result_text(context, sqlite3_libversion(), -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000749}
750
drh47baebc2009-08-14 16:01:24 +0000751/*
752** Implementation of the sqlite_source_id() function. The result is a string
753** that identifies the particular version of the source code used to build
754** SQLite.
755*/
756static void sourceidFunc(
757 sqlite3_context *context,
758 int NotUsed,
759 sqlite3_value **NotUsed2
760){
761 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000762 /* IMP: R-24470-31136 This function is an SQL wrapper around the
763 ** sqlite3_sourceid() C interface. */
764 sqlite3_result_text(context, sqlite3_sourceid(), -1, SQLITE_STATIC);
drh47baebc2009-08-14 16:01:24 +0000765}
766
drh137c7282007-01-29 17:58:28 +0000767/* Array for converting from half-bytes (nybbles) into ASCII hex
768** digits. */
769static const char hexdigits[] = {
770 '0', '1', '2', '3', '4', '5', '6', '7',
771 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
772};
danielk1977d641d642004-11-18 15:44:29 +0000773
drh47394702003-08-20 01:03:33 +0000774/*
775** EXPERIMENTAL - This is not an official function. The interface may
776** change. This function may disappear. Do not write code that depends
777** on this function.
778**
779** Implementation of the QUOTE() function. This function takes a single
780** argument. If the argument is numeric, the return value is the same as
781** the argument. If the argument is NULL, the return value is the string
782** "NULL". Otherwise, the argument is enclosed in single quotes with
783** single-quote escapes.
784*/
danielk19770ae8b832004-05-25 12:05:56 +0000785static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drha0df4cc2009-02-02 17:29:59 +0000786 assert( argc==1 );
drh1d34fde2009-02-03 15:50:33 +0000787 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000788 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000789 case SQLITE_INTEGER:
790 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000791 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000792 break;
793 }
danielk19773f41e972004-06-08 00:39:01 +0000794 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000795 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000796 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000797 int nBlob = sqlite3_value_bytes(argv[0]);
798 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000799 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000800 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000801 int i;
802 for(i=0; i<nBlob; i++){
803 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
804 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
805 }
806 zText[(nBlob*2)+2] = '\'';
807 zText[(nBlob*2)+3] = '\0';
808 zText[0] = 'X';
809 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000810 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000811 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000812 }
813 break;
814 }
drh9c054832004-05-31 18:51:57 +0000815 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000816 int i,j;
817 u64 n;
drh2646da72005-12-09 20:02:05 +0000818 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000819 char *z;
820
drh7a521cf2007-04-25 18:23:52 +0000821 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000822 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000823 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000824 if( z ){
825 z[0] = '\'';
826 for(i=0, j=1; zArg[i]; i++){
827 z[j++] = zArg[i];
828 if( zArg[i]=='\'' ){
829 z[j++] = '\'';
830 }
drhf9b596e2004-05-26 16:54:42 +0000831 }
danielk1977a1644fd2007-08-29 12:31:25 +0000832 z[j++] = '\'';
833 z[j] = 0;
834 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000835 }
drha0df4cc2009-02-02 17:29:59 +0000836 break;
837 }
838 default: {
839 assert( sqlite3_value_type(argv[0])==SQLITE_NULL );
840 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
841 break;
drhf9b596e2004-05-26 16:54:42 +0000842 }
drh47394702003-08-20 01:03:33 +0000843 }
844}
845
drh137c7282007-01-29 17:58:28 +0000846/*
847** The hex() function. Interpret the argument as a blob. Return
848** a hexadecimal rendering as text.
849*/
850static void hexFunc(
851 sqlite3_context *context,
852 int argc,
853 sqlite3_value **argv
854){
855 int i, n;
856 const unsigned char *pBlob;
857 char *zHex, *z;
858 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000859 UNUSED_PARAMETER(argc);
drh1f0feef2007-05-15 13:27:07 +0000860 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000861 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000862 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000863 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000864 if( zHex ){
865 for(i=0; i<n; i++, pBlob++){
866 unsigned char c = *pBlob;
867 *(z++) = hexdigits[(c>>4)&0xf];
868 *(z++) = hexdigits[c&0xf];
869 }
870 *z = 0;
871 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000872 }
drh137c7282007-01-29 17:58:28 +0000873}
874
drh26b6d902007-03-17 13:27:54 +0000875/*
drh8cff3822007-05-02 02:08:28 +0000876** The zeroblob(N) function returns a zero-filled blob of size N bytes.
877*/
878static void zeroblobFunc(
879 sqlite3_context *context,
880 int argc,
881 sqlite3_value **argv
882){
drh98640a32007-06-07 19:08:32 +0000883 i64 n;
drh27e62db2009-04-02 10:16:17 +0000884 sqlite3 *db = sqlite3_context_db_handle(context);
drh8cff3822007-05-02 02:08:28 +0000885 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000886 UNUSED_PARAMETER(argc);
drh98640a32007-06-07 19:08:32 +0000887 n = sqlite3_value_int64(argv[0]);
drh27e62db2009-04-02 10:16:17 +0000888 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH] );
889 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
890 if( n>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drh98640a32007-06-07 19:08:32 +0000891 sqlite3_result_error_toobig(context);
892 }else{
drhab2f1f92010-01-11 18:26:42 +0000893 sqlite3_result_zeroblob(context, (int)n); /* IMP: R-00293-64994 */
drh98640a32007-06-07 19:08:32 +0000894 }
drh8cff3822007-05-02 02:08:28 +0000895}
896
897/*
drh26b6d902007-03-17 13:27:54 +0000898** The replace() function. Three arguments are all strings: call
899** them A, B, and C. The result is also a string which is derived
900** from A by replacing every occurance of B with C. The match
901** must be exact. Collating sequences are not used.
902*/
903static void replaceFunc(
904 sqlite3_context *context,
905 int argc,
906 sqlite3_value **argv
907){
908 const unsigned char *zStr; /* The input string A */
909 const unsigned char *zPattern; /* The pattern string B */
910 const unsigned char *zRep; /* The replacement string C */
911 unsigned char *zOut; /* The output */
912 int nStr; /* Size of zStr */
913 int nPattern; /* Size of zPattern */
914 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000915 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000916 int loopLimit; /* Last zStr[] that might match zPattern[] */
917 int i, j; /* Loop counters */
918
919 assert( argc==3 );
danielk1977f3d3c272008-11-19 16:52:44 +0000920 UNUSED_PARAMETER(argc);
drh26b6d902007-03-17 13:27:54 +0000921 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000922 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000923 nStr = sqlite3_value_bytes(argv[0]);
924 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000925 zPattern = sqlite3_value_text(argv[1]);
drha605fe82009-02-01 18:08:40 +0000926 if( zPattern==0 ){
drh23336062009-02-03 13:19:12 +0000927 assert( sqlite3_value_type(argv[1])==SQLITE_NULL
928 || sqlite3_context_db_handle(context)->mallocFailed );
drha605fe82009-02-01 18:08:40 +0000929 return;
930 }
931 if( zPattern[0]==0 ){
932 assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
933 sqlite3_result_value(context, argv[0]);
934 return;
935 }
drh1f0feef2007-05-15 13:27:07 +0000936 nPattern = sqlite3_value_bytes(argv[1]);
937 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000938 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000939 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000940 nRep = sqlite3_value_bytes(argv[2]);
941 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000942 nOut = nStr + 1;
943 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +0000944 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +0000945 if( zOut==0 ){
946 return;
drh26b6d902007-03-17 13:27:54 +0000947 }
drh26b6d902007-03-17 13:27:54 +0000948 loopLimit = nStr - nPattern;
949 for(i=j=0; i<=loopLimit; i++){
950 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
951 zOut[j++] = zStr[i];
952 }else{
drh4a50aac2007-08-23 02:47:53 +0000953 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +0000954 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +0000955 nOut += nRep - nPattern;
drh27e62db2009-04-02 10:16:17 +0000956 testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
957 testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
958 if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +0000959 sqlite3_result_error_toobig(context);
drh633e6d52008-07-28 19:34:53 +0000960 sqlite3DbFree(db, zOut);
danielk197717374e82007-05-08 14:39:04 +0000961 return;
962 }
drh4a50aac2007-08-23 02:47:53 +0000963 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000964 zOut = sqlite3_realloc(zOut, (int)nOut);
965 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000966 sqlite3_result_error_nomem(context);
drh633e6d52008-07-28 19:34:53 +0000967 sqlite3DbFree(db, zOld);
drh2e6400b2007-05-08 15:46:18 +0000968 return;
969 }
drh26b6d902007-03-17 13:27:54 +0000970 memcpy(&zOut[j], zRep, nRep);
971 j += nRep;
972 i += nPattern-1;
973 }
974 }
drh2e6400b2007-05-08 15:46:18 +0000975 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000976 memcpy(&zOut[j], &zStr[i], nStr-i);
977 j += nStr - i;
978 assert( j<=nOut );
979 zOut[j] = 0;
980 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
981}
982
drh309b3382007-03-17 17:52:42 +0000983/*
984** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
985** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
986*/
987static void trimFunc(
988 sqlite3_context *context,
989 int argc,
990 sqlite3_value **argv
991){
992 const unsigned char *zIn; /* Input string */
993 const unsigned char *zCharSet; /* Set of characters to trim */
994 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +0000995 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +0000996 int i; /* Loop counter */
drh1bd10f82008-12-10 21:19:56 +0000997 unsigned char *aLen = 0; /* Length of each character in zCharSet */
998 unsigned char **azChar = 0; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000999 int nChar; /* Number of characters in zCharSet */
1000
drh309b3382007-03-17 17:52:42 +00001001 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
1002 return;
1003 }
1004 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001005 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +00001006 nIn = sqlite3_value_bytes(argv[0]);
1007 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +00001008 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +00001009 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +00001010 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +00001011 nChar = 1;
drh8cff3822007-05-02 02:08:28 +00001012 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +00001013 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +00001014 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +00001015 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +00001016 return;
drhd1e3a612007-04-27 21:59:52 +00001017 }else{
1018 const unsigned char *z;
1019 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +00001020 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +00001021 }
1022 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +00001023 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +00001024 if( azChar==0 ){
1025 return;
1026 }
1027 aLen = (unsigned char*)&azChar[nChar];
1028 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +00001029 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +00001030 SQLITE_SKIP_UTF8(z);
drh3abbd392008-12-10 23:04:13 +00001031 aLen[nChar] = (u8)(z - azChar[nChar]);
drhd1e3a612007-04-27 21:59:52 +00001032 }
1033 }
drh309b3382007-03-17 17:52:42 +00001034 }
drhd1e3a612007-04-27 21:59:52 +00001035 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +00001036 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +00001037 if( flags & 1 ){
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];
drh27e62db2009-04-02 10:16:17 +00001042 if( len<=nIn && memcmp(zIn, azChar[i], len)==0 ) break;
drhd1e3a612007-04-27 21:59:52 +00001043 }
1044 if( i>=nChar ) break;
1045 zIn += len;
1046 nIn -= len;
drh309b3382007-03-17 17:52:42 +00001047 }
1048 }
1049 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +00001050 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +00001051 int len = 0;
drhd1e3a612007-04-27 21:59:52 +00001052 for(i=0; i<nChar; i++){
1053 len = aLen[i];
1054 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
1055 }
1056 if( i>=nChar ) break;
1057 nIn -= len;
drh309b3382007-03-17 17:52:42 +00001058 }
1059 }
drhd1e3a612007-04-27 21:59:52 +00001060 if( zCharSet ){
1061 sqlite3_free(azChar);
1062 }
drh309b3382007-03-17 17:52:42 +00001063 }
1064 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
1065}
drh26b6d902007-03-17 13:27:54 +00001066
danielk1977a4de4532008-09-02 15:44:08 +00001067
drh2ba3ccc2009-12-08 02:06:08 +00001068/* IMP: R-25361-16150 This function is omitted from SQLite by default. It
1069** is only available if the SQLITE_SOUNDEX compile-time option is used
1070** when SQLite is built.
1071*/
drhd24cc422003-03-27 12:51:24 +00001072#ifdef SQLITE_SOUNDEX
1073/*
1074** Compute the soundex encoding of a word.
drh2ba3ccc2009-12-08 02:06:08 +00001075**
1076** IMP: R-59782-00072 The soundex(X) function returns a string that is the
1077** soundex encoding of the string X.
drhd24cc422003-03-27 12:51:24 +00001078*/
drh137c7282007-01-29 17:58:28 +00001079static void soundexFunc(
1080 sqlite3_context *context,
1081 int argc,
1082 sqlite3_value **argv
1083){
drhd24cc422003-03-27 12:51:24 +00001084 char zResult[8];
drh4c755c02004-08-08 20:22:17 +00001085 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +00001086 int i, j;
1087 static const unsigned char iCode[] = {
1088 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1089 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1090 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1091 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1092 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1093 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1094 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1095 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1096 };
1097 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +00001098 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +00001099 if( zIn==0 ) zIn = (u8*)"";
drhdc86e2b2009-01-24 11:30:42 +00001100 for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
drhd24cc422003-03-27 12:51:24 +00001101 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +00001102 u8 prevcode = iCode[zIn[i]&0x7f];
danielk197778ca0e72009-01-20 16:53:39 +00001103 zResult[0] = sqlite3Toupper(zIn[i]);
drhd24cc422003-03-27 12:51:24 +00001104 for(j=1; j<4 && zIn[i]; i++){
1105 int code = iCode[zIn[i]&0x7f];
1106 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +00001107 if( code!=prevcode ){
1108 prevcode = code;
1109 zResult[j++] = code + '0';
1110 }
1111 }else{
1112 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +00001113 }
1114 }
1115 while( j<4 ){
1116 zResult[j++] = '0';
1117 }
1118 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001119 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +00001120 }else{
drh2ba3ccc2009-12-08 02:06:08 +00001121 /* IMP: R-64894-50321 The string "?000" is returned if the argument
1122 ** is NULL or contains no ASCII alphabetic characters. */
danielk1977d8123362004-06-12 09:25:12 +00001123 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +00001124 }
1125}
drh2ba3ccc2009-12-08 02:06:08 +00001126#endif /* SQLITE_SOUNDEX */
drhd24cc422003-03-27 12:51:24 +00001127
drhfdb83b22006-06-17 14:12:47 +00001128#ifndef SQLITE_OMIT_LOAD_EXTENSION
1129/*
1130** A function that loads a shared-library extension then returns NULL.
1131*/
1132static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001133 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001134 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001135 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001136 char *zErrMsg = 0;
1137
1138 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001139 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001140 }else{
1141 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001142 }
drh7a521cf2007-04-25 18:23:52 +00001143 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001144 sqlite3_result_error(context, zErrMsg, -1);
1145 sqlite3_free(zErrMsg);
1146 }
1147}
1148#endif
1149
danielk197701427a62005-01-11 13:02:33 +00001150
drh0ac65892002-04-20 14:24:41 +00001151/*
drhd3a149e2002-02-24 17:12:53 +00001152** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001153** sum() or avg() aggregate computation.
1154*/
1155typedef struct SumCtx SumCtx;
1156struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001157 double rSum; /* Floating point sum */
1158 i64 iSum; /* Integer sum */
1159 i64 cnt; /* Number of elements summed */
1160 u8 overflow; /* True if integer overflow seen */
1161 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001162};
1163
1164/*
drha97fdd32006-01-12 22:17:50 +00001165** Routines used to compute the sum, average, and total.
1166**
1167** The SUM() function follows the (broken) SQL standard which means
1168** that it returns NULL if it sums over no inputs. TOTAL returns
1169** 0.0 in that case. In addition, TOTAL always returns a float where
1170** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001171** value. TOTAL never fails, but SUM might through an exception if
1172** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001173*/
danielk19770ae8b832004-05-25 12:05:56 +00001174static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001175 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001176 int type;
drh3f219f42005-09-08 19:45:57 +00001177 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001178 UNUSED_PARAMETER(argc);
drh4f26d6c2004-05-26 23:25:30 +00001179 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001180 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001181 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001182 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001183 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001184 i64 v = sqlite3_value_int64(argv[0]);
1185 p->rSum += v;
1186 if( (p->approx|p->overflow)==0 ){
1187 i64 iNewSum = p->iSum + v;
drh1bd10f82008-12-10 21:19:56 +00001188 int s1 = (int)(p->iSum >> (sizeof(i64)*8-1));
1189 int s2 = (int)(v >> (sizeof(i64)*8-1));
1190 int s3 = (int)(iNewSum >> (sizeof(i64)*8-1));
1191 p->overflow = ((s1&s2&~s3) | (~s1&~s2&s3))?1:0;
drh8c08e862006-02-11 17:34:00 +00001192 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001193 }
1194 }else{
drh8c08e862006-02-11 17:34:00 +00001195 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001196 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001197 }
drh739105c2002-05-29 23:22:23 +00001198 }
drhdd5baa92002-02-27 19:50:59 +00001199}
danielk19770ae8b832004-05-25 12:05:56 +00001200static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001201 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001202 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001203 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001204 if( p->overflow ){
1205 sqlite3_result_error(context,"integer overflow",-1);
1206 }else if( p->approx ){
1207 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001208 }else{
drh8c08e862006-02-11 17:34:00 +00001209 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001210 }
drh3d1d95e2005-09-08 10:37:01 +00001211 }
drhdd5baa92002-02-27 19:50:59 +00001212}
danielk19770ae8b832004-05-25 12:05:56 +00001213static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001214 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001215 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001216 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001217 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001218 }
1219}
drha97fdd32006-01-12 22:17:50 +00001220static void totalFinalize(sqlite3_context *context){
1221 SumCtx *p;
1222 p = sqlite3_aggregate_context(context, 0);
shanefbd60f82009-02-04 03:59:25 +00001223 /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
1224 sqlite3_result_double(context, p ? p->rSum : (double)0);
drha97fdd32006-01-12 22:17:50 +00001225}
drhdd5baa92002-02-27 19:50:59 +00001226
1227/*
drh0bce8352002-02-28 00:41:10 +00001228** The following structure keeps track of state information for the
1229** count() aggregate function.
1230*/
1231typedef struct CountCtx CountCtx;
1232struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001233 i64 n;
drh0bce8352002-02-28 00:41:10 +00001234};
drhdd5baa92002-02-27 19:50:59 +00001235
drh0bce8352002-02-28 00:41:10 +00001236/*
1237** Routines to implement the count() aggregate function.
1238*/
danielk19770ae8b832004-05-25 12:05:56 +00001239static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001240 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001241 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001242 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001243 p->n++;
1244 }
drh2e79c3d2009-04-08 23:04:14 +00001245
drhd3264c72009-04-15 13:39:47 +00001246#ifndef SQLITE_OMIT_DEPRECATED
drh2e79c3d2009-04-08 23:04:14 +00001247 /* The sqlite3_aggregate_count() function is deprecated. But just to make
1248 ** sure it still operates correctly, verify that its count agrees with our
1249 ** internal count when using count(*) and when the total count can be
1250 ** expressed as a 32-bit integer. */
1251 assert( argc==1 || p==0 || p->n>0x7fffffff
1252 || p->n==sqlite3_aggregate_count(context) );
drhd3264c72009-04-15 13:39:47 +00001253#endif
drh0bce8352002-02-28 00:41:10 +00001254}
danielk19770ae8b832004-05-25 12:05:56 +00001255static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001256 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001257 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001258 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001259}
1260
1261/*
drh0bce8352002-02-28 00:41:10 +00001262** Routines to implement min() and max() aggregate functions.
1263*/
danielk197762c14b32008-11-19 09:05:26 +00001264static void minmaxStep(
1265 sqlite3_context *context,
1266 int NotUsed,
1267 sqlite3_value **argv
1268){
danielk197788208052004-05-25 01:13:20 +00001269 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001270 Mem *pBest;
danielk197762c14b32008-11-19 09:05:26 +00001271 UNUSED_PARAMETER(NotUsed);
drh9eb516c2004-07-18 20:52:32 +00001272
1273 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1274 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001275 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001276
danielk197788208052004-05-25 01:13:20 +00001277 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001278 int max;
1279 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001280 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001281 /* This step function is used for both the min() and max() aggregates,
1282 ** the only difference between the two being that the sense of the
1283 ** comparison is inverted. For the max() aggregate, the
1284 ** sqlite3_user_data() function returns (void *)-1. For min() it
1285 ** returns (void *)db, where db is the sqlite3* database pointer.
1286 ** Therefore the next statement sets variable 'max' to 1 for the max()
1287 ** aggregate, or 0 for min().
1288 */
drh309b3382007-03-17 17:52:42 +00001289 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001290 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001291 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001292 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001293 }
drh268380c2004-02-25 13:47:31 +00001294 }else{
drhb21c8cd2007-08-21 19:33:56 +00001295 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001296 }
1297}
danielk19770ae8b832004-05-25 12:05:56 +00001298static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001299 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001300 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1301 if( pRes ){
drhd27135a2009-04-02 13:36:37 +00001302 if( ALWAYS(pRes->flags) ){
drhabfcea22005-09-06 20:36:48 +00001303 sqlite3_result_value(context, pRes);
1304 }
1305 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001306 }
1307}
drhdd5baa92002-02-27 19:50:59 +00001308
drhb0689692007-11-01 17:38:30 +00001309/*
1310** group_concat(EXPR, ?SEPARATOR?)
1311*/
1312static void groupConcatStep(
1313 sqlite3_context *context,
1314 int argc,
1315 sqlite3_value **argv
1316){
1317 const char *zVal;
drhade86482007-11-28 22:36:40 +00001318 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001319 const char *zSep;
drh07d31172009-02-02 21:57:05 +00001320 int nVal, nSep;
1321 assert( argc==1 || argc==2 );
1322 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001323 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1324
1325 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001326 sqlite3 *db = sqlite3_context_db_handle(context);
drh8bfd7192009-06-19 16:44:41 +00001327 int firstTerm = pAccum->useMalloc==0;
drhade86482007-11-28 22:36:40 +00001328 pAccum->useMalloc = 1;
drhbb4957f2008-03-20 14:03:29 +00001329 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drh8bfd7192009-06-19 16:44:41 +00001330 if( !firstTerm ){
drh07d31172009-02-02 21:57:05 +00001331 if( argc==2 ){
1332 zSep = (char*)sqlite3_value_text(argv[1]);
1333 nSep = sqlite3_value_bytes(argv[1]);
drhb0689692007-11-01 17:38:30 +00001334 }else{
1335 zSep = ",";
drhade86482007-11-28 22:36:40 +00001336 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001337 }
drhade86482007-11-28 22:36:40 +00001338 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001339 }
drh07d31172009-02-02 21:57:05 +00001340 zVal = (char*)sqlite3_value_text(argv[0]);
1341 nVal = sqlite3_value_bytes(argv[0]);
1342 sqlite3StrAccumAppend(pAccum, zVal, nVal);
drhb0689692007-11-01 17:38:30 +00001343 }
1344}
1345static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001346 StrAccum *pAccum;
1347 pAccum = sqlite3_aggregate_context(context, 0);
1348 if( pAccum ){
1349 if( pAccum->tooBig ){
1350 sqlite3_result_error_toobig(context);
1351 }else if( pAccum->mallocFailed ){
1352 sqlite3_result_error_nomem(context);
1353 }else{
1354 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1355 sqlite3_free);
1356 }
drhb0689692007-11-01 17:38:30 +00001357 }
1358}
drh4e5ffc52004-08-31 00:52:37 +00001359
drhd3a149e2002-02-24 17:12:53 +00001360/*
drha2ed5602002-02-26 23:55:31 +00001361** This function registered all of the above C functions as SQL
1362** functions. This should be the only routine in this file with
1363** external linkage.
drhdc04c582002-02-24 01:55:15 +00001364*/
drh9bb575f2004-09-06 17:24:11 +00001365void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh1f01ec12005-02-15 21:36:18 +00001366#ifndef SQLITE_OMIT_ALTERTABLE
1367 sqlite3AlterFunctions(db);
1368#endif
danielk19771e536952007-08-16 10:09:01 +00001369 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001370 int rc = sqlite3_overload_function(db, "MATCH", 2);
1371 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1372 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001373 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001374 }
1375 }
drh55ef4d92005-08-14 01:20:37 +00001376}
1377
1378/*
1379** Set the LIKEOPT flag on the 2-argument function with the given name.
1380*/
drh1bd10f82008-12-10 21:19:56 +00001381static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
drh55ef4d92005-08-14 01:20:37 +00001382 FuncDef *pDef;
drhea678832008-12-10 19:26:22 +00001383 pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
1384 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001385 if( ALWAYS(pDef) ){
drhd64fe2f2005-08-28 17:00:23 +00001386 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001387 }
1388}
1389
1390/*
1391** Register the built-in LIKE and GLOB functions. The caseSensitive
1392** parameter determines whether or not the LIKE operator is case
1393** sensitive. GLOB is always case sensitive.
1394*/
1395void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1396 struct compareInfo *pInfo;
1397 if( caseSensitive ){
1398 pInfo = (struct compareInfo*)&likeInfoAlt;
1399 }else{
1400 pInfo = (struct compareInfo*)&likeInfoNorm;
1401 }
danielk1977717811c2009-03-27 15:26:03 +00001402 sqlite3CreateFunc(db, "like", 2, SQLITE_ANY, pInfo, likeFunc, 0, 0);
1403 sqlite3CreateFunc(db, "like", 3, SQLITE_ANY, pInfo, likeFunc, 0, 0);
1404 sqlite3CreateFunc(db, "glob", 2, SQLITE_ANY,
drh55ef4d92005-08-14 01:20:37 +00001405 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001406 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1407 setLikeOptFlag(db, "like",
1408 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001409}
1410
1411/*
1412** pExpr points to an expression which implements a function. If
1413** it is appropriate to apply the LIKE optimization to that function
1414** then set aWc[0] through aWc[2] to the wildcard characters and
1415** return TRUE. If the function is not a LIKE-style function then
1416** return FALSE.
1417*/
drhd64fe2f2005-08-28 17:00:23 +00001418int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001419 FuncDef *pDef;
danielk19776ab3a2e2009-02-19 14:39:25 +00001420 if( pExpr->op!=TK_FUNCTION
1421 || !pExpr->x.pList
1422 || pExpr->x.pList->nExpr!=2
1423 ){
drh55ef4d92005-08-14 01:20:37 +00001424 return 0;
1425 }
danielk19776ab3a2e2009-02-19 14:39:25 +00001426 assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
drh33e619f2009-05-28 01:00:55 +00001427 pDef = sqlite3FindFunction(db, pExpr->u.zToken,
1428 sqlite3Strlen30(pExpr->u.zToken),
drhb7916a72009-05-27 10:31:29 +00001429 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001430 if( NEVER(pDef==0) || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001431 return 0;
1432 }
1433
1434 /* The memcpy() statement assumes that the wildcard characters are
1435 ** the first three statements in the compareInfo structure. The
1436 ** asserts() that follow verify that assumption
1437 */
1438 memcpy(aWc, pDef->pUserData, 3);
1439 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1440 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1441 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001442 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001443 return 1;
drhdc04c582002-02-24 01:55:15 +00001444}
danielk19778c0a7912008-08-20 14:49:23 +00001445
drh70a8ca32008-08-21 18:49:27 +00001446/*
drh777c5382008-08-21 20:21:34 +00001447** All all of the FuncDef structures in the aBuiltinFunc[] array above
1448** to the global function hash table. This occurs at start-time (as
1449** a consequence of calling sqlite3_initialize()).
1450**
1451** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001452*/
1453void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001454 /*
1455 ** The following array holds FuncDef structures for all of the functions
1456 ** defined in this file.
1457 **
1458 ** The array cannot be constant since changes are made to the
1459 ** FuncDef.pHash elements at start-time. The elements of this array
1460 ** are read-only after initialization is complete.
1461 */
1462 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1463 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1464 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1465 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1466 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1467 FUNCTION(trim, 1, 3, 0, trimFunc ),
1468 FUNCTION(trim, 2, 3, 0, trimFunc ),
1469 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1470 FUNCTION(min, 0, 0, 1, 0 ),
1471 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1472 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1473 FUNCTION(max, 0, 1, 1, 0 ),
1474 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1475 FUNCTION(typeof, 1, 0, 0, typeofFunc ),
1476 FUNCTION(length, 1, 0, 0, lengthFunc ),
1477 FUNCTION(substr, 2, 0, 0, substrFunc ),
1478 FUNCTION(substr, 3, 0, 0, substrFunc ),
1479 FUNCTION(abs, 1, 0, 0, absFunc ),
shanefbd60f82009-02-04 03:59:25 +00001480#ifndef SQLITE_OMIT_FLOATING_POINT
danielk197793ce7412008-09-01 19:14:02 +00001481 FUNCTION(round, 1, 0, 0, roundFunc ),
1482 FUNCTION(round, 2, 0, 0, roundFunc ),
shanefbd60f82009-02-04 03:59:25 +00001483#endif
danielk197793ce7412008-09-01 19:14:02 +00001484 FUNCTION(upper, 1, 0, 0, upperFunc ),
1485 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1486 FUNCTION(coalesce, 1, 0, 0, 0 ),
danielk197793ce7412008-09-01 19:14:02 +00001487 FUNCTION(coalesce, 0, 0, 0, 0 ),
drhae6bb952009-11-11 00:24:31 +00001488/* FUNCTION(coalesce, -1, 0, 0, ifnullFunc ), */
1489 {-1,SQLITE_UTF8,SQLITE_FUNC_COALESCE,0,0,ifnullFunc,0,0,"coalesce",0},
danielk197793ce7412008-09-01 19:14:02 +00001490 FUNCTION(hex, 1, 0, 0, hexFunc ),
drhae6bb952009-11-11 00:24:31 +00001491/* FUNCTION(ifnull, 2, 0, 0, ifnullFunc ), */
1492 {2,SQLITE_UTF8,SQLITE_FUNC_COALESCE,0,0,ifnullFunc,0,0,"ifnull",0},
drh9373b012009-02-02 01:50:39 +00001493 FUNCTION(random, 0, 0, 0, randomFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001494 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1495 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1496 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
drh47baebc2009-08-14 16:01:24 +00001497 FUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001498 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1499 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1500 FUNCTION(changes, 0, 0, 0, changes ),
1501 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1502 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1503 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1504 #ifdef SQLITE_SOUNDEX
1505 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1506 #endif
1507 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1508 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1509 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1510 #endif
1511 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1512 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1513 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
danielk1977a5533162009-02-24 10:01:51 +00001514 /* AGGREGATE(count, 0, 0, 0, countStep, countFinalize ), */
1515 {0,SQLITE_UTF8,SQLITE_FUNC_COUNT,0,0,0,countStep,countFinalize,"count",0},
danielk197793ce7412008-09-01 19:14:02 +00001516 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
drh07d31172009-02-02 21:57:05 +00001517 AGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize),
1518 AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize),
danielk197793ce7412008-09-01 19:14:02 +00001519
1520 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1521 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1522 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1523 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1524 #else
1525 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1526 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1527 #endif
1528 };
1529
drh70a8ca32008-08-21 18:49:27 +00001530 int i;
danielk197793ce7412008-09-01 19:14:02 +00001531 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001532 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001533
drh70a8ca32008-08-21 18:49:27 +00001534 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001535 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001536 }
drh777c5382008-08-21 20:21:34 +00001537 sqlite3RegisterDateTimeFunctions();
drh70a8ca32008-08-21 18:49:27 +00001538}