blob: 2403b3d566a928e14a840f74b9f5a68f3bc2040b [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**
drh02d85832007-05-07 19:31:15 +000019** $Id: func.c,v 1.146 2007/05/07 19:31:16 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/*
149** Implementation of the substr() function
150*/
drhf9b596e2004-05-26 16:54:42 +0000151static void substrFunc(
152 sqlite3_context *context,
153 int argc,
154 sqlite3_value **argv
155){
drh2646da72005-12-09 20:02:05 +0000156 const unsigned char *z;
157 const unsigned char *z2;
drh0bce8352002-02-28 00:41:10 +0000158 int i;
drh0bce8352002-02-28 00:41:10 +0000159 int p1, p2, len;
drhf9b596e2004-05-26 16:54:42 +0000160
drh0bce8352002-02-28 00:41:10 +0000161 assert( argc==3 );
drh4f26d6c2004-05-26 23:25:30 +0000162 z = sqlite3_value_text(argv[0]);
drh0bce8352002-02-28 00:41:10 +0000163 if( z==0 ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000164 p1 = sqlite3_value_int(argv[1]);
165 p2 = sqlite3_value_int(argv[2]);
drh47c8a672002-02-28 04:00:12 +0000166 for(len=0, z2=z; *z2; z2++){ if( (0xc0&*z2)!=0x80 ) len++; }
drh0bce8352002-02-28 00:41:10 +0000167 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000168 p1 += len;
drh653bc752002-02-28 03:31:10 +0000169 if( p1<0 ){
170 p2 += p1;
171 p1 = 0;
172 }
drh0bce8352002-02-28 00:41:10 +0000173 }else if( p1>0 ){
174 p1--;
175 }
176 if( p1+p2>len ){
177 p2 = len-p1;
178 }
drh77396302004-01-02 13:17:48 +0000179 for(i=0; i<p1 && z[i]; i++){
drh47c8a672002-02-28 04:00:12 +0000180 if( (z[i]&0xc0)==0x80 ) p1++;
drh0bce8352002-02-28 00:41:10 +0000181 }
drh47c8a672002-02-28 04:00:12 +0000182 while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p1++; }
drh77396302004-01-02 13:17:48 +0000183 for(; i<p1+p2 && z[i]; i++){
drh47c8a672002-02-28 04:00:12 +0000184 if( (z[i]&0xc0)==0x80 ) p2++;
drh0bce8352002-02-28 00:41:10 +0000185 }
drh47c8a672002-02-28 04:00:12 +0000186 while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p2++; }
drh653bc752002-02-28 03:31:10 +0000187 if( p2<0 ) p2 = 0;
drh2646da72005-12-09 20:02:05 +0000188 sqlite3_result_text(context, (char*)&z[p1], p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000189}
190
191/*
192** Implementation of the round() function
193*/
danielk19770ae8b832004-05-25 12:05:56 +0000194static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000195 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000196 double r;
drh592ac8c2005-08-13 03:07:47 +0000197 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000198 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000199 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000200 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000201 n = sqlite3_value_int(argv[1]);
202 if( n>30 ) n = 30;
203 if( n<0 ) n = 0;
204 }
drhd589a922006-03-02 03:02:48 +0000205 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000206 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000207 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000208 sqlite3AtoF(zBuf, &r);
209 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000210}
drhdc04c582002-02-24 01:55:15 +0000211
212/*
213** Implementation of the upper() and lower() SQL functions.
214*/
danielk19770ae8b832004-05-25 12:05:56 +0000215static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000216 char *z1;
217 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000218 int i, n;
drh9c054832004-05-31 18:51:57 +0000219 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh9310ef22007-04-27 17:16:20 +0000220 n = sqlite3_value_bytes(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000221 z2 = (char*)sqlite3_value_text(argv[0]);
222 if( z2 ){
drh9310ef22007-04-27 17:16:20 +0000223 z1 = sqlite3_malloc(n+1);
drh7a521cf2007-04-25 18:23:52 +0000224 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000225 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000226 for(i=0; z1[i]; i++){
227 z1[i] = toupper(z1[i]);
228 }
229 sqlite3_result_text(context, z1, -1, sqlite3_free);
230 }
drhdc04c582002-02-24 01:55:15 +0000231 }
232}
danielk19770ae8b832004-05-25 12:05:56 +0000233static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000234 char *z1;
235 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000236 int i, n;
drh9c054832004-05-31 18:51:57 +0000237 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh9310ef22007-04-27 17:16:20 +0000238 n = sqlite3_value_bytes(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000239 z2 = (char*)sqlite3_value_text(argv[0]);
240 if( z2 ){
drh9310ef22007-04-27 17:16:20 +0000241 z1 = sqlite3_malloc(n+1);
drh7a521cf2007-04-25 18:23:52 +0000242 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000243 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000244 for(i=0; z1[i]; i++){
245 z1[i] = tolower(z1[i]);
246 }
247 sqlite3_result_text(context, z1, -1, sqlite3_free);
248 }
drhdc04c582002-02-24 01:55:15 +0000249 }
250}
251
252/*
drhfbc99082002-02-28 03:14:18 +0000253** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000254** All three do the same thing. They return the first non-NULL
255** argument.
drh3212e182002-02-28 00:46:26 +0000256*/
drhf9b596e2004-05-26 16:54:42 +0000257static void ifnullFunc(
258 sqlite3_context *context,
259 int argc,
260 sqlite3_value **argv
261){
drhfbc99082002-02-28 03:14:18 +0000262 int i;
263 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000264 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000265 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000266 break;
267 }
268 }
drh3212e182002-02-28 00:46:26 +0000269}
270
271/*
drhf9ffac92002-03-02 19:00:31 +0000272** Implementation of random(). Return a random integer.
273*/
drhf9b596e2004-05-26 16:54:42 +0000274static void randomFunc(
275 sqlite3_context *context,
276 int argc,
277 sqlite3_value **argv
278){
drh52fc8492006-02-23 21:43:55 +0000279 sqlite_int64 r;
danielk19774adee202004-05-08 08:23:19 +0000280 sqlite3Randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000281 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
282 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000283 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000284}
285
286/*
drh137c7282007-01-29 17:58:28 +0000287** Implementation of randomblob(N). Return a random blob
288** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000289*/
drh137c7282007-01-29 17:58:28 +0000290static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000291 sqlite3_context *context,
292 int argc,
293 sqlite3_value **argv
294){
drh137c7282007-01-29 17:58:28 +0000295 int n;
296 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000297 assert( argc==1 );
298 n = sqlite3_value_int(argv[0]);
drh137c7282007-01-29 17:58:28 +0000299 if( n<1 ) n = 1;
drh02d85832007-05-07 19:31:15 +0000300 p = sqliteMalloc(n);
301 if( p ){
302 sqlite3Randomness(n, p);
303 sqlite3_result_blob(context, (char*)p, n, sqlite3FreeX);
304 }
drh63cf66f2007-01-29 15:50:05 +0000305}
306
307/*
drh6ed41ad2002-04-06 14:10:47 +0000308** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000309** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000310*/
danielk197751ad0ec2004-05-24 12:39:02 +0000311static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000312 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000313 int arg,
314 sqlite3_value **argv
315){
drh9bb575f2004-09-06 17:24:11 +0000316 sqlite3 *db = sqlite3_user_data(context);
drhf9b596e2004-05-26 16:54:42 +0000317 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000318}
319
rdcf146a772004-02-25 22:51:06 +0000320/*
danielk1977b28af712004-06-21 06:50:26 +0000321** Implementation of the changes() SQL function. The return value is the
322** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000323*/
danielk1977b28af712004-06-21 06:50:26 +0000324static void changes(
drhf9b596e2004-05-26 16:54:42 +0000325 sqlite3_context *context,
326 int arg,
327 sqlite3_value **argv
328){
drh9bb575f2004-09-06 17:24:11 +0000329 sqlite3 *db = sqlite3_user_data(context);
drhf4479502004-05-27 03:12:53 +0000330 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000331}
rdcf146a772004-02-25 22:51:06 +0000332
333/*
danielk1977b28af712004-06-21 06:50:26 +0000334** Implementation of the total_changes() SQL function. The return value is
335** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000336*/
danielk1977b28af712004-06-21 06:50:26 +0000337static void total_changes(
338 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000339 int arg,
340 sqlite3_value **argv
341){
drh9bb575f2004-09-06 17:24:11 +0000342 sqlite3 *db = sqlite3_user_data(context);
danielk1977b28af712004-06-21 06:50:26 +0000343 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000344}
345
drh6ed41ad2002-04-06 14:10:47 +0000346/*
drh4e5ffc52004-08-31 00:52:37 +0000347** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000348*/
drh4e5ffc52004-08-31 00:52:37 +0000349struct compareInfo {
350 u8 matchAll;
351 u8 matchOne;
352 u8 matchSet;
353 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000354};
drh55ef4d92005-08-14 01:20:37 +0000355
drh4e5ffc52004-08-31 00:52:37 +0000356static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000357/* The correct SQL-92 behavior is for the LIKE operator to ignore
358** case. Thus 'a' LIKE 'A' would be true. */
359static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
360/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
361** is case sensitive causing 'a' LIKE 'A' to be false */
362static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000363
364/*
drh4e5ffc52004-08-31 00:52:37 +0000365** X is a pointer to the first byte of a UTF-8 character. Increment
366** X so that it points to the next character. This only works right
367** if X points to a well-formed UTF-8 string.
danielk1977d02eb1f2004-06-06 09:44:03 +0000368*/
drh4e5ffc52004-08-31 00:52:37 +0000369#define sqliteNextChar(X) while( (0xc0&*++(X))==0x80 ){}
370#define sqliteCharVal(X) sqlite3ReadUtf8(X)
danielk1977d02eb1f2004-06-06 09:44:03 +0000371
danielk1977d02eb1f2004-06-06 09:44:03 +0000372
373/*
drh4e5ffc52004-08-31 00:52:37 +0000374** Compare two UTF-8 strings for equality where the first string can
375** potentially be a "glob" expression. Return true (1) if they
376** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000377**
drh4e5ffc52004-08-31 00:52:37 +0000378** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000379**
drh4e5ffc52004-08-31 00:52:37 +0000380** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000381**
drh4e5ffc52004-08-31 00:52:37 +0000382** '?' Matches exactly one character.
383**
384** [...] Matches one character from the enclosed list of
385** characters.
386**
387** [^...] Matches one character not in the enclosed list.
388**
389** With the [...] and [^...] matching, a ']' character can be included
390** in the list by making it the first character after '[' or '^'. A
391** range of characters can be specified using '-'. Example:
392** "[a-z]" matches any single lower-case letter. To match a '-', make
393** it the last character in the list.
394**
395** This routine is usually quick, but can be N**2 in the worst case.
396**
397** Hints: to match '*' or '?', put them in "[]". Like this:
398**
399** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000400*/
danielk19777c6303c2004-11-17 16:41:29 +0000401static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000402 const u8 *zPattern, /* The glob pattern */
403 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000404 const struct compareInfo *pInfo, /* Information about how to do the compare */
405 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000406){
danielk1977ad7dd422004-06-06 12:41:49 +0000407 register int c;
drh4e5ffc52004-08-31 00:52:37 +0000408 int invert;
409 int seen;
410 int c2;
411 u8 matchOne = pInfo->matchOne;
412 u8 matchAll = pInfo->matchAll;
413 u8 matchSet = pInfo->matchSet;
414 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000415 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000416
drh4e5ffc52004-08-31 00:52:37 +0000417 while( (c = *zPattern)!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000418 if( !prevEscape && c==matchAll ){
drh4e5ffc52004-08-31 00:52:37 +0000419 while( (c=zPattern[1]) == matchAll || c == matchOne ){
420 if( c==matchOne ){
421 if( *zString==0 ) return 0;
422 sqliteNextChar(zString);
423 }
424 zPattern++;
danielk1977ad7dd422004-06-06 12:41:49 +0000425 }
drh20fc0882004-11-18 13:49:25 +0000426 if( c && esc && sqlite3ReadUtf8(&zPattern[1])==esc ){
danielk19777c6303c2004-11-17 16:41:29 +0000427 u8 const *zTemp = &zPattern[1];
428 sqliteNextChar(zTemp);
429 c = *zTemp;
430 }
drh4e5ffc52004-08-31 00:52:37 +0000431 if( c==0 ) return 1;
432 if( c==matchSet ){
danielk19777c6303c2004-11-17 16:41:29 +0000433 assert( esc==0 ); /* This is GLOB, not LIKE */
434 while( *zString && patternCompare(&zPattern[1],zString,pInfo,esc)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000435 sqliteNextChar(zString);
436 }
437 return *zString!=0;
438 }else{
439 while( (c2 = *zString)!=0 ){
440 if( noCase ){
441 c2 = sqlite3UpperToLower[c2];
442 c = sqlite3UpperToLower[c];
443 while( c2 != 0 && c2 != c ){ c2 = sqlite3UpperToLower[*++zString]; }
444 }else{
445 while( c2 != 0 && c2 != c ){ c2 = *++zString; }
446 }
447 if( c2==0 ) return 0;
danielk19777c6303c2004-11-17 16:41:29 +0000448 if( patternCompare(&zPattern[1],zString,pInfo,esc) ) return 1;
drh4e5ffc52004-08-31 00:52:37 +0000449 sqliteNextChar(zString);
450 }
451 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000452 }
danielk19777c6303c2004-11-17 16:41:29 +0000453 }else if( !prevEscape && c==matchOne ){
drh4e5ffc52004-08-31 00:52:37 +0000454 if( *zString==0 ) return 0;
455 sqliteNextChar(zString);
456 zPattern++;
457 }else if( c==matchSet ){
458 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000459 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000460 seen = 0;
461 invert = 0;
462 c = sqliteCharVal(zString);
463 if( c==0 ) return 0;
464 c2 = *++zPattern;
465 if( c2=='^' ){ invert = 1; c2 = *++zPattern; }
466 if( c2==']' ){
467 if( c==']' ) seen = 1;
468 c2 = *++zPattern;
469 }
470 while( (c2 = sqliteCharVal(zPattern))!=0 && c2!=']' ){
471 if( c2=='-' && zPattern[1]!=']' && zPattern[1]!=0 && prior_c>0 ){
472 zPattern++;
473 c2 = sqliteCharVal(zPattern);
474 if( c>=prior_c && c<=c2 ) seen = 1;
475 prior_c = 0;
476 }else if( c==c2 ){
477 seen = 1;
478 prior_c = c2;
479 }else{
480 prior_c = c2;
481 }
482 sqliteNextChar(zPattern);
483 }
484 if( c2==0 || (seen ^ invert)==0 ) return 0;
485 sqliteNextChar(zString);
486 zPattern++;
drh20fc0882004-11-18 13:49:25 +0000487 }else if( esc && !prevEscape && sqlite3ReadUtf8(zPattern)==esc){
danielk19777c6303c2004-11-17 16:41:29 +0000488 prevEscape = 1;
489 sqliteNextChar(zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000490 }else{
491 if( noCase ){
492 if( sqlite3UpperToLower[c] != sqlite3UpperToLower[*zString] ) return 0;
493 }else{
494 if( c != *zString ) return 0;
495 }
496 zPattern++;
497 zString++;
danielk19777c6303c2004-11-17 16:41:29 +0000498 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000499 }
danielk197751ad0ec2004-05-24 12:39:02 +0000500 }
drh4e5ffc52004-08-31 00:52:37 +0000501 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000502}
drh4e5ffc52004-08-31 00:52:37 +0000503
drh55ef4d92005-08-14 01:20:37 +0000504/*
505** Count the number of times that the LIKE operator (or GLOB which is
506** just a variation of LIKE) gets called. This is used for testing
507** only.
508*/
509#ifdef SQLITE_TEST
510int sqlite3_like_count = 0;
511#endif
512
danielk19773f6b0872004-06-17 05:36:44 +0000513
514/*
515** Implementation of the like() SQL function. This function implements
516** the build-in LIKE operator. The first argument to the function is the
517** pattern and the second argument is the string. So, the SQL statements:
518**
519** A LIKE B
520**
521** is implemented as like(B,A).
522**
drh55ef4d92005-08-14 01:20:37 +0000523** This same function (with a different compareInfo structure) computes
524** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000525*/
526static void likeFunc(
527 sqlite3_context *context,
528 int argc,
529 sqlite3_value **argv
530){
531 const unsigned char *zA = sqlite3_value_text(argv[0]);
532 const unsigned char *zB = sqlite3_value_text(argv[1]);
danielk19777c6303c2004-11-17 16:41:29 +0000533 int escape = 0;
534 if( argc==3 ){
535 /* The escape character string must consist of a single UTF-8 character.
536 ** Otherwise, return an error.
537 */
538 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000539 if( zEsc==0 ) return;
drh2646da72005-12-09 20:02:05 +0000540 if( sqlite3utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000541 sqlite3_result_error(context,
542 "ESCAPE expression must be a single character", -1);
543 return;
544 }
545 escape = sqlite3ReadUtf8(zEsc);
546 }
danielk19773f6b0872004-06-17 05:36:44 +0000547 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000548 struct compareInfo *pInfo = sqlite3_user_data(context);
549#ifdef SQLITE_TEST
550 sqlite3_like_count++;
551#endif
552 sqlite3_result_int(context, patternCompare(zA, zB, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000553 }
drh8912d102002-05-26 21:34:58 +0000554}
555
556/*
557** Implementation of the NULLIF(x,y) function. The result is the first
558** argument if the arguments are different. The result is NULL if the
559** arguments are equal to each other.
560*/
drhf9b596e2004-05-26 16:54:42 +0000561static void nullifFunc(
562 sqlite3_context *context,
563 int argc,
564 sqlite3_value **argv
565){
danielk1977dc1bdc42004-06-11 10:51:27 +0000566 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
567 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000568 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000569 }
drh0ac65892002-04-20 14:24:41 +0000570}
571
drh647cb0e2002-11-04 19:32:25 +0000572/*
573** Implementation of the VERSION(*) function. The result is the version
574** of the SQLite library that is running.
575*/
drhf9b596e2004-05-26 16:54:42 +0000576static void versionFunc(
577 sqlite3_context *context,
578 int argc,
579 sqlite3_value **argv
580){
danielk1977d8123362004-06-12 09:25:12 +0000581 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000582}
583
drh137c7282007-01-29 17:58:28 +0000584/* Array for converting from half-bytes (nybbles) into ASCII hex
585** digits. */
586static const char hexdigits[] = {
587 '0', '1', '2', '3', '4', '5', '6', '7',
588 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
589};
danielk1977d641d642004-11-18 15:44:29 +0000590
drh47394702003-08-20 01:03:33 +0000591/*
592** EXPERIMENTAL - This is not an official function. The interface may
593** change. This function may disappear. Do not write code that depends
594** on this function.
595**
596** Implementation of the QUOTE() function. This function takes a single
597** argument. If the argument is numeric, the return value is the same as
598** the argument. If the argument is NULL, the return value is the string
599** "NULL". Otherwise, the argument is enclosed in single quotes with
600** single-quote escapes.
601*/
danielk19770ae8b832004-05-25 12:05:56 +0000602static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000603 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000604 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000605 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000606 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000607 break;
drh47394702003-08-20 01:03:33 +0000608 }
drh9c054832004-05-31 18:51:57 +0000609 case SQLITE_INTEGER:
610 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000611 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000612 break;
613 }
danielk19773f41e972004-06-08 00:39:01 +0000614 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000615 char *zText = 0;
616 int nBlob = sqlite3_value_bytes(argv[0]);
617 char const *zBlob = sqlite3_value_blob(argv[0]);
618
619 zText = (char *)sqliteMalloc((2*nBlob)+4);
620 if( !zText ){
621 sqlite3_result_error(context, "out of memory", -1);
622 }else{
623 int i;
624 for(i=0; i<nBlob; i++){
625 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
626 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
627 }
628 zText[(nBlob*2)+2] = '\'';
629 zText[(nBlob*2)+3] = '\0';
630 zText[0] = 'X';
631 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000632 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
danielk19773f41e972004-06-08 00:39:01 +0000633 sqliteFree(zText);
634 }
635 break;
636 }
drh9c054832004-05-31 18:51:57 +0000637 case SQLITE_TEXT: {
drhf9b596e2004-05-26 16:54:42 +0000638 int i,j,n;
drh2646da72005-12-09 20:02:05 +0000639 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000640 char *z;
641
drh7a521cf2007-04-25 18:23:52 +0000642 if( zArg==0 ) return;
drhf9b596e2004-05-26 16:54:42 +0000643 for(i=n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
644 z = sqliteMalloc( i+n+3 );
645 if( z==0 ) return;
646 z[0] = '\'';
647 for(i=0, j=1; zArg[i]; i++){
648 z[j++] = zArg[i];
649 if( zArg[i]=='\'' ){
650 z[j++] = '\'';
651 }
652 }
653 z[j++] = '\'';
654 z[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000655 sqlite3_result_text(context, z, j, SQLITE_TRANSIENT);
drhf9b596e2004-05-26 16:54:42 +0000656 sqliteFree(z);
657 }
drh47394702003-08-20 01:03:33 +0000658 }
659}
660
drh137c7282007-01-29 17:58:28 +0000661/*
662** The hex() function. Interpret the argument as a blob. Return
663** a hexadecimal rendering as text.
664*/
665static void hexFunc(
666 sqlite3_context *context,
667 int argc,
668 sqlite3_value **argv
669){
670 int i, n;
671 const unsigned char *pBlob;
672 char *zHex, *z;
673 assert( argc==1 );
drh137c7282007-01-29 17:58:28 +0000674 n = sqlite3_value_bytes(argv[0]);
drh1eb25382007-04-10 13:51:17 +0000675 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000676 z = zHex = sqlite3_malloc(n*2 + 1);
677 if( zHex==0 ) return;
678 for(i=0; i<n; i++, pBlob++){
679 unsigned char c = *pBlob;
680 *(z++) = hexdigits[(c>>4)&0xf];
681 *(z++) = hexdigits[c&0xf];
682 }
683 *z = 0;
684 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
685}
686
drh26b6d902007-03-17 13:27:54 +0000687/*
drh8cff3822007-05-02 02:08:28 +0000688** The zeroblob(N) function returns a zero-filled blob of size N bytes.
689*/
690static void zeroblobFunc(
691 sqlite3_context *context,
692 int argc,
693 sqlite3_value **argv
694){
695 int n;
696 assert( argc==1 );
697 n = sqlite3_value_int(argv[0]);
698 sqlite3_result_zeroblob(context, n);
699}
700
701/*
drh26b6d902007-03-17 13:27:54 +0000702** The replace() function. Three arguments are all strings: call
703** them A, B, and C. The result is also a string which is derived
704** from A by replacing every occurance of B with C. The match
705** must be exact. Collating sequences are not used.
706*/
707static void replaceFunc(
708 sqlite3_context *context,
709 int argc,
710 sqlite3_value **argv
711){
712 const unsigned char *zStr; /* The input string A */
713 const unsigned char *zPattern; /* The pattern string B */
714 const unsigned char *zRep; /* The replacement string C */
715 unsigned char *zOut; /* The output */
716 int nStr; /* Size of zStr */
717 int nPattern; /* Size of zPattern */
718 int nRep; /* Size of zRep */
719 int nOut; /* Maximum size of zOut */
720 int loopLimit; /* Last zStr[] that might match zPattern[] */
721 int i, j; /* Loop counters */
722
723 assert( argc==3 );
drh9310ef22007-04-27 17:16:20 +0000724 nStr = sqlite3_value_bytes(argv[0]);
drh26b6d902007-03-17 13:27:54 +0000725 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000726 if( zStr==0 ) return;
drh9310ef22007-04-27 17:16:20 +0000727 nPattern = sqlite3_value_bytes(argv[1]);
drh26b6d902007-03-17 13:27:54 +0000728 zPattern = sqlite3_value_text(argv[1]);
drh709cff32007-04-27 01:18:02 +0000729 if( zPattern==0 || zPattern[0]==0 ) return;
drh9310ef22007-04-27 17:16:20 +0000730 nRep = sqlite3_value_bytes(argv[2]);
drh26b6d902007-03-17 13:27:54 +0000731 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000732 if( zRep==0 ) return;
drh26b6d902007-03-17 13:27:54 +0000733 if( nPattern>=nRep ){
734 nOut = nStr;
735 }else{
736 nOut = (nStr/nPattern + 1)*nRep;
737 }
738 zOut = sqlite3_malloc(nOut+1);
739 if( zOut==0 ) return;
740 loopLimit = nStr - nPattern;
741 for(i=j=0; i<=loopLimit; i++){
742 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
743 zOut[j++] = zStr[i];
744 }else{
745 memcpy(&zOut[j], zRep, nRep);
746 j += nRep;
747 i += nPattern-1;
748 }
749 }
750 memcpy(&zOut[j], &zStr[i], nStr-i);
751 j += nStr - i;
752 assert( j<=nOut );
753 zOut[j] = 0;
754 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
755}
756
drh309b3382007-03-17 17:52:42 +0000757/*
758** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
759** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
760*/
761static void trimFunc(
762 sqlite3_context *context,
763 int argc,
764 sqlite3_value **argv
765){
766 const unsigned char *zIn; /* Input string */
767 const unsigned char *zCharSet; /* Set of characters to trim */
768 int nIn; /* Number of bytes in input */
drhd1e3a612007-04-27 21:59:52 +0000769 int flags; /* 1: trimleft 2: trimright 3: trim */
770 int i; /* Loop counter */
771 unsigned char *aLen; /* Length of each character in zCharSet */
772 const unsigned char **azChar; /* Individual characters in zCharSet */
773 int nChar; /* Number of characters in zCharSet */
774
drh309b3382007-03-17 17:52:42 +0000775 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
776 return;
777 }
drh9310ef22007-04-27 17:16:20 +0000778 nIn = sqlite3_value_bytes(argv[0]);
drh309b3382007-03-17 17:52:42 +0000779 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000780 if( zIn==0 ) return;
drh309b3382007-03-17 17:52:42 +0000781 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000782 static const unsigned char lenOne[] = { 1 };
drh8cff3822007-05-02 02:08:28 +0000783 static const unsigned char *azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000784 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000785 aLen = (u8*)lenOne;
786 azChar = azOne;
drhd1e3a612007-04-27 21:59:52 +0000787 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000788 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000789 return;
drhd1e3a612007-04-27 21:59:52 +0000790 }else{
791 const unsigned char *z;
792 for(z=zCharSet, nChar=0; *z; nChar++){
793 sqliteNextChar(z);
794 }
795 if( nChar>0 ){
796 azChar = sqlite3_malloc( nChar*(sizeof(char*)+1) );
797 if( azChar==0 ){
798 return;
799 }
800 aLen = (unsigned char*)&azChar[nChar];
801 for(z=zCharSet, nChar=0; *z; nChar++){
802 azChar[nChar] = z;
803 sqliteNextChar(z);
804 aLen[nChar] = z - azChar[nChar];
805 }
806 }
drh309b3382007-03-17 17:52:42 +0000807 }
drhd1e3a612007-04-27 21:59:52 +0000808 if( nChar>0 ){
drh309b3382007-03-17 17:52:42 +0000809 flags = (int)sqlite3_user_data(context);
810 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000811 while( nIn>0 ){
812 int len;
813 for(i=0; i<nChar; i++){
814 len = aLen[i];
815 if( memcmp(zIn, azChar[i], len)==0 ) break;
816 }
817 if( i>=nChar ) break;
818 zIn += len;
819 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000820 }
821 }
822 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000823 while( nIn>0 ){
824 int len;
825 for(i=0; i<nChar; i++){
826 len = aLen[i];
827 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
828 }
829 if( i>=nChar ) break;
830 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000831 }
832 }
drhd1e3a612007-04-27 21:59:52 +0000833 if( zCharSet ){
834 sqlite3_free(azChar);
835 }
drh309b3382007-03-17 17:52:42 +0000836 }
837 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
838}
drh26b6d902007-03-17 13:27:54 +0000839
drhd24cc422003-03-27 12:51:24 +0000840#ifdef SQLITE_SOUNDEX
841/*
842** Compute the soundex encoding of a word.
843*/
drh137c7282007-01-29 17:58:28 +0000844static void soundexFunc(
845 sqlite3_context *context,
846 int argc,
847 sqlite3_value **argv
848){
drhd24cc422003-03-27 12:51:24 +0000849 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000850 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000851 int i, j;
852 static const unsigned char iCode[] = {
853 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
854 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
855 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
856 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
857 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
858 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
859 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
860 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
861 };
862 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000863 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000864 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000865 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
866 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000867 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000868 zResult[0] = toupper(zIn[i]);
869 for(j=1; j<4 && zIn[i]; i++){
870 int code = iCode[zIn[i]&0x7f];
871 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000872 if( code!=prevcode ){
873 prevcode = code;
874 zResult[j++] = code + '0';
875 }
876 }else{
877 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000878 }
879 }
880 while( j<4 ){
881 zResult[j++] = '0';
882 }
883 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000884 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000885 }else{
danielk1977d8123362004-06-12 09:25:12 +0000886 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000887 }
888}
889#endif
890
drhfdb83b22006-06-17 14:12:47 +0000891#ifndef SQLITE_OMIT_LOAD_EXTENSION
892/*
893** A function that loads a shared-library extension then returns NULL.
894*/
895static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +0000896 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000897 const char *zProc;
drhfdb83b22006-06-17 14:12:47 +0000898 sqlite3 *db = sqlite3_user_data(context);
899 char *zErrMsg = 0;
900
901 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +0000902 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +0000903 }else{
904 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +0000905 }
drh7a521cf2007-04-25 18:23:52 +0000906 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +0000907 sqlite3_result_error(context, zErrMsg, -1);
908 sqlite3_free(zErrMsg);
909 }
910}
911#endif
912
drh193a6b42002-07-07 16:52:46 +0000913#ifdef SQLITE_TEST
914/*
915** This function generates a string of random characters. Used for
916** generating test data.
917*/
danielk19770ae8b832004-05-25 12:05:56 +0000918static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +0000919 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +0000920 "abcdefghijklmnopqrstuvwxyz"
921 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
922 "0123456789"
923 ".-!,:*^+=_|?/<> ";
924 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +0000925 unsigned char zBuf[1000];
drh193a6b42002-07-07 16:52:46 +0000926 if( argc>=1 ){
drhf9b596e2004-05-26 16:54:42 +0000927 iMin = sqlite3_value_int(argv[0]);
drh193a6b42002-07-07 16:52:46 +0000928 if( iMin<0 ) iMin = 0;
929 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
930 }else{
931 iMin = 1;
932 }
933 if( argc>=2 ){
drhf9b596e2004-05-26 16:54:42 +0000934 iMax = sqlite3_value_int(argv[1]);
drh193a6b42002-07-07 16:52:46 +0000935 if( iMax<iMin ) iMax = iMin;
drh1dba7272004-01-16 13:58:18 +0000936 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +0000937 }else{
938 iMax = 50;
939 }
940 n = iMin;
941 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +0000942 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +0000943 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +0000944 n += r%(iMax + 1 - iMin);
945 }
drh1dba7272004-01-16 13:58:18 +0000946 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +0000947 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +0000948 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +0000949 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +0000950 }
951 zBuf[n] = 0;
drh2646da72005-12-09 20:02:05 +0000952 sqlite3_result_text(context, (char*)zBuf, n, SQLITE_TRANSIENT);
danielk1977d8123362004-06-12 09:25:12 +0000953}
drh0e3d7472004-06-19 17:33:07 +0000954#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +0000955
drh0e3d7472004-06-19 17:33:07 +0000956#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +0000957/*
958** The following two SQL functions are used to test returning a text
959** result with a destructor. Function 'test_destructor' takes one argument
960** and returns the same argument interpreted as TEXT. A destructor is
961** passed with the sqlite3_result_text() call.
962**
963** SQL function 'test_destructor_count' returns the number of outstanding
964** allocations made by 'test_destructor';
965**
966** WARNING: Not threadsafe.
967*/
968static int test_destructor_count_var = 0;
969static void destructor(void *p){
970 char *zVal = (char *)p;
971 assert(zVal);
972 zVal--;
973 sqliteFree(zVal);
974 test_destructor_count_var--;
975}
976static void test_destructor(
977 sqlite3_context *pCtx,
978 int nArg,
979 sqlite3_value **argv
980){
981 char *zVal;
danielk1977f4618892004-06-28 13:09:11 +0000982 int len;
drh9bb575f2004-09-06 17:24:11 +0000983 sqlite3 *db = sqlite3_user_data(pCtx);
danielk1977f4618892004-06-28 13:09:11 +0000984
danielk1977d8123362004-06-12 09:25:12 +0000985 test_destructor_count_var++;
986 assert( nArg==1 );
987 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
danielk197714db2662006-01-09 16:12:04 +0000988 len = sqlite3ValueBytes(argv[0], ENC(db));
danielk1977f4618892004-06-28 13:09:11 +0000989 zVal = sqliteMalloc(len+3);
990 zVal[len] = 0;
991 zVal[len-1] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000992 assert( zVal );
993 zVal++;
danielk197714db2662006-01-09 16:12:04 +0000994 memcpy(zVal, sqlite3ValueText(argv[0], ENC(db)), len);
995 if( ENC(db)==SQLITE_UTF8 ){
danielk1977f4618892004-06-28 13:09:11 +0000996 sqlite3_result_text(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +0000997#ifndef SQLITE_OMIT_UTF16
danielk197714db2662006-01-09 16:12:04 +0000998 }else if( ENC(db)==SQLITE_UTF16LE ){
danielk1977f4618892004-06-28 13:09:11 +0000999 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
1000 }else{
1001 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001002#endif /* SQLITE_OMIT_UTF16 */
danielk1977f4618892004-06-28 13:09:11 +00001003 }
danielk1977d8123362004-06-12 09:25:12 +00001004}
1005static void test_destructor_count(
1006 sqlite3_context *pCtx,
1007 int nArg,
1008 sqlite3_value **argv
1009){
1010 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +00001011}
drh0e3d7472004-06-19 17:33:07 +00001012#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +00001013
drh0e3d7472004-06-19 17:33:07 +00001014#ifdef SQLITE_TEST
1015/*
1016** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
1017** interface.
1018**
1019** The test_auxdata() SQL function attempts to register each of its arguments
1020** as auxiliary data. If there are no prior registrations of aux data for
1021** that argument (meaning the argument is not a constant or this is its first
1022** call) then the result for that argument is 0. If there is a prior
1023** registration, the result for that argument is 1. The overall result
1024** is the individual argument results separated by spaces.
1025*/
danielk19773f6b0872004-06-17 05:36:44 +00001026static void free_test_auxdata(void *p) {sqliteFree(p);}
1027static void test_auxdata(
1028 sqlite3_context *pCtx,
1029 int nArg,
1030 sqlite3_value **argv
1031){
1032 int i;
1033 char *zRet = sqliteMalloc(nArg*2);
1034 if( !zRet ) return;
1035 for(i=0; i<nArg; i++){
drh2646da72005-12-09 20:02:05 +00001036 char const *z = (char*)sqlite3_value_text(argv[i]);
danielk19773f6b0872004-06-17 05:36:44 +00001037 if( z ){
1038 char *zAux = sqlite3_get_auxdata(pCtx, i);
1039 if( zAux ){
1040 zRet[i*2] = '1';
1041 if( strcmp(zAux, z) ){
1042 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
1043 return;
1044 }
1045 }else{
1046 zRet[i*2] = '0';
1047 zAux = sqliteStrDup(z);
1048 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
1049 }
1050 zRet[i*2+1] = ' ';
1051 }
1052 }
1053 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
1054}
drh0e3d7472004-06-19 17:33:07 +00001055#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +00001056
danielk197701427a62005-01-11 13:02:33 +00001057#ifdef SQLITE_TEST
1058/*
1059** A function to test error reporting from user functions. This function
1060** returns a copy of it's first argument as an error.
1061*/
1062static void test_error(
1063 sqlite3_context *pCtx,
1064 int nArg,
1065 sqlite3_value **argv
1066){
drh2646da72005-12-09 20:02:05 +00001067 sqlite3_result_error(pCtx, (char*)sqlite3_value_text(argv[0]), 0);
danielk197701427a62005-01-11 13:02:33 +00001068}
1069#endif /* SQLITE_TEST */
1070
drh0ac65892002-04-20 14:24:41 +00001071/*
drhd3a149e2002-02-24 17:12:53 +00001072** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001073** sum() or avg() aggregate computation.
1074*/
1075typedef struct SumCtx SumCtx;
1076struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001077 double rSum; /* Floating point sum */
1078 i64 iSum; /* Integer sum */
1079 i64 cnt; /* Number of elements summed */
1080 u8 overflow; /* True if integer overflow seen */
1081 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001082};
1083
1084/*
drha97fdd32006-01-12 22:17:50 +00001085** Routines used to compute the sum, average, and total.
1086**
1087** The SUM() function follows the (broken) SQL standard which means
1088** that it returns NULL if it sums over no inputs. TOTAL returns
1089** 0.0 in that case. In addition, TOTAL always returns a float where
1090** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001091** value. TOTAL never fails, but SUM might through an exception if
1092** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001093*/
danielk19770ae8b832004-05-25 12:05:56 +00001094static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001095 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001096 int type;
drh3f219f42005-09-08 19:45:57 +00001097 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +00001098 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001099 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001100 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001101 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001102 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001103 i64 v = sqlite3_value_int64(argv[0]);
1104 p->rSum += v;
1105 if( (p->approx|p->overflow)==0 ){
1106 i64 iNewSum = p->iSum + v;
1107 int s1 = p->iSum >> (sizeof(i64)*8-1);
1108 int s2 = v >> (sizeof(i64)*8-1);
1109 int s3 = iNewSum >> (sizeof(i64)*8-1);
1110 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
1111 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001112 }
1113 }else{
drh8c08e862006-02-11 17:34:00 +00001114 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001115 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001116 }
drh739105c2002-05-29 23:22:23 +00001117 }
drhdd5baa92002-02-27 19:50:59 +00001118}
danielk19770ae8b832004-05-25 12:05:56 +00001119static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001120 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001121 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001122 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001123 if( p->overflow ){
1124 sqlite3_result_error(context,"integer overflow",-1);
1125 }else if( p->approx ){
1126 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001127 }else{
drh8c08e862006-02-11 17:34:00 +00001128 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001129 }
drh3d1d95e2005-09-08 10:37:01 +00001130 }
drhdd5baa92002-02-27 19:50:59 +00001131}
danielk19770ae8b832004-05-25 12:05:56 +00001132static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001133 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001134 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001135 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001136 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001137 }
1138}
drha97fdd32006-01-12 22:17:50 +00001139static void totalFinalize(sqlite3_context *context){
1140 SumCtx *p;
1141 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001142 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001143}
drhdd5baa92002-02-27 19:50:59 +00001144
1145/*
drh0bce8352002-02-28 00:41:10 +00001146** The following structure keeps track of state information for the
1147** count() aggregate function.
1148*/
1149typedef struct CountCtx CountCtx;
1150struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001151 i64 n;
drh0bce8352002-02-28 00:41:10 +00001152};
drhdd5baa92002-02-27 19:50:59 +00001153
drh0bce8352002-02-28 00:41:10 +00001154/*
1155** Routines to implement the count() aggregate function.
1156*/
danielk19770ae8b832004-05-25 12:05:56 +00001157static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001158 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001159 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001160 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001161 p->n++;
1162 }
1163}
danielk19770ae8b832004-05-25 12:05:56 +00001164static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001165 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001166 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001167 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001168}
1169
1170/*
drh0bce8352002-02-28 00:41:10 +00001171** Routines to implement min() and max() aggregate functions.
1172*/
danielk19770ae8b832004-05-25 12:05:56 +00001173static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +00001174 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001175 Mem *pBest;
1176
1177 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1178 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001179 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001180
danielk197788208052004-05-25 01:13:20 +00001181 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001182 int max;
1183 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001184 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001185 /* This step function is used for both the min() and max() aggregates,
1186 ** the only difference between the two being that the sense of the
1187 ** comparison is inverted. For the max() aggregate, the
1188 ** sqlite3_user_data() function returns (void *)-1. For min() it
1189 ** returns (void *)db, where db is the sqlite3* database pointer.
1190 ** Therefore the next statement sets variable 'max' to 1 for the max()
1191 ** aggregate, or 0 for min().
1192 */
drh309b3382007-03-17 17:52:42 +00001193 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001194 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001195 if( (max && cmp<0) || (!max && cmp>0) ){
danielk19777e18c252004-05-25 11:47:24 +00001196 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001197 }
drh268380c2004-02-25 13:47:31 +00001198 }else{
danielk19777e18c252004-05-25 11:47:24 +00001199 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001200 }
1201}
danielk19770ae8b832004-05-25 12:05:56 +00001202static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001203 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001204 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1205 if( pRes ){
1206 if( pRes->flags ){
1207 sqlite3_result_value(context, pRes);
1208 }
1209 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001210 }
1211}
drhdd5baa92002-02-27 19:50:59 +00001212
drh4e5ffc52004-08-31 00:52:37 +00001213
drhd3a149e2002-02-24 17:12:53 +00001214/*
drha2ed5602002-02-26 23:55:31 +00001215** This function registered all of the above C functions as SQL
1216** functions. This should be the only routine in this file with
1217** external linkage.
drhdc04c582002-02-24 01:55:15 +00001218*/
drh9bb575f2004-09-06 17:24:11 +00001219void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001220 static const struct {
drh0bce8352002-02-28 00:41:10 +00001221 char *zName;
drh268380c2004-02-25 13:47:31 +00001222 signed char nArg;
drh309b3382007-03-17 17:52:42 +00001223 u8 argType; /* ff: db 1: 0, 2: 1, 3: 2,... N: N-1. */
danielk1977f4618892004-06-28 13:09:11 +00001224 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001225 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001226 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001227 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001228 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1229 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
drh309b3382007-03-17 17:52:42 +00001230 { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc },
1231 { "max", 0, 1, SQLITE_UTF8, 1, 0 },
danielk1977f4618892004-06-28 13:09:11 +00001232 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1233 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
1234 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
drh6c626082004-11-14 21:56:29 +00001235#ifndef SQLITE_OMIT_UTF16
danielk1977f4618892004-06-28 13:09:11 +00001236 { "substr", 3, 0, SQLITE_UTF16LE, 0, sqlite3utf16Substr },
drh6c626082004-11-14 21:56:29 +00001237#endif
danielk1977f4618892004-06-28 13:09:11 +00001238 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1239 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1240 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1241 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1242 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1243 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1244 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1245 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
drh137c7282007-01-29 17:58:28 +00001246 { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc },
danielk1977f4618892004-06-28 13:09:11 +00001247 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1248 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
drh137c7282007-01-29 17:58:28 +00001249 { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob },
drh94a98362004-09-13 13:13:18 +00001250 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001251 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1252 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
drh309b3382007-03-17 17:52:42 +00001253 { "last_insert_rowid", 0, 0xff, SQLITE_UTF8, 0, last_insert_rowid },
1254 { "changes", 0, 0xff, SQLITE_UTF8, 0, changes },
1255 { "total_changes", 0, 0xff, SQLITE_UTF8, 0, total_changes },
drh26b6d902007-03-17 13:27:54 +00001256 { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc },
drh309b3382007-03-17 17:52:42 +00001257 { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc },
1258 { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc },
1259 { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc },
1260 { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc },
1261 { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc },
1262 { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc },
drh8cff3822007-05-02 02:08:28 +00001263 { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc },
drhd24cc422003-03-27 12:51:24 +00001264#ifdef SQLITE_SOUNDEX
drh309b3382007-03-17 17:52:42 +00001265 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001266#endif
drhfdb83b22006-06-17 14:12:47 +00001267#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh309b3382007-03-17 17:52:42 +00001268 { "load_extension", 1, 0xff, SQLITE_UTF8, 0, loadExt },
1269 { "load_extension", 2, 0xff, SQLITE_UTF8, 0, loadExt },
drhfdb83b22006-06-17 14:12:47 +00001270#endif
drh193a6b42002-07-07 16:52:46 +00001271#ifdef SQLITE_TEST
drh309b3382007-03-17 17:52:42 +00001272 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1273 { "test_destructor", 1, 0xff, SQLITE_UTF8, 0, test_destructor},
1274 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
1275 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
1276 { "test_error", 1, 0, SQLITE_UTF8, 0, test_error},
drh193a6b42002-07-07 16:52:46 +00001277#endif
drh0bce8352002-02-28 00:41:10 +00001278 };
drh57196282004-10-06 15:41:16 +00001279 static const struct {
drh0bce8352002-02-28 00:41:10 +00001280 char *zName;
drh268380c2004-02-25 13:47:31 +00001281 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001282 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001283 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001284 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1285 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001286 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001287 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
drh309b3382007-03-17 17:52:42 +00001288 { "max", 1, 1, 1, minmaxStep, minMaxFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001289 { "sum", 1, 0, 0, sumStep, sumFinalize },
drha97fdd32006-01-12 22:17:50 +00001290 { "total", 1, 0, 0, sumStep, totalFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001291 { "avg", 1, 0, 0, sumStep, avgFinalize },
1292 { "count", 0, 0, 0, countStep, countFinalize },
1293 { "count", 1, 0, 0, countStep, countFinalize },
drh0bce8352002-02-28 00:41:10 +00001294 };
1295 int i;
1296
1297 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001298 void *pArg;
1299 u8 argType = aFuncs[i].argType;
1300 if( argType==0xff ){
1301 pArg = db;
1302 }else{
1303 pArg = (void*)(int)argType;
danielk1977c572ef72004-05-27 09:28:41 +00001304 }
danielk1977771151b2006-01-17 13:21:40 +00001305 sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001306 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001307 if( aFuncs[i].needCollSeq ){
1308 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1309 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1310 if( pFunc && aFuncs[i].needCollSeq ){
1311 pFunc->needCollSeq = 1;
1312 }
1313 }
drh0bce8352002-02-28 00:41:10 +00001314 }
drh1f01ec12005-02-15 21:36:18 +00001315#ifndef SQLITE_OMIT_ALTERTABLE
1316 sqlite3AlterFunctions(db);
1317#endif
drh198bf392006-01-06 21:52:49 +00001318#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001319 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001320#endif
drh0bce8352002-02-28 00:41:10 +00001321 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001322 void *pArg = (void*)(int)aAggs[i].argType;
danielk1977771151b2006-01-17 13:21:40 +00001323 sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001324 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001325 if( aAggs[i].needCollSeq ){
1326 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001327 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001328 if( pFunc && aAggs[i].needCollSeq ){
1329 pFunc->needCollSeq = 1;
1330 }
1331 }
drh268380c2004-02-25 13:47:31 +00001332 }
danielk19774adee202004-05-08 08:23:19 +00001333 sqlite3RegisterDateTimeFunctions(db);
drhb7481e72006-09-16 21:45:14 +00001334 sqlite3_overload_function(db, "MATCH", 2);
danielk1977fd9e1f32005-05-22 10:44:34 +00001335#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001336 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001337#endif
drh55ef4d92005-08-14 01:20:37 +00001338#ifdef SQLITE_CASE_SENSITIVE_LIKE
1339 sqlite3RegisterLikeFunctions(db, 1);
1340#else
1341 sqlite3RegisterLikeFunctions(db, 0);
1342#endif
1343}
1344
1345/*
1346** Set the LIKEOPT flag on the 2-argument function with the given name.
1347*/
drhd64fe2f2005-08-28 17:00:23 +00001348static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001349 FuncDef *pDef;
1350 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1351 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001352 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001353 }
1354}
1355
1356/*
1357** Register the built-in LIKE and GLOB functions. The caseSensitive
1358** parameter determines whether or not the LIKE operator is case
1359** sensitive. GLOB is always case sensitive.
1360*/
1361void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1362 struct compareInfo *pInfo;
1363 if( caseSensitive ){
1364 pInfo = (struct compareInfo*)&likeInfoAlt;
1365 }else{
1366 pInfo = (struct compareInfo*)&likeInfoNorm;
1367 }
danielk1977771151b2006-01-17 13:21:40 +00001368 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1369 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1370 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001371 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001372 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1373 setLikeOptFlag(db, "like",
1374 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001375}
1376
1377/*
1378** pExpr points to an expression which implements a function. If
1379** it is appropriate to apply the LIKE optimization to that function
1380** then set aWc[0] through aWc[2] to the wildcard characters and
1381** return TRUE. If the function is not a LIKE-style function then
1382** return FALSE.
1383*/
drhd64fe2f2005-08-28 17:00:23 +00001384int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001385 FuncDef *pDef;
1386 if( pExpr->op!=TK_FUNCTION ){
1387 return 0;
1388 }
1389 if( pExpr->pList->nExpr!=2 ){
1390 return 0;
1391 }
drh2646da72005-12-09 20:02:05 +00001392 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001393 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001394 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001395 return 0;
1396 }
1397
1398 /* The memcpy() statement assumes that the wildcard characters are
1399 ** the first three statements in the compareInfo structure. The
1400 ** asserts() that follow verify that assumption
1401 */
1402 memcpy(aWc, pDef->pUserData, 3);
1403 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1404 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1405 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001406 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001407 return 1;
drhdc04c582002-02-24 01:55:15 +00001408}