diff options
Diffstat (limited to 'ext/sqlite/libsqlite/src/func.c')
| -rw-r--r-- | ext/sqlite/libsqlite/src/func.c | 36 | 
1 files changed, 24 insertions, 12 deletions
| diff --git a/ext/sqlite/libsqlite/src/func.c b/ext/sqlite/libsqlite/src/func.c index d54f341472..8d6012eff7 100644 --- a/ext/sqlite/libsqlite/src/func.c +++ b/ext/sqlite/libsqlite/src/func.c @@ -157,20 +157,20 @@ static void roundFunc(sqlite_func *context, int argc, const char **argv){  ** Implementation of the upper() and lower() SQL functions.  */  static void upperFunc(sqlite_func *context, int argc, const char **argv){ -  char *z; +  unsigned char *z;    int i;    if( argc<1 || argv[0]==0 ) return; -  z = sqlite_set_result_string(context, argv[0], -1); +  z = (unsigned char*)sqlite_set_result_string(context, argv[0], -1);    if( z==0 ) return;    for(i=0; z[i]; i++){      if( islower(z[i]) ) z[i] = toupper(z[i]);    }  }  static void lowerFunc(sqlite_func *context, int argc, const char **argv){ -  char *z; +  unsigned char *z;    int i;    if( argc<1 || argv[0]==0 ) return; -  z = sqlite_set_result_string(context, argv[0], -1); +  z = (unsigned char*)sqlite_set_result_string(context, argv[0], -1);    if( z==0 ) return;    for(i=0; z[i]; i++){      if( isupper(z[i]) ) z[i] = tolower(z[i]); @@ -517,26 +517,28 @@ static void minmaxStep(sqlite_func *context, int argc, const char **argv){    int mask;    /* 0 for min() or 0xffffffff for max() */    assert( argc==2 ); +  if( argv[0]==0 ) return;  /* Ignore NULL values */    if( argv[1][0]=='n' ){      xCompare = sqliteCompare;    }else{      xCompare = strcmp;    }    mask = (int)sqlite_user_data(context); +  assert( mask==0 || mask==-1 );    p = sqlite_aggregate_context(context, sizeof(*p)); -  if( p==0 || argc<1 || argv[0]==0 ) return; +  if( p==0 || argc<1 ) return;    if( p->z==0 || (xCompare(argv[0],p->z)^mask)<0 ){      int len; -    if( !p->zBuf[0] ){ +    if( p->zBuf[0] ){        sqliteFree(p->z);      }      len = strlen(argv[0]);      if( len < sizeof(p->zBuf)-1 ){        p->z = &p->zBuf[1]; -      p->zBuf[0] = 1; +      p->zBuf[0] = 0;      }else{        p->z = sqliteMalloc( len+1 ); -      p->zBuf[0] = 0; +      p->zBuf[0] = 1;        if( p->z==0 ) return;      }      strcpy(p->z, argv[0]); @@ -545,10 +547,10 @@ static void minmaxStep(sqlite_func *context, int argc, const char **argv){  static void minMaxFinalize(sqlite_func *context){    MinMaxCtx *p;    p = sqlite_aggregate_context(context, sizeof(*p)); -  if( p && p->z ){ +  if( p && p->z && p->zBuf[0]<2 ){      sqlite_set_result_string(context, p->z, strlen(p->z));    } -  if( p && !p->zBuf[0] ){ +  if( p && p->zBuf[0] ){      sqliteFree(p->z);    }  } @@ -621,7 +623,12 @@ void sqliteRegisterBuiltinFunctions(sqlite *db){    int i;    for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){ -    void *pArg = aFuncs[i].argType==2 ? (void*)(-1) : db; +    void *pArg; +    switch( aFuncs[i].argType ){ +      case 0:  pArg = 0;           break; +      case 1:  pArg = db;          break; +      case 2:  pArg = (void*)(-1); break; +    }      sqlite_create_function(db, aFuncs[i].zName,             aFuncs[i].nArg, aFuncs[i].xFunc, pArg);      if( aFuncs[i].xFunc ){ @@ -629,7 +636,12 @@ void sqliteRegisterBuiltinFunctions(sqlite *db){      }    }    for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){ -    void *pArg = aAggs[i].argType==2 ? (void*)(-1) : db; +    void *pArg; +    switch( aAggs[i].argType ){ +      case 0:  pArg = 0;           break; +      case 1:  pArg = db;          break; +      case 2:  pArg = (void*)(-1); break; +    }      sqlite_create_aggregate(db, aAggs[i].zName,             aAggs[i].nArg, aAggs[i].xStep, aAggs[i].xFinalize, pArg);      sqlite_function_type(db, aAggs[i].zName, aAggs[i].dataType); | 
