blob: 3a1879ca6949f0cd5c37dd2f46d0b178cb4f93d0 [file] [log] [blame]
drhdc04c582002-02-24 01:55:15 +00001/*
2** 2002 February 23
3**
4** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
6**
7** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
10**
11*************************************************************************
12** This file contains the C functions that implement various SQL
13** functions of SQLite.
14**
15** There is only one exported symbol in this file - the function
16** sqliteRegisterBuildinFunctions() found at the bottom of the file.
17** All other code has file scope.
drhdc04c582002-02-24 01:55:15 +000018*/
drhb659e9b2005-01-28 01:29:08 +000019#include "sqliteInt.h"
drhd3a149e2002-02-24 17:12:53 +000020#include <stdlib.h>
drh0bce8352002-02-28 00:41:10 +000021#include <assert.h>
danielk197788208052004-05-25 01:13:20 +000022#include "vdbeInt.h"
drh0bce8352002-02-28 00:41:10 +000023
drh55ef4d92005-08-14 01:20:37 +000024/*
25** Return the collating function associated with a function.
26*/
danielk1977dc1bdc42004-06-11 10:51:27 +000027static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
28 return context->pColl;
29}
30
drh0bce8352002-02-28 00:41:10 +000031/*
32** Implementation of the non-aggregate min() and max() functions
33*/
drhf9b596e2004-05-26 16:54:42 +000034static void minmaxFunc(
35 sqlite3_context *context,
36 int argc,
37 sqlite3_value **argv
38){
drh0bce8352002-02-28 00:41:10 +000039 int i;
drh268380c2004-02-25 13:47:31 +000040 int mask; /* 0 for min() or 0xffffffff for max() */
drhf9b596e2004-05-26 16:54:42 +000041 int iBest;
danielk1977dc1bdc42004-06-11 10:51:27 +000042 CollSeq *pColl;
drh0bce8352002-02-28 00:41:10 +000043
drh65595cd2009-02-02 16:32:55 +000044 assert( argc>1 );
drhc44af712004-09-02 15:53:56 +000045 mask = sqlite3_user_data(context)==0 ? 0 : -1;
danielk1977dc1bdc42004-06-11 10:51:27 +000046 pColl = sqlite3GetFuncCollSeq(context);
47 assert( pColl );
danielk1977c572ef72004-05-27 09:28:41 +000048 assert( mask==-1 || mask==0 );
drhf9b596e2004-05-26 16:54:42 +000049 iBest = 0;
drh9c054832004-05-31 18:51:57 +000050 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhf9b596e2004-05-26 16:54:42 +000051 for(i=1; i<argc; i++){
drh9c054832004-05-31 18:51:57 +000052 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
danielk1977dc1bdc42004-06-11 10:51:27 +000053 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
drh65595cd2009-02-02 16:32:55 +000054 testcase( mask==0 );
drhf9b596e2004-05-26 16:54:42 +000055 iBest = i;
drh0bce8352002-02-28 00:41:10 +000056 }
57 }
drhf4479502004-05-27 03:12:53 +000058 sqlite3_result_value(context, argv[iBest]);
drh0bce8352002-02-28 00:41:10 +000059}
drh0bce8352002-02-28 00:41:10 +000060
drh268380c2004-02-25 13:47:31 +000061/*
62** Return the type of the argument.
63*/
drhf9b596e2004-05-26 16:54:42 +000064static void typeofFunc(
65 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +000066 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +000067 sqlite3_value **argv
68){
danielk197735bb9d02004-05-24 12:55:54 +000069 const char *z = 0;
danielk197762c14b32008-11-19 09:05:26 +000070 UNUSED_PARAMETER(NotUsed);
danielk197735bb9d02004-05-24 12:55:54 +000071 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000072 case SQLITE_INTEGER: z = "integer"; break;
73 case SQLITE_TEXT: z = "text"; break;
74 case SQLITE_FLOAT: z = "real"; break;
75 case SQLITE_BLOB: z = "blob"; break;
drh65595cd2009-02-02 16:32:55 +000076 default: z = "null"; break;
danielk197735bb9d02004-05-24 12:55:54 +000077 }
danielk1977d8123362004-06-12 09:25:12 +000078 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000079}
80
drh5708d2d2005-06-22 10:53:59 +000081
82/*
drh0bce8352002-02-28 00:41:10 +000083** Implementation of the length() function
84*/
drhf9b596e2004-05-26 16:54:42 +000085static void lengthFunc(
86 sqlite3_context *context,
87 int argc,
88 sqlite3_value **argv
89){
drh0bce8352002-02-28 00:41:10 +000090 int len;
91
92 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +000093 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +000094 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000095 case SQLITE_BLOB:
96 case SQLITE_INTEGER:
97 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +000098 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +000099 break;
100 }
drh9c054832004-05-31 18:51:57 +0000101 case SQLITE_TEXT: {
drh2646da72005-12-09 20:02:05 +0000102 const unsigned char *z = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000103 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000104 len = 0;
105 while( *z ){
106 len++;
107 SQLITE_SKIP_UTF8(z);
108 }
drhf4479502004-05-27 03:12:53 +0000109 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000110 break;
111 }
112 default: {
113 sqlite3_result_null(context);
114 break;
115 }
116 }
drh0bce8352002-02-28 00:41:10 +0000117}
118
119/*
drh2ba3ccc2009-12-08 02:06:08 +0000120** Implementation of the abs() function.
121**
122** IMP: R-23979-26855 The abs(X) function returns the absolute value of
123** the numeric argument X.
drh0bce8352002-02-28 00:41:10 +0000124*/
danielk19770ae8b832004-05-25 12:05:56 +0000125static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000126 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000127 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000128 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000129 case SQLITE_INTEGER: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000130 i64 iVal = sqlite3_value_int64(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000131 if( iVal<0 ){
132 if( (iVal<<1)==0 ){
drh2ba3ccc2009-12-08 02:06:08 +0000133 /* IMP: R-35460-15084 If X is the integer -9223372036854775807 then
134 ** abs(X) throws an integer overflow error since there is no
135 ** equivalent positive 64-bit two complement value. */
drh52fc8492006-02-23 21:43:55 +0000136 sqlite3_result_error(context, "integer overflow", -1);
137 return;
138 }
139 iVal = -iVal;
140 }
danielk1977f93bbbe2004-05-27 10:30:52 +0000141 sqlite3_result_int64(context, iVal);
drhf9b596e2004-05-26 16:54:42 +0000142 break;
143 }
drh9c054832004-05-31 18:51:57 +0000144 case SQLITE_NULL: {
drh2ba3ccc2009-12-08 02:06:08 +0000145 /* IMP: R-37434-19929 Abs(X) returns NULL if X is NULL. */
drhf9b596e2004-05-26 16:54:42 +0000146 sqlite3_result_null(context);
147 break;
148 }
149 default: {
drh2ba3ccc2009-12-08 02:06:08 +0000150 /* Because sqlite3_value_double() returns 0.0 if the argument is not
151 ** something that can be converted into a number, we have:
152 ** IMP: R-57326-31541 Abs(X) return 0.0 if X is a string or blob that
153 ** cannot be converted to a numeric value.
154 */
danielk1977f93bbbe2004-05-27 10:30:52 +0000155 double rVal = sqlite3_value_double(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000156 if( rVal<0 ) rVal = -rVal;
danielk1977f93bbbe2004-05-27 10:30:52 +0000157 sqlite3_result_double(context, rVal);
drhf9b596e2004-05-26 16:54:42 +0000158 break;
159 }
160 }
drh0bce8352002-02-28 00:41:10 +0000161}
162
163/*
drhf764e6f2007-05-15 01:13:47 +0000164** Implementation of the substr() function.
165**
166** substr(x,p1,p2) returns p2 characters of x[] beginning with p1.
167** p1 is 1-indexed. So substr(x,1,1) returns the first character
168** of x. If x is text, then we actually count UTF-8 characters.
169** If x is a blob, then we count bytes.
170**
171** If p1 is negative, then we begin abs(p1) from the end of x[].
shaneh779b8f12009-11-12 05:04:50 +0000172**
173** If p2 is negative, return the p2 characters preceeding p1.
drh0bce8352002-02-28 00:41:10 +0000174*/
drhf9b596e2004-05-26 16:54:42 +0000175static void substrFunc(
176 sqlite3_context *context,
177 int argc,
178 sqlite3_value **argv
179){
drh2646da72005-12-09 20:02:05 +0000180 const unsigned char *z;
181 const unsigned char *z2;
drh023ae032007-05-08 12:12:16 +0000182 int len;
drhf764e6f2007-05-15 01:13:47 +0000183 int p0type;
drh023ae032007-05-08 12:12:16 +0000184 i64 p1, p2;
drh65595cd2009-02-02 16:32:55 +0000185 int negP2 = 0;
drhf9b596e2004-05-26 16:54:42 +0000186
drh64f31512007-10-12 19:11:55 +0000187 assert( argc==3 || argc==2 );
drh8198d252009-02-01 19:42:37 +0000188 if( sqlite3_value_type(argv[1])==SQLITE_NULL
189 || (argc==3 && sqlite3_value_type(argv[2])==SQLITE_NULL)
190 ){
191 return;
192 }
drhf764e6f2007-05-15 01:13:47 +0000193 p0type = sqlite3_value_type(argv[0]);
drh4adc4cb2009-11-11 20:53:31 +0000194 p1 = sqlite3_value_int(argv[1]);
drhf764e6f2007-05-15 01:13:47 +0000195 if( p0type==SQLITE_BLOB ){
196 len = sqlite3_value_bytes(argv[0]);
197 z = sqlite3_value_blob(argv[0]);
198 if( z==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000199 assert( len==sqlite3_value_bytes(argv[0]) );
drhf764e6f2007-05-15 01:13:47 +0000200 }else{
201 z = sqlite3_value_text(argv[0]);
202 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000203 len = 0;
drh4adc4cb2009-11-11 20:53:31 +0000204 if( p1<0 ){
205 for(z2=z; *z2; len++){
206 SQLITE_SKIP_UTF8(z2);
207 }
drh4a919112007-05-15 11:55:09 +0000208 }
drhf764e6f2007-05-15 01:13:47 +0000209 }
drh64f31512007-10-12 19:11:55 +0000210 if( argc==3 ){
211 p2 = sqlite3_value_int(argv[2]);
drh65595cd2009-02-02 16:32:55 +0000212 if( p2<0 ){
213 p2 = -p2;
214 negP2 = 1;
215 }
drh64f31512007-10-12 19:11:55 +0000216 }else{
drhbb4957f2008-03-20 14:03:29 +0000217 p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH];
drh64f31512007-10-12 19:11:55 +0000218 }
drh0bce8352002-02-28 00:41:10 +0000219 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000220 p1 += len;
drh653bc752002-02-28 03:31:10 +0000221 if( p1<0 ){
222 p2 += p1;
drh65595cd2009-02-02 16:32:55 +0000223 if( p2<0 ) p2 = 0;
drh653bc752002-02-28 03:31:10 +0000224 p1 = 0;
225 }
drh0bce8352002-02-28 00:41:10 +0000226 }else if( p1>0 ){
227 p1--;
drh65595cd2009-02-02 16:32:55 +0000228 }else if( p2>0 ){
229 p2--;
drh0bce8352002-02-28 00:41:10 +0000230 }
drh65595cd2009-02-02 16:32:55 +0000231 if( negP2 ){
232 p1 -= p2;
drh4e79c592009-02-01 19:23:32 +0000233 if( p1<0 ){
234 p2 += p1;
235 p1 = 0;
236 }
237 }
drh65595cd2009-02-02 16:32:55 +0000238 assert( p1>=0 && p2>=0 );
drhf764e6f2007-05-15 01:13:47 +0000239 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000240 while( *z && p1 ){
241 SQLITE_SKIP_UTF8(z);
242 p1--;
drhf764e6f2007-05-15 01:13:47 +0000243 }
drh4a919112007-05-15 11:55:09 +0000244 for(z2=z; *z2 && p2; p2--){
245 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000246 }
drh1bd10f82008-12-10 21:19:56 +0000247 sqlite3_result_text(context, (char*)z, (int)(z2-z), SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000248 }else{
drh4adc4cb2009-11-11 20:53:31 +0000249 if( p1+p2>len ){
250 p2 = len-p1;
251 if( p2<0 ) p2 = 0;
252 }
drh1bd10f82008-12-10 21:19:56 +0000253 sqlite3_result_blob(context, (char*)&z[p1], (int)p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000254 }
drh0bce8352002-02-28 00:41:10 +0000255}
256
257/*
258** Implementation of the round() function
259*/
shanefbd60f82009-02-04 03:59:25 +0000260#ifndef SQLITE_OMIT_FLOATING_POINT
danielk19770ae8b832004-05-25 12:05:56 +0000261static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000262 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000263 double r;
drh50d654d2009-06-03 01:24:54 +0000264 char *zBuf;
drh0bce8352002-02-28 00:41:10 +0000265 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000266 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000267 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000268 n = sqlite3_value_int(argv[1]);
269 if( n>30 ) n = 30;
270 if( n<0 ) n = 0;
271 }
drhd589a922006-03-02 03:02:48 +0000272 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000273 r = sqlite3_value_double(argv[0]);
shaneh147e1762010-02-17 04:19:27 +0000274 /* If Y==0 and X will fit in a 64-bit int,
275 ** handle the rounding directly,
276 ** otherwise use printf.
277 */
278 if( n==0 && r>=0 && r<LARGEST_INT64-1 ){
279 r = (double)((sqlite_int64)(r+0.5));
280 }else if( n==0 && r<0 && (-r)<LARGEST_INT64-1 ){
281 r = -(double)((sqlite_int64)((-r)+0.5));
drh50d654d2009-06-03 01:24:54 +0000282 }else{
shaneh147e1762010-02-17 04:19:27 +0000283 zBuf = sqlite3_mprintf("%.*f",n,r);
284 if( zBuf==0 ){
285 sqlite3_result_error_nomem(context);
286 return;
287 }
drh9339da12010-09-30 00:50:49 +0000288 sqlite3AtoF(zBuf, &r, sqlite3Strlen30(zBuf), SQLITE_UTF8);
drh50d654d2009-06-03 01:24:54 +0000289 sqlite3_free(zBuf);
drh50d654d2009-06-03 01:24:54 +0000290 }
shaneh147e1762010-02-17 04:19:27 +0000291 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000292}
shanefbd60f82009-02-04 03:59:25 +0000293#endif
drhdc04c582002-02-24 01:55:15 +0000294
danielk197726783a52007-08-29 14:06:22 +0000295/*
296** Allocate nByte bytes of space using sqlite3_malloc(). If the
297** allocation fails, call sqlite3_result_error_nomem() to notify
drh27e62db2009-04-02 10:16:17 +0000298** the database handle that malloc() has failed and return NULL.
299** If nByte is larger than the maximum string or blob length, then
300** raise an SQLITE_TOOBIG exception and return NULL.
danielk197726783a52007-08-29 14:06:22 +0000301*/
drhb1a6c3c2008-03-20 16:30:17 +0000302static void *contextMalloc(sqlite3_context *context, i64 nByte){
drhbb4957f2008-03-20 14:03:29 +0000303 char *z;
drh27e62db2009-04-02 10:16:17 +0000304 sqlite3 *db = sqlite3_context_db_handle(context);
drhef31c6a2009-04-02 09:07:12 +0000305 assert( nByte>0 );
drh27e62db2009-04-02 10:16:17 +0000306 testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] );
307 testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
308 if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drhbb4957f2008-03-20 14:03:29 +0000309 sqlite3_result_error_toobig(context);
310 z = 0;
311 }else{
drh1bd10f82008-12-10 21:19:56 +0000312 z = sqlite3Malloc((int)nByte);
drhef31c6a2009-04-02 09:07:12 +0000313 if( !z ){
drhbb4957f2008-03-20 14:03:29 +0000314 sqlite3_result_error_nomem(context);
315 }
danielk1977a1644fd2007-08-29 12:31:25 +0000316 }
317 return z;
318}
319
drhdc04c582002-02-24 01:55:15 +0000320/*
321** Implementation of the upper() and lower() SQL functions.
322*/
danielk19770ae8b832004-05-25 12:05:56 +0000323static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000324 char *z1;
325 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000326 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000327 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000328 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000329 n = sqlite3_value_bytes(argv[0]);
330 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
331 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000332 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000333 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000334 if( z1 ){
drhdf901d32011-10-13 18:00:11 +0000335 for(i=0; i<n; i++){
336 z1[i] = (char)sqlite3Toupper(z2[i]);
drh7a521cf2007-04-25 18:23:52 +0000337 }
drhdf901d32011-10-13 18:00:11 +0000338 sqlite3_result_text(context, z1, n, sqlite3_free);
drh7a521cf2007-04-25 18:23:52 +0000339 }
drhdc04c582002-02-24 01:55:15 +0000340 }
341}
danielk19770ae8b832004-05-25 12:05:56 +0000342static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdf901d32011-10-13 18:00:11 +0000343 char *z1;
drh7a521cf2007-04-25 18:23:52 +0000344 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000345 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000346 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000347 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000348 n = sqlite3_value_bytes(argv[0]);
349 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
350 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000351 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000352 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000353 if( z1 ){
drhdf901d32011-10-13 18:00:11 +0000354 for(i=0; i<n; i++){
355 z1[i] = sqlite3Tolower(z2[i]);
drh7a521cf2007-04-25 18:23:52 +0000356 }
drhdf901d32011-10-13 18:00:11 +0000357 sqlite3_result_text(context, z1, n, sqlite3_free);
drh7a521cf2007-04-25 18:23:52 +0000358 }
drhdc04c582002-02-24 01:55:15 +0000359 }
360}
361
drhae6bb952009-11-11 00:24:31 +0000362
363#if 0 /* This function is never used. */
364/*
365** The COALESCE() and IFNULL() functions used to be implemented as shown
366** here. But now they are implemented as VDBE code so that unused arguments
367** do not have to be computed. This legacy implementation is retained as
368** comment.
369*/
drhdc04c582002-02-24 01:55:15 +0000370/*
drhfbc99082002-02-28 03:14:18 +0000371** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000372** All three do the same thing. They return the first non-NULL
373** argument.
drh3212e182002-02-28 00:46:26 +0000374*/
drhf9b596e2004-05-26 16:54:42 +0000375static void ifnullFunc(
376 sqlite3_context *context,
377 int argc,
378 sqlite3_value **argv
379){
drhfbc99082002-02-28 03:14:18 +0000380 int i;
381 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000382 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000383 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000384 break;
385 }
386 }
drh3212e182002-02-28 00:46:26 +0000387}
drhae6bb952009-11-11 00:24:31 +0000388#endif /* NOT USED */
389#define ifnullFunc versionFunc /* Substitute function - never called */
drh3212e182002-02-28 00:46:26 +0000390
391/*
drhf9ffac92002-03-02 19:00:31 +0000392** Implementation of random(). Return a random integer.
393*/
drhf9b596e2004-05-26 16:54:42 +0000394static void randomFunc(
395 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000396 int NotUsed,
397 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000398){
drh52fc8492006-02-23 21:43:55 +0000399 sqlite_int64 r;
danielk197762c14b32008-11-19 09:05:26 +0000400 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drh2fa18682008-03-19 14:15:34 +0000401 sqlite3_randomness(sizeof(r), &r);
drh3034e3d2009-04-02 14:05:21 +0000402 if( r<0 ){
403 /* We need to prevent a random number of 0x8000000000000000
404 ** (or -9223372036854775808) since when you do abs() of that
405 ** number of you get the same value back again. To do this
406 ** in a way that is testable, mask the sign bit off of negative
407 ** values, resulting in a positive value. Then take the
408 ** 2s complement of that positive value. The end result can
409 ** therefore be no less than -9223372036854775807.
410 */
411 r = -(r ^ (((sqlite3_int64)1)<<63));
412 }
drh52fc8492006-02-23 21:43:55 +0000413 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000414}
415
416/*
drh137c7282007-01-29 17:58:28 +0000417** Implementation of randomblob(N). Return a random blob
418** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000419*/
drh137c7282007-01-29 17:58:28 +0000420static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000421 sqlite3_context *context,
422 int argc,
423 sqlite3_value **argv
424){
drh137c7282007-01-29 17:58:28 +0000425 int n;
426 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000427 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000428 UNUSED_PARAMETER(argc);
drh63cf66f2007-01-29 15:50:05 +0000429 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000430 if( n<1 ){
431 n = 1;
432 }
danielk1977a1644fd2007-08-29 12:31:25 +0000433 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000434 if( p ){
drh2fa18682008-03-19 14:15:34 +0000435 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000436 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000437 }
drh63cf66f2007-01-29 15:50:05 +0000438}
439
440/*
drh6ed41ad2002-04-06 14:10:47 +0000441** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000442** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000443*/
danielk197751ad0ec2004-05-24 12:39:02 +0000444static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000445 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000446 int NotUsed,
447 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000448){
drhfa4a4b92008-03-19 21:45:51 +0000449 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000450 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000451 /* IMP: R-51513-12026 The last_insert_rowid() SQL function is a
452 ** wrapper around the sqlite3_last_insert_rowid() C/C++ interface
453 ** function. */
drhf9b596e2004-05-26 16:54:42 +0000454 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000455}
456
rdcf146a772004-02-25 22:51:06 +0000457/*
drhab2f1f92010-01-11 18:26:42 +0000458** Implementation of the changes() SQL function.
459**
460** IMP: R-62073-11209 The changes() SQL function is a wrapper
461** around the sqlite3_changes() C/C++ function and hence follows the same
462** rules for counting changes.
rdcf146a772004-02-25 22:51:06 +0000463*/
danielk1977b28af712004-06-21 06:50:26 +0000464static void changes(
drhf9b596e2004-05-26 16:54:42 +0000465 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000466 int NotUsed,
467 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +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);
drhf4479502004-05-27 03:12:53 +0000471 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000472}
rdcf146a772004-02-25 22:51:06 +0000473
474/*
danielk1977b28af712004-06-21 06:50:26 +0000475** Implementation of the total_changes() SQL function. The return value is
476** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000477*/
danielk1977b28af712004-06-21 06:50:26 +0000478static void total_changes(
479 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000480 int NotUsed,
481 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000482){
drhfa4a4b92008-03-19 21:45:51 +0000483 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000484 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000485 /* IMP: R-52756-41993 This function is a wrapper around the
486 ** sqlite3_total_changes() C/C++ interface. */
danielk1977b28af712004-06-21 06:50:26 +0000487 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000488}
489
drh6ed41ad2002-04-06 14:10:47 +0000490/*
drh4e5ffc52004-08-31 00:52:37 +0000491** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000492*/
drh4e5ffc52004-08-31 00:52:37 +0000493struct compareInfo {
494 u8 matchAll;
495 u8 matchOne;
496 u8 matchSet;
497 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000498};
drh55ef4d92005-08-14 01:20:37 +0000499
drhb9175ae2007-12-07 18:39:04 +0000500/*
501** For LIKE and GLOB matching on EBCDIC machines, assume that every
502** character is exactly one byte in size. Also, all characters are
503** able to participate in upper-case-to-lower-case mappings in EBCDIC
504** whereas only characters less than 0x80 do in ASCII.
505*/
506#if defined(SQLITE_EBCDIC)
drh0a32fa62011-06-13 12:19:21 +0000507# define sqlite3Utf8Read(A,C) (*(A++))
508# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000509#else
drh0a32fa62011-06-13 12:19:21 +0000510# define GlogUpperToLower(A) if( !((A)&~0x7f) ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000511#endif
512
drh4e5ffc52004-08-31 00:52:37 +0000513static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000514/* The correct SQL-92 behavior is for the LIKE operator to ignore
515** case. Thus 'a' LIKE 'A' would be true. */
516static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
517/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
518** is case sensitive causing 'a' LIKE 'A' to be false */
519static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000520
521/*
drh4e5ffc52004-08-31 00:52:37 +0000522** Compare two UTF-8 strings for equality where the first string can
523** potentially be a "glob" expression. Return true (1) if they
524** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000525**
drh4e5ffc52004-08-31 00:52:37 +0000526** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000527**
drh4e5ffc52004-08-31 00:52:37 +0000528** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000529**
drh4e5ffc52004-08-31 00:52:37 +0000530** '?' Matches exactly one character.
531**
532** [...] Matches one character from the enclosed list of
533** characters.
534**
535** [^...] Matches one character not in the enclosed list.
536**
537** With the [...] and [^...] matching, a ']' character can be included
538** in the list by making it the first character after '[' or '^'. A
539** range of characters can be specified using '-'. Example:
540** "[a-z]" matches any single lower-case letter. To match a '-', make
541** it the last character in the list.
542**
543** This routine is usually quick, but can be N**2 in the worst case.
544**
545** Hints: to match '*' or '?', put them in "[]". Like this:
546**
547** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000548*/
danielk19777c6303c2004-11-17 16:41:29 +0000549static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000550 const u8 *zPattern, /* The glob pattern */
551 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000552 const struct compareInfo *pInfo, /* Information about how to do the compare */
drh0a32fa62011-06-13 12:19:21 +0000553 u32 esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000554){
drh0a32fa62011-06-13 12:19:21 +0000555 u32 c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000556 int invert;
557 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000558 u8 matchOne = pInfo->matchOne;
559 u8 matchAll = pInfo->matchAll;
560 u8 matchSet = pInfo->matchSet;
561 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000562 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000563
drh769e97e2009-04-01 16:33:37 +0000564 while( (c = sqlite3Utf8Read(zPattern,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000565 if( !prevEscape && c==matchAll ){
drh769e97e2009-04-01 16:33:37 +0000566 while( (c=sqlite3Utf8Read(zPattern,&zPattern)) == matchAll
drh66150952007-07-23 19:12:41 +0000567 || c == matchOne ){
drh769e97e2009-04-01 16:33:37 +0000568 if( c==matchOne && sqlite3Utf8Read(zString, &zString)==0 ){
drh66150952007-07-23 19:12:41 +0000569 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000570 }
danielk1977ad7dd422004-06-06 12:41:49 +0000571 }
drh66150952007-07-23 19:12:41 +0000572 if( c==0 ){
573 return 1;
574 }else if( c==esc ){
drh769e97e2009-04-01 16:33:37 +0000575 c = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000576 if( c==0 ){
577 return 0;
578 }
579 }else if( c==matchSet ){
580 assert( esc==0 ); /* This is GLOB, not LIKE */
581 assert( matchSet<0x80 ); /* '[' is a single-byte character */
582 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000583 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000584 }
585 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000586 }
drh769e97e2009-04-01 16:33:37 +0000587 while( (c2 = sqlite3Utf8Read(zString,&zString))!=0 ){
drh66150952007-07-23 19:12:41 +0000588 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000589 GlogUpperToLower(c2);
590 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000591 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000592 c2 = sqlite3Utf8Read(zString, &zString);
drh6ed4b782007-12-10 18:07:20 +0000593 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000594 }
drh66150952007-07-23 19:12:41 +0000595 }else{
596 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000597 c2 = sqlite3Utf8Read(zString, &zString);
drh66150952007-07-23 19:12:41 +0000598 }
drh4e5ffc52004-08-31 00:52:37 +0000599 }
drh66150952007-07-23 19:12:41 +0000600 if( c2==0 ) return 0;
601 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
602 }
603 return 0;
604 }else if( !prevEscape && c==matchOne ){
drh769e97e2009-04-01 16:33:37 +0000605 if( sqlite3Utf8Read(zString, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000606 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000607 }
drh4e5ffc52004-08-31 00:52:37 +0000608 }else if( c==matchSet ){
drh1aa4f3e2011-06-15 12:43:36 +0000609 u32 prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000610 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000611 seen = 0;
612 invert = 0;
drh769e97e2009-04-01 16:33:37 +0000613 c = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000614 if( c==0 ) return 0;
drh769e97e2009-04-01 16:33:37 +0000615 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000616 if( c2=='^' ){
617 invert = 1;
drh769e97e2009-04-01 16:33:37 +0000618 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000619 }
drh4e5ffc52004-08-31 00:52:37 +0000620 if( c2==']' ){
621 if( c==']' ) seen = 1;
drh769e97e2009-04-01 16:33:37 +0000622 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000623 }
drh66150952007-07-23 19:12:41 +0000624 while( c2 && c2!=']' ){
625 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
drh769e97e2009-04-01 16:33:37 +0000626 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000627 if( c>=prior_c && c<=c2 ) seen = 1;
628 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000629 }else{
drh66150952007-07-23 19:12:41 +0000630 if( c==c2 ){
631 seen = 1;
632 }
drh4e5ffc52004-08-31 00:52:37 +0000633 prior_c = c2;
634 }
drh769e97e2009-04-01 16:33:37 +0000635 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000636 }
drh66150952007-07-23 19:12:41 +0000637 if( c2==0 || (seen ^ invert)==0 ){
638 return 0;
639 }
640 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000641 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000642 }else{
drh769e97e2009-04-01 16:33:37 +0000643 c2 = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000644 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000645 GlogUpperToLower(c);
646 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000647 }
drh66150952007-07-23 19:12:41 +0000648 if( c!=c2 ){
649 return 0;
650 }
danielk19777c6303c2004-11-17 16:41:29 +0000651 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000652 }
danielk197751ad0ec2004-05-24 12:39:02 +0000653 }
drh4e5ffc52004-08-31 00:52:37 +0000654 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000655}
drh4e5ffc52004-08-31 00:52:37 +0000656
drh55ef4d92005-08-14 01:20:37 +0000657/*
658** Count the number of times that the LIKE operator (or GLOB which is
659** just a variation of LIKE) gets called. This is used for testing
660** only.
661*/
662#ifdef SQLITE_TEST
663int sqlite3_like_count = 0;
664#endif
665
danielk19773f6b0872004-06-17 05:36:44 +0000666
667/*
668** Implementation of the like() SQL function. This function implements
669** the build-in LIKE operator. The first argument to the function is the
670** pattern and the second argument is the string. So, the SQL statements:
671**
672** A LIKE B
673**
674** is implemented as like(B,A).
675**
drh55ef4d92005-08-14 01:20:37 +0000676** This same function (with a different compareInfo structure) computes
677** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000678*/
679static void likeFunc(
680 sqlite3_context *context,
681 int argc,
682 sqlite3_value **argv
683){
drhbeb818d2007-05-08 15:34:47 +0000684 const unsigned char *zA, *zB;
drh0a32fa62011-06-13 12:19:21 +0000685 u32 escape = 0;
drh27e62db2009-04-02 10:16:17 +0000686 int nPat;
drhbb4957f2008-03-20 14:03:29 +0000687 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000688
drh1f0feef2007-05-15 13:27:07 +0000689 zB = sqlite3_value_text(argv[0]);
690 zA = sqlite3_value_text(argv[1]);
691
drhbeb818d2007-05-08 15:34:47 +0000692 /* Limit the length of the LIKE or GLOB pattern to avoid problems
693 ** of deep recursion and N*N behavior in patternCompare().
694 */
drh27e62db2009-04-02 10:16:17 +0000695 nPat = sqlite3_value_bytes(argv[0]);
696 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] );
697 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 );
698 if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000699 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
700 return;
701 }
drh1f0feef2007-05-15 13:27:07 +0000702 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000703
danielk19777c6303c2004-11-17 16:41:29 +0000704 if( argc==3 ){
705 /* The escape character string must consist of a single UTF-8 character.
706 ** Otherwise, return an error.
707 */
708 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000709 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000710 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000711 sqlite3_result_error(context,
712 "ESCAPE expression must be a single character", -1);
713 return;
714 }
drh769e97e2009-04-01 16:33:37 +0000715 escape = sqlite3Utf8Read(zEsc, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000716 }
danielk19773f6b0872004-06-17 05:36:44 +0000717 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000718 struct compareInfo *pInfo = sqlite3_user_data(context);
719#ifdef SQLITE_TEST
720 sqlite3_like_count++;
721#endif
drhbeb818d2007-05-08 15:34:47 +0000722
danielk1977b56fe1f2007-05-09 08:24:44 +0000723 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000724 }
drh8912d102002-05-26 21:34:58 +0000725}
726
727/*
728** Implementation of the NULLIF(x,y) function. The result is the first
729** argument if the arguments are different. The result is NULL if the
730** arguments are equal to each other.
731*/
drhf9b596e2004-05-26 16:54:42 +0000732static void nullifFunc(
733 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000734 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +0000735 sqlite3_value **argv
736){
danielk1977dc1bdc42004-06-11 10:51:27 +0000737 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk197762c14b32008-11-19 09:05:26 +0000738 UNUSED_PARAMETER(NotUsed);
danielk1977dc1bdc42004-06-11 10:51:27 +0000739 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000740 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000741 }
drh0ac65892002-04-20 14:24:41 +0000742}
743
drh647cb0e2002-11-04 19:32:25 +0000744/*
drh47baebc2009-08-14 16:01:24 +0000745** Implementation of the sqlite_version() function. The result is the version
drh647cb0e2002-11-04 19:32:25 +0000746** of the SQLite library that is running.
747*/
drhf9b596e2004-05-26 16:54:42 +0000748static void versionFunc(
749 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000750 int NotUsed,
751 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000752){
danielk197762c14b32008-11-19 09:05:26 +0000753 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000754 /* IMP: R-48699-48617 This function is an SQL wrapper around the
755 ** sqlite3_libversion() C-interface. */
756 sqlite3_result_text(context, sqlite3_libversion(), -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000757}
758
drh47baebc2009-08-14 16:01:24 +0000759/*
760** Implementation of the sqlite_source_id() function. The result is a string
761** that identifies the particular version of the source code used to build
762** SQLite.
763*/
764static void sourceidFunc(
765 sqlite3_context *context,
766 int NotUsed,
767 sqlite3_value **NotUsed2
768){
769 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000770 /* IMP: R-24470-31136 This function is an SQL wrapper around the
771 ** sqlite3_sourceid() C interface. */
772 sqlite3_result_text(context, sqlite3_sourceid(), -1, SQLITE_STATIC);
drh47baebc2009-08-14 16:01:24 +0000773}
774
shanehbdea6d12010-02-23 04:19:54 +0000775/*
drh3ca84ef2011-04-25 18:03:10 +0000776** Implementation of the sqlite_log() function. This is a wrapper around
777** sqlite3_log(). The return value is NULL. The function exists purely for
778** its side-effects.
779*/
drh840561f2011-04-27 18:08:42 +0000780static void errlogFunc(
drh3ca84ef2011-04-25 18:03:10 +0000781 sqlite3_context *context,
782 int argc,
783 sqlite3_value **argv
784){
785 UNUSED_PARAMETER(argc);
786 UNUSED_PARAMETER(context);
787 sqlite3_log(sqlite3_value_int(argv[0]), "%s", sqlite3_value_text(argv[1]));
788}
789
790/*
shanehdc97a8c2010-02-23 20:08:35 +0000791** Implementation of the sqlite_compileoption_used() function.
792** The result is an integer that identifies if the compiler option
793** was used to build SQLite.
shanehbdea6d12010-02-23 04:19:54 +0000794*/
shanehdc97a8c2010-02-23 20:08:35 +0000795#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
796static void compileoptionusedFunc(
shanehbdea6d12010-02-23 04:19:54 +0000797 sqlite3_context *context,
shanehdc97a8c2010-02-23 20:08:35 +0000798 int argc,
799 sqlite3_value **argv
shanehbdea6d12010-02-23 04:19:54 +0000800){
shanehdc97a8c2010-02-23 20:08:35 +0000801 const char *zOptName;
802 assert( argc==1 );
803 UNUSED_PARAMETER(argc);
drha3e414c2010-08-03 18:06:25 +0000804 /* IMP: R-39564-36305 The sqlite_compileoption_used() SQL
805 ** function is a wrapper around the sqlite3_compileoption_used() C/C++
806 ** function.
807 */
drh264a2d42010-02-25 15:28:41 +0000808 if( (zOptName = (const char*)sqlite3_value_text(argv[0]))!=0 ){
shanehdc97a8c2010-02-23 20:08:35 +0000809 sqlite3_result_int(context, sqlite3_compileoption_used(zOptName));
shanehdc97a8c2010-02-23 20:08:35 +0000810 }
shanehbdea6d12010-02-23 04:19:54 +0000811}
shanehdc97a8c2010-02-23 20:08:35 +0000812#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
813
814/*
815** Implementation of the sqlite_compileoption_get() function.
816** The result is a string that identifies the compiler options
817** used to build SQLite.
818*/
819#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
820static void compileoptiongetFunc(
821 sqlite3_context *context,
822 int argc,
823 sqlite3_value **argv
824){
825 int n;
826 assert( argc==1 );
827 UNUSED_PARAMETER(argc);
drha3e414c2010-08-03 18:06:25 +0000828 /* IMP: R-04922-24076 The sqlite_compileoption_get() SQL function
829 ** is a wrapper around the sqlite3_compileoption_get() C/C++ function.
830 */
shanehdc97a8c2010-02-23 20:08:35 +0000831 n = sqlite3_value_int(argv[0]);
832 sqlite3_result_text(context, sqlite3_compileoption_get(n), -1, SQLITE_STATIC);
833}
834#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
shanehbdea6d12010-02-23 04:19:54 +0000835
drh137c7282007-01-29 17:58:28 +0000836/* Array for converting from half-bytes (nybbles) into ASCII hex
837** digits. */
838static const char hexdigits[] = {
839 '0', '1', '2', '3', '4', '5', '6', '7',
840 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
841};
danielk1977d641d642004-11-18 15:44:29 +0000842
drh47394702003-08-20 01:03:33 +0000843/*
844** EXPERIMENTAL - This is not an official function. The interface may
845** change. This function may disappear. Do not write code that depends
846** on this function.
847**
848** Implementation of the QUOTE() function. This function takes a single
849** argument. If the argument is numeric, the return value is the same as
850** the argument. If the argument is NULL, the return value is the string
851** "NULL". Otherwise, the argument is enclosed in single quotes with
852** single-quote escapes.
853*/
danielk19770ae8b832004-05-25 12:05:56 +0000854static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drha0df4cc2009-02-02 17:29:59 +0000855 assert( argc==1 );
drh1d34fde2009-02-03 15:50:33 +0000856 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000857 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000858 case SQLITE_INTEGER:
859 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000860 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000861 break;
862 }
danielk19773f41e972004-06-08 00:39:01 +0000863 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000864 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000865 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000866 int nBlob = sqlite3_value_bytes(argv[0]);
867 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000868 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000869 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000870 int i;
871 for(i=0; i<nBlob; i++){
872 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
873 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
874 }
875 zText[(nBlob*2)+2] = '\'';
876 zText[(nBlob*2)+3] = '\0';
877 zText[0] = 'X';
878 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000879 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000880 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000881 }
882 break;
883 }
drh9c054832004-05-31 18:51:57 +0000884 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000885 int i,j;
886 u64 n;
drh2646da72005-12-09 20:02:05 +0000887 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000888 char *z;
889
drh7a521cf2007-04-25 18:23:52 +0000890 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000891 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000892 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000893 if( z ){
894 z[0] = '\'';
895 for(i=0, j=1; zArg[i]; i++){
896 z[j++] = zArg[i];
897 if( zArg[i]=='\'' ){
898 z[j++] = '\'';
899 }
drhf9b596e2004-05-26 16:54:42 +0000900 }
danielk1977a1644fd2007-08-29 12:31:25 +0000901 z[j++] = '\'';
902 z[j] = 0;
903 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000904 }
drha0df4cc2009-02-02 17:29:59 +0000905 break;
906 }
907 default: {
908 assert( sqlite3_value_type(argv[0])==SQLITE_NULL );
909 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
910 break;
drhf9b596e2004-05-26 16:54:42 +0000911 }
drh47394702003-08-20 01:03:33 +0000912 }
913}
914
drh137c7282007-01-29 17:58:28 +0000915/*
916** The hex() function. Interpret the argument as a blob. Return
917** a hexadecimal rendering as text.
918*/
919static void hexFunc(
920 sqlite3_context *context,
921 int argc,
922 sqlite3_value **argv
923){
924 int i, n;
925 const unsigned char *pBlob;
926 char *zHex, *z;
927 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000928 UNUSED_PARAMETER(argc);
drh1f0feef2007-05-15 13:27:07 +0000929 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000930 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000931 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000932 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000933 if( zHex ){
934 for(i=0; i<n; i++, pBlob++){
935 unsigned char c = *pBlob;
936 *(z++) = hexdigits[(c>>4)&0xf];
937 *(z++) = hexdigits[c&0xf];
938 }
939 *z = 0;
940 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000941 }
drh137c7282007-01-29 17:58:28 +0000942}
943
drh26b6d902007-03-17 13:27:54 +0000944/*
drh8cff3822007-05-02 02:08:28 +0000945** The zeroblob(N) function returns a zero-filled blob of size N bytes.
946*/
947static void zeroblobFunc(
948 sqlite3_context *context,
949 int argc,
950 sqlite3_value **argv
951){
drh98640a32007-06-07 19:08:32 +0000952 i64 n;
drh27e62db2009-04-02 10:16:17 +0000953 sqlite3 *db = sqlite3_context_db_handle(context);
drh8cff3822007-05-02 02:08:28 +0000954 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000955 UNUSED_PARAMETER(argc);
drh98640a32007-06-07 19:08:32 +0000956 n = sqlite3_value_int64(argv[0]);
drh27e62db2009-04-02 10:16:17 +0000957 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH] );
958 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
959 if( n>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drh98640a32007-06-07 19:08:32 +0000960 sqlite3_result_error_toobig(context);
961 }else{
drhab2f1f92010-01-11 18:26:42 +0000962 sqlite3_result_zeroblob(context, (int)n); /* IMP: R-00293-64994 */
drh98640a32007-06-07 19:08:32 +0000963 }
drh8cff3822007-05-02 02:08:28 +0000964}
965
966/*
drh26b6d902007-03-17 13:27:54 +0000967** The replace() function. Three arguments are all strings: call
968** them A, B, and C. The result is also a string which is derived
969** from A by replacing every occurance of B with C. The match
970** must be exact. Collating sequences are not used.
971*/
972static void replaceFunc(
973 sqlite3_context *context,
974 int argc,
975 sqlite3_value **argv
976){
977 const unsigned char *zStr; /* The input string A */
978 const unsigned char *zPattern; /* The pattern string B */
979 const unsigned char *zRep; /* The replacement string C */
980 unsigned char *zOut; /* The output */
981 int nStr; /* Size of zStr */
982 int nPattern; /* Size of zPattern */
983 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000984 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000985 int loopLimit; /* Last zStr[] that might match zPattern[] */
986 int i, j; /* Loop counters */
987
988 assert( argc==3 );
danielk1977f3d3c272008-11-19 16:52:44 +0000989 UNUSED_PARAMETER(argc);
drh26b6d902007-03-17 13:27:54 +0000990 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000991 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000992 nStr = sqlite3_value_bytes(argv[0]);
993 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000994 zPattern = sqlite3_value_text(argv[1]);
drha605fe82009-02-01 18:08:40 +0000995 if( zPattern==0 ){
drh23336062009-02-03 13:19:12 +0000996 assert( sqlite3_value_type(argv[1])==SQLITE_NULL
997 || sqlite3_context_db_handle(context)->mallocFailed );
drha605fe82009-02-01 18:08:40 +0000998 return;
999 }
1000 if( zPattern[0]==0 ){
1001 assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
1002 sqlite3_result_value(context, argv[0]);
1003 return;
1004 }
drh1f0feef2007-05-15 13:27:07 +00001005 nPattern = sqlite3_value_bytes(argv[1]);
1006 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +00001007 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +00001008 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +00001009 nRep = sqlite3_value_bytes(argv[2]);
1010 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +00001011 nOut = nStr + 1;
1012 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +00001013 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +00001014 if( zOut==0 ){
1015 return;
drh26b6d902007-03-17 13:27:54 +00001016 }
drh26b6d902007-03-17 13:27:54 +00001017 loopLimit = nStr - nPattern;
1018 for(i=j=0; i<=loopLimit; i++){
1019 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
1020 zOut[j++] = zStr[i];
1021 }else{
drh4a50aac2007-08-23 02:47:53 +00001022 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +00001023 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +00001024 nOut += nRep - nPattern;
drh27e62db2009-04-02 10:16:17 +00001025 testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
1026 testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
1027 if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +00001028 sqlite3_result_error_toobig(context);
drhb9755982010-07-24 16:34:37 +00001029 sqlite3_free(zOut);
danielk197717374e82007-05-08 14:39:04 +00001030 return;
1031 }
drh4a50aac2007-08-23 02:47:53 +00001032 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +00001033 zOut = sqlite3_realloc(zOut, (int)nOut);
1034 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +00001035 sqlite3_result_error_nomem(context);
drhb9755982010-07-24 16:34:37 +00001036 sqlite3_free(zOld);
drh2e6400b2007-05-08 15:46:18 +00001037 return;
1038 }
drh26b6d902007-03-17 13:27:54 +00001039 memcpy(&zOut[j], zRep, nRep);
1040 j += nRep;
1041 i += nPattern-1;
1042 }
1043 }
drh2e6400b2007-05-08 15:46:18 +00001044 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +00001045 memcpy(&zOut[j], &zStr[i], nStr-i);
1046 j += nStr - i;
1047 assert( j<=nOut );
1048 zOut[j] = 0;
1049 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
1050}
1051
drh309b3382007-03-17 17:52:42 +00001052/*
1053** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
1054** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
1055*/
1056static void trimFunc(
1057 sqlite3_context *context,
1058 int argc,
1059 sqlite3_value **argv
1060){
1061 const unsigned char *zIn; /* Input string */
1062 const unsigned char *zCharSet; /* Set of characters to trim */
1063 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +00001064 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +00001065 int i; /* Loop counter */
drh1bd10f82008-12-10 21:19:56 +00001066 unsigned char *aLen = 0; /* Length of each character in zCharSet */
1067 unsigned char **azChar = 0; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +00001068 int nChar; /* Number of characters in zCharSet */
1069
drh309b3382007-03-17 17:52:42 +00001070 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
1071 return;
1072 }
1073 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001074 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +00001075 nIn = sqlite3_value_bytes(argv[0]);
1076 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +00001077 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +00001078 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +00001079 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +00001080 nChar = 1;
drh8cff3822007-05-02 02:08:28 +00001081 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +00001082 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +00001083 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +00001084 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +00001085 return;
drhd1e3a612007-04-27 21:59:52 +00001086 }else{
1087 const unsigned char *z;
1088 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +00001089 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +00001090 }
1091 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +00001092 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +00001093 if( azChar==0 ){
1094 return;
1095 }
1096 aLen = (unsigned char*)&azChar[nChar];
1097 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +00001098 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +00001099 SQLITE_SKIP_UTF8(z);
drh3abbd392008-12-10 23:04:13 +00001100 aLen[nChar] = (u8)(z - azChar[nChar]);
drhd1e3a612007-04-27 21:59:52 +00001101 }
1102 }
drh309b3382007-03-17 17:52:42 +00001103 }
drhd1e3a612007-04-27 21:59:52 +00001104 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +00001105 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +00001106 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +00001107 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +00001108 int len = 0;
drhd1e3a612007-04-27 21:59:52 +00001109 for(i=0; i<nChar; i++){
1110 len = aLen[i];
drh27e62db2009-04-02 10:16:17 +00001111 if( len<=nIn && memcmp(zIn, azChar[i], len)==0 ) break;
drhd1e3a612007-04-27 21:59:52 +00001112 }
1113 if( i>=nChar ) break;
1114 zIn += len;
1115 nIn -= len;
drh309b3382007-03-17 17:52:42 +00001116 }
1117 }
1118 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +00001119 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +00001120 int len = 0;
drhd1e3a612007-04-27 21:59:52 +00001121 for(i=0; i<nChar; i++){
1122 len = aLen[i];
1123 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
1124 }
1125 if( i>=nChar ) break;
1126 nIn -= len;
drh309b3382007-03-17 17:52:42 +00001127 }
1128 }
drhd1e3a612007-04-27 21:59:52 +00001129 if( zCharSet ){
1130 sqlite3_free(azChar);
1131 }
drh309b3382007-03-17 17:52:42 +00001132 }
1133 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
1134}
drh26b6d902007-03-17 13:27:54 +00001135
danielk1977a4de4532008-09-02 15:44:08 +00001136
drh2ba3ccc2009-12-08 02:06:08 +00001137/* IMP: R-25361-16150 This function is omitted from SQLite by default. It
1138** is only available if the SQLITE_SOUNDEX compile-time option is used
1139** when SQLite is built.
1140*/
drhd24cc422003-03-27 12:51:24 +00001141#ifdef SQLITE_SOUNDEX
1142/*
1143** Compute the soundex encoding of a word.
drh2ba3ccc2009-12-08 02:06:08 +00001144**
1145** IMP: R-59782-00072 The soundex(X) function returns a string that is the
1146** soundex encoding of the string X.
drhd24cc422003-03-27 12:51:24 +00001147*/
drh137c7282007-01-29 17:58:28 +00001148static void soundexFunc(
1149 sqlite3_context *context,
1150 int argc,
1151 sqlite3_value **argv
1152){
drhd24cc422003-03-27 12:51:24 +00001153 char zResult[8];
drh4c755c02004-08-08 20:22:17 +00001154 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +00001155 int i, j;
1156 static const unsigned char iCode[] = {
1157 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1158 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1159 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1160 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1161 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1162 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1163 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1164 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1165 };
1166 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +00001167 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +00001168 if( zIn==0 ) zIn = (u8*)"";
drhdc86e2b2009-01-24 11:30:42 +00001169 for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
drhd24cc422003-03-27 12:51:24 +00001170 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +00001171 u8 prevcode = iCode[zIn[i]&0x7f];
danielk197778ca0e72009-01-20 16:53:39 +00001172 zResult[0] = sqlite3Toupper(zIn[i]);
drhd24cc422003-03-27 12:51:24 +00001173 for(j=1; j<4 && zIn[i]; i++){
1174 int code = iCode[zIn[i]&0x7f];
1175 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +00001176 if( code!=prevcode ){
1177 prevcode = code;
1178 zResult[j++] = code + '0';
1179 }
1180 }else{
1181 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +00001182 }
1183 }
1184 while( j<4 ){
1185 zResult[j++] = '0';
1186 }
1187 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001188 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +00001189 }else{
drh2ba3ccc2009-12-08 02:06:08 +00001190 /* IMP: R-64894-50321 The string "?000" is returned if the argument
1191 ** is NULL or contains no ASCII alphabetic characters. */
danielk1977d8123362004-06-12 09:25:12 +00001192 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +00001193 }
1194}
drh2ba3ccc2009-12-08 02:06:08 +00001195#endif /* SQLITE_SOUNDEX */
drhd24cc422003-03-27 12:51:24 +00001196
drhfdb83b22006-06-17 14:12:47 +00001197#ifndef SQLITE_OMIT_LOAD_EXTENSION
1198/*
1199** A function that loads a shared-library extension then returns NULL.
1200*/
1201static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001202 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001203 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001204 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001205 char *zErrMsg = 0;
1206
1207 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001208 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001209 }else{
1210 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001211 }
drh7a521cf2007-04-25 18:23:52 +00001212 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001213 sqlite3_result_error(context, zErrMsg, -1);
1214 sqlite3_free(zErrMsg);
1215 }
1216}
1217#endif
1218
danielk197701427a62005-01-11 13:02:33 +00001219
drh0ac65892002-04-20 14:24:41 +00001220/*
drhd3a149e2002-02-24 17:12:53 +00001221** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001222** sum() or avg() aggregate computation.
1223*/
1224typedef struct SumCtx SumCtx;
1225struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001226 double rSum; /* Floating point sum */
1227 i64 iSum; /* Integer sum */
1228 i64 cnt; /* Number of elements summed */
1229 u8 overflow; /* True if integer overflow seen */
1230 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001231};
1232
1233/*
drha97fdd32006-01-12 22:17:50 +00001234** Routines used to compute the sum, average, and total.
1235**
1236** The SUM() function follows the (broken) SQL standard which means
1237** that it returns NULL if it sums over no inputs. TOTAL returns
1238** 0.0 in that case. In addition, TOTAL always returns a float where
1239** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001240** value. TOTAL never fails, but SUM might through an exception if
1241** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001242*/
danielk19770ae8b832004-05-25 12:05:56 +00001243static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001244 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001245 int type;
drh3f219f42005-09-08 19:45:57 +00001246 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001247 UNUSED_PARAMETER(argc);
drh4f26d6c2004-05-26 23:25:30 +00001248 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001249 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001250 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001251 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001252 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001253 i64 v = sqlite3_value_int64(argv[0]);
1254 p->rSum += v;
drh158b9cb2011-03-05 20:59:46 +00001255 if( (p->approx|p->overflow)==0 && sqlite3AddInt64(&p->iSum, v) ){
1256 p->overflow = 1;
drh29d72102006-02-09 22:13:41 +00001257 }
1258 }else{
drh8c08e862006-02-11 17:34:00 +00001259 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001260 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001261 }
drh739105c2002-05-29 23:22:23 +00001262 }
drhdd5baa92002-02-27 19:50:59 +00001263}
danielk19770ae8b832004-05-25 12:05:56 +00001264static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001265 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001266 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001267 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001268 if( p->overflow ){
1269 sqlite3_result_error(context,"integer overflow",-1);
1270 }else if( p->approx ){
1271 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001272 }else{
drh8c08e862006-02-11 17:34:00 +00001273 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001274 }
drh3d1d95e2005-09-08 10:37:01 +00001275 }
drhdd5baa92002-02-27 19:50:59 +00001276}
danielk19770ae8b832004-05-25 12:05:56 +00001277static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001278 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001279 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001280 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001281 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001282 }
1283}
drha97fdd32006-01-12 22:17:50 +00001284static void totalFinalize(sqlite3_context *context){
1285 SumCtx *p;
1286 p = sqlite3_aggregate_context(context, 0);
shanefbd60f82009-02-04 03:59:25 +00001287 /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
1288 sqlite3_result_double(context, p ? p->rSum : (double)0);
drha97fdd32006-01-12 22:17:50 +00001289}
drhdd5baa92002-02-27 19:50:59 +00001290
1291/*
drh0bce8352002-02-28 00:41:10 +00001292** The following structure keeps track of state information for the
1293** count() aggregate function.
1294*/
1295typedef struct CountCtx CountCtx;
1296struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001297 i64 n;
drh0bce8352002-02-28 00:41:10 +00001298};
drhdd5baa92002-02-27 19:50:59 +00001299
drh0bce8352002-02-28 00:41:10 +00001300/*
1301** Routines to implement the count() aggregate function.
1302*/
danielk19770ae8b832004-05-25 12:05:56 +00001303static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001304 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001305 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001306 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001307 p->n++;
1308 }
drh2e79c3d2009-04-08 23:04:14 +00001309
drhd3264c72009-04-15 13:39:47 +00001310#ifndef SQLITE_OMIT_DEPRECATED
drh2e79c3d2009-04-08 23:04:14 +00001311 /* The sqlite3_aggregate_count() function is deprecated. But just to make
1312 ** sure it still operates correctly, verify that its count agrees with our
1313 ** internal count when using count(*) and when the total count can be
1314 ** expressed as a 32-bit integer. */
1315 assert( argc==1 || p==0 || p->n>0x7fffffff
1316 || p->n==sqlite3_aggregate_count(context) );
drhd3264c72009-04-15 13:39:47 +00001317#endif
drh0bce8352002-02-28 00:41:10 +00001318}
danielk19770ae8b832004-05-25 12:05:56 +00001319static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001320 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001321 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001322 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001323}
1324
1325/*
drh0bce8352002-02-28 00:41:10 +00001326** Routines to implement min() and max() aggregate functions.
1327*/
danielk197762c14b32008-11-19 09:05:26 +00001328static void minmaxStep(
1329 sqlite3_context *context,
1330 int NotUsed,
1331 sqlite3_value **argv
1332){
danielk197788208052004-05-25 01:13:20 +00001333 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001334 Mem *pBest;
danielk197762c14b32008-11-19 09:05:26 +00001335 UNUSED_PARAMETER(NotUsed);
drh9eb516c2004-07-18 20:52:32 +00001336
1337 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1338 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001339 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001340
danielk197788208052004-05-25 01:13:20 +00001341 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001342 int max;
1343 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001344 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001345 /* This step function is used for both the min() and max() aggregates,
1346 ** the only difference between the two being that the sense of the
1347 ** comparison is inverted. For the max() aggregate, the
1348 ** sqlite3_user_data() function returns (void *)-1. For min() it
1349 ** returns (void *)db, where db is the sqlite3* database pointer.
1350 ** Therefore the next statement sets variable 'max' to 1 for the max()
1351 ** aggregate, or 0 for min().
1352 */
drh309b3382007-03-17 17:52:42 +00001353 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001354 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001355 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001356 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001357 }
drh268380c2004-02-25 13:47:31 +00001358 }else{
drhb21c8cd2007-08-21 19:33:56 +00001359 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001360 }
1361}
danielk19770ae8b832004-05-25 12:05:56 +00001362static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001363 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001364 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1365 if( pRes ){
drhd27135a2009-04-02 13:36:37 +00001366 if( ALWAYS(pRes->flags) ){
drhabfcea22005-09-06 20:36:48 +00001367 sqlite3_result_value(context, pRes);
1368 }
1369 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001370 }
1371}
drhdd5baa92002-02-27 19:50:59 +00001372
drhb0689692007-11-01 17:38:30 +00001373/*
1374** group_concat(EXPR, ?SEPARATOR?)
1375*/
1376static void groupConcatStep(
1377 sqlite3_context *context,
1378 int argc,
1379 sqlite3_value **argv
1380){
1381 const char *zVal;
drhade86482007-11-28 22:36:40 +00001382 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001383 const char *zSep;
drh07d31172009-02-02 21:57:05 +00001384 int nVal, nSep;
1385 assert( argc==1 || argc==2 );
1386 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001387 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1388
1389 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001390 sqlite3 *db = sqlite3_context_db_handle(context);
drh8bfd7192009-06-19 16:44:41 +00001391 int firstTerm = pAccum->useMalloc==0;
drhb9755982010-07-24 16:34:37 +00001392 pAccum->useMalloc = 2;
drhbb4957f2008-03-20 14:03:29 +00001393 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drh8bfd7192009-06-19 16:44:41 +00001394 if( !firstTerm ){
drh07d31172009-02-02 21:57:05 +00001395 if( argc==2 ){
1396 zSep = (char*)sqlite3_value_text(argv[1]);
1397 nSep = sqlite3_value_bytes(argv[1]);
drhb0689692007-11-01 17:38:30 +00001398 }else{
1399 zSep = ",";
drhade86482007-11-28 22:36:40 +00001400 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001401 }
drhade86482007-11-28 22:36:40 +00001402 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001403 }
drh07d31172009-02-02 21:57:05 +00001404 zVal = (char*)sqlite3_value_text(argv[0]);
1405 nVal = sqlite3_value_bytes(argv[0]);
1406 sqlite3StrAccumAppend(pAccum, zVal, nVal);
drhb0689692007-11-01 17:38:30 +00001407 }
1408}
1409static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001410 StrAccum *pAccum;
1411 pAccum = sqlite3_aggregate_context(context, 0);
1412 if( pAccum ){
1413 if( pAccum->tooBig ){
1414 sqlite3_result_error_toobig(context);
1415 }else if( pAccum->mallocFailed ){
1416 sqlite3_result_error_nomem(context);
1417 }else{
1418 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1419 sqlite3_free);
1420 }
drhb0689692007-11-01 17:38:30 +00001421 }
1422}
drh4e5ffc52004-08-31 00:52:37 +00001423
drhd3a149e2002-02-24 17:12:53 +00001424/*
drha4741842010-04-25 20:58:37 +00001425** This routine does per-connection function registration. Most
1426** of the built-in functions above are part of the global function set.
1427** This routine only deals with those that are not global.
drhdc04c582002-02-24 01:55:15 +00001428*/
drh9bb575f2004-09-06 17:24:11 +00001429void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drha4741842010-04-25 20:58:37 +00001430 int rc = sqlite3_overload_function(db, "MATCH", 2);
1431 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1432 if( rc==SQLITE_NOMEM ){
1433 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001434 }
drh55ef4d92005-08-14 01:20:37 +00001435}
1436
1437/*
1438** Set the LIKEOPT flag on the 2-argument function with the given name.
1439*/
drh1bd10f82008-12-10 21:19:56 +00001440static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
drh55ef4d92005-08-14 01:20:37 +00001441 FuncDef *pDef;
drhea678832008-12-10 19:26:22 +00001442 pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
1443 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001444 if( ALWAYS(pDef) ){
drhd64fe2f2005-08-28 17:00:23 +00001445 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001446 }
1447}
1448
1449/*
1450** Register the built-in LIKE and GLOB functions. The caseSensitive
1451** parameter determines whether or not the LIKE operator is case
1452** sensitive. GLOB is always case sensitive.
1453*/
1454void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1455 struct compareInfo *pInfo;
1456 if( caseSensitive ){
1457 pInfo = (struct compareInfo*)&likeInfoAlt;
1458 }else{
1459 pInfo = (struct compareInfo*)&likeInfoNorm;
1460 }
drh901e9942010-12-15 18:54:37 +00001461 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0);
1462 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0);
1463 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
dand2199f02010-08-27 17:48:52 +00001464 (struct compareInfo*)&globInfo, likeFunc, 0, 0, 0);
drhd64fe2f2005-08-28 17:00:23 +00001465 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1466 setLikeOptFlag(db, "like",
1467 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001468}
1469
1470/*
1471** pExpr points to an expression which implements a function. If
1472** it is appropriate to apply the LIKE optimization to that function
1473** then set aWc[0] through aWc[2] to the wildcard characters and
1474** return TRUE. If the function is not a LIKE-style function then
1475** return FALSE.
1476*/
drhd64fe2f2005-08-28 17:00:23 +00001477int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001478 FuncDef *pDef;
danielk19776ab3a2e2009-02-19 14:39:25 +00001479 if( pExpr->op!=TK_FUNCTION
1480 || !pExpr->x.pList
1481 || pExpr->x.pList->nExpr!=2
1482 ){
drh55ef4d92005-08-14 01:20:37 +00001483 return 0;
1484 }
danielk19776ab3a2e2009-02-19 14:39:25 +00001485 assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
drh33e619f2009-05-28 01:00:55 +00001486 pDef = sqlite3FindFunction(db, pExpr->u.zToken,
1487 sqlite3Strlen30(pExpr->u.zToken),
drhb7916a72009-05-27 10:31:29 +00001488 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001489 if( NEVER(pDef==0) || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001490 return 0;
1491 }
1492
1493 /* The memcpy() statement assumes that the wildcard characters are
1494 ** the first three statements in the compareInfo structure. The
1495 ** asserts() that follow verify that assumption
1496 */
1497 memcpy(aWc, pDef->pUserData, 3);
1498 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1499 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1500 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001501 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001502 return 1;
drhdc04c582002-02-24 01:55:15 +00001503}
danielk19778c0a7912008-08-20 14:49:23 +00001504
drh70a8ca32008-08-21 18:49:27 +00001505/*
drh777c5382008-08-21 20:21:34 +00001506** All all of the FuncDef structures in the aBuiltinFunc[] array above
1507** to the global function hash table. This occurs at start-time (as
1508** a consequence of calling sqlite3_initialize()).
1509**
1510** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001511*/
1512void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001513 /*
1514 ** The following array holds FuncDef structures for all of the functions
1515 ** defined in this file.
1516 **
1517 ** The array cannot be constant since changes are made to the
1518 ** FuncDef.pHash elements at start-time. The elements of this array
1519 ** are read-only after initialization is complete.
1520 */
1521 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1522 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1523 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1524 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1525 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1526 FUNCTION(trim, 1, 3, 0, trimFunc ),
1527 FUNCTION(trim, 2, 3, 0, trimFunc ),
1528 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1529 FUNCTION(min, 0, 0, 1, 0 ),
1530 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1531 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1532 FUNCTION(max, 0, 1, 1, 0 ),
1533 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1534 FUNCTION(typeof, 1, 0, 0, typeofFunc ),
1535 FUNCTION(length, 1, 0, 0, lengthFunc ),
1536 FUNCTION(substr, 2, 0, 0, substrFunc ),
1537 FUNCTION(substr, 3, 0, 0, substrFunc ),
1538 FUNCTION(abs, 1, 0, 0, absFunc ),
shanefbd60f82009-02-04 03:59:25 +00001539#ifndef SQLITE_OMIT_FLOATING_POINT
danielk197793ce7412008-09-01 19:14:02 +00001540 FUNCTION(round, 1, 0, 0, roundFunc ),
1541 FUNCTION(round, 2, 0, 0, roundFunc ),
shanefbd60f82009-02-04 03:59:25 +00001542#endif
danielk197793ce7412008-09-01 19:14:02 +00001543 FUNCTION(upper, 1, 0, 0, upperFunc ),
1544 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1545 FUNCTION(coalesce, 1, 0, 0, 0 ),
danielk197793ce7412008-09-01 19:14:02 +00001546 FUNCTION(coalesce, 0, 0, 0, 0 ),
drhae6bb952009-11-11 00:24:31 +00001547/* FUNCTION(coalesce, -1, 0, 0, ifnullFunc ), */
drh6ac78a02010-09-28 14:26:36 +00001548 {-1,SQLITE_UTF8,SQLITE_FUNC_COALESCE,0,0,ifnullFunc,0,0,"coalesce",0,0},
danielk197793ce7412008-09-01 19:14:02 +00001549 FUNCTION(hex, 1, 0, 0, hexFunc ),
drhae6bb952009-11-11 00:24:31 +00001550/* FUNCTION(ifnull, 2, 0, 0, ifnullFunc ), */
drh6ac78a02010-09-28 14:26:36 +00001551 {2,SQLITE_UTF8,SQLITE_FUNC_COALESCE,0,0,ifnullFunc,0,0,"ifnull",0,0},
drh9373b012009-02-02 01:50:39 +00001552 FUNCTION(random, 0, 0, 0, randomFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001553 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1554 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1555 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
drh47baebc2009-08-14 16:01:24 +00001556 FUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ),
drh840561f2011-04-27 18:08:42 +00001557 FUNCTION(sqlite_log, 2, 0, 0, errlogFunc ),
shanehdc97a8c2010-02-23 20:08:35 +00001558#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
drh8bb76d32010-02-26 16:37:47 +00001559 FUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc ),
1560 FUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc ),
shanehdc97a8c2010-02-23 20:08:35 +00001561#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
danielk197793ce7412008-09-01 19:14:02 +00001562 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1563 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1564 FUNCTION(changes, 0, 0, 0, changes ),
1565 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1566 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1567 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1568 #ifdef SQLITE_SOUNDEX
1569 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1570 #endif
1571 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1572 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1573 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1574 #endif
1575 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1576 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1577 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
danielk1977a5533162009-02-24 10:01:51 +00001578 /* AGGREGATE(count, 0, 0, 0, countStep, countFinalize ), */
drh6ac78a02010-09-28 14:26:36 +00001579 {0,SQLITE_UTF8,SQLITE_FUNC_COUNT,0,0,0,countStep,countFinalize,"count",0,0},
danielk197793ce7412008-09-01 19:14:02 +00001580 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
drh07d31172009-02-02 21:57:05 +00001581 AGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize),
1582 AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize),
danielk197793ce7412008-09-01 19:14:02 +00001583
1584 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1585 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1586 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1587 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1588 #else
1589 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1590 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1591 #endif
1592 };
1593
drh70a8ca32008-08-21 18:49:27 +00001594 int i;
danielk197793ce7412008-09-01 19:14:02 +00001595 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001596 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001597
drh70a8ca32008-08-21 18:49:27 +00001598 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001599 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001600 }
drh777c5382008-08-21 20:21:34 +00001601 sqlite3RegisterDateTimeFunctions();
drh545f5872010-04-24 14:02:59 +00001602#ifndef SQLITE_OMIT_ALTERTABLE
1603 sqlite3AlterFunctions();
1604#endif
drh70a8ca32008-08-21 18:49:27 +00001605}