blob: e8cea2bbde0def1807fcb6b84637b3ef49a5c7fe [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**
danielk19773aeab9e2004-06-24 00:20:04 +000019** $Id: func.c,v 1.76 2004/06/24 00:20:05 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;
danielk197724b03fd2004-05-10 10:34:34 +000047 mask = (int)sqlite3_user_data(context);
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){
drhdc04c582002-02-24 01:55:15 +0000204 char *z;
205 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++){
211 if( islower(z[i]) ) z[i] = toupper(z[i]);
212 }
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){
drhdc04c582002-02-24 01:55:15 +0000217 char *z;
218 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++){
224 if( isupper(z[i]) ) z[i] = tolower(z[i]);
225 }
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){
danielk197724b03fd2004-05-10 10:34:34 +0000271 sqlite *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){
danielk197724b03fd2004-05-10 10:34:34 +0000284 sqlite *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){
danielk197724b03fd2004-05-10 10:34:34 +0000297 sqlite *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
danielk1977b28af712004-06-21 06:50:26 +0000301#if 0
302
drh6ed41ad2002-04-06 14:10:47 +0000303/*
danielk1977d02eb1f2004-06-06 09:44:03 +0000304** A LIKE pattern compiles to an instance of the following structure. Refer
305** to the comment for compileLike() function for details.
306*/
307struct LikePattern {
308 int nState;
309 struct LikeState {
310 int val; /* Unicode codepoint or -1 for any char i.e. '_' */
311 int failstate; /* State to jump to if next char is not val */
drhf92c7ff2004-06-19 15:40:23 +0000312 } aState[1];
danielk1977d02eb1f2004-06-06 09:44:03 +0000313};
314typedef struct LikePattern LikePattern;
315
316void deleteLike(void *pLike){
317 sqliteFree(pLike);
318}
danielk1977d02eb1f2004-06-06 09:44:03 +0000319/* #define TRACE_LIKE */
danielk1977d02eb1f2004-06-06 09:44:03 +0000320#if defined(TRACE_LIKE) && !defined(NDEBUG)
321char *dumpLike(LikePattern *pLike){
322 int i;
323 int k = 0;
324 char *zBuf = (char *)sqliteMalloc(pLike->nState*40);
325
326 k += sprintf(&zBuf[k], "%d states - ", pLike->nState);
327 for(i=0; i<pLike->nState; i++){
328 k += sprintf(&zBuf[k], " %d:(%d, %d)", i, pLike->aState[i].val,
329 pLike->aState[i].failstate);
330 }
331 return zBuf;
332}
333#endif
334
335/*
336** This function compiles an SQL 'LIKE' pattern into a state machine,
337** represented by a LikePattern structure.
338**
339** Each state of the state-machine has two attributes, 'val' and
340** 'failstate'. The val attribute is either the value of a unicode
341** codepoint, or -1, indicating a '_' wildcard (match any single
342** character). The failstate is either the number of another state
343** or -1, indicating jump to 'no match'.
344**
345** To see if a string matches a pattern the pattern is
346** compiled to a state machine that is executed according to the algorithm
347** below. The string is assumed to be terminated by a 'NUL' character
348** (unicode codepoint 0).
349**
350** 1 S = 0
351** 2 DO
352** 3 C = <Next character from input string>
353** 4 IF( C matches <State S val> )
354** 5 S = S+1
355** 6 ELSE IF( S != <State S failstate> )
356** 7 S = <State S failstate>
357** 8 <Rewind Input string 1 character>
358** 9 WHILE( (C != NUL) AND (S != FAILED) )
359** 10
360** 11 IF( S == <number of states> )
361** 12 RETURN MATCH
362** 13 ELSE
363** 14 RETURN NO-MATCH
364**
365** In practice there is a small optimization to avoid the <Rewind>
366** operation in line 8 of the description above.
367**
368** For example, the following pattern, 'X%ABabc%_Y' is compiled to
369** the state machine below.
370**
371** State Val FailState
372** -------------------------------
373** 0 120 (x) -1 (NO MATCH)
374** 1 97 (a) 1
375** 2 98 (b) 1
376** 3 97 (a) 1
377** 4 98 (b) 2
378** 5 99 (c) 3
379** 6 -1 (_) 6
380** 7 121 (y) 7
381** 8 0 (NUL) 7
382**
383** The algorithms implemented to compile and execute the state machine were
384** first presented in "Fast pattern matching in strings", Knuth, Morris and
385** Pratt, 1977.
386**
387*/
388LikePattern *compileLike(sqlite3_value *pPattern, u8 enc){
389 LikePattern *pLike;
390 struct LikeState *aState;
391 int pc_state = -1; /* State number of previous '%' wild card */
392 int n = 0;
393 int c;
394
395 int offset = 0;
396 const char *zLike;
397
danielk1977dc8453f2004-06-12 00:42:34 +0000398 if( enc==SQLITE_UTF8 ){
danielk1977d02eb1f2004-06-06 09:44:03 +0000399 zLike = sqlite3_value_text(pPattern);
400 n = sqlite3_value_bytes(pPattern) + 1;
401 }else{
402 zLike = sqlite3_value_text16(pPattern);
403 n = sqlite3_value_bytes16(pPattern)/2 + 1;
404 }
405
406 pLike = (LikePattern *)
407 sqliteMalloc(sizeof(LikePattern)+n*sizeof(struct LikeState));
408 aState = pLike->aState;
409
410 n = 0;
411 do {
412 c = sqlite3ReadUniChar(zLike, &offset, &enc, 1);
413 if( c==95 ){ /* A '_' wildcard */
414 aState[n].val = -1;
415 n++;
416 }else if( c==37 ){ /* A '%' wildcard */
417 aState[n].failstate = n;
418 pc_state = n;
419 }else{ /* A regular character */
420 aState[n].val = c;
421
422 assert( pc_state<=n );
423 if( pc_state<0 ){
424 aState[n].failstate = -1;
425 }else if( pc_state==n ){
danielk1977ad7dd422004-06-06 12:41:49 +0000426 if( c ){
427 aState[n].failstate = pc_state;
428 }else{
429 aState[n].failstate = -2;
430 }
danielk1977d02eb1f2004-06-06 09:44:03 +0000431 }else{
432 int k = pLike->aState[n-1].failstate;
433 while( k>pc_state && aState[k+1].val!=-1 && aState[k+1].val!=c ){
434 k = aState[k].failstate;
435 }
436 if( k!=pc_state && aState[k+1].val==c ){
437 assert( k==pc_state );
438 k++;
439 }
440 aState[n].failstate = k;
441 }
442 n++;
443 }
444 }while( c );
445 pLike->nState = n;
446#if defined(TRACE_LIKE) && !defined(NDEBUG)
447 {
448 char *zCompiled = dumpLike(pLike);
449 printf("Pattern=\"%s\" Compiled=\"%s\"\n", zPattern, zCompiled);
450 sqliteFree(zCompiled);
451 }
452#endif
453 return pLike;
454}
455
456/*
drh0ac65892002-04-20 14:24:41 +0000457** Implementation of the like() SQL function. This function implements
458** the build-in LIKE operator. The first argument to the function is the
danielk1977d02eb1f2004-06-06 09:44:03 +0000459** pattern and the second argument is the string. So, the SQL statements:
drh0ac65892002-04-20 14:24:41 +0000460**
461** A LIKE B
462**
danielk1977d02eb1f2004-06-06 09:44:03 +0000463** is implemented as like(B,A).
464**
465** If the pointer retrieved by via a call to sqlite3_user_data() is
466** not NULL, then this function uses UTF-16. Otherwise UTF-8.
drh0ac65892002-04-20 14:24:41 +0000467*/
danielk197751ad0ec2004-05-24 12:39:02 +0000468static void likeFunc(
danielk19770ae8b832004-05-25 12:05:56 +0000469 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000470 int argc,
471 sqlite3_value **argv
472){
danielk1977ad7dd422004-06-06 12:41:49 +0000473 register int c;
danielk1977d02eb1f2004-06-06 09:44:03 +0000474 u8 enc;
475 int offset = 0;
476 const unsigned char *zString;
477 LikePattern *pLike = sqlite3_get_auxdata(context, 0);
danielk1977ad7dd422004-06-06 12:41:49 +0000478 struct LikeState *aState;
479 register struct LikeState *pState;
danielk1977d02eb1f2004-06-06 09:44:03 +0000480
481 /* If either argument is NULL, the result is NULL */
482 if( sqlite3_value_type(argv[1])==SQLITE_NULL ||
483 sqlite3_value_type(argv[0])==SQLITE_NULL ){
484 return;
485 }
486
487 /* If the user-data pointer is NULL, use UTF-8. Otherwise UTF-16. */
488 if( sqlite3_user_data(context) ){
danielk1977dc8453f2004-06-12 00:42:34 +0000489 enc = SQLITE_UTF16NATIVE;
danielk1977d02eb1f2004-06-06 09:44:03 +0000490 zString = (const unsigned char *)sqlite3_value_text16(argv[1]);
danielk1977ad7dd422004-06-06 12:41:49 +0000491 assert(0);
danielk1977d02eb1f2004-06-06 09:44:03 +0000492 }else{
danielk1977dc8453f2004-06-12 00:42:34 +0000493 enc = SQLITE_UTF8;
danielk1977d02eb1f2004-06-06 09:44:03 +0000494 zString = sqlite3_value_text(argv[1]);
495 }
496
497 /* If the LIKE pattern has not been compiled, compile it now. */
498 if( !pLike ){
499 pLike = compileLike(argv[0], enc);
500 if( !pLike ){
501 sqlite3_result_error(context, "out of memory", -1);
502 return;
503 }
504 sqlite3_set_auxdata(context, 0, pLike, deleteLike);
505 }
danielk1977ad7dd422004-06-06 12:41:49 +0000506 aState = pLike->aState;
507 pState = aState;
danielk1977d02eb1f2004-06-06 09:44:03 +0000508
danielk1977d02eb1f2004-06-06 09:44:03 +0000509 do {
danielk1977dc8453f2004-06-12 00:42:34 +0000510 if( enc==SQLITE_UTF8 ){
danielk1977ad7dd422004-06-06 12:41:49 +0000511 c = zString[offset++];
512 if( c&0x80 ){
513 offset--;
514 c = sqlite3ReadUniChar(zString, &offset, &enc, 1);
515 }
516 }else{
517 c = sqlite3ReadUniChar(zString, &offset, &enc, 1);
518 }
519
520skip_read:
danielk1977d02eb1f2004-06-06 09:44:03 +0000521
522#if defined(TRACE_LIKE) && !defined(NDEBUG)
523 printf("State=%d:(%d, %d) Input=%d\n",
danielk1977ad7dd422004-06-06 12:41:49 +0000524 (aState - pState), pState->val, pState->failstate, c);
danielk1977d02eb1f2004-06-06 09:44:03 +0000525#endif
526
danielk1977ad7dd422004-06-06 12:41:49 +0000527 if( pState->val==-1 || pState->val==c ){
528 pState++;
danielk1977d02eb1f2004-06-06 09:44:03 +0000529 }else{
danielk1977ad7dd422004-06-06 12:41:49 +0000530 struct LikeState *pFailState = &aState[pState->failstate];
531 if( pState!=pFailState ){
532 pState = pFailState;
533 if( c && pState>=aState ) goto skip_read;
danielk1977d02eb1f2004-06-06 09:44:03 +0000534 }
535 }
danielk1977ad7dd422004-06-06 12:41:49 +0000536 }while( c && pState>=aState );
danielk1977d02eb1f2004-06-06 09:44:03 +0000537
danielk1977ad7dd422004-06-06 12:41:49 +0000538 if( (pState-aState)==pLike->nState || (pState-aState)<-1 ){
danielk1977d02eb1f2004-06-06 09:44:03 +0000539 sqlite3_result_int(context, 1);
540 }else{
541 sqlite3_result_int(context, 0);
danielk197751ad0ec2004-05-24 12:39:02 +0000542 }
drh0ac65892002-04-20 14:24:41 +0000543}
danielk19773f6b0872004-06-17 05:36:44 +0000544#endif
545
546/*
547** Implementation of the like() SQL function. This function implements
548** the build-in LIKE operator. The first argument to the function is the
549** pattern and the second argument is the string. So, the SQL statements:
550**
551** A LIKE B
552**
553** is implemented as like(B,A).
554**
555** If the pointer retrieved by via a call to sqlite3_user_data() is
556** not NULL, then this function uses UTF-16. Otherwise UTF-8.
557*/
558static void likeFunc(
559 sqlite3_context *context,
560 int argc,
561 sqlite3_value **argv
562){
563 const unsigned char *zA = sqlite3_value_text(argv[0]);
564 const unsigned char *zB = sqlite3_value_text(argv[1]);
565 if( zA && zB ){
566 sqlite3_result_int(context, sqlite3utf8LikeCompare(zA, zB));
567 }
568}
drh0ac65892002-04-20 14:24:41 +0000569
570/*
571** Implementation of the glob() SQL function. This function implements
572** the build-in GLOB operator. The first argument to the function is the
573** string and the second argument is the pattern. So, the SQL statements:
574**
575** A GLOB B
576**
577** is implemented as glob(A,B).
578*/
danielk19770ae8b832004-05-25 12:05:56 +0000579static void globFunc(sqlite3_context *context, int arg, sqlite3_value **argv){
drh4f26d6c2004-05-26 23:25:30 +0000580 const unsigned char *zA = sqlite3_value_text(argv[0]);
581 const unsigned char *zB = sqlite3_value_text(argv[1]);
danielk197751ad0ec2004-05-24 12:39:02 +0000582 if( zA && zB ){
drhf4479502004-05-27 03:12:53 +0000583 sqlite3_result_int(context, sqlite3GlobCompare(zA, zB));
danielk197751ad0ec2004-05-24 12:39:02 +0000584 }
drh8912d102002-05-26 21:34:58 +0000585}
586
587/*
588** Implementation of the NULLIF(x,y) function. The result is the first
589** argument if the arguments are different. The result is NULL if the
590** arguments are equal to each other.
591*/
drhf9b596e2004-05-26 16:54:42 +0000592static void nullifFunc(
593 sqlite3_context *context,
594 int argc,
595 sqlite3_value **argv
596){
danielk1977dc1bdc42004-06-11 10:51:27 +0000597 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
598 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000599 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000600 }
drh0ac65892002-04-20 14:24:41 +0000601}
602
drh647cb0e2002-11-04 19:32:25 +0000603/*
604** Implementation of the VERSION(*) function. The result is the version
605** of the SQLite library that is running.
606*/
drhf9b596e2004-05-26 16:54:42 +0000607static void versionFunc(
608 sqlite3_context *context,
609 int argc,
610 sqlite3_value **argv
611){
danielk1977d8123362004-06-12 09:25:12 +0000612 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000613}
614
drh47394702003-08-20 01:03:33 +0000615/*
616** EXPERIMENTAL - This is not an official function. The interface may
617** change. This function may disappear. Do not write code that depends
618** on this function.
619**
620** Implementation of the QUOTE() function. This function takes a single
621** argument. If the argument is numeric, the return value is the same as
622** the argument. If the argument is NULL, the return value is the string
623** "NULL". Otherwise, the argument is enclosed in single quotes with
624** single-quote escapes.
625*/
danielk19770ae8b832004-05-25 12:05:56 +0000626static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000627 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000628 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000629 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000630 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000631 break;
drh47394702003-08-20 01:03:33 +0000632 }
drh9c054832004-05-31 18:51:57 +0000633 case SQLITE_INTEGER:
634 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000635 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000636 break;
637 }
danielk19773f41e972004-06-08 00:39:01 +0000638 case SQLITE_BLOB: {
639 static const char hexdigits[] = {
640 '0', '1', '2', '3', '4', '5', '6', '7',
641 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
642 };
643 char *zText = 0;
644 int nBlob = sqlite3_value_bytes(argv[0]);
645 char const *zBlob = sqlite3_value_blob(argv[0]);
646
647 zText = (char *)sqliteMalloc((2*nBlob)+4);
648 if( !zText ){
649 sqlite3_result_error(context, "out of memory", -1);
650 }else{
651 int i;
652 for(i=0; i<nBlob; i++){
653 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
654 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
655 }
656 zText[(nBlob*2)+2] = '\'';
657 zText[(nBlob*2)+3] = '\0';
658 zText[0] = 'X';
659 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000660 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
danielk19773f41e972004-06-08 00:39:01 +0000661 sqliteFree(zText);
662 }
663 break;
664 }
drh9c054832004-05-31 18:51:57 +0000665 case SQLITE_TEXT: {
drhf9b596e2004-05-26 16:54:42 +0000666 int i,j,n;
drh4f26d6c2004-05-26 23:25:30 +0000667 const char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000668 char *z;
669
670 for(i=n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
671 z = sqliteMalloc( i+n+3 );
672 if( z==0 ) return;
673 z[0] = '\'';
674 for(i=0, j=1; zArg[i]; i++){
675 z[j++] = zArg[i];
676 if( zArg[i]=='\'' ){
677 z[j++] = '\'';
678 }
679 }
680 z[j++] = '\'';
681 z[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000682 sqlite3_result_text(context, z, j, SQLITE_TRANSIENT);
drhf9b596e2004-05-26 16:54:42 +0000683 sqliteFree(z);
684 }
drh47394702003-08-20 01:03:33 +0000685 }
686}
687
drhd24cc422003-03-27 12:51:24 +0000688#ifdef SQLITE_SOUNDEX
689/*
690** Compute the soundex encoding of a word.
691*/
danielk19770ae8b832004-05-25 12:05:56 +0000692static void soundexFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drhd24cc422003-03-27 12:51:24 +0000693 char zResult[8];
694 const char *zIn;
695 int i, j;
696 static const unsigned char iCode[] = {
697 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
698 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
699 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
700 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
701 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
702 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
703 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
704 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
705 };
706 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +0000707 zIn = sqlite3_value_text(argv[0]);
drhd24cc422003-03-27 12:51:24 +0000708 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
709 if( zIn[i] ){
710 zResult[0] = toupper(zIn[i]);
711 for(j=1; j<4 && zIn[i]; i++){
712 int code = iCode[zIn[i]&0x7f];
713 if( code>0 ){
714 zResult[j++] = code + '0';
715 }
716 }
717 while( j<4 ){
718 zResult[j++] = '0';
719 }
720 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000721 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000722 }else{
danielk1977d8123362004-06-12 09:25:12 +0000723 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000724 }
725}
726#endif
727
drh193a6b42002-07-07 16:52:46 +0000728#ifdef SQLITE_TEST
729/*
730** This function generates a string of random characters. Used for
731** generating test data.
732*/
danielk19770ae8b832004-05-25 12:05:56 +0000733static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +0000734 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +0000735 "abcdefghijklmnopqrstuvwxyz"
736 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
737 "0123456789"
738 ".-!,:*^+=_|?/<> ";
739 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +0000740 unsigned char zBuf[1000];
drh193a6b42002-07-07 16:52:46 +0000741 if( argc>=1 ){
drhf9b596e2004-05-26 16:54:42 +0000742 iMin = sqlite3_value_int(argv[0]);
drh193a6b42002-07-07 16:52:46 +0000743 if( iMin<0 ) iMin = 0;
744 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
745 }else{
746 iMin = 1;
747 }
748 if( argc>=2 ){
drhf9b596e2004-05-26 16:54:42 +0000749 iMax = sqlite3_value_int(argv[1]);
drh193a6b42002-07-07 16:52:46 +0000750 if( iMax<iMin ) iMax = iMin;
drh1dba7272004-01-16 13:58:18 +0000751 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +0000752 }else{
753 iMax = 50;
754 }
755 n = iMin;
756 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +0000757 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +0000758 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +0000759 n += r%(iMax + 1 - iMin);
760 }
drh1dba7272004-01-16 13:58:18 +0000761 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +0000762 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +0000763 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +0000764 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +0000765 }
766 zBuf[n] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000767 sqlite3_result_text(context, zBuf, n, SQLITE_TRANSIENT);
768}
drh0e3d7472004-06-19 17:33:07 +0000769#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +0000770
drh0e3d7472004-06-19 17:33:07 +0000771#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +0000772/*
773** The following two SQL functions are used to test returning a text
774** result with a destructor. Function 'test_destructor' takes one argument
775** and returns the same argument interpreted as TEXT. A destructor is
776** passed with the sqlite3_result_text() call.
777**
778** SQL function 'test_destructor_count' returns the number of outstanding
779** allocations made by 'test_destructor';
780**
781** WARNING: Not threadsafe.
782*/
783static int test_destructor_count_var = 0;
784static void destructor(void *p){
785 char *zVal = (char *)p;
786 assert(zVal);
787 zVal--;
788 sqliteFree(zVal);
789 test_destructor_count_var--;
790}
791static void test_destructor(
792 sqlite3_context *pCtx,
793 int nArg,
794 sqlite3_value **argv
795){
796 char *zVal;
797 test_destructor_count_var++;
798 assert( nArg==1 );
799 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
800 zVal = sqliteMalloc(sqlite3_value_bytes(argv[0]) + 2);
801 assert( zVal );
802 zVal++;
803 strcpy(zVal, sqlite3_value_text(argv[0]));
804 sqlite3_result_text(pCtx, zVal, -1, destructor);
805}
806static void test_destructor_count(
807 sqlite3_context *pCtx,
808 int nArg,
809 sqlite3_value **argv
810){
811 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +0000812}
drh0e3d7472004-06-19 17:33:07 +0000813#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +0000814
drh0e3d7472004-06-19 17:33:07 +0000815#ifdef SQLITE_TEST
816/*
817** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
818** interface.
819**
820** The test_auxdata() SQL function attempts to register each of its arguments
821** as auxiliary data. If there are no prior registrations of aux data for
822** that argument (meaning the argument is not a constant or this is its first
823** call) then the result for that argument is 0. If there is a prior
824** registration, the result for that argument is 1. The overall result
825** is the individual argument results separated by spaces.
826*/
danielk19773f6b0872004-06-17 05:36:44 +0000827static void free_test_auxdata(void *p) {sqliteFree(p);}
828static void test_auxdata(
829 sqlite3_context *pCtx,
830 int nArg,
831 sqlite3_value **argv
832){
833 int i;
834 char *zRet = sqliteMalloc(nArg*2);
835 if( !zRet ) return;
836 for(i=0; i<nArg; i++){
837 char const *z = sqlite3_value_text(argv[i]);
838 if( z ){
839 char *zAux = sqlite3_get_auxdata(pCtx, i);
840 if( zAux ){
841 zRet[i*2] = '1';
842 if( strcmp(zAux, z) ){
843 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
844 return;
845 }
846 }else{
847 zRet[i*2] = '0';
848 zAux = sqliteStrDup(z);
849 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
850 }
851 zRet[i*2+1] = ' ';
852 }
853 }
854 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
855}
drh0e3d7472004-06-19 17:33:07 +0000856#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +0000857
drh0ac65892002-04-20 14:24:41 +0000858/*
drhd3a149e2002-02-24 17:12:53 +0000859** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +0000860** sum() or avg() aggregate computation.
861*/
862typedef struct SumCtx SumCtx;
863struct SumCtx {
864 double sum; /* Sum of terms */
drh739105c2002-05-29 23:22:23 +0000865 int cnt; /* Number of elements summed */
drhdd5baa92002-02-27 19:50:59 +0000866};
867
868/*
869** Routines used to compute the sum or average.
870*/
danielk19770ae8b832004-05-25 12:05:56 +0000871static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +0000872 SumCtx *p;
drhdd5baa92002-02-27 19:50:59 +0000873 if( argc<1 ) return;
drh4f26d6c2004-05-26 23:25:30 +0000874 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +0000875 if( p && SQLITE_NULL!=sqlite3_value_type(argv[0]) ){
drh4f26d6c2004-05-26 23:25:30 +0000876 p->sum += sqlite3_value_double(argv[0]);
drh739105c2002-05-29 23:22:23 +0000877 p->cnt++;
878 }
drhdd5baa92002-02-27 19:50:59 +0000879}
danielk19770ae8b832004-05-25 12:05:56 +0000880static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +0000881 SumCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000882 p = sqlite3_aggregate_context(context, sizeof(*p));
danielk19777e18c252004-05-25 11:47:24 +0000883 sqlite3_result_double(context, p ? p->sum : 0.0);
drhdd5baa92002-02-27 19:50:59 +0000884}
danielk19770ae8b832004-05-25 12:05:56 +0000885static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +0000886 SumCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000887 p = sqlite3_aggregate_context(context, sizeof(*p));
drh739105c2002-05-29 23:22:23 +0000888 if( p && p->cnt>0 ){
danielk19777e18c252004-05-25 11:47:24 +0000889 sqlite3_result_double(context, p->sum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +0000890 }
891}
892
893/*
894** An instance of the following structure holds the context of a
drha2ed5602002-02-26 23:55:31 +0000895** variance or standard deviation computation.
drhd3a149e2002-02-24 17:12:53 +0000896*/
897typedef struct StdDevCtx StdDevCtx;
898struct StdDevCtx {
899 double sum; /* Sum of terms */
900 double sum2; /* Sum of the squares of terms */
drh739105c2002-05-29 23:22:23 +0000901 int cnt; /* Number of terms counted */
drhd3a149e2002-02-24 17:12:53 +0000902};
903
drhef2daf52002-03-04 02:26:15 +0000904#if 0 /* Omit because math library is required */
drhd3a149e2002-02-24 17:12:53 +0000905/*
906** Routines used to compute the standard deviation as an aggregate.
907*/
danielk19770ae8b832004-05-25 12:05:56 +0000908static void stdDevStep(sqlite3_context *context, int argc, const char **argv){
drhd3a149e2002-02-24 17:12:53 +0000909 StdDevCtx *p;
910 double x;
drh1350b032002-02-27 19:00:20 +0000911 if( argc<1 ) return;
danielk197724b03fd2004-05-10 10:34:34 +0000912 p = sqlite3_aggregate_context(context, sizeof(*p));
drh739105c2002-05-29 23:22:23 +0000913 if( p && argv[0] ){
danielk19774adee202004-05-08 08:23:19 +0000914 x = sqlite3AtoF(argv[0], 0);
drh739105c2002-05-29 23:22:23 +0000915 p->sum += x;
916 p->sum2 += x*x;
917 p->cnt++;
918 }
drhd3a149e2002-02-24 17:12:53 +0000919}
danielk19770ae8b832004-05-25 12:05:56 +0000920static void stdDevFinalize(sqlite3_context *context){
danielk197724b03fd2004-05-10 10:34:34 +0000921 double rN = sqlite3_aggregate_count(context);
922 StdDevCtx *p = sqlite3_aggregate_context(context, sizeof(*p));
drh739105c2002-05-29 23:22:23 +0000923 if( p && p->cnt>1 ){
924 double rCnt = cnt;
danielk197724b03fd2004-05-10 10:34:34 +0000925 sqlite3_set_result_double(context,
drh739105c2002-05-29 23:22:23 +0000926 sqrt((p->sum2 - p->sum*p->sum/rCnt)/(rCnt-1.0)));
drhd3a149e2002-02-24 17:12:53 +0000927 }
drhd3a149e2002-02-24 17:12:53 +0000928}
drhef2daf52002-03-04 02:26:15 +0000929#endif
drhd3a149e2002-02-24 17:12:53 +0000930
drh0bce8352002-02-28 00:41:10 +0000931/*
932** The following structure keeps track of state information for the
933** count() aggregate function.
934*/
935typedef struct CountCtx CountCtx;
936struct CountCtx {
937 int n;
938};
drhdd5baa92002-02-27 19:50:59 +0000939
drh0bce8352002-02-28 00:41:10 +0000940/*
941** Routines to implement the count() aggregate function.
942*/
danielk19770ae8b832004-05-25 12:05:56 +0000943static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000944 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000945 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +0000946 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +0000947 p->n++;
948 }
949}
danielk19770ae8b832004-05-25 12:05:56 +0000950static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +0000951 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000952 p = sqlite3_aggregate_context(context, sizeof(*p));
drhf4479502004-05-27 03:12:53 +0000953 sqlite3_result_int(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +0000954}
955
956/*
957** This function tracks state information for the min() and max()
958** aggregate functions.
959*/
960typedef struct MinMaxCtx MinMaxCtx;
961struct MinMaxCtx {
962 char *z; /* The best so far */
963 char zBuf[28]; /* Space that can be used for storage */
964};
965
966/*
967** Routines to implement min() and max() aggregate functions.
968*/
danielk19770ae8b832004-05-25 12:05:56 +0000969static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +0000970 int max = 0;
971 int cmp = 0;
972 Mem *pArg = (Mem *)argv[0];
drh4f26d6c2004-05-26 23:25:30 +0000973 Mem *pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +0000974 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +0000975
danielk197788208052004-05-25 01:13:20 +0000976 if( pBest->flags ){
danielk1977dc1bdc42004-06-11 10:51:27 +0000977 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +0000978 /* This step function is used for both the min() and max() aggregates,
979 ** the only difference between the two being that the sense of the
980 ** comparison is inverted. For the max() aggregate, the
981 ** sqlite3_user_data() function returns (void *)-1. For min() it
982 ** returns (void *)db, where db is the sqlite3* database pointer.
983 ** Therefore the next statement sets variable 'max' to 1 for the max()
984 ** aggregate, or 0 for min().
985 */
danielk197788208052004-05-25 01:13:20 +0000986 max = ((sqlite3_user_data(context)==(void *)-1)?1:0);
danielk1977dc1bdc42004-06-11 10:51:27 +0000987 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +0000988 if( (max && cmp<0) || (!max && cmp>0) ){
danielk19777e18c252004-05-25 11:47:24 +0000989 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +0000990 }
drh268380c2004-02-25 13:47:31 +0000991 }else{
danielk19777e18c252004-05-25 11:47:24 +0000992 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +0000993 }
994}
danielk19770ae8b832004-05-25 12:05:56 +0000995static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +0000996 sqlite3_value *pRes;
drh4f26d6c2004-05-26 23:25:30 +0000997 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, sizeof(Mem));
danielk197788208052004-05-25 01:13:20 +0000998 if( pRes->flags ){
drhf4479502004-05-27 03:12:53 +0000999 sqlite3_result_value(context, pRes);
drh0bce8352002-02-28 00:41:10 +00001000 }
danielk1977b20e56b2004-06-15 13:36:30 +00001001 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001002}
drhdd5baa92002-02-27 19:50:59 +00001003
drhd3a149e2002-02-24 17:12:53 +00001004/*
drha2ed5602002-02-26 23:55:31 +00001005** This function registered all of the above C functions as SQL
1006** functions. This should be the only routine in this file with
1007** external linkage.
drhdc04c582002-02-24 01:55:15 +00001008*/
danielk19774adee202004-05-08 08:23:19 +00001009void sqlite3RegisterBuiltinFunctions(sqlite *db){
drh0bce8352002-02-28 00:41:10 +00001010 static struct {
1011 char *zName;
drh268380c2004-02-25 13:47:31 +00001012 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001013 u8 argType; /* 0: none. 1: db 2: (-1) */
danielk1977d02eb1f2004-06-06 09:44:03 +00001014 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001015 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001016 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001017 } aFuncs[] = {
danielk1977d8123362004-06-12 09:25:12 +00001018 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1019 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
1020 { "max", -1, 2, SQLITE_UTF8, 1, minmaxFunc },
1021 { "max", 0, 2, SQLITE_UTF8, 1, 0 },
1022 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1023 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
1024 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
1025 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1026 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1027 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1028 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1029 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1030 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1031 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1032 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
1033 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1034 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
1035 { "like", 2, 0, SQLITE_UTF8, 0, likeFunc },
danielk19773f6b0872004-06-17 05:36:44 +00001036/* { "like", 2, 2, SQLITE_UTF16,0, likeFunc }, */
danielk1977d8123362004-06-12 09:25:12 +00001037 { "glob", 2, 0, SQLITE_UTF8, 0, globFunc },
1038 { "nullif", 2, 0, SQLITE_UTF8, 0, nullifFunc },
1039 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1040 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
1041 { "last_insert_rowid", 0, 1, SQLITE_UTF8, 0, last_insert_rowid },
danielk1977b28af712004-06-21 06:50:26 +00001042 { "changes", 0, 1, SQLITE_UTF8, 0, changes },
1043 { "total_changes", 0, 1, SQLITE_UTF8, 0, total_changes },
drhd24cc422003-03-27 12:51:24 +00001044#ifdef SQLITE_SOUNDEX
danielk1977d8123362004-06-12 09:25:12 +00001045 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001046#endif
drh193a6b42002-07-07 16:52:46 +00001047#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +00001048 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1049 { "test_destructor", 1, 0, SQLITE_UTF8, 0, test_destructor},
1050 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
danielk19773f6b0872004-06-17 05:36:44 +00001051 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
drh193a6b42002-07-07 16:52:46 +00001052#endif
drh0bce8352002-02-28 00:41:10 +00001053 };
1054 static struct {
1055 char *zName;
drh268380c2004-02-25 13:47:31 +00001056 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001057 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001058 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001059 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1060 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001061 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001062 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
1063 { "max", 1, 2, 1, minmaxStep, minMaxFinalize },
1064 { "sum", 1, 0, 0, sumStep, sumFinalize },
1065 { "avg", 1, 0, 0, sumStep, avgFinalize },
1066 { "count", 0, 0, 0, countStep, countFinalize },
1067 { "count", 1, 0, 0, countStep, countFinalize },
drhef2daf52002-03-04 02:26:15 +00001068#if 0
drhf9b596e2004-05-26 16:54:42 +00001069 { "stddev", 1, 0, stdDevStep, stdDevFinalize },
drhef2daf52002-03-04 02:26:15 +00001070#endif
drh0bce8352002-02-28 00:41:10 +00001071 };
1072 int i;
1073
1074 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
danielk1977c572ef72004-05-27 09:28:41 +00001075 void *pArg = 0;
1076 switch( aFuncs[i].argType ){
1077 case 1: pArg = db; break;
1078 case 2: pArg = (void *)(-1); break;
1079 }
danielk1977ad7dd422004-06-06 12:41:49 +00001080 sqlite3_create_function(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001081 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001082 if( aFuncs[i].needCollSeq ){
1083 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1084 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1085 if( pFunc && aFuncs[i].needCollSeq ){
1086 pFunc->needCollSeq = 1;
1087 }
1088 }
drh0bce8352002-02-28 00:41:10 +00001089 }
1090 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
danielk1977c572ef72004-05-27 09:28:41 +00001091 void *pArg = 0;
1092 switch( aAggs[i].argType ){
1093 case 1: pArg = db; break;
1094 case 2: pArg = (void *)(-1); break;
1095 }
danielk1977d8123362004-06-12 09:25:12 +00001096 sqlite3_create_function(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001097 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001098 if( aAggs[i].needCollSeq ){
1099 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001100 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001101 if( pFunc && aAggs[i].needCollSeq ){
1102 pFunc->needCollSeq = 1;
1103 }
1104 }
drh268380c2004-02-25 13:47:31 +00001105 }
danielk19774adee202004-05-08 08:23:19 +00001106 sqlite3RegisterDateTimeFunctions(db);
drhdc04c582002-02-24 01:55:15 +00001107}