blob: 794950518612c0309efcd5f5abb190c1b8527996 [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**
drh106cee52008-09-03 17:11:16 +000019** $Id: func.c,v 1.203 2008/09/03 17:11:16 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
drh55ef4d92005-08-14 01:20:37 +000027/*
28** Return the collating function associated with a function.
29*/
danielk1977dc1bdc42004-06-11 10:51:27 +000030static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
31 return context->pColl;
32}
33
drh0bce8352002-02-28 00:41:10 +000034/*
35** Implementation of the non-aggregate min() and max() functions
36*/
drhf9b596e2004-05-26 16:54:42 +000037static void minmaxFunc(
38 sqlite3_context *context,
39 int argc,
40 sqlite3_value **argv
41){
drh0bce8352002-02-28 00:41:10 +000042 int i;
drh268380c2004-02-25 13:47:31 +000043 int mask; /* 0 for min() or 0xffffffff for max() */
drhf9b596e2004-05-26 16:54:42 +000044 int iBest;
danielk1977dc1bdc42004-06-11 10:51:27 +000045 CollSeq *pColl;
drh0bce8352002-02-28 00:41:10 +000046
drh89425d52002-02-28 03:04:48 +000047 if( argc==0 ) return;
drhc44af712004-09-02 15:53:56 +000048 mask = sqlite3_user_data(context)==0 ? 0 : -1;
danielk1977dc1bdc42004-06-11 10:51:27 +000049 pColl = sqlite3GetFuncCollSeq(context);
50 assert( pColl );
danielk1977c572ef72004-05-27 09:28:41 +000051 assert( mask==-1 || mask==0 );
drhf9b596e2004-05-26 16:54:42 +000052 iBest = 0;
drh9c054832004-05-31 18:51:57 +000053 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhf9b596e2004-05-26 16:54:42 +000054 for(i=1; i<argc; i++){
drh9c054832004-05-31 18:51:57 +000055 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
danielk1977dc1bdc42004-06-11 10:51:27 +000056 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
drhf9b596e2004-05-26 16:54:42 +000057 iBest = i;
drh0bce8352002-02-28 00:41:10 +000058 }
59 }
drhf4479502004-05-27 03:12:53 +000060 sqlite3_result_value(context, argv[iBest]);
drh0bce8352002-02-28 00:41:10 +000061}
drh0bce8352002-02-28 00:41:10 +000062
drh268380c2004-02-25 13:47:31 +000063/*
64** Return the type of the argument.
65*/
drhf9b596e2004-05-26 16:54:42 +000066static void typeofFunc(
67 sqlite3_context *context,
68 int argc,
69 sqlite3_value **argv
70){
danielk197735bb9d02004-05-24 12:55:54 +000071 const char *z = 0;
danielk197735bb9d02004-05-24 12:55:54 +000072 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000073 case SQLITE_NULL: z = "null"; break;
74 case SQLITE_INTEGER: z = "integer"; break;
75 case SQLITE_TEXT: z = "text"; break;
76 case SQLITE_FLOAT: z = "real"; break;
77 case SQLITE_BLOB: z = "blob"; break;
danielk197735bb9d02004-05-24 12:55:54 +000078 }
danielk1977d8123362004-06-12 09:25:12 +000079 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000080}
81
drh5708d2d2005-06-22 10:53:59 +000082
83/*
drh0bce8352002-02-28 00:41:10 +000084** Implementation of the length() function
85*/
drhf9b596e2004-05-26 16:54:42 +000086static void lengthFunc(
87 sqlite3_context *context,
88 int argc,
89 sqlite3_value **argv
90){
drh0bce8352002-02-28 00:41:10 +000091 int len;
92
93 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +000094 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000095 case SQLITE_BLOB:
96 case SQLITE_INTEGER:
97 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +000098 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +000099 break;
100 }
drh9c054832004-05-31 18:51:57 +0000101 case SQLITE_TEXT: {
drh2646da72005-12-09 20:02:05 +0000102 const unsigned char *z = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000103 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000104 len = 0;
105 while( *z ){
106 len++;
107 SQLITE_SKIP_UTF8(z);
108 }
drhf4479502004-05-27 03:12:53 +0000109 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000110 break;
111 }
112 default: {
113 sqlite3_result_null(context);
114 break;
115 }
116 }
drh0bce8352002-02-28 00:41:10 +0000117}
118
119/*
120** Implementation of the abs() function
121*/
danielk19770ae8b832004-05-25 12:05:56 +0000122static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000123 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +0000124 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000125 case SQLITE_INTEGER: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000126 i64 iVal = sqlite3_value_int64(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000127 if( iVal<0 ){
128 if( (iVal<<1)==0 ){
129 sqlite3_result_error(context, "integer overflow", -1);
130 return;
131 }
132 iVal = -iVal;
133 }
danielk1977f93bbbe2004-05-27 10:30:52 +0000134 sqlite3_result_int64(context, iVal);
drhf9b596e2004-05-26 16:54:42 +0000135 break;
136 }
drh9c054832004-05-31 18:51:57 +0000137 case SQLITE_NULL: {
drhf9b596e2004-05-26 16:54:42 +0000138 sqlite3_result_null(context);
139 break;
140 }
141 default: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000142 double rVal = sqlite3_value_double(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000143 if( rVal<0 ) rVal = -rVal;
danielk1977f93bbbe2004-05-27 10:30:52 +0000144 sqlite3_result_double(context, rVal);
drhf9b596e2004-05-26 16:54:42 +0000145 break;
146 }
147 }
drh0bce8352002-02-28 00:41:10 +0000148}
149
150/*
drhf764e6f2007-05-15 01:13:47 +0000151** Implementation of the substr() function.
152**
153** substr(x,p1,p2) returns p2 characters of x[] beginning with p1.
154** p1 is 1-indexed. So substr(x,1,1) returns the first character
155** of x. If x is text, then we actually count UTF-8 characters.
156** If x is a blob, then we count bytes.
157**
158** If p1 is negative, then we begin abs(p1) from the end of x[].
drh0bce8352002-02-28 00:41:10 +0000159*/
drhf9b596e2004-05-26 16:54:42 +0000160static void substrFunc(
161 sqlite3_context *context,
162 int argc,
163 sqlite3_value **argv
164){
drh2646da72005-12-09 20:02:05 +0000165 const unsigned char *z;
166 const unsigned char *z2;
drh023ae032007-05-08 12:12:16 +0000167 int len;
drhf764e6f2007-05-15 01:13:47 +0000168 int p0type;
drh023ae032007-05-08 12:12:16 +0000169 i64 p1, p2;
drhf9b596e2004-05-26 16:54:42 +0000170
drh64f31512007-10-12 19:11:55 +0000171 assert( argc==3 || argc==2 );
drhf764e6f2007-05-15 01:13:47 +0000172 p0type = sqlite3_value_type(argv[0]);
173 if( p0type==SQLITE_BLOB ){
174 len = sqlite3_value_bytes(argv[0]);
175 z = sqlite3_value_blob(argv[0]);
176 if( z==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000177 assert( len==sqlite3_value_bytes(argv[0]) );
drhf764e6f2007-05-15 01:13:47 +0000178 }else{
179 z = sqlite3_value_text(argv[0]);
180 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000181 len = 0;
182 for(z2=z; *z2; len++){
183 SQLITE_SKIP_UTF8(z2);
184 }
drhf764e6f2007-05-15 01:13:47 +0000185 }
danielk197751ad0ec2004-05-24 12:39:02 +0000186 p1 = sqlite3_value_int(argv[1]);
drh64f31512007-10-12 19:11:55 +0000187 if( argc==3 ){
188 p2 = sqlite3_value_int(argv[2]);
189 }else{
drhbb4957f2008-03-20 14:03:29 +0000190 p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH];
drh64f31512007-10-12 19:11:55 +0000191 }
drh0bce8352002-02-28 00:41:10 +0000192 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000193 p1 += len;
drh653bc752002-02-28 03:31:10 +0000194 if( p1<0 ){
195 p2 += p1;
196 p1 = 0;
197 }
drh0bce8352002-02-28 00:41:10 +0000198 }else if( p1>0 ){
199 p1--;
200 }
201 if( p1+p2>len ){
202 p2 = len-p1;
203 }
drhf764e6f2007-05-15 01:13:47 +0000204 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000205 while( *z && p1 ){
206 SQLITE_SKIP_UTF8(z);
207 p1--;
drhf764e6f2007-05-15 01:13:47 +0000208 }
drh4a919112007-05-15 11:55:09 +0000209 for(z2=z; *z2 && p2; p2--){
210 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000211 }
drh4a919112007-05-15 11:55:09 +0000212 sqlite3_result_text(context, (char*)z, z2-z, SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000213 }else{
214 if( p2<0 ) p2 = 0;
215 sqlite3_result_blob(context, (char*)&z[p1], p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000216 }
drh0bce8352002-02-28 00:41:10 +0000217}
218
219/*
220** Implementation of the round() function
221*/
danielk19770ae8b832004-05-25 12:05:56 +0000222static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000223 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000224 double r;
drh592ac8c2005-08-13 03:07:47 +0000225 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000226 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000227 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000228 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000229 n = sqlite3_value_int(argv[1]);
230 if( n>30 ) n = 30;
231 if( n<0 ) n = 0;
232 }
drhd589a922006-03-02 03:02:48 +0000233 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000234 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000235 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000236 sqlite3AtoF(zBuf, &r);
237 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000238}
drhdc04c582002-02-24 01:55:15 +0000239
danielk197726783a52007-08-29 14:06:22 +0000240/*
241** Allocate nByte bytes of space using sqlite3_malloc(). If the
242** allocation fails, call sqlite3_result_error_nomem() to notify
243** the database handle that malloc() has failed.
244*/
drhb1a6c3c2008-03-20 16:30:17 +0000245static void *contextMalloc(sqlite3_context *context, i64 nByte){
drhbb4957f2008-03-20 14:03:29 +0000246 char *z;
247 if( nByte>sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH] ){
248 sqlite3_result_error_toobig(context);
249 z = 0;
250 }else{
drhe5ae5732008-06-15 02:51:47 +0000251 z = sqlite3Malloc(nByte);
drhbb4957f2008-03-20 14:03:29 +0000252 if( !z && nByte>0 ){
253 sqlite3_result_error_nomem(context);
254 }
danielk1977a1644fd2007-08-29 12:31:25 +0000255 }
256 return z;
257}
258
drhdc04c582002-02-24 01:55:15 +0000259/*
260** Implementation of the upper() and lower() SQL functions.
261*/
danielk19770ae8b832004-05-25 12:05:56 +0000262static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000263 char *z1;
264 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000265 int i, n;
drh9c054832004-05-31 18:51:57 +0000266 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000267 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000268 n = sqlite3_value_bytes(argv[0]);
269 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
270 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000271 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000272 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000273 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000274 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000275 for(i=0; z1[i]; i++){
276 z1[i] = toupper(z1[i]);
277 }
278 sqlite3_result_text(context, z1, -1, sqlite3_free);
279 }
drhdc04c582002-02-24 01:55:15 +0000280 }
281}
danielk19770ae8b832004-05-25 12:05:56 +0000282static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000283 char *z1;
284 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000285 int i, n;
drh9c054832004-05-31 18:51:57 +0000286 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000287 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000288 n = sqlite3_value_bytes(argv[0]);
289 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
290 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000291 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000292 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000293 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000294 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000295 for(i=0; z1[i]; i++){
296 z1[i] = tolower(z1[i]);
297 }
298 sqlite3_result_text(context, z1, -1, sqlite3_free);
299 }
drhdc04c582002-02-24 01:55:15 +0000300 }
301}
302
303/*
drhfbc99082002-02-28 03:14:18 +0000304** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000305** All three do the same thing. They return the first non-NULL
306** argument.
drh3212e182002-02-28 00:46:26 +0000307*/
drhf9b596e2004-05-26 16:54:42 +0000308static void ifnullFunc(
309 sqlite3_context *context,
310 int argc,
311 sqlite3_value **argv
312){
drhfbc99082002-02-28 03:14:18 +0000313 int i;
314 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000315 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000316 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000317 break;
318 }
319 }
drh3212e182002-02-28 00:46:26 +0000320}
321
322/*
drhf9ffac92002-03-02 19:00:31 +0000323** Implementation of random(). Return a random integer.
324*/
drhf9b596e2004-05-26 16:54:42 +0000325static void randomFunc(
326 sqlite3_context *context,
327 int argc,
328 sqlite3_value **argv
329){
drh52fc8492006-02-23 21:43:55 +0000330 sqlite_int64 r;
drh2fa18682008-03-19 14:15:34 +0000331 sqlite3_randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000332 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
333 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000334 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000335}
336
337/*
drh137c7282007-01-29 17:58:28 +0000338** Implementation of randomblob(N). Return a random blob
339** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000340*/
drh137c7282007-01-29 17:58:28 +0000341static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000342 sqlite3_context *context,
343 int argc,
344 sqlite3_value **argv
345){
drh137c7282007-01-29 17:58:28 +0000346 int n;
347 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000348 assert( argc==1 );
349 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000350 if( n<1 ){
351 n = 1;
352 }
danielk1977a1644fd2007-08-29 12:31:25 +0000353 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000354 if( p ){
drh2fa18682008-03-19 14:15:34 +0000355 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000356 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000357 }
drh63cf66f2007-01-29 15:50:05 +0000358}
359
360/*
drh6ed41ad2002-04-06 14:10:47 +0000361** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000362** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000363*/
danielk197751ad0ec2004-05-24 12:39:02 +0000364static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000365 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000366 int arg,
367 sqlite3_value **argv
368){
drhfa4a4b92008-03-19 21:45:51 +0000369 sqlite3 *db = sqlite3_context_db_handle(context);
drhf9b596e2004-05-26 16:54:42 +0000370 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000371}
372
rdcf146a772004-02-25 22:51:06 +0000373/*
danielk1977b28af712004-06-21 06:50:26 +0000374** Implementation of the changes() SQL function. The return value is the
375** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000376*/
danielk1977b28af712004-06-21 06:50:26 +0000377static void changes(
drhf9b596e2004-05-26 16:54:42 +0000378 sqlite3_context *context,
379 int arg,
380 sqlite3_value **argv
381){
drhfa4a4b92008-03-19 21:45:51 +0000382 sqlite3 *db = sqlite3_context_db_handle(context);
drhf4479502004-05-27 03:12:53 +0000383 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000384}
rdcf146a772004-02-25 22:51:06 +0000385
386/*
danielk1977b28af712004-06-21 06:50:26 +0000387** Implementation of the total_changes() SQL function. The return value is
388** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000389*/
danielk1977b28af712004-06-21 06:50:26 +0000390static void total_changes(
391 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000392 int arg,
393 sqlite3_value **argv
394){
drhfa4a4b92008-03-19 21:45:51 +0000395 sqlite3 *db = sqlite3_context_db_handle(context);
danielk1977b28af712004-06-21 06:50:26 +0000396 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000397}
398
drh6ed41ad2002-04-06 14:10:47 +0000399/*
drh4e5ffc52004-08-31 00:52:37 +0000400** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000401*/
drh4e5ffc52004-08-31 00:52:37 +0000402struct compareInfo {
403 u8 matchAll;
404 u8 matchOne;
405 u8 matchSet;
406 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000407};
drh55ef4d92005-08-14 01:20:37 +0000408
drhb9175ae2007-12-07 18:39:04 +0000409/*
410** For LIKE and GLOB matching on EBCDIC machines, assume that every
411** character is exactly one byte in size. Also, all characters are
412** able to participate in upper-case-to-lower-case mappings in EBCDIC
413** whereas only characters less than 0x80 do in ASCII.
414*/
415#if defined(SQLITE_EBCDIC)
416# define sqlite3Utf8Read(A,B,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000417# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000418#else
drh6ed4b782007-12-10 18:07:20 +0000419# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000420#endif
421
drh4e5ffc52004-08-31 00:52:37 +0000422static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000423/* The correct SQL-92 behavior is for the LIKE operator to ignore
424** case. Thus 'a' LIKE 'A' would be true. */
425static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
426/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
427** is case sensitive causing 'a' LIKE 'A' to be false */
428static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000429
430/*
drh4e5ffc52004-08-31 00:52:37 +0000431** Compare two UTF-8 strings for equality where the first string can
432** potentially be a "glob" expression. Return true (1) if they
433** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000434**
drh4e5ffc52004-08-31 00:52:37 +0000435** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000436**
drh4e5ffc52004-08-31 00:52:37 +0000437** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000438**
drh4e5ffc52004-08-31 00:52:37 +0000439** '?' Matches exactly one character.
440**
441** [...] Matches one character from the enclosed list of
442** characters.
443**
444** [^...] Matches one character not in the enclosed list.
445**
446** With the [...] and [^...] matching, a ']' character can be included
447** in the list by making it the first character after '[' or '^'. A
448** range of characters can be specified using '-'. Example:
449** "[a-z]" matches any single lower-case letter. To match a '-', make
450** it the last character in the list.
451**
452** This routine is usually quick, but can be N**2 in the worst case.
453**
454** Hints: to match '*' or '?', put them in "[]". Like this:
455**
456** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000457*/
danielk19777c6303c2004-11-17 16:41:29 +0000458static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000459 const u8 *zPattern, /* The glob pattern */
460 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000461 const struct compareInfo *pInfo, /* Information about how to do the compare */
462 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000463){
drh66150952007-07-23 19:12:41 +0000464 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000465 int invert;
466 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000467 u8 matchOne = pInfo->matchOne;
468 u8 matchAll = pInfo->matchAll;
469 u8 matchSet = pInfo->matchSet;
470 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000471 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000472
drh66150952007-07-23 19:12:41 +0000473 while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000474 if( !prevEscape && c==matchAll ){
drh66150952007-07-23 19:12:41 +0000475 while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll
476 || c == matchOne ){
477 if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){
478 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000479 }
danielk1977ad7dd422004-06-06 12:41:49 +0000480 }
drh66150952007-07-23 19:12:41 +0000481 if( c==0 ){
482 return 1;
483 }else if( c==esc ){
484 c = sqlite3Utf8Read(zPattern, 0, &zPattern);
485 if( c==0 ){
486 return 0;
487 }
488 }else if( c==matchSet ){
489 assert( esc==0 ); /* This is GLOB, not LIKE */
490 assert( matchSet<0x80 ); /* '[' is a single-byte character */
491 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000492 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000493 }
494 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000495 }
496 while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){
497 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000498 GlogUpperToLower(c2);
499 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000500 while( c2 != 0 && c2 != c ){
501 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh6ed4b782007-12-10 18:07:20 +0000502 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000503 }
drh66150952007-07-23 19:12:41 +0000504 }else{
505 while( c2 != 0 && c2 != c ){
506 c2 = sqlite3Utf8Read(zString, 0, &zString);
507 }
drh4e5ffc52004-08-31 00:52:37 +0000508 }
drh66150952007-07-23 19:12:41 +0000509 if( c2==0 ) return 0;
510 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
511 }
512 return 0;
513 }else if( !prevEscape && c==matchOne ){
514 if( sqlite3Utf8Read(zString, 0, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000515 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000516 }
drh4e5ffc52004-08-31 00:52:37 +0000517 }else if( c==matchSet ){
518 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000519 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000520 seen = 0;
521 invert = 0;
drh66150952007-07-23 19:12:41 +0000522 c = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000523 if( c==0 ) return 0;
drh66150952007-07-23 19:12:41 +0000524 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
525 if( c2=='^' ){
526 invert = 1;
527 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
528 }
drh4e5ffc52004-08-31 00:52:37 +0000529 if( c2==']' ){
530 if( c==']' ) seen = 1;
drh66150952007-07-23 19:12:41 +0000531 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000532 }
drh66150952007-07-23 19:12:41 +0000533 while( c2 && c2!=']' ){
534 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
535 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000536 if( c>=prior_c && c<=c2 ) seen = 1;
537 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000538 }else{
drh66150952007-07-23 19:12:41 +0000539 if( c==c2 ){
540 seen = 1;
541 }
drh4e5ffc52004-08-31 00:52:37 +0000542 prior_c = c2;
543 }
drh66150952007-07-23 19:12:41 +0000544 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000545 }
drh66150952007-07-23 19:12:41 +0000546 if( c2==0 || (seen ^ invert)==0 ){
547 return 0;
548 }
549 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000550 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000551 }else{
drh66150952007-07-23 19:12:41 +0000552 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000553 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000554 GlogUpperToLower(c);
555 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000556 }
drh66150952007-07-23 19:12:41 +0000557 if( c!=c2 ){
558 return 0;
559 }
danielk19777c6303c2004-11-17 16:41:29 +0000560 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000561 }
danielk197751ad0ec2004-05-24 12:39:02 +0000562 }
drh4e5ffc52004-08-31 00:52:37 +0000563 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000564}
drh4e5ffc52004-08-31 00:52:37 +0000565
drh55ef4d92005-08-14 01:20:37 +0000566/*
567** Count the number of times that the LIKE operator (or GLOB which is
568** just a variation of LIKE) gets called. This is used for testing
569** only.
570*/
571#ifdef SQLITE_TEST
572int sqlite3_like_count = 0;
573#endif
574
danielk19773f6b0872004-06-17 05:36:44 +0000575
576/*
577** Implementation of the like() SQL function. This function implements
578** the build-in LIKE operator. The first argument to the function is the
579** pattern and the second argument is the string. So, the SQL statements:
580**
581** A LIKE B
582**
583** is implemented as like(B,A).
584**
drh55ef4d92005-08-14 01:20:37 +0000585** This same function (with a different compareInfo structure) computes
586** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000587*/
588static void likeFunc(
589 sqlite3_context *context,
590 int argc,
591 sqlite3_value **argv
592){
drhbeb818d2007-05-08 15:34:47 +0000593 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000594 int escape = 0;
drhbb4957f2008-03-20 14:03:29 +0000595 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000596
drh1f0feef2007-05-15 13:27:07 +0000597 zB = sqlite3_value_text(argv[0]);
598 zA = sqlite3_value_text(argv[1]);
599
drhbeb818d2007-05-08 15:34:47 +0000600 /* Limit the length of the LIKE or GLOB pattern to avoid problems
601 ** of deep recursion and N*N behavior in patternCompare().
602 */
drhbb4957f2008-03-20 14:03:29 +0000603 if( sqlite3_value_bytes(argv[0]) >
604 db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000605 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
606 return;
607 }
drh1f0feef2007-05-15 13:27:07 +0000608 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000609
danielk19777c6303c2004-11-17 16:41:29 +0000610 if( argc==3 ){
611 /* The escape character string must consist of a single UTF-8 character.
612 ** Otherwise, return an error.
613 */
614 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000615 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000616 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000617 sqlite3_result_error(context,
618 "ESCAPE expression must be a single character", -1);
619 return;
620 }
drh66150952007-07-23 19:12:41 +0000621 escape = sqlite3Utf8Read(zEsc, 0, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000622 }
danielk19773f6b0872004-06-17 05:36:44 +0000623 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000624 struct compareInfo *pInfo = sqlite3_user_data(context);
625#ifdef SQLITE_TEST
626 sqlite3_like_count++;
627#endif
drhbeb818d2007-05-08 15:34:47 +0000628
danielk1977b56fe1f2007-05-09 08:24:44 +0000629 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000630 }
drh8912d102002-05-26 21:34:58 +0000631}
632
633/*
634** Implementation of the NULLIF(x,y) function. The result is the first
635** argument if the arguments are different. The result is NULL if the
636** arguments are equal to each other.
637*/
drhf9b596e2004-05-26 16:54:42 +0000638static void nullifFunc(
639 sqlite3_context *context,
640 int argc,
641 sqlite3_value **argv
642){
danielk1977dc1bdc42004-06-11 10:51:27 +0000643 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
644 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000645 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000646 }
drh0ac65892002-04-20 14:24:41 +0000647}
648
drh647cb0e2002-11-04 19:32:25 +0000649/*
650** Implementation of the VERSION(*) function. The result is the version
651** of the SQLite library that is running.
652*/
drhf9b596e2004-05-26 16:54:42 +0000653static void versionFunc(
654 sqlite3_context *context,
655 int argc,
656 sqlite3_value **argv
657){
danielk1977d8123362004-06-12 09:25:12 +0000658 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000659}
660
drh137c7282007-01-29 17:58:28 +0000661/* Array for converting from half-bytes (nybbles) into ASCII hex
662** digits. */
663static const char hexdigits[] = {
664 '0', '1', '2', '3', '4', '5', '6', '7',
665 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
666};
danielk1977d641d642004-11-18 15:44:29 +0000667
drh47394702003-08-20 01:03:33 +0000668/*
669** EXPERIMENTAL - This is not an official function. The interface may
670** change. This function may disappear. Do not write code that depends
671** on this function.
672**
673** Implementation of the QUOTE() function. This function takes a single
674** argument. If the argument is numeric, the return value is the same as
675** the argument. If the argument is NULL, the return value is the string
676** "NULL". Otherwise, the argument is enclosed in single quotes with
677** single-quote escapes.
678*/
danielk19770ae8b832004-05-25 12:05:56 +0000679static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000680 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000681 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000682 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000683 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000684 break;
drh47394702003-08-20 01:03:33 +0000685 }
drh9c054832004-05-31 18:51:57 +0000686 case SQLITE_INTEGER:
687 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000688 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000689 break;
690 }
danielk19773f41e972004-06-08 00:39:01 +0000691 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000692 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000693 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000694 int nBlob = sqlite3_value_bytes(argv[0]);
695 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000696 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000697 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000698 int i;
699 for(i=0; i<nBlob; i++){
700 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
701 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
702 }
703 zText[(nBlob*2)+2] = '\'';
704 zText[(nBlob*2)+3] = '\0';
705 zText[0] = 'X';
706 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000707 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000708 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000709 }
710 break;
711 }
drh9c054832004-05-31 18:51:57 +0000712 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000713 int i,j;
714 u64 n;
drh2646da72005-12-09 20:02:05 +0000715 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000716 char *z;
717
drh7a521cf2007-04-25 18:23:52 +0000718 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000719 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000720 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000721 if( z ){
722 z[0] = '\'';
723 for(i=0, j=1; zArg[i]; i++){
724 z[j++] = zArg[i];
725 if( zArg[i]=='\'' ){
726 z[j++] = '\'';
727 }
drhf9b596e2004-05-26 16:54:42 +0000728 }
danielk1977a1644fd2007-08-29 12:31:25 +0000729 z[j++] = '\'';
730 z[j] = 0;
731 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000732 }
drhf9b596e2004-05-26 16:54:42 +0000733 }
drh47394702003-08-20 01:03:33 +0000734 }
735}
736
drh137c7282007-01-29 17:58:28 +0000737/*
738** The hex() function. Interpret the argument as a blob. Return
739** a hexadecimal rendering as text.
740*/
741static void hexFunc(
742 sqlite3_context *context,
743 int argc,
744 sqlite3_value **argv
745){
746 int i, n;
747 const unsigned char *pBlob;
748 char *zHex, *z;
749 assert( argc==1 );
drh1f0feef2007-05-15 13:27:07 +0000750 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000751 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000752 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000753 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000754 if( zHex ){
755 for(i=0; i<n; i++, pBlob++){
756 unsigned char c = *pBlob;
757 *(z++) = hexdigits[(c>>4)&0xf];
758 *(z++) = hexdigits[c&0xf];
759 }
760 *z = 0;
761 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000762 }
drh137c7282007-01-29 17:58:28 +0000763}
764
drh26b6d902007-03-17 13:27:54 +0000765/*
drh8cff3822007-05-02 02:08:28 +0000766** The zeroblob(N) function returns a zero-filled blob of size N bytes.
767*/
768static void zeroblobFunc(
769 sqlite3_context *context,
770 int argc,
771 sqlite3_value **argv
772){
drh98640a32007-06-07 19:08:32 +0000773 i64 n;
drh8cff3822007-05-02 02:08:28 +0000774 assert( argc==1 );
drh98640a32007-06-07 19:08:32 +0000775 n = sqlite3_value_int64(argv[0]);
776 if( n>SQLITE_MAX_LENGTH ){
777 sqlite3_result_error_toobig(context);
778 }else{
779 sqlite3_result_zeroblob(context, n);
780 }
drh8cff3822007-05-02 02:08:28 +0000781}
782
783/*
drh26b6d902007-03-17 13:27:54 +0000784** The replace() function. Three arguments are all strings: call
785** them A, B, and C. The result is also a string which is derived
786** from A by replacing every occurance of B with C. The match
787** must be exact. Collating sequences are not used.
788*/
789static void replaceFunc(
790 sqlite3_context *context,
791 int argc,
792 sqlite3_value **argv
793){
794 const unsigned char *zStr; /* The input string A */
795 const unsigned char *zPattern; /* The pattern string B */
796 const unsigned char *zRep; /* The replacement string C */
797 unsigned char *zOut; /* The output */
798 int nStr; /* Size of zStr */
799 int nPattern; /* Size of zPattern */
800 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000801 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000802 int loopLimit; /* Last zStr[] that might match zPattern[] */
803 int i, j; /* Loop counters */
804
805 assert( argc==3 );
drh26b6d902007-03-17 13:27:54 +0000806 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000807 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000808 nStr = sqlite3_value_bytes(argv[0]);
809 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000810 zPattern = sqlite3_value_text(argv[1]);
drh709cff32007-04-27 01:18:02 +0000811 if( zPattern==0 || zPattern[0]==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000812 nPattern = sqlite3_value_bytes(argv[1]);
813 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000814 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000815 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000816 nRep = sqlite3_value_bytes(argv[2]);
817 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000818 nOut = nStr + 1;
819 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +0000820 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +0000821 if( zOut==0 ){
822 return;
drh26b6d902007-03-17 13:27:54 +0000823 }
drh26b6d902007-03-17 13:27:54 +0000824 loopLimit = nStr - nPattern;
825 for(i=j=0; i<=loopLimit; i++){
826 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
827 zOut[j++] = zStr[i];
828 }else{
drh4a50aac2007-08-23 02:47:53 +0000829 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +0000830 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +0000831 nOut += nRep - nPattern;
drhbb4957f2008-03-20 14:03:29 +0000832 if( nOut>=db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +0000833 sqlite3_result_error_toobig(context);
drh633e6d52008-07-28 19:34:53 +0000834 sqlite3DbFree(db, zOut);
danielk197717374e82007-05-08 14:39:04 +0000835 return;
836 }
drh4a50aac2007-08-23 02:47:53 +0000837 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000838 zOut = sqlite3_realloc(zOut, (int)nOut);
839 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000840 sqlite3_result_error_nomem(context);
drh633e6d52008-07-28 19:34:53 +0000841 sqlite3DbFree(db, zOld);
drh2e6400b2007-05-08 15:46:18 +0000842 return;
843 }
drh26b6d902007-03-17 13:27:54 +0000844 memcpy(&zOut[j], zRep, nRep);
845 j += nRep;
846 i += nPattern-1;
847 }
848 }
drh2e6400b2007-05-08 15:46:18 +0000849 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000850 memcpy(&zOut[j], &zStr[i], nStr-i);
851 j += nStr - i;
852 assert( j<=nOut );
853 zOut[j] = 0;
854 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
855}
856
drh309b3382007-03-17 17:52:42 +0000857/*
858** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
859** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
860*/
861static void trimFunc(
862 sqlite3_context *context,
863 int argc,
864 sqlite3_value **argv
865){
866 const unsigned char *zIn; /* Input string */
867 const unsigned char *zCharSet; /* Set of characters to trim */
868 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +0000869 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +0000870 int i; /* Loop counter */
871 unsigned char *aLen; /* Length of each character in zCharSet */
danielk1977bc67da42007-12-11 04:23:19 +0000872 unsigned char **azChar; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000873 int nChar; /* Number of characters in zCharSet */
874
drh309b3382007-03-17 17:52:42 +0000875 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
876 return;
877 }
878 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000879 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000880 nIn = sqlite3_value_bytes(argv[0]);
881 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000882 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000883 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +0000884 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000885 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000886 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +0000887 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +0000888 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000889 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000890 return;
drhd1e3a612007-04-27 21:59:52 +0000891 }else{
892 const unsigned char *z;
893 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000894 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000895 }
896 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +0000897 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +0000898 if( azChar==0 ){
899 return;
900 }
901 aLen = (unsigned char*)&azChar[nChar];
902 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +0000903 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +0000904 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000905 aLen[nChar] = z - azChar[nChar];
906 }
907 }
drh309b3382007-03-17 17:52:42 +0000908 }
drhd1e3a612007-04-27 21:59:52 +0000909 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +0000910 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +0000911 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000912 while( nIn>0 ){
913 int len;
914 for(i=0; i<nChar; i++){
915 len = aLen[i];
916 if( memcmp(zIn, azChar[i], len)==0 ) break;
917 }
918 if( i>=nChar ) break;
919 zIn += len;
920 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000921 }
922 }
923 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000924 while( nIn>0 ){
925 int len;
926 for(i=0; i<nChar; i++){
927 len = aLen[i];
928 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
929 }
930 if( i>=nChar ) break;
931 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000932 }
933 }
drhd1e3a612007-04-27 21:59:52 +0000934 if( zCharSet ){
935 sqlite3_free(azChar);
936 }
drh309b3382007-03-17 17:52:42 +0000937 }
938 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
939}
drh26b6d902007-03-17 13:27:54 +0000940
danielk1977a4de4532008-09-02 15:44:08 +0000941
drhd24cc422003-03-27 12:51:24 +0000942#ifdef SQLITE_SOUNDEX
943/*
944** Compute the soundex encoding of a word.
945*/
drh137c7282007-01-29 17:58:28 +0000946static void soundexFunc(
947 sqlite3_context *context,
948 int argc,
949 sqlite3_value **argv
950){
drhd24cc422003-03-27 12:51:24 +0000951 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000952 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000953 int i, j;
954 static const unsigned char iCode[] = {
955 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
956 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
957 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
958 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
959 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
960 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
961 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
962 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
963 };
964 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000965 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000966 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000967 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
968 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000969 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000970 zResult[0] = toupper(zIn[i]);
971 for(j=1; j<4 && zIn[i]; i++){
972 int code = iCode[zIn[i]&0x7f];
973 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000974 if( code!=prevcode ){
975 prevcode = code;
976 zResult[j++] = code + '0';
977 }
978 }else{
979 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000980 }
981 }
982 while( j<4 ){
983 zResult[j++] = '0';
984 }
985 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000986 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000987 }else{
danielk1977d8123362004-06-12 09:25:12 +0000988 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000989 }
990}
991#endif
992
drhfdb83b22006-06-17 14:12:47 +0000993#ifndef SQLITE_OMIT_LOAD_EXTENSION
994/*
995** A function that loads a shared-library extension then returns NULL.
996*/
997static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +0000998 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000999 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001000 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001001 char *zErrMsg = 0;
1002
1003 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001004 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001005 }else{
1006 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001007 }
drh7a521cf2007-04-25 18:23:52 +00001008 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001009 sqlite3_result_error(context, zErrMsg, -1);
1010 sqlite3_free(zErrMsg);
1011 }
1012}
1013#endif
1014
danielk197701427a62005-01-11 13:02:33 +00001015
drh0ac65892002-04-20 14:24:41 +00001016/*
drhd3a149e2002-02-24 17:12:53 +00001017** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001018** sum() or avg() aggregate computation.
1019*/
1020typedef struct SumCtx SumCtx;
1021struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001022 double rSum; /* Floating point sum */
1023 i64 iSum; /* Integer sum */
1024 i64 cnt; /* Number of elements summed */
1025 u8 overflow; /* True if integer overflow seen */
1026 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001027};
1028
1029/*
drha97fdd32006-01-12 22:17:50 +00001030** Routines used to compute the sum, average, and total.
1031**
1032** The SUM() function follows the (broken) SQL standard which means
1033** that it returns NULL if it sums over no inputs. TOTAL returns
1034** 0.0 in that case. In addition, TOTAL always returns a float where
1035** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001036** value. TOTAL never fails, but SUM might through an exception if
1037** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001038*/
danielk19770ae8b832004-05-25 12:05:56 +00001039static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001040 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001041 int type;
drh3f219f42005-09-08 19:45:57 +00001042 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +00001043 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001044 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001045 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001046 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001047 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001048 i64 v = sqlite3_value_int64(argv[0]);
1049 p->rSum += v;
1050 if( (p->approx|p->overflow)==0 ){
1051 i64 iNewSum = p->iSum + v;
1052 int s1 = p->iSum >> (sizeof(i64)*8-1);
1053 int s2 = v >> (sizeof(i64)*8-1);
1054 int s3 = iNewSum >> (sizeof(i64)*8-1);
1055 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
1056 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001057 }
1058 }else{
drh8c08e862006-02-11 17:34:00 +00001059 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001060 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001061 }
drh739105c2002-05-29 23:22:23 +00001062 }
drhdd5baa92002-02-27 19:50:59 +00001063}
danielk19770ae8b832004-05-25 12:05:56 +00001064static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001065 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001066 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001067 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001068 if( p->overflow ){
1069 sqlite3_result_error(context,"integer overflow",-1);
1070 }else if( p->approx ){
1071 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001072 }else{
drh8c08e862006-02-11 17:34:00 +00001073 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001074 }
drh3d1d95e2005-09-08 10:37:01 +00001075 }
drhdd5baa92002-02-27 19:50:59 +00001076}
danielk19770ae8b832004-05-25 12:05:56 +00001077static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001078 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001079 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001080 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001081 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001082 }
1083}
drha97fdd32006-01-12 22:17:50 +00001084static void totalFinalize(sqlite3_context *context){
1085 SumCtx *p;
1086 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001087 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001088}
drhdd5baa92002-02-27 19:50:59 +00001089
1090/*
drh0bce8352002-02-28 00:41:10 +00001091** The following structure keeps track of state information for the
1092** count() aggregate function.
1093*/
1094typedef struct CountCtx CountCtx;
1095struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001096 i64 n;
drh0bce8352002-02-28 00:41:10 +00001097};
drhdd5baa92002-02-27 19:50:59 +00001098
drh0bce8352002-02-28 00:41:10 +00001099/*
1100** Routines to implement the count() aggregate function.
1101*/
danielk19770ae8b832004-05-25 12:05:56 +00001102static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001103 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001104 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001105 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001106 p->n++;
1107 }
1108}
danielk19770ae8b832004-05-25 12:05:56 +00001109static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001110 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001111 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001112 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001113}
1114
1115/*
drh0bce8352002-02-28 00:41:10 +00001116** Routines to implement min() and max() aggregate functions.
1117*/
danielk19770ae8b832004-05-25 12:05:56 +00001118static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +00001119 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001120 Mem *pBest;
1121
1122 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1123 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001124 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001125
danielk197788208052004-05-25 01:13:20 +00001126 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001127 int max;
1128 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001129 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001130 /* This step function is used for both the min() and max() aggregates,
1131 ** the only difference between the two being that the sense of the
1132 ** comparison is inverted. For the max() aggregate, the
1133 ** sqlite3_user_data() function returns (void *)-1. For min() it
1134 ** returns (void *)db, where db is the sqlite3* database pointer.
1135 ** Therefore the next statement sets variable 'max' to 1 for the max()
1136 ** aggregate, or 0 for min().
1137 */
drh309b3382007-03-17 17:52:42 +00001138 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001139 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001140 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001141 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001142 }
drh268380c2004-02-25 13:47:31 +00001143 }else{
drhb21c8cd2007-08-21 19:33:56 +00001144 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001145 }
1146}
danielk19770ae8b832004-05-25 12:05:56 +00001147static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001148 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001149 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1150 if( pRes ){
1151 if( pRes->flags ){
1152 sqlite3_result_value(context, pRes);
1153 }
1154 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001155 }
1156}
drhdd5baa92002-02-27 19:50:59 +00001157
drhb0689692007-11-01 17:38:30 +00001158/*
1159** group_concat(EXPR, ?SEPARATOR?)
1160*/
1161static void groupConcatStep(
1162 sqlite3_context *context,
1163 int argc,
1164 sqlite3_value **argv
1165){
1166 const char *zVal;
drhade86482007-11-28 22:36:40 +00001167 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001168 const char *zSep;
drha2baf3a2008-06-18 15:34:09 +00001169 int nVal, nSep, i;
1170 if( argc==0 || sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001171 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1172
1173 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001174 sqlite3 *db = sqlite3_context_db_handle(context);
drhade86482007-11-28 22:36:40 +00001175 pAccum->useMalloc = 1;
drhbb4957f2008-03-20 14:03:29 +00001176 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drhade86482007-11-28 22:36:40 +00001177 if( pAccum->nChar ){
drha2baf3a2008-06-18 15:34:09 +00001178 if( argc>1 ){
1179 zSep = (char*)sqlite3_value_text(argv[argc-1]);
1180 nSep = sqlite3_value_bytes(argv[argc-1]);
drhb0689692007-11-01 17:38:30 +00001181 }else{
1182 zSep = ",";
drhade86482007-11-28 22:36:40 +00001183 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001184 }
drhade86482007-11-28 22:36:40 +00001185 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001186 }
drha2baf3a2008-06-18 15:34:09 +00001187 i = 0;
1188 do{
1189 zVal = (char*)sqlite3_value_text(argv[i]);
1190 nVal = sqlite3_value_bytes(argv[i]);
1191 sqlite3StrAccumAppend(pAccum, zVal, nVal);
1192 i++;
1193 }while( i<argc-1 );
drhb0689692007-11-01 17:38:30 +00001194 }
1195}
1196static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001197 StrAccum *pAccum;
1198 pAccum = sqlite3_aggregate_context(context, 0);
1199 if( pAccum ){
1200 if( pAccum->tooBig ){
1201 sqlite3_result_error_toobig(context);
1202 }else if( pAccum->mallocFailed ){
1203 sqlite3_result_error_nomem(context);
1204 }else{
1205 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1206 sqlite3_free);
1207 }
drhb0689692007-11-01 17:38:30 +00001208 }
1209}
drh4e5ffc52004-08-31 00:52:37 +00001210
drhd3a149e2002-02-24 17:12:53 +00001211/*
drha2ed5602002-02-26 23:55:31 +00001212** This function registered all of the above C functions as SQL
1213** functions. This should be the only routine in this file with
1214** external linkage.
drhdc04c582002-02-24 01:55:15 +00001215*/
drh9bb575f2004-09-06 17:24:11 +00001216void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh1f01ec12005-02-15 21:36:18 +00001217#ifndef SQLITE_OMIT_ALTERTABLE
1218 sqlite3AlterFunctions(db);
1219#endif
drh198bf392006-01-06 21:52:49 +00001220#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001221 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001222#endif
danielk19771e536952007-08-16 10:09:01 +00001223 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001224 int rc = sqlite3_overload_function(db, "MATCH", 2);
1225 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1226 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001227 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001228 }
1229 }
danielk1977fd9e1f32005-05-22 10:44:34 +00001230#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001231 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001232#endif
drh55ef4d92005-08-14 01:20:37 +00001233}
1234
1235/*
1236** Set the LIKEOPT flag on the 2-argument function with the given name.
1237*/
drhd64fe2f2005-08-28 17:00:23 +00001238static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001239 FuncDef *pDef;
1240 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1241 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001242 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001243 }
1244}
1245
1246/*
1247** Register the built-in LIKE and GLOB functions. The caseSensitive
1248** parameter determines whether or not the LIKE operator is case
1249** sensitive. GLOB is always case sensitive.
1250*/
1251void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1252 struct compareInfo *pInfo;
1253 if( caseSensitive ){
1254 pInfo = (struct compareInfo*)&likeInfoAlt;
1255 }else{
1256 pInfo = (struct compareInfo*)&likeInfoNorm;
1257 }
danielk1977771151b2006-01-17 13:21:40 +00001258 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1259 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1260 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001261 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001262 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1263 setLikeOptFlag(db, "like",
1264 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001265}
1266
1267/*
1268** pExpr points to an expression which implements a function. If
1269** it is appropriate to apply the LIKE optimization to that function
1270** then set aWc[0] through aWc[2] to the wildcard characters and
1271** return TRUE. If the function is not a LIKE-style function then
1272** return FALSE.
1273*/
drhd64fe2f2005-08-28 17:00:23 +00001274int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001275 FuncDef *pDef;
danielk1977cdbd8ef2007-05-12 06:11:12 +00001276 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
drh55ef4d92005-08-14 01:20:37 +00001277 return 0;
1278 }
1279 if( pExpr->pList->nExpr!=2 ){
1280 return 0;
1281 }
drh2646da72005-12-09 20:02:05 +00001282 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001283 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001284 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001285 return 0;
1286 }
1287
1288 /* The memcpy() statement assumes that the wildcard characters are
1289 ** the first three statements in the compareInfo structure. The
1290 ** asserts() that follow verify that assumption
1291 */
1292 memcpy(aWc, pDef->pUserData, 3);
1293 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1294 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1295 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001296 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001297 return 1;
drhdc04c582002-02-24 01:55:15 +00001298}
danielk19778c0a7912008-08-20 14:49:23 +00001299
drh70a8ca32008-08-21 18:49:27 +00001300/*
drh777c5382008-08-21 20:21:34 +00001301** All all of the FuncDef structures in the aBuiltinFunc[] array above
1302** to the global function hash table. This occurs at start-time (as
1303** a consequence of calling sqlite3_initialize()).
1304**
1305** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001306*/
1307void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001308 /*
1309 ** The following array holds FuncDef structures for all of the functions
1310 ** defined in this file.
1311 **
1312 ** The array cannot be constant since changes are made to the
1313 ** FuncDef.pHash elements at start-time. The elements of this array
1314 ** are read-only after initialization is complete.
1315 */
1316 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1317 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1318 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1319 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1320 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1321 FUNCTION(trim, 1, 3, 0, trimFunc ),
1322 FUNCTION(trim, 2, 3, 0, trimFunc ),
1323 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1324 FUNCTION(min, 0, 0, 1, 0 ),
1325 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1326 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1327 FUNCTION(max, 0, 1, 1, 0 ),
1328 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1329 FUNCTION(typeof, 1, 0, 0, typeofFunc ),
1330 FUNCTION(length, 1, 0, 0, lengthFunc ),
1331 FUNCTION(substr, 2, 0, 0, substrFunc ),
1332 FUNCTION(substr, 3, 0, 0, substrFunc ),
1333 FUNCTION(abs, 1, 0, 0, absFunc ),
1334 FUNCTION(round, 1, 0, 0, roundFunc ),
1335 FUNCTION(round, 2, 0, 0, roundFunc ),
1336 FUNCTION(upper, 1, 0, 0, upperFunc ),
1337 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1338 FUNCTION(coalesce, 1, 0, 0, 0 ),
1339 FUNCTION(coalesce, -1, 0, 0, ifnullFunc ),
1340 FUNCTION(coalesce, 0, 0, 0, 0 ),
1341 FUNCTION(hex, 1, 0, 0, hexFunc ),
1342 FUNCTION(ifnull, 2, 0, 1, ifnullFunc ),
1343 FUNCTION(random, -1, 0, 0, randomFunc ),
1344 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1345 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1346 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
1347 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1348 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1349 FUNCTION(changes, 0, 0, 0, changes ),
1350 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1351 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1352 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1353 #ifdef SQLITE_SOUNDEX
1354 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1355 #endif
1356 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1357 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1358 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1359 #endif
1360 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1361 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1362 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
1363 AGGREGATE(count, 0, 0, 0, countStep, countFinalize ),
1364 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
1365 AGGREGATE(group_concat, -1, 0, 0, groupConcatStep, groupConcatFinalize),
1366
1367 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1368 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1369 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1370 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1371 #else
1372 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1373 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1374 #endif
1375 };
1376
drh70a8ca32008-08-21 18:49:27 +00001377 int i;
danielk197793ce7412008-09-01 19:14:02 +00001378 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001379 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001380
drh70a8ca32008-08-21 18:49:27 +00001381 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001382 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001383 }
drh777c5382008-08-21 20:21:34 +00001384 sqlite3RegisterDateTimeFunctions();
drh70a8ca32008-08-21 18:49:27 +00001385}