blob: 8a23cf34b2d7ccec1ed003d7c64b445403df345c [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**
drh1f0feef2007-05-15 13:27:07 +000019** $Id: func.c,v 1.158 2007/05/15 13:27:07 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>
drhb37df7b2005-10-13 02:09:49 +000023/* #include <math.h> */
drhd3a149e2002-02-24 17:12:53 +000024#include <stdlib.h>
drh0bce8352002-02-28 00:41:10 +000025#include <assert.h>
danielk197788208052004-05-25 01:13:20 +000026#include "vdbeInt.h"
drh771d8c32003-08-09 21:32:28 +000027#include "os.h"
drh0bce8352002-02-28 00:41:10 +000028
drh55ef4d92005-08-14 01:20:37 +000029/*
30** Return the collating function associated with a function.
31*/
danielk1977dc1bdc42004-06-11 10:51:27 +000032static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
33 return context->pColl;
34}
35
drh0bce8352002-02-28 00:41:10 +000036/*
37** Implementation of the non-aggregate min() and max() functions
38*/
drhf9b596e2004-05-26 16:54:42 +000039static void minmaxFunc(
40 sqlite3_context *context,
41 int argc,
42 sqlite3_value **argv
43){
drh0bce8352002-02-28 00:41:10 +000044 int i;
drh268380c2004-02-25 13:47:31 +000045 int mask; /* 0 for min() or 0xffffffff for max() */
drhf9b596e2004-05-26 16:54:42 +000046 int iBest;
danielk1977dc1bdc42004-06-11 10:51:27 +000047 CollSeq *pColl;
drh0bce8352002-02-28 00:41:10 +000048
drh89425d52002-02-28 03:04:48 +000049 if( argc==0 ) return;
drhc44af712004-09-02 15:53:56 +000050 mask = sqlite3_user_data(context)==0 ? 0 : -1;
danielk1977dc1bdc42004-06-11 10:51:27 +000051 pColl = sqlite3GetFuncCollSeq(context);
52 assert( pColl );
danielk1977c572ef72004-05-27 09:28:41 +000053 assert( mask==-1 || mask==0 );
drhf9b596e2004-05-26 16:54:42 +000054 iBest = 0;
drh9c054832004-05-31 18:51:57 +000055 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhf9b596e2004-05-26 16:54:42 +000056 for(i=1; i<argc; i++){
drh9c054832004-05-31 18:51:57 +000057 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
danielk1977dc1bdc42004-06-11 10:51:27 +000058 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
drhf9b596e2004-05-26 16:54:42 +000059 iBest = i;
drh0bce8352002-02-28 00:41:10 +000060 }
61 }
drhf4479502004-05-27 03:12:53 +000062 sqlite3_result_value(context, argv[iBest]);
drh0bce8352002-02-28 00:41:10 +000063}
drh0bce8352002-02-28 00:41:10 +000064
drh268380c2004-02-25 13:47:31 +000065/*
66** Return the type of the argument.
67*/
drhf9b596e2004-05-26 16:54:42 +000068static void typeofFunc(
69 sqlite3_context *context,
70 int argc,
71 sqlite3_value **argv
72){
danielk197735bb9d02004-05-24 12:55:54 +000073 const char *z = 0;
danielk197735bb9d02004-05-24 12:55:54 +000074 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000075 case SQLITE_NULL: z = "null"; break;
76 case SQLITE_INTEGER: z = "integer"; break;
77 case SQLITE_TEXT: z = "text"; break;
78 case SQLITE_FLOAT: z = "real"; break;
79 case SQLITE_BLOB: z = "blob"; break;
danielk197735bb9d02004-05-24 12:55:54 +000080 }
danielk1977d8123362004-06-12 09:25:12 +000081 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000082}
83
drh5708d2d2005-06-22 10:53:59 +000084
85/*
drh0bce8352002-02-28 00:41:10 +000086** Implementation of the length() function
87*/
drhf9b596e2004-05-26 16:54:42 +000088static void lengthFunc(
89 sqlite3_context *context,
90 int argc,
91 sqlite3_value **argv
92){
drh0bce8352002-02-28 00:41:10 +000093 int len;
94
95 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +000096 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000097 case SQLITE_BLOB:
98 case SQLITE_INTEGER:
99 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000100 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +0000101 break;
102 }
drh9c054832004-05-31 18:51:57 +0000103 case SQLITE_TEXT: {
drh2646da72005-12-09 20:02:05 +0000104 const unsigned char *z = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000105 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000106 len = 0;
107 while( *z ){
108 len++;
109 SQLITE_SKIP_UTF8(z);
110 }
drhf4479502004-05-27 03:12:53 +0000111 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000112 break;
113 }
114 default: {
115 sqlite3_result_null(context);
116 break;
117 }
118 }
drh0bce8352002-02-28 00:41:10 +0000119}
120
121/*
122** Implementation of the abs() function
123*/
danielk19770ae8b832004-05-25 12:05:56 +0000124static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000125 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +0000126 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000127 case SQLITE_INTEGER: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000128 i64 iVal = sqlite3_value_int64(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000129 if( iVal<0 ){
130 if( (iVal<<1)==0 ){
131 sqlite3_result_error(context, "integer overflow", -1);
132 return;
133 }
134 iVal = -iVal;
135 }
danielk1977f93bbbe2004-05-27 10:30:52 +0000136 sqlite3_result_int64(context, iVal);
drhf9b596e2004-05-26 16:54:42 +0000137 break;
138 }
drh9c054832004-05-31 18:51:57 +0000139 case SQLITE_NULL: {
drhf9b596e2004-05-26 16:54:42 +0000140 sqlite3_result_null(context);
141 break;
142 }
143 default: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000144 double rVal = sqlite3_value_double(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000145 if( rVal<0 ) rVal = -rVal;
danielk1977f93bbbe2004-05-27 10:30:52 +0000146 sqlite3_result_double(context, rVal);
drhf9b596e2004-05-26 16:54:42 +0000147 break;
148 }
149 }
drh0bce8352002-02-28 00:41:10 +0000150}
151
152/*
drhf764e6f2007-05-15 01:13:47 +0000153** Implementation of the substr() function.
154**
155** substr(x,p1,p2) returns p2 characters of x[] beginning with p1.
156** p1 is 1-indexed. So substr(x,1,1) returns the first character
157** of x. If x is text, then we actually count UTF-8 characters.
158** If x is a blob, then we count bytes.
159**
160** If p1 is negative, then we begin abs(p1) from the end of x[].
drh0bce8352002-02-28 00:41:10 +0000161*/
drhf9b596e2004-05-26 16:54:42 +0000162static void substrFunc(
163 sqlite3_context *context,
164 int argc,
165 sqlite3_value **argv
166){
drh2646da72005-12-09 20:02:05 +0000167 const unsigned char *z;
168 const unsigned char *z2;
drh023ae032007-05-08 12:12:16 +0000169 int len;
drhf764e6f2007-05-15 01:13:47 +0000170 int p0type;
drh023ae032007-05-08 12:12:16 +0000171 i64 p1, p2;
drhf9b596e2004-05-26 16:54:42 +0000172
drh0bce8352002-02-28 00:41:10 +0000173 assert( argc==3 );
drhf764e6f2007-05-15 01:13:47 +0000174 p0type = sqlite3_value_type(argv[0]);
175 if( p0type==SQLITE_BLOB ){
176 len = sqlite3_value_bytes(argv[0]);
177 z = sqlite3_value_blob(argv[0]);
178 if( z==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000179 assert( len==sqlite3_value_bytes(argv[0]) );
drhf764e6f2007-05-15 01:13:47 +0000180 }else{
181 z = sqlite3_value_text(argv[0]);
182 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000183 len = 0;
184 for(z2=z; *z2; len++){
185 SQLITE_SKIP_UTF8(z2);
186 }
drhf764e6f2007-05-15 01:13:47 +0000187 }
danielk197751ad0ec2004-05-24 12:39:02 +0000188 p1 = sqlite3_value_int(argv[1]);
189 p2 = sqlite3_value_int(argv[2]);
drh0bce8352002-02-28 00:41:10 +0000190 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000191 p1 += len;
drh653bc752002-02-28 03:31:10 +0000192 if( p1<0 ){
193 p2 += p1;
194 p1 = 0;
195 }
drh0bce8352002-02-28 00:41:10 +0000196 }else if( p1>0 ){
197 p1--;
198 }
199 if( p1+p2>len ){
200 p2 = len-p1;
201 }
drhf764e6f2007-05-15 01:13:47 +0000202 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000203 while( *z && p1 ){
204 SQLITE_SKIP_UTF8(z);
205 p1--;
drhf764e6f2007-05-15 01:13:47 +0000206 }
drh4a919112007-05-15 11:55:09 +0000207 for(z2=z; *z2 && p2; p2--){
208 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000209 }
drh4a919112007-05-15 11:55:09 +0000210 sqlite3_result_text(context, (char*)z, z2-z, SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000211 }else{
212 if( p2<0 ) p2 = 0;
213 sqlite3_result_blob(context, (char*)&z[p1], p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000214 }
drh0bce8352002-02-28 00:41:10 +0000215}
216
217/*
218** Implementation of the round() function
219*/
danielk19770ae8b832004-05-25 12:05:56 +0000220static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000221 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000222 double r;
drh592ac8c2005-08-13 03:07:47 +0000223 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000224 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000225 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000226 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000227 n = sqlite3_value_int(argv[1]);
228 if( n>30 ) n = 30;
229 if( n<0 ) n = 0;
230 }
drhd589a922006-03-02 03:02:48 +0000231 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000232 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000233 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000234 sqlite3AtoF(zBuf, &r);
235 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000236}
drhdc04c582002-02-24 01:55:15 +0000237
238/*
239** Implementation of the upper() and lower() SQL functions.
240*/
danielk19770ae8b832004-05-25 12:05:56 +0000241static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000242 char *z1;
243 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000244 int i, n;
drh9c054832004-05-31 18:51:57 +0000245 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000246 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000247 n = sqlite3_value_bytes(argv[0]);
248 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
249 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000250 if( z2 ){
drh9310ef22007-04-27 17:16:20 +0000251 z1 = sqlite3_malloc(n+1);
drh7a521cf2007-04-25 18:23:52 +0000252 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000253 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000254 for(i=0; z1[i]; i++){
255 z1[i] = toupper(z1[i]);
256 }
257 sqlite3_result_text(context, z1, -1, sqlite3_free);
258 }
drhdc04c582002-02-24 01:55:15 +0000259 }
260}
danielk19770ae8b832004-05-25 12:05:56 +0000261static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000262 char *z1;
263 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000264 int i, n;
drh9c054832004-05-31 18:51:57 +0000265 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000266 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000267 n = sqlite3_value_bytes(argv[0]);
268 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
269 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000270 if( z2 ){
drh9310ef22007-04-27 17:16:20 +0000271 z1 = sqlite3_malloc(n+1);
drh7a521cf2007-04-25 18:23:52 +0000272 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000273 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000274 for(i=0; z1[i]; i++){
275 z1[i] = tolower(z1[i]);
276 }
277 sqlite3_result_text(context, z1, -1, sqlite3_free);
278 }
drhdc04c582002-02-24 01:55:15 +0000279 }
280}
281
282/*
drhfbc99082002-02-28 03:14:18 +0000283** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000284** All three do the same thing. They return the first non-NULL
285** argument.
drh3212e182002-02-28 00:46:26 +0000286*/
drhf9b596e2004-05-26 16:54:42 +0000287static void ifnullFunc(
288 sqlite3_context *context,
289 int argc,
290 sqlite3_value **argv
291){
drhfbc99082002-02-28 03:14:18 +0000292 int i;
293 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000294 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000295 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000296 break;
297 }
298 }
drh3212e182002-02-28 00:46:26 +0000299}
300
301/*
drhf9ffac92002-03-02 19:00:31 +0000302** Implementation of random(). Return a random integer.
303*/
drhf9b596e2004-05-26 16:54:42 +0000304static void randomFunc(
305 sqlite3_context *context,
306 int argc,
307 sqlite3_value **argv
308){
drh52fc8492006-02-23 21:43:55 +0000309 sqlite_int64 r;
danielk19774adee202004-05-08 08:23:19 +0000310 sqlite3Randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000311 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
312 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000313 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000314}
315
316/*
drh137c7282007-01-29 17:58:28 +0000317** Implementation of randomblob(N). Return a random blob
318** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000319*/
drh137c7282007-01-29 17:58:28 +0000320static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000321 sqlite3_context *context,
322 int argc,
323 sqlite3_value **argv
324){
drh137c7282007-01-29 17:58:28 +0000325 int n;
326 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000327 assert( argc==1 );
328 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000329 if( n<1 ){
330 n = 1;
331 }
332 if( n>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000333 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000334 return;
335 }
drh02d85832007-05-07 19:31:15 +0000336 p = sqliteMalloc(n);
337 if( p ){
338 sqlite3Randomness(n, p);
339 sqlite3_result_blob(context, (char*)p, n, sqlite3FreeX);
340 }
drh63cf66f2007-01-29 15:50:05 +0000341}
342
343/*
drh6ed41ad2002-04-06 14:10:47 +0000344** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000345** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000346*/
danielk197751ad0ec2004-05-24 12:39:02 +0000347static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000348 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000349 int arg,
350 sqlite3_value **argv
351){
drh9bb575f2004-09-06 17:24:11 +0000352 sqlite3 *db = sqlite3_user_data(context);
drhf9b596e2004-05-26 16:54:42 +0000353 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000354}
355
rdcf146a772004-02-25 22:51:06 +0000356/*
danielk1977b28af712004-06-21 06:50:26 +0000357** Implementation of the changes() SQL function. The return value is the
358** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000359*/
danielk1977b28af712004-06-21 06:50:26 +0000360static void changes(
drhf9b596e2004-05-26 16:54:42 +0000361 sqlite3_context *context,
362 int arg,
363 sqlite3_value **argv
364){
drh9bb575f2004-09-06 17:24:11 +0000365 sqlite3 *db = sqlite3_user_data(context);
drhf4479502004-05-27 03:12:53 +0000366 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000367}
rdcf146a772004-02-25 22:51:06 +0000368
369/*
danielk1977b28af712004-06-21 06:50:26 +0000370** Implementation of the total_changes() SQL function. The return value is
371** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000372*/
danielk1977b28af712004-06-21 06:50:26 +0000373static void total_changes(
374 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000375 int arg,
376 sqlite3_value **argv
377){
drh9bb575f2004-09-06 17:24:11 +0000378 sqlite3 *db = sqlite3_user_data(context);
danielk1977b28af712004-06-21 06:50:26 +0000379 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000380}
381
drh6ed41ad2002-04-06 14:10:47 +0000382/*
drh4e5ffc52004-08-31 00:52:37 +0000383** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000384*/
drh4e5ffc52004-08-31 00:52:37 +0000385struct compareInfo {
386 u8 matchAll;
387 u8 matchOne;
388 u8 matchSet;
389 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000390};
drh55ef4d92005-08-14 01:20:37 +0000391
drh4e5ffc52004-08-31 00:52:37 +0000392static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000393/* The correct SQL-92 behavior is for the LIKE operator to ignore
394** case. Thus 'a' LIKE 'A' would be true. */
395static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
396/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
397** is case sensitive causing 'a' LIKE 'A' to be false */
398static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000399
400/*
drh4a919112007-05-15 11:55:09 +0000401** Read a single UTF-8 character and return its value.
danielk1977d02eb1f2004-06-06 09:44:03 +0000402*/
drh4a919112007-05-15 11:55:09 +0000403u32 sqlite3ReadUtf8(const unsigned char *z){
404 u32 c;
405 SQLITE_READ_UTF8(z, c);
406 return c;
407}
danielk1977d02eb1f2004-06-06 09:44:03 +0000408
409/*
drh4e5ffc52004-08-31 00:52:37 +0000410** Compare two UTF-8 strings for equality where the first string can
411** potentially be a "glob" expression. Return true (1) if they
412** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000413**
drh4e5ffc52004-08-31 00:52:37 +0000414** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000415**
drh4e5ffc52004-08-31 00:52:37 +0000416** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000417**
drh4e5ffc52004-08-31 00:52:37 +0000418** '?' Matches exactly one character.
419**
420** [...] Matches one character from the enclosed list of
421** characters.
422**
423** [^...] Matches one character not in the enclosed list.
424**
425** With the [...] and [^...] matching, a ']' character can be included
426** in the list by making it the first character after '[' or '^'. A
427** range of characters can be specified using '-'. Example:
428** "[a-z]" matches any single lower-case letter. To match a '-', make
429** it the last character in the list.
430**
431** This routine is usually quick, but can be N**2 in the worst case.
432**
433** Hints: to match '*' or '?', put them in "[]". Like this:
434**
435** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000436*/
danielk19777c6303c2004-11-17 16:41:29 +0000437static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000438 const u8 *zPattern, /* The glob pattern */
439 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000440 const struct compareInfo *pInfo, /* Information about how to do the compare */
441 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000442){
danielk1977ad7dd422004-06-06 12:41:49 +0000443 register int c;
drh4e5ffc52004-08-31 00:52:37 +0000444 int invert;
445 int seen;
446 int c2;
447 u8 matchOne = pInfo->matchOne;
448 u8 matchAll = pInfo->matchAll;
449 u8 matchSet = pInfo->matchSet;
450 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000451 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000452
drh4e5ffc52004-08-31 00:52:37 +0000453 while( (c = *zPattern)!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000454 if( !prevEscape && c==matchAll ){
drh4e5ffc52004-08-31 00:52:37 +0000455 while( (c=zPattern[1]) == matchAll || c == matchOne ){
456 if( c==matchOne ){
457 if( *zString==0 ) return 0;
drh4a919112007-05-15 11:55:09 +0000458 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000459 }
460 zPattern++;
danielk1977ad7dd422004-06-06 12:41:49 +0000461 }
drh20fc0882004-11-18 13:49:25 +0000462 if( c && esc && sqlite3ReadUtf8(&zPattern[1])==esc ){
danielk19777c6303c2004-11-17 16:41:29 +0000463 u8 const *zTemp = &zPattern[1];
drh4a919112007-05-15 11:55:09 +0000464 SQLITE_SKIP_UTF8(zTemp);
danielk19777c6303c2004-11-17 16:41:29 +0000465 c = *zTemp;
466 }
drh4e5ffc52004-08-31 00:52:37 +0000467 if( c==0 ) return 1;
468 if( c==matchSet ){
danielk19777c6303c2004-11-17 16:41:29 +0000469 assert( esc==0 ); /* This is GLOB, not LIKE */
470 while( *zString && patternCompare(&zPattern[1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000471 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000472 }
473 return *zString!=0;
474 }else{
475 while( (c2 = *zString)!=0 ){
476 if( noCase ){
477 c2 = sqlite3UpperToLower[c2];
478 c = sqlite3UpperToLower[c];
479 while( c2 != 0 && c2 != c ){ c2 = sqlite3UpperToLower[*++zString]; }
480 }else{
481 while( c2 != 0 && c2 != c ){ c2 = *++zString; }
482 }
483 if( c2==0 ) return 0;
danielk19777c6303c2004-11-17 16:41:29 +0000484 if( patternCompare(&zPattern[1],zString,pInfo,esc) ) return 1;
drh4a919112007-05-15 11:55:09 +0000485 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000486 }
487 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000488 }
danielk19777c6303c2004-11-17 16:41:29 +0000489 }else if( !prevEscape && c==matchOne ){
drh4e5ffc52004-08-31 00:52:37 +0000490 if( *zString==0 ) return 0;
drh4a919112007-05-15 11:55:09 +0000491 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000492 zPattern++;
493 }else if( c==matchSet ){
494 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000495 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000496 seen = 0;
497 invert = 0;
drh4a919112007-05-15 11:55:09 +0000498 c = sqlite3ReadUtf8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000499 if( c==0 ) return 0;
500 c2 = *++zPattern;
501 if( c2=='^' ){ invert = 1; c2 = *++zPattern; }
502 if( c2==']' ){
503 if( c==']' ) seen = 1;
504 c2 = *++zPattern;
505 }
drh4a919112007-05-15 11:55:09 +0000506 while( (c2 = sqlite3ReadUtf8(zPattern))!=0 && c2!=']' ){
drh4e5ffc52004-08-31 00:52:37 +0000507 if( c2=='-' && zPattern[1]!=']' && zPattern[1]!=0 && prior_c>0 ){
508 zPattern++;
drh4a919112007-05-15 11:55:09 +0000509 c2 = sqlite3ReadUtf8(zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000510 if( c>=prior_c && c<=c2 ) seen = 1;
511 prior_c = 0;
512 }else if( c==c2 ){
513 seen = 1;
514 prior_c = c2;
515 }else{
516 prior_c = c2;
517 }
drh4a919112007-05-15 11:55:09 +0000518 SQLITE_SKIP_UTF8(zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000519 }
520 if( c2==0 || (seen ^ invert)==0 ) return 0;
drh4a919112007-05-15 11:55:09 +0000521 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000522 zPattern++;
drh20fc0882004-11-18 13:49:25 +0000523 }else if( esc && !prevEscape && sqlite3ReadUtf8(zPattern)==esc){
danielk19777c6303c2004-11-17 16:41:29 +0000524 prevEscape = 1;
drh4a919112007-05-15 11:55:09 +0000525 SQLITE_SKIP_UTF8(zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000526 }else{
527 if( noCase ){
528 if( sqlite3UpperToLower[c] != sqlite3UpperToLower[*zString] ) return 0;
529 }else{
530 if( c != *zString ) return 0;
531 }
532 zPattern++;
533 zString++;
danielk19777c6303c2004-11-17 16:41:29 +0000534 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000535 }
danielk197751ad0ec2004-05-24 12:39:02 +0000536 }
drh4e5ffc52004-08-31 00:52:37 +0000537 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000538}
drh4e5ffc52004-08-31 00:52:37 +0000539
drh55ef4d92005-08-14 01:20:37 +0000540/*
541** Count the number of times that the LIKE operator (or GLOB which is
542** just a variation of LIKE) gets called. This is used for testing
543** only.
544*/
545#ifdef SQLITE_TEST
546int sqlite3_like_count = 0;
547#endif
548
danielk19773f6b0872004-06-17 05:36:44 +0000549
550/*
551** Implementation of the like() SQL function. This function implements
552** the build-in LIKE operator. The first argument to the function is the
553** pattern and the second argument is the string. So, the SQL statements:
554**
555** A LIKE B
556**
557** is implemented as like(B,A).
558**
drh55ef4d92005-08-14 01:20:37 +0000559** This same function (with a different compareInfo structure) computes
560** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000561*/
562static void likeFunc(
563 sqlite3_context *context,
564 int argc,
565 sqlite3_value **argv
566){
drhbeb818d2007-05-08 15:34:47 +0000567 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000568 int escape = 0;
drhbeb818d2007-05-08 15:34:47 +0000569
drh1f0feef2007-05-15 13:27:07 +0000570 zB = sqlite3_value_text(argv[0]);
571 zA = sqlite3_value_text(argv[1]);
572
drhbeb818d2007-05-08 15:34:47 +0000573 /* Limit the length of the LIKE or GLOB pattern to avoid problems
574 ** of deep recursion and N*N behavior in patternCompare().
575 */
danielk1977b56fe1f2007-05-09 08:24:44 +0000576 if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){
drhbeb818d2007-05-08 15:34:47 +0000577 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
578 return;
579 }
drh1f0feef2007-05-15 13:27:07 +0000580 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000581
danielk19777c6303c2004-11-17 16:41:29 +0000582 if( argc==3 ){
583 /* The escape character string must consist of a single UTF-8 character.
584 ** Otherwise, return an error.
585 */
586 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000587 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000588 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000589 sqlite3_result_error(context,
590 "ESCAPE expression must be a single character", -1);
591 return;
592 }
593 escape = sqlite3ReadUtf8(zEsc);
594 }
danielk19773f6b0872004-06-17 05:36:44 +0000595 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000596 struct compareInfo *pInfo = sqlite3_user_data(context);
597#ifdef SQLITE_TEST
598 sqlite3_like_count++;
599#endif
drhbeb818d2007-05-08 15:34:47 +0000600
danielk1977b56fe1f2007-05-09 08:24:44 +0000601 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000602 }
drh8912d102002-05-26 21:34:58 +0000603}
604
605/*
606** Implementation of the NULLIF(x,y) function. The result is the first
607** argument if the arguments are different. The result is NULL if the
608** arguments are equal to each other.
609*/
drhf9b596e2004-05-26 16:54:42 +0000610static void nullifFunc(
611 sqlite3_context *context,
612 int argc,
613 sqlite3_value **argv
614){
danielk1977dc1bdc42004-06-11 10:51:27 +0000615 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
616 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000617 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000618 }
drh0ac65892002-04-20 14:24:41 +0000619}
620
drh647cb0e2002-11-04 19:32:25 +0000621/*
622** Implementation of the VERSION(*) function. The result is the version
623** of the SQLite library that is running.
624*/
drhf9b596e2004-05-26 16:54:42 +0000625static void versionFunc(
626 sqlite3_context *context,
627 int argc,
628 sqlite3_value **argv
629){
danielk1977d8123362004-06-12 09:25:12 +0000630 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000631}
632
drh137c7282007-01-29 17:58:28 +0000633/* Array for converting from half-bytes (nybbles) into ASCII hex
634** digits. */
635static const char hexdigits[] = {
636 '0', '1', '2', '3', '4', '5', '6', '7',
637 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
638};
danielk1977d641d642004-11-18 15:44:29 +0000639
drh47394702003-08-20 01:03:33 +0000640/*
641** EXPERIMENTAL - This is not an official function. The interface may
642** change. This function may disappear. Do not write code that depends
643** on this function.
644**
645** Implementation of the QUOTE() function. This function takes a single
646** argument. If the argument is numeric, the return value is the same as
647** the argument. If the argument is NULL, the return value is the string
648** "NULL". Otherwise, the argument is enclosed in single quotes with
649** single-quote escapes.
650*/
danielk19770ae8b832004-05-25 12:05:56 +0000651static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000652 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000653 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000654 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000655 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000656 break;
drh47394702003-08-20 01:03:33 +0000657 }
drh9c054832004-05-31 18:51:57 +0000658 case SQLITE_INTEGER:
659 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000660 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000661 break;
662 }
danielk19773f41e972004-06-08 00:39:01 +0000663 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000664 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000665 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000666 int nBlob = sqlite3_value_bytes(argv[0]);
667 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
danielk19773f41e972004-06-08 00:39:01 +0000668
drh023ae032007-05-08 12:12:16 +0000669 if( 2*nBlob+4>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000670 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000671 return;
672 }
danielk19773f41e972004-06-08 00:39:01 +0000673 zText = (char *)sqliteMalloc((2*nBlob)+4);
674 if( !zText ){
675 sqlite3_result_error(context, "out of memory", -1);
676 }else{
677 int i;
678 for(i=0; i<nBlob; i++){
679 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
680 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
681 }
682 zText[(nBlob*2)+2] = '\'';
683 zText[(nBlob*2)+3] = '\0';
684 zText[0] = 'X';
685 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000686 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
danielk19773f41e972004-06-08 00:39:01 +0000687 sqliteFree(zText);
688 }
689 break;
690 }
drh9c054832004-05-31 18:51:57 +0000691 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000692 int i,j;
693 u64 n;
drh2646da72005-12-09 20:02:05 +0000694 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000695 char *z;
696
drh7a521cf2007-04-25 18:23:52 +0000697 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000698 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
699 if( i+n+3>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000700 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000701 return;
702 }
drhf9b596e2004-05-26 16:54:42 +0000703 z = sqliteMalloc( i+n+3 );
704 if( z==0 ) return;
705 z[0] = '\'';
706 for(i=0, j=1; zArg[i]; i++){
707 z[j++] = zArg[i];
708 if( zArg[i]=='\'' ){
709 z[j++] = '\'';
710 }
711 }
712 z[j++] = '\'';
713 z[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000714 sqlite3_result_text(context, z, j, SQLITE_TRANSIENT);
drhf9b596e2004-05-26 16:54:42 +0000715 sqliteFree(z);
716 }
drh47394702003-08-20 01:03:33 +0000717 }
718}
719
drh137c7282007-01-29 17:58:28 +0000720/*
721** The hex() function. Interpret the argument as a blob. Return
722** a hexadecimal rendering as text.
723*/
724static void hexFunc(
725 sqlite3_context *context,
726 int argc,
727 sqlite3_value **argv
728){
729 int i, n;
730 const unsigned char *pBlob;
731 char *zHex, *z;
732 assert( argc==1 );
drh1f0feef2007-05-15 13:27:07 +0000733 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000734 n = sqlite3_value_bytes(argv[0]);
drh023ae032007-05-08 12:12:16 +0000735 if( n*2+1>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000736 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000737 return;
738 }
drh1f0feef2007-05-15 13:27:07 +0000739 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drh137c7282007-01-29 17:58:28 +0000740 z = zHex = sqlite3_malloc(n*2 + 1);
741 if( zHex==0 ) return;
742 for(i=0; i<n; i++, pBlob++){
743 unsigned char c = *pBlob;
744 *(z++) = hexdigits[(c>>4)&0xf];
745 *(z++) = hexdigits[c&0xf];
746 }
747 *z = 0;
748 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
749}
750
drh26b6d902007-03-17 13:27:54 +0000751/*
drh8cff3822007-05-02 02:08:28 +0000752** The zeroblob(N) function returns a zero-filled blob of size N bytes.
753*/
754static void zeroblobFunc(
755 sqlite3_context *context,
756 int argc,
757 sqlite3_value **argv
758){
759 int n;
760 assert( argc==1 );
761 n = sqlite3_value_int(argv[0]);
762 sqlite3_result_zeroblob(context, n);
763}
764
765/*
drh26b6d902007-03-17 13:27:54 +0000766** The replace() function. Three arguments are all strings: call
767** them A, B, and C. The result is also a string which is derived
768** from A by replacing every occurance of B with C. The match
769** must be exact. Collating sequences are not used.
770*/
771static void replaceFunc(
772 sqlite3_context *context,
773 int argc,
774 sqlite3_value **argv
775){
776 const unsigned char *zStr; /* The input string A */
777 const unsigned char *zPattern; /* The pattern string B */
778 const unsigned char *zRep; /* The replacement string C */
779 unsigned char *zOut; /* The output */
780 int nStr; /* Size of zStr */
781 int nPattern; /* Size of zPattern */
782 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000783 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000784 int loopLimit; /* Last zStr[] that might match zPattern[] */
785 int i, j; /* Loop counters */
786
787 assert( argc==3 );
drh26b6d902007-03-17 13:27:54 +0000788 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000789 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000790 nStr = sqlite3_value_bytes(argv[0]);
791 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000792 zPattern = sqlite3_value_text(argv[1]);
drh709cff32007-04-27 01:18:02 +0000793 if( zPattern==0 || zPattern[0]==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000794 nPattern = sqlite3_value_bytes(argv[1]);
795 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000796 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000797 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000798 nRep = sqlite3_value_bytes(argv[2]);
799 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000800 nOut = nStr + 1;
801 assert( nOut<SQLITE_MAX_LENGTH );
802 zOut = sqlite3_malloc((int)nOut);
803 if( zOut==0 ){
804 return;
drh26b6d902007-03-17 13:27:54 +0000805 }
drh26b6d902007-03-17 13:27:54 +0000806 loopLimit = nStr - nPattern;
807 for(i=j=0; i<=loopLimit; i++){
808 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
809 zOut[j++] = zStr[i];
810 }else{
drh2e6400b2007-05-08 15:46:18 +0000811 nOut += nRep - nPattern;
812 if( nOut>=SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000813 sqlite3_result_error_toobig(context);
danielk197717374e82007-05-08 14:39:04 +0000814 sqlite3_free(zOut);
815 return;
816 }
drh2e6400b2007-05-08 15:46:18 +0000817 zOut = sqlite3_realloc(zOut, (int)nOut);
818 if( zOut==0 ){
819 return;
820 }
drh26b6d902007-03-17 13:27:54 +0000821 memcpy(&zOut[j], zRep, nRep);
822 j += nRep;
823 i += nPattern-1;
824 }
825 }
drh2e6400b2007-05-08 15:46:18 +0000826 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000827 memcpy(&zOut[j], &zStr[i], nStr-i);
828 j += nStr - i;
829 assert( j<=nOut );
830 zOut[j] = 0;
831 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
832}
833
drh309b3382007-03-17 17:52:42 +0000834/*
835** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
836** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
837*/
838static void trimFunc(
839 sqlite3_context *context,
840 int argc,
841 sqlite3_value **argv
842){
843 const unsigned char *zIn; /* Input string */
844 const unsigned char *zCharSet; /* Set of characters to trim */
845 int nIn; /* Number of bytes in input */
drhd1e3a612007-04-27 21:59:52 +0000846 int flags; /* 1: trimleft 2: trimright 3: trim */
847 int i; /* Loop counter */
848 unsigned char *aLen; /* Length of each character in zCharSet */
849 const unsigned char **azChar; /* Individual characters in zCharSet */
850 int nChar; /* Number of characters in zCharSet */
851
drh309b3382007-03-17 17:52:42 +0000852 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
853 return;
854 }
855 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000856 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000857 nIn = sqlite3_value_bytes(argv[0]);
858 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000859 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000860 static const unsigned char lenOne[] = { 1 };
drh8cff3822007-05-02 02:08:28 +0000861 static const unsigned char *azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000862 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000863 aLen = (u8*)lenOne;
864 azChar = azOne;
drhd1e3a612007-04-27 21:59:52 +0000865 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000866 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000867 return;
drhd1e3a612007-04-27 21:59:52 +0000868 }else{
869 const unsigned char *z;
870 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000871 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000872 }
873 if( nChar>0 ){
874 azChar = sqlite3_malloc( nChar*(sizeof(char*)+1) );
875 if( azChar==0 ){
876 return;
877 }
878 aLen = (unsigned char*)&azChar[nChar];
879 for(z=zCharSet, nChar=0; *z; nChar++){
880 azChar[nChar] = z;
drh4a919112007-05-15 11:55:09 +0000881 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000882 aLen[nChar] = z - azChar[nChar];
883 }
884 }
drh309b3382007-03-17 17:52:42 +0000885 }
drhd1e3a612007-04-27 21:59:52 +0000886 if( nChar>0 ){
drh309b3382007-03-17 17:52:42 +0000887 flags = (int)sqlite3_user_data(context);
888 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000889 while( nIn>0 ){
890 int len;
891 for(i=0; i<nChar; i++){
892 len = aLen[i];
893 if( memcmp(zIn, azChar[i], len)==0 ) break;
894 }
895 if( i>=nChar ) break;
896 zIn += len;
897 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000898 }
899 }
900 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000901 while( nIn>0 ){
902 int len;
903 for(i=0; i<nChar; i++){
904 len = aLen[i];
905 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
906 }
907 if( i>=nChar ) break;
908 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000909 }
910 }
drhd1e3a612007-04-27 21:59:52 +0000911 if( zCharSet ){
912 sqlite3_free(azChar);
913 }
drh309b3382007-03-17 17:52:42 +0000914 }
915 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
916}
drh26b6d902007-03-17 13:27:54 +0000917
drhd24cc422003-03-27 12:51:24 +0000918#ifdef SQLITE_SOUNDEX
919/*
920** Compute the soundex encoding of a word.
921*/
drh137c7282007-01-29 17:58:28 +0000922static void soundexFunc(
923 sqlite3_context *context,
924 int argc,
925 sqlite3_value **argv
926){
drhd24cc422003-03-27 12:51:24 +0000927 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000928 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000929 int i, j;
930 static const unsigned char iCode[] = {
931 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
932 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
933 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
934 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
935 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
936 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
937 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
938 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
939 };
940 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000941 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000942 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000943 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
944 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000945 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000946 zResult[0] = toupper(zIn[i]);
947 for(j=1; j<4 && zIn[i]; i++){
948 int code = iCode[zIn[i]&0x7f];
949 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000950 if( code!=prevcode ){
951 prevcode = code;
952 zResult[j++] = code + '0';
953 }
954 }else{
955 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000956 }
957 }
958 while( j<4 ){
959 zResult[j++] = '0';
960 }
961 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000962 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000963 }else{
danielk1977d8123362004-06-12 09:25:12 +0000964 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000965 }
966}
967#endif
968
drhfdb83b22006-06-17 14:12:47 +0000969#ifndef SQLITE_OMIT_LOAD_EXTENSION
970/*
971** A function that loads a shared-library extension then returns NULL.
972*/
973static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +0000974 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000975 const char *zProc;
drhfdb83b22006-06-17 14:12:47 +0000976 sqlite3 *db = sqlite3_user_data(context);
977 char *zErrMsg = 0;
978
979 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +0000980 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +0000981 }else{
982 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +0000983 }
drh7a521cf2007-04-25 18:23:52 +0000984 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +0000985 sqlite3_result_error(context, zErrMsg, -1);
986 sqlite3_free(zErrMsg);
987 }
988}
989#endif
990
drh193a6b42002-07-07 16:52:46 +0000991#ifdef SQLITE_TEST
992/*
993** This function generates a string of random characters. Used for
994** generating test data.
995*/
danielk19770ae8b832004-05-25 12:05:56 +0000996static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +0000997 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +0000998 "abcdefghijklmnopqrstuvwxyz"
999 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
1000 "0123456789"
1001 ".-!,:*^+=_|?/<> ";
1002 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +00001003 unsigned char zBuf[1000];
drh193a6b42002-07-07 16:52:46 +00001004 if( argc>=1 ){
drhf9b596e2004-05-26 16:54:42 +00001005 iMin = sqlite3_value_int(argv[0]);
drh193a6b42002-07-07 16:52:46 +00001006 if( iMin<0 ) iMin = 0;
1007 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
1008 }else{
1009 iMin = 1;
1010 }
1011 if( argc>=2 ){
drhf9b596e2004-05-26 16:54:42 +00001012 iMax = sqlite3_value_int(argv[1]);
drh193a6b42002-07-07 16:52:46 +00001013 if( iMax<iMin ) iMax = iMin;
drh1dba7272004-01-16 13:58:18 +00001014 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +00001015 }else{
1016 iMax = 50;
1017 }
1018 n = iMin;
1019 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +00001020 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +00001021 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +00001022 n += r%(iMax + 1 - iMin);
1023 }
drh1dba7272004-01-16 13:58:18 +00001024 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +00001025 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +00001026 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +00001027 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +00001028 }
1029 zBuf[n] = 0;
drh2646da72005-12-09 20:02:05 +00001030 sqlite3_result_text(context, (char*)zBuf, n, SQLITE_TRANSIENT);
danielk1977d8123362004-06-12 09:25:12 +00001031}
drh0e3d7472004-06-19 17:33:07 +00001032#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +00001033
drh0e3d7472004-06-19 17:33:07 +00001034#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +00001035/*
1036** The following two SQL functions are used to test returning a text
1037** result with a destructor. Function 'test_destructor' takes one argument
1038** and returns the same argument interpreted as TEXT. A destructor is
1039** passed with the sqlite3_result_text() call.
1040**
1041** SQL function 'test_destructor_count' returns the number of outstanding
1042** allocations made by 'test_destructor';
1043**
1044** WARNING: Not threadsafe.
1045*/
1046static int test_destructor_count_var = 0;
1047static void destructor(void *p){
1048 char *zVal = (char *)p;
1049 assert(zVal);
1050 zVal--;
1051 sqliteFree(zVal);
1052 test_destructor_count_var--;
1053}
1054static void test_destructor(
1055 sqlite3_context *pCtx,
1056 int nArg,
1057 sqlite3_value **argv
1058){
1059 char *zVal;
danielk1977f4618892004-06-28 13:09:11 +00001060 int len;
drh9bb575f2004-09-06 17:24:11 +00001061 sqlite3 *db = sqlite3_user_data(pCtx);
danielk1977f4618892004-06-28 13:09:11 +00001062
danielk1977d8123362004-06-12 09:25:12 +00001063 test_destructor_count_var++;
1064 assert( nArg==1 );
1065 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
danielk197714db2662006-01-09 16:12:04 +00001066 len = sqlite3ValueBytes(argv[0], ENC(db));
danielk1977f4618892004-06-28 13:09:11 +00001067 zVal = sqliteMalloc(len+3);
1068 zVal[len] = 0;
1069 zVal[len-1] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001070 assert( zVal );
1071 zVal++;
danielk197714db2662006-01-09 16:12:04 +00001072 memcpy(zVal, sqlite3ValueText(argv[0], ENC(db)), len);
1073 if( ENC(db)==SQLITE_UTF8 ){
danielk1977f4618892004-06-28 13:09:11 +00001074 sqlite3_result_text(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001075#ifndef SQLITE_OMIT_UTF16
danielk197714db2662006-01-09 16:12:04 +00001076 }else if( ENC(db)==SQLITE_UTF16LE ){
danielk1977f4618892004-06-28 13:09:11 +00001077 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
1078 }else{
1079 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001080#endif /* SQLITE_OMIT_UTF16 */
danielk1977f4618892004-06-28 13:09:11 +00001081 }
danielk1977d8123362004-06-12 09:25:12 +00001082}
1083static void test_destructor_count(
1084 sqlite3_context *pCtx,
1085 int nArg,
1086 sqlite3_value **argv
1087){
1088 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +00001089}
drh0e3d7472004-06-19 17:33:07 +00001090#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +00001091
drh0e3d7472004-06-19 17:33:07 +00001092#ifdef SQLITE_TEST
1093/*
1094** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
1095** interface.
1096**
1097** The test_auxdata() SQL function attempts to register each of its arguments
1098** as auxiliary data. If there are no prior registrations of aux data for
1099** that argument (meaning the argument is not a constant or this is its first
1100** call) then the result for that argument is 0. If there is a prior
1101** registration, the result for that argument is 1. The overall result
1102** is the individual argument results separated by spaces.
1103*/
danielk19773f6b0872004-06-17 05:36:44 +00001104static void free_test_auxdata(void *p) {sqliteFree(p);}
1105static void test_auxdata(
1106 sqlite3_context *pCtx,
1107 int nArg,
1108 sqlite3_value **argv
1109){
1110 int i;
1111 char *zRet = sqliteMalloc(nArg*2);
1112 if( !zRet ) return;
1113 for(i=0; i<nArg; i++){
drh2646da72005-12-09 20:02:05 +00001114 char const *z = (char*)sqlite3_value_text(argv[i]);
danielk19773f6b0872004-06-17 05:36:44 +00001115 if( z ){
1116 char *zAux = sqlite3_get_auxdata(pCtx, i);
1117 if( zAux ){
1118 zRet[i*2] = '1';
1119 if( strcmp(zAux, z) ){
1120 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
1121 return;
1122 }
1123 }else{
1124 zRet[i*2] = '0';
1125 zAux = sqliteStrDup(z);
1126 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
1127 }
1128 zRet[i*2+1] = ' ';
1129 }
1130 }
1131 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
1132}
drh0e3d7472004-06-19 17:33:07 +00001133#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +00001134
danielk197701427a62005-01-11 13:02:33 +00001135#ifdef SQLITE_TEST
1136/*
1137** A function to test error reporting from user functions. This function
1138** returns a copy of it's first argument as an error.
1139*/
1140static void test_error(
1141 sqlite3_context *pCtx,
1142 int nArg,
1143 sqlite3_value **argv
1144){
drh2646da72005-12-09 20:02:05 +00001145 sqlite3_result_error(pCtx, (char*)sqlite3_value_text(argv[0]), 0);
danielk197701427a62005-01-11 13:02:33 +00001146}
1147#endif /* SQLITE_TEST */
1148
drh0ac65892002-04-20 14:24:41 +00001149/*
drhd3a149e2002-02-24 17:12:53 +00001150** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001151** sum() or avg() aggregate computation.
1152*/
1153typedef struct SumCtx SumCtx;
1154struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001155 double rSum; /* Floating point sum */
1156 i64 iSum; /* Integer sum */
1157 i64 cnt; /* Number of elements summed */
1158 u8 overflow; /* True if integer overflow seen */
1159 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001160};
1161
1162/*
drha97fdd32006-01-12 22:17:50 +00001163** Routines used to compute the sum, average, and total.
1164**
1165** The SUM() function follows the (broken) SQL standard which means
1166** that it returns NULL if it sums over no inputs. TOTAL returns
1167** 0.0 in that case. In addition, TOTAL always returns a float where
1168** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001169** value. TOTAL never fails, but SUM might through an exception if
1170** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001171*/
danielk19770ae8b832004-05-25 12:05:56 +00001172static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001173 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001174 int type;
drh3f219f42005-09-08 19:45:57 +00001175 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +00001176 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001177 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001178 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001179 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001180 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001181 i64 v = sqlite3_value_int64(argv[0]);
1182 p->rSum += v;
1183 if( (p->approx|p->overflow)==0 ){
1184 i64 iNewSum = p->iSum + v;
1185 int s1 = p->iSum >> (sizeof(i64)*8-1);
1186 int s2 = v >> (sizeof(i64)*8-1);
1187 int s3 = iNewSum >> (sizeof(i64)*8-1);
1188 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
1189 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001190 }
1191 }else{
drh8c08e862006-02-11 17:34:00 +00001192 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001193 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001194 }
drh739105c2002-05-29 23:22:23 +00001195 }
drhdd5baa92002-02-27 19:50:59 +00001196}
danielk19770ae8b832004-05-25 12:05:56 +00001197static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001198 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001199 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001200 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001201 if( p->overflow ){
1202 sqlite3_result_error(context,"integer overflow",-1);
1203 }else if( p->approx ){
1204 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001205 }else{
drh8c08e862006-02-11 17:34:00 +00001206 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001207 }
drh3d1d95e2005-09-08 10:37:01 +00001208 }
drhdd5baa92002-02-27 19:50:59 +00001209}
danielk19770ae8b832004-05-25 12:05:56 +00001210static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001211 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001212 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001213 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001214 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001215 }
1216}
drha97fdd32006-01-12 22:17:50 +00001217static void totalFinalize(sqlite3_context *context){
1218 SumCtx *p;
1219 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001220 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001221}
drhdd5baa92002-02-27 19:50:59 +00001222
1223/*
drh0bce8352002-02-28 00:41:10 +00001224** The following structure keeps track of state information for the
1225** count() aggregate function.
1226*/
1227typedef struct CountCtx CountCtx;
1228struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001229 i64 n;
drh0bce8352002-02-28 00:41:10 +00001230};
drhdd5baa92002-02-27 19:50:59 +00001231
drh0bce8352002-02-28 00:41:10 +00001232/*
1233** Routines to implement the count() aggregate function.
1234*/
danielk19770ae8b832004-05-25 12:05:56 +00001235static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001236 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001237 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001238 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001239 p->n++;
1240 }
1241}
danielk19770ae8b832004-05-25 12:05:56 +00001242static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001243 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001244 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001245 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001246}
1247
1248/*
drh0bce8352002-02-28 00:41:10 +00001249** Routines to implement min() and max() aggregate functions.
1250*/
danielk19770ae8b832004-05-25 12:05:56 +00001251static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +00001252 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001253 Mem *pBest;
1254
1255 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1256 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001257 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001258
danielk197788208052004-05-25 01:13:20 +00001259 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001260 int max;
1261 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001262 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001263 /* This step function is used for both the min() and max() aggregates,
1264 ** the only difference between the two being that the sense of the
1265 ** comparison is inverted. For the max() aggregate, the
1266 ** sqlite3_user_data() function returns (void *)-1. For min() it
1267 ** returns (void *)db, where db is the sqlite3* database pointer.
1268 ** Therefore the next statement sets variable 'max' to 1 for the max()
1269 ** aggregate, or 0 for min().
1270 */
drh309b3382007-03-17 17:52:42 +00001271 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001272 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001273 if( (max && cmp<0) || (!max && cmp>0) ){
danielk19777e18c252004-05-25 11:47:24 +00001274 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001275 }
drh268380c2004-02-25 13:47:31 +00001276 }else{
danielk19777e18c252004-05-25 11:47:24 +00001277 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001278 }
1279}
danielk19770ae8b832004-05-25 12:05:56 +00001280static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001281 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001282 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1283 if( pRes ){
1284 if( pRes->flags ){
1285 sqlite3_result_value(context, pRes);
1286 }
1287 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001288 }
1289}
drhdd5baa92002-02-27 19:50:59 +00001290
drh4e5ffc52004-08-31 00:52:37 +00001291
drhd3a149e2002-02-24 17:12:53 +00001292/*
drha2ed5602002-02-26 23:55:31 +00001293** This function registered all of the above C functions as SQL
1294** functions. This should be the only routine in this file with
1295** external linkage.
drhdc04c582002-02-24 01:55:15 +00001296*/
drh9bb575f2004-09-06 17:24:11 +00001297void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001298 static const struct {
drh0bce8352002-02-28 00:41:10 +00001299 char *zName;
drh268380c2004-02-25 13:47:31 +00001300 signed char nArg;
drh309b3382007-03-17 17:52:42 +00001301 u8 argType; /* ff: db 1: 0, 2: 1, 3: 2,... N: N-1. */
danielk1977f4618892004-06-28 13:09:11 +00001302 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001303 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001304 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001305 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001306 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1307 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
drh309b3382007-03-17 17:52:42 +00001308 { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc },
1309 { "max", 0, 1, SQLITE_UTF8, 1, 0 },
danielk1977f4618892004-06-28 13:09:11 +00001310 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1311 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
1312 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
drh6c626082004-11-14 21:56:29 +00001313#ifndef SQLITE_OMIT_UTF16
drhee858132007-05-08 20:37:38 +00001314 { "substr", 3, 0, SQLITE_UTF16LE, 0, sqlite3Utf16Substr },
drh6c626082004-11-14 21:56:29 +00001315#endif
danielk1977f4618892004-06-28 13:09:11 +00001316 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1317 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1318 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1319 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1320 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1321 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1322 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1323 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
drh137c7282007-01-29 17:58:28 +00001324 { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc },
danielk1977f4618892004-06-28 13:09:11 +00001325 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1326 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
drh137c7282007-01-29 17:58:28 +00001327 { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob },
drh94a98362004-09-13 13:13:18 +00001328 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001329 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1330 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
drh309b3382007-03-17 17:52:42 +00001331 { "last_insert_rowid", 0, 0xff, SQLITE_UTF8, 0, last_insert_rowid },
1332 { "changes", 0, 0xff, SQLITE_UTF8, 0, changes },
1333 { "total_changes", 0, 0xff, SQLITE_UTF8, 0, total_changes },
drh26b6d902007-03-17 13:27:54 +00001334 { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc },
drh309b3382007-03-17 17:52:42 +00001335 { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc },
1336 { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc },
1337 { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc },
1338 { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc },
1339 { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc },
1340 { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc },
drh8cff3822007-05-02 02:08:28 +00001341 { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc },
drhd24cc422003-03-27 12:51:24 +00001342#ifdef SQLITE_SOUNDEX
drh309b3382007-03-17 17:52:42 +00001343 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001344#endif
drhfdb83b22006-06-17 14:12:47 +00001345#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh309b3382007-03-17 17:52:42 +00001346 { "load_extension", 1, 0xff, SQLITE_UTF8, 0, loadExt },
1347 { "load_extension", 2, 0xff, SQLITE_UTF8, 0, loadExt },
drhfdb83b22006-06-17 14:12:47 +00001348#endif
drh193a6b42002-07-07 16:52:46 +00001349#ifdef SQLITE_TEST
drh309b3382007-03-17 17:52:42 +00001350 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1351 { "test_destructor", 1, 0xff, SQLITE_UTF8, 0, test_destructor},
1352 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
1353 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
1354 { "test_error", 1, 0, SQLITE_UTF8, 0, test_error},
drh193a6b42002-07-07 16:52:46 +00001355#endif
drh0bce8352002-02-28 00:41:10 +00001356 };
drh57196282004-10-06 15:41:16 +00001357 static const struct {
drh0bce8352002-02-28 00:41:10 +00001358 char *zName;
drh268380c2004-02-25 13:47:31 +00001359 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001360 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001361 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001362 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1363 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001364 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001365 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
drh309b3382007-03-17 17:52:42 +00001366 { "max", 1, 1, 1, minmaxStep, minMaxFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001367 { "sum", 1, 0, 0, sumStep, sumFinalize },
drha97fdd32006-01-12 22:17:50 +00001368 { "total", 1, 0, 0, sumStep, totalFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001369 { "avg", 1, 0, 0, sumStep, avgFinalize },
1370 { "count", 0, 0, 0, countStep, countFinalize },
1371 { "count", 1, 0, 0, countStep, countFinalize },
drh0bce8352002-02-28 00:41:10 +00001372 };
1373 int i;
1374
1375 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001376 void *pArg;
1377 u8 argType = aFuncs[i].argType;
1378 if( argType==0xff ){
1379 pArg = db;
1380 }else{
1381 pArg = (void*)(int)argType;
danielk1977c572ef72004-05-27 09:28:41 +00001382 }
danielk1977771151b2006-01-17 13:21:40 +00001383 sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001384 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001385 if( aFuncs[i].needCollSeq ){
1386 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1387 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1388 if( pFunc && aFuncs[i].needCollSeq ){
1389 pFunc->needCollSeq = 1;
1390 }
1391 }
drh0bce8352002-02-28 00:41:10 +00001392 }
drh1f01ec12005-02-15 21:36:18 +00001393#ifndef SQLITE_OMIT_ALTERTABLE
1394 sqlite3AlterFunctions(db);
1395#endif
drh198bf392006-01-06 21:52:49 +00001396#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001397 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001398#endif
drh0bce8352002-02-28 00:41:10 +00001399 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001400 void *pArg = (void*)(int)aAggs[i].argType;
danielk1977771151b2006-01-17 13:21:40 +00001401 sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001402 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001403 if( aAggs[i].needCollSeq ){
1404 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001405 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001406 if( pFunc && aAggs[i].needCollSeq ){
1407 pFunc->needCollSeq = 1;
1408 }
1409 }
drh268380c2004-02-25 13:47:31 +00001410 }
danielk19774adee202004-05-08 08:23:19 +00001411 sqlite3RegisterDateTimeFunctions(db);
drhb7481e72006-09-16 21:45:14 +00001412 sqlite3_overload_function(db, "MATCH", 2);
danielk1977fd9e1f32005-05-22 10:44:34 +00001413#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001414 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001415#endif
drh55ef4d92005-08-14 01:20:37 +00001416#ifdef SQLITE_CASE_SENSITIVE_LIKE
1417 sqlite3RegisterLikeFunctions(db, 1);
1418#else
1419 sqlite3RegisterLikeFunctions(db, 0);
1420#endif
1421}
1422
1423/*
1424** Set the LIKEOPT flag on the 2-argument function with the given name.
1425*/
drhd64fe2f2005-08-28 17:00:23 +00001426static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001427 FuncDef *pDef;
1428 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1429 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001430 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001431 }
1432}
1433
1434/*
1435** Register the built-in LIKE and GLOB functions. The caseSensitive
1436** parameter determines whether or not the LIKE operator is case
1437** sensitive. GLOB is always case sensitive.
1438*/
1439void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1440 struct compareInfo *pInfo;
1441 if( caseSensitive ){
1442 pInfo = (struct compareInfo*)&likeInfoAlt;
1443 }else{
1444 pInfo = (struct compareInfo*)&likeInfoNorm;
1445 }
danielk1977771151b2006-01-17 13:21:40 +00001446 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1447 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1448 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001449 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001450 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1451 setLikeOptFlag(db, "like",
1452 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001453}
1454
1455/*
1456** pExpr points to an expression which implements a function. If
1457** it is appropriate to apply the LIKE optimization to that function
1458** then set aWc[0] through aWc[2] to the wildcard characters and
1459** return TRUE. If the function is not a LIKE-style function then
1460** return FALSE.
1461*/
drhd64fe2f2005-08-28 17:00:23 +00001462int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001463 FuncDef *pDef;
danielk1977cdbd8ef2007-05-12 06:11:12 +00001464 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
drh55ef4d92005-08-14 01:20:37 +00001465 return 0;
1466 }
1467 if( pExpr->pList->nExpr!=2 ){
1468 return 0;
1469 }
drh2646da72005-12-09 20:02:05 +00001470 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001471 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001472 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001473 return 0;
1474 }
1475
1476 /* The memcpy() statement assumes that the wildcard characters are
1477 ** the first three statements in the compareInfo structure. The
1478 ** asserts() that follow verify that assumption
1479 */
1480 memcpy(aWc, pDef->pUserData, 3);
1481 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1482 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1483 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001484 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001485 return 1;
drhdc04c582002-02-24 01:55:15 +00001486}