blob: d92fa5bbf0dc340e8d03d03a73c5e3889bcc43f7 [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**
drh65595cd2009-02-02 16:32:55 +000019** $Id: func.c,v 1.216 2009/02/02 16:32:55 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;
227 }
drhf764e6f2007-05-15 01:13:47 +0000228 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000229 while( *z && p1 ){
230 SQLITE_SKIP_UTF8(z);
231 p1--;
drhf764e6f2007-05-15 01:13:47 +0000232 }
drh4a919112007-05-15 11:55:09 +0000233 for(z2=z; *z2 && p2; p2--){
234 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000235 }
drh1bd10f82008-12-10 21:19:56 +0000236 sqlite3_result_text(context, (char*)z, (int)(z2-z), SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000237 }else{
drh1bd10f82008-12-10 21:19:56 +0000238 sqlite3_result_blob(context, (char*)&z[p1], (int)p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000239 }
drh0bce8352002-02-28 00:41:10 +0000240}
241
242/*
243** Implementation of the round() function
244*/
danielk19770ae8b832004-05-25 12:05:56 +0000245static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000246 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000247 double r;
drh592ac8c2005-08-13 03:07:47 +0000248 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000249 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000250 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000251 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000252 n = sqlite3_value_int(argv[1]);
253 if( n>30 ) n = 30;
254 if( n<0 ) n = 0;
255 }
drhd589a922006-03-02 03:02:48 +0000256 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000257 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000258 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000259 sqlite3AtoF(zBuf, &r);
260 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000261}
drhdc04c582002-02-24 01:55:15 +0000262
danielk197726783a52007-08-29 14:06:22 +0000263/*
264** Allocate nByte bytes of space using sqlite3_malloc(). If the
265** allocation fails, call sqlite3_result_error_nomem() to notify
266** the database handle that malloc() has failed.
267*/
drhb1a6c3c2008-03-20 16:30:17 +0000268static void *contextMalloc(sqlite3_context *context, i64 nByte){
drhbb4957f2008-03-20 14:03:29 +0000269 char *z;
270 if( nByte>sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH] ){
271 sqlite3_result_error_toobig(context);
272 z = 0;
273 }else{
drh1bd10f82008-12-10 21:19:56 +0000274 z = sqlite3Malloc((int)nByte);
drhbb4957f2008-03-20 14:03:29 +0000275 if( !z && nByte>0 ){
276 sqlite3_result_error_nomem(context);
277 }
danielk1977a1644fd2007-08-29 12:31:25 +0000278 }
279 return z;
280}
281
drhdc04c582002-02-24 01:55:15 +0000282/*
283** Implementation of the upper() and lower() SQL functions.
284*/
danielk19770ae8b832004-05-25 12:05:56 +0000285static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000286 char *z1;
287 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000288 int i, n;
drh9c054832004-05-31 18:51:57 +0000289 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
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;
drh9c054832004-05-31 18:51:57 +0000309 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000310 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000311 n = sqlite3_value_bytes(argv[0]);
312 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
313 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000314 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000315 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000316 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000317 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000318 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000319 z1[i] = sqlite3Tolower(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000320 }
danielk197778ca0e72009-01-20 16:53:39 +0000321 sqlite3_result_text(context, (char *)z1, -1, sqlite3_free);
drh7a521cf2007-04-25 18:23:52 +0000322 }
drhdc04c582002-02-24 01:55:15 +0000323 }
324}
325
326/*
drhfbc99082002-02-28 03:14:18 +0000327** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000328** All three do the same thing. They return the first non-NULL
329** argument.
drh3212e182002-02-28 00:46:26 +0000330*/
drhf9b596e2004-05-26 16:54:42 +0000331static void ifnullFunc(
332 sqlite3_context *context,
333 int argc,
334 sqlite3_value **argv
335){
drhfbc99082002-02-28 03:14:18 +0000336 int i;
337 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000338 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000339 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000340 break;
341 }
342 }
drh3212e182002-02-28 00:46:26 +0000343}
344
345/*
drhf9ffac92002-03-02 19:00:31 +0000346** Implementation of random(). Return a random integer.
347*/
drhf9b596e2004-05-26 16:54:42 +0000348static void randomFunc(
349 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000350 int NotUsed,
351 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000352){
drh52fc8492006-02-23 21:43:55 +0000353 sqlite_int64 r;
danielk197762c14b32008-11-19 09:05:26 +0000354 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drh2fa18682008-03-19 14:15:34 +0000355 sqlite3_randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000356 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
357 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000358 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000359}
360
361/*
drh137c7282007-01-29 17:58:28 +0000362** Implementation of randomblob(N). Return a random blob
363** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000364*/
drh137c7282007-01-29 17:58:28 +0000365static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000366 sqlite3_context *context,
367 int argc,
368 sqlite3_value **argv
369){
drh137c7282007-01-29 17:58:28 +0000370 int n;
371 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000372 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000373 UNUSED_PARAMETER(argc);
drh63cf66f2007-01-29 15:50:05 +0000374 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000375 if( n<1 ){
376 n = 1;
377 }
danielk1977a1644fd2007-08-29 12:31:25 +0000378 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000379 if( p ){
drh2fa18682008-03-19 14:15:34 +0000380 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000381 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000382 }
drh63cf66f2007-01-29 15:50:05 +0000383}
384
385/*
drh6ed41ad2002-04-06 14:10:47 +0000386** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000387** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000388*/
danielk197751ad0ec2004-05-24 12:39:02 +0000389static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000390 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000391 int NotUsed,
392 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000393){
drhfa4a4b92008-03-19 21:45:51 +0000394 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000395 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf9b596e2004-05-26 16:54:42 +0000396 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000397}
398
rdcf146a772004-02-25 22:51:06 +0000399/*
danielk1977b28af712004-06-21 06:50:26 +0000400** Implementation of the changes() SQL function. The return value is the
401** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000402*/
danielk1977b28af712004-06-21 06:50:26 +0000403static void changes(
drhf9b596e2004-05-26 16:54:42 +0000404 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000405 int NotUsed,
406 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000407){
drhfa4a4b92008-03-19 21:45:51 +0000408 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000409 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf4479502004-05-27 03:12:53 +0000410 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000411}
rdcf146a772004-02-25 22:51:06 +0000412
413/*
danielk1977b28af712004-06-21 06:50:26 +0000414** Implementation of the total_changes() SQL function. The return value is
415** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000416*/
danielk1977b28af712004-06-21 06:50:26 +0000417static void total_changes(
418 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000419 int NotUsed,
420 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000421){
drhfa4a4b92008-03-19 21:45:51 +0000422 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000423 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977b28af712004-06-21 06:50:26 +0000424 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000425}
426
drh6ed41ad2002-04-06 14:10:47 +0000427/*
drh4e5ffc52004-08-31 00:52:37 +0000428** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000429*/
drh4e5ffc52004-08-31 00:52:37 +0000430struct compareInfo {
431 u8 matchAll;
432 u8 matchOne;
433 u8 matchSet;
434 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000435};
drh55ef4d92005-08-14 01:20:37 +0000436
drhb9175ae2007-12-07 18:39:04 +0000437/*
438** For LIKE and GLOB matching on EBCDIC machines, assume that every
439** character is exactly one byte in size. Also, all characters are
440** able to participate in upper-case-to-lower-case mappings in EBCDIC
441** whereas only characters less than 0x80 do in ASCII.
442*/
443#if defined(SQLITE_EBCDIC)
444# define sqlite3Utf8Read(A,B,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000445# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000446#else
drh6ed4b782007-12-10 18:07:20 +0000447# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000448#endif
449
drh4e5ffc52004-08-31 00:52:37 +0000450static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000451/* The correct SQL-92 behavior is for the LIKE operator to ignore
452** case. Thus 'a' LIKE 'A' would be true. */
453static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
454/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
455** is case sensitive causing 'a' LIKE 'A' to be false */
456static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000457
458/*
drh4e5ffc52004-08-31 00:52:37 +0000459** Compare two UTF-8 strings for equality where the first string can
460** potentially be a "glob" expression. Return true (1) if they
461** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000462**
drh4e5ffc52004-08-31 00:52:37 +0000463** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000464**
drh4e5ffc52004-08-31 00:52:37 +0000465** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000466**
drh4e5ffc52004-08-31 00:52:37 +0000467** '?' Matches exactly one character.
468**
469** [...] Matches one character from the enclosed list of
470** characters.
471**
472** [^...] Matches one character not in the enclosed list.
473**
474** With the [...] and [^...] matching, a ']' character can be included
475** in the list by making it the first character after '[' or '^'. A
476** range of characters can be specified using '-'. Example:
477** "[a-z]" matches any single lower-case letter. To match a '-', make
478** it the last character in the list.
479**
480** This routine is usually quick, but can be N**2 in the worst case.
481**
482** Hints: to match '*' or '?', put them in "[]". Like this:
483**
484** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000485*/
danielk19777c6303c2004-11-17 16:41:29 +0000486static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000487 const u8 *zPattern, /* The glob pattern */
488 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000489 const struct compareInfo *pInfo, /* Information about how to do the compare */
490 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000491){
drh66150952007-07-23 19:12:41 +0000492 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000493 int invert;
494 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000495 u8 matchOne = pInfo->matchOne;
496 u8 matchAll = pInfo->matchAll;
497 u8 matchSet = pInfo->matchSet;
498 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000499 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000500
drh66150952007-07-23 19:12:41 +0000501 while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000502 if( !prevEscape && c==matchAll ){
drh66150952007-07-23 19:12:41 +0000503 while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll
504 || c == matchOne ){
505 if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){
506 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000507 }
danielk1977ad7dd422004-06-06 12:41:49 +0000508 }
drh66150952007-07-23 19:12:41 +0000509 if( c==0 ){
510 return 1;
511 }else if( c==esc ){
512 c = sqlite3Utf8Read(zPattern, 0, &zPattern);
513 if( c==0 ){
514 return 0;
515 }
516 }else if( c==matchSet ){
517 assert( esc==0 ); /* This is GLOB, not LIKE */
518 assert( matchSet<0x80 ); /* '[' is a single-byte character */
519 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000520 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000521 }
522 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000523 }
524 while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){
525 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000526 GlogUpperToLower(c2);
527 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000528 while( c2 != 0 && c2 != c ){
529 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh6ed4b782007-12-10 18:07:20 +0000530 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000531 }
drh66150952007-07-23 19:12:41 +0000532 }else{
533 while( c2 != 0 && c2 != c ){
534 c2 = sqlite3Utf8Read(zString, 0, &zString);
535 }
drh4e5ffc52004-08-31 00:52:37 +0000536 }
drh66150952007-07-23 19:12:41 +0000537 if( c2==0 ) return 0;
538 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
539 }
540 return 0;
541 }else if( !prevEscape && c==matchOne ){
542 if( sqlite3Utf8Read(zString, 0, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000543 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000544 }
drh4e5ffc52004-08-31 00:52:37 +0000545 }else if( c==matchSet ){
546 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000547 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000548 seen = 0;
549 invert = 0;
drh66150952007-07-23 19:12:41 +0000550 c = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000551 if( c==0 ) return 0;
drh66150952007-07-23 19:12:41 +0000552 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
553 if( c2=='^' ){
554 invert = 1;
555 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
556 }
drh4e5ffc52004-08-31 00:52:37 +0000557 if( c2==']' ){
558 if( c==']' ) seen = 1;
drh66150952007-07-23 19:12:41 +0000559 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000560 }
drh66150952007-07-23 19:12:41 +0000561 while( c2 && c2!=']' ){
562 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
563 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000564 if( c>=prior_c && c<=c2 ) seen = 1;
565 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000566 }else{
drh66150952007-07-23 19:12:41 +0000567 if( c==c2 ){
568 seen = 1;
569 }
drh4e5ffc52004-08-31 00:52:37 +0000570 prior_c = c2;
571 }
drh66150952007-07-23 19:12:41 +0000572 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000573 }
drh66150952007-07-23 19:12:41 +0000574 if( c2==0 || (seen ^ invert)==0 ){
575 return 0;
576 }
577 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000578 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000579 }else{
drh66150952007-07-23 19:12:41 +0000580 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000581 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000582 GlogUpperToLower(c);
583 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000584 }
drh66150952007-07-23 19:12:41 +0000585 if( c!=c2 ){
586 return 0;
587 }
danielk19777c6303c2004-11-17 16:41:29 +0000588 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000589 }
danielk197751ad0ec2004-05-24 12:39:02 +0000590 }
drh4e5ffc52004-08-31 00:52:37 +0000591 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000592}
drh4e5ffc52004-08-31 00:52:37 +0000593
drh55ef4d92005-08-14 01:20:37 +0000594/*
595** Count the number of times that the LIKE operator (or GLOB which is
596** just a variation of LIKE) gets called. This is used for testing
597** only.
598*/
599#ifdef SQLITE_TEST
600int sqlite3_like_count = 0;
601#endif
602
danielk19773f6b0872004-06-17 05:36:44 +0000603
604/*
605** Implementation of the like() SQL function. This function implements
606** the build-in LIKE operator. The first argument to the function is the
607** pattern and the second argument is the string. So, the SQL statements:
608**
609** A LIKE B
610**
611** is implemented as like(B,A).
612**
drh55ef4d92005-08-14 01:20:37 +0000613** This same function (with a different compareInfo structure) computes
614** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000615*/
616static void likeFunc(
617 sqlite3_context *context,
618 int argc,
619 sqlite3_value **argv
620){
drhbeb818d2007-05-08 15:34:47 +0000621 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000622 int escape = 0;
drhbb4957f2008-03-20 14:03:29 +0000623 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000624
drh1f0feef2007-05-15 13:27:07 +0000625 zB = sqlite3_value_text(argv[0]);
626 zA = sqlite3_value_text(argv[1]);
627
drhbeb818d2007-05-08 15:34:47 +0000628 /* Limit the length of the LIKE or GLOB pattern to avoid problems
629 ** of deep recursion and N*N behavior in patternCompare().
630 */
drhbb4957f2008-03-20 14:03:29 +0000631 if( sqlite3_value_bytes(argv[0]) >
632 db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000633 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
634 return;
635 }
drh1f0feef2007-05-15 13:27:07 +0000636 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000637
danielk19777c6303c2004-11-17 16:41:29 +0000638 if( argc==3 ){
639 /* The escape character string must consist of a single UTF-8 character.
640 ** Otherwise, return an error.
641 */
642 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000643 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000644 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000645 sqlite3_result_error(context,
646 "ESCAPE expression must be a single character", -1);
647 return;
648 }
drh66150952007-07-23 19:12:41 +0000649 escape = sqlite3Utf8Read(zEsc, 0, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000650 }
danielk19773f6b0872004-06-17 05:36:44 +0000651 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000652 struct compareInfo *pInfo = sqlite3_user_data(context);
653#ifdef SQLITE_TEST
654 sqlite3_like_count++;
655#endif
drhbeb818d2007-05-08 15:34:47 +0000656
danielk1977b56fe1f2007-05-09 08:24:44 +0000657 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000658 }
drh8912d102002-05-26 21:34:58 +0000659}
660
661/*
662** Implementation of the NULLIF(x,y) function. The result is the first
663** argument if the arguments are different. The result is NULL if the
664** arguments are equal to each other.
665*/
drhf9b596e2004-05-26 16:54:42 +0000666static void nullifFunc(
667 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000668 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +0000669 sqlite3_value **argv
670){
danielk1977dc1bdc42004-06-11 10:51:27 +0000671 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk197762c14b32008-11-19 09:05:26 +0000672 UNUSED_PARAMETER(NotUsed);
danielk1977dc1bdc42004-06-11 10:51:27 +0000673 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000674 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000675 }
drh0ac65892002-04-20 14:24:41 +0000676}
677
drh647cb0e2002-11-04 19:32:25 +0000678/*
679** Implementation of the VERSION(*) function. The result is the version
680** of the SQLite library that is running.
681*/
drhf9b596e2004-05-26 16:54:42 +0000682static void versionFunc(
683 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000684 int NotUsed,
685 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000686){
danielk197762c14b32008-11-19 09:05:26 +0000687 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977d8123362004-06-12 09:25:12 +0000688 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000689}
690
drh137c7282007-01-29 17:58:28 +0000691/* Array for converting from half-bytes (nybbles) into ASCII hex
692** digits. */
693static const char hexdigits[] = {
694 '0', '1', '2', '3', '4', '5', '6', '7',
695 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
696};
danielk1977d641d642004-11-18 15:44:29 +0000697
drh47394702003-08-20 01:03:33 +0000698/*
699** EXPERIMENTAL - This is not an official function. The interface may
700** change. This function may disappear. Do not write code that depends
701** on this function.
702**
703** Implementation of the QUOTE() function. This function takes a single
704** argument. If the argument is numeric, the return value is the same as
705** the argument. If the argument is NULL, the return value is the string
706** "NULL". Otherwise, the argument is enclosed in single quotes with
707** single-quote escapes.
708*/
danielk19770ae8b832004-05-25 12:05:56 +0000709static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000710 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000711 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000712 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000713 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000714 break;
drh47394702003-08-20 01:03:33 +0000715 }
drh9c054832004-05-31 18:51:57 +0000716 case SQLITE_INTEGER:
717 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000718 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000719 break;
720 }
danielk19773f41e972004-06-08 00:39:01 +0000721 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000722 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000723 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000724 int nBlob = sqlite3_value_bytes(argv[0]);
725 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000726 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000727 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000728 int i;
729 for(i=0; i<nBlob; i++){
730 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
731 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
732 }
733 zText[(nBlob*2)+2] = '\'';
734 zText[(nBlob*2)+3] = '\0';
735 zText[0] = 'X';
736 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000737 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000738 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000739 }
740 break;
741 }
drh9c054832004-05-31 18:51:57 +0000742 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000743 int i,j;
744 u64 n;
drh2646da72005-12-09 20:02:05 +0000745 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000746 char *z;
747
drh7a521cf2007-04-25 18:23:52 +0000748 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000749 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000750 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000751 if( z ){
752 z[0] = '\'';
753 for(i=0, j=1; zArg[i]; i++){
754 z[j++] = zArg[i];
755 if( zArg[i]=='\'' ){
756 z[j++] = '\'';
757 }
drhf9b596e2004-05-26 16:54:42 +0000758 }
danielk1977a1644fd2007-08-29 12:31:25 +0000759 z[j++] = '\'';
760 z[j] = 0;
761 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000762 }
drhf9b596e2004-05-26 16:54:42 +0000763 }
drh47394702003-08-20 01:03:33 +0000764 }
765}
766
drh137c7282007-01-29 17:58:28 +0000767/*
768** The hex() function. Interpret the argument as a blob. Return
769** a hexadecimal rendering as text.
770*/
771static void hexFunc(
772 sqlite3_context *context,
773 int argc,
774 sqlite3_value **argv
775){
776 int i, n;
777 const unsigned char *pBlob;
778 char *zHex, *z;
779 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000780 UNUSED_PARAMETER(argc);
drh1f0feef2007-05-15 13:27:07 +0000781 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000782 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000783 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000784 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000785 if( zHex ){
786 for(i=0; i<n; i++, pBlob++){
787 unsigned char c = *pBlob;
788 *(z++) = hexdigits[(c>>4)&0xf];
789 *(z++) = hexdigits[c&0xf];
790 }
791 *z = 0;
792 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000793 }
drh137c7282007-01-29 17:58:28 +0000794}
795
drh26b6d902007-03-17 13:27:54 +0000796/*
drh8cff3822007-05-02 02:08:28 +0000797** The zeroblob(N) function returns a zero-filled blob of size N bytes.
798*/
799static void zeroblobFunc(
800 sqlite3_context *context,
801 int argc,
802 sqlite3_value **argv
803){
drh98640a32007-06-07 19:08:32 +0000804 i64 n;
drh8cff3822007-05-02 02:08:28 +0000805 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000806 UNUSED_PARAMETER(argc);
drh98640a32007-06-07 19:08:32 +0000807 n = sqlite3_value_int64(argv[0]);
808 if( n>SQLITE_MAX_LENGTH ){
809 sqlite3_result_error_toobig(context);
810 }else{
drh1bd10f82008-12-10 21:19:56 +0000811 sqlite3_result_zeroblob(context, (int)n);
drh98640a32007-06-07 19:08:32 +0000812 }
drh8cff3822007-05-02 02:08:28 +0000813}
814
815/*
drh26b6d902007-03-17 13:27:54 +0000816** The replace() function. Three arguments are all strings: call
817** them A, B, and C. The result is also a string which is derived
818** from A by replacing every occurance of B with C. The match
819** must be exact. Collating sequences are not used.
820*/
821static void replaceFunc(
822 sqlite3_context *context,
823 int argc,
824 sqlite3_value **argv
825){
826 const unsigned char *zStr; /* The input string A */
827 const unsigned char *zPattern; /* The pattern string B */
828 const unsigned char *zRep; /* The replacement string C */
829 unsigned char *zOut; /* The output */
830 int nStr; /* Size of zStr */
831 int nPattern; /* Size of zPattern */
832 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000833 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000834 int loopLimit; /* Last zStr[] that might match zPattern[] */
835 int i, j; /* Loop counters */
836
837 assert( argc==3 );
danielk1977f3d3c272008-11-19 16:52:44 +0000838 UNUSED_PARAMETER(argc);
drh26b6d902007-03-17 13:27:54 +0000839 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000840 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000841 nStr = sqlite3_value_bytes(argv[0]);
842 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000843 zPattern = sqlite3_value_text(argv[1]);
drha605fe82009-02-01 18:08:40 +0000844 if( zPattern==0 ){
845 assert( sqlite3_value_type(argv[1])==SQLITE_NULL );
846 return;
847 }
848 if( zPattern[0]==0 ){
849 assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
850 sqlite3_result_value(context, argv[0]);
851 return;
852 }
drh1f0feef2007-05-15 13:27:07 +0000853 nPattern = sqlite3_value_bytes(argv[1]);
854 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000855 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000856 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000857 nRep = sqlite3_value_bytes(argv[2]);
858 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000859 nOut = nStr + 1;
860 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +0000861 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +0000862 if( zOut==0 ){
863 return;
drh26b6d902007-03-17 13:27:54 +0000864 }
drh26b6d902007-03-17 13:27:54 +0000865 loopLimit = nStr - nPattern;
866 for(i=j=0; i<=loopLimit; i++){
867 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
868 zOut[j++] = zStr[i];
869 }else{
drh4a50aac2007-08-23 02:47:53 +0000870 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +0000871 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +0000872 nOut += nRep - nPattern;
drhbb4957f2008-03-20 14:03:29 +0000873 if( nOut>=db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +0000874 sqlite3_result_error_toobig(context);
drh633e6d52008-07-28 19:34:53 +0000875 sqlite3DbFree(db, zOut);
danielk197717374e82007-05-08 14:39:04 +0000876 return;
877 }
drh4a50aac2007-08-23 02:47:53 +0000878 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000879 zOut = sqlite3_realloc(zOut, (int)nOut);
880 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000881 sqlite3_result_error_nomem(context);
drh633e6d52008-07-28 19:34:53 +0000882 sqlite3DbFree(db, zOld);
drh2e6400b2007-05-08 15:46:18 +0000883 return;
884 }
drh26b6d902007-03-17 13:27:54 +0000885 memcpy(&zOut[j], zRep, nRep);
886 j += nRep;
887 i += nPattern-1;
888 }
889 }
drh2e6400b2007-05-08 15:46:18 +0000890 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000891 memcpy(&zOut[j], &zStr[i], nStr-i);
892 j += nStr - i;
893 assert( j<=nOut );
894 zOut[j] = 0;
895 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
896}
897
drh309b3382007-03-17 17:52:42 +0000898/*
899** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
900** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
901*/
902static void trimFunc(
903 sqlite3_context *context,
904 int argc,
905 sqlite3_value **argv
906){
907 const unsigned char *zIn; /* Input string */
908 const unsigned char *zCharSet; /* Set of characters to trim */
909 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +0000910 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +0000911 int i; /* Loop counter */
drh1bd10f82008-12-10 21:19:56 +0000912 unsigned char *aLen = 0; /* Length of each character in zCharSet */
913 unsigned char **azChar = 0; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000914 int nChar; /* Number of characters in zCharSet */
915
drh309b3382007-03-17 17:52:42 +0000916 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
917 return;
918 }
919 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000920 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000921 nIn = sqlite3_value_bytes(argv[0]);
922 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000923 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000924 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +0000925 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000926 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000927 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +0000928 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +0000929 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000930 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000931 return;
drhd1e3a612007-04-27 21:59:52 +0000932 }else{
933 const unsigned char *z;
934 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000935 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000936 }
937 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +0000938 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +0000939 if( azChar==0 ){
940 return;
941 }
942 aLen = (unsigned char*)&azChar[nChar];
943 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +0000944 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +0000945 SQLITE_SKIP_UTF8(z);
drh3abbd392008-12-10 23:04:13 +0000946 aLen[nChar] = (u8)(z - azChar[nChar]);
drhd1e3a612007-04-27 21:59:52 +0000947 }
948 }
drh309b3382007-03-17 17:52:42 +0000949 }
drhd1e3a612007-04-27 21:59:52 +0000950 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +0000951 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +0000952 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000953 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +0000954 int len = 0;
drhd1e3a612007-04-27 21:59:52 +0000955 for(i=0; i<nChar; i++){
956 len = aLen[i];
957 if( memcmp(zIn, azChar[i], len)==0 ) break;
958 }
959 if( i>=nChar ) break;
960 zIn += len;
961 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000962 }
963 }
964 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000965 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +0000966 int len = 0;
drhd1e3a612007-04-27 21:59:52 +0000967 for(i=0; i<nChar; i++){
968 len = aLen[i];
969 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
970 }
971 if( i>=nChar ) break;
972 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000973 }
974 }
drhd1e3a612007-04-27 21:59:52 +0000975 if( zCharSet ){
976 sqlite3_free(azChar);
977 }
drh309b3382007-03-17 17:52:42 +0000978 }
979 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
980}
drh26b6d902007-03-17 13:27:54 +0000981
danielk1977a4de4532008-09-02 15:44:08 +0000982
drhd24cc422003-03-27 12:51:24 +0000983#ifdef SQLITE_SOUNDEX
984/*
985** Compute the soundex encoding of a word.
986*/
drh137c7282007-01-29 17:58:28 +0000987static void soundexFunc(
988 sqlite3_context *context,
989 int argc,
990 sqlite3_value **argv
991){
drhd24cc422003-03-27 12:51:24 +0000992 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000993 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000994 int i, j;
995 static const unsigned char iCode[] = {
996 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
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, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1001 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1002 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1003 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1004 };
1005 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +00001006 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +00001007 if( zIn==0 ) zIn = (u8*)"";
drhdc86e2b2009-01-24 11:30:42 +00001008 for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
drhd24cc422003-03-27 12:51:24 +00001009 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +00001010 u8 prevcode = iCode[zIn[i]&0x7f];
danielk197778ca0e72009-01-20 16:53:39 +00001011 zResult[0] = sqlite3Toupper(zIn[i]);
drhd24cc422003-03-27 12:51:24 +00001012 for(j=1; j<4 && zIn[i]; i++){
1013 int code = iCode[zIn[i]&0x7f];
1014 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +00001015 if( code!=prevcode ){
1016 prevcode = code;
1017 zResult[j++] = code + '0';
1018 }
1019 }else{
1020 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +00001021 }
1022 }
1023 while( j<4 ){
1024 zResult[j++] = '0';
1025 }
1026 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001027 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +00001028 }else{
danielk1977d8123362004-06-12 09:25:12 +00001029 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +00001030 }
1031}
1032#endif
1033
drhfdb83b22006-06-17 14:12:47 +00001034#ifndef SQLITE_OMIT_LOAD_EXTENSION
1035/*
1036** A function that loads a shared-library extension then returns NULL.
1037*/
1038static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001039 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001040 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001041 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001042 char *zErrMsg = 0;
1043
1044 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001045 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001046 }else{
1047 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001048 }
drh7a521cf2007-04-25 18:23:52 +00001049 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001050 sqlite3_result_error(context, zErrMsg, -1);
1051 sqlite3_free(zErrMsg);
1052 }
1053}
1054#endif
1055
danielk197701427a62005-01-11 13:02:33 +00001056
drh0ac65892002-04-20 14:24:41 +00001057/*
drhd3a149e2002-02-24 17:12:53 +00001058** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001059** sum() or avg() aggregate computation.
1060*/
1061typedef struct SumCtx SumCtx;
1062struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001063 double rSum; /* Floating point sum */
1064 i64 iSum; /* Integer sum */
1065 i64 cnt; /* Number of elements summed */
1066 u8 overflow; /* True if integer overflow seen */
1067 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001068};
1069
1070/*
drha97fdd32006-01-12 22:17:50 +00001071** Routines used to compute the sum, average, and total.
1072**
1073** The SUM() function follows the (broken) SQL standard which means
1074** that it returns NULL if it sums over no inputs. TOTAL returns
1075** 0.0 in that case. In addition, TOTAL always returns a float where
1076** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001077** value. TOTAL never fails, but SUM might through an exception if
1078** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001079*/
danielk19770ae8b832004-05-25 12:05:56 +00001080static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001081 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001082 int type;
drh3f219f42005-09-08 19:45:57 +00001083 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001084 UNUSED_PARAMETER(argc);
drh4f26d6c2004-05-26 23:25:30 +00001085 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001086 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001087 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001088 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001089 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001090 i64 v = sqlite3_value_int64(argv[0]);
1091 p->rSum += v;
1092 if( (p->approx|p->overflow)==0 ){
1093 i64 iNewSum = p->iSum + v;
drh1bd10f82008-12-10 21:19:56 +00001094 int s1 = (int)(p->iSum >> (sizeof(i64)*8-1));
1095 int s2 = (int)(v >> (sizeof(i64)*8-1));
1096 int s3 = (int)(iNewSum >> (sizeof(i64)*8-1));
1097 p->overflow = ((s1&s2&~s3) | (~s1&~s2&s3))?1:0;
drh8c08e862006-02-11 17:34:00 +00001098 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001099 }
1100 }else{
drh8c08e862006-02-11 17:34:00 +00001101 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001102 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001103 }
drh739105c2002-05-29 23:22:23 +00001104 }
drhdd5baa92002-02-27 19:50:59 +00001105}
danielk19770ae8b832004-05-25 12:05:56 +00001106static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001107 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001108 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001109 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001110 if( p->overflow ){
1111 sqlite3_result_error(context,"integer overflow",-1);
1112 }else if( p->approx ){
1113 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001114 }else{
drh8c08e862006-02-11 17:34:00 +00001115 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001116 }
drh3d1d95e2005-09-08 10:37:01 +00001117 }
drhdd5baa92002-02-27 19:50:59 +00001118}
danielk19770ae8b832004-05-25 12:05:56 +00001119static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001120 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001121 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001122 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001123 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001124 }
1125}
drha97fdd32006-01-12 22:17:50 +00001126static void totalFinalize(sqlite3_context *context){
1127 SumCtx *p;
1128 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001129 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001130}
drhdd5baa92002-02-27 19:50:59 +00001131
1132/*
drh0bce8352002-02-28 00:41:10 +00001133** The following structure keeps track of state information for the
1134** count() aggregate function.
1135*/
1136typedef struct CountCtx CountCtx;
1137struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001138 i64 n;
drh0bce8352002-02-28 00:41:10 +00001139};
drhdd5baa92002-02-27 19:50:59 +00001140
drh0bce8352002-02-28 00:41:10 +00001141/*
1142** Routines to implement the count() aggregate function.
1143*/
danielk19770ae8b832004-05-25 12:05:56 +00001144static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001145 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001146 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001147 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001148 p->n++;
1149 }
1150}
danielk19770ae8b832004-05-25 12:05:56 +00001151static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001152 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001153 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001154 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001155}
1156
1157/*
drh0bce8352002-02-28 00:41:10 +00001158** Routines to implement min() and max() aggregate functions.
1159*/
danielk197762c14b32008-11-19 09:05:26 +00001160static void minmaxStep(
1161 sqlite3_context *context,
1162 int NotUsed,
1163 sqlite3_value **argv
1164){
danielk197788208052004-05-25 01:13:20 +00001165 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001166 Mem *pBest;
danielk197762c14b32008-11-19 09:05:26 +00001167 UNUSED_PARAMETER(NotUsed);
drh9eb516c2004-07-18 20:52:32 +00001168
1169 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1170 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001171 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001172
danielk197788208052004-05-25 01:13:20 +00001173 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001174 int max;
1175 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001176 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001177 /* This step function is used for both the min() and max() aggregates,
1178 ** the only difference between the two being that the sense of the
1179 ** comparison is inverted. For the max() aggregate, the
1180 ** sqlite3_user_data() function returns (void *)-1. For min() it
1181 ** returns (void *)db, where db is the sqlite3* database pointer.
1182 ** Therefore the next statement sets variable 'max' to 1 for the max()
1183 ** aggregate, or 0 for min().
1184 */
drh309b3382007-03-17 17:52:42 +00001185 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001186 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001187 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001188 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001189 }
drh268380c2004-02-25 13:47:31 +00001190 }else{
drhb21c8cd2007-08-21 19:33:56 +00001191 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001192 }
1193}
danielk19770ae8b832004-05-25 12:05:56 +00001194static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001195 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001196 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1197 if( pRes ){
1198 if( pRes->flags ){
1199 sqlite3_result_value(context, pRes);
1200 }
1201 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001202 }
1203}
drhdd5baa92002-02-27 19:50:59 +00001204
drhb0689692007-11-01 17:38:30 +00001205/*
1206** group_concat(EXPR, ?SEPARATOR?)
1207*/
1208static void groupConcatStep(
1209 sqlite3_context *context,
1210 int argc,
1211 sqlite3_value **argv
1212){
1213 const char *zVal;
drhade86482007-11-28 22:36:40 +00001214 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001215 const char *zSep;
drha2baf3a2008-06-18 15:34:09 +00001216 int nVal, nSep, i;
1217 if( argc==0 || sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001218 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1219
1220 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001221 sqlite3 *db = sqlite3_context_db_handle(context);
drhade86482007-11-28 22:36:40 +00001222 pAccum->useMalloc = 1;
drhbb4957f2008-03-20 14:03:29 +00001223 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drhade86482007-11-28 22:36:40 +00001224 if( pAccum->nChar ){
drha2baf3a2008-06-18 15:34:09 +00001225 if( argc>1 ){
1226 zSep = (char*)sqlite3_value_text(argv[argc-1]);
1227 nSep = sqlite3_value_bytes(argv[argc-1]);
drhb0689692007-11-01 17:38:30 +00001228 }else{
1229 zSep = ",";
drhade86482007-11-28 22:36:40 +00001230 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001231 }
drhade86482007-11-28 22:36:40 +00001232 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001233 }
drha2baf3a2008-06-18 15:34:09 +00001234 i = 0;
1235 do{
1236 zVal = (char*)sqlite3_value_text(argv[i]);
1237 nVal = sqlite3_value_bytes(argv[i]);
1238 sqlite3StrAccumAppend(pAccum, zVal, nVal);
1239 i++;
1240 }while( i<argc-1 );
drhb0689692007-11-01 17:38:30 +00001241 }
1242}
1243static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001244 StrAccum *pAccum;
1245 pAccum = sqlite3_aggregate_context(context, 0);
1246 if( pAccum ){
1247 if( pAccum->tooBig ){
1248 sqlite3_result_error_toobig(context);
1249 }else if( pAccum->mallocFailed ){
1250 sqlite3_result_error_nomem(context);
1251 }else{
1252 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1253 sqlite3_free);
1254 }
drhb0689692007-11-01 17:38:30 +00001255 }
1256}
drh4e5ffc52004-08-31 00:52:37 +00001257
drhd3a149e2002-02-24 17:12:53 +00001258/*
drha2ed5602002-02-26 23:55:31 +00001259** This function registered all of the above C functions as SQL
1260** functions. This should be the only routine in this file with
1261** external linkage.
drhdc04c582002-02-24 01:55:15 +00001262*/
drh9bb575f2004-09-06 17:24:11 +00001263void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh1f01ec12005-02-15 21:36:18 +00001264#ifndef SQLITE_OMIT_ALTERTABLE
1265 sqlite3AlterFunctions(db);
1266#endif
danielk19771e536952007-08-16 10:09:01 +00001267 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001268 int rc = sqlite3_overload_function(db, "MATCH", 2);
1269 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1270 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001271 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001272 }
1273 }
danielk1977fd9e1f32005-05-22 10:44:34 +00001274#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001275 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001276#endif
drh55ef4d92005-08-14 01:20:37 +00001277}
1278
1279/*
1280** Set the LIKEOPT flag on the 2-argument function with the given name.
1281*/
drh1bd10f82008-12-10 21:19:56 +00001282static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
drh55ef4d92005-08-14 01:20:37 +00001283 FuncDef *pDef;
drhea678832008-12-10 19:26:22 +00001284 pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
1285 2, SQLITE_UTF8, 0);
drh55ef4d92005-08-14 01:20:37 +00001286 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001287 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001288 }
1289}
1290
1291/*
1292** Register the built-in LIKE and GLOB functions. The caseSensitive
1293** parameter determines whether or not the LIKE operator is case
1294** sensitive. GLOB is always case sensitive.
1295*/
1296void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1297 struct compareInfo *pInfo;
1298 if( caseSensitive ){
1299 pInfo = (struct compareInfo*)&likeInfoAlt;
1300 }else{
1301 pInfo = (struct compareInfo*)&likeInfoNorm;
1302 }
danielk1977771151b2006-01-17 13:21:40 +00001303 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1304 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1305 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001306 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001307 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1308 setLikeOptFlag(db, "like",
1309 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001310}
1311
1312/*
1313** pExpr points to an expression which implements a function. If
1314** it is appropriate to apply the LIKE optimization to that function
1315** then set aWc[0] through aWc[2] to the wildcard characters and
1316** return TRUE. If the function is not a LIKE-style function then
1317** return FALSE.
1318*/
drhd64fe2f2005-08-28 17:00:23 +00001319int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001320 FuncDef *pDef;
danielk1977cdbd8ef2007-05-12 06:11:12 +00001321 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
drh55ef4d92005-08-14 01:20:37 +00001322 return 0;
1323 }
1324 if( pExpr->pList->nExpr!=2 ){
1325 return 0;
1326 }
drh2646da72005-12-09 20:02:05 +00001327 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001328 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001329 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001330 return 0;
1331 }
1332
1333 /* The memcpy() statement assumes that the wildcard characters are
1334 ** the first three statements in the compareInfo structure. The
1335 ** asserts() that follow verify that assumption
1336 */
1337 memcpy(aWc, pDef->pUserData, 3);
1338 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1339 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1340 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001341 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001342 return 1;
drhdc04c582002-02-24 01:55:15 +00001343}
danielk19778c0a7912008-08-20 14:49:23 +00001344
drh70a8ca32008-08-21 18:49:27 +00001345/*
drh777c5382008-08-21 20:21:34 +00001346** All all of the FuncDef structures in the aBuiltinFunc[] array above
1347** to the global function hash table. This occurs at start-time (as
1348** a consequence of calling sqlite3_initialize()).
1349**
1350** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001351*/
1352void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001353 /*
1354 ** The following array holds FuncDef structures for all of the functions
1355 ** defined in this file.
1356 **
1357 ** The array cannot be constant since changes are made to the
1358 ** FuncDef.pHash elements at start-time. The elements of this array
1359 ** are read-only after initialization is complete.
1360 */
1361 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1362 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1363 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1364 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1365 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1366 FUNCTION(trim, 1, 3, 0, trimFunc ),
1367 FUNCTION(trim, 2, 3, 0, trimFunc ),
1368 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1369 FUNCTION(min, 0, 0, 1, 0 ),
1370 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1371 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1372 FUNCTION(max, 0, 1, 1, 0 ),
1373 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1374 FUNCTION(typeof, 1, 0, 0, typeofFunc ),
1375 FUNCTION(length, 1, 0, 0, lengthFunc ),
1376 FUNCTION(substr, 2, 0, 0, substrFunc ),
1377 FUNCTION(substr, 3, 0, 0, substrFunc ),
1378 FUNCTION(abs, 1, 0, 0, absFunc ),
1379 FUNCTION(round, 1, 0, 0, roundFunc ),
1380 FUNCTION(round, 2, 0, 0, roundFunc ),
1381 FUNCTION(upper, 1, 0, 0, upperFunc ),
1382 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1383 FUNCTION(coalesce, 1, 0, 0, 0 ),
1384 FUNCTION(coalesce, -1, 0, 0, ifnullFunc ),
1385 FUNCTION(coalesce, 0, 0, 0, 0 ),
1386 FUNCTION(hex, 1, 0, 0, hexFunc ),
1387 FUNCTION(ifnull, 2, 0, 1, ifnullFunc ),
drh9373b012009-02-02 01:50:39 +00001388 FUNCTION(random, 0, 0, 0, randomFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001389 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1390 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1391 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
1392 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1393 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1394 FUNCTION(changes, 0, 0, 0, changes ),
1395 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1396 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1397 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1398 #ifdef SQLITE_SOUNDEX
1399 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1400 #endif
1401 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1402 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1403 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1404 #endif
1405 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1406 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1407 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
1408 AGGREGATE(count, 0, 0, 0, countStep, countFinalize ),
1409 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
1410 AGGREGATE(group_concat, -1, 0, 0, groupConcatStep, groupConcatFinalize),
1411
1412 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1413 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1414 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1415 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1416 #else
1417 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1418 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1419 #endif
1420 };
1421
drh70a8ca32008-08-21 18:49:27 +00001422 int i;
danielk197793ce7412008-09-01 19:14:02 +00001423 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001424 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001425
drh70a8ca32008-08-21 18:49:27 +00001426 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001427 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001428 }
drh777c5382008-08-21 20:21:34 +00001429 sqlite3RegisterDateTimeFunctions();
drh70a8ca32008-08-21 18:49:27 +00001430}