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