blob: 2b51f232899ea1226f15c43a5ddc157eb02dbe3c [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**
drhf764e6f2007-05-15 01:13:47 +000019** $Id: func.c,v 1.156 2007/05/15 01:13:47 drh Exp $
drhdc04c582002-02-24 01:55:15 +000020*/
drhb659e9b2005-01-28 01:29:08 +000021#include "sqliteInt.h"
drhdc04c582002-02-24 01:55:15 +000022#include <ctype.h>
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;
drhf9b596e2004-05-26 16:54:42 +0000106 for(len=0; *z; z++){ if( (0xc0&*z)!=0x80 ) len++; }
drhf4479502004-05-27 03:12:53 +0000107 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000108 break;
109 }
110 default: {
111 sqlite3_result_null(context);
112 break;
113 }
114 }
drh0bce8352002-02-28 00:41:10 +0000115}
116
117/*
118** Implementation of the abs() function
119*/
danielk19770ae8b832004-05-25 12:05:56 +0000120static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000121 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +0000122 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000123 case SQLITE_INTEGER: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000124 i64 iVal = sqlite3_value_int64(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000125 if( iVal<0 ){
126 if( (iVal<<1)==0 ){
127 sqlite3_result_error(context, "integer overflow", -1);
128 return;
129 }
130 iVal = -iVal;
131 }
danielk1977f93bbbe2004-05-27 10:30:52 +0000132 sqlite3_result_int64(context, iVal);
drhf9b596e2004-05-26 16:54:42 +0000133 break;
134 }
drh9c054832004-05-31 18:51:57 +0000135 case SQLITE_NULL: {
drhf9b596e2004-05-26 16:54:42 +0000136 sqlite3_result_null(context);
137 break;
138 }
139 default: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000140 double rVal = sqlite3_value_double(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000141 if( rVal<0 ) rVal = -rVal;
danielk1977f93bbbe2004-05-27 10:30:52 +0000142 sqlite3_result_double(context, rVal);
drhf9b596e2004-05-26 16:54:42 +0000143 break;
144 }
145 }
drh0bce8352002-02-28 00:41:10 +0000146}
147
148/*
drhf764e6f2007-05-15 01:13:47 +0000149** Implementation of the substr() function.
150**
151** substr(x,p1,p2) returns p2 characters of x[] beginning with p1.
152** p1 is 1-indexed. So substr(x,1,1) returns the first character
153** of x. If x is text, then we actually count UTF-8 characters.
154** If x is a blob, then we count bytes.
155**
156** If p1 is negative, then we begin abs(p1) from the end of x[].
drh0bce8352002-02-28 00:41:10 +0000157*/
drhf9b596e2004-05-26 16:54:42 +0000158static void substrFunc(
159 sqlite3_context *context,
160 int argc,
161 sqlite3_value **argv
162){
drh2646da72005-12-09 20:02:05 +0000163 const unsigned char *z;
164 const unsigned char *z2;
drh0bce8352002-02-28 00:41:10 +0000165 int i;
drh023ae032007-05-08 12:12:16 +0000166 int len;
drhf764e6f2007-05-15 01:13:47 +0000167 int p0type;
drh023ae032007-05-08 12:12:16 +0000168 i64 p1, p2;
drhf9b596e2004-05-26 16:54:42 +0000169
drh0bce8352002-02-28 00:41:10 +0000170 assert( argc==3 );
drhf764e6f2007-05-15 01:13:47 +0000171 p0type = sqlite3_value_type(argv[0]);
172 if( p0type==SQLITE_BLOB ){
173 len = sqlite3_value_bytes(argv[0]);
174 z = sqlite3_value_blob(argv[0]);
175 if( z==0 ) return;
176 }else{
177 z = sqlite3_value_text(argv[0]);
178 if( z==0 ) return;
179 for(len=0, z2=z; *z2; z2++){ if( (0xc0&*z2)!=0x80 ) len++; }
180 }
danielk197751ad0ec2004-05-24 12:39:02 +0000181 p1 = sqlite3_value_int(argv[1]);
182 p2 = sqlite3_value_int(argv[2]);
drh0bce8352002-02-28 00:41:10 +0000183 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000184 p1 += len;
drh653bc752002-02-28 03:31:10 +0000185 if( p1<0 ){
186 p2 += p1;
187 p1 = 0;
188 }
drh0bce8352002-02-28 00:41:10 +0000189 }else if( p1>0 ){
190 p1--;
191 }
192 if( p1+p2>len ){
193 p2 = len-p1;
194 }
drhf764e6f2007-05-15 01:13:47 +0000195 if( p0type!=SQLITE_BLOB ){
196 for(i=0; i<p1 && z[i]; i++){
197 if( (z[i]&0xc0)==0x80 ) p1++;
198 }
199 while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p1++; }
200 for(; i<p1+p2 && z[i]; i++){
201 if( (z[i]&0xc0)==0x80 ) p2++;
202 }
203 while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p2++; }
204 if( p2<0 ) p2 = 0;
205 sqlite3_result_text(context, (char*)&z[p1], p2, SQLITE_TRANSIENT);
206 }else{
207 if( p2<0 ) p2 = 0;
208 sqlite3_result_blob(context, (char*)&z[p1], p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000209 }
drh0bce8352002-02-28 00:41:10 +0000210}
211
212/*
213** Implementation of the round() function
214*/
danielk19770ae8b832004-05-25 12:05:56 +0000215static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000216 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000217 double r;
drh592ac8c2005-08-13 03:07:47 +0000218 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000219 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000220 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000221 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000222 n = sqlite3_value_int(argv[1]);
223 if( n>30 ) n = 30;
224 if( n<0 ) n = 0;
225 }
drhd589a922006-03-02 03:02:48 +0000226 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000227 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000228 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000229 sqlite3AtoF(zBuf, &r);
230 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000231}
drhdc04c582002-02-24 01:55:15 +0000232
233/*
234** Implementation of the upper() and lower() SQL functions.
235*/
danielk19770ae8b832004-05-25 12:05:56 +0000236static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000237 char *z1;
238 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000239 int i, n;
drh9c054832004-05-31 18:51:57 +0000240 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh9310ef22007-04-27 17:16:20 +0000241 n = sqlite3_value_bytes(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000242 z2 = (char*)sqlite3_value_text(argv[0]);
243 if( z2 ){
drh9310ef22007-04-27 17:16:20 +0000244 z1 = sqlite3_malloc(n+1);
drh7a521cf2007-04-25 18:23:52 +0000245 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000246 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000247 for(i=0; z1[i]; i++){
248 z1[i] = toupper(z1[i]);
249 }
250 sqlite3_result_text(context, z1, -1, sqlite3_free);
251 }
drhdc04c582002-02-24 01:55:15 +0000252 }
253}
danielk19770ae8b832004-05-25 12:05:56 +0000254static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000255 char *z1;
256 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000257 int i, n;
drh9c054832004-05-31 18:51:57 +0000258 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh9310ef22007-04-27 17:16:20 +0000259 n = sqlite3_value_bytes(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000260 z2 = (char*)sqlite3_value_text(argv[0]);
261 if( z2 ){
drh9310ef22007-04-27 17:16:20 +0000262 z1 = sqlite3_malloc(n+1);
drh7a521cf2007-04-25 18:23:52 +0000263 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000264 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000265 for(i=0; z1[i]; i++){
266 z1[i] = tolower(z1[i]);
267 }
268 sqlite3_result_text(context, z1, -1, sqlite3_free);
269 }
drhdc04c582002-02-24 01:55:15 +0000270 }
271}
272
273/*
drhfbc99082002-02-28 03:14:18 +0000274** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000275** All three do the same thing. They return the first non-NULL
276** argument.
drh3212e182002-02-28 00:46:26 +0000277*/
drhf9b596e2004-05-26 16:54:42 +0000278static void ifnullFunc(
279 sqlite3_context *context,
280 int argc,
281 sqlite3_value **argv
282){
drhfbc99082002-02-28 03:14:18 +0000283 int i;
284 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000285 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000286 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000287 break;
288 }
289 }
drh3212e182002-02-28 00:46:26 +0000290}
291
292/*
drhf9ffac92002-03-02 19:00:31 +0000293** Implementation of random(). Return a random integer.
294*/
drhf9b596e2004-05-26 16:54:42 +0000295static void randomFunc(
296 sqlite3_context *context,
297 int argc,
298 sqlite3_value **argv
299){
drh52fc8492006-02-23 21:43:55 +0000300 sqlite_int64 r;
danielk19774adee202004-05-08 08:23:19 +0000301 sqlite3Randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000302 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
303 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000304 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000305}
306
307/*
drh137c7282007-01-29 17:58:28 +0000308** Implementation of randomblob(N). Return a random blob
309** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000310*/
drh137c7282007-01-29 17:58:28 +0000311static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000312 sqlite3_context *context,
313 int argc,
314 sqlite3_value **argv
315){
drh137c7282007-01-29 17:58:28 +0000316 int n;
317 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000318 assert( argc==1 );
319 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000320 if( n<1 ){
321 n = 1;
322 }
323 if( n>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000324 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000325 return;
326 }
drh02d85832007-05-07 19:31:15 +0000327 p = sqliteMalloc(n);
328 if( p ){
329 sqlite3Randomness(n, p);
330 sqlite3_result_blob(context, (char*)p, n, sqlite3FreeX);
331 }
drh63cf66f2007-01-29 15:50:05 +0000332}
333
334/*
drh6ed41ad2002-04-06 14:10:47 +0000335** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000336** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000337*/
danielk197751ad0ec2004-05-24 12:39:02 +0000338static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000339 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000340 int arg,
341 sqlite3_value **argv
342){
drh9bb575f2004-09-06 17:24:11 +0000343 sqlite3 *db = sqlite3_user_data(context);
drhf9b596e2004-05-26 16:54:42 +0000344 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000345}
346
rdcf146a772004-02-25 22:51:06 +0000347/*
danielk1977b28af712004-06-21 06:50:26 +0000348** Implementation of the changes() SQL function. The return value is the
349** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000350*/
danielk1977b28af712004-06-21 06:50:26 +0000351static void changes(
drhf9b596e2004-05-26 16:54:42 +0000352 sqlite3_context *context,
353 int arg,
354 sqlite3_value **argv
355){
drh9bb575f2004-09-06 17:24:11 +0000356 sqlite3 *db = sqlite3_user_data(context);
drhf4479502004-05-27 03:12:53 +0000357 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000358}
rdcf146a772004-02-25 22:51:06 +0000359
360/*
danielk1977b28af712004-06-21 06:50:26 +0000361** Implementation of the total_changes() SQL function. The return value is
362** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000363*/
danielk1977b28af712004-06-21 06:50:26 +0000364static void total_changes(
365 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000366 int arg,
367 sqlite3_value **argv
368){
drh9bb575f2004-09-06 17:24:11 +0000369 sqlite3 *db = sqlite3_user_data(context);
danielk1977b28af712004-06-21 06:50:26 +0000370 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000371}
372
drh6ed41ad2002-04-06 14:10:47 +0000373/*
drh4e5ffc52004-08-31 00:52:37 +0000374** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000375*/
drh4e5ffc52004-08-31 00:52:37 +0000376struct compareInfo {
377 u8 matchAll;
378 u8 matchOne;
379 u8 matchSet;
380 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000381};
drh55ef4d92005-08-14 01:20:37 +0000382
drh4e5ffc52004-08-31 00:52:37 +0000383static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000384/* The correct SQL-92 behavior is for the LIKE operator to ignore
385** case. Thus 'a' LIKE 'A' would be true. */
386static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
387/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
388** is case sensitive causing 'a' LIKE 'A' to be false */
389static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000390
391/*
drh4e5ffc52004-08-31 00:52:37 +0000392** X is a pointer to the first byte of a UTF-8 character. Increment
393** X so that it points to the next character. This only works right
394** if X points to a well-formed UTF-8 string.
danielk1977d02eb1f2004-06-06 09:44:03 +0000395*/
drh4e5ffc52004-08-31 00:52:37 +0000396#define sqliteNextChar(X) while( (0xc0&*++(X))==0x80 ){}
397#define sqliteCharVal(X) sqlite3ReadUtf8(X)
danielk1977d02eb1f2004-06-06 09:44:03 +0000398
danielk1977d02eb1f2004-06-06 09:44:03 +0000399
400/*
drh4e5ffc52004-08-31 00:52:37 +0000401** Compare two UTF-8 strings for equality where the first string can
402** potentially be a "glob" expression. Return true (1) if they
403** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000404**
drh4e5ffc52004-08-31 00:52:37 +0000405** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000406**
drh4e5ffc52004-08-31 00:52:37 +0000407** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000408**
drh4e5ffc52004-08-31 00:52:37 +0000409** '?' Matches exactly one character.
410**
411** [...] Matches one character from the enclosed list of
412** characters.
413**
414** [^...] Matches one character not in the enclosed list.
415**
416** With the [...] and [^...] matching, a ']' character can be included
417** in the list by making it the first character after '[' or '^'. A
418** range of characters can be specified using '-'. Example:
419** "[a-z]" matches any single lower-case letter. To match a '-', make
420** it the last character in the list.
421**
422** This routine is usually quick, but can be N**2 in the worst case.
423**
424** Hints: to match '*' or '?', put them in "[]". Like this:
425**
426** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000427*/
danielk19777c6303c2004-11-17 16:41:29 +0000428static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000429 const u8 *zPattern, /* The glob pattern */
430 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000431 const struct compareInfo *pInfo, /* Information about how to do the compare */
432 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000433){
danielk1977ad7dd422004-06-06 12:41:49 +0000434 register int c;
drh4e5ffc52004-08-31 00:52:37 +0000435 int invert;
436 int seen;
437 int c2;
438 u8 matchOne = pInfo->matchOne;
439 u8 matchAll = pInfo->matchAll;
440 u8 matchSet = pInfo->matchSet;
441 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000442 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000443
drh4e5ffc52004-08-31 00:52:37 +0000444 while( (c = *zPattern)!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000445 if( !prevEscape && c==matchAll ){
drh4e5ffc52004-08-31 00:52:37 +0000446 while( (c=zPattern[1]) == matchAll || c == matchOne ){
447 if( c==matchOne ){
448 if( *zString==0 ) return 0;
449 sqliteNextChar(zString);
450 }
451 zPattern++;
danielk1977ad7dd422004-06-06 12:41:49 +0000452 }
drh20fc0882004-11-18 13:49:25 +0000453 if( c && esc && sqlite3ReadUtf8(&zPattern[1])==esc ){
danielk19777c6303c2004-11-17 16:41:29 +0000454 u8 const *zTemp = &zPattern[1];
455 sqliteNextChar(zTemp);
456 c = *zTemp;
457 }
drh4e5ffc52004-08-31 00:52:37 +0000458 if( c==0 ) return 1;
459 if( c==matchSet ){
danielk19777c6303c2004-11-17 16:41:29 +0000460 assert( esc==0 ); /* This is GLOB, not LIKE */
461 while( *zString && patternCompare(&zPattern[1],zString,pInfo,esc)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000462 sqliteNextChar(zString);
463 }
464 return *zString!=0;
465 }else{
466 while( (c2 = *zString)!=0 ){
467 if( noCase ){
468 c2 = sqlite3UpperToLower[c2];
469 c = sqlite3UpperToLower[c];
470 while( c2 != 0 && c2 != c ){ c2 = sqlite3UpperToLower[*++zString]; }
471 }else{
472 while( c2 != 0 && c2 != c ){ c2 = *++zString; }
473 }
474 if( c2==0 ) return 0;
danielk19777c6303c2004-11-17 16:41:29 +0000475 if( patternCompare(&zPattern[1],zString,pInfo,esc) ) return 1;
drh4e5ffc52004-08-31 00:52:37 +0000476 sqliteNextChar(zString);
477 }
478 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000479 }
danielk19777c6303c2004-11-17 16:41:29 +0000480 }else if( !prevEscape && c==matchOne ){
drh4e5ffc52004-08-31 00:52:37 +0000481 if( *zString==0 ) return 0;
482 sqliteNextChar(zString);
483 zPattern++;
484 }else if( c==matchSet ){
485 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000486 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000487 seen = 0;
488 invert = 0;
489 c = sqliteCharVal(zString);
490 if( c==0 ) return 0;
491 c2 = *++zPattern;
492 if( c2=='^' ){ invert = 1; c2 = *++zPattern; }
493 if( c2==']' ){
494 if( c==']' ) seen = 1;
495 c2 = *++zPattern;
496 }
497 while( (c2 = sqliteCharVal(zPattern))!=0 && c2!=']' ){
498 if( c2=='-' && zPattern[1]!=']' && zPattern[1]!=0 && prior_c>0 ){
499 zPattern++;
500 c2 = sqliteCharVal(zPattern);
501 if( c>=prior_c && c<=c2 ) seen = 1;
502 prior_c = 0;
503 }else if( c==c2 ){
504 seen = 1;
505 prior_c = c2;
506 }else{
507 prior_c = c2;
508 }
509 sqliteNextChar(zPattern);
510 }
511 if( c2==0 || (seen ^ invert)==0 ) return 0;
512 sqliteNextChar(zString);
513 zPattern++;
drh20fc0882004-11-18 13:49:25 +0000514 }else if( esc && !prevEscape && sqlite3ReadUtf8(zPattern)==esc){
danielk19777c6303c2004-11-17 16:41:29 +0000515 prevEscape = 1;
516 sqliteNextChar(zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000517 }else{
518 if( noCase ){
519 if( sqlite3UpperToLower[c] != sqlite3UpperToLower[*zString] ) return 0;
520 }else{
521 if( c != *zString ) return 0;
522 }
523 zPattern++;
524 zString++;
danielk19777c6303c2004-11-17 16:41:29 +0000525 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000526 }
danielk197751ad0ec2004-05-24 12:39:02 +0000527 }
drh4e5ffc52004-08-31 00:52:37 +0000528 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000529}
drh4e5ffc52004-08-31 00:52:37 +0000530
drh55ef4d92005-08-14 01:20:37 +0000531/*
532** Count the number of times that the LIKE operator (or GLOB which is
533** just a variation of LIKE) gets called. This is used for testing
534** only.
535*/
536#ifdef SQLITE_TEST
537int sqlite3_like_count = 0;
538#endif
539
danielk19773f6b0872004-06-17 05:36:44 +0000540
541/*
542** Implementation of the like() SQL function. This function implements
543** the build-in LIKE operator. The first argument to the function is the
544** pattern and the second argument is the string. So, the SQL statements:
545**
546** A LIKE B
547**
548** is implemented as like(B,A).
549**
drh55ef4d92005-08-14 01:20:37 +0000550** This same function (with a different compareInfo structure) computes
551** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000552*/
553static void likeFunc(
554 sqlite3_context *context,
555 int argc,
556 sqlite3_value **argv
557){
drhbeb818d2007-05-08 15:34:47 +0000558 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000559 int escape = 0;
drhbeb818d2007-05-08 15:34:47 +0000560
561 /* Limit the length of the LIKE or GLOB pattern to avoid problems
562 ** of deep recursion and N*N behavior in patternCompare().
563 */
danielk1977b56fe1f2007-05-09 08:24:44 +0000564 if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){
drhbeb818d2007-05-08 15:34:47 +0000565 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
566 return;
567 }
568
danielk1977b56fe1f2007-05-09 08:24:44 +0000569 zB = sqlite3_value_text(argv[0]);
570 zA = sqlite3_value_text(argv[1]);
danielk19777c6303c2004-11-17 16:41:29 +0000571 if( argc==3 ){
572 /* The escape character string must consist of a single UTF-8 character.
573 ** Otherwise, return an error.
574 */
575 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000576 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000577 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000578 sqlite3_result_error(context,
579 "ESCAPE expression must be a single character", -1);
580 return;
581 }
582 escape = sqlite3ReadUtf8(zEsc);
583 }
danielk19773f6b0872004-06-17 05:36:44 +0000584 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000585 struct compareInfo *pInfo = sqlite3_user_data(context);
586#ifdef SQLITE_TEST
587 sqlite3_like_count++;
588#endif
drhbeb818d2007-05-08 15:34:47 +0000589
danielk1977b56fe1f2007-05-09 08:24:44 +0000590 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000591 }
drh8912d102002-05-26 21:34:58 +0000592}
593
594/*
595** Implementation of the NULLIF(x,y) function. The result is the first
596** argument if the arguments are different. The result is NULL if the
597** arguments are equal to each other.
598*/
drhf9b596e2004-05-26 16:54:42 +0000599static void nullifFunc(
600 sqlite3_context *context,
601 int argc,
602 sqlite3_value **argv
603){
danielk1977dc1bdc42004-06-11 10:51:27 +0000604 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
605 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000606 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000607 }
drh0ac65892002-04-20 14:24:41 +0000608}
609
drh647cb0e2002-11-04 19:32:25 +0000610/*
611** Implementation of the VERSION(*) function. The result is the version
612** of the SQLite library that is running.
613*/
drhf9b596e2004-05-26 16:54:42 +0000614static void versionFunc(
615 sqlite3_context *context,
616 int argc,
617 sqlite3_value **argv
618){
danielk1977d8123362004-06-12 09:25:12 +0000619 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000620}
621
drh137c7282007-01-29 17:58:28 +0000622/* Array for converting from half-bytes (nybbles) into ASCII hex
623** digits. */
624static const char hexdigits[] = {
625 '0', '1', '2', '3', '4', '5', '6', '7',
626 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
627};
danielk1977d641d642004-11-18 15:44:29 +0000628
drh47394702003-08-20 01:03:33 +0000629/*
630** EXPERIMENTAL - This is not an official function. The interface may
631** change. This function may disappear. Do not write code that depends
632** on this function.
633**
634** Implementation of the QUOTE() function. This function takes a single
635** argument. If the argument is numeric, the return value is the same as
636** the argument. If the argument is NULL, the return value is the string
637** "NULL". Otherwise, the argument is enclosed in single quotes with
638** single-quote escapes.
639*/
danielk19770ae8b832004-05-25 12:05:56 +0000640static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000641 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000642 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000643 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000644 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000645 break;
drh47394702003-08-20 01:03:33 +0000646 }
drh9c054832004-05-31 18:51:57 +0000647 case SQLITE_INTEGER:
648 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000649 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000650 break;
651 }
danielk19773f41e972004-06-08 00:39:01 +0000652 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000653 char *zText = 0;
654 int nBlob = sqlite3_value_bytes(argv[0]);
655 char const *zBlob = sqlite3_value_blob(argv[0]);
656
drh023ae032007-05-08 12:12:16 +0000657 if( 2*nBlob+4>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000658 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000659 return;
660 }
danielk19773f41e972004-06-08 00:39:01 +0000661 zText = (char *)sqliteMalloc((2*nBlob)+4);
662 if( !zText ){
663 sqlite3_result_error(context, "out of memory", -1);
664 }else{
665 int i;
666 for(i=0; i<nBlob; i++){
667 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
668 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
669 }
670 zText[(nBlob*2)+2] = '\'';
671 zText[(nBlob*2)+3] = '\0';
672 zText[0] = 'X';
673 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000674 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
danielk19773f41e972004-06-08 00:39:01 +0000675 sqliteFree(zText);
676 }
677 break;
678 }
drh9c054832004-05-31 18:51:57 +0000679 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000680 int i,j;
681 u64 n;
drh2646da72005-12-09 20:02:05 +0000682 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000683 char *z;
684
drh7a521cf2007-04-25 18:23:52 +0000685 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000686 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
687 if( i+n+3>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000688 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000689 return;
690 }
drhf9b596e2004-05-26 16:54:42 +0000691 z = sqliteMalloc( i+n+3 );
692 if( z==0 ) return;
693 z[0] = '\'';
694 for(i=0, j=1; zArg[i]; i++){
695 z[j++] = zArg[i];
696 if( zArg[i]=='\'' ){
697 z[j++] = '\'';
698 }
699 }
700 z[j++] = '\'';
701 z[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000702 sqlite3_result_text(context, z, j, SQLITE_TRANSIENT);
drhf9b596e2004-05-26 16:54:42 +0000703 sqliteFree(z);
704 }
drh47394702003-08-20 01:03:33 +0000705 }
706}
707
drh137c7282007-01-29 17:58:28 +0000708/*
709** The hex() function. Interpret the argument as a blob. Return
710** a hexadecimal rendering as text.
711*/
712static void hexFunc(
713 sqlite3_context *context,
714 int argc,
715 sqlite3_value **argv
716){
717 int i, n;
718 const unsigned char *pBlob;
719 char *zHex, *z;
720 assert( argc==1 );
drh137c7282007-01-29 17:58:28 +0000721 n = sqlite3_value_bytes(argv[0]);
drh023ae032007-05-08 12:12:16 +0000722 if( n*2+1>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000723 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000724 return;
725 }
drh1eb25382007-04-10 13:51:17 +0000726 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000727 z = zHex = sqlite3_malloc(n*2 + 1);
728 if( zHex==0 ) return;
729 for(i=0; i<n; i++, pBlob++){
730 unsigned char c = *pBlob;
731 *(z++) = hexdigits[(c>>4)&0xf];
732 *(z++) = hexdigits[c&0xf];
733 }
734 *z = 0;
735 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
736}
737
drh26b6d902007-03-17 13:27:54 +0000738/*
drh8cff3822007-05-02 02:08:28 +0000739** The zeroblob(N) function returns a zero-filled blob of size N bytes.
740*/
741static void zeroblobFunc(
742 sqlite3_context *context,
743 int argc,
744 sqlite3_value **argv
745){
746 int n;
747 assert( argc==1 );
748 n = sqlite3_value_int(argv[0]);
749 sqlite3_result_zeroblob(context, n);
750}
751
752/*
drh26b6d902007-03-17 13:27:54 +0000753** The replace() function. Three arguments are all strings: call
754** them A, B, and C. The result is also a string which is derived
755** from A by replacing every occurance of B with C. The match
756** must be exact. Collating sequences are not used.
757*/
758static void replaceFunc(
759 sqlite3_context *context,
760 int argc,
761 sqlite3_value **argv
762){
763 const unsigned char *zStr; /* The input string A */
764 const unsigned char *zPattern; /* The pattern string B */
765 const unsigned char *zRep; /* The replacement string C */
766 unsigned char *zOut; /* The output */
767 int nStr; /* Size of zStr */
768 int nPattern; /* Size of zPattern */
769 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000770 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000771 int loopLimit; /* Last zStr[] that might match zPattern[] */
772 int i, j; /* Loop counters */
773
774 assert( argc==3 );
drh9310ef22007-04-27 17:16:20 +0000775 nStr = sqlite3_value_bytes(argv[0]);
drh26b6d902007-03-17 13:27:54 +0000776 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000777 if( zStr==0 ) return;
drh9310ef22007-04-27 17:16:20 +0000778 nPattern = sqlite3_value_bytes(argv[1]);
drh26b6d902007-03-17 13:27:54 +0000779 zPattern = sqlite3_value_text(argv[1]);
drh709cff32007-04-27 01:18:02 +0000780 if( zPattern==0 || zPattern[0]==0 ) return;
drh9310ef22007-04-27 17:16:20 +0000781 nRep = sqlite3_value_bytes(argv[2]);
drh26b6d902007-03-17 13:27:54 +0000782 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000783 if( zRep==0 ) return;
drh2e6400b2007-05-08 15:46:18 +0000784 nOut = nStr + 1;
785 assert( nOut<SQLITE_MAX_LENGTH );
786 zOut = sqlite3_malloc((int)nOut);
787 if( zOut==0 ){
788 return;
drh26b6d902007-03-17 13:27:54 +0000789 }
drh26b6d902007-03-17 13:27:54 +0000790 loopLimit = nStr - nPattern;
791 for(i=j=0; i<=loopLimit; i++){
792 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
793 zOut[j++] = zStr[i];
794 }else{
drh2e6400b2007-05-08 15:46:18 +0000795 nOut += nRep - nPattern;
796 if( nOut>=SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000797 sqlite3_result_error_toobig(context);
danielk197717374e82007-05-08 14:39:04 +0000798 sqlite3_free(zOut);
799 return;
800 }
drh2e6400b2007-05-08 15:46:18 +0000801 zOut = sqlite3_realloc(zOut, (int)nOut);
802 if( zOut==0 ){
803 return;
804 }
drh26b6d902007-03-17 13:27:54 +0000805 memcpy(&zOut[j], zRep, nRep);
806 j += nRep;
807 i += nPattern-1;
808 }
809 }
drh2e6400b2007-05-08 15:46:18 +0000810 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000811 memcpy(&zOut[j], &zStr[i], nStr-i);
812 j += nStr - i;
813 assert( j<=nOut );
814 zOut[j] = 0;
815 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
816}
817
drh309b3382007-03-17 17:52:42 +0000818/*
819** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
820** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
821*/
822static void trimFunc(
823 sqlite3_context *context,
824 int argc,
825 sqlite3_value **argv
826){
827 const unsigned char *zIn; /* Input string */
828 const unsigned char *zCharSet; /* Set of characters to trim */
829 int nIn; /* Number of bytes in input */
drhd1e3a612007-04-27 21:59:52 +0000830 int flags; /* 1: trimleft 2: trimright 3: trim */
831 int i; /* Loop counter */
832 unsigned char *aLen; /* Length of each character in zCharSet */
833 const unsigned char **azChar; /* Individual characters in zCharSet */
834 int nChar; /* Number of characters in zCharSet */
835
drh309b3382007-03-17 17:52:42 +0000836 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
837 return;
838 }
drh9310ef22007-04-27 17:16:20 +0000839 nIn = sqlite3_value_bytes(argv[0]);
drh309b3382007-03-17 17:52:42 +0000840 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000841 if( zIn==0 ) return;
drh309b3382007-03-17 17:52:42 +0000842 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000843 static const unsigned char lenOne[] = { 1 };
drh8cff3822007-05-02 02:08:28 +0000844 static const unsigned char *azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000845 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000846 aLen = (u8*)lenOne;
847 azChar = azOne;
drhd1e3a612007-04-27 21:59:52 +0000848 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000849 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000850 return;
drhd1e3a612007-04-27 21:59:52 +0000851 }else{
852 const unsigned char *z;
853 for(z=zCharSet, nChar=0; *z; nChar++){
854 sqliteNextChar(z);
855 }
856 if( nChar>0 ){
857 azChar = sqlite3_malloc( nChar*(sizeof(char*)+1) );
858 if( azChar==0 ){
859 return;
860 }
861 aLen = (unsigned char*)&azChar[nChar];
862 for(z=zCharSet, nChar=0; *z; nChar++){
863 azChar[nChar] = z;
864 sqliteNextChar(z);
865 aLen[nChar] = z - azChar[nChar];
866 }
867 }
drh309b3382007-03-17 17:52:42 +0000868 }
drhd1e3a612007-04-27 21:59:52 +0000869 if( nChar>0 ){
drh309b3382007-03-17 17:52:42 +0000870 flags = (int)sqlite3_user_data(context);
871 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000872 while( nIn>0 ){
873 int len;
874 for(i=0; i<nChar; i++){
875 len = aLen[i];
876 if( memcmp(zIn, azChar[i], len)==0 ) break;
877 }
878 if( i>=nChar ) break;
879 zIn += len;
880 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000881 }
882 }
883 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000884 while( nIn>0 ){
885 int len;
886 for(i=0; i<nChar; i++){
887 len = aLen[i];
888 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
889 }
890 if( i>=nChar ) break;
891 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000892 }
893 }
drhd1e3a612007-04-27 21:59:52 +0000894 if( zCharSet ){
895 sqlite3_free(azChar);
896 }
drh309b3382007-03-17 17:52:42 +0000897 }
898 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
899}
drh26b6d902007-03-17 13:27:54 +0000900
drhd24cc422003-03-27 12:51:24 +0000901#ifdef SQLITE_SOUNDEX
902/*
903** Compute the soundex encoding of a word.
904*/
drh137c7282007-01-29 17:58:28 +0000905static void soundexFunc(
906 sqlite3_context *context,
907 int argc,
908 sqlite3_value **argv
909){
drhd24cc422003-03-27 12:51:24 +0000910 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000911 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000912 int i, j;
913 static const unsigned char iCode[] = {
914 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
915 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
916 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
917 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
918 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
919 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
920 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
921 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
922 };
923 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000924 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000925 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000926 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
927 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000928 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000929 zResult[0] = toupper(zIn[i]);
930 for(j=1; j<4 && zIn[i]; i++){
931 int code = iCode[zIn[i]&0x7f];
932 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000933 if( code!=prevcode ){
934 prevcode = code;
935 zResult[j++] = code + '0';
936 }
937 }else{
938 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000939 }
940 }
941 while( j<4 ){
942 zResult[j++] = '0';
943 }
944 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000945 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000946 }else{
danielk1977d8123362004-06-12 09:25:12 +0000947 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000948 }
949}
950#endif
951
drhfdb83b22006-06-17 14:12:47 +0000952#ifndef SQLITE_OMIT_LOAD_EXTENSION
953/*
954** A function that loads a shared-library extension then returns NULL.
955*/
956static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +0000957 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000958 const char *zProc;
drhfdb83b22006-06-17 14:12:47 +0000959 sqlite3 *db = sqlite3_user_data(context);
960 char *zErrMsg = 0;
961
962 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +0000963 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +0000964 }else{
965 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +0000966 }
drh7a521cf2007-04-25 18:23:52 +0000967 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +0000968 sqlite3_result_error(context, zErrMsg, -1);
969 sqlite3_free(zErrMsg);
970 }
971}
972#endif
973
drh193a6b42002-07-07 16:52:46 +0000974#ifdef SQLITE_TEST
975/*
976** This function generates a string of random characters. Used for
977** generating test data.
978*/
danielk19770ae8b832004-05-25 12:05:56 +0000979static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +0000980 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +0000981 "abcdefghijklmnopqrstuvwxyz"
982 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
983 "0123456789"
984 ".-!,:*^+=_|?/<> ";
985 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +0000986 unsigned char zBuf[1000];
drh193a6b42002-07-07 16:52:46 +0000987 if( argc>=1 ){
drhf9b596e2004-05-26 16:54:42 +0000988 iMin = sqlite3_value_int(argv[0]);
drh193a6b42002-07-07 16:52:46 +0000989 if( iMin<0 ) iMin = 0;
990 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
991 }else{
992 iMin = 1;
993 }
994 if( argc>=2 ){
drhf9b596e2004-05-26 16:54:42 +0000995 iMax = sqlite3_value_int(argv[1]);
drh193a6b42002-07-07 16:52:46 +0000996 if( iMax<iMin ) iMax = iMin;
drh1dba7272004-01-16 13:58:18 +0000997 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +0000998 }else{
999 iMax = 50;
1000 }
1001 n = iMin;
1002 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +00001003 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +00001004 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +00001005 n += r%(iMax + 1 - iMin);
1006 }
drh1dba7272004-01-16 13:58:18 +00001007 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +00001008 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +00001009 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +00001010 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +00001011 }
1012 zBuf[n] = 0;
drh2646da72005-12-09 20:02:05 +00001013 sqlite3_result_text(context, (char*)zBuf, n, SQLITE_TRANSIENT);
danielk1977d8123362004-06-12 09:25:12 +00001014}
drh0e3d7472004-06-19 17:33:07 +00001015#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +00001016
drh0e3d7472004-06-19 17:33:07 +00001017#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +00001018/*
1019** The following two SQL functions are used to test returning a text
1020** result with a destructor. Function 'test_destructor' takes one argument
1021** and returns the same argument interpreted as TEXT. A destructor is
1022** passed with the sqlite3_result_text() call.
1023**
1024** SQL function 'test_destructor_count' returns the number of outstanding
1025** allocations made by 'test_destructor';
1026**
1027** WARNING: Not threadsafe.
1028*/
1029static int test_destructor_count_var = 0;
1030static void destructor(void *p){
1031 char *zVal = (char *)p;
1032 assert(zVal);
1033 zVal--;
1034 sqliteFree(zVal);
1035 test_destructor_count_var--;
1036}
1037static void test_destructor(
1038 sqlite3_context *pCtx,
1039 int nArg,
1040 sqlite3_value **argv
1041){
1042 char *zVal;
danielk1977f4618892004-06-28 13:09:11 +00001043 int len;
drh9bb575f2004-09-06 17:24:11 +00001044 sqlite3 *db = sqlite3_user_data(pCtx);
danielk1977f4618892004-06-28 13:09:11 +00001045
danielk1977d8123362004-06-12 09:25:12 +00001046 test_destructor_count_var++;
1047 assert( nArg==1 );
1048 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
danielk197714db2662006-01-09 16:12:04 +00001049 len = sqlite3ValueBytes(argv[0], ENC(db));
danielk1977f4618892004-06-28 13:09:11 +00001050 zVal = sqliteMalloc(len+3);
1051 zVal[len] = 0;
1052 zVal[len-1] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001053 assert( zVal );
1054 zVal++;
danielk197714db2662006-01-09 16:12:04 +00001055 memcpy(zVal, sqlite3ValueText(argv[0], ENC(db)), len);
1056 if( ENC(db)==SQLITE_UTF8 ){
danielk1977f4618892004-06-28 13:09:11 +00001057 sqlite3_result_text(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001058#ifndef SQLITE_OMIT_UTF16
danielk197714db2662006-01-09 16:12:04 +00001059 }else if( ENC(db)==SQLITE_UTF16LE ){
danielk1977f4618892004-06-28 13:09:11 +00001060 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
1061 }else{
1062 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001063#endif /* SQLITE_OMIT_UTF16 */
danielk1977f4618892004-06-28 13:09:11 +00001064 }
danielk1977d8123362004-06-12 09:25:12 +00001065}
1066static void test_destructor_count(
1067 sqlite3_context *pCtx,
1068 int nArg,
1069 sqlite3_value **argv
1070){
1071 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +00001072}
drh0e3d7472004-06-19 17:33:07 +00001073#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +00001074
drh0e3d7472004-06-19 17:33:07 +00001075#ifdef SQLITE_TEST
1076/*
1077** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
1078** interface.
1079**
1080** The test_auxdata() SQL function attempts to register each of its arguments
1081** as auxiliary data. If there are no prior registrations of aux data for
1082** that argument (meaning the argument is not a constant or this is its first
1083** call) then the result for that argument is 0. If there is a prior
1084** registration, the result for that argument is 1. The overall result
1085** is the individual argument results separated by spaces.
1086*/
danielk19773f6b0872004-06-17 05:36:44 +00001087static void free_test_auxdata(void *p) {sqliteFree(p);}
1088static void test_auxdata(
1089 sqlite3_context *pCtx,
1090 int nArg,
1091 sqlite3_value **argv
1092){
1093 int i;
1094 char *zRet = sqliteMalloc(nArg*2);
1095 if( !zRet ) return;
1096 for(i=0; i<nArg; i++){
drh2646da72005-12-09 20:02:05 +00001097 char const *z = (char*)sqlite3_value_text(argv[i]);
danielk19773f6b0872004-06-17 05:36:44 +00001098 if( z ){
1099 char *zAux = sqlite3_get_auxdata(pCtx, i);
1100 if( zAux ){
1101 zRet[i*2] = '1';
1102 if( strcmp(zAux, z) ){
1103 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
1104 return;
1105 }
1106 }else{
1107 zRet[i*2] = '0';
1108 zAux = sqliteStrDup(z);
1109 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
1110 }
1111 zRet[i*2+1] = ' ';
1112 }
1113 }
1114 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
1115}
drh0e3d7472004-06-19 17:33:07 +00001116#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +00001117
danielk197701427a62005-01-11 13:02:33 +00001118#ifdef SQLITE_TEST
1119/*
1120** A function to test error reporting from user functions. This function
1121** returns a copy of it's first argument as an error.
1122*/
1123static void test_error(
1124 sqlite3_context *pCtx,
1125 int nArg,
1126 sqlite3_value **argv
1127){
drh2646da72005-12-09 20:02:05 +00001128 sqlite3_result_error(pCtx, (char*)sqlite3_value_text(argv[0]), 0);
danielk197701427a62005-01-11 13:02:33 +00001129}
1130#endif /* SQLITE_TEST */
1131
drh0ac65892002-04-20 14:24:41 +00001132/*
drhd3a149e2002-02-24 17:12:53 +00001133** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001134** sum() or avg() aggregate computation.
1135*/
1136typedef struct SumCtx SumCtx;
1137struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001138 double rSum; /* Floating point sum */
1139 i64 iSum; /* Integer sum */
1140 i64 cnt; /* Number of elements summed */
1141 u8 overflow; /* True if integer overflow seen */
1142 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001143};
1144
1145/*
drha97fdd32006-01-12 22:17:50 +00001146** Routines used to compute the sum, average, and total.
1147**
1148** The SUM() function follows the (broken) SQL standard which means
1149** that it returns NULL if it sums over no inputs. TOTAL returns
1150** 0.0 in that case. In addition, TOTAL always returns a float where
1151** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001152** value. TOTAL never fails, but SUM might through an exception if
1153** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001154*/
danielk19770ae8b832004-05-25 12:05:56 +00001155static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001156 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001157 int type;
drh3f219f42005-09-08 19:45:57 +00001158 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +00001159 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001160 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001161 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001162 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001163 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001164 i64 v = sqlite3_value_int64(argv[0]);
1165 p->rSum += v;
1166 if( (p->approx|p->overflow)==0 ){
1167 i64 iNewSum = p->iSum + v;
1168 int s1 = p->iSum >> (sizeof(i64)*8-1);
1169 int s2 = v >> (sizeof(i64)*8-1);
1170 int s3 = iNewSum >> (sizeof(i64)*8-1);
1171 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
1172 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001173 }
1174 }else{
drh8c08e862006-02-11 17:34:00 +00001175 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001176 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001177 }
drh739105c2002-05-29 23:22:23 +00001178 }
drhdd5baa92002-02-27 19:50:59 +00001179}
danielk19770ae8b832004-05-25 12:05:56 +00001180static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001181 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001182 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001183 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001184 if( p->overflow ){
1185 sqlite3_result_error(context,"integer overflow",-1);
1186 }else if( p->approx ){
1187 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001188 }else{
drh8c08e862006-02-11 17:34:00 +00001189 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001190 }
drh3d1d95e2005-09-08 10:37:01 +00001191 }
drhdd5baa92002-02-27 19:50:59 +00001192}
danielk19770ae8b832004-05-25 12:05:56 +00001193static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001194 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001195 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001196 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001197 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001198 }
1199}
drha97fdd32006-01-12 22:17:50 +00001200static void totalFinalize(sqlite3_context *context){
1201 SumCtx *p;
1202 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001203 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001204}
drhdd5baa92002-02-27 19:50:59 +00001205
1206/*
drh0bce8352002-02-28 00:41:10 +00001207** The following structure keeps track of state information for the
1208** count() aggregate function.
1209*/
1210typedef struct CountCtx CountCtx;
1211struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001212 i64 n;
drh0bce8352002-02-28 00:41:10 +00001213};
drhdd5baa92002-02-27 19:50:59 +00001214
drh0bce8352002-02-28 00:41:10 +00001215/*
1216** Routines to implement the count() aggregate function.
1217*/
danielk19770ae8b832004-05-25 12:05:56 +00001218static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001219 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001220 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001221 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001222 p->n++;
1223 }
1224}
danielk19770ae8b832004-05-25 12:05:56 +00001225static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001226 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001227 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001228 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001229}
1230
1231/*
drh0bce8352002-02-28 00:41:10 +00001232** Routines to implement min() and max() aggregate functions.
1233*/
danielk19770ae8b832004-05-25 12:05:56 +00001234static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +00001235 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001236 Mem *pBest;
1237
1238 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1239 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001240 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001241
danielk197788208052004-05-25 01:13:20 +00001242 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001243 int max;
1244 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001245 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001246 /* This step function is used for both the min() and max() aggregates,
1247 ** the only difference between the two being that the sense of the
1248 ** comparison is inverted. For the max() aggregate, the
1249 ** sqlite3_user_data() function returns (void *)-1. For min() it
1250 ** returns (void *)db, where db is the sqlite3* database pointer.
1251 ** Therefore the next statement sets variable 'max' to 1 for the max()
1252 ** aggregate, or 0 for min().
1253 */
drh309b3382007-03-17 17:52:42 +00001254 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001255 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001256 if( (max && cmp<0) || (!max && cmp>0) ){
danielk19777e18c252004-05-25 11:47:24 +00001257 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001258 }
drh268380c2004-02-25 13:47:31 +00001259 }else{
danielk19777e18c252004-05-25 11:47:24 +00001260 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001261 }
1262}
danielk19770ae8b832004-05-25 12:05:56 +00001263static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001264 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001265 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1266 if( pRes ){
1267 if( pRes->flags ){
1268 sqlite3_result_value(context, pRes);
1269 }
1270 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001271 }
1272}
drhdd5baa92002-02-27 19:50:59 +00001273
drh4e5ffc52004-08-31 00:52:37 +00001274
drhd3a149e2002-02-24 17:12:53 +00001275/*
drha2ed5602002-02-26 23:55:31 +00001276** This function registered all of the above C functions as SQL
1277** functions. This should be the only routine in this file with
1278** external linkage.
drhdc04c582002-02-24 01:55:15 +00001279*/
drh9bb575f2004-09-06 17:24:11 +00001280void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001281 static const struct {
drh0bce8352002-02-28 00:41:10 +00001282 char *zName;
drh268380c2004-02-25 13:47:31 +00001283 signed char nArg;
drh309b3382007-03-17 17:52:42 +00001284 u8 argType; /* ff: db 1: 0, 2: 1, 3: 2,... N: N-1. */
danielk1977f4618892004-06-28 13:09:11 +00001285 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001286 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001287 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001288 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001289 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1290 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
drh309b3382007-03-17 17:52:42 +00001291 { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc },
1292 { "max", 0, 1, SQLITE_UTF8, 1, 0 },
danielk1977f4618892004-06-28 13:09:11 +00001293 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1294 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
1295 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
drh6c626082004-11-14 21:56:29 +00001296#ifndef SQLITE_OMIT_UTF16
drhee858132007-05-08 20:37:38 +00001297 { "substr", 3, 0, SQLITE_UTF16LE, 0, sqlite3Utf16Substr },
drh6c626082004-11-14 21:56:29 +00001298#endif
danielk1977f4618892004-06-28 13:09:11 +00001299 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1300 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1301 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1302 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1303 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1304 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1305 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1306 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
drh137c7282007-01-29 17:58:28 +00001307 { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc },
danielk1977f4618892004-06-28 13:09:11 +00001308 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1309 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
drh137c7282007-01-29 17:58:28 +00001310 { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob },
drh94a98362004-09-13 13:13:18 +00001311 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001312 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1313 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
drh309b3382007-03-17 17:52:42 +00001314 { "last_insert_rowid", 0, 0xff, SQLITE_UTF8, 0, last_insert_rowid },
1315 { "changes", 0, 0xff, SQLITE_UTF8, 0, changes },
1316 { "total_changes", 0, 0xff, SQLITE_UTF8, 0, total_changes },
drh26b6d902007-03-17 13:27:54 +00001317 { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc },
drh309b3382007-03-17 17:52:42 +00001318 { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc },
1319 { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc },
1320 { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc },
1321 { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc },
1322 { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc },
1323 { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc },
drh8cff3822007-05-02 02:08:28 +00001324 { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc },
drhd24cc422003-03-27 12:51:24 +00001325#ifdef SQLITE_SOUNDEX
drh309b3382007-03-17 17:52:42 +00001326 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001327#endif
drhfdb83b22006-06-17 14:12:47 +00001328#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh309b3382007-03-17 17:52:42 +00001329 { "load_extension", 1, 0xff, SQLITE_UTF8, 0, loadExt },
1330 { "load_extension", 2, 0xff, SQLITE_UTF8, 0, loadExt },
drhfdb83b22006-06-17 14:12:47 +00001331#endif
drh193a6b42002-07-07 16:52:46 +00001332#ifdef SQLITE_TEST
drh309b3382007-03-17 17:52:42 +00001333 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1334 { "test_destructor", 1, 0xff, SQLITE_UTF8, 0, test_destructor},
1335 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
1336 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
1337 { "test_error", 1, 0, SQLITE_UTF8, 0, test_error},
drh193a6b42002-07-07 16:52:46 +00001338#endif
drh0bce8352002-02-28 00:41:10 +00001339 };
drh57196282004-10-06 15:41:16 +00001340 static const struct {
drh0bce8352002-02-28 00:41:10 +00001341 char *zName;
drh268380c2004-02-25 13:47:31 +00001342 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001343 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001344 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001345 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1346 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001347 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001348 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
drh309b3382007-03-17 17:52:42 +00001349 { "max", 1, 1, 1, minmaxStep, minMaxFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001350 { "sum", 1, 0, 0, sumStep, sumFinalize },
drha97fdd32006-01-12 22:17:50 +00001351 { "total", 1, 0, 0, sumStep, totalFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001352 { "avg", 1, 0, 0, sumStep, avgFinalize },
1353 { "count", 0, 0, 0, countStep, countFinalize },
1354 { "count", 1, 0, 0, countStep, countFinalize },
drh0bce8352002-02-28 00:41:10 +00001355 };
1356 int i;
1357
1358 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001359 void *pArg;
1360 u8 argType = aFuncs[i].argType;
1361 if( argType==0xff ){
1362 pArg = db;
1363 }else{
1364 pArg = (void*)(int)argType;
danielk1977c572ef72004-05-27 09:28:41 +00001365 }
danielk1977771151b2006-01-17 13:21:40 +00001366 sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001367 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001368 if( aFuncs[i].needCollSeq ){
1369 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1370 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1371 if( pFunc && aFuncs[i].needCollSeq ){
1372 pFunc->needCollSeq = 1;
1373 }
1374 }
drh0bce8352002-02-28 00:41:10 +00001375 }
drh1f01ec12005-02-15 21:36:18 +00001376#ifndef SQLITE_OMIT_ALTERTABLE
1377 sqlite3AlterFunctions(db);
1378#endif
drh198bf392006-01-06 21:52:49 +00001379#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001380 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001381#endif
drh0bce8352002-02-28 00:41:10 +00001382 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001383 void *pArg = (void*)(int)aAggs[i].argType;
danielk1977771151b2006-01-17 13:21:40 +00001384 sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001385 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001386 if( aAggs[i].needCollSeq ){
1387 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001388 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001389 if( pFunc && aAggs[i].needCollSeq ){
1390 pFunc->needCollSeq = 1;
1391 }
1392 }
drh268380c2004-02-25 13:47:31 +00001393 }
danielk19774adee202004-05-08 08:23:19 +00001394 sqlite3RegisterDateTimeFunctions(db);
drhb7481e72006-09-16 21:45:14 +00001395 sqlite3_overload_function(db, "MATCH", 2);
danielk1977fd9e1f32005-05-22 10:44:34 +00001396#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001397 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001398#endif
drh55ef4d92005-08-14 01:20:37 +00001399#ifdef SQLITE_CASE_SENSITIVE_LIKE
1400 sqlite3RegisterLikeFunctions(db, 1);
1401#else
1402 sqlite3RegisterLikeFunctions(db, 0);
1403#endif
1404}
1405
1406/*
1407** Set the LIKEOPT flag on the 2-argument function with the given name.
1408*/
drhd64fe2f2005-08-28 17:00:23 +00001409static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001410 FuncDef *pDef;
1411 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1412 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001413 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001414 }
1415}
1416
1417/*
1418** Register the built-in LIKE and GLOB functions. The caseSensitive
1419** parameter determines whether or not the LIKE operator is case
1420** sensitive. GLOB is always case sensitive.
1421*/
1422void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1423 struct compareInfo *pInfo;
1424 if( caseSensitive ){
1425 pInfo = (struct compareInfo*)&likeInfoAlt;
1426 }else{
1427 pInfo = (struct compareInfo*)&likeInfoNorm;
1428 }
danielk1977771151b2006-01-17 13:21:40 +00001429 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1430 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1431 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001432 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001433 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1434 setLikeOptFlag(db, "like",
1435 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001436}
1437
1438/*
1439** pExpr points to an expression which implements a function. If
1440** it is appropriate to apply the LIKE optimization to that function
1441** then set aWc[0] through aWc[2] to the wildcard characters and
1442** return TRUE. If the function is not a LIKE-style function then
1443** return FALSE.
1444*/
drhd64fe2f2005-08-28 17:00:23 +00001445int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001446 FuncDef *pDef;
danielk1977cdbd8ef2007-05-12 06:11:12 +00001447 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
drh55ef4d92005-08-14 01:20:37 +00001448 return 0;
1449 }
1450 if( pExpr->pList->nExpr!=2 ){
1451 return 0;
1452 }
drh2646da72005-12-09 20:02:05 +00001453 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001454 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001455 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001456 return 0;
1457 }
1458
1459 /* The memcpy() statement assumes that the wildcard characters are
1460 ** the first three statements in the compareInfo structure. The
1461 ** asserts() that follow verify that assumption
1462 */
1463 memcpy(aWc, pDef->pUserData, 3);
1464 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1465 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1466 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001467 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001468 return 1;
drhdc04c582002-02-24 01:55:15 +00001469}