blob: f380bcfa3e60aea5d4b8e18f8c2d63f54864cda2 [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**
drhfa4a4b92008-03-19 21:45:51 +000019** $Id: func.c,v 1.189 2008/03/19 21:45:51 drh Exp $
drhdc04c582002-02-24 01:55:15 +000020*/
drhb659e9b2005-01-28 01:29:08 +000021#include "sqliteInt.h"
drhdc04c582002-02-24 01:55:15 +000022#include <ctype.h>
drhd3a149e2002-02-24 17:12:53 +000023#include <stdlib.h>
drh0bce8352002-02-28 00:41:10 +000024#include <assert.h>
danielk197788208052004-05-25 01:13:20 +000025#include "vdbeInt.h"
drh0bce8352002-02-28 00:41:10 +000026
drh66150952007-07-23 19:12:41 +000027
drh55ef4d92005-08-14 01:20:37 +000028/*
29** Return the collating function associated with a function.
30*/
danielk1977dc1bdc42004-06-11 10:51:27 +000031static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
32 return context->pColl;
33}
34
drh0bce8352002-02-28 00:41:10 +000035/*
36** Implementation of the non-aggregate min() and max() functions
37*/
drhf9b596e2004-05-26 16:54:42 +000038static void minmaxFunc(
39 sqlite3_context *context,
40 int argc,
41 sqlite3_value **argv
42){
drh0bce8352002-02-28 00:41:10 +000043 int i;
drh268380c2004-02-25 13:47:31 +000044 int mask; /* 0 for min() or 0xffffffff for max() */
drhf9b596e2004-05-26 16:54:42 +000045 int iBest;
danielk1977dc1bdc42004-06-11 10:51:27 +000046 CollSeq *pColl;
drh0bce8352002-02-28 00:41:10 +000047
drh89425d52002-02-28 03:04:48 +000048 if( argc==0 ) return;
drhc44af712004-09-02 15:53:56 +000049 mask = sqlite3_user_data(context)==0 ? 0 : -1;
danielk1977dc1bdc42004-06-11 10:51:27 +000050 pColl = sqlite3GetFuncCollSeq(context);
51 assert( pColl );
danielk1977c572ef72004-05-27 09:28:41 +000052 assert( mask==-1 || mask==0 );
drhf9b596e2004-05-26 16:54:42 +000053 iBest = 0;
drh9c054832004-05-31 18:51:57 +000054 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhf9b596e2004-05-26 16:54:42 +000055 for(i=1; i<argc; i++){
drh9c054832004-05-31 18:51:57 +000056 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
danielk1977dc1bdc42004-06-11 10:51:27 +000057 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
drhf9b596e2004-05-26 16:54:42 +000058 iBest = i;
drh0bce8352002-02-28 00:41:10 +000059 }
60 }
drhf4479502004-05-27 03:12:53 +000061 sqlite3_result_value(context, argv[iBest]);
drh0bce8352002-02-28 00:41:10 +000062}
drh0bce8352002-02-28 00:41:10 +000063
drh268380c2004-02-25 13:47:31 +000064/*
65** Return the type of the argument.
66*/
drhf9b596e2004-05-26 16:54:42 +000067static void typeofFunc(
68 sqlite3_context *context,
69 int argc,
70 sqlite3_value **argv
71){
danielk197735bb9d02004-05-24 12:55:54 +000072 const char *z = 0;
danielk197735bb9d02004-05-24 12:55:54 +000073 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000074 case SQLITE_NULL: z = "null"; break;
75 case SQLITE_INTEGER: z = "integer"; break;
76 case SQLITE_TEXT: z = "text"; break;
77 case SQLITE_FLOAT: z = "real"; break;
78 case SQLITE_BLOB: z = "blob"; break;
danielk197735bb9d02004-05-24 12:55:54 +000079 }
danielk1977d8123362004-06-12 09:25:12 +000080 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000081}
82
drh5708d2d2005-06-22 10:53:59 +000083
84/*
drh0bce8352002-02-28 00:41:10 +000085** Implementation of the length() function
86*/
drhf9b596e2004-05-26 16:54:42 +000087static void lengthFunc(
88 sqlite3_context *context,
89 int argc,
90 sqlite3_value **argv
91){
drh0bce8352002-02-28 00:41:10 +000092 int len;
93
94 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +000095 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000096 case SQLITE_BLOB:
97 case SQLITE_INTEGER:
98 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +000099 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +0000100 break;
101 }
drh9c054832004-05-31 18:51:57 +0000102 case SQLITE_TEXT: {
drh2646da72005-12-09 20:02:05 +0000103 const unsigned char *z = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000104 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000105 len = 0;
106 while( *z ){
107 len++;
108 SQLITE_SKIP_UTF8(z);
109 }
drhf4479502004-05-27 03:12:53 +0000110 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000111 break;
112 }
113 default: {
114 sqlite3_result_null(context);
115 break;
116 }
117 }
drh0bce8352002-02-28 00:41:10 +0000118}
119
120/*
121** Implementation of the abs() function
122*/
danielk19770ae8b832004-05-25 12:05:56 +0000123static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000124 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +0000125 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000126 case SQLITE_INTEGER: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000127 i64 iVal = sqlite3_value_int64(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000128 if( iVal<0 ){
129 if( (iVal<<1)==0 ){
130 sqlite3_result_error(context, "integer overflow", -1);
131 return;
132 }
133 iVal = -iVal;
134 }
danielk1977f93bbbe2004-05-27 10:30:52 +0000135 sqlite3_result_int64(context, iVal);
drhf9b596e2004-05-26 16:54:42 +0000136 break;
137 }
drh9c054832004-05-31 18:51:57 +0000138 case SQLITE_NULL: {
drhf9b596e2004-05-26 16:54:42 +0000139 sqlite3_result_null(context);
140 break;
141 }
142 default: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000143 double rVal = sqlite3_value_double(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000144 if( rVal<0 ) rVal = -rVal;
danielk1977f93bbbe2004-05-27 10:30:52 +0000145 sqlite3_result_double(context, rVal);
drhf9b596e2004-05-26 16:54:42 +0000146 break;
147 }
148 }
drh0bce8352002-02-28 00:41:10 +0000149}
150
151/*
drhf764e6f2007-05-15 01:13:47 +0000152** Implementation of the substr() function.
153**
154** substr(x,p1,p2) returns p2 characters of x[] beginning with p1.
155** p1 is 1-indexed. So substr(x,1,1) returns the first character
156** of x. If x is text, then we actually count UTF-8 characters.
157** If x is a blob, then we count bytes.
158**
159** If p1 is negative, then we begin abs(p1) from the end of x[].
drh0bce8352002-02-28 00:41:10 +0000160*/
drhf9b596e2004-05-26 16:54:42 +0000161static void substrFunc(
162 sqlite3_context *context,
163 int argc,
164 sqlite3_value **argv
165){
drh2646da72005-12-09 20:02:05 +0000166 const unsigned char *z;
167 const unsigned char *z2;
drh023ae032007-05-08 12:12:16 +0000168 int len;
drhf764e6f2007-05-15 01:13:47 +0000169 int p0type;
drh023ae032007-05-08 12:12:16 +0000170 i64 p1, p2;
drhf9b596e2004-05-26 16:54:42 +0000171
drh64f31512007-10-12 19:11:55 +0000172 assert( argc==3 || argc==2 );
drhf764e6f2007-05-15 01:13:47 +0000173 p0type = sqlite3_value_type(argv[0]);
174 if( p0type==SQLITE_BLOB ){
175 len = sqlite3_value_bytes(argv[0]);
176 z = sqlite3_value_blob(argv[0]);
177 if( z==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000178 assert( len==sqlite3_value_bytes(argv[0]) );
drhf764e6f2007-05-15 01:13:47 +0000179 }else{
180 z = sqlite3_value_text(argv[0]);
181 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000182 len = 0;
183 for(z2=z; *z2; len++){
184 SQLITE_SKIP_UTF8(z2);
185 }
drhf764e6f2007-05-15 01:13:47 +0000186 }
danielk197751ad0ec2004-05-24 12:39:02 +0000187 p1 = sqlite3_value_int(argv[1]);
drh64f31512007-10-12 19:11:55 +0000188 if( argc==3 ){
189 p2 = sqlite3_value_int(argv[2]);
190 }else{
191 p2 = SQLITE_MAX_LENGTH;
192 }
drh0bce8352002-02-28 00:41:10 +0000193 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000194 p1 += len;
drh653bc752002-02-28 03:31:10 +0000195 if( p1<0 ){
196 p2 += p1;
197 p1 = 0;
198 }
drh0bce8352002-02-28 00:41:10 +0000199 }else if( p1>0 ){
200 p1--;
201 }
202 if( p1+p2>len ){
203 p2 = len-p1;
204 }
drhf764e6f2007-05-15 01:13:47 +0000205 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000206 while( *z && p1 ){
207 SQLITE_SKIP_UTF8(z);
208 p1--;
drhf764e6f2007-05-15 01:13:47 +0000209 }
drh4a919112007-05-15 11:55:09 +0000210 for(z2=z; *z2 && p2; p2--){
211 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000212 }
drh4a919112007-05-15 11:55:09 +0000213 sqlite3_result_text(context, (char*)z, z2-z, SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000214 }else{
215 if( p2<0 ) p2 = 0;
216 sqlite3_result_blob(context, (char*)&z[p1], p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000217 }
drh0bce8352002-02-28 00:41:10 +0000218}
219
220/*
221** Implementation of the round() function
222*/
danielk19770ae8b832004-05-25 12:05:56 +0000223static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000224 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000225 double r;
drh592ac8c2005-08-13 03:07:47 +0000226 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000227 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000228 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000229 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000230 n = sqlite3_value_int(argv[1]);
231 if( n>30 ) n = 30;
232 if( n<0 ) n = 0;
233 }
drhd589a922006-03-02 03:02:48 +0000234 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000235 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000236 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000237 sqlite3AtoF(zBuf, &r);
238 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000239}
drhdc04c582002-02-24 01:55:15 +0000240
danielk197726783a52007-08-29 14:06:22 +0000241/*
242** Allocate nByte bytes of space using sqlite3_malloc(). If the
243** allocation fails, call sqlite3_result_error_nomem() to notify
244** the database handle that malloc() has failed.
245*/
danielk1977a1644fd2007-08-29 12:31:25 +0000246static void *contextMalloc(sqlite3_context *context, int nByte){
247 char *z = sqlite3_malloc(nByte);
248 if( !z && nByte>0 ){
249 sqlite3_result_error_nomem(context);
250 }
251 return z;
252}
253
drhdc04c582002-02-24 01:55:15 +0000254/*
255** Implementation of the upper() and lower() SQL functions.
256*/
danielk19770ae8b832004-05-25 12:05:56 +0000257static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000258 char *z1;
259 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000260 int i, n;
drh9c054832004-05-31 18:51:57 +0000261 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000262 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000263 n = sqlite3_value_bytes(argv[0]);
264 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
265 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000266 if( z2 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000267 z1 = contextMalloc(context, n+1);
drh7a521cf2007-04-25 18:23:52 +0000268 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000269 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000270 for(i=0; z1[i]; i++){
271 z1[i] = toupper(z1[i]);
272 }
273 sqlite3_result_text(context, z1, -1, sqlite3_free);
274 }
drhdc04c582002-02-24 01:55:15 +0000275 }
276}
danielk19770ae8b832004-05-25 12:05:56 +0000277static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000278 char *z1;
279 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000280 int i, n;
drh9c054832004-05-31 18:51:57 +0000281 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000282 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000283 n = sqlite3_value_bytes(argv[0]);
284 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
285 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000286 if( z2 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000287 z1 = contextMalloc(context, n+1);
drh7a521cf2007-04-25 18:23:52 +0000288 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000289 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000290 for(i=0; z1[i]; i++){
291 z1[i] = tolower(z1[i]);
292 }
293 sqlite3_result_text(context, z1, -1, sqlite3_free);
294 }
drhdc04c582002-02-24 01:55:15 +0000295 }
296}
297
298/*
drhfbc99082002-02-28 03:14:18 +0000299** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000300** All three do the same thing. They return the first non-NULL
301** argument.
drh3212e182002-02-28 00:46:26 +0000302*/
drhf9b596e2004-05-26 16:54:42 +0000303static void ifnullFunc(
304 sqlite3_context *context,
305 int argc,
306 sqlite3_value **argv
307){
drhfbc99082002-02-28 03:14:18 +0000308 int i;
309 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000310 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000311 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000312 break;
313 }
314 }
drh3212e182002-02-28 00:46:26 +0000315}
316
317/*
drhf9ffac92002-03-02 19:00:31 +0000318** Implementation of random(). Return a random integer.
319*/
drhf9b596e2004-05-26 16:54:42 +0000320static void randomFunc(
321 sqlite3_context *context,
322 int argc,
323 sqlite3_value **argv
324){
drh52fc8492006-02-23 21:43:55 +0000325 sqlite_int64 r;
drh2fa18682008-03-19 14:15:34 +0000326 sqlite3_randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000327 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
328 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000329 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000330}
331
332/*
drh137c7282007-01-29 17:58:28 +0000333** Implementation of randomblob(N). Return a random blob
334** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000335*/
drh137c7282007-01-29 17:58:28 +0000336static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000337 sqlite3_context *context,
338 int argc,
339 sqlite3_value **argv
340){
drh137c7282007-01-29 17:58:28 +0000341 int n;
342 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000343 assert( argc==1 );
344 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000345 if( n<1 ){
346 n = 1;
347 }
348 if( n>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000349 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000350 return;
351 }
danielk1977a1644fd2007-08-29 12:31:25 +0000352 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000353 if( p ){
drh2fa18682008-03-19 14:15:34 +0000354 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000355 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000356 }
drh63cf66f2007-01-29 15:50:05 +0000357}
358
359/*
drh6ed41ad2002-04-06 14:10:47 +0000360** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000361** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000362*/
danielk197751ad0ec2004-05-24 12:39:02 +0000363static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000364 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000365 int arg,
366 sqlite3_value **argv
367){
drhfa4a4b92008-03-19 21:45:51 +0000368 sqlite3 *db = sqlite3_context_db_handle(context);
drhf9b596e2004-05-26 16:54:42 +0000369 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000370}
371
rdcf146a772004-02-25 22:51:06 +0000372/*
danielk1977b28af712004-06-21 06:50:26 +0000373** Implementation of the changes() SQL function. The return value is the
374** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000375*/
danielk1977b28af712004-06-21 06:50:26 +0000376static void changes(
drhf9b596e2004-05-26 16:54:42 +0000377 sqlite3_context *context,
378 int arg,
379 sqlite3_value **argv
380){
drhfa4a4b92008-03-19 21:45:51 +0000381 sqlite3 *db = sqlite3_context_db_handle(context);
drhf4479502004-05-27 03:12:53 +0000382 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000383}
rdcf146a772004-02-25 22:51:06 +0000384
385/*
danielk1977b28af712004-06-21 06:50:26 +0000386** Implementation of the total_changes() SQL function. The return value is
387** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000388*/
danielk1977b28af712004-06-21 06:50:26 +0000389static void total_changes(
390 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000391 int arg,
392 sqlite3_value **argv
393){
drhfa4a4b92008-03-19 21:45:51 +0000394 sqlite3 *db = sqlite3_context_db_handle(context);
danielk1977b28af712004-06-21 06:50:26 +0000395 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000396}
397
drh6ed41ad2002-04-06 14:10:47 +0000398/*
drh4e5ffc52004-08-31 00:52:37 +0000399** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000400*/
drh4e5ffc52004-08-31 00:52:37 +0000401struct compareInfo {
402 u8 matchAll;
403 u8 matchOne;
404 u8 matchSet;
405 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000406};
drh55ef4d92005-08-14 01:20:37 +0000407
drhb9175ae2007-12-07 18:39:04 +0000408/*
409** For LIKE and GLOB matching on EBCDIC machines, assume that every
410** character is exactly one byte in size. Also, all characters are
411** able to participate in upper-case-to-lower-case mappings in EBCDIC
412** whereas only characters less than 0x80 do in ASCII.
413*/
414#if defined(SQLITE_EBCDIC)
415# define sqlite3Utf8Read(A,B,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000416# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000417#else
drh6ed4b782007-12-10 18:07:20 +0000418# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000419#endif
420
drh4e5ffc52004-08-31 00:52:37 +0000421static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000422/* The correct SQL-92 behavior is for the LIKE operator to ignore
423** case. Thus 'a' LIKE 'A' would be true. */
424static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
425/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
426** is case sensitive causing 'a' LIKE 'A' to be false */
427static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000428
429/*
drh4e5ffc52004-08-31 00:52:37 +0000430** Compare two UTF-8 strings for equality where the first string can
431** potentially be a "glob" expression. Return true (1) if they
432** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000433**
drh4e5ffc52004-08-31 00:52:37 +0000434** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000435**
drh4e5ffc52004-08-31 00:52:37 +0000436** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000437**
drh4e5ffc52004-08-31 00:52:37 +0000438** '?' Matches exactly one character.
439**
440** [...] Matches one character from the enclosed list of
441** characters.
442**
443** [^...] Matches one character not in the enclosed list.
444**
445** With the [...] and [^...] matching, a ']' character can be included
446** in the list by making it the first character after '[' or '^'. A
447** range of characters can be specified using '-'. Example:
448** "[a-z]" matches any single lower-case letter. To match a '-', make
449** it the last character in the list.
450**
451** This routine is usually quick, but can be N**2 in the worst case.
452**
453** Hints: to match '*' or '?', put them in "[]". Like this:
454**
455** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000456*/
danielk19777c6303c2004-11-17 16:41:29 +0000457static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000458 const u8 *zPattern, /* The glob pattern */
459 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000460 const struct compareInfo *pInfo, /* Information about how to do the compare */
461 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000462){
drh66150952007-07-23 19:12:41 +0000463 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000464 int invert;
465 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000466 u8 matchOne = pInfo->matchOne;
467 u8 matchAll = pInfo->matchAll;
468 u8 matchSet = pInfo->matchSet;
469 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000470 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000471
drh66150952007-07-23 19:12:41 +0000472 while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000473 if( !prevEscape && c==matchAll ){
drh66150952007-07-23 19:12:41 +0000474 while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll
475 || c == matchOne ){
476 if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){
477 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000478 }
danielk1977ad7dd422004-06-06 12:41:49 +0000479 }
drh66150952007-07-23 19:12:41 +0000480 if( c==0 ){
481 return 1;
482 }else if( c==esc ){
483 c = sqlite3Utf8Read(zPattern, 0, &zPattern);
484 if( c==0 ){
485 return 0;
486 }
487 }else if( c==matchSet ){
488 assert( esc==0 ); /* This is GLOB, not LIKE */
489 assert( matchSet<0x80 ); /* '[' is a single-byte character */
490 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000491 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000492 }
493 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000494 }
495 while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){
496 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000497 GlogUpperToLower(c2);
498 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000499 while( c2 != 0 && c2 != c ){
500 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh6ed4b782007-12-10 18:07:20 +0000501 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000502 }
drh66150952007-07-23 19:12:41 +0000503 }else{
504 while( c2 != 0 && c2 != c ){
505 c2 = sqlite3Utf8Read(zString, 0, &zString);
506 }
drh4e5ffc52004-08-31 00:52:37 +0000507 }
drh66150952007-07-23 19:12:41 +0000508 if( c2==0 ) return 0;
509 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
510 }
511 return 0;
512 }else if( !prevEscape && c==matchOne ){
513 if( sqlite3Utf8Read(zString, 0, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000514 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000515 }
drh4e5ffc52004-08-31 00:52:37 +0000516 }else if( c==matchSet ){
517 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000518 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000519 seen = 0;
520 invert = 0;
drh66150952007-07-23 19:12:41 +0000521 c = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000522 if( c==0 ) return 0;
drh66150952007-07-23 19:12:41 +0000523 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
524 if( c2=='^' ){
525 invert = 1;
526 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
527 }
drh4e5ffc52004-08-31 00:52:37 +0000528 if( c2==']' ){
529 if( c==']' ) seen = 1;
drh66150952007-07-23 19:12:41 +0000530 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000531 }
drh66150952007-07-23 19:12:41 +0000532 while( c2 && c2!=']' ){
533 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
534 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000535 if( c>=prior_c && c<=c2 ) seen = 1;
536 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000537 }else{
drh66150952007-07-23 19:12:41 +0000538 if( c==c2 ){
539 seen = 1;
540 }
drh4e5ffc52004-08-31 00:52:37 +0000541 prior_c = c2;
542 }
drh66150952007-07-23 19:12:41 +0000543 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000544 }
drh66150952007-07-23 19:12:41 +0000545 if( c2==0 || (seen ^ invert)==0 ){
546 return 0;
547 }
548 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000549 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000550 }else{
drh66150952007-07-23 19:12:41 +0000551 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000552 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000553 GlogUpperToLower(c);
554 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000555 }
drh66150952007-07-23 19:12:41 +0000556 if( c!=c2 ){
557 return 0;
558 }
danielk19777c6303c2004-11-17 16:41:29 +0000559 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000560 }
danielk197751ad0ec2004-05-24 12:39:02 +0000561 }
drh4e5ffc52004-08-31 00:52:37 +0000562 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000563}
drh4e5ffc52004-08-31 00:52:37 +0000564
drh55ef4d92005-08-14 01:20:37 +0000565/*
566** Count the number of times that the LIKE operator (or GLOB which is
567** just a variation of LIKE) gets called. This is used for testing
568** only.
569*/
570#ifdef SQLITE_TEST
571int sqlite3_like_count = 0;
572#endif
573
danielk19773f6b0872004-06-17 05:36:44 +0000574
575/*
576** Implementation of the like() SQL function. This function implements
577** the build-in LIKE operator. The first argument to the function is the
578** pattern and the second argument is the string. So, the SQL statements:
579**
580** A LIKE B
581**
582** is implemented as like(B,A).
583**
drh55ef4d92005-08-14 01:20:37 +0000584** This same function (with a different compareInfo structure) computes
585** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000586*/
587static void likeFunc(
588 sqlite3_context *context,
589 int argc,
590 sqlite3_value **argv
591){
drhbeb818d2007-05-08 15:34:47 +0000592 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000593 int escape = 0;
drhbeb818d2007-05-08 15:34:47 +0000594
drh1f0feef2007-05-15 13:27:07 +0000595 zB = sqlite3_value_text(argv[0]);
596 zA = sqlite3_value_text(argv[1]);
597
drhbeb818d2007-05-08 15:34:47 +0000598 /* Limit the length of the LIKE or GLOB pattern to avoid problems
599 ** of deep recursion and N*N behavior in patternCompare().
600 */
danielk1977b56fe1f2007-05-09 08:24:44 +0000601 if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){
drhbeb818d2007-05-08 15:34:47 +0000602 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
603 return;
604 }
drh1f0feef2007-05-15 13:27:07 +0000605 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000606
danielk19777c6303c2004-11-17 16:41:29 +0000607 if( argc==3 ){
608 /* The escape character string must consist of a single UTF-8 character.
609 ** Otherwise, return an error.
610 */
611 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000612 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000613 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000614 sqlite3_result_error(context,
615 "ESCAPE expression must be a single character", -1);
616 return;
617 }
drh66150952007-07-23 19:12:41 +0000618 escape = sqlite3Utf8Read(zEsc, 0, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000619 }
danielk19773f6b0872004-06-17 05:36:44 +0000620 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000621 struct compareInfo *pInfo = sqlite3_user_data(context);
622#ifdef SQLITE_TEST
623 sqlite3_like_count++;
624#endif
drhbeb818d2007-05-08 15:34:47 +0000625
danielk1977b56fe1f2007-05-09 08:24:44 +0000626 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000627 }
drh8912d102002-05-26 21:34:58 +0000628}
629
630/*
631** Implementation of the NULLIF(x,y) function. The result is the first
632** argument if the arguments are different. The result is NULL if the
633** arguments are equal to each other.
634*/
drhf9b596e2004-05-26 16:54:42 +0000635static void nullifFunc(
636 sqlite3_context *context,
637 int argc,
638 sqlite3_value **argv
639){
danielk1977dc1bdc42004-06-11 10:51:27 +0000640 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
641 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000642 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000643 }
drh0ac65892002-04-20 14:24:41 +0000644}
645
drh647cb0e2002-11-04 19:32:25 +0000646/*
647** Implementation of the VERSION(*) function. The result is the version
648** of the SQLite library that is running.
649*/
drhf9b596e2004-05-26 16:54:42 +0000650static void versionFunc(
651 sqlite3_context *context,
652 int argc,
653 sqlite3_value **argv
654){
danielk1977d8123362004-06-12 09:25:12 +0000655 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000656}
657
drh137c7282007-01-29 17:58:28 +0000658/* Array for converting from half-bytes (nybbles) into ASCII hex
659** digits. */
660static const char hexdigits[] = {
661 '0', '1', '2', '3', '4', '5', '6', '7',
662 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
663};
danielk1977d641d642004-11-18 15:44:29 +0000664
drh47394702003-08-20 01:03:33 +0000665/*
666** EXPERIMENTAL - This is not an official function. The interface may
667** change. This function may disappear. Do not write code that depends
668** on this function.
669**
670** Implementation of the QUOTE() function. This function takes a single
671** argument. If the argument is numeric, the return value is the same as
672** the argument. If the argument is NULL, the return value is the string
673** "NULL". Otherwise, the argument is enclosed in single quotes with
674** single-quote escapes.
675*/
danielk19770ae8b832004-05-25 12:05:56 +0000676static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000677 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000678 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000679 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000680 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000681 break;
drh47394702003-08-20 01:03:33 +0000682 }
drh9c054832004-05-31 18:51:57 +0000683 case SQLITE_INTEGER:
684 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000685 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000686 break;
687 }
danielk19773f41e972004-06-08 00:39:01 +0000688 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000689 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000690 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000691 int nBlob = sqlite3_value_bytes(argv[0]);
692 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
danielk19773f41e972004-06-08 00:39:01 +0000693
drh023ae032007-05-08 12:12:16 +0000694 if( 2*nBlob+4>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000695 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000696 return;
697 }
danielk1977a1644fd2007-08-29 12:31:25 +0000698 zText = (char *)contextMalloc(context, (2*nBlob)+4);
699 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000700 int i;
701 for(i=0; i<nBlob; i++){
702 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
703 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
704 }
705 zText[(nBlob*2)+2] = '\'';
706 zText[(nBlob*2)+3] = '\0';
707 zText[0] = 'X';
708 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000709 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000710 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000711 }
712 break;
713 }
drh9c054832004-05-31 18:51:57 +0000714 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000715 int i,j;
716 u64 n;
drh2646da72005-12-09 20:02:05 +0000717 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000718 char *z;
719
drh7a521cf2007-04-25 18:23:52 +0000720 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000721 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
722 if( i+n+3>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000723 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000724 return;
725 }
danielk1977a1644fd2007-08-29 12:31:25 +0000726 z = contextMalloc(context, i+n+3);
727 if( z ){
728 z[0] = '\'';
729 for(i=0, j=1; zArg[i]; i++){
730 z[j++] = zArg[i];
731 if( zArg[i]=='\'' ){
732 z[j++] = '\'';
733 }
drhf9b596e2004-05-26 16:54:42 +0000734 }
danielk1977a1644fd2007-08-29 12:31:25 +0000735 z[j++] = '\'';
736 z[j] = 0;
737 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000738 }
drhf9b596e2004-05-26 16:54:42 +0000739 }
drh47394702003-08-20 01:03:33 +0000740 }
741}
742
drh137c7282007-01-29 17:58:28 +0000743/*
744** The hex() function. Interpret the argument as a blob. Return
745** a hexadecimal rendering as text.
746*/
747static void hexFunc(
748 sqlite3_context *context,
749 int argc,
750 sqlite3_value **argv
751){
752 int i, n;
753 const unsigned char *pBlob;
754 char *zHex, *z;
755 assert( argc==1 );
drh1f0feef2007-05-15 13:27:07 +0000756 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000757 n = sqlite3_value_bytes(argv[0]);
drh023ae032007-05-08 12:12:16 +0000758 if( n*2+1>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000759 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000760 return;
761 }
drh1f0feef2007-05-15 13:27:07 +0000762 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
danielk1977a1644fd2007-08-29 12:31:25 +0000763 z = zHex = contextMalloc(context, n*2 + 1);
764 if( zHex ){
765 for(i=0; i<n; i++, pBlob++){
766 unsigned char c = *pBlob;
767 *(z++) = hexdigits[(c>>4)&0xf];
768 *(z++) = hexdigits[c&0xf];
769 }
770 *z = 0;
771 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000772 }
drh137c7282007-01-29 17:58:28 +0000773}
774
drh26b6d902007-03-17 13:27:54 +0000775/*
drh8cff3822007-05-02 02:08:28 +0000776** The zeroblob(N) function returns a zero-filled blob of size N bytes.
777*/
778static void zeroblobFunc(
779 sqlite3_context *context,
780 int argc,
781 sqlite3_value **argv
782){
drh98640a32007-06-07 19:08:32 +0000783 i64 n;
drh8cff3822007-05-02 02:08:28 +0000784 assert( argc==1 );
drh98640a32007-06-07 19:08:32 +0000785 n = sqlite3_value_int64(argv[0]);
786 if( n>SQLITE_MAX_LENGTH ){
787 sqlite3_result_error_toobig(context);
788 }else{
789 sqlite3_result_zeroblob(context, n);
790 }
drh8cff3822007-05-02 02:08:28 +0000791}
792
793/*
drh26b6d902007-03-17 13:27:54 +0000794** The replace() function. Three arguments are all strings: call
795** them A, B, and C. The result is also a string which is derived
796** from A by replacing every occurance of B with C. The match
797** must be exact. Collating sequences are not used.
798*/
799static void replaceFunc(
800 sqlite3_context *context,
801 int argc,
802 sqlite3_value **argv
803){
804 const unsigned char *zStr; /* The input string A */
805 const unsigned char *zPattern; /* The pattern string B */
806 const unsigned char *zRep; /* The replacement string C */
807 unsigned char *zOut; /* The output */
808 int nStr; /* Size of zStr */
809 int nPattern; /* Size of zPattern */
810 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000811 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000812 int loopLimit; /* Last zStr[] that might match zPattern[] */
813 int i, j; /* Loop counters */
814
815 assert( argc==3 );
drh26b6d902007-03-17 13:27:54 +0000816 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000817 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000818 nStr = sqlite3_value_bytes(argv[0]);
819 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000820 zPattern = sqlite3_value_text(argv[1]);
drh709cff32007-04-27 01:18:02 +0000821 if( zPattern==0 || zPattern[0]==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000822 nPattern = sqlite3_value_bytes(argv[1]);
823 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000824 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000825 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000826 nRep = sqlite3_value_bytes(argv[2]);
827 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000828 nOut = nStr + 1;
829 assert( nOut<SQLITE_MAX_LENGTH );
danielk1977a1644fd2007-08-29 12:31:25 +0000830 zOut = contextMalloc(context, (int)nOut);
drh2e6400b2007-05-08 15:46:18 +0000831 if( zOut==0 ){
832 return;
drh26b6d902007-03-17 13:27:54 +0000833 }
drh26b6d902007-03-17 13:27:54 +0000834 loopLimit = nStr - nPattern;
835 for(i=j=0; i<=loopLimit; i++){
836 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
837 zOut[j++] = zStr[i];
838 }else{
drh4a50aac2007-08-23 02:47:53 +0000839 u8 *zOld;
drh2e6400b2007-05-08 15:46:18 +0000840 nOut += nRep - nPattern;
841 if( nOut>=SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000842 sqlite3_result_error_toobig(context);
danielk197717374e82007-05-08 14:39:04 +0000843 sqlite3_free(zOut);
844 return;
845 }
drh4a50aac2007-08-23 02:47:53 +0000846 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000847 zOut = sqlite3_realloc(zOut, (int)nOut);
848 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000849 sqlite3_result_error_nomem(context);
drh4a50aac2007-08-23 02:47:53 +0000850 sqlite3_free(zOld);
drh2e6400b2007-05-08 15:46:18 +0000851 return;
852 }
drh26b6d902007-03-17 13:27:54 +0000853 memcpy(&zOut[j], zRep, nRep);
854 j += nRep;
855 i += nPattern-1;
856 }
857 }
drh2e6400b2007-05-08 15:46:18 +0000858 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000859 memcpy(&zOut[j], &zStr[i], nStr-i);
860 j += nStr - i;
861 assert( j<=nOut );
862 zOut[j] = 0;
863 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
864}
865
drh309b3382007-03-17 17:52:42 +0000866/*
867** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
868** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
869*/
870static void trimFunc(
871 sqlite3_context *context,
872 int argc,
873 sqlite3_value **argv
874){
875 const unsigned char *zIn; /* Input string */
876 const unsigned char *zCharSet; /* Set of characters to trim */
877 int nIn; /* Number of bytes in input */
mlcreecha9e852b2008-03-06 09:58:50 +0000878 sqlite3_intptr_t flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +0000879 int i; /* Loop counter */
880 unsigned char *aLen; /* Length of each character in zCharSet */
danielk1977bc67da42007-12-11 04:23:19 +0000881 unsigned char **azChar; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000882 int nChar; /* Number of characters in zCharSet */
883
drh309b3382007-03-17 17:52:42 +0000884 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
885 return;
886 }
887 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000888 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000889 nIn = sqlite3_value_bytes(argv[0]);
890 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000891 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000892 static const unsigned char lenOne[] = { 1 };
drh8cff3822007-05-02 02:08:28 +0000893 static const unsigned char *azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000894 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000895 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +0000896 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +0000897 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000898 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000899 return;
drhd1e3a612007-04-27 21:59:52 +0000900 }else{
901 const unsigned char *z;
902 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000903 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000904 }
905 if( nChar>0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000906 azChar = contextMalloc(context, nChar*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +0000907 if( azChar==0 ){
908 return;
909 }
910 aLen = (unsigned char*)&azChar[nChar];
911 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +0000912 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +0000913 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000914 aLen[nChar] = z - azChar[nChar];
915 }
916 }
drh309b3382007-03-17 17:52:42 +0000917 }
drhd1e3a612007-04-27 21:59:52 +0000918 if( nChar>0 ){
mlcreecha9e852b2008-03-06 09:58:50 +0000919 flags = (sqlite3_intptr_t)sqlite3_user_data(context);
drh309b3382007-03-17 17:52:42 +0000920 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000921 while( nIn>0 ){
922 int len;
923 for(i=0; i<nChar; i++){
924 len = aLen[i];
925 if( memcmp(zIn, azChar[i], len)==0 ) break;
926 }
927 if( i>=nChar ) break;
928 zIn += len;
929 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000930 }
931 }
932 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000933 while( nIn>0 ){
934 int len;
935 for(i=0; i<nChar; i++){
936 len = aLen[i];
937 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
938 }
939 if( i>=nChar ) break;
940 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000941 }
942 }
drhd1e3a612007-04-27 21:59:52 +0000943 if( zCharSet ){
944 sqlite3_free(azChar);
945 }
drh309b3382007-03-17 17:52:42 +0000946 }
947 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
948}
drh26b6d902007-03-17 13:27:54 +0000949
drhd24cc422003-03-27 12:51:24 +0000950#ifdef SQLITE_SOUNDEX
951/*
952** Compute the soundex encoding of a word.
953*/
drh137c7282007-01-29 17:58:28 +0000954static void soundexFunc(
955 sqlite3_context *context,
956 int argc,
957 sqlite3_value **argv
958){
drhd24cc422003-03-27 12:51:24 +0000959 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000960 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000961 int i, j;
962 static const unsigned char iCode[] = {
963 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
964 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
965 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
966 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
967 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
968 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
969 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
970 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
971 };
972 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000973 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000974 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000975 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
976 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000977 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000978 zResult[0] = toupper(zIn[i]);
979 for(j=1; j<4 && zIn[i]; i++){
980 int code = iCode[zIn[i]&0x7f];
981 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000982 if( code!=prevcode ){
983 prevcode = code;
984 zResult[j++] = code + '0';
985 }
986 }else{
987 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000988 }
989 }
990 while( j<4 ){
991 zResult[j++] = '0';
992 }
993 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000994 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000995 }else{
danielk1977d8123362004-06-12 09:25:12 +0000996 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000997 }
998}
999#endif
1000
drhfdb83b22006-06-17 14:12:47 +00001001#ifndef SQLITE_OMIT_LOAD_EXTENSION
1002/*
1003** A function that loads a shared-library extension then returns NULL.
1004*/
1005static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001006 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001007 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001008 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001009 char *zErrMsg = 0;
1010
1011 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001012 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001013 }else{
1014 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001015 }
drh7a521cf2007-04-25 18:23:52 +00001016 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001017 sqlite3_result_error(context, zErrMsg, -1);
1018 sqlite3_free(zErrMsg);
1019 }
1020}
1021#endif
1022
danielk197701427a62005-01-11 13:02:33 +00001023
drh0ac65892002-04-20 14:24:41 +00001024/*
drhd3a149e2002-02-24 17:12:53 +00001025** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001026** sum() or avg() aggregate computation.
1027*/
1028typedef struct SumCtx SumCtx;
1029struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001030 double rSum; /* Floating point sum */
1031 i64 iSum; /* Integer sum */
1032 i64 cnt; /* Number of elements summed */
1033 u8 overflow; /* True if integer overflow seen */
1034 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001035};
1036
1037/*
drha97fdd32006-01-12 22:17:50 +00001038** Routines used to compute the sum, average, and total.
1039**
1040** The SUM() function follows the (broken) SQL standard which means
1041** that it returns NULL if it sums over no inputs. TOTAL returns
1042** 0.0 in that case. In addition, TOTAL always returns a float where
1043** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001044** value. TOTAL never fails, but SUM might through an exception if
1045** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001046*/
danielk19770ae8b832004-05-25 12:05:56 +00001047static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001048 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001049 int type;
drh3f219f42005-09-08 19:45:57 +00001050 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +00001051 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001052 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001053 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001054 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001055 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001056 i64 v = sqlite3_value_int64(argv[0]);
1057 p->rSum += v;
1058 if( (p->approx|p->overflow)==0 ){
1059 i64 iNewSum = p->iSum + v;
1060 int s1 = p->iSum >> (sizeof(i64)*8-1);
1061 int s2 = v >> (sizeof(i64)*8-1);
1062 int s3 = iNewSum >> (sizeof(i64)*8-1);
1063 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
1064 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001065 }
1066 }else{
drh8c08e862006-02-11 17:34:00 +00001067 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001068 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001069 }
drh739105c2002-05-29 23:22:23 +00001070 }
drhdd5baa92002-02-27 19:50:59 +00001071}
danielk19770ae8b832004-05-25 12:05:56 +00001072static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001073 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001074 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001075 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001076 if( p->overflow ){
1077 sqlite3_result_error(context,"integer overflow",-1);
1078 }else if( p->approx ){
1079 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001080 }else{
drh8c08e862006-02-11 17:34:00 +00001081 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001082 }
drh3d1d95e2005-09-08 10:37:01 +00001083 }
drhdd5baa92002-02-27 19:50:59 +00001084}
danielk19770ae8b832004-05-25 12:05:56 +00001085static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001086 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001087 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001088 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001089 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001090 }
1091}
drha97fdd32006-01-12 22:17:50 +00001092static void totalFinalize(sqlite3_context *context){
1093 SumCtx *p;
1094 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001095 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001096}
drhdd5baa92002-02-27 19:50:59 +00001097
1098/*
drh0bce8352002-02-28 00:41:10 +00001099** The following structure keeps track of state information for the
1100** count() aggregate function.
1101*/
1102typedef struct CountCtx CountCtx;
1103struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001104 i64 n;
drh0bce8352002-02-28 00:41:10 +00001105};
drhdd5baa92002-02-27 19:50:59 +00001106
drh0bce8352002-02-28 00:41:10 +00001107/*
1108** Routines to implement the count() aggregate function.
1109*/
danielk19770ae8b832004-05-25 12:05:56 +00001110static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001111 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001112 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001113 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001114 p->n++;
1115 }
1116}
danielk19770ae8b832004-05-25 12:05:56 +00001117static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001118 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001119 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001120 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001121}
1122
1123/*
drh0bce8352002-02-28 00:41:10 +00001124** Routines to implement min() and max() aggregate functions.
1125*/
danielk19770ae8b832004-05-25 12:05:56 +00001126static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +00001127 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001128 Mem *pBest;
1129
1130 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1131 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001132 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001133
danielk197788208052004-05-25 01:13:20 +00001134 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001135 int max;
1136 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001137 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001138 /* This step function is used for both the min() and max() aggregates,
1139 ** the only difference between the two being that the sense of the
1140 ** comparison is inverted. For the max() aggregate, the
1141 ** sqlite3_user_data() function returns (void *)-1. For min() it
1142 ** returns (void *)db, where db is the sqlite3* database pointer.
1143 ** Therefore the next statement sets variable 'max' to 1 for the max()
1144 ** aggregate, or 0 for min().
1145 */
drh309b3382007-03-17 17:52:42 +00001146 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001147 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001148 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001149 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001150 }
drh268380c2004-02-25 13:47:31 +00001151 }else{
drhb21c8cd2007-08-21 19:33:56 +00001152 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001153 }
1154}
danielk19770ae8b832004-05-25 12:05:56 +00001155static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001156 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001157 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1158 if( pRes ){
1159 if( pRes->flags ){
1160 sqlite3_result_value(context, pRes);
1161 }
1162 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001163 }
1164}
drhdd5baa92002-02-27 19:50:59 +00001165
drhb0689692007-11-01 17:38:30 +00001166/*
1167** group_concat(EXPR, ?SEPARATOR?)
1168*/
1169static void groupConcatStep(
1170 sqlite3_context *context,
1171 int argc,
1172 sqlite3_value **argv
1173){
1174 const char *zVal;
drhade86482007-11-28 22:36:40 +00001175 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001176 const char *zSep;
drhade86482007-11-28 22:36:40 +00001177 int nVal, nSep;
drhb0689692007-11-01 17:38:30 +00001178 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001179 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1180
1181 if( pAccum ){
1182 pAccum->useMalloc = 1;
1183 if( pAccum->nChar ){
drhb0689692007-11-01 17:38:30 +00001184 if( argc==2 ){
drhade86482007-11-28 22:36:40 +00001185 zSep = (char*)sqlite3_value_text(argv[1]);
1186 nSep = sqlite3_value_bytes(argv[1]);
drhb0689692007-11-01 17:38:30 +00001187 }else{
1188 zSep = ",";
drhade86482007-11-28 22:36:40 +00001189 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001190 }
drhade86482007-11-28 22:36:40 +00001191 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001192 }
drhade86482007-11-28 22:36:40 +00001193 zVal = (char*)sqlite3_value_text(argv[0]);
1194 nVal = sqlite3_value_bytes(argv[0]);
1195 sqlite3StrAccumAppend(pAccum, zVal, nVal);
drhb0689692007-11-01 17:38:30 +00001196 }
1197}
1198static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001199 StrAccum *pAccum;
1200 pAccum = sqlite3_aggregate_context(context, 0);
1201 if( pAccum ){
1202 if( pAccum->tooBig ){
1203 sqlite3_result_error_toobig(context);
1204 }else if( pAccum->mallocFailed ){
1205 sqlite3_result_error_nomem(context);
1206 }else{
1207 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1208 sqlite3_free);
1209 }
drhb0689692007-11-01 17:38:30 +00001210 }
1211}
drh4e5ffc52004-08-31 00:52:37 +00001212
drhd3a149e2002-02-24 17:12:53 +00001213/*
drha2ed5602002-02-26 23:55:31 +00001214** This function registered all of the above C functions as SQL
1215** functions. This should be the only routine in this file with
1216** external linkage.
drhdc04c582002-02-24 01:55:15 +00001217*/
drh9bb575f2004-09-06 17:24:11 +00001218void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001219 static const struct {
drh0bce8352002-02-28 00:41:10 +00001220 char *zName;
drh268380c2004-02-25 13:47:31 +00001221 signed char nArg;
drhfa4a4b92008-03-19 21:45:51 +00001222 u8 argType; /* 1: 0, 2: 1, 3: 2,... N: N-1. */
danielk1977f4618892004-06-28 13:09:11 +00001223 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001224 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001225 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001226 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001227 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1228 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
drh309b3382007-03-17 17:52:42 +00001229 { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc },
1230 { "max", 0, 1, SQLITE_UTF8, 1, 0 },
danielk1977f4618892004-06-28 13:09:11 +00001231 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1232 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
drh64f31512007-10-12 19:11:55 +00001233 { "substr", 2, 0, SQLITE_UTF8, 0, substrFunc },
danielk1977f4618892004-06-28 13:09:11 +00001234 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
danielk1977f4618892004-06-28 13:09:11 +00001235 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1236 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1237 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1238 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1239 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1240 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1241 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1242 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
drh137c7282007-01-29 17:58:28 +00001243 { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc },
danielk1977f4618892004-06-28 13:09:11 +00001244 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1245 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
drh137c7282007-01-29 17:58:28 +00001246 { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob },
drh94a98362004-09-13 13:13:18 +00001247 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001248 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1249 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
drhfa4a4b92008-03-19 21:45:51 +00001250 { "last_insert_rowid", 0, 0, SQLITE_UTF8, 0, last_insert_rowid },
1251 { "changes", 0, 0, SQLITE_UTF8, 0, changes },
1252 { "total_changes", 0, 0, SQLITE_UTF8, 0, total_changes },
drh26b6d902007-03-17 13:27:54 +00001253 { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc },
drh309b3382007-03-17 17:52:42 +00001254 { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc },
1255 { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc },
1256 { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc },
1257 { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc },
1258 { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc },
1259 { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc },
drh8cff3822007-05-02 02:08:28 +00001260 { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc },
drhd24cc422003-03-27 12:51:24 +00001261#ifdef SQLITE_SOUNDEX
drh309b3382007-03-17 17:52:42 +00001262 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001263#endif
drhfdb83b22006-06-17 14:12:47 +00001264#ifndef SQLITE_OMIT_LOAD_EXTENSION
drhfa4a4b92008-03-19 21:45:51 +00001265 { "load_extension", 1, 0, SQLITE_UTF8, 0, loadExt },
1266 { "load_extension", 2, 0, SQLITE_UTF8, 0, loadExt },
drhfdb83b22006-06-17 14:12:47 +00001267#endif
drh0bce8352002-02-28 00:41:10 +00001268 };
drh57196282004-10-06 15:41:16 +00001269 static const struct {
drh0bce8352002-02-28 00:41:10 +00001270 char *zName;
drh268380c2004-02-25 13:47:31 +00001271 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001272 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001273 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001274 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1275 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001276 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001277 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
drh309b3382007-03-17 17:52:42 +00001278 { "max", 1, 1, 1, minmaxStep, minMaxFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001279 { "sum", 1, 0, 0, sumStep, sumFinalize },
drha97fdd32006-01-12 22:17:50 +00001280 { "total", 1, 0, 0, sumStep, totalFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001281 { "avg", 1, 0, 0, sumStep, avgFinalize },
1282 { "count", 0, 0, 0, countStep, countFinalize },
1283 { "count", 1, 0, 0, countStep, countFinalize },
drhb0689692007-11-01 17:38:30 +00001284 { "group_concat", 1, 0, 0, groupConcatStep, groupConcatFinalize },
1285 { "group_concat", 2, 0, 0, groupConcatStep, groupConcatFinalize },
drh0bce8352002-02-28 00:41:10 +00001286 };
1287 int i;
1288
1289 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001290 void *pArg;
1291 u8 argType = aFuncs[i].argType;
drhfa4a4b92008-03-19 21:45:51 +00001292 pArg = (void*)(sqlite3_intptr_t)argType;
danielk1977771151b2006-01-17 13:21:40 +00001293 sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001294 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001295 if( aFuncs[i].needCollSeq ){
1296 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1297 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1298 if( pFunc && aFuncs[i].needCollSeq ){
1299 pFunc->needCollSeq = 1;
1300 }
1301 }
drh0bce8352002-02-28 00:41:10 +00001302 }
drh1f01ec12005-02-15 21:36:18 +00001303#ifndef SQLITE_OMIT_ALTERTABLE
1304 sqlite3AlterFunctions(db);
1305#endif
drh198bf392006-01-06 21:52:49 +00001306#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001307 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001308#endif
drh0bce8352002-02-28 00:41:10 +00001309 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
mlcreecha9e852b2008-03-06 09:58:50 +00001310 void *pArg = (void*)(sqlite3_intptr_t)aAggs[i].argType;
danielk1977771151b2006-01-17 13:21:40 +00001311 sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001312 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001313 if( aAggs[i].needCollSeq ){
1314 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001315 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001316 if( pFunc && aAggs[i].needCollSeq ){
1317 pFunc->needCollSeq = 1;
1318 }
1319 }
drh268380c2004-02-25 13:47:31 +00001320 }
danielk19774adee202004-05-08 08:23:19 +00001321 sqlite3RegisterDateTimeFunctions(db);
danielk19771e536952007-08-16 10:09:01 +00001322 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001323 int rc = sqlite3_overload_function(db, "MATCH", 2);
1324 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1325 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001326 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001327 }
1328 }
danielk1977fd9e1f32005-05-22 10:44:34 +00001329#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001330 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001331#endif
drh55ef4d92005-08-14 01:20:37 +00001332#ifdef SQLITE_CASE_SENSITIVE_LIKE
1333 sqlite3RegisterLikeFunctions(db, 1);
1334#else
1335 sqlite3RegisterLikeFunctions(db, 0);
1336#endif
1337}
1338
1339/*
1340** Set the LIKEOPT flag on the 2-argument function with the given name.
1341*/
drhd64fe2f2005-08-28 17:00:23 +00001342static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001343 FuncDef *pDef;
1344 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1345 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001346 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001347 }
1348}
1349
1350/*
1351** Register the built-in LIKE and GLOB functions. The caseSensitive
1352** parameter determines whether or not the LIKE operator is case
1353** sensitive. GLOB is always case sensitive.
1354*/
1355void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1356 struct compareInfo *pInfo;
1357 if( caseSensitive ){
1358 pInfo = (struct compareInfo*)&likeInfoAlt;
1359 }else{
1360 pInfo = (struct compareInfo*)&likeInfoNorm;
1361 }
danielk1977771151b2006-01-17 13:21:40 +00001362 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1363 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1364 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001365 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001366 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1367 setLikeOptFlag(db, "like",
1368 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001369}
1370
1371/*
1372** pExpr points to an expression which implements a function. If
1373** it is appropriate to apply the LIKE optimization to that function
1374** then set aWc[0] through aWc[2] to the wildcard characters and
1375** return TRUE. If the function is not a LIKE-style function then
1376** return FALSE.
1377*/
drhd64fe2f2005-08-28 17:00:23 +00001378int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001379 FuncDef *pDef;
danielk1977cdbd8ef2007-05-12 06:11:12 +00001380 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
drh55ef4d92005-08-14 01:20:37 +00001381 return 0;
1382 }
1383 if( pExpr->pList->nExpr!=2 ){
1384 return 0;
1385 }
drh2646da72005-12-09 20:02:05 +00001386 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001387 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001388 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001389 return 0;
1390 }
1391
1392 /* The memcpy() statement assumes that the wildcard characters are
1393 ** the first three statements in the compareInfo structure. The
1394 ** asserts() that follow verify that assumption
1395 */
1396 memcpy(aWc, pDef->pUserData, 3);
1397 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1398 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1399 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001400 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001401 return 1;
drhdc04c582002-02-24 01:55:15 +00001402}