blob: fcad3aadf0c7806cfac7ffab27e1165528fb080d [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**
drhb0689692007-11-01 17:38:30 +000019** $Id: func.c,v 1.176 2007/11/01 17:38:31 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
drh64f31512007-10-12 19:11:55 +0000172 assert( argc==3 || argc==2 );
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]);
drh64f31512007-10-12 19:11:55 +0000188 if( argc==3 ){
189 p2 = sqlite3_value_int(argv[2]);
190 }else{
191 p2 = SQLITE_MAX_LENGTH;
192 }
drh0bce8352002-02-28 00:41:10 +0000193 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000194 p1 += len;
drh653bc752002-02-28 03:31:10 +0000195 if( p1<0 ){
196 p2 += p1;
197 p1 = 0;
198 }
drh0bce8352002-02-28 00:41:10 +0000199 }else if( p1>0 ){
200 p1--;
201 }
202 if( p1+p2>len ){
203 p2 = len-p1;
204 }
drhf764e6f2007-05-15 01:13:47 +0000205 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000206 while( *z && p1 ){
207 SQLITE_SKIP_UTF8(z);
208 p1--;
drhf764e6f2007-05-15 01:13:47 +0000209 }
drh4a919112007-05-15 11:55:09 +0000210 for(z2=z; *z2 && p2; p2--){
211 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000212 }
drh4a919112007-05-15 11:55:09 +0000213 sqlite3_result_text(context, (char*)z, z2-z, SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000214 }else{
215 if( p2<0 ) p2 = 0;
216 sqlite3_result_blob(context, (char*)&z[p1], p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000217 }
drh0bce8352002-02-28 00:41:10 +0000218}
219
220/*
221** Implementation of the round() function
222*/
danielk19770ae8b832004-05-25 12:05:56 +0000223static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000224 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000225 double r;
drh592ac8c2005-08-13 03:07:47 +0000226 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000227 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000228 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000229 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000230 n = sqlite3_value_int(argv[1]);
231 if( n>30 ) n = 30;
232 if( n<0 ) n = 0;
233 }
drhd589a922006-03-02 03:02:48 +0000234 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000235 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000236 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000237 sqlite3AtoF(zBuf, &r);
238 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000239}
drhdc04c582002-02-24 01:55:15 +0000240
danielk197726783a52007-08-29 14:06:22 +0000241/*
242** Allocate nByte bytes of space using sqlite3_malloc(). If the
243** allocation fails, call sqlite3_result_error_nomem() to notify
244** the database handle that malloc() has failed.
245*/
danielk1977a1644fd2007-08-29 12:31:25 +0000246static void *contextMalloc(sqlite3_context *context, int nByte){
247 char *z = sqlite3_malloc(nByte);
248 if( !z && nByte>0 ){
249 sqlite3_result_error_nomem(context);
250 }
251 return z;
252}
253
drhdc04c582002-02-24 01:55:15 +0000254/*
255** Implementation of the upper() and lower() SQL functions.
256*/
danielk19770ae8b832004-05-25 12:05:56 +0000257static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000258 char *z1;
259 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000260 int i, n;
drh9c054832004-05-31 18:51:57 +0000261 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000262 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000263 n = sqlite3_value_bytes(argv[0]);
264 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
265 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000266 if( z2 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000267 z1 = contextMalloc(context, n+1);
drh7a521cf2007-04-25 18:23:52 +0000268 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000269 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000270 for(i=0; z1[i]; i++){
271 z1[i] = toupper(z1[i]);
272 }
273 sqlite3_result_text(context, z1, -1, sqlite3_free);
274 }
drhdc04c582002-02-24 01:55:15 +0000275 }
276}
danielk19770ae8b832004-05-25 12:05:56 +0000277static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000278 char *z1;
279 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000280 int i, n;
drh9c054832004-05-31 18:51:57 +0000281 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000282 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000283 n = sqlite3_value_bytes(argv[0]);
284 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
285 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000286 if( z2 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000287 z1 = contextMalloc(context, n+1);
drh7a521cf2007-04-25 18:23:52 +0000288 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000289 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000290 for(i=0; z1[i]; i++){
291 z1[i] = tolower(z1[i]);
292 }
293 sqlite3_result_text(context, z1, -1, sqlite3_free);
294 }
drhdc04c582002-02-24 01:55:15 +0000295 }
296}
297
298/*
drhfbc99082002-02-28 03:14:18 +0000299** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000300** All three do the same thing. They return the first non-NULL
301** argument.
drh3212e182002-02-28 00:46:26 +0000302*/
drhf9b596e2004-05-26 16:54:42 +0000303static void ifnullFunc(
304 sqlite3_context *context,
305 int argc,
306 sqlite3_value **argv
307){
drhfbc99082002-02-28 03:14:18 +0000308 int i;
309 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000310 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000311 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000312 break;
313 }
314 }
drh3212e182002-02-28 00:46:26 +0000315}
316
317/*
drhf9ffac92002-03-02 19:00:31 +0000318** Implementation of random(). Return a random integer.
319*/
drhf9b596e2004-05-26 16:54:42 +0000320static void randomFunc(
321 sqlite3_context *context,
322 int argc,
323 sqlite3_value **argv
324){
drh52fc8492006-02-23 21:43:55 +0000325 sqlite_int64 r;
danielk19774adee202004-05-08 08:23:19 +0000326 sqlite3Randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000327 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
328 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000329 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000330}
331
332/*
drh137c7282007-01-29 17:58:28 +0000333** Implementation of randomblob(N). Return a random blob
334** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000335*/
drh137c7282007-01-29 17:58:28 +0000336static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000337 sqlite3_context *context,
338 int argc,
339 sqlite3_value **argv
340){
drh137c7282007-01-29 17:58:28 +0000341 int n;
342 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000343 assert( argc==1 );
344 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000345 if( n<1 ){
346 n = 1;
347 }
348 if( n>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000349 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000350 return;
351 }
danielk1977a1644fd2007-08-29 12:31:25 +0000352 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000353 if( p ){
354 sqlite3Randomness(n, p);
drh17435752007-08-16 04:30:38 +0000355 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000356 }
drh63cf66f2007-01-29 15:50:05 +0000357}
358
359/*
drh6ed41ad2002-04-06 14:10:47 +0000360** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000361** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000362*/
danielk197751ad0ec2004-05-24 12:39:02 +0000363static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000364 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000365 int arg,
366 sqlite3_value **argv
367){
drh9bb575f2004-09-06 17:24:11 +0000368 sqlite3 *db = sqlite3_user_data(context);
drhf9b596e2004-05-26 16:54:42 +0000369 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000370}
371
rdcf146a772004-02-25 22:51:06 +0000372/*
danielk1977b28af712004-06-21 06:50:26 +0000373** Implementation of the changes() SQL function. The return value is the
374** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000375*/
danielk1977b28af712004-06-21 06:50:26 +0000376static void changes(
drhf9b596e2004-05-26 16:54:42 +0000377 sqlite3_context *context,
378 int arg,
379 sqlite3_value **argv
380){
drh9bb575f2004-09-06 17:24:11 +0000381 sqlite3 *db = sqlite3_user_data(context);
drhf4479502004-05-27 03:12:53 +0000382 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000383}
rdcf146a772004-02-25 22:51:06 +0000384
385/*
danielk1977b28af712004-06-21 06:50:26 +0000386** Implementation of the total_changes() SQL function. The return value is
387** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000388*/
danielk1977b28af712004-06-21 06:50:26 +0000389static void total_changes(
390 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000391 int arg,
392 sqlite3_value **argv
393){
drh9bb575f2004-09-06 17:24:11 +0000394 sqlite3 *db = sqlite3_user_data(context);
danielk1977b28af712004-06-21 06:50:26 +0000395 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000396}
397
drh6ed41ad2002-04-06 14:10:47 +0000398/*
drh4e5ffc52004-08-31 00:52:37 +0000399** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000400*/
drh4e5ffc52004-08-31 00:52:37 +0000401struct compareInfo {
402 u8 matchAll;
403 u8 matchOne;
404 u8 matchSet;
405 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000406};
drh55ef4d92005-08-14 01:20:37 +0000407
drh4e5ffc52004-08-31 00:52:37 +0000408static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000409/* The correct SQL-92 behavior is for the LIKE operator to ignore
410** case. Thus 'a' LIKE 'A' would be true. */
411static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
412/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
413** is case sensitive causing 'a' LIKE 'A' to be false */
414static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000415
416/*
drh4e5ffc52004-08-31 00:52:37 +0000417** Compare two UTF-8 strings for equality where the first string can
418** potentially be a "glob" expression. Return true (1) if they
419** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000420**
drh4e5ffc52004-08-31 00:52:37 +0000421** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000422**
drh4e5ffc52004-08-31 00:52:37 +0000423** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000424**
drh4e5ffc52004-08-31 00:52:37 +0000425** '?' Matches exactly one character.
426**
427** [...] Matches one character from the enclosed list of
428** characters.
429**
430** [^...] Matches one character not in the enclosed list.
431**
432** With the [...] and [^...] matching, a ']' character can be included
433** in the list by making it the first character after '[' or '^'. A
434** range of characters can be specified using '-'. Example:
435** "[a-z]" matches any single lower-case letter. To match a '-', make
436** it the last character in the list.
437**
438** This routine is usually quick, but can be N**2 in the worst case.
439**
440** Hints: to match '*' or '?', put them in "[]". Like this:
441**
442** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000443*/
danielk19777c6303c2004-11-17 16:41:29 +0000444static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000445 const u8 *zPattern, /* The glob pattern */
446 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000447 const struct compareInfo *pInfo, /* Information about how to do the compare */
448 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000449){
drh66150952007-07-23 19:12:41 +0000450 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000451 int invert;
452 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000453 u8 matchOne = pInfo->matchOne;
454 u8 matchAll = pInfo->matchAll;
455 u8 matchSet = pInfo->matchSet;
456 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000457 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000458
drh66150952007-07-23 19:12:41 +0000459 while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000460 if( !prevEscape && c==matchAll ){
drh66150952007-07-23 19:12:41 +0000461 while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll
462 || c == matchOne ){
463 if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){
464 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000465 }
danielk1977ad7dd422004-06-06 12:41:49 +0000466 }
drh66150952007-07-23 19:12:41 +0000467 if( c==0 ){
468 return 1;
469 }else if( c==esc ){
470 c = sqlite3Utf8Read(zPattern, 0, &zPattern);
471 if( c==0 ){
472 return 0;
473 }
474 }else if( c==matchSet ){
475 assert( esc==0 ); /* This is GLOB, not LIKE */
476 assert( matchSet<0x80 ); /* '[' is a single-byte character */
477 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000478 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000479 }
480 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000481 }
482 while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){
483 if( noCase ){
484 c2 = c2<0x80 ? sqlite3UpperToLower[c2] : c2;
485 c = c<0x80 ? sqlite3UpperToLower[c] : c;
486 while( c2 != 0 && c2 != c ){
487 c2 = sqlite3Utf8Read(zString, 0, &zString);
488 if( c2<0x80 ) c2 = sqlite3UpperToLower[c2];
drh4e5ffc52004-08-31 00:52:37 +0000489 }
drh66150952007-07-23 19:12:41 +0000490 }else{
491 while( c2 != 0 && c2 != c ){
492 c2 = sqlite3Utf8Read(zString, 0, &zString);
493 }
drh4e5ffc52004-08-31 00:52:37 +0000494 }
drh66150952007-07-23 19:12:41 +0000495 if( c2==0 ) return 0;
496 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
497 }
498 return 0;
499 }else if( !prevEscape && c==matchOne ){
500 if( sqlite3Utf8Read(zString, 0, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000501 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000502 }
drh4e5ffc52004-08-31 00:52:37 +0000503 }else if( c==matchSet ){
504 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000505 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000506 seen = 0;
507 invert = 0;
drh66150952007-07-23 19:12:41 +0000508 c = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000509 if( c==0 ) return 0;
drh66150952007-07-23 19:12:41 +0000510 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
511 if( c2=='^' ){
512 invert = 1;
513 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
514 }
drh4e5ffc52004-08-31 00:52:37 +0000515 if( c2==']' ){
516 if( c==']' ) seen = 1;
drh66150952007-07-23 19:12:41 +0000517 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000518 }
drh66150952007-07-23 19:12:41 +0000519 while( c2 && c2!=']' ){
520 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
521 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000522 if( c>=prior_c && c<=c2 ) seen = 1;
523 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000524 }else{
drh66150952007-07-23 19:12:41 +0000525 if( c==c2 ){
526 seen = 1;
527 }
drh4e5ffc52004-08-31 00:52:37 +0000528 prior_c = c2;
529 }
drh66150952007-07-23 19:12:41 +0000530 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000531 }
drh66150952007-07-23 19:12:41 +0000532 if( c2==0 || (seen ^ invert)==0 ){
533 return 0;
534 }
535 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000536 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000537 }else{
drh66150952007-07-23 19:12:41 +0000538 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000539 if( noCase ){
drh66150952007-07-23 19:12:41 +0000540 c = c<0x80 ? sqlite3UpperToLower[c] : c;
541 c2 = c2<0x80 ? sqlite3UpperToLower[c2] : c2;
drh4e5ffc52004-08-31 00:52:37 +0000542 }
drh66150952007-07-23 19:12:41 +0000543 if( c!=c2 ){
544 return 0;
545 }
danielk19777c6303c2004-11-17 16:41:29 +0000546 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000547 }
danielk197751ad0ec2004-05-24 12:39:02 +0000548 }
drh4e5ffc52004-08-31 00:52:37 +0000549 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000550}
drh4e5ffc52004-08-31 00:52:37 +0000551
drh55ef4d92005-08-14 01:20:37 +0000552/*
553** Count the number of times that the LIKE operator (or GLOB which is
554** just a variation of LIKE) gets called. This is used for testing
555** only.
556*/
557#ifdef SQLITE_TEST
558int sqlite3_like_count = 0;
559#endif
560
danielk19773f6b0872004-06-17 05:36:44 +0000561
562/*
563** Implementation of the like() SQL function. This function implements
564** the build-in LIKE operator. The first argument to the function is the
565** pattern and the second argument is the string. So, the SQL statements:
566**
567** A LIKE B
568**
569** is implemented as like(B,A).
570**
drh55ef4d92005-08-14 01:20:37 +0000571** This same function (with a different compareInfo structure) computes
572** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000573*/
574static void likeFunc(
575 sqlite3_context *context,
576 int argc,
577 sqlite3_value **argv
578){
drhbeb818d2007-05-08 15:34:47 +0000579 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000580 int escape = 0;
drhbeb818d2007-05-08 15:34:47 +0000581
drh1f0feef2007-05-15 13:27:07 +0000582 zB = sqlite3_value_text(argv[0]);
583 zA = sqlite3_value_text(argv[1]);
584
drhbeb818d2007-05-08 15:34:47 +0000585 /* Limit the length of the LIKE or GLOB pattern to avoid problems
586 ** of deep recursion and N*N behavior in patternCompare().
587 */
danielk1977b56fe1f2007-05-09 08:24:44 +0000588 if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){
drhbeb818d2007-05-08 15:34:47 +0000589 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
590 return;
591 }
drh1f0feef2007-05-15 13:27:07 +0000592 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000593
danielk19777c6303c2004-11-17 16:41:29 +0000594 if( argc==3 ){
595 /* The escape character string must consist of a single UTF-8 character.
596 ** Otherwise, return an error.
597 */
598 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000599 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000600 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000601 sqlite3_result_error(context,
602 "ESCAPE expression must be a single character", -1);
603 return;
604 }
drh66150952007-07-23 19:12:41 +0000605 escape = sqlite3Utf8Read(zEsc, 0, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000606 }
danielk19773f6b0872004-06-17 05:36:44 +0000607 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000608 struct compareInfo *pInfo = sqlite3_user_data(context);
609#ifdef SQLITE_TEST
610 sqlite3_like_count++;
611#endif
drhbeb818d2007-05-08 15:34:47 +0000612
danielk1977b56fe1f2007-05-09 08:24:44 +0000613 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000614 }
drh8912d102002-05-26 21:34:58 +0000615}
616
617/*
618** Implementation of the NULLIF(x,y) function. The result is the first
619** argument if the arguments are different. The result is NULL if the
620** arguments are equal to each other.
621*/
drhf9b596e2004-05-26 16:54:42 +0000622static void nullifFunc(
623 sqlite3_context *context,
624 int argc,
625 sqlite3_value **argv
626){
danielk1977dc1bdc42004-06-11 10:51:27 +0000627 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
628 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000629 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000630 }
drh0ac65892002-04-20 14:24:41 +0000631}
632
drh647cb0e2002-11-04 19:32:25 +0000633/*
634** Implementation of the VERSION(*) function. The result is the version
635** of the SQLite library that is running.
636*/
drhf9b596e2004-05-26 16:54:42 +0000637static void versionFunc(
638 sqlite3_context *context,
639 int argc,
640 sqlite3_value **argv
641){
danielk1977d8123362004-06-12 09:25:12 +0000642 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000643}
644
drh137c7282007-01-29 17:58:28 +0000645/* Array for converting from half-bytes (nybbles) into ASCII hex
646** digits. */
647static const char hexdigits[] = {
648 '0', '1', '2', '3', '4', '5', '6', '7',
649 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
650};
danielk1977d641d642004-11-18 15:44:29 +0000651
drh47394702003-08-20 01:03:33 +0000652/*
653** EXPERIMENTAL - This is not an official function. The interface may
654** change. This function may disappear. Do not write code that depends
655** on this function.
656**
657** Implementation of the QUOTE() function. This function takes a single
658** argument. If the argument is numeric, the return value is the same as
659** the argument. If the argument is NULL, the return value is the string
660** "NULL". Otherwise, the argument is enclosed in single quotes with
661** single-quote escapes.
662*/
danielk19770ae8b832004-05-25 12:05:56 +0000663static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000664 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000665 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000666 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000667 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000668 break;
drh47394702003-08-20 01:03:33 +0000669 }
drh9c054832004-05-31 18:51:57 +0000670 case SQLITE_INTEGER:
671 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000672 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000673 break;
674 }
danielk19773f41e972004-06-08 00:39:01 +0000675 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000676 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000677 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000678 int nBlob = sqlite3_value_bytes(argv[0]);
679 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
danielk19773f41e972004-06-08 00:39:01 +0000680
drh023ae032007-05-08 12:12:16 +0000681 if( 2*nBlob+4>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000682 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000683 return;
684 }
danielk1977a1644fd2007-08-29 12:31:25 +0000685 zText = (char *)contextMalloc(context, (2*nBlob)+4);
686 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000687 int i;
688 for(i=0; i<nBlob; i++){
689 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
690 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
691 }
692 zText[(nBlob*2)+2] = '\'';
693 zText[(nBlob*2)+3] = '\0';
694 zText[0] = 'X';
695 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000696 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000697 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000698 }
699 break;
700 }
drh9c054832004-05-31 18:51:57 +0000701 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000702 int i,j;
703 u64 n;
drh2646da72005-12-09 20:02:05 +0000704 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000705 char *z;
706
drh7a521cf2007-04-25 18:23:52 +0000707 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000708 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
709 if( i+n+3>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000710 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000711 return;
712 }
danielk1977a1644fd2007-08-29 12:31:25 +0000713 z = contextMalloc(context, i+n+3);
714 if( z ){
715 z[0] = '\'';
716 for(i=0, j=1; zArg[i]; i++){
717 z[j++] = zArg[i];
718 if( zArg[i]=='\'' ){
719 z[j++] = '\'';
720 }
drhf9b596e2004-05-26 16:54:42 +0000721 }
danielk1977a1644fd2007-08-29 12:31:25 +0000722 z[j++] = '\'';
723 z[j] = 0;
724 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000725 }
drhf9b596e2004-05-26 16:54:42 +0000726 }
drh47394702003-08-20 01:03:33 +0000727 }
728}
729
drh137c7282007-01-29 17:58:28 +0000730/*
731** The hex() function. Interpret the argument as a blob. Return
732** a hexadecimal rendering as text.
733*/
734static void hexFunc(
735 sqlite3_context *context,
736 int argc,
737 sqlite3_value **argv
738){
739 int i, n;
740 const unsigned char *pBlob;
741 char *zHex, *z;
742 assert( argc==1 );
drh1f0feef2007-05-15 13:27:07 +0000743 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000744 n = sqlite3_value_bytes(argv[0]);
drh023ae032007-05-08 12:12:16 +0000745 if( n*2+1>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000746 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000747 return;
748 }
drh1f0feef2007-05-15 13:27:07 +0000749 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
danielk1977a1644fd2007-08-29 12:31:25 +0000750 z = zHex = contextMalloc(context, n*2 + 1);
751 if( zHex ){
752 for(i=0; i<n; i++, pBlob++){
753 unsigned char c = *pBlob;
754 *(z++) = hexdigits[(c>>4)&0xf];
755 *(z++) = hexdigits[c&0xf];
756 }
757 *z = 0;
758 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000759 }
drh137c7282007-01-29 17:58:28 +0000760}
761
drh26b6d902007-03-17 13:27:54 +0000762/*
drh8cff3822007-05-02 02:08:28 +0000763** The zeroblob(N) function returns a zero-filled blob of size N bytes.
764*/
765static void zeroblobFunc(
766 sqlite3_context *context,
767 int argc,
768 sqlite3_value **argv
769){
drh98640a32007-06-07 19:08:32 +0000770 i64 n;
drh8cff3822007-05-02 02:08:28 +0000771 assert( argc==1 );
drh98640a32007-06-07 19:08:32 +0000772 n = sqlite3_value_int64(argv[0]);
773 if( n>SQLITE_MAX_LENGTH ){
774 sqlite3_result_error_toobig(context);
775 }else{
776 sqlite3_result_zeroblob(context, n);
777 }
drh8cff3822007-05-02 02:08:28 +0000778}
779
780/*
drh26b6d902007-03-17 13:27:54 +0000781** The replace() function. Three arguments are all strings: call
782** them A, B, and C. The result is also a string which is derived
783** from A by replacing every occurance of B with C. The match
784** must be exact. Collating sequences are not used.
785*/
786static void replaceFunc(
787 sqlite3_context *context,
788 int argc,
789 sqlite3_value **argv
790){
791 const unsigned char *zStr; /* The input string A */
792 const unsigned char *zPattern; /* The pattern string B */
793 const unsigned char *zRep; /* The replacement string C */
794 unsigned char *zOut; /* The output */
795 int nStr; /* Size of zStr */
796 int nPattern; /* Size of zPattern */
797 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000798 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000799 int loopLimit; /* Last zStr[] that might match zPattern[] */
800 int i, j; /* Loop counters */
801
802 assert( argc==3 );
drh26b6d902007-03-17 13:27:54 +0000803 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000804 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000805 nStr = sqlite3_value_bytes(argv[0]);
806 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000807 zPattern = sqlite3_value_text(argv[1]);
drh709cff32007-04-27 01:18:02 +0000808 if( zPattern==0 || zPattern[0]==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000809 nPattern = sqlite3_value_bytes(argv[1]);
810 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000811 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000812 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000813 nRep = sqlite3_value_bytes(argv[2]);
814 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000815 nOut = nStr + 1;
816 assert( nOut<SQLITE_MAX_LENGTH );
danielk1977a1644fd2007-08-29 12:31:25 +0000817 zOut = contextMalloc(context, (int)nOut);
drh2e6400b2007-05-08 15:46:18 +0000818 if( zOut==0 ){
819 return;
drh26b6d902007-03-17 13:27:54 +0000820 }
drh26b6d902007-03-17 13:27:54 +0000821 loopLimit = nStr - nPattern;
822 for(i=j=0; i<=loopLimit; i++){
823 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
824 zOut[j++] = zStr[i];
825 }else{
drh4a50aac2007-08-23 02:47:53 +0000826 u8 *zOld;
drh2e6400b2007-05-08 15:46:18 +0000827 nOut += nRep - nPattern;
828 if( nOut>=SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000829 sqlite3_result_error_toobig(context);
danielk197717374e82007-05-08 14:39:04 +0000830 sqlite3_free(zOut);
831 return;
832 }
drh4a50aac2007-08-23 02:47:53 +0000833 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000834 zOut = sqlite3_realloc(zOut, (int)nOut);
835 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000836 sqlite3_result_error_nomem(context);
drh4a50aac2007-08-23 02:47:53 +0000837 sqlite3_free(zOld);
drh2e6400b2007-05-08 15:46:18 +0000838 return;
839 }
drh26b6d902007-03-17 13:27:54 +0000840 memcpy(&zOut[j], zRep, nRep);
841 j += nRep;
842 i += nPattern-1;
843 }
844 }
drh2e6400b2007-05-08 15:46:18 +0000845 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000846 memcpy(&zOut[j], &zStr[i], nStr-i);
847 j += nStr - i;
848 assert( j<=nOut );
849 zOut[j] = 0;
850 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
851}
852
drh309b3382007-03-17 17:52:42 +0000853/*
854** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
855** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
856*/
857static void trimFunc(
858 sqlite3_context *context,
859 int argc,
860 sqlite3_value **argv
861){
862 const unsigned char *zIn; /* Input string */
863 const unsigned char *zCharSet; /* Set of characters to trim */
864 int nIn; /* Number of bytes in input */
drhd1e3a612007-04-27 21:59:52 +0000865 int flags; /* 1: trimleft 2: trimright 3: trim */
866 int i; /* Loop counter */
867 unsigned char *aLen; /* Length of each character in zCharSet */
868 const unsigned char **azChar; /* Individual characters in zCharSet */
869 int nChar; /* Number of characters in zCharSet */
870
drh309b3382007-03-17 17:52:42 +0000871 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
872 return;
873 }
874 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000875 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000876 nIn = sqlite3_value_bytes(argv[0]);
877 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000878 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000879 static const unsigned char lenOne[] = { 1 };
drh8cff3822007-05-02 02:08:28 +0000880 static const unsigned char *azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000881 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000882 aLen = (u8*)lenOne;
883 azChar = azOne;
drhd1e3a612007-04-27 21:59:52 +0000884 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000885 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000886 return;
drhd1e3a612007-04-27 21:59:52 +0000887 }else{
888 const unsigned char *z;
889 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000890 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000891 }
892 if( nChar>0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000893 azChar = contextMalloc(context, nChar*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +0000894 if( azChar==0 ){
895 return;
896 }
897 aLen = (unsigned char*)&azChar[nChar];
898 for(z=zCharSet, nChar=0; *z; nChar++){
899 azChar[nChar] = z;
drh4a919112007-05-15 11:55:09 +0000900 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000901 aLen[nChar] = z - azChar[nChar];
902 }
903 }
drh309b3382007-03-17 17:52:42 +0000904 }
drhd1e3a612007-04-27 21:59:52 +0000905 if( nChar>0 ){
drh309b3382007-03-17 17:52:42 +0000906 flags = (int)sqlite3_user_data(context);
907 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000908 while( nIn>0 ){
909 int len;
910 for(i=0; i<nChar; i++){
911 len = aLen[i];
912 if( memcmp(zIn, azChar[i], len)==0 ) break;
913 }
914 if( i>=nChar ) break;
915 zIn += len;
916 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000917 }
918 }
919 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000920 while( nIn>0 ){
921 int len;
922 for(i=0; i<nChar; i++){
923 len = aLen[i];
924 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
925 }
926 if( i>=nChar ) break;
927 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000928 }
929 }
drhd1e3a612007-04-27 21:59:52 +0000930 if( zCharSet ){
931 sqlite3_free(azChar);
932 }
drh309b3382007-03-17 17:52:42 +0000933 }
934 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
935}
drh26b6d902007-03-17 13:27:54 +0000936
drhd24cc422003-03-27 12:51:24 +0000937#ifdef SQLITE_SOUNDEX
938/*
939** Compute the soundex encoding of a word.
940*/
drh137c7282007-01-29 17:58:28 +0000941static void soundexFunc(
942 sqlite3_context *context,
943 int argc,
944 sqlite3_value **argv
945){
drhd24cc422003-03-27 12:51:24 +0000946 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000947 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000948 int i, j;
949 static const unsigned char iCode[] = {
950 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
951 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
952 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
953 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
954 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
955 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
956 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
957 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
958 };
959 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000960 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000961 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000962 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
963 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000964 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000965 zResult[0] = toupper(zIn[i]);
966 for(j=1; j<4 && zIn[i]; i++){
967 int code = iCode[zIn[i]&0x7f];
968 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000969 if( code!=prevcode ){
970 prevcode = code;
971 zResult[j++] = code + '0';
972 }
973 }else{
974 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000975 }
976 }
977 while( j<4 ){
978 zResult[j++] = '0';
979 }
980 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000981 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000982 }else{
danielk1977d8123362004-06-12 09:25:12 +0000983 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000984 }
985}
986#endif
987
drhfdb83b22006-06-17 14:12:47 +0000988#ifndef SQLITE_OMIT_LOAD_EXTENSION
989/*
990** A function that loads a shared-library extension then returns NULL.
991*/
992static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +0000993 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000994 const char *zProc;
drhfdb83b22006-06-17 14:12:47 +0000995 sqlite3 *db = sqlite3_user_data(context);
996 char *zErrMsg = 0;
997
998 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +0000999 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001000 }else{
1001 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001002 }
drh7a521cf2007-04-25 18:23:52 +00001003 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001004 sqlite3_result_error(context, zErrMsg, -1);
1005 sqlite3_free(zErrMsg);
1006 }
1007}
1008#endif
1009
drh193a6b42002-07-07 16:52:46 +00001010#ifdef SQLITE_TEST
1011/*
1012** This function generates a string of random characters. Used for
1013** generating test data.
1014*/
danielk19770ae8b832004-05-25 12:05:56 +00001015static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +00001016 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +00001017 "abcdefghijklmnopqrstuvwxyz"
1018 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
1019 "0123456789"
1020 ".-!,:*^+=_|?/<> ";
1021 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +00001022 unsigned char zBuf[1000];
danielk1977d7d2f932007-09-01 17:00:12 +00001023
1024 /* It used to be possible to call randstr() with any number of arguments,
1025 ** but now it is registered with SQLite as requiring exactly 2.
1026 */
1027 assert(argc==2);
1028
1029 iMin = sqlite3_value_int(argv[0]);
1030 if( iMin<0 ) iMin = 0;
1031 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
1032 iMax = sqlite3_value_int(argv[1]);
1033 if( iMax<iMin ) iMax = iMin;
1034 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +00001035 n = iMin;
1036 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +00001037 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +00001038 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +00001039 n += r%(iMax + 1 - iMin);
1040 }
drh1dba7272004-01-16 13:58:18 +00001041 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +00001042 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +00001043 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +00001044 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +00001045 }
1046 zBuf[n] = 0;
drh2646da72005-12-09 20:02:05 +00001047 sqlite3_result_text(context, (char*)zBuf, n, SQLITE_TRANSIENT);
danielk1977d8123362004-06-12 09:25:12 +00001048}
drh0e3d7472004-06-19 17:33:07 +00001049#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +00001050
drh0e3d7472004-06-19 17:33:07 +00001051#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +00001052/*
1053** The following two SQL functions are used to test returning a text
1054** result with a destructor. Function 'test_destructor' takes one argument
1055** and returns the same argument interpreted as TEXT. A destructor is
1056** passed with the sqlite3_result_text() call.
1057**
1058** SQL function 'test_destructor_count' returns the number of outstanding
1059** allocations made by 'test_destructor';
1060**
1061** WARNING: Not threadsafe.
1062*/
1063static int test_destructor_count_var = 0;
1064static void destructor(void *p){
1065 char *zVal = (char *)p;
1066 assert(zVal);
1067 zVal--;
drh17435752007-08-16 04:30:38 +00001068 sqlite3_free(zVal);
danielk1977d8123362004-06-12 09:25:12 +00001069 test_destructor_count_var--;
1070}
1071static void test_destructor(
1072 sqlite3_context *pCtx,
1073 int nArg,
1074 sqlite3_value **argv
1075){
1076 char *zVal;
danielk1977f4618892004-06-28 13:09:11 +00001077 int len;
drh9bb575f2004-09-06 17:24:11 +00001078 sqlite3 *db = sqlite3_user_data(pCtx);
danielk1977f4618892004-06-28 13:09:11 +00001079
danielk1977d8123362004-06-12 09:25:12 +00001080 test_destructor_count_var++;
1081 assert( nArg==1 );
1082 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhb21c8cd2007-08-21 19:33:56 +00001083 len = sqlite3ValueBytes(argv[0], ENC(db));
danielk197726783a52007-08-29 14:06:22 +00001084 zVal = contextMalloc(pCtx, len+3);
1085 if( !zVal ){
1086 return;
1087 }
1088 zVal[len+1] = 0;
danielk197786011242007-08-30 16:30:27 +00001089 zVal[len+2] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001090 zVal++;
drhb21c8cd2007-08-21 19:33:56 +00001091 memcpy(zVal, sqlite3ValueText(argv[0], ENC(db)), len);
danielk197714db2662006-01-09 16:12:04 +00001092 if( ENC(db)==SQLITE_UTF8 ){
danielk1977f4618892004-06-28 13:09:11 +00001093 sqlite3_result_text(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001094#ifndef SQLITE_OMIT_UTF16
danielk197714db2662006-01-09 16:12:04 +00001095 }else if( ENC(db)==SQLITE_UTF16LE ){
danielk1977f4618892004-06-28 13:09:11 +00001096 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
1097 }else{
1098 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001099#endif /* SQLITE_OMIT_UTF16 */
danielk1977f4618892004-06-28 13:09:11 +00001100 }
danielk1977d8123362004-06-12 09:25:12 +00001101}
1102static void test_destructor_count(
1103 sqlite3_context *pCtx,
1104 int nArg,
1105 sqlite3_value **argv
1106){
1107 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +00001108}
drh0e3d7472004-06-19 17:33:07 +00001109#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +00001110
drh0e3d7472004-06-19 17:33:07 +00001111#ifdef SQLITE_TEST
1112/*
1113** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
1114** interface.
1115**
1116** The test_auxdata() SQL function attempts to register each of its arguments
1117** as auxiliary data. If there are no prior registrations of aux data for
1118** that argument (meaning the argument is not a constant or this is its first
1119** call) then the result for that argument is 0. If there is a prior
1120** registration, the result for that argument is 1. The overall result
1121** is the individual argument results separated by spaces.
1122*/
drh17435752007-08-16 04:30:38 +00001123static void free_test_auxdata(void *p) {sqlite3_free(p);}
danielk19773f6b0872004-06-17 05:36:44 +00001124static void test_auxdata(
1125 sqlite3_context *pCtx,
1126 int nArg,
1127 sqlite3_value **argv
1128){
1129 int i;
danielk1977a1644fd2007-08-29 12:31:25 +00001130 char *zRet = contextMalloc(pCtx, nArg*2);
danielk19773f6b0872004-06-17 05:36:44 +00001131 if( !zRet ) return;
danielk1977a1644fd2007-08-29 12:31:25 +00001132 memset(zRet, 0, nArg*2);
danielk19773f6b0872004-06-17 05:36:44 +00001133 for(i=0; i<nArg; i++){
drh2646da72005-12-09 20:02:05 +00001134 char const *z = (char*)sqlite3_value_text(argv[i]);
danielk19773f6b0872004-06-17 05:36:44 +00001135 if( z ){
1136 char *zAux = sqlite3_get_auxdata(pCtx, i);
1137 if( zAux ){
1138 zRet[i*2] = '1';
1139 if( strcmp(zAux, z) ){
1140 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
1141 return;
1142 }
danielk1977fa18bec2007-09-03 11:04:22 +00001143 }else {
danielk19773f6b0872004-06-17 05:36:44 +00001144 zRet[i*2] = '0';
danielk1977fa18bec2007-09-03 11:04:22 +00001145 }
1146
1147 zAux = contextMalloc(pCtx, strlen(z)+1);
1148 if( zAux ){
1149 strcpy(zAux, z);
1150 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
danielk19773f6b0872004-06-17 05:36:44 +00001151 }
1152 zRet[i*2+1] = ' ';
1153 }
1154 }
1155 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
1156}
drh0e3d7472004-06-19 17:33:07 +00001157#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +00001158
danielk197701427a62005-01-11 13:02:33 +00001159#ifdef SQLITE_TEST
1160/*
1161** A function to test error reporting from user functions. This function
1162** returns a copy of it's first argument as an error.
1163*/
1164static void test_error(
1165 sqlite3_context *pCtx,
1166 int nArg,
1167 sqlite3_value **argv
1168){
drh2646da72005-12-09 20:02:05 +00001169 sqlite3_result_error(pCtx, (char*)sqlite3_value_text(argv[0]), 0);
danielk197701427a62005-01-11 13:02:33 +00001170}
1171#endif /* SQLITE_TEST */
1172
drh0ac65892002-04-20 14:24:41 +00001173/*
drhd3a149e2002-02-24 17:12:53 +00001174** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001175** sum() or avg() aggregate computation.
1176*/
1177typedef struct SumCtx SumCtx;
1178struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001179 double rSum; /* Floating point sum */
1180 i64 iSum; /* Integer sum */
1181 i64 cnt; /* Number of elements summed */
1182 u8 overflow; /* True if integer overflow seen */
1183 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001184};
1185
1186/*
drha97fdd32006-01-12 22:17:50 +00001187** Routines used to compute the sum, average, and total.
1188**
1189** The SUM() function follows the (broken) SQL standard which means
1190** that it returns NULL if it sums over no inputs. TOTAL returns
1191** 0.0 in that case. In addition, TOTAL always returns a float where
1192** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001193** value. TOTAL never fails, but SUM might through an exception if
1194** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001195*/
danielk19770ae8b832004-05-25 12:05:56 +00001196static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001197 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001198 int type;
drh3f219f42005-09-08 19:45:57 +00001199 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +00001200 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001201 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001202 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001203 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001204 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001205 i64 v = sqlite3_value_int64(argv[0]);
1206 p->rSum += v;
1207 if( (p->approx|p->overflow)==0 ){
1208 i64 iNewSum = p->iSum + v;
1209 int s1 = p->iSum >> (sizeof(i64)*8-1);
1210 int s2 = v >> (sizeof(i64)*8-1);
1211 int s3 = iNewSum >> (sizeof(i64)*8-1);
1212 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
1213 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001214 }
1215 }else{
drh8c08e862006-02-11 17:34:00 +00001216 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001217 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001218 }
drh739105c2002-05-29 23:22:23 +00001219 }
drhdd5baa92002-02-27 19:50:59 +00001220}
danielk19770ae8b832004-05-25 12:05:56 +00001221static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001222 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001223 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001224 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001225 if( p->overflow ){
1226 sqlite3_result_error(context,"integer overflow",-1);
1227 }else if( p->approx ){
1228 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001229 }else{
drh8c08e862006-02-11 17:34:00 +00001230 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001231 }
drh3d1d95e2005-09-08 10:37:01 +00001232 }
drhdd5baa92002-02-27 19:50:59 +00001233}
danielk19770ae8b832004-05-25 12:05:56 +00001234static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001235 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001236 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001237 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001238 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001239 }
1240}
drha97fdd32006-01-12 22:17:50 +00001241static void totalFinalize(sqlite3_context *context){
1242 SumCtx *p;
1243 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001244 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001245}
drhdd5baa92002-02-27 19:50:59 +00001246
1247/*
drh0bce8352002-02-28 00:41:10 +00001248** The following structure keeps track of state information for the
1249** count() aggregate function.
1250*/
1251typedef struct CountCtx CountCtx;
1252struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001253 i64 n;
drh0bce8352002-02-28 00:41:10 +00001254};
drhdd5baa92002-02-27 19:50:59 +00001255
drh0bce8352002-02-28 00:41:10 +00001256/*
1257** Routines to implement the count() aggregate function.
1258*/
danielk19770ae8b832004-05-25 12:05:56 +00001259static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001260 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001261 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001262 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001263 p->n++;
1264 }
1265}
danielk19770ae8b832004-05-25 12:05:56 +00001266static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001267 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001268 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001269 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001270}
1271
1272/*
drh0bce8352002-02-28 00:41:10 +00001273** Routines to implement min() and max() aggregate functions.
1274*/
danielk19770ae8b832004-05-25 12:05:56 +00001275static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +00001276 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001277 Mem *pBest;
1278
1279 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1280 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001281 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001282
danielk197788208052004-05-25 01:13:20 +00001283 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001284 int max;
1285 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001286 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001287 /* This step function is used for both the min() and max() aggregates,
1288 ** the only difference between the two being that the sense of the
1289 ** comparison is inverted. For the max() aggregate, the
1290 ** sqlite3_user_data() function returns (void *)-1. For min() it
1291 ** returns (void *)db, where db is the sqlite3* database pointer.
1292 ** Therefore the next statement sets variable 'max' to 1 for the max()
1293 ** aggregate, or 0 for min().
1294 */
drh309b3382007-03-17 17:52:42 +00001295 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001296 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001297 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001298 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001299 }
drh268380c2004-02-25 13:47:31 +00001300 }else{
drhb21c8cd2007-08-21 19:33:56 +00001301 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001302 }
1303}
danielk19770ae8b832004-05-25 12:05:56 +00001304static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001305 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001306 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1307 if( pRes ){
1308 if( pRes->flags ){
1309 sqlite3_result_value(context, pRes);
1310 }
1311 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001312 }
1313}
drhdd5baa92002-02-27 19:50:59 +00001314
drhb0689692007-11-01 17:38:30 +00001315#ifdef SQLITE_GROUP_CONCAT
1316/*
1317** group_concat(EXPR, ?SEPARATOR?)
1318*/
1319static void groupConcatStep(
1320 sqlite3_context *context,
1321 int argc,
1322 sqlite3_value **argv
1323){
1324 const char *zVal;
1325 char **pzAccumulator;
1326 const char *zSep;
1327 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1328 zVal = sqlite3_value_text(argv[0]);
1329 pzAccumulator = (char**)sqlite3_aggregate_context(context, sizeof(char*));
1330 if( pzAccumulator ){
1331 if( *pzAccumulator==0 ){
1332 *pzAccumulator = sqlite3_mprintf("%s", zVal);
1333 }else{
1334 if( argc==2 ){
1335 zSep = sqlite3_value_text(argv[1]);
1336 }else{
1337 zSep = ",";
1338 }
1339 *pzAccumulator = sqlite3_mprintf("%z%s%s", *pzAccumulator, zSep, zVal);
1340 }
1341 }
1342}
1343static void groupConcatFinalize(sqlite3_context *context){
1344 char **pzAccum;
1345 pzAccum = sqlite3_aggregate_context(context, 0);
1346 if( pzAccum ){
1347 sqlite3_result_text(context, *pzAccum, -1, sqlite3_free);
1348 }
1349}
1350#endif /*SQLITE_GROUP_CONCAT*/
drh4e5ffc52004-08-31 00:52:37 +00001351
drhd3a149e2002-02-24 17:12:53 +00001352/*
drha2ed5602002-02-26 23:55:31 +00001353** This function registered all of the above C functions as SQL
1354** functions. This should be the only routine in this file with
1355** external linkage.
drhdc04c582002-02-24 01:55:15 +00001356*/
drh9bb575f2004-09-06 17:24:11 +00001357void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001358 static const struct {
drh0bce8352002-02-28 00:41:10 +00001359 char *zName;
drh268380c2004-02-25 13:47:31 +00001360 signed char nArg;
drh309b3382007-03-17 17:52:42 +00001361 u8 argType; /* ff: db 1: 0, 2: 1, 3: 2,... N: N-1. */
danielk1977f4618892004-06-28 13:09:11 +00001362 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001363 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001364 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001365 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001366 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1367 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
drh309b3382007-03-17 17:52:42 +00001368 { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc },
1369 { "max", 0, 1, SQLITE_UTF8, 1, 0 },
danielk1977f4618892004-06-28 13:09:11 +00001370 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1371 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
drh64f31512007-10-12 19:11:55 +00001372 { "substr", 2, 0, SQLITE_UTF8, 0, substrFunc },
danielk1977f4618892004-06-28 13:09:11 +00001373 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
danielk1977f4618892004-06-28 13:09:11 +00001374 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1375 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1376 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1377 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1378 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1379 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1380 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1381 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
drh137c7282007-01-29 17:58:28 +00001382 { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc },
danielk1977f4618892004-06-28 13:09:11 +00001383 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1384 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
drh137c7282007-01-29 17:58:28 +00001385 { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob },
drh94a98362004-09-13 13:13:18 +00001386 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001387 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1388 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
drh309b3382007-03-17 17:52:42 +00001389 { "last_insert_rowid", 0, 0xff, SQLITE_UTF8, 0, last_insert_rowid },
1390 { "changes", 0, 0xff, SQLITE_UTF8, 0, changes },
1391 { "total_changes", 0, 0xff, SQLITE_UTF8, 0, total_changes },
drh26b6d902007-03-17 13:27:54 +00001392 { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc },
drh309b3382007-03-17 17:52:42 +00001393 { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc },
1394 { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc },
1395 { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc },
1396 { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc },
1397 { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc },
1398 { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc },
drh8cff3822007-05-02 02:08:28 +00001399 { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc },
drhd24cc422003-03-27 12:51:24 +00001400#ifdef SQLITE_SOUNDEX
drh309b3382007-03-17 17:52:42 +00001401 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001402#endif
drhfdb83b22006-06-17 14:12:47 +00001403#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh309b3382007-03-17 17:52:42 +00001404 { "load_extension", 1, 0xff, SQLITE_UTF8, 0, loadExt },
1405 { "load_extension", 2, 0xff, SQLITE_UTF8, 0, loadExt },
drhfdb83b22006-06-17 14:12:47 +00001406#endif
drh193a6b42002-07-07 16:52:46 +00001407#ifdef SQLITE_TEST
drh309b3382007-03-17 17:52:42 +00001408 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1409 { "test_destructor", 1, 0xff, SQLITE_UTF8, 0, test_destructor},
1410 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
1411 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
1412 { "test_error", 1, 0, SQLITE_UTF8, 0, test_error},
drh193a6b42002-07-07 16:52:46 +00001413#endif
drh0bce8352002-02-28 00:41:10 +00001414 };
drh57196282004-10-06 15:41:16 +00001415 static const struct {
drh0bce8352002-02-28 00:41:10 +00001416 char *zName;
drh268380c2004-02-25 13:47:31 +00001417 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001418 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001419 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001420 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1421 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001422 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001423 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
drh309b3382007-03-17 17:52:42 +00001424 { "max", 1, 1, 1, minmaxStep, minMaxFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001425 { "sum", 1, 0, 0, sumStep, sumFinalize },
drha97fdd32006-01-12 22:17:50 +00001426 { "total", 1, 0, 0, sumStep, totalFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001427 { "avg", 1, 0, 0, sumStep, avgFinalize },
1428 { "count", 0, 0, 0, countStep, countFinalize },
1429 { "count", 1, 0, 0, countStep, countFinalize },
drhb0689692007-11-01 17:38:30 +00001430#ifdef SQLITE_GROUP_CONCAT
1431 { "group_concat", 1, 0, 0, groupConcatStep, groupConcatFinalize },
1432 { "group_concat", 2, 0, 0, groupConcatStep, groupConcatFinalize },
1433#endif
drh0bce8352002-02-28 00:41:10 +00001434 };
1435 int i;
1436
1437 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001438 void *pArg;
1439 u8 argType = aFuncs[i].argType;
1440 if( argType==0xff ){
1441 pArg = db;
1442 }else{
1443 pArg = (void*)(int)argType;
danielk1977c572ef72004-05-27 09:28:41 +00001444 }
danielk1977771151b2006-01-17 13:21:40 +00001445 sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001446 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001447 if( aFuncs[i].needCollSeq ){
1448 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1449 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1450 if( pFunc && aFuncs[i].needCollSeq ){
1451 pFunc->needCollSeq = 1;
1452 }
1453 }
drh0bce8352002-02-28 00:41:10 +00001454 }
drh1f01ec12005-02-15 21:36:18 +00001455#ifndef SQLITE_OMIT_ALTERTABLE
1456 sqlite3AlterFunctions(db);
1457#endif
drh198bf392006-01-06 21:52:49 +00001458#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001459 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001460#endif
drh0bce8352002-02-28 00:41:10 +00001461 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001462 void *pArg = (void*)(int)aAggs[i].argType;
danielk1977771151b2006-01-17 13:21:40 +00001463 sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001464 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001465 if( aAggs[i].needCollSeq ){
1466 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001467 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001468 if( pFunc && aAggs[i].needCollSeq ){
1469 pFunc->needCollSeq = 1;
1470 }
1471 }
drh268380c2004-02-25 13:47:31 +00001472 }
danielk19774adee202004-05-08 08:23:19 +00001473 sqlite3RegisterDateTimeFunctions(db);
danielk19771e536952007-08-16 10:09:01 +00001474 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001475 int rc = sqlite3_overload_function(db, "MATCH", 2);
1476 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1477 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001478 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001479 }
1480 }
danielk1977fd9e1f32005-05-22 10:44:34 +00001481#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001482 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001483#endif
drh55ef4d92005-08-14 01:20:37 +00001484#ifdef SQLITE_CASE_SENSITIVE_LIKE
1485 sqlite3RegisterLikeFunctions(db, 1);
1486#else
1487 sqlite3RegisterLikeFunctions(db, 0);
1488#endif
1489}
1490
1491/*
1492** Set the LIKEOPT flag on the 2-argument function with the given name.
1493*/
drhd64fe2f2005-08-28 17:00:23 +00001494static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001495 FuncDef *pDef;
1496 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1497 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001498 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001499 }
1500}
1501
1502/*
1503** Register the built-in LIKE and GLOB functions. The caseSensitive
1504** parameter determines whether or not the LIKE operator is case
1505** sensitive. GLOB is always case sensitive.
1506*/
1507void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1508 struct compareInfo *pInfo;
1509 if( caseSensitive ){
1510 pInfo = (struct compareInfo*)&likeInfoAlt;
1511 }else{
1512 pInfo = (struct compareInfo*)&likeInfoNorm;
1513 }
danielk1977771151b2006-01-17 13:21:40 +00001514 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1515 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1516 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001517 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001518 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1519 setLikeOptFlag(db, "like",
1520 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001521}
1522
1523/*
1524** pExpr points to an expression which implements a function. If
1525** it is appropriate to apply the LIKE optimization to that function
1526** then set aWc[0] through aWc[2] to the wildcard characters and
1527** return TRUE. If the function is not a LIKE-style function then
1528** return FALSE.
1529*/
drhd64fe2f2005-08-28 17:00:23 +00001530int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001531 FuncDef *pDef;
danielk1977cdbd8ef2007-05-12 06:11:12 +00001532 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
drh55ef4d92005-08-14 01:20:37 +00001533 return 0;
1534 }
1535 if( pExpr->pList->nExpr!=2 ){
1536 return 0;
1537 }
drh2646da72005-12-09 20:02:05 +00001538 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001539 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001540 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001541 return 0;
1542 }
1543
1544 /* The memcpy() statement assumes that the wildcard characters are
1545 ** the first three statements in the compareInfo structure. The
1546 ** asserts() that follow verify that assumption
1547 */
1548 memcpy(aWc, pDef->pUserData, 3);
1549 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1550 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1551 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001552 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001553 return 1;
drhdc04c582002-02-24 01:55:15 +00001554}