blob: 376f3fad98c1867d1fce7fb834a2bf9b4fb1e5dc [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**
drhdc86e2b2009-01-24 11:30:42 +000019** $Id: func.c,v 1.211 2009/01/24 11:30:43 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]);
drh709cff32007-04-27 01:18:02 +0000823 if( zPattern==0 || zPattern[0]==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000824 nPattern = sqlite3_value_bytes(argv[1]);
825 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000826 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000827 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000828 nRep = sqlite3_value_bytes(argv[2]);
829 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000830 nOut = nStr + 1;
831 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +0000832 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +0000833 if( zOut==0 ){
834 return;
drh26b6d902007-03-17 13:27:54 +0000835 }
drh26b6d902007-03-17 13:27:54 +0000836 loopLimit = nStr - nPattern;
837 for(i=j=0; i<=loopLimit; i++){
838 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
839 zOut[j++] = zStr[i];
840 }else{
drh4a50aac2007-08-23 02:47:53 +0000841 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +0000842 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +0000843 nOut += nRep - nPattern;
drhbb4957f2008-03-20 14:03:29 +0000844 if( nOut>=db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +0000845 sqlite3_result_error_toobig(context);
drh633e6d52008-07-28 19:34:53 +0000846 sqlite3DbFree(db, zOut);
danielk197717374e82007-05-08 14:39:04 +0000847 return;
848 }
drh4a50aac2007-08-23 02:47:53 +0000849 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000850 zOut = sqlite3_realloc(zOut, (int)nOut);
851 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000852 sqlite3_result_error_nomem(context);
drh633e6d52008-07-28 19:34:53 +0000853 sqlite3DbFree(db, zOld);
drh2e6400b2007-05-08 15:46:18 +0000854 return;
855 }
drh26b6d902007-03-17 13:27:54 +0000856 memcpy(&zOut[j], zRep, nRep);
857 j += nRep;
858 i += nPattern-1;
859 }
860 }
drh2e6400b2007-05-08 15:46:18 +0000861 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000862 memcpy(&zOut[j], &zStr[i], nStr-i);
863 j += nStr - i;
864 assert( j<=nOut );
865 zOut[j] = 0;
866 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
867}
868
drh309b3382007-03-17 17:52:42 +0000869/*
870** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
871** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
872*/
873static void trimFunc(
874 sqlite3_context *context,
875 int argc,
876 sqlite3_value **argv
877){
878 const unsigned char *zIn; /* Input string */
879 const unsigned char *zCharSet; /* Set of characters to trim */
880 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +0000881 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +0000882 int i; /* Loop counter */
drh1bd10f82008-12-10 21:19:56 +0000883 unsigned char *aLen = 0; /* Length of each character in zCharSet */
884 unsigned char **azChar = 0; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000885 int nChar; /* Number of characters in zCharSet */
886
drh309b3382007-03-17 17:52:42 +0000887 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
888 return;
889 }
890 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000891 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000892 nIn = sqlite3_value_bytes(argv[0]);
893 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000894 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000895 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +0000896 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000897 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000898 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +0000899 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +0000900 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000901 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000902 return;
drhd1e3a612007-04-27 21:59:52 +0000903 }else{
904 const unsigned char *z;
905 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000906 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000907 }
908 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +0000909 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +0000910 if( azChar==0 ){
911 return;
912 }
913 aLen = (unsigned char*)&azChar[nChar];
914 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +0000915 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +0000916 SQLITE_SKIP_UTF8(z);
drh3abbd392008-12-10 23:04:13 +0000917 aLen[nChar] = (u8)(z - azChar[nChar]);
drhd1e3a612007-04-27 21:59:52 +0000918 }
919 }
drh309b3382007-03-17 17:52:42 +0000920 }
drhd1e3a612007-04-27 21:59:52 +0000921 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +0000922 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +0000923 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000924 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +0000925 int len = 0;
drhd1e3a612007-04-27 21:59:52 +0000926 for(i=0; i<nChar; i++){
927 len = aLen[i];
928 if( memcmp(zIn, azChar[i], len)==0 ) break;
929 }
930 if( i>=nChar ) break;
931 zIn += len;
932 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000933 }
934 }
935 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000936 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +0000937 int len = 0;
drhd1e3a612007-04-27 21:59:52 +0000938 for(i=0; i<nChar; i++){
939 len = aLen[i];
940 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
941 }
942 if( i>=nChar ) break;
943 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000944 }
945 }
drhd1e3a612007-04-27 21:59:52 +0000946 if( zCharSet ){
947 sqlite3_free(azChar);
948 }
drh309b3382007-03-17 17:52:42 +0000949 }
950 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
951}
drh26b6d902007-03-17 13:27:54 +0000952
danielk1977a4de4532008-09-02 15:44:08 +0000953
drhd24cc422003-03-27 12:51:24 +0000954#ifdef SQLITE_SOUNDEX
955/*
956** Compute the soundex encoding of a word.
957*/
drh137c7282007-01-29 17:58:28 +0000958static void soundexFunc(
959 sqlite3_context *context,
960 int argc,
961 sqlite3_value **argv
962){
drhd24cc422003-03-27 12:51:24 +0000963 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000964 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000965 int i, j;
966 static const unsigned char iCode[] = {
967 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
968 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
969 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
970 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
971 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
972 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
973 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
974 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
975 };
976 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000977 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000978 if( zIn==0 ) zIn = (u8*)"";
drhdc86e2b2009-01-24 11:30:42 +0000979 for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
drhd24cc422003-03-27 12:51:24 +0000980 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000981 u8 prevcode = iCode[zIn[i]&0x7f];
danielk197778ca0e72009-01-20 16:53:39 +0000982 zResult[0] = sqlite3Toupper(zIn[i]);
drhd24cc422003-03-27 12:51:24 +0000983 for(j=1; j<4 && zIn[i]; i++){
984 int code = iCode[zIn[i]&0x7f];
985 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000986 if( code!=prevcode ){
987 prevcode = code;
988 zResult[j++] = code + '0';
989 }
990 }else{
991 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000992 }
993 }
994 while( j<4 ){
995 zResult[j++] = '0';
996 }
997 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000998 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000999 }else{
danielk1977d8123362004-06-12 09:25:12 +00001000 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +00001001 }
1002}
1003#endif
1004
drhfdb83b22006-06-17 14:12:47 +00001005#ifndef SQLITE_OMIT_LOAD_EXTENSION
1006/*
1007** A function that loads a shared-library extension then returns NULL.
1008*/
1009static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001010 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001011 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001012 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001013 char *zErrMsg = 0;
1014
1015 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001016 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001017 }else{
1018 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001019 }
drh7a521cf2007-04-25 18:23:52 +00001020 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001021 sqlite3_result_error(context, zErrMsg, -1);
1022 sqlite3_free(zErrMsg);
1023 }
1024}
1025#endif
1026
danielk197701427a62005-01-11 13:02:33 +00001027
drh0ac65892002-04-20 14:24:41 +00001028/*
drhd3a149e2002-02-24 17:12:53 +00001029** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001030** sum() or avg() aggregate computation.
1031*/
1032typedef struct SumCtx SumCtx;
1033struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001034 double rSum; /* Floating point sum */
1035 i64 iSum; /* Integer sum */
1036 i64 cnt; /* Number of elements summed */
1037 u8 overflow; /* True if integer overflow seen */
1038 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001039};
1040
1041/*
drha97fdd32006-01-12 22:17:50 +00001042** Routines used to compute the sum, average, and total.
1043**
1044** The SUM() function follows the (broken) SQL standard which means
1045** that it returns NULL if it sums over no inputs. TOTAL returns
1046** 0.0 in that case. In addition, TOTAL always returns a float where
1047** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001048** value. TOTAL never fails, but SUM might through an exception if
1049** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001050*/
danielk19770ae8b832004-05-25 12:05:56 +00001051static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001052 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001053 int type;
drh3f219f42005-09-08 19:45:57 +00001054 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001055 UNUSED_PARAMETER(argc);
drh4f26d6c2004-05-26 23:25:30 +00001056 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001057 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001058 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001059 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001060 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001061 i64 v = sqlite3_value_int64(argv[0]);
1062 p->rSum += v;
1063 if( (p->approx|p->overflow)==0 ){
1064 i64 iNewSum = p->iSum + v;
drh1bd10f82008-12-10 21:19:56 +00001065 int s1 = (int)(p->iSum >> (sizeof(i64)*8-1));
1066 int s2 = (int)(v >> (sizeof(i64)*8-1));
1067 int s3 = (int)(iNewSum >> (sizeof(i64)*8-1));
1068 p->overflow = ((s1&s2&~s3) | (~s1&~s2&s3))?1:0;
drh8c08e862006-02-11 17:34:00 +00001069 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001070 }
1071 }else{
drh8c08e862006-02-11 17:34:00 +00001072 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001073 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001074 }
drh739105c2002-05-29 23:22:23 +00001075 }
drhdd5baa92002-02-27 19:50:59 +00001076}
danielk19770ae8b832004-05-25 12:05:56 +00001077static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001078 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001079 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001080 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001081 if( p->overflow ){
1082 sqlite3_result_error(context,"integer overflow",-1);
1083 }else if( p->approx ){
1084 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001085 }else{
drh8c08e862006-02-11 17:34:00 +00001086 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001087 }
drh3d1d95e2005-09-08 10:37:01 +00001088 }
drhdd5baa92002-02-27 19:50:59 +00001089}
danielk19770ae8b832004-05-25 12:05:56 +00001090static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001091 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001092 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001093 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001094 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001095 }
1096}
drha97fdd32006-01-12 22:17:50 +00001097static void totalFinalize(sqlite3_context *context){
1098 SumCtx *p;
1099 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001100 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001101}
drhdd5baa92002-02-27 19:50:59 +00001102
1103/*
drh0bce8352002-02-28 00:41:10 +00001104** The following structure keeps track of state information for the
1105** count() aggregate function.
1106*/
1107typedef struct CountCtx CountCtx;
1108struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001109 i64 n;
drh0bce8352002-02-28 00:41:10 +00001110};
drhdd5baa92002-02-27 19:50:59 +00001111
drh0bce8352002-02-28 00:41:10 +00001112/*
1113** Routines to implement the count() aggregate function.
1114*/
danielk19770ae8b832004-05-25 12:05:56 +00001115static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001116 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001117 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001118 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001119 p->n++;
1120 }
1121}
danielk19770ae8b832004-05-25 12:05:56 +00001122static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001123 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001124 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001125 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001126}
1127
1128/*
drh0bce8352002-02-28 00:41:10 +00001129** Routines to implement min() and max() aggregate functions.
1130*/
danielk197762c14b32008-11-19 09:05:26 +00001131static void minmaxStep(
1132 sqlite3_context *context,
1133 int NotUsed,
1134 sqlite3_value **argv
1135){
danielk197788208052004-05-25 01:13:20 +00001136 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001137 Mem *pBest;
danielk197762c14b32008-11-19 09:05:26 +00001138 UNUSED_PARAMETER(NotUsed);
drh9eb516c2004-07-18 20:52:32 +00001139
1140 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1141 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001142 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001143
danielk197788208052004-05-25 01:13:20 +00001144 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001145 int max;
1146 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001147 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001148 /* This step function is used for both the min() and max() aggregates,
1149 ** the only difference between the two being that the sense of the
1150 ** comparison is inverted. For the max() aggregate, the
1151 ** sqlite3_user_data() function returns (void *)-1. For min() it
1152 ** returns (void *)db, where db is the sqlite3* database pointer.
1153 ** Therefore the next statement sets variable 'max' to 1 for the max()
1154 ** aggregate, or 0 for min().
1155 */
drh309b3382007-03-17 17:52:42 +00001156 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001157 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001158 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001159 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001160 }
drh268380c2004-02-25 13:47:31 +00001161 }else{
drhb21c8cd2007-08-21 19:33:56 +00001162 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001163 }
1164}
danielk19770ae8b832004-05-25 12:05:56 +00001165static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001166 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001167 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1168 if( pRes ){
1169 if( pRes->flags ){
1170 sqlite3_result_value(context, pRes);
1171 }
1172 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001173 }
1174}
drhdd5baa92002-02-27 19:50:59 +00001175
drhb0689692007-11-01 17:38:30 +00001176/*
1177** group_concat(EXPR, ?SEPARATOR?)
1178*/
1179static void groupConcatStep(
1180 sqlite3_context *context,
1181 int argc,
1182 sqlite3_value **argv
1183){
1184 const char *zVal;
drhade86482007-11-28 22:36:40 +00001185 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001186 const char *zSep;
drha2baf3a2008-06-18 15:34:09 +00001187 int nVal, nSep, i;
1188 if( argc==0 || sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001189 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1190
1191 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001192 sqlite3 *db = sqlite3_context_db_handle(context);
drhade86482007-11-28 22:36:40 +00001193 pAccum->useMalloc = 1;
drhbb4957f2008-03-20 14:03:29 +00001194 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drhade86482007-11-28 22:36:40 +00001195 if( pAccum->nChar ){
drha2baf3a2008-06-18 15:34:09 +00001196 if( argc>1 ){
1197 zSep = (char*)sqlite3_value_text(argv[argc-1]);
1198 nSep = sqlite3_value_bytes(argv[argc-1]);
drhb0689692007-11-01 17:38:30 +00001199 }else{
1200 zSep = ",";
drhade86482007-11-28 22:36:40 +00001201 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001202 }
drhade86482007-11-28 22:36:40 +00001203 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001204 }
drha2baf3a2008-06-18 15:34:09 +00001205 i = 0;
1206 do{
1207 zVal = (char*)sqlite3_value_text(argv[i]);
1208 nVal = sqlite3_value_bytes(argv[i]);
1209 sqlite3StrAccumAppend(pAccum, zVal, nVal);
1210 i++;
1211 }while( i<argc-1 );
drhb0689692007-11-01 17:38:30 +00001212 }
1213}
1214static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001215 StrAccum *pAccum;
1216 pAccum = sqlite3_aggregate_context(context, 0);
1217 if( pAccum ){
1218 if( pAccum->tooBig ){
1219 sqlite3_result_error_toobig(context);
1220 }else if( pAccum->mallocFailed ){
1221 sqlite3_result_error_nomem(context);
1222 }else{
1223 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1224 sqlite3_free);
1225 }
drhb0689692007-11-01 17:38:30 +00001226 }
1227}
drh4e5ffc52004-08-31 00:52:37 +00001228
drhd3a149e2002-02-24 17:12:53 +00001229/*
drha2ed5602002-02-26 23:55:31 +00001230** This function registered all of the above C functions as SQL
1231** functions. This should be the only routine in this file with
1232** external linkage.
drhdc04c582002-02-24 01:55:15 +00001233*/
drh9bb575f2004-09-06 17:24:11 +00001234void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh1f01ec12005-02-15 21:36:18 +00001235#ifndef SQLITE_OMIT_ALTERTABLE
1236 sqlite3AlterFunctions(db);
1237#endif
danielk19771e536952007-08-16 10:09:01 +00001238 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001239 int rc = sqlite3_overload_function(db, "MATCH", 2);
1240 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1241 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001242 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001243 }
1244 }
danielk1977fd9e1f32005-05-22 10:44:34 +00001245#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001246 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001247#endif
drh55ef4d92005-08-14 01:20:37 +00001248}
1249
1250/*
1251** Set the LIKEOPT flag on the 2-argument function with the given name.
1252*/
drh1bd10f82008-12-10 21:19:56 +00001253static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
drh55ef4d92005-08-14 01:20:37 +00001254 FuncDef *pDef;
drhea678832008-12-10 19:26:22 +00001255 pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
1256 2, SQLITE_UTF8, 0);
drh55ef4d92005-08-14 01:20:37 +00001257 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001258 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001259 }
1260}
1261
1262/*
1263** Register the built-in LIKE and GLOB functions. The caseSensitive
1264** parameter determines whether or not the LIKE operator is case
1265** sensitive. GLOB is always case sensitive.
1266*/
1267void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1268 struct compareInfo *pInfo;
1269 if( caseSensitive ){
1270 pInfo = (struct compareInfo*)&likeInfoAlt;
1271 }else{
1272 pInfo = (struct compareInfo*)&likeInfoNorm;
1273 }
danielk1977771151b2006-01-17 13:21:40 +00001274 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1275 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1276 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001277 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001278 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1279 setLikeOptFlag(db, "like",
1280 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001281}
1282
1283/*
1284** pExpr points to an expression which implements a function. If
1285** it is appropriate to apply the LIKE optimization to that function
1286** then set aWc[0] through aWc[2] to the wildcard characters and
1287** return TRUE. If the function is not a LIKE-style function then
1288** return FALSE.
1289*/
drhd64fe2f2005-08-28 17:00:23 +00001290int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001291 FuncDef *pDef;
danielk1977cdbd8ef2007-05-12 06:11:12 +00001292 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
drh55ef4d92005-08-14 01:20:37 +00001293 return 0;
1294 }
1295 if( pExpr->pList->nExpr!=2 ){
1296 return 0;
1297 }
drh2646da72005-12-09 20:02:05 +00001298 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001299 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001300 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001301 return 0;
1302 }
1303
1304 /* The memcpy() statement assumes that the wildcard characters are
1305 ** the first three statements in the compareInfo structure. The
1306 ** asserts() that follow verify that assumption
1307 */
1308 memcpy(aWc, pDef->pUserData, 3);
1309 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1310 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1311 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001312 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001313 return 1;
drhdc04c582002-02-24 01:55:15 +00001314}
danielk19778c0a7912008-08-20 14:49:23 +00001315
drh70a8ca32008-08-21 18:49:27 +00001316/*
drh777c5382008-08-21 20:21:34 +00001317** All all of the FuncDef structures in the aBuiltinFunc[] array above
1318** to the global function hash table. This occurs at start-time (as
1319** a consequence of calling sqlite3_initialize()).
1320**
1321** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001322*/
1323void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001324 /*
1325 ** The following array holds FuncDef structures for all of the functions
1326 ** defined in this file.
1327 **
1328 ** The array cannot be constant since changes are made to the
1329 ** FuncDef.pHash elements at start-time. The elements of this array
1330 ** are read-only after initialization is complete.
1331 */
1332 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1333 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1334 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1335 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1336 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1337 FUNCTION(trim, 1, 3, 0, trimFunc ),
1338 FUNCTION(trim, 2, 3, 0, trimFunc ),
1339 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1340 FUNCTION(min, 0, 0, 1, 0 ),
1341 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1342 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1343 FUNCTION(max, 0, 1, 1, 0 ),
1344 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1345 FUNCTION(typeof, 1, 0, 0, typeofFunc ),
1346 FUNCTION(length, 1, 0, 0, lengthFunc ),
1347 FUNCTION(substr, 2, 0, 0, substrFunc ),
1348 FUNCTION(substr, 3, 0, 0, substrFunc ),
1349 FUNCTION(abs, 1, 0, 0, absFunc ),
1350 FUNCTION(round, 1, 0, 0, roundFunc ),
1351 FUNCTION(round, 2, 0, 0, roundFunc ),
1352 FUNCTION(upper, 1, 0, 0, upperFunc ),
1353 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1354 FUNCTION(coalesce, 1, 0, 0, 0 ),
1355 FUNCTION(coalesce, -1, 0, 0, ifnullFunc ),
1356 FUNCTION(coalesce, 0, 0, 0, 0 ),
1357 FUNCTION(hex, 1, 0, 0, hexFunc ),
1358 FUNCTION(ifnull, 2, 0, 1, ifnullFunc ),
1359 FUNCTION(random, -1, 0, 0, randomFunc ),
1360 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1361 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1362 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
1363 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1364 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1365 FUNCTION(changes, 0, 0, 0, changes ),
1366 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1367 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1368 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1369 #ifdef SQLITE_SOUNDEX
1370 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1371 #endif
1372 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1373 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1374 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1375 #endif
1376 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1377 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1378 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
1379 AGGREGATE(count, 0, 0, 0, countStep, countFinalize ),
1380 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
1381 AGGREGATE(group_concat, -1, 0, 0, groupConcatStep, groupConcatFinalize),
1382
1383 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1384 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1385 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1386 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1387 #else
1388 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1389 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1390 #endif
1391 };
1392
drh70a8ca32008-08-21 18:49:27 +00001393 int i;
danielk197793ce7412008-09-01 19:14:02 +00001394 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001395 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001396
drh70a8ca32008-08-21 18:49:27 +00001397 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001398 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001399 }
drh777c5382008-08-21 20:21:34 +00001400 sqlite3RegisterDateTimeFunctions();
drh70a8ca32008-08-21 18:49:27 +00001401}