blob: bb2ba49005100bd144d8bd887c81864349be1f5e [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**
drhe5ae5732008-06-15 02:51:47 +000019** $Id: func.c,v 1.193 2008/06/15 02:51:47 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{
drhbb4957f2008-03-20 14:03:29 +0000191 p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH];
drh64f31512007-10-12 19:11:55 +0000192 }
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*/
drhb1a6c3c2008-03-20 16:30:17 +0000246static void *contextMalloc(sqlite3_context *context, i64 nByte){
drhbb4957f2008-03-20 14:03:29 +0000247 char *z;
248 if( nByte>sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH] ){
249 sqlite3_result_error_toobig(context);
250 z = 0;
251 }else{
drhe5ae5732008-06-15 02:51:47 +0000252 z = sqlite3Malloc(nByte);
drhbb4957f2008-03-20 14:03:29 +0000253 if( !z && nByte>0 ){
254 sqlite3_result_error_nomem(context);
255 }
danielk1977a1644fd2007-08-29 12:31:25 +0000256 }
257 return z;
258}
259
drhdc04c582002-02-24 01:55:15 +0000260/*
261** Implementation of the upper() and lower() SQL functions.
262*/
danielk19770ae8b832004-05-25 12:05:56 +0000263static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000264 char *z1;
265 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000266 int i, n;
drh9c054832004-05-31 18:51:57 +0000267 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000268 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000269 n = sqlite3_value_bytes(argv[0]);
270 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
271 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000272 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000273 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000274 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000275 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000276 for(i=0; z1[i]; i++){
277 z1[i] = toupper(z1[i]);
278 }
279 sqlite3_result_text(context, z1, -1, sqlite3_free);
280 }
drhdc04c582002-02-24 01:55:15 +0000281 }
282}
danielk19770ae8b832004-05-25 12:05:56 +0000283static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000284 char *z1;
285 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000286 int i, n;
drh9c054832004-05-31 18:51:57 +0000287 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000288 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000289 n = sqlite3_value_bytes(argv[0]);
290 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
291 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000292 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000293 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000294 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000295 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000296 for(i=0; z1[i]; i++){
297 z1[i] = tolower(z1[i]);
298 }
299 sqlite3_result_text(context, z1, -1, sqlite3_free);
300 }
drhdc04c582002-02-24 01:55:15 +0000301 }
302}
303
304/*
drhfbc99082002-02-28 03:14:18 +0000305** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000306** All three do the same thing. They return the first non-NULL
307** argument.
drh3212e182002-02-28 00:46:26 +0000308*/
drhf9b596e2004-05-26 16:54:42 +0000309static void ifnullFunc(
310 sqlite3_context *context,
311 int argc,
312 sqlite3_value **argv
313){
drhfbc99082002-02-28 03:14:18 +0000314 int i;
315 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000316 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000317 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000318 break;
319 }
320 }
drh3212e182002-02-28 00:46:26 +0000321}
322
323/*
drhf9ffac92002-03-02 19:00:31 +0000324** Implementation of random(). Return a random integer.
325*/
drhf9b596e2004-05-26 16:54:42 +0000326static void randomFunc(
327 sqlite3_context *context,
328 int argc,
329 sqlite3_value **argv
330){
drh52fc8492006-02-23 21:43:55 +0000331 sqlite_int64 r;
drh2fa18682008-03-19 14:15:34 +0000332 sqlite3_randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000333 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
334 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000335 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000336}
337
338/*
drh137c7282007-01-29 17:58:28 +0000339** Implementation of randomblob(N). Return a random blob
340** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000341*/
drh137c7282007-01-29 17:58:28 +0000342static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000343 sqlite3_context *context,
344 int argc,
345 sqlite3_value **argv
346){
drh137c7282007-01-29 17:58:28 +0000347 int n;
348 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000349 assert( argc==1 );
350 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000351 if( n<1 ){
352 n = 1;
353 }
danielk1977a1644fd2007-08-29 12:31:25 +0000354 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000355 if( p ){
drh2fa18682008-03-19 14:15:34 +0000356 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000357 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000358 }
drh63cf66f2007-01-29 15:50:05 +0000359}
360
361/*
drh6ed41ad2002-04-06 14:10:47 +0000362** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000363** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000364*/
danielk197751ad0ec2004-05-24 12:39:02 +0000365static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000366 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000367 int arg,
368 sqlite3_value **argv
369){
drhfa4a4b92008-03-19 21:45:51 +0000370 sqlite3 *db = sqlite3_context_db_handle(context);
drhf9b596e2004-05-26 16:54:42 +0000371 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000372}
373
rdcf146a772004-02-25 22:51:06 +0000374/*
danielk1977b28af712004-06-21 06:50:26 +0000375** Implementation of the changes() SQL function. The return value is the
376** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000377*/
danielk1977b28af712004-06-21 06:50:26 +0000378static void changes(
drhf9b596e2004-05-26 16:54:42 +0000379 sqlite3_context *context,
380 int arg,
381 sqlite3_value **argv
382){
drhfa4a4b92008-03-19 21:45:51 +0000383 sqlite3 *db = sqlite3_context_db_handle(context);
drhf4479502004-05-27 03:12:53 +0000384 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000385}
rdcf146a772004-02-25 22:51:06 +0000386
387/*
danielk1977b28af712004-06-21 06:50:26 +0000388** Implementation of the total_changes() SQL function. The return value is
389** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000390*/
danielk1977b28af712004-06-21 06:50:26 +0000391static void total_changes(
392 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000393 int arg,
394 sqlite3_value **argv
395){
drhfa4a4b92008-03-19 21:45:51 +0000396 sqlite3 *db = sqlite3_context_db_handle(context);
danielk1977b28af712004-06-21 06:50:26 +0000397 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000398}
399
drh6ed41ad2002-04-06 14:10:47 +0000400/*
drh4e5ffc52004-08-31 00:52:37 +0000401** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000402*/
drh4e5ffc52004-08-31 00:52:37 +0000403struct compareInfo {
404 u8 matchAll;
405 u8 matchOne;
406 u8 matchSet;
407 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000408};
drh55ef4d92005-08-14 01:20:37 +0000409
drhb9175ae2007-12-07 18:39:04 +0000410/*
411** For LIKE and GLOB matching on EBCDIC machines, assume that every
412** character is exactly one byte in size. Also, all characters are
413** able to participate in upper-case-to-lower-case mappings in EBCDIC
414** whereas only characters less than 0x80 do in ASCII.
415*/
416#if defined(SQLITE_EBCDIC)
417# define sqlite3Utf8Read(A,B,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000418# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000419#else
drh6ed4b782007-12-10 18:07:20 +0000420# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000421#endif
422
drh4e5ffc52004-08-31 00:52:37 +0000423static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000424/* The correct SQL-92 behavior is for the LIKE operator to ignore
425** case. Thus 'a' LIKE 'A' would be true. */
426static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
427/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
428** is case sensitive causing 'a' LIKE 'A' to be false */
429static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000430
431/*
drh4e5ffc52004-08-31 00:52:37 +0000432** Compare two UTF-8 strings for equality where the first string can
433** potentially be a "glob" expression. Return true (1) if they
434** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000435**
drh4e5ffc52004-08-31 00:52:37 +0000436** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000437**
drh4e5ffc52004-08-31 00:52:37 +0000438** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000439**
drh4e5ffc52004-08-31 00:52:37 +0000440** '?' Matches exactly one character.
441**
442** [...] Matches one character from the enclosed list of
443** characters.
444**
445** [^...] Matches one character not in the enclosed list.
446**
447** With the [...] and [^...] matching, a ']' character can be included
448** in the list by making it the first character after '[' or '^'. A
449** range of characters can be specified using '-'. Example:
450** "[a-z]" matches any single lower-case letter. To match a '-', make
451** it the last character in the list.
452**
453** This routine is usually quick, but can be N**2 in the worst case.
454**
455** Hints: to match '*' or '?', put them in "[]". Like this:
456**
457** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000458*/
danielk19777c6303c2004-11-17 16:41:29 +0000459static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000460 const u8 *zPattern, /* The glob pattern */
461 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000462 const struct compareInfo *pInfo, /* Information about how to do the compare */
463 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000464){
drh66150952007-07-23 19:12:41 +0000465 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000466 int invert;
467 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000468 u8 matchOne = pInfo->matchOne;
469 u8 matchAll = pInfo->matchAll;
470 u8 matchSet = pInfo->matchSet;
471 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000472 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000473
drh66150952007-07-23 19:12:41 +0000474 while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000475 if( !prevEscape && c==matchAll ){
drh66150952007-07-23 19:12:41 +0000476 while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll
477 || c == matchOne ){
478 if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){
479 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000480 }
danielk1977ad7dd422004-06-06 12:41:49 +0000481 }
drh66150952007-07-23 19:12:41 +0000482 if( c==0 ){
483 return 1;
484 }else if( c==esc ){
485 c = sqlite3Utf8Read(zPattern, 0, &zPattern);
486 if( c==0 ){
487 return 0;
488 }
489 }else if( c==matchSet ){
490 assert( esc==0 ); /* This is GLOB, not LIKE */
491 assert( matchSet<0x80 ); /* '[' is a single-byte character */
492 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000493 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000494 }
495 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000496 }
497 while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){
498 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000499 GlogUpperToLower(c2);
500 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000501 while( c2 != 0 && c2 != c ){
502 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh6ed4b782007-12-10 18:07:20 +0000503 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000504 }
drh66150952007-07-23 19:12:41 +0000505 }else{
506 while( c2 != 0 && c2 != c ){
507 c2 = sqlite3Utf8Read(zString, 0, &zString);
508 }
drh4e5ffc52004-08-31 00:52:37 +0000509 }
drh66150952007-07-23 19:12:41 +0000510 if( c2==0 ) return 0;
511 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
512 }
513 return 0;
514 }else if( !prevEscape && c==matchOne ){
515 if( sqlite3Utf8Read(zString, 0, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000516 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000517 }
drh4e5ffc52004-08-31 00:52:37 +0000518 }else if( c==matchSet ){
519 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000520 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000521 seen = 0;
522 invert = 0;
drh66150952007-07-23 19:12:41 +0000523 c = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000524 if( c==0 ) return 0;
drh66150952007-07-23 19:12:41 +0000525 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
526 if( c2=='^' ){
527 invert = 1;
528 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
529 }
drh4e5ffc52004-08-31 00:52:37 +0000530 if( c2==']' ){
531 if( c==']' ) seen = 1;
drh66150952007-07-23 19:12:41 +0000532 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000533 }
drh66150952007-07-23 19:12:41 +0000534 while( c2 && c2!=']' ){
535 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
536 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000537 if( c>=prior_c && c<=c2 ) seen = 1;
538 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000539 }else{
drh66150952007-07-23 19:12:41 +0000540 if( c==c2 ){
541 seen = 1;
542 }
drh4e5ffc52004-08-31 00:52:37 +0000543 prior_c = c2;
544 }
drh66150952007-07-23 19:12:41 +0000545 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000546 }
drh66150952007-07-23 19:12:41 +0000547 if( c2==0 || (seen ^ invert)==0 ){
548 return 0;
549 }
550 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000551 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000552 }else{
drh66150952007-07-23 19:12:41 +0000553 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000554 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000555 GlogUpperToLower(c);
556 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000557 }
drh66150952007-07-23 19:12:41 +0000558 if( c!=c2 ){
559 return 0;
560 }
danielk19777c6303c2004-11-17 16:41:29 +0000561 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000562 }
danielk197751ad0ec2004-05-24 12:39:02 +0000563 }
drh4e5ffc52004-08-31 00:52:37 +0000564 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000565}
drh4e5ffc52004-08-31 00:52:37 +0000566
drh55ef4d92005-08-14 01:20:37 +0000567/*
568** Count the number of times that the LIKE operator (or GLOB which is
569** just a variation of LIKE) gets called. This is used for testing
570** only.
571*/
572#ifdef SQLITE_TEST
573int sqlite3_like_count = 0;
574#endif
575
danielk19773f6b0872004-06-17 05:36:44 +0000576
577/*
578** Implementation of the like() SQL function. This function implements
579** the build-in LIKE operator. The first argument to the function is the
580** pattern and the second argument is the string. So, the SQL statements:
581**
582** A LIKE B
583**
584** is implemented as like(B,A).
585**
drh55ef4d92005-08-14 01:20:37 +0000586** This same function (with a different compareInfo structure) computes
587** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000588*/
589static void likeFunc(
590 sqlite3_context *context,
591 int argc,
592 sqlite3_value **argv
593){
drhbeb818d2007-05-08 15:34:47 +0000594 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000595 int escape = 0;
drhbb4957f2008-03-20 14:03:29 +0000596 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000597
drh1f0feef2007-05-15 13:27:07 +0000598 zB = sqlite3_value_text(argv[0]);
599 zA = sqlite3_value_text(argv[1]);
600
drhbeb818d2007-05-08 15:34:47 +0000601 /* Limit the length of the LIKE or GLOB pattern to avoid problems
602 ** of deep recursion and N*N behavior in patternCompare().
603 */
drhbb4957f2008-03-20 14:03:29 +0000604 if( sqlite3_value_bytes(argv[0]) >
605 db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000606 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
607 return;
608 }
drh1f0feef2007-05-15 13:27:07 +0000609 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000610
danielk19777c6303c2004-11-17 16:41:29 +0000611 if( argc==3 ){
612 /* The escape character string must consist of a single UTF-8 character.
613 ** Otherwise, return an error.
614 */
615 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000616 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000617 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000618 sqlite3_result_error(context,
619 "ESCAPE expression must be a single character", -1);
620 return;
621 }
drh66150952007-07-23 19:12:41 +0000622 escape = sqlite3Utf8Read(zEsc, 0, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000623 }
danielk19773f6b0872004-06-17 05:36:44 +0000624 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000625 struct compareInfo *pInfo = sqlite3_user_data(context);
626#ifdef SQLITE_TEST
627 sqlite3_like_count++;
628#endif
drhbeb818d2007-05-08 15:34:47 +0000629
danielk1977b56fe1f2007-05-09 08:24:44 +0000630 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000631 }
drh8912d102002-05-26 21:34:58 +0000632}
633
634/*
635** Implementation of the NULLIF(x,y) function. The result is the first
636** argument if the arguments are different. The result is NULL if the
637** arguments are equal to each other.
638*/
drhf9b596e2004-05-26 16:54:42 +0000639static void nullifFunc(
640 sqlite3_context *context,
641 int argc,
642 sqlite3_value **argv
643){
danielk1977dc1bdc42004-06-11 10:51:27 +0000644 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
645 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000646 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000647 }
drh0ac65892002-04-20 14:24:41 +0000648}
649
drh647cb0e2002-11-04 19:32:25 +0000650/*
651** Implementation of the VERSION(*) function. The result is the version
652** of the SQLite library that is running.
653*/
drhf9b596e2004-05-26 16:54:42 +0000654static void versionFunc(
655 sqlite3_context *context,
656 int argc,
657 sqlite3_value **argv
658){
danielk1977d8123362004-06-12 09:25:12 +0000659 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000660}
661
drh137c7282007-01-29 17:58:28 +0000662/* Array for converting from half-bytes (nybbles) into ASCII hex
663** digits. */
664static const char hexdigits[] = {
665 '0', '1', '2', '3', '4', '5', '6', '7',
666 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
667};
danielk1977d641d642004-11-18 15:44:29 +0000668
drh47394702003-08-20 01:03:33 +0000669/*
670** EXPERIMENTAL - This is not an official function. The interface may
671** change. This function may disappear. Do not write code that depends
672** on this function.
673**
674** Implementation of the QUOTE() function. This function takes a single
675** argument. If the argument is numeric, the return value is the same as
676** the argument. If the argument is NULL, the return value is the string
677** "NULL". Otherwise, the argument is enclosed in single quotes with
678** single-quote escapes.
679*/
danielk19770ae8b832004-05-25 12:05:56 +0000680static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000681 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000682 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000683 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000684 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000685 break;
drh47394702003-08-20 01:03:33 +0000686 }
drh9c054832004-05-31 18:51:57 +0000687 case SQLITE_INTEGER:
688 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000689 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000690 break;
691 }
danielk19773f41e972004-06-08 00:39:01 +0000692 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000693 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000694 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000695 int nBlob = sqlite3_value_bytes(argv[0]);
696 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000697 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000698 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000699 int i;
700 for(i=0; i<nBlob; i++){
701 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
702 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
703 }
704 zText[(nBlob*2)+2] = '\'';
705 zText[(nBlob*2)+3] = '\0';
706 zText[0] = 'X';
707 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000708 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000709 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000710 }
711 break;
712 }
drh9c054832004-05-31 18:51:57 +0000713 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000714 int i,j;
715 u64 n;
drh2646da72005-12-09 20:02:05 +0000716 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000717 char *z;
718
drh7a521cf2007-04-25 18:23:52 +0000719 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000720 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000721 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000722 if( z ){
723 z[0] = '\'';
724 for(i=0, j=1; zArg[i]; i++){
725 z[j++] = zArg[i];
726 if( zArg[i]=='\'' ){
727 z[j++] = '\'';
728 }
drhf9b596e2004-05-26 16:54:42 +0000729 }
danielk1977a1644fd2007-08-29 12:31:25 +0000730 z[j++] = '\'';
731 z[j] = 0;
732 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000733 }
drhf9b596e2004-05-26 16:54:42 +0000734 }
drh47394702003-08-20 01:03:33 +0000735 }
736}
737
drh137c7282007-01-29 17:58:28 +0000738/*
739** The hex() function. Interpret the argument as a blob. Return
740** a hexadecimal rendering as text.
741*/
742static void hexFunc(
743 sqlite3_context *context,
744 int argc,
745 sqlite3_value **argv
746){
747 int i, n;
748 const unsigned char *pBlob;
749 char *zHex, *z;
750 assert( argc==1 );
drh1f0feef2007-05-15 13:27:07 +0000751 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000752 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000753 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000754 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000755 if( zHex ){
756 for(i=0; i<n; i++, pBlob++){
757 unsigned char c = *pBlob;
758 *(z++) = hexdigits[(c>>4)&0xf];
759 *(z++) = hexdigits[c&0xf];
760 }
761 *z = 0;
762 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000763 }
drh137c7282007-01-29 17:58:28 +0000764}
765
drh26b6d902007-03-17 13:27:54 +0000766/*
drh8cff3822007-05-02 02:08:28 +0000767** The zeroblob(N) function returns a zero-filled blob of size N bytes.
768*/
769static void zeroblobFunc(
770 sqlite3_context *context,
771 int argc,
772 sqlite3_value **argv
773){
drh98640a32007-06-07 19:08:32 +0000774 i64 n;
drh8cff3822007-05-02 02:08:28 +0000775 assert( argc==1 );
drh98640a32007-06-07 19:08:32 +0000776 n = sqlite3_value_int64(argv[0]);
777 if( n>SQLITE_MAX_LENGTH ){
778 sqlite3_result_error_toobig(context);
779 }else{
780 sqlite3_result_zeroblob(context, n);
781 }
drh8cff3822007-05-02 02:08:28 +0000782}
783
784/*
drh26b6d902007-03-17 13:27:54 +0000785** The replace() function. Three arguments are all strings: call
786** them A, B, and C. The result is also a string which is derived
787** from A by replacing every occurance of B with C. The match
788** must be exact. Collating sequences are not used.
789*/
790static void replaceFunc(
791 sqlite3_context *context,
792 int argc,
793 sqlite3_value **argv
794){
795 const unsigned char *zStr; /* The input string A */
796 const unsigned char *zPattern; /* The pattern string B */
797 const unsigned char *zRep; /* The replacement string C */
798 unsigned char *zOut; /* The output */
799 int nStr; /* Size of zStr */
800 int nPattern; /* Size of zPattern */
801 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000802 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000803 int loopLimit; /* Last zStr[] that might match zPattern[] */
804 int i, j; /* Loop counters */
805
806 assert( argc==3 );
drh26b6d902007-03-17 13:27:54 +0000807 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000808 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000809 nStr = sqlite3_value_bytes(argv[0]);
810 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000811 zPattern = sqlite3_value_text(argv[1]);
drh709cff32007-04-27 01:18:02 +0000812 if( zPattern==0 || zPattern[0]==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000813 nPattern = sqlite3_value_bytes(argv[1]);
814 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000815 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000816 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000817 nRep = sqlite3_value_bytes(argv[2]);
818 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000819 nOut = nStr + 1;
820 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +0000821 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +0000822 if( zOut==0 ){
823 return;
drh26b6d902007-03-17 13:27:54 +0000824 }
drh26b6d902007-03-17 13:27:54 +0000825 loopLimit = nStr - nPattern;
826 for(i=j=0; i<=loopLimit; i++){
827 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
828 zOut[j++] = zStr[i];
829 }else{
drh4a50aac2007-08-23 02:47:53 +0000830 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +0000831 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +0000832 nOut += nRep - nPattern;
drhbb4957f2008-03-20 14:03:29 +0000833 if( nOut>=db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +0000834 sqlite3_result_error_toobig(context);
danielk197717374e82007-05-08 14:39:04 +0000835 sqlite3_free(zOut);
836 return;
837 }
drh4a50aac2007-08-23 02:47:53 +0000838 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000839 zOut = sqlite3_realloc(zOut, (int)nOut);
840 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000841 sqlite3_result_error_nomem(context);
drh4a50aac2007-08-23 02:47:53 +0000842 sqlite3_free(zOld);
drh2e6400b2007-05-08 15:46:18 +0000843 return;
844 }
drh26b6d902007-03-17 13:27:54 +0000845 memcpy(&zOut[j], zRep, nRep);
846 j += nRep;
847 i += nPattern-1;
848 }
849 }
drh2e6400b2007-05-08 15:46:18 +0000850 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000851 memcpy(&zOut[j], &zStr[i], nStr-i);
852 j += nStr - i;
853 assert( j<=nOut );
854 zOut[j] = 0;
855 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
856}
857
drh309b3382007-03-17 17:52:42 +0000858/*
859** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
860** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
861*/
862static void trimFunc(
863 sqlite3_context *context,
864 int argc,
865 sqlite3_value **argv
866){
867 const unsigned char *zIn; /* Input string */
868 const unsigned char *zCharSet; /* Set of characters to trim */
869 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +0000870 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +0000871 int i; /* Loop counter */
872 unsigned char *aLen; /* Length of each character in zCharSet */
danielk1977bc67da42007-12-11 04:23:19 +0000873 unsigned char **azChar; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000874 int nChar; /* Number of characters in zCharSet */
875
drh309b3382007-03-17 17:52:42 +0000876 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
877 return;
878 }
879 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000880 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000881 nIn = sqlite3_value_bytes(argv[0]);
882 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000883 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000884 static const unsigned char lenOne[] = { 1 };
drh8cff3822007-05-02 02:08:28 +0000885 static const unsigned char *azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000886 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000887 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +0000888 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +0000889 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000890 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000891 return;
drhd1e3a612007-04-27 21:59:52 +0000892 }else{
893 const unsigned char *z;
894 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000895 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000896 }
897 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +0000898 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +0000899 if( azChar==0 ){
900 return;
901 }
902 aLen = (unsigned char*)&azChar[nChar];
903 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +0000904 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +0000905 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000906 aLen[nChar] = z - azChar[nChar];
907 }
908 }
drh309b3382007-03-17 17:52:42 +0000909 }
drhd1e3a612007-04-27 21:59:52 +0000910 if( nChar>0 ){
drh7209c692008-04-27 18:40:11 +0000911 flags = (int)sqlite3_user_data(context);
drh309b3382007-03-17 17:52:42 +0000912 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000913 while( nIn>0 ){
914 int len;
915 for(i=0; i<nChar; i++){
916 len = aLen[i];
917 if( memcmp(zIn, azChar[i], len)==0 ) break;
918 }
919 if( i>=nChar ) break;
920 zIn += len;
921 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000922 }
923 }
924 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000925 while( nIn>0 ){
926 int len;
927 for(i=0; i<nChar; i++){
928 len = aLen[i];
929 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
930 }
931 if( i>=nChar ) break;
932 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000933 }
934 }
drhd1e3a612007-04-27 21:59:52 +0000935 if( zCharSet ){
936 sqlite3_free(azChar);
937 }
drh309b3382007-03-17 17:52:42 +0000938 }
939 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
940}
drh26b6d902007-03-17 13:27:54 +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;
drhade86482007-11-28 22:36:40 +00001169 int nVal, nSep;
drhb0689692007-11-01 17:38:30 +00001170 if( 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 ){
drhb0689692007-11-01 17:38:30 +00001178 if( argc==2 ){
drhade86482007-11-28 22:36:40 +00001179 zSep = (char*)sqlite3_value_text(argv[1]);
1180 nSep = sqlite3_value_bytes(argv[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 }
drhade86482007-11-28 22:36:40 +00001187 zVal = (char*)sqlite3_value_text(argv[0]);
1188 nVal = sqlite3_value_bytes(argv[0]);
1189 sqlite3StrAccumAppend(pAccum, zVal, nVal);
drhb0689692007-11-01 17:38:30 +00001190 }
1191}
1192static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001193 StrAccum *pAccum;
1194 pAccum = sqlite3_aggregate_context(context, 0);
1195 if( pAccum ){
1196 if( pAccum->tooBig ){
1197 sqlite3_result_error_toobig(context);
1198 }else if( pAccum->mallocFailed ){
1199 sqlite3_result_error_nomem(context);
1200 }else{
1201 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1202 sqlite3_free);
1203 }
drhb0689692007-11-01 17:38:30 +00001204 }
1205}
drh4e5ffc52004-08-31 00:52:37 +00001206
drhd3a149e2002-02-24 17:12:53 +00001207/*
drha2ed5602002-02-26 23:55:31 +00001208** This function registered all of the above C functions as SQL
1209** functions. This should be the only routine in this file with
1210** external linkage.
drhdc04c582002-02-24 01:55:15 +00001211*/
drh9bb575f2004-09-06 17:24:11 +00001212void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001213 static const struct {
drh0bce8352002-02-28 00:41:10 +00001214 char *zName;
drh268380c2004-02-25 13:47:31 +00001215 signed char nArg;
drhfa4a4b92008-03-19 21:45:51 +00001216 u8 argType; /* 1: 0, 2: 1, 3: 2,... N: N-1. */
danielk1977f4618892004-06-28 13:09:11 +00001217 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001218 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001219 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001220 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001221 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1222 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
drh309b3382007-03-17 17:52:42 +00001223 { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc },
1224 { "max", 0, 1, SQLITE_UTF8, 1, 0 },
danielk1977f4618892004-06-28 13:09:11 +00001225 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1226 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
drh64f31512007-10-12 19:11:55 +00001227 { "substr", 2, 0, SQLITE_UTF8, 0, substrFunc },
danielk1977f4618892004-06-28 13:09:11 +00001228 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
danielk1977f4618892004-06-28 13:09:11 +00001229 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1230 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1231 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1232 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1233 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1234 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1235 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1236 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
drh137c7282007-01-29 17:58:28 +00001237 { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc },
danielk1977f4618892004-06-28 13:09:11 +00001238 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1239 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
drh137c7282007-01-29 17:58:28 +00001240 { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob },
drh94a98362004-09-13 13:13:18 +00001241 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001242 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1243 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
drhfa4a4b92008-03-19 21:45:51 +00001244 { "last_insert_rowid", 0, 0, SQLITE_UTF8, 0, last_insert_rowid },
1245 { "changes", 0, 0, SQLITE_UTF8, 0, changes },
1246 { "total_changes", 0, 0, SQLITE_UTF8, 0, total_changes },
drh26b6d902007-03-17 13:27:54 +00001247 { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc },
drh309b3382007-03-17 17:52:42 +00001248 { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc },
1249 { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc },
1250 { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc },
1251 { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc },
1252 { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc },
1253 { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc },
drh8cff3822007-05-02 02:08:28 +00001254 { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc },
drhd24cc422003-03-27 12:51:24 +00001255#ifdef SQLITE_SOUNDEX
drh309b3382007-03-17 17:52:42 +00001256 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001257#endif
drhfdb83b22006-06-17 14:12:47 +00001258#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhfa4a4b92008-03-19 21:45:51 +00001259 { "load_extension", 1, 0, SQLITE_UTF8, 0, loadExt },
1260 { "load_extension", 2, 0, SQLITE_UTF8, 0, loadExt },
drhfdb83b22006-06-17 14:12:47 +00001261#endif
drh0bce8352002-02-28 00:41:10 +00001262 };
drh57196282004-10-06 15:41:16 +00001263 static const struct {
drh0bce8352002-02-28 00:41:10 +00001264 char *zName;
drh268380c2004-02-25 13:47:31 +00001265 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001266 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001267 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001268 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1269 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001270 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001271 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
drh309b3382007-03-17 17:52:42 +00001272 { "max", 1, 1, 1, minmaxStep, minMaxFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001273 { "sum", 1, 0, 0, sumStep, sumFinalize },
drha97fdd32006-01-12 22:17:50 +00001274 { "total", 1, 0, 0, sumStep, totalFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001275 { "avg", 1, 0, 0, sumStep, avgFinalize },
1276 { "count", 0, 0, 0, countStep, countFinalize },
1277 { "count", 1, 0, 0, countStep, countFinalize },
drhb0689692007-11-01 17:38:30 +00001278 { "group_concat", 1, 0, 0, groupConcatStep, groupConcatFinalize },
1279 { "group_concat", 2, 0, 0, groupConcatStep, groupConcatFinalize },
drh0bce8352002-02-28 00:41:10 +00001280 };
1281 int i;
1282
1283 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001284 void *pArg;
1285 u8 argType = aFuncs[i].argType;
drh7209c692008-04-27 18:40:11 +00001286 pArg = (void*)(int)argType;
danielk1977771151b2006-01-17 13:21:40 +00001287 sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001288 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001289 if( aFuncs[i].needCollSeq ){
1290 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1291 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1292 if( pFunc && aFuncs[i].needCollSeq ){
1293 pFunc->needCollSeq = 1;
1294 }
1295 }
drh0bce8352002-02-28 00:41:10 +00001296 }
drh1f01ec12005-02-15 21:36:18 +00001297#ifndef SQLITE_OMIT_ALTERTABLE
1298 sqlite3AlterFunctions(db);
1299#endif
drh198bf392006-01-06 21:52:49 +00001300#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001301 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001302#endif
drh0bce8352002-02-28 00:41:10 +00001303 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
drh7209c692008-04-27 18:40:11 +00001304 void *pArg = (void*)(int)aAggs[i].argType;
danielk1977771151b2006-01-17 13:21:40 +00001305 sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001306 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001307 if( aAggs[i].needCollSeq ){
1308 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001309 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001310 if( pFunc && aAggs[i].needCollSeq ){
1311 pFunc->needCollSeq = 1;
1312 }
1313 }
drh268380c2004-02-25 13:47:31 +00001314 }
danielk19774adee202004-05-08 08:23:19 +00001315 sqlite3RegisterDateTimeFunctions(db);
danielk19771e536952007-08-16 10:09:01 +00001316 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001317 int rc = sqlite3_overload_function(db, "MATCH", 2);
1318 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1319 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001320 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001321 }
1322 }
danielk1977fd9e1f32005-05-22 10:44:34 +00001323#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001324 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001325#endif
drh55ef4d92005-08-14 01:20:37 +00001326#ifdef SQLITE_CASE_SENSITIVE_LIKE
1327 sqlite3RegisterLikeFunctions(db, 1);
1328#else
1329 sqlite3RegisterLikeFunctions(db, 0);
1330#endif
1331}
1332
1333/*
1334** Set the LIKEOPT flag on the 2-argument function with the given name.
1335*/
drhd64fe2f2005-08-28 17:00:23 +00001336static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001337 FuncDef *pDef;
1338 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1339 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001340 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001341 }
1342}
1343
1344/*
1345** Register the built-in LIKE and GLOB functions. The caseSensitive
1346** parameter determines whether or not the LIKE operator is case
1347** sensitive. GLOB is always case sensitive.
1348*/
1349void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1350 struct compareInfo *pInfo;
1351 if( caseSensitive ){
1352 pInfo = (struct compareInfo*)&likeInfoAlt;
1353 }else{
1354 pInfo = (struct compareInfo*)&likeInfoNorm;
1355 }
danielk1977771151b2006-01-17 13:21:40 +00001356 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1357 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1358 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001359 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001360 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1361 setLikeOptFlag(db, "like",
1362 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001363}
1364
1365/*
1366** pExpr points to an expression which implements a function. If
1367** it is appropriate to apply the LIKE optimization to that function
1368** then set aWc[0] through aWc[2] to the wildcard characters and
1369** return TRUE. If the function is not a LIKE-style function then
1370** return FALSE.
1371*/
drhd64fe2f2005-08-28 17:00:23 +00001372int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001373 FuncDef *pDef;
danielk1977cdbd8ef2007-05-12 06:11:12 +00001374 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
drh55ef4d92005-08-14 01:20:37 +00001375 return 0;
1376 }
1377 if( pExpr->pList->nExpr!=2 ){
1378 return 0;
1379 }
drh2646da72005-12-09 20:02:05 +00001380 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001381 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001382 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001383 return 0;
1384 }
1385
1386 /* The memcpy() statement assumes that the wildcard characters are
1387 ** the first three statements in the compareInfo structure. The
1388 ** asserts() that follow verify that assumption
1389 */
1390 memcpy(aWc, pDef->pUserData, 3);
1391 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1392 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1393 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001394 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001395 return 1;
drhdc04c582002-02-24 01:55:15 +00001396}