blob: 2766fa3b1b8638d23d15783187684d8abc9df712 [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.
drhdc04c582002-02-24 01:55:15 +000018*/
drhb659e9b2005-01-28 01:29:08 +000019#include "sqliteInt.h"
drhd3a149e2002-02-24 17:12:53 +000020#include <stdlib.h>
drh0bce8352002-02-28 00:41:10 +000021#include <assert.h>
danielk197788208052004-05-25 01:13:20 +000022#include "vdbeInt.h"
drh0bce8352002-02-28 00:41:10 +000023
drh55ef4d92005-08-14 01:20:37 +000024/*
25** Return the collating function associated with a function.
26*/
danielk1977dc1bdc42004-06-11 10:51:27 +000027static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
28 return context->pColl;
29}
30
drh0bce8352002-02-28 00:41:10 +000031/*
32** Implementation of the non-aggregate min() and max() functions
33*/
drhf9b596e2004-05-26 16:54:42 +000034static void minmaxFunc(
35 sqlite3_context *context,
36 int argc,
37 sqlite3_value **argv
38){
drh0bce8352002-02-28 00:41:10 +000039 int i;
drh268380c2004-02-25 13:47:31 +000040 int mask; /* 0 for min() or 0xffffffff for max() */
drhf9b596e2004-05-26 16:54:42 +000041 int iBest;
danielk1977dc1bdc42004-06-11 10:51:27 +000042 CollSeq *pColl;
drh0bce8352002-02-28 00:41:10 +000043
drh65595cd2009-02-02 16:32:55 +000044 assert( argc>1 );
drhc44af712004-09-02 15:53:56 +000045 mask = sqlite3_user_data(context)==0 ? 0 : -1;
danielk1977dc1bdc42004-06-11 10:51:27 +000046 pColl = sqlite3GetFuncCollSeq(context);
47 assert( pColl );
danielk1977c572ef72004-05-27 09:28:41 +000048 assert( mask==-1 || mask==0 );
drhf9b596e2004-05-26 16:54:42 +000049 iBest = 0;
drh9c054832004-05-31 18:51:57 +000050 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhf9b596e2004-05-26 16:54:42 +000051 for(i=1; i<argc; i++){
drh9c054832004-05-31 18:51:57 +000052 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
danielk1977dc1bdc42004-06-11 10:51:27 +000053 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
drh65595cd2009-02-02 16:32:55 +000054 testcase( mask==0 );
drhf9b596e2004-05-26 16:54:42 +000055 iBest = i;
drh0bce8352002-02-28 00:41:10 +000056 }
57 }
drhf4479502004-05-27 03:12:53 +000058 sqlite3_result_value(context, argv[iBest]);
drh0bce8352002-02-28 00:41:10 +000059}
drh0bce8352002-02-28 00:41:10 +000060
drh268380c2004-02-25 13:47:31 +000061/*
62** Return the type of the argument.
63*/
drhf9b596e2004-05-26 16:54:42 +000064static void typeofFunc(
65 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +000066 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +000067 sqlite3_value **argv
68){
danielk197735bb9d02004-05-24 12:55:54 +000069 const char *z = 0;
danielk197762c14b32008-11-19 09:05:26 +000070 UNUSED_PARAMETER(NotUsed);
danielk197735bb9d02004-05-24 12:55:54 +000071 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000072 case SQLITE_INTEGER: z = "integer"; break;
73 case SQLITE_TEXT: z = "text"; break;
74 case SQLITE_FLOAT: z = "real"; break;
75 case SQLITE_BLOB: z = "blob"; break;
drh65595cd2009-02-02 16:32:55 +000076 default: z = "null"; break;
danielk197735bb9d02004-05-24 12:55:54 +000077 }
danielk1977d8123362004-06-12 09:25:12 +000078 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000079}
80
drh5708d2d2005-06-22 10:53:59 +000081
82/*
drh0bce8352002-02-28 00:41:10 +000083** Implementation of the length() function
84*/
drhf9b596e2004-05-26 16:54:42 +000085static void lengthFunc(
86 sqlite3_context *context,
87 int argc,
88 sqlite3_value **argv
89){
drh0bce8352002-02-28 00:41:10 +000090 int len;
91
92 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +000093 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +000094 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000095 case SQLITE_BLOB:
96 case SQLITE_INTEGER:
97 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +000098 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +000099 break;
100 }
drh9c054832004-05-31 18:51:57 +0000101 case SQLITE_TEXT: {
drh2646da72005-12-09 20:02:05 +0000102 const unsigned char *z = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000103 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000104 len = 0;
105 while( *z ){
106 len++;
107 SQLITE_SKIP_UTF8(z);
108 }
drhf4479502004-05-27 03:12:53 +0000109 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000110 break;
111 }
112 default: {
113 sqlite3_result_null(context);
114 break;
115 }
116 }
drh0bce8352002-02-28 00:41:10 +0000117}
118
119/*
120** Implementation of the abs() function
121*/
danielk19770ae8b832004-05-25 12:05:56 +0000122static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000123 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000124 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000125 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000126 case SQLITE_INTEGER: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000127 i64 iVal = sqlite3_value_int64(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000128 if( iVal<0 ){
129 if( (iVal<<1)==0 ){
130 sqlite3_result_error(context, "integer overflow", -1);
131 return;
132 }
133 iVal = -iVal;
134 }
danielk1977f93bbbe2004-05-27 10:30:52 +0000135 sqlite3_result_int64(context, iVal);
drhf9b596e2004-05-26 16:54:42 +0000136 break;
137 }
drh9c054832004-05-31 18:51:57 +0000138 case SQLITE_NULL: {
drhf9b596e2004-05-26 16:54:42 +0000139 sqlite3_result_null(context);
140 break;
141 }
142 default: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000143 double rVal = sqlite3_value_double(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000144 if( rVal<0 ) rVal = -rVal;
danielk1977f93bbbe2004-05-27 10:30:52 +0000145 sqlite3_result_double(context, rVal);
drhf9b596e2004-05-26 16:54:42 +0000146 break;
147 }
148 }
drh0bce8352002-02-28 00:41:10 +0000149}
150
151/*
drhf764e6f2007-05-15 01:13:47 +0000152** Implementation of the substr() function.
153**
154** substr(x,p1,p2) returns p2 characters of x[] beginning with p1.
155** p1 is 1-indexed. So substr(x,1,1) returns the first character
156** of x. If x is text, then we actually count UTF-8 characters.
157** If x is a blob, then we count bytes.
158**
159** If p1 is negative, then we begin abs(p1) from the end of x[].
drh0bce8352002-02-28 00:41:10 +0000160*/
drhf9b596e2004-05-26 16:54:42 +0000161static void substrFunc(
162 sqlite3_context *context,
163 int argc,
164 sqlite3_value **argv
165){
drh2646da72005-12-09 20:02:05 +0000166 const unsigned char *z;
167 const unsigned char *z2;
drh023ae032007-05-08 12:12:16 +0000168 int len;
drhf764e6f2007-05-15 01:13:47 +0000169 int p0type;
drh023ae032007-05-08 12:12:16 +0000170 i64 p1, p2;
drh65595cd2009-02-02 16:32:55 +0000171 int negP2 = 0;
drhf9b596e2004-05-26 16:54:42 +0000172
drh64f31512007-10-12 19:11:55 +0000173 assert( argc==3 || argc==2 );
drh8198d252009-02-01 19:42:37 +0000174 if( sqlite3_value_type(argv[1])==SQLITE_NULL
175 || (argc==3 && sqlite3_value_type(argv[2])==SQLITE_NULL)
176 ){
177 return;
178 }
drhf764e6f2007-05-15 01:13:47 +0000179 p0type = sqlite3_value_type(argv[0]);
180 if( p0type==SQLITE_BLOB ){
181 len = sqlite3_value_bytes(argv[0]);
182 z = sqlite3_value_blob(argv[0]);
183 if( z==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000184 assert( len==sqlite3_value_bytes(argv[0]) );
drhf764e6f2007-05-15 01:13:47 +0000185 }else{
186 z = sqlite3_value_text(argv[0]);
187 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000188 len = 0;
189 for(z2=z; *z2; len++){
190 SQLITE_SKIP_UTF8(z2);
191 }
drhf764e6f2007-05-15 01:13:47 +0000192 }
danielk197751ad0ec2004-05-24 12:39:02 +0000193 p1 = sqlite3_value_int(argv[1]);
drh64f31512007-10-12 19:11:55 +0000194 if( argc==3 ){
195 p2 = sqlite3_value_int(argv[2]);
drh65595cd2009-02-02 16:32:55 +0000196 if( p2<0 ){
197 p2 = -p2;
198 negP2 = 1;
199 }
drh64f31512007-10-12 19:11:55 +0000200 }else{
drhbb4957f2008-03-20 14:03:29 +0000201 p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH];
drh64f31512007-10-12 19:11:55 +0000202 }
drh0bce8352002-02-28 00:41:10 +0000203 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000204 p1 += len;
drh653bc752002-02-28 03:31:10 +0000205 if( p1<0 ){
206 p2 += p1;
drh65595cd2009-02-02 16:32:55 +0000207 if( p2<0 ) p2 = 0;
drh653bc752002-02-28 03:31:10 +0000208 p1 = 0;
209 }
drh0bce8352002-02-28 00:41:10 +0000210 }else if( p1>0 ){
211 p1--;
drh65595cd2009-02-02 16:32:55 +0000212 }else if( p2>0 ){
213 p2--;
drh0bce8352002-02-28 00:41:10 +0000214 }
drh65595cd2009-02-02 16:32:55 +0000215 if( negP2 ){
216 p1 -= p2;
drh4e79c592009-02-01 19:23:32 +0000217 if( p1<0 ){
218 p2 += p1;
219 p1 = 0;
220 }
221 }
drh65595cd2009-02-02 16:32:55 +0000222 assert( p1>=0 && p2>=0 );
drh0bce8352002-02-28 00:41:10 +0000223 if( p1+p2>len ){
224 p2 = len-p1;
drh478000c2009-02-03 13:10:54 +0000225 if( p2<0 ) p2 = 0;
drh0bce8352002-02-28 00:41:10 +0000226 }
drhf764e6f2007-05-15 01:13:47 +0000227 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000228 while( *z && p1 ){
229 SQLITE_SKIP_UTF8(z);
230 p1--;
drhf764e6f2007-05-15 01:13:47 +0000231 }
drh4a919112007-05-15 11:55:09 +0000232 for(z2=z; *z2 && p2; p2--){
233 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000234 }
drh1bd10f82008-12-10 21:19:56 +0000235 sqlite3_result_text(context, (char*)z, (int)(z2-z), SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000236 }else{
drh1bd10f82008-12-10 21:19:56 +0000237 sqlite3_result_blob(context, (char*)&z[p1], (int)p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000238 }
drh0bce8352002-02-28 00:41:10 +0000239}
240
241/*
242** Implementation of the round() function
243*/
shanefbd60f82009-02-04 03:59:25 +0000244#ifndef SQLITE_OMIT_FLOATING_POINT
danielk19770ae8b832004-05-25 12:05:56 +0000245static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000246 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000247 double r;
drh50d654d2009-06-03 01:24:54 +0000248 char *zBuf;
drh0bce8352002-02-28 00:41:10 +0000249 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000250 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000251 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000252 n = sqlite3_value_int(argv[1]);
253 if( n>30 ) n = 30;
254 if( n<0 ) n = 0;
255 }
drhd589a922006-03-02 03:02:48 +0000256 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000257 r = sqlite3_value_double(argv[0]);
drh50d654d2009-06-03 01:24:54 +0000258 zBuf = sqlite3_mprintf("%.*f",n,r);
259 if( zBuf==0 ){
260 sqlite3_result_error_nomem(context);
261 }else{
262 sqlite3AtoF(zBuf, &r);
263 sqlite3_free(zBuf);
264 sqlite3_result_double(context, r);
265 }
drh0bce8352002-02-28 00:41:10 +0000266}
shanefbd60f82009-02-04 03:59:25 +0000267#endif
drhdc04c582002-02-24 01:55:15 +0000268
danielk197726783a52007-08-29 14:06:22 +0000269/*
270** Allocate nByte bytes of space using sqlite3_malloc(). If the
271** allocation fails, call sqlite3_result_error_nomem() to notify
drh27e62db2009-04-02 10:16:17 +0000272** the database handle that malloc() has failed and return NULL.
273** If nByte is larger than the maximum string or blob length, then
274** raise an SQLITE_TOOBIG exception and return NULL.
danielk197726783a52007-08-29 14:06:22 +0000275*/
drhb1a6c3c2008-03-20 16:30:17 +0000276static void *contextMalloc(sqlite3_context *context, i64 nByte){
drhbb4957f2008-03-20 14:03:29 +0000277 char *z;
drh27e62db2009-04-02 10:16:17 +0000278 sqlite3 *db = sqlite3_context_db_handle(context);
drhef31c6a2009-04-02 09:07:12 +0000279 assert( nByte>0 );
drh27e62db2009-04-02 10:16:17 +0000280 testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] );
281 testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
282 if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drhbb4957f2008-03-20 14:03:29 +0000283 sqlite3_result_error_toobig(context);
284 z = 0;
285 }else{
drh1bd10f82008-12-10 21:19:56 +0000286 z = sqlite3Malloc((int)nByte);
drhef31c6a2009-04-02 09:07:12 +0000287 if( !z ){
drhbb4957f2008-03-20 14:03:29 +0000288 sqlite3_result_error_nomem(context);
289 }
danielk1977a1644fd2007-08-29 12:31:25 +0000290 }
291 return z;
292}
293
drhdc04c582002-02-24 01:55:15 +0000294/*
295** Implementation of the upper() and lower() SQL functions.
296*/
danielk19770ae8b832004-05-25 12:05:56 +0000297static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000298 char *z1;
299 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000300 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000301 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000302 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000303 n = sqlite3_value_bytes(argv[0]);
304 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
305 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000306 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000307 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000308 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000309 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000310 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000311 z1[i] = (char)sqlite3Toupper(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000312 }
313 sqlite3_result_text(context, z1, -1, sqlite3_free);
314 }
drhdc04c582002-02-24 01:55:15 +0000315 }
316}
danielk19770ae8b832004-05-25 12:05:56 +0000317static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197778ca0e72009-01-20 16:53:39 +0000318 u8 *z1;
drh7a521cf2007-04-25 18:23:52 +0000319 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000320 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000321 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000322 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000323 n = sqlite3_value_bytes(argv[0]);
324 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
325 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000326 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000327 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000328 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000329 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000330 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000331 z1[i] = sqlite3Tolower(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000332 }
danielk197778ca0e72009-01-20 16:53:39 +0000333 sqlite3_result_text(context, (char *)z1, -1, sqlite3_free);
drh7a521cf2007-04-25 18:23:52 +0000334 }
drhdc04c582002-02-24 01:55:15 +0000335 }
336}
337
338/*
drhfbc99082002-02-28 03:14:18 +0000339** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000340** All three do the same thing. They return the first non-NULL
341** argument.
drh3212e182002-02-28 00:46:26 +0000342*/
drhf9b596e2004-05-26 16:54:42 +0000343static void ifnullFunc(
344 sqlite3_context *context,
345 int argc,
346 sqlite3_value **argv
347){
drhfbc99082002-02-28 03:14:18 +0000348 int i;
349 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000350 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000351 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000352 break;
353 }
354 }
drh3212e182002-02-28 00:46:26 +0000355}
356
357/*
drhf9ffac92002-03-02 19:00:31 +0000358** Implementation of random(). Return a random integer.
359*/
drhf9b596e2004-05-26 16:54:42 +0000360static void randomFunc(
361 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000362 int NotUsed,
363 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000364){
drh52fc8492006-02-23 21:43:55 +0000365 sqlite_int64 r;
danielk197762c14b32008-11-19 09:05:26 +0000366 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drh2fa18682008-03-19 14:15:34 +0000367 sqlite3_randomness(sizeof(r), &r);
drh3034e3d2009-04-02 14:05:21 +0000368 if( r<0 ){
369 /* We need to prevent a random number of 0x8000000000000000
370 ** (or -9223372036854775808) since when you do abs() of that
371 ** number of you get the same value back again. To do this
372 ** in a way that is testable, mask the sign bit off of negative
373 ** values, resulting in a positive value. Then take the
374 ** 2s complement of that positive value. The end result can
375 ** therefore be no less than -9223372036854775807.
376 */
377 r = -(r ^ (((sqlite3_int64)1)<<63));
378 }
drh52fc8492006-02-23 21:43:55 +0000379 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000380}
381
382/*
drh137c7282007-01-29 17:58:28 +0000383** Implementation of randomblob(N). Return a random blob
384** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000385*/
drh137c7282007-01-29 17:58:28 +0000386static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000387 sqlite3_context *context,
388 int argc,
389 sqlite3_value **argv
390){
drh137c7282007-01-29 17:58:28 +0000391 int n;
392 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000393 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000394 UNUSED_PARAMETER(argc);
drh63cf66f2007-01-29 15:50:05 +0000395 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000396 if( n<1 ){
397 n = 1;
398 }
danielk1977a1644fd2007-08-29 12:31:25 +0000399 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000400 if( p ){
drh2fa18682008-03-19 14:15:34 +0000401 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000402 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000403 }
drh63cf66f2007-01-29 15:50:05 +0000404}
405
406/*
drh6ed41ad2002-04-06 14:10:47 +0000407** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000408** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000409*/
danielk197751ad0ec2004-05-24 12:39:02 +0000410static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000411 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000412 int NotUsed,
413 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000414){
drhfa4a4b92008-03-19 21:45:51 +0000415 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000416 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf9b596e2004-05-26 16:54:42 +0000417 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000418}
419
rdcf146a772004-02-25 22:51:06 +0000420/*
danielk1977b28af712004-06-21 06:50:26 +0000421** Implementation of the changes() SQL function. The return value is the
422** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000423*/
danielk1977b28af712004-06-21 06:50:26 +0000424static void changes(
drhf9b596e2004-05-26 16:54:42 +0000425 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000426 int NotUsed,
427 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000428){
drhfa4a4b92008-03-19 21:45:51 +0000429 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000430 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf4479502004-05-27 03:12:53 +0000431 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000432}
rdcf146a772004-02-25 22:51:06 +0000433
434/*
danielk1977b28af712004-06-21 06:50:26 +0000435** Implementation of the total_changes() SQL function. The return value is
436** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000437*/
danielk1977b28af712004-06-21 06:50:26 +0000438static void total_changes(
439 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000440 int NotUsed,
441 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000442){
drhfa4a4b92008-03-19 21:45:51 +0000443 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000444 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977b28af712004-06-21 06:50:26 +0000445 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000446}
447
drh6ed41ad2002-04-06 14:10:47 +0000448/*
drh4e5ffc52004-08-31 00:52:37 +0000449** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000450*/
drh4e5ffc52004-08-31 00:52:37 +0000451struct compareInfo {
452 u8 matchAll;
453 u8 matchOne;
454 u8 matchSet;
455 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000456};
drh55ef4d92005-08-14 01:20:37 +0000457
drhb9175ae2007-12-07 18:39:04 +0000458/*
459** For LIKE and GLOB matching on EBCDIC machines, assume that every
460** character is exactly one byte in size. Also, all characters are
461** able to participate in upper-case-to-lower-case mappings in EBCDIC
462** whereas only characters less than 0x80 do in ASCII.
463*/
464#if defined(SQLITE_EBCDIC)
drh769e97e2009-04-01 16:33:37 +0000465# define sqlite3Utf8Read(A,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000466# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000467#else
drh6ed4b782007-12-10 18:07:20 +0000468# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000469#endif
470
drh4e5ffc52004-08-31 00:52:37 +0000471static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000472/* The correct SQL-92 behavior is for the LIKE operator to ignore
473** case. Thus 'a' LIKE 'A' would be true. */
474static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
475/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
476** is case sensitive causing 'a' LIKE 'A' to be false */
477static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000478
479/*
drh4e5ffc52004-08-31 00:52:37 +0000480** Compare two UTF-8 strings for equality where the first string can
481** potentially be a "glob" expression. Return true (1) if they
482** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000483**
drh4e5ffc52004-08-31 00:52:37 +0000484** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000485**
drh4e5ffc52004-08-31 00:52:37 +0000486** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000487**
drh4e5ffc52004-08-31 00:52:37 +0000488** '?' Matches exactly one character.
489**
490** [...] Matches one character from the enclosed list of
491** characters.
492**
493** [^...] Matches one character not in the enclosed list.
494**
495** With the [...] and [^...] matching, a ']' character can be included
496** in the list by making it the first character after '[' or '^'. A
497** range of characters can be specified using '-'. Example:
498** "[a-z]" matches any single lower-case letter. To match a '-', make
499** it the last character in the list.
500**
501** This routine is usually quick, but can be N**2 in the worst case.
502**
503** Hints: to match '*' or '?', put them in "[]". Like this:
504**
505** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000506*/
danielk19777c6303c2004-11-17 16:41:29 +0000507static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000508 const u8 *zPattern, /* The glob pattern */
509 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000510 const struct compareInfo *pInfo, /* Information about how to do the compare */
511 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000512){
drh66150952007-07-23 19:12:41 +0000513 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000514 int invert;
515 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000516 u8 matchOne = pInfo->matchOne;
517 u8 matchAll = pInfo->matchAll;
518 u8 matchSet = pInfo->matchSet;
519 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000520 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000521
drh769e97e2009-04-01 16:33:37 +0000522 while( (c = sqlite3Utf8Read(zPattern,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000523 if( !prevEscape && c==matchAll ){
drh769e97e2009-04-01 16:33:37 +0000524 while( (c=sqlite3Utf8Read(zPattern,&zPattern)) == matchAll
drh66150952007-07-23 19:12:41 +0000525 || c == matchOne ){
drh769e97e2009-04-01 16:33:37 +0000526 if( c==matchOne && sqlite3Utf8Read(zString, &zString)==0 ){
drh66150952007-07-23 19:12:41 +0000527 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000528 }
danielk1977ad7dd422004-06-06 12:41:49 +0000529 }
drh66150952007-07-23 19:12:41 +0000530 if( c==0 ){
531 return 1;
532 }else if( c==esc ){
drh769e97e2009-04-01 16:33:37 +0000533 c = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000534 if( c==0 ){
535 return 0;
536 }
537 }else if( c==matchSet ){
538 assert( esc==0 ); /* This is GLOB, not LIKE */
539 assert( matchSet<0x80 ); /* '[' is a single-byte character */
540 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000541 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000542 }
543 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000544 }
drh769e97e2009-04-01 16:33:37 +0000545 while( (c2 = sqlite3Utf8Read(zString,&zString))!=0 ){
drh66150952007-07-23 19:12:41 +0000546 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000547 GlogUpperToLower(c2);
548 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000549 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000550 c2 = sqlite3Utf8Read(zString, &zString);
drh6ed4b782007-12-10 18:07:20 +0000551 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000552 }
drh66150952007-07-23 19:12:41 +0000553 }else{
554 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000555 c2 = sqlite3Utf8Read(zString, &zString);
drh66150952007-07-23 19:12:41 +0000556 }
drh4e5ffc52004-08-31 00:52:37 +0000557 }
drh66150952007-07-23 19:12:41 +0000558 if( c2==0 ) return 0;
559 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
560 }
561 return 0;
562 }else if( !prevEscape && c==matchOne ){
drh769e97e2009-04-01 16:33:37 +0000563 if( sqlite3Utf8Read(zString, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000564 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000565 }
drh4e5ffc52004-08-31 00:52:37 +0000566 }else if( c==matchSet ){
567 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000568 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000569 seen = 0;
570 invert = 0;
drh769e97e2009-04-01 16:33:37 +0000571 c = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000572 if( c==0 ) return 0;
drh769e97e2009-04-01 16:33:37 +0000573 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000574 if( c2=='^' ){
575 invert = 1;
drh769e97e2009-04-01 16:33:37 +0000576 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000577 }
drh4e5ffc52004-08-31 00:52:37 +0000578 if( c2==']' ){
579 if( c==']' ) seen = 1;
drh769e97e2009-04-01 16:33:37 +0000580 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000581 }
drh66150952007-07-23 19:12:41 +0000582 while( c2 && c2!=']' ){
583 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
drh769e97e2009-04-01 16:33:37 +0000584 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000585 if( c>=prior_c && c<=c2 ) seen = 1;
586 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000587 }else{
drh66150952007-07-23 19:12:41 +0000588 if( c==c2 ){
589 seen = 1;
590 }
drh4e5ffc52004-08-31 00:52:37 +0000591 prior_c = c2;
592 }
drh769e97e2009-04-01 16:33:37 +0000593 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000594 }
drh66150952007-07-23 19:12:41 +0000595 if( c2==0 || (seen ^ invert)==0 ){
596 return 0;
597 }
598 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000599 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000600 }else{
drh769e97e2009-04-01 16:33:37 +0000601 c2 = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000602 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000603 GlogUpperToLower(c);
604 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000605 }
drh66150952007-07-23 19:12:41 +0000606 if( c!=c2 ){
607 return 0;
608 }
danielk19777c6303c2004-11-17 16:41:29 +0000609 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000610 }
danielk197751ad0ec2004-05-24 12:39:02 +0000611 }
drh4e5ffc52004-08-31 00:52:37 +0000612 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000613}
drh4e5ffc52004-08-31 00:52:37 +0000614
drh55ef4d92005-08-14 01:20:37 +0000615/*
616** Count the number of times that the LIKE operator (or GLOB which is
617** just a variation of LIKE) gets called. This is used for testing
618** only.
619*/
620#ifdef SQLITE_TEST
621int sqlite3_like_count = 0;
622#endif
623
danielk19773f6b0872004-06-17 05:36:44 +0000624
625/*
626** Implementation of the like() SQL function. This function implements
627** the build-in LIKE operator. The first argument to the function is the
628** pattern and the second argument is the string. So, the SQL statements:
629**
630** A LIKE B
631**
632** is implemented as like(B,A).
633**
drh55ef4d92005-08-14 01:20:37 +0000634** This same function (with a different compareInfo structure) computes
635** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000636*/
637static void likeFunc(
638 sqlite3_context *context,
639 int argc,
640 sqlite3_value **argv
641){
drhbeb818d2007-05-08 15:34:47 +0000642 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000643 int escape = 0;
drh27e62db2009-04-02 10:16:17 +0000644 int nPat;
drhbb4957f2008-03-20 14:03:29 +0000645 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000646
drh1f0feef2007-05-15 13:27:07 +0000647 zB = sqlite3_value_text(argv[0]);
648 zA = sqlite3_value_text(argv[1]);
649
drhbeb818d2007-05-08 15:34:47 +0000650 /* Limit the length of the LIKE or GLOB pattern to avoid problems
651 ** of deep recursion and N*N behavior in patternCompare().
652 */
drh27e62db2009-04-02 10:16:17 +0000653 nPat = sqlite3_value_bytes(argv[0]);
654 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] );
655 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 );
656 if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000657 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
658 return;
659 }
drh1f0feef2007-05-15 13:27:07 +0000660 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000661
danielk19777c6303c2004-11-17 16:41:29 +0000662 if( argc==3 ){
663 /* The escape character string must consist of a single UTF-8 character.
664 ** Otherwise, return an error.
665 */
666 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000667 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000668 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000669 sqlite3_result_error(context,
670 "ESCAPE expression must be a single character", -1);
671 return;
672 }
drh769e97e2009-04-01 16:33:37 +0000673 escape = sqlite3Utf8Read(zEsc, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000674 }
danielk19773f6b0872004-06-17 05:36:44 +0000675 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000676 struct compareInfo *pInfo = sqlite3_user_data(context);
677#ifdef SQLITE_TEST
678 sqlite3_like_count++;
679#endif
drhbeb818d2007-05-08 15:34:47 +0000680
danielk1977b56fe1f2007-05-09 08:24:44 +0000681 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000682 }
drh8912d102002-05-26 21:34:58 +0000683}
684
685/*
686** Implementation of the NULLIF(x,y) function. The result is the first
687** argument if the arguments are different. The result is NULL if the
688** arguments are equal to each other.
689*/
drhf9b596e2004-05-26 16:54:42 +0000690static void nullifFunc(
691 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000692 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +0000693 sqlite3_value **argv
694){
danielk1977dc1bdc42004-06-11 10:51:27 +0000695 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk197762c14b32008-11-19 09:05:26 +0000696 UNUSED_PARAMETER(NotUsed);
danielk1977dc1bdc42004-06-11 10:51:27 +0000697 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000698 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000699 }
drh0ac65892002-04-20 14:24:41 +0000700}
701
drh647cb0e2002-11-04 19:32:25 +0000702/*
drh47baebc2009-08-14 16:01:24 +0000703** Implementation of the sqlite_version() function. The result is the version
drh647cb0e2002-11-04 19:32:25 +0000704** of the SQLite library that is running.
705*/
drhf9b596e2004-05-26 16:54:42 +0000706static void versionFunc(
707 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000708 int NotUsed,
709 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000710){
danielk197762c14b32008-11-19 09:05:26 +0000711 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977d8123362004-06-12 09:25:12 +0000712 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000713}
714
drh47baebc2009-08-14 16:01:24 +0000715/*
716** Implementation of the sqlite_source_id() function. The result is a string
717** that identifies the particular version of the source code used to build
718** SQLite.
719*/
720static void sourceidFunc(
721 sqlite3_context *context,
722 int NotUsed,
723 sqlite3_value **NotUsed2
724){
725 UNUSED_PARAMETER2(NotUsed, NotUsed2);
726 sqlite3_result_text(context, SQLITE_SOURCE_ID, -1, SQLITE_STATIC);
727}
728
drh137c7282007-01-29 17:58:28 +0000729/* Array for converting from half-bytes (nybbles) into ASCII hex
730** digits. */
731static const char hexdigits[] = {
732 '0', '1', '2', '3', '4', '5', '6', '7',
733 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
734};
danielk1977d641d642004-11-18 15:44:29 +0000735
drh47394702003-08-20 01:03:33 +0000736/*
737** EXPERIMENTAL - This is not an official function. The interface may
738** change. This function may disappear. Do not write code that depends
739** on this function.
740**
741** Implementation of the QUOTE() function. This function takes a single
742** argument. If the argument is numeric, the return value is the same as
743** the argument. If the argument is NULL, the return value is the string
744** "NULL". Otherwise, the argument is enclosed in single quotes with
745** single-quote escapes.
746*/
danielk19770ae8b832004-05-25 12:05:56 +0000747static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drha0df4cc2009-02-02 17:29:59 +0000748 assert( argc==1 );
drh1d34fde2009-02-03 15:50:33 +0000749 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000750 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000751 case SQLITE_INTEGER:
752 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000753 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000754 break;
755 }
danielk19773f41e972004-06-08 00:39:01 +0000756 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000757 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000758 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000759 int nBlob = sqlite3_value_bytes(argv[0]);
760 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000761 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000762 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000763 int i;
764 for(i=0; i<nBlob; i++){
765 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
766 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
767 }
768 zText[(nBlob*2)+2] = '\'';
769 zText[(nBlob*2)+3] = '\0';
770 zText[0] = 'X';
771 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000772 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000773 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000774 }
775 break;
776 }
drh9c054832004-05-31 18:51:57 +0000777 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000778 int i,j;
779 u64 n;
drh2646da72005-12-09 20:02:05 +0000780 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000781 char *z;
782
drh7a521cf2007-04-25 18:23:52 +0000783 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000784 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000785 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000786 if( z ){
787 z[0] = '\'';
788 for(i=0, j=1; zArg[i]; i++){
789 z[j++] = zArg[i];
790 if( zArg[i]=='\'' ){
791 z[j++] = '\'';
792 }
drhf9b596e2004-05-26 16:54:42 +0000793 }
danielk1977a1644fd2007-08-29 12:31:25 +0000794 z[j++] = '\'';
795 z[j] = 0;
796 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000797 }
drha0df4cc2009-02-02 17:29:59 +0000798 break;
799 }
800 default: {
801 assert( sqlite3_value_type(argv[0])==SQLITE_NULL );
802 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
803 break;
drhf9b596e2004-05-26 16:54:42 +0000804 }
drh47394702003-08-20 01:03:33 +0000805 }
806}
807
drh137c7282007-01-29 17:58:28 +0000808/*
809** The hex() function. Interpret the argument as a blob. Return
810** a hexadecimal rendering as text.
811*/
812static void hexFunc(
813 sqlite3_context *context,
814 int argc,
815 sqlite3_value **argv
816){
817 int i, n;
818 const unsigned char *pBlob;
819 char *zHex, *z;
820 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000821 UNUSED_PARAMETER(argc);
drh1f0feef2007-05-15 13:27:07 +0000822 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000823 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000824 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000825 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000826 if( zHex ){
827 for(i=0; i<n; i++, pBlob++){
828 unsigned char c = *pBlob;
829 *(z++) = hexdigits[(c>>4)&0xf];
830 *(z++) = hexdigits[c&0xf];
831 }
832 *z = 0;
833 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000834 }
drh137c7282007-01-29 17:58:28 +0000835}
836
drh26b6d902007-03-17 13:27:54 +0000837/*
drh8cff3822007-05-02 02:08:28 +0000838** The zeroblob(N) function returns a zero-filled blob of size N bytes.
839*/
840static void zeroblobFunc(
841 sqlite3_context *context,
842 int argc,
843 sqlite3_value **argv
844){
drh98640a32007-06-07 19:08:32 +0000845 i64 n;
drh27e62db2009-04-02 10:16:17 +0000846 sqlite3 *db = sqlite3_context_db_handle(context);
drh8cff3822007-05-02 02:08:28 +0000847 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000848 UNUSED_PARAMETER(argc);
drh98640a32007-06-07 19:08:32 +0000849 n = sqlite3_value_int64(argv[0]);
drh27e62db2009-04-02 10:16:17 +0000850 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH] );
851 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
852 if( n>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drh98640a32007-06-07 19:08:32 +0000853 sqlite3_result_error_toobig(context);
854 }else{
drh1bd10f82008-12-10 21:19:56 +0000855 sqlite3_result_zeroblob(context, (int)n);
drh98640a32007-06-07 19:08:32 +0000856 }
drh8cff3822007-05-02 02:08:28 +0000857}
858
859/*
drh26b6d902007-03-17 13:27:54 +0000860** The replace() function. Three arguments are all strings: call
861** them A, B, and C. The result is also a string which is derived
862** from A by replacing every occurance of B with C. The match
863** must be exact. Collating sequences are not used.
864*/
865static void replaceFunc(
866 sqlite3_context *context,
867 int argc,
868 sqlite3_value **argv
869){
870 const unsigned char *zStr; /* The input string A */
871 const unsigned char *zPattern; /* The pattern string B */
872 const unsigned char *zRep; /* The replacement string C */
873 unsigned char *zOut; /* The output */
874 int nStr; /* Size of zStr */
875 int nPattern; /* Size of zPattern */
876 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000877 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000878 int loopLimit; /* Last zStr[] that might match zPattern[] */
879 int i, j; /* Loop counters */
880
881 assert( argc==3 );
danielk1977f3d3c272008-11-19 16:52:44 +0000882 UNUSED_PARAMETER(argc);
drh26b6d902007-03-17 13:27:54 +0000883 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000884 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000885 nStr = sqlite3_value_bytes(argv[0]);
886 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000887 zPattern = sqlite3_value_text(argv[1]);
drha605fe82009-02-01 18:08:40 +0000888 if( zPattern==0 ){
drh23336062009-02-03 13:19:12 +0000889 assert( sqlite3_value_type(argv[1])==SQLITE_NULL
890 || sqlite3_context_db_handle(context)->mallocFailed );
drha605fe82009-02-01 18:08:40 +0000891 return;
892 }
893 if( zPattern[0]==0 ){
894 assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
895 sqlite3_result_value(context, argv[0]);
896 return;
897 }
drh1f0feef2007-05-15 13:27:07 +0000898 nPattern = sqlite3_value_bytes(argv[1]);
899 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000900 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000901 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000902 nRep = sqlite3_value_bytes(argv[2]);
903 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000904 nOut = nStr + 1;
905 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +0000906 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +0000907 if( zOut==0 ){
908 return;
drh26b6d902007-03-17 13:27:54 +0000909 }
drh26b6d902007-03-17 13:27:54 +0000910 loopLimit = nStr - nPattern;
911 for(i=j=0; i<=loopLimit; i++){
912 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
913 zOut[j++] = zStr[i];
914 }else{
drh4a50aac2007-08-23 02:47:53 +0000915 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +0000916 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +0000917 nOut += nRep - nPattern;
drh27e62db2009-04-02 10:16:17 +0000918 testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
919 testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
920 if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +0000921 sqlite3_result_error_toobig(context);
drh633e6d52008-07-28 19:34:53 +0000922 sqlite3DbFree(db, zOut);
danielk197717374e82007-05-08 14:39:04 +0000923 return;
924 }
drh4a50aac2007-08-23 02:47:53 +0000925 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000926 zOut = sqlite3_realloc(zOut, (int)nOut);
927 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000928 sqlite3_result_error_nomem(context);
drh633e6d52008-07-28 19:34:53 +0000929 sqlite3DbFree(db, zOld);
drh2e6400b2007-05-08 15:46:18 +0000930 return;
931 }
drh26b6d902007-03-17 13:27:54 +0000932 memcpy(&zOut[j], zRep, nRep);
933 j += nRep;
934 i += nPattern-1;
935 }
936 }
drh2e6400b2007-05-08 15:46:18 +0000937 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000938 memcpy(&zOut[j], &zStr[i], nStr-i);
939 j += nStr - i;
940 assert( j<=nOut );
941 zOut[j] = 0;
942 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
943}
944
drh309b3382007-03-17 17:52:42 +0000945/*
946** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
947** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
948*/
949static void trimFunc(
950 sqlite3_context *context,
951 int argc,
952 sqlite3_value **argv
953){
954 const unsigned char *zIn; /* Input string */
955 const unsigned char *zCharSet; /* Set of characters to trim */
956 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +0000957 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +0000958 int i; /* Loop counter */
drh1bd10f82008-12-10 21:19:56 +0000959 unsigned char *aLen = 0; /* Length of each character in zCharSet */
960 unsigned char **azChar = 0; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000961 int nChar; /* Number of characters in zCharSet */
962
drh309b3382007-03-17 17:52:42 +0000963 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
964 return;
965 }
966 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000967 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000968 nIn = sqlite3_value_bytes(argv[0]);
969 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000970 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000971 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +0000972 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000973 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000974 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +0000975 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +0000976 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000977 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000978 return;
drhd1e3a612007-04-27 21:59:52 +0000979 }else{
980 const unsigned char *z;
981 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000982 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000983 }
984 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +0000985 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +0000986 if( azChar==0 ){
987 return;
988 }
989 aLen = (unsigned char*)&azChar[nChar];
990 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +0000991 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +0000992 SQLITE_SKIP_UTF8(z);
drh3abbd392008-12-10 23:04:13 +0000993 aLen[nChar] = (u8)(z - azChar[nChar]);
drhd1e3a612007-04-27 21:59:52 +0000994 }
995 }
drh309b3382007-03-17 17:52:42 +0000996 }
drhd1e3a612007-04-27 21:59:52 +0000997 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +0000998 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +0000999 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +00001000 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +00001001 int len = 0;
drhd1e3a612007-04-27 21:59:52 +00001002 for(i=0; i<nChar; i++){
1003 len = aLen[i];
drh27e62db2009-04-02 10:16:17 +00001004 if( len<=nIn && memcmp(zIn, azChar[i], len)==0 ) break;
drhd1e3a612007-04-27 21:59:52 +00001005 }
1006 if( i>=nChar ) break;
1007 zIn += len;
1008 nIn -= len;
drh309b3382007-03-17 17:52:42 +00001009 }
1010 }
1011 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +00001012 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +00001013 int len = 0;
drhd1e3a612007-04-27 21:59:52 +00001014 for(i=0; i<nChar; i++){
1015 len = aLen[i];
1016 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
1017 }
1018 if( i>=nChar ) break;
1019 nIn -= len;
drh309b3382007-03-17 17:52:42 +00001020 }
1021 }
drhd1e3a612007-04-27 21:59:52 +00001022 if( zCharSet ){
1023 sqlite3_free(azChar);
1024 }
drh309b3382007-03-17 17:52:42 +00001025 }
1026 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
1027}
drh26b6d902007-03-17 13:27:54 +00001028
danielk1977a4de4532008-09-02 15:44:08 +00001029
drhd24cc422003-03-27 12:51:24 +00001030#ifdef SQLITE_SOUNDEX
1031/*
1032** Compute the soundex encoding of a word.
1033*/
drh137c7282007-01-29 17:58:28 +00001034static void soundexFunc(
1035 sqlite3_context *context,
1036 int argc,
1037 sqlite3_value **argv
1038){
drhd24cc422003-03-27 12:51:24 +00001039 char zResult[8];
drh4c755c02004-08-08 20:22:17 +00001040 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +00001041 int i, j;
1042 static const unsigned char iCode[] = {
1043 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1044 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1045 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1046 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1047 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1048 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1049 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1050 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1051 };
1052 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +00001053 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +00001054 if( zIn==0 ) zIn = (u8*)"";
drhdc86e2b2009-01-24 11:30:42 +00001055 for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
drhd24cc422003-03-27 12:51:24 +00001056 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +00001057 u8 prevcode = iCode[zIn[i]&0x7f];
danielk197778ca0e72009-01-20 16:53:39 +00001058 zResult[0] = sqlite3Toupper(zIn[i]);
drhd24cc422003-03-27 12:51:24 +00001059 for(j=1; j<4 && zIn[i]; i++){
1060 int code = iCode[zIn[i]&0x7f];
1061 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +00001062 if( code!=prevcode ){
1063 prevcode = code;
1064 zResult[j++] = code + '0';
1065 }
1066 }else{
1067 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +00001068 }
1069 }
1070 while( j<4 ){
1071 zResult[j++] = '0';
1072 }
1073 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001074 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +00001075 }else{
danielk1977d8123362004-06-12 09:25:12 +00001076 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +00001077 }
1078}
1079#endif
1080
drhfdb83b22006-06-17 14:12:47 +00001081#ifndef SQLITE_OMIT_LOAD_EXTENSION
1082/*
1083** A function that loads a shared-library extension then returns NULL.
1084*/
1085static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001086 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001087 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001088 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001089 char *zErrMsg = 0;
1090
1091 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001092 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001093 }else{
1094 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001095 }
drh7a521cf2007-04-25 18:23:52 +00001096 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001097 sqlite3_result_error(context, zErrMsg, -1);
1098 sqlite3_free(zErrMsg);
1099 }
1100}
1101#endif
1102
danielk197701427a62005-01-11 13:02:33 +00001103
drh0ac65892002-04-20 14:24:41 +00001104/*
drhd3a149e2002-02-24 17:12:53 +00001105** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001106** sum() or avg() aggregate computation.
1107*/
1108typedef struct SumCtx SumCtx;
1109struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001110 double rSum; /* Floating point sum */
1111 i64 iSum; /* Integer sum */
1112 i64 cnt; /* Number of elements summed */
1113 u8 overflow; /* True if integer overflow seen */
1114 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001115};
1116
1117/*
drha97fdd32006-01-12 22:17:50 +00001118** Routines used to compute the sum, average, and total.
1119**
1120** The SUM() function follows the (broken) SQL standard which means
1121** that it returns NULL if it sums over no inputs. TOTAL returns
1122** 0.0 in that case. In addition, TOTAL always returns a float where
1123** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001124** value. TOTAL never fails, but SUM might through an exception if
1125** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001126*/
danielk19770ae8b832004-05-25 12:05:56 +00001127static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001128 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001129 int type;
drh3f219f42005-09-08 19:45:57 +00001130 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001131 UNUSED_PARAMETER(argc);
drh4f26d6c2004-05-26 23:25:30 +00001132 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001133 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001134 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001135 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001136 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001137 i64 v = sqlite3_value_int64(argv[0]);
1138 p->rSum += v;
1139 if( (p->approx|p->overflow)==0 ){
1140 i64 iNewSum = p->iSum + v;
drh1bd10f82008-12-10 21:19:56 +00001141 int s1 = (int)(p->iSum >> (sizeof(i64)*8-1));
1142 int s2 = (int)(v >> (sizeof(i64)*8-1));
1143 int s3 = (int)(iNewSum >> (sizeof(i64)*8-1));
1144 p->overflow = ((s1&s2&~s3) | (~s1&~s2&s3))?1:0;
drh8c08e862006-02-11 17:34:00 +00001145 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001146 }
1147 }else{
drh8c08e862006-02-11 17:34:00 +00001148 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001149 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001150 }
drh739105c2002-05-29 23:22:23 +00001151 }
drhdd5baa92002-02-27 19:50:59 +00001152}
danielk19770ae8b832004-05-25 12:05:56 +00001153static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001154 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001155 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001156 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001157 if( p->overflow ){
1158 sqlite3_result_error(context,"integer overflow",-1);
1159 }else if( p->approx ){
1160 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001161 }else{
drh8c08e862006-02-11 17:34:00 +00001162 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001163 }
drh3d1d95e2005-09-08 10:37:01 +00001164 }
drhdd5baa92002-02-27 19:50:59 +00001165}
danielk19770ae8b832004-05-25 12:05:56 +00001166static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001167 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001168 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001169 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001170 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001171 }
1172}
drha97fdd32006-01-12 22:17:50 +00001173static void totalFinalize(sqlite3_context *context){
1174 SumCtx *p;
1175 p = sqlite3_aggregate_context(context, 0);
shanefbd60f82009-02-04 03:59:25 +00001176 /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
1177 sqlite3_result_double(context, p ? p->rSum : (double)0);
drha97fdd32006-01-12 22:17:50 +00001178}
drhdd5baa92002-02-27 19:50:59 +00001179
1180/*
drh0bce8352002-02-28 00:41:10 +00001181** The following structure keeps track of state information for the
1182** count() aggregate function.
1183*/
1184typedef struct CountCtx CountCtx;
1185struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001186 i64 n;
drh0bce8352002-02-28 00:41:10 +00001187};
drhdd5baa92002-02-27 19:50:59 +00001188
drh0bce8352002-02-28 00:41:10 +00001189/*
1190** Routines to implement the count() aggregate function.
1191*/
danielk19770ae8b832004-05-25 12:05:56 +00001192static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001193 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001194 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001195 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001196 p->n++;
1197 }
drh2e79c3d2009-04-08 23:04:14 +00001198
drhd3264c72009-04-15 13:39:47 +00001199#ifndef SQLITE_OMIT_DEPRECATED
drh2e79c3d2009-04-08 23:04:14 +00001200 /* The sqlite3_aggregate_count() function is deprecated. But just to make
1201 ** sure it still operates correctly, verify that its count agrees with our
1202 ** internal count when using count(*) and when the total count can be
1203 ** expressed as a 32-bit integer. */
1204 assert( argc==1 || p==0 || p->n>0x7fffffff
1205 || p->n==sqlite3_aggregate_count(context) );
drhd3264c72009-04-15 13:39:47 +00001206#endif
drh0bce8352002-02-28 00:41:10 +00001207}
danielk19770ae8b832004-05-25 12:05:56 +00001208static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001209 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001210 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001211 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001212}
1213
1214/*
drh0bce8352002-02-28 00:41:10 +00001215** Routines to implement min() and max() aggregate functions.
1216*/
danielk197762c14b32008-11-19 09:05:26 +00001217static void minmaxStep(
1218 sqlite3_context *context,
1219 int NotUsed,
1220 sqlite3_value **argv
1221){
danielk197788208052004-05-25 01:13:20 +00001222 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001223 Mem *pBest;
danielk197762c14b32008-11-19 09:05:26 +00001224 UNUSED_PARAMETER(NotUsed);
drh9eb516c2004-07-18 20:52:32 +00001225
1226 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1227 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001228 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001229
danielk197788208052004-05-25 01:13:20 +00001230 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001231 int max;
1232 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001233 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001234 /* This step function is used for both the min() and max() aggregates,
1235 ** the only difference between the two being that the sense of the
1236 ** comparison is inverted. For the max() aggregate, the
1237 ** sqlite3_user_data() function returns (void *)-1. For min() it
1238 ** returns (void *)db, where db is the sqlite3* database pointer.
1239 ** Therefore the next statement sets variable 'max' to 1 for the max()
1240 ** aggregate, or 0 for min().
1241 */
drh309b3382007-03-17 17:52:42 +00001242 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001243 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001244 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001245 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001246 }
drh268380c2004-02-25 13:47:31 +00001247 }else{
drhb21c8cd2007-08-21 19:33:56 +00001248 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001249 }
1250}
danielk19770ae8b832004-05-25 12:05:56 +00001251static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001252 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001253 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1254 if( pRes ){
drhd27135a2009-04-02 13:36:37 +00001255 if( ALWAYS(pRes->flags) ){
drhabfcea22005-09-06 20:36:48 +00001256 sqlite3_result_value(context, pRes);
1257 }
1258 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001259 }
1260}
drhdd5baa92002-02-27 19:50:59 +00001261
drhb0689692007-11-01 17:38:30 +00001262/*
1263** group_concat(EXPR, ?SEPARATOR?)
1264*/
1265static void groupConcatStep(
1266 sqlite3_context *context,
1267 int argc,
1268 sqlite3_value **argv
1269){
1270 const char *zVal;
drhade86482007-11-28 22:36:40 +00001271 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001272 const char *zSep;
drh07d31172009-02-02 21:57:05 +00001273 int nVal, nSep;
1274 assert( argc==1 || argc==2 );
1275 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001276 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1277
1278 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001279 sqlite3 *db = sqlite3_context_db_handle(context);
drh8bfd7192009-06-19 16:44:41 +00001280 int firstTerm = pAccum->useMalloc==0;
drhade86482007-11-28 22:36:40 +00001281 pAccum->useMalloc = 1;
drhbb4957f2008-03-20 14:03:29 +00001282 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drh8bfd7192009-06-19 16:44:41 +00001283 if( !firstTerm ){
drh07d31172009-02-02 21:57:05 +00001284 if( argc==2 ){
1285 zSep = (char*)sqlite3_value_text(argv[1]);
1286 nSep = sqlite3_value_bytes(argv[1]);
drhb0689692007-11-01 17:38:30 +00001287 }else{
1288 zSep = ",";
drhade86482007-11-28 22:36:40 +00001289 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001290 }
drhade86482007-11-28 22:36:40 +00001291 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001292 }
drh07d31172009-02-02 21:57:05 +00001293 zVal = (char*)sqlite3_value_text(argv[0]);
1294 nVal = sqlite3_value_bytes(argv[0]);
1295 sqlite3StrAccumAppend(pAccum, zVal, nVal);
drhb0689692007-11-01 17:38:30 +00001296 }
1297}
1298static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001299 StrAccum *pAccum;
1300 pAccum = sqlite3_aggregate_context(context, 0);
1301 if( pAccum ){
1302 if( pAccum->tooBig ){
1303 sqlite3_result_error_toobig(context);
1304 }else if( pAccum->mallocFailed ){
1305 sqlite3_result_error_nomem(context);
1306 }else{
1307 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1308 sqlite3_free);
1309 }
drhb0689692007-11-01 17:38:30 +00001310 }
1311}
drh4e5ffc52004-08-31 00:52:37 +00001312
drhd3a149e2002-02-24 17:12:53 +00001313/*
drha2ed5602002-02-26 23:55:31 +00001314** This function registered all of the above C functions as SQL
1315** functions. This should be the only routine in this file with
1316** external linkage.
drhdc04c582002-02-24 01:55:15 +00001317*/
drh9bb575f2004-09-06 17:24:11 +00001318void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh1f01ec12005-02-15 21:36:18 +00001319#ifndef SQLITE_OMIT_ALTERTABLE
1320 sqlite3AlterFunctions(db);
1321#endif
danielk19771e536952007-08-16 10:09:01 +00001322 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001323 int rc = sqlite3_overload_function(db, "MATCH", 2);
1324 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1325 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001326 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001327 }
1328 }
drh55ef4d92005-08-14 01:20:37 +00001329}
1330
1331/*
1332** Set the LIKEOPT flag on the 2-argument function with the given name.
1333*/
drh1bd10f82008-12-10 21:19:56 +00001334static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
drh55ef4d92005-08-14 01:20:37 +00001335 FuncDef *pDef;
drhea678832008-12-10 19:26:22 +00001336 pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
1337 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001338 if( ALWAYS(pDef) ){
drhd64fe2f2005-08-28 17:00:23 +00001339 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001340 }
1341}
1342
1343/*
1344** Register the built-in LIKE and GLOB functions. The caseSensitive
1345** parameter determines whether or not the LIKE operator is case
1346** sensitive. GLOB is always case sensitive.
1347*/
1348void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1349 struct compareInfo *pInfo;
1350 if( caseSensitive ){
1351 pInfo = (struct compareInfo*)&likeInfoAlt;
1352 }else{
1353 pInfo = (struct compareInfo*)&likeInfoNorm;
1354 }
danielk1977717811c2009-03-27 15:26:03 +00001355 sqlite3CreateFunc(db, "like", 2, SQLITE_ANY, pInfo, likeFunc, 0, 0);
1356 sqlite3CreateFunc(db, "like", 3, SQLITE_ANY, pInfo, likeFunc, 0, 0);
1357 sqlite3CreateFunc(db, "glob", 2, SQLITE_ANY,
drh55ef4d92005-08-14 01:20:37 +00001358 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001359 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1360 setLikeOptFlag(db, "like",
1361 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001362}
1363
1364/*
1365** pExpr points to an expression which implements a function. If
1366** it is appropriate to apply the LIKE optimization to that function
1367** then set aWc[0] through aWc[2] to the wildcard characters and
1368** return TRUE. If the function is not a LIKE-style function then
1369** return FALSE.
1370*/
drhd64fe2f2005-08-28 17:00:23 +00001371int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001372 FuncDef *pDef;
danielk19776ab3a2e2009-02-19 14:39:25 +00001373 if( pExpr->op!=TK_FUNCTION
1374 || !pExpr->x.pList
1375 || pExpr->x.pList->nExpr!=2
1376 ){
drh55ef4d92005-08-14 01:20:37 +00001377 return 0;
1378 }
danielk19776ab3a2e2009-02-19 14:39:25 +00001379 assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
drh33e619f2009-05-28 01:00:55 +00001380 pDef = sqlite3FindFunction(db, pExpr->u.zToken,
1381 sqlite3Strlen30(pExpr->u.zToken),
drhb7916a72009-05-27 10:31:29 +00001382 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001383 if( NEVER(pDef==0) || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001384 return 0;
1385 }
1386
1387 /* The memcpy() statement assumes that the wildcard characters are
1388 ** the first three statements in the compareInfo structure. The
1389 ** asserts() that follow verify that assumption
1390 */
1391 memcpy(aWc, pDef->pUserData, 3);
1392 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1393 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1394 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001395 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001396 return 1;
drhdc04c582002-02-24 01:55:15 +00001397}
danielk19778c0a7912008-08-20 14:49:23 +00001398
drh70a8ca32008-08-21 18:49:27 +00001399/*
drh777c5382008-08-21 20:21:34 +00001400** All all of the FuncDef structures in the aBuiltinFunc[] array above
1401** to the global function hash table. This occurs at start-time (as
1402** a consequence of calling sqlite3_initialize()).
1403**
1404** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001405*/
1406void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001407 /*
1408 ** The following array holds FuncDef structures for all of the functions
1409 ** defined in this file.
1410 **
1411 ** The array cannot be constant since changes are made to the
1412 ** FuncDef.pHash elements at start-time. The elements of this array
1413 ** are read-only after initialization is complete.
1414 */
1415 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1416 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1417 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1418 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1419 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1420 FUNCTION(trim, 1, 3, 0, trimFunc ),
1421 FUNCTION(trim, 2, 3, 0, trimFunc ),
1422 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1423 FUNCTION(min, 0, 0, 1, 0 ),
1424 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1425 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1426 FUNCTION(max, 0, 1, 1, 0 ),
1427 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1428 FUNCTION(typeof, 1, 0, 0, typeofFunc ),
1429 FUNCTION(length, 1, 0, 0, lengthFunc ),
1430 FUNCTION(substr, 2, 0, 0, substrFunc ),
1431 FUNCTION(substr, 3, 0, 0, substrFunc ),
1432 FUNCTION(abs, 1, 0, 0, absFunc ),
shanefbd60f82009-02-04 03:59:25 +00001433#ifndef SQLITE_OMIT_FLOATING_POINT
danielk197793ce7412008-09-01 19:14:02 +00001434 FUNCTION(round, 1, 0, 0, roundFunc ),
1435 FUNCTION(round, 2, 0, 0, roundFunc ),
shanefbd60f82009-02-04 03:59:25 +00001436#endif
danielk197793ce7412008-09-01 19:14:02 +00001437 FUNCTION(upper, 1, 0, 0, upperFunc ),
1438 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1439 FUNCTION(coalesce, 1, 0, 0, 0 ),
1440 FUNCTION(coalesce, -1, 0, 0, ifnullFunc ),
1441 FUNCTION(coalesce, 0, 0, 0, 0 ),
1442 FUNCTION(hex, 1, 0, 0, hexFunc ),
1443 FUNCTION(ifnull, 2, 0, 1, ifnullFunc ),
drh9373b012009-02-02 01:50:39 +00001444 FUNCTION(random, 0, 0, 0, randomFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001445 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1446 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1447 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
drh47baebc2009-08-14 16:01:24 +00001448 FUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001449 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1450 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1451 FUNCTION(changes, 0, 0, 0, changes ),
1452 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1453 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1454 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1455 #ifdef SQLITE_SOUNDEX
1456 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1457 #endif
1458 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1459 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1460 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1461 #endif
1462 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1463 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1464 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
danielk1977a5533162009-02-24 10:01:51 +00001465 /* AGGREGATE(count, 0, 0, 0, countStep, countFinalize ), */
1466 {0,SQLITE_UTF8,SQLITE_FUNC_COUNT,0,0,0,countStep,countFinalize,"count",0},
danielk197793ce7412008-09-01 19:14:02 +00001467 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
drh07d31172009-02-02 21:57:05 +00001468 AGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize),
1469 AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize),
danielk197793ce7412008-09-01 19:14:02 +00001470
1471 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1472 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1473 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1474 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1475 #else
1476 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1477 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1478 #endif
1479 };
1480
drh70a8ca32008-08-21 18:49:27 +00001481 int i;
danielk197793ce7412008-09-01 19:14:02 +00001482 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001483 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001484
drh70a8ca32008-08-21 18:49:27 +00001485 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001486 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001487 }
drh777c5382008-08-21 20:21:34 +00001488 sqlite3RegisterDateTimeFunctions();
drh70a8ca32008-08-21 18:49:27 +00001489}