blob: d13ba437cb0cfa65e9252015ea145f64c1de2f5f [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**
drh5708d2d2005-06-22 10:53:59 +000019** $Id: func.c,v 1.99 2005/06/22 10:53:59 drh Exp $
drhdc04c582002-02-24 01:55:15 +000020*/
drhb659e9b2005-01-28 01:29:08 +000021#include "sqliteInt.h"
drhdc04c582002-02-24 01:55:15 +000022#include <ctype.h>
drhd3a149e2002-02-24 17:12:53 +000023#include <math.h>
24#include <stdlib.h>
drh0bce8352002-02-28 00:41:10 +000025#include <assert.h>
danielk197788208052004-05-25 01:13:20 +000026#include "vdbeInt.h"
drh771d8c32003-08-09 21:32:28 +000027#include "os.h"
drh0bce8352002-02-28 00:41:10 +000028
danielk1977dc1bdc42004-06-11 10:51:27 +000029static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
30 return context->pColl;
31}
32
drh0bce8352002-02-28 00:41:10 +000033/*
34** Implementation of the non-aggregate min() and max() functions
35*/
drhf9b596e2004-05-26 16:54:42 +000036static void minmaxFunc(
37 sqlite3_context *context,
38 int argc,
39 sqlite3_value **argv
40){
drh0bce8352002-02-28 00:41:10 +000041 int i;
drh268380c2004-02-25 13:47:31 +000042 int mask; /* 0 for min() or 0xffffffff for max() */
drhf9b596e2004-05-26 16:54:42 +000043 int iBest;
danielk1977dc1bdc42004-06-11 10:51:27 +000044 CollSeq *pColl;
drh0bce8352002-02-28 00:41:10 +000045
drh89425d52002-02-28 03:04:48 +000046 if( argc==0 ) return;
drhc44af712004-09-02 15:53:56 +000047 mask = sqlite3_user_data(context)==0 ? 0 : -1;
danielk1977dc1bdc42004-06-11 10:51:27 +000048 pColl = sqlite3GetFuncCollSeq(context);
49 assert( pColl );
danielk1977c572ef72004-05-27 09:28:41 +000050 assert( mask==-1 || mask==0 );
drhf9b596e2004-05-26 16:54:42 +000051 iBest = 0;
drh9c054832004-05-31 18:51:57 +000052 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhf9b596e2004-05-26 16:54:42 +000053 for(i=1; i<argc; i++){
drh9c054832004-05-31 18:51:57 +000054 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
danielk1977dc1bdc42004-06-11 10:51:27 +000055 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
drhf9b596e2004-05-26 16:54:42 +000056 iBest = i;
drh0bce8352002-02-28 00:41:10 +000057 }
58 }
drhf4479502004-05-27 03:12:53 +000059 sqlite3_result_value(context, argv[iBest]);
drh0bce8352002-02-28 00:41:10 +000060}
drh0bce8352002-02-28 00:41:10 +000061
drh268380c2004-02-25 13:47:31 +000062/*
63** Return the type of the argument.
64*/
drhf9b596e2004-05-26 16:54:42 +000065static void typeofFunc(
66 sqlite3_context *context,
67 int argc,
68 sqlite3_value **argv
69){
danielk197735bb9d02004-05-24 12:55:54 +000070 const char *z = 0;
danielk197735bb9d02004-05-24 12:55:54 +000071 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000072 case SQLITE_NULL: z = "null"; break;
73 case SQLITE_INTEGER: z = "integer"; break;
74 case SQLITE_TEXT: z = "text"; break;
75 case SQLITE_FLOAT: z = "real"; break;
76 case SQLITE_BLOB: z = "blob"; break;
danielk197735bb9d02004-05-24 12:55:54 +000077 }
danielk1977d8123362004-06-12 09:25:12 +000078 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000079}
80
81/*
drh5708d2d2005-06-22 10:53:59 +000082** Convert the argument to a numeric type.
83*/
84static void numericFunc(
85 sqlite3_context *context,
86 int argc,
87 sqlite3_value **argv
88){
89 const char *z = 0;
90 switch( sqlite3_value_type(argv[0]) ){
91 case SQLITE_NULL: {
92 sqlite3_result_int(context, 0);
93 break;
94 }
95 case SQLITE_INTEGER:
96 case SQLITE_FLOAT: {
97 sqlite3_result_value(context, argv[0]);
98 break;
99 }
100 case SQLITE_TEXT:
101 case SQLITE_BLOB: {
102 z = sqlite3_value_text(argv[0]);
103 while( *z && *z!='.' ){ z++; }
104 if( *z ){
105 sqlite3_result_double(context, sqlite3_value_double(argv[0]));
106 }else{
107 sqlite3_result_int64(context, sqlite3_value_int64(argv[0]));
108 }
109 break;
110 }
111 }
112}
113
114/*
115** Convert the argument to TEXT
116*/
117static void textFunc(
118 sqlite3_context *context,
119 int argc,
120 sqlite3_value **argv
121){
122 switch( sqlite3_value_type(argv[0]) ){
123 case SQLITE_NULL: {
124 sqlite3_result_text(context, "", 0, SQLITE_STATIC);
125 break;
126 }
127 case SQLITE_BLOB:
128 case SQLITE_INTEGER:
129 case SQLITE_FLOAT: {
130 sqlite3_result_text(context, sqlite3_value_text(argv[0]),
131 sqlite3_value_bytes(argv[0]), SQLITE_TRANSIENT);
132 break;
133 }
134 case SQLITE_TEXT: {
135 sqlite3_result_value(context, argv[0]);
136 break;
137 }
138 }
139}
140
141/*
142** Convert the argument to TEXT
143*/
144static void blobFunc(
145 sqlite3_context *context,
146 int argc,
147 sqlite3_value **argv
148){
149 switch( sqlite3_value_type(argv[0]) ){
150 case SQLITE_NULL: {
151 sqlite3_result_blob(context, "", 0, SQLITE_STATIC);
152 break;
153 }
154 case SQLITE_TEXT:
155 case SQLITE_INTEGER:
156 case SQLITE_FLOAT: {
157 sqlite3_result_blob(context, sqlite3_value_text(argv[0]),
158 sqlite3_value_bytes(argv[0]), SQLITE_TRANSIENT);
159 break;
160 }
161 case SQLITE_BLOB: {
162 sqlite3_result_value(context, argv[0]);
163 break;
164 }
165 }
166}
167
168/*
drh0bce8352002-02-28 00:41:10 +0000169** Implementation of the length() function
170*/
drhf9b596e2004-05-26 16:54:42 +0000171static void lengthFunc(
172 sqlite3_context *context,
173 int argc,
174 sqlite3_value **argv
175){
drh0bce8352002-02-28 00:41:10 +0000176 int len;
177
178 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +0000179 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000180 case SQLITE_BLOB:
181 case SQLITE_INTEGER:
182 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000183 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +0000184 break;
185 }
drh9c054832004-05-31 18:51:57 +0000186 case SQLITE_TEXT: {
drh4f26d6c2004-05-26 23:25:30 +0000187 const char *z = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000188 for(len=0; *z; z++){ if( (0xc0&*z)!=0x80 ) len++; }
drhf4479502004-05-27 03:12:53 +0000189 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000190 break;
191 }
192 default: {
193 sqlite3_result_null(context);
194 break;
195 }
196 }
drh0bce8352002-02-28 00:41:10 +0000197}
198
199/*
200** Implementation of the abs() function
201*/
danielk19770ae8b832004-05-25 12:05:56 +0000202static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000203 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +0000204 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000205 case SQLITE_INTEGER: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000206 i64 iVal = sqlite3_value_int64(argv[0]);
207 if( iVal<0 ) iVal = iVal * -1;
208 sqlite3_result_int64(context, iVal);
drhf9b596e2004-05-26 16:54:42 +0000209 break;
210 }
drh9c054832004-05-31 18:51:57 +0000211 case SQLITE_NULL: {
drhf9b596e2004-05-26 16:54:42 +0000212 sqlite3_result_null(context);
213 break;
214 }
215 default: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000216 double rVal = sqlite3_value_double(argv[0]);
217 if( rVal<0 ) rVal = rVal * -1.0;
218 sqlite3_result_double(context, rVal);
drhf9b596e2004-05-26 16:54:42 +0000219 break;
220 }
221 }
drh0bce8352002-02-28 00:41:10 +0000222}
223
224/*
225** Implementation of the substr() function
226*/
drhf9b596e2004-05-26 16:54:42 +0000227static void substrFunc(
228 sqlite3_context *context,
229 int argc,
230 sqlite3_value **argv
231){
drh0bce8352002-02-28 00:41:10 +0000232 const char *z;
drh0bce8352002-02-28 00:41:10 +0000233 const char *z2;
234 int i;
drh0bce8352002-02-28 00:41:10 +0000235 int p1, p2, len;
drhf9b596e2004-05-26 16:54:42 +0000236
drh0bce8352002-02-28 00:41:10 +0000237 assert( argc==3 );
drh4f26d6c2004-05-26 23:25:30 +0000238 z = sqlite3_value_text(argv[0]);
drh0bce8352002-02-28 00:41:10 +0000239 if( z==0 ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000240 p1 = sqlite3_value_int(argv[1]);
241 p2 = sqlite3_value_int(argv[2]);
drh47c8a672002-02-28 04:00:12 +0000242 for(len=0, z2=z; *z2; z2++){ if( (0xc0&*z2)!=0x80 ) len++; }
drh0bce8352002-02-28 00:41:10 +0000243 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000244 p1 += len;
drh653bc752002-02-28 03:31:10 +0000245 if( p1<0 ){
246 p2 += p1;
247 p1 = 0;
248 }
drh0bce8352002-02-28 00:41:10 +0000249 }else if( p1>0 ){
250 p1--;
251 }
252 if( p1+p2>len ){
253 p2 = len-p1;
254 }
drh77396302004-01-02 13:17:48 +0000255 for(i=0; i<p1 && z[i]; i++){
drh47c8a672002-02-28 04:00:12 +0000256 if( (z[i]&0xc0)==0x80 ) p1++;
drh0bce8352002-02-28 00:41:10 +0000257 }
drh47c8a672002-02-28 04:00:12 +0000258 while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p1++; }
drh77396302004-01-02 13:17:48 +0000259 for(; i<p1+p2 && z[i]; i++){
drh47c8a672002-02-28 04:00:12 +0000260 if( (z[i]&0xc0)==0x80 ) p2++;
drh0bce8352002-02-28 00:41:10 +0000261 }
drh47c8a672002-02-28 04:00:12 +0000262 while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p2++; }
drh653bc752002-02-28 03:31:10 +0000263 if( p2<0 ) p2 = 0;
danielk1977d8123362004-06-12 09:25:12 +0000264 sqlite3_result_text(context, &z[p1], p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000265}
266
267/*
268** Implementation of the round() function
269*/
danielk19770ae8b832004-05-25 12:05:56 +0000270static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000271 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000272 double r;
273 char zBuf[100];
274 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000275 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000276 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000277 n = sqlite3_value_int(argv[1]);
278 if( n>30 ) n = 30;
279 if( n<0 ) n = 0;
280 }
drh9c054832004-05-31 18:51:57 +0000281 if( SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh4f26d6c2004-05-26 23:25:30 +0000282 r = sqlite3_value_double(argv[0]);
drh0bce8352002-02-28 00:41:10 +0000283 sprintf(zBuf,"%.*f",n,r);
danielk1977d8123362004-06-12 09:25:12 +0000284 sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000285}
drhdc04c582002-02-24 01:55:15 +0000286
287/*
288** Implementation of the upper() and lower() SQL functions.
289*/
danielk19770ae8b832004-05-25 12:05:56 +0000290static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh8cd9db02004-07-18 23:06:53 +0000291 unsigned char *z;
drhdc04c582002-02-24 01:55:15 +0000292 int i;
drh9c054832004-05-31 18:51:57 +0000293 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
danielk1977c572ef72004-05-27 09:28:41 +0000294 z = sqliteMalloc(sqlite3_value_bytes(argv[0])+1);
drhdc04c582002-02-24 01:55:15 +0000295 if( z==0 ) return;
drh4f26d6c2004-05-26 23:25:30 +0000296 strcpy(z, sqlite3_value_text(argv[0]));
drhdc04c582002-02-24 01:55:15 +0000297 for(i=0; z[i]; i++){
drh4c755c02004-08-08 20:22:17 +0000298 z[i] = toupper(z[i]);
drhdc04c582002-02-24 01:55:15 +0000299 }
danielk1977d8123362004-06-12 09:25:12 +0000300 sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT);
danielk19777e18c252004-05-25 11:47:24 +0000301 sqliteFree(z);
drhdc04c582002-02-24 01:55:15 +0000302}
danielk19770ae8b832004-05-25 12:05:56 +0000303static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh8cd9db02004-07-18 23:06:53 +0000304 unsigned char *z;
drhdc04c582002-02-24 01:55:15 +0000305 int i;
drh9c054832004-05-31 18:51:57 +0000306 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
danielk1977c572ef72004-05-27 09:28:41 +0000307 z = sqliteMalloc(sqlite3_value_bytes(argv[0])+1);
drhdc04c582002-02-24 01:55:15 +0000308 if( z==0 ) return;
drh4f26d6c2004-05-26 23:25:30 +0000309 strcpy(z, sqlite3_value_text(argv[0]));
drhdc04c582002-02-24 01:55:15 +0000310 for(i=0; z[i]; i++){
drh4c755c02004-08-08 20:22:17 +0000311 z[i] = tolower(z[i]);
drhdc04c582002-02-24 01:55:15 +0000312 }
danielk1977d8123362004-06-12 09:25:12 +0000313 sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT);
danielk19777e18c252004-05-25 11:47:24 +0000314 sqliteFree(z);
drhdc04c582002-02-24 01:55:15 +0000315}
316
317/*
drhfbc99082002-02-28 03:14:18 +0000318** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000319** All three do the same thing. They return the first non-NULL
320** argument.
drh3212e182002-02-28 00:46:26 +0000321*/
drhf9b596e2004-05-26 16:54:42 +0000322static void ifnullFunc(
323 sqlite3_context *context,
324 int argc,
325 sqlite3_value **argv
326){
drhfbc99082002-02-28 03:14:18 +0000327 int i;
328 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000329 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000330 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000331 break;
332 }
333 }
drh3212e182002-02-28 00:46:26 +0000334}
335
336/*
drhf9ffac92002-03-02 19:00:31 +0000337** Implementation of random(). Return a random integer.
338*/
drhf9b596e2004-05-26 16:54:42 +0000339static void randomFunc(
340 sqlite3_context *context,
341 int argc,
342 sqlite3_value **argv
343){
drhbbd82df2004-02-11 09:46:30 +0000344 int r;
danielk19774adee202004-05-08 08:23:19 +0000345 sqlite3Randomness(sizeof(r), &r);
drhf4479502004-05-27 03:12:53 +0000346 sqlite3_result_int(context, r);
drhf9ffac92002-03-02 19:00:31 +0000347}
348
349/*
drh6ed41ad2002-04-06 14:10:47 +0000350** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000351** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000352*/
danielk197751ad0ec2004-05-24 12:39:02 +0000353static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000354 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000355 int arg,
356 sqlite3_value **argv
357){
drh9bb575f2004-09-06 17:24:11 +0000358 sqlite3 *db = sqlite3_user_data(context);
drhf9b596e2004-05-26 16:54:42 +0000359 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000360}
361
rdcf146a772004-02-25 22:51:06 +0000362/*
danielk1977b28af712004-06-21 06:50:26 +0000363** Implementation of the changes() SQL function. The return value is the
364** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000365*/
danielk1977b28af712004-06-21 06:50:26 +0000366static void changes(
drhf9b596e2004-05-26 16:54:42 +0000367 sqlite3_context *context,
368 int arg,
369 sqlite3_value **argv
370){
drh9bb575f2004-09-06 17:24:11 +0000371 sqlite3 *db = sqlite3_user_data(context);
drhf4479502004-05-27 03:12:53 +0000372 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000373}
rdcf146a772004-02-25 22:51:06 +0000374
375/*
danielk1977b28af712004-06-21 06:50:26 +0000376** Implementation of the total_changes() SQL function. The return value is
377** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000378*/
danielk1977b28af712004-06-21 06:50:26 +0000379static void total_changes(
380 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000381 int arg,
382 sqlite3_value **argv
383){
drh9bb575f2004-09-06 17:24:11 +0000384 sqlite3 *db = sqlite3_user_data(context);
danielk1977b28af712004-06-21 06:50:26 +0000385 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000386}
387
drh6ed41ad2002-04-06 14:10:47 +0000388/*
drh4e5ffc52004-08-31 00:52:37 +0000389** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000390*/
drh4e5ffc52004-08-31 00:52:37 +0000391struct compareInfo {
392 u8 matchAll;
393 u8 matchOne;
394 u8 matchSet;
395 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000396};
drh4e5ffc52004-08-31 00:52:37 +0000397static const struct compareInfo globInfo = { '*', '?', '[', 0 };
398static const struct compareInfo likeInfo = { '%', '_', 0, 1 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000399
400/*
drh4e5ffc52004-08-31 00:52:37 +0000401** X is a pointer to the first byte of a UTF-8 character. Increment
402** X so that it points to the next character. This only works right
403** if X points to a well-formed UTF-8 string.
danielk1977d02eb1f2004-06-06 09:44:03 +0000404*/
drh4e5ffc52004-08-31 00:52:37 +0000405#define sqliteNextChar(X) while( (0xc0&*++(X))==0x80 ){}
406#define sqliteCharVal(X) sqlite3ReadUtf8(X)
danielk1977d02eb1f2004-06-06 09:44:03 +0000407
danielk1977d02eb1f2004-06-06 09:44:03 +0000408
409/*
drh4e5ffc52004-08-31 00:52:37 +0000410** Compare two UTF-8 strings for equality where the first string can
411** potentially be a "glob" expression. Return true (1) if they
412** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000413**
drh4e5ffc52004-08-31 00:52:37 +0000414** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000415**
drh4e5ffc52004-08-31 00:52:37 +0000416** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000417**
drh4e5ffc52004-08-31 00:52:37 +0000418** '?' Matches exactly one character.
419**
420** [...] Matches one character from the enclosed list of
421** characters.
422**
423** [^...] Matches one character not in the enclosed list.
424**
425** With the [...] and [^...] matching, a ']' character can be included
426** in the list by making it the first character after '[' or '^'. A
427** range of characters can be specified using '-'. Example:
428** "[a-z]" matches any single lower-case letter. To match a '-', make
429** it the last character in the list.
430**
431** This routine is usually quick, but can be N**2 in the worst case.
432**
433** Hints: to match '*' or '?', put them in "[]". Like this:
434**
435** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000436*/
danielk19777c6303c2004-11-17 16:41:29 +0000437static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000438 const u8 *zPattern, /* The glob pattern */
439 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000440 const struct compareInfo *pInfo, /* Information about how to do the compare */
441 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000442){
danielk1977ad7dd422004-06-06 12:41:49 +0000443 register int c;
drh4e5ffc52004-08-31 00:52:37 +0000444 int invert;
445 int seen;
446 int c2;
447 u8 matchOne = pInfo->matchOne;
448 u8 matchAll = pInfo->matchAll;
449 u8 matchSet = pInfo->matchSet;
450 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000451 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000452
drh4e5ffc52004-08-31 00:52:37 +0000453 while( (c = *zPattern)!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000454 if( !prevEscape && c==matchAll ){
drh4e5ffc52004-08-31 00:52:37 +0000455 while( (c=zPattern[1]) == matchAll || c == matchOne ){
456 if( c==matchOne ){
457 if( *zString==0 ) return 0;
458 sqliteNextChar(zString);
459 }
460 zPattern++;
danielk1977ad7dd422004-06-06 12:41:49 +0000461 }
drh20fc0882004-11-18 13:49:25 +0000462 if( c && esc && sqlite3ReadUtf8(&zPattern[1])==esc ){
danielk19777c6303c2004-11-17 16:41:29 +0000463 u8 const *zTemp = &zPattern[1];
464 sqliteNextChar(zTemp);
465 c = *zTemp;
466 }
drh4e5ffc52004-08-31 00:52:37 +0000467 if( c==0 ) return 1;
468 if( c==matchSet ){
danielk19777c6303c2004-11-17 16:41:29 +0000469 assert( esc==0 ); /* This is GLOB, not LIKE */
470 while( *zString && patternCompare(&zPattern[1],zString,pInfo,esc)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000471 sqliteNextChar(zString);
472 }
473 return *zString!=0;
474 }else{
475 while( (c2 = *zString)!=0 ){
476 if( noCase ){
477 c2 = sqlite3UpperToLower[c2];
478 c = sqlite3UpperToLower[c];
479 while( c2 != 0 && c2 != c ){ c2 = sqlite3UpperToLower[*++zString]; }
480 }else{
481 while( c2 != 0 && c2 != c ){ c2 = *++zString; }
482 }
483 if( c2==0 ) return 0;
danielk19777c6303c2004-11-17 16:41:29 +0000484 if( patternCompare(&zPattern[1],zString,pInfo,esc) ) return 1;
drh4e5ffc52004-08-31 00:52:37 +0000485 sqliteNextChar(zString);
486 }
487 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000488 }
danielk19777c6303c2004-11-17 16:41:29 +0000489 }else if( !prevEscape && c==matchOne ){
drh4e5ffc52004-08-31 00:52:37 +0000490 if( *zString==0 ) return 0;
491 sqliteNextChar(zString);
492 zPattern++;
493 }else if( c==matchSet ){
494 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000495 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000496 seen = 0;
497 invert = 0;
498 c = sqliteCharVal(zString);
499 if( c==0 ) return 0;
500 c2 = *++zPattern;
501 if( c2=='^' ){ invert = 1; c2 = *++zPattern; }
502 if( c2==']' ){
503 if( c==']' ) seen = 1;
504 c2 = *++zPattern;
505 }
506 while( (c2 = sqliteCharVal(zPattern))!=0 && c2!=']' ){
507 if( c2=='-' && zPattern[1]!=']' && zPattern[1]!=0 && prior_c>0 ){
508 zPattern++;
509 c2 = sqliteCharVal(zPattern);
510 if( c>=prior_c && c<=c2 ) seen = 1;
511 prior_c = 0;
512 }else if( c==c2 ){
513 seen = 1;
514 prior_c = c2;
515 }else{
516 prior_c = c2;
517 }
518 sqliteNextChar(zPattern);
519 }
520 if( c2==0 || (seen ^ invert)==0 ) return 0;
521 sqliteNextChar(zString);
522 zPattern++;
drh20fc0882004-11-18 13:49:25 +0000523 }else if( esc && !prevEscape && sqlite3ReadUtf8(zPattern)==esc){
danielk19777c6303c2004-11-17 16:41:29 +0000524 prevEscape = 1;
525 sqliteNextChar(zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000526 }else{
527 if( noCase ){
528 if( sqlite3UpperToLower[c] != sqlite3UpperToLower[*zString] ) return 0;
529 }else{
530 if( c != *zString ) return 0;
531 }
532 zPattern++;
533 zString++;
danielk19777c6303c2004-11-17 16:41:29 +0000534 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000535 }
danielk197751ad0ec2004-05-24 12:39:02 +0000536 }
drh4e5ffc52004-08-31 00:52:37 +0000537 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000538}
drh4e5ffc52004-08-31 00:52:37 +0000539
danielk19773f6b0872004-06-17 05:36:44 +0000540
541/*
542** Implementation of the like() SQL function. This function implements
543** the build-in LIKE operator. The first argument to the function is the
544** pattern and the second argument is the string. So, the SQL statements:
545**
546** A LIKE B
547**
548** is implemented as like(B,A).
549**
550** If the pointer retrieved by via a call to sqlite3_user_data() is
551** not NULL, then this function uses UTF-16. Otherwise UTF-8.
552*/
553static void likeFunc(
554 sqlite3_context *context,
555 int argc,
556 sqlite3_value **argv
557){
558 const unsigned char *zA = sqlite3_value_text(argv[0]);
559 const unsigned char *zB = sqlite3_value_text(argv[1]);
danielk19777c6303c2004-11-17 16:41:29 +0000560 int escape = 0;
561 if( argc==3 ){
562 /* The escape character string must consist of a single UTF-8 character.
563 ** Otherwise, return an error.
564 */
565 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
566 if( sqlite3utf8CharLen(zEsc, -1)!=1 ){
567 sqlite3_result_error(context,
568 "ESCAPE expression must be a single character", -1);
569 return;
570 }
571 escape = sqlite3ReadUtf8(zEsc);
572 }
danielk19773f6b0872004-06-17 05:36:44 +0000573 if( zA && zB ){
danielk19777c6303c2004-11-17 16:41:29 +0000574 sqlite3_result_int(context, patternCompare(zA, zB, &likeInfo, escape));
danielk19773f6b0872004-06-17 05:36:44 +0000575 }
576}
drh0ac65892002-04-20 14:24:41 +0000577
578/*
579** Implementation of the glob() SQL function. This function implements
580** the build-in GLOB operator. The first argument to the function is the
581** string and the second argument is the pattern. So, the SQL statements:
582**
583** A GLOB B
584**
danielk19777c6303c2004-11-17 16:41:29 +0000585** is implemented as glob(B,A).
drh0ac65892002-04-20 14:24:41 +0000586*/
danielk19770ae8b832004-05-25 12:05:56 +0000587static void globFunc(sqlite3_context *context, int arg, sqlite3_value **argv){
drh4f26d6c2004-05-26 23:25:30 +0000588 const unsigned char *zA = sqlite3_value_text(argv[0]);
589 const unsigned char *zB = sqlite3_value_text(argv[1]);
danielk197751ad0ec2004-05-24 12:39:02 +0000590 if( zA && zB ){
danielk19777c6303c2004-11-17 16:41:29 +0000591 sqlite3_result_int(context, patternCompare(zA, zB, &globInfo, 0));
danielk197751ad0ec2004-05-24 12:39:02 +0000592 }
drh8912d102002-05-26 21:34:58 +0000593}
594
595/*
596** Implementation of the NULLIF(x,y) function. The result is the first
597** argument if the arguments are different. The result is NULL if the
598** arguments are equal to each other.
599*/
drhf9b596e2004-05-26 16:54:42 +0000600static void nullifFunc(
601 sqlite3_context *context,
602 int argc,
603 sqlite3_value **argv
604){
danielk1977dc1bdc42004-06-11 10:51:27 +0000605 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
606 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000607 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000608 }
drh0ac65892002-04-20 14:24:41 +0000609}
610
drh647cb0e2002-11-04 19:32:25 +0000611/*
612** Implementation of the VERSION(*) function. The result is the version
613** of the SQLite library that is running.
614*/
drhf9b596e2004-05-26 16:54:42 +0000615static void versionFunc(
616 sqlite3_context *context,
617 int argc,
618 sqlite3_value **argv
619){
danielk1977d8123362004-06-12 09:25:12 +0000620 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000621}
622
danielk1977d641d642004-11-18 15:44:29 +0000623
drh47394702003-08-20 01:03:33 +0000624/*
625** EXPERIMENTAL - This is not an official function. The interface may
626** change. This function may disappear. Do not write code that depends
627** on this function.
628**
629** Implementation of the QUOTE() function. This function takes a single
630** argument. If the argument is numeric, the return value is the same as
631** the argument. If the argument is NULL, the return value is the string
632** "NULL". Otherwise, the argument is enclosed in single quotes with
633** single-quote escapes.
634*/
danielk19770ae8b832004-05-25 12:05:56 +0000635static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000636 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000637 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000638 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000639 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000640 break;
drh47394702003-08-20 01:03:33 +0000641 }
drh9c054832004-05-31 18:51:57 +0000642 case SQLITE_INTEGER:
643 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000644 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000645 break;
646 }
danielk19773f41e972004-06-08 00:39:01 +0000647 case SQLITE_BLOB: {
648 static const char hexdigits[] = {
649 '0', '1', '2', '3', '4', '5', '6', '7',
650 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
651 };
652 char *zText = 0;
653 int nBlob = sqlite3_value_bytes(argv[0]);
654 char const *zBlob = sqlite3_value_blob(argv[0]);
655
656 zText = (char *)sqliteMalloc((2*nBlob)+4);
657 if( !zText ){
658 sqlite3_result_error(context, "out of memory", -1);
659 }else{
660 int i;
661 for(i=0; i<nBlob; i++){
662 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
663 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
664 }
665 zText[(nBlob*2)+2] = '\'';
666 zText[(nBlob*2)+3] = '\0';
667 zText[0] = 'X';
668 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000669 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
danielk19773f41e972004-06-08 00:39:01 +0000670 sqliteFree(zText);
671 }
672 break;
673 }
drh9c054832004-05-31 18:51:57 +0000674 case SQLITE_TEXT: {
drhf9b596e2004-05-26 16:54:42 +0000675 int i,j,n;
drh4f26d6c2004-05-26 23:25:30 +0000676 const char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000677 char *z;
678
679 for(i=n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
680 z = sqliteMalloc( i+n+3 );
681 if( z==0 ) return;
682 z[0] = '\'';
683 for(i=0, j=1; zArg[i]; i++){
684 z[j++] = zArg[i];
685 if( zArg[i]=='\'' ){
686 z[j++] = '\'';
687 }
688 }
689 z[j++] = '\'';
690 z[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000691 sqlite3_result_text(context, z, j, SQLITE_TRANSIENT);
drhf9b596e2004-05-26 16:54:42 +0000692 sqliteFree(z);
693 }
drh47394702003-08-20 01:03:33 +0000694 }
695}
696
drhd24cc422003-03-27 12:51:24 +0000697#ifdef SQLITE_SOUNDEX
698/*
699** Compute the soundex encoding of a word.
700*/
danielk19770ae8b832004-05-25 12:05:56 +0000701static void soundexFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drhd24cc422003-03-27 12:51:24 +0000702 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000703 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000704 int i, j;
705 static const unsigned char iCode[] = {
706 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
707 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
708 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
709 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
710 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
711 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
712 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
713 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
714 };
715 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000716 zIn = (u8*)sqlite3_value_text(argv[0]);
drhd24cc422003-03-27 12:51:24 +0000717 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
718 if( zIn[i] ){
719 zResult[0] = toupper(zIn[i]);
720 for(j=1; j<4 && zIn[i]; i++){
721 int code = iCode[zIn[i]&0x7f];
722 if( code>0 ){
723 zResult[j++] = code + '0';
724 }
725 }
726 while( j<4 ){
727 zResult[j++] = '0';
728 }
729 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000730 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000731 }else{
danielk1977d8123362004-06-12 09:25:12 +0000732 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000733 }
734}
735#endif
736
drh193a6b42002-07-07 16:52:46 +0000737#ifdef SQLITE_TEST
738/*
739** This function generates a string of random characters. Used for
740** generating test data.
741*/
danielk19770ae8b832004-05-25 12:05:56 +0000742static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +0000743 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +0000744 "abcdefghijklmnopqrstuvwxyz"
745 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
746 "0123456789"
747 ".-!,:*^+=_|?/<> ";
748 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +0000749 unsigned char zBuf[1000];
drh193a6b42002-07-07 16:52:46 +0000750 if( argc>=1 ){
drhf9b596e2004-05-26 16:54:42 +0000751 iMin = sqlite3_value_int(argv[0]);
drh193a6b42002-07-07 16:52:46 +0000752 if( iMin<0 ) iMin = 0;
753 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
754 }else{
755 iMin = 1;
756 }
757 if( argc>=2 ){
drhf9b596e2004-05-26 16:54:42 +0000758 iMax = sqlite3_value_int(argv[1]);
drh193a6b42002-07-07 16:52:46 +0000759 if( iMax<iMin ) iMax = iMin;
drh1dba7272004-01-16 13:58:18 +0000760 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +0000761 }else{
762 iMax = 50;
763 }
764 n = iMin;
765 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +0000766 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +0000767 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +0000768 n += r%(iMax + 1 - iMin);
769 }
drh1dba7272004-01-16 13:58:18 +0000770 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +0000771 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +0000772 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +0000773 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +0000774 }
775 zBuf[n] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000776 sqlite3_result_text(context, zBuf, n, SQLITE_TRANSIENT);
777}
drh0e3d7472004-06-19 17:33:07 +0000778#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +0000779
drh0e3d7472004-06-19 17:33:07 +0000780#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +0000781/*
782** The following two SQL functions are used to test returning a text
783** result with a destructor. Function 'test_destructor' takes one argument
784** and returns the same argument interpreted as TEXT. A destructor is
785** passed with the sqlite3_result_text() call.
786**
787** SQL function 'test_destructor_count' returns the number of outstanding
788** allocations made by 'test_destructor';
789**
790** WARNING: Not threadsafe.
791*/
792static int test_destructor_count_var = 0;
793static void destructor(void *p){
794 char *zVal = (char *)p;
795 assert(zVal);
796 zVal--;
797 sqliteFree(zVal);
798 test_destructor_count_var--;
799}
800static void test_destructor(
801 sqlite3_context *pCtx,
802 int nArg,
803 sqlite3_value **argv
804){
805 char *zVal;
danielk1977f4618892004-06-28 13:09:11 +0000806 int len;
drh9bb575f2004-09-06 17:24:11 +0000807 sqlite3 *db = sqlite3_user_data(pCtx);
danielk1977f4618892004-06-28 13:09:11 +0000808
danielk1977d8123362004-06-12 09:25:12 +0000809 test_destructor_count_var++;
810 assert( nArg==1 );
811 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
danielk1977f4618892004-06-28 13:09:11 +0000812 len = sqlite3ValueBytes(argv[0], db->enc);
813 zVal = sqliteMalloc(len+3);
814 zVal[len] = 0;
815 zVal[len-1] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000816 assert( zVal );
817 zVal++;
danielk1977f4618892004-06-28 13:09:11 +0000818 memcpy(zVal, sqlite3ValueText(argv[0], db->enc), len);
819 if( db->enc==SQLITE_UTF8 ){
820 sqlite3_result_text(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +0000821#ifndef SQLITE_OMIT_UTF16
danielk1977f4618892004-06-28 13:09:11 +0000822 }else if( db->enc==SQLITE_UTF16LE ){
823 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
824 }else{
825 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +0000826#endif /* SQLITE_OMIT_UTF16 */
danielk1977f4618892004-06-28 13:09:11 +0000827 }
danielk1977d8123362004-06-12 09:25:12 +0000828}
829static void test_destructor_count(
830 sqlite3_context *pCtx,
831 int nArg,
832 sqlite3_value **argv
833){
834 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +0000835}
drh0e3d7472004-06-19 17:33:07 +0000836#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +0000837
drh0e3d7472004-06-19 17:33:07 +0000838#ifdef SQLITE_TEST
839/*
840** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
841** interface.
842**
843** The test_auxdata() SQL function attempts to register each of its arguments
844** as auxiliary data. If there are no prior registrations of aux data for
845** that argument (meaning the argument is not a constant or this is its first
846** call) then the result for that argument is 0. If there is a prior
847** registration, the result for that argument is 1. The overall result
848** is the individual argument results separated by spaces.
849*/
danielk19773f6b0872004-06-17 05:36:44 +0000850static void free_test_auxdata(void *p) {sqliteFree(p);}
851static void test_auxdata(
852 sqlite3_context *pCtx,
853 int nArg,
854 sqlite3_value **argv
855){
856 int i;
857 char *zRet = sqliteMalloc(nArg*2);
858 if( !zRet ) return;
859 for(i=0; i<nArg; i++){
860 char const *z = sqlite3_value_text(argv[i]);
861 if( z ){
862 char *zAux = sqlite3_get_auxdata(pCtx, i);
863 if( zAux ){
864 zRet[i*2] = '1';
865 if( strcmp(zAux, z) ){
866 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
867 return;
868 }
869 }else{
870 zRet[i*2] = '0';
871 zAux = sqliteStrDup(z);
872 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
873 }
874 zRet[i*2+1] = ' ';
875 }
876 }
877 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
878}
drh0e3d7472004-06-19 17:33:07 +0000879#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +0000880
danielk197701427a62005-01-11 13:02:33 +0000881#ifdef SQLITE_TEST
882/*
883** A function to test error reporting from user functions. This function
884** returns a copy of it's first argument as an error.
885*/
886static void test_error(
887 sqlite3_context *pCtx,
888 int nArg,
889 sqlite3_value **argv
890){
danielk197724c8ab82005-02-09 01:40:23 +0000891 sqlite3_result_error(pCtx, sqlite3_value_text(argv[0]), 0);
danielk197701427a62005-01-11 13:02:33 +0000892}
893#endif /* SQLITE_TEST */
894
drh0ac65892002-04-20 14:24:41 +0000895/*
drhd3a149e2002-02-24 17:12:53 +0000896** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +0000897** sum() or avg() aggregate computation.
898*/
899typedef struct SumCtx SumCtx;
900struct SumCtx {
901 double sum; /* Sum of terms */
drh739105c2002-05-29 23:22:23 +0000902 int cnt; /* Number of elements summed */
drhdd5baa92002-02-27 19:50:59 +0000903};
904
905/*
906** Routines used to compute the sum or average.
907*/
danielk19770ae8b832004-05-25 12:05:56 +0000908static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +0000909 SumCtx *p;
drhdd5baa92002-02-27 19:50:59 +0000910 if( argc<1 ) return;
drh4f26d6c2004-05-26 23:25:30 +0000911 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +0000912 if( p && SQLITE_NULL!=sqlite3_value_type(argv[0]) ){
drh4f26d6c2004-05-26 23:25:30 +0000913 p->sum += sqlite3_value_double(argv[0]);
drh739105c2002-05-29 23:22:23 +0000914 p->cnt++;
915 }
drhdd5baa92002-02-27 19:50:59 +0000916}
danielk19770ae8b832004-05-25 12:05:56 +0000917static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +0000918 SumCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000919 p = sqlite3_aggregate_context(context, sizeof(*p));
danielk19777e18c252004-05-25 11:47:24 +0000920 sqlite3_result_double(context, p ? p->sum : 0.0);
drhdd5baa92002-02-27 19:50:59 +0000921}
danielk19770ae8b832004-05-25 12:05:56 +0000922static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +0000923 SumCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000924 p = sqlite3_aggregate_context(context, sizeof(*p));
drh739105c2002-05-29 23:22:23 +0000925 if( p && p->cnt>0 ){
danielk19777e18c252004-05-25 11:47:24 +0000926 sqlite3_result_double(context, p->sum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +0000927 }
928}
929
930/*
931** An instance of the following structure holds the context of a
drha2ed5602002-02-26 23:55:31 +0000932** variance or standard deviation computation.
drhd3a149e2002-02-24 17:12:53 +0000933*/
934typedef struct StdDevCtx StdDevCtx;
935struct StdDevCtx {
936 double sum; /* Sum of terms */
937 double sum2; /* Sum of the squares of terms */
drh739105c2002-05-29 23:22:23 +0000938 int cnt; /* Number of terms counted */
drhd3a149e2002-02-24 17:12:53 +0000939};
940
drh0bce8352002-02-28 00:41:10 +0000941/*
942** The following structure keeps track of state information for the
943** count() aggregate function.
944*/
945typedef struct CountCtx CountCtx;
946struct CountCtx {
947 int n;
948};
drhdd5baa92002-02-27 19:50:59 +0000949
drh0bce8352002-02-28 00:41:10 +0000950/*
951** Routines to implement the count() aggregate function.
952*/
danielk19770ae8b832004-05-25 12:05:56 +0000953static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000954 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000955 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +0000956 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +0000957 p->n++;
958 }
959}
danielk19770ae8b832004-05-25 12:05:56 +0000960static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +0000961 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000962 p = sqlite3_aggregate_context(context, sizeof(*p));
drhf4479502004-05-27 03:12:53 +0000963 sqlite3_result_int(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +0000964}
965
966/*
967** This function tracks state information for the min() and max()
968** aggregate functions.
969*/
970typedef struct MinMaxCtx MinMaxCtx;
971struct MinMaxCtx {
972 char *z; /* The best so far */
973 char zBuf[28]; /* Space that can be used for storage */
974};
975
976/*
977** Routines to implement min() and max() aggregate functions.
978*/
danielk19770ae8b832004-05-25 12:05:56 +0000979static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +0000980 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +0000981 Mem *pBest;
982
983 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
984 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +0000985 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +0000986
danielk197788208052004-05-25 01:13:20 +0000987 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +0000988 int max;
989 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +0000990 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +0000991 /* This step function is used for both the min() and max() aggregates,
992 ** the only difference between the two being that the sense of the
993 ** comparison is inverted. For the max() aggregate, the
994 ** sqlite3_user_data() function returns (void *)-1. For min() it
995 ** returns (void *)db, where db is the sqlite3* database pointer.
996 ** Therefore the next statement sets variable 'max' to 1 for the max()
997 ** aggregate, or 0 for min().
998 */
danielk197788208052004-05-25 01:13:20 +0000999 max = ((sqlite3_user_data(context)==(void *)-1)?1:0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001000 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001001 if( (max && cmp<0) || (!max && cmp>0) ){
danielk19777e18c252004-05-25 11:47:24 +00001002 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001003 }
drh268380c2004-02-25 13:47:31 +00001004 }else{
danielk19777e18c252004-05-25 11:47:24 +00001005 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001006 }
1007}
danielk19770ae8b832004-05-25 12:05:56 +00001008static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001009 sqlite3_value *pRes;
drh4f26d6c2004-05-26 23:25:30 +00001010 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, sizeof(Mem));
danielk197788208052004-05-25 01:13:20 +00001011 if( pRes->flags ){
drhf4479502004-05-27 03:12:53 +00001012 sqlite3_result_value(context, pRes);
drh0bce8352002-02-28 00:41:10 +00001013 }
danielk1977b20e56b2004-06-15 13:36:30 +00001014 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001015}
drhdd5baa92002-02-27 19:50:59 +00001016
drh4e5ffc52004-08-31 00:52:37 +00001017
drhd3a149e2002-02-24 17:12:53 +00001018/*
drha2ed5602002-02-26 23:55:31 +00001019** This function registered all of the above C functions as SQL
1020** functions. This should be the only routine in this file with
1021** external linkage.
drhdc04c582002-02-24 01:55:15 +00001022*/
drh9bb575f2004-09-06 17:24:11 +00001023void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001024 static const struct {
drh0bce8352002-02-28 00:41:10 +00001025 char *zName;
drh268380c2004-02-25 13:47:31 +00001026 signed char nArg;
danielk1977f4618892004-06-28 13:09:11 +00001027 u8 argType; /* 0: none. 1: db 2: (-1) */
1028 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001029 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001030 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001031 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001032 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1033 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
1034 { "max", -1, 2, SQLITE_UTF8, 1, minmaxFunc },
1035 { "max", 0, 2, SQLITE_UTF8, 1, 0 },
1036 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1037 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
1038 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
drh6c626082004-11-14 21:56:29 +00001039#ifndef SQLITE_OMIT_UTF16
danielk1977f4618892004-06-28 13:09:11 +00001040 { "substr", 3, 0, SQLITE_UTF16LE, 0, sqlite3utf16Substr },
drh6c626082004-11-14 21:56:29 +00001041#endif
danielk1977f4618892004-06-28 13:09:11 +00001042 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1043 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1044 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1045 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1046 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1047 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1048 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1049 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
1050 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1051 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
1052 { "like", 2, 0, SQLITE_UTF8, 0, likeFunc },
danielk19777c6303c2004-11-17 16:41:29 +00001053 { "like", 3, 0, SQLITE_UTF8, 0, likeFunc },
danielk1977f4618892004-06-28 13:09:11 +00001054 { "glob", 2, 0, SQLITE_UTF8, 0, globFunc },
drh94a98362004-09-13 13:13:18 +00001055 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001056 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1057 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
1058 { "last_insert_rowid", 0, 1, SQLITE_UTF8, 0, last_insert_rowid },
1059 { "changes", 0, 1, SQLITE_UTF8, 0, changes },
1060 { "total_changes", 0, 1, SQLITE_UTF8, 0, total_changes },
drh5708d2d2005-06-22 10:53:59 +00001061 { "text", 1, 0, SQLITE_UTF8, 0, textFunc },
1062 { "numeric", 1, 0, SQLITE_UTF8, 0, numericFunc },
1063 { "blob", 1, 0, SQLITE_UTF8, 0, blobFunc },
drhd24cc422003-03-27 12:51:24 +00001064#ifdef SQLITE_SOUNDEX
danielk1977f4618892004-06-28 13:09:11 +00001065 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001066#endif
drh193a6b42002-07-07 16:52:46 +00001067#ifdef SQLITE_TEST
danielk1977f4618892004-06-28 13:09:11 +00001068 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1069 { "test_destructor", 1, 1, SQLITE_UTF8, 0, test_destructor},
danielk1977d8123362004-06-12 09:25:12 +00001070 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
danielk1977f4618892004-06-28 13:09:11 +00001071 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
danielk197701427a62005-01-11 13:02:33 +00001072 { "test_error", 1, 0, SQLITE_UTF8, 0, test_error},
drh193a6b42002-07-07 16:52:46 +00001073#endif
drh0bce8352002-02-28 00:41:10 +00001074 };
drh57196282004-10-06 15:41:16 +00001075 static const struct {
drh0bce8352002-02-28 00:41:10 +00001076 char *zName;
drh268380c2004-02-25 13:47:31 +00001077 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001078 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001079 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001080 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1081 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001082 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001083 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
1084 { "max", 1, 2, 1, minmaxStep, minMaxFinalize },
1085 { "sum", 1, 0, 0, sumStep, sumFinalize },
1086 { "avg", 1, 0, 0, sumStep, avgFinalize },
1087 { "count", 0, 0, 0, countStep, countFinalize },
1088 { "count", 1, 0, 0, countStep, countFinalize },
drh0bce8352002-02-28 00:41:10 +00001089 };
1090 int i;
1091
1092 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
danielk1977c572ef72004-05-27 09:28:41 +00001093 void *pArg = 0;
1094 switch( aFuncs[i].argType ){
1095 case 1: pArg = db; break;
1096 case 2: pArg = (void *)(-1); break;
1097 }
danielk1977ad7dd422004-06-06 12:41:49 +00001098 sqlite3_create_function(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001099 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001100 if( aFuncs[i].needCollSeq ){
1101 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1102 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1103 if( pFunc && aFuncs[i].needCollSeq ){
1104 pFunc->needCollSeq = 1;
1105 }
1106 }
drh0bce8352002-02-28 00:41:10 +00001107 }
drh1f01ec12005-02-15 21:36:18 +00001108#ifndef SQLITE_OMIT_ALTERTABLE
1109 sqlite3AlterFunctions(db);
1110#endif
drh0bce8352002-02-28 00:41:10 +00001111 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
danielk1977c572ef72004-05-27 09:28:41 +00001112 void *pArg = 0;
1113 switch( aAggs[i].argType ){
1114 case 1: pArg = db; break;
1115 case 2: pArg = (void *)(-1); break;
1116 }
danielk1977d8123362004-06-12 09:25:12 +00001117 sqlite3_create_function(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001118 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001119 if( aAggs[i].needCollSeq ){
1120 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001121 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001122 if( pFunc && aAggs[i].needCollSeq ){
1123 pFunc->needCollSeq = 1;
1124 }
1125 }
drh268380c2004-02-25 13:47:31 +00001126 }
danielk19774adee202004-05-08 08:23:19 +00001127 sqlite3RegisterDateTimeFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001128#ifdef SQLITE_SSE
1129 {
danielk1977fd9e1f32005-05-22 10:44:34 +00001130 sqlite3SseFunctions(db);
1131 }
1132#endif
drhdc04c582002-02-24 01:55:15 +00001133}