blob: 8cb7a037c086f340db778f148a716556783bb3f5 [file] [log] [blame]
drhdc04c582002-02-24 01:55:15 +00001/*
2** 2002 February 23
3**
4** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
6**
7** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
10**
11*************************************************************************
12** This file contains the C functions that implement various SQL
13** functions of SQLite.
14**
15** There is only one exported symbol in this file - the function
16** sqliteRegisterBuildinFunctions() found at the bottom of the file.
17** All other code has file scope.
drhdc04c582002-02-24 01:55:15 +000018*/
drhb659e9b2005-01-28 01:29:08 +000019#include "sqliteInt.h"
drhd3a149e2002-02-24 17:12:53 +000020#include <stdlib.h>
drh0bce8352002-02-28 00:41:10 +000021#include <assert.h>
danielk197788208052004-05-25 01:13:20 +000022#include "vdbeInt.h"
drh0bce8352002-02-28 00:41:10 +000023
drh55ef4d92005-08-14 01:20:37 +000024/*
25** Return the collating function associated with a function.
26*/
danielk1977dc1bdc42004-06-11 10:51:27 +000027static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
28 return context->pColl;
29}
30
drh0bce8352002-02-28 00:41:10 +000031/*
32** Implementation of the non-aggregate min() and max() functions
33*/
drhf9b596e2004-05-26 16:54:42 +000034static void minmaxFunc(
35 sqlite3_context *context,
36 int argc,
37 sqlite3_value **argv
38){
drh0bce8352002-02-28 00:41:10 +000039 int i;
drh268380c2004-02-25 13:47:31 +000040 int mask; /* 0 for min() or 0xffffffff for max() */
drhf9b596e2004-05-26 16:54:42 +000041 int iBest;
danielk1977dc1bdc42004-06-11 10:51:27 +000042 CollSeq *pColl;
drh0bce8352002-02-28 00:41:10 +000043
drh65595cd2009-02-02 16:32:55 +000044 assert( argc>1 );
drhc44af712004-09-02 15:53:56 +000045 mask = sqlite3_user_data(context)==0 ? 0 : -1;
danielk1977dc1bdc42004-06-11 10:51:27 +000046 pColl = sqlite3GetFuncCollSeq(context);
47 assert( pColl );
danielk1977c572ef72004-05-27 09:28:41 +000048 assert( mask==-1 || mask==0 );
drhf9b596e2004-05-26 16:54:42 +000049 iBest = 0;
drh9c054832004-05-31 18:51:57 +000050 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhf9b596e2004-05-26 16:54:42 +000051 for(i=1; i<argc; i++){
drh9c054832004-05-31 18:51:57 +000052 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
danielk1977dc1bdc42004-06-11 10:51:27 +000053 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
drh65595cd2009-02-02 16:32:55 +000054 testcase( mask==0 );
drhf9b596e2004-05-26 16:54:42 +000055 iBest = i;
drh0bce8352002-02-28 00:41:10 +000056 }
57 }
drhf4479502004-05-27 03:12:53 +000058 sqlite3_result_value(context, argv[iBest]);
drh0bce8352002-02-28 00:41:10 +000059}
drh0bce8352002-02-28 00:41:10 +000060
drh268380c2004-02-25 13:47:31 +000061/*
62** Return the type of the argument.
63*/
drhf9b596e2004-05-26 16:54:42 +000064static void typeofFunc(
65 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +000066 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +000067 sqlite3_value **argv
68){
danielk197735bb9d02004-05-24 12:55:54 +000069 const char *z = 0;
danielk197762c14b32008-11-19 09:05:26 +000070 UNUSED_PARAMETER(NotUsed);
danielk197735bb9d02004-05-24 12:55:54 +000071 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000072 case SQLITE_INTEGER: z = "integer"; break;
73 case SQLITE_TEXT: z = "text"; break;
74 case SQLITE_FLOAT: z = "real"; break;
75 case SQLITE_BLOB: z = "blob"; break;
drh65595cd2009-02-02 16:32:55 +000076 default: z = "null"; break;
danielk197735bb9d02004-05-24 12:55:54 +000077 }
danielk1977d8123362004-06-12 09:25:12 +000078 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000079}
80
drh5708d2d2005-06-22 10:53:59 +000081
82/*
drh0bce8352002-02-28 00:41:10 +000083** Implementation of the length() function
84*/
drhf9b596e2004-05-26 16:54:42 +000085static void lengthFunc(
86 sqlite3_context *context,
87 int argc,
88 sqlite3_value **argv
89){
drh0bce8352002-02-28 00:41:10 +000090 int len;
91
92 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +000093 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +000094 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000095 case SQLITE_BLOB:
96 case SQLITE_INTEGER:
97 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +000098 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +000099 break;
100 }
drh9c054832004-05-31 18:51:57 +0000101 case SQLITE_TEXT: {
drh2646da72005-12-09 20:02:05 +0000102 const unsigned char *z = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000103 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000104 len = 0;
105 while( *z ){
106 len++;
107 SQLITE_SKIP_UTF8(z);
108 }
drhf4479502004-05-27 03:12:53 +0000109 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000110 break;
111 }
112 default: {
113 sqlite3_result_null(context);
114 break;
115 }
116 }
drh0bce8352002-02-28 00:41:10 +0000117}
118
119/*
120** Implementation of the abs() function
121*/
danielk19770ae8b832004-05-25 12:05:56 +0000122static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000123 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000124 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000125 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000126 case SQLITE_INTEGER: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000127 i64 iVal = sqlite3_value_int64(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000128 if( iVal<0 ){
129 if( (iVal<<1)==0 ){
130 sqlite3_result_error(context, "integer overflow", -1);
131 return;
132 }
133 iVal = -iVal;
134 }
danielk1977f93bbbe2004-05-27 10:30:52 +0000135 sqlite3_result_int64(context, iVal);
drhf9b596e2004-05-26 16:54:42 +0000136 break;
137 }
drh9c054832004-05-31 18:51:57 +0000138 case SQLITE_NULL: {
drhf9b596e2004-05-26 16:54:42 +0000139 sqlite3_result_null(context);
140 break;
141 }
142 default: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000143 double rVal = sqlite3_value_double(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000144 if( rVal<0 ) rVal = -rVal;
danielk1977f93bbbe2004-05-27 10:30:52 +0000145 sqlite3_result_double(context, rVal);
drhf9b596e2004-05-26 16:54:42 +0000146 break;
147 }
148 }
drh0bce8352002-02-28 00:41:10 +0000149}
150
151/*
drhf764e6f2007-05-15 01:13:47 +0000152** Implementation of the substr() function.
153**
154** substr(x,p1,p2) returns p2 characters of x[] beginning with p1.
155** p1 is 1-indexed. So substr(x,1,1) returns the first character
156** of x. If x is text, then we actually count UTF-8 characters.
157** If x is a blob, then we count bytes.
158**
159** If p1 is negative, then we begin abs(p1) from the end of x[].
shaneh779b8f12009-11-12 05:04:50 +0000160**
161** If p2 is negative, return the p2 characters preceeding p1.
drh0bce8352002-02-28 00:41:10 +0000162*/
drhf9b596e2004-05-26 16:54:42 +0000163static void substrFunc(
164 sqlite3_context *context,
165 int argc,
166 sqlite3_value **argv
167){
drh2646da72005-12-09 20:02:05 +0000168 const unsigned char *z;
169 const unsigned char *z2;
drh023ae032007-05-08 12:12:16 +0000170 int len;
drhf764e6f2007-05-15 01:13:47 +0000171 int p0type;
drh023ae032007-05-08 12:12:16 +0000172 i64 p1, p2;
drh65595cd2009-02-02 16:32:55 +0000173 int negP2 = 0;
drhf9b596e2004-05-26 16:54:42 +0000174
drh64f31512007-10-12 19:11:55 +0000175 assert( argc==3 || argc==2 );
drh8198d252009-02-01 19:42:37 +0000176 if( sqlite3_value_type(argv[1])==SQLITE_NULL
177 || (argc==3 && sqlite3_value_type(argv[2])==SQLITE_NULL)
178 ){
179 return;
180 }
drhf764e6f2007-05-15 01:13:47 +0000181 p0type = sqlite3_value_type(argv[0]);
drh4adc4cb2009-11-11 20:53:31 +0000182 p1 = sqlite3_value_int(argv[1]);
drhf764e6f2007-05-15 01:13:47 +0000183 if( p0type==SQLITE_BLOB ){
184 len = sqlite3_value_bytes(argv[0]);
185 z = sqlite3_value_blob(argv[0]);
186 if( z==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000187 assert( len==sqlite3_value_bytes(argv[0]) );
drhf764e6f2007-05-15 01:13:47 +0000188 }else{
189 z = sqlite3_value_text(argv[0]);
190 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000191 len = 0;
drh4adc4cb2009-11-11 20:53:31 +0000192 if( p1<0 ){
193 for(z2=z; *z2; len++){
194 SQLITE_SKIP_UTF8(z2);
195 }
drh4a919112007-05-15 11:55:09 +0000196 }
drhf764e6f2007-05-15 01:13:47 +0000197 }
drh64f31512007-10-12 19:11:55 +0000198 if( argc==3 ){
199 p2 = sqlite3_value_int(argv[2]);
drh65595cd2009-02-02 16:32:55 +0000200 if( p2<0 ){
201 p2 = -p2;
202 negP2 = 1;
203 }
drh64f31512007-10-12 19:11:55 +0000204 }else{
drhbb4957f2008-03-20 14:03:29 +0000205 p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH];
drh64f31512007-10-12 19:11:55 +0000206 }
drh0bce8352002-02-28 00:41:10 +0000207 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000208 p1 += len;
drh653bc752002-02-28 03:31:10 +0000209 if( p1<0 ){
210 p2 += p1;
drh65595cd2009-02-02 16:32:55 +0000211 if( p2<0 ) p2 = 0;
drh653bc752002-02-28 03:31:10 +0000212 p1 = 0;
213 }
drh0bce8352002-02-28 00:41:10 +0000214 }else if( p1>0 ){
215 p1--;
drh65595cd2009-02-02 16:32:55 +0000216 }else if( p2>0 ){
217 p2--;
drh0bce8352002-02-28 00:41:10 +0000218 }
drh65595cd2009-02-02 16:32:55 +0000219 if( negP2 ){
220 p1 -= p2;
drh4e79c592009-02-01 19:23:32 +0000221 if( p1<0 ){
222 p2 += p1;
223 p1 = 0;
224 }
225 }
drh65595cd2009-02-02 16:32:55 +0000226 assert( p1>=0 && p2>=0 );
drhf764e6f2007-05-15 01:13:47 +0000227 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000228 while( *z && p1 ){
229 SQLITE_SKIP_UTF8(z);
230 p1--;
drhf764e6f2007-05-15 01:13:47 +0000231 }
drh4a919112007-05-15 11:55:09 +0000232 for(z2=z; *z2 && p2; p2--){
233 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000234 }
drh1bd10f82008-12-10 21:19:56 +0000235 sqlite3_result_text(context, (char*)z, (int)(z2-z), SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000236 }else{
drh4adc4cb2009-11-11 20:53:31 +0000237 if( p1+p2>len ){
238 p2 = len-p1;
239 if( p2<0 ) p2 = 0;
240 }
drh1bd10f82008-12-10 21:19:56 +0000241 sqlite3_result_blob(context, (char*)&z[p1], (int)p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000242 }
drh0bce8352002-02-28 00:41:10 +0000243}
244
245/*
246** Implementation of the round() function
247*/
shanefbd60f82009-02-04 03:59:25 +0000248#ifndef SQLITE_OMIT_FLOATING_POINT
danielk19770ae8b832004-05-25 12:05:56 +0000249static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000250 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000251 double r;
drh50d654d2009-06-03 01:24:54 +0000252 char *zBuf;
drh0bce8352002-02-28 00:41:10 +0000253 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000254 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000255 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000256 n = sqlite3_value_int(argv[1]);
257 if( n>30 ) n = 30;
258 if( n<0 ) n = 0;
259 }
drhd589a922006-03-02 03:02:48 +0000260 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000261 r = sqlite3_value_double(argv[0]);
drh50d654d2009-06-03 01:24:54 +0000262 zBuf = sqlite3_mprintf("%.*f",n,r);
263 if( zBuf==0 ){
264 sqlite3_result_error_nomem(context);
265 }else{
266 sqlite3AtoF(zBuf, &r);
267 sqlite3_free(zBuf);
268 sqlite3_result_double(context, r);
269 }
drh0bce8352002-02-28 00:41:10 +0000270}
shanefbd60f82009-02-04 03:59:25 +0000271#endif
drhdc04c582002-02-24 01:55:15 +0000272
danielk197726783a52007-08-29 14:06:22 +0000273/*
274** Allocate nByte bytes of space using sqlite3_malloc(). If the
275** allocation fails, call sqlite3_result_error_nomem() to notify
drh27e62db2009-04-02 10:16:17 +0000276** the database handle that malloc() has failed and return NULL.
277** If nByte is larger than the maximum string or blob length, then
278** raise an SQLITE_TOOBIG exception and return NULL.
danielk197726783a52007-08-29 14:06:22 +0000279*/
drhb1a6c3c2008-03-20 16:30:17 +0000280static void *contextMalloc(sqlite3_context *context, i64 nByte){
drhbb4957f2008-03-20 14:03:29 +0000281 char *z;
drh27e62db2009-04-02 10:16:17 +0000282 sqlite3 *db = sqlite3_context_db_handle(context);
drhef31c6a2009-04-02 09:07:12 +0000283 assert( nByte>0 );
drh27e62db2009-04-02 10:16:17 +0000284 testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] );
285 testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
286 if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drhbb4957f2008-03-20 14:03:29 +0000287 sqlite3_result_error_toobig(context);
288 z = 0;
289 }else{
drh1bd10f82008-12-10 21:19:56 +0000290 z = sqlite3Malloc((int)nByte);
drhef31c6a2009-04-02 09:07:12 +0000291 if( !z ){
drhbb4957f2008-03-20 14:03:29 +0000292 sqlite3_result_error_nomem(context);
293 }
danielk1977a1644fd2007-08-29 12:31:25 +0000294 }
295 return z;
296}
297
drhdc04c582002-02-24 01:55:15 +0000298/*
299** Implementation of the upper() and lower() SQL functions.
300*/
danielk19770ae8b832004-05-25 12:05:56 +0000301static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000302 char *z1;
303 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000304 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000305 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000306 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000307 n = sqlite3_value_bytes(argv[0]);
308 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
309 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000310 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000311 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000312 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000313 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000314 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000315 z1[i] = (char)sqlite3Toupper(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000316 }
317 sqlite3_result_text(context, z1, -1, sqlite3_free);
318 }
drhdc04c582002-02-24 01:55:15 +0000319 }
320}
danielk19770ae8b832004-05-25 12:05:56 +0000321static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197778ca0e72009-01-20 16:53:39 +0000322 u8 *z1;
drh7a521cf2007-04-25 18:23:52 +0000323 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000324 int i, n;
drh1d34fde2009-02-03 15:50:33 +0000325 UNUSED_PARAMETER(argc);
drh7a521cf2007-04-25 18:23:52 +0000326 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000327 n = sqlite3_value_bytes(argv[0]);
328 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
329 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000330 if( z2 ){
drhb1a6c3c2008-03-20 16:30:17 +0000331 z1 = contextMalloc(context, ((i64)n)+1);
drh7a521cf2007-04-25 18:23:52 +0000332 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000333 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000334 for(i=0; z1[i]; i++){
danielk197778ca0e72009-01-20 16:53:39 +0000335 z1[i] = sqlite3Tolower(z1[i]);
drh7a521cf2007-04-25 18:23:52 +0000336 }
danielk197778ca0e72009-01-20 16:53:39 +0000337 sqlite3_result_text(context, (char *)z1, -1, sqlite3_free);
drh7a521cf2007-04-25 18:23:52 +0000338 }
drhdc04c582002-02-24 01:55:15 +0000339 }
340}
341
drhae6bb952009-11-11 00:24:31 +0000342
343#if 0 /* This function is never used. */
344/*
345** The COALESCE() and IFNULL() functions used to be implemented as shown
346** here. But now they are implemented as VDBE code so that unused arguments
347** do not have to be computed. This legacy implementation is retained as
348** comment.
349*/
drhdc04c582002-02-24 01:55:15 +0000350/*
drhfbc99082002-02-28 03:14:18 +0000351** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000352** All three do the same thing. They return the first non-NULL
353** argument.
drh3212e182002-02-28 00:46:26 +0000354*/
drhf9b596e2004-05-26 16:54:42 +0000355static void ifnullFunc(
356 sqlite3_context *context,
357 int argc,
358 sqlite3_value **argv
359){
drhfbc99082002-02-28 03:14:18 +0000360 int i;
361 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000362 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000363 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000364 break;
365 }
366 }
drh3212e182002-02-28 00:46:26 +0000367}
drhae6bb952009-11-11 00:24:31 +0000368#endif /* NOT USED */
369#define ifnullFunc versionFunc /* Substitute function - never called */
drh3212e182002-02-28 00:46:26 +0000370
371/*
drhf9ffac92002-03-02 19:00:31 +0000372** Implementation of random(). Return a random integer.
373*/
drhf9b596e2004-05-26 16:54:42 +0000374static void randomFunc(
375 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000376 int NotUsed,
377 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000378){
drh52fc8492006-02-23 21:43:55 +0000379 sqlite_int64 r;
danielk197762c14b32008-11-19 09:05:26 +0000380 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drh2fa18682008-03-19 14:15:34 +0000381 sqlite3_randomness(sizeof(r), &r);
drh3034e3d2009-04-02 14:05:21 +0000382 if( r<0 ){
383 /* We need to prevent a random number of 0x8000000000000000
384 ** (or -9223372036854775808) since when you do abs() of that
385 ** number of you get the same value back again. To do this
386 ** in a way that is testable, mask the sign bit off of negative
387 ** values, resulting in a positive value. Then take the
388 ** 2s complement of that positive value. The end result can
389 ** therefore be no less than -9223372036854775807.
390 */
391 r = -(r ^ (((sqlite3_int64)1)<<63));
392 }
drh52fc8492006-02-23 21:43:55 +0000393 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000394}
395
396/*
drh137c7282007-01-29 17:58:28 +0000397** Implementation of randomblob(N). Return a random blob
398** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000399*/
drh137c7282007-01-29 17:58:28 +0000400static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000401 sqlite3_context *context,
402 int argc,
403 sqlite3_value **argv
404){
drh137c7282007-01-29 17:58:28 +0000405 int n;
406 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000407 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000408 UNUSED_PARAMETER(argc);
drh63cf66f2007-01-29 15:50:05 +0000409 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000410 if( n<1 ){
411 n = 1;
412 }
danielk1977a1644fd2007-08-29 12:31:25 +0000413 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000414 if( p ){
drh2fa18682008-03-19 14:15:34 +0000415 sqlite3_randomness(n, p);
drh17435752007-08-16 04:30:38 +0000416 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000417 }
drh63cf66f2007-01-29 15:50:05 +0000418}
419
420/*
drh6ed41ad2002-04-06 14:10:47 +0000421** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000422** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000423*/
danielk197751ad0ec2004-05-24 12:39:02 +0000424static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000425 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000426 int NotUsed,
427 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000428){
drhfa4a4b92008-03-19 21:45:51 +0000429 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000430 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf9b596e2004-05-26 16:54:42 +0000431 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000432}
433
rdcf146a772004-02-25 22:51:06 +0000434/*
danielk1977b28af712004-06-21 06:50:26 +0000435** Implementation of the changes() SQL function. The return value is the
436** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000437*/
danielk1977b28af712004-06-21 06:50:26 +0000438static void changes(
drhf9b596e2004-05-26 16:54:42 +0000439 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000440 int NotUsed,
441 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000442){
drhfa4a4b92008-03-19 21:45:51 +0000443 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000444 UNUSED_PARAMETER2(NotUsed, NotUsed2);
drhf4479502004-05-27 03:12:53 +0000445 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000446}
rdcf146a772004-02-25 22:51:06 +0000447
448/*
danielk1977b28af712004-06-21 06:50:26 +0000449** Implementation of the total_changes() SQL function. The return value is
450** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000451*/
danielk1977b28af712004-06-21 06:50:26 +0000452static void total_changes(
453 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000454 int NotUsed,
455 sqlite3_value **NotUsed2
danielk197751ad0ec2004-05-24 12:39:02 +0000456){
drhfa4a4b92008-03-19 21:45:51 +0000457 sqlite3 *db = sqlite3_context_db_handle(context);
danielk197762c14b32008-11-19 09:05:26 +0000458 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977b28af712004-06-21 06:50:26 +0000459 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000460}
461
drh6ed41ad2002-04-06 14:10:47 +0000462/*
drh4e5ffc52004-08-31 00:52:37 +0000463** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000464*/
drh4e5ffc52004-08-31 00:52:37 +0000465struct compareInfo {
466 u8 matchAll;
467 u8 matchOne;
468 u8 matchSet;
469 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000470};
drh55ef4d92005-08-14 01:20:37 +0000471
drhb9175ae2007-12-07 18:39:04 +0000472/*
473** For LIKE and GLOB matching on EBCDIC machines, assume that every
474** character is exactly one byte in size. Also, all characters are
475** able to participate in upper-case-to-lower-case mappings in EBCDIC
476** whereas only characters less than 0x80 do in ASCII.
477*/
478#if defined(SQLITE_EBCDIC)
drh769e97e2009-04-01 16:33:37 +0000479# define sqlite3Utf8Read(A,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000480# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000481#else
drh6ed4b782007-12-10 18:07:20 +0000482# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000483#endif
484
drh4e5ffc52004-08-31 00:52:37 +0000485static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000486/* The correct SQL-92 behavior is for the LIKE operator to ignore
487** case. Thus 'a' LIKE 'A' would be true. */
488static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
489/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
490** is case sensitive causing 'a' LIKE 'A' to be false */
491static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000492
493/*
drh4e5ffc52004-08-31 00:52:37 +0000494** Compare two UTF-8 strings for equality where the first string can
495** potentially be a "glob" expression. Return true (1) if they
496** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000497**
drh4e5ffc52004-08-31 00:52:37 +0000498** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000499**
drh4e5ffc52004-08-31 00:52:37 +0000500** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000501**
drh4e5ffc52004-08-31 00:52:37 +0000502** '?' Matches exactly one character.
503**
504** [...] Matches one character from the enclosed list of
505** characters.
506**
507** [^...] Matches one character not in the enclosed list.
508**
509** With the [...] and [^...] matching, a ']' character can be included
510** in the list by making it the first character after '[' or '^'. A
511** range of characters can be specified using '-'. Example:
512** "[a-z]" matches any single lower-case letter. To match a '-', make
513** it the last character in the list.
514**
515** This routine is usually quick, but can be N**2 in the worst case.
516**
517** Hints: to match '*' or '?', put them in "[]". Like this:
518**
519** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000520*/
danielk19777c6303c2004-11-17 16:41:29 +0000521static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000522 const u8 *zPattern, /* The glob pattern */
523 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000524 const struct compareInfo *pInfo, /* Information about how to do the compare */
525 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000526){
drh66150952007-07-23 19:12:41 +0000527 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000528 int invert;
529 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000530 u8 matchOne = pInfo->matchOne;
531 u8 matchAll = pInfo->matchAll;
532 u8 matchSet = pInfo->matchSet;
533 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000534 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000535
drh769e97e2009-04-01 16:33:37 +0000536 while( (c = sqlite3Utf8Read(zPattern,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000537 if( !prevEscape && c==matchAll ){
drh769e97e2009-04-01 16:33:37 +0000538 while( (c=sqlite3Utf8Read(zPattern,&zPattern)) == matchAll
drh66150952007-07-23 19:12:41 +0000539 || c == matchOne ){
drh769e97e2009-04-01 16:33:37 +0000540 if( c==matchOne && sqlite3Utf8Read(zString, &zString)==0 ){
drh66150952007-07-23 19:12:41 +0000541 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000542 }
danielk1977ad7dd422004-06-06 12:41:49 +0000543 }
drh66150952007-07-23 19:12:41 +0000544 if( c==0 ){
545 return 1;
546 }else if( c==esc ){
drh769e97e2009-04-01 16:33:37 +0000547 c = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000548 if( c==0 ){
549 return 0;
550 }
551 }else if( c==matchSet ){
552 assert( esc==0 ); /* This is GLOB, not LIKE */
553 assert( matchSet<0x80 ); /* '[' is a single-byte character */
554 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000555 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000556 }
557 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000558 }
drh769e97e2009-04-01 16:33:37 +0000559 while( (c2 = sqlite3Utf8Read(zString,&zString))!=0 ){
drh66150952007-07-23 19:12:41 +0000560 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000561 GlogUpperToLower(c2);
562 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000563 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000564 c2 = sqlite3Utf8Read(zString, &zString);
drh6ed4b782007-12-10 18:07:20 +0000565 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000566 }
drh66150952007-07-23 19:12:41 +0000567 }else{
568 while( c2 != 0 && c2 != c ){
drh769e97e2009-04-01 16:33:37 +0000569 c2 = sqlite3Utf8Read(zString, &zString);
drh66150952007-07-23 19:12:41 +0000570 }
drh4e5ffc52004-08-31 00:52:37 +0000571 }
drh66150952007-07-23 19:12:41 +0000572 if( c2==0 ) return 0;
573 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
574 }
575 return 0;
576 }else if( !prevEscape && c==matchOne ){
drh769e97e2009-04-01 16:33:37 +0000577 if( sqlite3Utf8Read(zString, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000578 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000579 }
drh4e5ffc52004-08-31 00:52:37 +0000580 }else if( c==matchSet ){
581 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000582 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000583 seen = 0;
584 invert = 0;
drh769e97e2009-04-01 16:33:37 +0000585 c = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000586 if( c==0 ) return 0;
drh769e97e2009-04-01 16:33:37 +0000587 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000588 if( c2=='^' ){
589 invert = 1;
drh769e97e2009-04-01 16:33:37 +0000590 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh66150952007-07-23 19:12:41 +0000591 }
drh4e5ffc52004-08-31 00:52:37 +0000592 if( c2==']' ){
593 if( c==']' ) seen = 1;
drh769e97e2009-04-01 16:33:37 +0000594 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000595 }
drh66150952007-07-23 19:12:41 +0000596 while( c2 && c2!=']' ){
597 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
drh769e97e2009-04-01 16:33:37 +0000598 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000599 if( c>=prior_c && c<=c2 ) seen = 1;
600 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000601 }else{
drh66150952007-07-23 19:12:41 +0000602 if( c==c2 ){
603 seen = 1;
604 }
drh4e5ffc52004-08-31 00:52:37 +0000605 prior_c = c2;
606 }
drh769e97e2009-04-01 16:33:37 +0000607 c2 = sqlite3Utf8Read(zPattern, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000608 }
drh66150952007-07-23 19:12:41 +0000609 if( c2==0 || (seen ^ invert)==0 ){
610 return 0;
611 }
612 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000613 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000614 }else{
drh769e97e2009-04-01 16:33:37 +0000615 c2 = sqlite3Utf8Read(zString, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000616 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000617 GlogUpperToLower(c);
618 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000619 }
drh66150952007-07-23 19:12:41 +0000620 if( c!=c2 ){
621 return 0;
622 }
danielk19777c6303c2004-11-17 16:41:29 +0000623 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000624 }
danielk197751ad0ec2004-05-24 12:39:02 +0000625 }
drh4e5ffc52004-08-31 00:52:37 +0000626 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000627}
drh4e5ffc52004-08-31 00:52:37 +0000628
drh55ef4d92005-08-14 01:20:37 +0000629/*
630** Count the number of times that the LIKE operator (or GLOB which is
631** just a variation of LIKE) gets called. This is used for testing
632** only.
633*/
634#ifdef SQLITE_TEST
635int sqlite3_like_count = 0;
636#endif
637
danielk19773f6b0872004-06-17 05:36:44 +0000638
639/*
640** Implementation of the like() SQL function. This function implements
641** the build-in LIKE operator. The first argument to the function is the
642** pattern and the second argument is the string. So, the SQL statements:
643**
644** A LIKE B
645**
646** is implemented as like(B,A).
647**
drh55ef4d92005-08-14 01:20:37 +0000648** This same function (with a different compareInfo structure) computes
649** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000650*/
651static void likeFunc(
652 sqlite3_context *context,
653 int argc,
654 sqlite3_value **argv
655){
drhbeb818d2007-05-08 15:34:47 +0000656 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000657 int escape = 0;
drh27e62db2009-04-02 10:16:17 +0000658 int nPat;
drhbb4957f2008-03-20 14:03:29 +0000659 sqlite3 *db = sqlite3_context_db_handle(context);
drhbeb818d2007-05-08 15:34:47 +0000660
drh1f0feef2007-05-15 13:27:07 +0000661 zB = sqlite3_value_text(argv[0]);
662 zA = sqlite3_value_text(argv[1]);
663
drhbeb818d2007-05-08 15:34:47 +0000664 /* Limit the length of the LIKE or GLOB pattern to avoid problems
665 ** of deep recursion and N*N behavior in patternCompare().
666 */
drh27e62db2009-04-02 10:16:17 +0000667 nPat = sqlite3_value_bytes(argv[0]);
668 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] );
669 testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 );
670 if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
drhbeb818d2007-05-08 15:34:47 +0000671 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
672 return;
673 }
drh1f0feef2007-05-15 13:27:07 +0000674 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000675
danielk19777c6303c2004-11-17 16:41:29 +0000676 if( argc==3 ){
677 /* The escape character string must consist of a single UTF-8 character.
678 ** Otherwise, return an error.
679 */
680 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000681 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000682 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000683 sqlite3_result_error(context,
684 "ESCAPE expression must be a single character", -1);
685 return;
686 }
drh769e97e2009-04-01 16:33:37 +0000687 escape = sqlite3Utf8Read(zEsc, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000688 }
danielk19773f6b0872004-06-17 05:36:44 +0000689 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000690 struct compareInfo *pInfo = sqlite3_user_data(context);
691#ifdef SQLITE_TEST
692 sqlite3_like_count++;
693#endif
drhbeb818d2007-05-08 15:34:47 +0000694
danielk1977b56fe1f2007-05-09 08:24:44 +0000695 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000696 }
drh8912d102002-05-26 21:34:58 +0000697}
698
699/*
700** Implementation of the NULLIF(x,y) function. The result is the first
701** argument if the arguments are different. The result is NULL if the
702** arguments are equal to each other.
703*/
drhf9b596e2004-05-26 16:54:42 +0000704static void nullifFunc(
705 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000706 int NotUsed,
drhf9b596e2004-05-26 16:54:42 +0000707 sqlite3_value **argv
708){
danielk1977dc1bdc42004-06-11 10:51:27 +0000709 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk197762c14b32008-11-19 09:05:26 +0000710 UNUSED_PARAMETER(NotUsed);
danielk1977dc1bdc42004-06-11 10:51:27 +0000711 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000712 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000713 }
drh0ac65892002-04-20 14:24:41 +0000714}
715
drh647cb0e2002-11-04 19:32:25 +0000716/*
drh47baebc2009-08-14 16:01:24 +0000717** Implementation of the sqlite_version() function. The result is the version
drh647cb0e2002-11-04 19:32:25 +0000718** of the SQLite library that is running.
719*/
drhf9b596e2004-05-26 16:54:42 +0000720static void versionFunc(
721 sqlite3_context *context,
danielk197762c14b32008-11-19 09:05:26 +0000722 int NotUsed,
723 sqlite3_value **NotUsed2
drhf9b596e2004-05-26 16:54:42 +0000724){
danielk197762c14b32008-11-19 09:05:26 +0000725 UNUSED_PARAMETER2(NotUsed, NotUsed2);
danielk1977d8123362004-06-12 09:25:12 +0000726 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000727}
728
drh47baebc2009-08-14 16:01:24 +0000729/*
730** Implementation of the sqlite_source_id() function. The result is a string
731** that identifies the particular version of the source code used to build
732** SQLite.
733*/
734static void sourceidFunc(
735 sqlite3_context *context,
736 int NotUsed,
737 sqlite3_value **NotUsed2
738){
739 UNUSED_PARAMETER2(NotUsed, NotUsed2);
740 sqlite3_result_text(context, SQLITE_SOURCE_ID, -1, SQLITE_STATIC);
741}
742
drh137c7282007-01-29 17:58:28 +0000743/* Array for converting from half-bytes (nybbles) into ASCII hex
744** digits. */
745static const char hexdigits[] = {
746 '0', '1', '2', '3', '4', '5', '6', '7',
747 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
748};
danielk1977d641d642004-11-18 15:44:29 +0000749
drh47394702003-08-20 01:03:33 +0000750/*
751** EXPERIMENTAL - This is not an official function. The interface may
752** change. This function may disappear. Do not write code that depends
753** on this function.
754**
755** Implementation of the QUOTE() function. This function takes a single
756** argument. If the argument is numeric, the return value is the same as
757** the argument. If the argument is NULL, the return value is the string
758** "NULL". Otherwise, the argument is enclosed in single quotes with
759** single-quote escapes.
760*/
danielk19770ae8b832004-05-25 12:05:56 +0000761static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drha0df4cc2009-02-02 17:29:59 +0000762 assert( argc==1 );
drh1d34fde2009-02-03 15:50:33 +0000763 UNUSED_PARAMETER(argc);
drhf9b596e2004-05-26 16:54:42 +0000764 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000765 case SQLITE_INTEGER:
766 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000767 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000768 break;
769 }
danielk19773f41e972004-06-08 00:39:01 +0000770 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000771 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000772 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000773 int nBlob = sqlite3_value_bytes(argv[0]);
774 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000775 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
danielk1977a1644fd2007-08-29 12:31:25 +0000776 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000777 int i;
778 for(i=0; i<nBlob; i++){
779 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
780 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
781 }
782 zText[(nBlob*2)+2] = '\'';
783 zText[(nBlob*2)+3] = '\0';
784 zText[0] = 'X';
785 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000786 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000787 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000788 }
789 break;
790 }
drh9c054832004-05-31 18:51:57 +0000791 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000792 int i,j;
793 u64 n;
drh2646da72005-12-09 20:02:05 +0000794 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000795 char *z;
796
drh7a521cf2007-04-25 18:23:52 +0000797 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000798 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
drhb1a6c3c2008-03-20 16:30:17 +0000799 z = contextMalloc(context, ((i64)i)+((i64)n)+3);
danielk1977a1644fd2007-08-29 12:31:25 +0000800 if( z ){
801 z[0] = '\'';
802 for(i=0, j=1; zArg[i]; i++){
803 z[j++] = zArg[i];
804 if( zArg[i]=='\'' ){
805 z[j++] = '\'';
806 }
drhf9b596e2004-05-26 16:54:42 +0000807 }
danielk1977a1644fd2007-08-29 12:31:25 +0000808 z[j++] = '\'';
809 z[j] = 0;
810 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000811 }
drha0df4cc2009-02-02 17:29:59 +0000812 break;
813 }
814 default: {
815 assert( sqlite3_value_type(argv[0])==SQLITE_NULL );
816 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
817 break;
drhf9b596e2004-05-26 16:54:42 +0000818 }
drh47394702003-08-20 01:03:33 +0000819 }
820}
821
drh137c7282007-01-29 17:58:28 +0000822/*
823** The hex() function. Interpret the argument as a blob. Return
824** a hexadecimal rendering as text.
825*/
826static void hexFunc(
827 sqlite3_context *context,
828 int argc,
829 sqlite3_value **argv
830){
831 int i, n;
832 const unsigned char *pBlob;
833 char *zHex, *z;
834 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000835 UNUSED_PARAMETER(argc);
drh1f0feef2007-05-15 13:27:07 +0000836 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000837 n = sqlite3_value_bytes(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000838 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
drhb1a6c3c2008-03-20 16:30:17 +0000839 z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
danielk1977a1644fd2007-08-29 12:31:25 +0000840 if( zHex ){
841 for(i=0; i<n; i++, pBlob++){
842 unsigned char c = *pBlob;
843 *(z++) = hexdigits[(c>>4)&0xf];
844 *(z++) = hexdigits[c&0xf];
845 }
846 *z = 0;
847 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000848 }
drh137c7282007-01-29 17:58:28 +0000849}
850
drh26b6d902007-03-17 13:27:54 +0000851/*
drh8cff3822007-05-02 02:08:28 +0000852** The zeroblob(N) function returns a zero-filled blob of size N bytes.
853*/
854static void zeroblobFunc(
855 sqlite3_context *context,
856 int argc,
857 sqlite3_value **argv
858){
drh98640a32007-06-07 19:08:32 +0000859 i64 n;
drh27e62db2009-04-02 10:16:17 +0000860 sqlite3 *db = sqlite3_context_db_handle(context);
drh8cff3822007-05-02 02:08:28 +0000861 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +0000862 UNUSED_PARAMETER(argc);
drh98640a32007-06-07 19:08:32 +0000863 n = sqlite3_value_int64(argv[0]);
drh27e62db2009-04-02 10:16:17 +0000864 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH] );
865 testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
866 if( n>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drh98640a32007-06-07 19:08:32 +0000867 sqlite3_result_error_toobig(context);
868 }else{
drh1bd10f82008-12-10 21:19:56 +0000869 sqlite3_result_zeroblob(context, (int)n);
drh98640a32007-06-07 19:08:32 +0000870 }
drh8cff3822007-05-02 02:08:28 +0000871}
872
873/*
drh26b6d902007-03-17 13:27:54 +0000874** The replace() function. Three arguments are all strings: call
875** them A, B, and C. The result is also a string which is derived
876** from A by replacing every occurance of B with C. The match
877** must be exact. Collating sequences are not used.
878*/
879static void replaceFunc(
880 sqlite3_context *context,
881 int argc,
882 sqlite3_value **argv
883){
884 const unsigned char *zStr; /* The input string A */
885 const unsigned char *zPattern; /* The pattern string B */
886 const unsigned char *zRep; /* The replacement string C */
887 unsigned char *zOut; /* The output */
888 int nStr; /* Size of zStr */
889 int nPattern; /* Size of zPattern */
890 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000891 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000892 int loopLimit; /* Last zStr[] that might match zPattern[] */
893 int i, j; /* Loop counters */
894
895 assert( argc==3 );
danielk1977f3d3c272008-11-19 16:52:44 +0000896 UNUSED_PARAMETER(argc);
drh26b6d902007-03-17 13:27:54 +0000897 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000898 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000899 nStr = sqlite3_value_bytes(argv[0]);
900 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000901 zPattern = sqlite3_value_text(argv[1]);
drha605fe82009-02-01 18:08:40 +0000902 if( zPattern==0 ){
drh23336062009-02-03 13:19:12 +0000903 assert( sqlite3_value_type(argv[1])==SQLITE_NULL
904 || sqlite3_context_db_handle(context)->mallocFailed );
drha605fe82009-02-01 18:08:40 +0000905 return;
906 }
907 if( zPattern[0]==0 ){
908 assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
909 sqlite3_result_value(context, argv[0]);
910 return;
911 }
drh1f0feef2007-05-15 13:27:07 +0000912 nPattern = sqlite3_value_bytes(argv[1]);
913 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000914 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000915 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000916 nRep = sqlite3_value_bytes(argv[2]);
917 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000918 nOut = nStr + 1;
919 assert( nOut<SQLITE_MAX_LENGTH );
drhb1a6c3c2008-03-20 16:30:17 +0000920 zOut = contextMalloc(context, (i64)nOut);
drh2e6400b2007-05-08 15:46:18 +0000921 if( zOut==0 ){
922 return;
drh26b6d902007-03-17 13:27:54 +0000923 }
drh26b6d902007-03-17 13:27:54 +0000924 loopLimit = nStr - nPattern;
925 for(i=j=0; i<=loopLimit; i++){
926 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
927 zOut[j++] = zStr[i];
928 }else{
drh4a50aac2007-08-23 02:47:53 +0000929 u8 *zOld;
drhbb4957f2008-03-20 14:03:29 +0000930 sqlite3 *db = sqlite3_context_db_handle(context);
drh2e6400b2007-05-08 15:46:18 +0000931 nOut += nRep - nPattern;
drh27e62db2009-04-02 10:16:17 +0000932 testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
933 testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
934 if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
drha0206bc2007-05-08 15:15:02 +0000935 sqlite3_result_error_toobig(context);
drh633e6d52008-07-28 19:34:53 +0000936 sqlite3DbFree(db, zOut);
danielk197717374e82007-05-08 14:39:04 +0000937 return;
938 }
drh4a50aac2007-08-23 02:47:53 +0000939 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000940 zOut = sqlite3_realloc(zOut, (int)nOut);
941 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000942 sqlite3_result_error_nomem(context);
drh633e6d52008-07-28 19:34:53 +0000943 sqlite3DbFree(db, zOld);
drh2e6400b2007-05-08 15:46:18 +0000944 return;
945 }
drh26b6d902007-03-17 13:27:54 +0000946 memcpy(&zOut[j], zRep, nRep);
947 j += nRep;
948 i += nPattern-1;
949 }
950 }
drh2e6400b2007-05-08 15:46:18 +0000951 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000952 memcpy(&zOut[j], &zStr[i], nStr-i);
953 j += nStr - i;
954 assert( j<=nOut );
955 zOut[j] = 0;
956 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
957}
958
drh309b3382007-03-17 17:52:42 +0000959/*
960** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
961** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
962*/
963static void trimFunc(
964 sqlite3_context *context,
965 int argc,
966 sqlite3_value **argv
967){
968 const unsigned char *zIn; /* Input string */
969 const unsigned char *zCharSet; /* Set of characters to trim */
970 int nIn; /* Number of bytes in input */
drh7209c692008-04-27 18:40:11 +0000971 int flags; /* 1: trimleft 2: trimright 3: trim */
drhd1e3a612007-04-27 21:59:52 +0000972 int i; /* Loop counter */
drh1bd10f82008-12-10 21:19:56 +0000973 unsigned char *aLen = 0; /* Length of each character in zCharSet */
974 unsigned char **azChar = 0; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000975 int nChar; /* Number of characters in zCharSet */
976
drh309b3382007-03-17 17:52:42 +0000977 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
978 return;
979 }
980 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000981 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000982 nIn = sqlite3_value_bytes(argv[0]);
983 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000984 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000985 static const unsigned char lenOne[] = { 1 };
danielk1977a4de4532008-09-02 15:44:08 +0000986 static unsigned char * const azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000987 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000988 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +0000989 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +0000990 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000991 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000992 return;
drhd1e3a612007-04-27 21:59:52 +0000993 }else{
994 const unsigned char *z;
995 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000996 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000997 }
998 if( nChar>0 ){
drhb1a6c3c2008-03-20 16:30:17 +0000999 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +00001000 if( azChar==0 ){
1001 return;
1002 }
1003 aLen = (unsigned char*)&azChar[nChar];
1004 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +00001005 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +00001006 SQLITE_SKIP_UTF8(z);
drh3abbd392008-12-10 23:04:13 +00001007 aLen[nChar] = (u8)(z - azChar[nChar]);
drhd1e3a612007-04-27 21:59:52 +00001008 }
1009 }
drh309b3382007-03-17 17:52:42 +00001010 }
drhd1e3a612007-04-27 21:59:52 +00001011 if( nChar>0 ){
shane1fc41292008-07-08 22:28:48 +00001012 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
drh309b3382007-03-17 17:52:42 +00001013 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +00001014 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +00001015 int len = 0;
drhd1e3a612007-04-27 21:59:52 +00001016 for(i=0; i<nChar; i++){
1017 len = aLen[i];
drh27e62db2009-04-02 10:16:17 +00001018 if( len<=nIn && memcmp(zIn, azChar[i], len)==0 ) break;
drhd1e3a612007-04-27 21:59:52 +00001019 }
1020 if( i>=nChar ) break;
1021 zIn += len;
1022 nIn -= len;
drh309b3382007-03-17 17:52:42 +00001023 }
1024 }
1025 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +00001026 while( nIn>0 ){
drh1bd10f82008-12-10 21:19:56 +00001027 int len = 0;
drhd1e3a612007-04-27 21:59:52 +00001028 for(i=0; i<nChar; i++){
1029 len = aLen[i];
1030 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
1031 }
1032 if( i>=nChar ) break;
1033 nIn -= len;
drh309b3382007-03-17 17:52:42 +00001034 }
1035 }
drhd1e3a612007-04-27 21:59:52 +00001036 if( zCharSet ){
1037 sqlite3_free(azChar);
1038 }
drh309b3382007-03-17 17:52:42 +00001039 }
1040 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
1041}
drh26b6d902007-03-17 13:27:54 +00001042
danielk1977a4de4532008-09-02 15:44:08 +00001043
drhd24cc422003-03-27 12:51:24 +00001044#ifdef SQLITE_SOUNDEX
1045/*
1046** Compute the soundex encoding of a word.
1047*/
drh137c7282007-01-29 17:58:28 +00001048static void soundexFunc(
1049 sqlite3_context *context,
1050 int argc,
1051 sqlite3_value **argv
1052){
drhd24cc422003-03-27 12:51:24 +00001053 char zResult[8];
drh4c755c02004-08-08 20:22:17 +00001054 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +00001055 int i, j;
1056 static const unsigned char iCode[] = {
1057 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1058 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1059 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1060 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1061 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1062 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1063 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
1064 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
1065 };
1066 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +00001067 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +00001068 if( zIn==0 ) zIn = (u8*)"";
drhdc86e2b2009-01-24 11:30:42 +00001069 for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
drhd24cc422003-03-27 12:51:24 +00001070 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +00001071 u8 prevcode = iCode[zIn[i]&0x7f];
danielk197778ca0e72009-01-20 16:53:39 +00001072 zResult[0] = sqlite3Toupper(zIn[i]);
drhd24cc422003-03-27 12:51:24 +00001073 for(j=1; j<4 && zIn[i]; i++){
1074 int code = iCode[zIn[i]&0x7f];
1075 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +00001076 if( code!=prevcode ){
1077 prevcode = code;
1078 zResult[j++] = code + '0';
1079 }
1080 }else{
1081 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +00001082 }
1083 }
1084 while( j<4 ){
1085 zResult[j++] = '0';
1086 }
1087 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001088 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +00001089 }else{
danielk1977d8123362004-06-12 09:25:12 +00001090 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +00001091 }
1092}
1093#endif
1094
drhfdb83b22006-06-17 14:12:47 +00001095#ifndef SQLITE_OMIT_LOAD_EXTENSION
1096/*
1097** A function that loads a shared-library extension then returns NULL.
1098*/
1099static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001100 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001101 const char *zProc;
drhfa4a4b92008-03-19 21:45:51 +00001102 sqlite3 *db = sqlite3_context_db_handle(context);
drhfdb83b22006-06-17 14:12:47 +00001103 char *zErrMsg = 0;
1104
1105 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001106 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001107 }else{
1108 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001109 }
drh7a521cf2007-04-25 18:23:52 +00001110 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001111 sqlite3_result_error(context, zErrMsg, -1);
1112 sqlite3_free(zErrMsg);
1113 }
1114}
1115#endif
1116
danielk197701427a62005-01-11 13:02:33 +00001117
drh0ac65892002-04-20 14:24:41 +00001118/*
drhd3a149e2002-02-24 17:12:53 +00001119** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001120** sum() or avg() aggregate computation.
1121*/
1122typedef struct SumCtx SumCtx;
1123struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001124 double rSum; /* Floating point sum */
1125 i64 iSum; /* Integer sum */
1126 i64 cnt; /* Number of elements summed */
1127 u8 overflow; /* True if integer overflow seen */
1128 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001129};
1130
1131/*
drha97fdd32006-01-12 22:17:50 +00001132** Routines used to compute the sum, average, and total.
1133**
1134** The SUM() function follows the (broken) SQL standard which means
1135** that it returns NULL if it sums over no inputs. TOTAL returns
1136** 0.0 in that case. In addition, TOTAL always returns a float where
1137** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001138** value. TOTAL never fails, but SUM might through an exception if
1139** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001140*/
danielk19770ae8b832004-05-25 12:05:56 +00001141static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001142 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001143 int type;
drh3f219f42005-09-08 19:45:57 +00001144 assert( argc==1 );
danielk1977f3d3c272008-11-19 16:52:44 +00001145 UNUSED_PARAMETER(argc);
drh4f26d6c2004-05-26 23:25:30 +00001146 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001147 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001148 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001149 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001150 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001151 i64 v = sqlite3_value_int64(argv[0]);
1152 p->rSum += v;
1153 if( (p->approx|p->overflow)==0 ){
1154 i64 iNewSum = p->iSum + v;
drh1bd10f82008-12-10 21:19:56 +00001155 int s1 = (int)(p->iSum >> (sizeof(i64)*8-1));
1156 int s2 = (int)(v >> (sizeof(i64)*8-1));
1157 int s3 = (int)(iNewSum >> (sizeof(i64)*8-1));
1158 p->overflow = ((s1&s2&~s3) | (~s1&~s2&s3))?1:0;
drh8c08e862006-02-11 17:34:00 +00001159 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001160 }
1161 }else{
drh8c08e862006-02-11 17:34:00 +00001162 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001163 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001164 }
drh739105c2002-05-29 23:22:23 +00001165 }
drhdd5baa92002-02-27 19:50:59 +00001166}
danielk19770ae8b832004-05-25 12:05:56 +00001167static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001168 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001169 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001170 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001171 if( p->overflow ){
1172 sqlite3_result_error(context,"integer overflow",-1);
1173 }else if( p->approx ){
1174 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001175 }else{
drh8c08e862006-02-11 17:34:00 +00001176 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001177 }
drh3d1d95e2005-09-08 10:37:01 +00001178 }
drhdd5baa92002-02-27 19:50:59 +00001179}
danielk19770ae8b832004-05-25 12:05:56 +00001180static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001181 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001182 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001183 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001184 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001185 }
1186}
drha97fdd32006-01-12 22:17:50 +00001187static void totalFinalize(sqlite3_context *context){
1188 SumCtx *p;
1189 p = sqlite3_aggregate_context(context, 0);
shanefbd60f82009-02-04 03:59:25 +00001190 /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
1191 sqlite3_result_double(context, p ? p->rSum : (double)0);
drha97fdd32006-01-12 22:17:50 +00001192}
drhdd5baa92002-02-27 19:50:59 +00001193
1194/*
drh0bce8352002-02-28 00:41:10 +00001195** The following structure keeps track of state information for the
1196** count() aggregate function.
1197*/
1198typedef struct CountCtx CountCtx;
1199struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001200 i64 n;
drh0bce8352002-02-28 00:41:10 +00001201};
drhdd5baa92002-02-27 19:50:59 +00001202
drh0bce8352002-02-28 00:41:10 +00001203/*
1204** Routines to implement the count() aggregate function.
1205*/
danielk19770ae8b832004-05-25 12:05:56 +00001206static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001207 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001208 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001209 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001210 p->n++;
1211 }
drh2e79c3d2009-04-08 23:04:14 +00001212
drhd3264c72009-04-15 13:39:47 +00001213#ifndef SQLITE_OMIT_DEPRECATED
drh2e79c3d2009-04-08 23:04:14 +00001214 /* The sqlite3_aggregate_count() function is deprecated. But just to make
1215 ** sure it still operates correctly, verify that its count agrees with our
1216 ** internal count when using count(*) and when the total count can be
1217 ** expressed as a 32-bit integer. */
1218 assert( argc==1 || p==0 || p->n>0x7fffffff
1219 || p->n==sqlite3_aggregate_count(context) );
drhd3264c72009-04-15 13:39:47 +00001220#endif
drh0bce8352002-02-28 00:41:10 +00001221}
danielk19770ae8b832004-05-25 12:05:56 +00001222static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001223 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001224 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001225 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001226}
1227
1228/*
drh0bce8352002-02-28 00:41:10 +00001229** Routines to implement min() and max() aggregate functions.
1230*/
danielk197762c14b32008-11-19 09:05:26 +00001231static void minmaxStep(
1232 sqlite3_context *context,
1233 int NotUsed,
1234 sqlite3_value **argv
1235){
danielk197788208052004-05-25 01:13:20 +00001236 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001237 Mem *pBest;
danielk197762c14b32008-11-19 09:05:26 +00001238 UNUSED_PARAMETER(NotUsed);
drh9eb516c2004-07-18 20:52:32 +00001239
1240 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1241 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001242 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001243
danielk197788208052004-05-25 01:13:20 +00001244 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001245 int max;
1246 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001247 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001248 /* This step function is used for both the min() and max() aggregates,
1249 ** the only difference between the two being that the sense of the
1250 ** comparison is inverted. For the max() aggregate, the
1251 ** sqlite3_user_data() function returns (void *)-1. For min() it
1252 ** returns (void *)db, where db is the sqlite3* database pointer.
1253 ** Therefore the next statement sets variable 'max' to 1 for the max()
1254 ** aggregate, or 0 for min().
1255 */
drh309b3382007-03-17 17:52:42 +00001256 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001257 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001258 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001259 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001260 }
drh268380c2004-02-25 13:47:31 +00001261 }else{
drhb21c8cd2007-08-21 19:33:56 +00001262 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001263 }
1264}
danielk19770ae8b832004-05-25 12:05:56 +00001265static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001266 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001267 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1268 if( pRes ){
drhd27135a2009-04-02 13:36:37 +00001269 if( ALWAYS(pRes->flags) ){
drhabfcea22005-09-06 20:36:48 +00001270 sqlite3_result_value(context, pRes);
1271 }
1272 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001273 }
1274}
drhdd5baa92002-02-27 19:50:59 +00001275
drhb0689692007-11-01 17:38:30 +00001276/*
1277** group_concat(EXPR, ?SEPARATOR?)
1278*/
1279static void groupConcatStep(
1280 sqlite3_context *context,
1281 int argc,
1282 sqlite3_value **argv
1283){
1284 const char *zVal;
drhade86482007-11-28 22:36:40 +00001285 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001286 const char *zSep;
drh07d31172009-02-02 21:57:05 +00001287 int nVal, nSep;
1288 assert( argc==1 || argc==2 );
1289 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001290 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1291
1292 if( pAccum ){
drhbb4957f2008-03-20 14:03:29 +00001293 sqlite3 *db = sqlite3_context_db_handle(context);
drh8bfd7192009-06-19 16:44:41 +00001294 int firstTerm = pAccum->useMalloc==0;
drhade86482007-11-28 22:36:40 +00001295 pAccum->useMalloc = 1;
drhbb4957f2008-03-20 14:03:29 +00001296 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
drh8bfd7192009-06-19 16:44:41 +00001297 if( !firstTerm ){
drh07d31172009-02-02 21:57:05 +00001298 if( argc==2 ){
1299 zSep = (char*)sqlite3_value_text(argv[1]);
1300 nSep = sqlite3_value_bytes(argv[1]);
drhb0689692007-11-01 17:38:30 +00001301 }else{
1302 zSep = ",";
drhade86482007-11-28 22:36:40 +00001303 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001304 }
drhade86482007-11-28 22:36:40 +00001305 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001306 }
drh07d31172009-02-02 21:57:05 +00001307 zVal = (char*)sqlite3_value_text(argv[0]);
1308 nVal = sqlite3_value_bytes(argv[0]);
1309 sqlite3StrAccumAppend(pAccum, zVal, nVal);
drhb0689692007-11-01 17:38:30 +00001310 }
1311}
1312static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001313 StrAccum *pAccum;
1314 pAccum = sqlite3_aggregate_context(context, 0);
1315 if( pAccum ){
1316 if( pAccum->tooBig ){
1317 sqlite3_result_error_toobig(context);
1318 }else if( pAccum->mallocFailed ){
1319 sqlite3_result_error_nomem(context);
1320 }else{
1321 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1322 sqlite3_free);
1323 }
drhb0689692007-11-01 17:38:30 +00001324 }
1325}
drh4e5ffc52004-08-31 00:52:37 +00001326
drhd3a149e2002-02-24 17:12:53 +00001327/*
drha2ed5602002-02-26 23:55:31 +00001328** This function registered all of the above C functions as SQL
1329** functions. This should be the only routine in this file with
1330** external linkage.
drhdc04c582002-02-24 01:55:15 +00001331*/
drh9bb575f2004-09-06 17:24:11 +00001332void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh1f01ec12005-02-15 21:36:18 +00001333#ifndef SQLITE_OMIT_ALTERTABLE
1334 sqlite3AlterFunctions(db);
1335#endif
danielk19771e536952007-08-16 10:09:01 +00001336 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001337 int rc = sqlite3_overload_function(db, "MATCH", 2);
1338 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1339 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001340 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001341 }
1342 }
drh55ef4d92005-08-14 01:20:37 +00001343}
1344
1345/*
1346** Set the LIKEOPT flag on the 2-argument function with the given name.
1347*/
drh1bd10f82008-12-10 21:19:56 +00001348static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
drh55ef4d92005-08-14 01:20:37 +00001349 FuncDef *pDef;
drhea678832008-12-10 19:26:22 +00001350 pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
1351 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001352 if( ALWAYS(pDef) ){
drhd64fe2f2005-08-28 17:00:23 +00001353 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001354 }
1355}
1356
1357/*
1358** Register the built-in LIKE and GLOB functions. The caseSensitive
1359** parameter determines whether or not the LIKE operator is case
1360** sensitive. GLOB is always case sensitive.
1361*/
1362void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1363 struct compareInfo *pInfo;
1364 if( caseSensitive ){
1365 pInfo = (struct compareInfo*)&likeInfoAlt;
1366 }else{
1367 pInfo = (struct compareInfo*)&likeInfoNorm;
1368 }
danielk1977717811c2009-03-27 15:26:03 +00001369 sqlite3CreateFunc(db, "like", 2, SQLITE_ANY, pInfo, likeFunc, 0, 0);
1370 sqlite3CreateFunc(db, "like", 3, SQLITE_ANY, pInfo, likeFunc, 0, 0);
1371 sqlite3CreateFunc(db, "glob", 2, SQLITE_ANY,
drh55ef4d92005-08-14 01:20:37 +00001372 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001373 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1374 setLikeOptFlag(db, "like",
1375 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001376}
1377
1378/*
1379** pExpr points to an expression which implements a function. If
1380** it is appropriate to apply the LIKE optimization to that function
1381** then set aWc[0] through aWc[2] to the wildcard characters and
1382** return TRUE. If the function is not a LIKE-style function then
1383** return FALSE.
1384*/
drhd64fe2f2005-08-28 17:00:23 +00001385int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001386 FuncDef *pDef;
danielk19776ab3a2e2009-02-19 14:39:25 +00001387 if( pExpr->op!=TK_FUNCTION
1388 || !pExpr->x.pList
1389 || pExpr->x.pList->nExpr!=2
1390 ){
drh55ef4d92005-08-14 01:20:37 +00001391 return 0;
1392 }
danielk19776ab3a2e2009-02-19 14:39:25 +00001393 assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
drh33e619f2009-05-28 01:00:55 +00001394 pDef = sqlite3FindFunction(db, pExpr->u.zToken,
1395 sqlite3Strlen30(pExpr->u.zToken),
drhb7916a72009-05-27 10:31:29 +00001396 2, SQLITE_UTF8, 0);
drhd27135a2009-04-02 13:36:37 +00001397 if( NEVER(pDef==0) || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001398 return 0;
1399 }
1400
1401 /* The memcpy() statement assumes that the wildcard characters are
1402 ** the first three statements in the compareInfo structure. The
1403 ** asserts() that follow verify that assumption
1404 */
1405 memcpy(aWc, pDef->pUserData, 3);
1406 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1407 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1408 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001409 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001410 return 1;
drhdc04c582002-02-24 01:55:15 +00001411}
danielk19778c0a7912008-08-20 14:49:23 +00001412
drh70a8ca32008-08-21 18:49:27 +00001413/*
drh777c5382008-08-21 20:21:34 +00001414** All all of the FuncDef structures in the aBuiltinFunc[] array above
1415** to the global function hash table. This occurs at start-time (as
1416** a consequence of calling sqlite3_initialize()).
1417**
1418** After this routine runs
drh70a8ca32008-08-21 18:49:27 +00001419*/
1420void sqlite3RegisterGlobalFunctions(void){
danielk197793ce7412008-09-01 19:14:02 +00001421 /*
1422 ** The following array holds FuncDef structures for all of the functions
1423 ** defined in this file.
1424 **
1425 ** The array cannot be constant since changes are made to the
1426 ** FuncDef.pHash elements at start-time. The elements of this array
1427 ** are read-only after initialization is complete.
1428 */
1429 static SQLITE_WSD FuncDef aBuiltinFunc[] = {
1430 FUNCTION(ltrim, 1, 1, 0, trimFunc ),
1431 FUNCTION(ltrim, 2, 1, 0, trimFunc ),
1432 FUNCTION(rtrim, 1, 2, 0, trimFunc ),
1433 FUNCTION(rtrim, 2, 2, 0, trimFunc ),
1434 FUNCTION(trim, 1, 3, 0, trimFunc ),
1435 FUNCTION(trim, 2, 3, 0, trimFunc ),
1436 FUNCTION(min, -1, 0, 1, minmaxFunc ),
1437 FUNCTION(min, 0, 0, 1, 0 ),
1438 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
1439 FUNCTION(max, -1, 1, 1, minmaxFunc ),
1440 FUNCTION(max, 0, 1, 1, 0 ),
1441 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1442 FUNCTION(typeof, 1, 0, 0, typeofFunc ),
1443 FUNCTION(length, 1, 0, 0, lengthFunc ),
1444 FUNCTION(substr, 2, 0, 0, substrFunc ),
1445 FUNCTION(substr, 3, 0, 0, substrFunc ),
1446 FUNCTION(abs, 1, 0, 0, absFunc ),
shanefbd60f82009-02-04 03:59:25 +00001447#ifndef SQLITE_OMIT_FLOATING_POINT
danielk197793ce7412008-09-01 19:14:02 +00001448 FUNCTION(round, 1, 0, 0, roundFunc ),
1449 FUNCTION(round, 2, 0, 0, roundFunc ),
shanefbd60f82009-02-04 03:59:25 +00001450#endif
danielk197793ce7412008-09-01 19:14:02 +00001451 FUNCTION(upper, 1, 0, 0, upperFunc ),
1452 FUNCTION(lower, 1, 0, 0, lowerFunc ),
1453 FUNCTION(coalesce, 1, 0, 0, 0 ),
danielk197793ce7412008-09-01 19:14:02 +00001454 FUNCTION(coalesce, 0, 0, 0, 0 ),
drhae6bb952009-11-11 00:24:31 +00001455/* FUNCTION(coalesce, -1, 0, 0, ifnullFunc ), */
1456 {-1,SQLITE_UTF8,SQLITE_FUNC_COALESCE,0,0,ifnullFunc,0,0,"coalesce",0},
danielk197793ce7412008-09-01 19:14:02 +00001457 FUNCTION(hex, 1, 0, 0, hexFunc ),
drhae6bb952009-11-11 00:24:31 +00001458/* FUNCTION(ifnull, 2, 0, 0, ifnullFunc ), */
1459 {2,SQLITE_UTF8,SQLITE_FUNC_COALESCE,0,0,ifnullFunc,0,0,"ifnull",0},
drh9373b012009-02-02 01:50:39 +00001460 FUNCTION(random, 0, 0, 0, randomFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001461 FUNCTION(randomblob, 1, 0, 0, randomBlob ),
1462 FUNCTION(nullif, 2, 0, 1, nullifFunc ),
1463 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
drh47baebc2009-08-14 16:01:24 +00001464 FUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ),
danielk197793ce7412008-09-01 19:14:02 +00001465 FUNCTION(quote, 1, 0, 0, quoteFunc ),
1466 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
1467 FUNCTION(changes, 0, 0, 0, changes ),
1468 FUNCTION(total_changes, 0, 0, 0, total_changes ),
1469 FUNCTION(replace, 3, 0, 0, replaceFunc ),
1470 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
1471 #ifdef SQLITE_SOUNDEX
1472 FUNCTION(soundex, 1, 0, 0, soundexFunc ),
1473 #endif
1474 #ifndef SQLITE_OMIT_LOAD_EXTENSION
1475 FUNCTION(load_extension, 1, 0, 0, loadExt ),
1476 FUNCTION(load_extension, 2, 0, 0, loadExt ),
1477 #endif
1478 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
1479 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
1480 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
danielk1977a5533162009-02-24 10:01:51 +00001481 /* AGGREGATE(count, 0, 0, 0, countStep, countFinalize ), */
1482 {0,SQLITE_UTF8,SQLITE_FUNC_COUNT,0,0,0,countStep,countFinalize,"count",0},
danielk197793ce7412008-09-01 19:14:02 +00001483 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
drh07d31172009-02-02 21:57:05 +00001484 AGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize),
1485 AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize),
danielk197793ce7412008-09-01 19:14:02 +00001486
1487 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1488 #ifdef SQLITE_CASE_SENSITIVE_LIKE
1489 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1490 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
1491 #else
1492 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
1493 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
1494 #endif
1495 };
1496
drh70a8ca32008-08-21 18:49:27 +00001497 int i;
danielk197793ce7412008-09-01 19:14:02 +00001498 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
drh106cee52008-09-03 17:11:16 +00001499 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
danielk197793ce7412008-09-01 19:14:02 +00001500
drh70a8ca32008-08-21 18:49:27 +00001501 for(i=0; i<ArraySize(aBuiltinFunc); i++){
danielk197793ce7412008-09-01 19:14:02 +00001502 sqlite3FuncDefInsert(pHash, &aFunc[i]);
drh70a8ca32008-08-21 18:49:27 +00001503 }
drh777c5382008-08-21 20:21:34 +00001504 sqlite3RegisterDateTimeFunctions();
drh70a8ca32008-08-21 18:49:27 +00001505}