blob: e0b85cad648786f44d2f12bd929ef3ec42dc15d8 [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**
danielk1977343e9262004-11-19 05:14:54 +000019** $Id: func.c,v 1.91 2004/11/19 05:14:55 danielk1977 Exp $
drhdc04c582002-02-24 01:55:15 +000020*/
21#include <ctype.h>
drhd3a149e2002-02-24 17:12:53 +000022#include <math.h>
23#include <stdlib.h>
drh0bce8352002-02-28 00:41:10 +000024#include <assert.h>
25#include "sqliteInt.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
danielk1977dc1bdc42004-06-11 10:51:27 +000029static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
30 return context->pColl;
31}
32
drh0bce8352002-02-28 00:41:10 +000033/*
34** Implementation of the non-aggregate min() and max() functions
35*/
drhf9b596e2004-05-26 16:54:42 +000036static void minmaxFunc(
37 sqlite3_context *context,
38 int argc,
39 sqlite3_value **argv
40){
drh0bce8352002-02-28 00:41:10 +000041 int i;
drh268380c2004-02-25 13:47:31 +000042 int mask; /* 0 for min() or 0xffffffff for max() */
drhf9b596e2004-05-26 16:54:42 +000043 int iBest;
danielk1977dc1bdc42004-06-11 10:51:27 +000044 CollSeq *pColl;
drh0bce8352002-02-28 00:41:10 +000045
drh89425d52002-02-28 03:04:48 +000046 if( argc==0 ) return;
drhc44af712004-09-02 15:53:56 +000047 mask = sqlite3_user_data(context)==0 ? 0 : -1;
danielk1977dc1bdc42004-06-11 10:51:27 +000048 pColl = sqlite3GetFuncCollSeq(context);
49 assert( pColl );
danielk1977c572ef72004-05-27 09:28:41 +000050 assert( mask==-1 || mask==0 );
drhf9b596e2004-05-26 16:54:42 +000051 iBest = 0;
drh9c054832004-05-31 18:51:57 +000052 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhf9b596e2004-05-26 16:54:42 +000053 for(i=1; i<argc; i++){
drh9c054832004-05-31 18:51:57 +000054 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
danielk1977dc1bdc42004-06-11 10:51:27 +000055 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
drhf9b596e2004-05-26 16:54:42 +000056 iBest = i;
drh0bce8352002-02-28 00:41:10 +000057 }
58 }
drhf4479502004-05-27 03:12:53 +000059 sqlite3_result_value(context, argv[iBest]);
drh0bce8352002-02-28 00:41:10 +000060}
drh0bce8352002-02-28 00:41:10 +000061
drh268380c2004-02-25 13:47:31 +000062/*
63** Return the type of the argument.
64*/
drhf9b596e2004-05-26 16:54:42 +000065static void typeofFunc(
66 sqlite3_context *context,
67 int argc,
68 sqlite3_value **argv
69){
danielk197735bb9d02004-05-24 12:55:54 +000070 const char *z = 0;
danielk197735bb9d02004-05-24 12:55:54 +000071 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000072 case SQLITE_NULL: z = "null"; break;
73 case SQLITE_INTEGER: z = "integer"; break;
74 case SQLITE_TEXT: z = "text"; break;
75 case SQLITE_FLOAT: z = "real"; break;
76 case SQLITE_BLOB: z = "blob"; break;
danielk197735bb9d02004-05-24 12:55:54 +000077 }
danielk1977d8123362004-06-12 09:25:12 +000078 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000079}
80
81/*
82** Implementation of the length() function
83*/
drhf9b596e2004-05-26 16:54:42 +000084static void lengthFunc(
85 sqlite3_context *context,
86 int argc,
87 sqlite3_value **argv
88){
drh0bce8352002-02-28 00:41:10 +000089 int len;
90
91 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +000092 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000093 case SQLITE_BLOB:
94 case SQLITE_INTEGER:
95 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +000096 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +000097 break;
98 }
drh9c054832004-05-31 18:51:57 +000099 case SQLITE_TEXT: {
drh4f26d6c2004-05-26 23:25:30 +0000100 const char *z = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000101 for(len=0; *z; z++){ if( (0xc0&*z)!=0x80 ) len++; }
drhf4479502004-05-27 03:12:53 +0000102 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000103 break;
104 }
105 default: {
106 sqlite3_result_null(context);
107 break;
108 }
109 }
drh0bce8352002-02-28 00:41:10 +0000110}
111
112/*
113** Implementation of the abs() function
114*/
danielk19770ae8b832004-05-25 12:05:56 +0000115static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000116 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +0000117 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000118 case SQLITE_INTEGER: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000119 i64 iVal = sqlite3_value_int64(argv[0]);
120 if( iVal<0 ) iVal = iVal * -1;
121 sqlite3_result_int64(context, iVal);
drhf9b596e2004-05-26 16:54:42 +0000122 break;
123 }
drh9c054832004-05-31 18:51:57 +0000124 case SQLITE_NULL: {
drhf9b596e2004-05-26 16:54:42 +0000125 sqlite3_result_null(context);
126 break;
127 }
128 default: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000129 double rVal = sqlite3_value_double(argv[0]);
130 if( rVal<0 ) rVal = rVal * -1.0;
131 sqlite3_result_double(context, rVal);
drhf9b596e2004-05-26 16:54:42 +0000132 break;
133 }
134 }
drh0bce8352002-02-28 00:41:10 +0000135}
136
137/*
138** Implementation of the substr() function
139*/
drhf9b596e2004-05-26 16:54:42 +0000140static void substrFunc(
141 sqlite3_context *context,
142 int argc,
143 sqlite3_value **argv
144){
drh0bce8352002-02-28 00:41:10 +0000145 const char *z;
drh0bce8352002-02-28 00:41:10 +0000146 const char *z2;
147 int i;
drh0bce8352002-02-28 00:41:10 +0000148 int p1, p2, len;
drhf9b596e2004-05-26 16:54:42 +0000149
drh0bce8352002-02-28 00:41:10 +0000150 assert( argc==3 );
drh4f26d6c2004-05-26 23:25:30 +0000151 z = sqlite3_value_text(argv[0]);
drh0bce8352002-02-28 00:41:10 +0000152 if( z==0 ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000153 p1 = sqlite3_value_int(argv[1]);
154 p2 = sqlite3_value_int(argv[2]);
drh47c8a672002-02-28 04:00:12 +0000155 for(len=0, z2=z; *z2; z2++){ if( (0xc0&*z2)!=0x80 ) len++; }
drh0bce8352002-02-28 00:41:10 +0000156 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000157 p1 += len;
drh653bc752002-02-28 03:31:10 +0000158 if( p1<0 ){
159 p2 += p1;
160 p1 = 0;
161 }
drh0bce8352002-02-28 00:41:10 +0000162 }else if( p1>0 ){
163 p1--;
164 }
165 if( p1+p2>len ){
166 p2 = len-p1;
167 }
drh77396302004-01-02 13:17:48 +0000168 for(i=0; i<p1 && z[i]; i++){
drh47c8a672002-02-28 04:00:12 +0000169 if( (z[i]&0xc0)==0x80 ) p1++;
drh0bce8352002-02-28 00:41:10 +0000170 }
drh47c8a672002-02-28 04:00:12 +0000171 while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p1++; }
drh77396302004-01-02 13:17:48 +0000172 for(; i<p1+p2 && z[i]; i++){
drh47c8a672002-02-28 04:00:12 +0000173 if( (z[i]&0xc0)==0x80 ) p2++;
drh0bce8352002-02-28 00:41:10 +0000174 }
drh47c8a672002-02-28 04:00:12 +0000175 while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p2++; }
drh653bc752002-02-28 03:31:10 +0000176 if( p2<0 ) p2 = 0;
danielk1977d8123362004-06-12 09:25:12 +0000177 sqlite3_result_text(context, &z[p1], p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000178}
179
180/*
181** Implementation of the round() function
182*/
danielk19770ae8b832004-05-25 12:05:56 +0000183static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000184 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000185 double r;
186 char zBuf[100];
187 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000188 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000189 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000190 n = sqlite3_value_int(argv[1]);
191 if( n>30 ) n = 30;
192 if( n<0 ) n = 0;
193 }
drh9c054832004-05-31 18:51:57 +0000194 if( SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh4f26d6c2004-05-26 23:25:30 +0000195 r = sqlite3_value_double(argv[0]);
drh0bce8352002-02-28 00:41:10 +0000196 sprintf(zBuf,"%.*f",n,r);
danielk1977d8123362004-06-12 09:25:12 +0000197 sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000198}
drhdc04c582002-02-24 01:55:15 +0000199
200/*
201** Implementation of the upper() and lower() SQL functions.
202*/
danielk19770ae8b832004-05-25 12:05:56 +0000203static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh8cd9db02004-07-18 23:06:53 +0000204 unsigned char *z;
drhdc04c582002-02-24 01:55:15 +0000205 int i;
drh9c054832004-05-31 18:51:57 +0000206 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
danielk1977c572ef72004-05-27 09:28:41 +0000207 z = sqliteMalloc(sqlite3_value_bytes(argv[0])+1);
drhdc04c582002-02-24 01:55:15 +0000208 if( z==0 ) return;
drh4f26d6c2004-05-26 23:25:30 +0000209 strcpy(z, sqlite3_value_text(argv[0]));
drhdc04c582002-02-24 01:55:15 +0000210 for(i=0; z[i]; i++){
drh4c755c02004-08-08 20:22:17 +0000211 z[i] = toupper(z[i]);
drhdc04c582002-02-24 01:55:15 +0000212 }
danielk1977d8123362004-06-12 09:25:12 +0000213 sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT);
danielk19777e18c252004-05-25 11:47:24 +0000214 sqliteFree(z);
drhdc04c582002-02-24 01:55:15 +0000215}
danielk19770ae8b832004-05-25 12:05:56 +0000216static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh8cd9db02004-07-18 23:06:53 +0000217 unsigned char *z;
drhdc04c582002-02-24 01:55:15 +0000218 int i;
drh9c054832004-05-31 18:51:57 +0000219 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
danielk1977c572ef72004-05-27 09:28:41 +0000220 z = sqliteMalloc(sqlite3_value_bytes(argv[0])+1);
drhdc04c582002-02-24 01:55:15 +0000221 if( z==0 ) return;
drh4f26d6c2004-05-26 23:25:30 +0000222 strcpy(z, sqlite3_value_text(argv[0]));
drhdc04c582002-02-24 01:55:15 +0000223 for(i=0; z[i]; i++){
drh4c755c02004-08-08 20:22:17 +0000224 z[i] = tolower(z[i]);
drhdc04c582002-02-24 01:55:15 +0000225 }
danielk1977d8123362004-06-12 09:25:12 +0000226 sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT);
danielk19777e18c252004-05-25 11:47:24 +0000227 sqliteFree(z);
drhdc04c582002-02-24 01:55:15 +0000228}
229
230/*
drhfbc99082002-02-28 03:14:18 +0000231** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000232** All three do the same thing. They return the first non-NULL
233** argument.
drh3212e182002-02-28 00:46:26 +0000234*/
drhf9b596e2004-05-26 16:54:42 +0000235static void ifnullFunc(
236 sqlite3_context *context,
237 int argc,
238 sqlite3_value **argv
239){
drhfbc99082002-02-28 03:14:18 +0000240 int i;
241 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000242 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000243 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000244 break;
245 }
246 }
drh3212e182002-02-28 00:46:26 +0000247}
248
249/*
drhf9ffac92002-03-02 19:00:31 +0000250** Implementation of random(). Return a random integer.
251*/
drhf9b596e2004-05-26 16:54:42 +0000252static void randomFunc(
253 sqlite3_context *context,
254 int argc,
255 sqlite3_value **argv
256){
drhbbd82df2004-02-11 09:46:30 +0000257 int r;
danielk19774adee202004-05-08 08:23:19 +0000258 sqlite3Randomness(sizeof(r), &r);
drhf4479502004-05-27 03:12:53 +0000259 sqlite3_result_int(context, r);
drhf9ffac92002-03-02 19:00:31 +0000260}
261
262/*
drh6ed41ad2002-04-06 14:10:47 +0000263** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000264** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000265*/
danielk197751ad0ec2004-05-24 12:39:02 +0000266static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000267 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000268 int arg,
269 sqlite3_value **argv
270){
drh9bb575f2004-09-06 17:24:11 +0000271 sqlite3 *db = sqlite3_user_data(context);
drhf9b596e2004-05-26 16:54:42 +0000272 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000273}
274
rdcf146a772004-02-25 22:51:06 +0000275/*
danielk1977b28af712004-06-21 06:50:26 +0000276** Implementation of the changes() SQL function. The return value is the
277** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000278*/
danielk1977b28af712004-06-21 06:50:26 +0000279static void changes(
drhf9b596e2004-05-26 16:54:42 +0000280 sqlite3_context *context,
281 int arg,
282 sqlite3_value **argv
283){
drh9bb575f2004-09-06 17:24:11 +0000284 sqlite3 *db = sqlite3_user_data(context);
drhf4479502004-05-27 03:12:53 +0000285 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000286}
rdcf146a772004-02-25 22:51:06 +0000287
288/*
danielk1977b28af712004-06-21 06:50:26 +0000289** Implementation of the total_changes() SQL function. The return value is
290** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000291*/
danielk1977b28af712004-06-21 06:50:26 +0000292static void total_changes(
293 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000294 int arg,
295 sqlite3_value **argv
296){
drh9bb575f2004-09-06 17:24:11 +0000297 sqlite3 *db = sqlite3_user_data(context);
danielk1977b28af712004-06-21 06:50:26 +0000298 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000299}
300
drh6ed41ad2002-04-06 14:10:47 +0000301/*
drh4e5ffc52004-08-31 00:52:37 +0000302** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000303*/
drh4e5ffc52004-08-31 00:52:37 +0000304struct compareInfo {
305 u8 matchAll;
306 u8 matchOne;
307 u8 matchSet;
308 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000309};
drh4e5ffc52004-08-31 00:52:37 +0000310static const struct compareInfo globInfo = { '*', '?', '[', 0 };
311static const struct compareInfo likeInfo = { '%', '_', 0, 1 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000312
313/*
drh4e5ffc52004-08-31 00:52:37 +0000314** X is a pointer to the first byte of a UTF-8 character. Increment
315** X so that it points to the next character. This only works right
316** if X points to a well-formed UTF-8 string.
danielk1977d02eb1f2004-06-06 09:44:03 +0000317*/
drh4e5ffc52004-08-31 00:52:37 +0000318#define sqliteNextChar(X) while( (0xc0&*++(X))==0x80 ){}
319#define sqliteCharVal(X) sqlite3ReadUtf8(X)
danielk1977d02eb1f2004-06-06 09:44:03 +0000320
danielk1977d02eb1f2004-06-06 09:44:03 +0000321
322/*
drh4e5ffc52004-08-31 00:52:37 +0000323** Compare two UTF-8 strings for equality where the first string can
324** potentially be a "glob" expression. Return true (1) if they
325** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000326**
drh4e5ffc52004-08-31 00:52:37 +0000327** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000328**
drh4e5ffc52004-08-31 00:52:37 +0000329** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000330**
drh4e5ffc52004-08-31 00:52:37 +0000331** '?' Matches exactly one character.
332**
333** [...] Matches one character from the enclosed list of
334** characters.
335**
336** [^...] Matches one character not in the enclosed list.
337**
338** With the [...] and [^...] matching, a ']' character can be included
339** in the list by making it the first character after '[' or '^'. A
340** range of characters can be specified using '-'. Example:
341** "[a-z]" matches any single lower-case letter. To match a '-', make
342** it the last character in the list.
343**
344** This routine is usually quick, but can be N**2 in the worst case.
345**
346** Hints: to match '*' or '?', put them in "[]". Like this:
347**
348** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000349*/
danielk19777c6303c2004-11-17 16:41:29 +0000350static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000351 const u8 *zPattern, /* The glob pattern */
352 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000353 const struct compareInfo *pInfo, /* Information about how to do the compare */
354 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000355){
danielk1977ad7dd422004-06-06 12:41:49 +0000356 register int c;
drh4e5ffc52004-08-31 00:52:37 +0000357 int invert;
358 int seen;
359 int c2;
360 u8 matchOne = pInfo->matchOne;
361 u8 matchAll = pInfo->matchAll;
362 u8 matchSet = pInfo->matchSet;
363 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000364 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000365
drh4e5ffc52004-08-31 00:52:37 +0000366 while( (c = *zPattern)!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000367 if( !prevEscape && c==matchAll ){
drh4e5ffc52004-08-31 00:52:37 +0000368 while( (c=zPattern[1]) == matchAll || c == matchOne ){
369 if( c==matchOne ){
370 if( *zString==0 ) return 0;
371 sqliteNextChar(zString);
372 }
373 zPattern++;
danielk1977ad7dd422004-06-06 12:41:49 +0000374 }
drh20fc0882004-11-18 13:49:25 +0000375 if( c && esc && sqlite3ReadUtf8(&zPattern[1])==esc ){
danielk19777c6303c2004-11-17 16:41:29 +0000376 u8 const *zTemp = &zPattern[1];
377 sqliteNextChar(zTemp);
378 c = *zTemp;
379 }
drh4e5ffc52004-08-31 00:52:37 +0000380 if( c==0 ) return 1;
381 if( c==matchSet ){
danielk19777c6303c2004-11-17 16:41:29 +0000382 assert( esc==0 ); /* This is GLOB, not LIKE */
383 while( *zString && patternCompare(&zPattern[1],zString,pInfo,esc)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000384 sqliteNextChar(zString);
385 }
386 return *zString!=0;
387 }else{
388 while( (c2 = *zString)!=0 ){
389 if( noCase ){
390 c2 = sqlite3UpperToLower[c2];
391 c = sqlite3UpperToLower[c];
392 while( c2 != 0 && c2 != c ){ c2 = sqlite3UpperToLower[*++zString]; }
393 }else{
394 while( c2 != 0 && c2 != c ){ c2 = *++zString; }
395 }
396 if( c2==0 ) return 0;
danielk19777c6303c2004-11-17 16:41:29 +0000397 if( patternCompare(&zPattern[1],zString,pInfo,esc) ) return 1;
drh4e5ffc52004-08-31 00:52:37 +0000398 sqliteNextChar(zString);
399 }
400 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000401 }
danielk19777c6303c2004-11-17 16:41:29 +0000402 }else if( !prevEscape && c==matchOne ){
drh4e5ffc52004-08-31 00:52:37 +0000403 if( *zString==0 ) return 0;
404 sqliteNextChar(zString);
405 zPattern++;
406 }else if( c==matchSet ){
407 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000408 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000409 seen = 0;
410 invert = 0;
411 c = sqliteCharVal(zString);
412 if( c==0 ) return 0;
413 c2 = *++zPattern;
414 if( c2=='^' ){ invert = 1; c2 = *++zPattern; }
415 if( c2==']' ){
416 if( c==']' ) seen = 1;
417 c2 = *++zPattern;
418 }
419 while( (c2 = sqliteCharVal(zPattern))!=0 && c2!=']' ){
420 if( c2=='-' && zPattern[1]!=']' && zPattern[1]!=0 && prior_c>0 ){
421 zPattern++;
422 c2 = sqliteCharVal(zPattern);
423 if( c>=prior_c && c<=c2 ) seen = 1;
424 prior_c = 0;
425 }else if( c==c2 ){
426 seen = 1;
427 prior_c = c2;
428 }else{
429 prior_c = c2;
430 }
431 sqliteNextChar(zPattern);
432 }
433 if( c2==0 || (seen ^ invert)==0 ) return 0;
434 sqliteNextChar(zString);
435 zPattern++;
drh20fc0882004-11-18 13:49:25 +0000436 }else if( esc && !prevEscape && sqlite3ReadUtf8(zPattern)==esc){
danielk19777c6303c2004-11-17 16:41:29 +0000437 prevEscape = 1;
438 sqliteNextChar(zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000439 }else{
440 if( noCase ){
441 if( sqlite3UpperToLower[c] != sqlite3UpperToLower[*zString] ) return 0;
442 }else{
443 if( c != *zString ) return 0;
444 }
445 zPattern++;
446 zString++;
danielk19777c6303c2004-11-17 16:41:29 +0000447 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000448 }
danielk197751ad0ec2004-05-24 12:39:02 +0000449 }
drh4e5ffc52004-08-31 00:52:37 +0000450 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000451}
drh4e5ffc52004-08-31 00:52:37 +0000452
danielk19773f6b0872004-06-17 05:36:44 +0000453
454/*
455** Implementation of the like() SQL function. This function implements
456** the build-in LIKE operator. The first argument to the function is the
457** pattern and the second argument is the string. So, the SQL statements:
458**
459** A LIKE B
460**
461** is implemented as like(B,A).
462**
463** If the pointer retrieved by via a call to sqlite3_user_data() is
464** not NULL, then this function uses UTF-16. Otherwise UTF-8.
465*/
466static void likeFunc(
467 sqlite3_context *context,
468 int argc,
469 sqlite3_value **argv
470){
471 const unsigned char *zA = sqlite3_value_text(argv[0]);
472 const unsigned char *zB = sqlite3_value_text(argv[1]);
danielk19777c6303c2004-11-17 16:41:29 +0000473 int escape = 0;
474 if( argc==3 ){
475 /* The escape character string must consist of a single UTF-8 character.
476 ** Otherwise, return an error.
477 */
478 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
479 if( sqlite3utf8CharLen(zEsc, -1)!=1 ){
480 sqlite3_result_error(context,
481 "ESCAPE expression must be a single character", -1);
482 return;
483 }
484 escape = sqlite3ReadUtf8(zEsc);
485 }
danielk19773f6b0872004-06-17 05:36:44 +0000486 if( zA && zB ){
danielk19777c6303c2004-11-17 16:41:29 +0000487 sqlite3_result_int(context, patternCompare(zA, zB, &likeInfo, escape));
danielk19773f6b0872004-06-17 05:36:44 +0000488 }
489}
drh0ac65892002-04-20 14:24:41 +0000490
491/*
492** Implementation of the glob() SQL function. This function implements
493** the build-in GLOB operator. The first argument to the function is the
494** string and the second argument is the pattern. So, the SQL statements:
495**
496** A GLOB B
497**
danielk19777c6303c2004-11-17 16:41:29 +0000498** is implemented as glob(B,A).
drh0ac65892002-04-20 14:24:41 +0000499*/
danielk19770ae8b832004-05-25 12:05:56 +0000500static void globFunc(sqlite3_context *context, int arg, sqlite3_value **argv){
drh4f26d6c2004-05-26 23:25:30 +0000501 const unsigned char *zA = sqlite3_value_text(argv[0]);
502 const unsigned char *zB = sqlite3_value_text(argv[1]);
danielk197751ad0ec2004-05-24 12:39:02 +0000503 if( zA && zB ){
danielk19777c6303c2004-11-17 16:41:29 +0000504 sqlite3_result_int(context, patternCompare(zA, zB, &globInfo, 0));
danielk197751ad0ec2004-05-24 12:39:02 +0000505 }
drh8912d102002-05-26 21:34:58 +0000506}
507
508/*
509** Implementation of the NULLIF(x,y) function. The result is the first
510** argument if the arguments are different. The result is NULL if the
511** arguments are equal to each other.
512*/
drhf9b596e2004-05-26 16:54:42 +0000513static void nullifFunc(
514 sqlite3_context *context,
515 int argc,
516 sqlite3_value **argv
517){
danielk1977dc1bdc42004-06-11 10:51:27 +0000518 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
519 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000520 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000521 }
drh0ac65892002-04-20 14:24:41 +0000522}
523
drh647cb0e2002-11-04 19:32:25 +0000524/*
525** Implementation of the VERSION(*) function. The result is the version
526** of the SQLite library that is running.
527*/
drhf9b596e2004-05-26 16:54:42 +0000528static void versionFunc(
529 sqlite3_context *context,
530 int argc,
531 sqlite3_value **argv
532){
danielk1977d8123362004-06-12 09:25:12 +0000533 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000534}
535
danielk19779fd2a9a2004-11-12 13:42:30 +0000536#ifndef SQLITE_OMIT_ALTERTABLE
537/*
538** This function is used by SQL generated to implement the
539** ALTER TABLE command. The first argument is the text of a CREATE TABLE or
540** CREATE INDEX command. The second is a table name. The table name in
541** the CREATE TABLE or CREATE INDEX statement is replaced with the second
542** argument and the result returned. Examples:
543**
544** sqlite_alter_table('CREATE TABLE abc(a, b, c)', 'def')
545** -> 'CREATE TABLE def(a, b, c)'
546**
547** sqlite_alter_table('CREATE INDEX i ON abc(a)', 'def')
548** -> 'CREATE INDEX i ON def(a, b, c)'
549*/
550static void altertableFunc(
551 sqlite3_context *context,
552 int argc,
553 sqlite3_value **argv
554){
danielk1977343e9262004-11-19 05:14:54 +0000555 unsigned char const *zSql = sqlite3_value_text(argv[0]);
556 unsigned char const *zTableName = sqlite3_value_text(argv[1]);
danielk19779fd2a9a2004-11-12 13:42:30 +0000557
danielk1977343e9262004-11-19 05:14:54 +0000558 int token;
559 Token tname;
danielk19779fd2a9a2004-11-12 13:42:30 +0000560 char const *zCsr = zSql;
danielk1977343e9262004-11-19 05:14:54 +0000561 int len = 0;
562 char *zRet;
danielk19779fd2a9a2004-11-12 13:42:30 +0000563
danielk1977343e9262004-11-19 05:14:54 +0000564 /* The principle used to locate the table name in the CREATE TABLE
565 ** statement is that the table name is the first token that is immediatedly
566 ** followed by a left parenthesis - TK_LP.
567 */
danielk19779fd2a9a2004-11-12 13:42:30 +0000568 if( zSql ){
danielk1977343e9262004-11-19 05:14:54 +0000569 do {
570 /* Store the token that zCsr points to in tname. */
571 tname.z = zCsr;
572 tname.n = len;
danielk19779fd2a9a2004-11-12 13:42:30 +0000573
danielk1977343e9262004-11-19 05:14:54 +0000574 /* Advance zCsr to the next token. Store that token type in 'token',
575 ** and it's length in 'len' (to be used next iteration of this loop).
576 */
577 do {
578 zCsr += len;
579 len = sqlite3GetToken(zCsr, &token);
580 } while( token==TK_SPACE );
581 assert( len>0 );
582 } while( token!=TK_LP );
583
584 zRet = sqlite3MPrintf("%.*s%Q%s", tname.z - zSql, zSql,
585 zTableName, tname.z+tname.n);
586 sqlite3_result_text(context, zRet, -1, sqlite3FreeX);
danielk19779fd2a9a2004-11-12 13:42:30 +0000587 }
588}
589#endif
590
danielk1977d641d642004-11-18 15:44:29 +0000591#ifndef SQLITE_OMIT_ALTERTABLE
592#ifndef SQLITE_OMIT_TRIGGER
593/* This function is used by SQL generated to implement the ALTER TABLE
594** ALTER TABLE command. The first argument is the text of a CREATE TRIGGER
595** statement. The second is a table name. The table name in the CREATE
596** TRIGGER statement is replaced with the second argument and the result
597** returned. This is analagous to altertableFunc() above, except for CREATE
598** TRIGGER, not CREATE INDEX and CREATE TABLE.
599*/
600static void altertriggerFunc(
601 sqlite3_context *context,
602 int argc,
603 sqlite3_value **argv
604){
605 unsigned char const *zSql = sqlite3_value_text(argv[0]);
606 unsigned char const *zTableName = sqlite3_value_text(argv[1]);
607
608 int token;
609 Token tname;
610 int dist = 3;
611 char const *zCsr = zSql;
612 int len = 0;
613 char *zRet;
614
615 /* The principle used to locate the table name in the CREATE TRIGGER
616 ** statement is that the table name is the first token that is immediatedly
617 ** preceded by either TK_ON or TK_DOT and immediatedly followed by one
618 ** of TK_WHEN, TK_BEGIN or TK_FOR.
619 */
danielk1977d641d642004-11-18 15:44:29 +0000620 if( zSql ){
621 do {
622 /* Store the token that zCsr points to in tname. */
623 tname.z = zCsr;
624 tname.n = len;
625
626 /* Advance zCsr to the next token. Store that token type in 'token',
627 ** and it's length in 'len' (to be used next iteration of this loop).
628 */
629 do {
630 zCsr += len;
631 len = sqlite3GetToken(zCsr, &token);
632 }while( token==TK_SPACE );
633 assert( len>0 );
634
635 /* Variable 'dist' stores the number of tokens read since the most
636 ** recent TK_DOT or TK_ON. This means that when a WHEN, FOR or BEGIN
637 ** token is read and 'dist' equals 2, the condition stated above
638 ** to be met.
639 **
640 ** Note that ON cannot be a database, table or column name, so
641 ** there is no need to worry about syntax like
642 ** "CREATE TRIGGER ... ON ON.ON BEGIN ..." etc.
643 */
644 dist++;
645 if( token==TK_DOT || token==TK_ON ){
646 dist = 0;
647 }
648 } while( dist!=2 || (token!=TK_WHEN && token!=TK_FOR && token!=TK_BEGIN) );
649
650 /* Variable tname now contains the token that is the old table-name
651 ** in the CREATE TRIGGER statement.
652 */
653 zRet = sqlite3MPrintf("%.*s%Q%s", tname.z - zSql, zSql,
654 zTableName, tname.z+tname.n);
danielk1977343e9262004-11-19 05:14:54 +0000655 sqlite3_result_text(context, zRet, -1, sqlite3FreeX);
danielk1977d641d642004-11-18 15:44:29 +0000656 }
657}
658#endif /* !SQLITE_OMIT_TRIGGER */
659#endif /* !SQLITE_OMIT_ALTERTABLE */
660
drh47394702003-08-20 01:03:33 +0000661/*
662** EXPERIMENTAL - This is not an official function. The interface may
663** change. This function may disappear. Do not write code that depends
664** on this function.
665**
666** Implementation of the QUOTE() function. This function takes a single
667** argument. If the argument is numeric, the return value is the same as
668** the argument. If the argument is NULL, the return value is the string
669** "NULL". Otherwise, the argument is enclosed in single quotes with
670** single-quote escapes.
671*/
danielk19770ae8b832004-05-25 12:05:56 +0000672static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000673 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000674 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000675 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000676 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000677 break;
drh47394702003-08-20 01:03:33 +0000678 }
drh9c054832004-05-31 18:51:57 +0000679 case SQLITE_INTEGER:
680 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000681 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000682 break;
683 }
danielk19773f41e972004-06-08 00:39:01 +0000684 case SQLITE_BLOB: {
685 static const char hexdigits[] = {
686 '0', '1', '2', '3', '4', '5', '6', '7',
687 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
688 };
689 char *zText = 0;
690 int nBlob = sqlite3_value_bytes(argv[0]);
691 char const *zBlob = sqlite3_value_blob(argv[0]);
692
693 zText = (char *)sqliteMalloc((2*nBlob)+4);
694 if( !zText ){
695 sqlite3_result_error(context, "out of memory", -1);
696 }else{
697 int i;
698 for(i=0; i<nBlob; i++){
699 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
700 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
701 }
702 zText[(nBlob*2)+2] = '\'';
703 zText[(nBlob*2)+3] = '\0';
704 zText[0] = 'X';
705 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000706 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
danielk19773f41e972004-06-08 00:39:01 +0000707 sqliteFree(zText);
708 }
709 break;
710 }
drh9c054832004-05-31 18:51:57 +0000711 case SQLITE_TEXT: {
drhf9b596e2004-05-26 16:54:42 +0000712 int i,j,n;
drh4f26d6c2004-05-26 23:25:30 +0000713 const char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000714 char *z;
715
716 for(i=n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
717 z = sqliteMalloc( i+n+3 );
718 if( z==0 ) return;
719 z[0] = '\'';
720 for(i=0, j=1; zArg[i]; i++){
721 z[j++] = zArg[i];
722 if( zArg[i]=='\'' ){
723 z[j++] = '\'';
724 }
725 }
726 z[j++] = '\'';
727 z[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000728 sqlite3_result_text(context, z, j, SQLITE_TRANSIENT);
drhf9b596e2004-05-26 16:54:42 +0000729 sqliteFree(z);
730 }
drh47394702003-08-20 01:03:33 +0000731 }
732}
733
drhd24cc422003-03-27 12:51:24 +0000734#ifdef SQLITE_SOUNDEX
735/*
736** Compute the soundex encoding of a word.
737*/
danielk19770ae8b832004-05-25 12:05:56 +0000738static void soundexFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drhd24cc422003-03-27 12:51:24 +0000739 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000740 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000741 int i, j;
742 static const unsigned char iCode[] = {
743 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
744 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
745 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
746 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
747 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
748 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
749 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
750 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
751 };
752 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000753 zIn = (u8*)sqlite3_value_text(argv[0]);
drhd24cc422003-03-27 12:51:24 +0000754 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
755 if( zIn[i] ){
756 zResult[0] = toupper(zIn[i]);
757 for(j=1; j<4 && zIn[i]; i++){
758 int code = iCode[zIn[i]&0x7f];
759 if( code>0 ){
760 zResult[j++] = code + '0';
761 }
762 }
763 while( j<4 ){
764 zResult[j++] = '0';
765 }
766 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000767 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000768 }else{
danielk1977d8123362004-06-12 09:25:12 +0000769 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000770 }
771}
772#endif
773
drh193a6b42002-07-07 16:52:46 +0000774#ifdef SQLITE_TEST
775/*
776** This function generates a string of random characters. Used for
777** generating test data.
778*/
danielk19770ae8b832004-05-25 12:05:56 +0000779static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +0000780 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +0000781 "abcdefghijklmnopqrstuvwxyz"
782 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
783 "0123456789"
784 ".-!,:*^+=_|?/<> ";
785 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +0000786 unsigned char zBuf[1000];
drh193a6b42002-07-07 16:52:46 +0000787 if( argc>=1 ){
drhf9b596e2004-05-26 16:54:42 +0000788 iMin = sqlite3_value_int(argv[0]);
drh193a6b42002-07-07 16:52:46 +0000789 if( iMin<0 ) iMin = 0;
790 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
791 }else{
792 iMin = 1;
793 }
794 if( argc>=2 ){
drhf9b596e2004-05-26 16:54:42 +0000795 iMax = sqlite3_value_int(argv[1]);
drh193a6b42002-07-07 16:52:46 +0000796 if( iMax<iMin ) iMax = iMin;
drh1dba7272004-01-16 13:58:18 +0000797 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +0000798 }else{
799 iMax = 50;
800 }
801 n = iMin;
802 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +0000803 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +0000804 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +0000805 n += r%(iMax + 1 - iMin);
806 }
drh1dba7272004-01-16 13:58:18 +0000807 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +0000808 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +0000809 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +0000810 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +0000811 }
812 zBuf[n] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000813 sqlite3_result_text(context, zBuf, n, SQLITE_TRANSIENT);
814}
drh0e3d7472004-06-19 17:33:07 +0000815#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +0000816
drh0e3d7472004-06-19 17:33:07 +0000817#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +0000818/*
819** The following two SQL functions are used to test returning a text
820** result with a destructor. Function 'test_destructor' takes one argument
821** and returns the same argument interpreted as TEXT. A destructor is
822** passed with the sqlite3_result_text() call.
823**
824** SQL function 'test_destructor_count' returns the number of outstanding
825** allocations made by 'test_destructor';
826**
827** WARNING: Not threadsafe.
828*/
829static int test_destructor_count_var = 0;
830static void destructor(void *p){
831 char *zVal = (char *)p;
832 assert(zVal);
833 zVal--;
834 sqliteFree(zVal);
835 test_destructor_count_var--;
836}
837static void test_destructor(
838 sqlite3_context *pCtx,
839 int nArg,
840 sqlite3_value **argv
841){
842 char *zVal;
danielk1977f4618892004-06-28 13:09:11 +0000843 int len;
drh9bb575f2004-09-06 17:24:11 +0000844 sqlite3 *db = sqlite3_user_data(pCtx);
danielk1977f4618892004-06-28 13:09:11 +0000845
danielk1977d8123362004-06-12 09:25:12 +0000846 test_destructor_count_var++;
847 assert( nArg==1 );
848 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
danielk1977f4618892004-06-28 13:09:11 +0000849 len = sqlite3ValueBytes(argv[0], db->enc);
850 zVal = sqliteMalloc(len+3);
851 zVal[len] = 0;
852 zVal[len-1] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000853 assert( zVal );
854 zVal++;
danielk1977f4618892004-06-28 13:09:11 +0000855 memcpy(zVal, sqlite3ValueText(argv[0], db->enc), len);
856 if( db->enc==SQLITE_UTF8 ){
857 sqlite3_result_text(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +0000858#ifndef SQLITE_OMIT_UTF16
danielk1977f4618892004-06-28 13:09:11 +0000859 }else if( db->enc==SQLITE_UTF16LE ){
860 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
861 }else{
862 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +0000863#endif /* SQLITE_OMIT_UTF16 */
danielk1977f4618892004-06-28 13:09:11 +0000864 }
danielk1977d8123362004-06-12 09:25:12 +0000865}
866static void test_destructor_count(
867 sqlite3_context *pCtx,
868 int nArg,
869 sqlite3_value **argv
870){
871 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +0000872}
drh0e3d7472004-06-19 17:33:07 +0000873#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +0000874
drh0e3d7472004-06-19 17:33:07 +0000875#ifdef SQLITE_TEST
876/*
877** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
878** interface.
879**
880** The test_auxdata() SQL function attempts to register each of its arguments
881** as auxiliary data. If there are no prior registrations of aux data for
882** that argument (meaning the argument is not a constant or this is its first
883** call) then the result for that argument is 0. If there is a prior
884** registration, the result for that argument is 1. The overall result
885** is the individual argument results separated by spaces.
886*/
danielk19773f6b0872004-06-17 05:36:44 +0000887static void free_test_auxdata(void *p) {sqliteFree(p);}
888static void test_auxdata(
889 sqlite3_context *pCtx,
890 int nArg,
891 sqlite3_value **argv
892){
893 int i;
894 char *zRet = sqliteMalloc(nArg*2);
895 if( !zRet ) return;
896 for(i=0; i<nArg; i++){
897 char const *z = sqlite3_value_text(argv[i]);
898 if( z ){
899 char *zAux = sqlite3_get_auxdata(pCtx, i);
900 if( zAux ){
901 zRet[i*2] = '1';
902 if( strcmp(zAux, z) ){
903 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
904 return;
905 }
906 }else{
907 zRet[i*2] = '0';
908 zAux = sqliteStrDup(z);
909 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
910 }
911 zRet[i*2+1] = ' ';
912 }
913 }
914 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
915}
drh0e3d7472004-06-19 17:33:07 +0000916#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +0000917
drh0ac65892002-04-20 14:24:41 +0000918/*
drhd3a149e2002-02-24 17:12:53 +0000919** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +0000920** sum() or avg() aggregate computation.
921*/
922typedef struct SumCtx SumCtx;
923struct SumCtx {
924 double sum; /* Sum of terms */
drh739105c2002-05-29 23:22:23 +0000925 int cnt; /* Number of elements summed */
drhdd5baa92002-02-27 19:50:59 +0000926};
927
928/*
929** Routines used to compute the sum or average.
930*/
danielk19770ae8b832004-05-25 12:05:56 +0000931static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +0000932 SumCtx *p;
drhdd5baa92002-02-27 19:50:59 +0000933 if( argc<1 ) return;
drh4f26d6c2004-05-26 23:25:30 +0000934 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +0000935 if( p && SQLITE_NULL!=sqlite3_value_type(argv[0]) ){
drh4f26d6c2004-05-26 23:25:30 +0000936 p->sum += sqlite3_value_double(argv[0]);
drh739105c2002-05-29 23:22:23 +0000937 p->cnt++;
938 }
drhdd5baa92002-02-27 19:50:59 +0000939}
danielk19770ae8b832004-05-25 12:05:56 +0000940static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +0000941 SumCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000942 p = sqlite3_aggregate_context(context, sizeof(*p));
danielk19777e18c252004-05-25 11:47:24 +0000943 sqlite3_result_double(context, p ? p->sum : 0.0);
drhdd5baa92002-02-27 19:50:59 +0000944}
danielk19770ae8b832004-05-25 12:05:56 +0000945static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +0000946 SumCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000947 p = sqlite3_aggregate_context(context, sizeof(*p));
drh739105c2002-05-29 23:22:23 +0000948 if( p && p->cnt>0 ){
danielk19777e18c252004-05-25 11:47:24 +0000949 sqlite3_result_double(context, p->sum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +0000950 }
951}
952
953/*
954** An instance of the following structure holds the context of a
drha2ed5602002-02-26 23:55:31 +0000955** variance or standard deviation computation.
drhd3a149e2002-02-24 17:12:53 +0000956*/
957typedef struct StdDevCtx StdDevCtx;
958struct StdDevCtx {
959 double sum; /* Sum of terms */
960 double sum2; /* Sum of the squares of terms */
drh739105c2002-05-29 23:22:23 +0000961 int cnt; /* Number of terms counted */
drhd3a149e2002-02-24 17:12:53 +0000962};
963
drhef2daf52002-03-04 02:26:15 +0000964#if 0 /* Omit because math library is required */
drhd3a149e2002-02-24 17:12:53 +0000965/*
966** Routines used to compute the standard deviation as an aggregate.
967*/
danielk19770ae8b832004-05-25 12:05:56 +0000968static void stdDevStep(sqlite3_context *context, int argc, const char **argv){
drhd3a149e2002-02-24 17:12:53 +0000969 StdDevCtx *p;
970 double x;
drh1350b032002-02-27 19:00:20 +0000971 if( argc<1 ) return;
danielk197724b03fd2004-05-10 10:34:34 +0000972 p = sqlite3_aggregate_context(context, sizeof(*p));
drh739105c2002-05-29 23:22:23 +0000973 if( p && argv[0] ){
danielk19774adee202004-05-08 08:23:19 +0000974 x = sqlite3AtoF(argv[0], 0);
drh739105c2002-05-29 23:22:23 +0000975 p->sum += x;
976 p->sum2 += x*x;
977 p->cnt++;
978 }
drhd3a149e2002-02-24 17:12:53 +0000979}
danielk19770ae8b832004-05-25 12:05:56 +0000980static void stdDevFinalize(sqlite3_context *context){
danielk197724b03fd2004-05-10 10:34:34 +0000981 double rN = sqlite3_aggregate_count(context);
982 StdDevCtx *p = sqlite3_aggregate_context(context, sizeof(*p));
drh739105c2002-05-29 23:22:23 +0000983 if( p && p->cnt>1 ){
984 double rCnt = cnt;
danielk197724b03fd2004-05-10 10:34:34 +0000985 sqlite3_set_result_double(context,
drh739105c2002-05-29 23:22:23 +0000986 sqrt((p->sum2 - p->sum*p->sum/rCnt)/(rCnt-1.0)));
drhd3a149e2002-02-24 17:12:53 +0000987 }
drhd3a149e2002-02-24 17:12:53 +0000988}
drhef2daf52002-03-04 02:26:15 +0000989#endif
drhd3a149e2002-02-24 17:12:53 +0000990
drh0bce8352002-02-28 00:41:10 +0000991/*
992** The following structure keeps track of state information for the
993** count() aggregate function.
994*/
995typedef struct CountCtx CountCtx;
996struct CountCtx {
997 int n;
998};
drhdd5baa92002-02-27 19:50:59 +0000999
drh0bce8352002-02-28 00:41:10 +00001000/*
1001** Routines to implement the count() aggregate function.
1002*/
danielk19770ae8b832004-05-25 12:05:56 +00001003static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001004 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001005 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001006 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001007 p->n++;
1008 }
1009}
danielk19770ae8b832004-05-25 12:05:56 +00001010static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001011 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001012 p = sqlite3_aggregate_context(context, sizeof(*p));
drhf4479502004-05-27 03:12:53 +00001013 sqlite3_result_int(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001014}
1015
1016/*
1017** This function tracks state information for the min() and max()
1018** aggregate functions.
1019*/
1020typedef struct MinMaxCtx MinMaxCtx;
1021struct MinMaxCtx {
1022 char *z; /* The best so far */
1023 char zBuf[28]; /* Space that can be used for storage */
1024};
1025
1026/*
1027** Routines to implement min() and max() aggregate functions.
1028*/
danielk19770ae8b832004-05-25 12:05:56 +00001029static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +00001030 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001031 Mem *pBest;
1032
1033 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1034 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001035 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001036
danielk197788208052004-05-25 01:13:20 +00001037 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001038 int max;
1039 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001040 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001041 /* This step function is used for both the min() and max() aggregates,
1042 ** the only difference between the two being that the sense of the
1043 ** comparison is inverted. For the max() aggregate, the
1044 ** sqlite3_user_data() function returns (void *)-1. For min() it
1045 ** returns (void *)db, where db is the sqlite3* database pointer.
1046 ** Therefore the next statement sets variable 'max' to 1 for the max()
1047 ** aggregate, or 0 for min().
1048 */
danielk197788208052004-05-25 01:13:20 +00001049 max = ((sqlite3_user_data(context)==(void *)-1)?1:0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001050 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001051 if( (max && cmp<0) || (!max && cmp>0) ){
danielk19777e18c252004-05-25 11:47:24 +00001052 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001053 }
drh268380c2004-02-25 13:47:31 +00001054 }else{
danielk19777e18c252004-05-25 11:47:24 +00001055 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001056 }
1057}
danielk19770ae8b832004-05-25 12:05:56 +00001058static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001059 sqlite3_value *pRes;
drh4f26d6c2004-05-26 23:25:30 +00001060 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, sizeof(Mem));
danielk197788208052004-05-25 01:13:20 +00001061 if( pRes->flags ){
drhf4479502004-05-27 03:12:53 +00001062 sqlite3_result_value(context, pRes);
drh0bce8352002-02-28 00:41:10 +00001063 }
danielk1977b20e56b2004-06-15 13:36:30 +00001064 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001065}
drhdd5baa92002-02-27 19:50:59 +00001066
drh4e5ffc52004-08-31 00:52:37 +00001067
drhd3a149e2002-02-24 17:12:53 +00001068/*
drha2ed5602002-02-26 23:55:31 +00001069** This function registered all of the above C functions as SQL
1070** functions. This should be the only routine in this file with
1071** external linkage.
drhdc04c582002-02-24 01:55:15 +00001072*/
drh9bb575f2004-09-06 17:24:11 +00001073void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001074 static const struct {
drh0bce8352002-02-28 00:41:10 +00001075 char *zName;
drh268380c2004-02-25 13:47:31 +00001076 signed char nArg;
danielk1977f4618892004-06-28 13:09:11 +00001077 u8 argType; /* 0: none. 1: db 2: (-1) */
1078 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001079 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001080 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001081 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001082 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1083 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
1084 { "max", -1, 2, SQLITE_UTF8, 1, minmaxFunc },
1085 { "max", 0, 2, SQLITE_UTF8, 1, 0 },
1086 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1087 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
1088 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
drh6c626082004-11-14 21:56:29 +00001089#ifndef SQLITE_OMIT_UTF16
danielk1977f4618892004-06-28 13:09:11 +00001090 { "substr", 3, 0, SQLITE_UTF16LE, 0, sqlite3utf16Substr },
drh6c626082004-11-14 21:56:29 +00001091#endif
danielk1977f4618892004-06-28 13:09:11 +00001092 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1093 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1094 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1095 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1096 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1097 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1098 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1099 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
1100 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1101 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
1102 { "like", 2, 0, SQLITE_UTF8, 0, likeFunc },
danielk19777c6303c2004-11-17 16:41:29 +00001103 { "like", 3, 0, SQLITE_UTF8, 0, likeFunc },
danielk1977f4618892004-06-28 13:09:11 +00001104 { "glob", 2, 0, SQLITE_UTF8, 0, globFunc },
drh94a98362004-09-13 13:13:18 +00001105 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001106 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1107 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
1108 { "last_insert_rowid", 0, 1, SQLITE_UTF8, 0, last_insert_rowid },
1109 { "changes", 0, 1, SQLITE_UTF8, 0, changes },
1110 { "total_changes", 0, 1, SQLITE_UTF8, 0, total_changes },
danielk19779fd2a9a2004-11-12 13:42:30 +00001111#ifndef SQLITE_OMIT_ALTERTABLE
1112 { "sqlite_alter_table", 2, 0, SQLITE_UTF8, 0, altertableFunc},
danielk1977d641d642004-11-18 15:44:29 +00001113#ifndef SQLITE_OMIT_TRIGGER
1114 { "sqlite_alter_trigger", 2, 0, SQLITE_UTF8, 0, altertriggerFunc},
1115#endif
danielk19779fd2a9a2004-11-12 13:42:30 +00001116#endif
drhd24cc422003-03-27 12:51:24 +00001117#ifdef SQLITE_SOUNDEX
danielk1977f4618892004-06-28 13:09:11 +00001118 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001119#endif
drh193a6b42002-07-07 16:52:46 +00001120#ifdef SQLITE_TEST
danielk1977f4618892004-06-28 13:09:11 +00001121 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1122 { "test_destructor", 1, 1, SQLITE_UTF8, 0, test_destructor},
danielk1977d8123362004-06-12 09:25:12 +00001123 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
danielk1977f4618892004-06-28 13:09:11 +00001124 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
drh193a6b42002-07-07 16:52:46 +00001125#endif
drh0bce8352002-02-28 00:41:10 +00001126 };
drh57196282004-10-06 15:41:16 +00001127 static const struct {
drh0bce8352002-02-28 00:41:10 +00001128 char *zName;
drh268380c2004-02-25 13:47:31 +00001129 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001130 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001131 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001132 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1133 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001134 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001135 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
1136 { "max", 1, 2, 1, minmaxStep, minMaxFinalize },
1137 { "sum", 1, 0, 0, sumStep, sumFinalize },
1138 { "avg", 1, 0, 0, sumStep, avgFinalize },
1139 { "count", 0, 0, 0, countStep, countFinalize },
1140 { "count", 1, 0, 0, countStep, countFinalize },
drhef2daf52002-03-04 02:26:15 +00001141#if 0
drhf9b596e2004-05-26 16:54:42 +00001142 { "stddev", 1, 0, stdDevStep, stdDevFinalize },
drhef2daf52002-03-04 02:26:15 +00001143#endif
drh0bce8352002-02-28 00:41:10 +00001144 };
1145 int i;
1146
1147 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
danielk1977c572ef72004-05-27 09:28:41 +00001148 void *pArg = 0;
1149 switch( aFuncs[i].argType ){
1150 case 1: pArg = db; break;
1151 case 2: pArg = (void *)(-1); break;
1152 }
danielk1977ad7dd422004-06-06 12:41:49 +00001153 sqlite3_create_function(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001154 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001155 if( aFuncs[i].needCollSeq ){
1156 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1157 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1158 if( pFunc && aFuncs[i].needCollSeq ){
1159 pFunc->needCollSeq = 1;
1160 }
1161 }
drh0bce8352002-02-28 00:41:10 +00001162 }
1163 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
danielk1977c572ef72004-05-27 09:28:41 +00001164 void *pArg = 0;
1165 switch( aAggs[i].argType ){
1166 case 1: pArg = db; break;
1167 case 2: pArg = (void *)(-1); break;
1168 }
danielk1977d8123362004-06-12 09:25:12 +00001169 sqlite3_create_function(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001170 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001171 if( aAggs[i].needCollSeq ){
1172 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001173 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001174 if( pFunc && aAggs[i].needCollSeq ){
1175 pFunc->needCollSeq = 1;
1176 }
1177 }
drh268380c2004-02-25 13:47:31 +00001178 }
danielk19774adee202004-05-08 08:23:19 +00001179 sqlite3RegisterDateTimeFunctions(db);
drhdc04c582002-02-24 01:55:15 +00001180}