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