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