blob: 2012666bfb1e0a98803f022c116b0b25670cf2cd [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**
drh2e6400b2007-05-08 15:46:18 +000019** $Id: func.c,v 1.151 2007/05/08 15:46:18 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;
drh023ae032007-05-08 12:12:16 +0000159 int len;
160 i64 p1, p2;
drhf9b596e2004-05-26 16:54:42 +0000161
drh0bce8352002-02-28 00:41:10 +0000162 assert( argc==3 );
drh4f26d6c2004-05-26 23:25:30 +0000163 z = sqlite3_value_text(argv[0]);
drh0bce8352002-02-28 00:41:10 +0000164 if( z==0 ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000165 p1 = sqlite3_value_int(argv[1]);
166 p2 = sqlite3_value_int(argv[2]);
drh47c8a672002-02-28 04:00:12 +0000167 for(len=0, z2=z; *z2; z2++){ if( (0xc0&*z2)!=0x80 ) len++; }
drh0bce8352002-02-28 00:41:10 +0000168 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000169 p1 += len;
drh653bc752002-02-28 03:31:10 +0000170 if( p1<0 ){
171 p2 += p1;
172 p1 = 0;
173 }
drh0bce8352002-02-28 00:41:10 +0000174 }else if( p1>0 ){
175 p1--;
176 }
177 if( p1+p2>len ){
178 p2 = len-p1;
179 }
drh77396302004-01-02 13:17:48 +0000180 for(i=0; i<p1 && z[i]; i++){
drh47c8a672002-02-28 04:00:12 +0000181 if( (z[i]&0xc0)==0x80 ) p1++;
drh0bce8352002-02-28 00:41:10 +0000182 }
drh47c8a672002-02-28 04:00:12 +0000183 while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p1++; }
drh77396302004-01-02 13:17:48 +0000184 for(; i<p1+p2 && z[i]; i++){
drh47c8a672002-02-28 04:00:12 +0000185 if( (z[i]&0xc0)==0x80 ) p2++;
drh0bce8352002-02-28 00:41:10 +0000186 }
drh47c8a672002-02-28 04:00:12 +0000187 while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p2++; }
drh653bc752002-02-28 03:31:10 +0000188 if( p2<0 ) p2 = 0;
drh2646da72005-12-09 20:02:05 +0000189 sqlite3_result_text(context, (char*)&z[p1], p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000190}
191
192/*
193** Implementation of the round() function
194*/
danielk19770ae8b832004-05-25 12:05:56 +0000195static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000196 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000197 double r;
drh592ac8c2005-08-13 03:07:47 +0000198 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000199 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000200 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000201 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000202 n = sqlite3_value_int(argv[1]);
203 if( n>30 ) n = 30;
204 if( n<0 ) n = 0;
205 }
drhd589a922006-03-02 03:02:48 +0000206 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000207 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000208 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000209 sqlite3AtoF(zBuf, &r);
210 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000211}
drhdc04c582002-02-24 01:55:15 +0000212
213/*
214** Implementation of the upper() and lower() SQL functions.
215*/
danielk19770ae8b832004-05-25 12:05:56 +0000216static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000217 char *z1;
218 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000219 int i, n;
drh9c054832004-05-31 18:51:57 +0000220 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh9310ef22007-04-27 17:16:20 +0000221 n = sqlite3_value_bytes(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000222 z2 = (char*)sqlite3_value_text(argv[0]);
223 if( z2 ){
drh9310ef22007-04-27 17:16:20 +0000224 z1 = sqlite3_malloc(n+1);
drh7a521cf2007-04-25 18:23:52 +0000225 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000226 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000227 for(i=0; z1[i]; i++){
228 z1[i] = toupper(z1[i]);
229 }
230 sqlite3_result_text(context, z1, -1, sqlite3_free);
231 }
drhdc04c582002-02-24 01:55:15 +0000232 }
233}
danielk19770ae8b832004-05-25 12:05:56 +0000234static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000235 char *z1;
236 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000237 int i, n;
drh9c054832004-05-31 18:51:57 +0000238 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh9310ef22007-04-27 17:16:20 +0000239 n = sqlite3_value_bytes(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000240 z2 = (char*)sqlite3_value_text(argv[0]);
241 if( z2 ){
drh9310ef22007-04-27 17:16:20 +0000242 z1 = sqlite3_malloc(n+1);
drh7a521cf2007-04-25 18:23:52 +0000243 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000244 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000245 for(i=0; z1[i]; i++){
246 z1[i] = tolower(z1[i]);
247 }
248 sqlite3_result_text(context, z1, -1, sqlite3_free);
249 }
drhdc04c582002-02-24 01:55:15 +0000250 }
251}
252
253/*
drhfbc99082002-02-28 03:14:18 +0000254** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000255** All three do the same thing. They return the first non-NULL
256** argument.
drh3212e182002-02-28 00:46:26 +0000257*/
drhf9b596e2004-05-26 16:54:42 +0000258static void ifnullFunc(
259 sqlite3_context *context,
260 int argc,
261 sqlite3_value **argv
262){
drhfbc99082002-02-28 03:14:18 +0000263 int i;
264 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000265 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000266 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000267 break;
268 }
269 }
drh3212e182002-02-28 00:46:26 +0000270}
271
272/*
drhf9ffac92002-03-02 19:00:31 +0000273** Implementation of random(). Return a random integer.
274*/
drhf9b596e2004-05-26 16:54:42 +0000275static void randomFunc(
276 sqlite3_context *context,
277 int argc,
278 sqlite3_value **argv
279){
drh52fc8492006-02-23 21:43:55 +0000280 sqlite_int64 r;
danielk19774adee202004-05-08 08:23:19 +0000281 sqlite3Randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000282 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
283 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000284 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000285}
286
287/*
drh137c7282007-01-29 17:58:28 +0000288** Implementation of randomblob(N). Return a random blob
289** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000290*/
drh137c7282007-01-29 17:58:28 +0000291static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000292 sqlite3_context *context,
293 int argc,
294 sqlite3_value **argv
295){
drh137c7282007-01-29 17:58:28 +0000296 int n;
297 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000298 assert( argc==1 );
299 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000300 if( n<1 ){
301 n = 1;
302 }
303 if( n>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000304 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000305 return;
306 }
drh02d85832007-05-07 19:31:15 +0000307 p = sqliteMalloc(n);
308 if( p ){
309 sqlite3Randomness(n, p);
310 sqlite3_result_blob(context, (char*)p, n, sqlite3FreeX);
311 }
drh63cf66f2007-01-29 15:50:05 +0000312}
313
314/*
drh6ed41ad2002-04-06 14:10:47 +0000315** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000316** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000317*/
danielk197751ad0ec2004-05-24 12:39:02 +0000318static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000319 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000320 int arg,
321 sqlite3_value **argv
322){
drh9bb575f2004-09-06 17:24:11 +0000323 sqlite3 *db = sqlite3_user_data(context);
drhf9b596e2004-05-26 16:54:42 +0000324 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000325}
326
rdcf146a772004-02-25 22:51:06 +0000327/*
danielk1977b28af712004-06-21 06:50:26 +0000328** Implementation of the changes() SQL function. The return value is the
329** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000330*/
danielk1977b28af712004-06-21 06:50:26 +0000331static void changes(
drhf9b596e2004-05-26 16:54:42 +0000332 sqlite3_context *context,
333 int arg,
334 sqlite3_value **argv
335){
drh9bb575f2004-09-06 17:24:11 +0000336 sqlite3 *db = sqlite3_user_data(context);
drhf4479502004-05-27 03:12:53 +0000337 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000338}
rdcf146a772004-02-25 22:51:06 +0000339
340/*
danielk1977b28af712004-06-21 06:50:26 +0000341** Implementation of the total_changes() SQL function. The return value is
342** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000343*/
danielk1977b28af712004-06-21 06:50:26 +0000344static void total_changes(
345 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000346 int arg,
347 sqlite3_value **argv
348){
drh9bb575f2004-09-06 17:24:11 +0000349 sqlite3 *db = sqlite3_user_data(context);
danielk1977b28af712004-06-21 06:50:26 +0000350 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000351}
352
drh6ed41ad2002-04-06 14:10:47 +0000353/*
drh4e5ffc52004-08-31 00:52:37 +0000354** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000355*/
drh4e5ffc52004-08-31 00:52:37 +0000356struct compareInfo {
357 u8 matchAll;
358 u8 matchOne;
359 u8 matchSet;
360 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000361};
drh55ef4d92005-08-14 01:20:37 +0000362
drh4e5ffc52004-08-31 00:52:37 +0000363static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000364/* The correct SQL-92 behavior is for the LIKE operator to ignore
365** case. Thus 'a' LIKE 'A' would be true. */
366static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
367/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
368** is case sensitive causing 'a' LIKE 'A' to be false */
369static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000370
371/*
drh4e5ffc52004-08-31 00:52:37 +0000372** X is a pointer to the first byte of a UTF-8 character. Increment
373** X so that it points to the next character. This only works right
374** if X points to a well-formed UTF-8 string.
danielk1977d02eb1f2004-06-06 09:44:03 +0000375*/
drh4e5ffc52004-08-31 00:52:37 +0000376#define sqliteNextChar(X) while( (0xc0&*++(X))==0x80 ){}
377#define sqliteCharVal(X) sqlite3ReadUtf8(X)
danielk1977d02eb1f2004-06-06 09:44:03 +0000378
danielk1977d02eb1f2004-06-06 09:44:03 +0000379
380/*
drh4e5ffc52004-08-31 00:52:37 +0000381** Compare two UTF-8 strings for equality where the first string can
382** potentially be a "glob" expression. Return true (1) if they
383** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000384**
drh4e5ffc52004-08-31 00:52:37 +0000385** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000386**
drh4e5ffc52004-08-31 00:52:37 +0000387** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000388**
drh4e5ffc52004-08-31 00:52:37 +0000389** '?' Matches exactly one character.
390**
391** [...] Matches one character from the enclosed list of
392** characters.
393**
394** [^...] Matches one character not in the enclosed list.
395**
396** With the [...] and [^...] matching, a ']' character can be included
397** in the list by making it the first character after '[' or '^'. A
398** range of characters can be specified using '-'. Example:
399** "[a-z]" matches any single lower-case letter. To match a '-', make
400** it the last character in the list.
401**
402** This routine is usually quick, but can be N**2 in the worst case.
403**
404** Hints: to match '*' or '?', put them in "[]". Like this:
405**
406** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000407*/
danielk19777c6303c2004-11-17 16:41:29 +0000408static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000409 const u8 *zPattern, /* The glob pattern */
410 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000411 const struct compareInfo *pInfo, /* Information about how to do the compare */
412 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000413){
danielk1977ad7dd422004-06-06 12:41:49 +0000414 register int c;
drh4e5ffc52004-08-31 00:52:37 +0000415 int invert;
416 int seen;
417 int c2;
418 u8 matchOne = pInfo->matchOne;
419 u8 matchAll = pInfo->matchAll;
420 u8 matchSet = pInfo->matchSet;
421 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000422 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000423
drh4e5ffc52004-08-31 00:52:37 +0000424 while( (c = *zPattern)!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000425 if( !prevEscape && c==matchAll ){
drh4e5ffc52004-08-31 00:52:37 +0000426 while( (c=zPattern[1]) == matchAll || c == matchOne ){
427 if( c==matchOne ){
428 if( *zString==0 ) return 0;
429 sqliteNextChar(zString);
430 }
431 zPattern++;
danielk1977ad7dd422004-06-06 12:41:49 +0000432 }
drh20fc0882004-11-18 13:49:25 +0000433 if( c && esc && sqlite3ReadUtf8(&zPattern[1])==esc ){
danielk19777c6303c2004-11-17 16:41:29 +0000434 u8 const *zTemp = &zPattern[1];
435 sqliteNextChar(zTemp);
436 c = *zTemp;
437 }
drh4e5ffc52004-08-31 00:52:37 +0000438 if( c==0 ) return 1;
439 if( c==matchSet ){
danielk19777c6303c2004-11-17 16:41:29 +0000440 assert( esc==0 ); /* This is GLOB, not LIKE */
441 while( *zString && patternCompare(&zPattern[1],zString,pInfo,esc)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000442 sqliteNextChar(zString);
443 }
444 return *zString!=0;
445 }else{
446 while( (c2 = *zString)!=0 ){
447 if( noCase ){
448 c2 = sqlite3UpperToLower[c2];
449 c = sqlite3UpperToLower[c];
450 while( c2 != 0 && c2 != c ){ c2 = sqlite3UpperToLower[*++zString]; }
451 }else{
452 while( c2 != 0 && c2 != c ){ c2 = *++zString; }
453 }
454 if( c2==0 ) return 0;
danielk19777c6303c2004-11-17 16:41:29 +0000455 if( patternCompare(&zPattern[1],zString,pInfo,esc) ) return 1;
drh4e5ffc52004-08-31 00:52:37 +0000456 sqliteNextChar(zString);
457 }
458 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000459 }
danielk19777c6303c2004-11-17 16:41:29 +0000460 }else if( !prevEscape && c==matchOne ){
drh4e5ffc52004-08-31 00:52:37 +0000461 if( *zString==0 ) return 0;
462 sqliteNextChar(zString);
463 zPattern++;
464 }else if( c==matchSet ){
465 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000466 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000467 seen = 0;
468 invert = 0;
469 c = sqliteCharVal(zString);
470 if( c==0 ) return 0;
471 c2 = *++zPattern;
472 if( c2=='^' ){ invert = 1; c2 = *++zPattern; }
473 if( c2==']' ){
474 if( c==']' ) seen = 1;
475 c2 = *++zPattern;
476 }
477 while( (c2 = sqliteCharVal(zPattern))!=0 && c2!=']' ){
478 if( c2=='-' && zPattern[1]!=']' && zPattern[1]!=0 && prior_c>0 ){
479 zPattern++;
480 c2 = sqliteCharVal(zPattern);
481 if( c>=prior_c && c<=c2 ) seen = 1;
482 prior_c = 0;
483 }else if( c==c2 ){
484 seen = 1;
485 prior_c = c2;
486 }else{
487 prior_c = c2;
488 }
489 sqliteNextChar(zPattern);
490 }
491 if( c2==0 || (seen ^ invert)==0 ) return 0;
492 sqliteNextChar(zString);
493 zPattern++;
drh20fc0882004-11-18 13:49:25 +0000494 }else if( esc && !prevEscape && sqlite3ReadUtf8(zPattern)==esc){
danielk19777c6303c2004-11-17 16:41:29 +0000495 prevEscape = 1;
496 sqliteNextChar(zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000497 }else{
498 if( noCase ){
499 if( sqlite3UpperToLower[c] != sqlite3UpperToLower[*zString] ) return 0;
500 }else{
501 if( c != *zString ) return 0;
502 }
503 zPattern++;
504 zString++;
danielk19777c6303c2004-11-17 16:41:29 +0000505 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000506 }
danielk197751ad0ec2004-05-24 12:39:02 +0000507 }
drh4e5ffc52004-08-31 00:52:37 +0000508 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000509}
drh4e5ffc52004-08-31 00:52:37 +0000510
drh55ef4d92005-08-14 01:20:37 +0000511/*
512** Count the number of times that the LIKE operator (or GLOB which is
513** just a variation of LIKE) gets called. This is used for testing
514** only.
515*/
516#ifdef SQLITE_TEST
517int sqlite3_like_count = 0;
518#endif
519
danielk19773f6b0872004-06-17 05:36:44 +0000520
521/*
522** Implementation of the like() SQL function. This function implements
523** the build-in LIKE operator. The first argument to the function is the
524** pattern and the second argument is the string. So, the SQL statements:
525**
526** A LIKE B
527**
528** is implemented as like(B,A).
529**
drh55ef4d92005-08-14 01:20:37 +0000530** This same function (with a different compareInfo structure) computes
531** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000532*/
533static void likeFunc(
534 sqlite3_context *context,
535 int argc,
536 sqlite3_value **argv
537){
drhbeb818d2007-05-08 15:34:47 +0000538 const unsigned char *zA, *zB;
539
540 /* Limit the length of the LIKE or GLOB pattern to avoid problems
541 ** of deep recursion and N*N behavior in patternCompare().
542 */
543 if( sqlite3_value_bytes(argv[1])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){
544 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
545 return;
546 }
547
548
549 zA = sqlite3_value_text(argv[0]);
550 zB = sqlite3_value_text(argv[1]);
danielk19777c6303c2004-11-17 16:41:29 +0000551 int escape = 0;
552 if( argc==3 ){
553 /* The escape character string must consist of a single UTF-8 character.
554 ** Otherwise, return an error.
555 */
556 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000557 if( zEsc==0 ) return;
drh2646da72005-12-09 20:02:05 +0000558 if( sqlite3utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000559 sqlite3_result_error(context,
560 "ESCAPE expression must be a single character", -1);
561 return;
562 }
563 escape = sqlite3ReadUtf8(zEsc);
564 }
danielk19773f6b0872004-06-17 05:36:44 +0000565 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000566 struct compareInfo *pInfo = sqlite3_user_data(context);
567#ifdef SQLITE_TEST
568 sqlite3_like_count++;
569#endif
drhbeb818d2007-05-08 15:34:47 +0000570
drh55ef4d92005-08-14 01:20:37 +0000571 sqlite3_result_int(context, patternCompare(zA, zB, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000572 }
drh8912d102002-05-26 21:34:58 +0000573}
574
575/*
576** Implementation of the NULLIF(x,y) function. The result is the first
577** argument if the arguments are different. The result is NULL if the
578** arguments are equal to each other.
579*/
drhf9b596e2004-05-26 16:54:42 +0000580static void nullifFunc(
581 sqlite3_context *context,
582 int argc,
583 sqlite3_value **argv
584){
danielk1977dc1bdc42004-06-11 10:51:27 +0000585 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
586 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000587 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000588 }
drh0ac65892002-04-20 14:24:41 +0000589}
590
drh647cb0e2002-11-04 19:32:25 +0000591/*
592** Implementation of the VERSION(*) function. The result is the version
593** of the SQLite library that is running.
594*/
drhf9b596e2004-05-26 16:54:42 +0000595static void versionFunc(
596 sqlite3_context *context,
597 int argc,
598 sqlite3_value **argv
599){
danielk1977d8123362004-06-12 09:25:12 +0000600 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000601}
602
drh137c7282007-01-29 17:58:28 +0000603/* Array for converting from half-bytes (nybbles) into ASCII hex
604** digits. */
605static const char hexdigits[] = {
606 '0', '1', '2', '3', '4', '5', '6', '7',
607 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
608};
danielk1977d641d642004-11-18 15:44:29 +0000609
drh47394702003-08-20 01:03:33 +0000610/*
611** EXPERIMENTAL - This is not an official function. The interface may
612** change. This function may disappear. Do not write code that depends
613** on this function.
614**
615** Implementation of the QUOTE() function. This function takes a single
616** argument. If the argument is numeric, the return value is the same as
617** the argument. If the argument is NULL, the return value is the string
618** "NULL". Otherwise, the argument is enclosed in single quotes with
619** single-quote escapes.
620*/
danielk19770ae8b832004-05-25 12:05:56 +0000621static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000622 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000623 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000624 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000625 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000626 break;
drh47394702003-08-20 01:03:33 +0000627 }
drh9c054832004-05-31 18:51:57 +0000628 case SQLITE_INTEGER:
629 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000630 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000631 break;
632 }
danielk19773f41e972004-06-08 00:39:01 +0000633 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000634 char *zText = 0;
635 int nBlob = sqlite3_value_bytes(argv[0]);
636 char const *zBlob = sqlite3_value_blob(argv[0]);
637
drh023ae032007-05-08 12:12:16 +0000638 if( 2*nBlob+4>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000639 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000640 return;
641 }
danielk19773f41e972004-06-08 00:39:01 +0000642 zText = (char *)sqliteMalloc((2*nBlob)+4);
643 if( !zText ){
644 sqlite3_result_error(context, "out of memory", -1);
645 }else{
646 int i;
647 for(i=0; i<nBlob; i++){
648 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
649 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
650 }
651 zText[(nBlob*2)+2] = '\'';
652 zText[(nBlob*2)+3] = '\0';
653 zText[0] = 'X';
654 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000655 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
danielk19773f41e972004-06-08 00:39:01 +0000656 sqliteFree(zText);
657 }
658 break;
659 }
drh9c054832004-05-31 18:51:57 +0000660 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000661 int i,j;
662 u64 n;
drh2646da72005-12-09 20:02:05 +0000663 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000664 char *z;
665
drh7a521cf2007-04-25 18:23:52 +0000666 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000667 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
668 if( i+n+3>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000669 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000670 return;
671 }
drhf9b596e2004-05-26 16:54:42 +0000672 z = sqliteMalloc( i+n+3 );
673 if( z==0 ) return;
674 z[0] = '\'';
675 for(i=0, j=1; zArg[i]; i++){
676 z[j++] = zArg[i];
677 if( zArg[i]=='\'' ){
678 z[j++] = '\'';
679 }
680 }
681 z[j++] = '\'';
682 z[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000683 sqlite3_result_text(context, z, j, SQLITE_TRANSIENT);
drhf9b596e2004-05-26 16:54:42 +0000684 sqliteFree(z);
685 }
drh47394702003-08-20 01:03:33 +0000686 }
687}
688
drh137c7282007-01-29 17:58:28 +0000689/*
690** The hex() function. Interpret the argument as a blob. Return
691** a hexadecimal rendering as text.
692*/
693static void hexFunc(
694 sqlite3_context *context,
695 int argc,
696 sqlite3_value **argv
697){
698 int i, n;
699 const unsigned char *pBlob;
700 char *zHex, *z;
701 assert( argc==1 );
drh137c7282007-01-29 17:58:28 +0000702 n = sqlite3_value_bytes(argv[0]);
drh023ae032007-05-08 12:12:16 +0000703 if( n*2+1>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000704 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000705 return;
706 }
drh1eb25382007-04-10 13:51:17 +0000707 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000708 z = zHex = sqlite3_malloc(n*2 + 1);
709 if( zHex==0 ) return;
710 for(i=0; i<n; i++, pBlob++){
711 unsigned char c = *pBlob;
712 *(z++) = hexdigits[(c>>4)&0xf];
713 *(z++) = hexdigits[c&0xf];
714 }
715 *z = 0;
716 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
717}
718
drh26b6d902007-03-17 13:27:54 +0000719/*
drh8cff3822007-05-02 02:08:28 +0000720** The zeroblob(N) function returns a zero-filled blob of size N bytes.
721*/
722static void zeroblobFunc(
723 sqlite3_context *context,
724 int argc,
725 sqlite3_value **argv
726){
727 int n;
728 assert( argc==1 );
729 n = sqlite3_value_int(argv[0]);
730 sqlite3_result_zeroblob(context, n);
731}
732
733/*
drh26b6d902007-03-17 13:27:54 +0000734** The replace() function. Three arguments are all strings: call
735** them A, B, and C. The result is also a string which is derived
736** from A by replacing every occurance of B with C. The match
737** must be exact. Collating sequences are not used.
738*/
739static void replaceFunc(
740 sqlite3_context *context,
741 int argc,
742 sqlite3_value **argv
743){
744 const unsigned char *zStr; /* The input string A */
745 const unsigned char *zPattern; /* The pattern string B */
746 const unsigned char *zRep; /* The replacement string C */
747 unsigned char *zOut; /* The output */
748 int nStr; /* Size of zStr */
749 int nPattern; /* Size of zPattern */
750 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000751 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000752 int loopLimit; /* Last zStr[] that might match zPattern[] */
753 int i, j; /* Loop counters */
754
755 assert( argc==3 );
drh9310ef22007-04-27 17:16:20 +0000756 nStr = sqlite3_value_bytes(argv[0]);
drh26b6d902007-03-17 13:27:54 +0000757 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000758 if( zStr==0 ) return;
drh9310ef22007-04-27 17:16:20 +0000759 nPattern = sqlite3_value_bytes(argv[1]);
drh26b6d902007-03-17 13:27:54 +0000760 zPattern = sqlite3_value_text(argv[1]);
drh709cff32007-04-27 01:18:02 +0000761 if( zPattern==0 || zPattern[0]==0 ) return;
drh9310ef22007-04-27 17:16:20 +0000762 nRep = sqlite3_value_bytes(argv[2]);
drh26b6d902007-03-17 13:27:54 +0000763 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000764 if( zRep==0 ) return;
drh2e6400b2007-05-08 15:46:18 +0000765 nOut = nStr + 1;
766 assert( nOut<SQLITE_MAX_LENGTH );
767 zOut = sqlite3_malloc((int)nOut);
768 if( zOut==0 ){
769 return;
drh26b6d902007-03-17 13:27:54 +0000770 }
drh26b6d902007-03-17 13:27:54 +0000771 loopLimit = nStr - nPattern;
772 for(i=j=0; i<=loopLimit; i++){
773 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
774 zOut[j++] = zStr[i];
775 }else{
drh2e6400b2007-05-08 15:46:18 +0000776 nOut += nRep - nPattern;
777 if( nOut>=SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000778 sqlite3_result_error_toobig(context);
danielk197717374e82007-05-08 14:39:04 +0000779 sqlite3_free(zOut);
780 return;
781 }
drh2e6400b2007-05-08 15:46:18 +0000782 zOut = sqlite3_realloc(zOut, (int)nOut);
783 if( zOut==0 ){
784 return;
785 }
drh26b6d902007-03-17 13:27:54 +0000786 memcpy(&zOut[j], zRep, nRep);
787 j += nRep;
788 i += nPattern-1;
789 }
790 }
drh2e6400b2007-05-08 15:46:18 +0000791 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000792 memcpy(&zOut[j], &zStr[i], nStr-i);
793 j += nStr - i;
794 assert( j<=nOut );
795 zOut[j] = 0;
796 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
797}
798
drh309b3382007-03-17 17:52:42 +0000799/*
800** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
801** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
802*/
803static void trimFunc(
804 sqlite3_context *context,
805 int argc,
806 sqlite3_value **argv
807){
808 const unsigned char *zIn; /* Input string */
809 const unsigned char *zCharSet; /* Set of characters to trim */
810 int nIn; /* Number of bytes in input */
drhd1e3a612007-04-27 21:59:52 +0000811 int flags; /* 1: trimleft 2: trimright 3: trim */
812 int i; /* Loop counter */
813 unsigned char *aLen; /* Length of each character in zCharSet */
814 const unsigned char **azChar; /* Individual characters in zCharSet */
815 int nChar; /* Number of characters in zCharSet */
816
drh309b3382007-03-17 17:52:42 +0000817 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
818 return;
819 }
drh9310ef22007-04-27 17:16:20 +0000820 nIn = sqlite3_value_bytes(argv[0]);
drh309b3382007-03-17 17:52:42 +0000821 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000822 if( zIn==0 ) return;
drh309b3382007-03-17 17:52:42 +0000823 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000824 static const unsigned char lenOne[] = { 1 };
drh8cff3822007-05-02 02:08:28 +0000825 static const unsigned char *azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000826 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000827 aLen = (u8*)lenOne;
828 azChar = azOne;
drhd1e3a612007-04-27 21:59:52 +0000829 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000830 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000831 return;
drhd1e3a612007-04-27 21:59:52 +0000832 }else{
833 const unsigned char *z;
834 for(z=zCharSet, nChar=0; *z; nChar++){
835 sqliteNextChar(z);
836 }
837 if( nChar>0 ){
838 azChar = sqlite3_malloc( nChar*(sizeof(char*)+1) );
839 if( azChar==0 ){
840 return;
841 }
842 aLen = (unsigned char*)&azChar[nChar];
843 for(z=zCharSet, nChar=0; *z; nChar++){
844 azChar[nChar] = z;
845 sqliteNextChar(z);
846 aLen[nChar] = z - azChar[nChar];
847 }
848 }
drh309b3382007-03-17 17:52:42 +0000849 }
drhd1e3a612007-04-27 21:59:52 +0000850 if( nChar>0 ){
drh309b3382007-03-17 17:52:42 +0000851 flags = (int)sqlite3_user_data(context);
852 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000853 while( nIn>0 ){
854 int len;
855 for(i=0; i<nChar; i++){
856 len = aLen[i];
857 if( memcmp(zIn, azChar[i], len)==0 ) break;
858 }
859 if( i>=nChar ) break;
860 zIn += len;
861 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000862 }
863 }
864 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000865 while( nIn>0 ){
866 int len;
867 for(i=0; i<nChar; i++){
868 len = aLen[i];
869 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
870 }
871 if( i>=nChar ) break;
872 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000873 }
874 }
drhd1e3a612007-04-27 21:59:52 +0000875 if( zCharSet ){
876 sqlite3_free(azChar);
877 }
drh309b3382007-03-17 17:52:42 +0000878 }
879 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
880}
drh26b6d902007-03-17 13:27:54 +0000881
drhd24cc422003-03-27 12:51:24 +0000882#ifdef SQLITE_SOUNDEX
883/*
884** Compute the soundex encoding of a word.
885*/
drh137c7282007-01-29 17:58:28 +0000886static void soundexFunc(
887 sqlite3_context *context,
888 int argc,
889 sqlite3_value **argv
890){
drhd24cc422003-03-27 12:51:24 +0000891 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000892 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000893 int i, j;
894 static const unsigned char iCode[] = {
895 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
896 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
897 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
898 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
899 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
900 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
901 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
902 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
903 };
904 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000905 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000906 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000907 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
908 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000909 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000910 zResult[0] = toupper(zIn[i]);
911 for(j=1; j<4 && zIn[i]; i++){
912 int code = iCode[zIn[i]&0x7f];
913 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000914 if( code!=prevcode ){
915 prevcode = code;
916 zResult[j++] = code + '0';
917 }
918 }else{
919 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000920 }
921 }
922 while( j<4 ){
923 zResult[j++] = '0';
924 }
925 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000926 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000927 }else{
danielk1977d8123362004-06-12 09:25:12 +0000928 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000929 }
930}
931#endif
932
drhfdb83b22006-06-17 14:12:47 +0000933#ifndef SQLITE_OMIT_LOAD_EXTENSION
934/*
935** A function that loads a shared-library extension then returns NULL.
936*/
937static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +0000938 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000939 const char *zProc;
drhfdb83b22006-06-17 14:12:47 +0000940 sqlite3 *db = sqlite3_user_data(context);
941 char *zErrMsg = 0;
942
943 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +0000944 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +0000945 }else{
946 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +0000947 }
drh7a521cf2007-04-25 18:23:52 +0000948 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +0000949 sqlite3_result_error(context, zErrMsg, -1);
950 sqlite3_free(zErrMsg);
951 }
952}
953#endif
954
drh193a6b42002-07-07 16:52:46 +0000955#ifdef SQLITE_TEST
956/*
957** This function generates a string of random characters. Used for
958** generating test data.
959*/
danielk19770ae8b832004-05-25 12:05:56 +0000960static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +0000961 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +0000962 "abcdefghijklmnopqrstuvwxyz"
963 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
964 "0123456789"
965 ".-!,:*^+=_|?/<> ";
966 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +0000967 unsigned char zBuf[1000];
drh193a6b42002-07-07 16:52:46 +0000968 if( argc>=1 ){
drhf9b596e2004-05-26 16:54:42 +0000969 iMin = sqlite3_value_int(argv[0]);
drh193a6b42002-07-07 16:52:46 +0000970 if( iMin<0 ) iMin = 0;
971 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
972 }else{
973 iMin = 1;
974 }
975 if( argc>=2 ){
drhf9b596e2004-05-26 16:54:42 +0000976 iMax = sqlite3_value_int(argv[1]);
drh193a6b42002-07-07 16:52:46 +0000977 if( iMax<iMin ) iMax = iMin;
drh1dba7272004-01-16 13:58:18 +0000978 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +0000979 }else{
980 iMax = 50;
981 }
982 n = iMin;
983 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +0000984 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +0000985 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +0000986 n += r%(iMax + 1 - iMin);
987 }
drh1dba7272004-01-16 13:58:18 +0000988 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +0000989 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +0000990 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +0000991 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +0000992 }
993 zBuf[n] = 0;
drh2646da72005-12-09 20:02:05 +0000994 sqlite3_result_text(context, (char*)zBuf, n, SQLITE_TRANSIENT);
danielk1977d8123362004-06-12 09:25:12 +0000995}
drh0e3d7472004-06-19 17:33:07 +0000996#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +0000997
drh0e3d7472004-06-19 17:33:07 +0000998#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +0000999/*
1000** The following two SQL functions are used to test returning a text
1001** result with a destructor. Function 'test_destructor' takes one argument
1002** and returns the same argument interpreted as TEXT. A destructor is
1003** passed with the sqlite3_result_text() call.
1004**
1005** SQL function 'test_destructor_count' returns the number of outstanding
1006** allocations made by 'test_destructor';
1007**
1008** WARNING: Not threadsafe.
1009*/
1010static int test_destructor_count_var = 0;
1011static void destructor(void *p){
1012 char *zVal = (char *)p;
1013 assert(zVal);
1014 zVal--;
1015 sqliteFree(zVal);
1016 test_destructor_count_var--;
1017}
1018static void test_destructor(
1019 sqlite3_context *pCtx,
1020 int nArg,
1021 sqlite3_value **argv
1022){
1023 char *zVal;
danielk1977f4618892004-06-28 13:09:11 +00001024 int len;
drh9bb575f2004-09-06 17:24:11 +00001025 sqlite3 *db = sqlite3_user_data(pCtx);
danielk1977f4618892004-06-28 13:09:11 +00001026
danielk1977d8123362004-06-12 09:25:12 +00001027 test_destructor_count_var++;
1028 assert( nArg==1 );
1029 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
danielk197714db2662006-01-09 16:12:04 +00001030 len = sqlite3ValueBytes(argv[0], ENC(db));
danielk1977f4618892004-06-28 13:09:11 +00001031 zVal = sqliteMalloc(len+3);
1032 zVal[len] = 0;
1033 zVal[len-1] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001034 assert( zVal );
1035 zVal++;
danielk197714db2662006-01-09 16:12:04 +00001036 memcpy(zVal, sqlite3ValueText(argv[0], ENC(db)), len);
1037 if( ENC(db)==SQLITE_UTF8 ){
danielk1977f4618892004-06-28 13:09:11 +00001038 sqlite3_result_text(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001039#ifndef SQLITE_OMIT_UTF16
danielk197714db2662006-01-09 16:12:04 +00001040 }else if( ENC(db)==SQLITE_UTF16LE ){
danielk1977f4618892004-06-28 13:09:11 +00001041 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
1042 }else{
1043 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001044#endif /* SQLITE_OMIT_UTF16 */
danielk1977f4618892004-06-28 13:09:11 +00001045 }
danielk1977d8123362004-06-12 09:25:12 +00001046}
1047static void test_destructor_count(
1048 sqlite3_context *pCtx,
1049 int nArg,
1050 sqlite3_value **argv
1051){
1052 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +00001053}
drh0e3d7472004-06-19 17:33:07 +00001054#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +00001055
drh0e3d7472004-06-19 17:33:07 +00001056#ifdef SQLITE_TEST
1057/*
1058** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
1059** interface.
1060**
1061** The test_auxdata() SQL function attempts to register each of its arguments
1062** as auxiliary data. If there are no prior registrations of aux data for
1063** that argument (meaning the argument is not a constant or this is its first
1064** call) then the result for that argument is 0. If there is a prior
1065** registration, the result for that argument is 1. The overall result
1066** is the individual argument results separated by spaces.
1067*/
danielk19773f6b0872004-06-17 05:36:44 +00001068static void free_test_auxdata(void *p) {sqliteFree(p);}
1069static void test_auxdata(
1070 sqlite3_context *pCtx,
1071 int nArg,
1072 sqlite3_value **argv
1073){
1074 int i;
1075 char *zRet = sqliteMalloc(nArg*2);
1076 if( !zRet ) return;
1077 for(i=0; i<nArg; i++){
drh2646da72005-12-09 20:02:05 +00001078 char const *z = (char*)sqlite3_value_text(argv[i]);
danielk19773f6b0872004-06-17 05:36:44 +00001079 if( z ){
1080 char *zAux = sqlite3_get_auxdata(pCtx, i);
1081 if( zAux ){
1082 zRet[i*2] = '1';
1083 if( strcmp(zAux, z) ){
1084 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
1085 return;
1086 }
1087 }else{
1088 zRet[i*2] = '0';
1089 zAux = sqliteStrDup(z);
1090 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
1091 }
1092 zRet[i*2+1] = ' ';
1093 }
1094 }
1095 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
1096}
drh0e3d7472004-06-19 17:33:07 +00001097#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +00001098
danielk197701427a62005-01-11 13:02:33 +00001099#ifdef SQLITE_TEST
1100/*
1101** A function to test error reporting from user functions. This function
1102** returns a copy of it's first argument as an error.
1103*/
1104static void test_error(
1105 sqlite3_context *pCtx,
1106 int nArg,
1107 sqlite3_value **argv
1108){
drh2646da72005-12-09 20:02:05 +00001109 sqlite3_result_error(pCtx, (char*)sqlite3_value_text(argv[0]), 0);
danielk197701427a62005-01-11 13:02:33 +00001110}
1111#endif /* SQLITE_TEST */
1112
drh0ac65892002-04-20 14:24:41 +00001113/*
drhd3a149e2002-02-24 17:12:53 +00001114** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001115** sum() or avg() aggregate computation.
1116*/
1117typedef struct SumCtx SumCtx;
1118struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001119 double rSum; /* Floating point sum */
1120 i64 iSum; /* Integer sum */
1121 i64 cnt; /* Number of elements summed */
1122 u8 overflow; /* True if integer overflow seen */
1123 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001124};
1125
1126/*
drha97fdd32006-01-12 22:17:50 +00001127** Routines used to compute the sum, average, and total.
1128**
1129** The SUM() function follows the (broken) SQL standard which means
1130** that it returns NULL if it sums over no inputs. TOTAL returns
1131** 0.0 in that case. In addition, TOTAL always returns a float where
1132** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001133** value. TOTAL never fails, but SUM might through an exception if
1134** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001135*/
danielk19770ae8b832004-05-25 12:05:56 +00001136static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001137 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001138 int type;
drh3f219f42005-09-08 19:45:57 +00001139 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +00001140 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001141 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001142 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001143 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001144 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001145 i64 v = sqlite3_value_int64(argv[0]);
1146 p->rSum += v;
1147 if( (p->approx|p->overflow)==0 ){
1148 i64 iNewSum = p->iSum + v;
1149 int s1 = p->iSum >> (sizeof(i64)*8-1);
1150 int s2 = v >> (sizeof(i64)*8-1);
1151 int s3 = iNewSum >> (sizeof(i64)*8-1);
1152 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
1153 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001154 }
1155 }else{
drh8c08e862006-02-11 17:34:00 +00001156 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001157 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001158 }
drh739105c2002-05-29 23:22:23 +00001159 }
drhdd5baa92002-02-27 19:50:59 +00001160}
danielk19770ae8b832004-05-25 12:05:56 +00001161static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001162 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001163 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001164 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001165 if( p->overflow ){
1166 sqlite3_result_error(context,"integer overflow",-1);
1167 }else if( p->approx ){
1168 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001169 }else{
drh8c08e862006-02-11 17:34:00 +00001170 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001171 }
drh3d1d95e2005-09-08 10:37:01 +00001172 }
drhdd5baa92002-02-27 19:50:59 +00001173}
danielk19770ae8b832004-05-25 12:05:56 +00001174static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001175 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001176 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001177 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001178 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001179 }
1180}
drha97fdd32006-01-12 22:17:50 +00001181static void totalFinalize(sqlite3_context *context){
1182 SumCtx *p;
1183 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001184 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001185}
drhdd5baa92002-02-27 19:50:59 +00001186
1187/*
drh0bce8352002-02-28 00:41:10 +00001188** The following structure keeps track of state information for the
1189** count() aggregate function.
1190*/
1191typedef struct CountCtx CountCtx;
1192struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001193 i64 n;
drh0bce8352002-02-28 00:41:10 +00001194};
drhdd5baa92002-02-27 19:50:59 +00001195
drh0bce8352002-02-28 00:41:10 +00001196/*
1197** Routines to implement the count() aggregate function.
1198*/
danielk19770ae8b832004-05-25 12:05:56 +00001199static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001200 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001201 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001202 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001203 p->n++;
1204 }
1205}
danielk19770ae8b832004-05-25 12:05:56 +00001206static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001207 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001208 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001209 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001210}
1211
1212/*
drh0bce8352002-02-28 00:41:10 +00001213** Routines to implement min() and max() aggregate functions.
1214*/
danielk19770ae8b832004-05-25 12:05:56 +00001215static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +00001216 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001217 Mem *pBest;
1218
1219 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1220 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001221 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001222
danielk197788208052004-05-25 01:13:20 +00001223 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001224 int max;
1225 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001226 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001227 /* This step function is used for both the min() and max() aggregates,
1228 ** the only difference between the two being that the sense of the
1229 ** comparison is inverted. For the max() aggregate, the
1230 ** sqlite3_user_data() function returns (void *)-1. For min() it
1231 ** returns (void *)db, where db is the sqlite3* database pointer.
1232 ** Therefore the next statement sets variable 'max' to 1 for the max()
1233 ** aggregate, or 0 for min().
1234 */
drh309b3382007-03-17 17:52:42 +00001235 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001236 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001237 if( (max && cmp<0) || (!max && cmp>0) ){
danielk19777e18c252004-05-25 11:47:24 +00001238 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001239 }
drh268380c2004-02-25 13:47:31 +00001240 }else{
danielk19777e18c252004-05-25 11:47:24 +00001241 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001242 }
1243}
danielk19770ae8b832004-05-25 12:05:56 +00001244static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001245 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001246 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1247 if( pRes ){
1248 if( pRes->flags ){
1249 sqlite3_result_value(context, pRes);
1250 }
1251 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001252 }
1253}
drhdd5baa92002-02-27 19:50:59 +00001254
drh4e5ffc52004-08-31 00:52:37 +00001255
drhd3a149e2002-02-24 17:12:53 +00001256/*
drha2ed5602002-02-26 23:55:31 +00001257** This function registered all of the above C functions as SQL
1258** functions. This should be the only routine in this file with
1259** external linkage.
drhdc04c582002-02-24 01:55:15 +00001260*/
drh9bb575f2004-09-06 17:24:11 +00001261void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001262 static const struct {
drh0bce8352002-02-28 00:41:10 +00001263 char *zName;
drh268380c2004-02-25 13:47:31 +00001264 signed char nArg;
drh309b3382007-03-17 17:52:42 +00001265 u8 argType; /* ff: db 1: 0, 2: 1, 3: 2,... N: N-1. */
danielk1977f4618892004-06-28 13:09:11 +00001266 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001267 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001268 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001269 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001270 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1271 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
drh309b3382007-03-17 17:52:42 +00001272 { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc },
1273 { "max", 0, 1, SQLITE_UTF8, 1, 0 },
danielk1977f4618892004-06-28 13:09:11 +00001274 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1275 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
1276 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
drh6c626082004-11-14 21:56:29 +00001277#ifndef SQLITE_OMIT_UTF16
danielk1977f4618892004-06-28 13:09:11 +00001278 { "substr", 3, 0, SQLITE_UTF16LE, 0, sqlite3utf16Substr },
drh6c626082004-11-14 21:56:29 +00001279#endif
danielk1977f4618892004-06-28 13:09:11 +00001280 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1281 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1282 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1283 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1284 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1285 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1286 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1287 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
drh137c7282007-01-29 17:58:28 +00001288 { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc },
danielk1977f4618892004-06-28 13:09:11 +00001289 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1290 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
drh137c7282007-01-29 17:58:28 +00001291 { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob },
drh94a98362004-09-13 13:13:18 +00001292 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001293 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1294 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
drh309b3382007-03-17 17:52:42 +00001295 { "last_insert_rowid", 0, 0xff, SQLITE_UTF8, 0, last_insert_rowid },
1296 { "changes", 0, 0xff, SQLITE_UTF8, 0, changes },
1297 { "total_changes", 0, 0xff, SQLITE_UTF8, 0, total_changes },
drh26b6d902007-03-17 13:27:54 +00001298 { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc },
drh309b3382007-03-17 17:52:42 +00001299 { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc },
1300 { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc },
1301 { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc },
1302 { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc },
1303 { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc },
1304 { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc },
drh8cff3822007-05-02 02:08:28 +00001305 { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc },
drhd24cc422003-03-27 12:51:24 +00001306#ifdef SQLITE_SOUNDEX
drh309b3382007-03-17 17:52:42 +00001307 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001308#endif
drhfdb83b22006-06-17 14:12:47 +00001309#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh309b3382007-03-17 17:52:42 +00001310 { "load_extension", 1, 0xff, SQLITE_UTF8, 0, loadExt },
1311 { "load_extension", 2, 0xff, SQLITE_UTF8, 0, loadExt },
drhfdb83b22006-06-17 14:12:47 +00001312#endif
drh193a6b42002-07-07 16:52:46 +00001313#ifdef SQLITE_TEST
drh309b3382007-03-17 17:52:42 +00001314 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1315 { "test_destructor", 1, 0xff, SQLITE_UTF8, 0, test_destructor},
1316 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
1317 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
1318 { "test_error", 1, 0, SQLITE_UTF8, 0, test_error},
drh193a6b42002-07-07 16:52:46 +00001319#endif
drh0bce8352002-02-28 00:41:10 +00001320 };
drh57196282004-10-06 15:41:16 +00001321 static const struct {
drh0bce8352002-02-28 00:41:10 +00001322 char *zName;
drh268380c2004-02-25 13:47:31 +00001323 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001324 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001325 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001326 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1327 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001328 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001329 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
drh309b3382007-03-17 17:52:42 +00001330 { "max", 1, 1, 1, minmaxStep, minMaxFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001331 { "sum", 1, 0, 0, sumStep, sumFinalize },
drha97fdd32006-01-12 22:17:50 +00001332 { "total", 1, 0, 0, sumStep, totalFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001333 { "avg", 1, 0, 0, sumStep, avgFinalize },
1334 { "count", 0, 0, 0, countStep, countFinalize },
1335 { "count", 1, 0, 0, countStep, countFinalize },
drh0bce8352002-02-28 00:41:10 +00001336 };
1337 int i;
1338
1339 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001340 void *pArg;
1341 u8 argType = aFuncs[i].argType;
1342 if( argType==0xff ){
1343 pArg = db;
1344 }else{
1345 pArg = (void*)(int)argType;
danielk1977c572ef72004-05-27 09:28:41 +00001346 }
danielk1977771151b2006-01-17 13:21:40 +00001347 sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001348 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001349 if( aFuncs[i].needCollSeq ){
1350 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1351 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1352 if( pFunc && aFuncs[i].needCollSeq ){
1353 pFunc->needCollSeq = 1;
1354 }
1355 }
drh0bce8352002-02-28 00:41:10 +00001356 }
drh1f01ec12005-02-15 21:36:18 +00001357#ifndef SQLITE_OMIT_ALTERTABLE
1358 sqlite3AlterFunctions(db);
1359#endif
drh198bf392006-01-06 21:52:49 +00001360#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001361 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001362#endif
drh0bce8352002-02-28 00:41:10 +00001363 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001364 void *pArg = (void*)(int)aAggs[i].argType;
danielk1977771151b2006-01-17 13:21:40 +00001365 sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001366 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001367 if( aAggs[i].needCollSeq ){
1368 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001369 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001370 if( pFunc && aAggs[i].needCollSeq ){
1371 pFunc->needCollSeq = 1;
1372 }
1373 }
drh268380c2004-02-25 13:47:31 +00001374 }
danielk19774adee202004-05-08 08:23:19 +00001375 sqlite3RegisterDateTimeFunctions(db);
drhb7481e72006-09-16 21:45:14 +00001376 sqlite3_overload_function(db, "MATCH", 2);
danielk1977fd9e1f32005-05-22 10:44:34 +00001377#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001378 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001379#endif
drh55ef4d92005-08-14 01:20:37 +00001380#ifdef SQLITE_CASE_SENSITIVE_LIKE
1381 sqlite3RegisterLikeFunctions(db, 1);
1382#else
1383 sqlite3RegisterLikeFunctions(db, 0);
1384#endif
1385}
1386
1387/*
1388** Set the LIKEOPT flag on the 2-argument function with the given name.
1389*/
drhd64fe2f2005-08-28 17:00:23 +00001390static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001391 FuncDef *pDef;
1392 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1393 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001394 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001395 }
1396}
1397
1398/*
1399** Register the built-in LIKE and GLOB functions. The caseSensitive
1400** parameter determines whether or not the LIKE operator is case
1401** sensitive. GLOB is always case sensitive.
1402*/
1403void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1404 struct compareInfo *pInfo;
1405 if( caseSensitive ){
1406 pInfo = (struct compareInfo*)&likeInfoAlt;
1407 }else{
1408 pInfo = (struct compareInfo*)&likeInfoNorm;
1409 }
danielk1977771151b2006-01-17 13:21:40 +00001410 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1411 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1412 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001413 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001414 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1415 setLikeOptFlag(db, "like",
1416 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001417}
1418
1419/*
1420** pExpr points to an expression which implements a function. If
1421** it is appropriate to apply the LIKE optimization to that function
1422** then set aWc[0] through aWc[2] to the wildcard characters and
1423** return TRUE. If the function is not a LIKE-style function then
1424** return FALSE.
1425*/
drhd64fe2f2005-08-28 17:00:23 +00001426int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001427 FuncDef *pDef;
1428 if( pExpr->op!=TK_FUNCTION ){
1429 return 0;
1430 }
1431 if( pExpr->pList->nExpr!=2 ){
1432 return 0;
1433 }
drh2646da72005-12-09 20:02:05 +00001434 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001435 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001436 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001437 return 0;
1438 }
1439
1440 /* The memcpy() statement assumes that the wildcard characters are
1441 ** the first three statements in the compareInfo structure. The
1442 ** asserts() that follow verify that assumption
1443 */
1444 memcpy(aWc, pDef->pUserData, 3);
1445 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1446 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1447 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001448 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001449 return 1;
drhdc04c582002-02-24 01:55:15 +00001450}