diff options
Diffstat (limited to 'ext/sqlite/libsqlite/src/func.c')
| -rw-r--r-- | ext/sqlite/libsqlite/src/func.c | 62 | 
1 files changed, 52 insertions, 10 deletions
diff --git a/ext/sqlite/libsqlite/src/func.c b/ext/sqlite/libsqlite/src/func.c index a1662abae2..c348db21c5 100644 --- a/ext/sqlite/libsqlite/src/func.c +++ b/ext/sqlite/libsqlite/src/func.c @@ -23,6 +23,7 @@  #include <stdlib.h>  #include <assert.h>  #include "sqliteInt.h" +#include "os.h"  /*  ** Implementation of the non-aggregate min() and max() functions @@ -121,13 +122,11 @@ static void substrFunc(sqlite_func *context, int argc, const char **argv){      p2 = len-p1;    }  #ifdef SQLITE_UTF8 -  for(i=0; i<p1; i++){ -    assert( z[i] ); +  for(i=0; i<p1 && z[i]; i++){      if( (z[i]&0xc0)==0x80 ) p1++;    }    while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p1++; } -  for(; i<p1+p2; i++){ -    assert( z[i] ); +  for(; i<p1+p2 && z[i]; i++){      if( (z[i]&0xc0)==0x80 ) p2++;    }    while( z[i] && (z[i]&0xc0)==0x80 ){ i++; p2++; } @@ -148,7 +147,7 @@ static void roundFunc(sqlite_func *context, int argc, const char **argv){    n = argc==2 ? atoi(argv[1]) : 0;    if( n>30 ) n = 30;    if( n<0 ) n = 0; -  r = atof(argv[0]); +  r = sqliteAtoF(argv[0]);    sprintf(zBuf,"%.*f",n,r);    sqlite_set_result_string(context, zBuf, -1);  } @@ -219,7 +218,9 @@ static void last_insert_rowid(sqlite_func *context, int arg, const char **argv){  */  static void likeFunc(sqlite_func *context, int arg, const char **argv){    if( argv[0]==0 || argv[1]==0 ) return; -  sqlite_set_result_int(context, sqliteLikeCompare(argv[0], argv[1])); +  sqlite_set_result_int(context,  +    sqliteLikeCompare((const unsigned char*)argv[0], +                      (const unsigned char*)argv[1]));  }  /* @@ -233,7 +234,9 @@ static void likeFunc(sqlite_func *context, int arg, const char **argv){  */  static void globFunc(sqlite_func *context, int arg, const char **argv){    if( argv[0]==0 || argv[1]==0 ) return; -  sqlite_set_result_int(context, sqliteGlobCompare(argv[0], argv[1])); +  sqlite_set_result_int(context, +    sqliteGlobCompare((const unsigned char*)argv[0], +                      (const unsigned char*)argv[1]));  }  /* @@ -255,6 +258,43 @@ static void versionFunc(sqlite_func *context, int argc, const char **argv){    sqlite_set_result_string(context, sqlite_version, -1);  } +/* +** EXPERIMENTAL - This is not an official function.  The interface may +** change.  This function may disappear.  Do not write code that depends +** on this function. +** +** Implementation of the QUOTE() function.  This function takes a single +** argument.  If the argument is numeric, the return value is the same as +** the argument.  If the argument is NULL, the return value is the string +** "NULL".  Otherwise, the argument is enclosed in single quotes with +** single-quote escapes. +*/ +static void quoteFunc(sqlite_func *context, int argc, const char **argv){ +  if( argc<1 ) return; +  if( argv[0]==0 ){ +    sqlite_set_result_string(context, "NULL", 4); +  }else if( sqliteIsNumber(argv[0]) ){ +    sqlite_set_result_string(context, argv[0], -1); +  }else{ +    int i,j,n; +    char *z; +    for(i=n=0; argv[0][i]; i++){ if( argv[0][i]=='\'' ) n++; } +    z = sqliteMalloc( i+n+3 ); +    if( z==0 ) return; +    z[0] = '\''; +    for(i=0, j=1; argv[0][i]; i++){ +      z[j++] = argv[0][i]; +      if( argv[0][i]=='\'' ){ +        z[j++] = '\''; +      } +    } +    z[j++] = '\''; +    z[j] = 0; +    sqlite_set_result_string(context, z, j); +    sqliteFree(z); +  } +} +  #ifdef SQLITE_SOUNDEX  /*  ** Compute the soundex encoding of a word. @@ -290,7 +330,7 @@ static void soundexFunc(sqlite_func *context, int argc, const char **argv){      zResult[j] = 0;      sqlite_set_result_string(context, zResult, 4);    }else{ -    sqlite_set_result_string(context, zResult, "?000", 4); +    sqlite_set_result_string(context, "?000", 4);    }  }  #endif @@ -355,7 +395,7 @@ static void sumStep(sqlite_func *context, int argc, const char **argv){    if( argc<1 ) return;    p = sqlite_aggregate_context(context, sizeof(*p));    if( p && argv[0] ){ -    p->sum += atof(argv[0]); +    p->sum += sqliteAtoF(argv[0]);      p->cnt++;    }  } @@ -393,7 +433,7 @@ static void stdDevStep(sqlite_func *context, int argc, const char **argv){    if( argc<1 ) return;    p = sqlite_aggregate_context(context, sizeof(*p));    if( p && argv[0] ){ -    x = atof(argv[0]); +    x = sqliteAtoF(argv[0]);      p->sum += x;      p->sum2 += x*x;      p->cnt++; @@ -529,6 +569,7 @@ void sqliteRegisterBuiltinFunctions(sqlite *db){      { "glob",       2, SQLITE_NUMERIC, globFunc   },      { "nullif",     2, SQLITE_ARGS,    nullifFunc },      { "sqlite_version",0,SQLITE_TEXT,  versionFunc}, +    { "quote",      1, SQLITE_ARGS,    quoteFunc  },  #ifdef SQLITE_SOUNDEX      { "soundex",    1, SQLITE_TEXT,    soundexFunc},  #endif @@ -570,4 +611,5 @@ void sqliteRegisterBuiltinFunctions(sqlite *db){             aAggs[i].nArg, aAggs[i].xStep, aAggs[i].xFinalize, 0);      sqlite_function_type(db, aAggs[i].zName, aAggs[i].dataType);    } +  sqliteRegisterDateTimeFunctions(db);  }  | 
