blob: 975f7dc811fe37240b47169829639ce007b13072 [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**
danielk19778c0a7912008-08-20 14:49:23 +000019** $Id: func.c,v 1.197 2008/08/20 14:49:24 danielk1977 Exp $
drhdc04c582002-02-24 01:55:15 +000020*/
danielk19778c0a7912008-08-20 14:49:23 +000021
22#ifndef CREATE_BUILTIN_HASHTABLE
23
drhb659e9b2005-01-28 01:29:08 +000024#include "sqliteInt.h"
drhdc04c582002-02-24 01:55:15 +000025#include <ctype.h>
drhd3a149e2002-02-24 17:12:53 +000026#include <stdlib.h>
drh0bce8352002-02-28 00:41:10 +000027#include <assert.h>
danielk197788208052004-05-25 01:13:20 +000028#include "vdbeInt.h"
drh0bce8352002-02-28 00:41:10 +000029
drh55ef4d92005-08-14 01:20:37 +000030/*
31** Return the collating function associated with a function.
32*/
danielk1977dc1bdc42004-06-11 10:51:27 +000033static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
34 return context->pColl;
35}
36
drh0bce8352002-02-28 00:41:10 +000037/*
38** Implementation of the non-aggregate min() and max() functions
39*/
drhf9b596e2004-05-26 16:54:42 +000040static void minmaxFunc(
41 sqlite3_context *context,
42 int argc,
43 sqlite3_value **argv
44){
drh0bce8352002-02-28 00:41:10 +000045 int i;
drh268380c2004-02-25 13:47:31 +000046 int mask; /* 0 for min() or 0xffffffff for max() */
drhf9b596e2004-05-26 16:54:42 +000047 int iBest;
danielk1977dc1bdc42004-06-11 10:51:27 +000048 CollSeq *pColl;
drh0bce8352002-02-28 00:41:10 +000049
drh89425d52002-02-28 03:04:48 +000050 if( argc==0 ) return;
drhc44af712004-09-02 15:53:56 +000051 mask = sqlite3_user_data(context)==0 ? 0 : -1;
danielk1977dc1bdc42004-06-11 10:51:27 +000052 pColl = sqlite3GetFuncCollSeq(context);
53 assert( pColl );
danielk1977c572ef72004-05-27 09:28:41 +000054 assert( mask==-1 || mask==0 );
drhf9b596e2004-05-26 16:54:42 +000055 iBest = 0;
drh9c054832004-05-31 18:51:57 +000056 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhf9b596e2004-05-26 16:54:42 +000057 for(i=1; i<argc; i++){
drh9c054832004-05-31 18:51:57 +000058 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
danielk1977dc1bdc42004-06-11 10:51:27 +000059 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
drhf9b596e2004-05-26 16:54:42 +000060 iBest = i;
drh0bce8352002-02-28 00:41:10 +000061 }
62 }
drhf4479502004-05-27 03:12:53 +000063 sqlite3_result_value(context, argv[iBest]);
drh0bce8352002-02-28 00:41:10 +000064}
drh0bce8352002-02-28 00:41:10 +000065
drh268380c2004-02-25 13:47:31 +000066/*
67** Return the type of the argument.
68*/
drhf9b596e2004-05-26 16:54:42 +000069static void typeofFunc(
70 sqlite3_context *context,
71 int argc,
72 sqlite3_value **argv
73){
danielk197735bb9d02004-05-24 12:55:54 +000074 const char *z = 0;
danielk197735bb9d02004-05-24 12:55:54 +000075 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000076 case SQLITE_NULL: z = "null"; break;
77 case SQLITE_INTEGER: z = "integer"; break;
78 case SQLITE_TEXT: z = "text"; break;
79 case SQLITE_FLOAT: z = "real"; break;
80 case SQLITE_BLOB: z = "blob"; break;
danielk197735bb9d02004-05-24 12:55:54 +000081 }
danielk1977d8123362004-06-12 09:25:12 +000082 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000083}
84
drh5708d2d2005-06-22 10:53:59 +000085
86/*
drh0bce8352002-02-28 00:41:10 +000087** Implementation of the length() function
88*/
drhf9b596e2004-05-26 16:54:42 +000089static void lengthFunc(
90 sqlite3_context *context,
91 int argc,
92 sqlite3_value **argv
93){
drh0bce8352002-02-28 00:41:10 +000094 int len;
95
96 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +000097 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000098 case SQLITE_BLOB:
99 case SQLITE_INTEGER:
100 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000101 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +0000102 break;
103 }
drh9c054832004-05-31 18:51:57 +0000104 case SQLITE_TEXT: {
drh2646da72005-12-09 20:02:05 +0000105 const unsigned char *z = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000106 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000107 len = 0;
108 while( *z ){
109 len++;
110 SQLITE_SKIP_UTF8(z);
111 }
drhf4479502004-05-27 03:12:53 +0000112 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000113 break;
114 }
115 default: {
116 sqlite3_result_null(context);
117 break;
118 }
119 }
drh0bce8352002-02-28 00:41:10 +0000120}
121
122/*
123** Implementation of the abs() function
124*/
danielk19770ae8b832004-05-25 12:05:56 +0000125static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000126 assert( argc==1 );
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 }
drh4a919112007-05-15 11:55:09 +0000215 sqlite3_result_text(context, (char*)z, z2-z, SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000216 }else{
217 if( p2<0 ) p2 = 0;
218 sqlite3_result_blob(context, (char*)&z[p1], 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{
drhe5ae5732008-06-15 02:51:47 +0000254 z = sqlite3Malloc(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++){
279 z1[i] = toupper(z1[i]);
280 }
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++){
299 z1[i] = tolower(z1[i]);
300 }
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,
330 int argc,
331 sqlite3_value **argv
332){
drh52fc8492006-02-23 21:43:55 +0000333 sqlite_int64 r;
drh2fa18682008-03-19 14:15:34 +0000334 sqlite3_randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000335 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
336 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000337 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000338}
339
340/*
drh137c7282007-01-29 17:58:28 +0000341** Implementation of randomblob(N). Return a random blob
342** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000343*/
drh137c7282007-01-29 17:58:28 +0000344static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000345 sqlite3_context *context,
346 int argc,
347 sqlite3_value **argv
348){
drh137c7282007-01-29 17:58:28 +0000349 int n;
350 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000351 assert( argc==1 );
352 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000353 if( n<1 ){
354 n = 1;
355 }
danielk1977a1644fd2007-08-29 12:31:25 +0000356 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000357 if( p ){
drh2fa18682008-03-19 14:15:34 +0000358 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000359 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000360 }
drh63cf66f2007-01-29 15:50:05 +0000361}
362
363/*
drh6ed41ad2002-04-06 14:10:47 +0000364** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000365** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000366*/
danielk197751ad0ec2004-05-24 12:39:02 +0000367static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000368 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000369 int arg,
370 sqlite3_value **argv
371){
drhfa4a4b92008-03-19 21:45:51 +0000372 sqlite3 *db = sqlite3_context_db_handle(context);
drhf9b596e2004-05-26 16:54:42 +0000373 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000374}
375
rdcf146a772004-02-25 22:51:06 +0000376/*
danielk1977b28af712004-06-21 06:50:26 +0000377** Implementation of the changes() SQL function. The return value is the
378** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000379*/
danielk1977b28af712004-06-21 06:50:26 +0000380static void changes(
drhf9b596e2004-05-26 16:54:42 +0000381 sqlite3_context *context,
382 int arg,
383 sqlite3_value **argv
384){
drhfa4a4b92008-03-19 21:45:51 +0000385 sqlite3 *db = sqlite3_context_db_handle(context);
drhf4479502004-05-27 03:12:53 +0000386 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000387}
rdcf146a772004-02-25 22:51:06 +0000388
389/*
danielk1977b28af712004-06-21 06:50:26 +0000390** Implementation of the total_changes() SQL function. The return value is
391** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000392*/
danielk1977b28af712004-06-21 06:50:26 +0000393static void total_changes(
394 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000395 int arg,
396 sqlite3_value **argv
397){
drhfa4a4b92008-03-19 21:45:51 +0000398 sqlite3 *db = sqlite3_context_db_handle(context);
danielk1977b28af712004-06-21 06:50:26 +0000399 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000400}
401
drh6ed41ad2002-04-06 14:10:47 +0000402/*
drh4e5ffc52004-08-31 00:52:37 +0000403** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000404*/
drh4e5ffc52004-08-31 00:52:37 +0000405struct compareInfo {
406 u8 matchAll;
407 u8 matchOne;
408 u8 matchSet;
409 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000410};
drh55ef4d92005-08-14 01:20:37 +0000411
drhb9175ae2007-12-07 18:39:04 +0000412/*
413** For LIKE and GLOB matching on EBCDIC machines, assume that every
414** character is exactly one byte in size. Also, all characters are
415** able to participate in upper-case-to-lower-case mappings in EBCDIC
416** whereas only characters less than 0x80 do in ASCII.
417*/
418#if defined(SQLITE_EBCDIC)
419# define sqlite3Utf8Read(A,B,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000420# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000421#else
drh6ed4b782007-12-10 18:07:20 +0000422# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000423#endif
424
drh4e5ffc52004-08-31 00:52:37 +0000425static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000426/* The correct SQL-92 behavior is for the LIKE operator to ignore
427** case. Thus 'a' LIKE 'A' would be true. */
428static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
429/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
430** is case sensitive causing 'a' LIKE 'A' to be false */
431static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000432
433/*
drh4e5ffc52004-08-31 00:52:37 +0000434** Compare two UTF-8 strings for equality where the first string can
435** potentially be a "glob" expression. Return true (1) if they
436** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000437**
drh4e5ffc52004-08-31 00:52:37 +0000438** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000439**
drh4e5ffc52004-08-31 00:52:37 +0000440** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000441**
drh4e5ffc52004-08-31 00:52:37 +0000442** '?' Matches exactly one character.
443**
444** [...] Matches one character from the enclosed list of
445** characters.
446**
447** [^...] Matches one character not in the enclosed list.
448**
449** With the [...] and [^...] matching, a ']' character can be included
450** in the list by making it the first character after '[' or '^'. A
451** range of characters can be specified using '-'. Example:
452** "[a-z]" matches any single lower-case letter. To match a '-', make
453** it the last character in the list.
454**
455** This routine is usually quick, but can be N**2 in the worst case.
456**
457** Hints: to match '*' or '?', put them in "[]". Like this:
458**
459** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000460*/
danielk19777c6303c2004-11-17 16:41:29 +0000461static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000462 const u8 *zPattern, /* The glob pattern */
463 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000464 const struct compareInfo *pInfo, /* Information about how to do the compare */
465 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000466){
drh66150952007-07-23 19:12:41 +0000467 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000468 int invert;
469 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000470 u8 matchOne = pInfo->matchOne;
471 u8 matchAll = pInfo->matchAll;
472 u8 matchSet = pInfo->matchSet;
473 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000474 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000475
drh66150952007-07-23 19:12:41 +0000476 while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000477 if( !prevEscape && c==matchAll ){
drh66150952007-07-23 19:12:41 +0000478 while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll
479 || c == matchOne ){
480 if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){
481 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000482 }
danielk1977ad7dd422004-06-06 12:41:49 +0000483 }
drh66150952007-07-23 19:12:41 +0000484 if( c==0 ){
485 return 1;
486 }else if( c==esc ){
487 c = sqlite3Utf8Read(zPattern, 0, &zPattern);
488 if( c==0 ){
489 return 0;
490 }
491 }else if( c==matchSet ){
492 assert( esc==0 ); /* This is GLOB, not LIKE */
493 assert( matchSet<0x80 ); /* '[' is a single-byte character */
494 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000495 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000496 }
497 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000498 }
499 while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){
500 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000501 GlogUpperToLower(c2);
502 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000503 while( c2 != 0 && c2 != c ){
504 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh6ed4b782007-12-10 18:07:20 +0000505 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000506 }
drh66150952007-07-23 19:12:41 +0000507 }else{
508 while( c2 != 0 && c2 != c ){
509 c2 = sqlite3Utf8Read(zString, 0, &zString);
510 }
drh4e5ffc52004-08-31 00:52:37 +0000511 }
drh66150952007-07-23 19:12:41 +0000512 if( c2==0 ) return 0;
513 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
514 }
515 return 0;
516 }else if( !prevEscape && c==matchOne ){
517 if( sqlite3Utf8Read(zString, 0, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000518 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000519 }
drh4e5ffc52004-08-31 00:52:37 +0000520 }else if( c==matchSet ){
521 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000522 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000523 seen = 0;
524 invert = 0;
drh66150952007-07-23 19:12:41 +0000525 c = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000526 if( c==0 ) return 0;
drh66150952007-07-23 19:12:41 +0000527 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
528 if( c2=='^' ){
529 invert = 1;
530 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
531 }
drh4e5ffc52004-08-31 00:52:37 +0000532 if( c2==']' ){
533 if( c==']' ) seen = 1;
drh66150952007-07-23 19:12:41 +0000534 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000535 }
drh66150952007-07-23 19:12:41 +0000536 while( c2 && c2!=']' ){
537 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
538 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000539 if( c>=prior_c && c<=c2 ) seen = 1;
540 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000541 }else{
drh66150952007-07-23 19:12:41 +0000542 if( c==c2 ){
543 seen = 1;
544 }
drh4e5ffc52004-08-31 00:52:37 +0000545 prior_c = c2;
546 }
drh66150952007-07-23 19:12:41 +0000547 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000548 }
drh66150952007-07-23 19:12:41 +0000549 if( c2==0 || (seen ^ invert)==0 ){
550 return 0;
551 }
552 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000553 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000554 }else{
drh66150952007-07-23 19:12:41 +0000555 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000556 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000557 GlogUpperToLower(c);
558 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000559 }
drh66150952007-07-23 19:12:41 +0000560 if( c!=c2 ){
561 return 0;
562 }
danielk19777c6303c2004-11-17 16:41:29 +0000563 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000564 }
danielk197751ad0ec2004-05-24 12:39:02 +0000565 }
drh4e5ffc52004-08-31 00:52:37 +0000566 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000567}
drh4e5ffc52004-08-31 00:52:37 +0000568
drh55ef4d92005-08-14 01:20:37 +0000569/*
570** Count the number of times that the LIKE operator (or GLOB which is
571** just a variation of LIKE) gets called. This is used for testing
572** only.
573*/
574#ifdef SQLITE_TEST
575int sqlite3_like_count = 0;
576#endif
577
danielk19773f6b0872004-06-17 05:36:44 +0000578
579/*
580** Implementation of the like() SQL function. This function implements
581** the build-in LIKE operator. The first argument to the function is the
582** pattern and the second argument is the string. So, the SQL statements:
583**
584** A LIKE B
585**
586** is implemented as like(B,A).
587**
drh55ef4d92005-08-14 01:20:37 +0000588** This same function (with a different compareInfo structure) computes
589** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000590*/
591static void likeFunc(
592 sqlite3_context *context,
593 int argc,
594 sqlite3_value **argv
595){
drhbeb818d2007-05-08 15:34:47 +0000596 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000597 int escape = 0;
drhbb4957f2008-03-20 14:03:29 +0000598 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000599
drh1f0feef2007-05-15 13:27:07 +0000600 zB = sqlite3_value_text(argv[0]);
601 zA = sqlite3_value_text(argv[1]);
602
drhbeb818d2007-05-08 15:34:47 +0000603 /* Limit the length of the LIKE or GLOB pattern to avoid problems
604 ** of deep recursion and N*N behavior in patternCompare().
605 */
drhbb4957f2008-03-20 14:03:29 +0000606 if( sqlite3_value_bytes(argv[0]) >
607 db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000608 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
609 return;
610 }
drh1f0feef2007-05-15 13:27:07 +0000611 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000612
danielk19777c6303c2004-11-17 16:41:29 +0000613 if( argc==3 ){
614 /* The escape character string must consist of a single UTF-8 character.
615 ** Otherwise, return an error.
616 */
617 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000618 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000619 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000620 sqlite3_result_error(context,
621 "ESCAPE expression must be a single character", -1);
622 return;
623 }
drh66150952007-07-23 19:12:41 +0000624 escape = sqlite3Utf8Read(zEsc, 0, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000625 }
danielk19773f6b0872004-06-17 05:36:44 +0000626 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000627 struct compareInfo *pInfo = sqlite3_user_data(context);
628#ifdef SQLITE_TEST
629 sqlite3_like_count++;
630#endif
drhbeb818d2007-05-08 15:34:47 +0000631
danielk1977b56fe1f2007-05-09 08:24:44 +0000632 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000633 }
drh8912d102002-05-26 21:34:58 +0000634}
635
636/*
637** Implementation of the NULLIF(x,y) function. The result is the first
638** argument if the arguments are different. The result is NULL if the
639** arguments are equal to each other.
640*/
drhf9b596e2004-05-26 16:54:42 +0000641static void nullifFunc(
642 sqlite3_context *context,
643 int argc,
644 sqlite3_value **argv
645){
danielk1977dc1bdc42004-06-11 10:51:27 +0000646 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
647 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000648 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000649 }
drh0ac65892002-04-20 14:24:41 +0000650}
651
drh647cb0e2002-11-04 19:32:25 +0000652/*
653** Implementation of the VERSION(*) function. The result is the version
654** of the SQLite library that is running.
655*/
drhf9b596e2004-05-26 16:54:42 +0000656static void versionFunc(
657 sqlite3_context *context,
658 int argc,
659 sqlite3_value **argv
660){
danielk1977d8123362004-06-12 09:25:12 +0000661 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000662}
663
drh137c7282007-01-29 17:58:28 +0000664/* Array for converting from half-bytes (nybbles) into ASCII hex
665** digits. */
666static const char hexdigits[] = {
667 '0', '1', '2', '3', '4', '5', '6', '7',
668 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
669};
danielk1977d641d642004-11-18 15:44:29 +0000670
drh47394702003-08-20 01:03:33 +0000671/*
672** EXPERIMENTAL - This is not an official function. The interface may
673** change. This function may disappear. Do not write code that depends
674** on this function.
675**
676** Implementation of the QUOTE() function. This function takes a single
677** argument. If the argument is numeric, the return value is the same as
678** the argument. If the argument is NULL, the return value is the string
679** "NULL". Otherwise, the argument is enclosed in single quotes with
680** single-quote escapes.
681*/
danielk19770ae8b832004-05-25 12:05:56 +0000682static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000683 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000684 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000685 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000686 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000687 break;
drh47394702003-08-20 01:03:33 +0000688 }
drh9c054832004-05-31 18:51:57 +0000689 case SQLITE_INTEGER:
690 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000691 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000692 break;
693 }
danielk19773f41e972004-06-08 00:39:01 +0000694 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000695 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000696 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000697 int nBlob = sqlite3_value_bytes(argv[0]);
698 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000699 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000700 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000701 int i;
702 for(i=0; i<nBlob; i++){
703 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
704 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
705 }
706 zText[(nBlob*2)+2] = '\'';
707 zText[(nBlob*2)+3] = '\0';
708 zText[0] = 'X';
709 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000710 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000711 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000712 }
713 break;
714 }
drh9c054832004-05-31 18:51:57 +0000715 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000716 int i,j;
717 u64 n;
drh2646da72005-12-09 20:02:05 +0000718 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000719 char *z;
720
drh7a521cf2007-04-25 18:23:52 +0000721 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000722 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000723 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000724 if( z ){
725 z[0] = '\'';
726 for(i=0, j=1; zArg[i]; i++){
727 z[j++] = zArg[i];
728 if( zArg[i]=='\'' ){
729 z[j++] = '\'';
730 }
drhf9b596e2004-05-26 16:54:42 +0000731 }
danielk1977a1644fd2007-08-29 12:31:25 +0000732 z[j++] = '\'';
733 z[j] = 0;
734 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000735 }
drhf9b596e2004-05-26 16:54:42 +0000736 }
drh47394702003-08-20 01:03:33 +0000737 }
738}
739
drh137c7282007-01-29 17:58:28 +0000740/*
741** The hex() function. Interpret the argument as a blob. Return
742** a hexadecimal rendering as text.
743*/
744static void hexFunc(
745 sqlite3_context *context,
746 int argc,
747 sqlite3_value **argv
748){
749 int i, n;
750 const unsigned char *pBlob;
751 char *zHex, *z;
752 assert( argc==1 );
drh1f0feef2007-05-15 13:27:07 +0000753 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000754 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000755 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000756 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000757 if( zHex ){
758 for(i=0; i<n; i++, pBlob++){
759 unsigned char c = *pBlob;
760 *(z++) = hexdigits[(c>>4)&0xf];
761 *(z++) = hexdigits[c&0xf];
762 }
763 *z = 0;
764 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000765 }
drh137c7282007-01-29 17:58:28 +0000766}
767
drh26b6d902007-03-17 13:27:54 +0000768/*
drh8cff3822007-05-02 02:08:28 +0000769** The zeroblob(N) function returns a zero-filled blob of size N bytes.
770*/
771static void zeroblobFunc(
772 sqlite3_context *context,
773 int argc,
774 sqlite3_value **argv
775){
drh98640a32007-06-07 19:08:32 +0000776 i64 n;
drh8cff3822007-05-02 02:08:28 +0000777 assert( argc==1 );
drh98640a32007-06-07 19:08:32 +0000778 n = sqlite3_value_int64(argv[0]);
779 if( n>SQLITE_MAX_LENGTH ){
780 sqlite3_result_error_toobig(context);
781 }else{
782 sqlite3_result_zeroblob(context, n);
783 }
drh8cff3822007-05-02 02:08:28 +0000784}
785
786/*
drh26b6d902007-03-17 13:27:54 +0000787** The replace() function. Three arguments are all strings: call
788** them A, B, and C. The result is also a string which is derived
789** from A by replacing every occurance of B with C. The match
790** must be exact. Collating sequences are not used.
791*/
792static void replaceFunc(
793 sqlite3_context *context,
794 int argc,
795 sqlite3_value **argv
796){
797 const unsigned char *zStr; /* The input string A */
798 const unsigned char *zPattern; /* The pattern string B */
799 const unsigned char *zRep; /* The replacement string C */
800 unsigned char *zOut; /* The output */
801 int nStr; /* Size of zStr */
802 int nPattern; /* Size of zPattern */
803 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000804 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000805 int loopLimit; /* Last zStr[] that might match zPattern[] */
806 int i, j; /* Loop counters */
807
808 assert( argc==3 );
drh26b6d902007-03-17 13:27:54 +0000809 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000810 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000811 nStr = sqlite3_value_bytes(argv[0]);
812 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000813 zPattern = sqlite3_value_text(argv[1]);
drh709cff32007-04-27 01:18:02 +0000814 if( zPattern==0 || zPattern[0]==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000815 nPattern = sqlite3_value_bytes(argv[1]);
816 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000817 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000818 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000819 nRep = sqlite3_value_bytes(argv[2]);
820 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000821 nOut = nStr + 1;
822 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +0000823 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +0000824 if( zOut==0 ){
825 return;
drh26b6d902007-03-17 13:27:54 +0000826 }
drh26b6d902007-03-17 13:27:54 +0000827 loopLimit = nStr - nPattern;
828 for(i=j=0; i<=loopLimit; i++){
829 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
830 zOut[j++] = zStr[i];
831 }else{
drh4a50aac2007-08-23 02:47:53 +0000832 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +0000833 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +0000834 nOut += nRep - nPattern;
drhbb4957f2008-03-20 14:03:29 +0000835 if( nOut>=db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +0000836 sqlite3_result_error_toobig(context);
drh633e6d52008-07-28 19:34:53 +0000837 sqlite3DbFree(db, zOut);
danielk197717374e82007-05-08 14:39:04 +0000838 return;
839 }
drh4a50aac2007-08-23 02:47:53 +0000840 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000841 zOut = sqlite3_realloc(zOut, (int)nOut);
842 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000843 sqlite3_result_error_nomem(context);
drh633e6d52008-07-28 19:34:53 +0000844 sqlite3DbFree(db, zOld);
drh2e6400b2007-05-08 15:46:18 +0000845 return;
846 }
drh26b6d902007-03-17 13:27:54 +0000847 memcpy(&zOut[j], zRep, nRep);
848 j += nRep;
849 i += nPattern-1;
850 }
851 }
drh2e6400b2007-05-08 15:46:18 +0000852 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000853 memcpy(&zOut[j], &zStr[i], nStr-i);
854 j += nStr - i;
855 assert( j<=nOut );
856 zOut[j] = 0;
857 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
858}
859
drh309b3382007-03-17 17:52:42 +0000860/*
861** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
862** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
863*/
864static void trimFunc(
865 sqlite3_context *context,
866 int argc,
867 sqlite3_value **argv
868){
869 const unsigned char *zIn; /* Input string */
870 const unsigned char *zCharSet; /* Set of characters to trim */
871 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +0000872 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +0000873 int i; /* Loop counter */
874 unsigned char *aLen; /* Length of each character in zCharSet */
danielk1977bc67da42007-12-11 04:23:19 +0000875 unsigned char **azChar; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000876 int nChar; /* Number of characters in zCharSet */
877
drh309b3382007-03-17 17:52:42 +0000878 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
879 return;
880 }
881 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000882 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000883 nIn = sqlite3_value_bytes(argv[0]);
884 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000885 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000886 static const unsigned char lenOne[] = { 1 };
drh8cff3822007-05-02 02:08:28 +0000887 static const unsigned char *azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000888 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000889 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +0000890 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +0000891 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000892 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000893 return;
drhd1e3a612007-04-27 21:59:52 +0000894 }else{
895 const unsigned char *z;
896 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000897 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000898 }
899 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +0000900 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +0000901 if( azChar==0 ){
902 return;
903 }
904 aLen = (unsigned char*)&azChar[nChar];
905 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +0000906 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +0000907 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000908 aLen[nChar] = z - azChar[nChar];
909 }
910 }
drh309b3382007-03-17 17:52:42 +0000911 }
drhd1e3a612007-04-27 21:59:52 +0000912 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +0000913 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +0000914 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000915 while( nIn>0 ){
916 int len;
917 for(i=0; i<nChar; i++){
918 len = aLen[i];
919 if( memcmp(zIn, azChar[i], len)==0 ) break;
920 }
921 if( i>=nChar ) break;
922 zIn += len;
923 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000924 }
925 }
926 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000927 while( nIn>0 ){
928 int len;
929 for(i=0; i<nChar; i++){
930 len = aLen[i];
931 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
932 }
933 if( i>=nChar ) break;
934 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000935 }
936 }
drhd1e3a612007-04-27 21:59:52 +0000937 if( zCharSet ){
938 sqlite3_free(azChar);
939 }
drh309b3382007-03-17 17:52:42 +0000940 }
941 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
942}
drh26b6d902007-03-17 13:27:54 +0000943
drhd24cc422003-03-27 12:51:24 +0000944#ifdef SQLITE_SOUNDEX
945/*
946** Compute the soundex encoding of a word.
947*/
drh137c7282007-01-29 17:58:28 +0000948static void soundexFunc(
949 sqlite3_context *context,
950 int argc,
951 sqlite3_value **argv
952){
drhd24cc422003-03-27 12:51:24 +0000953 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000954 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000955 int i, j;
956 static const unsigned char iCode[] = {
957 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
958 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
959 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
960 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
961 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
962 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
963 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
964 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
965 };
966 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000967 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000968 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000969 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
970 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000971 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000972 zResult[0] = toupper(zIn[i]);
973 for(j=1; j<4 && zIn[i]; i++){
974 int code = iCode[zIn[i]&0x7f];
975 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000976 if( code!=prevcode ){
977 prevcode = code;
978 zResult[j++] = code + '0';
979 }
980 }else{
981 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000982 }
983 }
984 while( j<4 ){
985 zResult[j++] = '0';
986 }
987 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000988 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000989 }else{
danielk1977d8123362004-06-12 09:25:12 +0000990 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000991 }
992}
993#endif
994
drhfdb83b22006-06-17 14:12:47 +0000995#ifndef SQLITE_OMIT_LOAD_EXTENSION
996/*
997** A function that loads a shared-library extension then returns NULL.
998*/
999static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001000 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001001 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001002 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001003 char *zErrMsg = 0;
1004
1005 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001006 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001007 }else{
1008 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001009 }
drh7a521cf2007-04-25 18:23:52 +00001010 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001011 sqlite3_result_error(context, zErrMsg, -1);
1012 sqlite3_free(zErrMsg);
1013 }
1014}
1015#endif
1016
danielk197701427a62005-01-11 13:02:33 +00001017
drh0ac65892002-04-20 14:24:41 +00001018/*
drhd3a149e2002-02-24 17:12:53 +00001019** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001020** sum() or avg() aggregate computation.
1021*/
1022typedef struct SumCtx SumCtx;
1023struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001024 double rSum; /* Floating point sum */
1025 i64 iSum; /* Integer sum */
1026 i64 cnt; /* Number of elements summed */
1027 u8 overflow; /* True if integer overflow seen */
1028 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001029};
1030
1031/*
drha97fdd32006-01-12 22:17:50 +00001032** Routines used to compute the sum, average, and total.
1033**
1034** The SUM() function follows the (broken) SQL standard which means
1035** that it returns NULL if it sums over no inputs. TOTAL returns
1036** 0.0 in that case. In addition, TOTAL always returns a float where
1037** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001038** value. TOTAL never fails, but SUM might through an exception if
1039** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001040*/
danielk19770ae8b832004-05-25 12:05:56 +00001041static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001042 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001043 int type;
drh3f219f42005-09-08 19:45:57 +00001044 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +00001045 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001046 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001047 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001048 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001049 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001050 i64 v = sqlite3_value_int64(argv[0]);
1051 p->rSum += v;
1052 if( (p->approx|p->overflow)==0 ){
1053 i64 iNewSum = p->iSum + v;
1054 int s1 = p->iSum >> (sizeof(i64)*8-1);
1055 int s2 = v >> (sizeof(i64)*8-1);
1056 int s3 = iNewSum >> (sizeof(i64)*8-1);
1057 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
1058 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001059 }
1060 }else{
drh8c08e862006-02-11 17:34:00 +00001061 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001062 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001063 }
drh739105c2002-05-29 23:22:23 +00001064 }
drhdd5baa92002-02-27 19:50:59 +00001065}
danielk19770ae8b832004-05-25 12:05:56 +00001066static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001067 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001068 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001069 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001070 if( p->overflow ){
1071 sqlite3_result_error(context,"integer overflow",-1);
1072 }else if( p->approx ){
1073 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001074 }else{
drh8c08e862006-02-11 17:34:00 +00001075 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001076 }
drh3d1d95e2005-09-08 10:37:01 +00001077 }
drhdd5baa92002-02-27 19:50:59 +00001078}
danielk19770ae8b832004-05-25 12:05:56 +00001079static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001080 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001081 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001082 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001083 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001084 }
1085}
drha97fdd32006-01-12 22:17:50 +00001086static void totalFinalize(sqlite3_context *context){
1087 SumCtx *p;
1088 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001089 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001090}
drhdd5baa92002-02-27 19:50:59 +00001091
1092/*
drh0bce8352002-02-28 00:41:10 +00001093** The following structure keeps track of state information for the
1094** count() aggregate function.
1095*/
1096typedef struct CountCtx CountCtx;
1097struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001098 i64 n;
drh0bce8352002-02-28 00:41:10 +00001099};
drhdd5baa92002-02-27 19:50:59 +00001100
drh0bce8352002-02-28 00:41:10 +00001101/*
1102** Routines to implement the count() aggregate function.
1103*/
danielk19770ae8b832004-05-25 12:05:56 +00001104static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001105 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001106 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001107 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001108 p->n++;
1109 }
1110}
danielk19770ae8b832004-05-25 12:05:56 +00001111static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001112 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001113 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001114 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001115}
1116
1117/*
drh0bce8352002-02-28 00:41:10 +00001118** Routines to implement min() and max() aggregate functions.
1119*/
danielk19770ae8b832004-05-25 12:05:56 +00001120static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +00001121 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001122 Mem *pBest;
1123
1124 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1125 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001126 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001127
danielk197788208052004-05-25 01:13:20 +00001128 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001129 int max;
1130 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001131 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001132 /* This step function is used for both the min() and max() aggregates,
1133 ** the only difference between the two being that the sense of the
1134 ** comparison is inverted. For the max() aggregate, the
1135 ** sqlite3_user_data() function returns (void *)-1. For min() it
1136 ** returns (void *)db, where db is the sqlite3* database pointer.
1137 ** Therefore the next statement sets variable 'max' to 1 for the max()
1138 ** aggregate, or 0 for min().
1139 */
drh309b3382007-03-17 17:52:42 +00001140 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001141 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001142 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001143 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001144 }
drh268380c2004-02-25 13:47:31 +00001145 }else{
drhb21c8cd2007-08-21 19:33:56 +00001146 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001147 }
1148}
danielk19770ae8b832004-05-25 12:05:56 +00001149static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001150 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001151 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1152 if( pRes ){
1153 if( pRes->flags ){
1154 sqlite3_result_value(context, pRes);
1155 }
1156 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001157 }
1158}
drhdd5baa92002-02-27 19:50:59 +00001159
drhb0689692007-11-01 17:38:30 +00001160/*
1161** group_concat(EXPR, ?SEPARATOR?)
1162*/
1163static void groupConcatStep(
1164 sqlite3_context *context,
1165 int argc,
1166 sqlite3_value **argv
1167){
1168 const char *zVal;
drhade86482007-11-28 22:36:40 +00001169 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001170 const char *zSep;
drha2baf3a2008-06-18 15:34:09 +00001171 int nVal, nSep, i;
1172 if( argc==0 || sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001173 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1174
1175 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001176 sqlite3 *db = sqlite3_context_db_handle(context);
drhade86482007-11-28 22:36:40 +00001177 pAccum->useMalloc = 1;
drhbb4957f2008-03-20 14:03:29 +00001178 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drhade86482007-11-28 22:36:40 +00001179 if( pAccum->nChar ){
drha2baf3a2008-06-18 15:34:09 +00001180 if( argc>1 ){
1181 zSep = (char*)sqlite3_value_text(argv[argc-1]);
1182 nSep = sqlite3_value_bytes(argv[argc-1]);
drhb0689692007-11-01 17:38:30 +00001183 }else{
1184 zSep = ",";
drhade86482007-11-28 22:36:40 +00001185 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001186 }
drhade86482007-11-28 22:36:40 +00001187 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001188 }
drha2baf3a2008-06-18 15:34:09 +00001189 i = 0;
1190 do{
1191 zVal = (char*)sqlite3_value_text(argv[i]);
1192 nVal = sqlite3_value_bytes(argv[i]);
1193 sqlite3StrAccumAppend(pAccum, zVal, nVal);
1194 i++;
1195 }while( i<argc-1 );
drhb0689692007-11-01 17:38:30 +00001196 }
1197}
1198static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001199 StrAccum *pAccum;
1200 pAccum = sqlite3_aggregate_context(context, 0);
1201 if( pAccum ){
1202 if( pAccum->tooBig ){
1203 sqlite3_result_error_toobig(context);
1204 }else if( pAccum->mallocFailed ){
1205 sqlite3_result_error_nomem(context);
1206 }else{
1207 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1208 sqlite3_free);
1209 }
drhb0689692007-11-01 17:38:30 +00001210 }
1211}
drh4e5ffc52004-08-31 00:52:37 +00001212
drhd3a149e2002-02-24 17:12:53 +00001213/*
drha2ed5602002-02-26 23:55:31 +00001214** This function registered all of the above C functions as SQL
1215** functions. This should be the only routine in this file with
1216** external linkage.
drhdc04c582002-02-24 01:55:15 +00001217*/
drh9bb575f2004-09-06 17:24:11 +00001218void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh1f01ec12005-02-15 21:36:18 +00001219#ifndef SQLITE_OMIT_ALTERTABLE
1220 sqlite3AlterFunctions(db);
1221#endif
drh198bf392006-01-06 21:52:49 +00001222#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001223 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001224#endif
danielk19774adee202004-05-08 08:23:19 +00001225 sqlite3RegisterDateTimeFunctions(db);
danielk19771e536952007-08-16 10:09:01 +00001226 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001227 int rc = sqlite3_overload_function(db, "MATCH", 2);
1228 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1229 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001230 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001231 }
1232 }
danielk1977fd9e1f32005-05-22 10:44:34 +00001233#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001234 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001235#endif
drh55ef4d92005-08-14 01:20:37 +00001236}
1237
1238/*
1239** Set the LIKEOPT flag on the 2-argument function with the given name.
1240*/
drhd64fe2f2005-08-28 17:00:23 +00001241static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001242 FuncDef *pDef;
1243 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1244 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001245 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001246 }
1247}
1248
1249/*
1250** Register the built-in LIKE and GLOB functions. The caseSensitive
1251** parameter determines whether or not the LIKE operator is case
1252** sensitive. GLOB is always case sensitive.
1253*/
1254void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1255 struct compareInfo *pInfo;
1256 if( caseSensitive ){
1257 pInfo = (struct compareInfo*)&likeInfoAlt;
1258 }else{
1259 pInfo = (struct compareInfo*)&likeInfoNorm;
1260 }
danielk1977771151b2006-01-17 13:21:40 +00001261 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1262 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1263 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001264 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001265 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1266 setLikeOptFlag(db, "like",
1267 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001268}
1269
1270/*
1271** pExpr points to an expression which implements a function. If
1272** it is appropriate to apply the LIKE optimization to that function
1273** then set aWc[0] through aWc[2] to the wildcard characters and
1274** return TRUE. If the function is not a LIKE-style function then
1275** return FALSE.
1276*/
drhd64fe2f2005-08-28 17:00:23 +00001277int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001278 FuncDef *pDef;
danielk1977cdbd8ef2007-05-12 06:11:12 +00001279 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
drh55ef4d92005-08-14 01:20:37 +00001280 return 0;
1281 }
1282 if( pExpr->pList->nExpr!=2 ){
1283 return 0;
1284 }
drh2646da72005-12-09 20:02:05 +00001285 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001286 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001287 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001288 return 0;
1289 }
1290
1291 /* The memcpy() statement assumes that the wildcard characters are
1292 ** the first three statements in the compareInfo structure. The
1293 ** asserts() that follow verify that assumption
1294 */
1295 memcpy(aWc, pDef->pUserData, 3);
1296 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1297 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1298 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001299 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001300 return 1;
drhdc04c582002-02-24 01:55:15 +00001301}
danielk19778c0a7912008-08-20 14:49:23 +00001302
1303/*
1304** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are
1305** used to create the literal values used for the FuncDef structures in
1306** the global aBuiltinFunc[] array (see below).
1307**
1308** FUNCTION(zName, nArg, iArg, bNC, xFunc)
1309** Used to create a scalar function definition of a function zName
1310** implemented by C function xFunc that accepts nArg arguments. The
1311** value passed as iArg is cast to a (void*) and made available
1312** as the user-data (sqlite3_user_data()) for the function. If
1313** argument bNC is true, then the FuncDef.needCollate flag is set.
1314**
1315** AGGREGATE(zName, nArg, iArg, bNC, xStep, xFinal)
1316** Used to create an aggregate function definition implemented by
1317** the C functions xStep and xFinal. The first four parameters
1318** are interpreted in the same way as the first 4 parameters to
1319** FUNCTION().
1320**
1321** LIKEFUNC(zName, nArg, pArg, flags)
1322** Used to create a scalar function definition of a function zName
1323** that accepts nArg arguments and is implemented by a call to C
1324** function likeFunc. Argument pArg is cast to a (void *) and made
1325** available as the function user-data (sqlite3_user_data()). The
1326** FuncDef.flags variable is set to the value passed as the flags
1327** parameter.
1328**
1329** See below for examples.
1330*/
1331#define FUNCTION(zName, nArg, iArg, bNC, xFunc) \
1332 {nArg, SQLITE_UTF8, bNC, 0, SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName}
1333
1334#define LIKEFUNC(zName, nArg, arg, flags) \
1335 {nArg, SQLITE_UTF8, 0, flags, (void *)arg, 0, likeFunc, 0, 0, #zName}
1336
1337#define AGGREGATE(zName, nArg, arg, nc, xStep, xFinal) \
1338 {nArg, SQLITE_UTF8, nc, 0, SQLITE_INT_TO_PTR(arg), 0, 0, xStep,xFinal, #zName}
1339
1340#endif
1341
1342/*
1343** This array of FuncDef structures contains most of the "built-in" functions
1344** and aggregates. Function users (the other routines in the SQL compiler)
1345** call the following function to access the FuncDef structures stored in
1346** this array:
1347**
1348** int sqlite3GetBuiltinFunction(const char *z, int n, FuncDef **paFunc);
1349**
1350** The caller passes the name of the required function and its length
1351** in parameters z and n, respectively. The value returned is the number
1352** of FuncDef structures found in the aBuiltinFunc[] array that match
1353** the requested name. If no match is found, 0 is returned. *paFunc is
1354** set to point at a static array containing that subset of aBuiltinFunc[]
1355** before returning.
1356**
1357** The implementation of sqlite3GetBuiltinFunction() is generated by
1358** the program found in tool/mkfunction.c, which is compiled and executed
1359** as part of the build process. The routine generated by this program
1360** assumes that if there are two or more entries in the aBuiltinFunc[]
1361** array with the same name (i.e. two versions of the "max" function),
1362** then they must be stored in adjacent slots.
1363*/
1364static FuncDef aBuiltinFunc[] = {
1365 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1366 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1367 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1368 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1369 FUNCTION(trim, 1, 3, 0, trimFunc ),
1370 FUNCTION(trim, 2, 3, 0, trimFunc ),
1371 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1372 FUNCTION(min, 0, 0, 1, 0 ),
1373 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1374 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1375 FUNCTION(max, 0, 1, 1, 0 ),
1376 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1377 FUNCTION(typeof, 1, 0, 0, typeofFunc ),
1378 FUNCTION(length, 1, 0, 0, lengthFunc ),
1379 FUNCTION(substr, 2, 0, 0, substrFunc ),
1380 FUNCTION(substr, 3, 0, 0, substrFunc ),
1381 FUNCTION(abs, 1, 0, 0, absFunc ),
1382 FUNCTION(round, 1, 0, 0, roundFunc ),
1383 FUNCTION(round, 2, 0, 0, roundFunc ),
1384 FUNCTION(upper, 1, 0, 0, upperFunc ),
1385 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1386 FUNCTION(coalesce, 1, 0, 0, 0 ),
1387 FUNCTION(coalesce, -1, 0, 0, ifnullFunc ),
1388 FUNCTION(coalesce, 0, 0, 0, 0 ),
1389 FUNCTION(hex, 1, 0, 0, hexFunc ),
1390 FUNCTION(ifnull, 2, 0, 1, ifnullFunc ),
1391 FUNCTION(random, -1, 0, 0, randomFunc ),
1392 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1393 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1394 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
1395 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1396 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1397 FUNCTION(changes, 0, 0, 0, changes ),
1398 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1399 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1400 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1401#ifdef SQLITE_SOUNDEX
1402 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1403#endif
1404#ifndef SQLITE_OMIT_LOAD_EXTENSION
1405 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1406 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1407#endif
1408 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1409 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1410 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
1411 AGGREGATE(count, 0, 0, 0, countStep, countFinalize ),
1412 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
1413 AGGREGATE(group_concat, -1, 0, 0, groupConcatStep, groupConcatFinalize),
1414
1415 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1416#ifdef SQLITE_CASE_SENSITIVE_LIKE
1417 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1418 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1419#else
1420 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1421 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1422#endif
1423};
1424