blob: c836ebe5bd17c004f22503bdca82bf336a68645e [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**
drh98640a32007-06-07 19:08:32 +000019** $Id: func.c,v 1.160 2007/06/07 19:08:33 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){
drh98640a32007-06-07 19:08:32 +0000759 i64 n;
drh8cff3822007-05-02 02:08:28 +0000760 assert( argc==1 );
drh98640a32007-06-07 19:08:32 +0000761 n = sqlite3_value_int64(argv[0]);
762 if( n>SQLITE_MAX_LENGTH ){
763 sqlite3_result_error_toobig(context);
764 }else{
765 sqlite3_result_zeroblob(context, n);
766 }
drh8cff3822007-05-02 02:08:28 +0000767}
768
769/*
drh26b6d902007-03-17 13:27:54 +0000770** The replace() function. Three arguments are all strings: call
771** them A, B, and C. The result is also a string which is derived
772** from A by replacing every occurance of B with C. The match
773** must be exact. Collating sequences are not used.
774*/
775static void replaceFunc(
776 sqlite3_context *context,
777 int argc,
778 sqlite3_value **argv
779){
780 const unsigned char *zStr; /* The input string A */
781 const unsigned char *zPattern; /* The pattern string B */
782 const unsigned char *zRep; /* The replacement string C */
783 unsigned char *zOut; /* The output */
784 int nStr; /* Size of zStr */
785 int nPattern; /* Size of zPattern */
786 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000787 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000788 int loopLimit; /* Last zStr[] that might match zPattern[] */
789 int i, j; /* Loop counters */
790
791 assert( argc==3 );
drh26b6d902007-03-17 13:27:54 +0000792 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000793 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000794 nStr = sqlite3_value_bytes(argv[0]);
795 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000796 zPattern = sqlite3_value_text(argv[1]);
drh709cff32007-04-27 01:18:02 +0000797 if( zPattern==0 || zPattern[0]==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000798 nPattern = sqlite3_value_bytes(argv[1]);
799 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000800 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000801 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000802 nRep = sqlite3_value_bytes(argv[2]);
803 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000804 nOut = nStr + 1;
805 assert( nOut<SQLITE_MAX_LENGTH );
806 zOut = sqlite3_malloc((int)nOut);
807 if( zOut==0 ){
808 return;
drh26b6d902007-03-17 13:27:54 +0000809 }
drh26b6d902007-03-17 13:27:54 +0000810 loopLimit = nStr - nPattern;
811 for(i=j=0; i<=loopLimit; i++){
812 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
813 zOut[j++] = zStr[i];
814 }else{
drh2e6400b2007-05-08 15:46:18 +0000815 nOut += nRep - nPattern;
816 if( nOut>=SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000817 sqlite3_result_error_toobig(context);
danielk197717374e82007-05-08 14:39:04 +0000818 sqlite3_free(zOut);
819 return;
820 }
drh2e6400b2007-05-08 15:46:18 +0000821 zOut = sqlite3_realloc(zOut, (int)nOut);
822 if( zOut==0 ){
823 return;
824 }
drh26b6d902007-03-17 13:27:54 +0000825 memcpy(&zOut[j], zRep, nRep);
826 j += nRep;
827 i += nPattern-1;
828 }
829 }
drh2e6400b2007-05-08 15:46:18 +0000830 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000831 memcpy(&zOut[j], &zStr[i], nStr-i);
832 j += nStr - i;
833 assert( j<=nOut );
834 zOut[j] = 0;
835 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
836}
837
drh309b3382007-03-17 17:52:42 +0000838/*
839** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
840** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
841*/
842static void trimFunc(
843 sqlite3_context *context,
844 int argc,
845 sqlite3_value **argv
846){
847 const unsigned char *zIn; /* Input string */
848 const unsigned char *zCharSet; /* Set of characters to trim */
849 int nIn; /* Number of bytes in input */
drhd1e3a612007-04-27 21:59:52 +0000850 int flags; /* 1: trimleft 2: trimright 3: trim */
851 int i; /* Loop counter */
852 unsigned char *aLen; /* Length of each character in zCharSet */
853 const unsigned char **azChar; /* Individual characters in zCharSet */
854 int nChar; /* Number of characters in zCharSet */
855
drh309b3382007-03-17 17:52:42 +0000856 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
857 return;
858 }
859 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000860 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000861 nIn = sqlite3_value_bytes(argv[0]);
862 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000863 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000864 static const unsigned char lenOne[] = { 1 };
drh8cff3822007-05-02 02:08:28 +0000865 static const unsigned char *azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000866 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000867 aLen = (u8*)lenOne;
868 azChar = azOne;
drhd1e3a612007-04-27 21:59:52 +0000869 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000870 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000871 return;
drhd1e3a612007-04-27 21:59:52 +0000872 }else{
873 const unsigned char *z;
874 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000875 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000876 }
877 if( nChar>0 ){
878 azChar = sqlite3_malloc( nChar*(sizeof(char*)+1) );
879 if( azChar==0 ){
880 return;
881 }
882 aLen = (unsigned char*)&azChar[nChar];
883 for(z=zCharSet, nChar=0; *z; nChar++){
884 azChar[nChar] = z;
drh4a919112007-05-15 11:55:09 +0000885 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000886 aLen[nChar] = z - azChar[nChar];
887 }
888 }
drh309b3382007-03-17 17:52:42 +0000889 }
drhd1e3a612007-04-27 21:59:52 +0000890 if( nChar>0 ){
drh309b3382007-03-17 17:52:42 +0000891 flags = (int)sqlite3_user_data(context);
892 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000893 while( nIn>0 ){
894 int len;
895 for(i=0; i<nChar; i++){
896 len = aLen[i];
897 if( memcmp(zIn, azChar[i], len)==0 ) break;
898 }
899 if( i>=nChar ) break;
900 zIn += len;
901 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000902 }
903 }
904 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000905 while( nIn>0 ){
906 int len;
907 for(i=0; i<nChar; i++){
908 len = aLen[i];
909 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
910 }
911 if( i>=nChar ) break;
912 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000913 }
914 }
drhd1e3a612007-04-27 21:59:52 +0000915 if( zCharSet ){
916 sqlite3_free(azChar);
917 }
drh309b3382007-03-17 17:52:42 +0000918 }
919 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
920}
drh26b6d902007-03-17 13:27:54 +0000921
drhd24cc422003-03-27 12:51:24 +0000922#ifdef SQLITE_SOUNDEX
923/*
924** Compute the soundex encoding of a word.
925*/
drh137c7282007-01-29 17:58:28 +0000926static void soundexFunc(
927 sqlite3_context *context,
928 int argc,
929 sqlite3_value **argv
930){
drhd24cc422003-03-27 12:51:24 +0000931 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000932 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000933 int i, j;
934 static const unsigned char iCode[] = {
935 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
936 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
937 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
938 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
939 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
940 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
941 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
942 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
943 };
944 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000945 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000946 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000947 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
948 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000949 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000950 zResult[0] = toupper(zIn[i]);
951 for(j=1; j<4 && zIn[i]; i++){
952 int code = iCode[zIn[i]&0x7f];
953 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000954 if( code!=prevcode ){
955 prevcode = code;
956 zResult[j++] = code + '0';
957 }
958 }else{
959 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000960 }
961 }
962 while( j<4 ){
963 zResult[j++] = '0';
964 }
965 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000966 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000967 }else{
danielk1977d8123362004-06-12 09:25:12 +0000968 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000969 }
970}
971#endif
972
drhfdb83b22006-06-17 14:12:47 +0000973#ifndef SQLITE_OMIT_LOAD_EXTENSION
974/*
975** A function that loads a shared-library extension then returns NULL.
976*/
977static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +0000978 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000979 const char *zProc;
drhfdb83b22006-06-17 14:12:47 +0000980 sqlite3 *db = sqlite3_user_data(context);
981 char *zErrMsg = 0;
982
983 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +0000984 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +0000985 }else{
986 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +0000987 }
drh7a521cf2007-04-25 18:23:52 +0000988 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +0000989 sqlite3_result_error(context, zErrMsg, -1);
990 sqlite3_free(zErrMsg);
991 }
992}
993#endif
994
drh193a6b42002-07-07 16:52:46 +0000995#ifdef SQLITE_TEST
996/*
997** This function generates a string of random characters. Used for
998** generating test data.
999*/
danielk19770ae8b832004-05-25 12:05:56 +00001000static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +00001001 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +00001002 "abcdefghijklmnopqrstuvwxyz"
1003 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
1004 "0123456789"
1005 ".-!,:*^+=_|?/<> ";
1006 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +00001007 unsigned char zBuf[1000];
drh193a6b42002-07-07 16:52:46 +00001008 if( argc>=1 ){
drhf9b596e2004-05-26 16:54:42 +00001009 iMin = sqlite3_value_int(argv[0]);
drh193a6b42002-07-07 16:52:46 +00001010 if( iMin<0 ) iMin = 0;
1011 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
1012 }else{
1013 iMin = 1;
1014 }
1015 if( argc>=2 ){
drhf9b596e2004-05-26 16:54:42 +00001016 iMax = sqlite3_value_int(argv[1]);
drh193a6b42002-07-07 16:52:46 +00001017 if( iMax<iMin ) iMax = iMin;
drh1dba7272004-01-16 13:58:18 +00001018 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +00001019 }else{
1020 iMax = 50;
1021 }
1022 n = iMin;
1023 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +00001024 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +00001025 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +00001026 n += r%(iMax + 1 - iMin);
1027 }
drh1dba7272004-01-16 13:58:18 +00001028 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +00001029 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +00001030 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +00001031 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +00001032 }
1033 zBuf[n] = 0;
drh2646da72005-12-09 20:02:05 +00001034 sqlite3_result_text(context, (char*)zBuf, n, SQLITE_TRANSIENT);
danielk1977d8123362004-06-12 09:25:12 +00001035}
drh0e3d7472004-06-19 17:33:07 +00001036#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +00001037
drh0e3d7472004-06-19 17:33:07 +00001038#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +00001039/*
1040** The following two SQL functions are used to test returning a text
1041** result with a destructor. Function 'test_destructor' takes one argument
1042** and returns the same argument interpreted as TEXT. A destructor is
1043** passed with the sqlite3_result_text() call.
1044**
1045** SQL function 'test_destructor_count' returns the number of outstanding
1046** allocations made by 'test_destructor';
1047**
1048** WARNING: Not threadsafe.
1049*/
1050static int test_destructor_count_var = 0;
1051static void destructor(void *p){
1052 char *zVal = (char *)p;
1053 assert(zVal);
1054 zVal--;
1055 sqliteFree(zVal);
1056 test_destructor_count_var--;
1057}
1058static void test_destructor(
1059 sqlite3_context *pCtx,
1060 int nArg,
1061 sqlite3_value **argv
1062){
1063 char *zVal;
danielk1977f4618892004-06-28 13:09:11 +00001064 int len;
drh9bb575f2004-09-06 17:24:11 +00001065 sqlite3 *db = sqlite3_user_data(pCtx);
danielk1977f4618892004-06-28 13:09:11 +00001066
danielk1977d8123362004-06-12 09:25:12 +00001067 test_destructor_count_var++;
1068 assert( nArg==1 );
1069 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
danielk197714db2662006-01-09 16:12:04 +00001070 len = sqlite3ValueBytes(argv[0], ENC(db));
danielk1977f4618892004-06-28 13:09:11 +00001071 zVal = sqliteMalloc(len+3);
1072 zVal[len] = 0;
1073 zVal[len-1] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001074 assert( zVal );
1075 zVal++;
danielk197714db2662006-01-09 16:12:04 +00001076 memcpy(zVal, sqlite3ValueText(argv[0], ENC(db)), len);
1077 if( ENC(db)==SQLITE_UTF8 ){
danielk1977f4618892004-06-28 13:09:11 +00001078 sqlite3_result_text(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001079#ifndef SQLITE_OMIT_UTF16
danielk197714db2662006-01-09 16:12:04 +00001080 }else if( ENC(db)==SQLITE_UTF16LE ){
danielk1977f4618892004-06-28 13:09:11 +00001081 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
1082 }else{
1083 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001084#endif /* SQLITE_OMIT_UTF16 */
danielk1977f4618892004-06-28 13:09:11 +00001085 }
danielk1977d8123362004-06-12 09:25:12 +00001086}
1087static void test_destructor_count(
1088 sqlite3_context *pCtx,
1089 int nArg,
1090 sqlite3_value **argv
1091){
1092 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +00001093}
drh0e3d7472004-06-19 17:33:07 +00001094#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +00001095
drh0e3d7472004-06-19 17:33:07 +00001096#ifdef SQLITE_TEST
1097/*
1098** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
1099** interface.
1100**
1101** The test_auxdata() SQL function attempts to register each of its arguments
1102** as auxiliary data. If there are no prior registrations of aux data for
1103** that argument (meaning the argument is not a constant or this is its first
1104** call) then the result for that argument is 0. If there is a prior
1105** registration, the result for that argument is 1. The overall result
1106** is the individual argument results separated by spaces.
1107*/
danielk19773f6b0872004-06-17 05:36:44 +00001108static void free_test_auxdata(void *p) {sqliteFree(p);}
1109static void test_auxdata(
1110 sqlite3_context *pCtx,
1111 int nArg,
1112 sqlite3_value **argv
1113){
1114 int i;
1115 char *zRet = sqliteMalloc(nArg*2);
1116 if( !zRet ) return;
1117 for(i=0; i<nArg; i++){
drh2646da72005-12-09 20:02:05 +00001118 char const *z = (char*)sqlite3_value_text(argv[i]);
danielk19773f6b0872004-06-17 05:36:44 +00001119 if( z ){
1120 char *zAux = sqlite3_get_auxdata(pCtx, i);
1121 if( zAux ){
1122 zRet[i*2] = '1';
1123 if( strcmp(zAux, z) ){
1124 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
1125 return;
1126 }
1127 }else{
1128 zRet[i*2] = '0';
1129 zAux = sqliteStrDup(z);
1130 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
1131 }
1132 zRet[i*2+1] = ' ';
1133 }
1134 }
1135 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
1136}
drh0e3d7472004-06-19 17:33:07 +00001137#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +00001138
danielk197701427a62005-01-11 13:02:33 +00001139#ifdef SQLITE_TEST
1140/*
1141** A function to test error reporting from user functions. This function
1142** returns a copy of it's first argument as an error.
1143*/
1144static void test_error(
1145 sqlite3_context *pCtx,
1146 int nArg,
1147 sqlite3_value **argv
1148){
drh2646da72005-12-09 20:02:05 +00001149 sqlite3_result_error(pCtx, (char*)sqlite3_value_text(argv[0]), 0);
danielk197701427a62005-01-11 13:02:33 +00001150}
1151#endif /* SQLITE_TEST */
1152
drh0ac65892002-04-20 14:24:41 +00001153/*
drhd3a149e2002-02-24 17:12:53 +00001154** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001155** sum() or avg() aggregate computation.
1156*/
1157typedef struct SumCtx SumCtx;
1158struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001159 double rSum; /* Floating point sum */
1160 i64 iSum; /* Integer sum */
1161 i64 cnt; /* Number of elements summed */
1162 u8 overflow; /* True if integer overflow seen */
1163 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001164};
1165
1166/*
drha97fdd32006-01-12 22:17:50 +00001167** Routines used to compute the sum, average, and total.
1168**
1169** The SUM() function follows the (broken) SQL standard which means
1170** that it returns NULL if it sums over no inputs. TOTAL returns
1171** 0.0 in that case. In addition, TOTAL always returns a float where
1172** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001173** value. TOTAL never fails, but SUM might through an exception if
1174** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001175*/
danielk19770ae8b832004-05-25 12:05:56 +00001176static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001177 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001178 int type;
drh3f219f42005-09-08 19:45:57 +00001179 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +00001180 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001181 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001182 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001183 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001184 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001185 i64 v = sqlite3_value_int64(argv[0]);
1186 p->rSum += v;
1187 if( (p->approx|p->overflow)==0 ){
1188 i64 iNewSum = p->iSum + v;
1189 int s1 = p->iSum >> (sizeof(i64)*8-1);
1190 int s2 = v >> (sizeof(i64)*8-1);
1191 int s3 = iNewSum >> (sizeof(i64)*8-1);
1192 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
1193 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001194 }
1195 }else{
drh8c08e862006-02-11 17:34:00 +00001196 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001197 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001198 }
drh739105c2002-05-29 23:22:23 +00001199 }
drhdd5baa92002-02-27 19:50:59 +00001200}
danielk19770ae8b832004-05-25 12:05:56 +00001201static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001202 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001203 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001204 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001205 if( p->overflow ){
1206 sqlite3_result_error(context,"integer overflow",-1);
1207 }else if( p->approx ){
1208 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001209 }else{
drh8c08e862006-02-11 17:34:00 +00001210 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001211 }
drh3d1d95e2005-09-08 10:37:01 +00001212 }
drhdd5baa92002-02-27 19:50:59 +00001213}
danielk19770ae8b832004-05-25 12:05:56 +00001214static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001215 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001216 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001217 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001218 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001219 }
1220}
drha97fdd32006-01-12 22:17:50 +00001221static void totalFinalize(sqlite3_context *context){
1222 SumCtx *p;
1223 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001224 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001225}
drhdd5baa92002-02-27 19:50:59 +00001226
1227/*
drh0bce8352002-02-28 00:41:10 +00001228** The following structure keeps track of state information for the
1229** count() aggregate function.
1230*/
1231typedef struct CountCtx CountCtx;
1232struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001233 i64 n;
drh0bce8352002-02-28 00:41:10 +00001234};
drhdd5baa92002-02-27 19:50:59 +00001235
drh0bce8352002-02-28 00:41:10 +00001236/*
1237** Routines to implement the count() aggregate function.
1238*/
danielk19770ae8b832004-05-25 12:05:56 +00001239static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001240 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001241 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001242 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001243 p->n++;
1244 }
1245}
danielk19770ae8b832004-05-25 12:05:56 +00001246static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001247 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001248 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001249 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001250}
1251
1252/*
drh0bce8352002-02-28 00:41:10 +00001253** Routines to implement min() and max() aggregate functions.
1254*/
danielk19770ae8b832004-05-25 12:05:56 +00001255static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +00001256 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001257 Mem *pBest;
1258
1259 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1260 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001261 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001262
danielk197788208052004-05-25 01:13:20 +00001263 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001264 int max;
1265 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001266 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001267 /* This step function is used for both the min() and max() aggregates,
1268 ** the only difference between the two being that the sense of the
1269 ** comparison is inverted. For the max() aggregate, the
1270 ** sqlite3_user_data() function returns (void *)-1. For min() it
1271 ** returns (void *)db, where db is the sqlite3* database pointer.
1272 ** Therefore the next statement sets variable 'max' to 1 for the max()
1273 ** aggregate, or 0 for min().
1274 */
drh309b3382007-03-17 17:52:42 +00001275 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001276 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001277 if( (max && cmp<0) || (!max && cmp>0) ){
danielk19777e18c252004-05-25 11:47:24 +00001278 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001279 }
drh268380c2004-02-25 13:47:31 +00001280 }else{
danielk19777e18c252004-05-25 11:47:24 +00001281 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001282 }
1283}
danielk19770ae8b832004-05-25 12:05:56 +00001284static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001285 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001286 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1287 if( pRes ){
1288 if( pRes->flags ){
1289 sqlite3_result_value(context, pRes);
1290 }
1291 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001292 }
1293}
drhdd5baa92002-02-27 19:50:59 +00001294
drh4e5ffc52004-08-31 00:52:37 +00001295
drhd3a149e2002-02-24 17:12:53 +00001296/*
drha2ed5602002-02-26 23:55:31 +00001297** This function registered all of the above C functions as SQL
1298** functions. This should be the only routine in this file with
1299** external linkage.
drhdc04c582002-02-24 01:55:15 +00001300*/
drh9bb575f2004-09-06 17:24:11 +00001301void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001302 static const struct {
drh0bce8352002-02-28 00:41:10 +00001303 char *zName;
drh268380c2004-02-25 13:47:31 +00001304 signed char nArg;
drh309b3382007-03-17 17:52:42 +00001305 u8 argType; /* ff: db 1: 0, 2: 1, 3: 2,... N: N-1. */
danielk1977f4618892004-06-28 13:09:11 +00001306 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001307 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001308 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001309 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001310 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1311 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
drh309b3382007-03-17 17:52:42 +00001312 { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc },
1313 { "max", 0, 1, SQLITE_UTF8, 1, 0 },
danielk1977f4618892004-06-28 13:09:11 +00001314 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1315 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
1316 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
danielk1977f4618892004-06-28 13:09:11 +00001317 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1318 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1319 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1320 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1321 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1322 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1323 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1324 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
drh137c7282007-01-29 17:58:28 +00001325 { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc },
danielk1977f4618892004-06-28 13:09:11 +00001326 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1327 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
drh137c7282007-01-29 17:58:28 +00001328 { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob },
drh94a98362004-09-13 13:13:18 +00001329 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001330 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1331 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
drh309b3382007-03-17 17:52:42 +00001332 { "last_insert_rowid", 0, 0xff, SQLITE_UTF8, 0, last_insert_rowid },
1333 { "changes", 0, 0xff, SQLITE_UTF8, 0, changes },
1334 { "total_changes", 0, 0xff, SQLITE_UTF8, 0, total_changes },
drh26b6d902007-03-17 13:27:54 +00001335 { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc },
drh309b3382007-03-17 17:52:42 +00001336 { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc },
1337 { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc },
1338 { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc },
1339 { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc },
1340 { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc },
1341 { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc },
drh8cff3822007-05-02 02:08:28 +00001342 { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc },
drhd24cc422003-03-27 12:51:24 +00001343#ifdef SQLITE_SOUNDEX
drh309b3382007-03-17 17:52:42 +00001344 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001345#endif
drhfdb83b22006-06-17 14:12:47 +00001346#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh309b3382007-03-17 17:52:42 +00001347 { "load_extension", 1, 0xff, SQLITE_UTF8, 0, loadExt },
1348 { "load_extension", 2, 0xff, SQLITE_UTF8, 0, loadExt },
drhfdb83b22006-06-17 14:12:47 +00001349#endif
drh193a6b42002-07-07 16:52:46 +00001350#ifdef SQLITE_TEST
drh309b3382007-03-17 17:52:42 +00001351 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1352 { "test_destructor", 1, 0xff, SQLITE_UTF8, 0, test_destructor},
1353 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
1354 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
1355 { "test_error", 1, 0, SQLITE_UTF8, 0, test_error},
drh193a6b42002-07-07 16:52:46 +00001356#endif
drh0bce8352002-02-28 00:41:10 +00001357 };
drh57196282004-10-06 15:41:16 +00001358 static const struct {
drh0bce8352002-02-28 00:41:10 +00001359 char *zName;
drh268380c2004-02-25 13:47:31 +00001360 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001361 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001362 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001363 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1364 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001365 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001366 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
drh309b3382007-03-17 17:52:42 +00001367 { "max", 1, 1, 1, minmaxStep, minMaxFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001368 { "sum", 1, 0, 0, sumStep, sumFinalize },
drha97fdd32006-01-12 22:17:50 +00001369 { "total", 1, 0, 0, sumStep, totalFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001370 { "avg", 1, 0, 0, sumStep, avgFinalize },
1371 { "count", 0, 0, 0, countStep, countFinalize },
1372 { "count", 1, 0, 0, countStep, countFinalize },
drh0bce8352002-02-28 00:41:10 +00001373 };
1374 int i;
1375
1376 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001377 void *pArg;
1378 u8 argType = aFuncs[i].argType;
1379 if( argType==0xff ){
1380 pArg = db;
1381 }else{
1382 pArg = (void*)(int)argType;
danielk1977c572ef72004-05-27 09:28:41 +00001383 }
danielk1977771151b2006-01-17 13:21:40 +00001384 sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001385 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001386 if( aFuncs[i].needCollSeq ){
1387 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1388 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1389 if( pFunc && aFuncs[i].needCollSeq ){
1390 pFunc->needCollSeq = 1;
1391 }
1392 }
drh0bce8352002-02-28 00:41:10 +00001393 }
drh1f01ec12005-02-15 21:36:18 +00001394#ifndef SQLITE_OMIT_ALTERTABLE
1395 sqlite3AlterFunctions(db);
1396#endif
drh198bf392006-01-06 21:52:49 +00001397#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001398 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001399#endif
drh0bce8352002-02-28 00:41:10 +00001400 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001401 void *pArg = (void*)(int)aAggs[i].argType;
danielk1977771151b2006-01-17 13:21:40 +00001402 sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001403 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001404 if( aAggs[i].needCollSeq ){
1405 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001406 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001407 if( pFunc && aAggs[i].needCollSeq ){
1408 pFunc->needCollSeq = 1;
1409 }
1410 }
drh268380c2004-02-25 13:47:31 +00001411 }
danielk19774adee202004-05-08 08:23:19 +00001412 sqlite3RegisterDateTimeFunctions(db);
drhb7481e72006-09-16 21:45:14 +00001413 sqlite3_overload_function(db, "MATCH", 2);
danielk1977fd9e1f32005-05-22 10:44:34 +00001414#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001415 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001416#endif
drh55ef4d92005-08-14 01:20:37 +00001417#ifdef SQLITE_CASE_SENSITIVE_LIKE
1418 sqlite3RegisterLikeFunctions(db, 1);
1419#else
1420 sqlite3RegisterLikeFunctions(db, 0);
1421#endif
1422}
1423
1424/*
1425** Set the LIKEOPT flag on the 2-argument function with the given name.
1426*/
drhd64fe2f2005-08-28 17:00:23 +00001427static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001428 FuncDef *pDef;
1429 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1430 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001431 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001432 }
1433}
1434
1435/*
1436** Register the built-in LIKE and GLOB functions. The caseSensitive
1437** parameter determines whether or not the LIKE operator is case
1438** sensitive. GLOB is always case sensitive.
1439*/
1440void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1441 struct compareInfo *pInfo;
1442 if( caseSensitive ){
1443 pInfo = (struct compareInfo*)&likeInfoAlt;
1444 }else{
1445 pInfo = (struct compareInfo*)&likeInfoNorm;
1446 }
danielk1977771151b2006-01-17 13:21:40 +00001447 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1448 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1449 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001450 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001451 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1452 setLikeOptFlag(db, "like",
1453 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001454}
1455
1456/*
1457** pExpr points to an expression which implements a function. If
1458** it is appropriate to apply the LIKE optimization to that function
1459** then set aWc[0] through aWc[2] to the wildcard characters and
1460** return TRUE. If the function is not a LIKE-style function then
1461** return FALSE.
1462*/
drhd64fe2f2005-08-28 17:00:23 +00001463int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001464 FuncDef *pDef;
danielk1977cdbd8ef2007-05-12 06:11:12 +00001465 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
drh55ef4d92005-08-14 01:20:37 +00001466 return 0;
1467 }
1468 if( pExpr->pList->nExpr!=2 ){
1469 return 0;
1470 }
drh2646da72005-12-09 20:02:05 +00001471 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001472 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001473 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001474 return 0;
1475 }
1476
1477 /* The memcpy() statement assumes that the wildcard characters are
1478 ** the first three statements in the compareInfo structure. The
1479 ** asserts() that follow verify that assumption
1480 */
1481 memcpy(aWc, pDef->pUserData, 3);
1482 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1483 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1484 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001485 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001486 return 1;
drhdc04c582002-02-24 01:55:15 +00001487}