blob: 76c4de66da13e9876782b180255346c4e5784388 [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**
drha605fe82009-02-01 18:08:40 +000019** $Id: func.c,v 1.212 2009/02/01 18:08:41 drh Exp $
drhdc04c582002-02-24 01:55:15 +000020*/
drhb659e9b2005-01-28 01:29:08 +000021#include "sqliteInt.h"
drhd3a149e2002-02-24 17:12:53 +000022#include <stdlib.h>
drh0bce8352002-02-28 00:41:10 +000023#include <assert.h>
danielk197788208052004-05-25 01:13:20 +000024#include "vdbeInt.h"
drh0bce8352002-02-28 00:41:10 +000025
drh55ef4d92005-08-14 01:20:37 +000026/*
27** Return the collating function associated with a function.
28*/
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,
danielk197762c14b32008-11-19 09:05:26 +000067 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +000068 sqlite3_value **argv
69){
danielk197735bb9d02004-05-24 12:55:54 +000070 const char *z = 0;
danielk197762c14b32008-11-19 09:05:26 +000071 UNUSED_PARAMETER(NotUsed);
danielk197735bb9d02004-05-24 12:55:54 +000072 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000073 case SQLITE_NULL: z = "null"; break;
74 case SQLITE_INTEGER: z = "integer"; break;
75 case SQLITE_TEXT: z = "text"; break;
76 case SQLITE_FLOAT: z = "real"; break;
77 case SQLITE_BLOB: z = "blob"; break;
danielk197735bb9d02004-05-24 12:55:54 +000078 }
danielk1977d8123362004-06-12 09:25:12 +000079 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000080}
81
drh5708d2d2005-06-22 10:53:59 +000082
83/*
drh0bce8352002-02-28 00:41:10 +000084** Implementation of the length() function
85*/
drhf9b596e2004-05-26 16:54:42 +000086static void lengthFunc(
87 sqlite3_context *context,
88 int argc,
89 sqlite3_value **argv
90){
drh0bce8352002-02-28 00:41:10 +000091 int len;
92
93 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +000094 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +000095 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000096 case SQLITE_BLOB:
97 case SQLITE_INTEGER:
98 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +000099 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +0000100 break;
101 }
drh9c054832004-05-31 18:51:57 +0000102 case SQLITE_TEXT: {
drh2646da72005-12-09 20:02:05 +0000103 const unsigned char *z = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000104 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000105 len = 0;
106 while( *z ){
107 len++;
108 SQLITE_SKIP_UTF8(z);
109 }
drhf4479502004-05-27 03:12:53 +0000110 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000111 break;
112 }
113 default: {
114 sqlite3_result_null(context);
115 break;
116 }
117 }
drh0bce8352002-02-28 00:41:10 +0000118}
119
120/*
121** Implementation of the abs() function
122*/
danielk19770ae8b832004-05-25 12:05:56 +0000123static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000124 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000125 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000126 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000127 case SQLITE_INTEGER: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000128 i64 iVal = sqlite3_value_int64(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000129 if( iVal<0 ){
130 if( (iVal<<1)==0 ){
131 sqlite3_result_error(context, "integer overflow", -1);
132 return;
133 }
134 iVal = -iVal;
135 }
danielk1977f93bbbe2004-05-27 10:30:52 +0000136 sqlite3_result_int64(context, iVal);
drhf9b596e2004-05-26 16:54:42 +0000137 break;
138 }
drh9c054832004-05-31 18:51:57 +0000139 case SQLITE_NULL: {
drhf9b596e2004-05-26 16:54:42 +0000140 sqlite3_result_null(context);
141 break;
142 }
143 default: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000144 double rVal = sqlite3_value_double(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000145 if( rVal<0 ) rVal = -rVal;
danielk1977f93bbbe2004-05-27 10:30:52 +0000146 sqlite3_result_double(context, rVal);
drhf9b596e2004-05-26 16:54:42 +0000147 break;
148 }
149 }
drh0bce8352002-02-28 00:41:10 +0000150}
151
152/*
drhf764e6f2007-05-15 01:13:47 +0000153** Implementation of the substr() function.
154**
155** substr(x,p1,p2) returns p2 characters of x[] beginning with p1.
156** p1 is 1-indexed. So substr(x,1,1) returns the first character
157** of x. If x is text, then we actually count UTF-8 characters.
158** If x is a blob, then we count bytes.
159**
160** If p1 is negative, then we begin abs(p1) from the end of x[].
drh0bce8352002-02-28 00:41:10 +0000161*/
drhf9b596e2004-05-26 16:54:42 +0000162static void substrFunc(
163 sqlite3_context *context,
164 int argc,
165 sqlite3_value **argv
166){
drh2646da72005-12-09 20:02:05 +0000167 const unsigned char *z;
168 const unsigned char *z2;
drh023ae032007-05-08 12:12:16 +0000169 int len;
drhf764e6f2007-05-15 01:13:47 +0000170 int p0type;
drh023ae032007-05-08 12:12:16 +0000171 i64 p1, p2;
drhf9b596e2004-05-26 16:54:42 +0000172
drh64f31512007-10-12 19:11:55 +0000173 assert( argc==3 || argc==2 );
drhf764e6f2007-05-15 01:13:47 +0000174 p0type = sqlite3_value_type(argv[0]);
175 if( p0type==SQLITE_BLOB ){
176 len = sqlite3_value_bytes(argv[0]);
177 z = sqlite3_value_blob(argv[0]);
178 if( z==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000179 assert( len==sqlite3_value_bytes(argv[0]) );
drhf764e6f2007-05-15 01:13:47 +0000180 }else{
181 z = sqlite3_value_text(argv[0]);
182 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000183 len = 0;
184 for(z2=z; *z2; len++){
185 SQLITE_SKIP_UTF8(z2);
186 }
drhf764e6f2007-05-15 01:13:47 +0000187 }
danielk197751ad0ec2004-05-24 12:39:02 +0000188 p1 = sqlite3_value_int(argv[1]);
drh64f31512007-10-12 19:11:55 +0000189 if( argc==3 ){
190 p2 = sqlite3_value_int(argv[2]);
191 }else{
drhbb4957f2008-03-20 14:03:29 +0000192 p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH];
drh64f31512007-10-12 19:11:55 +0000193 }
drh0bce8352002-02-28 00:41:10 +0000194 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000195 p1 += len;
drh653bc752002-02-28 03:31:10 +0000196 if( p1<0 ){
197 p2 += p1;
198 p1 = 0;
199 }
drh0bce8352002-02-28 00:41:10 +0000200 }else if( p1>0 ){
201 p1--;
202 }
203 if( p1+p2>len ){
204 p2 = len-p1;
205 }
drhf764e6f2007-05-15 01:13:47 +0000206 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000207 while( *z && p1 ){
208 SQLITE_SKIP_UTF8(z);
209 p1--;
drhf764e6f2007-05-15 01:13:47 +0000210 }
drh4a919112007-05-15 11:55:09 +0000211 for(z2=z; *z2 && p2; p2--){
212 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000213 }
drh1bd10f82008-12-10 21:19:56 +0000214 sqlite3_result_text(context, (char*)z, (int)(z2-z), SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000215 }else{
216 if( p2<0 ) p2 = 0;
drh1bd10f82008-12-10 21:19:56 +0000217 sqlite3_result_blob(context, (char*)&z[p1], (int)p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000218 }
drh0bce8352002-02-28 00:41:10 +0000219}
220
221/*
222** Implementation of the round() function
223*/
danielk19770ae8b832004-05-25 12:05:56 +0000224static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000225 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000226 double r;
drh592ac8c2005-08-13 03:07:47 +0000227 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000228 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000229 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000230 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000231 n = sqlite3_value_int(argv[1]);
232 if( n>30 ) n = 30;
233 if( n<0 ) n = 0;
234 }
drhd589a922006-03-02 03:02:48 +0000235 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000236 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000237 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000238 sqlite3AtoF(zBuf, &r);
239 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000240}
drhdc04c582002-02-24 01:55:15 +0000241
danielk197726783a52007-08-29 14:06:22 +0000242/*
243** Allocate nByte bytes of space using sqlite3_malloc(). If the
244** allocation fails, call sqlite3_result_error_nomem() to notify
245** the database handle that malloc() has failed.
246*/
drhb1a6c3c2008-03-20 16:30:17 +0000247static void *contextMalloc(sqlite3_context *context, i64 nByte){
drhbb4957f2008-03-20 14:03:29 +0000248 char *z;
249 if( nByte>sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH] ){
250 sqlite3_result_error_toobig(context);
251 z = 0;
252 }else{
drh1bd10f82008-12-10 21:19:56 +0000253 z = sqlite3Malloc((int)nByte);
drhbb4957f2008-03-20 14:03:29 +0000254 if( !z && nByte>0 ){
255 sqlite3_result_error_nomem(context);
256 }
danielk1977a1644fd2007-08-29 12:31:25 +0000257 }
258 return z;
259}
260
drhdc04c582002-02-24 01:55:15 +0000261/*
262** Implementation of the upper() and lower() SQL functions.
263*/
danielk19770ae8b832004-05-25 12:05:56 +0000264static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000265 char *z1;
266 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000267 int i, n;
drh9c054832004-05-31 18:51:57 +0000268 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000269 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000270 n = sqlite3_value_bytes(argv[0]);
271 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
272 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000273 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000274 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000275 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000276 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000277 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000278 z1[i] = (char)sqlite3Toupper(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000279 }
280 sqlite3_result_text(context, z1, -1, sqlite3_free);
281 }
drhdc04c582002-02-24 01:55:15 +0000282 }
283}
danielk19770ae8b832004-05-25 12:05:56 +0000284static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197778ca0e72009-01-20 16:53:39 +0000285 u8 *z1;
drh7a521cf2007-04-25 18:23:52 +0000286 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000287 int i, n;
drh9c054832004-05-31 18:51:57 +0000288 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000289 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000290 n = sqlite3_value_bytes(argv[0]);
291 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
292 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000293 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000294 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000295 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000296 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000297 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000298 z1[i] = sqlite3Tolower(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000299 }
danielk197778ca0e72009-01-20 16:53:39 +0000300 sqlite3_result_text(context, (char *)z1, -1, sqlite3_free);
drh7a521cf2007-04-25 18:23:52 +0000301 }
drhdc04c582002-02-24 01:55:15 +0000302 }
303}
304
305/*
drhfbc99082002-02-28 03:14:18 +0000306** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000307** All three do the same thing. They return the first non-NULL
308** argument.
drh3212e182002-02-28 00:46:26 +0000309*/
drhf9b596e2004-05-26 16:54:42 +0000310static void ifnullFunc(
311 sqlite3_context *context,
312 int argc,
313 sqlite3_value **argv
314){
drhfbc99082002-02-28 03:14:18 +0000315 int i;
316 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000317 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000318 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000319 break;
320 }
321 }
drh3212e182002-02-28 00:46:26 +0000322}
323
324/*
drhf9ffac92002-03-02 19:00:31 +0000325** Implementation of random(). Return a random integer.
326*/
drhf9b596e2004-05-26 16:54:42 +0000327static void randomFunc(
328 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000329 int NotUsed,
330 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000331){
drh52fc8492006-02-23 21:43:55 +0000332 sqlite_int64 r;
danielk197762c14b32008-11-19 09:05:26 +0000333 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drh2fa18682008-03-19 14:15:34 +0000334 sqlite3_randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000335 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
336 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000337 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000338}
339
340/*
drh137c7282007-01-29 17:58:28 +0000341** Implementation of randomblob(N). Return a random blob
342** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000343*/
drh137c7282007-01-29 17:58:28 +0000344static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000345 sqlite3_context *context,
346 int argc,
347 sqlite3_value **argv
348){
drh137c7282007-01-29 17:58:28 +0000349 int n;
350 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000351 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000352 UNUSED_PARAMETER(argc);
drh63cf66f2007-01-29 15:50:05 +0000353 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000354 if( n<1 ){
355 n = 1;
356 }
danielk1977a1644fd2007-08-29 12:31:25 +0000357 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000358 if( p ){
drh2fa18682008-03-19 14:15:34 +0000359 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000360 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000361 }
drh63cf66f2007-01-29 15:50:05 +0000362}
363
364/*
drh6ed41ad2002-04-06 14:10:47 +0000365** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000366** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000367*/
danielk197751ad0ec2004-05-24 12:39:02 +0000368static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000369 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000370 int NotUsed,
371 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000372){
drhfa4a4b92008-03-19 21:45:51 +0000373 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000374 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf9b596e2004-05-26 16:54:42 +0000375 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000376}
377
rdcf146a772004-02-25 22:51:06 +0000378/*
danielk1977b28af712004-06-21 06:50:26 +0000379** Implementation of the changes() SQL function. The return value is the
380** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000381*/
danielk1977b28af712004-06-21 06:50:26 +0000382static void changes(
drhf9b596e2004-05-26 16:54:42 +0000383 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000384 int NotUsed,
385 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000386){
drhfa4a4b92008-03-19 21:45:51 +0000387 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000388 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf4479502004-05-27 03:12:53 +0000389 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000390}
rdcf146a772004-02-25 22:51:06 +0000391
392/*
danielk1977b28af712004-06-21 06:50:26 +0000393** Implementation of the total_changes() SQL function. The return value is
394** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000395*/
danielk1977b28af712004-06-21 06:50:26 +0000396static void total_changes(
397 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000398 int NotUsed,
399 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000400){
drhfa4a4b92008-03-19 21:45:51 +0000401 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000402 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977b28af712004-06-21 06:50:26 +0000403 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000404}
405
drh6ed41ad2002-04-06 14:10:47 +0000406/*
drh4e5ffc52004-08-31 00:52:37 +0000407** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000408*/
drh4e5ffc52004-08-31 00:52:37 +0000409struct compareInfo {
410 u8 matchAll;
411 u8 matchOne;
412 u8 matchSet;
413 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000414};
drh55ef4d92005-08-14 01:20:37 +0000415
drhb9175ae2007-12-07 18:39:04 +0000416/*
417** For LIKE and GLOB matching on EBCDIC machines, assume that every
418** character is exactly one byte in size. Also, all characters are
419** able to participate in upper-case-to-lower-case mappings in EBCDIC
420** whereas only characters less than 0x80 do in ASCII.
421*/
422#if defined(SQLITE_EBCDIC)
423# define sqlite3Utf8Read(A,B,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000424# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000425#else
drh6ed4b782007-12-10 18:07:20 +0000426# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000427#endif
428
drh4e5ffc52004-08-31 00:52:37 +0000429static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000430/* The correct SQL-92 behavior is for the LIKE operator to ignore
431** case. Thus 'a' LIKE 'A' would be true. */
432static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
433/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
434** is case sensitive causing 'a' LIKE 'A' to be false */
435static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000436
437/*
drh4e5ffc52004-08-31 00:52:37 +0000438** Compare two UTF-8 strings for equality where the first string can
439** potentially be a "glob" expression. Return true (1) if they
440** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000441**
drh4e5ffc52004-08-31 00:52:37 +0000442** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000443**
drh4e5ffc52004-08-31 00:52:37 +0000444** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000445**
drh4e5ffc52004-08-31 00:52:37 +0000446** '?' Matches exactly one character.
447**
448** [...] Matches one character from the enclosed list of
449** characters.
450**
451** [^...] Matches one character not in the enclosed list.
452**
453** With the [...] and [^...] matching, a ']' character can be included
454** in the list by making it the first character after '[' or '^'. A
455** range of characters can be specified using '-'. Example:
456** "[a-z]" matches any single lower-case letter. To match a '-', make
457** it the last character in the list.
458**
459** This routine is usually quick, but can be N**2 in the worst case.
460**
461** Hints: to match '*' or '?', put them in "[]". Like this:
462**
463** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000464*/
danielk19777c6303c2004-11-17 16:41:29 +0000465static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000466 const u8 *zPattern, /* The glob pattern */
467 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000468 const struct compareInfo *pInfo, /* Information about how to do the compare */
469 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000470){
drh66150952007-07-23 19:12:41 +0000471 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000472 int invert;
473 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000474 u8 matchOne = pInfo->matchOne;
475 u8 matchAll = pInfo->matchAll;
476 u8 matchSet = pInfo->matchSet;
477 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000478 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000479
drh66150952007-07-23 19:12:41 +0000480 while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000481 if( !prevEscape && c==matchAll ){
drh66150952007-07-23 19:12:41 +0000482 while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll
483 || c == matchOne ){
484 if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){
485 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000486 }
danielk1977ad7dd422004-06-06 12:41:49 +0000487 }
drh66150952007-07-23 19:12:41 +0000488 if( c==0 ){
489 return 1;
490 }else if( c==esc ){
491 c = sqlite3Utf8Read(zPattern, 0, &zPattern);
492 if( c==0 ){
493 return 0;
494 }
495 }else if( c==matchSet ){
496 assert( esc==0 ); /* This is GLOB, not LIKE */
497 assert( matchSet<0x80 ); /* '[' is a single-byte character */
498 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000499 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000500 }
501 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000502 }
503 while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){
504 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000505 GlogUpperToLower(c2);
506 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000507 while( c2 != 0 && c2 != c ){
508 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh6ed4b782007-12-10 18:07:20 +0000509 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000510 }
drh66150952007-07-23 19:12:41 +0000511 }else{
512 while( c2 != 0 && c2 != c ){
513 c2 = sqlite3Utf8Read(zString, 0, &zString);
514 }
drh4e5ffc52004-08-31 00:52:37 +0000515 }
drh66150952007-07-23 19:12:41 +0000516 if( c2==0 ) return 0;
517 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
518 }
519 return 0;
520 }else if( !prevEscape && c==matchOne ){
521 if( sqlite3Utf8Read(zString, 0, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000522 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000523 }
drh4e5ffc52004-08-31 00:52:37 +0000524 }else if( c==matchSet ){
525 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000526 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000527 seen = 0;
528 invert = 0;
drh66150952007-07-23 19:12:41 +0000529 c = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000530 if( c==0 ) return 0;
drh66150952007-07-23 19:12:41 +0000531 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
532 if( c2=='^' ){
533 invert = 1;
534 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
535 }
drh4e5ffc52004-08-31 00:52:37 +0000536 if( c2==']' ){
537 if( c==']' ) seen = 1;
drh66150952007-07-23 19:12:41 +0000538 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000539 }
drh66150952007-07-23 19:12:41 +0000540 while( c2 && c2!=']' ){
541 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
542 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000543 if( c>=prior_c && c<=c2 ) seen = 1;
544 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000545 }else{
drh66150952007-07-23 19:12:41 +0000546 if( c==c2 ){
547 seen = 1;
548 }
drh4e5ffc52004-08-31 00:52:37 +0000549 prior_c = c2;
550 }
drh66150952007-07-23 19:12:41 +0000551 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000552 }
drh66150952007-07-23 19:12:41 +0000553 if( c2==0 || (seen ^ invert)==0 ){
554 return 0;
555 }
556 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000557 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000558 }else{
drh66150952007-07-23 19:12:41 +0000559 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000560 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000561 GlogUpperToLower(c);
562 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000563 }
drh66150952007-07-23 19:12:41 +0000564 if( c!=c2 ){
565 return 0;
566 }
danielk19777c6303c2004-11-17 16:41:29 +0000567 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000568 }
danielk197751ad0ec2004-05-24 12:39:02 +0000569 }
drh4e5ffc52004-08-31 00:52:37 +0000570 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000571}
drh4e5ffc52004-08-31 00:52:37 +0000572
drh55ef4d92005-08-14 01:20:37 +0000573/*
574** Count the number of times that the LIKE operator (or GLOB which is
575** just a variation of LIKE) gets called. This is used for testing
576** only.
577*/
578#ifdef SQLITE_TEST
579int sqlite3_like_count = 0;
580#endif
581
danielk19773f6b0872004-06-17 05:36:44 +0000582
583/*
584** Implementation of the like() SQL function. This function implements
585** the build-in LIKE operator. The first argument to the function is the
586** pattern and the second argument is the string. So, the SQL statements:
587**
588** A LIKE B
589**
590** is implemented as like(B,A).
591**
drh55ef4d92005-08-14 01:20:37 +0000592** This same function (with a different compareInfo structure) computes
593** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000594*/
595static void likeFunc(
596 sqlite3_context *context,
597 int argc,
598 sqlite3_value **argv
599){
drhbeb818d2007-05-08 15:34:47 +0000600 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000601 int escape = 0;
drhbb4957f2008-03-20 14:03:29 +0000602 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000603
drh1f0feef2007-05-15 13:27:07 +0000604 zB = sqlite3_value_text(argv[0]);
605 zA = sqlite3_value_text(argv[1]);
606
drhbeb818d2007-05-08 15:34:47 +0000607 /* Limit the length of the LIKE or GLOB pattern to avoid problems
608 ** of deep recursion and N*N behavior in patternCompare().
609 */
drhbb4957f2008-03-20 14:03:29 +0000610 if( sqlite3_value_bytes(argv[0]) >
611 db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000612 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
613 return;
614 }
drh1f0feef2007-05-15 13:27:07 +0000615 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000616
danielk19777c6303c2004-11-17 16:41:29 +0000617 if( argc==3 ){
618 /* The escape character string must consist of a single UTF-8 character.
619 ** Otherwise, return an error.
620 */
621 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000622 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000623 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000624 sqlite3_result_error(context,
625 "ESCAPE expression must be a single character", -1);
626 return;
627 }
drh66150952007-07-23 19:12:41 +0000628 escape = sqlite3Utf8Read(zEsc, 0, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000629 }
danielk19773f6b0872004-06-17 05:36:44 +0000630 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000631 struct compareInfo *pInfo = sqlite3_user_data(context);
632#ifdef SQLITE_TEST
633 sqlite3_like_count++;
634#endif
drhbeb818d2007-05-08 15:34:47 +0000635
danielk1977b56fe1f2007-05-09 08:24:44 +0000636 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000637 }
drh8912d102002-05-26 21:34:58 +0000638}
639
640/*
641** Implementation of the NULLIF(x,y) function. The result is the first
642** argument if the arguments are different. The result is NULL if the
643** arguments are equal to each other.
644*/
drhf9b596e2004-05-26 16:54:42 +0000645static void nullifFunc(
646 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000647 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +0000648 sqlite3_value **argv
649){
danielk1977dc1bdc42004-06-11 10:51:27 +0000650 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk197762c14b32008-11-19 09:05:26 +0000651 UNUSED_PARAMETER(NotUsed);
danielk1977dc1bdc42004-06-11 10:51:27 +0000652 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000653 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000654 }
drh0ac65892002-04-20 14:24:41 +0000655}
656
drh647cb0e2002-11-04 19:32:25 +0000657/*
658** Implementation of the VERSION(*) function. The result is the version
659** of the SQLite library that is running.
660*/
drhf9b596e2004-05-26 16:54:42 +0000661static void versionFunc(
662 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000663 int NotUsed,
664 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000665){
danielk197762c14b32008-11-19 09:05:26 +0000666 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977d8123362004-06-12 09:25:12 +0000667 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000668}
669
drh137c7282007-01-29 17:58:28 +0000670/* Array for converting from half-bytes (nybbles) into ASCII hex
671** digits. */
672static const char hexdigits[] = {
673 '0', '1', '2', '3', '4', '5', '6', '7',
674 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
675};
danielk1977d641d642004-11-18 15:44:29 +0000676
drh47394702003-08-20 01:03:33 +0000677/*
678** EXPERIMENTAL - This is not an official function. The interface may
679** change. This function may disappear. Do not write code that depends
680** on this function.
681**
682** Implementation of the QUOTE() function. This function takes a single
683** argument. If the argument is numeric, the return value is the same as
684** the argument. If the argument is NULL, the return value is the string
685** "NULL". Otherwise, the argument is enclosed in single quotes with
686** single-quote escapes.
687*/
danielk19770ae8b832004-05-25 12:05:56 +0000688static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000689 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000690 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000691 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000692 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000693 break;
drh47394702003-08-20 01:03:33 +0000694 }
drh9c054832004-05-31 18:51:57 +0000695 case SQLITE_INTEGER:
696 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000697 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000698 break;
699 }
danielk19773f41e972004-06-08 00:39:01 +0000700 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000701 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000702 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000703 int nBlob = sqlite3_value_bytes(argv[0]);
704 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000705 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000706 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000707 int i;
708 for(i=0; i<nBlob; i++){
709 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
710 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
711 }
712 zText[(nBlob*2)+2] = '\'';
713 zText[(nBlob*2)+3] = '\0';
714 zText[0] = 'X';
715 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000716 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000717 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000718 }
719 break;
720 }
drh9c054832004-05-31 18:51:57 +0000721 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000722 int i,j;
723 u64 n;
drh2646da72005-12-09 20:02:05 +0000724 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000725 char *z;
726
drh7a521cf2007-04-25 18:23:52 +0000727 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000728 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000729 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000730 if( z ){
731 z[0] = '\'';
732 for(i=0, j=1; zArg[i]; i++){
733 z[j++] = zArg[i];
734 if( zArg[i]=='\'' ){
735 z[j++] = '\'';
736 }
drhf9b596e2004-05-26 16:54:42 +0000737 }
danielk1977a1644fd2007-08-29 12:31:25 +0000738 z[j++] = '\'';
739 z[j] = 0;
740 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000741 }
drhf9b596e2004-05-26 16:54:42 +0000742 }
drh47394702003-08-20 01:03:33 +0000743 }
744}
745
drh137c7282007-01-29 17:58:28 +0000746/*
747** The hex() function. Interpret the argument as a blob. Return
748** a hexadecimal rendering as text.
749*/
750static void hexFunc(
751 sqlite3_context *context,
752 int argc,
753 sqlite3_value **argv
754){
755 int i, n;
756 const unsigned char *pBlob;
757 char *zHex, *z;
758 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000759 UNUSED_PARAMETER(argc);
drh1f0feef2007-05-15 13:27:07 +0000760 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000761 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000762 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000763 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000764 if( zHex ){
765 for(i=0; i<n; i++, pBlob++){
766 unsigned char c = *pBlob;
767 *(z++) = hexdigits[(c>>4)&0xf];
768 *(z++) = hexdigits[c&0xf];
769 }
770 *z = 0;
771 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000772 }
drh137c7282007-01-29 17:58:28 +0000773}
774
drh26b6d902007-03-17 13:27:54 +0000775/*
drh8cff3822007-05-02 02:08:28 +0000776** The zeroblob(N) function returns a zero-filled blob of size N bytes.
777*/
778static void zeroblobFunc(
779 sqlite3_context *context,
780 int argc,
781 sqlite3_value **argv
782){
drh98640a32007-06-07 19:08:32 +0000783 i64 n;
drh8cff3822007-05-02 02:08:28 +0000784 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000785 UNUSED_PARAMETER(argc);
drh98640a32007-06-07 19:08:32 +0000786 n = sqlite3_value_int64(argv[0]);
787 if( n>SQLITE_MAX_LENGTH ){
788 sqlite3_result_error_toobig(context);
789 }else{
drh1bd10f82008-12-10 21:19:56 +0000790 sqlite3_result_zeroblob(context, (int)n);
drh98640a32007-06-07 19:08:32 +0000791 }
drh8cff3822007-05-02 02:08:28 +0000792}
793
794/*
drh26b6d902007-03-17 13:27:54 +0000795** The replace() function. Three arguments are all strings: call
796** them A, B, and C. The result is also a string which is derived
797** from A by replacing every occurance of B with C. The match
798** must be exact. Collating sequences are not used.
799*/
800static void replaceFunc(
801 sqlite3_context *context,
802 int argc,
803 sqlite3_value **argv
804){
805 const unsigned char *zStr; /* The input string A */
806 const unsigned char *zPattern; /* The pattern string B */
807 const unsigned char *zRep; /* The replacement string C */
808 unsigned char *zOut; /* The output */
809 int nStr; /* Size of zStr */
810 int nPattern; /* Size of zPattern */
811 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000812 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000813 int loopLimit; /* Last zStr[] that might match zPattern[] */
814 int i, j; /* Loop counters */
815
816 assert( argc==3 );
danielk1977f3d3c272008-11-19 16:52:44 +0000817 UNUSED_PARAMETER(argc);
drh26b6d902007-03-17 13:27:54 +0000818 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000819 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000820 nStr = sqlite3_value_bytes(argv[0]);
821 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000822 zPattern = sqlite3_value_text(argv[1]);
drha605fe82009-02-01 18:08:40 +0000823 if( zPattern==0 ){
824 assert( sqlite3_value_type(argv[1])==SQLITE_NULL );
825 return;
826 }
827 if( zPattern[0]==0 ){
828 assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
829 sqlite3_result_value(context, argv[0]);
830 return;
831 }
drh1f0feef2007-05-15 13:27:07 +0000832 nPattern = sqlite3_value_bytes(argv[1]);
833 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000834 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000835 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000836 nRep = sqlite3_value_bytes(argv[2]);
837 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000838 nOut = nStr + 1;
839 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +0000840 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +0000841 if( zOut==0 ){
842 return;
drh26b6d902007-03-17 13:27:54 +0000843 }
drh26b6d902007-03-17 13:27:54 +0000844 loopLimit = nStr - nPattern;
845 for(i=j=0; i<=loopLimit; i++){
846 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
847 zOut[j++] = zStr[i];
848 }else{
drh4a50aac2007-08-23 02:47:53 +0000849 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +0000850 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +0000851 nOut += nRep - nPattern;
drhbb4957f2008-03-20 14:03:29 +0000852 if( nOut>=db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +0000853 sqlite3_result_error_toobig(context);
drh633e6d52008-07-28 19:34:53 +0000854 sqlite3DbFree(db, zOut);
danielk197717374e82007-05-08 14:39:04 +0000855 return;
856 }
drh4a50aac2007-08-23 02:47:53 +0000857 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000858 zOut = sqlite3_realloc(zOut, (int)nOut);
859 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000860 sqlite3_result_error_nomem(context);
drh633e6d52008-07-28 19:34:53 +0000861 sqlite3DbFree(db, zOld);
drh2e6400b2007-05-08 15:46:18 +0000862 return;
863 }
drh26b6d902007-03-17 13:27:54 +0000864 memcpy(&zOut[j], zRep, nRep);
865 j += nRep;
866 i += nPattern-1;
867 }
868 }
drh2e6400b2007-05-08 15:46:18 +0000869 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000870 memcpy(&zOut[j], &zStr[i], nStr-i);
871 j += nStr - i;
872 assert( j<=nOut );
873 zOut[j] = 0;
874 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
875}
876
drh309b3382007-03-17 17:52:42 +0000877/*
878** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
879** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
880*/
881static void trimFunc(
882 sqlite3_context *context,
883 int argc,
884 sqlite3_value **argv
885){
886 const unsigned char *zIn; /* Input string */
887 const unsigned char *zCharSet; /* Set of characters to trim */
888 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +0000889 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +0000890 int i; /* Loop counter */
drh1bd10f82008-12-10 21:19:56 +0000891 unsigned char *aLen = 0; /* Length of each character in zCharSet */
892 unsigned char **azChar = 0; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000893 int nChar; /* Number of characters in zCharSet */
894
drh309b3382007-03-17 17:52:42 +0000895 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
896 return;
897 }
898 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000899 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000900 nIn = sqlite3_value_bytes(argv[0]);
901 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000902 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000903 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +0000904 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000905 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000906 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +0000907 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +0000908 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000909 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000910 return;
drhd1e3a612007-04-27 21:59:52 +0000911 }else{
912 const unsigned char *z;
913 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000914 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000915 }
916 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +0000917 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +0000918 if( azChar==0 ){
919 return;
920 }
921 aLen = (unsigned char*)&azChar[nChar];
922 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +0000923 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +0000924 SQLITE_SKIP_UTF8(z);
drh3abbd392008-12-10 23:04:13 +0000925 aLen[nChar] = (u8)(z - azChar[nChar]);
drhd1e3a612007-04-27 21:59:52 +0000926 }
927 }
drh309b3382007-03-17 17:52:42 +0000928 }
drhd1e3a612007-04-27 21:59:52 +0000929 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +0000930 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +0000931 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000932 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +0000933 int len = 0;
drhd1e3a612007-04-27 21:59:52 +0000934 for(i=0; i<nChar; i++){
935 len = aLen[i];
936 if( memcmp(zIn, azChar[i], len)==0 ) break;
937 }
938 if( i>=nChar ) break;
939 zIn += len;
940 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000941 }
942 }
943 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000944 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +0000945 int len = 0;
drhd1e3a612007-04-27 21:59:52 +0000946 for(i=0; i<nChar; i++){
947 len = aLen[i];
948 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
949 }
950 if( i>=nChar ) break;
951 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000952 }
953 }
drhd1e3a612007-04-27 21:59:52 +0000954 if( zCharSet ){
955 sqlite3_free(azChar);
956 }
drh309b3382007-03-17 17:52:42 +0000957 }
958 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
959}
drh26b6d902007-03-17 13:27:54 +0000960
danielk1977a4de4532008-09-02 15:44:08 +0000961
drhd24cc422003-03-27 12:51:24 +0000962#ifdef SQLITE_SOUNDEX
963/*
964** Compute the soundex encoding of a word.
965*/
drh137c7282007-01-29 17:58:28 +0000966static void soundexFunc(
967 sqlite3_context *context,
968 int argc,
969 sqlite3_value **argv
970){
drhd24cc422003-03-27 12:51:24 +0000971 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000972 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000973 int i, j;
974 static const unsigned char iCode[] = {
975 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
976 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
977 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
978 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
979 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
980 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
981 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
982 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
983 };
984 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000985 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000986 if( zIn==0 ) zIn = (u8*)"";
drhdc86e2b2009-01-24 11:30:42 +0000987 for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
drhd24cc422003-03-27 12:51:24 +0000988 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000989 u8 prevcode = iCode[zIn[i]&0x7f];
danielk197778ca0e72009-01-20 16:53:39 +0000990 zResult[0] = sqlite3Toupper(zIn[i]);
drhd24cc422003-03-27 12:51:24 +0000991 for(j=1; j<4 && zIn[i]; i++){
992 int code = iCode[zIn[i]&0x7f];
993 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000994 if( code!=prevcode ){
995 prevcode = code;
996 zResult[j++] = code + '0';
997 }
998 }else{
999 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +00001000 }
1001 }
1002 while( j<4 ){
1003 zResult[j++] = '0';
1004 }
1005 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001006 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +00001007 }else{
danielk1977d8123362004-06-12 09:25:12 +00001008 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +00001009 }
1010}
1011#endif
1012
drhfdb83b22006-06-17 14:12:47 +00001013#ifndef SQLITE_OMIT_LOAD_EXTENSION
1014/*
1015** A function that loads a shared-library extension then returns NULL.
1016*/
1017static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001018 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001019 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001020 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001021 char *zErrMsg = 0;
1022
1023 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001024 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001025 }else{
1026 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001027 }
drh7a521cf2007-04-25 18:23:52 +00001028 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001029 sqlite3_result_error(context, zErrMsg, -1);
1030 sqlite3_free(zErrMsg);
1031 }
1032}
1033#endif
1034
danielk197701427a62005-01-11 13:02:33 +00001035
drh0ac65892002-04-20 14:24:41 +00001036/*
drhd3a149e2002-02-24 17:12:53 +00001037** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001038** sum() or avg() aggregate computation.
1039*/
1040typedef struct SumCtx SumCtx;
1041struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001042 double rSum; /* Floating point sum */
1043 i64 iSum; /* Integer sum */
1044 i64 cnt; /* Number of elements summed */
1045 u8 overflow; /* True if integer overflow seen */
1046 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001047};
1048
1049/*
drha97fdd32006-01-12 22:17:50 +00001050** Routines used to compute the sum, average, and total.
1051**
1052** The SUM() function follows the (broken) SQL standard which means
1053** that it returns NULL if it sums over no inputs. TOTAL returns
1054** 0.0 in that case. In addition, TOTAL always returns a float where
1055** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001056** value. TOTAL never fails, but SUM might through an exception if
1057** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001058*/
danielk19770ae8b832004-05-25 12:05:56 +00001059static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001060 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001061 int type;
drh3f219f42005-09-08 19:45:57 +00001062 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001063 UNUSED_PARAMETER(argc);
drh4f26d6c2004-05-26 23:25:30 +00001064 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001065 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001066 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001067 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001068 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001069 i64 v = sqlite3_value_int64(argv[0]);
1070 p->rSum += v;
1071 if( (p->approx|p->overflow)==0 ){
1072 i64 iNewSum = p->iSum + v;
drh1bd10f82008-12-10 21:19:56 +00001073 int s1 = (int)(p->iSum >> (sizeof(i64)*8-1));
1074 int s2 = (int)(v >> (sizeof(i64)*8-1));
1075 int s3 = (int)(iNewSum >> (sizeof(i64)*8-1));
1076 p->overflow = ((s1&s2&~s3) | (~s1&~s2&s3))?1:0;
drh8c08e862006-02-11 17:34:00 +00001077 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001078 }
1079 }else{
drh8c08e862006-02-11 17:34:00 +00001080 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001081 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001082 }
drh739105c2002-05-29 23:22:23 +00001083 }
drhdd5baa92002-02-27 19:50:59 +00001084}
danielk19770ae8b832004-05-25 12:05:56 +00001085static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001086 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001087 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001088 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001089 if( p->overflow ){
1090 sqlite3_result_error(context,"integer overflow",-1);
1091 }else if( p->approx ){
1092 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001093 }else{
drh8c08e862006-02-11 17:34:00 +00001094 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001095 }
drh3d1d95e2005-09-08 10:37:01 +00001096 }
drhdd5baa92002-02-27 19:50:59 +00001097}
danielk19770ae8b832004-05-25 12:05:56 +00001098static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001099 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001100 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001101 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001102 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001103 }
1104}
drha97fdd32006-01-12 22:17:50 +00001105static void totalFinalize(sqlite3_context *context){
1106 SumCtx *p;
1107 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001108 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001109}
drhdd5baa92002-02-27 19:50:59 +00001110
1111/*
drh0bce8352002-02-28 00:41:10 +00001112** The following structure keeps track of state information for the
1113** count() aggregate function.
1114*/
1115typedef struct CountCtx CountCtx;
1116struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001117 i64 n;
drh0bce8352002-02-28 00:41:10 +00001118};
drhdd5baa92002-02-27 19:50:59 +00001119
drh0bce8352002-02-28 00:41:10 +00001120/*
1121** Routines to implement the count() aggregate function.
1122*/
danielk19770ae8b832004-05-25 12:05:56 +00001123static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001124 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001125 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001126 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001127 p->n++;
1128 }
1129}
danielk19770ae8b832004-05-25 12:05:56 +00001130static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001131 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001132 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001133 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001134}
1135
1136/*
drh0bce8352002-02-28 00:41:10 +00001137** Routines to implement min() and max() aggregate functions.
1138*/
danielk197762c14b32008-11-19 09:05:26 +00001139static void minmaxStep(
1140 sqlite3_context *context,
1141 int NotUsed,
1142 sqlite3_value **argv
1143){
danielk197788208052004-05-25 01:13:20 +00001144 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001145 Mem *pBest;
danielk197762c14b32008-11-19 09:05:26 +00001146 UNUSED_PARAMETER(NotUsed);
drh9eb516c2004-07-18 20:52:32 +00001147
1148 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1149 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001150 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001151
danielk197788208052004-05-25 01:13:20 +00001152 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001153 int max;
1154 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001155 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001156 /* This step function is used for both the min() and max() aggregates,
1157 ** the only difference between the two being that the sense of the
1158 ** comparison is inverted. For the max() aggregate, the
1159 ** sqlite3_user_data() function returns (void *)-1. For min() it
1160 ** returns (void *)db, where db is the sqlite3* database pointer.
1161 ** Therefore the next statement sets variable 'max' to 1 for the max()
1162 ** aggregate, or 0 for min().
1163 */
drh309b3382007-03-17 17:52:42 +00001164 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001165 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001166 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001167 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001168 }
drh268380c2004-02-25 13:47:31 +00001169 }else{
drhb21c8cd2007-08-21 19:33:56 +00001170 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001171 }
1172}
danielk19770ae8b832004-05-25 12:05:56 +00001173static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001174 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001175 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1176 if( pRes ){
1177 if( pRes->flags ){
1178 sqlite3_result_value(context, pRes);
1179 }
1180 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001181 }
1182}
drhdd5baa92002-02-27 19:50:59 +00001183
drhb0689692007-11-01 17:38:30 +00001184/*
1185** group_concat(EXPR, ?SEPARATOR?)
1186*/
1187static void groupConcatStep(
1188 sqlite3_context *context,
1189 int argc,
1190 sqlite3_value **argv
1191){
1192 const char *zVal;
drhade86482007-11-28 22:36:40 +00001193 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001194 const char *zSep;
drha2baf3a2008-06-18 15:34:09 +00001195 int nVal, nSep, i;
1196 if( argc==0 || sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001197 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1198
1199 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001200 sqlite3 *db = sqlite3_context_db_handle(context);
drhade86482007-11-28 22:36:40 +00001201 pAccum->useMalloc = 1;
drhbb4957f2008-03-20 14:03:29 +00001202 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drhade86482007-11-28 22:36:40 +00001203 if( pAccum->nChar ){
drha2baf3a2008-06-18 15:34:09 +00001204 if( argc>1 ){
1205 zSep = (char*)sqlite3_value_text(argv[argc-1]);
1206 nSep = sqlite3_value_bytes(argv[argc-1]);
drhb0689692007-11-01 17:38:30 +00001207 }else{
1208 zSep = ",";
drhade86482007-11-28 22:36:40 +00001209 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001210 }
drhade86482007-11-28 22:36:40 +00001211 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001212 }
drha2baf3a2008-06-18 15:34:09 +00001213 i = 0;
1214 do{
1215 zVal = (char*)sqlite3_value_text(argv[i]);
1216 nVal = sqlite3_value_bytes(argv[i]);
1217 sqlite3StrAccumAppend(pAccum, zVal, nVal);
1218 i++;
1219 }while( i<argc-1 );
drhb0689692007-11-01 17:38:30 +00001220 }
1221}
1222static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001223 StrAccum *pAccum;
1224 pAccum = sqlite3_aggregate_context(context, 0);
1225 if( pAccum ){
1226 if( pAccum->tooBig ){
1227 sqlite3_result_error_toobig(context);
1228 }else if( pAccum->mallocFailed ){
1229 sqlite3_result_error_nomem(context);
1230 }else{
1231 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1232 sqlite3_free);
1233 }
drhb0689692007-11-01 17:38:30 +00001234 }
1235}
drh4e5ffc52004-08-31 00:52:37 +00001236
drhd3a149e2002-02-24 17:12:53 +00001237/*
drha2ed5602002-02-26 23:55:31 +00001238** This function registered all of the above C functions as SQL
1239** functions. This should be the only routine in this file with
1240** external linkage.
drhdc04c582002-02-24 01:55:15 +00001241*/
drh9bb575f2004-09-06 17:24:11 +00001242void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh1f01ec12005-02-15 21:36:18 +00001243#ifndef SQLITE_OMIT_ALTERTABLE
1244 sqlite3AlterFunctions(db);
1245#endif
danielk19771e536952007-08-16 10:09:01 +00001246 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001247 int rc = sqlite3_overload_function(db, "MATCH", 2);
1248 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1249 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001250 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001251 }
1252 }
danielk1977fd9e1f32005-05-22 10:44:34 +00001253#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001254 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001255#endif
drh55ef4d92005-08-14 01:20:37 +00001256}
1257
1258/*
1259** Set the LIKEOPT flag on the 2-argument function with the given name.
1260*/
drh1bd10f82008-12-10 21:19:56 +00001261static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
drh55ef4d92005-08-14 01:20:37 +00001262 FuncDef *pDef;
drhea678832008-12-10 19:26:22 +00001263 pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
1264 2, SQLITE_UTF8, 0);
drh55ef4d92005-08-14 01:20:37 +00001265 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001266 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001267 }
1268}
1269
1270/*
1271** Register the built-in LIKE and GLOB functions. The caseSensitive
1272** parameter determines whether or not the LIKE operator is case
1273** sensitive. GLOB is always case sensitive.
1274*/
1275void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1276 struct compareInfo *pInfo;
1277 if( caseSensitive ){
1278 pInfo = (struct compareInfo*)&likeInfoAlt;
1279 }else{
1280 pInfo = (struct compareInfo*)&likeInfoNorm;
1281 }
danielk1977771151b2006-01-17 13:21:40 +00001282 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1283 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1284 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001285 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001286 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1287 setLikeOptFlag(db, "like",
1288 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001289}
1290
1291/*
1292** pExpr points to an expression which implements a function. If
1293** it is appropriate to apply the LIKE optimization to that function
1294** then set aWc[0] through aWc[2] to the wildcard characters and
1295** return TRUE. If the function is not a LIKE-style function then
1296** return FALSE.
1297*/
drhd64fe2f2005-08-28 17:00:23 +00001298int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001299 FuncDef *pDef;
danielk1977cdbd8ef2007-05-12 06:11:12 +00001300 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
drh55ef4d92005-08-14 01:20:37 +00001301 return 0;
1302 }
1303 if( pExpr->pList->nExpr!=2 ){
1304 return 0;
1305 }
drh2646da72005-12-09 20:02:05 +00001306 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001307 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001308 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001309 return 0;
1310 }
1311
1312 /* The memcpy() statement assumes that the wildcard characters are
1313 ** the first three statements in the compareInfo structure. The
1314 ** asserts() that follow verify that assumption
1315 */
1316 memcpy(aWc, pDef->pUserData, 3);
1317 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1318 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1319 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001320 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001321 return 1;
drhdc04c582002-02-24 01:55:15 +00001322}
danielk19778c0a7912008-08-20 14:49:23 +00001323
drh70a8ca32008-08-21 18:49:27 +00001324/*
drh777c5382008-08-21 20:21:34 +00001325** All all of the FuncDef structures in the aBuiltinFunc[] array above
1326** to the global function hash table. This occurs at start-time (as
1327** a consequence of calling sqlite3_initialize()).
1328**
1329** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001330*/
1331void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001332 /*
1333 ** The following array holds FuncDef structures for all of the functions
1334 ** defined in this file.
1335 **
1336 ** The array cannot be constant since changes are made to the
1337 ** FuncDef.pHash elements at start-time. The elements of this array
1338 ** are read-only after initialization is complete.
1339 */
1340 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1341 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1342 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1343 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1344 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1345 FUNCTION(trim, 1, 3, 0, trimFunc ),
1346 FUNCTION(trim, 2, 3, 0, trimFunc ),
1347 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1348 FUNCTION(min, 0, 0, 1, 0 ),
1349 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1350 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1351 FUNCTION(max, 0, 1, 1, 0 ),
1352 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1353 FUNCTION(typeof, 1, 0, 0, typeofFunc ),
1354 FUNCTION(length, 1, 0, 0, lengthFunc ),
1355 FUNCTION(substr, 2, 0, 0, substrFunc ),
1356 FUNCTION(substr, 3, 0, 0, substrFunc ),
1357 FUNCTION(abs, 1, 0, 0, absFunc ),
1358 FUNCTION(round, 1, 0, 0, roundFunc ),
1359 FUNCTION(round, 2, 0, 0, roundFunc ),
1360 FUNCTION(upper, 1, 0, 0, upperFunc ),
1361 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1362 FUNCTION(coalesce, 1, 0, 0, 0 ),
1363 FUNCTION(coalesce, -1, 0, 0, ifnullFunc ),
1364 FUNCTION(coalesce, 0, 0, 0, 0 ),
1365 FUNCTION(hex, 1, 0, 0, hexFunc ),
1366 FUNCTION(ifnull, 2, 0, 1, ifnullFunc ),
1367 FUNCTION(random, -1, 0, 0, randomFunc ),
1368 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1369 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1370 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
1371 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1372 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1373 FUNCTION(changes, 0, 0, 0, changes ),
1374 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1375 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1376 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1377 #ifdef SQLITE_SOUNDEX
1378 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1379 #endif
1380 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1381 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1382 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1383 #endif
1384 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1385 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1386 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
1387 AGGREGATE(count, 0, 0, 0, countStep, countFinalize ),
1388 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
1389 AGGREGATE(group_concat, -1, 0, 0, groupConcatStep, groupConcatFinalize),
1390
1391 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1392 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1393 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1394 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1395 #else
1396 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1397 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1398 #endif
1399 };
1400
drh70a8ca32008-08-21 18:49:27 +00001401 int i;
danielk197793ce7412008-09-01 19:14:02 +00001402 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001403 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001404
drh70a8ca32008-08-21 18:49:27 +00001405 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001406 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001407 }
drh777c5382008-08-21 20:21:34 +00001408 sqlite3RegisterDateTimeFunctions();
drh70a8ca32008-08-21 18:49:27 +00001409}