blob: 224f88f082f5e56adb655790c433615b79ce6b06 [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.
18**
drhb21c8cd2007-08-21 19:33:56 +000019** $Id: func.c,v 1.168 2007/08/21 19:33:56 drh Exp $
drhdc04c582002-02-24 01:55:15 +000020*/
drhb659e9b2005-01-28 01:29:08 +000021#include "sqliteInt.h"
drhdc04c582002-02-24 01:55:15 +000022#include <ctype.h>
drhd3a149e2002-02-24 17:12:53 +000023#include <stdlib.h>
drh0bce8352002-02-28 00:41:10 +000024#include <assert.h>
danielk197788208052004-05-25 01:13:20 +000025#include "vdbeInt.h"
drh0bce8352002-02-28 00:41:10 +000026
drh66150952007-07-23 19:12:41 +000027
drh55ef4d92005-08-14 01:20:37 +000028/*
29** Return the collating function associated with a function.
30*/
danielk1977dc1bdc42004-06-11 10:51:27 +000031static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
32 return context->pColl;
33}
34
drh0bce8352002-02-28 00:41:10 +000035/*
36** Implementation of the non-aggregate min() and max() functions
37*/
drhf9b596e2004-05-26 16:54:42 +000038static void minmaxFunc(
39 sqlite3_context *context,
40 int argc,
41 sqlite3_value **argv
42){
drh0bce8352002-02-28 00:41:10 +000043 int i;
drh268380c2004-02-25 13:47:31 +000044 int mask; /* 0 for min() or 0xffffffff for max() */
drhf9b596e2004-05-26 16:54:42 +000045 int iBest;
danielk1977dc1bdc42004-06-11 10:51:27 +000046 CollSeq *pColl;
drh0bce8352002-02-28 00:41:10 +000047
drh89425d52002-02-28 03:04:48 +000048 if( argc==0 ) return;
drhc44af712004-09-02 15:53:56 +000049 mask = sqlite3_user_data(context)==0 ? 0 : -1;
danielk1977dc1bdc42004-06-11 10:51:27 +000050 pColl = sqlite3GetFuncCollSeq(context);
51 assert( pColl );
danielk1977c572ef72004-05-27 09:28:41 +000052 assert( mask==-1 || mask==0 );
drhf9b596e2004-05-26 16:54:42 +000053 iBest = 0;
drh9c054832004-05-31 18:51:57 +000054 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhf9b596e2004-05-26 16:54:42 +000055 for(i=1; i<argc; i++){
drh9c054832004-05-31 18:51:57 +000056 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
danielk1977dc1bdc42004-06-11 10:51:27 +000057 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
drhf9b596e2004-05-26 16:54:42 +000058 iBest = i;
drh0bce8352002-02-28 00:41:10 +000059 }
60 }
drhf4479502004-05-27 03:12:53 +000061 sqlite3_result_value(context, argv[iBest]);
drh0bce8352002-02-28 00:41:10 +000062}
drh0bce8352002-02-28 00:41:10 +000063
drh268380c2004-02-25 13:47:31 +000064/*
65** Return the type of the argument.
66*/
drhf9b596e2004-05-26 16:54:42 +000067static void typeofFunc(
68 sqlite3_context *context,
69 int argc,
70 sqlite3_value **argv
71){
danielk197735bb9d02004-05-24 12:55:54 +000072 const char *z = 0;
danielk197735bb9d02004-05-24 12:55:54 +000073 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000074 case SQLITE_NULL: z = "null"; break;
75 case SQLITE_INTEGER: z = "integer"; break;
76 case SQLITE_TEXT: z = "text"; break;
77 case SQLITE_FLOAT: z = "real"; break;
78 case SQLITE_BLOB: z = "blob"; break;
danielk197735bb9d02004-05-24 12:55:54 +000079 }
danielk1977d8123362004-06-12 09:25:12 +000080 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000081}
82
drh5708d2d2005-06-22 10:53:59 +000083
84/*
drh0bce8352002-02-28 00:41:10 +000085** Implementation of the length() function
86*/
drhf9b596e2004-05-26 16:54:42 +000087static void lengthFunc(
88 sqlite3_context *context,
89 int argc,
90 sqlite3_value **argv
91){
drh0bce8352002-02-28 00:41:10 +000092 int len;
93
94 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +000095 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000096 case SQLITE_BLOB:
97 case SQLITE_INTEGER:
98 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +000099 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +0000100 break;
101 }
drh9c054832004-05-31 18:51:57 +0000102 case SQLITE_TEXT: {
drh2646da72005-12-09 20:02:05 +0000103 const unsigned char *z = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000104 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000105 len = 0;
106 while( *z ){
107 len++;
108 SQLITE_SKIP_UTF8(z);
109 }
drhf4479502004-05-27 03:12:53 +0000110 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000111 break;
112 }
113 default: {
114 sqlite3_result_null(context);
115 break;
116 }
117 }
drh0bce8352002-02-28 00:41:10 +0000118}
119
120/*
121** Implementation of the abs() function
122*/
danielk19770ae8b832004-05-25 12:05:56 +0000123static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000124 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +0000125 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000126 case SQLITE_INTEGER: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000127 i64 iVal = sqlite3_value_int64(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000128 if( iVal<0 ){
129 if( (iVal<<1)==0 ){
130 sqlite3_result_error(context, "integer overflow", -1);
131 return;
132 }
133 iVal = -iVal;
134 }
danielk1977f93bbbe2004-05-27 10:30:52 +0000135 sqlite3_result_int64(context, iVal);
drhf9b596e2004-05-26 16:54:42 +0000136 break;
137 }
drh9c054832004-05-31 18:51:57 +0000138 case SQLITE_NULL: {
drhf9b596e2004-05-26 16:54:42 +0000139 sqlite3_result_null(context);
140 break;
141 }
142 default: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000143 double rVal = sqlite3_value_double(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000144 if( rVal<0 ) rVal = -rVal;
danielk1977f93bbbe2004-05-27 10:30:52 +0000145 sqlite3_result_double(context, rVal);
drhf9b596e2004-05-26 16:54:42 +0000146 break;
147 }
148 }
drh0bce8352002-02-28 00:41:10 +0000149}
150
151/*
drhf764e6f2007-05-15 01:13:47 +0000152** Implementation of the substr() function.
153**
154** substr(x,p1,p2) returns p2 characters of x[] beginning with p1.
155** p1 is 1-indexed. So substr(x,1,1) returns the first character
156** of x. If x is text, then we actually count UTF-8 characters.
157** If x is a blob, then we count bytes.
158**
159** If p1 is negative, then we begin abs(p1) from the end of x[].
drh0bce8352002-02-28 00:41:10 +0000160*/
drhf9b596e2004-05-26 16:54:42 +0000161static void substrFunc(
162 sqlite3_context *context,
163 int argc,
164 sqlite3_value **argv
165){
drh2646da72005-12-09 20:02:05 +0000166 const unsigned char *z;
167 const unsigned char *z2;
drh023ae032007-05-08 12:12:16 +0000168 int len;
drhf764e6f2007-05-15 01:13:47 +0000169 int p0type;
drh023ae032007-05-08 12:12:16 +0000170 i64 p1, p2;
drhf9b596e2004-05-26 16:54:42 +0000171
drh0bce8352002-02-28 00:41:10 +0000172 assert( argc==3 );
drhf764e6f2007-05-15 01:13:47 +0000173 p0type = sqlite3_value_type(argv[0]);
174 if( p0type==SQLITE_BLOB ){
175 len = sqlite3_value_bytes(argv[0]);
176 z = sqlite3_value_blob(argv[0]);
177 if( z==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000178 assert( len==sqlite3_value_bytes(argv[0]) );
drhf764e6f2007-05-15 01:13:47 +0000179 }else{
180 z = sqlite3_value_text(argv[0]);
181 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000182 len = 0;
183 for(z2=z; *z2; len++){
184 SQLITE_SKIP_UTF8(z2);
185 }
drhf764e6f2007-05-15 01:13:47 +0000186 }
danielk197751ad0ec2004-05-24 12:39:02 +0000187 p1 = sqlite3_value_int(argv[1]);
188 p2 = sqlite3_value_int(argv[2]);
drh0bce8352002-02-28 00:41:10 +0000189 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000190 p1 += len;
drh653bc752002-02-28 03:31:10 +0000191 if( p1<0 ){
192 p2 += p1;
193 p1 = 0;
194 }
drh0bce8352002-02-28 00:41:10 +0000195 }else if( p1>0 ){
196 p1--;
197 }
198 if( p1+p2>len ){
199 p2 = len-p1;
200 }
drhf764e6f2007-05-15 01:13:47 +0000201 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000202 while( *z && p1 ){
203 SQLITE_SKIP_UTF8(z);
204 p1--;
drhf764e6f2007-05-15 01:13:47 +0000205 }
drh4a919112007-05-15 11:55:09 +0000206 for(z2=z; *z2 && p2; p2--){
207 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000208 }
drh4a919112007-05-15 11:55:09 +0000209 sqlite3_result_text(context, (char*)z, z2-z, SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000210 }else{
211 if( p2<0 ) p2 = 0;
212 sqlite3_result_blob(context, (char*)&z[p1], p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000213 }
drh0bce8352002-02-28 00:41:10 +0000214}
215
216/*
217** Implementation of the round() function
218*/
danielk19770ae8b832004-05-25 12:05:56 +0000219static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000220 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000221 double r;
drh592ac8c2005-08-13 03:07:47 +0000222 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000223 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000224 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000225 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000226 n = sqlite3_value_int(argv[1]);
227 if( n>30 ) n = 30;
228 if( n<0 ) n = 0;
229 }
drhd589a922006-03-02 03:02:48 +0000230 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000231 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000232 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000233 sqlite3AtoF(zBuf, &r);
234 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000235}
drhdc04c582002-02-24 01:55:15 +0000236
237/*
238** Implementation of the upper() and lower() SQL functions.
239*/
danielk19770ae8b832004-05-25 12:05:56 +0000240static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000241 char *z1;
242 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000243 int i, n;
drh9c054832004-05-31 18:51:57 +0000244 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000245 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000246 n = sqlite3_value_bytes(argv[0]);
247 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
248 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000249 if( z2 ){
drh9310ef22007-04-27 17:16:20 +0000250 z1 = sqlite3_malloc(n+1);
drh7a521cf2007-04-25 18:23:52 +0000251 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000252 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000253 for(i=0; z1[i]; i++){
254 z1[i] = toupper(z1[i]);
255 }
256 sqlite3_result_text(context, z1, -1, sqlite3_free);
257 }
drhdc04c582002-02-24 01:55:15 +0000258 }
259}
danielk19770ae8b832004-05-25 12:05:56 +0000260static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000261 char *z1;
262 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000263 int i, n;
drh9c054832004-05-31 18:51:57 +0000264 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000265 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000266 n = sqlite3_value_bytes(argv[0]);
267 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
268 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000269 if( z2 ){
drh9310ef22007-04-27 17:16:20 +0000270 z1 = sqlite3_malloc(n+1);
drh7a521cf2007-04-25 18:23:52 +0000271 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000272 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000273 for(i=0; z1[i]; i++){
274 z1[i] = tolower(z1[i]);
275 }
276 sqlite3_result_text(context, z1, -1, sqlite3_free);
277 }
drhdc04c582002-02-24 01:55:15 +0000278 }
279}
280
281/*
drhfbc99082002-02-28 03:14:18 +0000282** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000283** All three do the same thing. They return the first non-NULL
284** argument.
drh3212e182002-02-28 00:46:26 +0000285*/
drhf9b596e2004-05-26 16:54:42 +0000286static void ifnullFunc(
287 sqlite3_context *context,
288 int argc,
289 sqlite3_value **argv
290){
drhfbc99082002-02-28 03:14:18 +0000291 int i;
292 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000293 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000294 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000295 break;
296 }
297 }
drh3212e182002-02-28 00:46:26 +0000298}
299
300/*
drhf9ffac92002-03-02 19:00:31 +0000301** Implementation of random(). Return a random integer.
302*/
drhf9b596e2004-05-26 16:54:42 +0000303static void randomFunc(
304 sqlite3_context *context,
305 int argc,
306 sqlite3_value **argv
307){
drh52fc8492006-02-23 21:43:55 +0000308 sqlite_int64 r;
danielk19774adee202004-05-08 08:23:19 +0000309 sqlite3Randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000310 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
311 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000312 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000313}
314
315/*
drh137c7282007-01-29 17:58:28 +0000316** Implementation of randomblob(N). Return a random blob
317** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000318*/
drh137c7282007-01-29 17:58:28 +0000319static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000320 sqlite3_context *context,
321 int argc,
322 sqlite3_value **argv
323){
drh137c7282007-01-29 17:58:28 +0000324 int n;
325 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000326 assert( argc==1 );
327 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000328 if( n<1 ){
329 n = 1;
330 }
331 if( n>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000332 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000333 return;
334 }
drh17435752007-08-16 04:30:38 +0000335 p = sqlite3_malloc(n);
drh02d85832007-05-07 19:31:15 +0000336 if( p ){
337 sqlite3Randomness(n, p);
drh17435752007-08-16 04:30:38 +0000338 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000339 }
drh63cf66f2007-01-29 15:50:05 +0000340}
341
342/*
drh6ed41ad2002-04-06 14:10:47 +0000343** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000344** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000345*/
danielk197751ad0ec2004-05-24 12:39:02 +0000346static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000347 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000348 int arg,
349 sqlite3_value **argv
350){
drh9bb575f2004-09-06 17:24:11 +0000351 sqlite3 *db = sqlite3_user_data(context);
drhf9b596e2004-05-26 16:54:42 +0000352 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000353}
354
rdcf146a772004-02-25 22:51:06 +0000355/*
danielk1977b28af712004-06-21 06:50:26 +0000356** Implementation of the changes() SQL function. The return value is the
357** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000358*/
danielk1977b28af712004-06-21 06:50:26 +0000359static void changes(
drhf9b596e2004-05-26 16:54:42 +0000360 sqlite3_context *context,
361 int arg,
362 sqlite3_value **argv
363){
drh9bb575f2004-09-06 17:24:11 +0000364 sqlite3 *db = sqlite3_user_data(context);
drhf4479502004-05-27 03:12:53 +0000365 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000366}
rdcf146a772004-02-25 22:51:06 +0000367
368/*
danielk1977b28af712004-06-21 06:50:26 +0000369** Implementation of the total_changes() SQL function. The return value is
370** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000371*/
danielk1977b28af712004-06-21 06:50:26 +0000372static void total_changes(
373 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000374 int arg,
375 sqlite3_value **argv
376){
drh9bb575f2004-09-06 17:24:11 +0000377 sqlite3 *db = sqlite3_user_data(context);
danielk1977b28af712004-06-21 06:50:26 +0000378 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000379}
380
drh6ed41ad2002-04-06 14:10:47 +0000381/*
drh4e5ffc52004-08-31 00:52:37 +0000382** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000383*/
drh4e5ffc52004-08-31 00:52:37 +0000384struct compareInfo {
385 u8 matchAll;
386 u8 matchOne;
387 u8 matchSet;
388 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000389};
drh55ef4d92005-08-14 01:20:37 +0000390
drh4e5ffc52004-08-31 00:52:37 +0000391static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000392/* The correct SQL-92 behavior is for the LIKE operator to ignore
393** case. Thus 'a' LIKE 'A' would be true. */
394static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
395/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
396** is case sensitive causing 'a' LIKE 'A' to be false */
397static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000398
399/*
drh4e5ffc52004-08-31 00:52:37 +0000400** Compare two UTF-8 strings for equality where the first string can
401** potentially be a "glob" expression. Return true (1) if they
402** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000403**
drh4e5ffc52004-08-31 00:52:37 +0000404** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000405**
drh4e5ffc52004-08-31 00:52:37 +0000406** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000407**
drh4e5ffc52004-08-31 00:52:37 +0000408** '?' Matches exactly one character.
409**
410** [...] Matches one character from the enclosed list of
411** characters.
412**
413** [^...] Matches one character not in the enclosed list.
414**
415** With the [...] and [^...] matching, a ']' character can be included
416** in the list by making it the first character after '[' or '^'. A
417** range of characters can be specified using '-'. Example:
418** "[a-z]" matches any single lower-case letter. To match a '-', make
419** it the last character in the list.
420**
421** This routine is usually quick, but can be N**2 in the worst case.
422**
423** Hints: to match '*' or '?', put them in "[]". Like this:
424**
425** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000426*/
danielk19777c6303c2004-11-17 16:41:29 +0000427static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000428 const u8 *zPattern, /* The glob pattern */
429 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000430 const struct compareInfo *pInfo, /* Information about how to do the compare */
431 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000432){
drh66150952007-07-23 19:12:41 +0000433 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000434 int invert;
435 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000436 u8 matchOne = pInfo->matchOne;
437 u8 matchAll = pInfo->matchAll;
438 u8 matchSet = pInfo->matchSet;
439 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000440 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000441
drh66150952007-07-23 19:12:41 +0000442 while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000443 if( !prevEscape && c==matchAll ){
drh66150952007-07-23 19:12:41 +0000444 while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll
445 || c == matchOne ){
446 if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){
447 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000448 }
danielk1977ad7dd422004-06-06 12:41:49 +0000449 }
drh66150952007-07-23 19:12:41 +0000450 if( c==0 ){
451 return 1;
452 }else if( c==esc ){
453 c = sqlite3Utf8Read(zPattern, 0, &zPattern);
454 if( c==0 ){
455 return 0;
456 }
457 }else if( c==matchSet ){
458 assert( esc==0 ); /* This is GLOB, not LIKE */
459 assert( matchSet<0x80 ); /* '[' is a single-byte character */
460 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000461 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000462 }
463 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000464 }
465 while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){
466 if( noCase ){
467 c2 = c2<0x80 ? sqlite3UpperToLower[c2] : c2;
468 c = c<0x80 ? sqlite3UpperToLower[c] : c;
469 while( c2 != 0 && c2 != c ){
470 c2 = sqlite3Utf8Read(zString, 0, &zString);
471 if( c2<0x80 ) c2 = sqlite3UpperToLower[c2];
drh4e5ffc52004-08-31 00:52:37 +0000472 }
drh66150952007-07-23 19:12:41 +0000473 }else{
474 while( c2 != 0 && c2 != c ){
475 c2 = sqlite3Utf8Read(zString, 0, &zString);
476 }
drh4e5ffc52004-08-31 00:52:37 +0000477 }
drh66150952007-07-23 19:12:41 +0000478 if( c2==0 ) return 0;
479 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
480 }
481 return 0;
482 }else if( !prevEscape && c==matchOne ){
483 if( sqlite3Utf8Read(zString, 0, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000484 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000485 }
drh4e5ffc52004-08-31 00:52:37 +0000486 }else if( c==matchSet ){
487 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000488 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000489 seen = 0;
490 invert = 0;
drh66150952007-07-23 19:12:41 +0000491 c = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000492 if( c==0 ) return 0;
drh66150952007-07-23 19:12:41 +0000493 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
494 if( c2=='^' ){
495 invert = 1;
496 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
497 }
drh4e5ffc52004-08-31 00:52:37 +0000498 if( c2==']' ){
499 if( c==']' ) seen = 1;
drh66150952007-07-23 19:12:41 +0000500 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000501 }
drh66150952007-07-23 19:12:41 +0000502 while( c2 && c2!=']' ){
503 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
504 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000505 if( c>=prior_c && c<=c2 ) seen = 1;
506 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000507 }else{
drh66150952007-07-23 19:12:41 +0000508 if( c==c2 ){
509 seen = 1;
510 }
drh4e5ffc52004-08-31 00:52:37 +0000511 prior_c = c2;
512 }
drh66150952007-07-23 19:12:41 +0000513 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000514 }
drh66150952007-07-23 19:12:41 +0000515 if( c2==0 || (seen ^ invert)==0 ){
516 return 0;
517 }
518 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000519 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000520 }else{
drh66150952007-07-23 19:12:41 +0000521 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000522 if( noCase ){
drh66150952007-07-23 19:12:41 +0000523 c = c<0x80 ? sqlite3UpperToLower[c] : c;
524 c2 = c2<0x80 ? sqlite3UpperToLower[c2] : c2;
drh4e5ffc52004-08-31 00:52:37 +0000525 }
drh66150952007-07-23 19:12:41 +0000526 if( c!=c2 ){
527 return 0;
528 }
danielk19777c6303c2004-11-17 16:41:29 +0000529 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000530 }
danielk197751ad0ec2004-05-24 12:39:02 +0000531 }
drh4e5ffc52004-08-31 00:52:37 +0000532 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000533}
drh4e5ffc52004-08-31 00:52:37 +0000534
drh55ef4d92005-08-14 01:20:37 +0000535/*
536** Count the number of times that the LIKE operator (or GLOB which is
537** just a variation of LIKE) gets called. This is used for testing
538** only.
539*/
540#ifdef SQLITE_TEST
541int sqlite3_like_count = 0;
542#endif
543
danielk19773f6b0872004-06-17 05:36:44 +0000544
545/*
546** Implementation of the like() SQL function. This function implements
547** the build-in LIKE operator. The first argument to the function is the
548** pattern and the second argument is the string. So, the SQL statements:
549**
550** A LIKE B
551**
552** is implemented as like(B,A).
553**
drh55ef4d92005-08-14 01:20:37 +0000554** This same function (with a different compareInfo structure) computes
555** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000556*/
557static void likeFunc(
558 sqlite3_context *context,
559 int argc,
560 sqlite3_value **argv
561){
drhbeb818d2007-05-08 15:34:47 +0000562 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000563 int escape = 0;
drhbeb818d2007-05-08 15:34:47 +0000564
drh1f0feef2007-05-15 13:27:07 +0000565 zB = sqlite3_value_text(argv[0]);
566 zA = sqlite3_value_text(argv[1]);
567
drhbeb818d2007-05-08 15:34:47 +0000568 /* Limit the length of the LIKE or GLOB pattern to avoid problems
569 ** of deep recursion and N*N behavior in patternCompare().
570 */
danielk1977b56fe1f2007-05-09 08:24:44 +0000571 if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){
drhbeb818d2007-05-08 15:34:47 +0000572 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
573 return;
574 }
drh1f0feef2007-05-15 13:27:07 +0000575 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000576
danielk19777c6303c2004-11-17 16:41:29 +0000577 if( argc==3 ){
578 /* The escape character string must consist of a single UTF-8 character.
579 ** Otherwise, return an error.
580 */
581 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000582 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000583 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000584 sqlite3_result_error(context,
585 "ESCAPE expression must be a single character", -1);
586 return;
587 }
drh66150952007-07-23 19:12:41 +0000588 escape = sqlite3Utf8Read(zEsc, 0, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000589 }
danielk19773f6b0872004-06-17 05:36:44 +0000590 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000591 struct compareInfo *pInfo = sqlite3_user_data(context);
592#ifdef SQLITE_TEST
593 sqlite3_like_count++;
594#endif
drhbeb818d2007-05-08 15:34:47 +0000595
danielk1977b56fe1f2007-05-09 08:24:44 +0000596 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000597 }
drh8912d102002-05-26 21:34:58 +0000598}
599
600/*
601** Implementation of the NULLIF(x,y) function. The result is the first
602** argument if the arguments are different. The result is NULL if the
603** arguments are equal to each other.
604*/
drhf9b596e2004-05-26 16:54:42 +0000605static void nullifFunc(
606 sqlite3_context *context,
607 int argc,
608 sqlite3_value **argv
609){
danielk1977dc1bdc42004-06-11 10:51:27 +0000610 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
611 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000612 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000613 }
drh0ac65892002-04-20 14:24:41 +0000614}
615
drh647cb0e2002-11-04 19:32:25 +0000616/*
617** Implementation of the VERSION(*) function. The result is the version
618** of the SQLite library that is running.
619*/
drhf9b596e2004-05-26 16:54:42 +0000620static void versionFunc(
621 sqlite3_context *context,
622 int argc,
623 sqlite3_value **argv
624){
danielk1977d8123362004-06-12 09:25:12 +0000625 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000626}
627
drh137c7282007-01-29 17:58:28 +0000628/* Array for converting from half-bytes (nybbles) into ASCII hex
629** digits. */
630static const char hexdigits[] = {
631 '0', '1', '2', '3', '4', '5', '6', '7',
632 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
633};
danielk1977d641d642004-11-18 15:44:29 +0000634
drh47394702003-08-20 01:03:33 +0000635/*
636** EXPERIMENTAL - This is not an official function. The interface may
637** change. This function may disappear. Do not write code that depends
638** on this function.
639**
640** Implementation of the QUOTE() function. This function takes a single
641** argument. If the argument is numeric, the return value is the same as
642** the argument. If the argument is NULL, the return value is the string
643** "NULL". Otherwise, the argument is enclosed in single quotes with
644** single-quote escapes.
645*/
danielk19770ae8b832004-05-25 12:05:56 +0000646static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000647 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000648 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000649 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000650 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000651 break;
drh47394702003-08-20 01:03:33 +0000652 }
drh9c054832004-05-31 18:51:57 +0000653 case SQLITE_INTEGER:
654 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000655 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000656 break;
657 }
danielk19773f41e972004-06-08 00:39:01 +0000658 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000659 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000660 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000661 int nBlob = sqlite3_value_bytes(argv[0]);
662 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
danielk19773f41e972004-06-08 00:39:01 +0000663
drh023ae032007-05-08 12:12:16 +0000664 if( 2*nBlob+4>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000665 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000666 return;
667 }
drh17435752007-08-16 04:30:38 +0000668 zText = (char *)sqlite3_malloc((2*nBlob)+4);
danielk19773f41e972004-06-08 00:39:01 +0000669 if( !zText ){
670 sqlite3_result_error(context, "out of memory", -1);
671 }else{
672 int i;
673 for(i=0; i<nBlob; i++){
674 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
675 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
676 }
677 zText[(nBlob*2)+2] = '\'';
678 zText[(nBlob*2)+3] = '\0';
679 zText[0] = 'X';
680 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000681 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000682 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000683 }
684 break;
685 }
drh9c054832004-05-31 18:51:57 +0000686 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000687 int i,j;
688 u64 n;
drh2646da72005-12-09 20:02:05 +0000689 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000690 char *z;
691
drh7a521cf2007-04-25 18:23:52 +0000692 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000693 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
694 if( i+n+3>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000695 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000696 return;
697 }
drh17435752007-08-16 04:30:38 +0000698 z = sqlite3_malloc( i+n+3 );
drhf9b596e2004-05-26 16:54:42 +0000699 if( z==0 ) return;
700 z[0] = '\'';
701 for(i=0, j=1; zArg[i]; i++){
702 z[j++] = zArg[i];
703 if( zArg[i]=='\'' ){
704 z[j++] = '\'';
705 }
706 }
707 z[j++] = '\'';
708 z[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000709 sqlite3_result_text(context, z, j, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000710 sqlite3_free(z);
drhf9b596e2004-05-26 16:54:42 +0000711 }
drh47394702003-08-20 01:03:33 +0000712 }
713}
714
drh137c7282007-01-29 17:58:28 +0000715/*
716** The hex() function. Interpret the argument as a blob. Return
717** a hexadecimal rendering as text.
718*/
719static void hexFunc(
720 sqlite3_context *context,
721 int argc,
722 sqlite3_value **argv
723){
724 int i, n;
725 const unsigned char *pBlob;
726 char *zHex, *z;
727 assert( argc==1 );
drh1f0feef2007-05-15 13:27:07 +0000728 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000729 n = sqlite3_value_bytes(argv[0]);
drh023ae032007-05-08 12:12:16 +0000730 if( n*2+1>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000731 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000732 return;
733 }
drh1f0feef2007-05-15 13:27:07 +0000734 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drh137c7282007-01-29 17:58:28 +0000735 z = zHex = sqlite3_malloc(n*2 + 1);
736 if( zHex==0 ) return;
737 for(i=0; i<n; i++, pBlob++){
738 unsigned char c = *pBlob;
739 *(z++) = hexdigits[(c>>4)&0xf];
740 *(z++) = hexdigits[c&0xf];
741 }
742 *z = 0;
743 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
744}
745
drh26b6d902007-03-17 13:27:54 +0000746/*
drh8cff3822007-05-02 02:08:28 +0000747** The zeroblob(N) function returns a zero-filled blob of size N bytes.
748*/
749static void zeroblobFunc(
750 sqlite3_context *context,
751 int argc,
752 sqlite3_value **argv
753){
drh98640a32007-06-07 19:08:32 +0000754 i64 n;
drh8cff3822007-05-02 02:08:28 +0000755 assert( argc==1 );
drh98640a32007-06-07 19:08:32 +0000756 n = sqlite3_value_int64(argv[0]);
757 if( n>SQLITE_MAX_LENGTH ){
758 sqlite3_result_error_toobig(context);
759 }else{
760 sqlite3_result_zeroblob(context, n);
761 }
drh8cff3822007-05-02 02:08:28 +0000762}
763
764/*
drh26b6d902007-03-17 13:27:54 +0000765** The replace() function. Three arguments are all strings: call
766** them A, B, and C. The result is also a string which is derived
767** from A by replacing every occurance of B with C. The match
768** must be exact. Collating sequences are not used.
769*/
770static void replaceFunc(
771 sqlite3_context *context,
772 int argc,
773 sqlite3_value **argv
774){
775 const unsigned char *zStr; /* The input string A */
776 const unsigned char *zPattern; /* The pattern string B */
777 const unsigned char *zRep; /* The replacement string C */
778 unsigned char *zOut; /* The output */
779 int nStr; /* Size of zStr */
780 int nPattern; /* Size of zPattern */
781 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000782 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000783 int loopLimit; /* Last zStr[] that might match zPattern[] */
784 int i, j; /* Loop counters */
785
786 assert( argc==3 );
drh26b6d902007-03-17 13:27:54 +0000787 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000788 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000789 nStr = sqlite3_value_bytes(argv[0]);
790 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000791 zPattern = sqlite3_value_text(argv[1]);
drh709cff32007-04-27 01:18:02 +0000792 if( zPattern==0 || zPattern[0]==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000793 nPattern = sqlite3_value_bytes(argv[1]);
794 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000795 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000796 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000797 nRep = sqlite3_value_bytes(argv[2]);
798 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000799 nOut = nStr + 1;
800 assert( nOut<SQLITE_MAX_LENGTH );
801 zOut = sqlite3_malloc((int)nOut);
802 if( zOut==0 ){
803 return;
drh26b6d902007-03-17 13:27:54 +0000804 }
drh26b6d902007-03-17 13:27:54 +0000805 loopLimit = nStr - nPattern;
806 for(i=j=0; i<=loopLimit; i++){
807 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
808 zOut[j++] = zStr[i];
809 }else{
drh2e6400b2007-05-08 15:46:18 +0000810 nOut += nRep - nPattern;
811 if( nOut>=SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000812 sqlite3_result_error_toobig(context);
danielk197717374e82007-05-08 14:39:04 +0000813 sqlite3_free(zOut);
814 return;
815 }
drh2e6400b2007-05-08 15:46:18 +0000816 zOut = sqlite3_realloc(zOut, (int)nOut);
817 if( zOut==0 ){
818 return;
819 }
drh26b6d902007-03-17 13:27:54 +0000820 memcpy(&zOut[j], zRep, nRep);
821 j += nRep;
822 i += nPattern-1;
823 }
824 }
drh2e6400b2007-05-08 15:46:18 +0000825 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000826 memcpy(&zOut[j], &zStr[i], nStr-i);
827 j += nStr - i;
828 assert( j<=nOut );
829 zOut[j] = 0;
830 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
831}
832
drh309b3382007-03-17 17:52:42 +0000833/*
834** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
835** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
836*/
837static void trimFunc(
838 sqlite3_context *context,
839 int argc,
840 sqlite3_value **argv
841){
842 const unsigned char *zIn; /* Input string */
843 const unsigned char *zCharSet; /* Set of characters to trim */
844 int nIn; /* Number of bytes in input */
drhd1e3a612007-04-27 21:59:52 +0000845 int flags; /* 1: trimleft 2: trimright 3: trim */
846 int i; /* Loop counter */
847 unsigned char *aLen; /* Length of each character in zCharSet */
848 const unsigned char **azChar; /* Individual characters in zCharSet */
849 int nChar; /* Number of characters in zCharSet */
850
drh309b3382007-03-17 17:52:42 +0000851 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
852 return;
853 }
854 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000855 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000856 nIn = sqlite3_value_bytes(argv[0]);
857 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000858 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000859 static const unsigned char lenOne[] = { 1 };
drh8cff3822007-05-02 02:08:28 +0000860 static const unsigned char *azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000861 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000862 aLen = (u8*)lenOne;
863 azChar = azOne;
drhd1e3a612007-04-27 21:59:52 +0000864 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000865 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000866 return;
drhd1e3a612007-04-27 21:59:52 +0000867 }else{
868 const unsigned char *z;
869 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000870 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000871 }
872 if( nChar>0 ){
873 azChar = sqlite3_malloc( nChar*(sizeof(char*)+1) );
874 if( azChar==0 ){
875 return;
876 }
877 aLen = (unsigned char*)&azChar[nChar];
878 for(z=zCharSet, nChar=0; *z; nChar++){
879 azChar[nChar] = z;
drh4a919112007-05-15 11:55:09 +0000880 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000881 aLen[nChar] = z - azChar[nChar];
882 }
883 }
drh309b3382007-03-17 17:52:42 +0000884 }
drhd1e3a612007-04-27 21:59:52 +0000885 if( nChar>0 ){
drh309b3382007-03-17 17:52:42 +0000886 flags = (int)sqlite3_user_data(context);
887 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000888 while( nIn>0 ){
889 int len;
890 for(i=0; i<nChar; i++){
891 len = aLen[i];
892 if( memcmp(zIn, azChar[i], len)==0 ) break;
893 }
894 if( i>=nChar ) break;
895 zIn += len;
896 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000897 }
898 }
899 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000900 while( nIn>0 ){
901 int len;
902 for(i=0; i<nChar; i++){
903 len = aLen[i];
904 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
905 }
906 if( i>=nChar ) break;
907 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000908 }
909 }
drhd1e3a612007-04-27 21:59:52 +0000910 if( zCharSet ){
911 sqlite3_free(azChar);
912 }
drh309b3382007-03-17 17:52:42 +0000913 }
914 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
915}
drh26b6d902007-03-17 13:27:54 +0000916
drhd24cc422003-03-27 12:51:24 +0000917#ifdef SQLITE_SOUNDEX
918/*
919** Compute the soundex encoding of a word.
920*/
drh137c7282007-01-29 17:58:28 +0000921static void soundexFunc(
922 sqlite3_context *context,
923 int argc,
924 sqlite3_value **argv
925){
drhd24cc422003-03-27 12:51:24 +0000926 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000927 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000928 int i, j;
929 static const unsigned char iCode[] = {
930 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
931 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
932 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
933 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
934 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
935 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
936 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
937 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
938 };
939 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000940 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000941 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000942 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
943 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000944 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000945 zResult[0] = toupper(zIn[i]);
946 for(j=1; j<4 && zIn[i]; i++){
947 int code = iCode[zIn[i]&0x7f];
948 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000949 if( code!=prevcode ){
950 prevcode = code;
951 zResult[j++] = code + '0';
952 }
953 }else{
954 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000955 }
956 }
957 while( j<4 ){
958 zResult[j++] = '0';
959 }
960 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000961 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000962 }else{
danielk1977d8123362004-06-12 09:25:12 +0000963 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000964 }
965}
966#endif
967
drhfdb83b22006-06-17 14:12:47 +0000968#ifndef SQLITE_OMIT_LOAD_EXTENSION
969/*
970** A function that loads a shared-library extension then returns NULL.
971*/
972static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +0000973 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000974 const char *zProc;
drhfdb83b22006-06-17 14:12:47 +0000975 sqlite3 *db = sqlite3_user_data(context);
976 char *zErrMsg = 0;
977
978 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +0000979 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +0000980 }else{
981 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +0000982 }
drh7a521cf2007-04-25 18:23:52 +0000983 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +0000984 sqlite3_result_error(context, zErrMsg, -1);
985 sqlite3_free(zErrMsg);
986 }
987}
988#endif
989
drh193a6b42002-07-07 16:52:46 +0000990#ifdef SQLITE_TEST
991/*
992** This function generates a string of random characters. Used for
993** generating test data.
994*/
danielk19770ae8b832004-05-25 12:05:56 +0000995static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +0000996 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +0000997 "abcdefghijklmnopqrstuvwxyz"
998 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
999 "0123456789"
1000 ".-!,:*^+=_|?/<> ";
1001 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +00001002 unsigned char zBuf[1000];
drh193a6b42002-07-07 16:52:46 +00001003 if( argc>=1 ){
drhf9b596e2004-05-26 16:54:42 +00001004 iMin = sqlite3_value_int(argv[0]);
drh193a6b42002-07-07 16:52:46 +00001005 if( iMin<0 ) iMin = 0;
1006 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
1007 }else{
1008 iMin = 1;
1009 }
1010 if( argc>=2 ){
drhf9b596e2004-05-26 16:54:42 +00001011 iMax = sqlite3_value_int(argv[1]);
drh193a6b42002-07-07 16:52:46 +00001012 if( iMax<iMin ) iMax = iMin;
drh1dba7272004-01-16 13:58:18 +00001013 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +00001014 }else{
1015 iMax = 50;
1016 }
1017 n = iMin;
1018 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +00001019 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +00001020 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +00001021 n += r%(iMax + 1 - iMin);
1022 }
drh1dba7272004-01-16 13:58:18 +00001023 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +00001024 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +00001025 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +00001026 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +00001027 }
1028 zBuf[n] = 0;
drh2646da72005-12-09 20:02:05 +00001029 sqlite3_result_text(context, (char*)zBuf, n, SQLITE_TRANSIENT);
danielk1977d8123362004-06-12 09:25:12 +00001030}
drh0e3d7472004-06-19 17:33:07 +00001031#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +00001032
drh0e3d7472004-06-19 17:33:07 +00001033#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +00001034/*
1035** The following two SQL functions are used to test returning a text
1036** result with a destructor. Function 'test_destructor' takes one argument
1037** and returns the same argument interpreted as TEXT. A destructor is
1038** passed with the sqlite3_result_text() call.
1039**
1040** SQL function 'test_destructor_count' returns the number of outstanding
1041** allocations made by 'test_destructor';
1042**
1043** WARNING: Not threadsafe.
1044*/
1045static int test_destructor_count_var = 0;
1046static void destructor(void *p){
1047 char *zVal = (char *)p;
1048 assert(zVal);
1049 zVal--;
drh17435752007-08-16 04:30:38 +00001050 sqlite3_free(zVal);
danielk1977d8123362004-06-12 09:25:12 +00001051 test_destructor_count_var--;
1052}
1053static void test_destructor(
1054 sqlite3_context *pCtx,
1055 int nArg,
1056 sqlite3_value **argv
1057){
1058 char *zVal;
danielk1977f4618892004-06-28 13:09:11 +00001059 int len;
drh9bb575f2004-09-06 17:24:11 +00001060 sqlite3 *db = sqlite3_user_data(pCtx);
danielk1977f4618892004-06-28 13:09:11 +00001061
danielk1977d8123362004-06-12 09:25:12 +00001062 test_destructor_count_var++;
1063 assert( nArg==1 );
1064 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhb21c8cd2007-08-21 19:33:56 +00001065 len = sqlite3ValueBytes(argv[0], ENC(db));
danielk1977c6cc77d2007-08-16 10:36:33 +00001066 zVal = sqlite3MallocZero(len+3);
danielk1977f4618892004-06-28 13:09:11 +00001067 zVal[len] = 0;
1068 zVal[len-1] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001069 assert( zVal );
1070 zVal++;
drhb21c8cd2007-08-21 19:33:56 +00001071 memcpy(zVal, sqlite3ValueText(argv[0], ENC(db)), len);
danielk197714db2662006-01-09 16:12:04 +00001072 if( ENC(db)==SQLITE_UTF8 ){
danielk1977f4618892004-06-28 13:09:11 +00001073 sqlite3_result_text(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001074#ifndef SQLITE_OMIT_UTF16
danielk197714db2662006-01-09 16:12:04 +00001075 }else if( ENC(db)==SQLITE_UTF16LE ){
danielk1977f4618892004-06-28 13:09:11 +00001076 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
1077 }else{
1078 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001079#endif /* SQLITE_OMIT_UTF16 */
danielk1977f4618892004-06-28 13:09:11 +00001080 }
danielk1977d8123362004-06-12 09:25:12 +00001081}
1082static void test_destructor_count(
1083 sqlite3_context *pCtx,
1084 int nArg,
1085 sqlite3_value **argv
1086){
1087 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +00001088}
drh0e3d7472004-06-19 17:33:07 +00001089#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +00001090
drh0e3d7472004-06-19 17:33:07 +00001091#ifdef SQLITE_TEST
1092/*
1093** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
1094** interface.
1095**
1096** The test_auxdata() SQL function attempts to register each of its arguments
1097** as auxiliary data. If there are no prior registrations of aux data for
1098** that argument (meaning the argument is not a constant or this is its first
1099** call) then the result for that argument is 0. If there is a prior
1100** registration, the result for that argument is 1. The overall result
1101** is the individual argument results separated by spaces.
1102*/
drh17435752007-08-16 04:30:38 +00001103static void free_test_auxdata(void *p) {sqlite3_free(p);}
danielk19773f6b0872004-06-17 05:36:44 +00001104static void test_auxdata(
1105 sqlite3_context *pCtx,
1106 int nArg,
1107 sqlite3_value **argv
1108){
1109 int i;
danielk1977c6cc77d2007-08-16 10:36:33 +00001110 char *zRet = sqlite3MallocZero(nArg*2);
danielk19773f6b0872004-06-17 05:36:44 +00001111 if( !zRet ) return;
1112 for(i=0; i<nArg; i++){
drh2646da72005-12-09 20:02:05 +00001113 char const *z = (char*)sqlite3_value_text(argv[i]);
danielk19773f6b0872004-06-17 05:36:44 +00001114 if( z ){
1115 char *zAux = sqlite3_get_auxdata(pCtx, i);
1116 if( zAux ){
1117 zRet[i*2] = '1';
1118 if( strcmp(zAux, z) ){
danielk1977e0fc5262007-07-26 06:50:05 +00001119 free_test_auxdata((void *)zRet);
danielk19773f6b0872004-06-17 05:36:44 +00001120 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
1121 return;
1122 }
1123 }else{
1124 zRet[i*2] = '0';
drh17435752007-08-16 04:30:38 +00001125 zAux = sqlite3StrDup(z);
danielk19773f6b0872004-06-17 05:36:44 +00001126 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
1127 }
1128 zRet[i*2+1] = ' ';
1129 }
1130 }
1131 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
1132}
drh0e3d7472004-06-19 17:33:07 +00001133#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +00001134
danielk197701427a62005-01-11 13:02:33 +00001135#ifdef SQLITE_TEST
1136/*
1137** A function to test error reporting from user functions. This function
1138** returns a copy of it's first argument as an error.
1139*/
1140static void test_error(
1141 sqlite3_context *pCtx,
1142 int nArg,
1143 sqlite3_value **argv
1144){
drh2646da72005-12-09 20:02:05 +00001145 sqlite3_result_error(pCtx, (char*)sqlite3_value_text(argv[0]), 0);
danielk197701427a62005-01-11 13:02:33 +00001146}
1147#endif /* SQLITE_TEST */
1148
drh0ac65892002-04-20 14:24:41 +00001149/*
drhd3a149e2002-02-24 17:12:53 +00001150** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001151** sum() or avg() aggregate computation.
1152*/
1153typedef struct SumCtx SumCtx;
1154struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001155 double rSum; /* Floating point sum */
1156 i64 iSum; /* Integer sum */
1157 i64 cnt; /* Number of elements summed */
1158 u8 overflow; /* True if integer overflow seen */
1159 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001160};
1161
1162/*
drha97fdd32006-01-12 22:17:50 +00001163** Routines used to compute the sum, average, and total.
1164**
1165** The SUM() function follows the (broken) SQL standard which means
1166** that it returns NULL if it sums over no inputs. TOTAL returns
1167** 0.0 in that case. In addition, TOTAL always returns a float where
1168** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001169** value. TOTAL never fails, but SUM might through an exception if
1170** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001171*/
danielk19770ae8b832004-05-25 12:05:56 +00001172static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001173 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001174 int type;
drh3f219f42005-09-08 19:45:57 +00001175 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +00001176 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001177 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001178 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001179 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001180 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001181 i64 v = sqlite3_value_int64(argv[0]);
1182 p->rSum += v;
1183 if( (p->approx|p->overflow)==0 ){
1184 i64 iNewSum = p->iSum + v;
1185 int s1 = p->iSum >> (sizeof(i64)*8-1);
1186 int s2 = v >> (sizeof(i64)*8-1);
1187 int s3 = iNewSum >> (sizeof(i64)*8-1);
1188 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
1189 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001190 }
1191 }else{
drh8c08e862006-02-11 17:34:00 +00001192 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001193 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001194 }
drh739105c2002-05-29 23:22:23 +00001195 }
drhdd5baa92002-02-27 19:50:59 +00001196}
danielk19770ae8b832004-05-25 12:05:56 +00001197static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001198 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001199 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001200 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001201 if( p->overflow ){
1202 sqlite3_result_error(context,"integer overflow",-1);
1203 }else if( p->approx ){
1204 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001205 }else{
drh8c08e862006-02-11 17:34:00 +00001206 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001207 }
drh3d1d95e2005-09-08 10:37:01 +00001208 }
drhdd5baa92002-02-27 19:50:59 +00001209}
danielk19770ae8b832004-05-25 12:05:56 +00001210static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001211 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001212 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001213 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001214 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001215 }
1216}
drha97fdd32006-01-12 22:17:50 +00001217static void totalFinalize(sqlite3_context *context){
1218 SumCtx *p;
1219 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001220 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001221}
drhdd5baa92002-02-27 19:50:59 +00001222
1223/*
drh0bce8352002-02-28 00:41:10 +00001224** The following structure keeps track of state information for the
1225** count() aggregate function.
1226*/
1227typedef struct CountCtx CountCtx;
1228struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001229 i64 n;
drh0bce8352002-02-28 00:41:10 +00001230};
drhdd5baa92002-02-27 19:50:59 +00001231
drh0bce8352002-02-28 00:41:10 +00001232/*
1233** Routines to implement the count() aggregate function.
1234*/
danielk19770ae8b832004-05-25 12:05:56 +00001235static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001236 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001237 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001238 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001239 p->n++;
1240 }
1241}
danielk19770ae8b832004-05-25 12:05:56 +00001242static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001243 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001244 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001245 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001246}
1247
1248/*
drh0bce8352002-02-28 00:41:10 +00001249** Routines to implement min() and max() aggregate functions.
1250*/
danielk19770ae8b832004-05-25 12:05:56 +00001251static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +00001252 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001253 Mem *pBest;
1254
1255 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1256 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001257 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001258
danielk197788208052004-05-25 01:13:20 +00001259 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001260 int max;
1261 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001262 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001263 /* This step function is used for both the min() and max() aggregates,
1264 ** the only difference between the two being that the sense of the
1265 ** comparison is inverted. For the max() aggregate, the
1266 ** sqlite3_user_data() function returns (void *)-1. For min() it
1267 ** returns (void *)db, where db is the sqlite3* database pointer.
1268 ** Therefore the next statement sets variable 'max' to 1 for the max()
1269 ** aggregate, or 0 for min().
1270 */
drh309b3382007-03-17 17:52:42 +00001271 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001272 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001273 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001274 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001275 }
drh268380c2004-02-25 13:47:31 +00001276 }else{
drhb21c8cd2007-08-21 19:33:56 +00001277 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001278 }
1279}
danielk19770ae8b832004-05-25 12:05:56 +00001280static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001281 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001282 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1283 if( pRes ){
1284 if( pRes->flags ){
1285 sqlite3_result_value(context, pRes);
1286 }
1287 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001288 }
1289}
drhdd5baa92002-02-27 19:50:59 +00001290
drh4e5ffc52004-08-31 00:52:37 +00001291
drhd3a149e2002-02-24 17:12:53 +00001292/*
drha2ed5602002-02-26 23:55:31 +00001293** This function registered all of the above C functions as SQL
1294** functions. This should be the only routine in this file with
1295** external linkage.
drhdc04c582002-02-24 01:55:15 +00001296*/
drh9bb575f2004-09-06 17:24:11 +00001297void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001298 static const struct {
drh0bce8352002-02-28 00:41:10 +00001299 char *zName;
drh268380c2004-02-25 13:47:31 +00001300 signed char nArg;
drh309b3382007-03-17 17:52:42 +00001301 u8 argType; /* ff: db 1: 0, 2: 1, 3: 2,... N: N-1. */
danielk1977f4618892004-06-28 13:09:11 +00001302 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001303 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001304 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001305 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001306 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1307 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
drh309b3382007-03-17 17:52:42 +00001308 { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc },
1309 { "max", 0, 1, SQLITE_UTF8, 1, 0 },
danielk1977f4618892004-06-28 13:09:11 +00001310 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1311 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
1312 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
danielk1977f4618892004-06-28 13:09:11 +00001313 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1314 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1315 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1316 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1317 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1318 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1319 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1320 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
drh137c7282007-01-29 17:58:28 +00001321 { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc },
danielk1977f4618892004-06-28 13:09:11 +00001322 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1323 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
drh137c7282007-01-29 17:58:28 +00001324 { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob },
drh94a98362004-09-13 13:13:18 +00001325 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001326 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1327 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
drh309b3382007-03-17 17:52:42 +00001328 { "last_insert_rowid", 0, 0xff, SQLITE_UTF8, 0, last_insert_rowid },
1329 { "changes", 0, 0xff, SQLITE_UTF8, 0, changes },
1330 { "total_changes", 0, 0xff, SQLITE_UTF8, 0, total_changes },
drh26b6d902007-03-17 13:27:54 +00001331 { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc },
drh309b3382007-03-17 17:52:42 +00001332 { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc },
1333 { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc },
1334 { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc },
1335 { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc },
1336 { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc },
1337 { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc },
drh8cff3822007-05-02 02:08:28 +00001338 { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc },
drhd24cc422003-03-27 12:51:24 +00001339#ifdef SQLITE_SOUNDEX
drh309b3382007-03-17 17:52:42 +00001340 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001341#endif
drhfdb83b22006-06-17 14:12:47 +00001342#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh309b3382007-03-17 17:52:42 +00001343 { "load_extension", 1, 0xff, SQLITE_UTF8, 0, loadExt },
1344 { "load_extension", 2, 0xff, SQLITE_UTF8, 0, loadExt },
drhfdb83b22006-06-17 14:12:47 +00001345#endif
drh193a6b42002-07-07 16:52:46 +00001346#ifdef SQLITE_TEST
drh309b3382007-03-17 17:52:42 +00001347 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1348 { "test_destructor", 1, 0xff, SQLITE_UTF8, 0, test_destructor},
1349 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
1350 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
1351 { "test_error", 1, 0, SQLITE_UTF8, 0, test_error},
drh193a6b42002-07-07 16:52:46 +00001352#endif
drh0bce8352002-02-28 00:41:10 +00001353 };
drh57196282004-10-06 15:41:16 +00001354 static const struct {
drh0bce8352002-02-28 00:41:10 +00001355 char *zName;
drh268380c2004-02-25 13:47:31 +00001356 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001357 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001358 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001359 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1360 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001361 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001362 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
drh309b3382007-03-17 17:52:42 +00001363 { "max", 1, 1, 1, minmaxStep, minMaxFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001364 { "sum", 1, 0, 0, sumStep, sumFinalize },
drha97fdd32006-01-12 22:17:50 +00001365 { "total", 1, 0, 0, sumStep, totalFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001366 { "avg", 1, 0, 0, sumStep, avgFinalize },
1367 { "count", 0, 0, 0, countStep, countFinalize },
1368 { "count", 1, 0, 0, countStep, countFinalize },
drh0bce8352002-02-28 00:41:10 +00001369 };
1370 int i;
1371
1372 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001373 void *pArg;
1374 u8 argType = aFuncs[i].argType;
1375 if( argType==0xff ){
1376 pArg = db;
1377 }else{
1378 pArg = (void*)(int)argType;
danielk1977c572ef72004-05-27 09:28:41 +00001379 }
danielk1977771151b2006-01-17 13:21:40 +00001380 sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001381 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001382 if( aFuncs[i].needCollSeq ){
1383 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1384 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1385 if( pFunc && aFuncs[i].needCollSeq ){
1386 pFunc->needCollSeq = 1;
1387 }
1388 }
drh0bce8352002-02-28 00:41:10 +00001389 }
drh1f01ec12005-02-15 21:36:18 +00001390#ifndef SQLITE_OMIT_ALTERTABLE
1391 sqlite3AlterFunctions(db);
1392#endif
drh198bf392006-01-06 21:52:49 +00001393#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001394 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001395#endif
drh0bce8352002-02-28 00:41:10 +00001396 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001397 void *pArg = (void*)(int)aAggs[i].argType;
danielk1977771151b2006-01-17 13:21:40 +00001398 sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001399 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001400 if( aAggs[i].needCollSeq ){
1401 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001402 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001403 if( pFunc && aAggs[i].needCollSeq ){
1404 pFunc->needCollSeq = 1;
1405 }
1406 }
drh268380c2004-02-25 13:47:31 +00001407 }
danielk19774adee202004-05-08 08:23:19 +00001408 sqlite3RegisterDateTimeFunctions(db);
danielk19771e536952007-08-16 10:09:01 +00001409 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001410 int rc = sqlite3_overload_function(db, "MATCH", 2);
1411 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1412 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001413 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001414 }
1415 }
danielk1977fd9e1f32005-05-22 10:44:34 +00001416#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001417 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001418#endif
drh55ef4d92005-08-14 01:20:37 +00001419#ifdef SQLITE_CASE_SENSITIVE_LIKE
1420 sqlite3RegisterLikeFunctions(db, 1);
1421#else
1422 sqlite3RegisterLikeFunctions(db, 0);
1423#endif
1424}
1425
1426/*
1427** Set the LIKEOPT flag on the 2-argument function with the given name.
1428*/
drhd64fe2f2005-08-28 17:00:23 +00001429static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001430 FuncDef *pDef;
1431 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1432 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001433 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001434 }
1435}
1436
1437/*
1438** Register the built-in LIKE and GLOB functions. The caseSensitive
1439** parameter determines whether or not the LIKE operator is case
1440** sensitive. GLOB is always case sensitive.
1441*/
1442void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1443 struct compareInfo *pInfo;
1444 if( caseSensitive ){
1445 pInfo = (struct compareInfo*)&likeInfoAlt;
1446 }else{
1447 pInfo = (struct compareInfo*)&likeInfoNorm;
1448 }
danielk1977771151b2006-01-17 13:21:40 +00001449 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1450 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1451 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001452 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001453 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1454 setLikeOptFlag(db, "like",
1455 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001456}
1457
1458/*
1459** pExpr points to an expression which implements a function. If
1460** it is appropriate to apply the LIKE optimization to that function
1461** then set aWc[0] through aWc[2] to the wildcard characters and
1462** return TRUE. If the function is not a LIKE-style function then
1463** return FALSE.
1464*/
drhd64fe2f2005-08-28 17:00:23 +00001465int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001466 FuncDef *pDef;
danielk1977cdbd8ef2007-05-12 06:11:12 +00001467 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
drh55ef4d92005-08-14 01:20:37 +00001468 return 0;
1469 }
1470 if( pExpr->pList->nExpr!=2 ){
1471 return 0;
1472 }
drh2646da72005-12-09 20:02:05 +00001473 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001474 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001475 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001476 return 0;
1477 }
1478
1479 /* The memcpy() statement assumes that the wildcard characters are
1480 ** the first three statements in the compareInfo structure. The
1481 ** asserts() that follow verify that assumption
1482 */
1483 memcpy(aWc, pDef->pUserData, 3);
1484 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1485 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1486 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001487 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001488 return 1;
drhdc04c582002-02-24 01:55:15 +00001489}