blob: 1326f2dd74e2cfe0b74f93b8972f59fa24ee3f5b [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**
drhbeb818d2007-05-08 15:34:47 +000019** $Id: func.c,v 1.150 2007/05/08 15:34:48 drh Exp $
drhdc04c582002-02-24 01:55:15 +000020*/
drhb659e9b2005-01-28 01:29:08 +000021#include "sqliteInt.h"
drhdc04c582002-02-24 01:55:15 +000022#include <ctype.h>
drhb37df7b2005-10-13 02:09:49 +000023/* #include <math.h> */
drhd3a149e2002-02-24 17:12:53 +000024#include <stdlib.h>
drh0bce8352002-02-28 00:41:10 +000025#include <assert.h>
danielk197788208052004-05-25 01:13:20 +000026#include "vdbeInt.h"
drh771d8c32003-08-09 21:32:28 +000027#include "os.h"
drh0bce8352002-02-28 00:41:10 +000028
drh55ef4d92005-08-14 01:20:37 +000029/*
30** Return the collating function associated with a function.
31*/
danielk1977dc1bdc42004-06-11 10:51:27 +000032static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
33 return context->pColl;
34}
35
drh0bce8352002-02-28 00:41:10 +000036/*
37** Implementation of the non-aggregate min() and max() functions
38*/
drhf9b596e2004-05-26 16:54:42 +000039static void minmaxFunc(
40 sqlite3_context *context,
41 int argc,
42 sqlite3_value **argv
43){
drh0bce8352002-02-28 00:41:10 +000044 int i;
drh268380c2004-02-25 13:47:31 +000045 int mask; /* 0 for min() or 0xffffffff for max() */
drhf9b596e2004-05-26 16:54:42 +000046 int iBest;
danielk1977dc1bdc42004-06-11 10:51:27 +000047 CollSeq *pColl;
drh0bce8352002-02-28 00:41:10 +000048
drh89425d52002-02-28 03:04:48 +000049 if( argc==0 ) return;
drhc44af712004-09-02 15:53:56 +000050 mask = sqlite3_user_data(context)==0 ? 0 : -1;
danielk1977dc1bdc42004-06-11 10:51:27 +000051 pColl = sqlite3GetFuncCollSeq(context);
52 assert( pColl );
danielk1977c572ef72004-05-27 09:28:41 +000053 assert( mask==-1 || mask==0 );
drhf9b596e2004-05-26 16:54:42 +000054 iBest = 0;
drh9c054832004-05-31 18:51:57 +000055 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhf9b596e2004-05-26 16:54:42 +000056 for(i=1; i<argc; i++){
drh9c054832004-05-31 18:51:57 +000057 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
danielk1977dc1bdc42004-06-11 10:51:27 +000058 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
drhf9b596e2004-05-26 16:54:42 +000059 iBest = i;
drh0bce8352002-02-28 00:41:10 +000060 }
61 }
drhf4479502004-05-27 03:12:53 +000062 sqlite3_result_value(context, argv[iBest]);
drh0bce8352002-02-28 00:41:10 +000063}
drh0bce8352002-02-28 00:41:10 +000064
drh268380c2004-02-25 13:47:31 +000065/*
66** Return the type of the argument.
67*/
drhf9b596e2004-05-26 16:54:42 +000068static void typeofFunc(
69 sqlite3_context *context,
70 int argc,
71 sqlite3_value **argv
72){
danielk197735bb9d02004-05-24 12:55:54 +000073 const char *z = 0;
danielk197735bb9d02004-05-24 12:55:54 +000074 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000075 case SQLITE_NULL: z = "null"; break;
76 case SQLITE_INTEGER: z = "integer"; break;
77 case SQLITE_TEXT: z = "text"; break;
78 case SQLITE_FLOAT: z = "real"; break;
79 case SQLITE_BLOB: z = "blob"; break;
danielk197735bb9d02004-05-24 12:55:54 +000080 }
danielk1977d8123362004-06-12 09:25:12 +000081 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000082}
83
drh5708d2d2005-06-22 10:53:59 +000084
85/*
drh0bce8352002-02-28 00:41:10 +000086** Implementation of the length() function
87*/
drhf9b596e2004-05-26 16:54:42 +000088static void lengthFunc(
89 sqlite3_context *context,
90 int argc,
91 sqlite3_value **argv
92){
drh0bce8352002-02-28 00:41:10 +000093 int len;
94
95 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +000096 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000097 case SQLITE_BLOB:
98 case SQLITE_INTEGER:
99 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000100 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +0000101 break;
102 }
drh9c054832004-05-31 18:51:57 +0000103 case SQLITE_TEXT: {
drh2646da72005-12-09 20:02:05 +0000104 const unsigned char *z = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000105 if( z==0 ) return;
drhf9b596e2004-05-26 16:54:42 +0000106 for(len=0; *z; z++){ if( (0xc0&*z)!=0x80 ) len++; }
drhf4479502004-05-27 03:12:53 +0000107 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000108 break;
109 }
110 default: {
111 sqlite3_result_null(context);
112 break;
113 }
114 }
drh0bce8352002-02-28 00:41:10 +0000115}
116
117/*
118** Implementation of the abs() function
119*/
danielk19770ae8b832004-05-25 12:05:56 +0000120static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000121 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +0000122 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000123 case SQLITE_INTEGER: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000124 i64 iVal = sqlite3_value_int64(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000125 if( iVal<0 ){
126 if( (iVal<<1)==0 ){
127 sqlite3_result_error(context, "integer overflow", -1);
128 return;
129 }
130 iVal = -iVal;
131 }
danielk1977f93bbbe2004-05-27 10:30:52 +0000132 sqlite3_result_int64(context, iVal);
drhf9b596e2004-05-26 16:54:42 +0000133 break;
134 }
drh9c054832004-05-31 18:51:57 +0000135 case SQLITE_NULL: {
drhf9b596e2004-05-26 16:54:42 +0000136 sqlite3_result_null(context);
137 break;
138 }
139 default: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000140 double rVal = sqlite3_value_double(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000141 if( rVal<0 ) rVal = -rVal;
danielk1977f93bbbe2004-05-27 10:30:52 +0000142 sqlite3_result_double(context, rVal);
drhf9b596e2004-05-26 16:54:42 +0000143 break;
144 }
145 }
drh0bce8352002-02-28 00:41:10 +0000146}
147
148/*
149** Implementation of the substr() function
150*/
drhf9b596e2004-05-26 16:54:42 +0000151static void substrFunc(
152 sqlite3_context *context,
153 int argc,
154 sqlite3_value **argv
155){
drh2646da72005-12-09 20:02:05 +0000156 const unsigned char *z;
157 const unsigned char *z2;
drh0bce8352002-02-28 00:41:10 +0000158 int i;
drh023ae032007-05-08 12:12:16 +0000159 int len;
160 i64 p1, p2;
drhf9b596e2004-05-26 16:54:42 +0000161
drh0bce8352002-02-28 00:41:10 +0000162 assert( argc==3 );
drh4f26d6c2004-05-26 23:25:30 +0000163 z = sqlite3_value_text(argv[0]);
drh0bce8352002-02-28 00:41:10 +0000164 if( z==0 ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000165 p1 = sqlite3_value_int(argv[1]);
166 p2 = sqlite3_value_int(argv[2]);
drh47c8a672002-02-28 04:00:12 +0000167 for(len=0, z2=z; *z2; z2++){ if( (0xc0&*z2)!=0x80 ) len++; }
drh0bce8352002-02-28 00:41:10 +0000168 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000169 p1 += len;
drh653bc752002-02-28 03:31:10 +0000170 if( p1<0 ){
171 p2 += p1;
172 p1 = 0;
173 }
drh0bce8352002-02-28 00:41:10 +0000174 }else if( p1>0 ){
175 p1--;
176 }
177 if( p1+p2>len ){
178 p2 = len-p1;
179 }
drh77396302004-01-02 13:17:48 +0000180 for(i=0; i<p1 && z[i]; i++){
drh47c8a672002-02-28 04:00:12 +0000181 if( (z[i]&0xc0)==0x80 ) p1++;
drh0bce8352002-02-28 00:41:10 +0000182 }
drh47c8a672002-02-28 04:00:12 +0000183 while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p1++; }
drh77396302004-01-02 13:17:48 +0000184 for(; i<p1+p2 && z[i]; i++){
drh47c8a672002-02-28 04:00:12 +0000185 if( (z[i]&0xc0)==0x80 ) p2++;
drh0bce8352002-02-28 00:41:10 +0000186 }
drh47c8a672002-02-28 04:00:12 +0000187 while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p2++; }
drh653bc752002-02-28 03:31:10 +0000188 if( p2<0 ) p2 = 0;
drh2646da72005-12-09 20:02:05 +0000189 sqlite3_result_text(context, (char*)&z[p1], p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000190}
191
192/*
193** Implementation of the round() function
194*/
danielk19770ae8b832004-05-25 12:05:56 +0000195static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000196 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000197 double r;
drh592ac8c2005-08-13 03:07:47 +0000198 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000199 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000200 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000201 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000202 n = sqlite3_value_int(argv[1]);
203 if( n>30 ) n = 30;
204 if( n<0 ) n = 0;
205 }
drhd589a922006-03-02 03:02:48 +0000206 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000207 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000208 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000209 sqlite3AtoF(zBuf, &r);
210 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000211}
drhdc04c582002-02-24 01:55:15 +0000212
213/*
214** Implementation of the upper() and lower() SQL functions.
215*/
danielk19770ae8b832004-05-25 12:05:56 +0000216static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000217 char *z1;
218 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000219 int i, n;
drh9c054832004-05-31 18:51:57 +0000220 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh9310ef22007-04-27 17:16:20 +0000221 n = sqlite3_value_bytes(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000222 z2 = (char*)sqlite3_value_text(argv[0]);
223 if( z2 ){
drh9310ef22007-04-27 17:16:20 +0000224 z1 = sqlite3_malloc(n+1);
drh7a521cf2007-04-25 18:23:52 +0000225 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000226 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000227 for(i=0; z1[i]; i++){
228 z1[i] = toupper(z1[i]);
229 }
230 sqlite3_result_text(context, z1, -1, sqlite3_free);
231 }
drhdc04c582002-02-24 01:55:15 +0000232 }
233}
danielk19770ae8b832004-05-25 12:05:56 +0000234static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000235 char *z1;
236 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000237 int i, n;
drh9c054832004-05-31 18:51:57 +0000238 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh9310ef22007-04-27 17:16:20 +0000239 n = sqlite3_value_bytes(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000240 z2 = (char*)sqlite3_value_text(argv[0]);
241 if( z2 ){
drh9310ef22007-04-27 17:16:20 +0000242 z1 = sqlite3_malloc(n+1);
drh7a521cf2007-04-25 18:23:52 +0000243 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000244 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000245 for(i=0; z1[i]; i++){
246 z1[i] = tolower(z1[i]);
247 }
248 sqlite3_result_text(context, z1, -1, sqlite3_free);
249 }
drhdc04c582002-02-24 01:55:15 +0000250 }
251}
252
253/*
drhfbc99082002-02-28 03:14:18 +0000254** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000255** All three do the same thing. They return the first non-NULL
256** argument.
drh3212e182002-02-28 00:46:26 +0000257*/
drhf9b596e2004-05-26 16:54:42 +0000258static void ifnullFunc(
259 sqlite3_context *context,
260 int argc,
261 sqlite3_value **argv
262){
drhfbc99082002-02-28 03:14:18 +0000263 int i;
264 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000265 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000266 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000267 break;
268 }
269 }
drh3212e182002-02-28 00:46:26 +0000270}
271
272/*
drhf9ffac92002-03-02 19:00:31 +0000273** Implementation of random(). Return a random integer.
274*/
drhf9b596e2004-05-26 16:54:42 +0000275static void randomFunc(
276 sqlite3_context *context,
277 int argc,
278 sqlite3_value **argv
279){
drh52fc8492006-02-23 21:43:55 +0000280 sqlite_int64 r;
danielk19774adee202004-05-08 08:23:19 +0000281 sqlite3Randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000282 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
283 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000284 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000285}
286
287/*
drh137c7282007-01-29 17:58:28 +0000288** Implementation of randomblob(N). Return a random blob
289** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000290*/
drh137c7282007-01-29 17:58:28 +0000291static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000292 sqlite3_context *context,
293 int argc,
294 sqlite3_value **argv
295){
drh137c7282007-01-29 17:58:28 +0000296 int n;
297 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000298 assert( argc==1 );
299 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000300 if( n<1 ){
301 n = 1;
302 }
303 if( n>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000304 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000305 return;
306 }
drh02d85832007-05-07 19:31:15 +0000307 p = sqliteMalloc(n);
308 if( p ){
309 sqlite3Randomness(n, p);
310 sqlite3_result_blob(context, (char*)p, n, sqlite3FreeX);
311 }
drh63cf66f2007-01-29 15:50:05 +0000312}
313
314/*
drh6ed41ad2002-04-06 14:10:47 +0000315** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000316** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000317*/
danielk197751ad0ec2004-05-24 12:39:02 +0000318static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000319 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000320 int arg,
321 sqlite3_value **argv
322){
drh9bb575f2004-09-06 17:24:11 +0000323 sqlite3 *db = sqlite3_user_data(context);
drhf9b596e2004-05-26 16:54:42 +0000324 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000325}
326
rdcf146a772004-02-25 22:51:06 +0000327/*
danielk1977b28af712004-06-21 06:50:26 +0000328** Implementation of the changes() SQL function. The return value is the
329** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000330*/
danielk1977b28af712004-06-21 06:50:26 +0000331static void changes(
drhf9b596e2004-05-26 16:54:42 +0000332 sqlite3_context *context,
333 int arg,
334 sqlite3_value **argv
335){
drh9bb575f2004-09-06 17:24:11 +0000336 sqlite3 *db = sqlite3_user_data(context);
drhf4479502004-05-27 03:12:53 +0000337 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000338}
rdcf146a772004-02-25 22:51:06 +0000339
340/*
danielk1977b28af712004-06-21 06:50:26 +0000341** Implementation of the total_changes() SQL function. The return value is
342** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000343*/
danielk1977b28af712004-06-21 06:50:26 +0000344static void total_changes(
345 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000346 int arg,
347 sqlite3_value **argv
348){
drh9bb575f2004-09-06 17:24:11 +0000349 sqlite3 *db = sqlite3_user_data(context);
danielk1977b28af712004-06-21 06:50:26 +0000350 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000351}
352
drh6ed41ad2002-04-06 14:10:47 +0000353/*
drh4e5ffc52004-08-31 00:52:37 +0000354** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000355*/
drh4e5ffc52004-08-31 00:52:37 +0000356struct compareInfo {
357 u8 matchAll;
358 u8 matchOne;
359 u8 matchSet;
360 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000361};
drh55ef4d92005-08-14 01:20:37 +0000362
drh4e5ffc52004-08-31 00:52:37 +0000363static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000364/* The correct SQL-92 behavior is for the LIKE operator to ignore
365** case. Thus 'a' LIKE 'A' would be true. */
366static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
367/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
368** is case sensitive causing 'a' LIKE 'A' to be false */
369static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000370
371/*
drh4e5ffc52004-08-31 00:52:37 +0000372** X is a pointer to the first byte of a UTF-8 character. Increment
373** X so that it points to the next character. This only works right
374** if X points to a well-formed UTF-8 string.
danielk1977d02eb1f2004-06-06 09:44:03 +0000375*/
drh4e5ffc52004-08-31 00:52:37 +0000376#define sqliteNextChar(X) while( (0xc0&*++(X))==0x80 ){}
377#define sqliteCharVal(X) sqlite3ReadUtf8(X)
danielk1977d02eb1f2004-06-06 09:44:03 +0000378
danielk1977d02eb1f2004-06-06 09:44:03 +0000379
380/*
drh4e5ffc52004-08-31 00:52:37 +0000381** Compare two UTF-8 strings for equality where the first string can
382** potentially be a "glob" expression. Return true (1) if they
383** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000384**
drh4e5ffc52004-08-31 00:52:37 +0000385** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000386**
drh4e5ffc52004-08-31 00:52:37 +0000387** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000388**
drh4e5ffc52004-08-31 00:52:37 +0000389** '?' Matches exactly one character.
390**
391** [...] Matches one character from the enclosed list of
392** characters.
393**
394** [^...] Matches one character not in the enclosed list.
395**
396** With the [...] and [^...] matching, a ']' character can be included
397** in the list by making it the first character after '[' or '^'. A
398** range of characters can be specified using '-'. Example:
399** "[a-z]" matches any single lower-case letter. To match a '-', make
400** it the last character in the list.
401**
402** This routine is usually quick, but can be N**2 in the worst case.
403**
404** Hints: to match '*' or '?', put them in "[]". Like this:
405**
406** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000407*/
danielk19777c6303c2004-11-17 16:41:29 +0000408static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000409 const u8 *zPattern, /* The glob pattern */
410 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000411 const struct compareInfo *pInfo, /* Information about how to do the compare */
412 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000413){
danielk1977ad7dd422004-06-06 12:41:49 +0000414 register int c;
drh4e5ffc52004-08-31 00:52:37 +0000415 int invert;
416 int seen;
417 int c2;
418 u8 matchOne = pInfo->matchOne;
419 u8 matchAll = pInfo->matchAll;
420 u8 matchSet = pInfo->matchSet;
421 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000422 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000423
drh4e5ffc52004-08-31 00:52:37 +0000424 while( (c = *zPattern)!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000425 if( !prevEscape && c==matchAll ){
drh4e5ffc52004-08-31 00:52:37 +0000426 while( (c=zPattern[1]) == matchAll || c == matchOne ){
427 if( c==matchOne ){
428 if( *zString==0 ) return 0;
429 sqliteNextChar(zString);
430 }
431 zPattern++;
danielk1977ad7dd422004-06-06 12:41:49 +0000432 }
drh20fc0882004-11-18 13:49:25 +0000433 if( c && esc && sqlite3ReadUtf8(&zPattern[1])==esc ){
danielk19777c6303c2004-11-17 16:41:29 +0000434 u8 const *zTemp = &zPattern[1];
435 sqliteNextChar(zTemp);
436 c = *zTemp;
437 }
drh4e5ffc52004-08-31 00:52:37 +0000438 if( c==0 ) return 1;
439 if( c==matchSet ){
danielk19777c6303c2004-11-17 16:41:29 +0000440 assert( esc==0 ); /* This is GLOB, not LIKE */
441 while( *zString && patternCompare(&zPattern[1],zString,pInfo,esc)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000442 sqliteNextChar(zString);
443 }
444 return *zString!=0;
445 }else{
446 while( (c2 = *zString)!=0 ){
447 if( noCase ){
448 c2 = sqlite3UpperToLower[c2];
449 c = sqlite3UpperToLower[c];
450 while( c2 != 0 && c2 != c ){ c2 = sqlite3UpperToLower[*++zString]; }
451 }else{
452 while( c2 != 0 && c2 != c ){ c2 = *++zString; }
453 }
454 if( c2==0 ) return 0;
danielk19777c6303c2004-11-17 16:41:29 +0000455 if( patternCompare(&zPattern[1],zString,pInfo,esc) ) return 1;
drh4e5ffc52004-08-31 00:52:37 +0000456 sqliteNextChar(zString);
457 }
458 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000459 }
danielk19777c6303c2004-11-17 16:41:29 +0000460 }else if( !prevEscape && c==matchOne ){
drh4e5ffc52004-08-31 00:52:37 +0000461 if( *zString==0 ) return 0;
462 sqliteNextChar(zString);
463 zPattern++;
464 }else if( c==matchSet ){
465 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000466 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000467 seen = 0;
468 invert = 0;
469 c = sqliteCharVal(zString);
470 if( c==0 ) return 0;
471 c2 = *++zPattern;
472 if( c2=='^' ){ invert = 1; c2 = *++zPattern; }
473 if( c2==']' ){
474 if( c==']' ) seen = 1;
475 c2 = *++zPattern;
476 }
477 while( (c2 = sqliteCharVal(zPattern))!=0 && c2!=']' ){
478 if( c2=='-' && zPattern[1]!=']' && zPattern[1]!=0 && prior_c>0 ){
479 zPattern++;
480 c2 = sqliteCharVal(zPattern);
481 if( c>=prior_c && c<=c2 ) seen = 1;
482 prior_c = 0;
483 }else if( c==c2 ){
484 seen = 1;
485 prior_c = c2;
486 }else{
487 prior_c = c2;
488 }
489 sqliteNextChar(zPattern);
490 }
491 if( c2==0 || (seen ^ invert)==0 ) return 0;
492 sqliteNextChar(zString);
493 zPattern++;
drh20fc0882004-11-18 13:49:25 +0000494 }else if( esc && !prevEscape && sqlite3ReadUtf8(zPattern)==esc){
danielk19777c6303c2004-11-17 16:41:29 +0000495 prevEscape = 1;
496 sqliteNextChar(zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000497 }else{
498 if( noCase ){
499 if( sqlite3UpperToLower[c] != sqlite3UpperToLower[*zString] ) return 0;
500 }else{
501 if( c != *zString ) return 0;
502 }
503 zPattern++;
504 zString++;
danielk19777c6303c2004-11-17 16:41:29 +0000505 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000506 }
danielk197751ad0ec2004-05-24 12:39:02 +0000507 }
drh4e5ffc52004-08-31 00:52:37 +0000508 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000509}
drh4e5ffc52004-08-31 00:52:37 +0000510
drh55ef4d92005-08-14 01:20:37 +0000511/*
512** Count the number of times that the LIKE operator (or GLOB which is
513** just a variation of LIKE) gets called. This is used for testing
514** only.
515*/
516#ifdef SQLITE_TEST
517int sqlite3_like_count = 0;
518#endif
519
danielk19773f6b0872004-06-17 05:36:44 +0000520
521/*
522** Implementation of the like() SQL function. This function implements
523** the build-in LIKE operator. The first argument to the function is the
524** pattern and the second argument is the string. So, the SQL statements:
525**
526** A LIKE B
527**
528** is implemented as like(B,A).
529**
drh55ef4d92005-08-14 01:20:37 +0000530** This same function (with a different compareInfo structure) computes
531** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000532*/
533static void likeFunc(
534 sqlite3_context *context,
535 int argc,
536 sqlite3_value **argv
537){
drhbeb818d2007-05-08 15:34:47 +0000538 const unsigned char *zA, *zB;
539
540 /* Limit the length of the LIKE or GLOB pattern to avoid problems
541 ** of deep recursion and N*N behavior in patternCompare().
542 */
543 if( sqlite3_value_bytes(argv[1])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){
544 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
545 return;
546 }
547
548
549 zA = sqlite3_value_text(argv[0]);
550 zB = sqlite3_value_text(argv[1]);
danielk19777c6303c2004-11-17 16:41:29 +0000551 int escape = 0;
552 if( argc==3 ){
553 /* The escape character string must consist of a single UTF-8 character.
554 ** Otherwise, return an error.
555 */
556 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000557 if( zEsc==0 ) return;
drh2646da72005-12-09 20:02:05 +0000558 if( sqlite3utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000559 sqlite3_result_error(context,
560 "ESCAPE expression must be a single character", -1);
561 return;
562 }
563 escape = sqlite3ReadUtf8(zEsc);
564 }
danielk19773f6b0872004-06-17 05:36:44 +0000565 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000566 struct compareInfo *pInfo = sqlite3_user_data(context);
567#ifdef SQLITE_TEST
568 sqlite3_like_count++;
569#endif
drhbeb818d2007-05-08 15:34:47 +0000570
drh55ef4d92005-08-14 01:20:37 +0000571 sqlite3_result_int(context, patternCompare(zA, zB, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000572 }
drh8912d102002-05-26 21:34:58 +0000573}
574
575/*
576** Implementation of the NULLIF(x,y) function. The result is the first
577** argument if the arguments are different. The result is NULL if the
578** arguments are equal to each other.
579*/
drhf9b596e2004-05-26 16:54:42 +0000580static void nullifFunc(
581 sqlite3_context *context,
582 int argc,
583 sqlite3_value **argv
584){
danielk1977dc1bdc42004-06-11 10:51:27 +0000585 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
586 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000587 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000588 }
drh0ac65892002-04-20 14:24:41 +0000589}
590
drh647cb0e2002-11-04 19:32:25 +0000591/*
592** Implementation of the VERSION(*) function. The result is the version
593** of the SQLite library that is running.
594*/
drhf9b596e2004-05-26 16:54:42 +0000595static void versionFunc(
596 sqlite3_context *context,
597 int argc,
598 sqlite3_value **argv
599){
danielk1977d8123362004-06-12 09:25:12 +0000600 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000601}
602
drh137c7282007-01-29 17:58:28 +0000603/* Array for converting from half-bytes (nybbles) into ASCII hex
604** digits. */
605static const char hexdigits[] = {
606 '0', '1', '2', '3', '4', '5', '6', '7',
607 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
608};
danielk1977d641d642004-11-18 15:44:29 +0000609
drh47394702003-08-20 01:03:33 +0000610/*
611** EXPERIMENTAL - This is not an official function. The interface may
612** change. This function may disappear. Do not write code that depends
613** on this function.
614**
615** Implementation of the QUOTE() function. This function takes a single
616** argument. If the argument is numeric, the return value is the same as
617** the argument. If the argument is NULL, the return value is the string
618** "NULL". Otherwise, the argument is enclosed in single quotes with
619** single-quote escapes.
620*/
danielk19770ae8b832004-05-25 12:05:56 +0000621static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000622 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000623 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000624 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000625 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000626 break;
drh47394702003-08-20 01:03:33 +0000627 }
drh9c054832004-05-31 18:51:57 +0000628 case SQLITE_INTEGER:
629 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000630 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000631 break;
632 }
danielk19773f41e972004-06-08 00:39:01 +0000633 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000634 char *zText = 0;
635 int nBlob = sqlite3_value_bytes(argv[0]);
636 char const *zBlob = sqlite3_value_blob(argv[0]);
637
drh023ae032007-05-08 12:12:16 +0000638 if( 2*nBlob+4>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000639 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000640 return;
641 }
danielk19773f41e972004-06-08 00:39:01 +0000642 zText = (char *)sqliteMalloc((2*nBlob)+4);
643 if( !zText ){
644 sqlite3_result_error(context, "out of memory", -1);
645 }else{
646 int i;
647 for(i=0; i<nBlob; i++){
648 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
649 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
650 }
651 zText[(nBlob*2)+2] = '\'';
652 zText[(nBlob*2)+3] = '\0';
653 zText[0] = 'X';
654 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000655 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
danielk19773f41e972004-06-08 00:39:01 +0000656 sqliteFree(zText);
657 }
658 break;
659 }
drh9c054832004-05-31 18:51:57 +0000660 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000661 int i,j;
662 u64 n;
drh2646da72005-12-09 20:02:05 +0000663 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000664 char *z;
665
drh7a521cf2007-04-25 18:23:52 +0000666 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000667 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
668 if( i+n+3>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000669 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000670 return;
671 }
drhf9b596e2004-05-26 16:54:42 +0000672 z = sqliteMalloc( i+n+3 );
673 if( z==0 ) return;
674 z[0] = '\'';
675 for(i=0, j=1; zArg[i]; i++){
676 z[j++] = zArg[i];
677 if( zArg[i]=='\'' ){
678 z[j++] = '\'';
679 }
680 }
681 z[j++] = '\'';
682 z[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000683 sqlite3_result_text(context, z, j, SQLITE_TRANSIENT);
drhf9b596e2004-05-26 16:54:42 +0000684 sqliteFree(z);
685 }
drh47394702003-08-20 01:03:33 +0000686 }
687}
688
drh137c7282007-01-29 17:58:28 +0000689/*
690** The hex() function. Interpret the argument as a blob. Return
691** a hexadecimal rendering as text.
692*/
693static void hexFunc(
694 sqlite3_context *context,
695 int argc,
696 sqlite3_value **argv
697){
698 int i, n;
699 const unsigned char *pBlob;
700 char *zHex, *z;
701 assert( argc==1 );
drh137c7282007-01-29 17:58:28 +0000702 n = sqlite3_value_bytes(argv[0]);
drh023ae032007-05-08 12:12:16 +0000703 if( n*2+1>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000704 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000705 return;
706 }
drh1eb25382007-04-10 13:51:17 +0000707 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000708 z = zHex = sqlite3_malloc(n*2 + 1);
709 if( zHex==0 ) return;
710 for(i=0; i<n; i++, pBlob++){
711 unsigned char c = *pBlob;
712 *(z++) = hexdigits[(c>>4)&0xf];
713 *(z++) = hexdigits[c&0xf];
714 }
715 *z = 0;
716 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
717}
718
drh26b6d902007-03-17 13:27:54 +0000719/*
drh8cff3822007-05-02 02:08:28 +0000720** The zeroblob(N) function returns a zero-filled blob of size N bytes.
721*/
722static void zeroblobFunc(
723 sqlite3_context *context,
724 int argc,
725 sqlite3_value **argv
726){
727 int n;
728 assert( argc==1 );
729 n = sqlite3_value_int(argv[0]);
730 sqlite3_result_zeroblob(context, n);
731}
732
733/*
drh26b6d902007-03-17 13:27:54 +0000734** The replace() function. Three arguments are all strings: call
735** them A, B, and C. The result is also a string which is derived
736** from A by replacing every occurance of B with C. The match
737** must be exact. Collating sequences are not used.
738*/
739static void replaceFunc(
740 sqlite3_context *context,
741 int argc,
742 sqlite3_value **argv
743){
744 const unsigned char *zStr; /* The input string A */
745 const unsigned char *zPattern; /* The pattern string B */
746 const unsigned char *zRep; /* The replacement string C */
747 unsigned char *zOut; /* The output */
748 int nStr; /* Size of zStr */
749 int nPattern; /* Size of zPattern */
750 int nRep; /* Size of zRep */
751 int nOut; /* Maximum size of zOut */
752 int loopLimit; /* Last zStr[] that might match zPattern[] */
753 int i, j; /* Loop counters */
754
755 assert( argc==3 );
drh9310ef22007-04-27 17:16:20 +0000756 nStr = sqlite3_value_bytes(argv[0]);
drh26b6d902007-03-17 13:27:54 +0000757 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000758 if( zStr==0 ) return;
drh9310ef22007-04-27 17:16:20 +0000759 nPattern = sqlite3_value_bytes(argv[1]);
drh26b6d902007-03-17 13:27:54 +0000760 zPattern = sqlite3_value_text(argv[1]);
drh709cff32007-04-27 01:18:02 +0000761 if( zPattern==0 || zPattern[0]==0 ) return;
drh9310ef22007-04-27 17:16:20 +0000762 nRep = sqlite3_value_bytes(argv[2]);
drh26b6d902007-03-17 13:27:54 +0000763 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000764 if( zRep==0 ) return;
drh26b6d902007-03-17 13:27:54 +0000765 if( nPattern>=nRep ){
766 nOut = nStr;
767 }else{
danielk197717374e82007-05-08 14:39:04 +0000768 i64 nOut64 = (i64)(nStr/nPattern + 1) * (i64)nRep;
769 nOut = ((nOut64>SQLITE_MAX_LENGTH) ? SQLITE_MAX_LENGTH : nOut64);
drh26b6d902007-03-17 13:27:54 +0000770 }
771 zOut = sqlite3_malloc(nOut+1);
772 if( zOut==0 ) return;
773 loopLimit = nStr - nPattern;
774 for(i=j=0; i<=loopLimit; i++){
775 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
776 zOut[j++] = zStr[i];
777 }else{
danielk197717374e82007-05-08 14:39:04 +0000778 if( (j+nRep+loopLimit-i)>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000779 sqlite3_result_error_toobig(context);
danielk197717374e82007-05-08 14:39:04 +0000780 sqlite3_free(zOut);
781 return;
782 }
drh26b6d902007-03-17 13:27:54 +0000783 memcpy(&zOut[j], zRep, nRep);
784 j += nRep;
785 i += nPattern-1;
786 }
787 }
788 memcpy(&zOut[j], &zStr[i], nStr-i);
789 j += nStr - i;
790 assert( j<=nOut );
791 zOut[j] = 0;
792 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
793}
794
drh309b3382007-03-17 17:52:42 +0000795/*
796** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
797** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
798*/
799static void trimFunc(
800 sqlite3_context *context,
801 int argc,
802 sqlite3_value **argv
803){
804 const unsigned char *zIn; /* Input string */
805 const unsigned char *zCharSet; /* Set of characters to trim */
806 int nIn; /* Number of bytes in input */
drhd1e3a612007-04-27 21:59:52 +0000807 int flags; /* 1: trimleft 2: trimright 3: trim */
808 int i; /* Loop counter */
809 unsigned char *aLen; /* Length of each character in zCharSet */
810 const unsigned char **azChar; /* Individual characters in zCharSet */
811 int nChar; /* Number of characters in zCharSet */
812
drh309b3382007-03-17 17:52:42 +0000813 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
814 return;
815 }
drh9310ef22007-04-27 17:16:20 +0000816 nIn = sqlite3_value_bytes(argv[0]);
drh309b3382007-03-17 17:52:42 +0000817 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000818 if( zIn==0 ) return;
drh309b3382007-03-17 17:52:42 +0000819 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000820 static const unsigned char lenOne[] = { 1 };
drh8cff3822007-05-02 02:08:28 +0000821 static const unsigned char *azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000822 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000823 aLen = (u8*)lenOne;
824 azChar = azOne;
drhd1e3a612007-04-27 21:59:52 +0000825 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000826 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000827 return;
drhd1e3a612007-04-27 21:59:52 +0000828 }else{
829 const unsigned char *z;
830 for(z=zCharSet, nChar=0; *z; nChar++){
831 sqliteNextChar(z);
832 }
833 if( nChar>0 ){
834 azChar = sqlite3_malloc( nChar*(sizeof(char*)+1) );
835 if( azChar==0 ){
836 return;
837 }
838 aLen = (unsigned char*)&azChar[nChar];
839 for(z=zCharSet, nChar=0; *z; nChar++){
840 azChar[nChar] = z;
841 sqliteNextChar(z);
842 aLen[nChar] = z - azChar[nChar];
843 }
844 }
drh309b3382007-03-17 17:52:42 +0000845 }
drhd1e3a612007-04-27 21:59:52 +0000846 if( nChar>0 ){
drh309b3382007-03-17 17:52:42 +0000847 flags = (int)sqlite3_user_data(context);
848 if( flags & 1 ){
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( memcmp(zIn, azChar[i], len)==0 ) break;
854 }
855 if( i>=nChar ) break;
856 zIn += len;
857 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000858 }
859 }
860 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000861 while( nIn>0 ){
862 int len;
863 for(i=0; i<nChar; i++){
864 len = aLen[i];
865 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
866 }
867 if( i>=nChar ) break;
868 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000869 }
870 }
drhd1e3a612007-04-27 21:59:52 +0000871 if( zCharSet ){
872 sqlite3_free(azChar);
873 }
drh309b3382007-03-17 17:52:42 +0000874 }
875 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
876}
drh26b6d902007-03-17 13:27:54 +0000877
drhd24cc422003-03-27 12:51:24 +0000878#ifdef SQLITE_SOUNDEX
879/*
880** Compute the soundex encoding of a word.
881*/
drh137c7282007-01-29 17:58:28 +0000882static void soundexFunc(
883 sqlite3_context *context,
884 int argc,
885 sqlite3_value **argv
886){
drhd24cc422003-03-27 12:51:24 +0000887 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000888 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000889 int i, j;
890 static const unsigned char iCode[] = {
891 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
892 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
893 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
894 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
895 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
896 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
897 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
898 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
899 };
900 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000901 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000902 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000903 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
904 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000905 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000906 zResult[0] = toupper(zIn[i]);
907 for(j=1; j<4 && zIn[i]; i++){
908 int code = iCode[zIn[i]&0x7f];
909 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000910 if( code!=prevcode ){
911 prevcode = code;
912 zResult[j++] = code + '0';
913 }
914 }else{
915 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000916 }
917 }
918 while( j<4 ){
919 zResult[j++] = '0';
920 }
921 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000922 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000923 }else{
danielk1977d8123362004-06-12 09:25:12 +0000924 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000925 }
926}
927#endif
928
drhfdb83b22006-06-17 14:12:47 +0000929#ifndef SQLITE_OMIT_LOAD_EXTENSION
930/*
931** A function that loads a shared-library extension then returns NULL.
932*/
933static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +0000934 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000935 const char *zProc;
drhfdb83b22006-06-17 14:12:47 +0000936 sqlite3 *db = sqlite3_user_data(context);
937 char *zErrMsg = 0;
938
939 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +0000940 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +0000941 }else{
942 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +0000943 }
drh7a521cf2007-04-25 18:23:52 +0000944 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +0000945 sqlite3_result_error(context, zErrMsg, -1);
946 sqlite3_free(zErrMsg);
947 }
948}
949#endif
950
drh193a6b42002-07-07 16:52:46 +0000951#ifdef SQLITE_TEST
952/*
953** This function generates a string of random characters. Used for
954** generating test data.
955*/
danielk19770ae8b832004-05-25 12:05:56 +0000956static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +0000957 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +0000958 "abcdefghijklmnopqrstuvwxyz"
959 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
960 "0123456789"
961 ".-!,:*^+=_|?/<> ";
962 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +0000963 unsigned char zBuf[1000];
drh193a6b42002-07-07 16:52:46 +0000964 if( argc>=1 ){
drhf9b596e2004-05-26 16:54:42 +0000965 iMin = sqlite3_value_int(argv[0]);
drh193a6b42002-07-07 16:52:46 +0000966 if( iMin<0 ) iMin = 0;
967 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
968 }else{
969 iMin = 1;
970 }
971 if( argc>=2 ){
drhf9b596e2004-05-26 16:54:42 +0000972 iMax = sqlite3_value_int(argv[1]);
drh193a6b42002-07-07 16:52:46 +0000973 if( iMax<iMin ) iMax = iMin;
drh1dba7272004-01-16 13:58:18 +0000974 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +0000975 }else{
976 iMax = 50;
977 }
978 n = iMin;
979 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +0000980 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +0000981 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +0000982 n += r%(iMax + 1 - iMin);
983 }
drh1dba7272004-01-16 13:58:18 +0000984 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +0000985 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +0000986 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +0000987 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +0000988 }
989 zBuf[n] = 0;
drh2646da72005-12-09 20:02:05 +0000990 sqlite3_result_text(context, (char*)zBuf, n, SQLITE_TRANSIENT);
danielk1977d8123362004-06-12 09:25:12 +0000991}
drh0e3d7472004-06-19 17:33:07 +0000992#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +0000993
drh0e3d7472004-06-19 17:33:07 +0000994#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +0000995/*
996** The following two SQL functions are used to test returning a text
997** result with a destructor. Function 'test_destructor' takes one argument
998** and returns the same argument interpreted as TEXT. A destructor is
999** passed with the sqlite3_result_text() call.
1000**
1001** SQL function 'test_destructor_count' returns the number of outstanding
1002** allocations made by 'test_destructor';
1003**
1004** WARNING: Not threadsafe.
1005*/
1006static int test_destructor_count_var = 0;
1007static void destructor(void *p){
1008 char *zVal = (char *)p;
1009 assert(zVal);
1010 zVal--;
1011 sqliteFree(zVal);
1012 test_destructor_count_var--;
1013}
1014static void test_destructor(
1015 sqlite3_context *pCtx,
1016 int nArg,
1017 sqlite3_value **argv
1018){
1019 char *zVal;
danielk1977f4618892004-06-28 13:09:11 +00001020 int len;
drh9bb575f2004-09-06 17:24:11 +00001021 sqlite3 *db = sqlite3_user_data(pCtx);
danielk1977f4618892004-06-28 13:09:11 +00001022
danielk1977d8123362004-06-12 09:25:12 +00001023 test_destructor_count_var++;
1024 assert( nArg==1 );
1025 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
danielk197714db2662006-01-09 16:12:04 +00001026 len = sqlite3ValueBytes(argv[0], ENC(db));
danielk1977f4618892004-06-28 13:09:11 +00001027 zVal = sqliteMalloc(len+3);
1028 zVal[len] = 0;
1029 zVal[len-1] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001030 assert( zVal );
1031 zVal++;
danielk197714db2662006-01-09 16:12:04 +00001032 memcpy(zVal, sqlite3ValueText(argv[0], ENC(db)), len);
1033 if( ENC(db)==SQLITE_UTF8 ){
danielk1977f4618892004-06-28 13:09:11 +00001034 sqlite3_result_text(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001035#ifndef SQLITE_OMIT_UTF16
danielk197714db2662006-01-09 16:12:04 +00001036 }else if( ENC(db)==SQLITE_UTF16LE ){
danielk1977f4618892004-06-28 13:09:11 +00001037 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
1038 }else{
1039 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001040#endif /* SQLITE_OMIT_UTF16 */
danielk1977f4618892004-06-28 13:09:11 +00001041 }
danielk1977d8123362004-06-12 09:25:12 +00001042}
1043static void test_destructor_count(
1044 sqlite3_context *pCtx,
1045 int nArg,
1046 sqlite3_value **argv
1047){
1048 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +00001049}
drh0e3d7472004-06-19 17:33:07 +00001050#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +00001051
drh0e3d7472004-06-19 17:33:07 +00001052#ifdef SQLITE_TEST
1053/*
1054** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
1055** interface.
1056**
1057** The test_auxdata() SQL function attempts to register each of its arguments
1058** as auxiliary data. If there are no prior registrations of aux data for
1059** that argument (meaning the argument is not a constant or this is its first
1060** call) then the result for that argument is 0. If there is a prior
1061** registration, the result for that argument is 1. The overall result
1062** is the individual argument results separated by spaces.
1063*/
danielk19773f6b0872004-06-17 05:36:44 +00001064static void free_test_auxdata(void *p) {sqliteFree(p);}
1065static void test_auxdata(
1066 sqlite3_context *pCtx,
1067 int nArg,
1068 sqlite3_value **argv
1069){
1070 int i;
1071 char *zRet = sqliteMalloc(nArg*2);
1072 if( !zRet ) return;
1073 for(i=0; i<nArg; i++){
drh2646da72005-12-09 20:02:05 +00001074 char const *z = (char*)sqlite3_value_text(argv[i]);
danielk19773f6b0872004-06-17 05:36:44 +00001075 if( z ){
1076 char *zAux = sqlite3_get_auxdata(pCtx, i);
1077 if( zAux ){
1078 zRet[i*2] = '1';
1079 if( strcmp(zAux, z) ){
1080 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
1081 return;
1082 }
1083 }else{
1084 zRet[i*2] = '0';
1085 zAux = sqliteStrDup(z);
1086 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
1087 }
1088 zRet[i*2+1] = ' ';
1089 }
1090 }
1091 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
1092}
drh0e3d7472004-06-19 17:33:07 +00001093#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +00001094
danielk197701427a62005-01-11 13:02:33 +00001095#ifdef SQLITE_TEST
1096/*
1097** A function to test error reporting from user functions. This function
1098** returns a copy of it's first argument as an error.
1099*/
1100static void test_error(
1101 sqlite3_context *pCtx,
1102 int nArg,
1103 sqlite3_value **argv
1104){
drh2646da72005-12-09 20:02:05 +00001105 sqlite3_result_error(pCtx, (char*)sqlite3_value_text(argv[0]), 0);
danielk197701427a62005-01-11 13:02:33 +00001106}
1107#endif /* SQLITE_TEST */
1108
drh0ac65892002-04-20 14:24:41 +00001109/*
drhd3a149e2002-02-24 17:12:53 +00001110** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001111** sum() or avg() aggregate computation.
1112*/
1113typedef struct SumCtx SumCtx;
1114struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001115 double rSum; /* Floating point sum */
1116 i64 iSum; /* Integer sum */
1117 i64 cnt; /* Number of elements summed */
1118 u8 overflow; /* True if integer overflow seen */
1119 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001120};
1121
1122/*
drha97fdd32006-01-12 22:17:50 +00001123** Routines used to compute the sum, average, and total.
1124**
1125** The SUM() function follows the (broken) SQL standard which means
1126** that it returns NULL if it sums over no inputs. TOTAL returns
1127** 0.0 in that case. In addition, TOTAL always returns a float where
1128** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001129** value. TOTAL never fails, but SUM might through an exception if
1130** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001131*/
danielk19770ae8b832004-05-25 12:05:56 +00001132static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001133 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001134 int type;
drh3f219f42005-09-08 19:45:57 +00001135 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +00001136 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001137 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001138 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001139 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001140 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001141 i64 v = sqlite3_value_int64(argv[0]);
1142 p->rSum += v;
1143 if( (p->approx|p->overflow)==0 ){
1144 i64 iNewSum = p->iSum + v;
1145 int s1 = p->iSum >> (sizeof(i64)*8-1);
1146 int s2 = v >> (sizeof(i64)*8-1);
1147 int s3 = iNewSum >> (sizeof(i64)*8-1);
1148 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
1149 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001150 }
1151 }else{
drh8c08e862006-02-11 17:34:00 +00001152 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001153 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001154 }
drh739105c2002-05-29 23:22:23 +00001155 }
drhdd5baa92002-02-27 19:50:59 +00001156}
danielk19770ae8b832004-05-25 12:05:56 +00001157static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001158 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001159 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001160 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001161 if( p->overflow ){
1162 sqlite3_result_error(context,"integer overflow",-1);
1163 }else if( p->approx ){
1164 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001165 }else{
drh8c08e862006-02-11 17:34:00 +00001166 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001167 }
drh3d1d95e2005-09-08 10:37:01 +00001168 }
drhdd5baa92002-02-27 19:50:59 +00001169}
danielk19770ae8b832004-05-25 12:05:56 +00001170static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001171 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001172 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001173 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001174 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001175 }
1176}
drha97fdd32006-01-12 22:17:50 +00001177static void totalFinalize(sqlite3_context *context){
1178 SumCtx *p;
1179 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001180 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001181}
drhdd5baa92002-02-27 19:50:59 +00001182
1183/*
drh0bce8352002-02-28 00:41:10 +00001184** The following structure keeps track of state information for the
1185** count() aggregate function.
1186*/
1187typedef struct CountCtx CountCtx;
1188struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001189 i64 n;
drh0bce8352002-02-28 00:41:10 +00001190};
drhdd5baa92002-02-27 19:50:59 +00001191
drh0bce8352002-02-28 00:41:10 +00001192/*
1193** Routines to implement the count() aggregate function.
1194*/
danielk19770ae8b832004-05-25 12:05:56 +00001195static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001196 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001197 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001198 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001199 p->n++;
1200 }
1201}
danielk19770ae8b832004-05-25 12:05:56 +00001202static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001203 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001204 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001205 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001206}
1207
1208/*
drh0bce8352002-02-28 00:41:10 +00001209** Routines to implement min() and max() aggregate functions.
1210*/
danielk19770ae8b832004-05-25 12:05:56 +00001211static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +00001212 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001213 Mem *pBest;
1214
1215 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1216 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001217 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001218
danielk197788208052004-05-25 01:13:20 +00001219 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001220 int max;
1221 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001222 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001223 /* This step function is used for both the min() and max() aggregates,
1224 ** the only difference between the two being that the sense of the
1225 ** comparison is inverted. For the max() aggregate, the
1226 ** sqlite3_user_data() function returns (void *)-1. For min() it
1227 ** returns (void *)db, where db is the sqlite3* database pointer.
1228 ** Therefore the next statement sets variable 'max' to 1 for the max()
1229 ** aggregate, or 0 for min().
1230 */
drh309b3382007-03-17 17:52:42 +00001231 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001232 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001233 if( (max && cmp<0) || (!max && cmp>0) ){
danielk19777e18c252004-05-25 11:47:24 +00001234 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001235 }
drh268380c2004-02-25 13:47:31 +00001236 }else{
danielk19777e18c252004-05-25 11:47:24 +00001237 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001238 }
1239}
danielk19770ae8b832004-05-25 12:05:56 +00001240static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001241 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001242 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1243 if( pRes ){
1244 if( pRes->flags ){
1245 sqlite3_result_value(context, pRes);
1246 }
1247 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001248 }
1249}
drhdd5baa92002-02-27 19:50:59 +00001250
drh4e5ffc52004-08-31 00:52:37 +00001251
drhd3a149e2002-02-24 17:12:53 +00001252/*
drha2ed5602002-02-26 23:55:31 +00001253** This function registered all of the above C functions as SQL
1254** functions. This should be the only routine in this file with
1255** external linkage.
drhdc04c582002-02-24 01:55:15 +00001256*/
drh9bb575f2004-09-06 17:24:11 +00001257void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001258 static const struct {
drh0bce8352002-02-28 00:41:10 +00001259 char *zName;
drh268380c2004-02-25 13:47:31 +00001260 signed char nArg;
drh309b3382007-03-17 17:52:42 +00001261 u8 argType; /* ff: db 1: 0, 2: 1, 3: 2,... N: N-1. */
danielk1977f4618892004-06-28 13:09:11 +00001262 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001263 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001264 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001265 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001266 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1267 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
drh309b3382007-03-17 17:52:42 +00001268 { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc },
1269 { "max", 0, 1, SQLITE_UTF8, 1, 0 },
danielk1977f4618892004-06-28 13:09:11 +00001270 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1271 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
1272 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
drh6c626082004-11-14 21:56:29 +00001273#ifndef SQLITE_OMIT_UTF16
danielk1977f4618892004-06-28 13:09:11 +00001274 { "substr", 3, 0, SQLITE_UTF16LE, 0, sqlite3utf16Substr },
drh6c626082004-11-14 21:56:29 +00001275#endif
danielk1977f4618892004-06-28 13:09:11 +00001276 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1277 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1278 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1279 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1280 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1281 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1282 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1283 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
drh137c7282007-01-29 17:58:28 +00001284 { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc },
danielk1977f4618892004-06-28 13:09:11 +00001285 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1286 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
drh137c7282007-01-29 17:58:28 +00001287 { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob },
drh94a98362004-09-13 13:13:18 +00001288 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001289 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1290 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
drh309b3382007-03-17 17:52:42 +00001291 { "last_insert_rowid", 0, 0xff, SQLITE_UTF8, 0, last_insert_rowid },
1292 { "changes", 0, 0xff, SQLITE_UTF8, 0, changes },
1293 { "total_changes", 0, 0xff, SQLITE_UTF8, 0, total_changes },
drh26b6d902007-03-17 13:27:54 +00001294 { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc },
drh309b3382007-03-17 17:52:42 +00001295 { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc },
1296 { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc },
1297 { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc },
1298 { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc },
1299 { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc },
1300 { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc },
drh8cff3822007-05-02 02:08:28 +00001301 { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc },
drhd24cc422003-03-27 12:51:24 +00001302#ifdef SQLITE_SOUNDEX
drh309b3382007-03-17 17:52:42 +00001303 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001304#endif
drhfdb83b22006-06-17 14:12:47 +00001305#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh309b3382007-03-17 17:52:42 +00001306 { "load_extension", 1, 0xff, SQLITE_UTF8, 0, loadExt },
1307 { "load_extension", 2, 0xff, SQLITE_UTF8, 0, loadExt },
drhfdb83b22006-06-17 14:12:47 +00001308#endif
drh193a6b42002-07-07 16:52:46 +00001309#ifdef SQLITE_TEST
drh309b3382007-03-17 17:52:42 +00001310 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1311 { "test_destructor", 1, 0xff, SQLITE_UTF8, 0, test_destructor},
1312 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
1313 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
1314 { "test_error", 1, 0, SQLITE_UTF8, 0, test_error},
drh193a6b42002-07-07 16:52:46 +00001315#endif
drh0bce8352002-02-28 00:41:10 +00001316 };
drh57196282004-10-06 15:41:16 +00001317 static const struct {
drh0bce8352002-02-28 00:41:10 +00001318 char *zName;
drh268380c2004-02-25 13:47:31 +00001319 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001320 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001321 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001322 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1323 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001324 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001325 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
drh309b3382007-03-17 17:52:42 +00001326 { "max", 1, 1, 1, minmaxStep, minMaxFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001327 { "sum", 1, 0, 0, sumStep, sumFinalize },
drha97fdd32006-01-12 22:17:50 +00001328 { "total", 1, 0, 0, sumStep, totalFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001329 { "avg", 1, 0, 0, sumStep, avgFinalize },
1330 { "count", 0, 0, 0, countStep, countFinalize },
1331 { "count", 1, 0, 0, countStep, countFinalize },
drh0bce8352002-02-28 00:41:10 +00001332 };
1333 int i;
1334
1335 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001336 void *pArg;
1337 u8 argType = aFuncs[i].argType;
1338 if( argType==0xff ){
1339 pArg = db;
1340 }else{
1341 pArg = (void*)(int)argType;
danielk1977c572ef72004-05-27 09:28:41 +00001342 }
danielk1977771151b2006-01-17 13:21:40 +00001343 sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001344 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001345 if( aFuncs[i].needCollSeq ){
1346 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1347 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1348 if( pFunc && aFuncs[i].needCollSeq ){
1349 pFunc->needCollSeq = 1;
1350 }
1351 }
drh0bce8352002-02-28 00:41:10 +00001352 }
drh1f01ec12005-02-15 21:36:18 +00001353#ifndef SQLITE_OMIT_ALTERTABLE
1354 sqlite3AlterFunctions(db);
1355#endif
drh198bf392006-01-06 21:52:49 +00001356#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001357 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001358#endif
drh0bce8352002-02-28 00:41:10 +00001359 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001360 void *pArg = (void*)(int)aAggs[i].argType;
danielk1977771151b2006-01-17 13:21:40 +00001361 sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001362 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001363 if( aAggs[i].needCollSeq ){
1364 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001365 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001366 if( pFunc && aAggs[i].needCollSeq ){
1367 pFunc->needCollSeq = 1;
1368 }
1369 }
drh268380c2004-02-25 13:47:31 +00001370 }
danielk19774adee202004-05-08 08:23:19 +00001371 sqlite3RegisterDateTimeFunctions(db);
drhb7481e72006-09-16 21:45:14 +00001372 sqlite3_overload_function(db, "MATCH", 2);
danielk1977fd9e1f32005-05-22 10:44:34 +00001373#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001374 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001375#endif
drh55ef4d92005-08-14 01:20:37 +00001376#ifdef SQLITE_CASE_SENSITIVE_LIKE
1377 sqlite3RegisterLikeFunctions(db, 1);
1378#else
1379 sqlite3RegisterLikeFunctions(db, 0);
1380#endif
1381}
1382
1383/*
1384** Set the LIKEOPT flag on the 2-argument function with the given name.
1385*/
drhd64fe2f2005-08-28 17:00:23 +00001386static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001387 FuncDef *pDef;
1388 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1389 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001390 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001391 }
1392}
1393
1394/*
1395** Register the built-in LIKE and GLOB functions. The caseSensitive
1396** parameter determines whether or not the LIKE operator is case
1397** sensitive. GLOB is always case sensitive.
1398*/
1399void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1400 struct compareInfo *pInfo;
1401 if( caseSensitive ){
1402 pInfo = (struct compareInfo*)&likeInfoAlt;
1403 }else{
1404 pInfo = (struct compareInfo*)&likeInfoNorm;
1405 }
danielk1977771151b2006-01-17 13:21:40 +00001406 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1407 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1408 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001409 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001410 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1411 setLikeOptFlag(db, "like",
1412 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001413}
1414
1415/*
1416** pExpr points to an expression which implements a function. If
1417** it is appropriate to apply the LIKE optimization to that function
1418** then set aWc[0] through aWc[2] to the wildcard characters and
1419** return TRUE. If the function is not a LIKE-style function then
1420** return FALSE.
1421*/
drhd64fe2f2005-08-28 17:00:23 +00001422int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001423 FuncDef *pDef;
1424 if( pExpr->op!=TK_FUNCTION ){
1425 return 0;
1426 }
1427 if( pExpr->pList->nExpr!=2 ){
1428 return 0;
1429 }
drh2646da72005-12-09 20:02:05 +00001430 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001431 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001432 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001433 return 0;
1434 }
1435
1436 /* The memcpy() statement assumes that the wildcard characters are
1437 ** the first three statements in the compareInfo structure. The
1438 ** asserts() that follow verify that assumption
1439 */
1440 memcpy(aWc, pDef->pUserData, 3);
1441 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1442 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1443 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001444 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001445 return 1;
drhdc04c582002-02-24 01:55:15 +00001446}