blob: 5197ccd181282a08f35274165e45bc4f1c1aa353 [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**
drh023ae032007-05-08 12:12:16 +000019** $Id: func.c,v 1.147 2007/05/08 12:12:17 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 ){
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{
756 nOut = (nStr/nPattern + 1)*nRep;
757 }
758 zOut = sqlite3_malloc(nOut+1);
759 if( zOut==0 ) return;
760 loopLimit = nStr - nPattern;
761 for(i=j=0; i<=loopLimit; i++){
762 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
763 zOut[j++] = zStr[i];
764 }else{
765 memcpy(&zOut[j], zRep, nRep);
766 j += nRep;
767 i += nPattern-1;
768 }
769 }
770 memcpy(&zOut[j], &zStr[i], nStr-i);
771 j += nStr - i;
772 assert( j<=nOut );
773 zOut[j] = 0;
774 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
775}
776
drh309b3382007-03-17 17:52:42 +0000777/*
778** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
779** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
780*/
781static void trimFunc(
782 sqlite3_context *context,
783 int argc,
784 sqlite3_value **argv
785){
786 const unsigned char *zIn; /* Input string */
787 const unsigned char *zCharSet; /* Set of characters to trim */
788 int nIn; /* Number of bytes in input */
drhd1e3a612007-04-27 21:59:52 +0000789 int flags; /* 1: trimleft 2: trimright 3: trim */
790 int i; /* Loop counter */
791 unsigned char *aLen; /* Length of each character in zCharSet */
792 const unsigned char **azChar; /* Individual characters in zCharSet */
793 int nChar; /* Number of characters in zCharSet */
794
drh309b3382007-03-17 17:52:42 +0000795 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
796 return;
797 }
drh9310ef22007-04-27 17:16:20 +0000798 nIn = sqlite3_value_bytes(argv[0]);
drh309b3382007-03-17 17:52:42 +0000799 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000800 if( zIn==0 ) return;
drh309b3382007-03-17 17:52:42 +0000801 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000802 static const unsigned char lenOne[] = { 1 };
drh8cff3822007-05-02 02:08:28 +0000803 static const unsigned char *azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000804 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000805 aLen = (u8*)lenOne;
806 azChar = azOne;
drhd1e3a612007-04-27 21:59:52 +0000807 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000808 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000809 return;
drhd1e3a612007-04-27 21:59:52 +0000810 }else{
811 const unsigned char *z;
812 for(z=zCharSet, nChar=0; *z; nChar++){
813 sqliteNextChar(z);
814 }
815 if( nChar>0 ){
816 azChar = sqlite3_malloc( nChar*(sizeof(char*)+1) );
817 if( azChar==0 ){
818 return;
819 }
820 aLen = (unsigned char*)&azChar[nChar];
821 for(z=zCharSet, nChar=0; *z; nChar++){
822 azChar[nChar] = z;
823 sqliteNextChar(z);
824 aLen[nChar] = z - azChar[nChar];
825 }
826 }
drh309b3382007-03-17 17:52:42 +0000827 }
drhd1e3a612007-04-27 21:59:52 +0000828 if( nChar>0 ){
drh309b3382007-03-17 17:52:42 +0000829 flags = (int)sqlite3_user_data(context);
830 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000831 while( nIn>0 ){
832 int len;
833 for(i=0; i<nChar; i++){
834 len = aLen[i];
835 if( memcmp(zIn, azChar[i], len)==0 ) break;
836 }
837 if( i>=nChar ) break;
838 zIn += len;
839 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000840 }
841 }
842 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000843 while( nIn>0 ){
844 int len;
845 for(i=0; i<nChar; i++){
846 len = aLen[i];
847 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
848 }
849 if( i>=nChar ) break;
850 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000851 }
852 }
drhd1e3a612007-04-27 21:59:52 +0000853 if( zCharSet ){
854 sqlite3_free(azChar);
855 }
drh309b3382007-03-17 17:52:42 +0000856 }
857 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
858}
drh26b6d902007-03-17 13:27:54 +0000859
drhd24cc422003-03-27 12:51:24 +0000860#ifdef SQLITE_SOUNDEX
861/*
862** Compute the soundex encoding of a word.
863*/
drh137c7282007-01-29 17:58:28 +0000864static void soundexFunc(
865 sqlite3_context *context,
866 int argc,
867 sqlite3_value **argv
868){
drhd24cc422003-03-27 12:51:24 +0000869 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000870 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000871 int i, j;
872 static const unsigned char iCode[] = {
873 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
874 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
875 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
876 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
877 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
878 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
879 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
880 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
881 };
882 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000883 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000884 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000885 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
886 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000887 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000888 zResult[0] = toupper(zIn[i]);
889 for(j=1; j<4 && zIn[i]; i++){
890 int code = iCode[zIn[i]&0x7f];
891 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000892 if( code!=prevcode ){
893 prevcode = code;
894 zResult[j++] = code + '0';
895 }
896 }else{
897 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000898 }
899 }
900 while( j<4 ){
901 zResult[j++] = '0';
902 }
903 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000904 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000905 }else{
danielk1977d8123362004-06-12 09:25:12 +0000906 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000907 }
908}
909#endif
910
drhfdb83b22006-06-17 14:12:47 +0000911#ifndef SQLITE_OMIT_LOAD_EXTENSION
912/*
913** A function that loads a shared-library extension then returns NULL.
914*/
915static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +0000916 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000917 const char *zProc;
drhfdb83b22006-06-17 14:12:47 +0000918 sqlite3 *db = sqlite3_user_data(context);
919 char *zErrMsg = 0;
920
921 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +0000922 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +0000923 }else{
924 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +0000925 }
drh7a521cf2007-04-25 18:23:52 +0000926 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +0000927 sqlite3_result_error(context, zErrMsg, -1);
928 sqlite3_free(zErrMsg);
929 }
930}
931#endif
932
drh193a6b42002-07-07 16:52:46 +0000933#ifdef SQLITE_TEST
934/*
935** This function generates a string of random characters. Used for
936** generating test data.
937*/
danielk19770ae8b832004-05-25 12:05:56 +0000938static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +0000939 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +0000940 "abcdefghijklmnopqrstuvwxyz"
941 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
942 "0123456789"
943 ".-!,:*^+=_|?/<> ";
944 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +0000945 unsigned char zBuf[1000];
drh193a6b42002-07-07 16:52:46 +0000946 if( argc>=1 ){
drhf9b596e2004-05-26 16:54:42 +0000947 iMin = sqlite3_value_int(argv[0]);
drh193a6b42002-07-07 16:52:46 +0000948 if( iMin<0 ) iMin = 0;
949 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
950 }else{
951 iMin = 1;
952 }
953 if( argc>=2 ){
drhf9b596e2004-05-26 16:54:42 +0000954 iMax = sqlite3_value_int(argv[1]);
drh193a6b42002-07-07 16:52:46 +0000955 if( iMax<iMin ) iMax = iMin;
drh1dba7272004-01-16 13:58:18 +0000956 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +0000957 }else{
958 iMax = 50;
959 }
960 n = iMin;
961 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +0000962 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +0000963 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +0000964 n += r%(iMax + 1 - iMin);
965 }
drh1dba7272004-01-16 13:58:18 +0000966 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +0000967 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +0000968 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +0000969 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +0000970 }
971 zBuf[n] = 0;
drh2646da72005-12-09 20:02:05 +0000972 sqlite3_result_text(context, (char*)zBuf, n, SQLITE_TRANSIENT);
danielk1977d8123362004-06-12 09:25:12 +0000973}
drh0e3d7472004-06-19 17:33:07 +0000974#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +0000975
drh0e3d7472004-06-19 17:33:07 +0000976#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +0000977/*
978** The following two SQL functions are used to test returning a text
979** result with a destructor. Function 'test_destructor' takes one argument
980** and returns the same argument interpreted as TEXT. A destructor is
981** passed with the sqlite3_result_text() call.
982**
983** SQL function 'test_destructor_count' returns the number of outstanding
984** allocations made by 'test_destructor';
985**
986** WARNING: Not threadsafe.
987*/
988static int test_destructor_count_var = 0;
989static void destructor(void *p){
990 char *zVal = (char *)p;
991 assert(zVal);
992 zVal--;
993 sqliteFree(zVal);
994 test_destructor_count_var--;
995}
996static void test_destructor(
997 sqlite3_context *pCtx,
998 int nArg,
999 sqlite3_value **argv
1000){
1001 char *zVal;
danielk1977f4618892004-06-28 13:09:11 +00001002 int len;
drh9bb575f2004-09-06 17:24:11 +00001003 sqlite3 *db = sqlite3_user_data(pCtx);
danielk1977f4618892004-06-28 13:09:11 +00001004
danielk1977d8123362004-06-12 09:25:12 +00001005 test_destructor_count_var++;
1006 assert( nArg==1 );
1007 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
danielk197714db2662006-01-09 16:12:04 +00001008 len = sqlite3ValueBytes(argv[0], ENC(db));
danielk1977f4618892004-06-28 13:09:11 +00001009 zVal = sqliteMalloc(len+3);
1010 zVal[len] = 0;
1011 zVal[len-1] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001012 assert( zVal );
1013 zVal++;
danielk197714db2662006-01-09 16:12:04 +00001014 memcpy(zVal, sqlite3ValueText(argv[0], ENC(db)), len);
1015 if( ENC(db)==SQLITE_UTF8 ){
danielk1977f4618892004-06-28 13:09:11 +00001016 sqlite3_result_text(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001017#ifndef SQLITE_OMIT_UTF16
danielk197714db2662006-01-09 16:12:04 +00001018 }else if( ENC(db)==SQLITE_UTF16LE ){
danielk1977f4618892004-06-28 13:09:11 +00001019 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
1020 }else{
1021 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001022#endif /* SQLITE_OMIT_UTF16 */
danielk1977f4618892004-06-28 13:09:11 +00001023 }
danielk1977d8123362004-06-12 09:25:12 +00001024}
1025static void test_destructor_count(
1026 sqlite3_context *pCtx,
1027 int nArg,
1028 sqlite3_value **argv
1029){
1030 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +00001031}
drh0e3d7472004-06-19 17:33:07 +00001032#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +00001033
drh0e3d7472004-06-19 17:33:07 +00001034#ifdef SQLITE_TEST
1035/*
1036** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
1037** interface.
1038**
1039** The test_auxdata() SQL function attempts to register each of its arguments
1040** as auxiliary data. If there are no prior registrations of aux data for
1041** that argument (meaning the argument is not a constant or this is its first
1042** call) then the result for that argument is 0. If there is a prior
1043** registration, the result for that argument is 1. The overall result
1044** is the individual argument results separated by spaces.
1045*/
danielk19773f6b0872004-06-17 05:36:44 +00001046static void free_test_auxdata(void *p) {sqliteFree(p);}
1047static void test_auxdata(
1048 sqlite3_context *pCtx,
1049 int nArg,
1050 sqlite3_value **argv
1051){
1052 int i;
1053 char *zRet = sqliteMalloc(nArg*2);
1054 if( !zRet ) return;
1055 for(i=0; i<nArg; i++){
drh2646da72005-12-09 20:02:05 +00001056 char const *z = (char*)sqlite3_value_text(argv[i]);
danielk19773f6b0872004-06-17 05:36:44 +00001057 if( z ){
1058 char *zAux = sqlite3_get_auxdata(pCtx, i);
1059 if( zAux ){
1060 zRet[i*2] = '1';
1061 if( strcmp(zAux, z) ){
1062 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
1063 return;
1064 }
1065 }else{
1066 zRet[i*2] = '0';
1067 zAux = sqliteStrDup(z);
1068 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
1069 }
1070 zRet[i*2+1] = ' ';
1071 }
1072 }
1073 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
1074}
drh0e3d7472004-06-19 17:33:07 +00001075#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +00001076
danielk197701427a62005-01-11 13:02:33 +00001077#ifdef SQLITE_TEST
1078/*
1079** A function to test error reporting from user functions. This function
1080** returns a copy of it's first argument as an error.
1081*/
1082static void test_error(
1083 sqlite3_context *pCtx,
1084 int nArg,
1085 sqlite3_value **argv
1086){
drh2646da72005-12-09 20:02:05 +00001087 sqlite3_result_error(pCtx, (char*)sqlite3_value_text(argv[0]), 0);
danielk197701427a62005-01-11 13:02:33 +00001088}
1089#endif /* SQLITE_TEST */
1090
drh0ac65892002-04-20 14:24:41 +00001091/*
drhd3a149e2002-02-24 17:12:53 +00001092** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001093** sum() or avg() aggregate computation.
1094*/
1095typedef struct SumCtx SumCtx;
1096struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001097 double rSum; /* Floating point sum */
1098 i64 iSum; /* Integer sum */
1099 i64 cnt; /* Number of elements summed */
1100 u8 overflow; /* True if integer overflow seen */
1101 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001102};
1103
1104/*
drha97fdd32006-01-12 22:17:50 +00001105** Routines used to compute the sum, average, and total.
1106**
1107** The SUM() function follows the (broken) SQL standard which means
1108** that it returns NULL if it sums over no inputs. TOTAL returns
1109** 0.0 in that case. In addition, TOTAL always returns a float where
1110** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001111** value. TOTAL never fails, but SUM might through an exception if
1112** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001113*/
danielk19770ae8b832004-05-25 12:05:56 +00001114static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001115 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001116 int type;
drh3f219f42005-09-08 19:45:57 +00001117 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +00001118 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001119 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001120 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001121 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001122 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001123 i64 v = sqlite3_value_int64(argv[0]);
1124 p->rSum += v;
1125 if( (p->approx|p->overflow)==0 ){
1126 i64 iNewSum = p->iSum + v;
1127 int s1 = p->iSum >> (sizeof(i64)*8-1);
1128 int s2 = v >> (sizeof(i64)*8-1);
1129 int s3 = iNewSum >> (sizeof(i64)*8-1);
1130 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
1131 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001132 }
1133 }else{
drh8c08e862006-02-11 17:34:00 +00001134 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001135 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001136 }
drh739105c2002-05-29 23:22:23 +00001137 }
drhdd5baa92002-02-27 19:50:59 +00001138}
danielk19770ae8b832004-05-25 12:05:56 +00001139static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001140 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001141 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001142 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001143 if( p->overflow ){
1144 sqlite3_result_error(context,"integer overflow",-1);
1145 }else if( p->approx ){
1146 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001147 }else{
drh8c08e862006-02-11 17:34:00 +00001148 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001149 }
drh3d1d95e2005-09-08 10:37:01 +00001150 }
drhdd5baa92002-02-27 19:50:59 +00001151}
danielk19770ae8b832004-05-25 12:05:56 +00001152static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001153 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001154 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001155 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001156 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001157 }
1158}
drha97fdd32006-01-12 22:17:50 +00001159static void totalFinalize(sqlite3_context *context){
1160 SumCtx *p;
1161 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001162 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001163}
drhdd5baa92002-02-27 19:50:59 +00001164
1165/*
drh0bce8352002-02-28 00:41:10 +00001166** The following structure keeps track of state information for the
1167** count() aggregate function.
1168*/
1169typedef struct CountCtx CountCtx;
1170struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001171 i64 n;
drh0bce8352002-02-28 00:41:10 +00001172};
drhdd5baa92002-02-27 19:50:59 +00001173
drh0bce8352002-02-28 00:41:10 +00001174/*
1175** Routines to implement the count() aggregate function.
1176*/
danielk19770ae8b832004-05-25 12:05:56 +00001177static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001178 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001179 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001180 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001181 p->n++;
1182 }
1183}
danielk19770ae8b832004-05-25 12:05:56 +00001184static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001185 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001186 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001187 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001188}
1189
1190/*
drh0bce8352002-02-28 00:41:10 +00001191** Routines to implement min() and max() aggregate functions.
1192*/
danielk19770ae8b832004-05-25 12:05:56 +00001193static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +00001194 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001195 Mem *pBest;
1196
1197 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1198 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001199 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001200
danielk197788208052004-05-25 01:13:20 +00001201 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001202 int max;
1203 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001204 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001205 /* This step function is used for both the min() and max() aggregates,
1206 ** the only difference between the two being that the sense of the
1207 ** comparison is inverted. For the max() aggregate, the
1208 ** sqlite3_user_data() function returns (void *)-1. For min() it
1209 ** returns (void *)db, where db is the sqlite3* database pointer.
1210 ** Therefore the next statement sets variable 'max' to 1 for the max()
1211 ** aggregate, or 0 for min().
1212 */
drh309b3382007-03-17 17:52:42 +00001213 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001214 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001215 if( (max && cmp<0) || (!max && cmp>0) ){
danielk19777e18c252004-05-25 11:47:24 +00001216 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001217 }
drh268380c2004-02-25 13:47:31 +00001218 }else{
danielk19777e18c252004-05-25 11:47:24 +00001219 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001220 }
1221}
danielk19770ae8b832004-05-25 12:05:56 +00001222static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001223 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001224 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1225 if( pRes ){
1226 if( pRes->flags ){
1227 sqlite3_result_value(context, pRes);
1228 }
1229 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001230 }
1231}
drhdd5baa92002-02-27 19:50:59 +00001232
drh4e5ffc52004-08-31 00:52:37 +00001233
drhd3a149e2002-02-24 17:12:53 +00001234/*
drha2ed5602002-02-26 23:55:31 +00001235** This function registered all of the above C functions as SQL
1236** functions. This should be the only routine in this file with
1237** external linkage.
drhdc04c582002-02-24 01:55:15 +00001238*/
drh9bb575f2004-09-06 17:24:11 +00001239void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001240 static const struct {
drh0bce8352002-02-28 00:41:10 +00001241 char *zName;
drh268380c2004-02-25 13:47:31 +00001242 signed char nArg;
drh309b3382007-03-17 17:52:42 +00001243 u8 argType; /* ff: db 1: 0, 2: 1, 3: 2,... N: N-1. */
danielk1977f4618892004-06-28 13:09:11 +00001244 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001245 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001246 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001247 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001248 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1249 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
drh309b3382007-03-17 17:52:42 +00001250 { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc },
1251 { "max", 0, 1, SQLITE_UTF8, 1, 0 },
danielk1977f4618892004-06-28 13:09:11 +00001252 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1253 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
1254 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
drh6c626082004-11-14 21:56:29 +00001255#ifndef SQLITE_OMIT_UTF16
danielk1977f4618892004-06-28 13:09:11 +00001256 { "substr", 3, 0, SQLITE_UTF16LE, 0, sqlite3utf16Substr },
drh6c626082004-11-14 21:56:29 +00001257#endif
danielk1977f4618892004-06-28 13:09:11 +00001258 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1259 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1260 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1261 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1262 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1263 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1264 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1265 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
drh137c7282007-01-29 17:58:28 +00001266 { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc },
danielk1977f4618892004-06-28 13:09:11 +00001267 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1268 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
drh137c7282007-01-29 17:58:28 +00001269 { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob },
drh94a98362004-09-13 13:13:18 +00001270 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001271 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1272 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
drh309b3382007-03-17 17:52:42 +00001273 { "last_insert_rowid", 0, 0xff, SQLITE_UTF8, 0, last_insert_rowid },
1274 { "changes", 0, 0xff, SQLITE_UTF8, 0, changes },
1275 { "total_changes", 0, 0xff, SQLITE_UTF8, 0, total_changes },
drh26b6d902007-03-17 13:27:54 +00001276 { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc },
drh309b3382007-03-17 17:52:42 +00001277 { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc },
1278 { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc },
1279 { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc },
1280 { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc },
1281 { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc },
1282 { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc },
drh8cff3822007-05-02 02:08:28 +00001283 { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc },
drhd24cc422003-03-27 12:51:24 +00001284#ifdef SQLITE_SOUNDEX
drh309b3382007-03-17 17:52:42 +00001285 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001286#endif
drhfdb83b22006-06-17 14:12:47 +00001287#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh309b3382007-03-17 17:52:42 +00001288 { "load_extension", 1, 0xff, SQLITE_UTF8, 0, loadExt },
1289 { "load_extension", 2, 0xff, SQLITE_UTF8, 0, loadExt },
drhfdb83b22006-06-17 14:12:47 +00001290#endif
drh193a6b42002-07-07 16:52:46 +00001291#ifdef SQLITE_TEST
drh309b3382007-03-17 17:52:42 +00001292 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1293 { "test_destructor", 1, 0xff, SQLITE_UTF8, 0, test_destructor},
1294 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
1295 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
1296 { "test_error", 1, 0, SQLITE_UTF8, 0, test_error},
drh193a6b42002-07-07 16:52:46 +00001297#endif
drh0bce8352002-02-28 00:41:10 +00001298 };
drh57196282004-10-06 15:41:16 +00001299 static const struct {
drh0bce8352002-02-28 00:41:10 +00001300 char *zName;
drh268380c2004-02-25 13:47:31 +00001301 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001302 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001303 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001304 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1305 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001306 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001307 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
drh309b3382007-03-17 17:52:42 +00001308 { "max", 1, 1, 1, minmaxStep, minMaxFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001309 { "sum", 1, 0, 0, sumStep, sumFinalize },
drha97fdd32006-01-12 22:17:50 +00001310 { "total", 1, 0, 0, sumStep, totalFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001311 { "avg", 1, 0, 0, sumStep, avgFinalize },
1312 { "count", 0, 0, 0, countStep, countFinalize },
1313 { "count", 1, 0, 0, countStep, countFinalize },
drh0bce8352002-02-28 00:41:10 +00001314 };
1315 int i;
1316
1317 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001318 void *pArg;
1319 u8 argType = aFuncs[i].argType;
1320 if( argType==0xff ){
1321 pArg = db;
1322 }else{
1323 pArg = (void*)(int)argType;
danielk1977c572ef72004-05-27 09:28:41 +00001324 }
danielk1977771151b2006-01-17 13:21:40 +00001325 sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001326 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001327 if( aFuncs[i].needCollSeq ){
1328 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1329 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1330 if( pFunc && aFuncs[i].needCollSeq ){
1331 pFunc->needCollSeq = 1;
1332 }
1333 }
drh0bce8352002-02-28 00:41:10 +00001334 }
drh1f01ec12005-02-15 21:36:18 +00001335#ifndef SQLITE_OMIT_ALTERTABLE
1336 sqlite3AlterFunctions(db);
1337#endif
drh198bf392006-01-06 21:52:49 +00001338#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001339 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001340#endif
drh0bce8352002-02-28 00:41:10 +00001341 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001342 void *pArg = (void*)(int)aAggs[i].argType;
danielk1977771151b2006-01-17 13:21:40 +00001343 sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001344 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001345 if( aAggs[i].needCollSeq ){
1346 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001347 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001348 if( pFunc && aAggs[i].needCollSeq ){
1349 pFunc->needCollSeq = 1;
1350 }
1351 }
drh268380c2004-02-25 13:47:31 +00001352 }
danielk19774adee202004-05-08 08:23:19 +00001353 sqlite3RegisterDateTimeFunctions(db);
drhb7481e72006-09-16 21:45:14 +00001354 sqlite3_overload_function(db, "MATCH", 2);
danielk1977fd9e1f32005-05-22 10:44:34 +00001355#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001356 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001357#endif
drh55ef4d92005-08-14 01:20:37 +00001358#ifdef SQLITE_CASE_SENSITIVE_LIKE
1359 sqlite3RegisterLikeFunctions(db, 1);
1360#else
1361 sqlite3RegisterLikeFunctions(db, 0);
1362#endif
1363}
1364
1365/*
1366** Set the LIKEOPT flag on the 2-argument function with the given name.
1367*/
drhd64fe2f2005-08-28 17:00:23 +00001368static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001369 FuncDef *pDef;
1370 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1371 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001372 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001373 }
1374}
1375
1376/*
1377** Register the built-in LIKE and GLOB functions. The caseSensitive
1378** parameter determines whether or not the LIKE operator is case
1379** sensitive. GLOB is always case sensitive.
1380*/
1381void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1382 struct compareInfo *pInfo;
1383 if( caseSensitive ){
1384 pInfo = (struct compareInfo*)&likeInfoAlt;
1385 }else{
1386 pInfo = (struct compareInfo*)&likeInfoNorm;
1387 }
danielk1977771151b2006-01-17 13:21:40 +00001388 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1389 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1390 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001391 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001392 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1393 setLikeOptFlag(db, "like",
1394 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001395}
1396
1397/*
1398** pExpr points to an expression which implements a function. If
1399** it is appropriate to apply the LIKE optimization to that function
1400** then set aWc[0] through aWc[2] to the wildcard characters and
1401** return TRUE. If the function is not a LIKE-style function then
1402** return FALSE.
1403*/
drhd64fe2f2005-08-28 17:00:23 +00001404int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001405 FuncDef *pDef;
1406 if( pExpr->op!=TK_FUNCTION ){
1407 return 0;
1408 }
1409 if( pExpr->pList->nExpr!=2 ){
1410 return 0;
1411 }
drh2646da72005-12-09 20:02:05 +00001412 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001413 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001414 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001415 return 0;
1416 }
1417
1418 /* The memcpy() statement assumes that the wildcard characters are
1419 ** the first three statements in the compareInfo structure. The
1420 ** asserts() that follow verify that assumption
1421 */
1422 memcpy(aWc, pDef->pUserData, 3);
1423 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1424 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1425 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001426 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001427 return 1;
drhdc04c582002-02-24 01:55:15 +00001428}