15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2002 February 23
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code.  In place of
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you do good and not evil.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you find forgiveness for yourself and forgive others.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you share freely, never taking more than you give.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*************************************************************************
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file contains the C functions that implement various SQL
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** functions of SQLite.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** There is only one exported symbol in this file - the function
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqliteRegisterBuildinFunctions() found at the bottom of the file.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** All other code has file scope.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <assert.h>
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "vdbeInt.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the collating function associated with a function.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return context->pColl;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the non-aggregate min() and max() functions
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void minmaxFunc(
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int mask;    /* 0 for min() or 0xffffffff for max() */
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iBest;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CollSeq *pColl;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( argc>1 );
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mask = sqlite3_user_data(context)==0 ? 0 : -1;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pColl = sqlite3GetFuncCollSeq(context);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pColl );
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( mask==-1 || mask==0 );
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iBest = 0;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=1; i<argc; i++){
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( mask==0 );
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      iBest = i;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_result_value(context, argv[iBest]);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the type of the argument.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void typeofFunc(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NotUsed,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *z = 0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER(NotUsed);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( sqlite3_value_type(argv[0]) ){
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_INTEGER: z = "integer"; break;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_TEXT:    z = "text";    break;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_FLOAT:   z = "real";    break;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_BLOB:    z = "blob";    break;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:             z = "null";    break;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_result_text(context, z, -1, SQLITE_STATIC);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the length() function
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void lengthFunc(
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int len;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( argc==1 );
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER(argc);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( sqlite3_value_type(argv[0]) ){
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_BLOB:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_INTEGER:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_FLOAT: {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_TEXT: {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const unsigned char *z = sqlite3_value_text(argv[0]);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( z==0 ) return;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      len = 0;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while( *z ){
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        len++;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SQLITE_SKIP_UTF8(z);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_int(context, len);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default: {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_null(context);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the abs() function.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** IMP: R-23979-26855 The abs(X) function returns the absolute value of
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the numeric argument X.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( argc==1 );
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER(argc);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( sqlite3_value_type(argv[0]) ){
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_INTEGER: {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      i64 iVal = sqlite3_value_int64(argv[0]);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( iVal<0 ){
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( (iVal<<1)==0 ){
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* IMP: R-35460-15084 If X is the integer -9223372036854775807 then
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ** abs(X) throws an integer overflow error since there is no
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ** equivalent positive 64-bit two complement value. */
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3_result_error(context, "integer overflow", -1);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        iVal = -iVal;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_int64(context, iVal);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_NULL: {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* IMP: R-37434-19929 Abs(X) returns NULL if X is NULL. */
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_null(context);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default: {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Because sqlite3_value_double() returns 0.0 if the argument is not
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** something that can be converted into a number, we have:
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** IMP: R-57326-31541 Abs(X) return 0.0 if X is a string or blob that
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** cannot be converted to a numeric value.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      double rVal = sqlite3_value_double(argv[0]);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( rVal<0 ) rVal = -rVal;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_double(context, rVal);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the substr() function.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** substr(x,p1,p2)  returns p2 characters of x[] beginning with p1.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** p1 is 1-indexed.  So substr(x,1,1) returns the first character
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of x.  If x is text, then we actually count UTF-8 characters.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If x is a blob, then we count bytes.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If p1 is negative, then we begin abs(p1) from the end of x[].
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If p2 is negative, return the p2 characters preceeding p1.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void substrFunc(
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const unsigned char *z;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const unsigned char *z2;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int len;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int p0type;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 p1, p2;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int negP2 = 0;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( argc==3 || argc==2 );
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3_value_type(argv[1])==SQLITE_NULL
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   || (argc==3 && sqlite3_value_type(argv[2])==SQLITE_NULL)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ){
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p0type = sqlite3_value_type(argv[0]);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p1 = sqlite3_value_int(argv[1]);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p0type==SQLITE_BLOB ){
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = sqlite3_value_bytes(argv[0]);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    z = sqlite3_value_blob(argv[0]);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( z==0 ) return;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( len==sqlite3_value_bytes(argv[0]) );
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    z = sqlite3_value_text(argv[0]);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( z==0 ) return;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = 0;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p1<0 ){
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for(z2=z; *z2; len++){
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SQLITE_SKIP_UTF8(z2);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( argc==3 ){
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p2 = sqlite3_value_int(argv[2]);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p2<0 ){
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p2 = -p2;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      negP2 = 1;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH];
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p1<0 ){
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p1 += len;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p1<0 ){
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p2 += p1;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( p2<0 ) p2 = 0;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p1 = 0;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( p1>0 ){
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p1--;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( p2>0 ){
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p2--;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( negP2 ){
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p1 -= p2;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p1<0 ){
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p2 += p1;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p1 = 0;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p1>=0 && p2>=0 );
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p0type!=SQLITE_BLOB ){
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while( *z && p1 ){
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SQLITE_SKIP_UTF8(z);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p1--;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(z2=z; *z2 && p2; p2--){
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SQLITE_SKIP_UTF8(z2);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_text(context, (char*)z, (int)(z2-z), SQLITE_TRANSIENT);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p1+p2>len ){
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p2 = len-p1;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( p2<0 ) p2 = 0;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_blob(context, (char*)&z[p1], (int)p2, SQLITE_TRANSIENT);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the round() function
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n = 0;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double r;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zBuf;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( argc==1 || argc==2 );
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( argc==2 ){
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    n = sqlite3_value_int(argv[1]);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( n>30 ) n = 30;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( n<0 ) n = 0;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r = sqlite3_value_double(argv[0]);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If Y==0 and X will fit in a 64-bit int,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** handle the rounding directly,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** otherwise use printf.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( n==0 && r>=0 && r<LARGEST_INT64-1 ){
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r = (double)((sqlite_int64)(r+0.5));
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( n==0 && r<0 && (-r)<LARGEST_INT64-1 ){
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r = -(double)((sqlite_int64)((-r)+0.5));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zBuf = sqlite3_mprintf("%.*f",n,r);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zBuf==0 ){
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_error_nomem(context);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3AtoF(zBuf, &r, sqlite3Strlen30(zBuf), SQLITE_UTF8);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_free(zBuf);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_result_double(context, r);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Allocate nByte bytes of space using sqlite3_malloc(). If the
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** allocation fails, call sqlite3_result_error_nomem() to notify
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the database handle that malloc() has failed and return NULL.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If nByte is larger than the maximum string or blob length, then
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** raise an SQLITE_TOOBIG exception and return NULL.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void *contextMalloc(sqlite3_context *context, i64 nByte){
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *z;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = sqlite3_context_db_handle(context);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( nByte>0 );
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] );
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_error_toobig(context);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    z = 0;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    z = sqlite3Malloc((int)nByte);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !z ){
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_error_nomem(context);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return z;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the upper() and lower() SQL functions.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *z1;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *z2;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i, n;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER(argc);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z2 = (char*)sqlite3_value_text(argv[0]);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n = sqlite3_value_bytes(argv[0]);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Verify that the call to _bytes() does not invalidate the _text() pointer */
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( z2==(char*)sqlite3_value_text(argv[0]) );
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( z2 ){
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    z1 = contextMalloc(context, ((i64)n)+1);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( z1 ){
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memcpy(z1, z2, n+1);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for(i=0; z1[i]; i++){
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        z1[i] = (char)sqlite3Toupper(z1[i]);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_text(context, z1, -1, sqlite3_free);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 *z1;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *z2;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i, n;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER(argc);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z2 = (char*)sqlite3_value_text(argv[0]);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n = sqlite3_value_bytes(argv[0]);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Verify that the call to _bytes() does not invalidate the _text() pointer */
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( z2==(char*)sqlite3_value_text(argv[0]) );
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( z2 ){
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    z1 = contextMalloc(context, ((i64)n)+1);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( z1 ){
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memcpy(z1, z2, n+1);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for(i=0; z1[i]; i++){
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        z1[i] = sqlite3Tolower(z1[i]);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_text(context, (char *)z1, -1, sqlite3_free);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0  /* This function is never used. */
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The COALESCE() and IFNULL() functions used to be implemented as shown
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** here.  But now they are implemented as VDBE code so that unused arguments
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** do not have to be computed.  This legacy implementation is retained as
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** comment.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the IFNULL(), NVL(), and COALESCE() functions.
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** All three do the same thing.  They return the first non-NULL
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** argument.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void ifnullFunc(
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<argc; i++){
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( SQLITE_NULL!=sqlite3_value_type(argv[i]) ){
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_value(context, argv[i]);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NOT USED */
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ifnullFunc versionFunc   /* Substitute function - never called */
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of random().  Return a random integer.
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void randomFunc(
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NotUsed,
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **NotUsed2
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite_int64 r;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER2(NotUsed, NotUsed2);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_randomness(sizeof(r), &r);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( r<0 ){
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* We need to prevent a random number of 0x8000000000000000
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** (or -9223372036854775808) since when you do abs() of that
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** number of you get the same value back again.  To do this
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** in a way that is testable, mask the sign bit off of negative
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** values, resulting in a positive value.  Then take the
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** 2s complement of that positive value.  The end result can
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** therefore be no less than -9223372036854775807.
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r = -(r ^ (((sqlite3_int64)1)<<63));
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_result_int64(context, r);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of randomblob(N).  Return a random blob
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that is N bytes long.
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void randomBlob(
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc,
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned char *p;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( argc==1 );
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER(argc);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n = sqlite3_value_int(argv[0]);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( n<1 ){
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    n = 1;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = contextMalloc(context, n);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p ){
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_randomness(n, p);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the last_insert_rowid() SQL function.  The return
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value is the same as the sqlite3_last_insert_rowid() API function.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void last_insert_rowid(
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NotUsed,
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **NotUsed2
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = sqlite3_context_db_handle(context);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER2(NotUsed, NotUsed2);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* IMP: R-51513-12026 The last_insert_rowid() SQL function is a
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** wrapper around the sqlite3_last_insert_rowid() C/C++ interface
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** function. */
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the changes() SQL function.
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** IMP: R-62073-11209 The changes() SQL function is a wrapper
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** around the sqlite3_changes() C/C++ function and hence follows the same
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** rules for counting changes.
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void changes(
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NotUsed,
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **NotUsed2
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = sqlite3_context_db_handle(context);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER2(NotUsed, NotUsed2);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_result_int(context, sqlite3_changes(db));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the total_changes() SQL function.  The return value is
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the same as the sqlite3_total_changes() API function.
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void total_changes(
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NotUsed,
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **NotUsed2
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = sqlite3_context_db_handle(context);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER2(NotUsed, NotUsed2);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* IMP: R-52756-41993 This function is a wrapper around the
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** sqlite3_total_changes() C/C++ interface. */
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_result_int(context, sqlite3_total_changes(db));
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A structure defining how to do GLOB-style comparisons.
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct compareInfo {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 matchAll;
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 matchOne;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 matchSet;
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 noCase;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** For LIKE and GLOB matching on EBCDIC machines, assume that every
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** character is exactly one byte in size.  Also, all characters are
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** able to participate in upper-case-to-lower-case mappings in EBCDIC
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** whereas only characters less than 0x80 do in ASCII.
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SQLITE_EBCDIC)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3Utf8Read(A,C)    (*(A++))
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define GlogUpperToLower(A)     A = sqlite3UpperToLower[A]
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define GlogUpperToLower(A)     if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const struct compareInfo globInfo = { '*', '?', '[', 0 };
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The correct SQL-92 behavior is for the LIKE operator to ignore
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** case.  Thus  'a' LIKE 'A' would be true. */
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const struct compareInfo likeInfoNorm = { '%', '_',   0, 1 };
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is case sensitive causing 'a' LIKE 'A' to be false */
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const struct compareInfo likeInfoAlt = { '%', '_',   0, 0 };
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Compare two UTF-8 strings for equality where the first string can
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** potentially be a "glob" expression.  Return true (1) if they
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are the same and false (0) if they are different.
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Globbing rules:
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**      '*'       Matches any sequence of zero or more characters.
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**      '?'       Matches exactly one character.
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     [...]      Matches one character from the enclosed list of
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**                characters.
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     [^...]     Matches one character not in the enclosed list.
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** With the [...] and [^...] matching, a ']' character can be included
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the list by making it the first character after '[' or '^'.  A
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** range of characters can be specified using '-'.  Example:
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "[a-z]" matches any single lower-case letter.  To match a '-', make
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** it the last character in the list.
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is usually quick, but can be N**2 in the worst case.
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Hints: to match '*' or '?', put them in "[]".  Like this:
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**         abc[*]xyz        Matches "abc*xyz" only
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int patternCompare(
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const u8 *zPattern,              /* The glob pattern */
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const u8 *zString,               /* The string to compare against the glob */
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct compareInfo *pInfo, /* Information about how to do the compare */
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int esc                    /* The escape character */
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int c, c2;
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int invert;
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int seen;
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 matchOne = pInfo->matchOne;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 matchAll = pInfo->matchAll;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 matchSet = pInfo->matchSet;
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 noCase = pInfo->noCase;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int prevEscape = 0;     /* True if the previous character was 'escape' */
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while( (c = sqlite3Utf8Read(zPattern,&zPattern))!=0 ){
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !prevEscape && c==matchAll ){
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while( (c=sqlite3Utf8Read(zPattern,&zPattern)) == matchAll
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               || c == matchOne ){
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( c==matchOne && sqlite3Utf8Read(zString, &zString)==0 ){
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return 0;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( c==0 ){
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 1;
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else if( c==esc ){
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        c = sqlite3Utf8Read(zPattern, &zPattern);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( c==0 ){
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return 0;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else if( c==matchSet ){
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( esc==0 );         /* This is GLOB, not LIKE */
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( matchSet<0x80 );  /* '[' is a single-byte character */
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SQLITE_SKIP_UTF8(zString);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return *zString!=0;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while( (c2 = sqlite3Utf8Read(zString,&zString))!=0 ){
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( noCase ){
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GlogUpperToLower(c2);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GlogUpperToLower(c);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          while( c2 != 0 && c2 != c ){
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            c2 = sqlite3Utf8Read(zString, &zString);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GlogUpperToLower(c2);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          while( c2 != 0 && c2 != c ){
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            c2 = sqlite3Utf8Read(zString, &zString);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( c2==0 ) return 0;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( !prevEscape && c==matchOne ){
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( sqlite3Utf8Read(zString, &zString)==0 ){
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( c==matchSet ){
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int prior_c = 0;
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( esc==0 );    /* This only occurs for GLOB, not LIKE */
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      seen = 0;
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      invert = 0;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c = sqlite3Utf8Read(zString, &zString);
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( c==0 ) return 0;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c2 = sqlite3Utf8Read(zPattern, &zPattern);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( c2=='^' ){
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        invert = 1;
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        c2 = sqlite3Utf8Read(zPattern, &zPattern);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( c2==']' ){
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( c==']' ) seen = 1;
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        c2 = sqlite3Utf8Read(zPattern, &zPattern);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while( c2 && c2!=']' ){
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          c2 = sqlite3Utf8Read(zPattern, &zPattern);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( c>=prior_c && c<=c2 ) seen = 1;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prior_c = 0;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( c==c2 ){
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            seen = 1;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prior_c = c2;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        c2 = sqlite3Utf8Read(zPattern, &zPattern);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( c2==0 || (seen ^ invert)==0 ){
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( esc==c && !prevEscape ){
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prevEscape = 1;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c2 = sqlite3Utf8Read(zString, &zString);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( noCase ){
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GlogUpperToLower(c);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GlogUpperToLower(c2);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( c!=c2 ){
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prevEscape = 0;
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *zString==0;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Count the number of times that the LIKE operator (or GLOB which is
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** just a variation of LIKE) gets called.  This is used for testing
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** only.
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_like_count = 0;
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the like() SQL function.  This function implements
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the build-in LIKE operator.  The first argument to the function is the
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pattern and the second argument is the string.  So, the SQL statements:
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**       A LIKE B
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is implemented as like(B,A).
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This same function (with a different compareInfo structure) computes
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the GLOB operator.
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void likeFunc(
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc,
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const unsigned char *zA, *zB;
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int escape = 0;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nPat;
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = sqlite3_context_db_handle(context);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zB = sqlite3_value_text(argv[0]);
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zA = sqlite3_value_text(argv[1]);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Limit the length of the LIKE or GLOB pattern to avoid problems
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** of deep recursion and N*N behavior in patternCompare().
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nPat = sqlite3_value_bytes(argv[0]);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] );
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 );
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( zB==sqlite3_value_text(argv[0]) );  /* Encoding did not change */
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( argc==3 ){
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The escape character string must consist of a single UTF-8 character.
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Otherwise, return an error.
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char *zEsc = sqlite3_value_text(argv[2]);
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zEsc==0 ) return;
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_error(context,
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "ESCAPE expression must be a single character", -1);
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    escape = sqlite3Utf8Read(zEsc, &zEsc);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zA && zB ){
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct compareInfo *pInfo = sqlite3_user_data(context);
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_like_count++;
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the NULLIF(x,y) function.  The result is the first
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** argument if the arguments are different.  The result is NULL if the
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** arguments are equal to each other.
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void nullifFunc(
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NotUsed,
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CollSeq *pColl = sqlite3GetFuncCollSeq(context);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER(NotUsed);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_value(context, argv[0]);
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the sqlite_version() function.  The result is the version
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the SQLite library that is running.
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void versionFunc(
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NotUsed,
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **NotUsed2
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER2(NotUsed, NotUsed2);
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* IMP: R-48699-48617 This function is an SQL wrapper around the
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** sqlite3_libversion() C-interface. */
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_result_text(context, sqlite3_libversion(), -1, SQLITE_STATIC);
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the sqlite_source_id() function. The result is a string
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that identifies the particular version of the source code used to build
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLite.
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void sourceidFunc(
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NotUsed,
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **NotUsed2
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER2(NotUsed, NotUsed2);
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* IMP: R-24470-31136 This function is an SQL wrapper around the
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** sqlite3_sourceid() C interface. */
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_result_text(context, sqlite3_sourceid(), -1, SQLITE_STATIC);
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the sqlite_compileoption_used() function.
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The result is an integer that identifies if the compiler option
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** was used to build SQLite.
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void compileoptionusedFunc(
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc,
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zOptName;
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( argc==1 );
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER(argc);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* IMP: R-39564-36305 The sqlite_compileoption_used() SQL
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** function is a wrapper around the sqlite3_compileoption_used() C/C++
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** function.
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (zOptName = (const char*)sqlite3_value_text(argv[0]))!=0 ){
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_int(context, sqlite3_compileoption_used(zOptName));
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the sqlite_compileoption_get() function.
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The result is a string that identifies the compiler options
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** used to build SQLite.
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void compileoptiongetFunc(
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc,
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( argc==1 );
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER(argc);
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* IMP: R-04922-24076 The sqlite_compileoption_get() SQL function
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** is a wrapper around the sqlite3_compileoption_get() C/C++ function.
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n = sqlite3_value_int(argv[0]);
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_result_text(context, sqlite3_compileoption_get(n), -1, SQLITE_STATIC);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Array for converting from half-bytes (nybbles) into ASCII hex
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** digits. */
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char hexdigits[] = {
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  '0', '1', '2', '3', '4', '5', '6', '7',
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EXPERIMENTAL - This is not an official function.  The interface may
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** change.  This function may disappear.  Do not write code that depends
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** on this function.
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the QUOTE() function.  This function takes a single
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** argument.  If the argument is numeric, the return value is the same as
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the argument.  If the argument is NULL, the return value is the string
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "NULL".  Otherwise, the argument is enclosed in single quotes with
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** single-quote escapes.
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( argc==1 );
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER(argc);
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( sqlite3_value_type(argv[0]) ){
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_INTEGER:
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_FLOAT: {
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_value(context, argv[0]);
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_BLOB: {
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char *zText = 0;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char const *zBlob = sqlite3_value_blob(argv[0]);
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int nBlob = sqlite3_value_bytes(argv[0]);
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( zText ){
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int i;
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(i=0; i<nBlob; i++){
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zText[(nBlob*2)+2] = '\'';
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zText[(nBlob*2)+3] = '\0';
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zText[0] = 'X';
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zText[1] = '\'';
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3_free(zText);
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_TEXT: {
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int i,j;
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      u64 n;
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const unsigned char *zArg = sqlite3_value_text(argv[0]);
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char *z;
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( zArg==0 ) return;
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      z = contextMalloc(context, ((i64)i)+((i64)n)+3);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( z ){
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        z[0] = '\'';
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(i=0, j=1; zArg[i]; i++){
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          z[j++] = zArg[i];
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( zArg[i]=='\'' ){
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            z[j++] = '\'';
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        z[j++] = '\'';
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        z[j] = 0;
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3_result_text(context, z, j, sqlite3_free);
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default: {
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( sqlite3_value_type(argv[0])==SQLITE_NULL );
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The hex() function.  Interpret the argument as a blob.  Return
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a hexadecimal rendering as text.
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void hexFunc(
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc,
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i, n;
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const unsigned char *pBlob;
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zHex, *z;
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( argc==1 );
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER(argc);
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pBlob = sqlite3_value_blob(argv[0]);
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n = sqlite3_value_bytes(argv[0]);
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pBlob==sqlite3_value_blob(argv[0]) );  /* No encoding change */
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zHex ){
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0; i<n; i++, pBlob++){
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned char c = *pBlob;
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *(z++) = hexdigits[(c>>4)&0xf];
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *(z++) = hexdigits[c&0xf];
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *z = 0;
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_text(context, zHex, n*2, sqlite3_free);
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The zeroblob(N) function returns a zero-filled blob of size N bytes.
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void zeroblobFunc(
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc,
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 n;
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = sqlite3_context_db_handle(context);
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( argc==1 );
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER(argc);
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n = sqlite3_value_int64(argv[0]);
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH] );
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( n>db->aLimit[SQLITE_LIMIT_LENGTH] ){
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_error_toobig(context);
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_zeroblob(context, (int)n); /* IMP: R-00293-64994 */
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The replace() function.  Three arguments are all strings: call
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** them A, B, and C. The result is also a string which is derived
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** from A by replacing every occurance of B with C.  The match
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** must be exact.  Collating sequences are not used.
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void replaceFunc(
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc,
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const unsigned char *zStr;        /* The input string A */
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const unsigned char *zPattern;    /* The pattern string B */
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const unsigned char *zRep;        /* The replacement string C */
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned char *zOut;              /* The output */
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nStr;                /* Size of zStr */
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nPattern;            /* Size of zPattern */
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nRep;                /* Size of zRep */
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 nOut;                /* Maximum size of zOut */
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int loopLimit;           /* Last zStr[] that might match zPattern[] */
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i, j;                /* Loop counters */
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( argc==3 );
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER(argc);
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zStr = sqlite3_value_text(argv[0]);
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zStr==0 ) return;
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nStr = sqlite3_value_bytes(argv[0]);
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( zStr==sqlite3_value_text(argv[0]) );  /* No encoding change */
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zPattern = sqlite3_value_text(argv[1]);
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zPattern==0 ){
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( sqlite3_value_type(argv[1])==SQLITE_NULL
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            || sqlite3_context_db_handle(context)->mallocFailed );
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zPattern[0]==0 ){
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_value(context, argv[0]);
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nPattern = sqlite3_value_bytes(argv[1]);
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( zPattern==sqlite3_value_text(argv[1]) );  /* No encoding change */
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zRep = sqlite3_value_text(argv[2]);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zRep==0 ) return;
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nRep = sqlite3_value_bytes(argv[2]);
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( zRep==sqlite3_value_text(argv[2]) );
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nOut = nStr + 1;
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( nOut<SQLITE_MAX_LENGTH );
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zOut = contextMalloc(context, (i64)nOut);
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zOut==0 ){
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loopLimit = nStr - nPattern;
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=j=0; i<=loopLimit; i++){
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zOut[j++] = zStr[i];
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      u8 *zOld;
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3 *db = sqlite3_context_db_handle(context);
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nOut += nRep - nPattern;
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3_result_error_toobig(context);
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3_free(zOut);
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zOld = zOut;
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zOut = sqlite3_realloc(zOut, (int)nOut);
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( zOut==0 ){
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3_result_error_nomem(context);
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3_free(zOld);
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memcpy(&zOut[j], zRep, nRep);
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      j += nRep;
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      i += nPattern-1;
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( j+nStr-i+1==nOut );
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(&zOut[j], &zStr[i], nStr-i);
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  j += nStr - i;
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( j<=nOut );
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zOut[j] = 0;
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void trimFunc(
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc,
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const unsigned char *zIn;         /* Input string */
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const unsigned char *zCharSet;    /* Set of characters to trim */
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nIn;                          /* Number of bytes in input */
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int flags;                        /* 1: trimleft  2: trimright  3: trim */
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;                            /* Loop counter */
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned char *aLen = 0;          /* Length of each character in zCharSet */
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned char **azChar = 0;       /* Individual characters in zCharSet */
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nChar;                        /* Number of characters in zCharSet */
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zIn = sqlite3_value_text(argv[0]);
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zIn==0 ) return;
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nIn = sqlite3_value_bytes(argv[0]);
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( zIn==sqlite3_value_text(argv[0]) );
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( argc==1 ){
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const unsigned char lenOne[] = { 1 };
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static unsigned char * const azOne[] = { (u8*)" " };
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nChar = 1;
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aLen = (u8*)lenOne;
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    azChar = (unsigned char **)azOne;
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zCharSet = 0;
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const unsigned char *z;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(z=zCharSet, nChar=0; *z; nChar++){
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SQLITE_SKIP_UTF8(z);
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( nChar>0 ){
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( azChar==0 ){
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aLen = (unsigned char*)&azChar[nChar];
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for(z=zCharSet, nChar=0; *z; nChar++){
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        azChar[nChar] = (unsigned char *)z;
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SQLITE_SKIP_UTF8(z);
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        aLen[nChar] = (u8)(z - azChar[nChar]);
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( nChar>0 ){
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( flags & 1 ){
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while( nIn>0 ){
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int len = 0;
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(i=0; i<nChar; i++){
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          len = aLen[i];
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( len<=nIn && memcmp(zIn, azChar[i], len)==0 ) break;
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( i>=nChar ) break;
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zIn += len;
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nIn -= len;
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( flags & 2 ){
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while( nIn>0 ){
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int len = 0;
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(i=0; i<nChar; i++){
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          len = aLen[i];
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( i>=nChar ) break;
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nIn -= len;
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zCharSet ){
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_free((void*)azChar);
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* IMP: R-25361-16150 This function is omitted from SQLite by default. It
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is only available if the SQLITE_SOUNDEX compile-time option is used
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** when SQLite is built.
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_SOUNDEX
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Compute the soundex encoding of a word.
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** IMP: R-59782-00072 The soundex(X) function returns a string that is the
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** soundex encoding of the string X.
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void soundexFunc(
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc,
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char zResult[8];
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const u8 *zIn;
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i, j;
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const unsigned char iCode[] = {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( argc==1 );
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zIn = (u8*)sqlite3_value_text(argv[0]);
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zIn==0 ) zIn = (u8*)"";
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zIn[i] ){
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    u8 prevcode = iCode[zIn[i]&0x7f];
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zResult[0] = sqlite3Toupper(zIn[i]);
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(j=1; j<4 && zIn[i]; i++){
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int code = iCode[zIn[i]&0x7f];
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( code>0 ){
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( code!=prevcode ){
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prevcode = code;
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          zResult[j++] = code + '0';
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prevcode = 0;
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while( j<4 ){
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zResult[j++] = '0';
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zResult[j] = 0;
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* IMP: R-64894-50321 The string "?000" is returned if the argument
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** is NULL or contains no ASCII alphabetic characters. */
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_SOUNDEX */
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_LOAD_EXTENSION
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A function that loads a shared-library extension then returns NULL.
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zFile = (const char *)sqlite3_value_text(argv[0]);
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zProc;
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = sqlite3_context_db_handle(context);
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zErrMsg = 0;
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( argc==2 ){
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zProc = (const char *)sqlite3_value_text(argv[1]);
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zProc = 0;
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_error(context, zErrMsg, -1);
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_free(zErrMsg);
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** An instance of the following structure holds the context of a
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sum() or avg() aggregate computation.
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct SumCtx SumCtx;
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct SumCtx {
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double rSum;      /* Floating point sum */
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 iSum;         /* Integer sum */
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 cnt;          /* Number of elements summed */
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 overflow;      /* True if integer overflow seen */
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 approx;        /* True if non-integer value was input to the sum */
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Routines used to compute the sum, average, and total.
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The SUM() function follows the (broken) SQL standard which means
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that it returns NULL if it sums over no inputs.  TOTAL returns
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 0.0 in that case.  In addition, TOTAL always returns a float where
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SUM might return an integer if it never encounters a floating point
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value.  TOTAL never fails, but SUM might through an exception if
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** it overflows an integer.
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SumCtx *p;
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int type;
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( argc==1 );
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER(argc);
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = sqlite3_aggregate_context(context, sizeof(*p));
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  type = sqlite3_value_numeric_type(argv[0]);
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p && type!=SQLITE_NULL ){
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->cnt++;
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( type==SQLITE_INTEGER ){
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      i64 v = sqlite3_value_int64(argv[0]);
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->rSum += v;
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( (p->approx|p->overflow)==0 && sqlite3AddInt64(&p->iSum, v) ){
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p->overflow = 1;
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->rSum += sqlite3_value_double(argv[0]);
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->approx = 1;
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void sumFinalize(sqlite3_context *context){
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SumCtx *p;
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = sqlite3_aggregate_context(context, 0);
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p && p->cnt>0 ){
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->overflow ){
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_error(context,"integer overflow",-1);
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( p->approx ){
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_double(context, p->rSum);
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_int64(context, p->iSum);
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void avgFinalize(sqlite3_context *context){
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SumCtx *p;
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = sqlite3_aggregate_context(context, 0);
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p && p->cnt>0 ){
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_result_double(context, p->rSum/(double)p->cnt);
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void totalFinalize(sqlite3_context *context){
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SumCtx *p;
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = sqlite3_aggregate_context(context, 0);
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_result_double(context, p ? p->rSum : (double)0);
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following structure keeps track of state information for the
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** count() aggregate function.
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct CountCtx CountCtx;
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CountCtx {
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 n;
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Routines to implement the count() aggregate function.
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CountCtx *p;
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = sqlite3_aggregate_context(context, sizeof(*p));
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->n++;
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DEPRECATED
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The sqlite3_aggregate_count() function is deprecated.  But just to make
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** sure it still operates correctly, verify that its count agrees with our
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** internal count when using count(*) and when the total count can be
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** expressed as a 32-bit integer. */
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( argc==1 || p==0 || p->n>0x7fffffff
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          || p->n==sqlite3_aggregate_count(context) );
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void countFinalize(sqlite3_context *context){
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CountCtx *p;
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = sqlite3_aggregate_context(context, 0);
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_result_int64(context, p ? p->n : 0);
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Routines to implement min() and max() aggregate functions.
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void minmaxStep(
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NotUsed,
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pArg  = (Mem *)argv[0];
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pBest;
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER(NotUsed);
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !pBest ) return;
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pBest->flags ){
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int max;
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int cmp;
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CollSeq *pColl = sqlite3GetFuncCollSeq(context);
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* This step function is used for both the min() and max() aggregates,
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** the only difference between the two being that the sense of the
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** comparison is inverted. For the max() aggregate, the
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** sqlite3_user_data() function returns (void *)-1. For min() it
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** returns (void *)db, where db is the sqlite3* database pointer.
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Therefore the next statement sets variable 'max' to 1 for the max()
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** aggregate, or 0 for min().
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max = sqlite3_user_data(context)!=0;
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmp = sqlite3MemCompare(pBest, pArg, pColl);
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (max && cmp<0) || (!max && cmp>0) ){
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemCopy(pBest, pArg);
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemCopy(pBest, pArg);
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void minMaxFinalize(sqlite3_context *context){
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value *pRes;
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pRes ){
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( ALWAYS(pRes->flags) ){
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_value(context, pRes);
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemRelease(pRes);
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** group_concat(EXPR, ?SEPARATOR?)
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void groupConcatStep(
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context *context,
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc,
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **argv
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zVal;
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StrAccum *pAccum;
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zSep;
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nVal, nSep;
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( argc==1 || argc==2 );
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pAccum ){
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3 *db = sqlite3_context_db_handle(context);
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int firstTerm = pAccum->useMalloc==0;
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pAccum->useMalloc = 2;
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !firstTerm ){
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( argc==2 ){
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zSep = (char*)sqlite3_value_text(argv[1]);
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nSep = sqlite3_value_bytes(argv[1]);
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zSep = ",";
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nSep = 1;
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3StrAccumAppend(pAccum, zSep, nSep);
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zVal = (char*)sqlite3_value_text(argv[0]);
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nVal = sqlite3_value_bytes(argv[0]);
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3StrAccumAppend(pAccum, zVal, nVal);
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void groupConcatFinalize(sqlite3_context *context){
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StrAccum *pAccum;
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pAccum = sqlite3_aggregate_context(context, 0);
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pAccum ){
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pAccum->tooBig ){
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_error_toobig(context);
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( pAccum->mallocFailed ){
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_error_nomem(context);
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          sqlite3_free);
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine does per-connection function registration.  Most
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the built-in functions above are part of the global function set.
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine only deals with those that are not global.
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc = sqlite3_overload_function(db, "MATCH", 2);
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_NOMEM ){
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->mallocFailed = 1;
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the LIKEOPT flag on the 2-argument function with the given name.
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FuncDef *pDef;
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             2, SQLITE_UTF8, 0);
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(pDef) ){
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pDef->flags = flagVal;
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Register the built-in LIKE and GLOB functions.  The caseSensitive
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parameter determines whether or not the LIKE operator is case
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sensitive.  GLOB is always case sensitive.
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct compareInfo *pInfo;
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( caseSensitive ){
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pInfo = (struct compareInfo*)&likeInfoAlt;
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pInfo = (struct compareInfo*)&likeInfoNorm;
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0);
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0);
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (struct compareInfo*)&globInfo, likeFunc, 0, 0, 0);
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  setLikeOptFlag(db, "like",
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pExpr points to an expression which implements a function.  If
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** it is appropriate to apply the LIKE optimization to that function
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then set aWc[0] through aWc[2] to the wildcard characters and
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** return TRUE.  If the function is not a LIKE-style function then
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** return FALSE.
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FuncDef *pDef;
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pExpr->op!=TK_FUNCTION
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   || !pExpr->x.pList
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   || pExpr->x.pList->nExpr!=2
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ){
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pDef = sqlite3FindFunction(db, pExpr->u.zToken,
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             sqlite3Strlen30(pExpr->u.zToken),
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             2, SQLITE_UTF8, 0);
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( NEVER(pDef==0) || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The memcpy() statement assumes that the wildcard characters are
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the first three statements in the compareInfo structure.  The
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** asserts() that follow verify that assumption
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(aWc, pDef->pUserData, 3);
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 1;
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** All all of the FuncDef structures in the aBuiltinFunc[] array above
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the global function hash table.  This occurs at start-time (as
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a consequence of calling sqlite3_initialize()).
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** After this routine runs
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3RegisterGlobalFunctions(void){
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** The following array holds FuncDef structures for all of the functions
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** defined in this file.
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** The array cannot be constant since changes are made to the
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** FuncDef.pHash elements at start-time.  The elements of this array
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** are read-only after initialization is complete.
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static SQLITE_WSD FuncDef aBuiltinFunc[] = {
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(ltrim,              1, 1, 0, trimFunc         ),
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(ltrim,              2, 1, 0, trimFunc         ),
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(rtrim,              1, 2, 0, trimFunc         ),
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(rtrim,              2, 2, 0, trimFunc         ),
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(trim,               1, 3, 0, trimFunc         ),
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(trim,               2, 3, 0, trimFunc         ),
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(min,               -1, 0, 1, minmaxFunc       ),
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(min,                0, 0, 1, 0                ),
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AGGREGATE(min,               1, 0, 1, minmaxStep,      minMaxFinalize ),
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(max,               -1, 1, 1, minmaxFunc       ),
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(max,                0, 1, 1, 0                ),
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AGGREGATE(max,               1, 1, 1, minmaxStep,      minMaxFinalize ),
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(typeof,             1, 0, 0, typeofFunc       ),
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(length,             1, 0, 0, lengthFunc       ),
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(substr,             2, 0, 0, substrFunc       ),
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(substr,             3, 0, 0, substrFunc       ),
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(abs,                1, 0, 0, absFunc          ),
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(round,              1, 0, 0, roundFunc        ),
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(round,              2, 0, 0, roundFunc        ),
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(upper,              1, 0, 0, upperFunc        ),
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(lower,              1, 0, 0, lowerFunc        ),
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(coalesce,           1, 0, 0, 0                ),
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(coalesce,           0, 0, 0, 0                ),
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*  FUNCTION(coalesce,          -1, 0, 0, ifnullFunc       ), */
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {-1,SQLITE_UTF8,SQLITE_FUNC_COALESCE,0,0,ifnullFunc,0,0,"coalesce",0,0},
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(hex,                1, 0, 0, hexFunc          ),
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*  FUNCTION(ifnull,             2, 0, 0, ifnullFunc       ), */
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {2,SQLITE_UTF8,SQLITE_FUNC_COALESCE,0,0,ifnullFunc,0,0,"ifnull",0,0},
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(random,             0, 0, 0, randomFunc       ),
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(randomblob,         1, 0, 0, randomBlob       ),
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(nullif,             2, 0, 1, nullifFunc       ),
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(sqlite_version,     0, 0, 0, versionFunc      ),
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(sqlite_source_id,   0, 0, 0, sourceidFunc     ),
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc  ),
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc  ),
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(quote,              1, 0, 0, quoteFunc        ),
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(last_insert_rowid,  0, 0, 0, last_insert_rowid),
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(changes,            0, 0, 0, changes          ),
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(total_changes,      0, 0, 0, total_changes    ),
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(replace,            3, 0, 0, replaceFunc      ),
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(zeroblob,           1, 0, 0, zeroblobFunc     ),
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #ifdef SQLITE_SOUNDEX
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(soundex,            1, 0, 0, soundexFunc      ),
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #endif
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #ifndef SQLITE_OMIT_LOAD_EXTENSION
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(load_extension,     1, 0, 0, loadExt          ),
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTION(load_extension,     2, 0, 0, loadExt          ),
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #endif
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AGGREGATE(sum,               1, 0, 0, sumStep,         sumFinalize    ),
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AGGREGATE(total,             1, 0, 0, sumStep,         totalFinalize    ),
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AGGREGATE(avg,               1, 0, 0, sumStep,         avgFinalize    ),
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* AGGREGATE(count,             0, 0, 0, countStep,       countFinalize  ), */
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {0,SQLITE_UTF8,SQLITE_FUNC_COUNT,0,0,0,countStep,countFinalize,"count",0,0},
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AGGREGATE(count,             1, 0, 0, countStep,       countFinalize  ),
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AGGREGATE(group_concat,      1, 0, 0, groupConcatStep, groupConcatFinalize),
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AGGREGATE(group_concat,      2, 0, 0, groupConcatStep, groupConcatFinalize),
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #ifdef SQLITE_CASE_SENSITIVE_LIKE
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #else
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #endif
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<ArraySize(aBuiltinFunc); i++){
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3FuncDefInsert(pHash, &aFunc[i]);
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3RegisterDateTimeFunctions();
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_ALTERTABLE
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3AlterFunctions();
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1592