blob: b6ac068a29c3bf7456b6a18c1ac49d7422364701 [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**
danielk197717374e82007-05-08 14:39:04 +000019** $Id: func.c,v 1.148 2007/05/08 14:39:04 danielk1977 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 ){
304 sqlite3_result_error(context, "randomblob() too large", -1);
305 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){
538 const unsigned char *zA = sqlite3_value_text(argv[0]);
539 const unsigned char *zB = sqlite3_value_text(argv[1]);
danielk19777c6303c2004-11-17 16:41:29 +0000540 int escape = 0;
541 if( argc==3 ){
542 /* The escape character string must consist of a single UTF-8 character.
543 ** Otherwise, return an error.
544 */
545 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000546 if( zEsc==0 ) return;
drh2646da72005-12-09 20:02:05 +0000547 if( sqlite3utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000548 sqlite3_result_error(context,
549 "ESCAPE expression must be a single character", -1);
550 return;
551 }
552 escape = sqlite3ReadUtf8(zEsc);
553 }
danielk19773f6b0872004-06-17 05:36:44 +0000554 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000555 struct compareInfo *pInfo = sqlite3_user_data(context);
556#ifdef SQLITE_TEST
557 sqlite3_like_count++;
558#endif
559 sqlite3_result_int(context, patternCompare(zA, zB, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000560 }
drh8912d102002-05-26 21:34:58 +0000561}
562
563/*
564** Implementation of the NULLIF(x,y) function. The result is the first
565** argument if the arguments are different. The result is NULL if the
566** arguments are equal to each other.
567*/
drhf9b596e2004-05-26 16:54:42 +0000568static void nullifFunc(
569 sqlite3_context *context,
570 int argc,
571 sqlite3_value **argv
572){
danielk1977dc1bdc42004-06-11 10:51:27 +0000573 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
574 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000575 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000576 }
drh0ac65892002-04-20 14:24:41 +0000577}
578
drh647cb0e2002-11-04 19:32:25 +0000579/*
580** Implementation of the VERSION(*) function. The result is the version
581** of the SQLite library that is running.
582*/
drhf9b596e2004-05-26 16:54:42 +0000583static void versionFunc(
584 sqlite3_context *context,
585 int argc,
586 sqlite3_value **argv
587){
danielk1977d8123362004-06-12 09:25:12 +0000588 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000589}
590
drh137c7282007-01-29 17:58:28 +0000591/* Array for converting from half-bytes (nybbles) into ASCII hex
592** digits. */
593static const char hexdigits[] = {
594 '0', '1', '2', '3', '4', '5', '6', '7',
595 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
596};
danielk1977d641d642004-11-18 15:44:29 +0000597
drh47394702003-08-20 01:03:33 +0000598/*
599** EXPERIMENTAL - This is not an official function. The interface may
600** change. This function may disappear. Do not write code that depends
601** on this function.
602**
603** Implementation of the QUOTE() function. This function takes a single
604** argument. If the argument is numeric, the return value is the same as
605** the argument. If the argument is NULL, the return value is the string
606** "NULL". Otherwise, the argument is enclosed in single quotes with
607** single-quote escapes.
608*/
danielk19770ae8b832004-05-25 12:05:56 +0000609static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000610 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000611 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000612 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000613 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000614 break;
drh47394702003-08-20 01:03:33 +0000615 }
drh9c054832004-05-31 18:51:57 +0000616 case SQLITE_INTEGER:
617 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000618 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000619 break;
620 }
danielk19773f41e972004-06-08 00:39:01 +0000621 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000622 char *zText = 0;
623 int nBlob = sqlite3_value_bytes(argv[0]);
624 char const *zBlob = sqlite3_value_blob(argv[0]);
625
drh023ae032007-05-08 12:12:16 +0000626 if( 2*nBlob+4>SQLITE_MAX_LENGTH ){
627 sqlite3_result_error(context, "BLOB too big to quote", -1);
628 return;
629 }
danielk19773f41e972004-06-08 00:39:01 +0000630 zText = (char *)sqliteMalloc((2*nBlob)+4);
631 if( !zText ){
632 sqlite3_result_error(context, "out of memory", -1);
633 }else{
634 int i;
635 for(i=0; i<nBlob; i++){
636 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
637 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
638 }
639 zText[(nBlob*2)+2] = '\'';
640 zText[(nBlob*2)+3] = '\0';
641 zText[0] = 'X';
642 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000643 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
danielk19773f41e972004-06-08 00:39:01 +0000644 sqliteFree(zText);
645 }
646 break;
647 }
drh9c054832004-05-31 18:51:57 +0000648 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000649 int i,j;
650 u64 n;
drh2646da72005-12-09 20:02:05 +0000651 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000652 char *z;
653
drh7a521cf2007-04-25 18:23:52 +0000654 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000655 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
656 if( i+n+3>SQLITE_MAX_LENGTH ){
657 sqlite3_result_error(context, "string too big to quote", -1);
658 return;
659 }
drhf9b596e2004-05-26 16:54:42 +0000660 z = sqliteMalloc( i+n+3 );
661 if( z==0 ) return;
662 z[0] = '\'';
663 for(i=0, j=1; zArg[i]; i++){
664 z[j++] = zArg[i];
665 if( zArg[i]=='\'' ){
666 z[j++] = '\'';
667 }
668 }
669 z[j++] = '\'';
670 z[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000671 sqlite3_result_text(context, z, j, SQLITE_TRANSIENT);
drhf9b596e2004-05-26 16:54:42 +0000672 sqliteFree(z);
673 }
drh47394702003-08-20 01:03:33 +0000674 }
675}
676
drh137c7282007-01-29 17:58:28 +0000677/*
678** The hex() function. Interpret the argument as a blob. Return
679** a hexadecimal rendering as text.
680*/
681static void hexFunc(
682 sqlite3_context *context,
683 int argc,
684 sqlite3_value **argv
685){
686 int i, n;
687 const unsigned char *pBlob;
688 char *zHex, *z;
689 assert( argc==1 );
drh137c7282007-01-29 17:58:28 +0000690 n = sqlite3_value_bytes(argv[0]);
drh023ae032007-05-08 12:12:16 +0000691 if( n*2+1>SQLITE_MAX_LENGTH ){
692 sqlite3_result_error(context, "BLOB too big to convert to hex", -1);
693 return;
694 }
drh1eb25382007-04-10 13:51:17 +0000695 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000696 z = zHex = sqlite3_malloc(n*2 + 1);
697 if( zHex==0 ) return;
698 for(i=0; i<n; i++, pBlob++){
699 unsigned char c = *pBlob;
700 *(z++) = hexdigits[(c>>4)&0xf];
701 *(z++) = hexdigits[c&0xf];
702 }
703 *z = 0;
704 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
705}
706
drh26b6d902007-03-17 13:27:54 +0000707/*
drh8cff3822007-05-02 02:08:28 +0000708** The zeroblob(N) function returns a zero-filled blob of size N bytes.
709*/
710static void zeroblobFunc(
711 sqlite3_context *context,
712 int argc,
713 sqlite3_value **argv
714){
715 int n;
716 assert( argc==1 );
717 n = sqlite3_value_int(argv[0]);
718 sqlite3_result_zeroblob(context, n);
719}
720
721/*
drh26b6d902007-03-17 13:27:54 +0000722** The replace() function. Three arguments are all strings: call
723** them A, B, and C. The result is also a string which is derived
724** from A by replacing every occurance of B with C. The match
725** must be exact. Collating sequences are not used.
726*/
727static void replaceFunc(
728 sqlite3_context *context,
729 int argc,
730 sqlite3_value **argv
731){
732 const unsigned char *zStr; /* The input string A */
733 const unsigned char *zPattern; /* The pattern string B */
734 const unsigned char *zRep; /* The replacement string C */
735 unsigned char *zOut; /* The output */
736 int nStr; /* Size of zStr */
737 int nPattern; /* Size of zPattern */
738 int nRep; /* Size of zRep */
739 int nOut; /* Maximum size of zOut */
740 int loopLimit; /* Last zStr[] that might match zPattern[] */
741 int i, j; /* Loop counters */
742
743 assert( argc==3 );
drh9310ef22007-04-27 17:16:20 +0000744 nStr = sqlite3_value_bytes(argv[0]);
drh26b6d902007-03-17 13:27:54 +0000745 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000746 if( zStr==0 ) return;
drh9310ef22007-04-27 17:16:20 +0000747 nPattern = sqlite3_value_bytes(argv[1]);
drh26b6d902007-03-17 13:27:54 +0000748 zPattern = sqlite3_value_text(argv[1]);
drh709cff32007-04-27 01:18:02 +0000749 if( zPattern==0 || zPattern[0]==0 ) return;
drh9310ef22007-04-27 17:16:20 +0000750 nRep = sqlite3_value_bytes(argv[2]);
drh26b6d902007-03-17 13:27:54 +0000751 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000752 if( zRep==0 ) return;
drh26b6d902007-03-17 13:27:54 +0000753 if( nPattern>=nRep ){
754 nOut = nStr;
755 }else{
danielk197717374e82007-05-08 14:39:04 +0000756 i64 nOut64 = (i64)(nStr/nPattern + 1) * (i64)nRep;
757 nOut = ((nOut64>SQLITE_MAX_LENGTH) ? SQLITE_MAX_LENGTH : nOut64);
drh26b6d902007-03-17 13:27:54 +0000758 }
759 zOut = sqlite3_malloc(nOut+1);
760 if( zOut==0 ) return;
761 loopLimit = nStr - nPattern;
762 for(i=j=0; i<=loopLimit; i++){
763 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
764 zOut[j++] = zStr[i];
765 }else{
danielk197717374e82007-05-08 14:39:04 +0000766 if( (j+nRep+loopLimit-i)>SQLITE_MAX_LENGTH ){
767 sqlite3_result_error(context, "replace() is too large", -1);
768 sqlite3_free(zOut);
769 return;
770 }
drh26b6d902007-03-17 13:27:54 +0000771 memcpy(&zOut[j], zRep, nRep);
772 j += nRep;
773 i += nPattern-1;
774 }
775 }
776 memcpy(&zOut[j], &zStr[i], nStr-i);
777 j += nStr - i;
778 assert( j<=nOut );
779 zOut[j] = 0;
780 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
781}
782
drh309b3382007-03-17 17:52:42 +0000783/*
784** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
785** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
786*/
787static void trimFunc(
788 sqlite3_context *context,
789 int argc,
790 sqlite3_value **argv
791){
792 const unsigned char *zIn; /* Input string */
793 const unsigned char *zCharSet; /* Set of characters to trim */
794 int nIn; /* Number of bytes in input */
drhd1e3a612007-04-27 21:59:52 +0000795 int flags; /* 1: trimleft 2: trimright 3: trim */
796 int i; /* Loop counter */
797 unsigned char *aLen; /* Length of each character in zCharSet */
798 const unsigned char **azChar; /* Individual characters in zCharSet */
799 int nChar; /* Number of characters in zCharSet */
800
drh309b3382007-03-17 17:52:42 +0000801 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
802 return;
803 }
drh9310ef22007-04-27 17:16:20 +0000804 nIn = sqlite3_value_bytes(argv[0]);
drh309b3382007-03-17 17:52:42 +0000805 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000806 if( zIn==0 ) return;
drh309b3382007-03-17 17:52:42 +0000807 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000808 static const unsigned char lenOne[] = { 1 };
drh8cff3822007-05-02 02:08:28 +0000809 static const unsigned char *azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000810 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000811 aLen = (u8*)lenOne;
812 azChar = azOne;
drhd1e3a612007-04-27 21:59:52 +0000813 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000814 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000815 return;
drhd1e3a612007-04-27 21:59:52 +0000816 }else{
817 const unsigned char *z;
818 for(z=zCharSet, nChar=0; *z; nChar++){
819 sqliteNextChar(z);
820 }
821 if( nChar>0 ){
822 azChar = sqlite3_malloc( nChar*(sizeof(char*)+1) );
823 if( azChar==0 ){
824 return;
825 }
826 aLen = (unsigned char*)&azChar[nChar];
827 for(z=zCharSet, nChar=0; *z; nChar++){
828 azChar[nChar] = z;
829 sqliteNextChar(z);
830 aLen[nChar] = z - azChar[nChar];
831 }
832 }
drh309b3382007-03-17 17:52:42 +0000833 }
drhd1e3a612007-04-27 21:59:52 +0000834 if( nChar>0 ){
drh309b3382007-03-17 17:52:42 +0000835 flags = (int)sqlite3_user_data(context);
836 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000837 while( nIn>0 ){
838 int len;
839 for(i=0; i<nChar; i++){
840 len = aLen[i];
841 if( memcmp(zIn, azChar[i], len)==0 ) break;
842 }
843 if( i>=nChar ) break;
844 zIn += len;
845 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000846 }
847 }
848 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000849 while( nIn>0 ){
850 int len;
851 for(i=0; i<nChar; i++){
852 len = aLen[i];
853 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
854 }
855 if( i>=nChar ) break;
856 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000857 }
858 }
drhd1e3a612007-04-27 21:59:52 +0000859 if( zCharSet ){
860 sqlite3_free(azChar);
861 }
drh309b3382007-03-17 17:52:42 +0000862 }
863 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
864}
drh26b6d902007-03-17 13:27:54 +0000865
drhd24cc422003-03-27 12:51:24 +0000866#ifdef SQLITE_SOUNDEX
867/*
868** Compute the soundex encoding of a word.
869*/
drh137c7282007-01-29 17:58:28 +0000870static void soundexFunc(
871 sqlite3_context *context,
872 int argc,
873 sqlite3_value **argv
874){
drhd24cc422003-03-27 12:51:24 +0000875 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000876 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000877 int i, j;
878 static const unsigned char iCode[] = {
879 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
880 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
881 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
882 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
883 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
884 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
885 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
886 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
887 };
888 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000889 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000890 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000891 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
892 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000893 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000894 zResult[0] = toupper(zIn[i]);
895 for(j=1; j<4 && zIn[i]; i++){
896 int code = iCode[zIn[i]&0x7f];
897 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000898 if( code!=prevcode ){
899 prevcode = code;
900 zResult[j++] = code + '0';
901 }
902 }else{
903 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000904 }
905 }
906 while( j<4 ){
907 zResult[j++] = '0';
908 }
909 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000910 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000911 }else{
danielk1977d8123362004-06-12 09:25:12 +0000912 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000913 }
914}
915#endif
916
drhfdb83b22006-06-17 14:12:47 +0000917#ifndef SQLITE_OMIT_LOAD_EXTENSION
918/*
919** A function that loads a shared-library extension then returns NULL.
920*/
921static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +0000922 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000923 const char *zProc;
drhfdb83b22006-06-17 14:12:47 +0000924 sqlite3 *db = sqlite3_user_data(context);
925 char *zErrMsg = 0;
926
927 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +0000928 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +0000929 }else{
930 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +0000931 }
drh7a521cf2007-04-25 18:23:52 +0000932 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +0000933 sqlite3_result_error(context, zErrMsg, -1);
934 sqlite3_free(zErrMsg);
935 }
936}
937#endif
938
drh193a6b42002-07-07 16:52:46 +0000939#ifdef SQLITE_TEST
940/*
941** This function generates a string of random characters. Used for
942** generating test data.
943*/
danielk19770ae8b832004-05-25 12:05:56 +0000944static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +0000945 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +0000946 "abcdefghijklmnopqrstuvwxyz"
947 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
948 "0123456789"
949 ".-!,:*^+=_|?/<> ";
950 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +0000951 unsigned char zBuf[1000];
drh193a6b42002-07-07 16:52:46 +0000952 if( argc>=1 ){
drhf9b596e2004-05-26 16:54:42 +0000953 iMin = sqlite3_value_int(argv[0]);
drh193a6b42002-07-07 16:52:46 +0000954 if( iMin<0 ) iMin = 0;
955 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
956 }else{
957 iMin = 1;
958 }
959 if( argc>=2 ){
drhf9b596e2004-05-26 16:54:42 +0000960 iMax = sqlite3_value_int(argv[1]);
drh193a6b42002-07-07 16:52:46 +0000961 if( iMax<iMin ) iMax = iMin;
drh1dba7272004-01-16 13:58:18 +0000962 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +0000963 }else{
964 iMax = 50;
965 }
966 n = iMin;
967 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +0000968 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +0000969 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +0000970 n += r%(iMax + 1 - iMin);
971 }
drh1dba7272004-01-16 13:58:18 +0000972 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +0000973 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +0000974 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +0000975 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +0000976 }
977 zBuf[n] = 0;
drh2646da72005-12-09 20:02:05 +0000978 sqlite3_result_text(context, (char*)zBuf, n, SQLITE_TRANSIENT);
danielk1977d8123362004-06-12 09:25:12 +0000979}
drh0e3d7472004-06-19 17:33:07 +0000980#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +0000981
drh0e3d7472004-06-19 17:33:07 +0000982#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +0000983/*
984** The following two SQL functions are used to test returning a text
985** result with a destructor. Function 'test_destructor' takes one argument
986** and returns the same argument interpreted as TEXT. A destructor is
987** passed with the sqlite3_result_text() call.
988**
989** SQL function 'test_destructor_count' returns the number of outstanding
990** allocations made by 'test_destructor';
991**
992** WARNING: Not threadsafe.
993*/
994static int test_destructor_count_var = 0;
995static void destructor(void *p){
996 char *zVal = (char *)p;
997 assert(zVal);
998 zVal--;
999 sqliteFree(zVal);
1000 test_destructor_count_var--;
1001}
1002static void test_destructor(
1003 sqlite3_context *pCtx,
1004 int nArg,
1005 sqlite3_value **argv
1006){
1007 char *zVal;
danielk1977f4618892004-06-28 13:09:11 +00001008 int len;
drh9bb575f2004-09-06 17:24:11 +00001009 sqlite3 *db = sqlite3_user_data(pCtx);
danielk1977f4618892004-06-28 13:09:11 +00001010
danielk1977d8123362004-06-12 09:25:12 +00001011 test_destructor_count_var++;
1012 assert( nArg==1 );
1013 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
danielk197714db2662006-01-09 16:12:04 +00001014 len = sqlite3ValueBytes(argv[0], ENC(db));
danielk1977f4618892004-06-28 13:09:11 +00001015 zVal = sqliteMalloc(len+3);
1016 zVal[len] = 0;
1017 zVal[len-1] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001018 assert( zVal );
1019 zVal++;
danielk197714db2662006-01-09 16:12:04 +00001020 memcpy(zVal, sqlite3ValueText(argv[0], ENC(db)), len);
1021 if( ENC(db)==SQLITE_UTF8 ){
danielk1977f4618892004-06-28 13:09:11 +00001022 sqlite3_result_text(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001023#ifndef SQLITE_OMIT_UTF16
danielk197714db2662006-01-09 16:12:04 +00001024 }else if( ENC(db)==SQLITE_UTF16LE ){
danielk1977f4618892004-06-28 13:09:11 +00001025 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
1026 }else{
1027 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001028#endif /* SQLITE_OMIT_UTF16 */
danielk1977f4618892004-06-28 13:09:11 +00001029 }
danielk1977d8123362004-06-12 09:25:12 +00001030}
1031static void test_destructor_count(
1032 sqlite3_context *pCtx,
1033 int nArg,
1034 sqlite3_value **argv
1035){
1036 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +00001037}
drh0e3d7472004-06-19 17:33:07 +00001038#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +00001039
drh0e3d7472004-06-19 17:33:07 +00001040#ifdef SQLITE_TEST
1041/*
1042** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
1043** interface.
1044**
1045** The test_auxdata() SQL function attempts to register each of its arguments
1046** as auxiliary data. If there are no prior registrations of aux data for
1047** that argument (meaning the argument is not a constant or this is its first
1048** call) then the result for that argument is 0. If there is a prior
1049** registration, the result for that argument is 1. The overall result
1050** is the individual argument results separated by spaces.
1051*/
danielk19773f6b0872004-06-17 05:36:44 +00001052static void free_test_auxdata(void *p) {sqliteFree(p);}
1053static void test_auxdata(
1054 sqlite3_context *pCtx,
1055 int nArg,
1056 sqlite3_value **argv
1057){
1058 int i;
1059 char *zRet = sqliteMalloc(nArg*2);
1060 if( !zRet ) return;
1061 for(i=0; i<nArg; i++){
drh2646da72005-12-09 20:02:05 +00001062 char const *z = (char*)sqlite3_value_text(argv[i]);
danielk19773f6b0872004-06-17 05:36:44 +00001063 if( z ){
1064 char *zAux = sqlite3_get_auxdata(pCtx, i);
1065 if( zAux ){
1066 zRet[i*2] = '1';
1067 if( strcmp(zAux, z) ){
1068 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
1069 return;
1070 }
1071 }else{
1072 zRet[i*2] = '0';
1073 zAux = sqliteStrDup(z);
1074 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
1075 }
1076 zRet[i*2+1] = ' ';
1077 }
1078 }
1079 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
1080}
drh0e3d7472004-06-19 17:33:07 +00001081#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +00001082
danielk197701427a62005-01-11 13:02:33 +00001083#ifdef SQLITE_TEST
1084/*
1085** A function to test error reporting from user functions. This function
1086** returns a copy of it's first argument as an error.
1087*/
1088static void test_error(
1089 sqlite3_context *pCtx,
1090 int nArg,
1091 sqlite3_value **argv
1092){
drh2646da72005-12-09 20:02:05 +00001093 sqlite3_result_error(pCtx, (char*)sqlite3_value_text(argv[0]), 0);
danielk197701427a62005-01-11 13:02:33 +00001094}
1095#endif /* SQLITE_TEST */
1096
drh0ac65892002-04-20 14:24:41 +00001097/*
drhd3a149e2002-02-24 17:12:53 +00001098** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001099** sum() or avg() aggregate computation.
1100*/
1101typedef struct SumCtx SumCtx;
1102struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001103 double rSum; /* Floating point sum */
1104 i64 iSum; /* Integer sum */
1105 i64 cnt; /* Number of elements summed */
1106 u8 overflow; /* True if integer overflow seen */
1107 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001108};
1109
1110/*
drha97fdd32006-01-12 22:17:50 +00001111** Routines used to compute the sum, average, and total.
1112**
1113** The SUM() function follows the (broken) SQL standard which means
1114** that it returns NULL if it sums over no inputs. TOTAL returns
1115** 0.0 in that case. In addition, TOTAL always returns a float where
1116** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001117** value. TOTAL never fails, but SUM might through an exception if
1118** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001119*/
danielk19770ae8b832004-05-25 12:05:56 +00001120static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001121 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001122 int type;
drh3f219f42005-09-08 19:45:57 +00001123 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +00001124 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001125 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001126 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001127 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001128 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001129 i64 v = sqlite3_value_int64(argv[0]);
1130 p->rSum += v;
1131 if( (p->approx|p->overflow)==0 ){
1132 i64 iNewSum = p->iSum + v;
1133 int s1 = p->iSum >> (sizeof(i64)*8-1);
1134 int s2 = v >> (sizeof(i64)*8-1);
1135 int s3 = iNewSum >> (sizeof(i64)*8-1);
1136 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
1137 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001138 }
1139 }else{
drh8c08e862006-02-11 17:34:00 +00001140 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001141 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001142 }
drh739105c2002-05-29 23:22:23 +00001143 }
drhdd5baa92002-02-27 19:50:59 +00001144}
danielk19770ae8b832004-05-25 12:05:56 +00001145static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001146 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001147 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001148 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001149 if( p->overflow ){
1150 sqlite3_result_error(context,"integer overflow",-1);
1151 }else if( p->approx ){
1152 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001153 }else{
drh8c08e862006-02-11 17:34:00 +00001154 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001155 }
drh3d1d95e2005-09-08 10:37:01 +00001156 }
drhdd5baa92002-02-27 19:50:59 +00001157}
danielk19770ae8b832004-05-25 12:05:56 +00001158static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001159 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001160 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001161 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001162 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001163 }
1164}
drha97fdd32006-01-12 22:17:50 +00001165static void totalFinalize(sqlite3_context *context){
1166 SumCtx *p;
1167 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001168 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001169}
drhdd5baa92002-02-27 19:50:59 +00001170
1171/*
drh0bce8352002-02-28 00:41:10 +00001172** The following structure keeps track of state information for the
1173** count() aggregate function.
1174*/
1175typedef struct CountCtx CountCtx;
1176struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001177 i64 n;
drh0bce8352002-02-28 00:41:10 +00001178};
drhdd5baa92002-02-27 19:50:59 +00001179
drh0bce8352002-02-28 00:41:10 +00001180/*
1181** Routines to implement the count() aggregate function.
1182*/
danielk19770ae8b832004-05-25 12:05:56 +00001183static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001184 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001185 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001186 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001187 p->n++;
1188 }
1189}
danielk19770ae8b832004-05-25 12:05:56 +00001190static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001191 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001192 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001193 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001194}
1195
1196/*
drh0bce8352002-02-28 00:41:10 +00001197** Routines to implement min() and max() aggregate functions.
1198*/
danielk19770ae8b832004-05-25 12:05:56 +00001199static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +00001200 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001201 Mem *pBest;
1202
1203 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1204 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001205 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001206
danielk197788208052004-05-25 01:13:20 +00001207 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001208 int max;
1209 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001210 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001211 /* This step function is used for both the min() and max() aggregates,
1212 ** the only difference between the two being that the sense of the
1213 ** comparison is inverted. For the max() aggregate, the
1214 ** sqlite3_user_data() function returns (void *)-1. For min() it
1215 ** returns (void *)db, where db is the sqlite3* database pointer.
1216 ** Therefore the next statement sets variable 'max' to 1 for the max()
1217 ** aggregate, or 0 for min().
1218 */
drh309b3382007-03-17 17:52:42 +00001219 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001220 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001221 if( (max && cmp<0) || (!max && cmp>0) ){
danielk19777e18c252004-05-25 11:47:24 +00001222 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001223 }
drh268380c2004-02-25 13:47:31 +00001224 }else{
danielk19777e18c252004-05-25 11:47:24 +00001225 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001226 }
1227}
danielk19770ae8b832004-05-25 12:05:56 +00001228static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001229 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001230 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1231 if( pRes ){
1232 if( pRes->flags ){
1233 sqlite3_result_value(context, pRes);
1234 }
1235 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001236 }
1237}
drhdd5baa92002-02-27 19:50:59 +00001238
drh4e5ffc52004-08-31 00:52:37 +00001239
drhd3a149e2002-02-24 17:12:53 +00001240/*
drha2ed5602002-02-26 23:55:31 +00001241** This function registered all of the above C functions as SQL
1242** functions. This should be the only routine in this file with
1243** external linkage.
drhdc04c582002-02-24 01:55:15 +00001244*/
drh9bb575f2004-09-06 17:24:11 +00001245void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001246 static const struct {
drh0bce8352002-02-28 00:41:10 +00001247 char *zName;
drh268380c2004-02-25 13:47:31 +00001248 signed char nArg;
drh309b3382007-03-17 17:52:42 +00001249 u8 argType; /* ff: db 1: 0, 2: 1, 3: 2,... N: N-1. */
danielk1977f4618892004-06-28 13:09:11 +00001250 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001251 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001252 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001253 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001254 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1255 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
drh309b3382007-03-17 17:52:42 +00001256 { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc },
1257 { "max", 0, 1, SQLITE_UTF8, 1, 0 },
danielk1977f4618892004-06-28 13:09:11 +00001258 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1259 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
1260 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
drh6c626082004-11-14 21:56:29 +00001261#ifndef SQLITE_OMIT_UTF16
danielk1977f4618892004-06-28 13:09:11 +00001262 { "substr", 3, 0, SQLITE_UTF16LE, 0, sqlite3utf16Substr },
drh6c626082004-11-14 21:56:29 +00001263#endif
danielk1977f4618892004-06-28 13:09:11 +00001264 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1265 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1266 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1267 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1268 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1269 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1270 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1271 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
drh137c7282007-01-29 17:58:28 +00001272 { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc },
danielk1977f4618892004-06-28 13:09:11 +00001273 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1274 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
drh137c7282007-01-29 17:58:28 +00001275 { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob },
drh94a98362004-09-13 13:13:18 +00001276 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001277 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1278 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
drh309b3382007-03-17 17:52:42 +00001279 { "last_insert_rowid", 0, 0xff, SQLITE_UTF8, 0, last_insert_rowid },
1280 { "changes", 0, 0xff, SQLITE_UTF8, 0, changes },
1281 { "total_changes", 0, 0xff, SQLITE_UTF8, 0, total_changes },
drh26b6d902007-03-17 13:27:54 +00001282 { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc },
drh309b3382007-03-17 17:52:42 +00001283 { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc },
1284 { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc },
1285 { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc },
1286 { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc },
1287 { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc },
1288 { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc },
drh8cff3822007-05-02 02:08:28 +00001289 { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc },
drhd24cc422003-03-27 12:51:24 +00001290#ifdef SQLITE_SOUNDEX
drh309b3382007-03-17 17:52:42 +00001291 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001292#endif
drhfdb83b22006-06-17 14:12:47 +00001293#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh309b3382007-03-17 17:52:42 +00001294 { "load_extension", 1, 0xff, SQLITE_UTF8, 0, loadExt },
1295 { "load_extension", 2, 0xff, SQLITE_UTF8, 0, loadExt },
drhfdb83b22006-06-17 14:12:47 +00001296#endif
drh193a6b42002-07-07 16:52:46 +00001297#ifdef SQLITE_TEST
drh309b3382007-03-17 17:52:42 +00001298 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1299 { "test_destructor", 1, 0xff, SQLITE_UTF8, 0, test_destructor},
1300 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
1301 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
1302 { "test_error", 1, 0, SQLITE_UTF8, 0, test_error},
drh193a6b42002-07-07 16:52:46 +00001303#endif
drh0bce8352002-02-28 00:41:10 +00001304 };
drh57196282004-10-06 15:41:16 +00001305 static const struct {
drh0bce8352002-02-28 00:41:10 +00001306 char *zName;
drh268380c2004-02-25 13:47:31 +00001307 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001308 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001309 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001310 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1311 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001312 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001313 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
drh309b3382007-03-17 17:52:42 +00001314 { "max", 1, 1, 1, minmaxStep, minMaxFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001315 { "sum", 1, 0, 0, sumStep, sumFinalize },
drha97fdd32006-01-12 22:17:50 +00001316 { "total", 1, 0, 0, sumStep, totalFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001317 { "avg", 1, 0, 0, sumStep, avgFinalize },
1318 { "count", 0, 0, 0, countStep, countFinalize },
1319 { "count", 1, 0, 0, countStep, countFinalize },
drh0bce8352002-02-28 00:41:10 +00001320 };
1321 int i;
1322
1323 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001324 void *pArg;
1325 u8 argType = aFuncs[i].argType;
1326 if( argType==0xff ){
1327 pArg = db;
1328 }else{
1329 pArg = (void*)(int)argType;
danielk1977c572ef72004-05-27 09:28:41 +00001330 }
danielk1977771151b2006-01-17 13:21:40 +00001331 sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001332 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001333 if( aFuncs[i].needCollSeq ){
1334 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1335 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1336 if( pFunc && aFuncs[i].needCollSeq ){
1337 pFunc->needCollSeq = 1;
1338 }
1339 }
drh0bce8352002-02-28 00:41:10 +00001340 }
drh1f01ec12005-02-15 21:36:18 +00001341#ifndef SQLITE_OMIT_ALTERTABLE
1342 sqlite3AlterFunctions(db);
1343#endif
drh198bf392006-01-06 21:52:49 +00001344#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001345 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001346#endif
drh0bce8352002-02-28 00:41:10 +00001347 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001348 void *pArg = (void*)(int)aAggs[i].argType;
danielk1977771151b2006-01-17 13:21:40 +00001349 sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001350 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001351 if( aAggs[i].needCollSeq ){
1352 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001353 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001354 if( pFunc && aAggs[i].needCollSeq ){
1355 pFunc->needCollSeq = 1;
1356 }
1357 }
drh268380c2004-02-25 13:47:31 +00001358 }
danielk19774adee202004-05-08 08:23:19 +00001359 sqlite3RegisterDateTimeFunctions(db);
drhb7481e72006-09-16 21:45:14 +00001360 sqlite3_overload_function(db, "MATCH", 2);
danielk1977fd9e1f32005-05-22 10:44:34 +00001361#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001362 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001363#endif
drh55ef4d92005-08-14 01:20:37 +00001364#ifdef SQLITE_CASE_SENSITIVE_LIKE
1365 sqlite3RegisterLikeFunctions(db, 1);
1366#else
1367 sqlite3RegisterLikeFunctions(db, 0);
1368#endif
1369}
1370
1371/*
1372** Set the LIKEOPT flag on the 2-argument function with the given name.
1373*/
drhd64fe2f2005-08-28 17:00:23 +00001374static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001375 FuncDef *pDef;
1376 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1377 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001378 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001379 }
1380}
1381
1382/*
1383** Register the built-in LIKE and GLOB functions. The caseSensitive
1384** parameter determines whether or not the LIKE operator is case
1385** sensitive. GLOB is always case sensitive.
1386*/
1387void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1388 struct compareInfo *pInfo;
1389 if( caseSensitive ){
1390 pInfo = (struct compareInfo*)&likeInfoAlt;
1391 }else{
1392 pInfo = (struct compareInfo*)&likeInfoNorm;
1393 }
danielk1977771151b2006-01-17 13:21:40 +00001394 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1395 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1396 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001397 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001398 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1399 setLikeOptFlag(db, "like",
1400 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001401}
1402
1403/*
1404** pExpr points to an expression which implements a function. If
1405** it is appropriate to apply the LIKE optimization to that function
1406** then set aWc[0] through aWc[2] to the wildcard characters and
1407** return TRUE. If the function is not a LIKE-style function then
1408** return FALSE.
1409*/
drhd64fe2f2005-08-28 17:00:23 +00001410int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001411 FuncDef *pDef;
1412 if( pExpr->op!=TK_FUNCTION ){
1413 return 0;
1414 }
1415 if( pExpr->pList->nExpr!=2 ){
1416 return 0;
1417 }
drh2646da72005-12-09 20:02:05 +00001418 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001419 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001420 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001421 return 0;
1422 }
1423
1424 /* The memcpy() statement assumes that the wildcard characters are
1425 ** the first three statements in the compareInfo structure. The
1426 ** asserts() that follow verify that assumption
1427 */
1428 memcpy(aWc, pDef->pUserData, 3);
1429 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1430 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1431 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001432 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001433 return 1;
drhdc04c582002-02-24 01:55:15 +00001434}