blob: 2a803b38f12785e9dac7ba019ecd0d6e004fc871 [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**
drh63cf66f2007-01-29 15:50:05 +000019** $Id: func.c,v 1.135 2007/01/29 15:50:06 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>
drhb37df7b2005-10-13 02:09:49 +000023/* #include <math.h> */
drhd3a149e2002-02-24 17:12:53 +000024#include <stdlib.h>
drh0bce8352002-02-28 00:41:10 +000025#include <assert.h>
danielk197788208052004-05-25 01:13:20 +000026#include "vdbeInt.h"
drh771d8c32003-08-09 21:32:28 +000027#include "os.h"
drh0bce8352002-02-28 00:41:10 +000028
drh55ef4d92005-08-14 01:20:37 +000029/*
30** Return the collating function associated with a function.
31*/
danielk1977dc1bdc42004-06-11 10:51:27 +000032static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
33 return context->pColl;
34}
35
drh0bce8352002-02-28 00:41:10 +000036/*
37** Implementation of the non-aggregate min() and max() functions
38*/
drhf9b596e2004-05-26 16:54:42 +000039static void minmaxFunc(
40 sqlite3_context *context,
41 int argc,
42 sqlite3_value **argv
43){
drh0bce8352002-02-28 00:41:10 +000044 int i;
drh268380c2004-02-25 13:47:31 +000045 int mask; /* 0 for min() or 0xffffffff for max() */
drhf9b596e2004-05-26 16:54:42 +000046 int iBest;
danielk1977dc1bdc42004-06-11 10:51:27 +000047 CollSeq *pColl;
drh0bce8352002-02-28 00:41:10 +000048
drh89425d52002-02-28 03:04:48 +000049 if( argc==0 ) return;
drhc44af712004-09-02 15:53:56 +000050 mask = sqlite3_user_data(context)==0 ? 0 : -1;
danielk1977dc1bdc42004-06-11 10:51:27 +000051 pColl = sqlite3GetFuncCollSeq(context);
52 assert( pColl );
danielk1977c572ef72004-05-27 09:28:41 +000053 assert( mask==-1 || mask==0 );
drhf9b596e2004-05-26 16:54:42 +000054 iBest = 0;
drh9c054832004-05-31 18:51:57 +000055 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drhf9b596e2004-05-26 16:54:42 +000056 for(i=1; i<argc; i++){
drh9c054832004-05-31 18:51:57 +000057 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
danielk1977dc1bdc42004-06-11 10:51:27 +000058 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
drhf9b596e2004-05-26 16:54:42 +000059 iBest = i;
drh0bce8352002-02-28 00:41:10 +000060 }
61 }
drhf4479502004-05-27 03:12:53 +000062 sqlite3_result_value(context, argv[iBest]);
drh0bce8352002-02-28 00:41:10 +000063}
drh0bce8352002-02-28 00:41:10 +000064
drh268380c2004-02-25 13:47:31 +000065/*
66** Return the type of the argument.
67*/
drhf9b596e2004-05-26 16:54:42 +000068static void typeofFunc(
69 sqlite3_context *context,
70 int argc,
71 sqlite3_value **argv
72){
danielk197735bb9d02004-05-24 12:55:54 +000073 const char *z = 0;
danielk197735bb9d02004-05-24 12:55:54 +000074 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000075 case SQLITE_NULL: z = "null"; break;
76 case SQLITE_INTEGER: z = "integer"; break;
77 case SQLITE_TEXT: z = "text"; break;
78 case SQLITE_FLOAT: z = "real"; break;
79 case SQLITE_BLOB: z = "blob"; break;
danielk197735bb9d02004-05-24 12:55:54 +000080 }
danielk1977d8123362004-06-12 09:25:12 +000081 sqlite3_result_text(context, z, -1, SQLITE_STATIC);
drh0bce8352002-02-28 00:41:10 +000082}
83
drh5708d2d2005-06-22 10:53:59 +000084
85/*
drh0bce8352002-02-28 00:41:10 +000086** Implementation of the length() function
87*/
drhf9b596e2004-05-26 16:54:42 +000088static void lengthFunc(
89 sqlite3_context *context,
90 int argc,
91 sqlite3_value **argv
92){
drh0bce8352002-02-28 00:41:10 +000093 int len;
94
95 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +000096 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +000097 case SQLITE_BLOB:
98 case SQLITE_INTEGER:
99 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000100 sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
drhf9b596e2004-05-26 16:54:42 +0000101 break;
102 }
drh9c054832004-05-31 18:51:57 +0000103 case SQLITE_TEXT: {
drh2646da72005-12-09 20:02:05 +0000104 const unsigned char *z = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000105 for(len=0; *z; z++){ if( (0xc0&*z)!=0x80 ) len++; }
drhf4479502004-05-27 03:12:53 +0000106 sqlite3_result_int(context, len);
drhf9b596e2004-05-26 16:54:42 +0000107 break;
108 }
109 default: {
110 sqlite3_result_null(context);
111 break;
112 }
113 }
drh0bce8352002-02-28 00:41:10 +0000114}
115
116/*
117** Implementation of the abs() function
118*/
danielk19770ae8b832004-05-25 12:05:56 +0000119static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000120 assert( argc==1 );
drhf9b596e2004-05-26 16:54:42 +0000121 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000122 case SQLITE_INTEGER: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000123 i64 iVal = sqlite3_value_int64(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000124 if( iVal<0 ){
125 if( (iVal<<1)==0 ){
126 sqlite3_result_error(context, "integer overflow", -1);
127 return;
128 }
129 iVal = -iVal;
130 }
danielk1977f93bbbe2004-05-27 10:30:52 +0000131 sqlite3_result_int64(context, iVal);
drhf9b596e2004-05-26 16:54:42 +0000132 break;
133 }
drh9c054832004-05-31 18:51:57 +0000134 case SQLITE_NULL: {
drhf9b596e2004-05-26 16:54:42 +0000135 sqlite3_result_null(context);
136 break;
137 }
138 default: {
danielk1977f93bbbe2004-05-27 10:30:52 +0000139 double rVal = sqlite3_value_double(argv[0]);
drh52fc8492006-02-23 21:43:55 +0000140 if( rVal<0 ) rVal = -rVal;
danielk1977f93bbbe2004-05-27 10:30:52 +0000141 sqlite3_result_double(context, rVal);
drhf9b596e2004-05-26 16:54:42 +0000142 break;
143 }
144 }
drh0bce8352002-02-28 00:41:10 +0000145}
146
147/*
148** Implementation of the substr() function
149*/
drhf9b596e2004-05-26 16:54:42 +0000150static void substrFunc(
151 sqlite3_context *context,
152 int argc,
153 sqlite3_value **argv
154){
drh2646da72005-12-09 20:02:05 +0000155 const unsigned char *z;
156 const unsigned char *z2;
drh0bce8352002-02-28 00:41:10 +0000157 int i;
drh0bce8352002-02-28 00:41:10 +0000158 int p1, p2, len;
drhf9b596e2004-05-26 16:54:42 +0000159
drh0bce8352002-02-28 00:41:10 +0000160 assert( argc==3 );
drh4f26d6c2004-05-26 23:25:30 +0000161 z = sqlite3_value_text(argv[0]);
drh0bce8352002-02-28 00:41:10 +0000162 if( z==0 ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000163 p1 = sqlite3_value_int(argv[1]);
164 p2 = sqlite3_value_int(argv[2]);
drh47c8a672002-02-28 04:00:12 +0000165 for(len=0, z2=z; *z2; z2++){ if( (0xc0&*z2)!=0x80 ) len++; }
drh0bce8352002-02-28 00:41:10 +0000166 if( p1<0 ){
drh89425d52002-02-28 03:04:48 +0000167 p1 += len;
drh653bc752002-02-28 03:31:10 +0000168 if( p1<0 ){
169 p2 += p1;
170 p1 = 0;
171 }
drh0bce8352002-02-28 00:41:10 +0000172 }else if( p1>0 ){
173 p1--;
174 }
175 if( p1+p2>len ){
176 p2 = len-p1;
177 }
drh77396302004-01-02 13:17:48 +0000178 for(i=0; i<p1 && z[i]; i++){
drh47c8a672002-02-28 04:00:12 +0000179 if( (z[i]&0xc0)==0x80 ) p1++;
drh0bce8352002-02-28 00:41:10 +0000180 }
drh47c8a672002-02-28 04:00:12 +0000181 while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p1++; }
drh77396302004-01-02 13:17:48 +0000182 for(; i<p1+p2 && z[i]; i++){
drh47c8a672002-02-28 04:00:12 +0000183 if( (z[i]&0xc0)==0x80 ) p2++;
drh0bce8352002-02-28 00:41:10 +0000184 }
drh47c8a672002-02-28 04:00:12 +0000185 while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p2++; }
drh653bc752002-02-28 03:31:10 +0000186 if( p2<0 ) p2 = 0;
drh2646da72005-12-09 20:02:05 +0000187 sqlite3_result_text(context, (char*)&z[p1], p2, SQLITE_TRANSIENT);
drh0bce8352002-02-28 00:41:10 +0000188}
189
190/*
191** Implementation of the round() function
192*/
danielk19770ae8b832004-05-25 12:05:56 +0000193static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197751ad0ec2004-05-24 12:39:02 +0000194 int n = 0;
drh0bce8352002-02-28 00:41:10 +0000195 double r;
drh592ac8c2005-08-13 03:07:47 +0000196 char zBuf[500]; /* larger than the %f representation of the largest double */
drh0bce8352002-02-28 00:41:10 +0000197 assert( argc==1 || argc==2 );
danielk197751ad0ec2004-05-24 12:39:02 +0000198 if( argc==2 ){
drh9c054832004-05-31 18:51:57 +0000199 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
danielk197751ad0ec2004-05-24 12:39:02 +0000200 n = sqlite3_value_int(argv[1]);
201 if( n>30 ) n = 30;
202 if( n<0 ) n = 0;
203 }
drhd589a922006-03-02 03:02:48 +0000204 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
drh4f26d6c2004-05-26 23:25:30 +0000205 r = sqlite3_value_double(argv[0]);
drhe866fcb2005-07-09 02:38:06 +0000206 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r);
drh502b9622006-04-07 13:26:42 +0000207 sqlite3AtoF(zBuf, &r);
208 sqlite3_result_double(context, r);
drh0bce8352002-02-28 00:41:10 +0000209}
drhdc04c582002-02-24 01:55:15 +0000210
211/*
212** Implementation of the upper() and lower() SQL functions.
213*/
danielk19770ae8b832004-05-25 12:05:56 +0000214static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh8cd9db02004-07-18 23:06:53 +0000215 unsigned char *z;
drhdc04c582002-02-24 01:55:15 +0000216 int i;
drh9c054832004-05-31 18:51:57 +0000217 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
danielk1977c572ef72004-05-27 09:28:41 +0000218 z = sqliteMalloc(sqlite3_value_bytes(argv[0])+1);
drhdc04c582002-02-24 01:55:15 +0000219 if( z==0 ) return;
drh2646da72005-12-09 20:02:05 +0000220 strcpy((char*)z, (char*)sqlite3_value_text(argv[0]));
drhdc04c582002-02-24 01:55:15 +0000221 for(i=0; z[i]; i++){
drh4c755c02004-08-08 20:22:17 +0000222 z[i] = toupper(z[i]);
drhdc04c582002-02-24 01:55:15 +0000223 }
drh2646da72005-12-09 20:02:05 +0000224 sqlite3_result_text(context, (char*)z, -1, SQLITE_TRANSIENT);
danielk19777e18c252004-05-25 11:47:24 +0000225 sqliteFree(z);
drhdc04c582002-02-24 01:55:15 +0000226}
danielk19770ae8b832004-05-25 12:05:56 +0000227static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh8cd9db02004-07-18 23:06:53 +0000228 unsigned char *z;
drhdc04c582002-02-24 01:55:15 +0000229 int i;
drh9c054832004-05-31 18:51:57 +0000230 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return;
danielk1977c572ef72004-05-27 09:28:41 +0000231 z = sqliteMalloc(sqlite3_value_bytes(argv[0])+1);
drhdc04c582002-02-24 01:55:15 +0000232 if( z==0 ) return;
drh2646da72005-12-09 20:02:05 +0000233 strcpy((char*)z, (char*)sqlite3_value_text(argv[0]));
drhdc04c582002-02-24 01:55:15 +0000234 for(i=0; z[i]; i++){
drh4c755c02004-08-08 20:22:17 +0000235 z[i] = tolower(z[i]);
drhdc04c582002-02-24 01:55:15 +0000236 }
drh2646da72005-12-09 20:02:05 +0000237 sqlite3_result_text(context, (char*)z, -1, SQLITE_TRANSIENT);
danielk19777e18c252004-05-25 11:47:24 +0000238 sqliteFree(z);
drhdc04c582002-02-24 01:55:15 +0000239}
240
241/*
drhfbc99082002-02-28 03:14:18 +0000242** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
jplyonb6c9e6e2004-01-19 04:53:24 +0000243** All three do the same thing. They return the first non-NULL
244** argument.
drh3212e182002-02-28 00:46:26 +0000245*/
drhf9b596e2004-05-26 16:54:42 +0000246static void ifnullFunc(
247 sqlite3_context *context,
248 int argc,
249 sqlite3_value **argv
250){
drhfbc99082002-02-28 03:14:18 +0000251 int i;
252 for(i=0; i<argc; i++){
drh9c054832004-05-31 18:51:57 +0000253 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
drhf4479502004-05-27 03:12:53 +0000254 sqlite3_result_value(context, argv[i]);
drhfbc99082002-02-28 03:14:18 +0000255 break;
256 }
257 }
drh3212e182002-02-28 00:46:26 +0000258}
259
260/*
drhf9ffac92002-03-02 19:00:31 +0000261** Implementation of random(). Return a random integer.
262*/
drhf9b596e2004-05-26 16:54:42 +0000263static void randomFunc(
264 sqlite3_context *context,
265 int argc,
266 sqlite3_value **argv
267){
drh52fc8492006-02-23 21:43:55 +0000268 sqlite_int64 r;
danielk19774adee202004-05-08 08:23:19 +0000269 sqlite3Randomness(sizeof(r), &r);
drh874abbe2006-02-23 21:51:12 +0000270 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */
271 /* can always do abs() of the result */
drh52fc8492006-02-23 21:43:55 +0000272 sqlite3_result_int64(context, r);
drhf9ffac92002-03-02 19:00:31 +0000273}
274
275/*
drh63cf66f2007-01-29 15:50:05 +0000276** Implementation of randomhex(N). Return a random hexadecimal string
277** that is N characters long.
278*/
279static void randomHex(
280 sqlite3_context *context,
281 int argc,
282 sqlite3_value **argv
283){
284 int n, i, j;
285 unsigned char c, zBuf[1001];
286 assert( argc==1 );
287 n = sqlite3_value_int(argv[0]);
288 if( n&1 ) n++;
289 if( n<2 ) n = 2;
290 if( n>sizeof(zBuf)-1 ) n = sizeof(zBuf)-1;
291 sqlite3Randomness(n/2, zBuf);
292 for(i=n-1, j=n/2-1; i>=1; i-=2, j--){
293 static const char zDigits[] = "0123456789ABCDEF";
294 c = zBuf[j];
295 zBuf[i] = zDigits[c&0xf];
296 zBuf[i-1] = zDigits[c>>4];
297 }
298 zBuf[n] = 0;
299 sqlite3_result_text(context, (char*)zBuf, n, SQLITE_TRANSIENT);
300}
301
302/*
drh6ed41ad2002-04-06 14:10:47 +0000303** Implementation of the last_insert_rowid() SQL function. The return
danielk197724b03fd2004-05-10 10:34:34 +0000304** value is the same as the sqlite3_last_insert_rowid() API function.
drh6ed41ad2002-04-06 14:10:47 +0000305*/
danielk197751ad0ec2004-05-24 12:39:02 +0000306static void last_insert_rowid(
danielk19770ae8b832004-05-25 12:05:56 +0000307 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000308 int arg,
309 sqlite3_value **argv
310){
drh9bb575f2004-09-06 17:24:11 +0000311 sqlite3 *db = sqlite3_user_data(context);
drhf9b596e2004-05-26 16:54:42 +0000312 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
drh6ed41ad2002-04-06 14:10:47 +0000313}
314
rdcf146a772004-02-25 22:51:06 +0000315/*
danielk1977b28af712004-06-21 06:50:26 +0000316** Implementation of the changes() SQL function. The return value is the
317** same as the sqlite3_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000318*/
danielk1977b28af712004-06-21 06:50:26 +0000319static void changes(
drhf9b596e2004-05-26 16:54:42 +0000320 sqlite3_context *context,
321 int arg,
322 sqlite3_value **argv
323){
drh9bb575f2004-09-06 17:24:11 +0000324 sqlite3 *db = sqlite3_user_data(context);
drhf4479502004-05-27 03:12:53 +0000325 sqlite3_result_int(context, sqlite3_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000326}
rdcf146a772004-02-25 22:51:06 +0000327
328/*
danielk1977b28af712004-06-21 06:50:26 +0000329** Implementation of the total_changes() SQL function. The return value is
330** the same as the sqlite3_total_changes() API function.
rdcf146a772004-02-25 22:51:06 +0000331*/
danielk1977b28af712004-06-21 06:50:26 +0000332static void total_changes(
333 sqlite3_context *context,
danielk197751ad0ec2004-05-24 12:39:02 +0000334 int arg,
335 sqlite3_value **argv
336){
drh9bb575f2004-09-06 17:24:11 +0000337 sqlite3 *db = sqlite3_user_data(context);
danielk1977b28af712004-06-21 06:50:26 +0000338 sqlite3_result_int(context, sqlite3_total_changes(db));
rdcb0c374f2004-02-20 22:53:38 +0000339}
340
drh6ed41ad2002-04-06 14:10:47 +0000341/*
drh4e5ffc52004-08-31 00:52:37 +0000342** A structure defining how to do GLOB-style comparisons.
danielk1977d02eb1f2004-06-06 09:44:03 +0000343*/
drh4e5ffc52004-08-31 00:52:37 +0000344struct compareInfo {
345 u8 matchAll;
346 u8 matchOne;
347 u8 matchSet;
348 u8 noCase;
danielk1977d02eb1f2004-06-06 09:44:03 +0000349};
drh55ef4d92005-08-14 01:20:37 +0000350
drh4e5ffc52004-08-31 00:52:37 +0000351static const struct compareInfo globInfo = { '*', '?', '[', 0 };
drh55ef4d92005-08-14 01:20:37 +0000352/* The correct SQL-92 behavior is for the LIKE operator to ignore
353** case. Thus 'a' LIKE 'A' would be true. */
354static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
355/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
356** is case sensitive causing 'a' LIKE 'A' to be false */
357static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
danielk1977d02eb1f2004-06-06 09:44:03 +0000358
359/*
drh4e5ffc52004-08-31 00:52:37 +0000360** X is a pointer to the first byte of a UTF-8 character. Increment
361** X so that it points to the next character. This only works right
362** if X points to a well-formed UTF-8 string.
danielk1977d02eb1f2004-06-06 09:44:03 +0000363*/
drh4e5ffc52004-08-31 00:52:37 +0000364#define sqliteNextChar(X) while( (0xc0&*++(X))==0x80 ){}
365#define sqliteCharVal(X) sqlite3ReadUtf8(X)
danielk1977d02eb1f2004-06-06 09:44:03 +0000366
danielk1977d02eb1f2004-06-06 09:44:03 +0000367
368/*
drh4e5ffc52004-08-31 00:52:37 +0000369** Compare two UTF-8 strings for equality where the first string can
370** potentially be a "glob" expression. Return true (1) if they
371** are the same and false (0) if they are different.
drh0ac65892002-04-20 14:24:41 +0000372**
drh4e5ffc52004-08-31 00:52:37 +0000373** Globbing rules:
drh0ac65892002-04-20 14:24:41 +0000374**
drh4e5ffc52004-08-31 00:52:37 +0000375** '*' Matches any sequence of zero or more characters.
danielk1977d02eb1f2004-06-06 09:44:03 +0000376**
drh4e5ffc52004-08-31 00:52:37 +0000377** '?' Matches exactly one character.
378**
379** [...] Matches one character from the enclosed list of
380** characters.
381**
382** [^...] Matches one character not in the enclosed list.
383**
384** With the [...] and [^...] matching, a ']' character can be included
385** in the list by making it the first character after '[' or '^'. A
386** range of characters can be specified using '-'. Example:
387** "[a-z]" matches any single lower-case letter. To match a '-', make
388** it the last character in the list.
389**
390** This routine is usually quick, but can be N**2 in the worst case.
391**
392** Hints: to match '*' or '?', put them in "[]". Like this:
393**
394** abc[*]xyz Matches "abc*xyz" only
drh0ac65892002-04-20 14:24:41 +0000395*/
danielk19777c6303c2004-11-17 16:41:29 +0000396static int patternCompare(
drh4e5ffc52004-08-31 00:52:37 +0000397 const u8 *zPattern, /* The glob pattern */
398 const u8 *zString, /* The string to compare against the glob */
danielk19777c6303c2004-11-17 16:41:29 +0000399 const struct compareInfo *pInfo, /* Information about how to do the compare */
400 const int esc /* The escape character */
danielk197751ad0ec2004-05-24 12:39:02 +0000401){
danielk1977ad7dd422004-06-06 12:41:49 +0000402 register int c;
drh4e5ffc52004-08-31 00:52:37 +0000403 int invert;
404 int seen;
405 int c2;
406 u8 matchOne = pInfo->matchOne;
407 u8 matchAll = pInfo->matchAll;
408 u8 matchSet = pInfo->matchSet;
409 u8 noCase = pInfo->noCase;
danielk19777c6303c2004-11-17 16:41:29 +0000410 int prevEscape = 0; /* True if the previous character was 'escape' */
danielk1977d02eb1f2004-06-06 09:44:03 +0000411
drh4e5ffc52004-08-31 00:52:37 +0000412 while( (c = *zPattern)!=0 ){
danielk19777c6303c2004-11-17 16:41:29 +0000413 if( !prevEscape && c==matchAll ){
drh4e5ffc52004-08-31 00:52:37 +0000414 while( (c=zPattern[1]) == matchAll || c == matchOne ){
415 if( c==matchOne ){
416 if( *zString==0 ) return 0;
417 sqliteNextChar(zString);
418 }
419 zPattern++;
danielk1977ad7dd422004-06-06 12:41:49 +0000420 }
drh20fc0882004-11-18 13:49:25 +0000421 if( c && esc && sqlite3ReadUtf8(&zPattern[1])==esc ){
danielk19777c6303c2004-11-17 16:41:29 +0000422 u8 const *zTemp = &zPattern[1];
423 sqliteNextChar(zTemp);
424 c = *zTemp;
425 }
drh4e5ffc52004-08-31 00:52:37 +0000426 if( c==0 ) return 1;
427 if( c==matchSet ){
danielk19777c6303c2004-11-17 16:41:29 +0000428 assert( esc==0 ); /* This is GLOB, not LIKE */
429 while( *zString && patternCompare(&zPattern[1],zString,pInfo,esc)==0 ){
drh4e5ffc52004-08-31 00:52:37 +0000430 sqliteNextChar(zString);
431 }
432 return *zString!=0;
433 }else{
434 while( (c2 = *zString)!=0 ){
435 if( noCase ){
436 c2 = sqlite3UpperToLower[c2];
437 c = sqlite3UpperToLower[c];
438 while( c2 != 0 && c2 != c ){ c2 = sqlite3UpperToLower[*++zString]; }
439 }else{
440 while( c2 != 0 && c2 != c ){ c2 = *++zString; }
441 }
442 if( c2==0 ) return 0;
danielk19777c6303c2004-11-17 16:41:29 +0000443 if( patternCompare(&zPattern[1],zString,pInfo,esc) ) return 1;
drh4e5ffc52004-08-31 00:52:37 +0000444 sqliteNextChar(zString);
445 }
446 return 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000447 }
danielk19777c6303c2004-11-17 16:41:29 +0000448 }else if( !prevEscape && c==matchOne ){
drh4e5ffc52004-08-31 00:52:37 +0000449 if( *zString==0 ) return 0;
450 sqliteNextChar(zString);
451 zPattern++;
452 }else if( c==matchSet ){
453 int prior_c = 0;
danielk19777c6303c2004-11-17 16:41:29 +0000454 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
drh4e5ffc52004-08-31 00:52:37 +0000455 seen = 0;
456 invert = 0;
457 c = sqliteCharVal(zString);
458 if( c==0 ) return 0;
459 c2 = *++zPattern;
460 if( c2=='^' ){ invert = 1; c2 = *++zPattern; }
461 if( c2==']' ){
462 if( c==']' ) seen = 1;
463 c2 = *++zPattern;
464 }
465 while( (c2 = sqliteCharVal(zPattern))!=0 && c2!=']' ){
466 if( c2=='-' && zPattern[1]!=']' && zPattern[1]!=0 && prior_c>0 ){
467 zPattern++;
468 c2 = sqliteCharVal(zPattern);
469 if( c>=prior_c && c<=c2 ) seen = 1;
470 prior_c = 0;
471 }else if( c==c2 ){
472 seen = 1;
473 prior_c = c2;
474 }else{
475 prior_c = c2;
476 }
477 sqliteNextChar(zPattern);
478 }
479 if( c2==0 || (seen ^ invert)==0 ) return 0;
480 sqliteNextChar(zString);
481 zPattern++;
drh20fc0882004-11-18 13:49:25 +0000482 }else if( esc && !prevEscape && sqlite3ReadUtf8(zPattern)==esc){
danielk19777c6303c2004-11-17 16:41:29 +0000483 prevEscape = 1;
484 sqliteNextChar(zPattern);
drh4e5ffc52004-08-31 00:52:37 +0000485 }else{
486 if( noCase ){
487 if( sqlite3UpperToLower[c] != sqlite3UpperToLower[*zString] ) return 0;
488 }else{
489 if( c != *zString ) return 0;
490 }
491 zPattern++;
492 zString++;
danielk19777c6303c2004-11-17 16:41:29 +0000493 prevEscape = 0;
danielk1977d02eb1f2004-06-06 09:44:03 +0000494 }
danielk197751ad0ec2004-05-24 12:39:02 +0000495 }
drh4e5ffc52004-08-31 00:52:37 +0000496 return *zString==0;
drh0ac65892002-04-20 14:24:41 +0000497}
drh4e5ffc52004-08-31 00:52:37 +0000498
drh55ef4d92005-08-14 01:20:37 +0000499/*
500** Count the number of times that the LIKE operator (or GLOB which is
501** just a variation of LIKE) gets called. This is used for testing
502** only.
503*/
504#ifdef SQLITE_TEST
505int sqlite3_like_count = 0;
506#endif
507
danielk19773f6b0872004-06-17 05:36:44 +0000508
509/*
510** Implementation of the like() SQL function. This function implements
511** the build-in LIKE operator. The first argument to the function is the
512** pattern and the second argument is the string. So, the SQL statements:
513**
514** A LIKE B
515**
516** is implemented as like(B,A).
517**
drh55ef4d92005-08-14 01:20:37 +0000518** This same function (with a different compareInfo structure) computes
519** the GLOB operator.
danielk19773f6b0872004-06-17 05:36:44 +0000520*/
521static void likeFunc(
522 sqlite3_context *context,
523 int argc,
524 sqlite3_value **argv
525){
526 const unsigned char *zA = sqlite3_value_text(argv[0]);
527 const unsigned char *zB = sqlite3_value_text(argv[1]);
danielk19777c6303c2004-11-17 16:41:29 +0000528 int escape = 0;
529 if( argc==3 ){
530 /* The escape character string must consist of a single UTF-8 character.
531 ** Otherwise, return an error.
532 */
533 const unsigned char *zEsc = sqlite3_value_text(argv[2]);
drh2646da72005-12-09 20:02:05 +0000534 if( sqlite3utf8CharLen((char*)zEsc, -1)!=1 ){
danielk19777c6303c2004-11-17 16:41:29 +0000535 sqlite3_result_error(context,
536 "ESCAPE expression must be a single character", -1);
537 return;
538 }
539 escape = sqlite3ReadUtf8(zEsc);
540 }
danielk19773f6b0872004-06-17 05:36:44 +0000541 if( zA && zB ){
drh55ef4d92005-08-14 01:20:37 +0000542 struct compareInfo *pInfo = sqlite3_user_data(context);
543#ifdef SQLITE_TEST
544 sqlite3_like_count++;
545#endif
546 sqlite3_result_int(context, patternCompare(zA, zB, pInfo, escape));
danielk197751ad0ec2004-05-24 12:39:02 +0000547 }
drh8912d102002-05-26 21:34:58 +0000548}
549
550/*
551** Implementation of the NULLIF(x,y) function. The result is the first
552** argument if the arguments are different. The result is NULL if the
553** arguments are equal to each other.
554*/
drhf9b596e2004-05-26 16:54:42 +0000555static void nullifFunc(
556 sqlite3_context *context,
557 int argc,
558 sqlite3_value **argv
559){
danielk1977dc1bdc42004-06-11 10:51:27 +0000560 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
561 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
drhf4479502004-05-27 03:12:53 +0000562 sqlite3_result_value(context, argv[0]);
drh8912d102002-05-26 21:34:58 +0000563 }
drh0ac65892002-04-20 14:24:41 +0000564}
565
drh647cb0e2002-11-04 19:32:25 +0000566/*
567** Implementation of the VERSION(*) function. The result is the version
568** of the SQLite library that is running.
569*/
drhf9b596e2004-05-26 16:54:42 +0000570static void versionFunc(
571 sqlite3_context *context,
572 int argc,
573 sqlite3_value **argv
574){
danielk1977d8123362004-06-12 09:25:12 +0000575 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC);
drh647cb0e2002-11-04 19:32:25 +0000576}
577
danielk1977d641d642004-11-18 15:44:29 +0000578
drh47394702003-08-20 01:03:33 +0000579/*
580** EXPERIMENTAL - This is not an official function. The interface may
581** change. This function may disappear. Do not write code that depends
582** on this function.
583**
584** Implementation of the QUOTE() function. This function takes a single
585** argument. If the argument is numeric, the return value is the same as
586** the argument. If the argument is NULL, the return value is the string
587** "NULL". Otherwise, the argument is enclosed in single quotes with
588** single-quote escapes.
589*/
danielk19770ae8b832004-05-25 12:05:56 +0000590static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drh47394702003-08-20 01:03:33 +0000591 if( argc<1 ) return;
drhf9b596e2004-05-26 16:54:42 +0000592 switch( sqlite3_value_type(argv[0]) ){
drh9c054832004-05-31 18:51:57 +0000593 case SQLITE_NULL: {
danielk1977d8123362004-06-12 09:25:12 +0000594 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
drhf9b596e2004-05-26 16:54:42 +0000595 break;
drh47394702003-08-20 01:03:33 +0000596 }
drh9c054832004-05-31 18:51:57 +0000597 case SQLITE_INTEGER:
598 case SQLITE_FLOAT: {
drhf4479502004-05-27 03:12:53 +0000599 sqlite3_result_value(context, argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000600 break;
601 }
danielk19773f41e972004-06-08 00:39:01 +0000602 case SQLITE_BLOB: {
603 static const char hexdigits[] = {
604 '0', '1', '2', '3', '4', '5', '6', '7',
605 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
606 };
607 char *zText = 0;
608 int nBlob = sqlite3_value_bytes(argv[0]);
609 char const *zBlob = sqlite3_value_blob(argv[0]);
610
611 zText = (char *)sqliteMalloc((2*nBlob)+4);
612 if( !zText ){
613 sqlite3_result_error(context, "out of memory", -1);
614 }else{
615 int i;
616 for(i=0; i<nBlob; i++){
617 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
618 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
619 }
620 zText[(nBlob*2)+2] = '\'';
621 zText[(nBlob*2)+3] = '\0';
622 zText[0] = 'X';
623 zText[1] = '\'';
danielk1977d8123362004-06-12 09:25:12 +0000624 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
danielk19773f41e972004-06-08 00:39:01 +0000625 sqliteFree(zText);
626 }
627 break;
628 }
drh9c054832004-05-31 18:51:57 +0000629 case SQLITE_TEXT: {
drhf9b596e2004-05-26 16:54:42 +0000630 int i,j,n;
drh2646da72005-12-09 20:02:05 +0000631 const unsigned char *zArg = sqlite3_value_text(argv[0]);
drhf9b596e2004-05-26 16:54:42 +0000632 char *z;
633
634 for(i=n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
635 z = sqliteMalloc( i+n+3 );
636 if( z==0 ) return;
637 z[0] = '\'';
638 for(i=0, j=1; zArg[i]; i++){
639 z[j++] = zArg[i];
640 if( zArg[i]=='\'' ){
641 z[j++] = '\'';
642 }
643 }
644 z[j++] = '\'';
645 z[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000646 sqlite3_result_text(context, z, j, SQLITE_TRANSIENT);
drhf9b596e2004-05-26 16:54:42 +0000647 sqliteFree(z);
648 }
drh47394702003-08-20 01:03:33 +0000649 }
650}
651
drhd24cc422003-03-27 12:51:24 +0000652#ifdef SQLITE_SOUNDEX
653/*
654** Compute the soundex encoding of a word.
655*/
danielk19770ae8b832004-05-25 12:05:56 +0000656static void soundexFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
drhd24cc422003-03-27 12:51:24 +0000657 char zResult[8];
drh4c755c02004-08-08 20:22:17 +0000658 const u8 *zIn;
drhd24cc422003-03-27 12:51:24 +0000659 int i, j;
660 static const unsigned char iCode[] = {
661 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
662 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
663 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
664 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
665 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
666 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
667 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
668 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
669 };
670 assert( argc==1 );
drh4c755c02004-08-08 20:22:17 +0000671 zIn = (u8*)sqlite3_value_text(argv[0]);
drhbdf67e02006-08-19 11:34:01 +0000672 if( zIn==0 ) zIn = (u8*)"";
drhd24cc422003-03-27 12:51:24 +0000673 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}
674 if( zIn[i] ){
drhbdf67e02006-08-19 11:34:01 +0000675 u8 prevcode = iCode[zIn[i]&0x7f];
drhd24cc422003-03-27 12:51:24 +0000676 zResult[0] = toupper(zIn[i]);
677 for(j=1; j<4 && zIn[i]; i++){
678 int code = iCode[zIn[i]&0x7f];
679 if( code>0 ){
drhbdf67e02006-08-19 11:34:01 +0000680 if( code!=prevcode ){
681 prevcode = code;
682 zResult[j++] = code + '0';
683 }
684 }else{
685 prevcode = 0;
drhd24cc422003-03-27 12:51:24 +0000686 }
687 }
688 while( j<4 ){
689 zResult[j++] = '0';
690 }
691 zResult[j] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000692 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
drhd24cc422003-03-27 12:51:24 +0000693 }else{
danielk1977d8123362004-06-12 09:25:12 +0000694 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
drhd24cc422003-03-27 12:51:24 +0000695 }
696}
697#endif
698
drhfdb83b22006-06-17 14:12:47 +0000699#ifndef SQLITE_OMIT_LOAD_EXTENSION
700/*
701** A function that loads a shared-library extension then returns NULL.
702*/
703static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197765fd59f2006-06-24 11:51:33 +0000704 const char *zFile = (const char *)sqlite3_value_text(argv[0]);
drhfdb83b22006-06-17 14:12:47 +0000705 const char *zProc = 0;
706 sqlite3 *db = sqlite3_user_data(context);
707 char *zErrMsg = 0;
708
709 if( argc==2 ){
danielk197765fd59f2006-06-24 11:51:33 +0000710 zProc = (const char *)sqlite3_value_text(argv[1]);
drhfdb83b22006-06-17 14:12:47 +0000711 }
712 if( sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
713 sqlite3_result_error(context, zErrMsg, -1);
714 sqlite3_free(zErrMsg);
715 }
716}
717#endif
718
drh193a6b42002-07-07 16:52:46 +0000719#ifdef SQLITE_TEST
720/*
721** This function generates a string of random characters. Used for
722** generating test data.
723*/
danielk19770ae8b832004-05-25 12:05:56 +0000724static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){
drhbbd82df2004-02-11 09:46:30 +0000725 static const unsigned char zSrc[] =
drh193a6b42002-07-07 16:52:46 +0000726 "abcdefghijklmnopqrstuvwxyz"
727 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
728 "0123456789"
729 ".-!,:*^+=_|?/<> ";
730 int iMin, iMax, n, r, i;
drhbbd82df2004-02-11 09:46:30 +0000731 unsigned char zBuf[1000];
drh193a6b42002-07-07 16:52:46 +0000732 if( argc>=1 ){
drhf9b596e2004-05-26 16:54:42 +0000733 iMin = sqlite3_value_int(argv[0]);
drh193a6b42002-07-07 16:52:46 +0000734 if( iMin<0 ) iMin = 0;
735 if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;
736 }else{
737 iMin = 1;
738 }
739 if( argc>=2 ){
drhf9b596e2004-05-26 16:54:42 +0000740 iMax = sqlite3_value_int(argv[1]);
drh193a6b42002-07-07 16:52:46 +0000741 if( iMax<iMin ) iMax = iMin;
drh1dba7272004-01-16 13:58:18 +0000742 if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;
drh193a6b42002-07-07 16:52:46 +0000743 }else{
744 iMax = 50;
745 }
746 n = iMin;
747 if( iMax>iMin ){
danielk19774adee202004-05-08 08:23:19 +0000748 sqlite3Randomness(sizeof(r), &r);
drhbbd82df2004-02-11 09:46:30 +0000749 r &= 0x7fffffff;
drh193a6b42002-07-07 16:52:46 +0000750 n += r%(iMax + 1 - iMin);
751 }
drh1dba7272004-01-16 13:58:18 +0000752 assert( n<sizeof(zBuf) );
danielk19774adee202004-05-08 08:23:19 +0000753 sqlite3Randomness(n, zBuf);
drh193a6b42002-07-07 16:52:46 +0000754 for(i=0; i<n; i++){
drhbbd82df2004-02-11 09:46:30 +0000755 zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
drh193a6b42002-07-07 16:52:46 +0000756 }
757 zBuf[n] = 0;
drh2646da72005-12-09 20:02:05 +0000758 sqlite3_result_text(context, (char*)zBuf, n, SQLITE_TRANSIENT);
danielk1977d8123362004-06-12 09:25:12 +0000759}
drh0e3d7472004-06-19 17:33:07 +0000760#endif /* SQLITE_TEST */
danielk1977d8123362004-06-12 09:25:12 +0000761
drh0e3d7472004-06-19 17:33:07 +0000762#ifdef SQLITE_TEST
danielk1977d8123362004-06-12 09:25:12 +0000763/*
764** The following two SQL functions are used to test returning a text
765** result with a destructor. Function 'test_destructor' takes one argument
766** and returns the same argument interpreted as TEXT. A destructor is
767** passed with the sqlite3_result_text() call.
768**
769** SQL function 'test_destructor_count' returns the number of outstanding
770** allocations made by 'test_destructor';
771**
772** WARNING: Not threadsafe.
773*/
774static int test_destructor_count_var = 0;
775static void destructor(void *p){
776 char *zVal = (char *)p;
777 assert(zVal);
778 zVal--;
779 sqliteFree(zVal);
780 test_destructor_count_var--;
781}
782static void test_destructor(
783 sqlite3_context *pCtx,
784 int nArg,
785 sqlite3_value **argv
786){
787 char *zVal;
danielk1977f4618892004-06-28 13:09:11 +0000788 int len;
drh9bb575f2004-09-06 17:24:11 +0000789 sqlite3 *db = sqlite3_user_data(pCtx);
danielk1977f4618892004-06-28 13:09:11 +0000790
danielk1977d8123362004-06-12 09:25:12 +0000791 test_destructor_count_var++;
792 assert( nArg==1 );
793 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
danielk197714db2662006-01-09 16:12:04 +0000794 len = sqlite3ValueBytes(argv[0], ENC(db));
danielk1977f4618892004-06-28 13:09:11 +0000795 zVal = sqliteMalloc(len+3);
796 zVal[len] = 0;
797 zVal[len-1] = 0;
danielk1977d8123362004-06-12 09:25:12 +0000798 assert( zVal );
799 zVal++;
danielk197714db2662006-01-09 16:12:04 +0000800 memcpy(zVal, sqlite3ValueText(argv[0], ENC(db)), len);
801 if( ENC(db)==SQLITE_UTF8 ){
danielk1977f4618892004-06-28 13:09:11 +0000802 sqlite3_result_text(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +0000803#ifndef SQLITE_OMIT_UTF16
danielk197714db2662006-01-09 16:12:04 +0000804 }else if( ENC(db)==SQLITE_UTF16LE ){
danielk1977f4618892004-06-28 13:09:11 +0000805 sqlite3_result_text16le(pCtx, zVal, -1, destructor);
806 }else{
807 sqlite3_result_text16be(pCtx, zVal, -1, destructor);
drh6c626082004-11-14 21:56:29 +0000808#endif /* SQLITE_OMIT_UTF16 */
danielk1977f4618892004-06-28 13:09:11 +0000809 }
danielk1977d8123362004-06-12 09:25:12 +0000810}
811static void test_destructor_count(
812 sqlite3_context *pCtx,
813 int nArg,
814 sqlite3_value **argv
815){
816 sqlite3_result_int(pCtx, test_destructor_count_var);
drh193a6b42002-07-07 16:52:46 +0000817}
drh0e3d7472004-06-19 17:33:07 +0000818#endif /* SQLITE_TEST */
danielk19773f6b0872004-06-17 05:36:44 +0000819
drh0e3d7472004-06-19 17:33:07 +0000820#ifdef SQLITE_TEST
821/*
822** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()
823** interface.
824**
825** The test_auxdata() SQL function attempts to register each of its arguments
826** as auxiliary data. If there are no prior registrations of aux data for
827** that argument (meaning the argument is not a constant or this is its first
828** call) then the result for that argument is 0. If there is a prior
829** registration, the result for that argument is 1. The overall result
830** is the individual argument results separated by spaces.
831*/
danielk19773f6b0872004-06-17 05:36:44 +0000832static void free_test_auxdata(void *p) {sqliteFree(p);}
833static void test_auxdata(
834 sqlite3_context *pCtx,
835 int nArg,
836 sqlite3_value **argv
837){
838 int i;
839 char *zRet = sqliteMalloc(nArg*2);
840 if( !zRet ) return;
841 for(i=0; i<nArg; i++){
drh2646da72005-12-09 20:02:05 +0000842 char const *z = (char*)sqlite3_value_text(argv[i]);
danielk19773f6b0872004-06-17 05:36:44 +0000843 if( z ){
844 char *zAux = sqlite3_get_auxdata(pCtx, i);
845 if( zAux ){
846 zRet[i*2] = '1';
847 if( strcmp(zAux, z) ){
848 sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
849 return;
850 }
851 }else{
852 zRet[i*2] = '0';
853 zAux = sqliteStrDup(z);
854 sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
855 }
856 zRet[i*2+1] = ' ';
857 }
858 }
859 sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);
860}
drh0e3d7472004-06-19 17:33:07 +0000861#endif /* SQLITE_TEST */
drh193a6b42002-07-07 16:52:46 +0000862
danielk197701427a62005-01-11 13:02:33 +0000863#ifdef SQLITE_TEST
864/*
865** A function to test error reporting from user functions. This function
866** returns a copy of it's first argument as an error.
867*/
868static void test_error(
869 sqlite3_context *pCtx,
870 int nArg,
871 sqlite3_value **argv
872){
drh2646da72005-12-09 20:02:05 +0000873 sqlite3_result_error(pCtx, (char*)sqlite3_value_text(argv[0]), 0);
danielk197701427a62005-01-11 13:02:33 +0000874}
875#endif /* SQLITE_TEST */
876
drh0ac65892002-04-20 14:24:41 +0000877/*
drhd3a149e2002-02-24 17:12:53 +0000878** An instance of the following structure holds the context of a
drhdd5baa92002-02-27 19:50:59 +0000879** sum() or avg() aggregate computation.
880*/
881typedef struct SumCtx SumCtx;
882struct SumCtx {
drh8c08e862006-02-11 17:34:00 +0000883 double rSum; /* Floating point sum */
884 i64 iSum; /* Integer sum */
885 i64 cnt; /* Number of elements summed */
886 u8 overflow; /* True if integer overflow seen */
887 u8 approx; /* True if non-integer value was input to the sum */
drhdd5baa92002-02-27 19:50:59 +0000888};
889
890/*
drha97fdd32006-01-12 22:17:50 +0000891** Routines used to compute the sum, average, and total.
892**
893** The SUM() function follows the (broken) SQL standard which means
894** that it returns NULL if it sums over no inputs. TOTAL returns
895** 0.0 in that case. In addition, TOTAL always returns a float where
896** SUM might return an integer if it never encounters a floating point
drhc806d852006-05-11 13:25:39 +0000897** value. TOTAL never fails, but SUM might through an exception if
898** it overflows an integer.
drhdd5baa92002-02-27 19:50:59 +0000899*/
danielk19770ae8b832004-05-25 12:05:56 +0000900static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drhdd5baa92002-02-27 19:50:59 +0000901 SumCtx *p;
drh3d1d95e2005-09-08 10:37:01 +0000902 int type;
drh3f219f42005-09-08 19:45:57 +0000903 assert( argc==1 );
drh4f26d6c2004-05-26 23:25:30 +0000904 p = sqlite3_aggregate_context(context, sizeof(*p));
drh29d72102006-02-09 22:13:41 +0000905 type = sqlite3_value_numeric_type(argv[0]);
drh3d1d95e2005-09-08 10:37:01 +0000906 if( p && type!=SQLITE_NULL ){
drh739105c2002-05-29 23:22:23 +0000907 p->cnt++;
drh29d72102006-02-09 22:13:41 +0000908 if( type==SQLITE_INTEGER ){
drh8c08e862006-02-11 17:34:00 +0000909 i64 v = sqlite3_value_int64(argv[0]);
910 p->rSum += v;
911 if( (p->approx|p->overflow)==0 ){
912 i64 iNewSum = p->iSum + v;
913 int s1 = p->iSum >> (sizeof(i64)*8-1);
914 int s2 = v >> (sizeof(i64)*8-1);
915 int s3 = iNewSum >> (sizeof(i64)*8-1);
916 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3);
917 p->iSum = iNewSum;
drh29d72102006-02-09 22:13:41 +0000918 }
919 }else{
drh8c08e862006-02-11 17:34:00 +0000920 p->rSum += sqlite3_value_double(argv[0]);
drh29d72102006-02-09 22:13:41 +0000921 p->approx = 1;
drh3f219f42005-09-08 19:45:57 +0000922 }
drh739105c2002-05-29 23:22:23 +0000923 }
drhdd5baa92002-02-27 19:50:59 +0000924}
danielk19770ae8b832004-05-25 12:05:56 +0000925static void sumFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +0000926 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +0000927 p = sqlite3_aggregate_context(context, 0);
drhc2bd9132005-09-08 20:37:43 +0000928 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +0000929 if( p->overflow ){
930 sqlite3_result_error(context,"integer overflow",-1);
931 }else if( p->approx ){
932 sqlite3_result_double(context, p->rSum);
drhc2bd9132005-09-08 20:37:43 +0000933 }else{
drh8c08e862006-02-11 17:34:00 +0000934 sqlite3_result_int64(context, p->iSum);
drhc2bd9132005-09-08 20:37:43 +0000935 }
drh3d1d95e2005-09-08 10:37:01 +0000936 }
drhdd5baa92002-02-27 19:50:59 +0000937}
danielk19770ae8b832004-05-25 12:05:56 +0000938static void avgFinalize(sqlite3_context *context){
drhdd5baa92002-02-27 19:50:59 +0000939 SumCtx *p;
drhabfcea22005-09-06 20:36:48 +0000940 p = sqlite3_aggregate_context(context, 0);
drh739105c2002-05-29 23:22:23 +0000941 if( p && p->cnt>0 ){
drh8c08e862006-02-11 17:34:00 +0000942 sqlite3_result_double(context, p->rSum/(double)p->cnt);
drhdd5baa92002-02-27 19:50:59 +0000943 }
944}
drha97fdd32006-01-12 22:17:50 +0000945static void totalFinalize(sqlite3_context *context){
946 SumCtx *p;
947 p = sqlite3_aggregate_context(context, 0);
drh8c08e862006-02-11 17:34:00 +0000948 sqlite3_result_double(context, p ? p->rSum : 0.0);
drha97fdd32006-01-12 22:17:50 +0000949}
drhdd5baa92002-02-27 19:50:59 +0000950
951/*
drh0bce8352002-02-28 00:41:10 +0000952** The following structure keeps track of state information for the
953** count() aggregate function.
954*/
955typedef struct CountCtx CountCtx;
956struct CountCtx {
drhfc6ad392006-02-09 13:38:19 +0000957 i64 n;
drh0bce8352002-02-28 00:41:10 +0000958};
drhdd5baa92002-02-27 19:50:59 +0000959
drh0bce8352002-02-28 00:41:10 +0000960/*
961** Routines to implement the count() aggregate function.
962*/
danielk19770ae8b832004-05-25 12:05:56 +0000963static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
drh0bce8352002-02-28 00:41:10 +0000964 CountCtx *p;
drh4f26d6c2004-05-26 23:25:30 +0000965 p = sqlite3_aggregate_context(context, sizeof(*p));
drh9c054832004-05-31 18:51:57 +0000966 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
drh0bce8352002-02-28 00:41:10 +0000967 p->n++;
968 }
969}
danielk19770ae8b832004-05-25 12:05:56 +0000970static void countFinalize(sqlite3_context *context){
drh0bce8352002-02-28 00:41:10 +0000971 CountCtx *p;
drhabfcea22005-09-06 20:36:48 +0000972 p = sqlite3_aggregate_context(context, 0);
drhfc6ad392006-02-09 13:38:19 +0000973 sqlite3_result_int64(context, p ? p->n : 0);
drh0bce8352002-02-28 00:41:10 +0000974}
975
976/*
drh0bce8352002-02-28 00:41:10 +0000977** Routines to implement min() and max() aggregate functions.
978*/
danielk19770ae8b832004-05-25 12:05:56 +0000979static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){
danielk197788208052004-05-25 01:13:20 +0000980 Mem *pArg = (Mem *)argv[0];
drh9eb516c2004-07-18 20:52:32 +0000981 Mem *pBest;
982
983 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
984 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
danielk19773aeab9e2004-06-24 00:20:04 +0000985 if( !pBest ) return;
drh268380c2004-02-25 13:47:31 +0000986
danielk197788208052004-05-25 01:13:20 +0000987 if( pBest->flags ){
drh9eb516c2004-07-18 20:52:32 +0000988 int max;
989 int cmp;
danielk1977dc1bdc42004-06-11 10:51:27 +0000990 CollSeq *pColl = sqlite3GetFuncCollSeq(context);
danielk19777e18c252004-05-25 11:47:24 +0000991 /* This step function is used for both the min() and max() aggregates,
992 ** the only difference between the two being that the sense of the
993 ** comparison is inverted. For the max() aggregate, the
994 ** sqlite3_user_data() function returns (void *)-1. For min() it
995 ** returns (void *)db, where db is the sqlite3* database pointer.
996 ** Therefore the next statement sets variable 'max' to 1 for the max()
997 ** aggregate, or 0 for min().
998 */
danielk197788208052004-05-25 01:13:20 +0000999 max = ((sqlite3_user_data(context)==(void *)-1)?1:0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001000 cmp = sqlite3MemCompare(pBest, pArg, pColl);
danielk197788208052004-05-25 01:13:20 +00001001 if( (max && cmp<0) || (!max && cmp>0) ){
danielk19777e18c252004-05-25 11:47:24 +00001002 sqlite3VdbeMemCopy(pBest, pArg);
danielk197788208052004-05-25 01:13:20 +00001003 }
drh268380c2004-02-25 13:47:31 +00001004 }else{
danielk19777e18c252004-05-25 11:47:24 +00001005 sqlite3VdbeMemCopy(pBest, pArg);
drh0bce8352002-02-28 00:41:10 +00001006 }
1007}
danielk19770ae8b832004-05-25 12:05:56 +00001008static void minMaxFinalize(sqlite3_context *context){
danielk197788208052004-05-25 01:13:20 +00001009 sqlite3_value *pRes;
drhabfcea22005-09-06 20:36:48 +00001010 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
1011 if( pRes ){
1012 if( pRes->flags ){
1013 sqlite3_result_value(context, pRes);
1014 }
1015 sqlite3VdbeMemRelease(pRes);
drh0bce8352002-02-28 00:41:10 +00001016 }
1017}
drhdd5baa92002-02-27 19:50:59 +00001018
drh4e5ffc52004-08-31 00:52:37 +00001019
drhd3a149e2002-02-24 17:12:53 +00001020/*
drha2ed5602002-02-26 23:55:31 +00001021** This function registered all of the above C functions as SQL
1022** functions. This should be the only routine in this file with
1023** external linkage.
drhdc04c582002-02-24 01:55:15 +00001024*/
drh9bb575f2004-09-06 17:24:11 +00001025void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
drh57196282004-10-06 15:41:16 +00001026 static const struct {
drh0bce8352002-02-28 00:41:10 +00001027 char *zName;
drh268380c2004-02-25 13:47:31 +00001028 signed char nArg;
danielk1977f4618892004-06-28 13:09:11 +00001029 u8 argType; /* 0: none. 1: db 2: (-1) */
1030 u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */
danielk1977dc1bdc42004-06-11 10:51:27 +00001031 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001032 void (*xFunc)(sqlite3_context*,int,sqlite3_value **);
drh0bce8352002-02-28 00:41:10 +00001033 } aFuncs[] = {
danielk1977f4618892004-06-28 13:09:11 +00001034 { "min", -1, 0, SQLITE_UTF8, 1, minmaxFunc },
1035 { "min", 0, 0, SQLITE_UTF8, 1, 0 },
1036 { "max", -1, 2, SQLITE_UTF8, 1, minmaxFunc },
1037 { "max", 0, 2, SQLITE_UTF8, 1, 0 },
1038 { "typeof", 1, 0, SQLITE_UTF8, 0, typeofFunc },
1039 { "length", 1, 0, SQLITE_UTF8, 0, lengthFunc },
1040 { "substr", 3, 0, SQLITE_UTF8, 0, substrFunc },
drh6c626082004-11-14 21:56:29 +00001041#ifndef SQLITE_OMIT_UTF16
danielk1977f4618892004-06-28 13:09:11 +00001042 { "substr", 3, 0, SQLITE_UTF16LE, 0, sqlite3utf16Substr },
drh6c626082004-11-14 21:56:29 +00001043#endif
danielk1977f4618892004-06-28 13:09:11 +00001044 { "abs", 1, 0, SQLITE_UTF8, 0, absFunc },
1045 { "round", 1, 0, SQLITE_UTF8, 0, roundFunc },
1046 { "round", 2, 0, SQLITE_UTF8, 0, roundFunc },
1047 { "upper", 1, 0, SQLITE_UTF8, 0, upperFunc },
1048 { "lower", 1, 0, SQLITE_UTF8, 0, lowerFunc },
1049 { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc },
1050 { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 },
1051 { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 },
1052 { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc },
1053 { "random", -1, 0, SQLITE_UTF8, 0, randomFunc },
drh63cf66f2007-01-29 15:50:05 +00001054 { "randomhex", 1, 0, SQLITE_UTF8, 0, randomHex },
drh94a98362004-09-13 13:13:18 +00001055 { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc },
danielk1977f4618892004-06-28 13:09:11 +00001056 { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc},
1057 { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc },
1058 { "last_insert_rowid", 0, 1, SQLITE_UTF8, 0, last_insert_rowid },
1059 { "changes", 0, 1, SQLITE_UTF8, 0, changes },
1060 { "total_changes", 0, 1, SQLITE_UTF8, 0, total_changes },
drhd24cc422003-03-27 12:51:24 +00001061#ifdef SQLITE_SOUNDEX
danielk1977f4618892004-06-28 13:09:11 +00001062 { "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
drhd24cc422003-03-27 12:51:24 +00001063#endif
drhfdb83b22006-06-17 14:12:47 +00001064#ifndef SQLITE_OMIT_LOAD_EXTENSION
1065 { "load_extension", 1, 1, SQLITE_UTF8, 0, loadExt },
1066 { "load_extension", 2, 1, SQLITE_UTF8, 0, loadExt },
1067#endif
drh193a6b42002-07-07 16:52:46 +00001068#ifdef SQLITE_TEST
danielk1977f4618892004-06-28 13:09:11 +00001069 { "randstr", 2, 0, SQLITE_UTF8, 0, randStr },
1070 { "test_destructor", 1, 1, SQLITE_UTF8, 0, test_destructor},
danielk1977d8123362004-06-12 09:25:12 +00001071 { "test_destructor_count", 0, 0, SQLITE_UTF8, 0, test_destructor_count},
danielk1977f4618892004-06-28 13:09:11 +00001072 { "test_auxdata", -1, 0, SQLITE_UTF8, 0, test_auxdata},
danielk197701427a62005-01-11 13:02:33 +00001073 { "test_error", 1, 0, SQLITE_UTF8, 0, test_error},
drh193a6b42002-07-07 16:52:46 +00001074#endif
drh0bce8352002-02-28 00:41:10 +00001075 };
drh57196282004-10-06 15:41:16 +00001076 static const struct {
drh0bce8352002-02-28 00:41:10 +00001077 char *zName;
drh268380c2004-02-25 13:47:31 +00001078 signed char nArg;
drh268380c2004-02-25 13:47:31 +00001079 u8 argType;
danielk1977dc1bdc42004-06-11 10:51:27 +00001080 u8 needCollSeq;
danielk19770ae8b832004-05-25 12:05:56 +00001081 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
1082 void (*xFinalize)(sqlite3_context*);
drh0bce8352002-02-28 00:41:10 +00001083 } aAggs[] = {
danielk1977dc1bdc42004-06-11 10:51:27 +00001084 { "min", 1, 0, 1, minmaxStep, minMaxFinalize },
1085 { "max", 1, 2, 1, minmaxStep, minMaxFinalize },
1086 { "sum", 1, 0, 0, sumStep, sumFinalize },
drha97fdd32006-01-12 22:17:50 +00001087 { "total", 1, 0, 0, sumStep, totalFinalize },
danielk1977dc1bdc42004-06-11 10:51:27 +00001088 { "avg", 1, 0, 0, sumStep, avgFinalize },
1089 { "count", 0, 0, 0, countStep, countFinalize },
1090 { "count", 1, 0, 0, countStep, countFinalize },
drh0bce8352002-02-28 00:41:10 +00001091 };
1092 int i;
1093
1094 for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
danielk1977c572ef72004-05-27 09:28:41 +00001095 void *pArg = 0;
1096 switch( aFuncs[i].argType ){
1097 case 1: pArg = db; break;
1098 case 2: pArg = (void *)(-1); break;
1099 }
danielk1977771151b2006-01-17 13:21:40 +00001100 sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
danielk1977f9d64d22004-06-19 08:18:07 +00001101 aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001102 if( aFuncs[i].needCollSeq ){
1103 FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
1104 strlen(aFuncs[i].zName), aFuncs[i].nArg, aFuncs[i].eTextRep, 0);
1105 if( pFunc && aFuncs[i].needCollSeq ){
1106 pFunc->needCollSeq = 1;
1107 }
1108 }
drh0bce8352002-02-28 00:41:10 +00001109 }
drh1f01ec12005-02-15 21:36:18 +00001110#ifndef SQLITE_OMIT_ALTERTABLE
1111 sqlite3AlterFunctions(db);
1112#endif
drh198bf392006-01-06 21:52:49 +00001113#ifndef SQLITE_OMIT_PARSER
danielk1977f744bb52005-12-06 17:19:11 +00001114 sqlite3AttachFunctions(db);
drh198bf392006-01-06 21:52:49 +00001115#endif
drh0bce8352002-02-28 00:41:10 +00001116 for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){
danielk1977c572ef72004-05-27 09:28:41 +00001117 void *pArg = 0;
1118 switch( aAggs[i].argType ){
1119 case 1: pArg = db; break;
1120 case 2: pArg = (void *)(-1); break;
1121 }
danielk1977771151b2006-01-17 13:21:40 +00001122 sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
danielk1977f9d64d22004-06-19 08:18:07 +00001123 pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
danielk1977dc1bdc42004-06-11 10:51:27 +00001124 if( aAggs[i].needCollSeq ){
1125 FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
danielk1977d8123362004-06-12 09:25:12 +00001126 strlen(aAggs[i].zName), aAggs[i].nArg, SQLITE_UTF8, 0);
danielk1977dc1bdc42004-06-11 10:51:27 +00001127 if( pFunc && aAggs[i].needCollSeq ){
1128 pFunc->needCollSeq = 1;
1129 }
1130 }
drh268380c2004-02-25 13:47:31 +00001131 }
danielk19774adee202004-05-08 08:23:19 +00001132 sqlite3RegisterDateTimeFunctions(db);
drhb7481e72006-09-16 21:45:14 +00001133 sqlite3_overload_function(db, "MATCH", 2);
danielk1977fd9e1f32005-05-22 10:44:34 +00001134#ifdef SQLITE_SSE
drh37527852006-03-16 16:19:56 +00001135 (void)sqlite3SseFunctions(db);
danielk1977fd9e1f32005-05-22 10:44:34 +00001136#endif
drh55ef4d92005-08-14 01:20:37 +00001137#ifdef SQLITE_CASE_SENSITIVE_LIKE
1138 sqlite3RegisterLikeFunctions(db, 1);
1139#else
1140 sqlite3RegisterLikeFunctions(db, 0);
1141#endif
1142}
1143
1144/*
1145** Set the LIKEOPT flag on the 2-argument function with the given name.
1146*/
drhd64fe2f2005-08-28 17:00:23 +00001147static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){
drh55ef4d92005-08-14 01:20:37 +00001148 FuncDef *pDef;
1149 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0);
1150 if( pDef ){
drhd64fe2f2005-08-28 17:00:23 +00001151 pDef->flags = flagVal;
drh55ef4d92005-08-14 01:20:37 +00001152 }
1153}
1154
1155/*
1156** Register the built-in LIKE and GLOB functions. The caseSensitive
1157** parameter determines whether or not the LIKE operator is case
1158** sensitive. GLOB is always case sensitive.
1159*/
1160void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
1161 struct compareInfo *pInfo;
1162 if( caseSensitive ){
1163 pInfo = (struct compareInfo*)&likeInfoAlt;
1164 }else{
1165 pInfo = (struct compareInfo*)&likeInfoNorm;
1166 }
danielk1977771151b2006-01-17 13:21:40 +00001167 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1168 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
1169 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
drh55ef4d92005-08-14 01:20:37 +00001170 (struct compareInfo*)&globInfo, likeFunc, 0,0);
drhd64fe2f2005-08-28 17:00:23 +00001171 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
1172 setLikeOptFlag(db, "like",
1173 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
drh55ef4d92005-08-14 01:20:37 +00001174}
1175
1176/*
1177** pExpr points to an expression which implements a function. If
1178** it is appropriate to apply the LIKE optimization to that function
1179** then set aWc[0] through aWc[2] to the wildcard characters and
1180** return TRUE. If the function is not a LIKE-style function then
1181** return FALSE.
1182*/
drhd64fe2f2005-08-28 17:00:23 +00001183int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
drh55ef4d92005-08-14 01:20:37 +00001184 FuncDef *pDef;
1185 if( pExpr->op!=TK_FUNCTION ){
1186 return 0;
1187 }
1188 if( pExpr->pList->nExpr!=2 ){
1189 return 0;
1190 }
drh2646da72005-12-09 20:02:05 +00001191 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2,
drh55ef4d92005-08-14 01:20:37 +00001192 SQLITE_UTF8, 0);
drhd64fe2f2005-08-28 17:00:23 +00001193 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
drh55ef4d92005-08-14 01:20:37 +00001194 return 0;
1195 }
1196
1197 /* The memcpy() statement assumes that the wildcard characters are
1198 ** the first three statements in the compareInfo structure. The
1199 ** asserts() that follow verify that assumption
1200 */
1201 memcpy(aWc, pDef->pUserData, 3);
1202 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
1203 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
1204 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
drhd64fe2f2005-08-28 17:00:23 +00001205 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
drh55ef4d92005-08-14 01:20:37 +00001206 return 1;
drhdc04c582002-02-24 01:55:15 +00001207}