|
1 /* |
|
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 ** |
|
19 ** $Id: func.c,v 1.203 2008/09/03 17:11:16 drh Exp $ |
|
20 */ |
|
21 #include "sqliteInt.h" |
|
22 #include <ctype.h> |
|
23 #include <stdlib.h> |
|
24 #include <assert.h> |
|
25 #include "vdbeInt.h" |
|
26 |
|
27 /* |
|
28 ** Return the collating function associated with a function. |
|
29 */ |
|
30 static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){ |
|
31 return context->pColl; |
|
32 } |
|
33 |
|
34 /* |
|
35 ** Implementation of the non-aggregate min() and max() functions |
|
36 */ |
|
37 static void minmaxFunc( |
|
38 sqlite3_context *context, |
|
39 int argc, |
|
40 sqlite3_value **argv |
|
41 ){ |
|
42 int i; |
|
43 int mask; /* 0 for min() or 0xffffffff for max() */ |
|
44 int iBest; |
|
45 CollSeq *pColl; |
|
46 |
|
47 if( argc==0 ) return; |
|
48 mask = sqlite3_user_data(context)==0 ? 0 : -1; |
|
49 pColl = sqlite3GetFuncCollSeq(context); |
|
50 assert( pColl ); |
|
51 assert( mask==-1 || mask==0 ); |
|
52 iBest = 0; |
|
53 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; |
|
54 for(i=1; i<argc; i++){ |
|
55 if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return; |
|
56 if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){ |
|
57 iBest = i; |
|
58 } |
|
59 } |
|
60 sqlite3_result_value(context, argv[iBest]); |
|
61 } |
|
62 |
|
63 /* |
|
64 ** Return the type of the argument. |
|
65 */ |
|
66 static void typeofFunc( |
|
67 sqlite3_context *context, |
|
68 int argc, |
|
69 sqlite3_value **argv |
|
70 ){ |
|
71 const char *z = 0; |
|
72 switch( sqlite3_value_type(argv[0]) ){ |
|
73 case SQLITE_NULL: z = "null"; break; |
|
74 case SQLITE_INTEGER: z = "integer"; break; |
|
75 case SQLITE_TEXT: z = "text"; break; |
|
76 case SQLITE_FLOAT: z = "real"; break; |
|
77 case SQLITE_BLOB: z = "blob"; break; |
|
78 } |
|
79 sqlite3_result_text(context, z, -1, SQLITE_STATIC); |
|
80 } |
|
81 |
|
82 |
|
83 /* |
|
84 ** Implementation of the length() function |
|
85 */ |
|
86 static void lengthFunc( |
|
87 sqlite3_context *context, |
|
88 int argc, |
|
89 sqlite3_value **argv |
|
90 ){ |
|
91 int len; |
|
92 |
|
93 assert( argc==1 ); |
|
94 switch( sqlite3_value_type(argv[0]) ){ |
|
95 case SQLITE_BLOB: |
|
96 case SQLITE_INTEGER: |
|
97 case SQLITE_FLOAT: { |
|
98 sqlite3_result_int(context, sqlite3_value_bytes(argv[0])); |
|
99 break; |
|
100 } |
|
101 case SQLITE_TEXT: { |
|
102 const unsigned char *z = sqlite3_value_text(argv[0]); |
|
103 if( z==0 ) return; |
|
104 len = 0; |
|
105 while( *z ){ |
|
106 len++; |
|
107 SQLITE_SKIP_UTF8(z); |
|
108 } |
|
109 sqlite3_result_int(context, len); |
|
110 break; |
|
111 } |
|
112 default: { |
|
113 sqlite3_result_null(context); |
|
114 break; |
|
115 } |
|
116 } |
|
117 } |
|
118 |
|
119 /* |
|
120 ** Implementation of the abs() function |
|
121 */ |
|
122 static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ |
|
123 assert( argc==1 ); |
|
124 switch( sqlite3_value_type(argv[0]) ){ |
|
125 case SQLITE_INTEGER: { |
|
126 i64 iVal = sqlite3_value_int64(argv[0]); |
|
127 if( iVal<0 ){ |
|
128 if( (iVal<<1)==0 ){ |
|
129 sqlite3_result_error(context, "integer overflow", -1); |
|
130 return; |
|
131 } |
|
132 iVal = -iVal; |
|
133 } |
|
134 sqlite3_result_int64(context, iVal); |
|
135 break; |
|
136 } |
|
137 case SQLITE_NULL: { |
|
138 sqlite3_result_null(context); |
|
139 break; |
|
140 } |
|
141 default: { |
|
142 double rVal = sqlite3_value_double(argv[0]); |
|
143 if( rVal<0 ) rVal = -rVal; |
|
144 sqlite3_result_double(context, rVal); |
|
145 break; |
|
146 } |
|
147 } |
|
148 } |
|
149 |
|
150 /* |
|
151 ** Implementation of the substr() function. |
|
152 ** |
|
153 ** substr(x,p1,p2) returns p2 characters of x[] beginning with p1. |
|
154 ** p1 is 1-indexed. So substr(x,1,1) returns the first character |
|
155 ** of x. If x is text, then we actually count UTF-8 characters. |
|
156 ** If x is a blob, then we count bytes. |
|
157 ** |
|
158 ** If p1 is negative, then we begin abs(p1) from the end of x[]. |
|
159 */ |
|
160 static void substrFunc( |
|
161 sqlite3_context *context, |
|
162 int argc, |
|
163 sqlite3_value **argv |
|
164 ){ |
|
165 const unsigned char *z; |
|
166 const unsigned char *z2; |
|
167 int len; |
|
168 int p0type; |
|
169 i64 p1, p2; |
|
170 |
|
171 assert( argc==3 || argc==2 ); |
|
172 p0type = sqlite3_value_type(argv[0]); |
|
173 if( p0type==SQLITE_BLOB ){ |
|
174 len = sqlite3_value_bytes(argv[0]); |
|
175 z = sqlite3_value_blob(argv[0]); |
|
176 if( z==0 ) return; |
|
177 assert( len==sqlite3_value_bytes(argv[0]) ); |
|
178 }else{ |
|
179 z = sqlite3_value_text(argv[0]); |
|
180 if( z==0 ) return; |
|
181 len = 0; |
|
182 for(z2=z; *z2; len++){ |
|
183 SQLITE_SKIP_UTF8(z2); |
|
184 } |
|
185 } |
|
186 p1 = sqlite3_value_int(argv[1]); |
|
187 if( argc==3 ){ |
|
188 p2 = sqlite3_value_int(argv[2]); |
|
189 }else{ |
|
190 p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH]; |
|
191 } |
|
192 if( p1<0 ){ |
|
193 p1 += len; |
|
194 if( p1<0 ){ |
|
195 p2 += p1; |
|
196 p1 = 0; |
|
197 } |
|
198 }else if( p1>0 ){ |
|
199 p1--; |
|
200 } |
|
201 if( p1+p2>len ){ |
|
202 p2 = len-p1; |
|
203 } |
|
204 if( p0type!=SQLITE_BLOB ){ |
|
205 while( *z && p1 ){ |
|
206 SQLITE_SKIP_UTF8(z); |
|
207 p1--; |
|
208 } |
|
209 for(z2=z; *z2 && p2; p2--){ |
|
210 SQLITE_SKIP_UTF8(z2); |
|
211 } |
|
212 sqlite3_result_text(context, (char*)z, z2-z, SQLITE_TRANSIENT); |
|
213 }else{ |
|
214 if( p2<0 ) p2 = 0; |
|
215 sqlite3_result_blob(context, (char*)&z[p1], p2, SQLITE_TRANSIENT); |
|
216 } |
|
217 } |
|
218 |
|
219 /* |
|
220 ** Implementation of the round() function |
|
221 */ |
|
222 static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ |
|
223 int n = 0; |
|
224 double r; |
|
225 char zBuf[500]; /* larger than the %f representation of the largest double */ |
|
226 assert( argc==1 || argc==2 ); |
|
227 if( argc==2 ){ |
|
228 if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return; |
|
229 n = sqlite3_value_int(argv[1]); |
|
230 if( n>30 ) n = 30; |
|
231 if( n<0 ) n = 0; |
|
232 } |
|
233 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; |
|
234 r = sqlite3_value_double(argv[0]); |
|
235 sqlite3_snprintf(sizeof(zBuf),zBuf,"%.*f",n,r); |
|
236 sqlite3AtoF(zBuf, &r); |
|
237 sqlite3_result_double(context, r); |
|
238 } |
|
239 |
|
240 /* |
|
241 ** Allocate nByte bytes of space using sqlite3_malloc(). If the |
|
242 ** allocation fails, call sqlite3_result_error_nomem() to notify |
|
243 ** the database handle that malloc() has failed. |
|
244 */ |
|
245 static void *contextMalloc(sqlite3_context *context, i64 nByte){ |
|
246 char *z; |
|
247 if( nByte>sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH] ){ |
|
248 sqlite3_result_error_toobig(context); |
|
249 z = 0; |
|
250 }else{ |
|
251 z = sqlite3Malloc(nByte); |
|
252 if( !z && nByte>0 ){ |
|
253 sqlite3_result_error_nomem(context); |
|
254 } |
|
255 } |
|
256 return z; |
|
257 } |
|
258 |
|
259 /* |
|
260 ** Implementation of the upper() and lower() SQL functions. |
|
261 */ |
|
262 static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ |
|
263 char *z1; |
|
264 const char *z2; |
|
265 int i, n; |
|
266 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return; |
|
267 z2 = (char*)sqlite3_value_text(argv[0]); |
|
268 n = sqlite3_value_bytes(argv[0]); |
|
269 /* Verify that the call to _bytes() does not invalidate the _text() pointer */ |
|
270 assert( z2==(char*)sqlite3_value_text(argv[0]) ); |
|
271 if( z2 ){ |
|
272 z1 = contextMalloc(context, ((i64)n)+1); |
|
273 if( z1 ){ |
|
274 memcpy(z1, z2, n+1); |
|
275 for(i=0; z1[i]; i++){ |
|
276 z1[i] = toupper(z1[i]); |
|
277 } |
|
278 sqlite3_result_text(context, z1, -1, sqlite3_free); |
|
279 } |
|
280 } |
|
281 } |
|
282 static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ |
|
283 char *z1; |
|
284 const char *z2; |
|
285 int i, n; |
|
286 if( argc<1 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) return; |
|
287 z2 = (char*)sqlite3_value_text(argv[0]); |
|
288 n = sqlite3_value_bytes(argv[0]); |
|
289 /* Verify that the call to _bytes() does not invalidate the _text() pointer */ |
|
290 assert( z2==(char*)sqlite3_value_text(argv[0]) ); |
|
291 if( z2 ){ |
|
292 z1 = contextMalloc(context, ((i64)n)+1); |
|
293 if( z1 ){ |
|
294 memcpy(z1, z2, n+1); |
|
295 for(i=0; z1[i]; i++){ |
|
296 z1[i] = tolower(z1[i]); |
|
297 } |
|
298 sqlite3_result_text(context, z1, -1, sqlite3_free); |
|
299 } |
|
300 } |
|
301 } |
|
302 |
|
303 /* |
|
304 ** Implementation of the IFNULL(), NVL(), and COALESCE() functions. |
|
305 ** All three do the same thing. They return the first non-NULL |
|
306 ** argument. |
|
307 */ |
|
308 static void ifnullFunc( |
|
309 sqlite3_context *context, |
|
310 int argc, |
|
311 sqlite3_value **argv |
|
312 ){ |
|
313 int i; |
|
314 for(i=0; i<argc; i++){ |
|
315 if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){ |
|
316 sqlite3_result_value(context, argv[i]); |
|
317 break; |
|
318 } |
|
319 } |
|
320 } |
|
321 |
|
322 /* |
|
323 ** Implementation of random(). Return a random integer. |
|
324 */ |
|
325 static void randomFunc( |
|
326 sqlite3_context *context, |
|
327 int argc, |
|
328 sqlite3_value **argv |
|
329 ){ |
|
330 sqlite_int64 r; |
|
331 sqlite3_randomness(sizeof(r), &r); |
|
332 if( (r<<1)==0 ) r = 0; /* Prevent 0x8000.... as the result so that we */ |
|
333 /* can always do abs() of the result */ |
|
334 sqlite3_result_int64(context, r); |
|
335 } |
|
336 |
|
337 /* |
|
338 ** Implementation of randomblob(N). Return a random blob |
|
339 ** that is N bytes long. |
|
340 */ |
|
341 static void randomBlob( |
|
342 sqlite3_context *context, |
|
343 int argc, |
|
344 sqlite3_value **argv |
|
345 ){ |
|
346 int n; |
|
347 unsigned char *p; |
|
348 assert( argc==1 ); |
|
349 n = sqlite3_value_int(argv[0]); |
|
350 if( n<1 ){ |
|
351 n = 1; |
|
352 } |
|
353 p = contextMalloc(context, n); |
|
354 if( p ){ |
|
355 sqlite3_randomness(n, p); |
|
356 sqlite3_result_blob(context, (char*)p, n, sqlite3_free); |
|
357 } |
|
358 } |
|
359 |
|
360 /* |
|
361 ** Implementation of the last_insert_rowid() SQL function. The return |
|
362 ** value is the same as the sqlite3_last_insert_rowid() API function. |
|
363 */ |
|
364 static void last_insert_rowid( |
|
365 sqlite3_context *context, |
|
366 int arg, |
|
367 sqlite3_value **argv |
|
368 ){ |
|
369 sqlite3 *db = sqlite3_context_db_handle(context); |
|
370 sqlite3_result_int64(context, sqlite3_last_insert_rowid(db)); |
|
371 } |
|
372 |
|
373 /* |
|
374 ** Implementation of the changes() SQL function. The return value is the |
|
375 ** same as the sqlite3_changes() API function. |
|
376 */ |
|
377 static void changes( |
|
378 sqlite3_context *context, |
|
379 int arg, |
|
380 sqlite3_value **argv |
|
381 ){ |
|
382 sqlite3 *db = sqlite3_context_db_handle(context); |
|
383 sqlite3_result_int(context, sqlite3_changes(db)); |
|
384 } |
|
385 |
|
386 /* |
|
387 ** Implementation of the total_changes() SQL function. The return value is |
|
388 ** the same as the sqlite3_total_changes() API function. |
|
389 */ |
|
390 static void total_changes( |
|
391 sqlite3_context *context, |
|
392 int arg, |
|
393 sqlite3_value **argv |
|
394 ){ |
|
395 sqlite3 *db = sqlite3_context_db_handle(context); |
|
396 sqlite3_result_int(context, sqlite3_total_changes(db)); |
|
397 } |
|
398 |
|
399 /* |
|
400 ** A structure defining how to do GLOB-style comparisons. |
|
401 */ |
|
402 struct compareInfo { |
|
403 u8 matchAll; |
|
404 u8 matchOne; |
|
405 u8 matchSet; |
|
406 u8 noCase; |
|
407 }; |
|
408 |
|
409 /* |
|
410 ** For LIKE and GLOB matching on EBCDIC machines, assume that every |
|
411 ** character is exactly one byte in size. Also, all characters are |
|
412 ** able to participate in upper-case-to-lower-case mappings in EBCDIC |
|
413 ** whereas only characters less than 0x80 do in ASCII. |
|
414 */ |
|
415 #if defined(SQLITE_EBCDIC) |
|
416 # define sqlite3Utf8Read(A,B,C) (*(A++)) |
|
417 # define GlogUpperToLower(A) A = sqlite3UpperToLower[A] |
|
418 #else |
|
419 # define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; } |
|
420 #endif |
|
421 |
|
422 static const struct compareInfo globInfo = { '*', '?', '[', 0 }; |
|
423 /* The correct SQL-92 behavior is for the LIKE operator to ignore |
|
424 ** case. Thus 'a' LIKE 'A' would be true. */ |
|
425 static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 }; |
|
426 /* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator |
|
427 ** is case sensitive causing 'a' LIKE 'A' to be false */ |
|
428 static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 }; |
|
429 |
|
430 /* |
|
431 ** Compare two UTF-8 strings for equality where the first string can |
|
432 ** potentially be a "glob" expression. Return true (1) if they |
|
433 ** are the same and false (0) if they are different. |
|
434 ** |
|
435 ** Globbing rules: |
|
436 ** |
|
437 ** '*' Matches any sequence of zero or more characters. |
|
438 ** |
|
439 ** '?' Matches exactly one character. |
|
440 ** |
|
441 ** [...] Matches one character from the enclosed list of |
|
442 ** characters. |
|
443 ** |
|
444 ** [^...] Matches one character not in the enclosed list. |
|
445 ** |
|
446 ** With the [...] and [^...] matching, a ']' character can be included |
|
447 ** in the list by making it the first character after '[' or '^'. A |
|
448 ** range of characters can be specified using '-'. Example: |
|
449 ** "[a-z]" matches any single lower-case letter. To match a '-', make |
|
450 ** it the last character in the list. |
|
451 ** |
|
452 ** This routine is usually quick, but can be N**2 in the worst case. |
|
453 ** |
|
454 ** Hints: to match '*' or '?', put them in "[]". Like this: |
|
455 ** |
|
456 ** abc[*]xyz Matches "abc*xyz" only |
|
457 */ |
|
458 static int patternCompare( |
|
459 const u8 *zPattern, /* The glob pattern */ |
|
460 const u8 *zString, /* The string to compare against the glob */ |
|
461 const struct compareInfo *pInfo, /* Information about how to do the compare */ |
|
462 const int esc /* The escape character */ |
|
463 ){ |
|
464 int c, c2; |
|
465 int invert; |
|
466 int seen; |
|
467 u8 matchOne = pInfo->matchOne; |
|
468 u8 matchAll = pInfo->matchAll; |
|
469 u8 matchSet = pInfo->matchSet; |
|
470 u8 noCase = pInfo->noCase; |
|
471 int prevEscape = 0; /* True if the previous character was 'escape' */ |
|
472 |
|
473 while( (c = sqlite3Utf8Read(zPattern,0,&zPattern))!=0 ){ |
|
474 if( !prevEscape && c==matchAll ){ |
|
475 while( (c=sqlite3Utf8Read(zPattern,0,&zPattern)) == matchAll |
|
476 || c == matchOne ){ |
|
477 if( c==matchOne && sqlite3Utf8Read(zString, 0, &zString)==0 ){ |
|
478 return 0; |
|
479 } |
|
480 } |
|
481 if( c==0 ){ |
|
482 return 1; |
|
483 }else if( c==esc ){ |
|
484 c = sqlite3Utf8Read(zPattern, 0, &zPattern); |
|
485 if( c==0 ){ |
|
486 return 0; |
|
487 } |
|
488 }else if( c==matchSet ){ |
|
489 assert( esc==0 ); /* This is GLOB, not LIKE */ |
|
490 assert( matchSet<0x80 ); /* '[' is a single-byte character */ |
|
491 while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){ |
|
492 SQLITE_SKIP_UTF8(zString); |
|
493 } |
|
494 return *zString!=0; |
|
495 } |
|
496 while( (c2 = sqlite3Utf8Read(zString,0,&zString))!=0 ){ |
|
497 if( noCase ){ |
|
498 GlogUpperToLower(c2); |
|
499 GlogUpperToLower(c); |
|
500 while( c2 != 0 && c2 != c ){ |
|
501 c2 = sqlite3Utf8Read(zString, 0, &zString); |
|
502 GlogUpperToLower(c2); |
|
503 } |
|
504 }else{ |
|
505 while( c2 != 0 && c2 != c ){ |
|
506 c2 = sqlite3Utf8Read(zString, 0, &zString); |
|
507 } |
|
508 } |
|
509 if( c2==0 ) return 0; |
|
510 if( patternCompare(zPattern,zString,pInfo,esc) ) return 1; |
|
511 } |
|
512 return 0; |
|
513 }else if( !prevEscape && c==matchOne ){ |
|
514 if( sqlite3Utf8Read(zString, 0, &zString)==0 ){ |
|
515 return 0; |
|
516 } |
|
517 }else if( c==matchSet ){ |
|
518 int prior_c = 0; |
|
519 assert( esc==0 ); /* This only occurs for GLOB, not LIKE */ |
|
520 seen = 0; |
|
521 invert = 0; |
|
522 c = sqlite3Utf8Read(zString, 0, &zString); |
|
523 if( c==0 ) return 0; |
|
524 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); |
|
525 if( c2=='^' ){ |
|
526 invert = 1; |
|
527 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); |
|
528 } |
|
529 if( c2==']' ){ |
|
530 if( c==']' ) seen = 1; |
|
531 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); |
|
532 } |
|
533 while( c2 && c2!=']' ){ |
|
534 if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){ |
|
535 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); |
|
536 if( c>=prior_c && c<=c2 ) seen = 1; |
|
537 prior_c = 0; |
|
538 }else{ |
|
539 if( c==c2 ){ |
|
540 seen = 1; |
|
541 } |
|
542 prior_c = c2; |
|
543 } |
|
544 c2 = sqlite3Utf8Read(zPattern, 0, &zPattern); |
|
545 } |
|
546 if( c2==0 || (seen ^ invert)==0 ){ |
|
547 return 0; |
|
548 } |
|
549 }else if( esc==c && !prevEscape ){ |
|
550 prevEscape = 1; |
|
551 }else{ |
|
552 c2 = sqlite3Utf8Read(zString, 0, &zString); |
|
553 if( noCase ){ |
|
554 GlogUpperToLower(c); |
|
555 GlogUpperToLower(c2); |
|
556 } |
|
557 if( c!=c2 ){ |
|
558 return 0; |
|
559 } |
|
560 prevEscape = 0; |
|
561 } |
|
562 } |
|
563 return *zString==0; |
|
564 } |
|
565 |
|
566 /* |
|
567 ** Count the number of times that the LIKE operator (or GLOB which is |
|
568 ** just a variation of LIKE) gets called. This is used for testing |
|
569 ** only. |
|
570 */ |
|
571 #ifdef SQLITE_TEST |
|
572 int sqlite3_like_count = 0; |
|
573 #endif |
|
574 |
|
575 |
|
576 /* |
|
577 ** Implementation of the like() SQL function. This function implements |
|
578 ** the build-in LIKE operator. The first argument to the function is the |
|
579 ** pattern and the second argument is the string. So, the SQL statements: |
|
580 ** |
|
581 ** A LIKE B |
|
582 ** |
|
583 ** is implemented as like(B,A). |
|
584 ** |
|
585 ** This same function (with a different compareInfo structure) computes |
|
586 ** the GLOB operator. |
|
587 */ |
|
588 void likeFunc( |
|
589 sqlite3_context *context, |
|
590 int argc, |
|
591 sqlite3_value **argv |
|
592 ){ |
|
593 const unsigned char *zA, *zB; |
|
594 int escape = 0; |
|
595 sqlite3 *db = sqlite3_context_db_handle(context); |
|
596 |
|
597 zB = sqlite3_value_text(argv[0]); |
|
598 zA = sqlite3_value_text(argv[1]); |
|
599 |
|
600 /* Limit the length of the LIKE or GLOB pattern to avoid problems |
|
601 ** of deep recursion and N*N behavior in patternCompare(). |
|
602 */ |
|
603 if( sqlite3_value_bytes(argv[0]) > |
|
604 db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){ |
|
605 sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1); |
|
606 return; |
|
607 } |
|
608 assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */ |
|
609 |
|
610 if( argc==3 ){ |
|
611 /* The escape character string must consist of a single UTF-8 character. |
|
612 ** Otherwise, return an error. |
|
613 */ |
|
614 const unsigned char *zEsc = sqlite3_value_text(argv[2]); |
|
615 if( zEsc==0 ) return; |
|
616 if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){ |
|
617 sqlite3_result_error(context, |
|
618 "ESCAPE expression must be a single character", -1); |
|
619 return; |
|
620 } |
|
621 escape = sqlite3Utf8Read(zEsc, 0, &zEsc); |
|
622 } |
|
623 if( zA && zB ){ |
|
624 struct compareInfo *pInfo = sqlite3_user_data(context); |
|
625 #ifdef SQLITE_TEST |
|
626 sqlite3_like_count++; |
|
627 #endif |
|
628 |
|
629 sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape)); |
|
630 } |
|
631 } |
|
632 |
|
633 /* |
|
634 ** Implementation of the NULLIF(x,y) function. The result is the first |
|
635 ** argument if the arguments are different. The result is NULL if the |
|
636 ** arguments are equal to each other. |
|
637 */ |
|
638 static void nullifFunc( |
|
639 sqlite3_context *context, |
|
640 int argc, |
|
641 sqlite3_value **argv |
|
642 ){ |
|
643 CollSeq *pColl = sqlite3GetFuncCollSeq(context); |
|
644 if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){ |
|
645 sqlite3_result_value(context, argv[0]); |
|
646 } |
|
647 } |
|
648 |
|
649 /* |
|
650 ** Implementation of the VERSION(*) function. The result is the version |
|
651 ** of the SQLite library that is running. |
|
652 */ |
|
653 static void versionFunc( |
|
654 sqlite3_context *context, |
|
655 int argc, |
|
656 sqlite3_value **argv |
|
657 ){ |
|
658 sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC); |
|
659 } |
|
660 |
|
661 /* Array for converting from half-bytes (nybbles) into ASCII hex |
|
662 ** digits. */ |
|
663 static const char hexdigits[] = { |
|
664 '0', '1', '2', '3', '4', '5', '6', '7', |
|
665 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' |
|
666 }; |
|
667 |
|
668 /* |
|
669 ** EXPERIMENTAL - This is not an official function. The interface may |
|
670 ** change. This function may disappear. Do not write code that depends |
|
671 ** on this function. |
|
672 ** |
|
673 ** Implementation of the QUOTE() function. This function takes a single |
|
674 ** argument. If the argument is numeric, the return value is the same as |
|
675 ** the argument. If the argument is NULL, the return value is the string |
|
676 ** "NULL". Otherwise, the argument is enclosed in single quotes with |
|
677 ** single-quote escapes. |
|
678 */ |
|
679 static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ |
|
680 if( argc<1 ) return; |
|
681 switch( sqlite3_value_type(argv[0]) ){ |
|
682 case SQLITE_NULL: { |
|
683 sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC); |
|
684 break; |
|
685 } |
|
686 case SQLITE_INTEGER: |
|
687 case SQLITE_FLOAT: { |
|
688 sqlite3_result_value(context, argv[0]); |
|
689 break; |
|
690 } |
|
691 case SQLITE_BLOB: { |
|
692 char *zText = 0; |
|
693 char const *zBlob = sqlite3_value_blob(argv[0]); |
|
694 int nBlob = sqlite3_value_bytes(argv[0]); |
|
695 assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */ |
|
696 zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4); |
|
697 if( zText ){ |
|
698 int i; |
|
699 for(i=0; i<nBlob; i++){ |
|
700 zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F]; |
|
701 zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F]; |
|
702 } |
|
703 zText[(nBlob*2)+2] = '\''; |
|
704 zText[(nBlob*2)+3] = '\0'; |
|
705 zText[0] = 'X'; |
|
706 zText[1] = '\''; |
|
707 sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT); |
|
708 sqlite3_free(zText); |
|
709 } |
|
710 break; |
|
711 } |
|
712 case SQLITE_TEXT: { |
|
713 int i,j; |
|
714 u64 n; |
|
715 const unsigned char *zArg = sqlite3_value_text(argv[0]); |
|
716 char *z; |
|
717 |
|
718 if( zArg==0 ) return; |
|
719 for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; } |
|
720 z = contextMalloc(context, ((i64)i)+((i64)n)+3); |
|
721 if( z ){ |
|
722 z[0] = '\''; |
|
723 for(i=0, j=1; zArg[i]; i++){ |
|
724 z[j++] = zArg[i]; |
|
725 if( zArg[i]=='\'' ){ |
|
726 z[j++] = '\''; |
|
727 } |
|
728 } |
|
729 z[j++] = '\''; |
|
730 z[j] = 0; |
|
731 sqlite3_result_text(context, z, j, sqlite3_free); |
|
732 } |
|
733 } |
|
734 } |
|
735 } |
|
736 |
|
737 /* |
|
738 ** The hex() function. Interpret the argument as a blob. Return |
|
739 ** a hexadecimal rendering as text. |
|
740 */ |
|
741 static void hexFunc( |
|
742 sqlite3_context *context, |
|
743 int argc, |
|
744 sqlite3_value **argv |
|
745 ){ |
|
746 int i, n; |
|
747 const unsigned char *pBlob; |
|
748 char *zHex, *z; |
|
749 assert( argc==1 ); |
|
750 pBlob = sqlite3_value_blob(argv[0]); |
|
751 n = sqlite3_value_bytes(argv[0]); |
|
752 assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */ |
|
753 z = zHex = contextMalloc(context, ((i64)n)*2 + 1); |
|
754 if( zHex ){ |
|
755 for(i=0; i<n; i++, pBlob++){ |
|
756 unsigned char c = *pBlob; |
|
757 *(z++) = hexdigits[(c>>4)&0xf]; |
|
758 *(z++) = hexdigits[c&0xf]; |
|
759 } |
|
760 *z = 0; |
|
761 sqlite3_result_text(context, zHex, n*2, sqlite3_free); |
|
762 } |
|
763 } |
|
764 |
|
765 /* |
|
766 ** The zeroblob(N) function returns a zero-filled blob of size N bytes. |
|
767 */ |
|
768 static void zeroblobFunc( |
|
769 sqlite3_context *context, |
|
770 int argc, |
|
771 sqlite3_value **argv |
|
772 ){ |
|
773 i64 n; |
|
774 assert( argc==1 ); |
|
775 n = sqlite3_value_int64(argv[0]); |
|
776 if( n>SQLITE_MAX_LENGTH ){ |
|
777 sqlite3_result_error_toobig(context); |
|
778 }else{ |
|
779 sqlite3_result_zeroblob(context, n); |
|
780 } |
|
781 } |
|
782 |
|
783 /* |
|
784 ** The replace() function. Three arguments are all strings: call |
|
785 ** them A, B, and C. The result is also a string which is derived |
|
786 ** from A by replacing every occurance of B with C. The match |
|
787 ** must be exact. Collating sequences are not used. |
|
788 */ |
|
789 static void replaceFunc( |
|
790 sqlite3_context *context, |
|
791 int argc, |
|
792 sqlite3_value **argv |
|
793 ){ |
|
794 const unsigned char *zStr; /* The input string A */ |
|
795 const unsigned char *zPattern; /* The pattern string B */ |
|
796 const unsigned char *zRep; /* The replacement string C */ |
|
797 unsigned char *zOut; /* The output */ |
|
798 int nStr; /* Size of zStr */ |
|
799 int nPattern; /* Size of zPattern */ |
|
800 int nRep; /* Size of zRep */ |
|
801 i64 nOut; /* Maximum size of zOut */ |
|
802 int loopLimit; /* Last zStr[] that might match zPattern[] */ |
|
803 int i, j; /* Loop counters */ |
|
804 |
|
805 assert( argc==3 ); |
|
806 zStr = sqlite3_value_text(argv[0]); |
|
807 if( zStr==0 ) return; |
|
808 nStr = sqlite3_value_bytes(argv[0]); |
|
809 assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */ |
|
810 zPattern = sqlite3_value_text(argv[1]); |
|
811 if( zPattern==0 || zPattern[0]==0 ) return; |
|
812 nPattern = sqlite3_value_bytes(argv[1]); |
|
813 assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */ |
|
814 zRep = sqlite3_value_text(argv[2]); |
|
815 if( zRep==0 ) return; |
|
816 nRep = sqlite3_value_bytes(argv[2]); |
|
817 assert( zRep==sqlite3_value_text(argv[2]) ); |
|
818 nOut = nStr + 1; |
|
819 assert( nOut<SQLITE_MAX_LENGTH ); |
|
820 zOut = contextMalloc(context, (i64)nOut); |
|
821 if( zOut==0 ){ |
|
822 return; |
|
823 } |
|
824 loopLimit = nStr - nPattern; |
|
825 for(i=j=0; i<=loopLimit; i++){ |
|
826 if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){ |
|
827 zOut[j++] = zStr[i]; |
|
828 }else{ |
|
829 u8 *zOld; |
|
830 sqlite3 *db = sqlite3_context_db_handle(context); |
|
831 nOut += nRep - nPattern; |
|
832 if( nOut>=db->aLimit[SQLITE_LIMIT_LENGTH] ){ |
|
833 sqlite3_result_error_toobig(context); |
|
834 sqlite3DbFree(db, zOut); |
|
835 return; |
|
836 } |
|
837 zOld = zOut; |
|
838 zOut = sqlite3_realloc(zOut, (int)nOut); |
|
839 if( zOut==0 ){ |
|
840 sqlite3_result_error_nomem(context); |
|
841 sqlite3DbFree(db, zOld); |
|
842 return; |
|
843 } |
|
844 memcpy(&zOut[j], zRep, nRep); |
|
845 j += nRep; |
|
846 i += nPattern-1; |
|
847 } |
|
848 } |
|
849 assert( j+nStr-i+1==nOut ); |
|
850 memcpy(&zOut[j], &zStr[i], nStr-i); |
|
851 j += nStr - i; |
|
852 assert( j<=nOut ); |
|
853 zOut[j] = 0; |
|
854 sqlite3_result_text(context, (char*)zOut, j, sqlite3_free); |
|
855 } |
|
856 |
|
857 /* |
|
858 ** Implementation of the TRIM(), LTRIM(), and RTRIM() functions. |
|
859 ** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both. |
|
860 */ |
|
861 static void trimFunc( |
|
862 sqlite3_context *context, |
|
863 int argc, |
|
864 sqlite3_value **argv |
|
865 ){ |
|
866 const unsigned char *zIn; /* Input string */ |
|
867 const unsigned char *zCharSet; /* Set of characters to trim */ |
|
868 int nIn; /* Number of bytes in input */ |
|
869 int flags; /* 1: trimleft 2: trimright 3: trim */ |
|
870 int i; /* Loop counter */ |
|
871 unsigned char *aLen; /* Length of each character in zCharSet */ |
|
872 unsigned char **azChar; /* Individual characters in zCharSet */ |
|
873 int nChar; /* Number of characters in zCharSet */ |
|
874 |
|
875 if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ |
|
876 return; |
|
877 } |
|
878 zIn = sqlite3_value_text(argv[0]); |
|
879 if( zIn==0 ) return; |
|
880 nIn = sqlite3_value_bytes(argv[0]); |
|
881 assert( zIn==sqlite3_value_text(argv[0]) ); |
|
882 if( argc==1 ){ |
|
883 static const unsigned char lenOne[] = { 1 }; |
|
884 static unsigned char * const azOne[] = { (u8*)" " }; |
|
885 nChar = 1; |
|
886 aLen = (u8*)lenOne; |
|
887 azChar = (unsigned char **)azOne; |
|
888 zCharSet = 0; |
|
889 }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){ |
|
890 return; |
|
891 }else{ |
|
892 const unsigned char *z; |
|
893 for(z=zCharSet, nChar=0; *z; nChar++){ |
|
894 SQLITE_SKIP_UTF8(z); |
|
895 } |
|
896 if( nChar>0 ){ |
|
897 azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1)); |
|
898 if( azChar==0 ){ |
|
899 return; |
|
900 } |
|
901 aLen = (unsigned char*)&azChar[nChar]; |
|
902 for(z=zCharSet, nChar=0; *z; nChar++){ |
|
903 azChar[nChar] = (unsigned char *)z; |
|
904 SQLITE_SKIP_UTF8(z); |
|
905 aLen[nChar] = z - azChar[nChar]; |
|
906 } |
|
907 } |
|
908 } |
|
909 if( nChar>0 ){ |
|
910 flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context)); |
|
911 if( flags & 1 ){ |
|
912 while( nIn>0 ){ |
|
913 int len; |
|
914 for(i=0; i<nChar; i++){ |
|
915 len = aLen[i]; |
|
916 if( memcmp(zIn, azChar[i], len)==0 ) break; |
|
917 } |
|
918 if( i>=nChar ) break; |
|
919 zIn += len; |
|
920 nIn -= len; |
|
921 } |
|
922 } |
|
923 if( flags & 2 ){ |
|
924 while( nIn>0 ){ |
|
925 int len; |
|
926 for(i=0; i<nChar; i++){ |
|
927 len = aLen[i]; |
|
928 if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break; |
|
929 } |
|
930 if( i>=nChar ) break; |
|
931 nIn -= len; |
|
932 } |
|
933 } |
|
934 if( zCharSet ){ |
|
935 sqlite3_free(azChar); |
|
936 } |
|
937 } |
|
938 sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT); |
|
939 } |
|
940 |
|
941 |
|
942 #ifdef SQLITE_SOUNDEX |
|
943 /* |
|
944 ** Compute the soundex encoding of a word. |
|
945 */ |
|
946 static void soundexFunc( |
|
947 sqlite3_context *context, |
|
948 int argc, |
|
949 sqlite3_value **argv |
|
950 ){ |
|
951 char zResult[8]; |
|
952 const u8 *zIn; |
|
953 int i, j; |
|
954 static const unsigned char iCode[] = { |
|
955 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
|
956 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
|
957 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
|
958 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
|
959 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, |
|
960 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, |
|
961 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, |
|
962 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, |
|
963 }; |
|
964 assert( argc==1 ); |
|
965 zIn = (u8*)sqlite3_value_text(argv[0]); |
|
966 if( zIn==0 ) zIn = (u8*)""; |
|
967 for(i=0; zIn[i] && !isalpha(zIn[i]); i++){} |
|
968 if( zIn[i] ){ |
|
969 u8 prevcode = iCode[zIn[i]&0x7f]; |
|
970 zResult[0] = toupper(zIn[i]); |
|
971 for(j=1; j<4 && zIn[i]; i++){ |
|
972 int code = iCode[zIn[i]&0x7f]; |
|
973 if( code>0 ){ |
|
974 if( code!=prevcode ){ |
|
975 prevcode = code; |
|
976 zResult[j++] = code + '0'; |
|
977 } |
|
978 }else{ |
|
979 prevcode = 0; |
|
980 } |
|
981 } |
|
982 while( j<4 ){ |
|
983 zResult[j++] = '0'; |
|
984 } |
|
985 zResult[j] = 0; |
|
986 sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT); |
|
987 }else{ |
|
988 sqlite3_result_text(context, "?000", 4, SQLITE_STATIC); |
|
989 } |
|
990 } |
|
991 #endif |
|
992 |
|
993 #ifndef SQLITE_OMIT_LOAD_EXTENSION |
|
994 /* |
|
995 ** A function that loads a shared-library extension then returns NULL. |
|
996 */ |
|
997 static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){ |
|
998 const char *zFile = (const char *)sqlite3_value_text(argv[0]); |
|
999 const char *zProc; |
|
1000 sqlite3 *db = sqlite3_context_db_handle(context); |
|
1001 char *zErrMsg = 0; |
|
1002 |
|
1003 if( argc==2 ){ |
|
1004 zProc = (const char *)sqlite3_value_text(argv[1]); |
|
1005 }else{ |
|
1006 zProc = 0; |
|
1007 } |
|
1008 if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){ |
|
1009 sqlite3_result_error(context, zErrMsg, -1); |
|
1010 sqlite3_free(zErrMsg); |
|
1011 } |
|
1012 } |
|
1013 #endif |
|
1014 |
|
1015 |
|
1016 /* |
|
1017 ** An instance of the following structure holds the context of a |
|
1018 ** sum() or avg() aggregate computation. |
|
1019 */ |
|
1020 typedef struct SumCtx SumCtx; |
|
1021 struct SumCtx { |
|
1022 double rSum; /* Floating point sum */ |
|
1023 i64 iSum; /* Integer sum */ |
|
1024 i64 cnt; /* Number of elements summed */ |
|
1025 u8 overflow; /* True if integer overflow seen */ |
|
1026 u8 approx; /* True if non-integer value was input to the sum */ |
|
1027 }; |
|
1028 |
|
1029 /* |
|
1030 ** Routines used to compute the sum, average, and total. |
|
1031 ** |
|
1032 ** The SUM() function follows the (broken) SQL standard which means |
|
1033 ** that it returns NULL if it sums over no inputs. TOTAL returns |
|
1034 ** 0.0 in that case. In addition, TOTAL always returns a float where |
|
1035 ** SUM might return an integer if it never encounters a floating point |
|
1036 ** value. TOTAL never fails, but SUM might through an exception if |
|
1037 ** it overflows an integer. |
|
1038 */ |
|
1039 static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){ |
|
1040 SumCtx *p; |
|
1041 int type; |
|
1042 assert( argc==1 ); |
|
1043 p = sqlite3_aggregate_context(context, sizeof(*p)); |
|
1044 type = sqlite3_value_numeric_type(argv[0]); |
|
1045 if( p && type!=SQLITE_NULL ){ |
|
1046 p->cnt++; |
|
1047 if( type==SQLITE_INTEGER ){ |
|
1048 i64 v = sqlite3_value_int64(argv[0]); |
|
1049 p->rSum += v; |
|
1050 if( (p->approx|p->overflow)==0 ){ |
|
1051 i64 iNewSum = p->iSum + v; |
|
1052 int s1 = p->iSum >> (sizeof(i64)*8-1); |
|
1053 int s2 = v >> (sizeof(i64)*8-1); |
|
1054 int s3 = iNewSum >> (sizeof(i64)*8-1); |
|
1055 p->overflow = (s1&s2&~s3) | (~s1&~s2&s3); |
|
1056 p->iSum = iNewSum; |
|
1057 } |
|
1058 }else{ |
|
1059 p->rSum += sqlite3_value_double(argv[0]); |
|
1060 p->approx = 1; |
|
1061 } |
|
1062 } |
|
1063 } |
|
1064 static void sumFinalize(sqlite3_context *context){ |
|
1065 SumCtx *p; |
|
1066 p = sqlite3_aggregate_context(context, 0); |
|
1067 if( p && p->cnt>0 ){ |
|
1068 if( p->overflow ){ |
|
1069 sqlite3_result_error(context,"integer overflow",-1); |
|
1070 }else if( p->approx ){ |
|
1071 sqlite3_result_double(context, p->rSum); |
|
1072 }else{ |
|
1073 sqlite3_result_int64(context, p->iSum); |
|
1074 } |
|
1075 } |
|
1076 } |
|
1077 static void avgFinalize(sqlite3_context *context){ |
|
1078 SumCtx *p; |
|
1079 p = sqlite3_aggregate_context(context, 0); |
|
1080 if( p && p->cnt>0 ){ |
|
1081 sqlite3_result_double(context, p->rSum/(double)p->cnt); |
|
1082 } |
|
1083 } |
|
1084 static void totalFinalize(sqlite3_context *context){ |
|
1085 SumCtx *p; |
|
1086 p = sqlite3_aggregate_context(context, 0); |
|
1087 sqlite3_result_double(context, p ? p->rSum : 0.0); |
|
1088 } |
|
1089 |
|
1090 /* |
|
1091 ** The following structure keeps track of state information for the |
|
1092 ** count() aggregate function. |
|
1093 */ |
|
1094 typedef struct CountCtx CountCtx; |
|
1095 struct CountCtx { |
|
1096 i64 n; |
|
1097 }; |
|
1098 |
|
1099 /* |
|
1100 ** Routines to implement the count() aggregate function. |
|
1101 */ |
|
1102 static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){ |
|
1103 CountCtx *p; |
|
1104 p = sqlite3_aggregate_context(context, sizeof(*p)); |
|
1105 if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){ |
|
1106 p->n++; |
|
1107 } |
|
1108 } |
|
1109 static void countFinalize(sqlite3_context *context){ |
|
1110 CountCtx *p; |
|
1111 p = sqlite3_aggregate_context(context, 0); |
|
1112 sqlite3_result_int64(context, p ? p->n : 0); |
|
1113 } |
|
1114 |
|
1115 /* |
|
1116 ** Routines to implement min() and max() aggregate functions. |
|
1117 */ |
|
1118 static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){ |
|
1119 Mem *pArg = (Mem *)argv[0]; |
|
1120 Mem *pBest; |
|
1121 |
|
1122 if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; |
|
1123 pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest)); |
|
1124 if( !pBest ) return; |
|
1125 |
|
1126 if( pBest->flags ){ |
|
1127 int max; |
|
1128 int cmp; |
|
1129 CollSeq *pColl = sqlite3GetFuncCollSeq(context); |
|
1130 /* This step function is used for both the min() and max() aggregates, |
|
1131 ** the only difference between the two being that the sense of the |
|
1132 ** comparison is inverted. For the max() aggregate, the |
|
1133 ** sqlite3_user_data() function returns (void *)-1. For min() it |
|
1134 ** returns (void *)db, where db is the sqlite3* database pointer. |
|
1135 ** Therefore the next statement sets variable 'max' to 1 for the max() |
|
1136 ** aggregate, or 0 for min(). |
|
1137 */ |
|
1138 max = sqlite3_user_data(context)!=0; |
|
1139 cmp = sqlite3MemCompare(pBest, pArg, pColl); |
|
1140 if( (max && cmp<0) || (!max && cmp>0) ){ |
|
1141 sqlite3VdbeMemCopy(pBest, pArg); |
|
1142 } |
|
1143 }else{ |
|
1144 sqlite3VdbeMemCopy(pBest, pArg); |
|
1145 } |
|
1146 } |
|
1147 static void minMaxFinalize(sqlite3_context *context){ |
|
1148 sqlite3_value *pRes; |
|
1149 pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0); |
|
1150 if( pRes ){ |
|
1151 if( pRes->flags ){ |
|
1152 sqlite3_result_value(context, pRes); |
|
1153 } |
|
1154 sqlite3VdbeMemRelease(pRes); |
|
1155 } |
|
1156 } |
|
1157 |
|
1158 /* |
|
1159 ** group_concat(EXPR, ?SEPARATOR?) |
|
1160 */ |
|
1161 static void groupConcatStep( |
|
1162 sqlite3_context *context, |
|
1163 int argc, |
|
1164 sqlite3_value **argv |
|
1165 ){ |
|
1166 const char *zVal; |
|
1167 StrAccum *pAccum; |
|
1168 const char *zSep; |
|
1169 int nVal, nSep, i; |
|
1170 if( argc==0 || sqlite3_value_type(argv[0])==SQLITE_NULL ) return; |
|
1171 pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum)); |
|
1172 |
|
1173 if( pAccum ){ |
|
1174 sqlite3 *db = sqlite3_context_db_handle(context); |
|
1175 pAccum->useMalloc = 1; |
|
1176 pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH]; |
|
1177 if( pAccum->nChar ){ |
|
1178 if( argc>1 ){ |
|
1179 zSep = (char*)sqlite3_value_text(argv[argc-1]); |
|
1180 nSep = sqlite3_value_bytes(argv[argc-1]); |
|
1181 }else{ |
|
1182 zSep = ","; |
|
1183 nSep = 1; |
|
1184 } |
|
1185 sqlite3StrAccumAppend(pAccum, zSep, nSep); |
|
1186 } |
|
1187 i = 0; |
|
1188 do{ |
|
1189 zVal = (char*)sqlite3_value_text(argv[i]); |
|
1190 nVal = sqlite3_value_bytes(argv[i]); |
|
1191 sqlite3StrAccumAppend(pAccum, zVal, nVal); |
|
1192 i++; |
|
1193 }while( i<argc-1 ); |
|
1194 } |
|
1195 } |
|
1196 static void groupConcatFinalize(sqlite3_context *context){ |
|
1197 StrAccum *pAccum; |
|
1198 pAccum = sqlite3_aggregate_context(context, 0); |
|
1199 if( pAccum ){ |
|
1200 if( pAccum->tooBig ){ |
|
1201 sqlite3_result_error_toobig(context); |
|
1202 }else if( pAccum->mallocFailed ){ |
|
1203 sqlite3_result_error_nomem(context); |
|
1204 }else{ |
|
1205 sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1, |
|
1206 sqlite3_free); |
|
1207 } |
|
1208 } |
|
1209 } |
|
1210 |
|
1211 /* |
|
1212 ** This function registered all of the above C functions as SQL |
|
1213 ** functions. This should be the only routine in this file with |
|
1214 ** external linkage. |
|
1215 */ |
|
1216 void sqlite3RegisterBuiltinFunctions(sqlite3 *db){ |
|
1217 #ifndef SQLITE_OMIT_ALTERTABLE |
|
1218 sqlite3AlterFunctions(db); |
|
1219 #endif |
|
1220 #ifndef SQLITE_OMIT_PARSER |
|
1221 sqlite3AttachFunctions(db); |
|
1222 #endif |
|
1223 if( !db->mallocFailed ){ |
|
1224 int rc = sqlite3_overload_function(db, "MATCH", 2); |
|
1225 assert( rc==SQLITE_NOMEM || rc==SQLITE_OK ); |
|
1226 if( rc==SQLITE_NOMEM ){ |
|
1227 db->mallocFailed = 1; |
|
1228 } |
|
1229 } |
|
1230 #ifdef SQLITE_SSE |
|
1231 (void)sqlite3SseFunctions(db); |
|
1232 #endif |
|
1233 } |
|
1234 |
|
1235 /* |
|
1236 ** Set the LIKEOPT flag on the 2-argument function with the given name. |
|
1237 */ |
|
1238 static void setLikeOptFlag(sqlite3 *db, const char *zName, int flagVal){ |
|
1239 FuncDef *pDef; |
|
1240 pDef = sqlite3FindFunction(db, zName, strlen(zName), 2, SQLITE_UTF8, 0); |
|
1241 if( pDef ){ |
|
1242 pDef->flags = flagVal; |
|
1243 } |
|
1244 } |
|
1245 |
|
1246 /* |
|
1247 ** Register the built-in LIKE and GLOB functions. The caseSensitive |
|
1248 ** parameter determines whether or not the LIKE operator is case |
|
1249 ** sensitive. GLOB is always case sensitive. |
|
1250 */ |
|
1251 void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){ |
|
1252 struct compareInfo *pInfo; |
|
1253 if( caseSensitive ){ |
|
1254 pInfo = (struct compareInfo*)&likeInfoAlt; |
|
1255 }else{ |
|
1256 pInfo = (struct compareInfo*)&likeInfoNorm; |
|
1257 } |
|
1258 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0); |
|
1259 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0); |
|
1260 sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8, |
|
1261 (struct compareInfo*)&globInfo, likeFunc, 0,0); |
|
1262 setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE); |
|
1263 setLikeOptFlag(db, "like", |
|
1264 caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE); |
|
1265 } |
|
1266 |
|
1267 /* |
|
1268 ** pExpr points to an expression which implements a function. If |
|
1269 ** it is appropriate to apply the LIKE optimization to that function |
|
1270 ** then set aWc[0] through aWc[2] to the wildcard characters and |
|
1271 ** return TRUE. If the function is not a LIKE-style function then |
|
1272 ** return FALSE. |
|
1273 */ |
|
1274 int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){ |
|
1275 FuncDef *pDef; |
|
1276 if( pExpr->op!=TK_FUNCTION || !pExpr->pList ){ |
|
1277 return 0; |
|
1278 } |
|
1279 if( pExpr->pList->nExpr!=2 ){ |
|
1280 return 0; |
|
1281 } |
|
1282 pDef = sqlite3FindFunction(db, (char*)pExpr->token.z, pExpr->token.n, 2, |
|
1283 SQLITE_UTF8, 0); |
|
1284 if( pDef==0 || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){ |
|
1285 return 0; |
|
1286 } |
|
1287 |
|
1288 /* The memcpy() statement assumes that the wildcard characters are |
|
1289 ** the first three statements in the compareInfo structure. The |
|
1290 ** asserts() that follow verify that assumption |
|
1291 */ |
|
1292 memcpy(aWc, pDef->pUserData, 3); |
|
1293 assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll ); |
|
1294 assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne ); |
|
1295 assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet ); |
|
1296 *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0; |
|
1297 return 1; |
|
1298 } |
|
1299 |
|
1300 /* |
|
1301 ** All all of the FuncDef structures in the aBuiltinFunc[] array above |
|
1302 ** to the global function hash table. This occurs at start-time (as |
|
1303 ** a consequence of calling sqlite3_initialize()). |
|
1304 ** |
|
1305 ** After this routine runs |
|
1306 */ |
|
1307 void sqlite3RegisterGlobalFunctions(void){ |
|
1308 /* |
|
1309 ** The following array holds FuncDef structures for all of the functions |
|
1310 ** defined in this file. |
|
1311 ** |
|
1312 ** The array cannot be constant since changes are made to the |
|
1313 ** FuncDef.pHash elements at start-time. The elements of this array |
|
1314 ** are read-only after initialization is complete. |
|
1315 */ |
|
1316 static SQLITE_WSD FuncDef aBuiltinFunc[] = { |
|
1317 FUNCTION(ltrim, 1, 1, 0, trimFunc ), |
|
1318 FUNCTION(ltrim, 2, 1, 0, trimFunc ), |
|
1319 FUNCTION(rtrim, 1, 2, 0, trimFunc ), |
|
1320 FUNCTION(rtrim, 2, 2, 0, trimFunc ), |
|
1321 FUNCTION(trim, 1, 3, 0, trimFunc ), |
|
1322 FUNCTION(trim, 2, 3, 0, trimFunc ), |
|
1323 FUNCTION(min, -1, 0, 1, minmaxFunc ), |
|
1324 FUNCTION(min, 0, 0, 1, 0 ), |
|
1325 AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ), |
|
1326 FUNCTION(max, -1, 1, 1, minmaxFunc ), |
|
1327 FUNCTION(max, 0, 1, 1, 0 ), |
|
1328 AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ), |
|
1329 FUNCTION(typeof, 1, 0, 0, typeofFunc ), |
|
1330 FUNCTION(length, 1, 0, 0, lengthFunc ), |
|
1331 FUNCTION(substr, 2, 0, 0, substrFunc ), |
|
1332 FUNCTION(substr, 3, 0, 0, substrFunc ), |
|
1333 FUNCTION(abs, 1, 0, 0, absFunc ), |
|
1334 FUNCTION(round, 1, 0, 0, roundFunc ), |
|
1335 FUNCTION(round, 2, 0, 0, roundFunc ), |
|
1336 FUNCTION(upper, 1, 0, 0, upperFunc ), |
|
1337 FUNCTION(lower, 1, 0, 0, lowerFunc ), |
|
1338 FUNCTION(coalesce, 1, 0, 0, 0 ), |
|
1339 FUNCTION(coalesce, -1, 0, 0, ifnullFunc ), |
|
1340 FUNCTION(coalesce, 0, 0, 0, 0 ), |
|
1341 FUNCTION(hex, 1, 0, 0, hexFunc ), |
|
1342 FUNCTION(ifnull, 2, 0, 1, ifnullFunc ), |
|
1343 FUNCTION(random, -1, 0, 0, randomFunc ), |
|
1344 FUNCTION(randomblob, 1, 0, 0, randomBlob ), |
|
1345 FUNCTION(nullif, 2, 0, 1, nullifFunc ), |
|
1346 FUNCTION(sqlite_version, 0, 0, 0, versionFunc ), |
|
1347 FUNCTION(quote, 1, 0, 0, quoteFunc ), |
|
1348 FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid), |
|
1349 FUNCTION(changes, 0, 0, 0, changes ), |
|
1350 FUNCTION(total_changes, 0, 0, 0, total_changes ), |
|
1351 FUNCTION(replace, 3, 0, 0, replaceFunc ), |
|
1352 FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ), |
|
1353 #ifdef SQLITE_SOUNDEX |
|
1354 FUNCTION(soundex, 1, 0, 0, soundexFunc ), |
|
1355 #endif |
|
1356 #ifndef SQLITE_OMIT_LOAD_EXTENSION |
|
1357 FUNCTION(load_extension, 1, 0, 0, loadExt ), |
|
1358 FUNCTION(load_extension, 2, 0, 0, loadExt ), |
|
1359 #endif |
|
1360 AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ), |
|
1361 AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ), |
|
1362 AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ), |
|
1363 AGGREGATE(count, 0, 0, 0, countStep, countFinalize ), |
|
1364 AGGREGATE(count, 1, 0, 0, countStep, countFinalize ), |
|
1365 AGGREGATE(group_concat, -1, 0, 0, groupConcatStep, groupConcatFinalize), |
|
1366 |
|
1367 LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), |
|
1368 #ifdef SQLITE_CASE_SENSITIVE_LIKE |
|
1369 LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), |
|
1370 LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), |
|
1371 #else |
|
1372 LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE), |
|
1373 LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE), |
|
1374 #endif |
|
1375 }; |
|
1376 |
|
1377 int i; |
|
1378 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions); |
|
1379 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc); |
|
1380 |
|
1381 for(i=0; i<ArraySize(aBuiltinFunc); i++){ |
|
1382 sqlite3FuncDefInsert(pHash, &aFunc[i]); |
|
1383 } |
|
1384 sqlite3RegisterDateTimeFunctions(); |
|
1385 } |
|
1386 |
|
1387 int sqlite3RegisterInternalUtf8Like(sqlite3 *db){ |
|
1388 int rc; |
|
1389 void *pCtx = (void *)&likeInfoNorm; |
|
1390 rc = sqlite3_create_function(db, "like", 2, SQLITE_UTF8, pCtx, likeFunc, 0, 0); |
|
1391 if( rc!=SQLITE_OK ) return rc; |
|
1392 rc = sqlite3_create_function(db, "like", 3, SQLITE_UTF8, pCtx, likeFunc, 0, 0); |
|
1393 if( rc!=SQLITE_OK ) return rc; |
|
1394 setLikeOptFlag(db, "like", SQLITE_FUNC_LIKE); |
|
1395 return SQLITE_OK; |
|
1396 } |