blob: 6ef377491fab9b2609a44478a1ab38381a85add9 [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**
drh8198d252009-02-01 19:42:37 +000019** $Id: func.c,v 1.214 2009/02/01 19:42:38 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 );
drh8198d252009-02-01 19:42:37 +0000174 if( sqlite3_value_type(argv[1])==SQLITE_NULL
175 || (argc==3 && sqlite3_value_type(argv[2])==SQLITE_NULL)
176 ){
177 return;
178 }
drhf764e6f2007-05-15 01:13:47 +0000179 p0type = sqlite3_value_type(argv[0]);
180 if( p0type==SQLITE_BLOB ){
181 len = sqlite3_value_bytes(argv[0]);
182 z = sqlite3_value_blob(argv[0]);
183 if( z==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000184 assert( len==sqlite3_value_bytes(argv[0]) );
drhf764e6f2007-05-15 01:13:47 +0000185 }else{
186 z = sqlite3_value_text(argv[0]);
187 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000188 len = 0;
189 for(z2=z; *z2; len++){
190 SQLITE_SKIP_UTF8(z2);
191 }
drhf764e6f2007-05-15 01:13:47 +0000192 }
danielk197751ad0ec2004-05-24 12:39:02 +0000193 p1 = sqlite3_value_int(argv[1]);
drh64f31512007-10-12 19:11:55 +0000194 if( argc==3 ){
195 p2 = sqlite3_value_int(argv[2]);
196 }else{
drhbb4957f2008-03-20 14:03:29 +0000197 p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH];
drh64f31512007-10-12 19:11:55 +0000198 }
drh0bce8352002-02-28 00:41:10 +0000199 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000200 p1 += len;
drh653bc752002-02-28 03:31:10 +0000201 if( p1<0 ){
202 p2 += p1;
203 p1 = 0;
204 }
drh0bce8352002-02-28 00:41:10 +0000205 }else if( p1>0 ){
206 p1--;
207 }
drh4e79c592009-02-01 19:23:32 +0000208 if( p2<0 ){
209 p1 += p2;
210 p2 = -p2;
211 if( p1<0 ){
212 p2 += p1;
213 p1 = 0;
214 }
215 }
drh0bce8352002-02-28 00:41:10 +0000216 if( p1+p2>len ){
217 p2 = len-p1;
218 }
drhf764e6f2007-05-15 01:13:47 +0000219 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000220 while( *z && p1 ){
221 SQLITE_SKIP_UTF8(z);
222 p1--;
drhf764e6f2007-05-15 01:13:47 +0000223 }
drh4a919112007-05-15 11:55:09 +0000224 for(z2=z; *z2 && p2; p2--){
225 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000226 }
drh1bd10f82008-12-10 21:19:56 +0000227 sqlite3_result_text(context, (char*)z, (int)(z2-z), SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000228 }else{
229 if( p2<0 ) p2 = 0;
drh1bd10f82008-12-10 21:19:56 +0000230 sqlite3_result_blob(context, (char*)&z[p1], (int)p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000231 }
drh0bce8352002-02-28 00:41:10 +0000232}
233
234/*
235** Implementation of the round() function
236*/
danielk19770ae8b832004-05-25 12:05:56 +0000237static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000238 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000239 double r;
drh592ac8c2005-08-13 03:07:47 +0000240 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000241 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000242 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000243 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000244 n = sqlite3_value_int(argv[1]);
245 if( n>30 ) n = 30;
246 if( n<0 ) n = 0;
247 }
drhd589a922006-03-02 03:02:48 +0000248 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000249 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000250 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000251 sqlite3AtoF(zBuf, &r);
252 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000253}
drhdc04c582002-02-24 01:55:15 +0000254
danielk197726783a52007-08-29 14:06:22 +0000255/*
256** Allocate nByte bytes of space using sqlite3_malloc(). If the
257** allocation fails, call sqlite3_result_error_nomem() to notify
258** the database handle that malloc() has failed.
259*/
drhb1a6c3c2008-03-20 16:30:17 +0000260static void *contextMalloc(sqlite3_context *context, i64 nByte){
drhbb4957f2008-03-20 14:03:29 +0000261 char *z;
262 if( nByte>sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH] ){
263 sqlite3_result_error_toobig(context);
264 z = 0;
265 }else{
drh1bd10f82008-12-10 21:19:56 +0000266 z = sqlite3Malloc((int)nByte);
drhbb4957f2008-03-20 14:03:29 +0000267 if( !z && nByte>0 ){
268 sqlite3_result_error_nomem(context);
269 }
danielk1977a1644fd2007-08-29 12:31:25 +0000270 }
271 return z;
272}
273
drhdc04c582002-02-24 01:55:15 +0000274/*
275** Implementation of the upper() and lower() SQL functions.
276*/
danielk19770ae8b832004-05-25 12:05:56 +0000277static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000278 char *z1;
279 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000280 int i, n;
drh9c054832004-05-31 18:51:57 +0000281 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000282 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000283 n = sqlite3_value_bytes(argv[0]);
284 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
285 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000286 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000287 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000288 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000289 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000290 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000291 z1[i] = (char)sqlite3Toupper(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000292 }
293 sqlite3_result_text(context, z1, -1, sqlite3_free);
294 }
drhdc04c582002-02-24 01:55:15 +0000295 }
296}
danielk19770ae8b832004-05-25 12:05:56 +0000297static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197778ca0e72009-01-20 16:53:39 +0000298 u8 *z1;
drh7a521cf2007-04-25 18:23:52 +0000299 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000300 int i, n;
drh9c054832004-05-31 18:51:57 +0000301 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000302 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000303 n = sqlite3_value_bytes(argv[0]);
304 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
305 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000306 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000307 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000308 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000309 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000310 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000311 z1[i] = sqlite3Tolower(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000312 }
danielk197778ca0e72009-01-20 16:53:39 +0000313 sqlite3_result_text(context, (char *)z1, -1, sqlite3_free);
drh7a521cf2007-04-25 18:23:52 +0000314 }
drhdc04c582002-02-24 01:55:15 +0000315 }
316}
317
318/*
drhfbc99082002-02-28 03:14:18 +0000319** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000320** All three do the same thing. They return the first non-NULL
321** argument.
drh3212e182002-02-28 00:46:26 +0000322*/
drhf9b596e2004-05-26 16:54:42 +0000323static void ifnullFunc(
324 sqlite3_context *context,
325 int argc,
326 sqlite3_value **argv
327){
drhfbc99082002-02-28 03:14:18 +0000328 int i;
329 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000330 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000331 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000332 break;
333 }
334 }
drh3212e182002-02-28 00:46:26 +0000335}
336
337/*
drhf9ffac92002-03-02 19:00:31 +0000338** Implementation of random(). Return a random integer.
339*/
drhf9b596e2004-05-26 16:54:42 +0000340static void randomFunc(
341 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000342 int NotUsed,
343 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000344){
drh52fc8492006-02-23 21:43:55 +0000345 sqlite_int64 r;
danielk197762c14b32008-11-19 09:05:26 +0000346 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drh2fa18682008-03-19 14:15:34 +0000347 sqlite3_randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000348 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
349 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000350 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000351}
352
353/*
drh137c7282007-01-29 17:58:28 +0000354** Implementation of randomblob(N). Return a random blob
355** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000356*/
drh137c7282007-01-29 17:58:28 +0000357static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000358 sqlite3_context *context,
359 int argc,
360 sqlite3_value **argv
361){
drh137c7282007-01-29 17:58:28 +0000362 int n;
363 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000364 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000365 UNUSED_PARAMETER(argc);
drh63cf66f2007-01-29 15:50:05 +0000366 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000367 if( n<1 ){
368 n = 1;
369 }
danielk1977a1644fd2007-08-29 12:31:25 +0000370 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000371 if( p ){
drh2fa18682008-03-19 14:15:34 +0000372 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000373 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000374 }
drh63cf66f2007-01-29 15:50:05 +0000375}
376
377/*
drh6ed41ad2002-04-06 14:10:47 +0000378** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000379** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000380*/
danielk197751ad0ec2004-05-24 12:39:02 +0000381static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000382 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000383 int NotUsed,
384 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000385){
drhfa4a4b92008-03-19 21:45:51 +0000386 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000387 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf9b596e2004-05-26 16:54:42 +0000388 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000389}
390
rdcf146a772004-02-25 22:51:06 +0000391/*
danielk1977b28af712004-06-21 06:50:26 +0000392** Implementation of the changes() SQL function. The return value is the
393** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000394*/
danielk1977b28af712004-06-21 06:50:26 +0000395static void changes(
drhf9b596e2004-05-26 16:54:42 +0000396 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000397 int NotUsed,
398 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000399){
drhfa4a4b92008-03-19 21:45:51 +0000400 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000401 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf4479502004-05-27 03:12:53 +0000402 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000403}
rdcf146a772004-02-25 22:51:06 +0000404
405/*
danielk1977b28af712004-06-21 06:50:26 +0000406** Implementation of the total_changes() SQL function. The return value is
407** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000408*/
danielk1977b28af712004-06-21 06:50:26 +0000409static void total_changes(
410 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000411 int NotUsed,
412 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000413){
drhfa4a4b92008-03-19 21:45:51 +0000414 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000415 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977b28af712004-06-21 06:50:26 +0000416 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000417}
418
drh6ed41ad2002-04-06 14:10:47 +0000419/*
drh4e5ffc52004-08-31 00:52:37 +0000420** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000421*/
drh4e5ffc52004-08-31 00:52:37 +0000422struct compareInfo {
423 u8 matchAll;
424 u8 matchOne;
425 u8 matchSet;
426 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000427};
drh55ef4d92005-08-14 01:20:37 +0000428
drhb9175ae2007-12-07 18:39:04 +0000429/*
430** For LIKE and GLOB matching on EBCDIC machines, assume that every
431** character is exactly one byte in size. Also, all characters are
432** able to participate in upper-case-to-lower-case mappings in EBCDIC
433** whereas only characters less than 0x80 do in ASCII.
434*/
435#if defined(SQLITE_EBCDIC)
436# define sqlite3Utf8Read(A,B,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000437# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000438#else
drh6ed4b782007-12-10 18:07:20 +0000439# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000440#endif
441
drh4e5ffc52004-08-31 00:52:37 +0000442static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000443/* The correct SQL-92 behavior is for the LIKE operator to ignore
444** case. Thus 'a' LIKE 'A' would be true. */
445static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
446/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
447** is case sensitive causing 'a' LIKE 'A' to be false */
448static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000449
450/*
drh4e5ffc52004-08-31 00:52:37 +0000451** Compare two UTF-8 strings for equality where the first string can
452** potentially be a "glob" expression. Return true (1) if they
453** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000454**
drh4e5ffc52004-08-31 00:52:37 +0000455** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000456**
drh4e5ffc52004-08-31 00:52:37 +0000457** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000458**
drh4e5ffc52004-08-31 00:52:37 +0000459** '?' Matches exactly one character.
460**
461** [...] Matches one character from the enclosed list of
462** characters.
463**
464** [^...] Matches one character not in the enclosed list.
465**
466** With the [...] and [^...] matching, a ']' character can be included
467** in the list by making it the first character after '[' or '^'. A
468** range of characters can be specified using '-'. Example:
469** "[a-z]" matches any single lower-case letter. To match a '-', make
470** it the last character in the list.
471**
472** This routine is usually quick, but can be N**2 in the worst case.
473**
474** Hints: to match '*' or '?', put them in "[]". Like this:
475**
476** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000477*/
danielk19777c6303c2004-11-17 16:41:29 +0000478static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000479 const u8 *zPattern, /* The glob pattern */
480 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000481 const struct compareInfo *pInfo, /* Information about how to do the compare */
482 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000483){
drh66150952007-07-23 19:12:41 +0000484 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000485 int invert;
486 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000487 u8 matchOne = pInfo->matchOne;
488 u8 matchAll = pInfo->matchAll;
489 u8 matchSet = pInfo->matchSet;
490 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000491 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000492
drh66150952007-07-23 19:12:41 +0000493 while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000494 if( !prevEscape && c==matchAll ){
drh66150952007-07-23 19:12:41 +0000495 while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll
496 || c == matchOne ){
497 if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){
498 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000499 }
danielk1977ad7dd422004-06-06 12:41:49 +0000500 }
drh66150952007-07-23 19:12:41 +0000501 if( c==0 ){
502 return 1;
503 }else if( c==esc ){
504 c = sqlite3Utf8Read(zPattern, 0, &zPattern);
505 if( c==0 ){
506 return 0;
507 }
508 }else if( c==matchSet ){
509 assert( esc==0 ); /* This is GLOB, not LIKE */
510 assert( matchSet<0x80 ); /* '[' is a single-byte character */
511 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000512 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000513 }
514 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000515 }
516 while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){
517 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000518 GlogUpperToLower(c2);
519 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000520 while( c2 != 0 && c2 != c ){
521 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh6ed4b782007-12-10 18:07:20 +0000522 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000523 }
drh66150952007-07-23 19:12:41 +0000524 }else{
525 while( c2 != 0 && c2 != c ){
526 c2 = sqlite3Utf8Read(zString, 0, &zString);
527 }
drh4e5ffc52004-08-31 00:52:37 +0000528 }
drh66150952007-07-23 19:12:41 +0000529 if( c2==0 ) return 0;
530 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
531 }
532 return 0;
533 }else if( !prevEscape && c==matchOne ){
534 if( sqlite3Utf8Read(zString, 0, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000535 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000536 }
drh4e5ffc52004-08-31 00:52:37 +0000537 }else if( c==matchSet ){
538 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000539 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000540 seen = 0;
541 invert = 0;
drh66150952007-07-23 19:12:41 +0000542 c = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000543 if( c==0 ) return 0;
drh66150952007-07-23 19:12:41 +0000544 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
545 if( c2=='^' ){
546 invert = 1;
547 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
548 }
drh4e5ffc52004-08-31 00:52:37 +0000549 if( c2==']' ){
550 if( c==']' ) seen = 1;
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 while( c2 && c2!=']' ){
554 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
555 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000556 if( c>=prior_c && c<=c2 ) seen = 1;
557 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000558 }else{
drh66150952007-07-23 19:12:41 +0000559 if( c==c2 ){
560 seen = 1;
561 }
drh4e5ffc52004-08-31 00:52:37 +0000562 prior_c = c2;
563 }
drh66150952007-07-23 19:12:41 +0000564 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000565 }
drh66150952007-07-23 19:12:41 +0000566 if( c2==0 || (seen ^ invert)==0 ){
567 return 0;
568 }
569 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000570 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000571 }else{
drh66150952007-07-23 19:12:41 +0000572 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000573 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000574 GlogUpperToLower(c);
575 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000576 }
drh66150952007-07-23 19:12:41 +0000577 if( c!=c2 ){
578 return 0;
579 }
danielk19777c6303c2004-11-17 16:41:29 +0000580 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000581 }
danielk197751ad0ec2004-05-24 12:39:02 +0000582 }
drh4e5ffc52004-08-31 00:52:37 +0000583 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000584}
drh4e5ffc52004-08-31 00:52:37 +0000585
drh55ef4d92005-08-14 01:20:37 +0000586/*
587** Count the number of times that the LIKE operator (or GLOB which is
588** just a variation of LIKE) gets called. This is used for testing
589** only.
590*/
591#ifdef SQLITE_TEST
592int sqlite3_like_count = 0;
593#endif
594
danielk19773f6b0872004-06-17 05:36:44 +0000595
596/*
597** Implementation of the like() SQL function. This function implements
598** the build-in LIKE operator. The first argument to the function is the
599** pattern and the second argument is the string. So, the SQL statements:
600**
601** A LIKE B
602**
603** is implemented as like(B,A).
604**
drh55ef4d92005-08-14 01:20:37 +0000605** This same function (with a different compareInfo structure) computes
606** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000607*/
608static void likeFunc(
609 sqlite3_context *context,
610 int argc,
611 sqlite3_value **argv
612){
drhbeb818d2007-05-08 15:34:47 +0000613 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000614 int escape = 0;
drhbb4957f2008-03-20 14:03:29 +0000615 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000616
drh1f0feef2007-05-15 13:27:07 +0000617 zB = sqlite3_value_text(argv[0]);
618 zA = sqlite3_value_text(argv[1]);
619
drhbeb818d2007-05-08 15:34:47 +0000620 /* Limit the length of the LIKE or GLOB pattern to avoid problems
621 ** of deep recursion and N*N behavior in patternCompare().
622 */
drhbb4957f2008-03-20 14:03:29 +0000623 if( sqlite3_value_bytes(argv[0]) >
624 db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000625 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
626 return;
627 }
drh1f0feef2007-05-15 13:27:07 +0000628 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000629
danielk19777c6303c2004-11-17 16:41:29 +0000630 if( argc==3 ){
631 /* The escape character string must consist of a single UTF-8 character.
632 ** Otherwise, return an error.
633 */
634 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000635 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000636 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000637 sqlite3_result_error(context,
638 "ESCAPE expression must be a single character", -1);
639 return;
640 }
drh66150952007-07-23 19:12:41 +0000641 escape = sqlite3Utf8Read(zEsc, 0, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000642 }
danielk19773f6b0872004-06-17 05:36:44 +0000643 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000644 struct compareInfo *pInfo = sqlite3_user_data(context);
645#ifdef SQLITE_TEST
646 sqlite3_like_count++;
647#endif
drhbeb818d2007-05-08 15:34:47 +0000648
danielk1977b56fe1f2007-05-09 08:24:44 +0000649 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000650 }
drh8912d102002-05-26 21:34:58 +0000651}
652
653/*
654** Implementation of the NULLIF(x,y) function. The result is the first
655** argument if the arguments are different. The result is NULL if the
656** arguments are equal to each other.
657*/
drhf9b596e2004-05-26 16:54:42 +0000658static void nullifFunc(
659 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000660 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +0000661 sqlite3_value **argv
662){
danielk1977dc1bdc42004-06-11 10:51:27 +0000663 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk197762c14b32008-11-19 09:05:26 +0000664 UNUSED_PARAMETER(NotUsed);
danielk1977dc1bdc42004-06-11 10:51:27 +0000665 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000666 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000667 }
drh0ac65892002-04-20 14:24:41 +0000668}
669
drh647cb0e2002-11-04 19:32:25 +0000670/*
671** Implementation of the VERSION(*) function. The result is the version
672** of the SQLite library that is running.
673*/
drhf9b596e2004-05-26 16:54:42 +0000674static void versionFunc(
675 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000676 int NotUsed,
677 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000678){
danielk197762c14b32008-11-19 09:05:26 +0000679 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977d8123362004-06-12 09:25:12 +0000680 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000681}
682
drh137c7282007-01-29 17:58:28 +0000683/* Array for converting from half-bytes (nybbles) into ASCII hex
684** digits. */
685static const char hexdigits[] = {
686 '0', '1', '2', '3', '4', '5', '6', '7',
687 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
688};
danielk1977d641d642004-11-18 15:44:29 +0000689
drh47394702003-08-20 01:03:33 +0000690/*
691** EXPERIMENTAL - This is not an official function. The interface may
692** change. This function may disappear. Do not write code that depends
693** on this function.
694**
695** Implementation of the QUOTE() function. This function takes a single
696** argument. If the argument is numeric, the return value is the same as
697** the argument. If the argument is NULL, the return value is the string
698** "NULL". Otherwise, the argument is enclosed in single quotes with
699** single-quote escapes.
700*/
danielk19770ae8b832004-05-25 12:05:56 +0000701static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000702 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000703 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000704 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000705 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000706 break;
drh47394702003-08-20 01:03:33 +0000707 }
drh9c054832004-05-31 18:51:57 +0000708 case SQLITE_INTEGER:
709 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000710 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000711 break;
712 }
danielk19773f41e972004-06-08 00:39:01 +0000713 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000714 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000715 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000716 int nBlob = sqlite3_value_bytes(argv[0]);
717 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000718 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000719 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000720 int i;
721 for(i=0; i<nBlob; i++){
722 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
723 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
724 }
725 zText[(nBlob*2)+2] = '\'';
726 zText[(nBlob*2)+3] = '\0';
727 zText[0] = 'X';
728 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000729 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000730 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000731 }
732 break;
733 }
drh9c054832004-05-31 18:51:57 +0000734 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000735 int i,j;
736 u64 n;
drh2646da72005-12-09 20:02:05 +0000737 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000738 char *z;
739
drh7a521cf2007-04-25 18:23:52 +0000740 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000741 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000742 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000743 if( z ){
744 z[0] = '\'';
745 for(i=0, j=1; zArg[i]; i++){
746 z[j++] = zArg[i];
747 if( zArg[i]=='\'' ){
748 z[j++] = '\'';
749 }
drhf9b596e2004-05-26 16:54:42 +0000750 }
danielk1977a1644fd2007-08-29 12:31:25 +0000751 z[j++] = '\'';
752 z[j] = 0;
753 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000754 }
drhf9b596e2004-05-26 16:54:42 +0000755 }
drh47394702003-08-20 01:03:33 +0000756 }
757}
758
drh137c7282007-01-29 17:58:28 +0000759/*
760** The hex() function. Interpret the argument as a blob. Return
761** a hexadecimal rendering as text.
762*/
763static void hexFunc(
764 sqlite3_context *context,
765 int argc,
766 sqlite3_value **argv
767){
768 int i, n;
769 const unsigned char *pBlob;
770 char *zHex, *z;
771 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000772 UNUSED_PARAMETER(argc);
drh1f0feef2007-05-15 13:27:07 +0000773 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000774 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000775 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000776 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000777 if( zHex ){
778 for(i=0; i<n; i++, pBlob++){
779 unsigned char c = *pBlob;
780 *(z++) = hexdigits[(c>>4)&0xf];
781 *(z++) = hexdigits[c&0xf];
782 }
783 *z = 0;
784 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000785 }
drh137c7282007-01-29 17:58:28 +0000786}
787
drh26b6d902007-03-17 13:27:54 +0000788/*
drh8cff3822007-05-02 02:08:28 +0000789** The zeroblob(N) function returns a zero-filled blob of size N bytes.
790*/
791static void zeroblobFunc(
792 sqlite3_context *context,
793 int argc,
794 sqlite3_value **argv
795){
drh98640a32007-06-07 19:08:32 +0000796 i64 n;
drh8cff3822007-05-02 02:08:28 +0000797 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000798 UNUSED_PARAMETER(argc);
drh98640a32007-06-07 19:08:32 +0000799 n = sqlite3_value_int64(argv[0]);
800 if( n>SQLITE_MAX_LENGTH ){
801 sqlite3_result_error_toobig(context);
802 }else{
drh1bd10f82008-12-10 21:19:56 +0000803 sqlite3_result_zeroblob(context, (int)n);
drh98640a32007-06-07 19:08:32 +0000804 }
drh8cff3822007-05-02 02:08:28 +0000805}
806
807/*
drh26b6d902007-03-17 13:27:54 +0000808** The replace() function. Three arguments are all strings: call
809** them A, B, and C. The result is also a string which is derived
810** from A by replacing every occurance of B with C. The match
811** must be exact. Collating sequences are not used.
812*/
813static void replaceFunc(
814 sqlite3_context *context,
815 int argc,
816 sqlite3_value **argv
817){
818 const unsigned char *zStr; /* The input string A */
819 const unsigned char *zPattern; /* The pattern string B */
820 const unsigned char *zRep; /* The replacement string C */
821 unsigned char *zOut; /* The output */
822 int nStr; /* Size of zStr */
823 int nPattern; /* Size of zPattern */
824 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000825 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000826 int loopLimit; /* Last zStr[] that might match zPattern[] */
827 int i, j; /* Loop counters */
828
829 assert( argc==3 );
danielk1977f3d3c272008-11-19 16:52:44 +0000830 UNUSED_PARAMETER(argc);
drh26b6d902007-03-17 13:27:54 +0000831 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000832 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000833 nStr = sqlite3_value_bytes(argv[0]);
834 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000835 zPattern = sqlite3_value_text(argv[1]);
drha605fe82009-02-01 18:08:40 +0000836 if( zPattern==0 ){
837 assert( sqlite3_value_type(argv[1])==SQLITE_NULL );
838 return;
839 }
840 if( zPattern[0]==0 ){
841 assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
842 sqlite3_result_value(context, argv[0]);
843 return;
844 }
drh1f0feef2007-05-15 13:27:07 +0000845 nPattern = sqlite3_value_bytes(argv[1]);
846 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000847 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000848 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000849 nRep = sqlite3_value_bytes(argv[2]);
850 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000851 nOut = nStr + 1;
852 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +0000853 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +0000854 if( zOut==0 ){
855 return;
drh26b6d902007-03-17 13:27:54 +0000856 }
drh26b6d902007-03-17 13:27:54 +0000857 loopLimit = nStr - nPattern;
858 for(i=j=0; i<=loopLimit; i++){
859 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
860 zOut[j++] = zStr[i];
861 }else{
drh4a50aac2007-08-23 02:47:53 +0000862 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +0000863 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +0000864 nOut += nRep - nPattern;
drhbb4957f2008-03-20 14:03:29 +0000865 if( nOut>=db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +0000866 sqlite3_result_error_toobig(context);
drh633e6d52008-07-28 19:34:53 +0000867 sqlite3DbFree(db, zOut);
danielk197717374e82007-05-08 14:39:04 +0000868 return;
869 }
drh4a50aac2007-08-23 02:47:53 +0000870 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000871 zOut = sqlite3_realloc(zOut, (int)nOut);
872 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000873 sqlite3_result_error_nomem(context);
drh633e6d52008-07-28 19:34:53 +0000874 sqlite3DbFree(db, zOld);
drh2e6400b2007-05-08 15:46:18 +0000875 return;
876 }
drh26b6d902007-03-17 13:27:54 +0000877 memcpy(&zOut[j], zRep, nRep);
878 j += nRep;
879 i += nPattern-1;
880 }
881 }
drh2e6400b2007-05-08 15:46:18 +0000882 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000883 memcpy(&zOut[j], &zStr[i], nStr-i);
884 j += nStr - i;
885 assert( j<=nOut );
886 zOut[j] = 0;
887 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
888}
889
drh309b3382007-03-17 17:52:42 +0000890/*
891** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
892** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
893*/
894static void trimFunc(
895 sqlite3_context *context,
896 int argc,
897 sqlite3_value **argv
898){
899 const unsigned char *zIn; /* Input string */
900 const unsigned char *zCharSet; /* Set of characters to trim */
901 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +0000902 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +0000903 int i; /* Loop counter */
drh1bd10f82008-12-10 21:19:56 +0000904 unsigned char *aLen = 0; /* Length of each character in zCharSet */
905 unsigned char **azChar = 0; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000906 int nChar; /* Number of characters in zCharSet */
907
drh309b3382007-03-17 17:52:42 +0000908 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
909 return;
910 }
911 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000912 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000913 nIn = sqlite3_value_bytes(argv[0]);
914 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000915 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000916 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +0000917 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000918 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000919 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +0000920 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +0000921 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000922 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000923 return;
drhd1e3a612007-04-27 21:59:52 +0000924 }else{
925 const unsigned char *z;
926 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000927 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000928 }
929 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +0000930 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +0000931 if( azChar==0 ){
932 return;
933 }
934 aLen = (unsigned char*)&azChar[nChar];
935 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +0000936 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +0000937 SQLITE_SKIP_UTF8(z);
drh3abbd392008-12-10 23:04:13 +0000938 aLen[nChar] = (u8)(z - azChar[nChar]);
drhd1e3a612007-04-27 21:59:52 +0000939 }
940 }
drh309b3382007-03-17 17:52:42 +0000941 }
drhd1e3a612007-04-27 21:59:52 +0000942 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +0000943 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +0000944 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000945 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +0000946 int len = 0;
drhd1e3a612007-04-27 21:59:52 +0000947 for(i=0; i<nChar; i++){
948 len = aLen[i];
949 if( memcmp(zIn, azChar[i], len)==0 ) break;
950 }
951 if( i>=nChar ) break;
952 zIn += len;
953 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000954 }
955 }
956 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000957 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +0000958 int len = 0;
drhd1e3a612007-04-27 21:59:52 +0000959 for(i=0; i<nChar; i++){
960 len = aLen[i];
961 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
962 }
963 if( i>=nChar ) break;
964 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000965 }
966 }
drhd1e3a612007-04-27 21:59:52 +0000967 if( zCharSet ){
968 sqlite3_free(azChar);
969 }
drh309b3382007-03-17 17:52:42 +0000970 }
971 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
972}
drh26b6d902007-03-17 13:27:54 +0000973
danielk1977a4de4532008-09-02 15:44:08 +0000974
drhd24cc422003-03-27 12:51:24 +0000975#ifdef SQLITE_SOUNDEX
976/*
977** Compute the soundex encoding of a word.
978*/
drh137c7282007-01-29 17:58:28 +0000979static void soundexFunc(
980 sqlite3_context *context,
981 int argc,
982 sqlite3_value **argv
983){
drhd24cc422003-03-27 12:51:24 +0000984 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000985 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000986 int i, j;
987 static const unsigned char iCode[] = {
988 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
989 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
990 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
991 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
992 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
993 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
994 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
995 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
996 };
997 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000998 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000999 if( zIn==0 ) zIn = (u8*)"";
drhdc86e2b2009-01-24 11:30:42 +00001000 for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
drhd24cc422003-03-27 12:51:24 +00001001 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +00001002 u8 prevcode = iCode[zIn[i]&0x7f];
danielk197778ca0e72009-01-20 16:53:39 +00001003 zResult[0] = sqlite3Toupper(zIn[i]);
drhd24cc422003-03-27 12:51:24 +00001004 for(j=1; j<4 && zIn[i]; i++){
1005 int code = iCode[zIn[i]&0x7f];
1006 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +00001007 if( code!=prevcode ){
1008 prevcode = code;
1009 zResult[j++] = code + '0';
1010 }
1011 }else{
1012 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +00001013 }
1014 }
1015 while( j<4 ){
1016 zResult[j++] = '0';
1017 }
1018 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001019 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +00001020 }else{
danielk1977d8123362004-06-12 09:25:12 +00001021 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +00001022 }
1023}
1024#endif
1025
drhfdb83b22006-06-17 14:12:47 +00001026#ifndef SQLITE_OMIT_LOAD_EXTENSION
1027/*
1028** A function that loads a shared-library extension then returns NULL.
1029*/
1030static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001031 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001032 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001033 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001034 char *zErrMsg = 0;
1035
1036 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001037 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001038 }else{
1039 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001040 }
drh7a521cf2007-04-25 18:23:52 +00001041 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001042 sqlite3_result_error(context, zErrMsg, -1);
1043 sqlite3_free(zErrMsg);
1044 }
1045}
1046#endif
1047
danielk197701427a62005-01-11 13:02:33 +00001048
drh0ac65892002-04-20 14:24:41 +00001049/*
drhd3a149e2002-02-24 17:12:53 +00001050** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001051** sum() or avg() aggregate computation.
1052*/
1053typedef struct SumCtx SumCtx;
1054struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001055 double rSum; /* Floating point sum */
1056 i64 iSum; /* Integer sum */
1057 i64 cnt; /* Number of elements summed */
1058 u8 overflow; /* True if integer overflow seen */
1059 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001060};
1061
1062/*
drha97fdd32006-01-12 22:17:50 +00001063** Routines used to compute the sum, average, and total.
1064**
1065** The SUM() function follows the (broken) SQL standard which means
1066** that it returns NULL if it sums over no inputs. TOTAL returns
1067** 0.0 in that case. In addition, TOTAL always returns a float where
1068** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001069** value. TOTAL never fails, but SUM might through an exception if
1070** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001071*/
danielk19770ae8b832004-05-25 12:05:56 +00001072static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001073 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001074 int type;
drh3f219f42005-09-08 19:45:57 +00001075 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001076 UNUSED_PARAMETER(argc);
drh4f26d6c2004-05-26 23:25:30 +00001077 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001078 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001079 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001080 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001081 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001082 i64 v = sqlite3_value_int64(argv[0]);
1083 p->rSum += v;
1084 if( (p->approx|p->overflow)==0 ){
1085 i64 iNewSum = p->iSum + v;
drh1bd10f82008-12-10 21:19:56 +00001086 int s1 = (int)(p->iSum >> (sizeof(i64)*8-1));
1087 int s2 = (int)(v >> (sizeof(i64)*8-1));
1088 int s3 = (int)(iNewSum >> (sizeof(i64)*8-1));
1089 p->overflow = ((s1&s2&~s3) | (~s1&~s2&s3))?1:0;
drh8c08e862006-02-11 17:34:00 +00001090 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001091 }
1092 }else{
drh8c08e862006-02-11 17:34:00 +00001093 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001094 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001095 }
drh739105c2002-05-29 23:22:23 +00001096 }
drhdd5baa92002-02-27 19:50:59 +00001097}
danielk19770ae8b832004-05-25 12:05:56 +00001098static void sumFinalize(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);
drhc2bd9132005-09-08 20:37:43 +00001101 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001102 if( p->overflow ){
1103 sqlite3_result_error(context,"integer overflow",-1);
1104 }else if( p->approx ){
1105 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001106 }else{
drh8c08e862006-02-11 17:34:00 +00001107 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001108 }
drh3d1d95e2005-09-08 10:37:01 +00001109 }
drhdd5baa92002-02-27 19:50:59 +00001110}
danielk19770ae8b832004-05-25 12:05:56 +00001111static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001112 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001113 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001114 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001115 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001116 }
1117}
drha97fdd32006-01-12 22:17:50 +00001118static void totalFinalize(sqlite3_context *context){
1119 SumCtx *p;
1120 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001121 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001122}
drhdd5baa92002-02-27 19:50:59 +00001123
1124/*
drh0bce8352002-02-28 00:41:10 +00001125** The following structure keeps track of state information for the
1126** count() aggregate function.
1127*/
1128typedef struct CountCtx CountCtx;
1129struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001130 i64 n;
drh0bce8352002-02-28 00:41:10 +00001131};
drhdd5baa92002-02-27 19:50:59 +00001132
drh0bce8352002-02-28 00:41:10 +00001133/*
1134** Routines to implement the count() aggregate function.
1135*/
danielk19770ae8b832004-05-25 12:05:56 +00001136static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001137 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001138 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001139 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001140 p->n++;
1141 }
1142}
danielk19770ae8b832004-05-25 12:05:56 +00001143static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001144 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001145 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001146 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001147}
1148
1149/*
drh0bce8352002-02-28 00:41:10 +00001150** Routines to implement min() and max() aggregate functions.
1151*/
danielk197762c14b32008-11-19 09:05:26 +00001152static void minmaxStep(
1153 sqlite3_context *context,
1154 int NotUsed,
1155 sqlite3_value **argv
1156){
danielk197788208052004-05-25 01:13:20 +00001157 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001158 Mem *pBest;
danielk197762c14b32008-11-19 09:05:26 +00001159 UNUSED_PARAMETER(NotUsed);
drh9eb516c2004-07-18 20:52:32 +00001160
1161 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1162 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001163 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001164
danielk197788208052004-05-25 01:13:20 +00001165 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001166 int max;
1167 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001168 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001169 /* This step function is used for both the min() and max() aggregates,
1170 ** the only difference between the two being that the sense of the
1171 ** comparison is inverted. For the max() aggregate, the
1172 ** sqlite3_user_data() function returns (void *)-1. For min() it
1173 ** returns (void *)db, where db is the sqlite3* database pointer.
1174 ** Therefore the next statement sets variable 'max' to 1 for the max()
1175 ** aggregate, or 0 for min().
1176 */
drh309b3382007-03-17 17:52:42 +00001177 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001178 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001179 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001180 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001181 }
drh268380c2004-02-25 13:47:31 +00001182 }else{
drhb21c8cd2007-08-21 19:33:56 +00001183 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001184 }
1185}
danielk19770ae8b832004-05-25 12:05:56 +00001186static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001187 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001188 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1189 if( pRes ){
1190 if( pRes->flags ){
1191 sqlite3_result_value(context, pRes);
1192 }
1193 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001194 }
1195}
drhdd5baa92002-02-27 19:50:59 +00001196
drhb0689692007-11-01 17:38:30 +00001197/*
1198** group_concat(EXPR, ?SEPARATOR?)
1199*/
1200static void groupConcatStep(
1201 sqlite3_context *context,
1202 int argc,
1203 sqlite3_value **argv
1204){
1205 const char *zVal;
drhade86482007-11-28 22:36:40 +00001206 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001207 const char *zSep;
drha2baf3a2008-06-18 15:34:09 +00001208 int nVal, nSep, i;
1209 if( argc==0 || sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001210 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1211
1212 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001213 sqlite3 *db = sqlite3_context_db_handle(context);
drhade86482007-11-28 22:36:40 +00001214 pAccum->useMalloc = 1;
drhbb4957f2008-03-20 14:03:29 +00001215 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drhade86482007-11-28 22:36:40 +00001216 if( pAccum->nChar ){
drha2baf3a2008-06-18 15:34:09 +00001217 if( argc>1 ){
1218 zSep = (char*)sqlite3_value_text(argv[argc-1]);
1219 nSep = sqlite3_value_bytes(argv[argc-1]);
drhb0689692007-11-01 17:38:30 +00001220 }else{
1221 zSep = ",";
drhade86482007-11-28 22:36:40 +00001222 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001223 }
drhade86482007-11-28 22:36:40 +00001224 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001225 }
drha2baf3a2008-06-18 15:34:09 +00001226 i = 0;
1227 do{
1228 zVal = (char*)sqlite3_value_text(argv[i]);
1229 nVal = sqlite3_value_bytes(argv[i]);
1230 sqlite3StrAccumAppend(pAccum, zVal, nVal);
1231 i++;
1232 }while( i<argc-1 );
drhb0689692007-11-01 17:38:30 +00001233 }
1234}
1235static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001236 StrAccum *pAccum;
1237 pAccum = sqlite3_aggregate_context(context, 0);
1238 if( pAccum ){
1239 if( pAccum->tooBig ){
1240 sqlite3_result_error_toobig(context);
1241 }else if( pAccum->mallocFailed ){
1242 sqlite3_result_error_nomem(context);
1243 }else{
1244 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1245 sqlite3_free);
1246 }
drhb0689692007-11-01 17:38:30 +00001247 }
1248}
drh4e5ffc52004-08-31 00:52:37 +00001249
drhd3a149e2002-02-24 17:12:53 +00001250/*
drha2ed5602002-02-26 23:55:31 +00001251** This function registered all of the above C functions as SQL
1252** functions. This should be the only routine in this file with
1253** external linkage.
drhdc04c582002-02-24 01:55:15 +00001254*/
drh9bb575f2004-09-06 17:24:11 +00001255void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh1f01ec12005-02-15 21:36:18 +00001256#ifndef SQLITE_OMIT_ALTERTABLE
1257 sqlite3AlterFunctions(db);
1258#endif
danielk19771e536952007-08-16 10:09:01 +00001259 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001260 int rc = sqlite3_overload_function(db, "MATCH", 2);
1261 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1262 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001263 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001264 }
1265 }
danielk1977fd9e1f32005-05-22 10:44:34 +00001266#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001267 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001268#endif
drh55ef4d92005-08-14 01:20:37 +00001269}
1270
1271/*
1272** Set the LIKEOPT flag on the 2-argument function with the given name.
1273*/
drh1bd10f82008-12-10 21:19:56 +00001274static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
drh55ef4d92005-08-14 01:20:37 +00001275 FuncDef *pDef;
drhea678832008-12-10 19:26:22 +00001276 pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
1277 2, SQLITE_UTF8, 0);
drh55ef4d92005-08-14 01:20:37 +00001278 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001279 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001280 }
1281}
1282
1283/*
1284** Register the built-in LIKE and GLOB functions. The caseSensitive
1285** parameter determines whether or not the LIKE operator is case
1286** sensitive. GLOB is always case sensitive.
1287*/
1288void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1289 struct compareInfo *pInfo;
1290 if( caseSensitive ){
1291 pInfo = (struct compareInfo*)&likeInfoAlt;
1292 }else{
1293 pInfo = (struct compareInfo*)&likeInfoNorm;
1294 }
danielk1977771151b2006-01-17 13:21:40 +00001295 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1296 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1297 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001298 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001299 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1300 setLikeOptFlag(db, "like",
1301 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001302}
1303
1304/*
1305** pExpr points to an expression which implements a function. If
1306** it is appropriate to apply the LIKE optimization to that function
1307** then set aWc[0] through aWc[2] to the wildcard characters and
1308** return TRUE. If the function is not a LIKE-style function then
1309** return FALSE.
1310*/
drhd64fe2f2005-08-28 17:00:23 +00001311int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001312 FuncDef *pDef;
danielk1977cdbd8ef2007-05-12 06:11:12 +00001313 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
drh55ef4d92005-08-14 01:20:37 +00001314 return 0;
1315 }
1316 if( pExpr->pList->nExpr!=2 ){
1317 return 0;
1318 }
drh2646da72005-12-09 20:02:05 +00001319 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001320 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001321 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001322 return 0;
1323 }
1324
1325 /* The memcpy() statement assumes that the wildcard characters are
1326 ** the first three statements in the compareInfo structure. The
1327 ** asserts() that follow verify that assumption
1328 */
1329 memcpy(aWc, pDef->pUserData, 3);
1330 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1331 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1332 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001333 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001334 return 1;
drhdc04c582002-02-24 01:55:15 +00001335}
danielk19778c0a7912008-08-20 14:49:23 +00001336
drh70a8ca32008-08-21 18:49:27 +00001337/*
drh777c5382008-08-21 20:21:34 +00001338** All all of the FuncDef structures in the aBuiltinFunc[] array above
1339** to the global function hash table. This occurs at start-time (as
1340** a consequence of calling sqlite3_initialize()).
1341**
1342** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001343*/
1344void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001345 /*
1346 ** The following array holds FuncDef structures for all of the functions
1347 ** defined in this file.
1348 **
1349 ** The array cannot be constant since changes are made to the
1350 ** FuncDef.pHash elements at start-time. The elements of this array
1351 ** are read-only after initialization is complete.
1352 */
1353 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1354 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1355 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1356 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1357 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1358 FUNCTION(trim, 1, 3, 0, trimFunc ),
1359 FUNCTION(trim, 2, 3, 0, trimFunc ),
1360 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1361 FUNCTION(min, 0, 0, 1, 0 ),
1362 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1363 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1364 FUNCTION(max, 0, 1, 1, 0 ),
1365 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1366 FUNCTION(typeof, 1, 0, 0, typeofFunc ),
1367 FUNCTION(length, 1, 0, 0, lengthFunc ),
1368 FUNCTION(substr, 2, 0, 0, substrFunc ),
1369 FUNCTION(substr, 3, 0, 0, substrFunc ),
1370 FUNCTION(abs, 1, 0, 0, absFunc ),
1371 FUNCTION(round, 1, 0, 0, roundFunc ),
1372 FUNCTION(round, 2, 0, 0, roundFunc ),
1373 FUNCTION(upper, 1, 0, 0, upperFunc ),
1374 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1375 FUNCTION(coalesce, 1, 0, 0, 0 ),
1376 FUNCTION(coalesce, -1, 0, 0, ifnullFunc ),
1377 FUNCTION(coalesce, 0, 0, 0, 0 ),
1378 FUNCTION(hex, 1, 0, 0, hexFunc ),
1379 FUNCTION(ifnull, 2, 0, 1, ifnullFunc ),
1380 FUNCTION(random, -1, 0, 0, randomFunc ),
1381 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1382 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1383 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
1384 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1385 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1386 FUNCTION(changes, 0, 0, 0, changes ),
1387 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1388 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1389 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1390 #ifdef SQLITE_SOUNDEX
1391 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1392 #endif
1393 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1394 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1395 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1396 #endif
1397 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1398 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1399 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
1400 AGGREGATE(count, 0, 0, 0, countStep, countFinalize ),
1401 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
1402 AGGREGATE(group_concat, -1, 0, 0, groupConcatStep, groupConcatFinalize),
1403
1404 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1405 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1406 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1407 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1408 #else
1409 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1410 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1411 #endif
1412 };
1413
drh70a8ca32008-08-21 18:49:27 +00001414 int i;
danielk197793ce7412008-09-01 19:14:02 +00001415 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001416 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001417
drh70a8ca32008-08-21 18:49:27 +00001418 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001419 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001420 }
drh777c5382008-08-21 20:21:34 +00001421 sqlite3RegisterDateTimeFunctions();
drh70a8ca32008-08-21 18:49:27 +00001422}