blob: 611f1e78e22f7c4db156ed7b7849c3f534d55a1c [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**
drh3abbd392008-12-10 23:04:13 +000019** $Id: func.c,v 1.209 2008/12/10 23:04:13 drh Exp $
drhdc04c582002-02-24 01:55:15 +000020*/
drhb659e9b2005-01-28 01:29:08 +000021#include "sqliteInt.h"
drhdc04c582002-02-24 01:55:15 +000022#include <ctype.h>
drhd3a149e2002-02-24 17:12:53 +000023#include <stdlib.h>
drh0bce8352002-02-28 00:41:10 +000024#include <assert.h>
danielk197788208052004-05-25 01:13:20 +000025#include "vdbeInt.h"
drh0bce8352002-02-28 00:41:10 +000026
drh55ef4d92005-08-14 01:20:37 +000027/*
28** Return the collating function associated with a function.
29*/
danielk1977dc1bdc42004-06-11 10:51:27 +000030static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
31 return context->pColl;
32}
33
drh0bce8352002-02-28 00:41:10 +000034/*
35** Implementation of the non-aggregate min() and max() functions
36*/
drhf9b596e2004-05-26 16:54:42 +000037static void minmaxFunc(
38 sqlite3_context *context,
39 int argc,
40 sqlite3_value **argv
41){
drh0bce8352002-02-28 00:41:10 +000042 int i;
drh268380c2004-02-25 13:47:31 +000043 int mask; /* 0 for min() or 0xffffffff for max() */
drhf9b596e2004-05-26 16:54:42 +000044 int iBest;
danielk1977dc1bdc42004-06-11 10:51:27 +000045 CollSeq *pColl;
drh0bce8352002-02-28 00:41:10 +000046
drh89425d52002-02-28 03:04:48 +000047 if( argc==0 ) return;
drhc44af712004-09-02 15:53:56 +000048 mask = sqlite3_user_data(context)==0 ? 0 : -1;
danielk1977dc1bdc42004-06-11 10:51:27 +000049 pColl = sqlite3GetFuncCollSeq(context);
50 assert( pColl );
danielk1977c572ef72004-05-27 09:28:41 +000051 assert( mask==-1 || mask==0 );
drhf9b596e2004-05-26 16:54:42 +000052 iBest = 0;
drh9c054832004-05-31 18:51:57 +000053 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhf9b596e2004-05-26 16:54:42 +000054 for(i=1; i<argc; i++){
drh9c054832004-05-31 18:51:57 +000055 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
danielk1977dc1bdc42004-06-11 10:51:27 +000056 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^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_NULL: z = "null"; break;
75 case SQLITE_INTEGER: z = "integer"; break;
76 case SQLITE_TEXT: z = "text"; break;
77 case SQLITE_FLOAT: z = "real"; break;
78 case SQLITE_BLOB: z = "blob"; 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;
drhf9b596e2004-05-26 16:54:42 +0000173
drh64f31512007-10-12 19:11:55 +0000174 assert( argc==3 || argc==2 );
drhf764e6f2007-05-15 01:13:47 +0000175 p0type = sqlite3_value_type(argv[0]);
176 if( p0type==SQLITE_BLOB ){
177 len = sqlite3_value_bytes(argv[0]);
178 z = sqlite3_value_blob(argv[0]);
179 if( z==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000180 assert( len==sqlite3_value_bytes(argv[0]) );
drhf764e6f2007-05-15 01:13:47 +0000181 }else{
182 z = sqlite3_value_text(argv[0]);
183 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000184 len = 0;
185 for(z2=z; *z2; len++){
186 SQLITE_SKIP_UTF8(z2);
187 }
drhf764e6f2007-05-15 01:13:47 +0000188 }
danielk197751ad0ec2004-05-24 12:39:02 +0000189 p1 = sqlite3_value_int(argv[1]);
drh64f31512007-10-12 19:11:55 +0000190 if( argc==3 ){
191 p2 = sqlite3_value_int(argv[2]);
192 }else{
drhbb4957f2008-03-20 14:03:29 +0000193 p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH];
drh64f31512007-10-12 19:11:55 +0000194 }
drh0bce8352002-02-28 00:41:10 +0000195 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000196 p1 += len;
drh653bc752002-02-28 03:31:10 +0000197 if( p1<0 ){
198 p2 += p1;
199 p1 = 0;
200 }
drh0bce8352002-02-28 00:41:10 +0000201 }else if( p1>0 ){
202 p1--;
203 }
204 if( p1+p2>len ){
205 p2 = len-p1;
206 }
drhf764e6f2007-05-15 01:13:47 +0000207 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000208 while( *z && p1 ){
209 SQLITE_SKIP_UTF8(z);
210 p1--;
drhf764e6f2007-05-15 01:13:47 +0000211 }
drh4a919112007-05-15 11:55:09 +0000212 for(z2=z; *z2 && p2; p2--){
213 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000214 }
drh1bd10f82008-12-10 21:19:56 +0000215 sqlite3_result_text(context, (char*)z, (int)(z2-z), SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000216 }else{
217 if( p2<0 ) p2 = 0;
drh1bd10f82008-12-10 21:19:56 +0000218 sqlite3_result_blob(context, (char*)&z[p1], (int)p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000219 }
drh0bce8352002-02-28 00:41:10 +0000220}
221
222/*
223** Implementation of the round() function
224*/
danielk19770ae8b832004-05-25 12:05:56 +0000225static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000226 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000227 double r;
drh592ac8c2005-08-13 03:07:47 +0000228 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000229 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000230 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000231 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000232 n = sqlite3_value_int(argv[1]);
233 if( n>30 ) n = 30;
234 if( n<0 ) n = 0;
235 }
drhd589a922006-03-02 03:02:48 +0000236 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000237 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000238 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000239 sqlite3AtoF(zBuf, &r);
240 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000241}
drhdc04c582002-02-24 01:55:15 +0000242
danielk197726783a52007-08-29 14:06:22 +0000243/*
244** Allocate nByte bytes of space using sqlite3_malloc(). If the
245** allocation fails, call sqlite3_result_error_nomem() to notify
246** the database handle that malloc() has failed.
247*/
drhb1a6c3c2008-03-20 16:30:17 +0000248static void *contextMalloc(sqlite3_context *context, i64 nByte){
drhbb4957f2008-03-20 14:03:29 +0000249 char *z;
250 if( nByte>sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH] ){
251 sqlite3_result_error_toobig(context);
252 z = 0;
253 }else{
drh1bd10f82008-12-10 21:19:56 +0000254 z = sqlite3Malloc((int)nByte);
drhbb4957f2008-03-20 14:03:29 +0000255 if( !z && nByte>0 ){
256 sqlite3_result_error_nomem(context);
257 }
danielk1977a1644fd2007-08-29 12:31:25 +0000258 }
259 return z;
260}
261
drhdc04c582002-02-24 01:55:15 +0000262/*
263** Implementation of the upper() and lower() SQL functions.
264*/
danielk19770ae8b832004-05-25 12:05:56 +0000265static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000266 char *z1;
267 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000268 int i, n;
drh9c054832004-05-31 18:51:57 +0000269 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000270 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000271 n = sqlite3_value_bytes(argv[0]);
272 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
273 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000274 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000275 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000276 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000277 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000278 for(i=0; z1[i]; i++){
drh1bd10f82008-12-10 21:19:56 +0000279 z1[i] = (char)toupper(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000280 }
281 sqlite3_result_text(context, z1, -1, sqlite3_free);
282 }
drhdc04c582002-02-24 01:55:15 +0000283 }
284}
danielk19770ae8b832004-05-25 12:05:56 +0000285static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000286 char *z1;
287 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000288 int i, n;
drh9c054832004-05-31 18:51:57 +0000289 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000290 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000291 n = sqlite3_value_bytes(argv[0]);
292 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
293 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000294 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000295 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000296 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000297 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000298 for(i=0; z1[i]; i++){
drh1bd10f82008-12-10 21:19:56 +0000299 z1[i] = (char)tolower(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000300 }
301 sqlite3_result_text(context, z1, -1, sqlite3_free);
302 }
drhdc04c582002-02-24 01:55:15 +0000303 }
304}
305
306/*
drhfbc99082002-02-28 03:14:18 +0000307** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000308** All three do the same thing. They return the first non-NULL
309** argument.
drh3212e182002-02-28 00:46:26 +0000310*/
drhf9b596e2004-05-26 16:54:42 +0000311static void ifnullFunc(
312 sqlite3_context *context,
313 int argc,
314 sqlite3_value **argv
315){
drhfbc99082002-02-28 03:14:18 +0000316 int i;
317 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000318 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000319 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000320 break;
321 }
322 }
drh3212e182002-02-28 00:46:26 +0000323}
324
325/*
drhf9ffac92002-03-02 19:00:31 +0000326** Implementation of random(). Return a random integer.
327*/
drhf9b596e2004-05-26 16:54:42 +0000328static void randomFunc(
329 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000330 int NotUsed,
331 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000332){
drh52fc8492006-02-23 21:43:55 +0000333 sqlite_int64 r;
danielk197762c14b32008-11-19 09:05:26 +0000334 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drh2fa18682008-03-19 14:15:34 +0000335 sqlite3_randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000336 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
337 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000338 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000339}
340
341/*
drh137c7282007-01-29 17:58:28 +0000342** Implementation of randomblob(N). Return a random blob
343** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000344*/
drh137c7282007-01-29 17:58:28 +0000345static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000346 sqlite3_context *context,
347 int argc,
348 sqlite3_value **argv
349){
drh137c7282007-01-29 17:58:28 +0000350 int n;
351 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000352 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000353 UNUSED_PARAMETER(argc);
drh63cf66f2007-01-29 15:50:05 +0000354 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000355 if( n<1 ){
356 n = 1;
357 }
danielk1977a1644fd2007-08-29 12:31:25 +0000358 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000359 if( p ){
drh2fa18682008-03-19 14:15:34 +0000360 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000361 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000362 }
drh63cf66f2007-01-29 15:50:05 +0000363}
364
365/*
drh6ed41ad2002-04-06 14:10:47 +0000366** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000367** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000368*/
danielk197751ad0ec2004-05-24 12:39:02 +0000369static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000370 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000371 int NotUsed,
372 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000373){
drhfa4a4b92008-03-19 21:45:51 +0000374 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000375 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf9b596e2004-05-26 16:54:42 +0000376 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000377}
378
rdcf146a772004-02-25 22:51:06 +0000379/*
danielk1977b28af712004-06-21 06:50:26 +0000380** Implementation of the changes() SQL function. The return value is the
381** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000382*/
danielk1977b28af712004-06-21 06:50:26 +0000383static void changes(
drhf9b596e2004-05-26 16:54:42 +0000384 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000385 int NotUsed,
386 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000387){
drhfa4a4b92008-03-19 21:45:51 +0000388 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000389 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf4479502004-05-27 03:12:53 +0000390 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000391}
rdcf146a772004-02-25 22:51:06 +0000392
393/*
danielk1977b28af712004-06-21 06:50:26 +0000394** Implementation of the total_changes() SQL function. The return value is
395** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000396*/
danielk1977b28af712004-06-21 06:50:26 +0000397static void total_changes(
398 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000399 int NotUsed,
400 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000401){
drhfa4a4b92008-03-19 21:45:51 +0000402 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000403 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977b28af712004-06-21 06:50:26 +0000404 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000405}
406
drh6ed41ad2002-04-06 14:10:47 +0000407/*
drh4e5ffc52004-08-31 00:52:37 +0000408** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000409*/
drh4e5ffc52004-08-31 00:52:37 +0000410struct compareInfo {
411 u8 matchAll;
412 u8 matchOne;
413 u8 matchSet;
414 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000415};
drh55ef4d92005-08-14 01:20:37 +0000416
drhb9175ae2007-12-07 18:39:04 +0000417/*
418** For LIKE and GLOB matching on EBCDIC machines, assume that every
419** character is exactly one byte in size. Also, all characters are
420** able to participate in upper-case-to-lower-case mappings in EBCDIC
421** whereas only characters less than 0x80 do in ASCII.
422*/
423#if defined(SQLITE_EBCDIC)
424# define sqlite3Utf8Read(A,B,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000425# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000426#else
drh6ed4b782007-12-10 18:07:20 +0000427# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000428#endif
429
drh4e5ffc52004-08-31 00:52:37 +0000430static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000431/* The correct SQL-92 behavior is for the LIKE operator to ignore
432** case. Thus 'a' LIKE 'A' would be true. */
433static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
434/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
435** is case sensitive causing 'a' LIKE 'A' to be false */
436static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000437
438/*
drh4e5ffc52004-08-31 00:52:37 +0000439** Compare two UTF-8 strings for equality where the first string can
440** potentially be a "glob" expression. Return true (1) if they
441** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000442**
drh4e5ffc52004-08-31 00:52:37 +0000443** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000444**
drh4e5ffc52004-08-31 00:52:37 +0000445** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000446**
drh4e5ffc52004-08-31 00:52:37 +0000447** '?' Matches exactly one character.
448**
449** [...] Matches one character from the enclosed list of
450** characters.
451**
452** [^...] Matches one character not in the enclosed list.
453**
454** With the [...] and [^...] matching, a ']' character can be included
455** in the list by making it the first character after '[' or '^'. A
456** range of characters can be specified using '-'. Example:
457** "[a-z]" matches any single lower-case letter. To match a '-', make
458** it the last character in the list.
459**
460** This routine is usually quick, but can be N**2 in the worst case.
461**
462** Hints: to match '*' or '?', put them in "[]". Like this:
463**
464** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000465*/
danielk19777c6303c2004-11-17 16:41:29 +0000466static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000467 const u8 *zPattern, /* The glob pattern */
468 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000469 const struct compareInfo *pInfo, /* Information about how to do the compare */
470 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000471){
drh66150952007-07-23 19:12:41 +0000472 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000473 int invert;
474 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000475 u8 matchOne = pInfo->matchOne;
476 u8 matchAll = pInfo->matchAll;
477 u8 matchSet = pInfo->matchSet;
478 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000479 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000480
drh66150952007-07-23 19:12:41 +0000481 while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000482 if( !prevEscape && c==matchAll ){
drh66150952007-07-23 19:12:41 +0000483 while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll
484 || c == matchOne ){
485 if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){
486 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000487 }
danielk1977ad7dd422004-06-06 12:41:49 +0000488 }
drh66150952007-07-23 19:12:41 +0000489 if( c==0 ){
490 return 1;
491 }else if( c==esc ){
492 c = sqlite3Utf8Read(zPattern, 0, &zPattern);
493 if( c==0 ){
494 return 0;
495 }
496 }else if( c==matchSet ){
497 assert( esc==0 ); /* This is GLOB, not LIKE */
498 assert( matchSet<0x80 ); /* '[' is a single-byte character */
499 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000500 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000501 }
502 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000503 }
504 while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){
505 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000506 GlogUpperToLower(c2);
507 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000508 while( c2 != 0 && c2 != c ){
509 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh6ed4b782007-12-10 18:07:20 +0000510 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000511 }
drh66150952007-07-23 19:12:41 +0000512 }else{
513 while( c2 != 0 && c2 != c ){
514 c2 = sqlite3Utf8Read(zString, 0, &zString);
515 }
drh4e5ffc52004-08-31 00:52:37 +0000516 }
drh66150952007-07-23 19:12:41 +0000517 if( c2==0 ) return 0;
518 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
519 }
520 return 0;
521 }else if( !prevEscape && c==matchOne ){
522 if( sqlite3Utf8Read(zString, 0, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000523 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000524 }
drh4e5ffc52004-08-31 00:52:37 +0000525 }else if( c==matchSet ){
526 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000527 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000528 seen = 0;
529 invert = 0;
drh66150952007-07-23 19:12:41 +0000530 c = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000531 if( c==0 ) return 0;
drh66150952007-07-23 19:12:41 +0000532 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
533 if( c2=='^' ){
534 invert = 1;
535 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
536 }
drh4e5ffc52004-08-31 00:52:37 +0000537 if( c2==']' ){
538 if( c==']' ) seen = 1;
drh66150952007-07-23 19:12:41 +0000539 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000540 }
drh66150952007-07-23 19:12:41 +0000541 while( c2 && c2!=']' ){
542 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
543 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000544 if( c>=prior_c && c<=c2 ) seen = 1;
545 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000546 }else{
drh66150952007-07-23 19:12:41 +0000547 if( c==c2 ){
548 seen = 1;
549 }
drh4e5ffc52004-08-31 00:52:37 +0000550 prior_c = c2;
551 }
drh66150952007-07-23 19:12:41 +0000552 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000553 }
drh66150952007-07-23 19:12:41 +0000554 if( c2==0 || (seen ^ invert)==0 ){
555 return 0;
556 }
557 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000558 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000559 }else{
drh66150952007-07-23 19:12:41 +0000560 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000561 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000562 GlogUpperToLower(c);
563 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000564 }
drh66150952007-07-23 19:12:41 +0000565 if( c!=c2 ){
566 return 0;
567 }
danielk19777c6303c2004-11-17 16:41:29 +0000568 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000569 }
danielk197751ad0ec2004-05-24 12:39:02 +0000570 }
drh4e5ffc52004-08-31 00:52:37 +0000571 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000572}
drh4e5ffc52004-08-31 00:52:37 +0000573
drh55ef4d92005-08-14 01:20:37 +0000574/*
575** Count the number of times that the LIKE operator (or GLOB which is
576** just a variation of LIKE) gets called. This is used for testing
577** only.
578*/
579#ifdef SQLITE_TEST
580int sqlite3_like_count = 0;
581#endif
582
danielk19773f6b0872004-06-17 05:36:44 +0000583
584/*
585** Implementation of the like() SQL function. This function implements
586** the build-in LIKE operator. The first argument to the function is the
587** pattern and the second argument is the string. So, the SQL statements:
588**
589** A LIKE B
590**
591** is implemented as like(B,A).
592**
drh55ef4d92005-08-14 01:20:37 +0000593** This same function (with a different compareInfo structure) computes
594** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000595*/
596static void likeFunc(
597 sqlite3_context *context,
598 int argc,
599 sqlite3_value **argv
600){
drhbeb818d2007-05-08 15:34:47 +0000601 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000602 int escape = 0;
drhbb4957f2008-03-20 14:03:29 +0000603 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000604
drh1f0feef2007-05-15 13:27:07 +0000605 zB = sqlite3_value_text(argv[0]);
606 zA = sqlite3_value_text(argv[1]);
607
drhbeb818d2007-05-08 15:34:47 +0000608 /* Limit the length of the LIKE or GLOB pattern to avoid problems
609 ** of deep recursion and N*N behavior in patternCompare().
610 */
drhbb4957f2008-03-20 14:03:29 +0000611 if( sqlite3_value_bytes(argv[0]) >
612 db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000613 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
614 return;
615 }
drh1f0feef2007-05-15 13:27:07 +0000616 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000617
danielk19777c6303c2004-11-17 16:41:29 +0000618 if( argc==3 ){
619 /* The escape character string must consist of a single UTF-8 character.
620 ** Otherwise, return an error.
621 */
622 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000623 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000624 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000625 sqlite3_result_error(context,
626 "ESCAPE expression must be a single character", -1);
627 return;
628 }
drh66150952007-07-23 19:12:41 +0000629 escape = sqlite3Utf8Read(zEsc, 0, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000630 }
danielk19773f6b0872004-06-17 05:36:44 +0000631 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000632 struct compareInfo *pInfo = sqlite3_user_data(context);
633#ifdef SQLITE_TEST
634 sqlite3_like_count++;
635#endif
drhbeb818d2007-05-08 15:34:47 +0000636
danielk1977b56fe1f2007-05-09 08:24:44 +0000637 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000638 }
drh8912d102002-05-26 21:34:58 +0000639}
640
641/*
642** Implementation of the NULLIF(x,y) function. The result is the first
643** argument if the arguments are different. The result is NULL if the
644** arguments are equal to each other.
645*/
drhf9b596e2004-05-26 16:54:42 +0000646static void nullifFunc(
647 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000648 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +0000649 sqlite3_value **argv
650){
danielk1977dc1bdc42004-06-11 10:51:27 +0000651 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk197762c14b32008-11-19 09:05:26 +0000652 UNUSED_PARAMETER(NotUsed);
danielk1977dc1bdc42004-06-11 10:51:27 +0000653 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000654 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000655 }
drh0ac65892002-04-20 14:24:41 +0000656}
657
drh647cb0e2002-11-04 19:32:25 +0000658/*
659** Implementation of the VERSION(*) function. The result is the version
660** of the SQLite library that is running.
661*/
drhf9b596e2004-05-26 16:54:42 +0000662static void versionFunc(
663 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000664 int NotUsed,
665 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000666){
danielk197762c14b32008-11-19 09:05:26 +0000667 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977d8123362004-06-12 09:25:12 +0000668 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000669}
670
drh137c7282007-01-29 17:58:28 +0000671/* Array for converting from half-bytes (nybbles) into ASCII hex
672** digits. */
673static const char hexdigits[] = {
674 '0', '1', '2', '3', '4', '5', '6', '7',
675 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
676};
danielk1977d641d642004-11-18 15:44:29 +0000677
drh47394702003-08-20 01:03:33 +0000678/*
679** EXPERIMENTAL - This is not an official function. The interface may
680** change. This function may disappear. Do not write code that depends
681** on this function.
682**
683** Implementation of the QUOTE() function. This function takes a single
684** argument. If the argument is numeric, the return value is the same as
685** the argument. If the argument is NULL, the return value is the string
686** "NULL". Otherwise, the argument is enclosed in single quotes with
687** single-quote escapes.
688*/
danielk19770ae8b832004-05-25 12:05:56 +0000689static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000690 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000691 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000692 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000693 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000694 break;
drh47394702003-08-20 01:03:33 +0000695 }
drh9c054832004-05-31 18:51:57 +0000696 case SQLITE_INTEGER:
697 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000698 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000699 break;
700 }
danielk19773f41e972004-06-08 00:39:01 +0000701 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000702 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000703 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000704 int nBlob = sqlite3_value_bytes(argv[0]);
705 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000706 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000707 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000708 int i;
709 for(i=0; i<nBlob; i++){
710 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
711 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
712 }
713 zText[(nBlob*2)+2] = '\'';
714 zText[(nBlob*2)+3] = '\0';
715 zText[0] = 'X';
716 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000717 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000718 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000719 }
720 break;
721 }
drh9c054832004-05-31 18:51:57 +0000722 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000723 int i,j;
724 u64 n;
drh2646da72005-12-09 20:02:05 +0000725 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000726 char *z;
727
drh7a521cf2007-04-25 18:23:52 +0000728 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000729 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000730 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000731 if( z ){
732 z[0] = '\'';
733 for(i=0, j=1; zArg[i]; i++){
734 z[j++] = zArg[i];
735 if( zArg[i]=='\'' ){
736 z[j++] = '\'';
737 }
drhf9b596e2004-05-26 16:54:42 +0000738 }
danielk1977a1644fd2007-08-29 12:31:25 +0000739 z[j++] = '\'';
740 z[j] = 0;
741 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000742 }
drhf9b596e2004-05-26 16:54:42 +0000743 }
drh47394702003-08-20 01:03:33 +0000744 }
745}
746
drh137c7282007-01-29 17:58:28 +0000747/*
748** The hex() function. Interpret the argument as a blob. Return
749** a hexadecimal rendering as text.
750*/
751static void hexFunc(
752 sqlite3_context *context,
753 int argc,
754 sqlite3_value **argv
755){
756 int i, n;
757 const unsigned char *pBlob;
758 char *zHex, *z;
759 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000760 UNUSED_PARAMETER(argc);
drh1f0feef2007-05-15 13:27:07 +0000761 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000762 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000763 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000764 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000765 if( zHex ){
766 for(i=0; i<n; i++, pBlob++){
767 unsigned char c = *pBlob;
768 *(z++) = hexdigits[(c>>4)&0xf];
769 *(z++) = hexdigits[c&0xf];
770 }
771 *z = 0;
772 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000773 }
drh137c7282007-01-29 17:58:28 +0000774}
775
drh26b6d902007-03-17 13:27:54 +0000776/*
drh8cff3822007-05-02 02:08:28 +0000777** The zeroblob(N) function returns a zero-filled blob of size N bytes.
778*/
779static void zeroblobFunc(
780 sqlite3_context *context,
781 int argc,
782 sqlite3_value **argv
783){
drh98640a32007-06-07 19:08:32 +0000784 i64 n;
drh8cff3822007-05-02 02:08:28 +0000785 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000786 UNUSED_PARAMETER(argc);
drh98640a32007-06-07 19:08:32 +0000787 n = sqlite3_value_int64(argv[0]);
788 if( n>SQLITE_MAX_LENGTH ){
789 sqlite3_result_error_toobig(context);
790 }else{
drh1bd10f82008-12-10 21:19:56 +0000791 sqlite3_result_zeroblob(context, (int)n);
drh98640a32007-06-07 19:08:32 +0000792 }
drh8cff3822007-05-02 02:08:28 +0000793}
794
795/*
drh26b6d902007-03-17 13:27:54 +0000796** The replace() function. Three arguments are all strings: call
797** them A, B, and C. The result is also a string which is derived
798** from A by replacing every occurance of B with C. The match
799** must be exact. Collating sequences are not used.
800*/
801static void replaceFunc(
802 sqlite3_context *context,
803 int argc,
804 sqlite3_value **argv
805){
806 const unsigned char *zStr; /* The input string A */
807 const unsigned char *zPattern; /* The pattern string B */
808 const unsigned char *zRep; /* The replacement string C */
809 unsigned char *zOut; /* The output */
810 int nStr; /* Size of zStr */
811 int nPattern; /* Size of zPattern */
812 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000813 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000814 int loopLimit; /* Last zStr[] that might match zPattern[] */
815 int i, j; /* Loop counters */
816
817 assert( argc==3 );
danielk1977f3d3c272008-11-19 16:52:44 +0000818 UNUSED_PARAMETER(argc);
drh26b6d902007-03-17 13:27:54 +0000819 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000820 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000821 nStr = sqlite3_value_bytes(argv[0]);
822 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000823 zPattern = sqlite3_value_text(argv[1]);
drh709cff32007-04-27 01:18:02 +0000824 if( zPattern==0 || zPattern[0]==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000825 nPattern = sqlite3_value_bytes(argv[1]);
826 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000827 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000828 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000829 nRep = sqlite3_value_bytes(argv[2]);
830 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000831 nOut = nStr + 1;
832 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +0000833 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +0000834 if( zOut==0 ){
835 return;
drh26b6d902007-03-17 13:27:54 +0000836 }
drh26b6d902007-03-17 13:27:54 +0000837 loopLimit = nStr - nPattern;
838 for(i=j=0; i<=loopLimit; i++){
839 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
840 zOut[j++] = zStr[i];
841 }else{
drh4a50aac2007-08-23 02:47:53 +0000842 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +0000843 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +0000844 nOut += nRep - nPattern;
drhbb4957f2008-03-20 14:03:29 +0000845 if( nOut>=db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +0000846 sqlite3_result_error_toobig(context);
drh633e6d52008-07-28 19:34:53 +0000847 sqlite3DbFree(db, zOut);
danielk197717374e82007-05-08 14:39:04 +0000848 return;
849 }
drh4a50aac2007-08-23 02:47:53 +0000850 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000851 zOut = sqlite3_realloc(zOut, (int)nOut);
852 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000853 sqlite3_result_error_nomem(context);
drh633e6d52008-07-28 19:34:53 +0000854 sqlite3DbFree(db, zOld);
drh2e6400b2007-05-08 15:46:18 +0000855 return;
856 }
drh26b6d902007-03-17 13:27:54 +0000857 memcpy(&zOut[j], zRep, nRep);
858 j += nRep;
859 i += nPattern-1;
860 }
861 }
drh2e6400b2007-05-08 15:46:18 +0000862 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000863 memcpy(&zOut[j], &zStr[i], nStr-i);
864 j += nStr - i;
865 assert( j<=nOut );
866 zOut[j] = 0;
867 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
868}
869
drh309b3382007-03-17 17:52:42 +0000870/*
871** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
872** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
873*/
874static void trimFunc(
875 sqlite3_context *context,
876 int argc,
877 sqlite3_value **argv
878){
879 const unsigned char *zIn; /* Input string */
880 const unsigned char *zCharSet; /* Set of characters to trim */
881 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +0000882 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +0000883 int i; /* Loop counter */
drh1bd10f82008-12-10 21:19:56 +0000884 unsigned char *aLen = 0; /* Length of each character in zCharSet */
885 unsigned char **azChar = 0; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000886 int nChar; /* Number of characters in zCharSet */
887
drh309b3382007-03-17 17:52:42 +0000888 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
889 return;
890 }
891 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000892 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000893 nIn = sqlite3_value_bytes(argv[0]);
894 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000895 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000896 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +0000897 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000898 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000899 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +0000900 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +0000901 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000902 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000903 return;
drhd1e3a612007-04-27 21:59:52 +0000904 }else{
905 const unsigned char *z;
906 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000907 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000908 }
909 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +0000910 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +0000911 if( azChar==0 ){
912 return;
913 }
914 aLen = (unsigned char*)&azChar[nChar];
915 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +0000916 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +0000917 SQLITE_SKIP_UTF8(z);
drh3abbd392008-12-10 23:04:13 +0000918 aLen[nChar] = (u8)(z - azChar[nChar]);
drhd1e3a612007-04-27 21:59:52 +0000919 }
920 }
drh309b3382007-03-17 17:52:42 +0000921 }
drhd1e3a612007-04-27 21:59:52 +0000922 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +0000923 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +0000924 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000925 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +0000926 int len = 0;
drhd1e3a612007-04-27 21:59:52 +0000927 for(i=0; i<nChar; i++){
928 len = aLen[i];
929 if( memcmp(zIn, azChar[i], len)==0 ) break;
930 }
931 if( i>=nChar ) break;
932 zIn += len;
933 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000934 }
935 }
936 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000937 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +0000938 int len = 0;
drhd1e3a612007-04-27 21:59:52 +0000939 for(i=0; i<nChar; i++){
940 len = aLen[i];
941 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
942 }
943 if( i>=nChar ) break;
944 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000945 }
946 }
drhd1e3a612007-04-27 21:59:52 +0000947 if( zCharSet ){
948 sqlite3_free(azChar);
949 }
drh309b3382007-03-17 17:52:42 +0000950 }
951 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
952}
drh26b6d902007-03-17 13:27:54 +0000953
danielk1977a4de4532008-09-02 15:44:08 +0000954
drhd24cc422003-03-27 12:51:24 +0000955#ifdef SQLITE_SOUNDEX
956/*
957** Compute the soundex encoding of a word.
958*/
drh137c7282007-01-29 17:58:28 +0000959static void soundexFunc(
960 sqlite3_context *context,
961 int argc,
962 sqlite3_value **argv
963){
drhd24cc422003-03-27 12:51:24 +0000964 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000965 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000966 int i, j;
967 static const unsigned char iCode[] = {
968 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
969 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
970 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
971 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
972 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
973 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
974 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
975 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
976 };
977 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000978 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000979 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000980 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
981 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000982 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000983 zResult[0] = toupper(zIn[i]);
984 for(j=1; j<4 && zIn[i]; i++){
985 int code = iCode[zIn[i]&0x7f];
986 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000987 if( code!=prevcode ){
988 prevcode = code;
989 zResult[j++] = code + '0';
990 }
991 }else{
992 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000993 }
994 }
995 while( j<4 ){
996 zResult[j++] = '0';
997 }
998 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000999 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +00001000 }else{
danielk1977d8123362004-06-12 09:25:12 +00001001 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +00001002 }
1003}
1004#endif
1005
drhfdb83b22006-06-17 14:12:47 +00001006#ifndef SQLITE_OMIT_LOAD_EXTENSION
1007/*
1008** A function that loads a shared-library extension then returns NULL.
1009*/
1010static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001011 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001012 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001013 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001014 char *zErrMsg = 0;
1015
1016 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001017 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001018 }else{
1019 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001020 }
drh7a521cf2007-04-25 18:23:52 +00001021 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001022 sqlite3_result_error(context, zErrMsg, -1);
1023 sqlite3_free(zErrMsg);
1024 }
1025}
1026#endif
1027
danielk197701427a62005-01-11 13:02:33 +00001028
drh0ac65892002-04-20 14:24:41 +00001029/*
drhd3a149e2002-02-24 17:12:53 +00001030** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001031** sum() or avg() aggregate computation.
1032*/
1033typedef struct SumCtx SumCtx;
1034struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001035 double rSum; /* Floating point sum */
1036 i64 iSum; /* Integer sum */
1037 i64 cnt; /* Number of elements summed */
1038 u8 overflow; /* True if integer overflow seen */
1039 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001040};
1041
1042/*
drha97fdd32006-01-12 22:17:50 +00001043** Routines used to compute the sum, average, and total.
1044**
1045** The SUM() function follows the (broken) SQL standard which means
1046** that it returns NULL if it sums over no inputs. TOTAL returns
1047** 0.0 in that case. In addition, TOTAL always returns a float where
1048** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001049** value. TOTAL never fails, but SUM might through an exception if
1050** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001051*/
danielk19770ae8b832004-05-25 12:05:56 +00001052static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001053 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001054 int type;
drh3f219f42005-09-08 19:45:57 +00001055 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001056 UNUSED_PARAMETER(argc);
drh4f26d6c2004-05-26 23:25:30 +00001057 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001058 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001059 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001060 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001061 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001062 i64 v = sqlite3_value_int64(argv[0]);
1063 p->rSum += v;
1064 if( (p->approx|p->overflow)==0 ){
1065 i64 iNewSum = p->iSum + v;
drh1bd10f82008-12-10 21:19:56 +00001066 int s1 = (int)(p->iSum >> (sizeof(i64)*8-1));
1067 int s2 = (int)(v >> (sizeof(i64)*8-1));
1068 int s3 = (int)(iNewSum >> (sizeof(i64)*8-1));
1069 p->overflow = ((s1&s2&~s3) | (~s1&~s2&s3))?1:0;
drh8c08e862006-02-11 17:34:00 +00001070 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001071 }
1072 }else{
drh8c08e862006-02-11 17:34:00 +00001073 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001074 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001075 }
drh739105c2002-05-29 23:22:23 +00001076 }
drhdd5baa92002-02-27 19:50:59 +00001077}
danielk19770ae8b832004-05-25 12:05:56 +00001078static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001079 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001080 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001081 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001082 if( p->overflow ){
1083 sqlite3_result_error(context,"integer overflow",-1);
1084 }else if( p->approx ){
1085 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001086 }else{
drh8c08e862006-02-11 17:34:00 +00001087 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001088 }
drh3d1d95e2005-09-08 10:37:01 +00001089 }
drhdd5baa92002-02-27 19:50:59 +00001090}
danielk19770ae8b832004-05-25 12:05:56 +00001091static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001092 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001093 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001094 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001095 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001096 }
1097}
drha97fdd32006-01-12 22:17:50 +00001098static void totalFinalize(sqlite3_context *context){
1099 SumCtx *p;
1100 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001101 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001102}
drhdd5baa92002-02-27 19:50:59 +00001103
1104/*
drh0bce8352002-02-28 00:41:10 +00001105** The following structure keeps track of state information for the
1106** count() aggregate function.
1107*/
1108typedef struct CountCtx CountCtx;
1109struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001110 i64 n;
drh0bce8352002-02-28 00:41:10 +00001111};
drhdd5baa92002-02-27 19:50:59 +00001112
drh0bce8352002-02-28 00:41:10 +00001113/*
1114** Routines to implement the count() aggregate function.
1115*/
danielk19770ae8b832004-05-25 12:05:56 +00001116static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001117 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001118 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001119 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001120 p->n++;
1121 }
1122}
danielk19770ae8b832004-05-25 12:05:56 +00001123static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001124 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001125 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001126 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001127}
1128
1129/*
drh0bce8352002-02-28 00:41:10 +00001130** Routines to implement min() and max() aggregate functions.
1131*/
danielk197762c14b32008-11-19 09:05:26 +00001132static void minmaxStep(
1133 sqlite3_context *context,
1134 int NotUsed,
1135 sqlite3_value **argv
1136){
danielk197788208052004-05-25 01:13:20 +00001137 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001138 Mem *pBest;
danielk197762c14b32008-11-19 09:05:26 +00001139 UNUSED_PARAMETER(NotUsed);
drh9eb516c2004-07-18 20:52:32 +00001140
1141 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1142 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001143 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001144
danielk197788208052004-05-25 01:13:20 +00001145 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001146 int max;
1147 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001148 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001149 /* This step function is used for both the min() and max() aggregates,
1150 ** the only difference between the two being that the sense of the
1151 ** comparison is inverted. For the max() aggregate, the
1152 ** sqlite3_user_data() function returns (void *)-1. For min() it
1153 ** returns (void *)db, where db is the sqlite3* database pointer.
1154 ** Therefore the next statement sets variable 'max' to 1 for the max()
1155 ** aggregate, or 0 for min().
1156 */
drh309b3382007-03-17 17:52:42 +00001157 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001158 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001159 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001160 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001161 }
drh268380c2004-02-25 13:47:31 +00001162 }else{
drhb21c8cd2007-08-21 19:33:56 +00001163 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001164 }
1165}
danielk19770ae8b832004-05-25 12:05:56 +00001166static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001167 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001168 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1169 if( pRes ){
1170 if( pRes->flags ){
1171 sqlite3_result_value(context, pRes);
1172 }
1173 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001174 }
1175}
drhdd5baa92002-02-27 19:50:59 +00001176
drhb0689692007-11-01 17:38:30 +00001177/*
1178** group_concat(EXPR, ?SEPARATOR?)
1179*/
1180static void groupConcatStep(
1181 sqlite3_context *context,
1182 int argc,
1183 sqlite3_value **argv
1184){
1185 const char *zVal;
drhade86482007-11-28 22:36:40 +00001186 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001187 const char *zSep;
drha2baf3a2008-06-18 15:34:09 +00001188 int nVal, nSep, i;
1189 if( argc==0 || sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001190 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1191
1192 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001193 sqlite3 *db = sqlite3_context_db_handle(context);
drhade86482007-11-28 22:36:40 +00001194 pAccum->useMalloc = 1;
drhbb4957f2008-03-20 14:03:29 +00001195 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drhade86482007-11-28 22:36:40 +00001196 if( pAccum->nChar ){
drha2baf3a2008-06-18 15:34:09 +00001197 if( argc>1 ){
1198 zSep = (char*)sqlite3_value_text(argv[argc-1]);
1199 nSep = sqlite3_value_bytes(argv[argc-1]);
drhb0689692007-11-01 17:38:30 +00001200 }else{
1201 zSep = ",";
drhade86482007-11-28 22:36:40 +00001202 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001203 }
drhade86482007-11-28 22:36:40 +00001204 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001205 }
drha2baf3a2008-06-18 15:34:09 +00001206 i = 0;
1207 do{
1208 zVal = (char*)sqlite3_value_text(argv[i]);
1209 nVal = sqlite3_value_bytes(argv[i]);
1210 sqlite3StrAccumAppend(pAccum, zVal, nVal);
1211 i++;
1212 }while( i<argc-1 );
drhb0689692007-11-01 17:38:30 +00001213 }
1214}
1215static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001216 StrAccum *pAccum;
1217 pAccum = sqlite3_aggregate_context(context, 0);
1218 if( pAccum ){
1219 if( pAccum->tooBig ){
1220 sqlite3_result_error_toobig(context);
1221 }else if( pAccum->mallocFailed ){
1222 sqlite3_result_error_nomem(context);
1223 }else{
1224 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1225 sqlite3_free);
1226 }
drhb0689692007-11-01 17:38:30 +00001227 }
1228}
drh4e5ffc52004-08-31 00:52:37 +00001229
drhd3a149e2002-02-24 17:12:53 +00001230/*
drha2ed5602002-02-26 23:55:31 +00001231** This function registered all of the above C functions as SQL
1232** functions. This should be the only routine in this file with
1233** external linkage.
drhdc04c582002-02-24 01:55:15 +00001234*/
drh9bb575f2004-09-06 17:24:11 +00001235void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh1f01ec12005-02-15 21:36:18 +00001236#ifndef SQLITE_OMIT_ALTERTABLE
1237 sqlite3AlterFunctions(db);
1238#endif
danielk19771e536952007-08-16 10:09:01 +00001239 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001240 int rc = sqlite3_overload_function(db, "MATCH", 2);
1241 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1242 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001243 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001244 }
1245 }
danielk1977fd9e1f32005-05-22 10:44:34 +00001246#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001247 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001248#endif
drh55ef4d92005-08-14 01:20:37 +00001249}
1250
1251/*
1252** Set the LIKEOPT flag on the 2-argument function with the given name.
1253*/
drh1bd10f82008-12-10 21:19:56 +00001254static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
drh55ef4d92005-08-14 01:20:37 +00001255 FuncDef *pDef;
drhea678832008-12-10 19:26:22 +00001256 pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
1257 2, SQLITE_UTF8, 0);
drh55ef4d92005-08-14 01:20:37 +00001258 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001259 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001260 }
1261}
1262
1263/*
1264** Register the built-in LIKE and GLOB functions. The caseSensitive
1265** parameter determines whether or not the LIKE operator is case
1266** sensitive. GLOB is always case sensitive.
1267*/
1268void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1269 struct compareInfo *pInfo;
1270 if( caseSensitive ){
1271 pInfo = (struct compareInfo*)&likeInfoAlt;
1272 }else{
1273 pInfo = (struct compareInfo*)&likeInfoNorm;
1274 }
danielk1977771151b2006-01-17 13:21:40 +00001275 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1276 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1277 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001278 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001279 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1280 setLikeOptFlag(db, "like",
1281 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001282}
1283
1284/*
1285** pExpr points to an expression which implements a function. If
1286** it is appropriate to apply the LIKE optimization to that function
1287** then set aWc[0] through aWc[2] to the wildcard characters and
1288** return TRUE. If the function is not a LIKE-style function then
1289** return FALSE.
1290*/
drhd64fe2f2005-08-28 17:00:23 +00001291int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001292 FuncDef *pDef;
danielk1977cdbd8ef2007-05-12 06:11:12 +00001293 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
drh55ef4d92005-08-14 01:20:37 +00001294 return 0;
1295 }
1296 if( pExpr->pList->nExpr!=2 ){
1297 return 0;
1298 }
drh2646da72005-12-09 20:02:05 +00001299 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001300 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001301 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001302 return 0;
1303 }
1304
1305 /* The memcpy() statement assumes that the wildcard characters are
1306 ** the first three statements in the compareInfo structure. The
1307 ** asserts() that follow verify that assumption
1308 */
1309 memcpy(aWc, pDef->pUserData, 3);
1310 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1311 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1312 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001313 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001314 return 1;
drhdc04c582002-02-24 01:55:15 +00001315}
danielk19778c0a7912008-08-20 14:49:23 +00001316
drh70a8ca32008-08-21 18:49:27 +00001317/*
drh777c5382008-08-21 20:21:34 +00001318** All all of the FuncDef structures in the aBuiltinFunc[] array above
1319** to the global function hash table. This occurs at start-time (as
1320** a consequence of calling sqlite3_initialize()).
1321**
1322** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001323*/
1324void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001325 /*
1326 ** The following array holds FuncDef structures for all of the functions
1327 ** defined in this file.
1328 **
1329 ** The array cannot be constant since changes are made to the
1330 ** FuncDef.pHash elements at start-time. The elements of this array
1331 ** are read-only after initialization is complete.
1332 */
1333 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1334 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1335 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1336 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1337 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1338 FUNCTION(trim, 1, 3, 0, trimFunc ),
1339 FUNCTION(trim, 2, 3, 0, trimFunc ),
1340 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1341 FUNCTION(min, 0, 0, 1, 0 ),
1342 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1343 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1344 FUNCTION(max, 0, 1, 1, 0 ),
1345 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1346 FUNCTION(typeof, 1, 0, 0, typeofFunc ),
1347 FUNCTION(length, 1, 0, 0, lengthFunc ),
1348 FUNCTION(substr, 2, 0, 0, substrFunc ),
1349 FUNCTION(substr, 3, 0, 0, substrFunc ),
1350 FUNCTION(abs, 1, 0, 0, absFunc ),
1351 FUNCTION(round, 1, 0, 0, roundFunc ),
1352 FUNCTION(round, 2, 0, 0, roundFunc ),
1353 FUNCTION(upper, 1, 0, 0, upperFunc ),
1354 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1355 FUNCTION(coalesce, 1, 0, 0, 0 ),
1356 FUNCTION(coalesce, -1, 0, 0, ifnullFunc ),
1357 FUNCTION(coalesce, 0, 0, 0, 0 ),
1358 FUNCTION(hex, 1, 0, 0, hexFunc ),
1359 FUNCTION(ifnull, 2, 0, 1, ifnullFunc ),
1360 FUNCTION(random, -1, 0, 0, randomFunc ),
1361 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1362 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1363 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
1364 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1365 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1366 FUNCTION(changes, 0, 0, 0, changes ),
1367 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1368 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1369 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1370 #ifdef SQLITE_SOUNDEX
1371 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1372 #endif
1373 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1374 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1375 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1376 #endif
1377 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1378 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1379 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
1380 AGGREGATE(count, 0, 0, 0, countStep, countFinalize ),
1381 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
1382 AGGREGATE(group_concat, -1, 0, 0, groupConcatStep, groupConcatFinalize),
1383
1384 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1385 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1386 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1387 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1388 #else
1389 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1390 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1391 #endif
1392 };
1393
drh70a8ca32008-08-21 18:49:27 +00001394 int i;
danielk197793ce7412008-09-01 19:14:02 +00001395 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001396 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001397
drh70a8ca32008-08-21 18:49:27 +00001398 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001399 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001400 }
drh777c5382008-08-21 20:21:34 +00001401 sqlite3RegisterDateTimeFunctions();
drh70a8ca32008-08-21 18:49:27 +00001402}