blob: bad96d2a17f4a02e1300f37a4fab80b42bdcd399 [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**
drh4c755c02004-08-08 20:22:17 +000019** $Id: func.c,v 1.80 2004/08/08 20:22:18 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;
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){
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){
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];
drh4c755c02004-08-08 20:22:17 +0000694 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000695 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 );
drh4c755c02004-08-08 20:22:17 +0000707 zIn = (u8*)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;
danielk1977f4618892004-06-28 13:09:11 +0000797 int len;
798 sqlite *db = sqlite3_user_data(pCtx);
799
danielk1977d8123362004-06-12 09:25:12 +0000800 test_destructor_count_var++;
801 assert( nArg==1 );
802 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
danielk1977f4618892004-06-28 13:09:11 +0000803 len = sqlite3ValueBytes(argv[0], db->enc);
804 zVal = sqliteMalloc(len+3);
805 zVal[len] = 0;
806 zVal[len-1] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000807 assert( zVal );
808 zVal++;
danielk1977f4618892004-06-28 13:09:11 +0000809 memcpy(zVal, sqlite3ValueText(argv[0], db->enc), len);
810 if( db->enc==SQLITE_UTF8 ){
811 sqlite3_result_text(pCtx, zVal, -1, destructor);
812 }else if( db->enc==SQLITE_UTF16LE ){
813 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
814 }else{
815 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
816 }
danielk1977d8123362004-06-12 09:25:12 +0000817}
818static void test_destructor_count(
819 sqlite3_context *pCtx,
820 int nArg,
821 sqlite3_value **argv
822){
823 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +0000824}
drh0e3d7472004-06-19 17:33:07 +0000825#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +0000826
drh0e3d7472004-06-19 17:33:07 +0000827#ifdef SQLITE_TEST
828/*
829** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
830** interface.
831**
832** The test_auxdata() SQL function attempts to register each of its arguments
833** as auxiliary data. If there are no prior registrations of aux data for
834** that argument (meaning the argument is not a constant or this is its first
835** call) then the result for that argument is 0. If there is a prior
836** registration, the result for that argument is 1. The overall result
837** is the individual argument results separated by spaces.
838*/
danielk19773f6b0872004-06-17 05:36:44 +0000839static void free_test_auxdata(void *p) {sqliteFree(p);}
840static void test_auxdata(
841 sqlite3_context *pCtx,
842 int nArg,
843 sqlite3_value **argv
844){
845 int i;
846 char *zRet = sqliteMalloc(nArg*2);
847 if( !zRet ) return;
848 for(i=0; i<nArg; i++){
849 char const *z = sqlite3_value_text(argv[i]);
850 if( z ){
851 char *zAux = sqlite3_get_auxdata(pCtx, i);
852 if( zAux ){
853 zRet[i*2] = '1';
854 if( strcmp(zAux, z) ){
855 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
856 return;
857 }
858 }else{
859 zRet[i*2] = '0';
860 zAux = sqliteStrDup(z);
861 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
862 }
863 zRet[i*2+1] = ' ';
864 }
865 }
866 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
867}
drh0e3d7472004-06-19 17:33:07 +0000868#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +0000869
drh0ac65892002-04-20 14:24:41 +0000870/*
drhd3a149e2002-02-24 17:12:53 +0000871** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +0000872** sum() or avg() aggregate computation.
873*/
874typedef struct SumCtx SumCtx;
875struct SumCtx {
876 double sum; /* Sum of terms */
drh739105c2002-05-29 23:22:23 +0000877 int cnt; /* Number of elements summed */
drhdd5baa92002-02-27 19:50:59 +0000878};
879
880/*
881** Routines used to compute the sum or average.
882*/
danielk19770ae8b832004-05-25 12:05:56 +0000883static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +0000884 SumCtx *p;
drhdd5baa92002-02-27 19:50:59 +0000885 if( argc<1 ) return;
drh4f26d6c2004-05-26 23:25:30 +0000886 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +0000887 if( p && SQLITE_NULL!=sqlite3_value_type(argv[0]) ){
drh4f26d6c2004-05-26 23:25:30 +0000888 p->sum += sqlite3_value_double(argv[0]);
drh739105c2002-05-29 23:22:23 +0000889 p->cnt++;
890 }
drhdd5baa92002-02-27 19:50:59 +0000891}
danielk19770ae8b832004-05-25 12:05:56 +0000892static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +0000893 SumCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000894 p = sqlite3_aggregate_context(context, sizeof(*p));
danielk19777e18c252004-05-25 11:47:24 +0000895 sqlite3_result_double(context, p ? p->sum : 0.0);
drhdd5baa92002-02-27 19:50:59 +0000896}
danielk19770ae8b832004-05-25 12:05:56 +0000897static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +0000898 SumCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000899 p = sqlite3_aggregate_context(context, sizeof(*p));
drh739105c2002-05-29 23:22:23 +0000900 if( p && p->cnt>0 ){
danielk19777e18c252004-05-25 11:47:24 +0000901 sqlite3_result_double(context, p->sum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +0000902 }
903}
904
905/*
906** An instance of the following structure holds the context of a
drha2ed5602002-02-26 23:55:31 +0000907** variance or standard deviation computation.
drhd3a149e2002-02-24 17:12:53 +0000908*/
909typedef struct StdDevCtx StdDevCtx;
910struct StdDevCtx {
911 double sum; /* Sum of terms */
912 double sum2; /* Sum of the squares of terms */
drh739105c2002-05-29 23:22:23 +0000913 int cnt; /* Number of terms counted */
drhd3a149e2002-02-24 17:12:53 +0000914};
915
drhef2daf52002-03-04 02:26:15 +0000916#if 0 /* Omit because math library is required */
drhd3a149e2002-02-24 17:12:53 +0000917/*
918** Routines used to compute the standard deviation as an aggregate.
919*/
danielk19770ae8b832004-05-25 12:05:56 +0000920static void stdDevStep(sqlite3_context *context, int argc, const char **argv){
drhd3a149e2002-02-24 17:12:53 +0000921 StdDevCtx *p;
922 double x;
drh1350b032002-02-27 19:00:20 +0000923 if( argc<1 ) return;
danielk197724b03fd2004-05-10 10:34:34 +0000924 p = sqlite3_aggregate_context(context, sizeof(*p));
drh739105c2002-05-29 23:22:23 +0000925 if( p && argv[0] ){
danielk19774adee202004-05-08 08:23:19 +0000926 x = sqlite3AtoF(argv[0], 0);
drh739105c2002-05-29 23:22:23 +0000927 p->sum += x;
928 p->sum2 += x*x;
929 p->cnt++;
930 }
drhd3a149e2002-02-24 17:12:53 +0000931}
danielk19770ae8b832004-05-25 12:05:56 +0000932static void stdDevFinalize(sqlite3_context *context){
danielk197724b03fd2004-05-10 10:34:34 +0000933 double rN = sqlite3_aggregate_count(context);
934 StdDevCtx *p = sqlite3_aggregate_context(context, sizeof(*p));
drh739105c2002-05-29 23:22:23 +0000935 if( p && p->cnt>1 ){
936 double rCnt = cnt;
danielk197724b03fd2004-05-10 10:34:34 +0000937 sqlite3_set_result_double(context,
drh739105c2002-05-29 23:22:23 +0000938 sqrt((p->sum2 - p->sum*p->sum/rCnt)/(rCnt-1.0)));
drhd3a149e2002-02-24 17:12:53 +0000939 }
drhd3a149e2002-02-24 17:12:53 +0000940}
drhef2daf52002-03-04 02:26:15 +0000941#endif
drhd3a149e2002-02-24 17:12:53 +0000942
drh0bce8352002-02-28 00:41:10 +0000943/*
944** The following structure keeps track of state information for the
945** count() aggregate function.
946*/
947typedef struct CountCtx CountCtx;
948struct CountCtx {
949 int n;
950};
drhdd5baa92002-02-27 19:50:59 +0000951
drh0bce8352002-02-28 00:41:10 +0000952/*
953** Routines to implement the count() aggregate function.
954*/
danielk19770ae8b832004-05-25 12:05:56 +0000955static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000956 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000957 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +0000958 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +0000959 p->n++;
960 }
961}
danielk19770ae8b832004-05-25 12:05:56 +0000962static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +0000963 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000964 p = sqlite3_aggregate_context(context, sizeof(*p));
drhf4479502004-05-27 03:12:53 +0000965 sqlite3_result_int(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +0000966}
967
968/*
969** This function tracks state information for the min() and max()
970** aggregate functions.
971*/
972typedef struct MinMaxCtx MinMaxCtx;
973struct MinMaxCtx {
974 char *z; /* The best so far */
975 char zBuf[28]; /* Space that can be used for storage */
976};
977
978/*
979** Routines to implement min() and max() aggregate functions.
980*/
danielk19770ae8b832004-05-25 12:05:56 +0000981static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +0000982 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +0000983 Mem *pBest;
984
985 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
986 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +0000987 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +0000988
danielk197788208052004-05-25 01:13:20 +0000989 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +0000990 int max;
991 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +0000992 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +0000993 /* This step function is used for both the min() and max() aggregates,
994 ** the only difference between the two being that the sense of the
995 ** comparison is inverted. For the max() aggregate, the
996 ** sqlite3_user_data() function returns (void *)-1. For min() it
997 ** returns (void *)db, where db is the sqlite3* database pointer.
998 ** Therefore the next statement sets variable 'max' to 1 for the max()
999 ** aggregate, or 0 for min().
1000 */
danielk197788208052004-05-25 01:13:20 +00001001 max = ((sqlite3_user_data(context)==(void *)-1)?1:0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001002 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001003 if( (max && cmp<0) || (!max && cmp>0) ){
danielk19777e18c252004-05-25 11:47:24 +00001004 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001005 }
drh268380c2004-02-25 13:47:31 +00001006 }else{
danielk19777e18c252004-05-25 11:47:24 +00001007 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001008 }
1009}
danielk19770ae8b832004-05-25 12:05:56 +00001010static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001011 sqlite3_value *pRes;
drh4f26d6c2004-05-26 23:25:30 +00001012 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, sizeof(Mem));
danielk197788208052004-05-25 01:13:20 +00001013 if( pRes->flags ){
drhf4479502004-05-27 03:12:53 +00001014 sqlite3_result_value(context, pRes);
drh0bce8352002-02-28 00:41:10 +00001015 }
danielk1977b20e56b2004-06-15 13:36:30 +00001016 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001017}
drhdd5baa92002-02-27 19:50:59 +00001018
drhd3a149e2002-02-24 17:12:53 +00001019/*
drha2ed5602002-02-26 23:55:31 +00001020** This function registered all of the above C functions as SQL
1021** functions. This should be the only routine in this file with
1022** external linkage.
drhdc04c582002-02-24 01:55:15 +00001023*/
danielk19774adee202004-05-08 08:23:19 +00001024void sqlite3RegisterBuiltinFunctions(sqlite *db){
drh0bce8352002-02-28 00:41:10 +00001025 static struct {
1026 char *zName;
drh268380c2004-02-25 13:47:31 +00001027 signed char nArg;
danielk1977f4618892004-06-28 13:09:11 +00001028 u8 argType; /* 0: none. 1: db 2: (-1) */
1029 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001030 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001031 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001032 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001033 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1034 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
1035 { "max", -1, 2, SQLITE_UTF8, 1, minmaxFunc },
1036 { "max", 0, 2, SQLITE_UTF8, 1, 0 },
1037 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1038 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
1039 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
1040 { "substr", 3, 0, SQLITE_UTF16LE, 0, sqlite3utf16Substr },
1041 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1042 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1043 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1044 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1045 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1046 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1047 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1048 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
1049 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1050 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
1051 { "like", 2, 0, SQLITE_UTF8, 0, likeFunc },
1052 { "glob", 2, 0, SQLITE_UTF8, 0, globFunc },
1053 { "nullif", 2, 0, SQLITE_UTF8, 0, nullifFunc },
1054 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1055 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
1056 { "last_insert_rowid", 0, 1, SQLITE_UTF8, 0, last_insert_rowid },
1057 { "changes", 0, 1, SQLITE_UTF8, 0, changes },
1058 { "total_changes", 0, 1, SQLITE_UTF8, 0, total_changes },
drhd24cc422003-03-27 12:51:24 +00001059#ifdef SQLITE_SOUNDEX
danielk1977f4618892004-06-28 13:09:11 +00001060 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001061#endif
drh193a6b42002-07-07 16:52:46 +00001062#ifdef SQLITE_TEST
danielk1977f4618892004-06-28 13:09:11 +00001063 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1064 { "test_destructor", 1, 1, SQLITE_UTF8, 0, test_destructor},
danielk1977d8123362004-06-12 09:25:12 +00001065 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
danielk1977f4618892004-06-28 13:09:11 +00001066 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
drh193a6b42002-07-07 16:52:46 +00001067#endif
drh0bce8352002-02-28 00:41:10 +00001068 };
1069 static struct {
1070 char *zName;
drh268380c2004-02-25 13:47:31 +00001071 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001072 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001073 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001074 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1075 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001076 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001077 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
1078 { "max", 1, 2, 1, minmaxStep, minMaxFinalize },
1079 { "sum", 1, 0, 0, sumStep, sumFinalize },
1080 { "avg", 1, 0, 0, sumStep, avgFinalize },
1081 { "count", 0, 0, 0, countStep, countFinalize },
1082 { "count", 1, 0, 0, countStep, countFinalize },
drhef2daf52002-03-04 02:26:15 +00001083#if 0
drhf9b596e2004-05-26 16:54:42 +00001084 { "stddev", 1, 0, stdDevStep, stdDevFinalize },
drhef2daf52002-03-04 02:26:15 +00001085#endif
drh0bce8352002-02-28 00:41:10 +00001086 };
1087 int i;
1088
1089 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
danielk1977c572ef72004-05-27 09:28:41 +00001090 void *pArg = 0;
1091 switch( aFuncs[i].argType ){
1092 case 1: pArg = db; break;
1093 case 2: pArg = (void *)(-1); break;
1094 }
danielk1977ad7dd422004-06-06 12:41:49 +00001095 sqlite3_create_function(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001096 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001097 if( aFuncs[i].needCollSeq ){
1098 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1099 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1100 if( pFunc && aFuncs[i].needCollSeq ){
1101 pFunc->needCollSeq = 1;
1102 }
1103 }
drh0bce8352002-02-28 00:41:10 +00001104 }
1105 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
danielk1977c572ef72004-05-27 09:28:41 +00001106 void *pArg = 0;
1107 switch( aAggs[i].argType ){
1108 case 1: pArg = db; break;
1109 case 2: pArg = (void *)(-1); break;
1110 }
danielk1977d8123362004-06-12 09:25:12 +00001111 sqlite3_create_function(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001112 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001113 if( aAggs[i].needCollSeq ){
1114 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001115 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001116 if( pFunc && aAggs[i].needCollSeq ){
1117 pFunc->needCollSeq = 1;
1118 }
1119 }
drh268380c2004-02-25 13:47:31 +00001120 }
danielk19774adee202004-05-08 08:23:19 +00001121 sqlite3RegisterDateTimeFunctions(db);
drhdc04c582002-02-24 01:55:15 +00001122}