blob: 9c7ccb3e75d31b35b44c15801d912f3312572fdc [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**
drh94a98362004-09-13 13:13:18 +000019** $Id: func.c,v 1.84 2004/09/13 13:13:19 drh 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*/
drh4e5ffc52004-08-31 00:52:37 +0000350int patternCompare(
351 const u8 *zPattern, /* The glob pattern */
352 const u8 *zString, /* The string to compare against the glob */
353 const struct compareInfo *pInfo /* Information about how to do the compare */
danielk197751ad0ec2004-05-24 12:39:02 +0000354){
danielk1977ad7dd422004-06-06 12:41:49 +0000355 register int c;
drh4e5ffc52004-08-31 00:52:37 +0000356 int invert;
357 int seen;
358 int c2;
359 u8 matchOne = pInfo->matchOne;
360 u8 matchAll = pInfo->matchAll;
361 u8 matchSet = pInfo->matchSet;
362 u8 noCase = pInfo->noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000363
drh4e5ffc52004-08-31 00:52:37 +0000364 while( (c = *zPattern)!=0 ){
365 if( c==matchAll ){
366 while( (c=zPattern[1]) == matchAll || c == matchOne ){
367 if( c==matchOne ){
368 if( *zString==0 ) return 0;
369 sqliteNextChar(zString);
370 }
371 zPattern++;
danielk1977ad7dd422004-06-06 12:41:49 +0000372 }
drh4e5ffc52004-08-31 00:52:37 +0000373 if( c==0 ) return 1;
374 if( c==matchSet ){
375 while( *zString && patternCompare(&zPattern[1],zString,pInfo)==0 ){
376 sqliteNextChar(zString);
377 }
378 return *zString!=0;
379 }else{
380 while( (c2 = *zString)!=0 ){
381 if( noCase ){
382 c2 = sqlite3UpperToLower[c2];
383 c = sqlite3UpperToLower[c];
384 while( c2 != 0 && c2 != c ){ c2 = sqlite3UpperToLower[*++zString]; }
385 }else{
386 while( c2 != 0 && c2 != c ){ c2 = *++zString; }
387 }
388 if( c2==0 ) return 0;
389 if( patternCompare(&zPattern[1],zString,pInfo) ) return 1;
390 sqliteNextChar(zString);
391 }
392 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000393 }
drh4e5ffc52004-08-31 00:52:37 +0000394 }else if( c==matchOne ){
395 if( *zString==0 ) return 0;
396 sqliteNextChar(zString);
397 zPattern++;
398 }else if( c==matchSet ){
399 int prior_c = 0;
400 seen = 0;
401 invert = 0;
402 c = sqliteCharVal(zString);
403 if( c==0 ) return 0;
404 c2 = *++zPattern;
405 if( c2=='^' ){ invert = 1; c2 = *++zPattern; }
406 if( c2==']' ){
407 if( c==']' ) seen = 1;
408 c2 = *++zPattern;
409 }
410 while( (c2 = sqliteCharVal(zPattern))!=0 && c2!=']' ){
411 if( c2=='-' && zPattern[1]!=']' && zPattern[1]!=0 && prior_c>0 ){
412 zPattern++;
413 c2 = sqliteCharVal(zPattern);
414 if( c>=prior_c && c<=c2 ) seen = 1;
415 prior_c = 0;
416 }else if( c==c2 ){
417 seen = 1;
418 prior_c = c2;
419 }else{
420 prior_c = c2;
421 }
422 sqliteNextChar(zPattern);
423 }
424 if( c2==0 || (seen ^ invert)==0 ) return 0;
425 sqliteNextChar(zString);
426 zPattern++;
427 }else{
428 if( noCase ){
429 if( sqlite3UpperToLower[c] != sqlite3UpperToLower[*zString] ) return 0;
430 }else{
431 if( c != *zString ) return 0;
432 }
433 zPattern++;
434 zString++;
danielk1977d02eb1f2004-06-06 09:44:03 +0000435 }
danielk197751ad0ec2004-05-24 12:39:02 +0000436 }
drh4e5ffc52004-08-31 00:52:37 +0000437 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000438}
drh4e5ffc52004-08-31 00:52:37 +0000439
danielk19773f6b0872004-06-17 05:36:44 +0000440
441/*
442** Implementation of the like() SQL function. This function implements
443** the build-in LIKE operator. The first argument to the function is the
444** pattern and the second argument is the string. So, the SQL statements:
445**
446** A LIKE B
447**
448** is implemented as like(B,A).
449**
450** If the pointer retrieved by via a call to sqlite3_user_data() is
451** not NULL, then this function uses UTF-16. Otherwise UTF-8.
452*/
453static void likeFunc(
454 sqlite3_context *context,
455 int argc,
456 sqlite3_value **argv
457){
458 const unsigned char *zA = sqlite3_value_text(argv[0]);
459 const unsigned char *zB = sqlite3_value_text(argv[1]);
460 if( zA && zB ){
drh4e5ffc52004-08-31 00:52:37 +0000461 sqlite3_result_int(context, patternCompare(zA, zB, &likeInfo));
danielk19773f6b0872004-06-17 05:36:44 +0000462 }
463}
drh0ac65892002-04-20 14:24:41 +0000464
465/*
466** Implementation of the glob() SQL function. This function implements
467** the build-in GLOB operator. The first argument to the function is the
468** string and the second argument is the pattern. So, the SQL statements:
469**
470** A GLOB B
471**
472** is implemented as glob(A,B).
473*/
danielk19770ae8b832004-05-25 12:05:56 +0000474static void globFunc(sqlite3_context *context, int arg, sqlite3_value **argv){
drh4f26d6c2004-05-26 23:25:30 +0000475 const unsigned char *zA = sqlite3_value_text(argv[0]);
476 const unsigned char *zB = sqlite3_value_text(argv[1]);
danielk197751ad0ec2004-05-24 12:39:02 +0000477 if( zA && zB ){
drh4e5ffc52004-08-31 00:52:37 +0000478 sqlite3_result_int(context, patternCompare(zA, zB, &globInfo));
danielk197751ad0ec2004-05-24 12:39:02 +0000479 }
drh8912d102002-05-26 21:34:58 +0000480}
481
482/*
483** Implementation of the NULLIF(x,y) function. The result is the first
484** argument if the arguments are different. The result is NULL if the
485** arguments are equal to each other.
486*/
drhf9b596e2004-05-26 16:54:42 +0000487static void nullifFunc(
488 sqlite3_context *context,
489 int argc,
490 sqlite3_value **argv
491){
danielk1977dc1bdc42004-06-11 10:51:27 +0000492 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
493 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000494 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000495 }
drh0ac65892002-04-20 14:24:41 +0000496}
497
drh647cb0e2002-11-04 19:32:25 +0000498/*
499** Implementation of the VERSION(*) function. The result is the version
500** of the SQLite library that is running.
501*/
drhf9b596e2004-05-26 16:54:42 +0000502static void versionFunc(
503 sqlite3_context *context,
504 int argc,
505 sqlite3_value **argv
506){
danielk1977d8123362004-06-12 09:25:12 +0000507 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000508}
509
drh47394702003-08-20 01:03:33 +0000510/*
511** EXPERIMENTAL - This is not an official function. The interface may
512** change. This function may disappear. Do not write code that depends
513** on this function.
514**
515** Implementation of the QUOTE() function. This function takes a single
516** argument. If the argument is numeric, the return value is the same as
517** the argument. If the argument is NULL, the return value is the string
518** "NULL". Otherwise, the argument is enclosed in single quotes with
519** single-quote escapes.
520*/
danielk19770ae8b832004-05-25 12:05:56 +0000521static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000522 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000523 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000524 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000525 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000526 break;
drh47394702003-08-20 01:03:33 +0000527 }
drh9c054832004-05-31 18:51:57 +0000528 case SQLITE_INTEGER:
529 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000530 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000531 break;
532 }
danielk19773f41e972004-06-08 00:39:01 +0000533 case SQLITE_BLOB: {
534 static const char hexdigits[] = {
535 '0', '1', '2', '3', '4', '5', '6', '7',
536 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
537 };
538 char *zText = 0;
539 int nBlob = sqlite3_value_bytes(argv[0]);
540 char const *zBlob = sqlite3_value_blob(argv[0]);
541
542 zText = (char *)sqliteMalloc((2*nBlob)+4);
543 if( !zText ){
544 sqlite3_result_error(context, "out of memory", -1);
545 }else{
546 int i;
547 for(i=0; i<nBlob; i++){
548 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
549 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
550 }
551 zText[(nBlob*2)+2] = '\'';
552 zText[(nBlob*2)+3] = '\0';
553 zText[0] = 'X';
554 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000555 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
danielk19773f41e972004-06-08 00:39:01 +0000556 sqliteFree(zText);
557 }
558 break;
559 }
drh9c054832004-05-31 18:51:57 +0000560 case SQLITE_TEXT: {
drhf9b596e2004-05-26 16:54:42 +0000561 int i,j,n;
drh4f26d6c2004-05-26 23:25:30 +0000562 const char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000563 char *z;
564
565 for(i=n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
566 z = sqliteMalloc( i+n+3 );
567 if( z==0 ) return;
568 z[0] = '\'';
569 for(i=0, j=1; zArg[i]; i++){
570 z[j++] = zArg[i];
571 if( zArg[i]=='\'' ){
572 z[j++] = '\'';
573 }
574 }
575 z[j++] = '\'';
576 z[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000577 sqlite3_result_text(context, z, j, SQLITE_TRANSIENT);
drhf9b596e2004-05-26 16:54:42 +0000578 sqliteFree(z);
579 }
drh47394702003-08-20 01:03:33 +0000580 }
581}
582
drhd24cc422003-03-27 12:51:24 +0000583#ifdef SQLITE_SOUNDEX
584/*
585** Compute the soundex encoding of a word.
586*/
danielk19770ae8b832004-05-25 12:05:56 +0000587static void soundexFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drhd24cc422003-03-27 12:51:24 +0000588 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000589 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000590 int i, j;
591 static const unsigned char iCode[] = {
592 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
593 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
594 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
595 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
596 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
597 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
598 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
599 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
600 };
601 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000602 zIn = (u8*)sqlite3_value_text(argv[0]);
drhd24cc422003-03-27 12:51:24 +0000603 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
604 if( zIn[i] ){
605 zResult[0] = toupper(zIn[i]);
606 for(j=1; j<4 && zIn[i]; i++){
607 int code = iCode[zIn[i]&0x7f];
608 if( code>0 ){
609 zResult[j++] = code + '0';
610 }
611 }
612 while( j<4 ){
613 zResult[j++] = '0';
614 }
615 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000616 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000617 }else{
danielk1977d8123362004-06-12 09:25:12 +0000618 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000619 }
620}
621#endif
622
drh193a6b42002-07-07 16:52:46 +0000623#ifdef SQLITE_TEST
624/*
625** This function generates a string of random characters. Used for
626** generating test data.
627*/
danielk19770ae8b832004-05-25 12:05:56 +0000628static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +0000629 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +0000630 "abcdefghijklmnopqrstuvwxyz"
631 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
632 "0123456789"
633 ".-!,:*^+=_|?/<> ";
634 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +0000635 unsigned char zBuf[1000];
drh193a6b42002-07-07 16:52:46 +0000636 if( argc>=1 ){
drhf9b596e2004-05-26 16:54:42 +0000637 iMin = sqlite3_value_int(argv[0]);
drh193a6b42002-07-07 16:52:46 +0000638 if( iMin<0 ) iMin = 0;
639 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
640 }else{
641 iMin = 1;
642 }
643 if( argc>=2 ){
drhf9b596e2004-05-26 16:54:42 +0000644 iMax = sqlite3_value_int(argv[1]);
drh193a6b42002-07-07 16:52:46 +0000645 if( iMax<iMin ) iMax = iMin;
drh1dba7272004-01-16 13:58:18 +0000646 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +0000647 }else{
648 iMax = 50;
649 }
650 n = iMin;
651 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +0000652 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +0000653 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +0000654 n += r%(iMax + 1 - iMin);
655 }
drh1dba7272004-01-16 13:58:18 +0000656 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +0000657 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +0000658 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +0000659 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +0000660 }
661 zBuf[n] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000662 sqlite3_result_text(context, zBuf, n, SQLITE_TRANSIENT);
663}
drh0e3d7472004-06-19 17:33:07 +0000664#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +0000665
drh0e3d7472004-06-19 17:33:07 +0000666#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +0000667/*
668** The following two SQL functions are used to test returning a text
669** result with a destructor. Function 'test_destructor' takes one argument
670** and returns the same argument interpreted as TEXT. A destructor is
671** passed with the sqlite3_result_text() call.
672**
673** SQL function 'test_destructor_count' returns the number of outstanding
674** allocations made by 'test_destructor';
675**
676** WARNING: Not threadsafe.
677*/
678static int test_destructor_count_var = 0;
679static void destructor(void *p){
680 char *zVal = (char *)p;
681 assert(zVal);
682 zVal--;
683 sqliteFree(zVal);
684 test_destructor_count_var--;
685}
686static void test_destructor(
687 sqlite3_context *pCtx,
688 int nArg,
689 sqlite3_value **argv
690){
691 char *zVal;
danielk1977f4618892004-06-28 13:09:11 +0000692 int len;
drh9bb575f2004-09-06 17:24:11 +0000693 sqlite3 *db = sqlite3_user_data(pCtx);
danielk1977f4618892004-06-28 13:09:11 +0000694
danielk1977d8123362004-06-12 09:25:12 +0000695 test_destructor_count_var++;
696 assert( nArg==1 );
697 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
danielk1977f4618892004-06-28 13:09:11 +0000698 len = sqlite3ValueBytes(argv[0], db->enc);
699 zVal = sqliteMalloc(len+3);
700 zVal[len] = 0;
701 zVal[len-1] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000702 assert( zVal );
703 zVal++;
danielk1977f4618892004-06-28 13:09:11 +0000704 memcpy(zVal, sqlite3ValueText(argv[0], db->enc), len);
705 if( db->enc==SQLITE_UTF8 ){
706 sqlite3_result_text(pCtx, zVal, -1, destructor);
707 }else if( db->enc==SQLITE_UTF16LE ){
708 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
709 }else{
710 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
711 }
danielk1977d8123362004-06-12 09:25:12 +0000712}
713static void test_destructor_count(
714 sqlite3_context *pCtx,
715 int nArg,
716 sqlite3_value **argv
717){
718 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +0000719}
drh0e3d7472004-06-19 17:33:07 +0000720#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +0000721
drh0e3d7472004-06-19 17:33:07 +0000722#ifdef SQLITE_TEST
723/*
724** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
725** interface.
726**
727** The test_auxdata() SQL function attempts to register each of its arguments
728** as auxiliary data. If there are no prior registrations of aux data for
729** that argument (meaning the argument is not a constant or this is its first
730** call) then the result for that argument is 0. If there is a prior
731** registration, the result for that argument is 1. The overall result
732** is the individual argument results separated by spaces.
733*/
danielk19773f6b0872004-06-17 05:36:44 +0000734static void free_test_auxdata(void *p) {sqliteFree(p);}
735static void test_auxdata(
736 sqlite3_context *pCtx,
737 int nArg,
738 sqlite3_value **argv
739){
740 int i;
741 char *zRet = sqliteMalloc(nArg*2);
742 if( !zRet ) return;
743 for(i=0; i<nArg; i++){
744 char const *z = sqlite3_value_text(argv[i]);
745 if( z ){
746 char *zAux = sqlite3_get_auxdata(pCtx, i);
747 if( zAux ){
748 zRet[i*2] = '1';
749 if( strcmp(zAux, z) ){
750 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
751 return;
752 }
753 }else{
754 zRet[i*2] = '0';
755 zAux = sqliteStrDup(z);
756 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
757 }
758 zRet[i*2+1] = ' ';
759 }
760 }
761 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
762}
drh0e3d7472004-06-19 17:33:07 +0000763#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +0000764
drh0ac65892002-04-20 14:24:41 +0000765/*
drhd3a149e2002-02-24 17:12:53 +0000766** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +0000767** sum() or avg() aggregate computation.
768*/
769typedef struct SumCtx SumCtx;
770struct SumCtx {
771 double sum; /* Sum of terms */
drh739105c2002-05-29 23:22:23 +0000772 int cnt; /* Number of elements summed */
drhdd5baa92002-02-27 19:50:59 +0000773};
774
775/*
776** Routines used to compute the sum or average.
777*/
danielk19770ae8b832004-05-25 12:05:56 +0000778static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +0000779 SumCtx *p;
drhdd5baa92002-02-27 19:50:59 +0000780 if( argc<1 ) return;
drh4f26d6c2004-05-26 23:25:30 +0000781 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +0000782 if( p && SQLITE_NULL!=sqlite3_value_type(argv[0]) ){
drh4f26d6c2004-05-26 23:25:30 +0000783 p->sum += sqlite3_value_double(argv[0]);
drh739105c2002-05-29 23:22:23 +0000784 p->cnt++;
785 }
drhdd5baa92002-02-27 19:50:59 +0000786}
danielk19770ae8b832004-05-25 12:05:56 +0000787static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +0000788 SumCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000789 p = sqlite3_aggregate_context(context, sizeof(*p));
danielk19777e18c252004-05-25 11:47:24 +0000790 sqlite3_result_double(context, p ? p->sum : 0.0);
drhdd5baa92002-02-27 19:50:59 +0000791}
danielk19770ae8b832004-05-25 12:05:56 +0000792static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +0000793 SumCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000794 p = sqlite3_aggregate_context(context, sizeof(*p));
drh739105c2002-05-29 23:22:23 +0000795 if( p && p->cnt>0 ){
danielk19777e18c252004-05-25 11:47:24 +0000796 sqlite3_result_double(context, p->sum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +0000797 }
798}
799
800/*
801** An instance of the following structure holds the context of a
drha2ed5602002-02-26 23:55:31 +0000802** variance or standard deviation computation.
drhd3a149e2002-02-24 17:12:53 +0000803*/
804typedef struct StdDevCtx StdDevCtx;
805struct StdDevCtx {
806 double sum; /* Sum of terms */
807 double sum2; /* Sum of the squares of terms */
drh739105c2002-05-29 23:22:23 +0000808 int cnt; /* Number of terms counted */
drhd3a149e2002-02-24 17:12:53 +0000809};
810
drhef2daf52002-03-04 02:26:15 +0000811#if 0 /* Omit because math library is required */
drhd3a149e2002-02-24 17:12:53 +0000812/*
813** Routines used to compute the standard deviation as an aggregate.
814*/
danielk19770ae8b832004-05-25 12:05:56 +0000815static void stdDevStep(sqlite3_context *context, int argc, const char **argv){
drhd3a149e2002-02-24 17:12:53 +0000816 StdDevCtx *p;
817 double x;
drh1350b032002-02-27 19:00:20 +0000818 if( argc<1 ) return;
danielk197724b03fd2004-05-10 10:34:34 +0000819 p = sqlite3_aggregate_context(context, sizeof(*p));
drh739105c2002-05-29 23:22:23 +0000820 if( p && argv[0] ){
danielk19774adee202004-05-08 08:23:19 +0000821 x = sqlite3AtoF(argv[0], 0);
drh739105c2002-05-29 23:22:23 +0000822 p->sum += x;
823 p->sum2 += x*x;
824 p->cnt++;
825 }
drhd3a149e2002-02-24 17:12:53 +0000826}
danielk19770ae8b832004-05-25 12:05:56 +0000827static void stdDevFinalize(sqlite3_context *context){
danielk197724b03fd2004-05-10 10:34:34 +0000828 double rN = sqlite3_aggregate_count(context);
829 StdDevCtx *p = sqlite3_aggregate_context(context, sizeof(*p));
drh739105c2002-05-29 23:22:23 +0000830 if( p && p->cnt>1 ){
831 double rCnt = cnt;
danielk197724b03fd2004-05-10 10:34:34 +0000832 sqlite3_set_result_double(context,
drh739105c2002-05-29 23:22:23 +0000833 sqrt((p->sum2 - p->sum*p->sum/rCnt)/(rCnt-1.0)));
drhd3a149e2002-02-24 17:12:53 +0000834 }
drhd3a149e2002-02-24 17:12:53 +0000835}
drhef2daf52002-03-04 02:26:15 +0000836#endif
drhd3a149e2002-02-24 17:12:53 +0000837
drh0bce8352002-02-28 00:41:10 +0000838/*
839** The following structure keeps track of state information for the
840** count() aggregate function.
841*/
842typedef struct CountCtx CountCtx;
843struct CountCtx {
844 int n;
845};
drhdd5baa92002-02-27 19:50:59 +0000846
drh0bce8352002-02-28 00:41:10 +0000847/*
848** Routines to implement the count() aggregate function.
849*/
danielk19770ae8b832004-05-25 12:05:56 +0000850static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000851 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000852 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +0000853 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +0000854 p->n++;
855 }
856}
danielk19770ae8b832004-05-25 12:05:56 +0000857static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +0000858 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000859 p = sqlite3_aggregate_context(context, sizeof(*p));
drhf4479502004-05-27 03:12:53 +0000860 sqlite3_result_int(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +0000861}
862
863/*
864** This function tracks state information for the min() and max()
865** aggregate functions.
866*/
867typedef struct MinMaxCtx MinMaxCtx;
868struct MinMaxCtx {
869 char *z; /* The best so far */
870 char zBuf[28]; /* Space that can be used for storage */
871};
872
873/*
874** Routines to implement min() and max() aggregate functions.
875*/
danielk19770ae8b832004-05-25 12:05:56 +0000876static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +0000877 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +0000878 Mem *pBest;
879
880 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
881 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +0000882 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +0000883
danielk197788208052004-05-25 01:13:20 +0000884 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +0000885 int max;
886 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +0000887 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +0000888 /* This step function is used for both the min() and max() aggregates,
889 ** the only difference between the two being that the sense of the
890 ** comparison is inverted. For the max() aggregate, the
891 ** sqlite3_user_data() function returns (void *)-1. For min() it
892 ** returns (void *)db, where db is the sqlite3* database pointer.
893 ** Therefore the next statement sets variable 'max' to 1 for the max()
894 ** aggregate, or 0 for min().
895 */
danielk197788208052004-05-25 01:13:20 +0000896 max = ((sqlite3_user_data(context)==(void *)-1)?1:0);
danielk1977dc1bdc42004-06-11 10:51:27 +0000897 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +0000898 if( (max && cmp<0) || (!max && cmp>0) ){
danielk19777e18c252004-05-25 11:47:24 +0000899 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +0000900 }
drh268380c2004-02-25 13:47:31 +0000901 }else{
danielk19777e18c252004-05-25 11:47:24 +0000902 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +0000903 }
904}
danielk19770ae8b832004-05-25 12:05:56 +0000905static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +0000906 sqlite3_value *pRes;
drh4f26d6c2004-05-26 23:25:30 +0000907 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, sizeof(Mem));
danielk197788208052004-05-25 01:13:20 +0000908 if( pRes->flags ){
drhf4479502004-05-27 03:12:53 +0000909 sqlite3_result_value(context, pRes);
drh0bce8352002-02-28 00:41:10 +0000910 }
danielk1977b20e56b2004-06-15 13:36:30 +0000911 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +0000912}
drhdd5baa92002-02-27 19:50:59 +0000913
drh4e5ffc52004-08-31 00:52:37 +0000914
drhd3a149e2002-02-24 17:12:53 +0000915/*
drha2ed5602002-02-26 23:55:31 +0000916** This function registered all of the above C functions as SQL
917** functions. This should be the only routine in this file with
918** external linkage.
drhdc04c582002-02-24 01:55:15 +0000919*/
drh9bb575f2004-09-06 17:24:11 +0000920void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh0bce8352002-02-28 00:41:10 +0000921 static struct {
922 char *zName;
drh268380c2004-02-25 13:47:31 +0000923 signed char nArg;
danielk1977f4618892004-06-28 13:09:11 +0000924 u8 argType; /* 0: none. 1: db 2: (-1) */
925 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +0000926 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +0000927 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +0000928 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +0000929 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
930 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
931 { "max", -1, 2, SQLITE_UTF8, 1, minmaxFunc },
932 { "max", 0, 2, SQLITE_UTF8, 1, 0 },
933 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
934 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
935 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
936 { "substr", 3, 0, SQLITE_UTF16LE, 0, sqlite3utf16Substr },
937 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
938 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
939 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
940 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
941 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
942 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
943 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
944 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
945 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
946 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
947 { "like", 2, 0, SQLITE_UTF8, 0, likeFunc },
948 { "glob", 2, 0, SQLITE_UTF8, 0, globFunc },
drh94a98362004-09-13 13:13:18 +0000949 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +0000950 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
951 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
952 { "last_insert_rowid", 0, 1, SQLITE_UTF8, 0, last_insert_rowid },
953 { "changes", 0, 1, SQLITE_UTF8, 0, changes },
954 { "total_changes", 0, 1, SQLITE_UTF8, 0, total_changes },
drhd24cc422003-03-27 12:51:24 +0000955#ifdef SQLITE_SOUNDEX
danielk1977f4618892004-06-28 13:09:11 +0000956 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +0000957#endif
drh193a6b42002-07-07 16:52:46 +0000958#ifdef SQLITE_TEST
danielk1977f4618892004-06-28 13:09:11 +0000959 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
960 { "test_destructor", 1, 1, SQLITE_UTF8, 0, test_destructor},
danielk1977d8123362004-06-12 09:25:12 +0000961 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
danielk1977f4618892004-06-28 13:09:11 +0000962 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
drh193a6b42002-07-07 16:52:46 +0000963#endif
drh0bce8352002-02-28 00:41:10 +0000964 };
965 static struct {
966 char *zName;
drh268380c2004-02-25 13:47:31 +0000967 signed char nArg;
drh268380c2004-02-25 13:47:31 +0000968 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +0000969 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +0000970 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
971 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +0000972 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +0000973 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
974 { "max", 1, 2, 1, minmaxStep, minMaxFinalize },
975 { "sum", 1, 0, 0, sumStep, sumFinalize },
976 { "avg", 1, 0, 0, sumStep, avgFinalize },
977 { "count", 0, 0, 0, countStep, countFinalize },
978 { "count", 1, 0, 0, countStep, countFinalize },
drhef2daf52002-03-04 02:26:15 +0000979#if 0
drhf9b596e2004-05-26 16:54:42 +0000980 { "stddev", 1, 0, stdDevStep, stdDevFinalize },
drhef2daf52002-03-04 02:26:15 +0000981#endif
drh0bce8352002-02-28 00:41:10 +0000982 };
983 int i;
984
985 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
danielk1977c572ef72004-05-27 09:28:41 +0000986 void *pArg = 0;
987 switch( aFuncs[i].argType ){
988 case 1: pArg = db; break;
989 case 2: pArg = (void *)(-1); break;
990 }
danielk1977ad7dd422004-06-06 12:41:49 +0000991 sqlite3_create_function(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +0000992 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +0000993 if( aFuncs[i].needCollSeq ){
994 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
995 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
996 if( pFunc && aFuncs[i].needCollSeq ){
997 pFunc->needCollSeq = 1;
998 }
999 }
drh0bce8352002-02-28 00:41:10 +00001000 }
1001 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
danielk1977c572ef72004-05-27 09:28:41 +00001002 void *pArg = 0;
1003 switch( aAggs[i].argType ){
1004 case 1: pArg = db; break;
1005 case 2: pArg = (void *)(-1); break;
1006 }
danielk1977d8123362004-06-12 09:25:12 +00001007 sqlite3_create_function(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001008 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001009 if( aAggs[i].needCollSeq ){
1010 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001011 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001012 if( pFunc && aAggs[i].needCollSeq ){
1013 pFunc->needCollSeq = 1;
1014 }
1015 }
drh268380c2004-02-25 13:47:31 +00001016 }
danielk19774adee202004-05-08 08:23:19 +00001017 sqlite3RegisterDateTimeFunctions(db);
drhdc04c582002-02-24 01:55:15 +00001018}