blob: c7af7d679cf7a81847017a42dc75c92548907bd0 [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/*
drhd55e0722012-10-25 03:07:29 +0000172** Implementation of the instr() function.
173**
174** instr(haystack,needle) finds the first occurrence of needle
175** in haystack and returns the number of previous characters plus 1,
176** or 0 if needle does not occur within haystack.
177**
178** If both haystack and needle are BLOBs, then the result is one more than
179** the number of bytes in haystack prior to the first occurrence of needle,
180** or 0 if needle never occurs in haystack.
181*/
182static void instrFunc(
183 sqlite3_context *context,
184 int argc,
185 sqlite3_value **argv
186){
187 const unsigned char *zHaystack;
188 const unsigned char *zNeedle;
189 int nHaystack;
190 int nNeedle;
191 int typeHaystack, typeNeedle;
192 int N = 1;
193 int isText;
194
195 typeHaystack = sqlite3_value_type(argv[0]);
196 typeNeedle = sqlite3_value_type(argv[1]);
197 if( typeHaystack==SQLITE_NULL || typeNeedle==SQLITE_NULL ) return;
198 nHaystack = sqlite3_value_bytes(argv[0]);
199 nNeedle = sqlite3_value_bytes(argv[1]);
200 if( typeHaystack==SQLITE_BLOB && typeNeedle==SQLITE_BLOB ){
201 zHaystack = sqlite3_value_blob(argv[0]);
202 zNeedle = sqlite3_value_blob(argv[1]);
203 isText = 0;
204 }else{
205 zHaystack = sqlite3_value_text(argv[0]);
206 zNeedle = sqlite3_value_text(argv[1]);
207 isText = 1;
208 }
209 while( nNeedle<=nHaystack && memcmp(zHaystack, zNeedle, nNeedle)!=0 ){
210 N++;
211 do{
212 nHaystack--;
213 zHaystack++;
214 }while( isText && (zHaystack[0]&0xc0)==0x80 );
215 }
216 if( nNeedle>nHaystack ) N = 0;
217 sqlite3_result_int(context, N);
218}
219
220/*
drhf764e6f2007-05-15 01:13:47 +0000221** Implementation of the substr() function.
222**
223** substr(x,p1,p2) returns p2 characters of x[] beginning with p1.
224** p1 is 1-indexed. So substr(x,1,1) returns the first character
225** of x. If x is text, then we actually count UTF-8 characters.
226** If x is a blob, then we count bytes.
227**
228** If p1 is negative, then we begin abs(p1) from the end of x[].
shaneh779b8f12009-11-12 05:04:50 +0000229**
230** If p2 is negative, return the p2 characters preceeding p1.
drh0bce8352002-02-28 00:41:10 +0000231*/
drhf9b596e2004-05-26 16:54:42 +0000232static void substrFunc(
233 sqlite3_context *context,
234 int argc,
235 sqlite3_value **argv
236){
drh2646da72005-12-09 20:02:05 +0000237 const unsigned char *z;
238 const unsigned char *z2;
drh023ae032007-05-08 12:12:16 +0000239 int len;
drhf764e6f2007-05-15 01:13:47 +0000240 int p0type;
drh023ae032007-05-08 12:12:16 +0000241 i64 p1, p2;
drh65595cd2009-02-02 16:32:55 +0000242 int negP2 = 0;
drhf9b596e2004-05-26 16:54:42 +0000243
drh64f31512007-10-12 19:11:55 +0000244 assert( argc==3 || argc==2 );
drh8198d252009-02-01 19:42:37 +0000245 if( sqlite3_value_type(argv[1])==SQLITE_NULL
246 || (argc==3 && sqlite3_value_type(argv[2])==SQLITE_NULL)
247 ){
248 return;
249 }
drhf764e6f2007-05-15 01:13:47 +0000250 p0type = sqlite3_value_type(argv[0]);
drh4adc4cb2009-11-11 20:53:31 +0000251 p1 = sqlite3_value_int(argv[1]);
drhf764e6f2007-05-15 01:13:47 +0000252 if( p0type==SQLITE_BLOB ){
253 len = sqlite3_value_bytes(argv[0]);
254 z = sqlite3_value_blob(argv[0]);
255 if( z==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000256 assert( len==sqlite3_value_bytes(argv[0]) );
drhf764e6f2007-05-15 01:13:47 +0000257 }else{
258 z = sqlite3_value_text(argv[0]);
259 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000260 len = 0;
drh4adc4cb2009-11-11 20:53:31 +0000261 if( p1<0 ){
262 for(z2=z; *z2; len++){
263 SQLITE_SKIP_UTF8(z2);
264 }
drh4a919112007-05-15 11:55:09 +0000265 }
drhf764e6f2007-05-15 01:13:47 +0000266 }
drh64f31512007-10-12 19:11:55 +0000267 if( argc==3 ){
268 p2 = sqlite3_value_int(argv[2]);
drh65595cd2009-02-02 16:32:55 +0000269 if( p2<0 ){
270 p2 = -p2;
271 negP2 = 1;
272 }
drh64f31512007-10-12 19:11:55 +0000273 }else{
drhbb4957f2008-03-20 14:03:29 +0000274 p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH];
drh64f31512007-10-12 19:11:55 +0000275 }
drh0bce8352002-02-28 00:41:10 +0000276 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000277 p1 += len;
drh653bc752002-02-28 03:31:10 +0000278 if( p1<0 ){
279 p2 += p1;
drh65595cd2009-02-02 16:32:55 +0000280 if( p2<0 ) p2 = 0;
drh653bc752002-02-28 03:31:10 +0000281 p1 = 0;
282 }
drh0bce8352002-02-28 00:41:10 +0000283 }else if( p1>0 ){
284 p1--;
drh65595cd2009-02-02 16:32:55 +0000285 }else if( p2>0 ){
286 p2--;
drh0bce8352002-02-28 00:41:10 +0000287 }
drh65595cd2009-02-02 16:32:55 +0000288 if( negP2 ){
289 p1 -= p2;
drh4e79c592009-02-01 19:23:32 +0000290 if( p1<0 ){
291 p2 += p1;
292 p1 = 0;
293 }
294 }
drh65595cd2009-02-02 16:32:55 +0000295 assert( p1>=0 && p2>=0 );
drhf764e6f2007-05-15 01:13:47 +0000296 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000297 while( *z && p1 ){
298 SQLITE_SKIP_UTF8(z);
299 p1--;
drhf764e6f2007-05-15 01:13:47 +0000300 }
drh4a919112007-05-15 11:55:09 +0000301 for(z2=z; *z2 && p2; p2--){
302 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000303 }
drh1bd10f82008-12-10 21:19:56 +0000304 sqlite3_result_text(context, (char*)z, (int)(z2-z), SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000305 }else{
drh4adc4cb2009-11-11 20:53:31 +0000306 if( p1+p2>len ){
307 p2 = len-p1;
308 if( p2<0 ) p2 = 0;
309 }
drh1bd10f82008-12-10 21:19:56 +0000310 sqlite3_result_blob(context, (char*)&z[p1], (int)p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000311 }
drh0bce8352002-02-28 00:41:10 +0000312}
313
314/*
315** Implementation of the round() function
316*/
shanefbd60f82009-02-04 03:59:25 +0000317#ifndef SQLITE_OMIT_FLOATING_POINT
danielk19770ae8b832004-05-25 12:05:56 +0000318static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000319 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000320 double r;
drh50d654d2009-06-03 01:24:54 +0000321 char *zBuf;
drh0bce8352002-02-28 00:41:10 +0000322 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000323 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000324 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000325 n = sqlite3_value_int(argv[1]);
326 if( n>30 ) n = 30;
327 if( n<0 ) n = 0;
328 }
drhd589a922006-03-02 03:02:48 +0000329 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000330 r = sqlite3_value_double(argv[0]);
shaneh147e1762010-02-17 04:19:27 +0000331 /* If Y==0 and X will fit in a 64-bit int,
332 ** handle the rounding directly,
333 ** otherwise use printf.
334 */
335 if( n==0 && r>=0 && r<LARGEST_INT64-1 ){
336 r = (double)((sqlite_int64)(r+0.5));
337 }else if( n==0 && r<0 && (-r)<LARGEST_INT64-1 ){
338 r = -(double)((sqlite_int64)((-r)+0.5));
drh50d654d2009-06-03 01:24:54 +0000339 }else{
shaneh147e1762010-02-17 04:19:27 +0000340 zBuf = sqlite3_mprintf("%.*f",n,r);
341 if( zBuf==0 ){
342 sqlite3_result_error_nomem(context);
343 return;
344 }
drh9339da12010-09-30 00:50:49 +0000345 sqlite3AtoF(zBuf, &r, sqlite3Strlen30(zBuf), SQLITE_UTF8);
drh50d654d2009-06-03 01:24:54 +0000346 sqlite3_free(zBuf);
drh50d654d2009-06-03 01:24:54 +0000347 }
shaneh147e1762010-02-17 04:19:27 +0000348 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000349}
shanefbd60f82009-02-04 03:59:25 +0000350#endif
drhdc04c582002-02-24 01:55:15 +0000351
danielk197726783a52007-08-29 14:06:22 +0000352/*
353** Allocate nByte bytes of space using sqlite3_malloc(). If the
354** allocation fails, call sqlite3_result_error_nomem() to notify
drh27e62db2009-04-02 10:16:17 +0000355** the database handle that malloc() has failed and return NULL.
356** If nByte is larger than the maximum string or blob length, then
357** raise an SQLITE_TOOBIG exception and return NULL.
danielk197726783a52007-08-29 14:06:22 +0000358*/
drhb1a6c3c2008-03-20 16:30:17 +0000359static void *contextMalloc(sqlite3_context *context, i64 nByte){
drhbb4957f2008-03-20 14:03:29 +0000360 char *z;
drh27e62db2009-04-02 10:16:17 +0000361 sqlite3 *db = sqlite3_context_db_handle(context);
drhef31c6a2009-04-02 09:07:12 +0000362 assert( nByte>0 );
drh27e62db2009-04-02 10:16:17 +0000363 testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] );
364 testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
365 if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drhbb4957f2008-03-20 14:03:29 +0000366 sqlite3_result_error_toobig(context);
367 z = 0;
368 }else{
drh1bd10f82008-12-10 21:19:56 +0000369 z = sqlite3Malloc((int)nByte);
drhef31c6a2009-04-02 09:07:12 +0000370 if( !z ){
drhbb4957f2008-03-20 14:03:29 +0000371 sqlite3_result_error_nomem(context);
372 }
danielk1977a1644fd2007-08-29 12:31:25 +0000373 }
374 return z;
375}
376
drhdc04c582002-02-24 01:55:15 +0000377/*
378** Implementation of the upper() and lower() SQL functions.
379*/
danielk19770ae8b832004-05-25 12:05:56 +0000380static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000381 char *z1;
382 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000383 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000384 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000385 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000386 n = sqlite3_value_bytes(argv[0]);
387 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
388 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000389 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000390 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000391 if( z1 ){
drhdf901d32011-10-13 18:00:11 +0000392 for(i=0; i<n; i++){
393 z1[i] = (char)sqlite3Toupper(z2[i]);
drh7a521cf2007-04-25 18:23:52 +0000394 }
drhdf901d32011-10-13 18:00:11 +0000395 sqlite3_result_text(context, z1, n, sqlite3_free);
drh7a521cf2007-04-25 18:23:52 +0000396 }
drhdc04c582002-02-24 01:55:15 +0000397 }
398}
danielk19770ae8b832004-05-25 12:05:56 +0000399static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdf901d32011-10-13 18:00:11 +0000400 char *z1;
drh7a521cf2007-04-25 18:23:52 +0000401 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000402 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000403 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000404 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000405 n = sqlite3_value_bytes(argv[0]);
406 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
407 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000408 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000409 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000410 if( z1 ){
drhdf901d32011-10-13 18:00:11 +0000411 for(i=0; i<n; i++){
412 z1[i] = sqlite3Tolower(z2[i]);
drh7a521cf2007-04-25 18:23:52 +0000413 }
drhdf901d32011-10-13 18:00:11 +0000414 sqlite3_result_text(context, z1, n, sqlite3_free);
drh7a521cf2007-04-25 18:23:52 +0000415 }
drhdc04c582002-02-24 01:55:15 +0000416 }
417}
418
drhae6bb952009-11-11 00:24:31 +0000419/*
drh0fdbdbe2012-09-10 15:02:32 +0000420** The COALESCE() and IFNULL() functions are implemented as VDBE code so
421** that unused argument values do not have to be computed. However, we
422** still need some kind of function implementation for this routines in
423** the function table. That function implementation will never be called
424** so it doesn't matter what the implementation is. We might as well use
425** the "version()" function as a substitute.
drhae6bb952009-11-11 00:24:31 +0000426*/
drhae6bb952009-11-11 00:24:31 +0000427#define ifnullFunc versionFunc /* Substitute function - never called */
drh3212e182002-02-28 00:46:26 +0000428
429/*
drhf9ffac92002-03-02 19:00:31 +0000430** Implementation of random(). Return a random integer.
431*/
drhf9b596e2004-05-26 16:54:42 +0000432static void randomFunc(
433 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000434 int NotUsed,
435 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000436){
drh52fc8492006-02-23 21:43:55 +0000437 sqlite_int64 r;
danielk197762c14b32008-11-19 09:05:26 +0000438 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drh2fa18682008-03-19 14:15:34 +0000439 sqlite3_randomness(sizeof(r), &r);
drh3034e3d2009-04-02 14:05:21 +0000440 if( r<0 ){
441 /* We need to prevent a random number of 0x8000000000000000
442 ** (or -9223372036854775808) since when you do abs() of that
443 ** number of you get the same value back again. To do this
444 ** in a way that is testable, mask the sign bit off of negative
445 ** values, resulting in a positive value. Then take the
446 ** 2s complement of that positive value. The end result can
447 ** therefore be no less than -9223372036854775807.
448 */
drhaf8001b2012-02-11 19:53:24 +0000449 r = -(r & LARGEST_INT64);
drh3034e3d2009-04-02 14:05:21 +0000450 }
drh52fc8492006-02-23 21:43:55 +0000451 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000452}
453
454/*
drh137c7282007-01-29 17:58:28 +0000455** Implementation of randomblob(N). Return a random blob
456** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000457*/
drh137c7282007-01-29 17:58:28 +0000458static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000459 sqlite3_context *context,
460 int argc,
461 sqlite3_value **argv
462){
drh137c7282007-01-29 17:58:28 +0000463 int n;
464 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000465 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000466 UNUSED_PARAMETER(argc);
drh63cf66f2007-01-29 15:50:05 +0000467 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000468 if( n<1 ){
469 n = 1;
470 }
danielk1977a1644fd2007-08-29 12:31:25 +0000471 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000472 if( p ){
drh2fa18682008-03-19 14:15:34 +0000473 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000474 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000475 }
drh63cf66f2007-01-29 15:50:05 +0000476}
477
478/*
drh6ed41ad2002-04-06 14:10:47 +0000479** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000480** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000481*/
danielk197751ad0ec2004-05-24 12:39:02 +0000482static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000483 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000484 int NotUsed,
485 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000486){
drhfa4a4b92008-03-19 21:45:51 +0000487 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000488 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000489 /* IMP: R-51513-12026 The last_insert_rowid() SQL function is a
490 ** wrapper around the sqlite3_last_insert_rowid() C/C++ interface
491 ** function. */
drhf9b596e2004-05-26 16:54:42 +0000492 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000493}
494
rdcf146a772004-02-25 22:51:06 +0000495/*
drhab2f1f92010-01-11 18:26:42 +0000496** Implementation of the changes() SQL function.
497**
498** IMP: R-62073-11209 The changes() SQL function is a wrapper
499** around the sqlite3_changes() C/C++ function and hence follows the same
500** rules for counting changes.
rdcf146a772004-02-25 22:51:06 +0000501*/
danielk1977b28af712004-06-21 06:50:26 +0000502static void changes(
drhf9b596e2004-05-26 16:54:42 +0000503 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000504 int NotUsed,
505 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000506){
drhfa4a4b92008-03-19 21:45:51 +0000507 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000508 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf4479502004-05-27 03:12:53 +0000509 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000510}
rdcf146a772004-02-25 22:51:06 +0000511
512/*
danielk1977b28af712004-06-21 06:50:26 +0000513** Implementation of the total_changes() SQL function. The return value is
514** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000515*/
danielk1977b28af712004-06-21 06:50:26 +0000516static void total_changes(
517 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000518 int NotUsed,
519 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000520){
drhfa4a4b92008-03-19 21:45:51 +0000521 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000522 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000523 /* IMP: R-52756-41993 This function is a wrapper around the
524 ** sqlite3_total_changes() C/C++ interface. */
danielk1977b28af712004-06-21 06:50:26 +0000525 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000526}
527
drh6ed41ad2002-04-06 14:10:47 +0000528/*
drh4e5ffc52004-08-31 00:52:37 +0000529** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000530*/
drh4e5ffc52004-08-31 00:52:37 +0000531struct compareInfo {
532 u8 matchAll;
533 u8 matchOne;
534 u8 matchSet;
535 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000536};
drh55ef4d92005-08-14 01:20:37 +0000537
drhb9175ae2007-12-07 18:39:04 +0000538/*
539** For LIKE and GLOB matching on EBCDIC machines, assume that every
540** character is exactly one byte in size. Also, all characters are
541** able to participate in upper-case-to-lower-case mappings in EBCDIC
542** whereas only characters less than 0x80 do in ASCII.
543*/
544#if defined(SQLITE_EBCDIC)
drh42610962012-09-17 18:56:32 +0000545# define sqlite3Utf8Read(A) (*((*A)++))
drh0a32fa62011-06-13 12:19:21 +0000546# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000547#else
drh0a32fa62011-06-13 12:19:21 +0000548# define GlogUpperToLower(A) if( !((A)&~0x7f) ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000549#endif
550
drh4e5ffc52004-08-31 00:52:37 +0000551static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000552/* The correct SQL-92 behavior is for the LIKE operator to ignore
553** case. Thus 'a' LIKE 'A' would be true. */
554static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
555/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
556** is case sensitive causing 'a' LIKE 'A' to be false */
557static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000558
559/*
drh4e5ffc52004-08-31 00:52:37 +0000560** Compare two UTF-8 strings for equality where the first string can
561** potentially be a "glob" expression. Return true (1) if they
562** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000563**
drh4e5ffc52004-08-31 00:52:37 +0000564** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000565**
drh4e5ffc52004-08-31 00:52:37 +0000566** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000567**
drh4e5ffc52004-08-31 00:52:37 +0000568** '?' Matches exactly one character.
569**
570** [...] Matches one character from the enclosed list of
571** characters.
572**
573** [^...] Matches one character not in the enclosed list.
574**
575** With the [...] and [^...] matching, a ']' character can be included
576** in the list by making it the first character after '[' or '^'. A
577** range of characters can be specified using '-'. Example:
578** "[a-z]" matches any single lower-case letter. To match a '-', make
579** it the last character in the list.
580**
581** This routine is usually quick, but can be N**2 in the worst case.
582**
583** Hints: to match '*' or '?', put them in "[]". Like this:
584**
585** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000586*/
danielk19777c6303c2004-11-17 16:41:29 +0000587static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000588 const u8 *zPattern, /* The glob pattern */
589 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000590 const struct compareInfo *pInfo, /* Information about how to do the compare */
drh0a32fa62011-06-13 12:19:21 +0000591 u32 esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000592){
drh0a32fa62011-06-13 12:19:21 +0000593 u32 c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000594 int invert;
595 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000596 u8 matchOne = pInfo->matchOne;
597 u8 matchAll = pInfo->matchAll;
598 u8 matchSet = pInfo->matchSet;
599 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000600 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000601
drh42610962012-09-17 18:56:32 +0000602 while( (c = sqlite3Utf8Read(&zPattern))!=0 ){
603 if( c==matchAll && !prevEscape ){
604 while( (c=sqlite3Utf8Read(&zPattern)) == matchAll
drh66150952007-07-23 19:12:41 +0000605 || c == matchOne ){
drh42610962012-09-17 18:56:32 +0000606 if( c==matchOne && sqlite3Utf8Read(&zString)==0 ){
drh66150952007-07-23 19:12:41 +0000607 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000608 }
danielk1977ad7dd422004-06-06 12:41:49 +0000609 }
drh66150952007-07-23 19:12:41 +0000610 if( c==0 ){
611 return 1;
612 }else if( c==esc ){
drh42610962012-09-17 18:56:32 +0000613 c = sqlite3Utf8Read(&zPattern);
drh66150952007-07-23 19:12:41 +0000614 if( c==0 ){
615 return 0;
616 }
617 }else if( c==matchSet ){
618 assert( esc==0 ); /* This is GLOB, not LIKE */
619 assert( matchSet<0x80 ); /* '[' is a single-byte character */
620 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000621 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000622 }
623 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000624 }
drh42610962012-09-17 18:56:32 +0000625 while( (c2 = sqlite3Utf8Read(&zString))!=0 ){
drh66150952007-07-23 19:12:41 +0000626 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000627 GlogUpperToLower(c2);
628 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000629 while( c2 != 0 && c2 != c ){
drh42610962012-09-17 18:56:32 +0000630 c2 = sqlite3Utf8Read(&zString);
drh6ed4b782007-12-10 18:07:20 +0000631 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000632 }
drh66150952007-07-23 19:12:41 +0000633 }else{
634 while( c2 != 0 && c2 != c ){
drh42610962012-09-17 18:56:32 +0000635 c2 = sqlite3Utf8Read(&zString);
drh66150952007-07-23 19:12:41 +0000636 }
drh4e5ffc52004-08-31 00:52:37 +0000637 }
drh66150952007-07-23 19:12:41 +0000638 if( c2==0 ) return 0;
639 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
640 }
641 return 0;
drh42610962012-09-17 18:56:32 +0000642 }else if( c==matchOne && !prevEscape ){
643 if( sqlite3Utf8Read(&zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000644 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000645 }
drh4e5ffc52004-08-31 00:52:37 +0000646 }else if( c==matchSet ){
drh1aa4f3e2011-06-15 12:43:36 +0000647 u32 prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000648 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000649 seen = 0;
650 invert = 0;
drh42610962012-09-17 18:56:32 +0000651 c = sqlite3Utf8Read(&zString);
drh4e5ffc52004-08-31 00:52:37 +0000652 if( c==0 ) return 0;
drh42610962012-09-17 18:56:32 +0000653 c2 = sqlite3Utf8Read(&zPattern);
drh66150952007-07-23 19:12:41 +0000654 if( c2=='^' ){
655 invert = 1;
drh42610962012-09-17 18:56:32 +0000656 c2 = sqlite3Utf8Read(&zPattern);
drh66150952007-07-23 19:12:41 +0000657 }
drh4e5ffc52004-08-31 00:52:37 +0000658 if( c2==']' ){
659 if( c==']' ) seen = 1;
drh42610962012-09-17 18:56:32 +0000660 c2 = sqlite3Utf8Read(&zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000661 }
drh66150952007-07-23 19:12:41 +0000662 while( c2 && c2!=']' ){
663 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
drh42610962012-09-17 18:56:32 +0000664 c2 = sqlite3Utf8Read(&zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000665 if( c>=prior_c && c<=c2 ) seen = 1;
666 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000667 }else{
drh66150952007-07-23 19:12:41 +0000668 if( c==c2 ){
669 seen = 1;
670 }
drh4e5ffc52004-08-31 00:52:37 +0000671 prior_c = c2;
672 }
drh42610962012-09-17 18:56:32 +0000673 c2 = sqlite3Utf8Read(&zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000674 }
drh66150952007-07-23 19:12:41 +0000675 if( c2==0 || (seen ^ invert)==0 ){
676 return 0;
677 }
678 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000679 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000680 }else{
drh42610962012-09-17 18:56:32 +0000681 c2 = sqlite3Utf8Read(&zString);
drh4e5ffc52004-08-31 00:52:37 +0000682 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000683 GlogUpperToLower(c);
684 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000685 }
drh66150952007-07-23 19:12:41 +0000686 if( c!=c2 ){
687 return 0;
688 }
danielk19777c6303c2004-11-17 16:41:29 +0000689 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000690 }
danielk197751ad0ec2004-05-24 12:39:02 +0000691 }
drh4e5ffc52004-08-31 00:52:37 +0000692 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000693}
drh4e5ffc52004-08-31 00:52:37 +0000694
drh55ef4d92005-08-14 01:20:37 +0000695/*
696** Count the number of times that the LIKE operator (or GLOB which is
697** just a variation of LIKE) gets called. This is used for testing
698** only.
699*/
700#ifdef SQLITE_TEST
701int sqlite3_like_count = 0;
702#endif
703
danielk19773f6b0872004-06-17 05:36:44 +0000704
705/*
706** Implementation of the like() SQL function. This function implements
707** the build-in LIKE operator. The first argument to the function is the
708** pattern and the second argument is the string. So, the SQL statements:
709**
710** A LIKE B
711**
712** is implemented as like(B,A).
713**
drh55ef4d92005-08-14 01:20:37 +0000714** This same function (with a different compareInfo structure) computes
715** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000716*/
717static void likeFunc(
718 sqlite3_context *context,
719 int argc,
720 sqlite3_value **argv
721){
drhbeb818d2007-05-08 15:34:47 +0000722 const unsigned char *zA, *zB;
drh0a32fa62011-06-13 12:19:21 +0000723 u32 escape = 0;
drh27e62db2009-04-02 10:16:17 +0000724 int nPat;
drhbb4957f2008-03-20 14:03:29 +0000725 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000726
drh1f0feef2007-05-15 13:27:07 +0000727 zB = sqlite3_value_text(argv[0]);
728 zA = sqlite3_value_text(argv[1]);
729
drhbeb818d2007-05-08 15:34:47 +0000730 /* Limit the length of the LIKE or GLOB pattern to avoid problems
731 ** of deep recursion and N*N behavior in patternCompare().
732 */
drh27e62db2009-04-02 10:16:17 +0000733 nPat = sqlite3_value_bytes(argv[0]);
734 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] );
735 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 );
736 if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000737 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
738 return;
739 }
drh1f0feef2007-05-15 13:27:07 +0000740 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000741
danielk19777c6303c2004-11-17 16:41:29 +0000742 if( argc==3 ){
743 /* The escape character string must consist of a single UTF-8 character.
744 ** Otherwise, return an error.
745 */
746 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000747 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000748 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000749 sqlite3_result_error(context,
750 "ESCAPE expression must be a single character", -1);
751 return;
752 }
drh42610962012-09-17 18:56:32 +0000753 escape = sqlite3Utf8Read(&zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000754 }
danielk19773f6b0872004-06-17 05:36:44 +0000755 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000756 struct compareInfo *pInfo = sqlite3_user_data(context);
757#ifdef SQLITE_TEST
758 sqlite3_like_count++;
759#endif
drhbeb818d2007-05-08 15:34:47 +0000760
danielk1977b56fe1f2007-05-09 08:24:44 +0000761 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000762 }
drh8912d102002-05-26 21:34:58 +0000763}
764
765/*
766** Implementation of the NULLIF(x,y) function. The result is the first
767** argument if the arguments are different. The result is NULL if the
768** arguments are equal to each other.
769*/
drhf9b596e2004-05-26 16:54:42 +0000770static void nullifFunc(
771 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000772 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +0000773 sqlite3_value **argv
774){
danielk1977dc1bdc42004-06-11 10:51:27 +0000775 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk197762c14b32008-11-19 09:05:26 +0000776 UNUSED_PARAMETER(NotUsed);
danielk1977dc1bdc42004-06-11 10:51:27 +0000777 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000778 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000779 }
drh0ac65892002-04-20 14:24:41 +0000780}
781
drh647cb0e2002-11-04 19:32:25 +0000782/*
drh47baebc2009-08-14 16:01:24 +0000783** Implementation of the sqlite_version() function. The result is the version
drh647cb0e2002-11-04 19:32:25 +0000784** of the SQLite library that is running.
785*/
drhf9b596e2004-05-26 16:54:42 +0000786static void versionFunc(
787 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000788 int NotUsed,
789 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000790){
danielk197762c14b32008-11-19 09:05:26 +0000791 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000792 /* IMP: R-48699-48617 This function is an SQL wrapper around the
793 ** sqlite3_libversion() C-interface. */
794 sqlite3_result_text(context, sqlite3_libversion(), -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000795}
796
drh47baebc2009-08-14 16:01:24 +0000797/*
798** Implementation of the sqlite_source_id() function. The result is a string
799** that identifies the particular version of the source code used to build
800** SQLite.
801*/
802static void sourceidFunc(
803 sqlite3_context *context,
804 int NotUsed,
805 sqlite3_value **NotUsed2
806){
807 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhab2f1f92010-01-11 18:26:42 +0000808 /* IMP: R-24470-31136 This function is an SQL wrapper around the
809 ** sqlite3_sourceid() C interface. */
810 sqlite3_result_text(context, sqlite3_sourceid(), -1, SQLITE_STATIC);
drh47baebc2009-08-14 16:01:24 +0000811}
812
shanehbdea6d12010-02-23 04:19:54 +0000813/*
drh3ca84ef2011-04-25 18:03:10 +0000814** Implementation of the sqlite_log() function. This is a wrapper around
815** sqlite3_log(). The return value is NULL. The function exists purely for
816** its side-effects.
817*/
drh840561f2011-04-27 18:08:42 +0000818static void errlogFunc(
drh3ca84ef2011-04-25 18:03:10 +0000819 sqlite3_context *context,
820 int argc,
821 sqlite3_value **argv
822){
823 UNUSED_PARAMETER(argc);
824 UNUSED_PARAMETER(context);
825 sqlite3_log(sqlite3_value_int(argv[0]), "%s", sqlite3_value_text(argv[1]));
826}
827
828/*
shanehdc97a8c2010-02-23 20:08:35 +0000829** Implementation of the sqlite_compileoption_used() function.
830** The result is an integer that identifies if the compiler option
831** was used to build SQLite.
shanehbdea6d12010-02-23 04:19:54 +0000832*/
shanehdc97a8c2010-02-23 20:08:35 +0000833#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
834static void compileoptionusedFunc(
shanehbdea6d12010-02-23 04:19:54 +0000835 sqlite3_context *context,
shanehdc97a8c2010-02-23 20:08:35 +0000836 int argc,
837 sqlite3_value **argv
shanehbdea6d12010-02-23 04:19:54 +0000838){
shanehdc97a8c2010-02-23 20:08:35 +0000839 const char *zOptName;
840 assert( argc==1 );
841 UNUSED_PARAMETER(argc);
drha3e414c2010-08-03 18:06:25 +0000842 /* IMP: R-39564-36305 The sqlite_compileoption_used() SQL
843 ** function is a wrapper around the sqlite3_compileoption_used() C/C++
844 ** function.
845 */
drh264a2d42010-02-25 15:28:41 +0000846 if( (zOptName = (const char*)sqlite3_value_text(argv[0]))!=0 ){
shanehdc97a8c2010-02-23 20:08:35 +0000847 sqlite3_result_int(context, sqlite3_compileoption_used(zOptName));
shanehdc97a8c2010-02-23 20:08:35 +0000848 }
shanehbdea6d12010-02-23 04:19:54 +0000849}
shanehdc97a8c2010-02-23 20:08:35 +0000850#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
851
852/*
853** Implementation of the sqlite_compileoption_get() function.
854** The result is a string that identifies the compiler options
855** used to build SQLite.
856*/
857#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
858static void compileoptiongetFunc(
859 sqlite3_context *context,
860 int argc,
861 sqlite3_value **argv
862){
863 int n;
864 assert( argc==1 );
865 UNUSED_PARAMETER(argc);
drha3e414c2010-08-03 18:06:25 +0000866 /* IMP: R-04922-24076 The sqlite_compileoption_get() SQL function
867 ** is a wrapper around the sqlite3_compileoption_get() C/C++ function.
868 */
shanehdc97a8c2010-02-23 20:08:35 +0000869 n = sqlite3_value_int(argv[0]);
870 sqlite3_result_text(context, sqlite3_compileoption_get(n), -1, SQLITE_STATIC);
871}
872#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
shanehbdea6d12010-02-23 04:19:54 +0000873
drh137c7282007-01-29 17:58:28 +0000874/* Array for converting from half-bytes (nybbles) into ASCII hex
875** digits. */
876static const char hexdigits[] = {
877 '0', '1', '2', '3', '4', '5', '6', '7',
878 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
879};
danielk1977d641d642004-11-18 15:44:29 +0000880
drh47394702003-08-20 01:03:33 +0000881/*
882** EXPERIMENTAL - This is not an official function. The interface may
883** change. This function may disappear. Do not write code that depends
884** on this function.
885**
886** Implementation of the QUOTE() function. This function takes a single
887** argument. If the argument is numeric, the return value is the same as
888** the argument. If the argument is NULL, the return value is the string
889** "NULL". Otherwise, the argument is enclosed in single quotes with
890** single-quote escapes.
891*/
danielk19770ae8b832004-05-25 12:05:56 +0000892static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drha0df4cc2009-02-02 17:29:59 +0000893 assert( argc==1 );
drh1d34fde2009-02-03 15:50:33 +0000894 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000895 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000896 case SQLITE_FLOAT: {
drh72b3fbc2012-06-19 03:11:25 +0000897 double r1, r2;
drh72b3fbc2012-06-19 03:11:25 +0000898 char zBuf[50];
mistachkin2b434a72012-06-19 04:36:48 +0000899 r1 = sqlite3_value_double(argv[0]);
drh72b3fbc2012-06-19 03:11:25 +0000900 sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.15g", r1);
901 sqlite3AtoF(zBuf, &r2, 20, SQLITE_UTF8);
902 if( r1!=r2 ){
903 sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.20e", r1);
904 }
905 sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
906 break;
907 }
908 case SQLITE_INTEGER: {
drhf4479502004-05-27 03:12:53 +0000909 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000910 break;
911 }
danielk19773f41e972004-06-08 00:39:01 +0000912 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000913 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000914 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000915 int nBlob = sqlite3_value_bytes(argv[0]);
916 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000917 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000918 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000919 int i;
920 for(i=0; i<nBlob; i++){
921 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
922 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
923 }
924 zText[(nBlob*2)+2] = '\'';
925 zText[(nBlob*2)+3] = '\0';
926 zText[0] = 'X';
927 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000928 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000929 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000930 }
931 break;
932 }
drh9c054832004-05-31 18:51:57 +0000933 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000934 int i,j;
935 u64 n;
drh2646da72005-12-09 20:02:05 +0000936 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000937 char *z;
938
drh7a521cf2007-04-25 18:23:52 +0000939 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000940 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000941 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000942 if( z ){
943 z[0] = '\'';
944 for(i=0, j=1; zArg[i]; i++){
945 z[j++] = zArg[i];
946 if( zArg[i]=='\'' ){
947 z[j++] = '\'';
948 }
drhf9b596e2004-05-26 16:54:42 +0000949 }
danielk1977a1644fd2007-08-29 12:31:25 +0000950 z[j++] = '\'';
951 z[j] = 0;
952 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000953 }
drha0df4cc2009-02-02 17:29:59 +0000954 break;
955 }
956 default: {
957 assert( sqlite3_value_type(argv[0])==SQLITE_NULL );
958 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
959 break;
drhf9b596e2004-05-26 16:54:42 +0000960 }
drh47394702003-08-20 01:03:33 +0000961 }
962}
963
drh137c7282007-01-29 17:58:28 +0000964/*
965** The hex() function. Interpret the argument as a blob. Return
966** a hexadecimal rendering as text.
967*/
968static void hexFunc(
969 sqlite3_context *context,
970 int argc,
971 sqlite3_value **argv
972){
973 int i, n;
974 const unsigned char *pBlob;
975 char *zHex, *z;
976 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000977 UNUSED_PARAMETER(argc);
drh1f0feef2007-05-15 13:27:07 +0000978 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000979 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000980 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000981 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000982 if( zHex ){
983 for(i=0; i<n; i++, pBlob++){
984 unsigned char c = *pBlob;
985 *(z++) = hexdigits[(c>>4)&0xf];
986 *(z++) = hexdigits[c&0xf];
987 }
988 *z = 0;
989 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000990 }
drh137c7282007-01-29 17:58:28 +0000991}
992
drh26b6d902007-03-17 13:27:54 +0000993/*
drh8cff3822007-05-02 02:08:28 +0000994** The zeroblob(N) function returns a zero-filled blob of size N bytes.
995*/
996static void zeroblobFunc(
997 sqlite3_context *context,
998 int argc,
999 sqlite3_value **argv
1000){
drh98640a32007-06-07 19:08:32 +00001001 i64 n;
drh27e62db2009-04-02 10:16:17 +00001002 sqlite3 *db = sqlite3_context_db_handle(context);
drh8cff3822007-05-02 02:08:28 +00001003 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001004 UNUSED_PARAMETER(argc);
drh98640a32007-06-07 19:08:32 +00001005 n = sqlite3_value_int64(argv[0]);
drh27e62db2009-04-02 10:16:17 +00001006 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH] );
1007 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
1008 if( n>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drh98640a32007-06-07 19:08:32 +00001009 sqlite3_result_error_toobig(context);
1010 }else{
drhab2f1f92010-01-11 18:26:42 +00001011 sqlite3_result_zeroblob(context, (int)n); /* IMP: R-00293-64994 */
drh98640a32007-06-07 19:08:32 +00001012 }
drh8cff3822007-05-02 02:08:28 +00001013}
1014
1015/*
drh26b6d902007-03-17 13:27:54 +00001016** The replace() function. Three arguments are all strings: call
1017** them A, B, and C. The result is also a string which is derived
1018** from A by replacing every occurance of B with C. The match
1019** must be exact. Collating sequences are not used.
1020*/
1021static void replaceFunc(
1022 sqlite3_context *context,
1023 int argc,
1024 sqlite3_value **argv
1025){
1026 const unsigned char *zStr; /* The input string A */
1027 const unsigned char *zPattern; /* The pattern string B */
1028 const unsigned char *zRep; /* The replacement string C */
1029 unsigned char *zOut; /* The output */
1030 int nStr; /* Size of zStr */
1031 int nPattern; /* Size of zPattern */
1032 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +00001033 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +00001034 int loopLimit; /* Last zStr[] that might match zPattern[] */
1035 int i, j; /* Loop counters */
1036
1037 assert( argc==3 );
danielk1977f3d3c272008-11-19 16:52:44 +00001038 UNUSED_PARAMETER(argc);
drh26b6d902007-03-17 13:27:54 +00001039 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001040 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +00001041 nStr = sqlite3_value_bytes(argv[0]);
1042 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +00001043 zPattern = sqlite3_value_text(argv[1]);
drha605fe82009-02-01 18:08:40 +00001044 if( zPattern==0 ){
drh23336062009-02-03 13:19:12 +00001045 assert( sqlite3_value_type(argv[1])==SQLITE_NULL
1046 || sqlite3_context_db_handle(context)->mallocFailed );
drha605fe82009-02-01 18:08:40 +00001047 return;
1048 }
1049 if( zPattern[0]==0 ){
1050 assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
1051 sqlite3_result_value(context, argv[0]);
1052 return;
1053 }
drh1f0feef2007-05-15 13:27:07 +00001054 nPattern = sqlite3_value_bytes(argv[1]);
1055 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +00001056 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +00001057 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +00001058 nRep = sqlite3_value_bytes(argv[2]);
1059 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +00001060 nOut = nStr + 1;
1061 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +00001062 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +00001063 if( zOut==0 ){
1064 return;
drh26b6d902007-03-17 13:27:54 +00001065 }
drh26b6d902007-03-17 13:27:54 +00001066 loopLimit = nStr - nPattern;
1067 for(i=j=0; i<=loopLimit; i++){
1068 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
1069 zOut[j++] = zStr[i];
1070 }else{
drh4a50aac2007-08-23 02:47:53 +00001071 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +00001072 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +00001073 nOut += nRep - nPattern;
drh27e62db2009-04-02 10:16:17 +00001074 testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
1075 testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
1076 if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +00001077 sqlite3_result_error_toobig(context);
drhb9755982010-07-24 16:34:37 +00001078 sqlite3_free(zOut);
danielk197717374e82007-05-08 14:39:04 +00001079 return;
1080 }
drh4a50aac2007-08-23 02:47:53 +00001081 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +00001082 zOut = sqlite3_realloc(zOut, (int)nOut);
1083 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +00001084 sqlite3_result_error_nomem(context);
drhb9755982010-07-24 16:34:37 +00001085 sqlite3_free(zOld);
drh2e6400b2007-05-08 15:46:18 +00001086 return;
1087 }
drh26b6d902007-03-17 13:27:54 +00001088 memcpy(&zOut[j], zRep, nRep);
1089 j += nRep;
1090 i += nPattern-1;
1091 }
1092 }
drh2e6400b2007-05-08 15:46:18 +00001093 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +00001094 memcpy(&zOut[j], &zStr[i], nStr-i);
1095 j += nStr - i;
1096 assert( j<=nOut );
1097 zOut[j] = 0;
1098 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
1099}
1100
drh309b3382007-03-17 17:52:42 +00001101/*
1102** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
1103** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
1104*/
1105static void trimFunc(
1106 sqlite3_context *context,
1107 int argc,
1108 sqlite3_value **argv
1109){
1110 const unsigned char *zIn; /* Input string */
1111 const unsigned char *zCharSet; /* Set of characters to trim */
1112 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +00001113 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +00001114 int i; /* Loop counter */
drh1bd10f82008-12-10 21:19:56 +00001115 unsigned char *aLen = 0; /* Length of each character in zCharSet */
1116 unsigned char **azChar = 0; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +00001117 int nChar; /* Number of characters in zCharSet */
1118
drh309b3382007-03-17 17:52:42 +00001119 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
1120 return;
1121 }
1122 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001123 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +00001124 nIn = sqlite3_value_bytes(argv[0]);
1125 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +00001126 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +00001127 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +00001128 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +00001129 nChar = 1;
drh8cff3822007-05-02 02:08:28 +00001130 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +00001131 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +00001132 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +00001133 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +00001134 return;
drhd1e3a612007-04-27 21:59:52 +00001135 }else{
1136 const unsigned char *z;
1137 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +00001138 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +00001139 }
1140 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +00001141 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +00001142 if( azChar==0 ){
1143 return;
1144 }
1145 aLen = (unsigned char*)&azChar[nChar];
1146 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +00001147 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +00001148 SQLITE_SKIP_UTF8(z);
drh3abbd392008-12-10 23:04:13 +00001149 aLen[nChar] = (u8)(z - azChar[nChar]);
drhd1e3a612007-04-27 21:59:52 +00001150 }
1151 }
drh309b3382007-03-17 17:52:42 +00001152 }
drhd1e3a612007-04-27 21:59:52 +00001153 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +00001154 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +00001155 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +00001156 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +00001157 int len = 0;
drhd1e3a612007-04-27 21:59:52 +00001158 for(i=0; i<nChar; i++){
1159 len = aLen[i];
drh27e62db2009-04-02 10:16:17 +00001160 if( len<=nIn && memcmp(zIn, azChar[i], len)==0 ) break;
drhd1e3a612007-04-27 21:59:52 +00001161 }
1162 if( i>=nChar ) break;
1163 zIn += len;
1164 nIn -= len;
drh309b3382007-03-17 17:52:42 +00001165 }
1166 }
1167 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +00001168 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +00001169 int len = 0;
drhd1e3a612007-04-27 21:59:52 +00001170 for(i=0; i<nChar; i++){
1171 len = aLen[i];
1172 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
1173 }
1174 if( i>=nChar ) break;
1175 nIn -= len;
drh309b3382007-03-17 17:52:42 +00001176 }
1177 }
drhd1e3a612007-04-27 21:59:52 +00001178 if( zCharSet ){
1179 sqlite3_free(azChar);
1180 }
drh309b3382007-03-17 17:52:42 +00001181 }
1182 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
1183}
drh26b6d902007-03-17 13:27:54 +00001184
danielk1977a4de4532008-09-02 15:44:08 +00001185
drh2ba3ccc2009-12-08 02:06:08 +00001186/* IMP: R-25361-16150 This function is omitted from SQLite by default. It
1187** is only available if the SQLITE_SOUNDEX compile-time option is used
1188** when SQLite is built.
1189*/
drhd24cc422003-03-27 12:51:24 +00001190#ifdef SQLITE_SOUNDEX
1191/*
1192** Compute the soundex encoding of a word.
drh2ba3ccc2009-12-08 02:06:08 +00001193**
1194** IMP: R-59782-00072 The soundex(X) function returns a string that is the
1195** soundex encoding of the string X.
drhd24cc422003-03-27 12:51:24 +00001196*/
drh137c7282007-01-29 17:58:28 +00001197static void soundexFunc(
1198 sqlite3_context *context,
1199 int argc,
1200 sqlite3_value **argv
1201){
drhd24cc422003-03-27 12:51:24 +00001202 char zResult[8];
drh4c755c02004-08-08 20:22:17 +00001203 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +00001204 int i, j;
1205 static const unsigned char iCode[] = {
1206 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1207 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1208 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1209 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1210 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1211 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1212 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1213 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1214 };
1215 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +00001216 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +00001217 if( zIn==0 ) zIn = (u8*)"";
drhdc86e2b2009-01-24 11:30:42 +00001218 for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
drhd24cc422003-03-27 12:51:24 +00001219 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +00001220 u8 prevcode = iCode[zIn[i]&0x7f];
danielk197778ca0e72009-01-20 16:53:39 +00001221 zResult[0] = sqlite3Toupper(zIn[i]);
drhd24cc422003-03-27 12:51:24 +00001222 for(j=1; j<4 && zIn[i]; i++){
1223 int code = iCode[zIn[i]&0x7f];
1224 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +00001225 if( code!=prevcode ){
1226 prevcode = code;
1227 zResult[j++] = code + '0';
1228 }
1229 }else{
1230 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +00001231 }
1232 }
1233 while( j<4 ){
1234 zResult[j++] = '0';
1235 }
1236 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001237 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +00001238 }else{
drh2ba3ccc2009-12-08 02:06:08 +00001239 /* IMP: R-64894-50321 The string "?000" is returned if the argument
1240 ** is NULL or contains no ASCII alphabetic characters. */
danielk1977d8123362004-06-12 09:25:12 +00001241 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +00001242 }
1243}
drh2ba3ccc2009-12-08 02:06:08 +00001244#endif /* SQLITE_SOUNDEX */
drhd24cc422003-03-27 12:51:24 +00001245
drhfdb83b22006-06-17 14:12:47 +00001246#ifndef SQLITE_OMIT_LOAD_EXTENSION
1247/*
1248** A function that loads a shared-library extension then returns NULL.
1249*/
1250static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001251 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001252 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001253 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001254 char *zErrMsg = 0;
1255
1256 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001257 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001258 }else{
1259 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001260 }
drh7a521cf2007-04-25 18:23:52 +00001261 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001262 sqlite3_result_error(context, zErrMsg, -1);
1263 sqlite3_free(zErrMsg);
1264 }
1265}
1266#endif
1267
danielk197701427a62005-01-11 13:02:33 +00001268
drh0ac65892002-04-20 14:24:41 +00001269/*
drhd3a149e2002-02-24 17:12:53 +00001270** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001271** sum() or avg() aggregate computation.
1272*/
1273typedef struct SumCtx SumCtx;
1274struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001275 double rSum; /* Floating point sum */
1276 i64 iSum; /* Integer sum */
1277 i64 cnt; /* Number of elements summed */
1278 u8 overflow; /* True if integer overflow seen */
1279 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001280};
1281
1282/*
drha97fdd32006-01-12 22:17:50 +00001283** Routines used to compute the sum, average, and total.
1284**
1285** The SUM() function follows the (broken) SQL standard which means
1286** that it returns NULL if it sums over no inputs. TOTAL returns
1287** 0.0 in that case. In addition, TOTAL always returns a float where
1288** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001289** value. TOTAL never fails, but SUM might through an exception if
1290** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001291*/
danielk19770ae8b832004-05-25 12:05:56 +00001292static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001293 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001294 int type;
drh3f219f42005-09-08 19:45:57 +00001295 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001296 UNUSED_PARAMETER(argc);
drh4f26d6c2004-05-26 23:25:30 +00001297 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001298 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001299 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001300 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001301 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001302 i64 v = sqlite3_value_int64(argv[0]);
1303 p->rSum += v;
drh158b9cb2011-03-05 20:59:46 +00001304 if( (p->approx|p->overflow)==0 && sqlite3AddInt64(&p->iSum, v) ){
1305 p->overflow = 1;
drh29d72102006-02-09 22:13:41 +00001306 }
1307 }else{
drh8c08e862006-02-11 17:34:00 +00001308 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001309 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001310 }
drh739105c2002-05-29 23:22:23 +00001311 }
drhdd5baa92002-02-27 19:50:59 +00001312}
danielk19770ae8b832004-05-25 12:05:56 +00001313static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001314 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001315 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001316 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001317 if( p->overflow ){
1318 sqlite3_result_error(context,"integer overflow",-1);
1319 }else if( p->approx ){
1320 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001321 }else{
drh8c08e862006-02-11 17:34:00 +00001322 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001323 }
drh3d1d95e2005-09-08 10:37:01 +00001324 }
drhdd5baa92002-02-27 19:50:59 +00001325}
danielk19770ae8b832004-05-25 12:05:56 +00001326static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001327 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001328 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001329 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001330 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001331 }
1332}
drha97fdd32006-01-12 22:17:50 +00001333static void totalFinalize(sqlite3_context *context){
1334 SumCtx *p;
1335 p = sqlite3_aggregate_context(context, 0);
shanefbd60f82009-02-04 03:59:25 +00001336 /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
1337 sqlite3_result_double(context, p ? p->rSum : (double)0);
drha97fdd32006-01-12 22:17:50 +00001338}
drhdd5baa92002-02-27 19:50:59 +00001339
1340/*
drh0bce8352002-02-28 00:41:10 +00001341** The following structure keeps track of state information for the
1342** count() aggregate function.
1343*/
1344typedef struct CountCtx CountCtx;
1345struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001346 i64 n;
drh0bce8352002-02-28 00:41:10 +00001347};
drhdd5baa92002-02-27 19:50:59 +00001348
drh0bce8352002-02-28 00:41:10 +00001349/*
1350** Routines to implement the count() aggregate function.
1351*/
danielk19770ae8b832004-05-25 12:05:56 +00001352static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001353 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001354 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001355 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001356 p->n++;
1357 }
drh2e79c3d2009-04-08 23:04:14 +00001358
drhd3264c72009-04-15 13:39:47 +00001359#ifndef SQLITE_OMIT_DEPRECATED
drh2e79c3d2009-04-08 23:04:14 +00001360 /* The sqlite3_aggregate_count() function is deprecated. But just to make
1361 ** sure it still operates correctly, verify that its count agrees with our
1362 ** internal count when using count(*) and when the total count can be
1363 ** expressed as a 32-bit integer. */
1364 assert( argc==1 || p==0 || p->n>0x7fffffff
1365 || p->n==sqlite3_aggregate_count(context) );
drhd3264c72009-04-15 13:39:47 +00001366#endif
drh0bce8352002-02-28 00:41:10 +00001367}
danielk19770ae8b832004-05-25 12:05:56 +00001368static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001369 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001370 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001371 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001372}
1373
1374/*
drh0bce8352002-02-28 00:41:10 +00001375** Routines to implement min() and max() aggregate functions.
1376*/
danielk197762c14b32008-11-19 09:05:26 +00001377static void minmaxStep(
1378 sqlite3_context *context,
1379 int NotUsed,
1380 sqlite3_value **argv
1381){
danielk197788208052004-05-25 01:13:20 +00001382 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001383 Mem *pBest;
danielk197762c14b32008-11-19 09:05:26 +00001384 UNUSED_PARAMETER(NotUsed);
drh9eb516c2004-07-18 20:52:32 +00001385
drh9eb516c2004-07-18 20:52:32 +00001386 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001387 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001388
drh94a6d992012-02-02 18:42:09 +00001389 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
1390 if( pBest->flags ) sqlite3SkipAccumulatorLoad(context);
1391 }else if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001392 int max;
1393 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001394 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001395 /* This step function is used for both the min() and max() aggregates,
1396 ** the only difference between the two being that the sense of the
1397 ** comparison is inverted. For the max() aggregate, the
1398 ** sqlite3_user_data() function returns (void *)-1. For min() it
1399 ** returns (void *)db, where db is the sqlite3* database pointer.
1400 ** Therefore the next statement sets variable 'max' to 1 for the max()
1401 ** aggregate, or 0 for min().
1402 */
drh309b3382007-03-17 17:52:42 +00001403 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001404 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001405 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001406 sqlite3VdbeMemCopy(pBest, pArg);
drh7a957892012-02-02 17:35:43 +00001407 }else{
1408 sqlite3SkipAccumulatorLoad(context);
danielk197788208052004-05-25 01:13:20 +00001409 }
drh268380c2004-02-25 13:47:31 +00001410 }else{
drhb21c8cd2007-08-21 19:33:56 +00001411 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001412 }
1413}
danielk19770ae8b832004-05-25 12:05:56 +00001414static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001415 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001416 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1417 if( pRes ){
drh94a6d992012-02-02 18:42:09 +00001418 if( pRes->flags ){
drhabfcea22005-09-06 20:36:48 +00001419 sqlite3_result_value(context, pRes);
1420 }
1421 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001422 }
1423}
drhdd5baa92002-02-27 19:50:59 +00001424
drhb0689692007-11-01 17:38:30 +00001425/*
1426** group_concat(EXPR, ?SEPARATOR?)
1427*/
1428static void groupConcatStep(
1429 sqlite3_context *context,
1430 int argc,
1431 sqlite3_value **argv
1432){
1433 const char *zVal;
drhade86482007-11-28 22:36:40 +00001434 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001435 const char *zSep;
drh07d31172009-02-02 21:57:05 +00001436 int nVal, nSep;
1437 assert( argc==1 || argc==2 );
1438 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001439 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1440
1441 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001442 sqlite3 *db = sqlite3_context_db_handle(context);
drh8bfd7192009-06-19 16:44:41 +00001443 int firstTerm = pAccum->useMalloc==0;
drhb9755982010-07-24 16:34:37 +00001444 pAccum->useMalloc = 2;
drhbb4957f2008-03-20 14:03:29 +00001445 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drh8bfd7192009-06-19 16:44:41 +00001446 if( !firstTerm ){
drh07d31172009-02-02 21:57:05 +00001447 if( argc==2 ){
1448 zSep = (char*)sqlite3_value_text(argv[1]);
1449 nSep = sqlite3_value_bytes(argv[1]);
drhb0689692007-11-01 17:38:30 +00001450 }else{
1451 zSep = ",";
drhade86482007-11-28 22:36:40 +00001452 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001453 }
drhade86482007-11-28 22:36:40 +00001454 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001455 }
drh07d31172009-02-02 21:57:05 +00001456 zVal = (char*)sqlite3_value_text(argv[0]);
1457 nVal = sqlite3_value_bytes(argv[0]);
1458 sqlite3StrAccumAppend(pAccum, zVal, nVal);
drhb0689692007-11-01 17:38:30 +00001459 }
1460}
1461static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001462 StrAccum *pAccum;
1463 pAccum = sqlite3_aggregate_context(context, 0);
1464 if( pAccum ){
1465 if( pAccum->tooBig ){
1466 sqlite3_result_error_toobig(context);
1467 }else if( pAccum->mallocFailed ){
1468 sqlite3_result_error_nomem(context);
1469 }else{
1470 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1471 sqlite3_free);
1472 }
drhb0689692007-11-01 17:38:30 +00001473 }
1474}
drh4e5ffc52004-08-31 00:52:37 +00001475
drhd3a149e2002-02-24 17:12:53 +00001476/*
drha4741842010-04-25 20:58:37 +00001477** This routine does per-connection function registration. Most
1478** of the built-in functions above are part of the global function set.
1479** This routine only deals with those that are not global.
drhdc04c582002-02-24 01:55:15 +00001480*/
drh9bb575f2004-09-06 17:24:11 +00001481void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drha4741842010-04-25 20:58:37 +00001482 int rc = sqlite3_overload_function(db, "MATCH", 2);
1483 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1484 if( rc==SQLITE_NOMEM ){
1485 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001486 }
drh55ef4d92005-08-14 01:20:37 +00001487}
1488
1489/*
1490** Set the LIKEOPT flag on the 2-argument function with the given name.
1491*/
drh1bd10f82008-12-10 21:19:56 +00001492static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
drh55ef4d92005-08-14 01:20:37 +00001493 FuncDef *pDef;
drhea678832008-12-10 19:26:22 +00001494 pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
1495 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001496 if( ALWAYS(pDef) ){
drhd64fe2f2005-08-28 17:00:23 +00001497 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001498 }
1499}
1500
1501/*
1502** Register the built-in LIKE and GLOB functions. The caseSensitive
1503** parameter determines whether or not the LIKE operator is case
1504** sensitive. GLOB is always case sensitive.
1505*/
1506void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1507 struct compareInfo *pInfo;
1508 if( caseSensitive ){
1509 pInfo = (struct compareInfo*)&likeInfoAlt;
1510 }else{
1511 pInfo = (struct compareInfo*)&likeInfoNorm;
1512 }
drh901e9942010-12-15 18:54:37 +00001513 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0);
1514 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0);
1515 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
dand2199f02010-08-27 17:48:52 +00001516 (struct compareInfo*)&globInfo, likeFunc, 0, 0, 0);
drhd64fe2f2005-08-28 17:00:23 +00001517 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1518 setLikeOptFlag(db, "like",
1519 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001520}
1521
1522/*
1523** pExpr points to an expression which implements a function. If
1524** it is appropriate to apply the LIKE optimization to that function
1525** then set aWc[0] through aWc[2] to the wildcard characters and
1526** return TRUE. If the function is not a LIKE-style function then
1527** return FALSE.
1528*/
drhd64fe2f2005-08-28 17:00:23 +00001529int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001530 FuncDef *pDef;
danielk19776ab3a2e2009-02-19 14:39:25 +00001531 if( pExpr->op!=TK_FUNCTION
1532 || !pExpr->x.pList
1533 || pExpr->x.pList->nExpr!=2
1534 ){
drh55ef4d92005-08-14 01:20:37 +00001535 return 0;
1536 }
danielk19776ab3a2e2009-02-19 14:39:25 +00001537 assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
drh33e619f2009-05-28 01:00:55 +00001538 pDef = sqlite3FindFunction(db, pExpr->u.zToken,
1539 sqlite3Strlen30(pExpr->u.zToken),
drhb7916a72009-05-27 10:31:29 +00001540 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001541 if( NEVER(pDef==0) || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001542 return 0;
1543 }
1544
1545 /* The memcpy() statement assumes that the wildcard characters are
1546 ** the first three statements in the compareInfo structure. The
1547 ** asserts() that follow verify that assumption
1548 */
1549 memcpy(aWc, pDef->pUserData, 3);
1550 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1551 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1552 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001553 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001554 return 1;
drhdc04c582002-02-24 01:55:15 +00001555}
danielk19778c0a7912008-08-20 14:49:23 +00001556
drh70a8ca32008-08-21 18:49:27 +00001557/*
drh777c5382008-08-21 20:21:34 +00001558** All all of the FuncDef structures in the aBuiltinFunc[] array above
1559** to the global function hash table. This occurs at start-time (as
1560** a consequence of calling sqlite3_initialize()).
1561**
1562** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001563*/
1564void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001565 /*
1566 ** The following array holds FuncDef structures for all of the functions
1567 ** defined in this file.
1568 **
1569 ** The array cannot be constant since changes are made to the
1570 ** FuncDef.pHash elements at start-time. The elements of this array
1571 ** are read-only after initialization is complete.
1572 */
1573 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1574 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1575 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1576 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1577 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1578 FUNCTION(trim, 1, 3, 0, trimFunc ),
1579 FUNCTION(trim, 2, 3, 0, trimFunc ),
1580 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1581 FUNCTION(min, 0, 0, 1, 0 ),
1582 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1583 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1584 FUNCTION(max, 0, 1, 1, 0 ),
1585 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
drha748fdc2012-03-28 01:34:47 +00001586 FUNCTION2(typeof, 1, 0, 0, typeofFunc, SQLITE_FUNC_TYPEOF),
1587 FUNCTION2(length, 1, 0, 0, lengthFunc, SQLITE_FUNC_LENGTH),
drhd55e0722012-10-25 03:07:29 +00001588 FUNCTION(instr, 2, 0, 0, instrFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001589 FUNCTION(substr, 2, 0, 0, substrFunc ),
1590 FUNCTION(substr, 3, 0, 0, substrFunc ),
1591 FUNCTION(abs, 1, 0, 0, absFunc ),
shanefbd60f82009-02-04 03:59:25 +00001592#ifndef SQLITE_OMIT_FLOATING_POINT
danielk197793ce7412008-09-01 19:14:02 +00001593 FUNCTION(round, 1, 0, 0, roundFunc ),
1594 FUNCTION(round, 2, 0, 0, roundFunc ),
shanefbd60f82009-02-04 03:59:25 +00001595#endif
danielk197793ce7412008-09-01 19:14:02 +00001596 FUNCTION(upper, 1, 0, 0, upperFunc ),
1597 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1598 FUNCTION(coalesce, 1, 0, 0, 0 ),
danielk197793ce7412008-09-01 19:14:02 +00001599 FUNCTION(coalesce, 0, 0, 0, 0 ),
drha748fdc2012-03-28 01:34:47 +00001600 FUNCTION2(coalesce, -1, 0, 0, ifnullFunc, SQLITE_FUNC_COALESCE),
danielk197793ce7412008-09-01 19:14:02 +00001601 FUNCTION(hex, 1, 0, 0, hexFunc ),
drha748fdc2012-03-28 01:34:47 +00001602 FUNCTION2(ifnull, 2, 0, 0, ifnullFunc, SQLITE_FUNC_COALESCE),
drh9373b012009-02-02 01:50:39 +00001603 FUNCTION(random, 0, 0, 0, randomFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001604 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1605 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1606 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
drh47baebc2009-08-14 16:01:24 +00001607 FUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ),
drh840561f2011-04-27 18:08:42 +00001608 FUNCTION(sqlite_log, 2, 0, 0, errlogFunc ),
shanehdc97a8c2010-02-23 20:08:35 +00001609#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
drh8bb76d32010-02-26 16:37:47 +00001610 FUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc ),
1611 FUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc ),
shanehdc97a8c2010-02-23 20:08:35 +00001612#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
danielk197793ce7412008-09-01 19:14:02 +00001613 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1614 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1615 FUNCTION(changes, 0, 0, 0, changes ),
1616 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1617 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1618 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1619 #ifdef SQLITE_SOUNDEX
1620 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1621 #endif
1622 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1623 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1624 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1625 #endif
1626 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1627 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1628 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
danielk1977a5533162009-02-24 10:01:51 +00001629 /* AGGREGATE(count, 0, 0, 0, countStep, countFinalize ), */
drh6ac78a02010-09-28 14:26:36 +00001630 {0,SQLITE_UTF8,SQLITE_FUNC_COUNT,0,0,0,countStep,countFinalize,"count",0,0},
danielk197793ce7412008-09-01 19:14:02 +00001631 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
drh07d31172009-02-02 21:57:05 +00001632 AGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize),
1633 AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize),
danielk197793ce7412008-09-01 19:14:02 +00001634
1635 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1636 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1637 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1638 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1639 #else
1640 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1641 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1642 #endif
1643 };
1644
drh70a8ca32008-08-21 18:49:27 +00001645 int i;
danielk197793ce7412008-09-01 19:14:02 +00001646 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001647 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001648
drh70a8ca32008-08-21 18:49:27 +00001649 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001650 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001651 }
drh777c5382008-08-21 20:21:34 +00001652 sqlite3RegisterDateTimeFunctions();
drh545f5872010-04-24 14:02:59 +00001653#ifndef SQLITE_OMIT_ALTERTABLE
1654 sqlite3AlterFunctions();
1655#endif
drh70a8ca32008-08-21 18:49:27 +00001656}