blob: 840254b7ea568f36ccb9fb2bc618c2d050c01188 [file] [log] [blame]
drhdc04c582002-02-24 01:55:15 +00001/*
2** 2002 February 23
3**
4** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
6**
7** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
10**
11*************************************************************************
12** This file contains the C functions that implement various SQL
13** functions of SQLite.
14**
15** There is only one exported symbol in this file - the function
16** sqliteRegisterBuildinFunctions() found at the bottom of the file.
17** All other code has file scope.
18**
drh60a713c2008-01-21 16:22:45 +000019** $Id: func.c,v 1.183 2008/01/21 16:22:46 drh Exp $
drhdc04c582002-02-24 01:55:15 +000020*/
drhb659e9b2005-01-28 01:29:08 +000021#include "sqliteInt.h"
drhdc04c582002-02-24 01:55:15 +000022#include <ctype.h>
drhd3a149e2002-02-24 17:12:53 +000023#include <stdlib.h>
drh0bce8352002-02-28 00:41:10 +000024#include <assert.h>
danielk197788208052004-05-25 01:13:20 +000025#include "vdbeInt.h"
drh0bce8352002-02-28 00:41:10 +000026
drh66150952007-07-23 19:12:41 +000027
drh55ef4d92005-08-14 01:20:37 +000028/*
29** Return the collating function associated with a function.
30*/
danielk1977dc1bdc42004-06-11 10:51:27 +000031static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
32 return context->pColl;
33}
34
drh0bce8352002-02-28 00:41:10 +000035/*
36** Implementation of the non-aggregate min() and max() functions
37*/
drhf9b596e2004-05-26 16:54:42 +000038static void minmaxFunc(
39 sqlite3_context *context,
40 int argc,
41 sqlite3_value **argv
42){
drh0bce8352002-02-28 00:41:10 +000043 int i;
drh268380c2004-02-25 13:47:31 +000044 int mask; /* 0 for min() or 0xffffffff for max() */
drhf9b596e2004-05-26 16:54:42 +000045 int iBest;
danielk1977dc1bdc42004-06-11 10:51:27 +000046 CollSeq *pColl;
drh0bce8352002-02-28 00:41:10 +000047
drh89425d52002-02-28 03:04:48 +000048 if( argc==0 ) return;
drhc44af712004-09-02 15:53:56 +000049 mask = sqlite3_user_data(context)==0 ? 0 : -1;
danielk1977dc1bdc42004-06-11 10:51:27 +000050 pColl = sqlite3GetFuncCollSeq(context);
51 assert( pColl );
danielk1977c572ef72004-05-27 09:28:41 +000052 assert( mask==-1 || mask==0 );
drhf9b596e2004-05-26 16:54:42 +000053 iBest = 0;
drh9c054832004-05-31 18:51:57 +000054 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhf9b596e2004-05-26 16:54:42 +000055 for(i=1; i<argc; i++){
drh9c054832004-05-31 18:51:57 +000056 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
danielk1977dc1bdc42004-06-11 10:51:27 +000057 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
drhf9b596e2004-05-26 16:54:42 +000058 iBest = i;
drh0bce8352002-02-28 00:41:10 +000059 }
60 }
drhf4479502004-05-27 03:12:53 +000061 sqlite3_result_value(context, argv[iBest]);
drh0bce8352002-02-28 00:41:10 +000062}
drh0bce8352002-02-28 00:41:10 +000063
drh268380c2004-02-25 13:47:31 +000064/*
65** Return the type of the argument.
66*/
drhf9b596e2004-05-26 16:54:42 +000067static void typeofFunc(
68 sqlite3_context *context,
69 int argc,
70 sqlite3_value **argv
71){
danielk197735bb9d02004-05-24 12:55:54 +000072 const char *z = 0;
danielk197735bb9d02004-05-24 12:55:54 +000073 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000074 case SQLITE_NULL: z = "null"; break;
75 case SQLITE_INTEGER: z = "integer"; break;
76 case SQLITE_TEXT: z = "text"; break;
77 case SQLITE_FLOAT: z = "real"; break;
78 case SQLITE_BLOB: z = "blob"; break;
danielk197735bb9d02004-05-24 12:55:54 +000079 }
danielk1977d8123362004-06-12 09:25:12 +000080 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000081}
82
drh5708d2d2005-06-22 10:53:59 +000083
84/*
drh0bce8352002-02-28 00:41:10 +000085** Implementation of the length() function
86*/
drhf9b596e2004-05-26 16:54:42 +000087static void lengthFunc(
88 sqlite3_context *context,
89 int argc,
90 sqlite3_value **argv
91){
drh0bce8352002-02-28 00:41:10 +000092 int len;
93
94 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +000095 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000096 case SQLITE_BLOB:
97 case SQLITE_INTEGER:
98 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +000099 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +0000100 break;
101 }
drh9c054832004-05-31 18:51:57 +0000102 case SQLITE_TEXT: {
drh2646da72005-12-09 20:02:05 +0000103 const unsigned char *z = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000104 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000105 len = 0;
106 while( *z ){
107 len++;
108 SQLITE_SKIP_UTF8(z);
109 }
drhf4479502004-05-27 03:12:53 +0000110 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000111 break;
112 }
113 default: {
114 sqlite3_result_null(context);
115 break;
116 }
117 }
drh0bce8352002-02-28 00:41:10 +0000118}
119
120/*
121** Implementation of the abs() function
122*/
danielk19770ae8b832004-05-25 12:05:56 +0000123static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000124 assert( argc==1 );
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[].
drh0bce8352002-02-28 00:41:10 +0000160*/
drhf9b596e2004-05-26 16:54:42 +0000161static void substrFunc(
162 sqlite3_context *context,
163 int argc,
164 sqlite3_value **argv
165){
drh2646da72005-12-09 20:02:05 +0000166 const unsigned char *z;
167 const unsigned char *z2;
drh023ae032007-05-08 12:12:16 +0000168 int len;
drhf764e6f2007-05-15 01:13:47 +0000169 int p0type;
drh023ae032007-05-08 12:12:16 +0000170 i64 p1, p2;
drhf9b596e2004-05-26 16:54:42 +0000171
drh64f31512007-10-12 19:11:55 +0000172 assert( argc==3 || argc==2 );
drhf764e6f2007-05-15 01:13:47 +0000173 p0type = sqlite3_value_type(argv[0]);
174 if( p0type==SQLITE_BLOB ){
175 len = sqlite3_value_bytes(argv[0]);
176 z = sqlite3_value_blob(argv[0]);
177 if( z==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000178 assert( len==sqlite3_value_bytes(argv[0]) );
drhf764e6f2007-05-15 01:13:47 +0000179 }else{
180 z = sqlite3_value_text(argv[0]);
181 if( z==0 ) return;
drh4a919112007-05-15 11:55:09 +0000182 len = 0;
183 for(z2=z; *z2; len++){
184 SQLITE_SKIP_UTF8(z2);
185 }
drhf764e6f2007-05-15 01:13:47 +0000186 }
danielk197751ad0ec2004-05-24 12:39:02 +0000187 p1 = sqlite3_value_int(argv[1]);
drh64f31512007-10-12 19:11:55 +0000188 if( argc==3 ){
189 p2 = sqlite3_value_int(argv[2]);
190 }else{
191 p2 = SQLITE_MAX_LENGTH;
192 }
drh0bce8352002-02-28 00:41:10 +0000193 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000194 p1 += len;
drh653bc752002-02-28 03:31:10 +0000195 if( p1<0 ){
196 p2 += p1;
197 p1 = 0;
198 }
drh0bce8352002-02-28 00:41:10 +0000199 }else if( p1>0 ){
200 p1--;
201 }
202 if( p1+p2>len ){
203 p2 = len-p1;
204 }
drhf764e6f2007-05-15 01:13:47 +0000205 if( p0type!=SQLITE_BLOB ){
drh4a919112007-05-15 11:55:09 +0000206 while( *z && p1 ){
207 SQLITE_SKIP_UTF8(z);
208 p1--;
drhf764e6f2007-05-15 01:13:47 +0000209 }
drh4a919112007-05-15 11:55:09 +0000210 for(z2=z; *z2 && p2; p2--){
211 SQLITE_SKIP_UTF8(z2);
drhf764e6f2007-05-15 01:13:47 +0000212 }
drh4a919112007-05-15 11:55:09 +0000213 sqlite3_result_text(context, (char*)z, z2-z, SQLITE_TRANSIENT);
drhf764e6f2007-05-15 01:13:47 +0000214 }else{
215 if( p2<0 ) p2 = 0;
216 sqlite3_result_blob(context, (char*)&z[p1], p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000217 }
drh0bce8352002-02-28 00:41:10 +0000218}
219
220/*
221** Implementation of the round() function
222*/
danielk19770ae8b832004-05-25 12:05:56 +0000223static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000224 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000225 double r;
drh592ac8c2005-08-13 03:07:47 +0000226 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000227 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000228 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000229 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000230 n = sqlite3_value_int(argv[1]);
231 if( n>30 ) n = 30;
232 if( n<0 ) n = 0;
233 }
drhd589a922006-03-02 03:02:48 +0000234 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000235 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000236 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000237 sqlite3AtoF(zBuf, &r);
238 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000239}
drhdc04c582002-02-24 01:55:15 +0000240
danielk197726783a52007-08-29 14:06:22 +0000241/*
242** Allocate nByte bytes of space using sqlite3_malloc(). If the
243** allocation fails, call sqlite3_result_error_nomem() to notify
244** the database handle that malloc() has failed.
245*/
danielk1977a1644fd2007-08-29 12:31:25 +0000246static void *contextMalloc(sqlite3_context *context, int nByte){
247 char *z = sqlite3_malloc(nByte);
248 if( !z && nByte>0 ){
249 sqlite3_result_error_nomem(context);
250 }
251 return z;
252}
253
drhdc04c582002-02-24 01:55:15 +0000254/*
255** Implementation of the upper() and lower() SQL functions.
256*/
danielk19770ae8b832004-05-25 12:05:56 +0000257static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000258 char *z1;
259 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000260 int i, n;
drh9c054832004-05-31 18:51:57 +0000261 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000262 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000263 n = sqlite3_value_bytes(argv[0]);
264 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
265 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000266 if( z2 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000267 z1 = contextMalloc(context, n+1);
drh7a521cf2007-04-25 18:23:52 +0000268 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000269 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000270 for(i=0; z1[i]; i++){
271 z1[i] = toupper(z1[i]);
272 }
273 sqlite3_result_text(context, z1, -1, sqlite3_free);
274 }
drhdc04c582002-02-24 01:55:15 +0000275 }
276}
danielk19770ae8b832004-05-25 12:05:56 +0000277static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh7a521cf2007-04-25 18:23:52 +0000278 char *z1;
279 const char *z2;
drh9310ef22007-04-27 17:16:20 +0000280 int i, n;
drh9c054832004-05-31 18:51:57 +0000281 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
drh7a521cf2007-04-25 18:23:52 +0000282 z2 = (char*)sqlite3_value_text(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000283 n = sqlite3_value_bytes(argv[0]);
284 /* Verify that the call to _bytes() does not invalidate the _text() pointer */
285 assert( z2==(char*)sqlite3_value_text(argv[0]) );
drh7a521cf2007-04-25 18:23:52 +0000286 if( z2 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000287 z1 = contextMalloc(context, n+1);
drh7a521cf2007-04-25 18:23:52 +0000288 if( z1 ){
drh5bb3eb92007-05-04 13:15:55 +0000289 memcpy(z1, z2, n+1);
drh7a521cf2007-04-25 18:23:52 +0000290 for(i=0; z1[i]; i++){
291 z1[i] = tolower(z1[i]);
292 }
293 sqlite3_result_text(context, z1, -1, sqlite3_free);
294 }
drhdc04c582002-02-24 01:55:15 +0000295 }
296}
297
298/*
drhfbc99082002-02-28 03:14:18 +0000299** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000300** All three do the same thing. They return the first non-NULL
301** argument.
drh3212e182002-02-28 00:46:26 +0000302*/
drhf9b596e2004-05-26 16:54:42 +0000303static void ifnullFunc(
304 sqlite3_context *context,
305 int argc,
306 sqlite3_value **argv
307){
drhfbc99082002-02-28 03:14:18 +0000308 int i;
309 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000310 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000311 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000312 break;
313 }
314 }
drh3212e182002-02-28 00:46:26 +0000315}
316
317/*
drhf9ffac92002-03-02 19:00:31 +0000318** Implementation of random(). Return a random integer.
319*/
drhf9b596e2004-05-26 16:54:42 +0000320static void randomFunc(
321 sqlite3_context *context,
322 int argc,
323 sqlite3_value **argv
324){
drh52fc8492006-02-23 21:43:55 +0000325 sqlite_int64 r;
danielk19774adee202004-05-08 08:23:19 +0000326 sqlite3Randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000327 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
328 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000329 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000330}
331
332/*
drh137c7282007-01-29 17:58:28 +0000333** Implementation of randomblob(N). Return a random blob
334** that is N bytes long.
drh63cf66f2007-01-29 15:50:05 +0000335*/
drh137c7282007-01-29 17:58:28 +0000336static void randomBlob(
drh63cf66f2007-01-29 15:50:05 +0000337 sqlite3_context *context,
338 int argc,
339 sqlite3_value **argv
340){
drh137c7282007-01-29 17:58:28 +0000341 int n;
342 unsigned char *p;
drh63cf66f2007-01-29 15:50:05 +0000343 assert( argc==1 );
344 n = sqlite3_value_int(argv[0]);
drh023ae032007-05-08 12:12:16 +0000345 if( n<1 ){
346 n = 1;
347 }
348 if( n>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000349 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000350 return;
351 }
danielk1977a1644fd2007-08-29 12:31:25 +0000352 p = contextMalloc(context, n);
drh02d85832007-05-07 19:31:15 +0000353 if( p ){
354 sqlite3Randomness(n, p);
drh17435752007-08-16 04:30:38 +0000355 sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
drh02d85832007-05-07 19:31:15 +0000356 }
drh63cf66f2007-01-29 15:50:05 +0000357}
358
359/*
drh6ed41ad2002-04-06 14:10:47 +0000360** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000361** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000362*/
danielk197751ad0ec2004-05-24 12:39:02 +0000363static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000364 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000365 int arg,
366 sqlite3_value **argv
367){
drh9bb575f2004-09-06 17:24:11 +0000368 sqlite3 *db = sqlite3_user_data(context);
drhf9b596e2004-05-26 16:54:42 +0000369 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000370}
371
rdcf146a772004-02-25 22:51:06 +0000372/*
danielk1977b28af712004-06-21 06:50:26 +0000373** Implementation of the changes() SQL function. The return value is the
374** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000375*/
danielk1977b28af712004-06-21 06:50:26 +0000376static void changes(
drhf9b596e2004-05-26 16:54:42 +0000377 sqlite3_context *context,
378 int arg,
379 sqlite3_value **argv
380){
drh9bb575f2004-09-06 17:24:11 +0000381 sqlite3 *db = sqlite3_user_data(context);
drhf4479502004-05-27 03:12:53 +0000382 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000383}
rdcf146a772004-02-25 22:51:06 +0000384
385/*
danielk1977b28af712004-06-21 06:50:26 +0000386** Implementation of the total_changes() SQL function. The return value is
387** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000388*/
danielk1977b28af712004-06-21 06:50:26 +0000389static void total_changes(
390 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000391 int arg,
392 sqlite3_value **argv
393){
drh9bb575f2004-09-06 17:24:11 +0000394 sqlite3 *db = sqlite3_user_data(context);
danielk1977b28af712004-06-21 06:50:26 +0000395 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000396}
397
drh6ed41ad2002-04-06 14:10:47 +0000398/*
drh4e5ffc52004-08-31 00:52:37 +0000399** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000400*/
drh4e5ffc52004-08-31 00:52:37 +0000401struct compareInfo {
402 u8 matchAll;
403 u8 matchOne;
404 u8 matchSet;
405 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000406};
drh55ef4d92005-08-14 01:20:37 +0000407
drhb9175ae2007-12-07 18:39:04 +0000408/*
409** For LIKE and GLOB matching on EBCDIC machines, assume that every
410** character is exactly one byte in size. Also, all characters are
411** able to participate in upper-case-to-lower-case mappings in EBCDIC
412** whereas only characters less than 0x80 do in ASCII.
413*/
414#if defined(SQLITE_EBCDIC)
415# define sqlite3Utf8Read(A,B,C) (*(A++))
drh6ed4b782007-12-10 18:07:20 +0000416# define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
drhb9175ae2007-12-07 18:39:04 +0000417#else
drh6ed4b782007-12-10 18:07:20 +0000418# define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
drhb9175ae2007-12-07 18:39:04 +0000419#endif
420
drh4e5ffc52004-08-31 00:52:37 +0000421static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000422/* The correct SQL-92 behavior is for the LIKE operator to ignore
423** case. Thus 'a' LIKE 'A' would be true. */
424static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
425/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
426** is case sensitive causing 'a' LIKE 'A' to be false */
427static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000428
429/*
drh4e5ffc52004-08-31 00:52:37 +0000430** Compare two UTF-8 strings for equality where the first string can
431** potentially be a "glob" expression. Return true (1) if they
432** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000433**
drh4e5ffc52004-08-31 00:52:37 +0000434** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000435**
drh4e5ffc52004-08-31 00:52:37 +0000436** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000437**
drh4e5ffc52004-08-31 00:52:37 +0000438** '?' Matches exactly one character.
439**
440** [...] Matches one character from the enclosed list of
441** characters.
442**
443** [^...] Matches one character not in the enclosed list.
444**
445** With the [...] and [^...] matching, a ']' character can be included
446** in the list by making it the first character after '[' or '^'. A
447** range of characters can be specified using '-'. Example:
448** "[a-z]" matches any single lower-case letter. To match a '-', make
449** it the last character in the list.
450**
451** This routine is usually quick, but can be N**2 in the worst case.
452**
453** Hints: to match '*' or '?', put them in "[]". Like this:
454**
455** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000456*/
danielk19777c6303c2004-11-17 16:41:29 +0000457static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000458 const u8 *zPattern, /* The glob pattern */
459 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000460 const struct compareInfo *pInfo, /* Information about how to do the compare */
461 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000462){
drh66150952007-07-23 19:12:41 +0000463 int c, c2;
drh4e5ffc52004-08-31 00:52:37 +0000464 int invert;
465 int seen;
drh4e5ffc52004-08-31 00:52:37 +0000466 u8 matchOne = pInfo->matchOne;
467 u8 matchAll = pInfo->matchAll;
468 u8 matchSet = pInfo->matchSet;
469 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000470 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000471
drh66150952007-07-23 19:12:41 +0000472 while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000473 if( !prevEscape && c==matchAll ){
drh66150952007-07-23 19:12:41 +0000474 while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll
475 || c == matchOne ){
476 if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){
477 return 0;
drh4e5ffc52004-08-31 00:52:37 +0000478 }
danielk1977ad7dd422004-06-06 12:41:49 +0000479 }
drh66150952007-07-23 19:12:41 +0000480 if( c==0 ){
481 return 1;
482 }else if( c==esc ){
483 c = sqlite3Utf8Read(zPattern, 0, &zPattern);
484 if( c==0 ){
485 return 0;
486 }
487 }else if( c==matchSet ){
488 assert( esc==0 ); /* This is GLOB, not LIKE */
489 assert( matchSet<0x80 ); /* '[' is a single-byte character */
490 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
drh4a919112007-05-15 11:55:09 +0000491 SQLITE_SKIP_UTF8(zString);
drh4e5ffc52004-08-31 00:52:37 +0000492 }
493 return *zString!=0;
drh66150952007-07-23 19:12:41 +0000494 }
495 while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){
496 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000497 GlogUpperToLower(c2);
498 GlogUpperToLower(c);
drh66150952007-07-23 19:12:41 +0000499 while( c2 != 0 && c2 != c ){
500 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh6ed4b782007-12-10 18:07:20 +0000501 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000502 }
drh66150952007-07-23 19:12:41 +0000503 }else{
504 while( c2 != 0 && c2 != c ){
505 c2 = sqlite3Utf8Read(zString, 0, &zString);
506 }
drh4e5ffc52004-08-31 00:52:37 +0000507 }
drh66150952007-07-23 19:12:41 +0000508 if( c2==0 ) return 0;
509 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
510 }
511 return 0;
512 }else if( !prevEscape && c==matchOne ){
513 if( sqlite3Utf8Read(zString, 0, &zString)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000514 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000515 }
drh4e5ffc52004-08-31 00:52:37 +0000516 }else if( c==matchSet ){
517 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000518 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000519 seen = 0;
520 invert = 0;
drh66150952007-07-23 19:12:41 +0000521 c = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000522 if( c==0 ) return 0;
drh66150952007-07-23 19:12:41 +0000523 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
524 if( c2=='^' ){
525 invert = 1;
526 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
527 }
drh4e5ffc52004-08-31 00:52:37 +0000528 if( c2==']' ){
529 if( c==']' ) seen = 1;
drh66150952007-07-23 19:12:41 +0000530 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000531 }
drh66150952007-07-23 19:12:41 +0000532 while( c2 && c2!=']' ){
533 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
534 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000535 if( c>=prior_c && c<=c2 ) seen = 1;
536 prior_c = 0;
drh4e5ffc52004-08-31 00:52:37 +0000537 }else{
drh66150952007-07-23 19:12:41 +0000538 if( c==c2 ){
539 seen = 1;
540 }
drh4e5ffc52004-08-31 00:52:37 +0000541 prior_c = c2;
542 }
drh66150952007-07-23 19:12:41 +0000543 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000544 }
drh66150952007-07-23 19:12:41 +0000545 if( c2==0 || (seen ^ invert)==0 ){
546 return 0;
547 }
548 }else if( esc==c && !prevEscape ){
danielk19777c6303c2004-11-17 16:41:29 +0000549 prevEscape = 1;
drh4e5ffc52004-08-31 00:52:37 +0000550 }else{
drh66150952007-07-23 19:12:41 +0000551 c2 = sqlite3Utf8Read(zString, 0, &zString);
drh4e5ffc52004-08-31 00:52:37 +0000552 if( noCase ){
drh6ed4b782007-12-10 18:07:20 +0000553 GlogUpperToLower(c);
554 GlogUpperToLower(c2);
drh4e5ffc52004-08-31 00:52:37 +0000555 }
drh66150952007-07-23 19:12:41 +0000556 if( c!=c2 ){
557 return 0;
558 }
danielk19777c6303c2004-11-17 16:41:29 +0000559 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000560 }
danielk197751ad0ec2004-05-24 12:39:02 +0000561 }
drh4e5ffc52004-08-31 00:52:37 +0000562 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000563}
drh4e5ffc52004-08-31 00:52:37 +0000564
drh55ef4d92005-08-14 01:20:37 +0000565/*
566** Count the number of times that the LIKE operator (or GLOB which is
567** just a variation of LIKE) gets called. This is used for testing
568** only.
569*/
570#ifdef SQLITE_TEST
571int sqlite3_like_count = 0;
572#endif
573
danielk19773f6b0872004-06-17 05:36:44 +0000574
575/*
576** Implementation of the like() SQL function. This function implements
577** the build-in LIKE operator. The first argument to the function is the
578** pattern and the second argument is the string. So, the SQL statements:
579**
580** A LIKE B
581**
582** is implemented as like(B,A).
583**
drh55ef4d92005-08-14 01:20:37 +0000584** This same function (with a different compareInfo structure) computes
585** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000586*/
587static void likeFunc(
588 sqlite3_context *context,
589 int argc,
590 sqlite3_value **argv
591){
drhbeb818d2007-05-08 15:34:47 +0000592 const unsigned char *zA, *zB;
drh85892bd2007-05-10 13:23:22 +0000593 int escape = 0;
drhbeb818d2007-05-08 15:34:47 +0000594
drh1f0feef2007-05-15 13:27:07 +0000595 zB = sqlite3_value_text(argv[0]);
596 zA = sqlite3_value_text(argv[1]);
597
drhbeb818d2007-05-08 15:34:47 +0000598 /* Limit the length of the LIKE or GLOB pattern to avoid problems
599 ** of deep recursion and N*N behavior in patternCompare().
600 */
danielk1977b56fe1f2007-05-09 08:24:44 +0000601 if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){
drhbeb818d2007-05-08 15:34:47 +0000602 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
603 return;
604 }
drh1f0feef2007-05-15 13:27:07 +0000605 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
drhbeb818d2007-05-08 15:34:47 +0000606
danielk19777c6303c2004-11-17 16:41:29 +0000607 if( argc==3 ){
608 /* The escape character string must consist of a single UTF-8 character.
609 ** Otherwise, return an error.
610 */
611 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000612 if( zEsc==0 ) return;
drhee858132007-05-08 20:37:38 +0000613 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000614 sqlite3_result_error(context,
615 "ESCAPE expression must be a single character", -1);
616 return;
617 }
drh66150952007-07-23 19:12:41 +0000618 escape = sqlite3Utf8Read(zEsc, 0, &zEsc);
danielk19777c6303c2004-11-17 16:41:29 +0000619 }
danielk19773f6b0872004-06-17 05:36:44 +0000620 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000621 struct compareInfo *pInfo = sqlite3_user_data(context);
622#ifdef SQLITE_TEST
623 sqlite3_like_count++;
624#endif
drhbeb818d2007-05-08 15:34:47 +0000625
danielk1977b56fe1f2007-05-09 08:24:44 +0000626 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000627 }
drh8912d102002-05-26 21:34:58 +0000628}
629
630/*
631** Implementation of the NULLIF(x,y) function. The result is the first
632** argument if the arguments are different. The result is NULL if the
633** arguments are equal to each other.
634*/
drhf9b596e2004-05-26 16:54:42 +0000635static void nullifFunc(
636 sqlite3_context *context,
637 int argc,
638 sqlite3_value **argv
639){
danielk1977dc1bdc42004-06-11 10:51:27 +0000640 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
641 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000642 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000643 }
drh0ac65892002-04-20 14:24:41 +0000644}
645
drh647cb0e2002-11-04 19:32:25 +0000646/*
647** Implementation of the VERSION(*) function. The result is the version
648** of the SQLite library that is running.
649*/
drhf9b596e2004-05-26 16:54:42 +0000650static void versionFunc(
651 sqlite3_context *context,
652 int argc,
653 sqlite3_value **argv
654){
danielk1977d8123362004-06-12 09:25:12 +0000655 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000656}
657
drh137c7282007-01-29 17:58:28 +0000658/* Array for converting from half-bytes (nybbles) into ASCII hex
659** digits. */
660static const char hexdigits[] = {
661 '0', '1', '2', '3', '4', '5', '6', '7',
662 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
663};
danielk1977d641d642004-11-18 15:44:29 +0000664
drh47394702003-08-20 01:03:33 +0000665/*
666** EXPERIMENTAL - This is not an official function. The interface may
667** change. This function may disappear. Do not write code that depends
668** on this function.
669**
670** Implementation of the QUOTE() function. This function takes a single
671** argument. If the argument is numeric, the return value is the same as
672** the argument. If the argument is NULL, the return value is the string
673** "NULL". Otherwise, the argument is enclosed in single quotes with
674** single-quote escapes.
675*/
danielk19770ae8b832004-05-25 12:05:56 +0000676static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000677 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000678 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000679 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000680 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000681 break;
drh47394702003-08-20 01:03:33 +0000682 }
drh9c054832004-05-31 18:51:57 +0000683 case SQLITE_INTEGER:
684 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000685 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000686 break;
687 }
danielk19773f41e972004-06-08 00:39:01 +0000688 case SQLITE_BLOB: {
danielk19773f41e972004-06-08 00:39:01 +0000689 char *zText = 0;
danielk19773f41e972004-06-08 00:39:01 +0000690 char const *zBlob = sqlite3_value_blob(argv[0]);
drh1f0feef2007-05-15 13:27:07 +0000691 int nBlob = sqlite3_value_bytes(argv[0]);
692 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
danielk19773f41e972004-06-08 00:39:01 +0000693
drh023ae032007-05-08 12:12:16 +0000694 if( 2*nBlob+4>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000695 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000696 return;
697 }
danielk1977a1644fd2007-08-29 12:31:25 +0000698 zText = (char *)contextMalloc(context, (2*nBlob)+4);
699 if( zText ){
danielk19773f41e972004-06-08 00:39:01 +0000700 int i;
701 for(i=0; i<nBlob; i++){
702 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
703 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
704 }
705 zText[(nBlob*2)+2] = '\'';
706 zText[(nBlob*2)+3] = '\0';
707 zText[0] = 'X';
708 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000709 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
drh17435752007-08-16 04:30:38 +0000710 sqlite3_free(zText);
danielk19773f41e972004-06-08 00:39:01 +0000711 }
712 break;
713 }
drh9c054832004-05-31 18:51:57 +0000714 case SQLITE_TEXT: {
drh023ae032007-05-08 12:12:16 +0000715 int i,j;
716 u64 n;
drh2646da72005-12-09 20:02:05 +0000717 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000718 char *z;
719
drh7a521cf2007-04-25 18:23:52 +0000720 if( zArg==0 ) return;
drh023ae032007-05-08 12:12:16 +0000721 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
722 if( i+n+3>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000723 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000724 return;
725 }
danielk1977a1644fd2007-08-29 12:31:25 +0000726 z = contextMalloc(context, i+n+3);
727 if( z ){
728 z[0] = '\'';
729 for(i=0, j=1; zArg[i]; i++){
730 z[j++] = zArg[i];
731 if( zArg[i]=='\'' ){
732 z[j++] = '\'';
733 }
drhf9b596e2004-05-26 16:54:42 +0000734 }
danielk1977a1644fd2007-08-29 12:31:25 +0000735 z[j++] = '\'';
736 z[j] = 0;
737 sqlite3_result_text(context, z, j, sqlite3_free);
drhf9b596e2004-05-26 16:54:42 +0000738 }
drhf9b596e2004-05-26 16:54:42 +0000739 }
drh47394702003-08-20 01:03:33 +0000740 }
741}
742
drh137c7282007-01-29 17:58:28 +0000743/*
744** The hex() function. Interpret the argument as a blob. Return
745** a hexadecimal rendering as text.
746*/
747static void hexFunc(
748 sqlite3_context *context,
749 int argc,
750 sqlite3_value **argv
751){
752 int i, n;
753 const unsigned char *pBlob;
754 char *zHex, *z;
755 assert( argc==1 );
drh1f0feef2007-05-15 13:27:07 +0000756 pBlob = sqlite3_value_blob(argv[0]);
drh137c7282007-01-29 17:58:28 +0000757 n = sqlite3_value_bytes(argv[0]);
drh023ae032007-05-08 12:12:16 +0000758 if( n*2+1>SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000759 sqlite3_result_error_toobig(context);
drh023ae032007-05-08 12:12:16 +0000760 return;
761 }
drh1f0feef2007-05-15 13:27:07 +0000762 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
danielk1977a1644fd2007-08-29 12:31:25 +0000763 z = zHex = contextMalloc(context, n*2 + 1);
764 if( zHex ){
765 for(i=0; i<n; i++, pBlob++){
766 unsigned char c = *pBlob;
767 *(z++) = hexdigits[(c>>4)&0xf];
768 *(z++) = hexdigits[c&0xf];
769 }
770 *z = 0;
771 sqlite3_result_text(context, zHex, n*2, sqlite3_free);
drh137c7282007-01-29 17:58:28 +0000772 }
drh137c7282007-01-29 17:58:28 +0000773}
774
drh26b6d902007-03-17 13:27:54 +0000775/*
drh8cff3822007-05-02 02:08:28 +0000776** The zeroblob(N) function returns a zero-filled blob of size N bytes.
777*/
778static void zeroblobFunc(
779 sqlite3_context *context,
780 int argc,
781 sqlite3_value **argv
782){
drh98640a32007-06-07 19:08:32 +0000783 i64 n;
drh8cff3822007-05-02 02:08:28 +0000784 assert( argc==1 );
drh98640a32007-06-07 19:08:32 +0000785 n = sqlite3_value_int64(argv[0]);
786 if( n>SQLITE_MAX_LENGTH ){
787 sqlite3_result_error_toobig(context);
788 }else{
789 sqlite3_result_zeroblob(context, n);
790 }
drh8cff3822007-05-02 02:08:28 +0000791}
792
793/*
drh26b6d902007-03-17 13:27:54 +0000794** The replace() function. Three arguments are all strings: call
795** them A, B, and C. The result is also a string which is derived
796** from A by replacing every occurance of B with C. The match
797** must be exact. Collating sequences are not used.
798*/
799static void replaceFunc(
800 sqlite3_context *context,
801 int argc,
802 sqlite3_value **argv
803){
804 const unsigned char *zStr; /* The input string A */
805 const unsigned char *zPattern; /* The pattern string B */
806 const unsigned char *zRep; /* The replacement string C */
807 unsigned char *zOut; /* The output */
808 int nStr; /* Size of zStr */
809 int nPattern; /* Size of zPattern */
810 int nRep; /* Size of zRep */
drh2e6400b2007-05-08 15:46:18 +0000811 i64 nOut; /* Maximum size of zOut */
drh26b6d902007-03-17 13:27:54 +0000812 int loopLimit; /* Last zStr[] that might match zPattern[] */
813 int i, j; /* Loop counters */
814
815 assert( argc==3 );
drh26b6d902007-03-17 13:27:54 +0000816 zStr = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000817 if( zStr==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000818 nStr = sqlite3_value_bytes(argv[0]);
819 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000820 zPattern = sqlite3_value_text(argv[1]);
drh709cff32007-04-27 01:18:02 +0000821 if( zPattern==0 || zPattern[0]==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000822 nPattern = sqlite3_value_bytes(argv[1]);
823 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
drh26b6d902007-03-17 13:27:54 +0000824 zRep = sqlite3_value_text(argv[2]);
drh7a521cf2007-04-25 18:23:52 +0000825 if( zRep==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000826 nRep = sqlite3_value_bytes(argv[2]);
827 assert( zRep==sqlite3_value_text(argv[2]) );
drh2e6400b2007-05-08 15:46:18 +0000828 nOut = nStr + 1;
829 assert( nOut<SQLITE_MAX_LENGTH );
danielk1977a1644fd2007-08-29 12:31:25 +0000830 zOut = contextMalloc(context, (int)nOut);
drh2e6400b2007-05-08 15:46:18 +0000831 if( zOut==0 ){
832 return;
drh26b6d902007-03-17 13:27:54 +0000833 }
drh26b6d902007-03-17 13:27:54 +0000834 loopLimit = nStr - nPattern;
835 for(i=j=0; i<=loopLimit; i++){
836 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
837 zOut[j++] = zStr[i];
838 }else{
drh4a50aac2007-08-23 02:47:53 +0000839 u8 *zOld;
drh2e6400b2007-05-08 15:46:18 +0000840 nOut += nRep - nPattern;
841 if( nOut>=SQLITE_MAX_LENGTH ){
drha0206bc2007-05-08 15:15:02 +0000842 sqlite3_result_error_toobig(context);
danielk197717374e82007-05-08 14:39:04 +0000843 sqlite3_free(zOut);
844 return;
845 }
drh4a50aac2007-08-23 02:47:53 +0000846 zOld = zOut;
drh2e6400b2007-05-08 15:46:18 +0000847 zOut = sqlite3_realloc(zOut, (int)nOut);
848 if( zOut==0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000849 sqlite3_result_error_nomem(context);
drh4a50aac2007-08-23 02:47:53 +0000850 sqlite3_free(zOld);
drh2e6400b2007-05-08 15:46:18 +0000851 return;
852 }
drh26b6d902007-03-17 13:27:54 +0000853 memcpy(&zOut[j], zRep, nRep);
854 j += nRep;
855 i += nPattern-1;
856 }
857 }
drh2e6400b2007-05-08 15:46:18 +0000858 assert( j+nStr-i+1==nOut );
drh26b6d902007-03-17 13:27:54 +0000859 memcpy(&zOut[j], &zStr[i], nStr-i);
860 j += nStr - i;
861 assert( j<=nOut );
862 zOut[j] = 0;
863 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
864}
865
drh309b3382007-03-17 17:52:42 +0000866/*
867** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
868** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
869*/
870static void trimFunc(
871 sqlite3_context *context,
872 int argc,
873 sqlite3_value **argv
874){
875 const unsigned char *zIn; /* Input string */
876 const unsigned char *zCharSet; /* Set of characters to trim */
877 int nIn; /* Number of bytes in input */
drhd1e3a612007-04-27 21:59:52 +0000878 int flags; /* 1: trimleft 2: trimright 3: trim */
879 int i; /* Loop counter */
880 unsigned char *aLen; /* Length of each character in zCharSet */
danielk1977bc67da42007-12-11 04:23:19 +0000881 unsigned char **azChar; /* Individual characters in zCharSet */
drhd1e3a612007-04-27 21:59:52 +0000882 int nChar; /* Number of characters in zCharSet */
883
drh309b3382007-03-17 17:52:42 +0000884 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
885 return;
886 }
887 zIn = sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +0000888 if( zIn==0 ) return;
drh1f0feef2007-05-15 13:27:07 +0000889 nIn = sqlite3_value_bytes(argv[0]);
890 assert( zIn==sqlite3_value_text(argv[0]) );
drh309b3382007-03-17 17:52:42 +0000891 if( argc==1 ){
drhd1e3a612007-04-27 21:59:52 +0000892 static const unsigned char lenOne[] = { 1 };
drh8cff3822007-05-02 02:08:28 +0000893 static const unsigned char *azOne[] = { (u8*)" " };
drhd1e3a612007-04-27 21:59:52 +0000894 nChar = 1;
drh8cff3822007-05-02 02:08:28 +0000895 aLen = (u8*)lenOne;
danielk1977bc67da42007-12-11 04:23:19 +0000896 azChar = (unsigned char **)azOne;
drhd1e3a612007-04-27 21:59:52 +0000897 zCharSet = 0;
drh7a521cf2007-04-25 18:23:52 +0000898 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
drh309b3382007-03-17 17:52:42 +0000899 return;
drhd1e3a612007-04-27 21:59:52 +0000900 }else{
901 const unsigned char *z;
902 for(z=zCharSet, nChar=0; *z; nChar++){
drh4a919112007-05-15 11:55:09 +0000903 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000904 }
905 if( nChar>0 ){
danielk1977a1644fd2007-08-29 12:31:25 +0000906 azChar = contextMalloc(context, nChar*(sizeof(char*)+1));
drhd1e3a612007-04-27 21:59:52 +0000907 if( azChar==0 ){
908 return;
909 }
910 aLen = (unsigned char*)&azChar[nChar];
911 for(z=zCharSet, nChar=0; *z; nChar++){
danielk1977bc67da42007-12-11 04:23:19 +0000912 azChar[nChar] = (unsigned char *)z;
drh4a919112007-05-15 11:55:09 +0000913 SQLITE_SKIP_UTF8(z);
drhd1e3a612007-04-27 21:59:52 +0000914 aLen[nChar] = z - azChar[nChar];
915 }
916 }
drh309b3382007-03-17 17:52:42 +0000917 }
drhd1e3a612007-04-27 21:59:52 +0000918 if( nChar>0 ){
drh309b3382007-03-17 17:52:42 +0000919 flags = (int)sqlite3_user_data(context);
920 if( flags & 1 ){
drhd1e3a612007-04-27 21:59:52 +0000921 while( nIn>0 ){
922 int len;
923 for(i=0; i<nChar; i++){
924 len = aLen[i];
925 if( memcmp(zIn, azChar[i], len)==0 ) break;
926 }
927 if( i>=nChar ) break;
928 zIn += len;
929 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000930 }
931 }
932 if( flags & 2 ){
drhd1e3a612007-04-27 21:59:52 +0000933 while( nIn>0 ){
934 int len;
935 for(i=0; i<nChar; i++){
936 len = aLen[i];
937 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
938 }
939 if( i>=nChar ) break;
940 nIn -= len;
drh309b3382007-03-17 17:52:42 +0000941 }
942 }
drhd1e3a612007-04-27 21:59:52 +0000943 if( zCharSet ){
944 sqlite3_free(azChar);
945 }
drh309b3382007-03-17 17:52:42 +0000946 }
947 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
948}
drh26b6d902007-03-17 13:27:54 +0000949
drhd24cc422003-03-27 12:51:24 +0000950#ifdef SQLITE_SOUNDEX
951/*
952** Compute the soundex encoding of a word.
953*/
drh137c7282007-01-29 17:58:28 +0000954static void soundexFunc(
955 sqlite3_context *context,
956 int argc,
957 sqlite3_value **argv
958){
drhd24cc422003-03-27 12:51:24 +0000959 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000960 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000961 int i, j;
962 static const unsigned char iCode[] = {
963 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
964 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
965 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
966 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
967 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
968 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
969 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
970 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
971 };
972 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000973 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000974 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000975 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
976 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000977 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000978 zResult[0] = toupper(zIn[i]);
979 for(j=1; j<4 && zIn[i]; i++){
980 int code = iCode[zIn[i]&0x7f];
981 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000982 if( code!=prevcode ){
983 prevcode = code;
984 zResult[j++] = code + '0';
985 }
986 }else{
987 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000988 }
989 }
990 while( j<4 ){
991 zResult[j++] = '0';
992 }
993 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000994 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000995 }else{
danielk1977d8123362004-06-12 09:25:12 +0000996 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000997 }
998}
999#endif
1000
drhfdb83b22006-06-17 14:12:47 +00001001#ifndef SQLITE_OMIT_LOAD_EXTENSION
1002/*
1003** A function that loads a shared-library extension then returns NULL.
1004*/
1005static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +00001006 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drh7a521cf2007-04-25 18:23:52 +00001007 const char *zProc;
drhfdb83b22006-06-17 14:12:47 +00001008 sqlite3 *db = sqlite3_user_data(context);
1009 char *zErrMsg = 0;
1010
1011 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +00001012 zProc = (const char *)sqlite3_value_text(argv[1]);
drh7a521cf2007-04-25 18:23:52 +00001013 }else{
1014 zProc = 0;
drhfdb83b22006-06-17 14:12:47 +00001015 }
drh7a521cf2007-04-25 18:23:52 +00001016 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
drhfdb83b22006-06-17 14:12:47 +00001017 sqlite3_result_error(context, zErrMsg, -1);
1018 sqlite3_free(zErrMsg);
1019 }
1020}
1021#endif
1022
drh193a6b42002-07-07 16:52:46 +00001023#ifdef SQLITE_TEST
1024/*
1025** This function generates a string of random characters. Used for
1026** generating test data.
1027*/
danielk19770ae8b832004-05-25 12:05:56 +00001028static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +00001029 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +00001030 "abcdefghijklmnopqrstuvwxyz"
1031 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
1032 "0123456789"
1033 ".-!,:*^+=_|?/<> ";
1034 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +00001035 unsigned char zBuf[1000];
danielk1977d7d2f932007-09-01 17:00:12 +00001036
1037 /* It used to be possible to call randstr() with any number of arguments,
1038 ** but now it is registered with SQLite as requiring exactly 2.
1039 */
1040 assert(argc==2);
1041
1042 iMin = sqlite3_value_int(argv[0]);
1043 if( iMin<0 ) iMin = 0;
1044 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
1045 iMax = sqlite3_value_int(argv[1]);
1046 if( iMax<iMin ) iMax = iMin;
1047 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +00001048 n = iMin;
1049 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +00001050 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +00001051 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +00001052 n += r%(iMax + 1 - iMin);
1053 }
drh1dba7272004-01-16 13:58:18 +00001054 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +00001055 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +00001056 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +00001057 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +00001058 }
1059 zBuf[n] = 0;
drh2646da72005-12-09 20:02:05 +00001060 sqlite3_result_text(context, (char*)zBuf, n, SQLITE_TRANSIENT);
danielk1977d8123362004-06-12 09:25:12 +00001061}
drh0e3d7472004-06-19 17:33:07 +00001062#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +00001063
drh0e3d7472004-06-19 17:33:07 +00001064#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +00001065/*
1066** The following two SQL functions are used to test returning a text
1067** result with a destructor. Function 'test_destructor' takes one argument
1068** and returns the same argument interpreted as TEXT. A destructor is
1069** passed with the sqlite3_result_text() call.
1070**
1071** SQL function 'test_destructor_count' returns the number of outstanding
1072** allocations made by 'test_destructor';
1073**
1074** WARNING: Not threadsafe.
1075*/
1076static int test_destructor_count_var = 0;
1077static void destructor(void *p){
1078 char *zVal = (char *)p;
1079 assert(zVal);
1080 zVal--;
drh17435752007-08-16 04:30:38 +00001081 sqlite3_free(zVal);
danielk1977d8123362004-06-12 09:25:12 +00001082 test_destructor_count_var--;
1083}
1084static void test_destructor(
1085 sqlite3_context *pCtx,
1086 int nArg,
1087 sqlite3_value **argv
1088){
1089 char *zVal;
danielk1977f4618892004-06-28 13:09:11 +00001090 int len;
drh9bb575f2004-09-06 17:24:11 +00001091 sqlite3 *db = sqlite3_user_data(pCtx);
danielk1977f4618892004-06-28 13:09:11 +00001092
danielk1977d8123362004-06-12 09:25:12 +00001093 test_destructor_count_var++;
1094 assert( nArg==1 );
1095 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhb21c8cd2007-08-21 19:33:56 +00001096 len = sqlite3ValueBytes(argv[0], ENC(db));
danielk197726783a52007-08-29 14:06:22 +00001097 zVal = contextMalloc(pCtx, len+3);
1098 if( !zVal ){
1099 return;
1100 }
1101 zVal[len+1] = 0;
danielk197786011242007-08-30 16:30:27 +00001102 zVal[len+2] = 0;
danielk1977d8123362004-06-12 09:25:12 +00001103 zVal++;
drhb21c8cd2007-08-21 19:33:56 +00001104 memcpy(zVal, sqlite3ValueText(argv[0], ENC(db)), len);
danielk197714db2662006-01-09 16:12:04 +00001105 if( ENC(db)==SQLITE_UTF8 ){
danielk1977f4618892004-06-28 13:09:11 +00001106 sqlite3_result_text(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001107#ifndef SQLITE_OMIT_UTF16
danielk197714db2662006-01-09 16:12:04 +00001108 }else if( ENC(db)==SQLITE_UTF16LE ){
danielk1977f4618892004-06-28 13:09:11 +00001109 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
1110 }else{
1111 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +00001112#endif /* SQLITE_OMIT_UTF16 */
danielk1977f4618892004-06-28 13:09:11 +00001113 }
danielk1977d8123362004-06-12 09:25:12 +00001114}
1115static void test_destructor_count(
1116 sqlite3_context *pCtx,
1117 int nArg,
1118 sqlite3_value **argv
1119){
1120 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +00001121}
drh0e3d7472004-06-19 17:33:07 +00001122#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +00001123
drh0e3d7472004-06-19 17:33:07 +00001124#ifdef SQLITE_TEST
1125/*
1126** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
1127** interface.
1128**
1129** The test_auxdata() SQL function attempts to register each of its arguments
1130** as auxiliary data. If there are no prior registrations of aux data for
1131** that argument (meaning the argument is not a constant or this is its first
1132** call) then the result for that argument is 0. If there is a prior
1133** registration, the result for that argument is 1. The overall result
1134** is the individual argument results separated by spaces.
1135*/
drh17435752007-08-16 04:30:38 +00001136static void free_test_auxdata(void *p) {sqlite3_free(p);}
danielk19773f6b0872004-06-17 05:36:44 +00001137static void test_auxdata(
1138 sqlite3_context *pCtx,
1139 int nArg,
1140 sqlite3_value **argv
1141){
1142 int i;
danielk1977a1644fd2007-08-29 12:31:25 +00001143 char *zRet = contextMalloc(pCtx, nArg*2);
danielk19773f6b0872004-06-17 05:36:44 +00001144 if( !zRet ) return;
danielk1977a1644fd2007-08-29 12:31:25 +00001145 memset(zRet, 0, nArg*2);
danielk19773f6b0872004-06-17 05:36:44 +00001146 for(i=0; i<nArg; i++){
drh2646da72005-12-09 20:02:05 +00001147 char const *z = (char*)sqlite3_value_text(argv[i]);
danielk19773f6b0872004-06-17 05:36:44 +00001148 if( z ){
1149 char *zAux = sqlite3_get_auxdata(pCtx, i);
1150 if( zAux ){
1151 zRet[i*2] = '1';
drh60a713c2008-01-21 16:22:45 +00001152 assert( strcmp(zAux,z)==0 );
danielk1977fa18bec2007-09-03 11:04:22 +00001153 }else {
danielk19773f6b0872004-06-17 05:36:44 +00001154 zRet[i*2] = '0';
danielk1977fa18bec2007-09-03 11:04:22 +00001155 }
1156
1157 zAux = contextMalloc(pCtx, strlen(z)+1);
1158 if( zAux ){
1159 strcpy(zAux, z);
1160 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
danielk19773f6b0872004-06-17 05:36:44 +00001161 }
1162 zRet[i*2+1] = ' ';
1163 }
1164 }
1165 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
1166}
drh0e3d7472004-06-19 17:33:07 +00001167#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +00001168
danielk197701427a62005-01-11 13:02:33 +00001169#ifdef SQLITE_TEST
1170/*
1171** A function to test error reporting from user functions. This function
drh85b623f2007-12-13 21:54:09 +00001172** returns a copy of its first argument as an error.
danielk197701427a62005-01-11 13:02:33 +00001173*/
1174static void test_error(
1175 sqlite3_context *pCtx,
1176 int nArg,
1177 sqlite3_value **argv
1178){
drh2646da72005-12-09 20:02:05 +00001179 sqlite3_result_error(pCtx, (char*)sqlite3_value_text(argv[0]), 0);
danielk197701427a62005-01-11 13:02:33 +00001180}
1181#endif /* SQLITE_TEST */
1182
drh0ac65892002-04-20 14:24:41 +00001183/*
drhd3a149e2002-02-24 17:12:53 +00001184** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +00001185** sum() or avg() aggregate computation.
1186*/
1187typedef struct SumCtx SumCtx;
1188struct SumCtx {
drh8c08e862006-02-11 17:34:00 +00001189 double rSum; /* Floating point sum */
1190 i64 iSum; /* Integer sum */
1191 i64 cnt; /* Number of elements summed */
1192 u8 overflow; /* True if integer overflow seen */
1193 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +00001194};
1195
1196/*
drha97fdd32006-01-12 22:17:50 +00001197** Routines used to compute the sum, average, and total.
1198**
1199** The SUM() function follows the (broken) SQL standard which means
1200** that it returns NULL if it sums over no inputs. TOTAL returns
1201** 0.0 in that case. In addition, TOTAL always returns a float where
1202** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +00001203** value. TOTAL never fails, but SUM might through an exception if
1204** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +00001205*/
danielk19770ae8b832004-05-25 12:05:56 +00001206static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +00001207 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +00001208 int type;
drh3f219f42005-09-08 19:45:57 +00001209 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +00001210 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +00001211 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +00001212 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +00001213 p->cnt++;
drh29d72102006-02-09 22:13:41 +00001214 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +00001215 i64 v = sqlite3_value_int64(argv[0]);
1216 p->rSum += v;
1217 if( (p->approx|p->overflow)==0 ){
1218 i64 iNewSum = p->iSum + v;
1219 int s1 = p->iSum >> (sizeof(i64)*8-1);
1220 int s2 = v >> (sizeof(i64)*8-1);
1221 int s3 = iNewSum >> (sizeof(i64)*8-1);
1222 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
1223 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +00001224 }
1225 }else{
drh8c08e862006-02-11 17:34:00 +00001226 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +00001227 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +00001228 }
drh739105c2002-05-29 23:22:23 +00001229 }
drhdd5baa92002-02-27 19:50:59 +00001230}
danielk19770ae8b832004-05-25 12:05:56 +00001231static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001232 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001233 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +00001234 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001235 if( p->overflow ){
1236 sqlite3_result_error(context,"integer overflow",-1);
1237 }else if( p->approx ){
1238 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +00001239 }else{
drh8c08e862006-02-11 17:34:00 +00001240 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +00001241 }
drh3d1d95e2005-09-08 10:37:01 +00001242 }
drhdd5baa92002-02-27 19:50:59 +00001243}
danielk19770ae8b832004-05-25 12:05:56 +00001244static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +00001245 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +00001246 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +00001247 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +00001248 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +00001249 }
1250}
drha97fdd32006-01-12 22:17:50 +00001251static void totalFinalize(sqlite3_context *context){
1252 SumCtx *p;
1253 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +00001254 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +00001255}
drhdd5baa92002-02-27 19:50:59 +00001256
1257/*
drh0bce8352002-02-28 00:41:10 +00001258** The following structure keeps track of state information for the
1259** count() aggregate function.
1260*/
1261typedef struct CountCtx CountCtx;
1262struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +00001263 i64 n;
drh0bce8352002-02-28 00:41:10 +00001264};
drhdd5baa92002-02-27 19:50:59 +00001265
drh0bce8352002-02-28 00:41:10 +00001266/*
1267** Routines to implement the count() aggregate function.
1268*/
danielk19770ae8b832004-05-25 12:05:56 +00001269static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +00001270 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +00001271 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +00001272 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +00001273 p->n++;
1274 }
1275}
danielk19770ae8b832004-05-25 12:05:56 +00001276static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +00001277 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +00001278 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +00001279 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +00001280}
1281
1282/*
drh0bce8352002-02-28 00:41:10 +00001283** Routines to implement min() and max() aggregate functions.
1284*/
danielk19770ae8b832004-05-25 12:05:56 +00001285static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +00001286 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +00001287 Mem *pBest;
1288
1289 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
1290 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +00001291 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +00001292
danielk197788208052004-05-25 01:13:20 +00001293 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +00001294 int max;
1295 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +00001296 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +00001297 /* This step function is used for both the min() and max() aggregates,
1298 ** the only difference between the two being that the sense of the
1299 ** comparison is inverted. For the max() aggregate, the
1300 ** sqlite3_user_data() function returns (void *)-1. For min() it
1301 ** returns (void *)db, where db is the sqlite3* database pointer.
1302 ** Therefore the next statement sets variable 'max' to 1 for the max()
1303 ** aggregate, or 0 for min().
1304 */
drh309b3382007-03-17 17:52:42 +00001305 max = sqlite3_user_data(context)!=0;
danielk1977dc1bdc42004-06-11 10:51:27 +00001306 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001307 if( (max && cmp<0) || (!max && cmp>0) ){
drhb21c8cd2007-08-21 19:33:56 +00001308 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001309 }
drh268380c2004-02-25 13:47:31 +00001310 }else{
drhb21c8cd2007-08-21 19:33:56 +00001311 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001312 }
1313}
danielk19770ae8b832004-05-25 12:05:56 +00001314static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001315 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001316 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1317 if( pRes ){
1318 if( pRes->flags ){
1319 sqlite3_result_value(context, pRes);
1320 }
1321 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001322 }
1323}
drhdd5baa92002-02-27 19:50:59 +00001324
drhb0689692007-11-01 17:38:30 +00001325/*
1326** group_concat(EXPR, ?SEPARATOR?)
1327*/
1328static void groupConcatStep(
1329 sqlite3_context *context,
1330 int argc,
1331 sqlite3_value **argv
1332){
1333 const char *zVal;
drhade86482007-11-28 22:36:40 +00001334 StrAccum *pAccum;
drhb0689692007-11-01 17:38:30 +00001335 const char *zSep;
drhade86482007-11-28 22:36:40 +00001336 int nVal, nSep;
drhb0689692007-11-01 17:38:30 +00001337 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhade86482007-11-28 22:36:40 +00001338 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
1339
1340 if( pAccum ){
1341 pAccum->useMalloc = 1;
1342 if( pAccum->nChar ){
drhb0689692007-11-01 17:38:30 +00001343 if( argc==2 ){
drhade86482007-11-28 22:36:40 +00001344 zSep = (char*)sqlite3_value_text(argv[1]);
1345 nSep = sqlite3_value_bytes(argv[1]);
drhb0689692007-11-01 17:38:30 +00001346 }else{
1347 zSep = ",";
drhade86482007-11-28 22:36:40 +00001348 nSep = 1;
drhb0689692007-11-01 17:38:30 +00001349 }
drhade86482007-11-28 22:36:40 +00001350 sqlite3StrAccumAppend(pAccum, zSep, nSep);
drhb0689692007-11-01 17:38:30 +00001351 }
drhade86482007-11-28 22:36:40 +00001352 zVal = (char*)sqlite3_value_text(argv[0]);
1353 nVal = sqlite3_value_bytes(argv[0]);
1354 sqlite3StrAccumAppend(pAccum, zVal, nVal);
drhb0689692007-11-01 17:38:30 +00001355 }
1356}
1357static void groupConcatFinalize(sqlite3_context *context){
drhade86482007-11-28 22:36:40 +00001358 StrAccum *pAccum;
1359 pAccum = sqlite3_aggregate_context(context, 0);
1360 if( pAccum ){
1361 if( pAccum->tooBig ){
1362 sqlite3_result_error_toobig(context);
1363 }else if( pAccum->mallocFailed ){
1364 sqlite3_result_error_nomem(context);
1365 }else{
1366 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
1367 sqlite3_free);
1368 }
drhb0689692007-11-01 17:38:30 +00001369 }
1370}
drh4e5ffc52004-08-31 00:52:37 +00001371
drhd3a149e2002-02-24 17:12:53 +00001372/*
drha2ed5602002-02-26 23:55:31 +00001373** This function registered all of the above C functions as SQL
1374** functions. This should be the only routine in this file with
1375** external linkage.
drhdc04c582002-02-24 01:55:15 +00001376*/
drh9bb575f2004-09-06 17:24:11 +00001377void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001378 static const struct {
drh0bce8352002-02-28 00:41:10 +00001379 char *zName;
drh268380c2004-02-25 13:47:31 +00001380 signed char nArg;
drh309b3382007-03-17 17:52:42 +00001381 u8 argType; /* ff: db 1: 0, 2: 1, 3: 2,... N: N-1. */
danielk1977f4618892004-06-28 13:09:11 +00001382 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001383 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001384 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001385 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001386 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1387 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
drh309b3382007-03-17 17:52:42 +00001388 { "max", -1, 1, SQLITE_UTF8, 1, minmaxFunc },
1389 { "max", 0, 1, SQLITE_UTF8, 1, 0 },
danielk1977f4618892004-06-28 13:09:11 +00001390 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1391 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
drh64f31512007-10-12 19:11:55 +00001392 { "substr", 2, 0, SQLITE_UTF8, 0, substrFunc },
danielk1977f4618892004-06-28 13:09:11 +00001393 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
danielk1977f4618892004-06-28 13:09:11 +00001394 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1395 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1396 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1397 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1398 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1399 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1400 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1401 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
drh137c7282007-01-29 17:58:28 +00001402 { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc },
danielk1977f4618892004-06-28 13:09:11 +00001403 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1404 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
drh137c7282007-01-29 17:58:28 +00001405 { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob },
drh94a98362004-09-13 13:13:18 +00001406 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001407 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1408 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
drh309b3382007-03-17 17:52:42 +00001409 { "last_insert_rowid", 0, 0xff, SQLITE_UTF8, 0, last_insert_rowid },
1410 { "changes", 0, 0xff, SQLITE_UTF8, 0, changes },
1411 { "total_changes", 0, 0xff, SQLITE_UTF8, 0, total_changes },
drh26b6d902007-03-17 13:27:54 +00001412 { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc },
drh309b3382007-03-17 17:52:42 +00001413 { "ltrim", 1, 1, SQLITE_UTF8, 0, trimFunc },
1414 { "ltrim", 2, 1, SQLITE_UTF8, 0, trimFunc },
1415 { "rtrim", 1, 2, SQLITE_UTF8, 0, trimFunc },
1416 { "rtrim", 2, 2, SQLITE_UTF8, 0, trimFunc },
1417 { "trim", 1, 3, SQLITE_UTF8, 0, trimFunc },
1418 { "trim", 2, 3, SQLITE_UTF8, 0, trimFunc },
drh8cff3822007-05-02 02:08:28 +00001419 { "zeroblob", 1, 0, SQLITE_UTF8, 0, zeroblobFunc },
drhd24cc422003-03-27 12:51:24 +00001420#ifdef SQLITE_SOUNDEX
drh309b3382007-03-17 17:52:42 +00001421 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001422#endif
drhfdb83b22006-06-17 14:12:47 +00001423#ifndef SQLITE_OMIT_LOAD_EXTENSION
drh309b3382007-03-17 17:52:42 +00001424 { "load_extension", 1, 0xff, SQLITE_UTF8, 0, loadExt },
1425 { "load_extension", 2, 0xff, SQLITE_UTF8, 0, loadExt },
drhfdb83b22006-06-17 14:12:47 +00001426#endif
drh193a6b42002-07-07 16:52:46 +00001427#ifdef SQLITE_TEST
drh309b3382007-03-17 17:52:42 +00001428 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1429 { "test_destructor", 1, 0xff, SQLITE_UTF8, 0, test_destructor},
1430 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
1431 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
1432 { "test_error", 1, 0, SQLITE_UTF8, 0, test_error},
drh193a6b42002-07-07 16:52:46 +00001433#endif
drh0bce8352002-02-28 00:41:10 +00001434 };
drh57196282004-10-06 15:41:16 +00001435 static const struct {
drh0bce8352002-02-28 00:41:10 +00001436 char *zName;
drh268380c2004-02-25 13:47:31 +00001437 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001438 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001439 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001440 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1441 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001442 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001443 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
drh309b3382007-03-17 17:52:42 +00001444 { "max", 1, 1, 1, minmaxStep, minMaxFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001445 { "sum", 1, 0, 0, sumStep, sumFinalize },
drha97fdd32006-01-12 22:17:50 +00001446 { "total", 1, 0, 0, sumStep, totalFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001447 { "avg", 1, 0, 0, sumStep, avgFinalize },
1448 { "count", 0, 0, 0, countStep, countFinalize },
1449 { "count", 1, 0, 0, countStep, countFinalize },
drhb0689692007-11-01 17:38:30 +00001450 { "group_concat", 1, 0, 0, groupConcatStep, groupConcatFinalize },
1451 { "group_concat", 2, 0, 0, groupConcatStep, groupConcatFinalize },
drh0bce8352002-02-28 00:41:10 +00001452 };
1453 int i;
1454
1455 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001456 void *pArg;
1457 u8 argType = aFuncs[i].argType;
1458 if( argType==0xff ){
1459 pArg = db;
1460 }else{
1461 pArg = (void*)(int)argType;
danielk1977c572ef72004-05-27 09:28:41 +00001462 }
danielk1977771151b2006-01-17 13:21:40 +00001463 sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001464 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001465 if( aFuncs[i].needCollSeq ){
1466 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1467 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1468 if( pFunc && aFuncs[i].needCollSeq ){
1469 pFunc->needCollSeq = 1;
1470 }
1471 }
drh0bce8352002-02-28 00:41:10 +00001472 }
drh1f01ec12005-02-15 21:36:18 +00001473#ifndef SQLITE_OMIT_ALTERTABLE
1474 sqlite3AlterFunctions(db);
1475#endif
drh198bf392006-01-06 21:52:49 +00001476#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001477 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001478#endif
drh0bce8352002-02-28 00:41:10 +00001479 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
drh309b3382007-03-17 17:52:42 +00001480 void *pArg = (void*)(int)aAggs[i].argType;
danielk1977771151b2006-01-17 13:21:40 +00001481 sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001482 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001483 if( aAggs[i].needCollSeq ){
1484 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001485 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001486 if( pFunc && aAggs[i].needCollSeq ){
1487 pFunc->needCollSeq = 1;
1488 }
1489 }
drh268380c2004-02-25 13:47:31 +00001490 }
danielk19774adee202004-05-08 08:23:19 +00001491 sqlite3RegisterDateTimeFunctions(db);
danielk19771e536952007-08-16 10:09:01 +00001492 if( !db->mallocFailed ){
danielk1977832a58a2007-06-22 15:21:15 +00001493 int rc = sqlite3_overload_function(db, "MATCH", 2);
1494 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
1495 if( rc==SQLITE_NOMEM ){
danielk19771e536952007-08-16 10:09:01 +00001496 db->mallocFailed = 1;
danielk1977832a58a2007-06-22 15:21:15 +00001497 }
1498 }
danielk1977fd9e1f32005-05-22 10:44:34 +00001499#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001500 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001501#endif
drh55ef4d92005-08-14 01:20:37 +00001502#ifdef SQLITE_CASE_SENSITIVE_LIKE
1503 sqlite3RegisterLikeFunctions(db, 1);
1504#else
1505 sqlite3RegisterLikeFunctions(db, 0);
1506#endif
1507}
1508
1509/*
1510** Set the LIKEOPT flag on the 2-argument function with the given name.
1511*/
drhd64fe2f2005-08-28 17:00:23 +00001512static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001513 FuncDef *pDef;
1514 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1515 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001516 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001517 }
1518}
1519
1520/*
1521** Register the built-in LIKE and GLOB functions. The caseSensitive
1522** parameter determines whether or not the LIKE operator is case
1523** sensitive. GLOB is always case sensitive.
1524*/
1525void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1526 struct compareInfo *pInfo;
1527 if( caseSensitive ){
1528 pInfo = (struct compareInfo*)&likeInfoAlt;
1529 }else{
1530 pInfo = (struct compareInfo*)&likeInfoNorm;
1531 }
danielk1977771151b2006-01-17 13:21:40 +00001532 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1533 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1534 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001535 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001536 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1537 setLikeOptFlag(db, "like",
1538 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001539}
1540
1541/*
1542** pExpr points to an expression which implements a function. If
1543** it is appropriate to apply the LIKE optimization to that function
1544** then set aWc[0] through aWc[2] to the wildcard characters and
1545** return TRUE. If the function is not a LIKE-style function then
1546** return FALSE.
1547*/
drhd64fe2f2005-08-28 17:00:23 +00001548int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001549 FuncDef *pDef;
danielk1977cdbd8ef2007-05-12 06:11:12 +00001550 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){
drh55ef4d92005-08-14 01:20:37 +00001551 return 0;
1552 }
1553 if( pExpr->pList->nExpr!=2 ){
1554 return 0;
1555 }
drh2646da72005-12-09 20:02:05 +00001556 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001557 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001558 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001559 return 0;
1560 }
1561
1562 /* The memcpy() statement assumes that the wildcard characters are
1563 ** the first three statements in the compareInfo structure. The
1564 ** asserts() that follow verify that assumption
1565 */
1566 memcpy(aWc, pDef->pUserData, 3);
1567 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1568 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1569 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001570 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001571 return 1;
drhdc04c582002-02-24 01:55:15 +00001572}