blob: d366112a881c64d8cfd2ed1d7d087211eba3f806 [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**
drh478000c2009-02-03 13:10:54 +000019** $Id: func.c,v 1.219 2009/02/03 13:10:54 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
drh65595cd2009-02-02 16:32:55 +000046 assert( argc>1 );
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 ){
drh65595cd2009-02-02 16:32:55 +000056 testcase( mask==0 );
drhf9b596e2004-05-26 16:54:42 +000057 iBest = i;
drh0bce8352002-02-28 00:41:10 +000058 }
59 }
drhf4479502004-05-27 03:12:53 +000060 sqlite3_result_value(context, argv[iBest]);
drh0bce8352002-02-28 00:41:10 +000061}
drh0bce8352002-02-28 00:41:10 +000062
drh268380c2004-02-25 13:47:31 +000063/*
64** Return the type of the argument.
65*/
drhf9b596e2004-05-26 16:54:42 +000066static void typeofFunc(
67 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +000068 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +000069 sqlite3_value **argv
70){
danielk197735bb9d02004-05-24 12:55:54 +000071 const char *z = 0;
danielk197762c14b32008-11-19 09:05:26 +000072 UNUSED_PARAMETER(NotUsed);
danielk197735bb9d02004-05-24 12:55:54 +000073 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000074 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;
drh65595cd2009-02-02 16:32:55 +000078 default: z = "null"; break;
danielk197735bb9d02004-05-24 12:55:54 +000079 }
danielk1977d8123362004-06-12 09:25:12 +000080 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000081}
82
drh5708d2d2005-06-22 10:53:59 +000083
84/*
drh0bce8352002-02-28 00:41:10 +000085** Implementation of the length() function
86*/
drhf9b596e2004-05-26 16:54:42 +000087static void lengthFunc(
88 sqlite3_context *context,
89 int argc,
90 sqlite3_value **argv
91){
drh0bce8352002-02-28 00:41:10 +000092 int len;
93
94 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +000095 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +000096 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000097 case SQLITE_BLOB:
98 case SQLITE_INTEGER:
99 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000100 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +0000101 break;
102 }
drh9c054832004-05-31 18:51:57 +0000103 case SQLITE_TEXT: {
drh2646da72005-12-09 20:02:05 +0000104 const unsigned char *z = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000105 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000106 len = 0;
107 while( *z ){
108 len++;
109 SQLITE_SKIP_UTF8(z);
110 }
drhf4479502004-05-27 03:12:53 +0000111 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000112 break;
113 }
114 default: {
115 sqlite3_result_null(context);
116 break;
117 }
118 }
drh0bce8352002-02-28 00:41:10 +0000119}
120
121/*
122** Implementation of the abs() function
123*/
danielk19770ae8b832004-05-25 12:05:56 +0000124static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000125 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000126 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000127 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000128 case SQLITE_INTEGER: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000129 i64 iVal = sqlite3_value_int64(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000130 if( iVal<0 ){
131 if( (iVal<<1)==0 ){
132 sqlite3_result_error(context, "integer overflow", -1);
133 return;
134 }
135 iVal = -iVal;
136 }
danielk1977f93bbbe2004-05-27 10:30:52 +0000137 sqlite3_result_int64(context, iVal);
drhf9b596e2004-05-26 16:54:42 +0000138 break;
139 }
drh9c054832004-05-31 18:51:57 +0000140 case SQLITE_NULL: {
drhf9b596e2004-05-26 16:54:42 +0000141 sqlite3_result_null(context);
142 break;
143 }
144 default: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000145 double rVal = sqlite3_value_double(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000146 if( rVal<0 ) rVal = -rVal;
danielk1977f93bbbe2004-05-27 10:30:52 +0000147 sqlite3_result_double(context, rVal);
drhf9b596e2004-05-26 16:54:42 +0000148 break;
149 }
150 }
drh0bce8352002-02-28 00:41:10 +0000151}
152
153/*
drhf764e6f2007-05-15 01:13:47 +0000154** Implementation of the substr() function.
155**
156** substr(x,p1,p2) returns p2 characters of x[] beginning with p1.
157** p1 is 1-indexed. So substr(x,1,1) returns the first character
158** of x. If x is text, then we actually count UTF-8 characters.
159** If x is a blob, then we count bytes.
160**
161** If p1 is negative, then we begin abs(p1) from the end of x[].
drh0bce8352002-02-28 00:41:10 +0000162*/
drhf9b596e2004-05-26 16:54:42 +0000163static void substrFunc(
164 sqlite3_context *context,
165 int argc,
166 sqlite3_value **argv
167){
drh2646da72005-12-09 20:02:05 +0000168 const unsigned char *z;
169 const unsigned char *z2;
drh023ae032007-05-08 12:12:16 +0000170 int len;
drhf764e6f2007-05-15 01:13:47 +0000171 int p0type;
drh023ae032007-05-08 12:12:16 +0000172 i64 p1, p2;
drh65595cd2009-02-02 16:32:55 +0000173 int negP2 = 0;
drhf9b596e2004-05-26 16:54:42 +0000174
drh64f31512007-10-12 19:11:55 +0000175 assert( argc==3 || argc==2 );
drh8198d252009-02-01 19:42:37 +0000176 if( sqlite3_value_type(argv[1])==SQLITE_NULL
177 || (argc==3 && sqlite3_value_type(argv[2])==SQLITE_NULL)
178 ){
179 return;
180 }
drhf764e6f2007-05-15 01:13:47 +0000181 p0type = sqlite3_value_type(argv[0]);
182 if( p0type==SQLITE_BLOB ){
183 len = sqlite3_value_bytes(argv[0]);
184 z = sqlite3_value_blob(argv[0]);
185 if( z==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000186 assert( len==sqlite3_value_bytes(argv[0]) );
drhf764e6f2007-05-15 01:13:47 +0000187 }else{
188 z = sqlite3_value_text(argv[0]);
189 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000190 len = 0;
191 for(z2=z; *z2; len++){
192 SQLITE_SKIP_UTF8(z2);
193 }
drhf764e6f2007-05-15 01:13:47 +0000194 }
danielk197751ad0ec2004-05-24 12:39:02 +0000195 p1 = sqlite3_value_int(argv[1]);
drh64f31512007-10-12 19:11:55 +0000196 if( argc==3 ){
197 p2 = sqlite3_value_int(argv[2]);
drh65595cd2009-02-02 16:32:55 +0000198 if( p2<0 ){
199 p2 = -p2;
200 negP2 = 1;
201 }
drh64f31512007-10-12 19:11:55 +0000202 }else{
drhbb4957f2008-03-20 14:03:29 +0000203 p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH];
drh64f31512007-10-12 19:11:55 +0000204 }
drh0bce8352002-02-28 00:41:10 +0000205 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000206 p1 += len;
drh653bc752002-02-28 03:31:10 +0000207 if( p1<0 ){
208 p2 += p1;
drh65595cd2009-02-02 16:32:55 +0000209 if( p2<0 ) p2 = 0;
drh653bc752002-02-28 03:31:10 +0000210 p1 = 0;
211 }
drh0bce8352002-02-28 00:41:10 +0000212 }else if( p1>0 ){
213 p1--;
drh65595cd2009-02-02 16:32:55 +0000214 }else if( p2>0 ){
215 p2--;
drh0bce8352002-02-28 00:41:10 +0000216 }
drh65595cd2009-02-02 16:32:55 +0000217 if( negP2 ){
218 p1 -= p2;
drh4e79c592009-02-01 19:23:32 +0000219 if( p1<0 ){
220 p2 += p1;
221 p1 = 0;
222 }
223 }
drh65595cd2009-02-02 16:32:55 +0000224 assert( p1>=0 && p2>=0 );
drh0bce8352002-02-28 00:41:10 +0000225 if( p1+p2>len ){
226 p2 = len-p1;
drh478000c2009-02-03 13:10:54 +0000227 if( p2<0 ) p2 = 0;
drh0bce8352002-02-28 00:41:10 +0000228 }
drhf764e6f2007-05-15 01:13:47 +0000229 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000230 while( *z && p1 ){
231 SQLITE_SKIP_UTF8(z);
232 p1--;
drhf764e6f2007-05-15 01:13:47 +0000233 }
drh4a919112007-05-15 11:55:09 +0000234 for(z2=z; *z2 && p2; p2--){
235 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000236 }
drh1bd10f82008-12-10 21:19:56 +0000237 sqlite3_result_text(context, (char*)z, (int)(z2-z), SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000238 }else{
drh1bd10f82008-12-10 21:19:56 +0000239 sqlite3_result_blob(context, (char*)&z[p1], (int)p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000240 }
drh0bce8352002-02-28 00:41:10 +0000241}
242
243/*
244** Implementation of the round() function
245*/
danielk19770ae8b832004-05-25 12:05:56 +0000246static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000247 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000248 double r;
drh592ac8c2005-08-13 03:07:47 +0000249 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000250 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000251 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000252 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000253 n = sqlite3_value_int(argv[1]);
254 if( n>30 ) n = 30;
255 if( n<0 ) n = 0;
256 }
drhd589a922006-03-02 03:02:48 +0000257 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000258 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000259 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000260 sqlite3AtoF(zBuf, &r);
261 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000262}
drhdc04c582002-02-24 01:55:15 +0000263
danielk197726783a52007-08-29 14:06:22 +0000264/*
265** Allocate nByte bytes of space using sqlite3_malloc(). If the
266** allocation fails, call sqlite3_result_error_nomem() to notify
267** the database handle that malloc() has failed.
268*/
drhb1a6c3c2008-03-20 16:30:17 +0000269static void *contextMalloc(sqlite3_context *context, i64 nByte){
drhbb4957f2008-03-20 14:03:29 +0000270 char *z;
271 if( nByte>sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH] ){
272 sqlite3_result_error_toobig(context);
273 z = 0;
274 }else{
drh1bd10f82008-12-10 21:19:56 +0000275 z = sqlite3Malloc((int)nByte);
drhbb4957f2008-03-20 14:03:29 +0000276 if( !z && nByte>0 ){
277 sqlite3_result_error_nomem(context);
278 }
danielk1977a1644fd2007-08-29 12:31:25 +0000279 }
280 return z;
281}
282
drhdc04c582002-02-24 01:55:15 +0000283/*
284** Implementation of the upper() and lower() SQL functions.
285*/
danielk19770ae8b832004-05-25 12:05:56 +0000286static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000287 char *z1;
288 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000289 int i, n;
drh7a521cf2007-04-25 18:23:52 +0000290 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000291 n = sqlite3_value_bytes(argv[0]);
292 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
293 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000294 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000295 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000296 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000297 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000298 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000299 z1[i] = (char)sqlite3Toupper(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000300 }
301 sqlite3_result_text(context, z1, -1, sqlite3_free);
302 }
drhdc04c582002-02-24 01:55:15 +0000303 }
304}
danielk19770ae8b832004-05-25 12:05:56 +0000305static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197778ca0e72009-01-20 16:53:39 +0000306 u8 *z1;
drh7a521cf2007-04-25 18:23:52 +0000307 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000308 int i, n;
drh7a521cf2007-04-25 18:23:52 +0000309 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000310 n = sqlite3_value_bytes(argv[0]);
311 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
312 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000313 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000314 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000315 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000316 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000317 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000318 z1[i] = sqlite3Tolower(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000319 }
danielk197778ca0e72009-01-20 16:53:39 +0000320 sqlite3_result_text(context, (char *)z1, -1, sqlite3_free);
drh7a521cf2007-04-25 18:23:52 +0000321 }
drhdc04c582002-02-24 01:55:15 +0000322 }
323}
324
325/*
drhfbc99082002-02-28 03:14:18 +0000326** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000327** All three do the same thing. They return the first non-NULL
328** argument.
drh3212e182002-02-28 00:46:26 +0000329*/
drhf9b596e2004-05-26 16:54:42 +0000330static void ifnullFunc(
331 sqlite3_context *context,
332 int argc,
333 sqlite3_value **argv
334){
drhfbc99082002-02-28 03:14:18 +0000335 int i;
336 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000337 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000338 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000339 break;
340 }
341 }
drh3212e182002-02-28 00:46:26 +0000342}
343
344/*
drhf9ffac92002-03-02 19:00:31 +0000345** Implementation of random(). Return a random integer.
346*/
drhf9b596e2004-05-26 16:54:42 +0000347static void randomFunc(
348 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000349 int NotUsed,
350 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000351){
drh52fc8492006-02-23 21:43:55 +0000352 sqlite_int64 r;
danielk197762c14b32008-11-19 09:05:26 +0000353 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drh2fa18682008-03-19 14:15:34 +0000354 sqlite3_randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000355 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
356 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000357 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000358}
359
360/*
drh137c7282007-01-29 17:58:28 +0000361** Implementation of randomblob(N). Return a random blob
362** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000363*/
drh137c7282007-01-29 17:58:28 +0000364static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000365 sqlite3_context *context,
366 int argc,
367 sqlite3_value **argv
368){
drh137c7282007-01-29 17:58:28 +0000369 int n;
370 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000371 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000372 UNUSED_PARAMETER(argc);
drh63cf66f2007-01-29 15:50:05 +0000373 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000374 if( n<1 ){
375 n = 1;
376 }
danielk1977a1644fd2007-08-29 12:31:25 +0000377 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000378 if( p ){
drh2fa18682008-03-19 14:15:34 +0000379 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000380 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000381 }
drh63cf66f2007-01-29 15:50:05 +0000382}
383
384/*
drh6ed41ad2002-04-06 14:10:47 +0000385** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000386** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000387*/
danielk197751ad0ec2004-05-24 12:39:02 +0000388static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000389 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000390 int NotUsed,
391 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000392){
drhfa4a4b92008-03-19 21:45:51 +0000393 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000394 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf9b596e2004-05-26 16:54:42 +0000395 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000396}
397
rdcf146a772004-02-25 22:51:06 +0000398/*
danielk1977b28af712004-06-21 06:50:26 +0000399** Implementation of the changes() SQL function. The return value is the
400** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000401*/
danielk1977b28af712004-06-21 06:50:26 +0000402static void changes(
drhf9b596e2004-05-26 16:54:42 +0000403 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000404 int NotUsed,
405 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000406){
drhfa4a4b92008-03-19 21:45:51 +0000407 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000408 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf4479502004-05-27 03:12:53 +0000409 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000410}
rdcf146a772004-02-25 22:51:06 +0000411
412/*
danielk1977b28af712004-06-21 06:50:26 +0000413** Implementation of the total_changes() SQL function. The return value is
414** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000415*/
danielk1977b28af712004-06-21 06:50:26 +0000416static void total_changes(
417 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000418 int NotUsed,
419 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000420){
drhfa4a4b92008-03-19 21:45:51 +0000421 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000422 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977b28af712004-06-21 06:50:26 +0000423 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000424}
425
drh6ed41ad2002-04-06 14:10:47 +0000426/*
drh4e5ffc52004-08-31 00:52:37 +0000427** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000428*/
drh4e5ffc52004-08-31 00:52:37 +0000429struct compareInfo {
430 u8 matchAll;
431 u8 matchOne;
432 u8 matchSet;
433 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000434};
drh55ef4d92005-08-14 01:20:37 +0000435
drhb9175ae2007-12-07 18:39:04 +0000436/*
437** For LIKE and GLOB matching on EBCDIC machines, assume that every
438** character is exactly one byte in size. Also, all characters are
439** able to participate in upper-case-to-lower-case mappings in EBCDIC
440** whereas only characters less than 0x80 do in ASCII.
441*/
442#if defined(SQLITE_EBCDIC)
443# define sqlite3Utf8Read(A,B,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000444# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000445#else
drh6ed4b782007-12-10 18:07:20 +0000446# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000447#endif
448
drh4e5ffc52004-08-31 00:52:37 +0000449static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000450/* The correct SQL-92 behavior is for the LIKE operator to ignore
451** case. Thus 'a' LIKE 'A' would be true. */
452static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
453/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
454** is case sensitive causing 'a' LIKE 'A' to be false */
455static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000456
457/*
drh4e5ffc52004-08-31 00:52:37 +0000458** Compare two UTF-8 strings for equality where the first string can
459** potentially be a "glob" expression. Return true (1) if they
460** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000461**
drh4e5ffc52004-08-31 00:52:37 +0000462** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000463**
drh4e5ffc52004-08-31 00:52:37 +0000464** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000465**
drh4e5ffc52004-08-31 00:52:37 +0000466** '?' Matches exactly one character.
467**
468** [...] Matches one character from the enclosed list of
469** characters.
470**
471** [^...] Matches one character not in the enclosed list.
472**
473** With the [...] and [^...] matching, a ']' character can be included
474** in the list by making it the first character after '[' or '^'. A
475** range of characters can be specified using '-'. Example:
476** "[a-z]" matches any single lower-case letter. To match a '-', make
477** it the last character in the list.
478**
479** This routine is usually quick, but can be N**2 in the worst case.
480**
481** Hints: to match '*' or '?', put them in "[]". Like this:
482**
483** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000484*/
danielk19777c6303c2004-11-17 16:41:29 +0000485static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000486 const u8 *zPattern, /* The glob pattern */
487 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000488 const struct compareInfo *pInfo, /* Information about how to do the compare */
489 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000490){
drh66150952007-07-23 19:12:41 +0000491 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000492 int invert;
493 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000494 u8 matchOne = pInfo->matchOne;
495 u8 matchAll = pInfo->matchAll;
496 u8 matchSet = pInfo->matchSet;
497 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000498 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000499
drh66150952007-07-23 19:12:41 +0000500 while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000501 if( !prevEscape && c==matchAll ){
drh66150952007-07-23 19:12:41 +0000502 while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll
503 || c == matchOne ){
504 if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){
505 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000506 }
danielk1977ad7dd422004-06-06 12:41:49 +0000507 }
drh66150952007-07-23 19:12:41 +0000508 if( c==0 ){
509 return 1;
510 }else if( c==esc ){
511 c = sqlite3Utf8Read(zPattern, 0, &zPattern);
512 if( c==0 ){
513 return 0;
514 }
515 }else if( c==matchSet ){
516 assert( esc==0 ); /* This is GLOB, not LIKE */
517 assert( matchSet<0x80 ); /* '[' is a single-byte character */
518 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000519 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000520 }
521 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000522 }
523 while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){
524 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000525 GlogUpperToLower(c2);
526 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000527 while( c2 != 0 && c2 != c ){
528 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh6ed4b782007-12-10 18:07:20 +0000529 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000530 }
drh66150952007-07-23 19:12:41 +0000531 }else{
532 while( c2 != 0 && c2 != c ){
533 c2 = sqlite3Utf8Read(zString, 0, &zString);
534 }
drh4e5ffc52004-08-31 00:52:37 +0000535 }
drh66150952007-07-23 19:12:41 +0000536 if( c2==0 ) return 0;
537 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
538 }
539 return 0;
540 }else if( !prevEscape && c==matchOne ){
541 if( sqlite3Utf8Read(zString, 0, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000542 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000543 }
drh4e5ffc52004-08-31 00:52:37 +0000544 }else if( c==matchSet ){
545 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000546 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000547 seen = 0;
548 invert = 0;
drh66150952007-07-23 19:12:41 +0000549 c = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000550 if( c==0 ) return 0;
drh66150952007-07-23 19:12:41 +0000551 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
552 if( c2=='^' ){
553 invert = 1;
554 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
555 }
drh4e5ffc52004-08-31 00:52:37 +0000556 if( c2==']' ){
557 if( c==']' ) seen = 1;
drh66150952007-07-23 19:12:41 +0000558 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000559 }
drh66150952007-07-23 19:12:41 +0000560 while( c2 && c2!=']' ){
561 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
562 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000563 if( c>=prior_c && c<=c2 ) seen = 1;
564 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000565 }else{
drh66150952007-07-23 19:12:41 +0000566 if( c==c2 ){
567 seen = 1;
568 }
drh4e5ffc52004-08-31 00:52:37 +0000569 prior_c = c2;
570 }
drh66150952007-07-23 19:12:41 +0000571 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000572 }
drh66150952007-07-23 19:12:41 +0000573 if( c2==0 || (seen ^ invert)==0 ){
574 return 0;
575 }
576 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000577 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000578 }else{
drh66150952007-07-23 19:12:41 +0000579 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000580 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000581 GlogUpperToLower(c);
582 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000583 }
drh66150952007-07-23 19:12:41 +0000584 if( c!=c2 ){
585 return 0;
586 }
danielk19777c6303c2004-11-17 16:41:29 +0000587 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000588 }
danielk197751ad0ec2004-05-24 12:39:02 +0000589 }
drh4e5ffc52004-08-31 00:52:37 +0000590 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000591}
drh4e5ffc52004-08-31 00:52:37 +0000592
drh55ef4d92005-08-14 01:20:37 +0000593/*
594** Count the number of times that the LIKE operator (or GLOB which is
595** just a variation of LIKE) gets called. This is used for testing
596** only.
597*/
598#ifdef SQLITE_TEST
599int sqlite3_like_count = 0;
600#endif
601
danielk19773f6b0872004-06-17 05:36:44 +0000602
603/*
604** Implementation of the like() SQL function. This function implements
605** the build-in LIKE operator. The first argument to the function is the
606** pattern and the second argument is the string. So, the SQL statements:
607**
608** A LIKE B
609**
610** is implemented as like(B,A).
611**
drh55ef4d92005-08-14 01:20:37 +0000612** This same function (with a different compareInfo structure) computes
613** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000614*/
615static void likeFunc(
616 sqlite3_context *context,
617 int argc,
618 sqlite3_value **argv
619){
drhbeb818d2007-05-08 15:34:47 +0000620 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000621 int escape = 0;
drhbb4957f2008-03-20 14:03:29 +0000622 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000623
drh1f0feef2007-05-15 13:27:07 +0000624 zB = sqlite3_value_text(argv[0]);
625 zA = sqlite3_value_text(argv[1]);
626
drhbeb818d2007-05-08 15:34:47 +0000627 /* Limit the length of the LIKE or GLOB pattern to avoid problems
628 ** of deep recursion and N*N behavior in patternCompare().
629 */
drhbb4957f2008-03-20 14:03:29 +0000630 if( sqlite3_value_bytes(argv[0]) >
631 db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000632 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
633 return;
634 }
drh1f0feef2007-05-15 13:27:07 +0000635 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000636
danielk19777c6303c2004-11-17 16:41:29 +0000637 if( argc==3 ){
638 /* The escape character string must consist of a single UTF-8 character.
639 ** Otherwise, return an error.
640 */
641 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000642 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000643 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000644 sqlite3_result_error(context,
645 "ESCAPE expression must be a single character", -1);
646 return;
647 }
drh66150952007-07-23 19:12:41 +0000648 escape = sqlite3Utf8Read(zEsc, 0, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000649 }
danielk19773f6b0872004-06-17 05:36:44 +0000650 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000651 struct compareInfo *pInfo = sqlite3_user_data(context);
652#ifdef SQLITE_TEST
653 sqlite3_like_count++;
654#endif
drhbeb818d2007-05-08 15:34:47 +0000655
danielk1977b56fe1f2007-05-09 08:24:44 +0000656 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000657 }
drh8912d102002-05-26 21:34:58 +0000658}
659
660/*
661** Implementation of the NULLIF(x,y) function. The result is the first
662** argument if the arguments are different. The result is NULL if the
663** arguments are equal to each other.
664*/
drhf9b596e2004-05-26 16:54:42 +0000665static void nullifFunc(
666 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000667 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +0000668 sqlite3_value **argv
669){
danielk1977dc1bdc42004-06-11 10:51:27 +0000670 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk197762c14b32008-11-19 09:05:26 +0000671 UNUSED_PARAMETER(NotUsed);
danielk1977dc1bdc42004-06-11 10:51:27 +0000672 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000673 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000674 }
drh0ac65892002-04-20 14:24:41 +0000675}
676
drh647cb0e2002-11-04 19:32:25 +0000677/*
678** Implementation of the VERSION(*) function. The result is the version
679** of the SQLite library that is running.
680*/
drhf9b596e2004-05-26 16:54:42 +0000681static void versionFunc(
682 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000683 int NotUsed,
684 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000685){
danielk197762c14b32008-11-19 09:05:26 +0000686 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977d8123362004-06-12 09:25:12 +0000687 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000688}
689
drh137c7282007-01-29 17:58:28 +0000690/* Array for converting from half-bytes (nybbles) into ASCII hex
691** digits. */
692static const char hexdigits[] = {
693 '0', '1', '2', '3', '4', '5', '6', '7',
694 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
695};
danielk1977d641d642004-11-18 15:44:29 +0000696
drh47394702003-08-20 01:03:33 +0000697/*
698** EXPERIMENTAL - This is not an official function. The interface may
699** change. This function may disappear. Do not write code that depends
700** on this function.
701**
702** Implementation of the QUOTE() function. This function takes a single
703** argument. If the argument is numeric, the return value is the same as
704** the argument. If the argument is NULL, the return value is the string
705** "NULL". Otherwise, the argument is enclosed in single quotes with
706** single-quote escapes.
707*/
danielk19770ae8b832004-05-25 12:05:56 +0000708static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drha0df4cc2009-02-02 17:29:59 +0000709 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +0000710 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000711 case SQLITE_INTEGER:
712 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000713 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000714 break;
715 }
danielk19773f41e972004-06-08 00:39:01 +0000716 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000717 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000718 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000719 int nBlob = sqlite3_value_bytes(argv[0]);
720 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000721 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000722 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000723 int i;
724 for(i=0; i<nBlob; i++){
725 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
726 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
727 }
728 zText[(nBlob*2)+2] = '\'';
729 zText[(nBlob*2)+3] = '\0';
730 zText[0] = 'X';
731 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000732 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000733 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000734 }
735 break;
736 }
drh9c054832004-05-31 18:51:57 +0000737 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000738 int i,j;
739 u64 n;
drh2646da72005-12-09 20:02:05 +0000740 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000741 char *z;
742
drh7a521cf2007-04-25 18:23:52 +0000743 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000744 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000745 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000746 if( z ){
747 z[0] = '\'';
748 for(i=0, j=1; zArg[i]; i++){
749 z[j++] = zArg[i];
750 if( zArg[i]=='\'' ){
751 z[j++] = '\'';
752 }
drhf9b596e2004-05-26 16:54:42 +0000753 }
danielk1977a1644fd2007-08-29 12:31:25 +0000754 z[j++] = '\'';
755 z[j] = 0;
756 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000757 }
drha0df4cc2009-02-02 17:29:59 +0000758 break;
759 }
760 default: {
761 assert( sqlite3_value_type(argv[0])==SQLITE_NULL );
762 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
763 break;
drhf9b596e2004-05-26 16:54:42 +0000764 }
drh47394702003-08-20 01:03:33 +0000765 }
766}
767
drh137c7282007-01-29 17:58:28 +0000768/*
769** The hex() function. Interpret the argument as a blob. Return
770** a hexadecimal rendering as text.
771*/
772static void hexFunc(
773 sqlite3_context *context,
774 int argc,
775 sqlite3_value **argv
776){
777 int i, n;
778 const unsigned char *pBlob;
779 char *zHex, *z;
780 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000781 UNUSED_PARAMETER(argc);
drh1f0feef2007-05-15 13:27:07 +0000782 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000783 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000784 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000785 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000786 if( zHex ){
787 for(i=0; i<n; i++, pBlob++){
788 unsigned char c = *pBlob;
789 *(z++) = hexdigits[(c>>4)&0xf];
790 *(z++) = hexdigits[c&0xf];
791 }
792 *z = 0;
793 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000794 }
drh137c7282007-01-29 17:58:28 +0000795}
796
drh26b6d902007-03-17 13:27:54 +0000797/*
drh8cff3822007-05-02 02:08:28 +0000798** The zeroblob(N) function returns a zero-filled blob of size N bytes.
799*/
800static void zeroblobFunc(
801 sqlite3_context *context,
802 int argc,
803 sqlite3_value **argv
804){
drh98640a32007-06-07 19:08:32 +0000805 i64 n;
drh8cff3822007-05-02 02:08:28 +0000806 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000807 UNUSED_PARAMETER(argc);
drh98640a32007-06-07 19:08:32 +0000808 n = sqlite3_value_int64(argv[0]);
809 if( n>SQLITE_MAX_LENGTH ){
810 sqlite3_result_error_toobig(context);
811 }else{
drh1bd10f82008-12-10 21:19:56 +0000812 sqlite3_result_zeroblob(context, (int)n);
drh98640a32007-06-07 19:08:32 +0000813 }
drh8cff3822007-05-02 02:08:28 +0000814}
815
816/*
drh26b6d902007-03-17 13:27:54 +0000817** The replace() function. Three arguments are all strings: call
818** them A, B, and C. The result is also a string which is derived
819** from A by replacing every occurance of B with C. The match
820** must be exact. Collating sequences are not used.
821*/
822static void replaceFunc(
823 sqlite3_context *context,
824 int argc,
825 sqlite3_value **argv
826){
827 const unsigned char *zStr; /* The input string A */
828 const unsigned char *zPattern; /* The pattern string B */
829 const unsigned char *zRep; /* The replacement string C */
830 unsigned char *zOut; /* The output */
831 int nStr; /* Size of zStr */
832 int nPattern; /* Size of zPattern */
833 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000834 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000835 int loopLimit; /* Last zStr[] that might match zPattern[] */
836 int i, j; /* Loop counters */
837
838 assert( argc==3 );
danielk1977f3d3c272008-11-19 16:52:44 +0000839 UNUSED_PARAMETER(argc);
drh26b6d902007-03-17 13:27:54 +0000840 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000841 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000842 nStr = sqlite3_value_bytes(argv[0]);
843 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000844 zPattern = sqlite3_value_text(argv[1]);
drha605fe82009-02-01 18:08:40 +0000845 if( zPattern==0 ){
846 assert( sqlite3_value_type(argv[1])==SQLITE_NULL );
847 return;
848 }
849 if( zPattern[0]==0 ){
850 assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
851 sqlite3_result_value(context, argv[0]);
852 return;
853 }
drh1f0feef2007-05-15 13:27:07 +0000854 nPattern = sqlite3_value_bytes(argv[1]);
855 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000856 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000857 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000858 nRep = sqlite3_value_bytes(argv[2]);
859 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000860 nOut = nStr + 1;
861 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +0000862 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +0000863 if( zOut==0 ){
864 return;
drh26b6d902007-03-17 13:27:54 +0000865 }
drh26b6d902007-03-17 13:27:54 +0000866 loopLimit = nStr - nPattern;
867 for(i=j=0; i<=loopLimit; i++){
868 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
869 zOut[j++] = zStr[i];
870 }else{
drh4a50aac2007-08-23 02:47:53 +0000871 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +0000872 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +0000873 nOut += nRep - nPattern;
drhbb4957f2008-03-20 14:03:29 +0000874 if( nOut>=db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +0000875 sqlite3_result_error_toobig(context);
drh633e6d52008-07-28 19:34:53 +0000876 sqlite3DbFree(db, zOut);
danielk197717374e82007-05-08 14:39:04 +0000877 return;
878 }
drh4a50aac2007-08-23 02:47:53 +0000879 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000880 zOut = sqlite3_realloc(zOut, (int)nOut);
881 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000882 sqlite3_result_error_nomem(context);
drh633e6d52008-07-28 19:34:53 +0000883 sqlite3DbFree(db, zOld);
drh2e6400b2007-05-08 15:46:18 +0000884 return;
885 }
drh26b6d902007-03-17 13:27:54 +0000886 memcpy(&zOut[j], zRep, nRep);
887 j += nRep;
888 i += nPattern-1;
889 }
890 }
drh2e6400b2007-05-08 15:46:18 +0000891 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000892 memcpy(&zOut[j], &zStr[i], nStr-i);
893 j += nStr - i;
894 assert( j<=nOut );
895 zOut[j] = 0;
896 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
897}
898
drh309b3382007-03-17 17:52:42 +0000899/*
900** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
901** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
902*/
903static void trimFunc(
904 sqlite3_context *context,
905 int argc,
906 sqlite3_value **argv
907){
908 const unsigned char *zIn; /* Input string */
909 const unsigned char *zCharSet; /* Set of characters to trim */
910 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +0000911 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +0000912 int i; /* Loop counter */
drh1bd10f82008-12-10 21:19:56 +0000913 unsigned char *aLen = 0; /* Length of each character in zCharSet */
914 unsigned char **azChar = 0; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000915 int nChar; /* Number of characters in zCharSet */
916
drh309b3382007-03-17 17:52:42 +0000917 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
918 return;
919 }
920 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000921 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000922 nIn = sqlite3_value_bytes(argv[0]);
923 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000924 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000925 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +0000926 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000927 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000928 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +0000929 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +0000930 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000931 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000932 return;
drhd1e3a612007-04-27 21:59:52 +0000933 }else{
934 const unsigned char *z;
935 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000936 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000937 }
938 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +0000939 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +0000940 if( azChar==0 ){
941 return;
942 }
943 aLen = (unsigned char*)&azChar[nChar];
944 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +0000945 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +0000946 SQLITE_SKIP_UTF8(z);
drh3abbd392008-12-10 23:04:13 +0000947 aLen[nChar] = (u8)(z - azChar[nChar]);
drhd1e3a612007-04-27 21:59:52 +0000948 }
949 }
drh309b3382007-03-17 17:52:42 +0000950 }
drhd1e3a612007-04-27 21:59:52 +0000951 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +0000952 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +0000953 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000954 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +0000955 int len = 0;
drhd1e3a612007-04-27 21:59:52 +0000956 for(i=0; i<nChar; i++){
957 len = aLen[i];
958 if( memcmp(zIn, azChar[i], len)==0 ) break;
959 }
960 if( i>=nChar ) break;
961 zIn += len;
962 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000963 }
964 }
965 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000966 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +0000967 int len = 0;
drhd1e3a612007-04-27 21:59:52 +0000968 for(i=0; i<nChar; i++){
969 len = aLen[i];
970 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
971 }
972 if( i>=nChar ) break;
973 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000974 }
975 }
drhd1e3a612007-04-27 21:59:52 +0000976 if( zCharSet ){
977 sqlite3_free(azChar);
978 }
drh309b3382007-03-17 17:52:42 +0000979 }
980 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
981}
drh26b6d902007-03-17 13:27:54 +0000982
danielk1977a4de4532008-09-02 15:44:08 +0000983
drhd24cc422003-03-27 12:51:24 +0000984#ifdef SQLITE_SOUNDEX
985/*
986** Compute the soundex encoding of a word.
987*/
drh137c7282007-01-29 17:58:28 +0000988static void soundexFunc(
989 sqlite3_context *context,
990 int argc,
991 sqlite3_value **argv
992){
drhd24cc422003-03-27 12:51:24 +0000993 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000994 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000995 int i, j;
996 static const unsigned char iCode[] = {
997 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
998 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
999 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1000 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1001 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1002 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1003 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1004 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1005 };
1006 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +00001007 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +00001008 if( zIn==0 ) zIn = (u8*)"";
drhdc86e2b2009-01-24 11:30:42 +00001009 for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
drhd24cc422003-03-27 12:51:24 +00001010 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +00001011 u8 prevcode = iCode[zIn[i]&0x7f];
danielk197778ca0e72009-01-20 16:53:39 +00001012 zResult[0] = sqlite3Toupper(zIn[i]);
drhd24cc422003-03-27 12:51:24 +00001013 for(j=1; j<4 && zIn[i]; i++){
1014 int code = iCode[zIn[i]&0x7f];
1015 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +00001016 if( code!=prevcode ){
1017 prevcode = code;
1018 zResult[j++] = code + '0';
1019 }
1020 }else{
1021 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +00001022 }
1023 }
1024 while( j<4 ){
1025 zResult[j++] = '0';
1026 }
1027 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001028 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +00001029 }else{
danielk1977d8123362004-06-12 09:25:12 +00001030 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +00001031 }
1032}
1033#endif
1034
drhfdb83b22006-06-17 14:12:47 +00001035#ifndef SQLITE_OMIT_LOAD_EXTENSION
1036/*
1037** A function that loads a shared-library extension then returns NULL.
1038*/
1039static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001040 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001041 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001042 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001043 char *zErrMsg = 0;
1044
1045 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001046 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001047 }else{
1048 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001049 }
drh7a521cf2007-04-25 18:23:52 +00001050 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001051 sqlite3_result_error(context, zErrMsg, -1);
1052 sqlite3_free(zErrMsg);
1053 }
1054}
1055#endif
1056
danielk197701427a62005-01-11 13:02:33 +00001057
drh0ac65892002-04-20 14:24:41 +00001058/*
drhd3a149e2002-02-24 17:12:53 +00001059** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001060** sum() or avg() aggregate computation.
1061*/
1062typedef struct SumCtx SumCtx;
1063struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001064 double rSum; /* Floating point sum */
1065 i64 iSum; /* Integer sum */
1066 i64 cnt; /* Number of elements summed */
1067 u8 overflow; /* True if integer overflow seen */
1068 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001069};
1070
1071/*
drha97fdd32006-01-12 22:17:50 +00001072** Routines used to compute the sum, average, and total.
1073**
1074** The SUM() function follows the (broken) SQL standard which means
1075** that it returns NULL if it sums over no inputs. TOTAL returns
1076** 0.0 in that case. In addition, TOTAL always returns a float where
1077** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001078** value. TOTAL never fails, but SUM might through an exception if
1079** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001080*/
danielk19770ae8b832004-05-25 12:05:56 +00001081static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001082 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001083 int type;
drh3f219f42005-09-08 19:45:57 +00001084 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001085 UNUSED_PARAMETER(argc);
drh4f26d6c2004-05-26 23:25:30 +00001086 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001087 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001088 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001089 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001090 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001091 i64 v = sqlite3_value_int64(argv[0]);
1092 p->rSum += v;
1093 if( (p->approx|p->overflow)==0 ){
1094 i64 iNewSum = p->iSum + v;
drh1bd10f82008-12-10 21:19:56 +00001095 int s1 = (int)(p->iSum >> (sizeof(i64)*8-1));
1096 int s2 = (int)(v >> (sizeof(i64)*8-1));
1097 int s3 = (int)(iNewSum >> (sizeof(i64)*8-1));
1098 p->overflow = ((s1&s2&~s3) | (~s1&~s2&s3))?1:0;
drh8c08e862006-02-11 17:34:00 +00001099 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001100 }
1101 }else{
drh8c08e862006-02-11 17:34:00 +00001102 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001103 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001104 }
drh739105c2002-05-29 23:22:23 +00001105 }
drhdd5baa92002-02-27 19:50:59 +00001106}
danielk19770ae8b832004-05-25 12:05:56 +00001107static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001108 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001109 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001110 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001111 if( p->overflow ){
1112 sqlite3_result_error(context,"integer overflow",-1);
1113 }else if( p->approx ){
1114 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001115 }else{
drh8c08e862006-02-11 17:34:00 +00001116 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001117 }
drh3d1d95e2005-09-08 10:37:01 +00001118 }
drhdd5baa92002-02-27 19:50:59 +00001119}
danielk19770ae8b832004-05-25 12:05:56 +00001120static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001121 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001122 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001123 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001124 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001125 }
1126}
drha97fdd32006-01-12 22:17:50 +00001127static void totalFinalize(sqlite3_context *context){
1128 SumCtx *p;
1129 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001130 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001131}
drhdd5baa92002-02-27 19:50:59 +00001132
1133/*
drh0bce8352002-02-28 00:41:10 +00001134** The following structure keeps track of state information for the
1135** count() aggregate function.
1136*/
1137typedef struct CountCtx CountCtx;
1138struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001139 i64 n;
drh0bce8352002-02-28 00:41:10 +00001140};
drhdd5baa92002-02-27 19:50:59 +00001141
drh0bce8352002-02-28 00:41:10 +00001142/*
1143** Routines to implement the count() aggregate function.
1144*/
danielk19770ae8b832004-05-25 12:05:56 +00001145static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001146 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001147 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001148 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001149 p->n++;
1150 }
1151}
danielk19770ae8b832004-05-25 12:05:56 +00001152static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001153 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001154 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001155 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001156}
1157
1158/*
drh0bce8352002-02-28 00:41:10 +00001159** Routines to implement min() and max() aggregate functions.
1160*/
danielk197762c14b32008-11-19 09:05:26 +00001161static void minmaxStep(
1162 sqlite3_context *context,
1163 int NotUsed,
1164 sqlite3_value **argv
1165){
danielk197788208052004-05-25 01:13:20 +00001166 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001167 Mem *pBest;
danielk197762c14b32008-11-19 09:05:26 +00001168 UNUSED_PARAMETER(NotUsed);
drh9eb516c2004-07-18 20:52:32 +00001169
1170 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1171 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001172 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001173
danielk197788208052004-05-25 01:13:20 +00001174 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001175 int max;
1176 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001177 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001178 /* This step function is used for both the min() and max() aggregates,
1179 ** the only difference between the two being that the sense of the
1180 ** comparison is inverted. For the max() aggregate, the
1181 ** sqlite3_user_data() function returns (void *)-1. For min() it
1182 ** returns (void *)db, where db is the sqlite3* database pointer.
1183 ** Therefore the next statement sets variable 'max' to 1 for the max()
1184 ** aggregate, or 0 for min().
1185 */
drh309b3382007-03-17 17:52:42 +00001186 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001187 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001188 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001189 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001190 }
drh268380c2004-02-25 13:47:31 +00001191 }else{
drhb21c8cd2007-08-21 19:33:56 +00001192 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001193 }
1194}
danielk19770ae8b832004-05-25 12:05:56 +00001195static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001196 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001197 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1198 if( pRes ){
1199 if( pRes->flags ){
1200 sqlite3_result_value(context, pRes);
1201 }
1202 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001203 }
1204}
drhdd5baa92002-02-27 19:50:59 +00001205
drhb0689692007-11-01 17:38:30 +00001206/*
1207** group_concat(EXPR, ?SEPARATOR?)
1208*/
1209static void groupConcatStep(
1210 sqlite3_context *context,
1211 int argc,
1212 sqlite3_value **argv
1213){
1214 const char *zVal;
drhade86482007-11-28 22:36:40 +00001215 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001216 const char *zSep;
drh07d31172009-02-02 21:57:05 +00001217 int nVal, nSep;
1218 assert( argc==1 || argc==2 );
1219 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001220 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1221
1222 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001223 sqlite3 *db = sqlite3_context_db_handle(context);
drhade86482007-11-28 22:36:40 +00001224 pAccum->useMalloc = 1;
drhbb4957f2008-03-20 14:03:29 +00001225 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drhade86482007-11-28 22:36:40 +00001226 if( pAccum->nChar ){
drh07d31172009-02-02 21:57:05 +00001227 if( argc==2 ){
1228 zSep = (char*)sqlite3_value_text(argv[1]);
1229 nSep = sqlite3_value_bytes(argv[1]);
drhb0689692007-11-01 17:38:30 +00001230 }else{
1231 zSep = ",";
drhade86482007-11-28 22:36:40 +00001232 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001233 }
drhade86482007-11-28 22:36:40 +00001234 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001235 }
drh07d31172009-02-02 21:57:05 +00001236 zVal = (char*)sqlite3_value_text(argv[0]);
1237 nVal = sqlite3_value_bytes(argv[0]);
1238 sqlite3StrAccumAppend(pAccum, zVal, nVal);
drhb0689692007-11-01 17:38:30 +00001239 }
1240}
1241static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001242 StrAccum *pAccum;
1243 pAccum = sqlite3_aggregate_context(context, 0);
1244 if( pAccum ){
1245 if( pAccum->tooBig ){
1246 sqlite3_result_error_toobig(context);
1247 }else if( pAccum->mallocFailed ){
1248 sqlite3_result_error_nomem(context);
1249 }else{
1250 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1251 sqlite3_free);
1252 }
drhb0689692007-11-01 17:38:30 +00001253 }
1254}
drh4e5ffc52004-08-31 00:52:37 +00001255
drhd3a149e2002-02-24 17:12:53 +00001256/*
drha2ed5602002-02-26 23:55:31 +00001257** This function registered all of the above C functions as SQL
1258** functions. This should be the only routine in this file with
1259** external linkage.
drhdc04c582002-02-24 01:55:15 +00001260*/
drh9bb575f2004-09-06 17:24:11 +00001261void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh1f01ec12005-02-15 21:36:18 +00001262#ifndef SQLITE_OMIT_ALTERTABLE
1263 sqlite3AlterFunctions(db);
1264#endif
danielk19771e536952007-08-16 10:09:01 +00001265 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001266 int rc = sqlite3_overload_function(db, "MATCH", 2);
1267 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1268 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001269 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001270 }
1271 }
danielk1977fd9e1f32005-05-22 10:44:34 +00001272#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001273 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001274#endif
drh55ef4d92005-08-14 01:20:37 +00001275}
1276
1277/*
1278** Set the LIKEOPT flag on the 2-argument function with the given name.
1279*/
drh1bd10f82008-12-10 21:19:56 +00001280static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
drh55ef4d92005-08-14 01:20:37 +00001281 FuncDef *pDef;
drhea678832008-12-10 19:26:22 +00001282 pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
1283 2, SQLITE_UTF8, 0);
drh55ef4d92005-08-14 01:20:37 +00001284 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001285 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001286 }
1287}
1288
1289/*
1290** Register the built-in LIKE and GLOB functions. The caseSensitive
1291** parameter determines whether or not the LIKE operator is case
1292** sensitive. GLOB is always case sensitive.
1293*/
1294void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1295 struct compareInfo *pInfo;
1296 if( caseSensitive ){
1297 pInfo = (struct compareInfo*)&likeInfoAlt;
1298 }else{
1299 pInfo = (struct compareInfo*)&likeInfoNorm;
1300 }
danielk1977771151b2006-01-17 13:21:40 +00001301 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1302 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1303 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001304 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001305 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1306 setLikeOptFlag(db, "like",
1307 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001308}
1309
1310/*
1311** pExpr points to an expression which implements a function. If
1312** it is appropriate to apply the LIKE optimization to that function
1313** then set aWc[0] through aWc[2] to the wildcard characters and
1314** return TRUE. If the function is not a LIKE-style function then
1315** return FALSE.
1316*/
drhd64fe2f2005-08-28 17:00:23 +00001317int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001318 FuncDef *pDef;
danielk1977cdbd8ef2007-05-12 06:11:12 +00001319 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
drh55ef4d92005-08-14 01:20:37 +00001320 return 0;
1321 }
1322 if( pExpr->pList->nExpr!=2 ){
1323 return 0;
1324 }
drh2646da72005-12-09 20:02:05 +00001325 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001326 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001327 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001328 return 0;
1329 }
1330
1331 /* The memcpy() statement assumes that the wildcard characters are
1332 ** the first three statements in the compareInfo structure. The
1333 ** asserts() that follow verify that assumption
1334 */
1335 memcpy(aWc, pDef->pUserData, 3);
1336 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1337 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1338 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001339 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001340 return 1;
drhdc04c582002-02-24 01:55:15 +00001341}
danielk19778c0a7912008-08-20 14:49:23 +00001342
drh70a8ca32008-08-21 18:49:27 +00001343/*
drh777c5382008-08-21 20:21:34 +00001344** All all of the FuncDef structures in the aBuiltinFunc[] array above
1345** to the global function hash table. This occurs at start-time (as
1346** a consequence of calling sqlite3_initialize()).
1347**
1348** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001349*/
1350void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001351 /*
1352 ** The following array holds FuncDef structures for all of the functions
1353 ** defined in this file.
1354 **
1355 ** The array cannot be constant since changes are made to the
1356 ** FuncDef.pHash elements at start-time. The elements of this array
1357 ** are read-only after initialization is complete.
1358 */
1359 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1360 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1361 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1362 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1363 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1364 FUNCTION(trim, 1, 3, 0, trimFunc ),
1365 FUNCTION(trim, 2, 3, 0, trimFunc ),
1366 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1367 FUNCTION(min, 0, 0, 1, 0 ),
1368 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1369 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1370 FUNCTION(max, 0, 1, 1, 0 ),
1371 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1372 FUNCTION(typeof, 1, 0, 0, typeofFunc ),
1373 FUNCTION(length, 1, 0, 0, lengthFunc ),
1374 FUNCTION(substr, 2, 0, 0, substrFunc ),
1375 FUNCTION(substr, 3, 0, 0, substrFunc ),
1376 FUNCTION(abs, 1, 0, 0, absFunc ),
1377 FUNCTION(round, 1, 0, 0, roundFunc ),
1378 FUNCTION(round, 2, 0, 0, roundFunc ),
1379 FUNCTION(upper, 1, 0, 0, upperFunc ),
1380 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1381 FUNCTION(coalesce, 1, 0, 0, 0 ),
1382 FUNCTION(coalesce, -1, 0, 0, ifnullFunc ),
1383 FUNCTION(coalesce, 0, 0, 0, 0 ),
1384 FUNCTION(hex, 1, 0, 0, hexFunc ),
1385 FUNCTION(ifnull, 2, 0, 1, ifnullFunc ),
drh9373b012009-02-02 01:50:39 +00001386 FUNCTION(random, 0, 0, 0, randomFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001387 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1388 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1389 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
1390 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1391 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1392 FUNCTION(changes, 0, 0, 0, changes ),
1393 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1394 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1395 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1396 #ifdef SQLITE_SOUNDEX
1397 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1398 #endif
1399 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1400 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1401 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1402 #endif
1403 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1404 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1405 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
1406 AGGREGATE(count, 0, 0, 0, countStep, countFinalize ),
1407 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
drh07d31172009-02-02 21:57:05 +00001408 AGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize),
1409 AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize),
danielk197793ce7412008-09-01 19:14:02 +00001410
1411 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1412 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1413 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1414 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1415 #else
1416 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1417 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1418 #endif
1419 };
1420
drh70a8ca32008-08-21 18:49:27 +00001421 int i;
danielk197793ce7412008-09-01 19:14:02 +00001422 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001423 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001424
drh70a8ca32008-08-21 18:49:27 +00001425 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001426 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001427 }
drh777c5382008-08-21 20:21:34 +00001428 sqlite3RegisterDateTimeFunctions();
drh70a8ca32008-08-21 18:49:27 +00001429}