blob: 962a9895f764178ef406151c1d71aacedd34eb56 [file] [log] [blame]
drhdc04c582002-02-24 01:55:15 +00001/*
2** 2002 February 23
3**
4** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
6**
7** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
10**
11*************************************************************************
12** This file contains the C functions that implement various SQL
13** functions of SQLite.
14**
15** There is only one exported symbol in this file - the function
16** sqliteRegisterBuildinFunctions() found at the bottom of the file.
17** All other code has file scope.
drhdc04c582002-02-24 01:55:15 +000018*/
drhb659e9b2005-01-28 01:29:08 +000019#include "sqliteInt.h"
drhd3a149e2002-02-24 17:12:53 +000020#include <stdlib.h>
drh0bce8352002-02-28 00:41:10 +000021#include <assert.h>
danielk197788208052004-05-25 01:13:20 +000022#include "vdbeInt.h"
drh0bce8352002-02-28 00:41:10 +000023
drh55ef4d92005-08-14 01:20:37 +000024/*
25** Return the collating function associated with a function.
26*/
danielk1977dc1bdc42004-06-11 10:51:27 +000027static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
28 return context->pColl;
29}
30
drh0bce8352002-02-28 00:41:10 +000031/*
drh7a957892012-02-02 17:35:43 +000032** Indicate that the accumulator load should be skipped on this
33** iteration of the aggregate loop.
34*/
35static void sqlite3SkipAccumulatorLoad(sqlite3_context *context){
36 context->skipFlag = 1;
37}
38
39/*
drh0bce8352002-02-28 00:41:10 +000040** Implementation of the non-aggregate min() and max() functions
41*/
drhf9b596e2004-05-26 16:54:42 +000042static void minmaxFunc(
43 sqlite3_context *context,
44 int argc,
45 sqlite3_value **argv
46){
drh0bce8352002-02-28 00:41:10 +000047 int i;
drh268380c2004-02-25 13:47:31 +000048 int mask; /* 0 for min() or 0xffffffff for max() */
drhf9b596e2004-05-26 16:54:42 +000049 int iBest;
danielk1977dc1bdc42004-06-11 10:51:27 +000050 CollSeq *pColl;
drh0bce8352002-02-28 00:41:10 +000051
drh65595cd2009-02-02 16:32:55 +000052 assert( argc>1 );
drhc44af712004-09-02 15:53:56 +000053 mask = sqlite3_user_data(context)==0 ? 0 : -1;
danielk1977dc1bdc42004-06-11 10:51:27 +000054 pColl = sqlite3GetFuncCollSeq(context);
55 assert( pColl );
danielk1977c572ef72004-05-27 09:28:41 +000056 assert( mask==-1 || mask==0 );
drhf9b596e2004-05-26 16:54:42 +000057 iBest = 0;
drh9c054832004-05-31 18:51:57 +000058 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhf9b596e2004-05-26 16:54:42 +000059 for(i=1; i<argc; i++){
drh9c054832004-05-31 18:51:57 +000060 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
danielk1977dc1bdc42004-06-11 10:51:27 +000061 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
drh65595cd2009-02-02 16:32:55 +000062 testcase( mask==0 );
drhf9b596e2004-05-26 16:54:42 +000063 iBest = i;
drh0bce8352002-02-28 00:41:10 +000064 }
65 }
drhf4479502004-05-27 03:12:53 +000066 sqlite3_result_value(context, argv[iBest]);
drh0bce8352002-02-28 00:41:10 +000067}
drh0bce8352002-02-28 00:41:10 +000068
drh268380c2004-02-25 13:47:31 +000069/*
70** Return the type of the argument.
71*/
drhf9b596e2004-05-26 16:54:42 +000072static void typeofFunc(
73 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +000074 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +000075 sqlite3_value **argv
76){
danielk197735bb9d02004-05-24 12:55:54 +000077 const char *z = 0;
danielk197762c14b32008-11-19 09:05:26 +000078 UNUSED_PARAMETER(NotUsed);
danielk197735bb9d02004-05-24 12:55:54 +000079 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000080 case SQLITE_INTEGER: z = "integer"; break;
81 case SQLITE_TEXT: z = "text"; break;
82 case SQLITE_FLOAT: z = "real"; break;
83 case SQLITE_BLOB: z = "blob"; break;
drh65595cd2009-02-02 16:32:55 +000084 default: z = "null"; break;
danielk197735bb9d02004-05-24 12:55:54 +000085 }
danielk1977d8123362004-06-12 09:25:12 +000086 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000087}
88
drh5708d2d2005-06-22 10:53:59 +000089
90/*
drh0bce8352002-02-28 00:41:10 +000091** Implementation of the length() function
92*/
drhf9b596e2004-05-26 16:54:42 +000093static void lengthFunc(
94 sqlite3_context *context,
95 int argc,
96 sqlite3_value **argv
97){
drh0bce8352002-02-28 00:41:10 +000098 int len;
99
100 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000101 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000102 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000103 case SQLITE_BLOB:
104 case SQLITE_INTEGER:
105 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000106 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +0000107 break;
108 }
drh9c054832004-05-31 18:51:57 +0000109 case SQLITE_TEXT: {
drh2646da72005-12-09 20:02:05 +0000110 const unsigned char *z = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000111 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000112 len = 0;
113 while( *z ){
114 len++;
115 SQLITE_SKIP_UTF8(z);
116 }
drhf4479502004-05-27 03:12:53 +0000117 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000118 break;
119 }
120 default: {
121 sqlite3_result_null(context);
122 break;
123 }
124 }
drh0bce8352002-02-28 00:41:10 +0000125}
126
127/*
drh2ba3ccc2009-12-08 02:06:08 +0000128** Implementation of the abs() function.
129**
130** IMP: R-23979-26855 The abs(X) function returns the absolute value of
131** the numeric argument X.
drh0bce8352002-02-28 00:41:10 +0000132*/
danielk19770ae8b832004-05-25 12:05:56 +0000133static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000134 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000135 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000136 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000137 case SQLITE_INTEGER: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000138 i64 iVal = sqlite3_value_int64(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000139 if( iVal<0 ){
140 if( (iVal<<1)==0 ){
drh2ba3ccc2009-12-08 02:06:08 +0000141 /* IMP: R-35460-15084 If X is the integer -9223372036854775807 then
142 ** abs(X) throws an integer overflow error since there is no
143 ** equivalent positive 64-bit two complement value. */
drh52fc8492006-02-23 21:43:55 +0000144 sqlite3_result_error(context, "integer overflow", -1);
145 return;
146 }
147 iVal = -iVal;
148 }
danielk1977f93bbbe2004-05-27 10:30:52 +0000149 sqlite3_result_int64(context, iVal);
drhf9b596e2004-05-26 16:54:42 +0000150 break;
151 }
drh9c054832004-05-31 18:51:57 +0000152 case SQLITE_NULL: {
drh2ba3ccc2009-12-08 02:06:08 +0000153 /* IMP: R-37434-19929 Abs(X) returns NULL if X is NULL. */
drhf9b596e2004-05-26 16:54:42 +0000154 sqlite3_result_null(context);
155 break;
156 }
157 default: {
drh2ba3ccc2009-12-08 02:06:08 +0000158 /* Because sqlite3_value_double() returns 0.0 if the argument is not
159 ** something that can be converted into a number, we have:
160 ** IMP: R-57326-31541 Abs(X) return 0.0 if X is a string or blob that
161 ** cannot be converted to a numeric value.
162 */
danielk1977f93bbbe2004-05-27 10:30:52 +0000163 double rVal = sqlite3_value_double(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000164 if( rVal<0 ) rVal = -rVal;
danielk1977f93bbbe2004-05-27 10:30:52 +0000165 sqlite3_result_double(context, rVal);
drhf9b596e2004-05-26 16:54:42 +0000166 break;
167 }
168 }
drh0bce8352002-02-28 00:41:10 +0000169}
170
171/*
drhf764e6f2007-05-15 01:13:47 +0000172** Implementation of the substr() function.
173**
174** substr(x,p1,p2) returns p2 characters of x[] beginning with p1.
175** p1 is 1-indexed. So substr(x,1,1) returns the first character
176** of x. If x is text, then we actually count UTF-8 characters.
177** If x is a blob, then we count bytes.
178**
179** If p1 is negative, then we begin abs(p1) from the end of x[].
shaneh779b8f12009-11-12 05:04:50 +0000180**
181** If p2 is negative, return the p2 characters preceeding p1.
drh0bce8352002-02-28 00:41:10 +0000182*/
drhf9b596e2004-05-26 16:54:42 +0000183static void substrFunc(
184 sqlite3_context *context,
185 int argc,
186 sqlite3_value **argv
187){
drh2646da72005-12-09 20:02:05 +0000188 const unsigned char *z;
189 const unsigned char *z2;
drh023ae032007-05-08 12:12:16 +0000190 int len;
drhf764e6f2007-05-15 01:13:47 +0000191 int p0type;
drh023ae032007-05-08 12:12:16 +0000192 i64 p1, p2;
drh65595cd2009-02-02 16:32:55 +0000193 int negP2 = 0;
drhf9b596e2004-05-26 16:54:42 +0000194
drh64f31512007-10-12 19:11:55 +0000195 assert( argc==3 || argc==2 );
drh8198d252009-02-01 19:42:37 +0000196 if( sqlite3_value_type(argv[1])==SQLITE_NULL
197 || (argc==3 && sqlite3_value_type(argv[2])==SQLITE_NULL)
198 ){
199 return;
200 }
drhf764e6f2007-05-15 01:13:47 +0000201 p0type = sqlite3_value_type(argv[0]);
drh4adc4cb2009-11-11 20:53:31 +0000202 p1 = sqlite3_value_int(argv[1]);
drhf764e6f2007-05-15 01:13:47 +0000203 if( p0type==SQLITE_BLOB ){
204 len = sqlite3_value_bytes(argv[0]);
205 z = sqlite3_value_blob(argv[0]);
206 if( z==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000207 assert( len==sqlite3_value_bytes(argv[0]) );
drhf764e6f2007-05-15 01:13:47 +0000208 }else{
209 z = sqlite3_value_text(argv[0]);
210 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000211 len = 0;
drh4adc4cb2009-11-11 20:53:31 +0000212 if( p1<0 ){
213 for(z2=z; *z2; len++){
214 SQLITE_SKIP_UTF8(z2);
215 }
drh4a919112007-05-15 11:55:09 +0000216 }
drhf764e6f2007-05-15 01:13:47 +0000217 }
drh64f31512007-10-12 19:11:55 +0000218 if( argc==3 ){
219 p2 = sqlite3_value_int(argv[2]);
drh65595cd2009-02-02 16:32:55 +0000220 if( p2<0 ){
221 p2 = -p2;
222 negP2 = 1;
223 }
drh64f31512007-10-12 19:11:55 +0000224 }else{
drhbb4957f2008-03-20 14:03:29 +0000225 p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH];
drh64f31512007-10-12 19:11:55 +0000226 }
drh0bce8352002-02-28 00:41:10 +0000227 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000228 p1 += len;
drh653bc752002-02-28 03:31:10 +0000229 if( p1<0 ){
230 p2 += p1;
drh65595cd2009-02-02 16:32:55 +0000231 if( p2<0 ) p2 = 0;
drh653bc752002-02-28 03:31:10 +0000232 p1 = 0;
233 }
drh0bce8352002-02-28 00:41:10 +0000234 }else if( p1>0 ){
235 p1--;
drh65595cd2009-02-02 16:32:55 +0000236 }else if( p2>0 ){
237 p2--;
drh0bce8352002-02-28 00:41:10 +0000238 }
drh65595cd2009-02-02 16:32:55 +0000239 if( negP2 ){
240 p1 -= p2;
drh4e79c592009-02-01 19:23:32 +0000241 if( p1<0 ){
242 p2 += p1;
243 p1 = 0;
244 }
245 }
drh65595cd2009-02-02 16:32:55 +0000246 assert( p1>=0 && p2>=0 );
drhf764e6f2007-05-15 01:13:47 +0000247 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000248 while( *z && p1 ){
249 SQLITE_SKIP_UTF8(z);
250 p1--;
drhf764e6f2007-05-15 01:13:47 +0000251 }
drh4a919112007-05-15 11:55:09 +0000252 for(z2=z; *z2 && p2; p2--){
253 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000254 }
drh1bd10f82008-12-10 21:19:56 +0000255 sqlite3_result_text(context, (char*)z, (int)(z2-z), SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000256 }else{
drh4adc4cb2009-11-11 20:53:31 +0000257 if( p1+p2>len ){
258 p2 = len-p1;
259 if( p2<0 ) p2 = 0;
260 }
drh1bd10f82008-12-10 21:19:56 +0000261 sqlite3_result_blob(context, (char*)&z[p1], (int)p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000262 }
drh0bce8352002-02-28 00:41:10 +0000263}
264
265/*
266** Implementation of the round() function
267*/
shanefbd60f82009-02-04 03:59:25 +0000268#ifndef SQLITE_OMIT_FLOATING_POINT
danielk19770ae8b832004-05-25 12:05:56 +0000269static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000270 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000271 double r;
drh50d654d2009-06-03 01:24:54 +0000272 char *zBuf;
drh0bce8352002-02-28 00:41:10 +0000273 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000274 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000275 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000276 n = sqlite3_value_int(argv[1]);
277 if( n>30 ) n = 30;
278 if( n<0 ) n = 0;
279 }
drhd589a922006-03-02 03:02:48 +0000280 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000281 r = sqlite3_value_double(argv[0]);
shaneh147e1762010-02-17 04:19:27 +0000282 /* If Y==0 and X will fit in a 64-bit int,
283 ** handle the rounding directly,
284 ** otherwise use printf.
285 */
286 if( n==0 && r>=0 && r<LARGEST_INT64-1 ){
287 r = (double)((sqlite_int64)(r+0.5));
288 }else if( n==0 && r<0 && (-r)<LARGEST_INT64-1 ){
289 r = -(double)((sqlite_int64)((-r)+0.5));
drh50d654d2009-06-03 01:24:54 +0000290 }else{
shaneh147e1762010-02-17 04:19:27 +0000291 zBuf = sqlite3_mprintf("%.*f",n,r);
292 if( zBuf==0 ){
293 sqlite3_result_error_nomem(context);
294 return;
295 }
drh9339da12010-09-30 00:50:49 +0000296 sqlite3AtoF(zBuf, &r, sqlite3Strlen30(zBuf), SQLITE_UTF8);
drh50d654d2009-06-03 01:24:54 +0000297 sqlite3_free(zBuf);
drh50d654d2009-06-03 01:24:54 +0000298 }
shaneh147e1762010-02-17 04:19:27 +0000299 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000300}
shanefbd60f82009-02-04 03:59:25 +0000301#endif
drhdc04c582002-02-24 01:55:15 +0000302
danielk197726783a52007-08-29 14:06:22 +0000303/*
304** Allocate nByte bytes of space using sqlite3_malloc(). If the
305** allocation fails, call sqlite3_result_error_nomem() to notify
drh27e62db2009-04-02 10:16:17 +0000306** the database handle that malloc() has failed and return NULL.
307** If nByte is larger than the maximum string or blob length, then
308** raise an SQLITE_TOOBIG exception and return NULL.
danielk197726783a52007-08-29 14:06:22 +0000309*/
drhb1a6c3c2008-03-20 16:30:17 +0000310static void *contextMalloc(sqlite3_context *context, i64 nByte){
drhbb4957f2008-03-20 14:03:29 +0000311 char *z;
drh27e62db2009-04-02 10:16:17 +0000312 sqlite3 *db = sqlite3_context_db_handle(context);
drhef31c6a2009-04-02 09:07:12 +0000313 assert( nByte>0 );
drh27e62db2009-04-02 10:16:17 +0000314 testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] );
315 testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
316 if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drhbb4957f2008-03-20 14:03:29 +0000317 sqlite3_result_error_toobig(context);
318 z = 0;
319 }else{
drh1bd10f82008-12-10 21:19:56 +0000320 z = sqlite3Malloc((int)nByte);
drhef31c6a2009-04-02 09:07:12 +0000321 if( !z ){
drhbb4957f2008-03-20 14:03:29 +0000322 sqlite3_result_error_nomem(context);
323 }
danielk1977a1644fd2007-08-29 12:31:25 +0000324 }
325 return z;
326}
327
drhdc04c582002-02-24 01:55:15 +0000328/*
329** Implementation of the upper() and lower() SQL functions.
330*/
danielk19770ae8b832004-05-25 12:05:56 +0000331static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000332 char *z1;
333 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000334 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000335 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000336 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000337 n = sqlite3_value_bytes(argv[0]);
338 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
339 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000340 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000341 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000342 if( z1 ){
drhdf901d32011-10-13 18:00:11 +0000343 for(i=0; i<n; i++){
344 z1[i] = (char)sqlite3Toupper(z2[i]);
drh7a521cf2007-04-25 18:23:52 +0000345 }
drhdf901d32011-10-13 18:00:11 +0000346 sqlite3_result_text(context, z1, n, sqlite3_free);
drh7a521cf2007-04-25 18:23:52 +0000347 }
drhdc04c582002-02-24 01:55:15 +0000348 }
349}
danielk19770ae8b832004-05-25 12:05:56 +0000350static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdf901d32011-10-13 18:00:11 +0000351 char *z1;
drh7a521cf2007-04-25 18:23:52 +0000352 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000353 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000354 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000355 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000356 n = sqlite3_value_bytes(argv[0]);
357 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
358 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000359 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000360 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000361 if( z1 ){
drhdf901d32011-10-13 18:00:11 +0000362 for(i=0; i<n; i++){
363 z1[i] = sqlite3Tolower(z2[i]);
drh7a521cf2007-04-25 18:23:52 +0000364 }
drhdf901d32011-10-13 18:00:11 +0000365 sqlite3_result_text(context, z1, n, sqlite3_free);
drh7a521cf2007-04-25 18:23:52 +0000366 }
drhdc04c582002-02-24 01:55:15 +0000367 }
368}
369
drhae6bb952009-11-11 00:24:31 +0000370/*
drh0fdbdbe2012-09-10 15:02:32 +0000371** The COALESCE() and IFNULL() functions are implemented as VDBE code so
372** that unused argument values do not have to be computed. However, we
373** still need some kind of function implementation for this routines in
374** the function table. That function implementation will never be called
375** so it doesn't matter what the implementation is. We might as well use
376** the "version()" function as a substitute.
drhae6bb952009-11-11 00:24:31 +0000377*/
drhae6bb952009-11-11 00:24:31 +0000378#define ifnullFunc versionFunc /* Substitute function - never called */
drh3212e182002-02-28 00:46:26 +0000379
380/*
drhf9ffac92002-03-02 19:00:31 +0000381** Implementation of random(). Return a random integer.
382*/
drhf9b596e2004-05-26 16:54:42 +0000383static void randomFunc(
384 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000385 int NotUsed,
386 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000387){
drh52fc8492006-02-23 21:43:55 +0000388 sqlite_int64 r;
danielk197762c14b32008-11-19 09:05:26 +0000389 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drh2fa18682008-03-19 14:15:34 +0000390 sqlite3_randomness(sizeof(r), &r);
drh3034e3d2009-04-02 14:05:21 +0000391 if( r<0 ){
392 /* We need to prevent a random number of 0x8000000000000000
393 ** (or -9223372036854775808) since when you do abs() of that
394 ** number of you get the same value back again. To do this
395 ** in a way that is testable, mask the sign bit off of negative
396 ** values, resulting in a positive value. Then take the
397 ** 2s complement of that positive value. The end result can
398 ** therefore be no less than -9223372036854775807.
399 */
drhaf8001b2012-02-11 19:53:24 +0000400 r = -(r & LARGEST_INT64);
drh3034e3d2009-04-02 14:05:21 +0000401 }
drh52fc8492006-02-23 21:43:55 +0000402 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000403}
404
405/*
drh137c7282007-01-29 17:58:28 +0000406** Implementation of randomblob(N). Return a random blob
407** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000408*/
drh137c7282007-01-29 17:58:28 +0000409static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000410 sqlite3_context *context,
411 int argc,
412 sqlite3_value **argv
413){
drh137c7282007-01-29 17:58:28 +0000414 int n;
415 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000416 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000417 UNUSED_PARAMETER(argc);
drh63cf66f2007-01-29 15:50:05 +0000418 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000419 if( n<1 ){
420 n = 1;
421 }
danielk1977a1644fd2007-08-29 12:31:25 +0000422 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000423 if( p ){
drh2fa18682008-03-19 14:15:34 +0000424 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000425 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000426 }
drh63cf66f2007-01-29 15:50:05 +0000427}
428
429/*
drh6ed41ad2002-04-06 14:10:47 +0000430** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000431** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000432*/
danielk197751ad0ec2004-05-24 12:39:02 +0000433static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000434 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000435 int NotUsed,
436 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000437){
drhfa4a4b92008-03-19 21:45:51 +0000438 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000439 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000440 /* IMP: R-51513-12026 The last_insert_rowid() SQL function is a
441 ** wrapper around the sqlite3_last_insert_rowid() C/C++ interface
442 ** function. */
drhf9b596e2004-05-26 16:54:42 +0000443 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000444}
445
rdcf146a772004-02-25 22:51:06 +0000446/*
drhab2f1f92010-01-11 18:26:42 +0000447** Implementation of the changes() SQL function.
448**
449** IMP: R-62073-11209 The changes() SQL function is a wrapper
450** around the sqlite3_changes() C/C++ function and hence follows the same
451** rules for counting changes.
rdcf146a772004-02-25 22:51:06 +0000452*/
danielk1977b28af712004-06-21 06:50:26 +0000453static void changes(
drhf9b596e2004-05-26 16:54:42 +0000454 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000455 int NotUsed,
456 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000457){
drhfa4a4b92008-03-19 21:45:51 +0000458 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000459 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf4479502004-05-27 03:12:53 +0000460 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000461}
rdcf146a772004-02-25 22:51:06 +0000462
463/*
danielk1977b28af712004-06-21 06:50:26 +0000464** Implementation of the total_changes() SQL function. The return value is
465** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000466*/
danielk1977b28af712004-06-21 06:50:26 +0000467static void total_changes(
468 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000469 int NotUsed,
470 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000471){
drhfa4a4b92008-03-19 21:45:51 +0000472 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000473 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000474 /* IMP: R-52756-41993 This function is a wrapper around the
475 ** sqlite3_total_changes() C/C++ interface. */
danielk1977b28af712004-06-21 06:50:26 +0000476 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000477}
478
drh6ed41ad2002-04-06 14:10:47 +0000479/*
drh4e5ffc52004-08-31 00:52:37 +0000480** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000481*/
drh4e5ffc52004-08-31 00:52:37 +0000482struct compareInfo {
483 u8 matchAll;
484 u8 matchOne;
485 u8 matchSet;
486 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000487};
drh55ef4d92005-08-14 01:20:37 +0000488
drhb9175ae2007-12-07 18:39:04 +0000489/*
490** For LIKE and GLOB matching on EBCDIC machines, assume that every
491** character is exactly one byte in size. Also, all characters are
492** able to participate in upper-case-to-lower-case mappings in EBCDIC
493** whereas only characters less than 0x80 do in ASCII.
494*/
495#if defined(SQLITE_EBCDIC)
drh0a32fa62011-06-13 12:19:21 +0000496# define sqlite3Utf8Read(A,C) (*(A++))
497# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000498#else
drh0a32fa62011-06-13 12:19:21 +0000499# define GlogUpperToLower(A) if( !((A)&~0x7f) ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000500#endif
501
drh4e5ffc52004-08-31 00:52:37 +0000502static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000503/* The correct SQL-92 behavior is for the LIKE operator to ignore
504** case. Thus 'a' LIKE 'A' would be true. */
505static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
506/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
507** is case sensitive causing 'a' LIKE 'A' to be false */
508static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000509
510/*
drh4e5ffc52004-08-31 00:52:37 +0000511** Compare two UTF-8 strings for equality where the first string can
512** potentially be a "glob" expression. Return true (1) if they
513** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000514**
drh4e5ffc52004-08-31 00:52:37 +0000515** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000516**
drh4e5ffc52004-08-31 00:52:37 +0000517** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000518**
drh4e5ffc52004-08-31 00:52:37 +0000519** '?' Matches exactly one character.
520**
521** [...] Matches one character from the enclosed list of
522** characters.
523**
524** [^...] Matches one character not in the enclosed list.
525**
526** With the [...] and [^...] matching, a ']' character can be included
527** in the list by making it the first character after '[' or '^'. A
528** range of characters can be specified using '-'. Example:
529** "[a-z]" matches any single lower-case letter. To match a '-', make
530** it the last character in the list.
531**
532** This routine is usually quick, but can be N**2 in the worst case.
533**
534** Hints: to match '*' or '?', put them in "[]". Like this:
535**
536** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000537*/
danielk19777c6303c2004-11-17 16:41:29 +0000538static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000539 const u8 *zPattern, /* The glob pattern */
540 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000541 const struct compareInfo *pInfo, /* Information about how to do the compare */
drh0a32fa62011-06-13 12:19:21 +0000542 u32 esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000543){
drh0a32fa62011-06-13 12:19:21 +0000544 u32 c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000545 int invert;
546 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000547 u8 matchOne = pInfo->matchOne;
548 u8 matchAll = pInfo->matchAll;
549 u8 matchSet = pInfo->matchSet;
550 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000551 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000552
drh769e97e2009-04-01 16:33:37 +0000553 while( (c = sqlite3Utf8Read(zPattern,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000554 if( !prevEscape && c==matchAll ){
drh769e97e2009-04-01 16:33:37 +0000555 while( (c=sqlite3Utf8Read(zPattern,&zPattern)) == matchAll
drh66150952007-07-23 19:12:41 +0000556 || c == matchOne ){
drh769e97e2009-04-01 16:33:37 +0000557 if( c==matchOne && sqlite3Utf8Read(zString, &zString)==0 ){
drh66150952007-07-23 19:12:41 +0000558 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000559 }
danielk1977ad7dd422004-06-06 12:41:49 +0000560 }
drh66150952007-07-23 19:12:41 +0000561 if( c==0 ){
562 return 1;
563 }else if( c==esc ){
drh769e97e2009-04-01 16:33:37 +0000564 c = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000565 if( c==0 ){
566 return 0;
567 }
568 }else if( c==matchSet ){
569 assert( esc==0 ); /* This is GLOB, not LIKE */
570 assert( matchSet<0x80 ); /* '[' is a single-byte character */
571 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000572 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000573 }
574 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000575 }
drh769e97e2009-04-01 16:33:37 +0000576 while( (c2 = sqlite3Utf8Read(zString,&zString))!=0 ){
drh66150952007-07-23 19:12:41 +0000577 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000578 GlogUpperToLower(c2);
579 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000580 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000581 c2 = sqlite3Utf8Read(zString, &zString);
drh6ed4b782007-12-10 18:07:20 +0000582 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000583 }
drh66150952007-07-23 19:12:41 +0000584 }else{
585 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000586 c2 = sqlite3Utf8Read(zString, &zString);
drh66150952007-07-23 19:12:41 +0000587 }
drh4e5ffc52004-08-31 00:52:37 +0000588 }
drh66150952007-07-23 19:12:41 +0000589 if( c2==0 ) return 0;
590 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
591 }
592 return 0;
593 }else if( !prevEscape && c==matchOne ){
drh769e97e2009-04-01 16:33:37 +0000594 if( sqlite3Utf8Read(zString, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000595 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000596 }
drh4e5ffc52004-08-31 00:52:37 +0000597 }else if( c==matchSet ){
drh1aa4f3e2011-06-15 12:43:36 +0000598 u32 prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000599 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000600 seen = 0;
601 invert = 0;
drh769e97e2009-04-01 16:33:37 +0000602 c = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000603 if( c==0 ) return 0;
drh769e97e2009-04-01 16:33:37 +0000604 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000605 if( c2=='^' ){
606 invert = 1;
drh769e97e2009-04-01 16:33:37 +0000607 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000608 }
drh4e5ffc52004-08-31 00:52:37 +0000609 if( c2==']' ){
610 if( c==']' ) seen = 1;
drh769e97e2009-04-01 16:33:37 +0000611 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000612 }
drh66150952007-07-23 19:12:41 +0000613 while( c2 && c2!=']' ){
614 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
drh769e97e2009-04-01 16:33:37 +0000615 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000616 if( c>=prior_c && c<=c2 ) seen = 1;
617 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000618 }else{
drh66150952007-07-23 19:12:41 +0000619 if( c==c2 ){
620 seen = 1;
621 }
drh4e5ffc52004-08-31 00:52:37 +0000622 prior_c = c2;
623 }
drh769e97e2009-04-01 16:33:37 +0000624 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000625 }
drh66150952007-07-23 19:12:41 +0000626 if( c2==0 || (seen ^ invert)==0 ){
627 return 0;
628 }
629 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000630 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000631 }else{
drh769e97e2009-04-01 16:33:37 +0000632 c2 = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000633 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000634 GlogUpperToLower(c);
635 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000636 }
drh66150952007-07-23 19:12:41 +0000637 if( c!=c2 ){
638 return 0;
639 }
danielk19777c6303c2004-11-17 16:41:29 +0000640 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000641 }
danielk197751ad0ec2004-05-24 12:39:02 +0000642 }
drh4e5ffc52004-08-31 00:52:37 +0000643 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000644}
drh4e5ffc52004-08-31 00:52:37 +0000645
drh55ef4d92005-08-14 01:20:37 +0000646/*
647** Count the number of times that the LIKE operator (or GLOB which is
648** just a variation of LIKE) gets called. This is used for testing
649** only.
650*/
651#ifdef SQLITE_TEST
652int sqlite3_like_count = 0;
653#endif
654
danielk19773f6b0872004-06-17 05:36:44 +0000655
656/*
657** Implementation of the like() SQL function. This function implements
658** the build-in LIKE operator. The first argument to the function is the
659** pattern and the second argument is the string. So, the SQL statements:
660**
661** A LIKE B
662**
663** is implemented as like(B,A).
664**
drh55ef4d92005-08-14 01:20:37 +0000665** This same function (with a different compareInfo structure) computes
666** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000667*/
668static void likeFunc(
669 sqlite3_context *context,
670 int argc,
671 sqlite3_value **argv
672){
drhbeb818d2007-05-08 15:34:47 +0000673 const unsigned char *zA, *zB;
drh0a32fa62011-06-13 12:19:21 +0000674 u32 escape = 0;
drh27e62db2009-04-02 10:16:17 +0000675 int nPat;
drhbb4957f2008-03-20 14:03:29 +0000676 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000677
drh1f0feef2007-05-15 13:27:07 +0000678 zB = sqlite3_value_text(argv[0]);
679 zA = sqlite3_value_text(argv[1]);
680
drhbeb818d2007-05-08 15:34:47 +0000681 /* Limit the length of the LIKE or GLOB pattern to avoid problems
682 ** of deep recursion and N*N behavior in patternCompare().
683 */
drh27e62db2009-04-02 10:16:17 +0000684 nPat = sqlite3_value_bytes(argv[0]);
685 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] );
686 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 );
687 if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000688 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
689 return;
690 }
drh1f0feef2007-05-15 13:27:07 +0000691 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000692
danielk19777c6303c2004-11-17 16:41:29 +0000693 if( argc==3 ){
694 /* The escape character string must consist of a single UTF-8 character.
695 ** Otherwise, return an error.
696 */
697 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000698 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000699 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000700 sqlite3_result_error(context,
701 "ESCAPE expression must be a single character", -1);
702 return;
703 }
drh769e97e2009-04-01 16:33:37 +0000704 escape = sqlite3Utf8Read(zEsc, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000705 }
danielk19773f6b0872004-06-17 05:36:44 +0000706 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000707 struct compareInfo *pInfo = sqlite3_user_data(context);
708#ifdef SQLITE_TEST
709 sqlite3_like_count++;
710#endif
drhbeb818d2007-05-08 15:34:47 +0000711
danielk1977b56fe1f2007-05-09 08:24:44 +0000712 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000713 }
drh8912d102002-05-26 21:34:58 +0000714}
715
drhc8872962012-09-12 18:45:31 +0000716#if defined(SQLITE_ENABLE_REGEXP)
717#include <sys/types.h>
718#include <regex.h>
719
720/*
721** Free a regex_t object obtained from sqlite_malloc().
722*/
723static void regexpFree(void *pToFree){
724 regex_t *pRe = (regex_t*)pToFree;
725 regfree(pRe);
726 sqlite3_free(pRe);
727}
728
729/*
730** Implementation of the regexp() SQL function. This function implements
731** the build-in REGEXP operator. The first argument to the function is the
732** pattern and the second argument is the string. So, the SQL statements:
733**
734** A REGEXP B
735**
736** is implemented as regexp(B,A).
737*/
738static void regexpFunc(
739 sqlite3_context *context,
740 int argc,
741 sqlite3_value **argv
742){
743 regex_t *pRe;
744 int rc;
745 char zErr[100];
746
747 pRe = sqlite3_get_auxdata(context, 0);
748 if( pRe==0 ){
749 pRe = sqlite3_malloc( sizeof(*pRe) );
750 if( pRe==0 ){
751 sqlite3_result_error_nomem(context);
752 return;
753 }
754 memset(pRe, 0, sizeof(*pRe));
755 rc = regcomp(pRe, (const char*)sqlite3_value_text(argv[0]),
756 REG_NOSUB|REG_EXTENDED);
757 if( rc ){
758 regerror(rc, pRe, zErr, sizeof(zErr));
759 sqlite3_result_error(context, zErr, -1);
760 regfree(pRe);
761 }else{
762 sqlite3_set_auxdata(context, 0, pRe, regexpFree);
763 }
764 }
765 rc = regexec(pRe, (const char*)sqlite3_value_text(argv[1]), 0, 0, 0);
766 if( rc==0 ){
767 sqlite3_result_int(context, 1);
768 }else{
769 sqlite3_result_int(context, 0);
770 }
771}
772#endif /* defined(SQLITE_ENABLE_REGEXP) */
773
drh8912d102002-05-26 21:34:58 +0000774/*
775** Implementation of the NULLIF(x,y) function. The result is the first
776** argument if the arguments are different. The result is NULL if the
777** arguments are equal to each other.
778*/
drhf9b596e2004-05-26 16:54:42 +0000779static void nullifFunc(
780 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000781 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +0000782 sqlite3_value **argv
783){
danielk1977dc1bdc42004-06-11 10:51:27 +0000784 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk197762c14b32008-11-19 09:05:26 +0000785 UNUSED_PARAMETER(NotUsed);
danielk1977dc1bdc42004-06-11 10:51:27 +0000786 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000787 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000788 }
drh0ac65892002-04-20 14:24:41 +0000789}
790
drh647cb0e2002-11-04 19:32:25 +0000791/*
drh47baebc2009-08-14 16:01:24 +0000792** Implementation of the sqlite_version() function. The result is the version
drh647cb0e2002-11-04 19:32:25 +0000793** of the SQLite library that is running.
794*/
drhf9b596e2004-05-26 16:54:42 +0000795static void versionFunc(
796 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000797 int NotUsed,
798 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000799){
danielk197762c14b32008-11-19 09:05:26 +0000800 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000801 /* IMP: R-48699-48617 This function is an SQL wrapper around the
802 ** sqlite3_libversion() C-interface. */
803 sqlite3_result_text(context, sqlite3_libversion(), -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000804}
805
drh47baebc2009-08-14 16:01:24 +0000806/*
807** Implementation of the sqlite_source_id() function. The result is a string
808** that identifies the particular version of the source code used to build
809** SQLite.
810*/
811static void sourceidFunc(
812 sqlite3_context *context,
813 int NotUsed,
814 sqlite3_value **NotUsed2
815){
816 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000817 /* IMP: R-24470-31136 This function is an SQL wrapper around the
818 ** sqlite3_sourceid() C interface. */
819 sqlite3_result_text(context, sqlite3_sourceid(), -1, SQLITE_STATIC);
drh47baebc2009-08-14 16:01:24 +0000820}
821
shanehbdea6d12010-02-23 04:19:54 +0000822/*
drh3ca84ef2011-04-25 18:03:10 +0000823** Implementation of the sqlite_log() function. This is a wrapper around
824** sqlite3_log(). The return value is NULL. The function exists purely for
825** its side-effects.
826*/
drh840561f2011-04-27 18:08:42 +0000827static void errlogFunc(
drh3ca84ef2011-04-25 18:03:10 +0000828 sqlite3_context *context,
829 int argc,
830 sqlite3_value **argv
831){
832 UNUSED_PARAMETER(argc);
833 UNUSED_PARAMETER(context);
834 sqlite3_log(sqlite3_value_int(argv[0]), "%s", sqlite3_value_text(argv[1]));
835}
836
837/*
shanehdc97a8c2010-02-23 20:08:35 +0000838** Implementation of the sqlite_compileoption_used() function.
839** The result is an integer that identifies if the compiler option
840** was used to build SQLite.
shanehbdea6d12010-02-23 04:19:54 +0000841*/
shanehdc97a8c2010-02-23 20:08:35 +0000842#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
843static void compileoptionusedFunc(
shanehbdea6d12010-02-23 04:19:54 +0000844 sqlite3_context *context,
shanehdc97a8c2010-02-23 20:08:35 +0000845 int argc,
846 sqlite3_value **argv
shanehbdea6d12010-02-23 04:19:54 +0000847){
shanehdc97a8c2010-02-23 20:08:35 +0000848 const char *zOptName;
849 assert( argc==1 );
850 UNUSED_PARAMETER(argc);
drha3e414c2010-08-03 18:06:25 +0000851 /* IMP: R-39564-36305 The sqlite_compileoption_used() SQL
852 ** function is a wrapper around the sqlite3_compileoption_used() C/C++
853 ** function.
854 */
drh264a2d42010-02-25 15:28:41 +0000855 if( (zOptName = (const char*)sqlite3_value_text(argv[0]))!=0 ){
shanehdc97a8c2010-02-23 20:08:35 +0000856 sqlite3_result_int(context, sqlite3_compileoption_used(zOptName));
shanehdc97a8c2010-02-23 20:08:35 +0000857 }
shanehbdea6d12010-02-23 04:19:54 +0000858}
shanehdc97a8c2010-02-23 20:08:35 +0000859#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
860
861/*
862** Implementation of the sqlite_compileoption_get() function.
863** The result is a string that identifies the compiler options
864** used to build SQLite.
865*/
866#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
867static void compileoptiongetFunc(
868 sqlite3_context *context,
869 int argc,
870 sqlite3_value **argv
871){
872 int n;
873 assert( argc==1 );
874 UNUSED_PARAMETER(argc);
drha3e414c2010-08-03 18:06:25 +0000875 /* IMP: R-04922-24076 The sqlite_compileoption_get() SQL function
876 ** is a wrapper around the sqlite3_compileoption_get() C/C++ function.
877 */
shanehdc97a8c2010-02-23 20:08:35 +0000878 n = sqlite3_value_int(argv[0]);
879 sqlite3_result_text(context, sqlite3_compileoption_get(n), -1, SQLITE_STATIC);
880}
881#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
shanehbdea6d12010-02-23 04:19:54 +0000882
drh137c7282007-01-29 17:58:28 +0000883/* Array for converting from half-bytes (nybbles) into ASCII hex
884** digits. */
885static const char hexdigits[] = {
886 '0', '1', '2', '3', '4', '5', '6', '7',
887 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
888};
danielk1977d641d642004-11-18 15:44:29 +0000889
drh47394702003-08-20 01:03:33 +0000890/*
891** EXPERIMENTAL - This is not an official function. The interface may
892** change. This function may disappear. Do not write code that depends
893** on this function.
894**
895** Implementation of the QUOTE() function. This function takes a single
896** argument. If the argument is numeric, the return value is the same as
897** the argument. If the argument is NULL, the return value is the string
898** "NULL". Otherwise, the argument is enclosed in single quotes with
899** single-quote escapes.
900*/
danielk19770ae8b832004-05-25 12:05:56 +0000901static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drha0df4cc2009-02-02 17:29:59 +0000902 assert( argc==1 );
drh1d34fde2009-02-03 15:50:33 +0000903 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000904 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000905 case SQLITE_FLOAT: {
drh72b3fbc2012-06-19 03:11:25 +0000906 double r1, r2;
drh72b3fbc2012-06-19 03:11:25 +0000907 char zBuf[50];
mistachkin2b434a72012-06-19 04:36:48 +0000908 r1 = sqlite3_value_double(argv[0]);
drh72b3fbc2012-06-19 03:11:25 +0000909 sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.15g", r1);
910 sqlite3AtoF(zBuf, &r2, 20, SQLITE_UTF8);
911 if( r1!=r2 ){
912 sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.20e", r1);
913 }
914 sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
915 break;
916 }
917 case SQLITE_INTEGER: {
drhf4479502004-05-27 03:12:53 +0000918 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000919 break;
920 }
danielk19773f41e972004-06-08 00:39:01 +0000921 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000922 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000923 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000924 int nBlob = sqlite3_value_bytes(argv[0]);
925 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000926 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000927 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000928 int i;
929 for(i=0; i<nBlob; i++){
930 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
931 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
932 }
933 zText[(nBlob*2)+2] = '\'';
934 zText[(nBlob*2)+3] = '\0';
935 zText[0] = 'X';
936 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000937 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000938 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000939 }
940 break;
941 }
drh9c054832004-05-31 18:51:57 +0000942 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000943 int i,j;
944 u64 n;
drh2646da72005-12-09 20:02:05 +0000945 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000946 char *z;
947
drh7a521cf2007-04-25 18:23:52 +0000948 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000949 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000950 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000951 if( z ){
952 z[0] = '\'';
953 for(i=0, j=1; zArg[i]; i++){
954 z[j++] = zArg[i];
955 if( zArg[i]=='\'' ){
956 z[j++] = '\'';
957 }
drhf9b596e2004-05-26 16:54:42 +0000958 }
danielk1977a1644fd2007-08-29 12:31:25 +0000959 z[j++] = '\'';
960 z[j] = 0;
961 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000962 }
drha0df4cc2009-02-02 17:29:59 +0000963 break;
964 }
965 default: {
966 assert( sqlite3_value_type(argv[0])==SQLITE_NULL );
967 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
968 break;
drhf9b596e2004-05-26 16:54:42 +0000969 }
drh47394702003-08-20 01:03:33 +0000970 }
971}
972
drh137c7282007-01-29 17:58:28 +0000973/*
974** The hex() function. Interpret the argument as a blob. Return
975** a hexadecimal rendering as text.
976*/
977static void hexFunc(
978 sqlite3_context *context,
979 int argc,
980 sqlite3_value **argv
981){
982 int i, n;
983 const unsigned char *pBlob;
984 char *zHex, *z;
985 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000986 UNUSED_PARAMETER(argc);
drh1f0feef2007-05-15 13:27:07 +0000987 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000988 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000989 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000990 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000991 if( zHex ){
992 for(i=0; i<n; i++, pBlob++){
993 unsigned char c = *pBlob;
994 *(z++) = hexdigits[(c>>4)&0xf];
995 *(z++) = hexdigits[c&0xf];
996 }
997 *z = 0;
998 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000999 }
drh137c7282007-01-29 17:58:28 +00001000}
1001
drh26b6d902007-03-17 13:27:54 +00001002/*
drh8cff3822007-05-02 02:08:28 +00001003** The zeroblob(N) function returns a zero-filled blob of size N bytes.
1004*/
1005static void zeroblobFunc(
1006 sqlite3_context *context,
1007 int argc,
1008 sqlite3_value **argv
1009){
drh98640a32007-06-07 19:08:32 +00001010 i64 n;
drh27e62db2009-04-02 10:16:17 +00001011 sqlite3 *db = sqlite3_context_db_handle(context);
drh8cff3822007-05-02 02:08:28 +00001012 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001013 UNUSED_PARAMETER(argc);
drh98640a32007-06-07 19:08:32 +00001014 n = sqlite3_value_int64(argv[0]);
drh27e62db2009-04-02 10:16:17 +00001015 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH] );
1016 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
1017 if( n>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drh98640a32007-06-07 19:08:32 +00001018 sqlite3_result_error_toobig(context);
1019 }else{
drhab2f1f92010-01-11 18:26:42 +00001020 sqlite3_result_zeroblob(context, (int)n); /* IMP: R-00293-64994 */
drh98640a32007-06-07 19:08:32 +00001021 }
drh8cff3822007-05-02 02:08:28 +00001022}
1023
1024/*
drh26b6d902007-03-17 13:27:54 +00001025** The replace() function. Three arguments are all strings: call
1026** them A, B, and C. The result is also a string which is derived
1027** from A by replacing every occurance of B with C. The match
1028** must be exact. Collating sequences are not used.
1029*/
1030static void replaceFunc(
1031 sqlite3_context *context,
1032 int argc,
1033 sqlite3_value **argv
1034){
1035 const unsigned char *zStr; /* The input string A */
1036 const unsigned char *zPattern; /* The pattern string B */
1037 const unsigned char *zRep; /* The replacement string C */
1038 unsigned char *zOut; /* The output */
1039 int nStr; /* Size of zStr */
1040 int nPattern; /* Size of zPattern */
1041 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +00001042 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +00001043 int loopLimit; /* Last zStr[] that might match zPattern[] */
1044 int i, j; /* Loop counters */
1045
1046 assert( argc==3 );
danielk1977f3d3c272008-11-19 16:52:44 +00001047 UNUSED_PARAMETER(argc);
drh26b6d902007-03-17 13:27:54 +00001048 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001049 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +00001050 nStr = sqlite3_value_bytes(argv[0]);
1051 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +00001052 zPattern = sqlite3_value_text(argv[1]);
drha605fe82009-02-01 18:08:40 +00001053 if( zPattern==0 ){
drh23336062009-02-03 13:19:12 +00001054 assert( sqlite3_value_type(argv[1])==SQLITE_NULL
1055 || sqlite3_context_db_handle(context)->mallocFailed );
drha605fe82009-02-01 18:08:40 +00001056 return;
1057 }
1058 if( zPattern[0]==0 ){
1059 assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
1060 sqlite3_result_value(context, argv[0]);
1061 return;
1062 }
drh1f0feef2007-05-15 13:27:07 +00001063 nPattern = sqlite3_value_bytes(argv[1]);
1064 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +00001065 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +00001066 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +00001067 nRep = sqlite3_value_bytes(argv[2]);
1068 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +00001069 nOut = nStr + 1;
1070 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +00001071 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +00001072 if( zOut==0 ){
1073 return;
drh26b6d902007-03-17 13:27:54 +00001074 }
drh26b6d902007-03-17 13:27:54 +00001075 loopLimit = nStr - nPattern;
1076 for(i=j=0; i<=loopLimit; i++){
1077 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
1078 zOut[j++] = zStr[i];
1079 }else{
drh4a50aac2007-08-23 02:47:53 +00001080 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +00001081 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +00001082 nOut += nRep - nPattern;
drh27e62db2009-04-02 10:16:17 +00001083 testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
1084 testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
1085 if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +00001086 sqlite3_result_error_toobig(context);
drhb9755982010-07-24 16:34:37 +00001087 sqlite3_free(zOut);
danielk197717374e82007-05-08 14:39:04 +00001088 return;
1089 }
drh4a50aac2007-08-23 02:47:53 +00001090 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +00001091 zOut = sqlite3_realloc(zOut, (int)nOut);
1092 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +00001093 sqlite3_result_error_nomem(context);
drhb9755982010-07-24 16:34:37 +00001094 sqlite3_free(zOld);
drh2e6400b2007-05-08 15:46:18 +00001095 return;
1096 }
drh26b6d902007-03-17 13:27:54 +00001097 memcpy(&zOut[j], zRep, nRep);
1098 j += nRep;
1099 i += nPattern-1;
1100 }
1101 }
drh2e6400b2007-05-08 15:46:18 +00001102 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +00001103 memcpy(&zOut[j], &zStr[i], nStr-i);
1104 j += nStr - i;
1105 assert( j<=nOut );
1106 zOut[j] = 0;
1107 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
1108}
1109
drh309b3382007-03-17 17:52:42 +00001110/*
1111** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
1112** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
1113*/
1114static void trimFunc(
1115 sqlite3_context *context,
1116 int argc,
1117 sqlite3_value **argv
1118){
1119 const unsigned char *zIn; /* Input string */
1120 const unsigned char *zCharSet; /* Set of characters to trim */
1121 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +00001122 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +00001123 int i; /* Loop counter */
drh1bd10f82008-12-10 21:19:56 +00001124 unsigned char *aLen = 0; /* Length of each character in zCharSet */
1125 unsigned char **azChar = 0; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +00001126 int nChar; /* Number of characters in zCharSet */
1127
drh309b3382007-03-17 17:52:42 +00001128 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
1129 return;
1130 }
1131 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001132 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +00001133 nIn = sqlite3_value_bytes(argv[0]);
1134 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +00001135 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +00001136 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +00001137 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +00001138 nChar = 1;
drh8cff3822007-05-02 02:08:28 +00001139 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +00001140 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +00001141 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +00001142 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +00001143 return;
drhd1e3a612007-04-27 21:59:52 +00001144 }else{
1145 const unsigned char *z;
1146 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +00001147 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +00001148 }
1149 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +00001150 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +00001151 if( azChar==0 ){
1152 return;
1153 }
1154 aLen = (unsigned char*)&azChar[nChar];
1155 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +00001156 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +00001157 SQLITE_SKIP_UTF8(z);
drh3abbd392008-12-10 23:04:13 +00001158 aLen[nChar] = (u8)(z - azChar[nChar]);
drhd1e3a612007-04-27 21:59:52 +00001159 }
1160 }
drh309b3382007-03-17 17:52:42 +00001161 }
drhd1e3a612007-04-27 21:59:52 +00001162 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +00001163 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +00001164 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +00001165 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +00001166 int len = 0;
drhd1e3a612007-04-27 21:59:52 +00001167 for(i=0; i<nChar; i++){
1168 len = aLen[i];
drh27e62db2009-04-02 10:16:17 +00001169 if( len<=nIn && memcmp(zIn, azChar[i], len)==0 ) break;
drhd1e3a612007-04-27 21:59:52 +00001170 }
1171 if( i>=nChar ) break;
1172 zIn += len;
1173 nIn -= len;
drh309b3382007-03-17 17:52:42 +00001174 }
1175 }
1176 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +00001177 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +00001178 int len = 0;
drhd1e3a612007-04-27 21:59:52 +00001179 for(i=0; i<nChar; i++){
1180 len = aLen[i];
1181 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
1182 }
1183 if( i>=nChar ) break;
1184 nIn -= len;
drh309b3382007-03-17 17:52:42 +00001185 }
1186 }
drhd1e3a612007-04-27 21:59:52 +00001187 if( zCharSet ){
1188 sqlite3_free(azChar);
1189 }
drh309b3382007-03-17 17:52:42 +00001190 }
1191 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
1192}
drh26b6d902007-03-17 13:27:54 +00001193
danielk1977a4de4532008-09-02 15:44:08 +00001194
drh2ba3ccc2009-12-08 02:06:08 +00001195/* IMP: R-25361-16150 This function is omitted from SQLite by default. It
1196** is only available if the SQLITE_SOUNDEX compile-time option is used
1197** when SQLite is built.
1198*/
drhd24cc422003-03-27 12:51:24 +00001199#ifdef SQLITE_SOUNDEX
1200/*
1201** Compute the soundex encoding of a word.
drh2ba3ccc2009-12-08 02:06:08 +00001202**
1203** IMP: R-59782-00072 The soundex(X) function returns a string that is the
1204** soundex encoding of the string X.
drhd24cc422003-03-27 12:51:24 +00001205*/
drh137c7282007-01-29 17:58:28 +00001206static void soundexFunc(
1207 sqlite3_context *context,
1208 int argc,
1209 sqlite3_value **argv
1210){
drhd24cc422003-03-27 12:51:24 +00001211 char zResult[8];
drh4c755c02004-08-08 20:22:17 +00001212 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +00001213 int i, j;
1214 static const unsigned char iCode[] = {
1215 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1216 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1217 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1218 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1219 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1220 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1221 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1222 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1223 };
1224 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +00001225 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +00001226 if( zIn==0 ) zIn = (u8*)"";
drhdc86e2b2009-01-24 11:30:42 +00001227 for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
drhd24cc422003-03-27 12:51:24 +00001228 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +00001229 u8 prevcode = iCode[zIn[i]&0x7f];
danielk197778ca0e72009-01-20 16:53:39 +00001230 zResult[0] = sqlite3Toupper(zIn[i]);
drhd24cc422003-03-27 12:51:24 +00001231 for(j=1; j<4 && zIn[i]; i++){
1232 int code = iCode[zIn[i]&0x7f];
1233 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +00001234 if( code!=prevcode ){
1235 prevcode = code;
1236 zResult[j++] = code + '0';
1237 }
1238 }else{
1239 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +00001240 }
1241 }
1242 while( j<4 ){
1243 zResult[j++] = '0';
1244 }
1245 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001246 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +00001247 }else{
drh2ba3ccc2009-12-08 02:06:08 +00001248 /* IMP: R-64894-50321 The string "?000" is returned if the argument
1249 ** is NULL or contains no ASCII alphabetic characters. */
danielk1977d8123362004-06-12 09:25:12 +00001250 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +00001251 }
1252}
drh2ba3ccc2009-12-08 02:06:08 +00001253#endif /* SQLITE_SOUNDEX */
drhd24cc422003-03-27 12:51:24 +00001254
drhfdb83b22006-06-17 14:12:47 +00001255#ifndef SQLITE_OMIT_LOAD_EXTENSION
1256/*
1257** A function that loads a shared-library extension then returns NULL.
1258*/
1259static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001260 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001261 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001262 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001263 char *zErrMsg = 0;
1264
1265 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001266 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001267 }else{
1268 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001269 }
drh7a521cf2007-04-25 18:23:52 +00001270 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001271 sqlite3_result_error(context, zErrMsg, -1);
1272 sqlite3_free(zErrMsg);
1273 }
1274}
1275#endif
1276
danielk197701427a62005-01-11 13:02:33 +00001277
drh0ac65892002-04-20 14:24:41 +00001278/*
drhd3a149e2002-02-24 17:12:53 +00001279** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001280** sum() or avg() aggregate computation.
1281*/
1282typedef struct SumCtx SumCtx;
1283struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001284 double rSum; /* Floating point sum */
1285 i64 iSum; /* Integer sum */
1286 i64 cnt; /* Number of elements summed */
1287 u8 overflow; /* True if integer overflow seen */
1288 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001289};
1290
1291/*
drha97fdd32006-01-12 22:17:50 +00001292** Routines used to compute the sum, average, and total.
1293**
1294** The SUM() function follows the (broken) SQL standard which means
1295** that it returns NULL if it sums over no inputs. TOTAL returns
1296** 0.0 in that case. In addition, TOTAL always returns a float where
1297** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001298** value. TOTAL never fails, but SUM might through an exception if
1299** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001300*/
danielk19770ae8b832004-05-25 12:05:56 +00001301static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001302 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001303 int type;
drh3f219f42005-09-08 19:45:57 +00001304 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001305 UNUSED_PARAMETER(argc);
drh4f26d6c2004-05-26 23:25:30 +00001306 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001307 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001308 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001309 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001310 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001311 i64 v = sqlite3_value_int64(argv[0]);
1312 p->rSum += v;
drh158b9cb2011-03-05 20:59:46 +00001313 if( (p->approx|p->overflow)==0 && sqlite3AddInt64(&p->iSum, v) ){
1314 p->overflow = 1;
drh29d72102006-02-09 22:13:41 +00001315 }
1316 }else{
drh8c08e862006-02-11 17:34:00 +00001317 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001318 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001319 }
drh739105c2002-05-29 23:22:23 +00001320 }
drhdd5baa92002-02-27 19:50:59 +00001321}
danielk19770ae8b832004-05-25 12:05:56 +00001322static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001323 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001324 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001325 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001326 if( p->overflow ){
1327 sqlite3_result_error(context,"integer overflow",-1);
1328 }else if( p->approx ){
1329 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001330 }else{
drh8c08e862006-02-11 17:34:00 +00001331 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001332 }
drh3d1d95e2005-09-08 10:37:01 +00001333 }
drhdd5baa92002-02-27 19:50:59 +00001334}
danielk19770ae8b832004-05-25 12:05:56 +00001335static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001336 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001337 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001338 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001339 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001340 }
1341}
drha97fdd32006-01-12 22:17:50 +00001342static void totalFinalize(sqlite3_context *context){
1343 SumCtx *p;
1344 p = sqlite3_aggregate_context(context, 0);
shanefbd60f82009-02-04 03:59:25 +00001345 /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
1346 sqlite3_result_double(context, p ? p->rSum : (double)0);
drha97fdd32006-01-12 22:17:50 +00001347}
drhdd5baa92002-02-27 19:50:59 +00001348
1349/*
drh0bce8352002-02-28 00:41:10 +00001350** The following structure keeps track of state information for the
1351** count() aggregate function.
1352*/
1353typedef struct CountCtx CountCtx;
1354struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001355 i64 n;
drh0bce8352002-02-28 00:41:10 +00001356};
drhdd5baa92002-02-27 19:50:59 +00001357
drh0bce8352002-02-28 00:41:10 +00001358/*
1359** Routines to implement the count() aggregate function.
1360*/
danielk19770ae8b832004-05-25 12:05:56 +00001361static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001362 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001363 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001364 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001365 p->n++;
1366 }
drh2e79c3d2009-04-08 23:04:14 +00001367
drhd3264c72009-04-15 13:39:47 +00001368#ifndef SQLITE_OMIT_DEPRECATED
drh2e79c3d2009-04-08 23:04:14 +00001369 /* The sqlite3_aggregate_count() function is deprecated. But just to make
1370 ** sure it still operates correctly, verify that its count agrees with our
1371 ** internal count when using count(*) and when the total count can be
1372 ** expressed as a 32-bit integer. */
1373 assert( argc==1 || p==0 || p->n>0x7fffffff
1374 || p->n==sqlite3_aggregate_count(context) );
drhd3264c72009-04-15 13:39:47 +00001375#endif
drh0bce8352002-02-28 00:41:10 +00001376}
danielk19770ae8b832004-05-25 12:05:56 +00001377static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001378 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001379 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001380 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001381}
1382
1383/*
drh0bce8352002-02-28 00:41:10 +00001384** Routines to implement min() and max() aggregate functions.
1385*/
danielk197762c14b32008-11-19 09:05:26 +00001386static void minmaxStep(
1387 sqlite3_context *context,
1388 int NotUsed,
1389 sqlite3_value **argv
1390){
danielk197788208052004-05-25 01:13:20 +00001391 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001392 Mem *pBest;
danielk197762c14b32008-11-19 09:05:26 +00001393 UNUSED_PARAMETER(NotUsed);
drh9eb516c2004-07-18 20:52:32 +00001394
drh9eb516c2004-07-18 20:52:32 +00001395 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001396 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001397
drh94a6d992012-02-02 18:42:09 +00001398 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
1399 if( pBest->flags ) sqlite3SkipAccumulatorLoad(context);
1400 }else if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001401 int max;
1402 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001403 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001404 /* This step function is used for both the min() and max() aggregates,
1405 ** the only difference between the two being that the sense of the
1406 ** comparison is inverted. For the max() aggregate, the
1407 ** sqlite3_user_data() function returns (void *)-1. For min() it
1408 ** returns (void *)db, where db is the sqlite3* database pointer.
1409 ** Therefore the next statement sets variable 'max' to 1 for the max()
1410 ** aggregate, or 0 for min().
1411 */
drh309b3382007-03-17 17:52:42 +00001412 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001413 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001414 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001415 sqlite3VdbeMemCopy(pBest, pArg);
drh7a957892012-02-02 17:35:43 +00001416 }else{
1417 sqlite3SkipAccumulatorLoad(context);
danielk197788208052004-05-25 01:13:20 +00001418 }
drh268380c2004-02-25 13:47:31 +00001419 }else{
drhb21c8cd2007-08-21 19:33:56 +00001420 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001421 }
1422}
danielk19770ae8b832004-05-25 12:05:56 +00001423static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001424 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001425 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1426 if( pRes ){
drh94a6d992012-02-02 18:42:09 +00001427 if( pRes->flags ){
drhabfcea22005-09-06 20:36:48 +00001428 sqlite3_result_value(context, pRes);
1429 }
1430 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001431 }
1432}
drhdd5baa92002-02-27 19:50:59 +00001433
drhb0689692007-11-01 17:38:30 +00001434/*
1435** group_concat(EXPR, ?SEPARATOR?)
1436*/
1437static void groupConcatStep(
1438 sqlite3_context *context,
1439 int argc,
1440 sqlite3_value **argv
1441){
1442 const char *zVal;
drhade86482007-11-28 22:36:40 +00001443 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001444 const char *zSep;
drh07d31172009-02-02 21:57:05 +00001445 int nVal, nSep;
1446 assert( argc==1 || argc==2 );
1447 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001448 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1449
1450 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001451 sqlite3 *db = sqlite3_context_db_handle(context);
drh8bfd7192009-06-19 16:44:41 +00001452 int firstTerm = pAccum->useMalloc==0;
drhb9755982010-07-24 16:34:37 +00001453 pAccum->useMalloc = 2;
drhbb4957f2008-03-20 14:03:29 +00001454 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drh8bfd7192009-06-19 16:44:41 +00001455 if( !firstTerm ){
drh07d31172009-02-02 21:57:05 +00001456 if( argc==2 ){
1457 zSep = (char*)sqlite3_value_text(argv[1]);
1458 nSep = sqlite3_value_bytes(argv[1]);
drhb0689692007-11-01 17:38:30 +00001459 }else{
1460 zSep = ",";
drhade86482007-11-28 22:36:40 +00001461 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001462 }
drhade86482007-11-28 22:36:40 +00001463 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001464 }
drh07d31172009-02-02 21:57:05 +00001465 zVal = (char*)sqlite3_value_text(argv[0]);
1466 nVal = sqlite3_value_bytes(argv[0]);
1467 sqlite3StrAccumAppend(pAccum, zVal, nVal);
drhb0689692007-11-01 17:38:30 +00001468 }
1469}
1470static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001471 StrAccum *pAccum;
1472 pAccum = sqlite3_aggregate_context(context, 0);
1473 if( pAccum ){
1474 if( pAccum->tooBig ){
1475 sqlite3_result_error_toobig(context);
1476 }else if( pAccum->mallocFailed ){
1477 sqlite3_result_error_nomem(context);
1478 }else{
1479 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1480 sqlite3_free);
1481 }
drhb0689692007-11-01 17:38:30 +00001482 }
1483}
drh4e5ffc52004-08-31 00:52:37 +00001484
drhd3a149e2002-02-24 17:12:53 +00001485/*
drha4741842010-04-25 20:58:37 +00001486** This routine does per-connection function registration. Most
1487** of the built-in functions above are part of the global function set.
1488** This routine only deals with those that are not global.
drhdc04c582002-02-24 01:55:15 +00001489*/
drh9bb575f2004-09-06 17:24:11 +00001490void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drha4741842010-04-25 20:58:37 +00001491 int rc = sqlite3_overload_function(db, "MATCH", 2);
1492 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1493 if( rc==SQLITE_NOMEM ){
1494 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001495 }
drh55ef4d92005-08-14 01:20:37 +00001496}
1497
1498/*
1499** Set the LIKEOPT flag on the 2-argument function with the given name.
1500*/
drh1bd10f82008-12-10 21:19:56 +00001501static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
drh55ef4d92005-08-14 01:20:37 +00001502 FuncDef *pDef;
drhea678832008-12-10 19:26:22 +00001503 pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
1504 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001505 if( ALWAYS(pDef) ){
drhd64fe2f2005-08-28 17:00:23 +00001506 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001507 }
1508}
1509
1510/*
1511** Register the built-in LIKE and GLOB functions. The caseSensitive
1512** parameter determines whether or not the LIKE operator is case
1513** sensitive. GLOB is always case sensitive.
1514*/
1515void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1516 struct compareInfo *pInfo;
1517 if( caseSensitive ){
1518 pInfo = (struct compareInfo*)&likeInfoAlt;
1519 }else{
1520 pInfo = (struct compareInfo*)&likeInfoNorm;
1521 }
drh901e9942010-12-15 18:54:37 +00001522 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0);
1523 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0);
1524 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
dand2199f02010-08-27 17:48:52 +00001525 (struct compareInfo*)&globInfo, likeFunc, 0, 0, 0);
drhd64fe2f2005-08-28 17:00:23 +00001526 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1527 setLikeOptFlag(db, "like",
1528 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001529}
1530
1531/*
1532** pExpr points to an expression which implements a function. If
1533** it is appropriate to apply the LIKE optimization to that function
1534** then set aWc[0] through aWc[2] to the wildcard characters and
1535** return TRUE. If the function is not a LIKE-style function then
1536** return FALSE.
1537*/
drhd64fe2f2005-08-28 17:00:23 +00001538int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001539 FuncDef *pDef;
danielk19776ab3a2e2009-02-19 14:39:25 +00001540 if( pExpr->op!=TK_FUNCTION
1541 || !pExpr->x.pList
1542 || pExpr->x.pList->nExpr!=2
1543 ){
drh55ef4d92005-08-14 01:20:37 +00001544 return 0;
1545 }
danielk19776ab3a2e2009-02-19 14:39:25 +00001546 assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
drh33e619f2009-05-28 01:00:55 +00001547 pDef = sqlite3FindFunction(db, pExpr->u.zToken,
1548 sqlite3Strlen30(pExpr->u.zToken),
drhb7916a72009-05-27 10:31:29 +00001549 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001550 if( NEVER(pDef==0) || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001551 return 0;
1552 }
1553
1554 /* The memcpy() statement assumes that the wildcard characters are
1555 ** the first three statements in the compareInfo structure. The
1556 ** asserts() that follow verify that assumption
1557 */
1558 memcpy(aWc, pDef->pUserData, 3);
1559 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1560 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1561 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001562 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001563 return 1;
drhdc04c582002-02-24 01:55:15 +00001564}
danielk19778c0a7912008-08-20 14:49:23 +00001565
drh70a8ca32008-08-21 18:49:27 +00001566/*
drh777c5382008-08-21 20:21:34 +00001567** All all of the FuncDef structures in the aBuiltinFunc[] array above
1568** to the global function hash table. This occurs at start-time (as
1569** a consequence of calling sqlite3_initialize()).
1570**
1571** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001572*/
1573void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001574 /*
1575 ** The following array holds FuncDef structures for all of the functions
1576 ** defined in this file.
1577 **
1578 ** The array cannot be constant since changes are made to the
1579 ** FuncDef.pHash elements at start-time. The elements of this array
1580 ** are read-only after initialization is complete.
1581 */
1582 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1583 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1584 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1585 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1586 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1587 FUNCTION(trim, 1, 3, 0, trimFunc ),
1588 FUNCTION(trim, 2, 3, 0, trimFunc ),
1589 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1590 FUNCTION(min, 0, 0, 1, 0 ),
1591 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1592 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1593 FUNCTION(max, 0, 1, 1, 0 ),
1594 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
drha748fdc2012-03-28 01:34:47 +00001595 FUNCTION2(typeof, 1, 0, 0, typeofFunc, SQLITE_FUNC_TYPEOF),
1596 FUNCTION2(length, 1, 0, 0, lengthFunc, SQLITE_FUNC_LENGTH),
danielk197793ce7412008-09-01 19:14:02 +00001597 FUNCTION(substr, 2, 0, 0, substrFunc ),
1598 FUNCTION(substr, 3, 0, 0, substrFunc ),
1599 FUNCTION(abs, 1, 0, 0, absFunc ),
shanefbd60f82009-02-04 03:59:25 +00001600#ifndef SQLITE_OMIT_FLOATING_POINT
danielk197793ce7412008-09-01 19:14:02 +00001601 FUNCTION(round, 1, 0, 0, roundFunc ),
1602 FUNCTION(round, 2, 0, 0, roundFunc ),
shanefbd60f82009-02-04 03:59:25 +00001603#endif
danielk197793ce7412008-09-01 19:14:02 +00001604 FUNCTION(upper, 1, 0, 0, upperFunc ),
1605 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1606 FUNCTION(coalesce, 1, 0, 0, 0 ),
danielk197793ce7412008-09-01 19:14:02 +00001607 FUNCTION(coalesce, 0, 0, 0, 0 ),
drha748fdc2012-03-28 01:34:47 +00001608 FUNCTION2(coalesce, -1, 0, 0, ifnullFunc, SQLITE_FUNC_COALESCE),
danielk197793ce7412008-09-01 19:14:02 +00001609 FUNCTION(hex, 1, 0, 0, hexFunc ),
drha748fdc2012-03-28 01:34:47 +00001610 FUNCTION2(ifnull, 2, 0, 0, ifnullFunc, SQLITE_FUNC_COALESCE),
drh9373b012009-02-02 01:50:39 +00001611 FUNCTION(random, 0, 0, 0, randomFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001612 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1613 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1614 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
drh47baebc2009-08-14 16:01:24 +00001615 FUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ),
drh840561f2011-04-27 18:08:42 +00001616 FUNCTION(sqlite_log, 2, 0, 0, errlogFunc ),
shanehdc97a8c2010-02-23 20:08:35 +00001617#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
drh8bb76d32010-02-26 16:37:47 +00001618 FUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc ),
1619 FUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc ),
shanehdc97a8c2010-02-23 20:08:35 +00001620#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
danielk197793ce7412008-09-01 19:14:02 +00001621 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1622 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1623 FUNCTION(changes, 0, 0, 0, changes ),
1624 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1625 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1626 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1627 #ifdef SQLITE_SOUNDEX
1628 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1629 #endif
1630 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1631 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1632 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1633 #endif
1634 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1635 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1636 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
danielk1977a5533162009-02-24 10:01:51 +00001637 /* AGGREGATE(count, 0, 0, 0, countStep, countFinalize ), */
drh6ac78a02010-09-28 14:26:36 +00001638 {0,SQLITE_UTF8,SQLITE_FUNC_COUNT,0,0,0,countStep,countFinalize,"count",0,0},
danielk197793ce7412008-09-01 19:14:02 +00001639 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
drh07d31172009-02-02 21:57:05 +00001640 AGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize),
1641 AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize),
danielk197793ce7412008-09-01 19:14:02 +00001642
1643 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1644 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1645 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1646 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1647 #else
1648 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1649 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1650 #endif
drhc8872962012-09-12 18:45:31 +00001651
1652#if defined(SQLITE_ENABLE_REGEXP)
1653 FUNCTION(regexp, 2, 0, 0, regexpFunc ),
1654#endif
danielk197793ce7412008-09-01 19:14:02 +00001655 };
1656
drh70a8ca32008-08-21 18:49:27 +00001657 int i;
danielk197793ce7412008-09-01 19:14:02 +00001658 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001659 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001660
drh70a8ca32008-08-21 18:49:27 +00001661 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001662 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001663 }
drh777c5382008-08-21 20:21:34 +00001664 sqlite3RegisterDateTimeFunctions();
drh545f5872010-04-24 14:02:59 +00001665#ifndef SQLITE_OMIT_ALTERTABLE
1666 sqlite3AlterFunctions();
1667#endif
drh70a8ca32008-08-21 18:49:27 +00001668}