blob: baedf178b3e1c66dae6e14a5a0c7e3788712309c [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**
drhef31c6a2009-04-02 09:07:12 +000019** $Id: func.c,v 1.227 2009/04/02 09:07:13 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*/
shanefbd60f82009-02-04 03:59:25 +0000246#ifndef SQLITE_OMIT_FLOATING_POINT
danielk19770ae8b832004-05-25 12:05:56 +0000247static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000248 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000249 double r;
drh592ac8c2005-08-13 03:07:47 +0000250 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000251 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000252 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000253 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000254 n = sqlite3_value_int(argv[1]);
255 if( n>30 ) n = 30;
256 if( n<0 ) n = 0;
257 }
drhd589a922006-03-02 03:02:48 +0000258 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000259 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000260 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000261 sqlite3AtoF(zBuf, &r);
262 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000263}
shanefbd60f82009-02-04 03:59:25 +0000264#endif
drhdc04c582002-02-24 01:55:15 +0000265
danielk197726783a52007-08-29 14:06:22 +0000266/*
267** Allocate nByte bytes of space using sqlite3_malloc(). If the
268** allocation fails, call sqlite3_result_error_nomem() to notify
269** the database handle that malloc() has failed.
270*/
drhb1a6c3c2008-03-20 16:30:17 +0000271static void *contextMalloc(sqlite3_context *context, i64 nByte){
drhbb4957f2008-03-20 14:03:29 +0000272 char *z;
drhef31c6a2009-04-02 09:07:12 +0000273 assert( nByte>0 );
drhbb4957f2008-03-20 14:03:29 +0000274 if( nByte>sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH] ){
275 sqlite3_result_error_toobig(context);
276 z = 0;
277 }else{
drh1bd10f82008-12-10 21:19:56 +0000278 z = sqlite3Malloc((int)nByte);
drhef31c6a2009-04-02 09:07:12 +0000279 if( !z ){
drhbb4957f2008-03-20 14:03:29 +0000280 sqlite3_result_error_nomem(context);
281 }
danielk1977a1644fd2007-08-29 12:31:25 +0000282 }
283 return z;
284}
285
drhdc04c582002-02-24 01:55:15 +0000286/*
287** Implementation of the upper() and lower() SQL functions.
288*/
danielk19770ae8b832004-05-25 12:05:56 +0000289static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000290 char *z1;
291 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000292 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000293 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000294 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000295 n = sqlite3_value_bytes(argv[0]);
296 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
297 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000298 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000299 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000300 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000301 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000302 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000303 z1[i] = (char)sqlite3Toupper(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000304 }
305 sqlite3_result_text(context, z1, -1, sqlite3_free);
306 }
drhdc04c582002-02-24 01:55:15 +0000307 }
308}
danielk19770ae8b832004-05-25 12:05:56 +0000309static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197778ca0e72009-01-20 16:53:39 +0000310 u8 *z1;
drh7a521cf2007-04-25 18:23:52 +0000311 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000312 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000313 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000314 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000315 n = sqlite3_value_bytes(argv[0]);
316 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
317 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000318 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000319 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000320 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000321 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000322 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000323 z1[i] = sqlite3Tolower(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000324 }
danielk197778ca0e72009-01-20 16:53:39 +0000325 sqlite3_result_text(context, (char *)z1, -1, sqlite3_free);
drh7a521cf2007-04-25 18:23:52 +0000326 }
drhdc04c582002-02-24 01:55:15 +0000327 }
328}
329
330/*
drhfbc99082002-02-28 03:14:18 +0000331** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000332** All three do the same thing. They return the first non-NULL
333** argument.
drh3212e182002-02-28 00:46:26 +0000334*/
drhf9b596e2004-05-26 16:54:42 +0000335static void ifnullFunc(
336 sqlite3_context *context,
337 int argc,
338 sqlite3_value **argv
339){
drhfbc99082002-02-28 03:14:18 +0000340 int i;
341 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000342 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000343 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000344 break;
345 }
346 }
drh3212e182002-02-28 00:46:26 +0000347}
348
349/*
drhf9ffac92002-03-02 19:00:31 +0000350** Implementation of random(). Return a random integer.
351*/
drhf9b596e2004-05-26 16:54:42 +0000352static void randomFunc(
353 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000354 int NotUsed,
355 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000356){
drh52fc8492006-02-23 21:43:55 +0000357 sqlite_int64 r;
danielk197762c14b32008-11-19 09:05:26 +0000358 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drh2fa18682008-03-19 14:15:34 +0000359 sqlite3_randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000360 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
361 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000362 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000363}
364
365/*
drh137c7282007-01-29 17:58:28 +0000366** Implementation of randomblob(N). Return a random blob
367** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000368*/
drh137c7282007-01-29 17:58:28 +0000369static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000370 sqlite3_context *context,
371 int argc,
372 sqlite3_value **argv
373){
drh137c7282007-01-29 17:58:28 +0000374 int n;
375 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000376 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000377 UNUSED_PARAMETER(argc);
drh63cf66f2007-01-29 15:50:05 +0000378 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000379 if( n<1 ){
380 n = 1;
381 }
danielk1977a1644fd2007-08-29 12:31:25 +0000382 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000383 if( p ){
drh2fa18682008-03-19 14:15:34 +0000384 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000385 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000386 }
drh63cf66f2007-01-29 15:50:05 +0000387}
388
389/*
drh6ed41ad2002-04-06 14:10:47 +0000390** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000391** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000392*/
danielk197751ad0ec2004-05-24 12:39:02 +0000393static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000394 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000395 int NotUsed,
396 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000397){
drhfa4a4b92008-03-19 21:45:51 +0000398 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000399 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf9b596e2004-05-26 16:54:42 +0000400 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000401}
402
rdcf146a772004-02-25 22:51:06 +0000403/*
danielk1977b28af712004-06-21 06:50:26 +0000404** Implementation of the changes() SQL function. The return value is the
405** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000406*/
danielk1977b28af712004-06-21 06:50:26 +0000407static void changes(
drhf9b596e2004-05-26 16:54:42 +0000408 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000409 int NotUsed,
410 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000411){
drhfa4a4b92008-03-19 21:45:51 +0000412 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000413 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf4479502004-05-27 03:12:53 +0000414 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000415}
rdcf146a772004-02-25 22:51:06 +0000416
417/*
danielk1977b28af712004-06-21 06:50:26 +0000418** Implementation of the total_changes() SQL function. The return value is
419** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000420*/
danielk1977b28af712004-06-21 06:50:26 +0000421static void total_changes(
422 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000423 int NotUsed,
424 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000425){
drhfa4a4b92008-03-19 21:45:51 +0000426 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000427 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977b28af712004-06-21 06:50:26 +0000428 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000429}
430
drh6ed41ad2002-04-06 14:10:47 +0000431/*
drh4e5ffc52004-08-31 00:52:37 +0000432** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000433*/
drh4e5ffc52004-08-31 00:52:37 +0000434struct compareInfo {
435 u8 matchAll;
436 u8 matchOne;
437 u8 matchSet;
438 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000439};
drh55ef4d92005-08-14 01:20:37 +0000440
drhb9175ae2007-12-07 18:39:04 +0000441/*
442** For LIKE and GLOB matching on EBCDIC machines, assume that every
443** character is exactly one byte in size. Also, all characters are
444** able to participate in upper-case-to-lower-case mappings in EBCDIC
445** whereas only characters less than 0x80 do in ASCII.
446*/
447#if defined(SQLITE_EBCDIC)
drh769e97e2009-04-01 16:33:37 +0000448# define sqlite3Utf8Read(A,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000449# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000450#else
drh6ed4b782007-12-10 18:07:20 +0000451# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000452#endif
453
drh4e5ffc52004-08-31 00:52:37 +0000454static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000455/* The correct SQL-92 behavior is for the LIKE operator to ignore
456** case. Thus 'a' LIKE 'A' would be true. */
457static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
458/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
459** is case sensitive causing 'a' LIKE 'A' to be false */
460static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000461
462/*
drh4e5ffc52004-08-31 00:52:37 +0000463** Compare two UTF-8 strings for equality where the first string can
464** potentially be a "glob" expression. Return true (1) if they
465** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000466**
drh4e5ffc52004-08-31 00:52:37 +0000467** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000468**
drh4e5ffc52004-08-31 00:52:37 +0000469** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000470**
drh4e5ffc52004-08-31 00:52:37 +0000471** '?' Matches exactly one character.
472**
473** [...] Matches one character from the enclosed list of
474** characters.
475**
476** [^...] Matches one character not in the enclosed list.
477**
478** With the [...] and [^...] matching, a ']' character can be included
479** in the list by making it the first character after '[' or '^'. A
480** range of characters can be specified using '-'. Example:
481** "[a-z]" matches any single lower-case letter. To match a '-', make
482** it the last character in the list.
483**
484** This routine is usually quick, but can be N**2 in the worst case.
485**
486** Hints: to match '*' or '?', put them in "[]". Like this:
487**
488** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000489*/
danielk19777c6303c2004-11-17 16:41:29 +0000490static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000491 const u8 *zPattern, /* The glob pattern */
492 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000493 const struct compareInfo *pInfo, /* Information about how to do the compare */
494 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000495){
drh66150952007-07-23 19:12:41 +0000496 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000497 int invert;
498 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000499 u8 matchOne = pInfo->matchOne;
500 u8 matchAll = pInfo->matchAll;
501 u8 matchSet = pInfo->matchSet;
502 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000503 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000504
drh769e97e2009-04-01 16:33:37 +0000505 while( (c = sqlite3Utf8Read(zPattern,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000506 if( !prevEscape && c==matchAll ){
drh769e97e2009-04-01 16:33:37 +0000507 while( (c=sqlite3Utf8Read(zPattern,&zPattern)) == matchAll
drh66150952007-07-23 19:12:41 +0000508 || c == matchOne ){
drh769e97e2009-04-01 16:33:37 +0000509 if( c==matchOne && sqlite3Utf8Read(zString, &zString)==0 ){
drh66150952007-07-23 19:12:41 +0000510 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000511 }
danielk1977ad7dd422004-06-06 12:41:49 +0000512 }
drh66150952007-07-23 19:12:41 +0000513 if( c==0 ){
514 return 1;
515 }else if( c==esc ){
drh769e97e2009-04-01 16:33:37 +0000516 c = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000517 if( c==0 ){
518 return 0;
519 }
520 }else if( c==matchSet ){
521 assert( esc==0 ); /* This is GLOB, not LIKE */
522 assert( matchSet<0x80 ); /* '[' is a single-byte character */
523 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000524 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000525 }
526 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000527 }
drh769e97e2009-04-01 16:33:37 +0000528 while( (c2 = sqlite3Utf8Read(zString,&zString))!=0 ){
drh66150952007-07-23 19:12:41 +0000529 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000530 GlogUpperToLower(c2);
531 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000532 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000533 c2 = sqlite3Utf8Read(zString, &zString);
drh6ed4b782007-12-10 18:07:20 +0000534 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000535 }
drh66150952007-07-23 19:12:41 +0000536 }else{
537 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000538 c2 = sqlite3Utf8Read(zString, &zString);
drh66150952007-07-23 19:12:41 +0000539 }
drh4e5ffc52004-08-31 00:52:37 +0000540 }
drh66150952007-07-23 19:12:41 +0000541 if( c2==0 ) return 0;
542 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
543 }
544 return 0;
545 }else if( !prevEscape && c==matchOne ){
drh769e97e2009-04-01 16:33:37 +0000546 if( sqlite3Utf8Read(zString, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000547 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000548 }
drh4e5ffc52004-08-31 00:52:37 +0000549 }else if( c==matchSet ){
550 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000551 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000552 seen = 0;
553 invert = 0;
drh769e97e2009-04-01 16:33:37 +0000554 c = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000555 if( c==0 ) return 0;
drh769e97e2009-04-01 16:33:37 +0000556 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000557 if( c2=='^' ){
558 invert = 1;
drh769e97e2009-04-01 16:33:37 +0000559 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000560 }
drh4e5ffc52004-08-31 00:52:37 +0000561 if( c2==']' ){
562 if( c==']' ) seen = 1;
drh769e97e2009-04-01 16:33:37 +0000563 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000564 }
drh66150952007-07-23 19:12:41 +0000565 while( c2 && c2!=']' ){
566 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
drh769e97e2009-04-01 16:33:37 +0000567 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000568 if( c>=prior_c && c<=c2 ) seen = 1;
569 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000570 }else{
drh66150952007-07-23 19:12:41 +0000571 if( c==c2 ){
572 seen = 1;
573 }
drh4e5ffc52004-08-31 00:52:37 +0000574 prior_c = c2;
575 }
drh769e97e2009-04-01 16:33:37 +0000576 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000577 }
drh66150952007-07-23 19:12:41 +0000578 if( c2==0 || (seen ^ invert)==0 ){
579 return 0;
580 }
581 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000582 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000583 }else{
drh769e97e2009-04-01 16:33:37 +0000584 c2 = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000585 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000586 GlogUpperToLower(c);
587 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000588 }
drh66150952007-07-23 19:12:41 +0000589 if( c!=c2 ){
590 return 0;
591 }
danielk19777c6303c2004-11-17 16:41:29 +0000592 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000593 }
danielk197751ad0ec2004-05-24 12:39:02 +0000594 }
drh4e5ffc52004-08-31 00:52:37 +0000595 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000596}
drh4e5ffc52004-08-31 00:52:37 +0000597
drh55ef4d92005-08-14 01:20:37 +0000598/*
599** Count the number of times that the LIKE operator (or GLOB which is
600** just a variation of LIKE) gets called. This is used for testing
601** only.
602*/
603#ifdef SQLITE_TEST
604int sqlite3_like_count = 0;
605#endif
606
danielk19773f6b0872004-06-17 05:36:44 +0000607
608/*
609** Implementation of the like() SQL function. This function implements
610** the build-in LIKE operator. The first argument to the function is the
611** pattern and the second argument is the string. So, the SQL statements:
612**
613** A LIKE B
614**
615** is implemented as like(B,A).
616**
drh55ef4d92005-08-14 01:20:37 +0000617** This same function (with a different compareInfo structure) computes
618** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000619*/
620static void likeFunc(
621 sqlite3_context *context,
622 int argc,
623 sqlite3_value **argv
624){
drhbeb818d2007-05-08 15:34:47 +0000625 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000626 int escape = 0;
drhbb4957f2008-03-20 14:03:29 +0000627 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000628
drh1f0feef2007-05-15 13:27:07 +0000629 zB = sqlite3_value_text(argv[0]);
630 zA = sqlite3_value_text(argv[1]);
631
drhbeb818d2007-05-08 15:34:47 +0000632 /* Limit the length of the LIKE or GLOB pattern to avoid problems
633 ** of deep recursion and N*N behavior in patternCompare().
634 */
drhbb4957f2008-03-20 14:03:29 +0000635 if( sqlite3_value_bytes(argv[0]) >
636 db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000637 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
638 return;
639 }
drh1f0feef2007-05-15 13:27:07 +0000640 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000641
danielk19777c6303c2004-11-17 16:41:29 +0000642 if( argc==3 ){
643 /* The escape character string must consist of a single UTF-8 character.
644 ** Otherwise, return an error.
645 */
646 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000647 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000648 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000649 sqlite3_result_error(context,
650 "ESCAPE expression must be a single character", -1);
651 return;
652 }
drh769e97e2009-04-01 16:33:37 +0000653 escape = sqlite3Utf8Read(zEsc, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000654 }
danielk19773f6b0872004-06-17 05:36:44 +0000655 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000656 struct compareInfo *pInfo = sqlite3_user_data(context);
657#ifdef SQLITE_TEST
658 sqlite3_like_count++;
659#endif
drhbeb818d2007-05-08 15:34:47 +0000660
danielk1977b56fe1f2007-05-09 08:24:44 +0000661 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000662 }
drh8912d102002-05-26 21:34:58 +0000663}
664
665/*
666** Implementation of the NULLIF(x,y) function. The result is the first
667** argument if the arguments are different. The result is NULL if the
668** arguments are equal to each other.
669*/
drhf9b596e2004-05-26 16:54:42 +0000670static void nullifFunc(
671 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000672 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +0000673 sqlite3_value **argv
674){
danielk1977dc1bdc42004-06-11 10:51:27 +0000675 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk197762c14b32008-11-19 09:05:26 +0000676 UNUSED_PARAMETER(NotUsed);
danielk1977dc1bdc42004-06-11 10:51:27 +0000677 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000678 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000679 }
drh0ac65892002-04-20 14:24:41 +0000680}
681
drh647cb0e2002-11-04 19:32:25 +0000682/*
683** Implementation of the VERSION(*) function. The result is the version
684** of the SQLite library that is running.
685*/
drhf9b596e2004-05-26 16:54:42 +0000686static void versionFunc(
687 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000688 int NotUsed,
689 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000690){
danielk197762c14b32008-11-19 09:05:26 +0000691 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977d8123362004-06-12 09:25:12 +0000692 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000693}
694
drh137c7282007-01-29 17:58:28 +0000695/* Array for converting from half-bytes (nybbles) into ASCII hex
696** digits. */
697static const char hexdigits[] = {
698 '0', '1', '2', '3', '4', '5', '6', '7',
699 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
700};
danielk1977d641d642004-11-18 15:44:29 +0000701
drh47394702003-08-20 01:03:33 +0000702/*
703** EXPERIMENTAL - This is not an official function. The interface may
704** change. This function may disappear. Do not write code that depends
705** on this function.
706**
707** Implementation of the QUOTE() function. This function takes a single
708** argument. If the argument is numeric, the return value is the same as
709** the argument. If the argument is NULL, the return value is the string
710** "NULL". Otherwise, the argument is enclosed in single quotes with
711** single-quote escapes.
712*/
danielk19770ae8b832004-05-25 12:05:56 +0000713static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drha0df4cc2009-02-02 17:29:59 +0000714 assert( argc==1 );
drh1d34fde2009-02-03 15:50:33 +0000715 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000716 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000717 case SQLITE_INTEGER:
718 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000719 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000720 break;
721 }
danielk19773f41e972004-06-08 00:39:01 +0000722 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000723 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000724 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000725 int nBlob = sqlite3_value_bytes(argv[0]);
726 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000727 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000728 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000729 int i;
730 for(i=0; i<nBlob; i++){
731 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
732 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
733 }
734 zText[(nBlob*2)+2] = '\'';
735 zText[(nBlob*2)+3] = '\0';
736 zText[0] = 'X';
737 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000738 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000739 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000740 }
741 break;
742 }
drh9c054832004-05-31 18:51:57 +0000743 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000744 int i,j;
745 u64 n;
drh2646da72005-12-09 20:02:05 +0000746 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000747 char *z;
748
drh7a521cf2007-04-25 18:23:52 +0000749 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000750 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000751 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000752 if( z ){
753 z[0] = '\'';
754 for(i=0, j=1; zArg[i]; i++){
755 z[j++] = zArg[i];
756 if( zArg[i]=='\'' ){
757 z[j++] = '\'';
758 }
drhf9b596e2004-05-26 16:54:42 +0000759 }
danielk1977a1644fd2007-08-29 12:31:25 +0000760 z[j++] = '\'';
761 z[j] = 0;
762 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000763 }
drha0df4cc2009-02-02 17:29:59 +0000764 break;
765 }
766 default: {
767 assert( sqlite3_value_type(argv[0])==SQLITE_NULL );
768 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
769 break;
drhf9b596e2004-05-26 16:54:42 +0000770 }
drh47394702003-08-20 01:03:33 +0000771 }
772}
773
drh137c7282007-01-29 17:58:28 +0000774/*
775** The hex() function. Interpret the argument as a blob. Return
776** a hexadecimal rendering as text.
777*/
778static void hexFunc(
779 sqlite3_context *context,
780 int argc,
781 sqlite3_value **argv
782){
783 int i, n;
784 const unsigned char *pBlob;
785 char *zHex, *z;
786 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000787 UNUSED_PARAMETER(argc);
drh1f0feef2007-05-15 13:27:07 +0000788 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000789 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000790 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000791 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000792 if( zHex ){
793 for(i=0; i<n; i++, pBlob++){
794 unsigned char c = *pBlob;
795 *(z++) = hexdigits[(c>>4)&0xf];
796 *(z++) = hexdigits[c&0xf];
797 }
798 *z = 0;
799 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000800 }
drh137c7282007-01-29 17:58:28 +0000801}
802
drh26b6d902007-03-17 13:27:54 +0000803/*
drh8cff3822007-05-02 02:08:28 +0000804** The zeroblob(N) function returns a zero-filled blob of size N bytes.
805*/
806static void zeroblobFunc(
807 sqlite3_context *context,
808 int argc,
809 sqlite3_value **argv
810){
drh98640a32007-06-07 19:08:32 +0000811 i64 n;
drh8cff3822007-05-02 02:08:28 +0000812 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000813 UNUSED_PARAMETER(argc);
drh98640a32007-06-07 19:08:32 +0000814 n = sqlite3_value_int64(argv[0]);
drhef31c6a2009-04-02 09:07:12 +0000815 if( n>sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH] ){
drh98640a32007-06-07 19:08:32 +0000816 sqlite3_result_error_toobig(context);
817 }else{
drh1bd10f82008-12-10 21:19:56 +0000818 sqlite3_result_zeroblob(context, (int)n);
drh98640a32007-06-07 19:08:32 +0000819 }
drh8cff3822007-05-02 02:08:28 +0000820}
821
822/*
drh26b6d902007-03-17 13:27:54 +0000823** The replace() function. Three arguments are all strings: call
824** them A, B, and C. The result is also a string which is derived
825** from A by replacing every occurance of B with C. The match
826** must be exact. Collating sequences are not used.
827*/
828static void replaceFunc(
829 sqlite3_context *context,
830 int argc,
831 sqlite3_value **argv
832){
833 const unsigned char *zStr; /* The input string A */
834 const unsigned char *zPattern; /* The pattern string B */
835 const unsigned char *zRep; /* The replacement string C */
836 unsigned char *zOut; /* The output */
837 int nStr; /* Size of zStr */
838 int nPattern; /* Size of zPattern */
839 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000840 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000841 int loopLimit; /* Last zStr[] that might match zPattern[] */
842 int i, j; /* Loop counters */
843
844 assert( argc==3 );
danielk1977f3d3c272008-11-19 16:52:44 +0000845 UNUSED_PARAMETER(argc);
drh26b6d902007-03-17 13:27:54 +0000846 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000847 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000848 nStr = sqlite3_value_bytes(argv[0]);
849 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000850 zPattern = sqlite3_value_text(argv[1]);
drha605fe82009-02-01 18:08:40 +0000851 if( zPattern==0 ){
drh23336062009-02-03 13:19:12 +0000852 assert( sqlite3_value_type(argv[1])==SQLITE_NULL
853 || sqlite3_context_db_handle(context)->mallocFailed );
drha605fe82009-02-01 18:08:40 +0000854 return;
855 }
856 if( zPattern[0]==0 ){
857 assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
858 sqlite3_result_value(context, argv[0]);
859 return;
860 }
drh1f0feef2007-05-15 13:27:07 +0000861 nPattern = sqlite3_value_bytes(argv[1]);
862 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000863 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000864 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000865 nRep = sqlite3_value_bytes(argv[2]);
866 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000867 nOut = nStr + 1;
868 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +0000869 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +0000870 if( zOut==0 ){
871 return;
drh26b6d902007-03-17 13:27:54 +0000872 }
drh26b6d902007-03-17 13:27:54 +0000873 loopLimit = nStr - nPattern;
874 for(i=j=0; i<=loopLimit; i++){
875 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
876 zOut[j++] = zStr[i];
877 }else{
drh4a50aac2007-08-23 02:47:53 +0000878 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +0000879 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +0000880 nOut += nRep - nPattern;
drhbb4957f2008-03-20 14:03:29 +0000881 if( nOut>=db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +0000882 sqlite3_result_error_toobig(context);
drh633e6d52008-07-28 19:34:53 +0000883 sqlite3DbFree(db, zOut);
danielk197717374e82007-05-08 14:39:04 +0000884 return;
885 }
drh4a50aac2007-08-23 02:47:53 +0000886 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000887 zOut = sqlite3_realloc(zOut, (int)nOut);
888 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000889 sqlite3_result_error_nomem(context);
drh633e6d52008-07-28 19:34:53 +0000890 sqlite3DbFree(db, zOld);
drh2e6400b2007-05-08 15:46:18 +0000891 return;
892 }
drh26b6d902007-03-17 13:27:54 +0000893 memcpy(&zOut[j], zRep, nRep);
894 j += nRep;
895 i += nPattern-1;
896 }
897 }
drh2e6400b2007-05-08 15:46:18 +0000898 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000899 memcpy(&zOut[j], &zStr[i], nStr-i);
900 j += nStr - i;
901 assert( j<=nOut );
902 zOut[j] = 0;
903 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
904}
905
drh309b3382007-03-17 17:52:42 +0000906/*
907** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
908** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
909*/
910static void trimFunc(
911 sqlite3_context *context,
912 int argc,
913 sqlite3_value **argv
914){
915 const unsigned char *zIn; /* Input string */
916 const unsigned char *zCharSet; /* Set of characters to trim */
917 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +0000918 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +0000919 int i; /* Loop counter */
drh1bd10f82008-12-10 21:19:56 +0000920 unsigned char *aLen = 0; /* Length of each character in zCharSet */
921 unsigned char **azChar = 0; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000922 int nChar; /* Number of characters in zCharSet */
923
drh309b3382007-03-17 17:52:42 +0000924 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
925 return;
926 }
927 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000928 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000929 nIn = sqlite3_value_bytes(argv[0]);
930 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000931 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000932 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +0000933 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000934 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000935 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +0000936 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +0000937 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000938 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000939 return;
drhd1e3a612007-04-27 21:59:52 +0000940 }else{
941 const unsigned char *z;
942 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000943 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000944 }
945 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +0000946 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +0000947 if( azChar==0 ){
948 return;
949 }
950 aLen = (unsigned char*)&azChar[nChar];
951 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +0000952 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +0000953 SQLITE_SKIP_UTF8(z);
drh3abbd392008-12-10 23:04:13 +0000954 aLen[nChar] = (u8)(z - azChar[nChar]);
drhd1e3a612007-04-27 21:59:52 +0000955 }
956 }
drh309b3382007-03-17 17:52:42 +0000957 }
drhd1e3a612007-04-27 21:59:52 +0000958 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +0000959 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +0000960 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000961 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +0000962 int len = 0;
drhd1e3a612007-04-27 21:59:52 +0000963 for(i=0; i<nChar; i++){
964 len = aLen[i];
965 if( memcmp(zIn, azChar[i], len)==0 ) break;
966 }
967 if( i>=nChar ) break;
968 zIn += len;
969 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000970 }
971 }
972 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000973 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +0000974 int len = 0;
drhd1e3a612007-04-27 21:59:52 +0000975 for(i=0; i<nChar; i++){
976 len = aLen[i];
977 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
978 }
979 if( i>=nChar ) break;
980 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000981 }
982 }
drhd1e3a612007-04-27 21:59:52 +0000983 if( zCharSet ){
984 sqlite3_free(azChar);
985 }
drh309b3382007-03-17 17:52:42 +0000986 }
987 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
988}
drh26b6d902007-03-17 13:27:54 +0000989
danielk1977a4de4532008-09-02 15:44:08 +0000990
drhd24cc422003-03-27 12:51:24 +0000991#ifdef SQLITE_SOUNDEX
992/*
993** Compute the soundex encoding of a word.
994*/
drh137c7282007-01-29 17:58:28 +0000995static void soundexFunc(
996 sqlite3_context *context,
997 int argc,
998 sqlite3_value **argv
999){
drhd24cc422003-03-27 12:51:24 +00001000 char zResult[8];
drh4c755c02004-08-08 20:22:17 +00001001 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +00001002 int i, j;
1003 static const unsigned char iCode[] = {
1004 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1005 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1006 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1007 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1008 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1009 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1010 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1011 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1012 };
1013 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +00001014 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +00001015 if( zIn==0 ) zIn = (u8*)"";
drhdc86e2b2009-01-24 11:30:42 +00001016 for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
drhd24cc422003-03-27 12:51:24 +00001017 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +00001018 u8 prevcode = iCode[zIn[i]&0x7f];
danielk197778ca0e72009-01-20 16:53:39 +00001019 zResult[0] = sqlite3Toupper(zIn[i]);
drhd24cc422003-03-27 12:51:24 +00001020 for(j=1; j<4 && zIn[i]; i++){
1021 int code = iCode[zIn[i]&0x7f];
1022 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +00001023 if( code!=prevcode ){
1024 prevcode = code;
1025 zResult[j++] = code + '0';
1026 }
1027 }else{
1028 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +00001029 }
1030 }
1031 while( j<4 ){
1032 zResult[j++] = '0';
1033 }
1034 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001035 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +00001036 }else{
danielk1977d8123362004-06-12 09:25:12 +00001037 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +00001038 }
1039}
1040#endif
1041
drhfdb83b22006-06-17 14:12:47 +00001042#ifndef SQLITE_OMIT_LOAD_EXTENSION
1043/*
1044** A function that loads a shared-library extension then returns NULL.
1045*/
1046static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001047 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001048 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001049 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001050 char *zErrMsg = 0;
1051
1052 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001053 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001054 }else{
1055 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001056 }
drh7a521cf2007-04-25 18:23:52 +00001057 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001058 sqlite3_result_error(context, zErrMsg, -1);
1059 sqlite3_free(zErrMsg);
1060 }
1061}
1062#endif
1063
danielk197701427a62005-01-11 13:02:33 +00001064
drh0ac65892002-04-20 14:24:41 +00001065/*
drhd3a149e2002-02-24 17:12:53 +00001066** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001067** sum() or avg() aggregate computation.
1068*/
1069typedef struct SumCtx SumCtx;
1070struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001071 double rSum; /* Floating point sum */
1072 i64 iSum; /* Integer sum */
1073 i64 cnt; /* Number of elements summed */
1074 u8 overflow; /* True if integer overflow seen */
1075 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001076};
1077
1078/*
drha97fdd32006-01-12 22:17:50 +00001079** Routines used to compute the sum, average, and total.
1080**
1081** The SUM() function follows the (broken) SQL standard which means
1082** that it returns NULL if it sums over no inputs. TOTAL returns
1083** 0.0 in that case. In addition, TOTAL always returns a float where
1084** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001085** value. TOTAL never fails, but SUM might through an exception if
1086** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001087*/
danielk19770ae8b832004-05-25 12:05:56 +00001088static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001089 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001090 int type;
drh3f219f42005-09-08 19:45:57 +00001091 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001092 UNUSED_PARAMETER(argc);
drh4f26d6c2004-05-26 23:25:30 +00001093 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001094 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001095 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001096 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001097 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001098 i64 v = sqlite3_value_int64(argv[0]);
1099 p->rSum += v;
1100 if( (p->approx|p->overflow)==0 ){
1101 i64 iNewSum = p->iSum + v;
drh1bd10f82008-12-10 21:19:56 +00001102 int s1 = (int)(p->iSum >> (sizeof(i64)*8-1));
1103 int s2 = (int)(v >> (sizeof(i64)*8-1));
1104 int s3 = (int)(iNewSum >> (sizeof(i64)*8-1));
1105 p->overflow = ((s1&s2&~s3) | (~s1&~s2&s3))?1:0;
drh8c08e862006-02-11 17:34:00 +00001106 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001107 }
1108 }else{
drh8c08e862006-02-11 17:34:00 +00001109 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001110 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001111 }
drh739105c2002-05-29 23:22:23 +00001112 }
drhdd5baa92002-02-27 19:50:59 +00001113}
danielk19770ae8b832004-05-25 12:05:56 +00001114static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001115 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001116 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001117 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001118 if( p->overflow ){
1119 sqlite3_result_error(context,"integer overflow",-1);
1120 }else if( p->approx ){
1121 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001122 }else{
drh8c08e862006-02-11 17:34:00 +00001123 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001124 }
drh3d1d95e2005-09-08 10:37:01 +00001125 }
drhdd5baa92002-02-27 19:50:59 +00001126}
danielk19770ae8b832004-05-25 12:05:56 +00001127static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001128 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001129 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001130 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001131 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001132 }
1133}
drha97fdd32006-01-12 22:17:50 +00001134static void totalFinalize(sqlite3_context *context){
1135 SumCtx *p;
1136 p = sqlite3_aggregate_context(context, 0);
shanefbd60f82009-02-04 03:59:25 +00001137 /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
1138 sqlite3_result_double(context, p ? p->rSum : (double)0);
drha97fdd32006-01-12 22:17:50 +00001139}
drhdd5baa92002-02-27 19:50:59 +00001140
1141/*
drh0bce8352002-02-28 00:41:10 +00001142** The following structure keeps track of state information for the
1143** count() aggregate function.
1144*/
1145typedef struct CountCtx CountCtx;
1146struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001147 i64 n;
drh0bce8352002-02-28 00:41:10 +00001148};
drhdd5baa92002-02-27 19:50:59 +00001149
drh0bce8352002-02-28 00:41:10 +00001150/*
1151** Routines to implement the count() aggregate function.
1152*/
danielk19770ae8b832004-05-25 12:05:56 +00001153static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001154 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001155 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001156 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001157 p->n++;
1158 }
1159}
danielk19770ae8b832004-05-25 12:05:56 +00001160static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001161 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001162 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001163 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001164}
1165
1166/*
drh0bce8352002-02-28 00:41:10 +00001167** Routines to implement min() and max() aggregate functions.
1168*/
danielk197762c14b32008-11-19 09:05:26 +00001169static void minmaxStep(
1170 sqlite3_context *context,
1171 int NotUsed,
1172 sqlite3_value **argv
1173){
danielk197788208052004-05-25 01:13:20 +00001174 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001175 Mem *pBest;
danielk197762c14b32008-11-19 09:05:26 +00001176 UNUSED_PARAMETER(NotUsed);
drh9eb516c2004-07-18 20:52:32 +00001177
1178 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1179 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001180 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001181
danielk197788208052004-05-25 01:13:20 +00001182 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001183 int max;
1184 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001185 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001186 /* This step function is used for both the min() and max() aggregates,
1187 ** the only difference between the two being that the sense of the
1188 ** comparison is inverted. For the max() aggregate, the
1189 ** sqlite3_user_data() function returns (void *)-1. For min() it
1190 ** returns (void *)db, where db is the sqlite3* database pointer.
1191 ** Therefore the next statement sets variable 'max' to 1 for the max()
1192 ** aggregate, or 0 for min().
1193 */
drh309b3382007-03-17 17:52:42 +00001194 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001195 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001196 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001197 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001198 }
drh268380c2004-02-25 13:47:31 +00001199 }else{
drhb21c8cd2007-08-21 19:33:56 +00001200 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001201 }
1202}
danielk19770ae8b832004-05-25 12:05:56 +00001203static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001204 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001205 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1206 if( pRes ){
1207 if( pRes->flags ){
1208 sqlite3_result_value(context, pRes);
1209 }
1210 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001211 }
1212}
drhdd5baa92002-02-27 19:50:59 +00001213
drhb0689692007-11-01 17:38:30 +00001214/*
1215** group_concat(EXPR, ?SEPARATOR?)
1216*/
1217static void groupConcatStep(
1218 sqlite3_context *context,
1219 int argc,
1220 sqlite3_value **argv
1221){
1222 const char *zVal;
drhade86482007-11-28 22:36:40 +00001223 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001224 const char *zSep;
drh07d31172009-02-02 21:57:05 +00001225 int nVal, nSep;
1226 assert( argc==1 || argc==2 );
1227 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001228 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1229
1230 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001231 sqlite3 *db = sqlite3_context_db_handle(context);
drhade86482007-11-28 22:36:40 +00001232 pAccum->useMalloc = 1;
drhbb4957f2008-03-20 14:03:29 +00001233 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drhade86482007-11-28 22:36:40 +00001234 if( pAccum->nChar ){
drh07d31172009-02-02 21:57:05 +00001235 if( argc==2 ){
1236 zSep = (char*)sqlite3_value_text(argv[1]);
1237 nSep = sqlite3_value_bytes(argv[1]);
drhb0689692007-11-01 17:38:30 +00001238 }else{
1239 zSep = ",";
drhade86482007-11-28 22:36:40 +00001240 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001241 }
drhade86482007-11-28 22:36:40 +00001242 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001243 }
drh07d31172009-02-02 21:57:05 +00001244 zVal = (char*)sqlite3_value_text(argv[0]);
1245 nVal = sqlite3_value_bytes(argv[0]);
1246 sqlite3StrAccumAppend(pAccum, zVal, nVal);
drhb0689692007-11-01 17:38:30 +00001247 }
1248}
1249static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001250 StrAccum *pAccum;
1251 pAccum = sqlite3_aggregate_context(context, 0);
1252 if( pAccum ){
1253 if( pAccum->tooBig ){
1254 sqlite3_result_error_toobig(context);
1255 }else if( pAccum->mallocFailed ){
1256 sqlite3_result_error_nomem(context);
1257 }else{
1258 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1259 sqlite3_free);
1260 }
drhb0689692007-11-01 17:38:30 +00001261 }
1262}
drh4e5ffc52004-08-31 00:52:37 +00001263
drhd3a149e2002-02-24 17:12:53 +00001264/*
drha2ed5602002-02-26 23:55:31 +00001265** This function registered all of the above C functions as SQL
1266** functions. This should be the only routine in this file with
1267** external linkage.
drhdc04c582002-02-24 01:55:15 +00001268*/
drh9bb575f2004-09-06 17:24:11 +00001269void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh1f01ec12005-02-15 21:36:18 +00001270#ifndef SQLITE_OMIT_ALTERTABLE
1271 sqlite3AlterFunctions(db);
1272#endif
danielk19771e536952007-08-16 10:09:01 +00001273 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001274 int rc = sqlite3_overload_function(db, "MATCH", 2);
1275 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1276 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001277 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001278 }
1279 }
danielk1977fd9e1f32005-05-22 10:44:34 +00001280#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001281 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001282#endif
drh55ef4d92005-08-14 01:20:37 +00001283}
1284
1285/*
1286** Set the LIKEOPT flag on the 2-argument function with the given name.
1287*/
drh1bd10f82008-12-10 21:19:56 +00001288static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
drh55ef4d92005-08-14 01:20:37 +00001289 FuncDef *pDef;
drhea678832008-12-10 19:26:22 +00001290 pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
1291 2, SQLITE_UTF8, 0);
drh55ef4d92005-08-14 01:20:37 +00001292 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001293 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001294 }
1295}
1296
1297/*
1298** Register the built-in LIKE and GLOB functions. The caseSensitive
1299** parameter determines whether or not the LIKE operator is case
1300** sensitive. GLOB is always case sensitive.
1301*/
1302void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1303 struct compareInfo *pInfo;
1304 if( caseSensitive ){
1305 pInfo = (struct compareInfo*)&likeInfoAlt;
1306 }else{
1307 pInfo = (struct compareInfo*)&likeInfoNorm;
1308 }
danielk1977717811c2009-03-27 15:26:03 +00001309 sqlite3CreateFunc(db, "like", 2, SQLITE_ANY, pInfo, likeFunc, 0, 0);
1310 sqlite3CreateFunc(db, "like", 3, SQLITE_ANY, pInfo, likeFunc, 0, 0);
1311 sqlite3CreateFunc(db, "glob", 2, SQLITE_ANY,
drh55ef4d92005-08-14 01:20:37 +00001312 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001313 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1314 setLikeOptFlag(db, "like",
1315 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001316}
1317
1318/*
1319** pExpr points to an expression which implements a function. If
1320** it is appropriate to apply the LIKE optimization to that function
1321** then set aWc[0] through aWc[2] to the wildcard characters and
1322** return TRUE. If the function is not a LIKE-style function then
1323** return FALSE.
1324*/
drhd64fe2f2005-08-28 17:00:23 +00001325int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001326 FuncDef *pDef;
danielk19776ab3a2e2009-02-19 14:39:25 +00001327 if( pExpr->op!=TK_FUNCTION
1328 || !pExpr->x.pList
1329 || pExpr->x.pList->nExpr!=2
1330 ){
drh55ef4d92005-08-14 01:20:37 +00001331 return 0;
1332 }
danielk19776ab3a2e2009-02-19 14:39:25 +00001333 assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
drh2646da72005-12-09 20:02:05 +00001334 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001335 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001336 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001337 return 0;
1338 }
1339
1340 /* The memcpy() statement assumes that the wildcard characters are
1341 ** the first three statements in the compareInfo structure. The
1342 ** asserts() that follow verify that assumption
1343 */
1344 memcpy(aWc, pDef->pUserData, 3);
1345 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1346 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1347 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001348 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001349 return 1;
drhdc04c582002-02-24 01:55:15 +00001350}
danielk19778c0a7912008-08-20 14:49:23 +00001351
drh70a8ca32008-08-21 18:49:27 +00001352/*
drh777c5382008-08-21 20:21:34 +00001353** All all of the FuncDef structures in the aBuiltinFunc[] array above
1354** to the global function hash table. This occurs at start-time (as
1355** a consequence of calling sqlite3_initialize()).
1356**
1357** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001358*/
1359void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001360 /*
1361 ** The following array holds FuncDef structures for all of the functions
1362 ** defined in this file.
1363 **
1364 ** The array cannot be constant since changes are made to the
1365 ** FuncDef.pHash elements at start-time. The elements of this array
1366 ** are read-only after initialization is complete.
1367 */
1368 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1369 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1370 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1371 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1372 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1373 FUNCTION(trim, 1, 3, 0, trimFunc ),
1374 FUNCTION(trim, 2, 3, 0, trimFunc ),
1375 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1376 FUNCTION(min, 0, 0, 1, 0 ),
1377 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1378 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1379 FUNCTION(max, 0, 1, 1, 0 ),
1380 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1381 FUNCTION(typeof, 1, 0, 0, typeofFunc ),
1382 FUNCTION(length, 1, 0, 0, lengthFunc ),
1383 FUNCTION(substr, 2, 0, 0, substrFunc ),
1384 FUNCTION(substr, 3, 0, 0, substrFunc ),
1385 FUNCTION(abs, 1, 0, 0, absFunc ),
shanefbd60f82009-02-04 03:59:25 +00001386#ifndef SQLITE_OMIT_FLOATING_POINT
danielk197793ce7412008-09-01 19:14:02 +00001387 FUNCTION(round, 1, 0, 0, roundFunc ),
1388 FUNCTION(round, 2, 0, 0, roundFunc ),
shanefbd60f82009-02-04 03:59:25 +00001389#endif
danielk197793ce7412008-09-01 19:14:02 +00001390 FUNCTION(upper, 1, 0, 0, upperFunc ),
1391 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1392 FUNCTION(coalesce, 1, 0, 0, 0 ),
1393 FUNCTION(coalesce, -1, 0, 0, ifnullFunc ),
1394 FUNCTION(coalesce, 0, 0, 0, 0 ),
1395 FUNCTION(hex, 1, 0, 0, hexFunc ),
1396 FUNCTION(ifnull, 2, 0, 1, ifnullFunc ),
drh9373b012009-02-02 01:50:39 +00001397 FUNCTION(random, 0, 0, 0, randomFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001398 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1399 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1400 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
1401 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1402 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1403 FUNCTION(changes, 0, 0, 0, changes ),
1404 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1405 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1406 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1407 #ifdef SQLITE_SOUNDEX
1408 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1409 #endif
1410 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1411 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1412 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1413 #endif
1414 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1415 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1416 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
danielk1977a5533162009-02-24 10:01:51 +00001417 /* AGGREGATE(count, 0, 0, 0, countStep, countFinalize ), */
1418 {0,SQLITE_UTF8,SQLITE_FUNC_COUNT,0,0,0,countStep,countFinalize,"count",0},
danielk197793ce7412008-09-01 19:14:02 +00001419 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
drh07d31172009-02-02 21:57:05 +00001420 AGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize),
1421 AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize),
danielk197793ce7412008-09-01 19:14:02 +00001422
1423 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1424 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1425 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1426 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1427 #else
1428 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1429 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1430 #endif
1431 };
1432
drh70a8ca32008-08-21 18:49:27 +00001433 int i;
danielk197793ce7412008-09-01 19:14:02 +00001434 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001435 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001436
drh70a8ca32008-08-21 18:49:27 +00001437 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001438 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001439 }
drh777c5382008-08-21 20:21:34 +00001440 sqlite3RegisterDateTimeFunctions();
drh70a8ca32008-08-21 18:49:27 +00001441}