blob: b2e27f62451696d74cb9cfc9c3051315a43f2ab5 [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**
drh85892bd2007-05-10 13:23:22 +000019** $Id: func.c,v 1.154 2007/05/10 13:23:23 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;
drh85892bd2007-05-10 13:23:22 +0000539 int escape = 0;
drhbeb818d2007-05-08 15:34:47 +0000540
541 /* Limit the length of the LIKE or GLOB pattern to avoid problems
542 ** of deep recursion and N*N behavior in patternCompare().
543 */
danielk1977b56fe1f2007-05-09 08:24:44 +0000544 if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){
drhbeb818d2007-05-08 15:34:47 +0000545 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
546 return;
547 }
548
danielk1977b56fe1f2007-05-09 08:24:44 +0000549 zB = sqlite3_value_text(argv[0]);
550 zA = sqlite3_value_text(argv[1]);
danielk19777c6303c2004-11-17 16:41:29 +0000551 if( argc==3 ){
552 /* The escape character string must consist of a single UTF-8 character.
553 ** Otherwise, return an error.
554 */
555 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000556 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000557 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000558 sqlite3_result_error(context,
559 "ESCAPE expression must be a single character", -1);
560 return;
561 }
562 escape = sqlite3ReadUtf8(zEsc);
563 }
danielk19773f6b0872004-06-17 05:36:44 +0000564 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000565 struct compareInfo *pInfo = sqlite3_user_data(context);
566#ifdef SQLITE_TEST
567 sqlite3_like_count++;
568#endif
drhbeb818d2007-05-08 15:34:47 +0000569
danielk1977b56fe1f2007-05-09 08:24:44 +0000570 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000571 }
drh8912d102002-05-26 21:34:58 +0000572}
573
574/*
575** Implementation of the NULLIF(x,y) function. The result is the first
576** argument if the arguments are different. The result is NULL if the
577** arguments are equal to each other.
578*/
drhf9b596e2004-05-26 16:54:42 +0000579static void nullifFunc(
580 sqlite3_context *context,
581 int argc,
582 sqlite3_value **argv
583){
danielk1977dc1bdc42004-06-11 10:51:27 +0000584 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
585 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000586 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000587 }
drh0ac65892002-04-20 14:24:41 +0000588}
589
drh647cb0e2002-11-04 19:32:25 +0000590/*
591** Implementation of the VERSION(*) function. The result is the version
592** of the SQLite library that is running.
593*/
drhf9b596e2004-05-26 16:54:42 +0000594static void versionFunc(
595 sqlite3_context *context,
596 int argc,
597 sqlite3_value **argv
598){
danielk1977d8123362004-06-12 09:25:12 +0000599 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000600}
601
drh137c7282007-01-29 17:58:28 +0000602/* Array for converting from half-bytes (nybbles) into ASCII hex
603** digits. */
604static const char hexdigits[] = {
605 '0', '1', '2', '3', '4', '5', '6', '7',
606 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
607};
danielk1977d641d642004-11-18 15:44:29 +0000608
drh47394702003-08-20 01:03:33 +0000609/*
610** EXPERIMENTAL - This is not an official function. The interface may
611** change. This function may disappear. Do not write code that depends
612** on this function.
613**
614** Implementation of the QUOTE() function. This function takes a single
615** argument. If the argument is numeric, the return value is the same as
616** the argument. If the argument is NULL, the return value is the string
617** "NULL". Otherwise, the argument is enclosed in single quotes with
618** single-quote escapes.
619*/
danielk19770ae8b832004-05-25 12:05:56 +0000620static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000621 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000622 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000623 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000624 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000625 break;
drh47394702003-08-20 01:03:33 +0000626 }
drh9c054832004-05-31 18:51:57 +0000627 case SQLITE_INTEGER:
628 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000629 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000630 break;
631 }
danielk19773f41e972004-06-08 00:39:01 +0000632 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000633 char *zText = 0;
634 int nBlob = sqlite3_value_bytes(argv[0]);
635 char const *zBlob = sqlite3_value_blob(argv[0]);
636
drh023ae032007-05-08 12:12:16 +0000637 if( 2*nBlob+4>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000638 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000639 return;
640 }
danielk19773f41e972004-06-08 00:39:01 +0000641 zText = (char *)sqliteMalloc((2*nBlob)+4);
642 if( !zText ){
643 sqlite3_result_error(context, "out of memory", -1);
644 }else{
645 int i;
646 for(i=0; i<nBlob; i++){
647 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
648 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
649 }
650 zText[(nBlob*2)+2] = '\'';
651 zText[(nBlob*2)+3] = '\0';
652 zText[0] = 'X';
653 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000654 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
danielk19773f41e972004-06-08 00:39:01 +0000655 sqliteFree(zText);
656 }
657 break;
658 }
drh9c054832004-05-31 18:51:57 +0000659 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000660 int i,j;
661 u64 n;
drh2646da72005-12-09 20:02:05 +0000662 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000663 char *z;
664
drh7a521cf2007-04-25 18:23:52 +0000665 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000666 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
667 if( i+n+3>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000668 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000669 return;
670 }
drhf9b596e2004-05-26 16:54:42 +0000671 z = sqliteMalloc( i+n+3 );
672 if( z==0 ) return;
673 z[0] = '\'';
674 for(i=0, j=1; zArg[i]; i++){
675 z[j++] = zArg[i];
676 if( zArg[i]=='\'' ){
677 z[j++] = '\'';
678 }
679 }
680 z[j++] = '\'';
681 z[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000682 sqlite3_result_text(context, z, j, SQLITE_TRANSIENT);
drhf9b596e2004-05-26 16:54:42 +0000683 sqliteFree(z);
684 }
drh47394702003-08-20 01:03:33 +0000685 }
686}
687
drh137c7282007-01-29 17:58:28 +0000688/*
689** The hex() function. Interpret the argument as a blob. Return
690** a hexadecimal rendering as text.
691*/
692static void hexFunc(
693 sqlite3_context *context,
694 int argc,
695 sqlite3_value **argv
696){
697 int i, n;
698 const unsigned char *pBlob;
699 char *zHex, *z;
700 assert( argc==1 );
drh137c7282007-01-29 17:58:28 +0000701 n = sqlite3_value_bytes(argv[0]);
drh023ae032007-05-08 12:12:16 +0000702 if( n*2+1>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000703 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000704 return;
705 }
drh1eb25382007-04-10 13:51:17 +0000706 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000707 z = zHex = sqlite3_malloc(n*2 + 1);
708 if( zHex==0 ) return;
709 for(i=0; i<n; i++, pBlob++){
710 unsigned char c = *pBlob;
711 *(z++) = hexdigits[(c>>4)&0xf];
712 *(z++) = hexdigits[c&0xf];
713 }
714 *z = 0;
715 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
716}
717
drh26b6d902007-03-17 13:27:54 +0000718/*
drh8cff3822007-05-02 02:08:28 +0000719** The zeroblob(N) function returns a zero-filled blob of size N bytes.
720*/
721static void zeroblobFunc(
722 sqlite3_context *context,
723 int argc,
724 sqlite3_value **argv
725){
726 int n;
727 assert( argc==1 );
728 n = sqlite3_value_int(argv[0]);
729 sqlite3_result_zeroblob(context, n);
730}
731
732/*
drh26b6d902007-03-17 13:27:54 +0000733** The replace() function. Three arguments are all strings: call
734** them A, B, and C. The result is also a string which is derived
735** from A by replacing every occurance of B with C. The match
736** must be exact. Collating sequences are not used.
737*/
738static void replaceFunc(
739 sqlite3_context *context,
740 int argc,
741 sqlite3_value **argv
742){
743 const unsigned char *zStr; /* The input string A */
744 const unsigned char *zPattern; /* The pattern string B */
745 const unsigned char *zRep; /* The replacement string C */
746 unsigned char *zOut; /* The output */
747 int nStr; /* Size of zStr */
748 int nPattern; /* Size of zPattern */
749 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000750 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000751 int loopLimit; /* Last zStr[] that might match zPattern[] */
752 int i, j; /* Loop counters */
753
754 assert( argc==3 );
drh9310ef22007-04-27 17:16:20 +0000755 nStr = sqlite3_value_bytes(argv[0]);
drh26b6d902007-03-17 13:27:54 +0000756 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000757 if( zStr==0 ) return;
drh9310ef22007-04-27 17:16:20 +0000758 nPattern = sqlite3_value_bytes(argv[1]);
drh26b6d902007-03-17 13:27:54 +0000759 zPattern = sqlite3_value_text(argv[1]);
drh709cff32007-04-27 01:18:02 +0000760 if( zPattern==0 || zPattern[0]==0 ) return;
drh9310ef22007-04-27 17:16:20 +0000761 nRep = sqlite3_value_bytes(argv[2]);
drh26b6d902007-03-17 13:27:54 +0000762 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000763 if( zRep==0 ) return;
drh2e6400b2007-05-08 15:46:18 +0000764 nOut = nStr + 1;
765 assert( nOut<SQLITE_MAX_LENGTH );
766 zOut = sqlite3_malloc((int)nOut);
767 if( zOut==0 ){
768 return;
drh26b6d902007-03-17 13:27:54 +0000769 }
drh26b6d902007-03-17 13:27:54 +0000770 loopLimit = nStr - nPattern;
771 for(i=j=0; i<=loopLimit; i++){
772 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
773 zOut[j++] = zStr[i];
774 }else{
drh2e6400b2007-05-08 15:46:18 +0000775 nOut += nRep - nPattern;
776 if( nOut>=SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000777 sqlite3_result_error_toobig(context);
danielk197717374e82007-05-08 14:39:04 +0000778 sqlite3_free(zOut);
779 return;
780 }
drh2e6400b2007-05-08 15:46:18 +0000781 zOut = sqlite3_realloc(zOut, (int)nOut);
782 if( zOut==0 ){
783 return;
784 }
drh26b6d902007-03-17 13:27:54 +0000785 memcpy(&zOut[j], zRep, nRep);
786 j += nRep;
787 i += nPattern-1;
788 }
789 }
drh2e6400b2007-05-08 15:46:18 +0000790 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000791 memcpy(&zOut[j], &zStr[i], nStr-i);
792 j += nStr - i;
793 assert( j<=nOut );
794 zOut[j] = 0;
795 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
796}
797
drh309b3382007-03-17 17:52:42 +0000798/*
799** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
800** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
801*/
802static void trimFunc(
803 sqlite3_context *context,
804 int argc,
805 sqlite3_value **argv
806){
807 const unsigned char *zIn; /* Input string */
808 const unsigned char *zCharSet; /* Set of characters to trim */
809 int nIn; /* Number of bytes in input */
drhd1e3a612007-04-27 21:59:52 +0000810 int flags; /* 1: trimleft 2: trimright 3: trim */
811 int i; /* Loop counter */
812 unsigned char *aLen; /* Length of each character in zCharSet */
813 const unsigned char **azChar; /* Individual characters in zCharSet */
814 int nChar; /* Number of characters in zCharSet */
815
drh309b3382007-03-17 17:52:42 +0000816 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
817 return;
818 }
drh9310ef22007-04-27 17:16:20 +0000819 nIn = sqlite3_value_bytes(argv[0]);
drh309b3382007-03-17 17:52:42 +0000820 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000821 if( zIn==0 ) return;
drh309b3382007-03-17 17:52:42 +0000822 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000823 static const unsigned char lenOne[] = { 1 };
drh8cff3822007-05-02 02:08:28 +0000824 static const unsigned char *azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000825 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000826 aLen = (u8*)lenOne;
827 azChar = azOne;
drhd1e3a612007-04-27 21:59:52 +0000828 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000829 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000830 return;
drhd1e3a612007-04-27 21:59:52 +0000831 }else{
832 const unsigned char *z;
833 for(z=zCharSet, nChar=0; *z; nChar++){
834 sqliteNextChar(z);
835 }
836 if( nChar>0 ){
837 azChar = sqlite3_malloc( nChar*(sizeof(char*)+1) );
838 if( azChar==0 ){
839 return;
840 }
841 aLen = (unsigned char*)&azChar[nChar];
842 for(z=zCharSet, nChar=0; *z; nChar++){
843 azChar[nChar] = z;
844 sqliteNextChar(z);
845 aLen[nChar] = z - azChar[nChar];
846 }
847 }
drh309b3382007-03-17 17:52:42 +0000848 }
drhd1e3a612007-04-27 21:59:52 +0000849 if( nChar>0 ){
drh309b3382007-03-17 17:52:42 +0000850 flags = (int)sqlite3_user_data(context);
851 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000852 while( nIn>0 ){
853 int len;
854 for(i=0; i<nChar; i++){
855 len = aLen[i];
856 if( memcmp(zIn, azChar[i], len)==0 ) break;
857 }
858 if( i>=nChar ) break;
859 zIn += len;
860 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000861 }
862 }
863 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000864 while( nIn>0 ){
865 int len;
866 for(i=0; i<nChar; i++){
867 len = aLen[i];
868 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
869 }
870 if( i>=nChar ) break;
871 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000872 }
873 }
drhd1e3a612007-04-27 21:59:52 +0000874 if( zCharSet ){
875 sqlite3_free(azChar);
876 }
drh309b3382007-03-17 17:52:42 +0000877 }
878 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
879}
drh26b6d902007-03-17 13:27:54 +0000880
drhd24cc422003-03-27 12:51:24 +0000881#ifdef SQLITE_SOUNDEX
882/*
883** Compute the soundex encoding of a word.
884*/
drh137c7282007-01-29 17:58:28 +0000885static void soundexFunc(
886 sqlite3_context *context,
887 int argc,
888 sqlite3_value **argv
889){
drhd24cc422003-03-27 12:51:24 +0000890 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000891 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000892 int i, j;
893 static const unsigned char iCode[] = {
894 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
895 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
896 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
897 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
898 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
899 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
900 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
901 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
902 };
903 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000904 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000905 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000906 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
907 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000908 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000909 zResult[0] = toupper(zIn[i]);
910 for(j=1; j<4 && zIn[i]; i++){
911 int code = iCode[zIn[i]&0x7f];
912 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000913 if( code!=prevcode ){
914 prevcode = code;
915 zResult[j++] = code + '0';
916 }
917 }else{
918 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000919 }
920 }
921 while( j<4 ){
922 zResult[j++] = '0';
923 }
924 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000925 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000926 }else{
danielk1977d8123362004-06-12 09:25:12 +0000927 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000928 }
929}
930#endif
931
drhfdb83b22006-06-17 14:12:47 +0000932#ifndef SQLITE_OMIT_LOAD_EXTENSION
933/*
934** A function that loads a shared-library extension then returns NULL.
935*/
936static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +0000937 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000938 const char *zProc;
drhfdb83b22006-06-17 14:12:47 +0000939 sqlite3 *db = sqlite3_user_data(context);
940 char *zErrMsg = 0;
941
942 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +0000943 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +0000944 }else{
945 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +0000946 }
drh7a521cf2007-04-25 18:23:52 +0000947 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +0000948 sqlite3_result_error(context, zErrMsg, -1);
949 sqlite3_free(zErrMsg);
950 }
951}
952#endif
953
drh193a6b42002-07-07 16:52:46 +0000954#ifdef SQLITE_TEST
955/*
956** This function generates a string of random characters. Used for
957** generating test data.
958*/
danielk19770ae8b832004-05-25 12:05:56 +0000959static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +0000960 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +0000961 "abcdefghijklmnopqrstuvwxyz"
962 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
963 "0123456789"
964 ".-!,:*^+=_|?/<> ";
965 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +0000966 unsigned char zBuf[1000];
drh193a6b42002-07-07 16:52:46 +0000967 if( argc>=1 ){
drhf9b596e2004-05-26 16:54:42 +0000968 iMin = sqlite3_value_int(argv[0]);
drh193a6b42002-07-07 16:52:46 +0000969 if( iMin<0 ) iMin = 0;
970 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
971 }else{
972 iMin = 1;
973 }
974 if( argc>=2 ){
drhf9b596e2004-05-26 16:54:42 +0000975 iMax = sqlite3_value_int(argv[1]);
drh193a6b42002-07-07 16:52:46 +0000976 if( iMax<iMin ) iMax = iMin;
drh1dba7272004-01-16 13:58:18 +0000977 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +0000978 }else{
979 iMax = 50;
980 }
981 n = iMin;
982 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +0000983 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +0000984 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +0000985 n += r%(iMax + 1 - iMin);
986 }
drh1dba7272004-01-16 13:58:18 +0000987 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +0000988 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +0000989 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +0000990 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +0000991 }
992 zBuf[n] = 0;
drh2646da72005-12-09 20:02:05 +0000993 sqlite3_result_text(context, (char*)zBuf, n, SQLITE_TRANSIENT);
danielk1977d8123362004-06-12 09:25:12 +0000994}
drh0e3d7472004-06-19 17:33:07 +0000995#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +0000996
drh0e3d7472004-06-19 17:33:07 +0000997#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +0000998/*
999** The following two SQL functions are used to test returning a text
1000** result with a destructor. Function 'test_destructor' takes one argument
1001** and returns the same argument interpreted as TEXT. A destructor is
1002** passed with the sqlite3_result_text() call.
1003**
1004** SQL function 'test_destructor_count' returns the number of outstanding
1005** allocations made by 'test_destructor';
1006**
1007** WARNING: Not threadsafe.
1008*/
1009static int test_destructor_count_var = 0;
1010static void destructor(void *p){
1011 char *zVal = (char *)p;
1012 assert(zVal);
1013 zVal--;
1014 sqliteFree(zVal);
1015 test_destructor_count_var--;
1016}
1017static void test_destructor(
1018 sqlite3_context *pCtx,
1019 int nArg,
1020 sqlite3_value **argv
1021){
1022 char *zVal;
danielk1977f4618892004-06-28 13:09:11 +00001023 int len;
drh9bb575f2004-09-06 17:24:11 +00001024 sqlite3 *db = sqlite3_user_data(pCtx);
danielk1977f4618892004-06-28 13:09:11 +00001025
danielk1977d8123362004-06-12 09:25:12 +00001026 test_destructor_count_var++;
1027 assert( nArg==1 );
1028 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
danielk197714db2662006-01-09 16:12:04 +00001029 len = sqlite3ValueBytes(argv[0], ENC(db));
danielk1977f4618892004-06-28 13:09:11 +00001030 zVal = sqliteMalloc(len+3);
1031 zVal[len] = 0;
1032 zVal[len-1] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001033 assert( zVal );
1034 zVal++;
danielk197714db2662006-01-09 16:12:04 +00001035 memcpy(zVal, sqlite3ValueText(argv[0], ENC(db)), len);
1036 if( ENC(db)==SQLITE_UTF8 ){
danielk1977f4618892004-06-28 13:09:11 +00001037 sqlite3_result_text(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001038#ifndef SQLITE_OMIT_UTF16
danielk197714db2662006-01-09 16:12:04 +00001039 }else if( ENC(db)==SQLITE_UTF16LE ){
danielk1977f4618892004-06-28 13:09:11 +00001040 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
1041 }else{
1042 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001043#endif /* SQLITE_OMIT_UTF16 */
danielk1977f4618892004-06-28 13:09:11 +00001044 }
danielk1977d8123362004-06-12 09:25:12 +00001045}
1046static void test_destructor_count(
1047 sqlite3_context *pCtx,
1048 int nArg,
1049 sqlite3_value **argv
1050){
1051 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +00001052}
drh0e3d7472004-06-19 17:33:07 +00001053#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +00001054
drh0e3d7472004-06-19 17:33:07 +00001055#ifdef SQLITE_TEST
1056/*
1057** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
1058** interface.
1059**
1060** The test_auxdata() SQL function attempts to register each of its arguments
1061** as auxiliary data. If there are no prior registrations of aux data for
1062** that argument (meaning the argument is not a constant or this is its first
1063** call) then the result for that argument is 0. If there is a prior
1064** registration, the result for that argument is 1. The overall result
1065** is the individual argument results separated by spaces.
1066*/
danielk19773f6b0872004-06-17 05:36:44 +00001067static void free_test_auxdata(void *p) {sqliteFree(p);}
1068static void test_auxdata(
1069 sqlite3_context *pCtx,
1070 int nArg,
1071 sqlite3_value **argv
1072){
1073 int i;
1074 char *zRet = sqliteMalloc(nArg*2);
1075 if( !zRet ) return;
1076 for(i=0; i<nArg; i++){
drh2646da72005-12-09 20:02:05 +00001077 char const *z = (char*)sqlite3_value_text(argv[i]);
danielk19773f6b0872004-06-17 05:36:44 +00001078 if( z ){
1079 char *zAux = sqlite3_get_auxdata(pCtx, i);
1080 if( zAux ){
1081 zRet[i*2] = '1';
1082 if( strcmp(zAux, z) ){
1083 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
1084 return;
1085 }
1086 }else{
1087 zRet[i*2] = '0';
1088 zAux = sqliteStrDup(z);
1089 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
1090 }
1091 zRet[i*2+1] = ' ';
1092 }
1093 }
1094 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
1095}
drh0e3d7472004-06-19 17:33:07 +00001096#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +00001097
danielk197701427a62005-01-11 13:02:33 +00001098#ifdef SQLITE_TEST
1099/*
1100** A function to test error reporting from user functions. This function
1101** returns a copy of it's first argument as an error.
1102*/
1103static void test_error(
1104 sqlite3_context *pCtx,
1105 int nArg,
1106 sqlite3_value **argv
1107){
drh2646da72005-12-09 20:02:05 +00001108 sqlite3_result_error(pCtx, (char*)sqlite3_value_text(argv[0]), 0);
danielk197701427a62005-01-11 13:02:33 +00001109}
1110#endif /* SQLITE_TEST */
1111
drh0ac65892002-04-20 14:24:41 +00001112/*
drhd3a149e2002-02-24 17:12:53 +00001113** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001114** sum() or avg() aggregate computation.
1115*/
1116typedef struct SumCtx SumCtx;
1117struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001118 double rSum; /* Floating point sum */
1119 i64 iSum; /* Integer sum */
1120 i64 cnt; /* Number of elements summed */
1121 u8 overflow; /* True if integer overflow seen */
1122 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001123};
1124
1125/*
drha97fdd32006-01-12 22:17:50 +00001126** Routines used to compute the sum, average, and total.
1127**
1128** The SUM() function follows the (broken) SQL standard which means
1129** that it returns NULL if it sums over no inputs. TOTAL returns
1130** 0.0 in that case. In addition, TOTAL always returns a float where
1131** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001132** value. TOTAL never fails, but SUM might through an exception if
1133** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001134*/
danielk19770ae8b832004-05-25 12:05:56 +00001135static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001136 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001137 int type;
drh3f219f42005-09-08 19:45:57 +00001138 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +00001139 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001140 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001141 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001142 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001143 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001144 i64 v = sqlite3_value_int64(argv[0]);
1145 p->rSum += v;
1146 if( (p->approx|p->overflow)==0 ){
1147 i64 iNewSum = p->iSum + v;
1148 int s1 = p->iSum >> (sizeof(i64)*8-1);
1149 int s2 = v >> (sizeof(i64)*8-1);
1150 int s3 = iNewSum >> (sizeof(i64)*8-1);
1151 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
1152 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001153 }
1154 }else{
drh8c08e862006-02-11 17:34:00 +00001155 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001156 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001157 }
drh739105c2002-05-29 23:22:23 +00001158 }
drhdd5baa92002-02-27 19:50:59 +00001159}
danielk19770ae8b832004-05-25 12:05:56 +00001160static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001161 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001162 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001163 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001164 if( p->overflow ){
1165 sqlite3_result_error(context,"integer overflow",-1);
1166 }else if( p->approx ){
1167 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001168 }else{
drh8c08e862006-02-11 17:34:00 +00001169 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001170 }
drh3d1d95e2005-09-08 10:37:01 +00001171 }
drhdd5baa92002-02-27 19:50:59 +00001172}
danielk19770ae8b832004-05-25 12:05:56 +00001173static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001174 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001175 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001176 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001177 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001178 }
1179}
drha97fdd32006-01-12 22:17:50 +00001180static void totalFinalize(sqlite3_context *context){
1181 SumCtx *p;
1182 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001183 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001184}
drhdd5baa92002-02-27 19:50:59 +00001185
1186/*
drh0bce8352002-02-28 00:41:10 +00001187** The following structure keeps track of state information for the
1188** count() aggregate function.
1189*/
1190typedef struct CountCtx CountCtx;
1191struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001192 i64 n;
drh0bce8352002-02-28 00:41:10 +00001193};
drhdd5baa92002-02-27 19:50:59 +00001194
drh0bce8352002-02-28 00:41:10 +00001195/*
1196** Routines to implement the count() aggregate function.
1197*/
danielk19770ae8b832004-05-25 12:05:56 +00001198static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001199 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001200 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001201 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001202 p->n++;
1203 }
1204}
danielk19770ae8b832004-05-25 12:05:56 +00001205static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001206 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001207 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001208 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001209}
1210
1211/*
drh0bce8352002-02-28 00:41:10 +00001212** Routines to implement min() and max() aggregate functions.
1213*/
danielk19770ae8b832004-05-25 12:05:56 +00001214static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +00001215 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001216 Mem *pBest;
1217
1218 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1219 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001220 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001221
danielk197788208052004-05-25 01:13:20 +00001222 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001223 int max;
1224 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001225 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001226 /* This step function is used for both the min() and max() aggregates,
1227 ** the only difference between the two being that the sense of the
1228 ** comparison is inverted. For the max() aggregate, the
1229 ** sqlite3_user_data() function returns (void *)-1. For min() it
1230 ** returns (void *)db, where db is the sqlite3* database pointer.
1231 ** Therefore the next statement sets variable 'max' to 1 for the max()
1232 ** aggregate, or 0 for min().
1233 */
drh309b3382007-03-17 17:52:42 +00001234 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001235 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001236 if( (max && cmp<0) || (!max && cmp>0) ){
danielk19777e18c252004-05-25 11:47:24 +00001237 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001238 }
drh268380c2004-02-25 13:47:31 +00001239 }else{
danielk19777e18c252004-05-25 11:47:24 +00001240 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001241 }
1242}
danielk19770ae8b832004-05-25 12:05:56 +00001243static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001244 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001245 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1246 if( pRes ){
1247 if( pRes->flags ){
1248 sqlite3_result_value(context, pRes);
1249 }
1250 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001251 }
1252}
drhdd5baa92002-02-27 19:50:59 +00001253
drh4e5ffc52004-08-31 00:52:37 +00001254
drhd3a149e2002-02-24 17:12:53 +00001255/*
drha2ed5602002-02-26 23:55:31 +00001256** This function registered all of the above C functions as SQL
1257** functions. This should be the only routine in this file with
1258** external linkage.
drhdc04c582002-02-24 01:55:15 +00001259*/
drh9bb575f2004-09-06 17:24:11 +00001260void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001261 static const struct {
drh0bce8352002-02-28 00:41:10 +00001262 char *zName;
drh268380c2004-02-25 13:47:31 +00001263 signed char nArg;
drh309b3382007-03-17 17:52:42 +00001264 u8 argType; /* ff: db 1: 0, 2: 1, 3: 2,... N: N-1. */
danielk1977f4618892004-06-28 13:09:11 +00001265 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001266 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001267 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001268 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001269 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1270 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
drh309b3382007-03-17 17:52:42 +00001271 { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc },
1272 { "max", 0, 1, SQLITE_UTF8, 1, 0 },
danielk1977f4618892004-06-28 13:09:11 +00001273 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1274 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
1275 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
drh6c626082004-11-14 21:56:29 +00001276#ifndef SQLITE_OMIT_UTF16
drhee858132007-05-08 20:37:38 +00001277 { "substr", 3, 0, SQLITE_UTF16LE, 0, sqlite3Utf16Substr },
drh6c626082004-11-14 21:56:29 +00001278#endif
danielk1977f4618892004-06-28 13:09:11 +00001279 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1280 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1281 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1282 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1283 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1284 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1285 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1286 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
drh137c7282007-01-29 17:58:28 +00001287 { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc },
danielk1977f4618892004-06-28 13:09:11 +00001288 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1289 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
drh137c7282007-01-29 17:58:28 +00001290 { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob },
drh94a98362004-09-13 13:13:18 +00001291 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001292 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1293 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
drh309b3382007-03-17 17:52:42 +00001294 { "last_insert_rowid", 0, 0xff, SQLITE_UTF8, 0, last_insert_rowid },
1295 { "changes", 0, 0xff, SQLITE_UTF8, 0, changes },
1296 { "total_changes", 0, 0xff, SQLITE_UTF8, 0, total_changes },
drh26b6d902007-03-17 13:27:54 +00001297 { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc },
drh309b3382007-03-17 17:52:42 +00001298 { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc },
1299 { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc },
1300 { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc },
1301 { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc },
1302 { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc },
1303 { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc },
drh8cff3822007-05-02 02:08:28 +00001304 { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc },
drhd24cc422003-03-27 12:51:24 +00001305#ifdef SQLITE_SOUNDEX
drh309b3382007-03-17 17:52:42 +00001306 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001307#endif
drhfdb83b22006-06-17 14:12:47 +00001308#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh309b3382007-03-17 17:52:42 +00001309 { "load_extension", 1, 0xff, SQLITE_UTF8, 0, loadExt },
1310 { "load_extension", 2, 0xff, SQLITE_UTF8, 0, loadExt },
drhfdb83b22006-06-17 14:12:47 +00001311#endif
drh193a6b42002-07-07 16:52:46 +00001312#ifdef SQLITE_TEST
drh309b3382007-03-17 17:52:42 +00001313 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1314 { "test_destructor", 1, 0xff, SQLITE_UTF8, 0, test_destructor},
1315 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
1316 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
1317 { "test_error", 1, 0, SQLITE_UTF8, 0, test_error},
drh193a6b42002-07-07 16:52:46 +00001318#endif
drh0bce8352002-02-28 00:41:10 +00001319 };
drh57196282004-10-06 15:41:16 +00001320 static const struct {
drh0bce8352002-02-28 00:41:10 +00001321 char *zName;
drh268380c2004-02-25 13:47:31 +00001322 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001323 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001324 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001325 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1326 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001327 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001328 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
drh309b3382007-03-17 17:52:42 +00001329 { "max", 1, 1, 1, minmaxStep, minMaxFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001330 { "sum", 1, 0, 0, sumStep, sumFinalize },
drha97fdd32006-01-12 22:17:50 +00001331 { "total", 1, 0, 0, sumStep, totalFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001332 { "avg", 1, 0, 0, sumStep, avgFinalize },
1333 { "count", 0, 0, 0, countStep, countFinalize },
1334 { "count", 1, 0, 0, countStep, countFinalize },
drh0bce8352002-02-28 00:41:10 +00001335 };
1336 int i;
1337
1338 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001339 void *pArg;
1340 u8 argType = aFuncs[i].argType;
1341 if( argType==0xff ){
1342 pArg = db;
1343 }else{
1344 pArg = (void*)(int)argType;
danielk1977c572ef72004-05-27 09:28:41 +00001345 }
danielk1977771151b2006-01-17 13:21:40 +00001346 sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001347 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001348 if( aFuncs[i].needCollSeq ){
1349 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1350 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1351 if( pFunc && aFuncs[i].needCollSeq ){
1352 pFunc->needCollSeq = 1;
1353 }
1354 }
drh0bce8352002-02-28 00:41:10 +00001355 }
drh1f01ec12005-02-15 21:36:18 +00001356#ifndef SQLITE_OMIT_ALTERTABLE
1357 sqlite3AlterFunctions(db);
1358#endif
drh198bf392006-01-06 21:52:49 +00001359#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001360 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001361#endif
drh0bce8352002-02-28 00:41:10 +00001362 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001363 void *pArg = (void*)(int)aAggs[i].argType;
danielk1977771151b2006-01-17 13:21:40 +00001364 sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001365 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001366 if( aAggs[i].needCollSeq ){
1367 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001368 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001369 if( pFunc && aAggs[i].needCollSeq ){
1370 pFunc->needCollSeq = 1;
1371 }
1372 }
drh268380c2004-02-25 13:47:31 +00001373 }
danielk19774adee202004-05-08 08:23:19 +00001374 sqlite3RegisterDateTimeFunctions(db);
drhb7481e72006-09-16 21:45:14 +00001375 sqlite3_overload_function(db, "MATCH", 2);
danielk1977fd9e1f32005-05-22 10:44:34 +00001376#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001377 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001378#endif
drh55ef4d92005-08-14 01:20:37 +00001379#ifdef SQLITE_CASE_SENSITIVE_LIKE
1380 sqlite3RegisterLikeFunctions(db, 1);
1381#else
1382 sqlite3RegisterLikeFunctions(db, 0);
1383#endif
1384}
1385
1386/*
1387** Set the LIKEOPT flag on the 2-argument function with the given name.
1388*/
drhd64fe2f2005-08-28 17:00:23 +00001389static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001390 FuncDef *pDef;
1391 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1392 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001393 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001394 }
1395}
1396
1397/*
1398** Register the built-in LIKE and GLOB functions. The caseSensitive
1399** parameter determines whether or not the LIKE operator is case
1400** sensitive. GLOB is always case sensitive.
1401*/
1402void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1403 struct compareInfo *pInfo;
1404 if( caseSensitive ){
1405 pInfo = (struct compareInfo*)&likeInfoAlt;
1406 }else{
1407 pInfo = (struct compareInfo*)&likeInfoNorm;
1408 }
danielk1977771151b2006-01-17 13:21:40 +00001409 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1410 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1411 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001412 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001413 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1414 setLikeOptFlag(db, "like",
1415 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001416}
1417
1418/*
1419** pExpr points to an expression which implements a function. If
1420** it is appropriate to apply the LIKE optimization to that function
1421** then set aWc[0] through aWc[2] to the wildcard characters and
1422** return TRUE. If the function is not a LIKE-style function then
1423** return FALSE.
1424*/
drhd64fe2f2005-08-28 17:00:23 +00001425int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001426 FuncDef *pDef;
1427 if( pExpr->op!=TK_FUNCTION ){
1428 return 0;
1429 }
1430 if( pExpr->pList->nExpr!=2 ){
1431 return 0;
1432 }
drh2646da72005-12-09 20:02:05 +00001433 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001434 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001435 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001436 return 0;
1437 }
1438
1439 /* The memcpy() statement assumes that the wildcard characters are
1440 ** the first three statements in the compareInfo structure. The
1441 ** asserts() that follow verify that assumption
1442 */
1443 memcpy(aWc, pDef->pUserData, 3);
1444 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1445 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1446 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001447 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001448 return 1;
drhdc04c582002-02-24 01:55:15 +00001449}