blob: 537d35be18b542ce96b0598d17dc4579ac641f61 [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**
drhd27135a2009-04-02 13:36:37 +000019** $Id: func.c,v 1.229 2009/04/02 13:36:37 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
drh27e62db2009-04-02 10:16:17 +0000269** the database handle that malloc() has failed and return NULL.
270** If nByte is larger than the maximum string or blob length, then
271** raise an SQLITE_TOOBIG exception and return NULL.
danielk197726783a52007-08-29 14:06:22 +0000272*/
drhb1a6c3c2008-03-20 16:30:17 +0000273static void *contextMalloc(sqlite3_context *context, i64 nByte){
drhbb4957f2008-03-20 14:03:29 +0000274 char *z;
drh27e62db2009-04-02 10:16:17 +0000275 sqlite3 *db = sqlite3_context_db_handle(context);
drhef31c6a2009-04-02 09:07:12 +0000276 assert( nByte>0 );
drh27e62db2009-04-02 10:16:17 +0000277 testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] );
278 testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
279 if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drhbb4957f2008-03-20 14:03:29 +0000280 sqlite3_result_error_toobig(context);
281 z = 0;
282 }else{
drh1bd10f82008-12-10 21:19:56 +0000283 z = sqlite3Malloc((int)nByte);
drhef31c6a2009-04-02 09:07:12 +0000284 if( !z ){
drhbb4957f2008-03-20 14:03:29 +0000285 sqlite3_result_error_nomem(context);
286 }
danielk1977a1644fd2007-08-29 12:31:25 +0000287 }
288 return z;
289}
290
drhdc04c582002-02-24 01:55:15 +0000291/*
292** Implementation of the upper() and lower() SQL functions.
293*/
danielk19770ae8b832004-05-25 12:05:56 +0000294static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000295 char *z1;
296 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000297 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000298 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000299 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000300 n = sqlite3_value_bytes(argv[0]);
301 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
302 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000303 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000304 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000305 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000306 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000307 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000308 z1[i] = (char)sqlite3Toupper(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000309 }
310 sqlite3_result_text(context, z1, -1, sqlite3_free);
311 }
drhdc04c582002-02-24 01:55:15 +0000312 }
313}
danielk19770ae8b832004-05-25 12:05:56 +0000314static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197778ca0e72009-01-20 16:53:39 +0000315 u8 *z1;
drh7a521cf2007-04-25 18:23:52 +0000316 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000317 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000318 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000319 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000320 n = sqlite3_value_bytes(argv[0]);
321 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
322 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000323 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000324 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000325 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000326 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000327 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000328 z1[i] = sqlite3Tolower(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000329 }
danielk197778ca0e72009-01-20 16:53:39 +0000330 sqlite3_result_text(context, (char *)z1, -1, sqlite3_free);
drh7a521cf2007-04-25 18:23:52 +0000331 }
drhdc04c582002-02-24 01:55:15 +0000332 }
333}
334
335/*
drhfbc99082002-02-28 03:14:18 +0000336** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000337** All three do the same thing. They return the first non-NULL
338** argument.
drh3212e182002-02-28 00:46:26 +0000339*/
drhf9b596e2004-05-26 16:54:42 +0000340static void ifnullFunc(
341 sqlite3_context *context,
342 int argc,
343 sqlite3_value **argv
344){
drhfbc99082002-02-28 03:14:18 +0000345 int i;
346 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000347 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000348 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000349 break;
350 }
351 }
drh3212e182002-02-28 00:46:26 +0000352}
353
354/*
drhf9ffac92002-03-02 19:00:31 +0000355** Implementation of random(). Return a random integer.
356*/
drhf9b596e2004-05-26 16:54:42 +0000357static void randomFunc(
358 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000359 int NotUsed,
360 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000361){
drh52fc8492006-02-23 21:43:55 +0000362 sqlite_int64 r;
danielk197762c14b32008-11-19 09:05:26 +0000363 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drh2fa18682008-03-19 14:15:34 +0000364 sqlite3_randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000365 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
366 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000367 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000368}
369
370/*
drh137c7282007-01-29 17:58:28 +0000371** Implementation of randomblob(N). Return a random blob
372** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000373*/
drh137c7282007-01-29 17:58:28 +0000374static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000375 sqlite3_context *context,
376 int argc,
377 sqlite3_value **argv
378){
drh137c7282007-01-29 17:58:28 +0000379 int n;
380 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000381 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000382 UNUSED_PARAMETER(argc);
drh63cf66f2007-01-29 15:50:05 +0000383 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000384 if( n<1 ){
385 n = 1;
386 }
danielk1977a1644fd2007-08-29 12:31:25 +0000387 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000388 if( p ){
drh2fa18682008-03-19 14:15:34 +0000389 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000390 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000391 }
drh63cf66f2007-01-29 15:50:05 +0000392}
393
394/*
drh6ed41ad2002-04-06 14:10:47 +0000395** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000396** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000397*/
danielk197751ad0ec2004-05-24 12:39:02 +0000398static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000399 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000400 int NotUsed,
401 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000402){
drhfa4a4b92008-03-19 21:45:51 +0000403 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000404 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf9b596e2004-05-26 16:54:42 +0000405 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000406}
407
rdcf146a772004-02-25 22:51:06 +0000408/*
danielk1977b28af712004-06-21 06:50:26 +0000409** Implementation of the changes() SQL function. The return value is the
410** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000411*/
danielk1977b28af712004-06-21 06:50:26 +0000412static void changes(
drhf9b596e2004-05-26 16:54:42 +0000413 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000414 int NotUsed,
415 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000416){
drhfa4a4b92008-03-19 21:45:51 +0000417 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000418 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf4479502004-05-27 03:12:53 +0000419 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000420}
rdcf146a772004-02-25 22:51:06 +0000421
422/*
danielk1977b28af712004-06-21 06:50:26 +0000423** Implementation of the total_changes() SQL function. The return value is
424** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000425*/
danielk1977b28af712004-06-21 06:50:26 +0000426static void total_changes(
427 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000428 int NotUsed,
429 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000430){
drhfa4a4b92008-03-19 21:45:51 +0000431 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000432 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977b28af712004-06-21 06:50:26 +0000433 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000434}
435
drh6ed41ad2002-04-06 14:10:47 +0000436/*
drh4e5ffc52004-08-31 00:52:37 +0000437** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000438*/
drh4e5ffc52004-08-31 00:52:37 +0000439struct compareInfo {
440 u8 matchAll;
441 u8 matchOne;
442 u8 matchSet;
443 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000444};
drh55ef4d92005-08-14 01:20:37 +0000445
drhb9175ae2007-12-07 18:39:04 +0000446/*
447** For LIKE and GLOB matching on EBCDIC machines, assume that every
448** character is exactly one byte in size. Also, all characters are
449** able to participate in upper-case-to-lower-case mappings in EBCDIC
450** whereas only characters less than 0x80 do in ASCII.
451*/
452#if defined(SQLITE_EBCDIC)
drh769e97e2009-04-01 16:33:37 +0000453# define sqlite3Utf8Read(A,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000454# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000455#else
drh6ed4b782007-12-10 18:07:20 +0000456# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000457#endif
458
drh4e5ffc52004-08-31 00:52:37 +0000459static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000460/* The correct SQL-92 behavior is for the LIKE operator to ignore
461** case. Thus 'a' LIKE 'A' would be true. */
462static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
463/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
464** is case sensitive causing 'a' LIKE 'A' to be false */
465static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000466
467/*
drh4e5ffc52004-08-31 00:52:37 +0000468** Compare two UTF-8 strings for equality where the first string can
469** potentially be a "glob" expression. Return true (1) if they
470** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000471**
drh4e5ffc52004-08-31 00:52:37 +0000472** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000473**
drh4e5ffc52004-08-31 00:52:37 +0000474** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000475**
drh4e5ffc52004-08-31 00:52:37 +0000476** '?' Matches exactly one character.
477**
478** [...] Matches one character from the enclosed list of
479** characters.
480**
481** [^...] Matches one character not in the enclosed list.
482**
483** With the [...] and [^...] matching, a ']' character can be included
484** in the list by making it the first character after '[' or '^'. A
485** range of characters can be specified using '-'. Example:
486** "[a-z]" matches any single lower-case letter. To match a '-', make
487** it the last character in the list.
488**
489** This routine is usually quick, but can be N**2 in the worst case.
490**
491** Hints: to match '*' or '?', put them in "[]". Like this:
492**
493** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000494*/
danielk19777c6303c2004-11-17 16:41:29 +0000495static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000496 const u8 *zPattern, /* The glob pattern */
497 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000498 const struct compareInfo *pInfo, /* Information about how to do the compare */
499 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000500){
drh66150952007-07-23 19:12:41 +0000501 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000502 int invert;
503 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000504 u8 matchOne = pInfo->matchOne;
505 u8 matchAll = pInfo->matchAll;
506 u8 matchSet = pInfo->matchSet;
507 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000508 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000509
drh769e97e2009-04-01 16:33:37 +0000510 while( (c = sqlite3Utf8Read(zPattern,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000511 if( !prevEscape && c==matchAll ){
drh769e97e2009-04-01 16:33:37 +0000512 while( (c=sqlite3Utf8Read(zPattern,&zPattern)) == matchAll
drh66150952007-07-23 19:12:41 +0000513 || c == matchOne ){
drh769e97e2009-04-01 16:33:37 +0000514 if( c==matchOne && sqlite3Utf8Read(zString, &zString)==0 ){
drh66150952007-07-23 19:12:41 +0000515 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000516 }
danielk1977ad7dd422004-06-06 12:41:49 +0000517 }
drh66150952007-07-23 19:12:41 +0000518 if( c==0 ){
519 return 1;
520 }else if( c==esc ){
drh769e97e2009-04-01 16:33:37 +0000521 c = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000522 if( c==0 ){
523 return 0;
524 }
525 }else if( c==matchSet ){
526 assert( esc==0 ); /* This is GLOB, not LIKE */
527 assert( matchSet<0x80 ); /* '[' is a single-byte character */
528 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000529 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000530 }
531 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000532 }
drh769e97e2009-04-01 16:33:37 +0000533 while( (c2 = sqlite3Utf8Read(zString,&zString))!=0 ){
drh66150952007-07-23 19:12:41 +0000534 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000535 GlogUpperToLower(c2);
536 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000537 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000538 c2 = sqlite3Utf8Read(zString, &zString);
drh6ed4b782007-12-10 18:07:20 +0000539 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000540 }
drh66150952007-07-23 19:12:41 +0000541 }else{
542 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000543 c2 = sqlite3Utf8Read(zString, &zString);
drh66150952007-07-23 19:12:41 +0000544 }
drh4e5ffc52004-08-31 00:52:37 +0000545 }
drh66150952007-07-23 19:12:41 +0000546 if( c2==0 ) return 0;
547 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
548 }
549 return 0;
550 }else if( !prevEscape && c==matchOne ){
drh769e97e2009-04-01 16:33:37 +0000551 if( sqlite3Utf8Read(zString, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000552 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000553 }
drh4e5ffc52004-08-31 00:52:37 +0000554 }else if( c==matchSet ){
555 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000556 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000557 seen = 0;
558 invert = 0;
drh769e97e2009-04-01 16:33:37 +0000559 c = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000560 if( c==0 ) return 0;
drh769e97e2009-04-01 16:33:37 +0000561 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000562 if( c2=='^' ){
563 invert = 1;
drh769e97e2009-04-01 16:33:37 +0000564 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000565 }
drh4e5ffc52004-08-31 00:52:37 +0000566 if( c2==']' ){
567 if( c==']' ) seen = 1;
drh769e97e2009-04-01 16:33:37 +0000568 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000569 }
drh66150952007-07-23 19:12:41 +0000570 while( c2 && c2!=']' ){
571 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
drh769e97e2009-04-01 16:33:37 +0000572 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000573 if( c>=prior_c && c<=c2 ) seen = 1;
574 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000575 }else{
drh66150952007-07-23 19:12:41 +0000576 if( c==c2 ){
577 seen = 1;
578 }
drh4e5ffc52004-08-31 00:52:37 +0000579 prior_c = c2;
580 }
drh769e97e2009-04-01 16:33:37 +0000581 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000582 }
drh66150952007-07-23 19:12:41 +0000583 if( c2==0 || (seen ^ invert)==0 ){
584 return 0;
585 }
586 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000587 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000588 }else{
drh769e97e2009-04-01 16:33:37 +0000589 c2 = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000590 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000591 GlogUpperToLower(c);
592 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000593 }
drh66150952007-07-23 19:12:41 +0000594 if( c!=c2 ){
595 return 0;
596 }
danielk19777c6303c2004-11-17 16:41:29 +0000597 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000598 }
danielk197751ad0ec2004-05-24 12:39:02 +0000599 }
drh4e5ffc52004-08-31 00:52:37 +0000600 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000601}
drh4e5ffc52004-08-31 00:52:37 +0000602
drh55ef4d92005-08-14 01:20:37 +0000603/*
604** Count the number of times that the LIKE operator (or GLOB which is
605** just a variation of LIKE) gets called. This is used for testing
606** only.
607*/
608#ifdef SQLITE_TEST
609int sqlite3_like_count = 0;
610#endif
611
danielk19773f6b0872004-06-17 05:36:44 +0000612
613/*
614** Implementation of the like() SQL function. This function implements
615** the build-in LIKE operator. The first argument to the function is the
616** pattern and the second argument is the string. So, the SQL statements:
617**
618** A LIKE B
619**
620** is implemented as like(B,A).
621**
drh55ef4d92005-08-14 01:20:37 +0000622** This same function (with a different compareInfo structure) computes
623** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000624*/
625static void likeFunc(
626 sqlite3_context *context,
627 int argc,
628 sqlite3_value **argv
629){
drhbeb818d2007-05-08 15:34:47 +0000630 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000631 int escape = 0;
drh27e62db2009-04-02 10:16:17 +0000632 int nPat;
drhbb4957f2008-03-20 14:03:29 +0000633 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000634
drh1f0feef2007-05-15 13:27:07 +0000635 zB = sqlite3_value_text(argv[0]);
636 zA = sqlite3_value_text(argv[1]);
637
drhbeb818d2007-05-08 15:34:47 +0000638 /* Limit the length of the LIKE or GLOB pattern to avoid problems
639 ** of deep recursion and N*N behavior in patternCompare().
640 */
drh27e62db2009-04-02 10:16:17 +0000641 nPat = sqlite3_value_bytes(argv[0]);
642 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] );
643 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 );
644 if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000645 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
646 return;
647 }
drh1f0feef2007-05-15 13:27:07 +0000648 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000649
danielk19777c6303c2004-11-17 16:41:29 +0000650 if( argc==3 ){
651 /* The escape character string must consist of a single UTF-8 character.
652 ** Otherwise, return an error.
653 */
654 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000655 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000656 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000657 sqlite3_result_error(context,
658 "ESCAPE expression must be a single character", -1);
659 return;
660 }
drh769e97e2009-04-01 16:33:37 +0000661 escape = sqlite3Utf8Read(zEsc, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000662 }
danielk19773f6b0872004-06-17 05:36:44 +0000663 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000664 struct compareInfo *pInfo = sqlite3_user_data(context);
665#ifdef SQLITE_TEST
666 sqlite3_like_count++;
667#endif
drhbeb818d2007-05-08 15:34:47 +0000668
danielk1977b56fe1f2007-05-09 08:24:44 +0000669 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000670 }
drh8912d102002-05-26 21:34:58 +0000671}
672
673/*
674** Implementation of the NULLIF(x,y) function. The result is the first
675** argument if the arguments are different. The result is NULL if the
676** arguments are equal to each other.
677*/
drhf9b596e2004-05-26 16:54:42 +0000678static void nullifFunc(
679 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000680 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +0000681 sqlite3_value **argv
682){
danielk1977dc1bdc42004-06-11 10:51:27 +0000683 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk197762c14b32008-11-19 09:05:26 +0000684 UNUSED_PARAMETER(NotUsed);
danielk1977dc1bdc42004-06-11 10:51:27 +0000685 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000686 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000687 }
drh0ac65892002-04-20 14:24:41 +0000688}
689
drh647cb0e2002-11-04 19:32:25 +0000690/*
691** Implementation of the VERSION(*) function. The result is the version
692** of the SQLite library that is running.
693*/
drhf9b596e2004-05-26 16:54:42 +0000694static void versionFunc(
695 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000696 int NotUsed,
697 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000698){
danielk197762c14b32008-11-19 09:05:26 +0000699 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977d8123362004-06-12 09:25:12 +0000700 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000701}
702
drh137c7282007-01-29 17:58:28 +0000703/* Array for converting from half-bytes (nybbles) into ASCII hex
704** digits. */
705static const char hexdigits[] = {
706 '0', '1', '2', '3', '4', '5', '6', '7',
707 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
708};
danielk1977d641d642004-11-18 15:44:29 +0000709
drh47394702003-08-20 01:03:33 +0000710/*
711** EXPERIMENTAL - This is not an official function. The interface may
712** change. This function may disappear. Do not write code that depends
713** on this function.
714**
715** Implementation of the QUOTE() function. This function takes a single
716** argument. If the argument is numeric, the return value is the same as
717** the argument. If the argument is NULL, the return value is the string
718** "NULL". Otherwise, the argument is enclosed in single quotes with
719** single-quote escapes.
720*/
danielk19770ae8b832004-05-25 12:05:56 +0000721static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drha0df4cc2009-02-02 17:29:59 +0000722 assert( argc==1 );
drh1d34fde2009-02-03 15:50:33 +0000723 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000724 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000725 case SQLITE_INTEGER:
726 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000727 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000728 break;
729 }
danielk19773f41e972004-06-08 00:39:01 +0000730 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000731 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000732 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000733 int nBlob = sqlite3_value_bytes(argv[0]);
734 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000735 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000736 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000737 int i;
738 for(i=0; i<nBlob; i++){
739 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
740 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
741 }
742 zText[(nBlob*2)+2] = '\'';
743 zText[(nBlob*2)+3] = '\0';
744 zText[0] = 'X';
745 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000746 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000747 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000748 }
749 break;
750 }
drh9c054832004-05-31 18:51:57 +0000751 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000752 int i,j;
753 u64 n;
drh2646da72005-12-09 20:02:05 +0000754 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000755 char *z;
756
drh7a521cf2007-04-25 18:23:52 +0000757 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000758 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000759 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000760 if( z ){
761 z[0] = '\'';
762 for(i=0, j=1; zArg[i]; i++){
763 z[j++] = zArg[i];
764 if( zArg[i]=='\'' ){
765 z[j++] = '\'';
766 }
drhf9b596e2004-05-26 16:54:42 +0000767 }
danielk1977a1644fd2007-08-29 12:31:25 +0000768 z[j++] = '\'';
769 z[j] = 0;
770 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000771 }
drha0df4cc2009-02-02 17:29:59 +0000772 break;
773 }
774 default: {
775 assert( sqlite3_value_type(argv[0])==SQLITE_NULL );
776 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
777 break;
drhf9b596e2004-05-26 16:54:42 +0000778 }
drh47394702003-08-20 01:03:33 +0000779 }
780}
781
drh137c7282007-01-29 17:58:28 +0000782/*
783** The hex() function. Interpret the argument as a blob. Return
784** a hexadecimal rendering as text.
785*/
786static void hexFunc(
787 sqlite3_context *context,
788 int argc,
789 sqlite3_value **argv
790){
791 int i, n;
792 const unsigned char *pBlob;
793 char *zHex, *z;
794 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000795 UNUSED_PARAMETER(argc);
drh1f0feef2007-05-15 13:27:07 +0000796 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000797 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000798 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000799 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000800 if( zHex ){
801 for(i=0; i<n; i++, pBlob++){
802 unsigned char c = *pBlob;
803 *(z++) = hexdigits[(c>>4)&0xf];
804 *(z++) = hexdigits[c&0xf];
805 }
806 *z = 0;
807 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000808 }
drh137c7282007-01-29 17:58:28 +0000809}
810
drh26b6d902007-03-17 13:27:54 +0000811/*
drh8cff3822007-05-02 02:08:28 +0000812** The zeroblob(N) function returns a zero-filled blob of size N bytes.
813*/
814static void zeroblobFunc(
815 sqlite3_context *context,
816 int argc,
817 sqlite3_value **argv
818){
drh98640a32007-06-07 19:08:32 +0000819 i64 n;
drh27e62db2009-04-02 10:16:17 +0000820 sqlite3 *db = sqlite3_context_db_handle(context);
drh8cff3822007-05-02 02:08:28 +0000821 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000822 UNUSED_PARAMETER(argc);
drh98640a32007-06-07 19:08:32 +0000823 n = sqlite3_value_int64(argv[0]);
drh27e62db2009-04-02 10:16:17 +0000824 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH] );
825 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
826 if( n>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drh98640a32007-06-07 19:08:32 +0000827 sqlite3_result_error_toobig(context);
828 }else{
drh1bd10f82008-12-10 21:19:56 +0000829 sqlite3_result_zeroblob(context, (int)n);
drh98640a32007-06-07 19:08:32 +0000830 }
drh8cff3822007-05-02 02:08:28 +0000831}
832
833/*
drh26b6d902007-03-17 13:27:54 +0000834** The replace() function. Three arguments are all strings: call
835** them A, B, and C. The result is also a string which is derived
836** from A by replacing every occurance of B with C. The match
837** must be exact. Collating sequences are not used.
838*/
839static void replaceFunc(
840 sqlite3_context *context,
841 int argc,
842 sqlite3_value **argv
843){
844 const unsigned char *zStr; /* The input string A */
845 const unsigned char *zPattern; /* The pattern string B */
846 const unsigned char *zRep; /* The replacement string C */
847 unsigned char *zOut; /* The output */
848 int nStr; /* Size of zStr */
849 int nPattern; /* Size of zPattern */
850 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000851 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000852 int loopLimit; /* Last zStr[] that might match zPattern[] */
853 int i, j; /* Loop counters */
854
855 assert( argc==3 );
danielk1977f3d3c272008-11-19 16:52:44 +0000856 UNUSED_PARAMETER(argc);
drh26b6d902007-03-17 13:27:54 +0000857 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000858 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000859 nStr = sqlite3_value_bytes(argv[0]);
860 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000861 zPattern = sqlite3_value_text(argv[1]);
drha605fe82009-02-01 18:08:40 +0000862 if( zPattern==0 ){
drh23336062009-02-03 13:19:12 +0000863 assert( sqlite3_value_type(argv[1])==SQLITE_NULL
864 || sqlite3_context_db_handle(context)->mallocFailed );
drha605fe82009-02-01 18:08:40 +0000865 return;
866 }
867 if( zPattern[0]==0 ){
868 assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
869 sqlite3_result_value(context, argv[0]);
870 return;
871 }
drh1f0feef2007-05-15 13:27:07 +0000872 nPattern = sqlite3_value_bytes(argv[1]);
873 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000874 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000875 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000876 nRep = sqlite3_value_bytes(argv[2]);
877 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000878 nOut = nStr + 1;
879 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +0000880 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +0000881 if( zOut==0 ){
882 return;
drh26b6d902007-03-17 13:27:54 +0000883 }
drh26b6d902007-03-17 13:27:54 +0000884 loopLimit = nStr - nPattern;
885 for(i=j=0; i<=loopLimit; i++){
886 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
887 zOut[j++] = zStr[i];
888 }else{
drh4a50aac2007-08-23 02:47:53 +0000889 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +0000890 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +0000891 nOut += nRep - nPattern;
drh27e62db2009-04-02 10:16:17 +0000892 testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
893 testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
894 if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +0000895 sqlite3_result_error_toobig(context);
drh633e6d52008-07-28 19:34:53 +0000896 sqlite3DbFree(db, zOut);
danielk197717374e82007-05-08 14:39:04 +0000897 return;
898 }
drh4a50aac2007-08-23 02:47:53 +0000899 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000900 zOut = sqlite3_realloc(zOut, (int)nOut);
901 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000902 sqlite3_result_error_nomem(context);
drh633e6d52008-07-28 19:34:53 +0000903 sqlite3DbFree(db, zOld);
drh2e6400b2007-05-08 15:46:18 +0000904 return;
905 }
drh26b6d902007-03-17 13:27:54 +0000906 memcpy(&zOut[j], zRep, nRep);
907 j += nRep;
908 i += nPattern-1;
909 }
910 }
drh2e6400b2007-05-08 15:46:18 +0000911 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000912 memcpy(&zOut[j], &zStr[i], nStr-i);
913 j += nStr - i;
914 assert( j<=nOut );
915 zOut[j] = 0;
916 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
917}
918
drh309b3382007-03-17 17:52:42 +0000919/*
920** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
921** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
922*/
923static void trimFunc(
924 sqlite3_context *context,
925 int argc,
926 sqlite3_value **argv
927){
928 const unsigned char *zIn; /* Input string */
929 const unsigned char *zCharSet; /* Set of characters to trim */
930 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +0000931 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +0000932 int i; /* Loop counter */
drh1bd10f82008-12-10 21:19:56 +0000933 unsigned char *aLen = 0; /* Length of each character in zCharSet */
934 unsigned char **azChar = 0; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000935 int nChar; /* Number of characters in zCharSet */
936
drh309b3382007-03-17 17:52:42 +0000937 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
938 return;
939 }
940 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000941 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000942 nIn = sqlite3_value_bytes(argv[0]);
943 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000944 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000945 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +0000946 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000947 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000948 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +0000949 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +0000950 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000951 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000952 return;
drhd1e3a612007-04-27 21:59:52 +0000953 }else{
954 const unsigned char *z;
955 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000956 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000957 }
958 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +0000959 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +0000960 if( azChar==0 ){
961 return;
962 }
963 aLen = (unsigned char*)&azChar[nChar];
964 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +0000965 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +0000966 SQLITE_SKIP_UTF8(z);
drh3abbd392008-12-10 23:04:13 +0000967 aLen[nChar] = (u8)(z - azChar[nChar]);
drhd1e3a612007-04-27 21:59:52 +0000968 }
969 }
drh309b3382007-03-17 17:52:42 +0000970 }
drhd1e3a612007-04-27 21:59:52 +0000971 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +0000972 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +0000973 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000974 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +0000975 int len = 0;
drhd1e3a612007-04-27 21:59:52 +0000976 for(i=0; i<nChar; i++){
977 len = aLen[i];
drh27e62db2009-04-02 10:16:17 +0000978 if( len<=nIn && memcmp(zIn, azChar[i], len)==0 ) break;
drhd1e3a612007-04-27 21:59:52 +0000979 }
980 if( i>=nChar ) break;
981 zIn += len;
982 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000983 }
984 }
985 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000986 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +0000987 int len = 0;
drhd1e3a612007-04-27 21:59:52 +0000988 for(i=0; i<nChar; i++){
989 len = aLen[i];
990 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
991 }
992 if( i>=nChar ) break;
993 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000994 }
995 }
drhd1e3a612007-04-27 21:59:52 +0000996 if( zCharSet ){
997 sqlite3_free(azChar);
998 }
drh309b3382007-03-17 17:52:42 +0000999 }
1000 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
1001}
drh26b6d902007-03-17 13:27:54 +00001002
danielk1977a4de4532008-09-02 15:44:08 +00001003
drhd24cc422003-03-27 12:51:24 +00001004#ifdef SQLITE_SOUNDEX
1005/*
1006** Compute the soundex encoding of a word.
1007*/
drh137c7282007-01-29 17:58:28 +00001008static void soundexFunc(
1009 sqlite3_context *context,
1010 int argc,
1011 sqlite3_value **argv
1012){
drhd24cc422003-03-27 12:51:24 +00001013 char zResult[8];
drh4c755c02004-08-08 20:22:17 +00001014 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +00001015 int i, j;
1016 static const unsigned char iCode[] = {
1017 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1018 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1019 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1020 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1021 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1022 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1023 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1024 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1025 };
1026 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +00001027 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +00001028 if( zIn==0 ) zIn = (u8*)"";
drhdc86e2b2009-01-24 11:30:42 +00001029 for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
drhd24cc422003-03-27 12:51:24 +00001030 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +00001031 u8 prevcode = iCode[zIn[i]&0x7f];
danielk197778ca0e72009-01-20 16:53:39 +00001032 zResult[0] = sqlite3Toupper(zIn[i]);
drhd24cc422003-03-27 12:51:24 +00001033 for(j=1; j<4 && zIn[i]; i++){
1034 int code = iCode[zIn[i]&0x7f];
1035 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +00001036 if( code!=prevcode ){
1037 prevcode = code;
1038 zResult[j++] = code + '0';
1039 }
1040 }else{
1041 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +00001042 }
1043 }
1044 while( j<4 ){
1045 zResult[j++] = '0';
1046 }
1047 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001048 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +00001049 }else{
danielk1977d8123362004-06-12 09:25:12 +00001050 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +00001051 }
1052}
1053#endif
1054
drhfdb83b22006-06-17 14:12:47 +00001055#ifndef SQLITE_OMIT_LOAD_EXTENSION
1056/*
1057** A function that loads a shared-library extension then returns NULL.
1058*/
1059static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001060 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001061 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001062 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001063 char *zErrMsg = 0;
1064
1065 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001066 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001067 }else{
1068 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001069 }
drh7a521cf2007-04-25 18:23:52 +00001070 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001071 sqlite3_result_error(context, zErrMsg, -1);
1072 sqlite3_free(zErrMsg);
1073 }
1074}
1075#endif
1076
danielk197701427a62005-01-11 13:02:33 +00001077
drh0ac65892002-04-20 14:24:41 +00001078/*
drhd3a149e2002-02-24 17:12:53 +00001079** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001080** sum() or avg() aggregate computation.
1081*/
1082typedef struct SumCtx SumCtx;
1083struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001084 double rSum; /* Floating point sum */
1085 i64 iSum; /* Integer sum */
1086 i64 cnt; /* Number of elements summed */
1087 u8 overflow; /* True if integer overflow seen */
1088 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001089};
1090
1091/*
drha97fdd32006-01-12 22:17:50 +00001092** Routines used to compute the sum, average, and total.
1093**
1094** The SUM() function follows the (broken) SQL standard which means
1095** that it returns NULL if it sums over no inputs. TOTAL returns
1096** 0.0 in that case. In addition, TOTAL always returns a float where
1097** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001098** value. TOTAL never fails, but SUM might through an exception if
1099** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001100*/
danielk19770ae8b832004-05-25 12:05:56 +00001101static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001102 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001103 int type;
drh3f219f42005-09-08 19:45:57 +00001104 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001105 UNUSED_PARAMETER(argc);
drh4f26d6c2004-05-26 23:25:30 +00001106 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001107 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001108 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001109 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001110 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001111 i64 v = sqlite3_value_int64(argv[0]);
1112 p->rSum += v;
1113 if( (p->approx|p->overflow)==0 ){
1114 i64 iNewSum = p->iSum + v;
drh1bd10f82008-12-10 21:19:56 +00001115 int s1 = (int)(p->iSum >> (sizeof(i64)*8-1));
1116 int s2 = (int)(v >> (sizeof(i64)*8-1));
1117 int s3 = (int)(iNewSum >> (sizeof(i64)*8-1));
1118 p->overflow = ((s1&s2&~s3) | (~s1&~s2&s3))?1:0;
drh8c08e862006-02-11 17:34:00 +00001119 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001120 }
1121 }else{
drh8c08e862006-02-11 17:34:00 +00001122 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001123 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001124 }
drh739105c2002-05-29 23:22:23 +00001125 }
drhdd5baa92002-02-27 19:50:59 +00001126}
danielk19770ae8b832004-05-25 12:05:56 +00001127static void sumFinalize(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);
drhc2bd9132005-09-08 20:37:43 +00001130 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001131 if( p->overflow ){
1132 sqlite3_result_error(context,"integer overflow",-1);
1133 }else if( p->approx ){
1134 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001135 }else{
drh8c08e862006-02-11 17:34:00 +00001136 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001137 }
drh3d1d95e2005-09-08 10:37:01 +00001138 }
drhdd5baa92002-02-27 19:50:59 +00001139}
danielk19770ae8b832004-05-25 12:05:56 +00001140static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001141 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001142 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001143 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001144 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001145 }
1146}
drha97fdd32006-01-12 22:17:50 +00001147static void totalFinalize(sqlite3_context *context){
1148 SumCtx *p;
1149 p = sqlite3_aggregate_context(context, 0);
shanefbd60f82009-02-04 03:59:25 +00001150 /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
1151 sqlite3_result_double(context, p ? p->rSum : (double)0);
drha97fdd32006-01-12 22:17:50 +00001152}
drhdd5baa92002-02-27 19:50:59 +00001153
1154/*
drh0bce8352002-02-28 00:41:10 +00001155** The following structure keeps track of state information for the
1156** count() aggregate function.
1157*/
1158typedef struct CountCtx CountCtx;
1159struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001160 i64 n;
drh0bce8352002-02-28 00:41:10 +00001161};
drhdd5baa92002-02-27 19:50:59 +00001162
drh0bce8352002-02-28 00:41:10 +00001163/*
1164** Routines to implement the count() aggregate function.
1165*/
danielk19770ae8b832004-05-25 12:05:56 +00001166static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001167 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001168 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001169 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001170 p->n++;
1171 }
1172}
danielk19770ae8b832004-05-25 12:05:56 +00001173static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001174 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001175 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001176 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001177}
1178
1179/*
drh0bce8352002-02-28 00:41:10 +00001180** Routines to implement min() and max() aggregate functions.
1181*/
danielk197762c14b32008-11-19 09:05:26 +00001182static void minmaxStep(
1183 sqlite3_context *context,
1184 int NotUsed,
1185 sqlite3_value **argv
1186){
danielk197788208052004-05-25 01:13:20 +00001187 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001188 Mem *pBest;
danielk197762c14b32008-11-19 09:05:26 +00001189 UNUSED_PARAMETER(NotUsed);
drh9eb516c2004-07-18 20:52:32 +00001190
1191 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1192 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001193 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001194
danielk197788208052004-05-25 01:13:20 +00001195 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001196 int max;
1197 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001198 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001199 /* This step function is used for both the min() and max() aggregates,
1200 ** the only difference between the two being that the sense of the
1201 ** comparison is inverted. For the max() aggregate, the
1202 ** sqlite3_user_data() function returns (void *)-1. For min() it
1203 ** returns (void *)db, where db is the sqlite3* database pointer.
1204 ** Therefore the next statement sets variable 'max' to 1 for the max()
1205 ** aggregate, or 0 for min().
1206 */
drh309b3382007-03-17 17:52:42 +00001207 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001208 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001209 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001210 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001211 }
drh268380c2004-02-25 13:47:31 +00001212 }else{
drhb21c8cd2007-08-21 19:33:56 +00001213 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001214 }
1215}
danielk19770ae8b832004-05-25 12:05:56 +00001216static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001217 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001218 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1219 if( pRes ){
drhd27135a2009-04-02 13:36:37 +00001220 if( ALWAYS(pRes->flags) ){
drhabfcea22005-09-06 20:36:48 +00001221 sqlite3_result_value(context, pRes);
1222 }
1223 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001224 }
1225}
drhdd5baa92002-02-27 19:50:59 +00001226
drhb0689692007-11-01 17:38:30 +00001227/*
1228** group_concat(EXPR, ?SEPARATOR?)
1229*/
1230static void groupConcatStep(
1231 sqlite3_context *context,
1232 int argc,
1233 sqlite3_value **argv
1234){
1235 const char *zVal;
drhade86482007-11-28 22:36:40 +00001236 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001237 const char *zSep;
drh07d31172009-02-02 21:57:05 +00001238 int nVal, nSep;
1239 assert( argc==1 || argc==2 );
1240 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001241 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1242
1243 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001244 sqlite3 *db = sqlite3_context_db_handle(context);
drhade86482007-11-28 22:36:40 +00001245 pAccum->useMalloc = 1;
drhbb4957f2008-03-20 14:03:29 +00001246 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drhade86482007-11-28 22:36:40 +00001247 if( pAccum->nChar ){
drh07d31172009-02-02 21:57:05 +00001248 if( argc==2 ){
1249 zSep = (char*)sqlite3_value_text(argv[1]);
1250 nSep = sqlite3_value_bytes(argv[1]);
drhb0689692007-11-01 17:38:30 +00001251 }else{
1252 zSep = ",";
drhade86482007-11-28 22:36:40 +00001253 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001254 }
drhade86482007-11-28 22:36:40 +00001255 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001256 }
drh07d31172009-02-02 21:57:05 +00001257 zVal = (char*)sqlite3_value_text(argv[0]);
1258 nVal = sqlite3_value_bytes(argv[0]);
1259 sqlite3StrAccumAppend(pAccum, zVal, nVal);
drhb0689692007-11-01 17:38:30 +00001260 }
1261}
1262static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001263 StrAccum *pAccum;
1264 pAccum = sqlite3_aggregate_context(context, 0);
1265 if( pAccum ){
1266 if( pAccum->tooBig ){
1267 sqlite3_result_error_toobig(context);
1268 }else if( pAccum->mallocFailed ){
1269 sqlite3_result_error_nomem(context);
1270 }else{
1271 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1272 sqlite3_free);
1273 }
drhb0689692007-11-01 17:38:30 +00001274 }
1275}
drh4e5ffc52004-08-31 00:52:37 +00001276
drhd3a149e2002-02-24 17:12:53 +00001277/*
drha2ed5602002-02-26 23:55:31 +00001278** This function registered all of the above C functions as SQL
1279** functions. This should be the only routine in this file with
1280** external linkage.
drhdc04c582002-02-24 01:55:15 +00001281*/
drh9bb575f2004-09-06 17:24:11 +00001282void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh1f01ec12005-02-15 21:36:18 +00001283#ifndef SQLITE_OMIT_ALTERTABLE
1284 sqlite3AlterFunctions(db);
1285#endif
danielk19771e536952007-08-16 10:09:01 +00001286 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001287 int rc = sqlite3_overload_function(db, "MATCH", 2);
1288 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1289 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001290 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001291 }
1292 }
danielk1977fd9e1f32005-05-22 10:44:34 +00001293#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001294 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001295#endif
drh55ef4d92005-08-14 01:20:37 +00001296}
1297
1298/*
1299** Set the LIKEOPT flag on the 2-argument function with the given name.
1300*/
drh1bd10f82008-12-10 21:19:56 +00001301static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
drh55ef4d92005-08-14 01:20:37 +00001302 FuncDef *pDef;
drhea678832008-12-10 19:26:22 +00001303 pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
1304 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001305 if( ALWAYS(pDef) ){
drhd64fe2f2005-08-28 17:00:23 +00001306 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001307 }
1308}
1309
1310/*
1311** Register the built-in LIKE and GLOB functions. The caseSensitive
1312** parameter determines whether or not the LIKE operator is case
1313** sensitive. GLOB is always case sensitive.
1314*/
1315void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1316 struct compareInfo *pInfo;
1317 if( caseSensitive ){
1318 pInfo = (struct compareInfo*)&likeInfoAlt;
1319 }else{
1320 pInfo = (struct compareInfo*)&likeInfoNorm;
1321 }
danielk1977717811c2009-03-27 15:26:03 +00001322 sqlite3CreateFunc(db, "like", 2, SQLITE_ANY, pInfo, likeFunc, 0, 0);
1323 sqlite3CreateFunc(db, "like", 3, SQLITE_ANY, pInfo, likeFunc, 0, 0);
1324 sqlite3CreateFunc(db, "glob", 2, SQLITE_ANY,
drh55ef4d92005-08-14 01:20:37 +00001325 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001326 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1327 setLikeOptFlag(db, "like",
1328 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001329}
1330
1331/*
1332** pExpr points to an expression which implements a function. If
1333** it is appropriate to apply the LIKE optimization to that function
1334** then set aWc[0] through aWc[2] to the wildcard characters and
1335** return TRUE. If the function is not a LIKE-style function then
1336** return FALSE.
1337*/
drhd64fe2f2005-08-28 17:00:23 +00001338int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001339 FuncDef *pDef;
danielk19776ab3a2e2009-02-19 14:39:25 +00001340 if( pExpr->op!=TK_FUNCTION
1341 || !pExpr->x.pList
1342 || pExpr->x.pList->nExpr!=2
1343 ){
drh55ef4d92005-08-14 01:20:37 +00001344 return 0;
1345 }
danielk19776ab3a2e2009-02-19 14:39:25 +00001346 assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
drh2646da72005-12-09 20:02:05 +00001347 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001348 SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001349 if( NEVER(pDef==0) || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001350 return 0;
1351 }
1352
1353 /* The memcpy() statement assumes that the wildcard characters are
1354 ** the first three statements in the compareInfo structure. The
1355 ** asserts() that follow verify that assumption
1356 */
1357 memcpy(aWc, pDef->pUserData, 3);
1358 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1359 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1360 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001361 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001362 return 1;
drhdc04c582002-02-24 01:55:15 +00001363}
danielk19778c0a7912008-08-20 14:49:23 +00001364
drh70a8ca32008-08-21 18:49:27 +00001365/*
drh777c5382008-08-21 20:21:34 +00001366** All all of the FuncDef structures in the aBuiltinFunc[] array above
1367** to the global function hash table. This occurs at start-time (as
1368** a consequence of calling sqlite3_initialize()).
1369**
1370** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001371*/
1372void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001373 /*
1374 ** The following array holds FuncDef structures for all of the functions
1375 ** defined in this file.
1376 **
1377 ** The array cannot be constant since changes are made to the
1378 ** FuncDef.pHash elements at start-time. The elements of this array
1379 ** are read-only after initialization is complete.
1380 */
1381 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1382 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1383 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1384 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1385 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1386 FUNCTION(trim, 1, 3, 0, trimFunc ),
1387 FUNCTION(trim, 2, 3, 0, trimFunc ),
1388 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1389 FUNCTION(min, 0, 0, 1, 0 ),
1390 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1391 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1392 FUNCTION(max, 0, 1, 1, 0 ),
1393 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1394 FUNCTION(typeof, 1, 0, 0, typeofFunc ),
1395 FUNCTION(length, 1, 0, 0, lengthFunc ),
1396 FUNCTION(substr, 2, 0, 0, substrFunc ),
1397 FUNCTION(substr, 3, 0, 0, substrFunc ),
1398 FUNCTION(abs, 1, 0, 0, absFunc ),
shanefbd60f82009-02-04 03:59:25 +00001399#ifndef SQLITE_OMIT_FLOATING_POINT
danielk197793ce7412008-09-01 19:14:02 +00001400 FUNCTION(round, 1, 0, 0, roundFunc ),
1401 FUNCTION(round, 2, 0, 0, roundFunc ),
shanefbd60f82009-02-04 03:59:25 +00001402#endif
danielk197793ce7412008-09-01 19:14:02 +00001403 FUNCTION(upper, 1, 0, 0, upperFunc ),
1404 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1405 FUNCTION(coalesce, 1, 0, 0, 0 ),
1406 FUNCTION(coalesce, -1, 0, 0, ifnullFunc ),
1407 FUNCTION(coalesce, 0, 0, 0, 0 ),
1408 FUNCTION(hex, 1, 0, 0, hexFunc ),
1409 FUNCTION(ifnull, 2, 0, 1, ifnullFunc ),
drh9373b012009-02-02 01:50:39 +00001410 FUNCTION(random, 0, 0, 0, randomFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001411 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1412 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1413 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
1414 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1415 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1416 FUNCTION(changes, 0, 0, 0, changes ),
1417 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1418 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1419 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1420 #ifdef SQLITE_SOUNDEX
1421 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1422 #endif
1423 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1424 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1425 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1426 #endif
1427 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1428 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1429 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
danielk1977a5533162009-02-24 10:01:51 +00001430 /* AGGREGATE(count, 0, 0, 0, countStep, countFinalize ), */
1431 {0,SQLITE_UTF8,SQLITE_FUNC_COUNT,0,0,0,countStep,countFinalize,"count",0},
danielk197793ce7412008-09-01 19:14:02 +00001432 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
drh07d31172009-02-02 21:57:05 +00001433 AGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize),
1434 AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize),
danielk197793ce7412008-09-01 19:14:02 +00001435
1436 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1437 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1438 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1439 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1440 #else
1441 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1442 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1443 #endif
1444 };
1445
drh70a8ca32008-08-21 18:49:27 +00001446 int i;
danielk197793ce7412008-09-01 19:14:02 +00001447 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001448 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001449
drh70a8ca32008-08-21 18:49:27 +00001450 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001451 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001452 }
drh777c5382008-08-21 20:21:34 +00001453 sqlite3RegisterDateTimeFunctions();
drh70a8ca32008-08-21 18:49:27 +00001454}