15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2001 September 15 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)** Utility functions used throughout sqlite. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file contains functions for allocating memory, comparing 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** strings, and stuff like that. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdarg.h> 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_HAVE_ISNAN 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <math.h> 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Routine needed to support the testcase() macro. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_COVERAGE_TEST 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3Coverage(int x){ 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static unsigned dummy = 0; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dummy += (unsigned)x; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return true if the floating point value is Not a Number (NaN). 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Use the math library isnan() function if compiled with SQLITE_HAVE_ISNAN. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Otherwise, we have our own implementation that works on most systems. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3IsNaN(double x){ 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; /* The value return */ 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_HAVE_ISNAN) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Systems that support the isnan() library function should probably 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** make use of it by compiling with -DSQLITE_HAVE_ISNAN. But we have 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** found that many systems do not have a working isnan() function so 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** this implementation is provided as an alternative. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** This NaN test sometimes fails if compiled on GCC with -ffast-math. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** On the other hand, the use of -ffast-math comes with the following 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** warning: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** This option [-ffast-math] should never be turned on by any 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** -O option since it can result in incorrect output for programs 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** which depend on an exact implementation of IEEE or ISO 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** rules/specifications for math functions. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Under MSVC, this NaN test may fail if compiled with a floating- 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** point precision mode other than /fp:precise. From the MSDN 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** documentation: 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The compiler [with /fp:precise] will properly handle comparisons 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** involving NaN. For example, x != x evaluates to true if x is NaN 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** ... 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __FAST_MATH__ 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# error SQLite will not work correctly with the -ffast-math option of GCC. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile double y = x; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile double z = y; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = (y!=z); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else /* if defined(SQLITE_HAVE_ISNAN) */ 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = isnan(x); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_HAVE_ISNAN */ 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( rc ); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rc; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_FLOATING_POINT */ 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Compute a string length that is limited to what can be stored in 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** lower 30 bits of a 32-bit signed integer. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The value returned will never be negative. Nor will it ever be greater 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** than the actual length of the string. For very long strings (greater 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** than 1GiB) the value returned might be less than the true string length. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3Strlen30(const char *z){ 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *z2 = z; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( z==0 ) return 0; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( *z2 ){ z2++; } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0x3fffffff & (int)(z2 - z); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the most recent error code and error string for the sqlite 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** handle "db". The error code is set to "err_code". 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If it is not NULL, string zFormat specifies the format of the 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** error string in the style of the printf functions: The following 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** format characters are allowed: 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** %s Insert a string 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** %z A string that should be freed after use 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** %d Insert an integer 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** %T Insert a token 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** %S Insert the first element of a SrcList 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** zFormat and any string tokens that follow it are assumed to be 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** encoded in UTF-8. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** To clear the most recent error for sqlite handle "db", sqlite3Error 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** should be called with err_code set to SQLITE_OK and zFormat set 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to NULL. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3Error(sqlite3 *db, int err_code, const char *zFormat, ...){ 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db && (db->pErr || (db->pErr = sqlite3ValueNew(db))!=0) ){ 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->errCode = err_code; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zFormat ){ 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *z; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, zFormat); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z = sqlite3VMPrintf(db, zFormat, ap); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ValueSetStr(db->pErr, -1, z, SQLITE_UTF8, SQLITE_DYNAMIC); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ValueSetStr(db->pErr, 0, 0, SQLITE_UTF8, SQLITE_STATIC); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add an error message to pParse->zErrMsg and increment pParse->nErr. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following formatting characters are allowed: 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** %s Insert a string 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** %z A string that should be freed after use 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** %d Insert an integer 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** %T Insert a token 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** %S Insert the first element of a SrcList 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function should be used to report any error that occurs whilst 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** compiling an SQL statement (i.e. within sqlite3_prepare()). The 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** last thing the sqlite3_prepare() function does is copy the error 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** stored by this function into the database handle using sqlite3Error(). 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Function sqlite3Error() should be used during statement execution 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (sqlite3_step() etc.). 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zMsg; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, zFormat); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zMsg = sqlite3VMPrintf(db, zFormat, ap); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->suppressErr ){ 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, zMsg); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nErr++; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, pParse->zErrMsg); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->zErrMsg = zMsg; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->rc = SQLITE_ERROR; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Convert an SQL-style quoted string into a normal string by removing 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the quote characters. The conversion is done in-place. If the 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** input does not begin with a quote character, then this routine 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is a no-op. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The input string must be zero-terminated. A new zero-terminator 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is added to the dequoted string. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The return value is -1 if no dequoting occurs or the length of the 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** dequoted string, exclusive of the zero terminator, if dequoting does 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** occur. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2002-Feb-14: This routine is extended to remove MS-Access style 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** brackets from around identifers. For example: "[a-b-c]" becomes 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "a-b-c". 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3Dequote(char *z){ 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char quote; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( z==0 ) return -1; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) quote = z[0]; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( quote ){ 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case '\'': break; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case '"': break; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case '`': break; /* For MySQL compatibility */ 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case '[': quote = ']'; break; /* For MS SqlServer compatibility */ 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: return -1; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=1, j=0; ALWAYS(z[i]); i++){ 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( z[i]==quote ){ 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( z[i+1]==quote ){ 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z[j++] = quote; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i++; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z[j++] = z[i]; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z[j] = 0; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return j; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Convenient short-hand */ 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UpperToLower sqlite3UpperToLower 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Some systems have stricmp(). Others have strcasecmp(). Because 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** there is no consistency, we will define our own. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** IMPLEMENTATION-OF: R-20522-24639 The sqlite3_strnicmp() API allows 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** applications and extensions to compare the contents of two buffers 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** containing UTF-8 strings in a case-independent fashion, using the same 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** definition of case independence that SQLite uses internally when 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** comparing identifiers. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3StrICmp(const char *zLeft, const char *zRight){ 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register unsigned char *a, *b; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = (unsigned char *)zLeft; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = (unsigned char *)zRight; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; } 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UpperToLower[*a] - UpperToLower[*b]; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_strnicmp(const char *zLeft, const char *zRight, int N){ 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register unsigned char *a, *b; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = (unsigned char *)zLeft; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = (unsigned char *)zRight; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( N-- > 0 && *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; } 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return N<0 ? 0 : UpperToLower[*a] - UpperToLower[*b]; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The string z[] is an text representation of a real number. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Convert this string to a double and write it into *pResult. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The string z[] is length bytes in length (bytes, not characters) and 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** uses the encoding enc. The string is not necessarily zero-terminated. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return TRUE if the result is a valid real number (or integer) and FALSE 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if the string is empty or contains extraneous text. Valid numbers 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are in one of these formats: 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** [+-]digits[E[+-]digits] 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** [+-]digits.[digits][E[+-]digits] 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** [+-].digits[E[+-]digits] 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Leading and trailing whitespace is ignored for the purpose of determining 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** validity. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If some prefix of the input string is a valid number, this routine 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** returns FALSE but it still converts the prefix and writes the result 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** into *pResult. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){ 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int incr = (enc==SQLITE_UTF8?1:2); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zEnd = z + length; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* sign * significand * (10 ^ (esign * exponent)) */ 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sign = 1; /* sign of significand */ 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i64 s = 0; /* significand */ 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int d = 0; /* adjust exponent for shifting decimal point */ 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int esign = 1; /* sign of exponent */ 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int e = 0; /* exponent */ 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int eValid = 1; /* True exponent is either not used or is well-formed */ 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double result; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nDigits = 0; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pResult = 0.0; /* Default return value, in case of an error */ 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( enc==SQLITE_UTF16BE ) z++; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* skip leading spaces */ 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( z<zEnd && sqlite3Isspace(*z) ) z+=incr; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( z>=zEnd ) return 0; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* get sign of significand */ 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( *z=='-' ){ 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sign = -1; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z+=incr; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( *z=='+' ){ 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z+=incr; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* skip leading zeroes */ 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( z<zEnd && z[0]=='0' ) z+=incr, nDigits++; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* copy max significant digits to significand */ 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( z<zEnd && sqlite3Isdigit(*z) && s<((LARGEST_INT64-9)/10) ){ 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s = s*10 + (*z - '0'); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z+=incr, nDigits++; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* skip non-significant significand digits 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** (increase exponent by d to shift decimal left) */ 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( z<zEnd && sqlite3Isdigit(*z) ) z+=incr, nDigits++, d++; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( z>=zEnd ) goto do_atof_calc; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* if decimal point is present */ 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( *z=='.' ){ 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z+=incr; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* copy digits from after decimal to significand 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** (decrease exponent by d to shift decimal right) */ 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( z<zEnd && sqlite3Isdigit(*z) && s<((LARGEST_INT64-9)/10) ){ 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s = s*10 + (*z - '0'); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z+=incr, nDigits++, d--; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* skip non-significant digits */ 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( z<zEnd && sqlite3Isdigit(*z) ) z+=incr, nDigits++; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( z>=zEnd ) goto do_atof_calc; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* if exponent is present */ 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( *z=='e' || *z=='E' ){ 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z+=incr; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eValid = 0; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( z>=zEnd ) goto do_atof_calc; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* get sign of exponent */ 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( *z=='-' ){ 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) esign = -1; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z+=incr; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( *z=='+' ){ 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z+=incr; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* copy digits to exponent */ 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( z<zEnd && sqlite3Isdigit(*z) ){ 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) e = e*10 + (*z - '0'); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z+=incr; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eValid = 1; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* skip trailing spaces */ 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nDigits && eValid ){ 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( z<zEnd && sqlite3Isspace(*z) ) z+=incr; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)do_atof_calc: 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* adjust exponent by d, and update sign */ 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) e = (e*esign) + d; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( e<0 ) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) esign = -1; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) e *= -1; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) esign = 1; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* if 0 significand */ 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !s ) { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* In the IEEE 754 standard, zero is signed. 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Add the sign if we've seen at least one digit */ 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = (sign<0 && nDigits) ? -(double)0 : (double)0; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* attempt to reduce exponent */ 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( esign>0 ){ 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( s<(LARGEST_INT64/10) && e>0 ) e--,s*=10; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( !(s%10) && e>0 ) e--,s/=10; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* adjust the sign of significand */ 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s = sign<0 ? -s : s; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* if exponent, scale significand as appropriate 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** and store in result. */ 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( e ){ 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double scale = 1.0; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* attempt to handle extremely small/large numbers better */ 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( e>307 && e<342 ){ 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( e%308 ) { scale *= 1.0e+1; e -= 1; } 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( esign<0 ){ 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = s / scale; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result /= 1.0e+308; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = s * scale; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result *= 1.0e+308; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 1.0e+22 is the largest power of 10 than can be 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** represented exactly. */ 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( e%22 ) { scale *= 1.0e+1; e -= 1; } 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( e>0 ) { scale *= 1.0e+22; e -= 22; } 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( esign<0 ){ 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = s / scale; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = s * scale; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = (double)s; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* store the result */ 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pResult = result; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* return true if number and no extra non-whitespace chracters after */ 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return z>=zEnd && nDigits>0 && eValid; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !sqlite3Atoi64(z, pResult, length, enc); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_FLOATING_POINT */ 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Compare the 19-character string zNum against the text representation 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value 2^63: 9223372036854775808. Return negative, zero, or positive 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if zNum is less than, equal to, or greater than the string. 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Note that zNum must contain exactly 19 characters. 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Unlike memcmp() this routine is guaranteed to return the difference 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the values of the last digit if the only difference is in the 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** last digit. So, for example, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** compare2pow63("9223372036854775800", 1) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** will return -8. 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int compare2pow63(const char *zNum, int incr){ 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int c = 0; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 012345678901234567 */ 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *pow63 = "922337203685477580"; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; c==0 && i<18; i++){ 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = (zNum[i*incr]-pow63[i])*10; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( c==0 ){ 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = zNum[18*incr] - '8'; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( c==(-1) ); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( c==0 ); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( c==(+1) ); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return c; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Convert zNum to a 64-bit signed integer. 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the zNum value is representable as a 64-bit twos-complement 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** integer, then write that value into *pNum and return 0. 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If zNum is exactly 9223372036854665808, return 2. This special 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** case is broken out because while 9223372036854665808 cannot be a 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** signed 64-bit integer, its negative -9223372036854665808 can be. 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If zNum is too big for a 64-bit integer and is not 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 9223372036854665808 then return 1. 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** length is the number of bytes in the string (bytes, not characters). 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The string is not necessarily zero-terminated. The encoding is 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** given by enc. 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc){ 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int incr = (enc==SQLITE_UTF8?1:2); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u64 u = 0; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int neg = 0; /* assume positive */ 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int c = 0; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zStart; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zEnd = zNum + length; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( enc==SQLITE_UTF16BE ) zNum++; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( zNum<zEnd && sqlite3Isspace(*zNum) ) zNum+=incr; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zNum<zEnd ){ 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( *zNum=='-' ){ 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) neg = 1; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zNum+=incr; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( *zNum=='+' ){ 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zNum+=incr; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zStart = zNum; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( zNum<zEnd && zNum[0]=='0' ){ zNum+=incr; } /* Skip leading zeros. */ 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; &zNum[i]<zEnd && (c=zNum[i])>='0' && c<='9'; i+=incr){ 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u = u*10 + c - '0'; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( u>LARGEST_INT64 ){ 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pNum = SMALLEST_INT64; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( neg ){ 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pNum = -(i64)u; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pNum = (i64)u; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( i==18 ); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( i==19 ); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( i==20 ); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (c!=0 && &zNum[i]<zEnd) || (i==0 && zStart==zNum) || i>19*incr ){ 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* zNum is empty or contains non-numeric text or is longer 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** than 19 digits (thus guaranteeing that it is too large) */ 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( i<19*incr ){ 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Less than 19 digits, so we know that it fits in 64 bits */ 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( u<=LARGEST_INT64 ); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* zNum is a 19-digit numbers. Compare it against 9223372036854775808. */ 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = compare2pow63(zNum, incr); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( c<0 ){ 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* zNum is less than 9223372036854775808 so it fits */ 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( u<=LARGEST_INT64 ); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( c>0 ){ 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* zNum is greater than 9223372036854775808 so it overflows */ 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* zNum is exactly 9223372036854775808. Fits if negative. The 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** special case 2 overflow if positive */ 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( u-1==LARGEST_INT64 ); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( (*pNum)==SMALLEST_INT64 ); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return neg ? 0 : 2; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If zNum represents an integer that will fit in 32-bits, then set 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** *pValue to that integer and return true. Otherwise return false. 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Any non-numeric characters that following zNum are ignored. 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This is different from sqlite3Atoi64() which requires the 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** input number to be zero-terminated. 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3GetInt32(const char *zNum, int *pValue){ 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite_int64 v = 0; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, c; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int neg = 0; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zNum[0]=='-' ){ 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) neg = 1; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zNum++; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( zNum[0]=='+' ){ 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zNum++; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( zNum[0]=='0' ) zNum++; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<11 && (c = zNum[i] - '0')>=0 && c<=9; i++){ 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = v*10 + c; 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The longest decimal representation of a 32 bit integer is 10 digits: 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 1234567890 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 2^31 -> 2147483648 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( i==10 ); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i>10 ){ 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( v-neg==2147483647 ); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( v-neg>2147483647 ){ 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( neg ){ 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = -v; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pValue = (int)v; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return a 32-bit integer value extracted from a string. If the 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** string is not an integer, just return 0. 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3Atoi(const char *z){ 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x = 0; 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( z ) sqlite3GetInt32(z, &x); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return x; 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The variable-length integer encoding is as follows: 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** KEY: 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A = 0xxxxxxx 7 bits of data and one flag bit 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** B = 1xxxxxxx 7 bits of data and one flag bit 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** C = xxxxxxxx 8 bits of data 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 7 bits - A 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 14 bits - BA 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 21 bits - BBA 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 28 bits - BBBA 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 35 bits - BBBBA 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 42 bits - BBBBBA 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 49 bits - BBBBBBA 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 56 bits - BBBBBBBA 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 64 bits - BBBBBBBBC 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write a 64-bit variable-length integer to memory starting at p[0]. 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The length of data write will be between 1 and 9 bytes. The number 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of bytes written is returned. 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A variable-length integer consists of the lower 7 bits of each byte 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for all bytes that have the 8th bit set and one byte with the 8th 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** bit clear. Except, if we get to the 9th byte, it stores the full 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8 bits and is the last byte. 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3PutVarint(unsigned char *p, u64 v){ 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j, n; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 buf[10]; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( v & (((u64)0xff000000)<<32) ){ 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p[8] = (u8)v; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v >>= 8; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=7; i>=0; i--){ 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p[i] = (u8)((v & 0x7f) | 0x80); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v >>= 7; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 9; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = 0; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do{ 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf[n++] = (u8)((v & 0x7f) | 0x80); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v >>= 7; 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }while( v!=0 ); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf[0] &= 0x7f; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( n<=9 ); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, j=n-1; j>=0; j--, i++){ 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p[i] = buf[j]; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return n; 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is a faster version of sqlite3PutVarint() that only 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** works for 32-bit positive integers and which is optimized for 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the common case of small integers. A MACRO version, putVarint32, 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is provided which inlines the single-byte case. All code should use 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the MACRO version as this function assumes the single-byte case has 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** already been handled. 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3PutVarint32(unsigned char *p, u32 v){ 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef putVarint32 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (v & ~0x7f)==0 ){ 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p[0] = v; 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (v & ~0x3fff)==0 ){ 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p[0] = (u8)((v>>7) | 0x80); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p[1] = (u8)(v & 0x7f); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3PutVarint(p, v); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Bitmasks used by sqlite3GetVarint(). These precomputed constants 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are defined here rather than simply putting the constant expressions 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** inline in order to work around bugs in the RVT compiler. 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SLOT_2_0 A mask for (0x7f<<14) | 0x7f 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SLOT_4_2_0 A mask for (0x7f<<28) | SLOT_2_0 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SLOT_2_0 0x001fc07f 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SLOT_4_2_0 0xf01fc07f 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Read a 64-bit variable-length integer from memory starting at p[0]. 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of bytes read. The value is stored in *v. 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)u8 sqlite3GetVarint(const unsigned char *p, u64 *v){ 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u32 a,b,s; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = *p; 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* a: p0 (unmasked) */ 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(a&0x80)) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = a; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = *p; 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* b: p1 (unmasked) */ 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(b&0x80)) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a &= 0x7f; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = a<<7; 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a |= b; 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = a; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2; 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Verify that constants are precomputed correctly */ 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( SLOT_2_0 == ((0x7f<<14) | (0x7f)) ); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( SLOT_4_2_0 == ((0xfU<<28) | (0x7f<<14) | (0x7f)) ); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = a<<14; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a |= *p; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* a: p0<<14 | p2 (unmasked) */ 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(a&0x80)) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a &= SLOT_2_0; 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b &= 0x7f; 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = b<<7; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a |= b; 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = a; 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 3; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* CSE1 from below */ 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a &= SLOT_2_0; 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = b<<14; 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b |= *p; 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* b: p1<<14 | p3 (unmasked) */ 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(b&0x80)) 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b &= SLOT_2_0; 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* moved CSE1 up */ 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* a &= (0x7f<<14)|(0x7f); */ 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = a<<7; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a |= b; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = a; 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 4; 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* a: p0<<14 | p2 (masked) */ 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* b: p1<<14 | p3 (unmasked) */ 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 1:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* moved CSE1 up */ 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* a &= (0x7f<<14)|(0x7f); */ 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b &= SLOT_2_0; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s = a; 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* s: p0<<14 | p2 (masked) */ 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = a<<14; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a |= *p; 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* a: p0<<28 | p2<<14 | p4 (unmasked) */ 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(a&0x80)) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* we can skip these cause they were (effectively) done above in calc'ing s */ 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* a &= (0x7f<<28)|(0x7f<<14)|(0x7f); */ 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* b &= (0x7f<<14)|(0x7f); */ 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = b<<7; 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a |= b; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s = s>>18; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = ((u64)s)<<32 | a; 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 5; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 2:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s = s<<7; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s |= b; 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* s: p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = b<<14; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b |= *p; 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* b: p1<<28 | p3<<14 | p5 (unmasked) */ 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(b&0x80)) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* we can skip this cause it was (effectively) done above in calc'ing s */ 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* b &= (0x7f<<28)|(0x7f<<14)|(0x7f); */ 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a &= SLOT_2_0; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = a<<7; 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a |= b; 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s = s>>18; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = ((u64)s)<<32 | a; 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 6; 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = a<<14; 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a |= *p; 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* a: p2<<28 | p4<<14 | p6 (unmasked) */ 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(a&0x80)) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a &= SLOT_4_2_0; 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b &= SLOT_2_0; 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = b<<7; 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a |= b; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s = s>>11; 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = ((u64)s)<<32 | a; 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 7; 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* CSE2 from below */ 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a &= SLOT_2_0; 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = b<<14; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b |= *p; 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* b: p3<<28 | p5<<14 | p7 (unmasked) */ 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(b&0x80)) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b &= SLOT_4_2_0; 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* moved CSE2 up */ 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* a &= (0x7f<<14)|(0x7f); */ 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = a<<7; 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a |= b; 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s = s>>4; 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = ((u64)s)<<32 | a; 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 8; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = a<<15; 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a |= *p; 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* a: p4<<29 | p6<<15 | p8 (unmasked) */ 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* moved CSE2 up */ 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* a &= (0x7f<<29)|(0x7f<<15)|(0xff); */ 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b &= SLOT_2_0; 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = b<<8; 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a |= b; 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s = s<<4; 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = p[-4]; 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b &= 0x7f; 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = b>>3; 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s |= b; 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = ((u64)s)<<32 | a; 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 9; 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Read a 32-bit variable-length integer from memory starting at p[0]. 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of bytes read. The value is stored in *v. 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the varint stored in p[0] is larger than can fit in a 32-bit unsigned 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** integer, then set *v to 0xffffffff. 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A MACRO version, getVarint32, is provided which inlines the 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** single-byte case. All code should use the MACRO version as 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** this function assumes the single-byte case has already been handled. 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)u8 sqlite3GetVarint32(const unsigned char *p, u32 *v){ 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u32 a,b; 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The 1-byte case. Overwhelmingly the most common. Handled inline 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** by the getVarin32() macro */ 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = *p; 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* a: p0 (unmasked) */ 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef getVarint32 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(a&0x80)) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Values between 0 and 127 */ 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = a; 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The 2-byte case */ 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = *p; 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* b: p1 (unmasked) */ 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(b&0x80)) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Values between 128 and 16383 */ 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a &= 0x7f; 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = a<<7; 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = a | b; 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2; 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The 3-byte case */ 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = a<<14; 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a |= *p; 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* a: p0<<14 | p2 (unmasked) */ 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(a&0x80)) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Values between 16384 and 2097151 */ 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a &= (0x7f<<14)|(0x7f); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b &= 0x7f; 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = b<<7; 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = a | b; 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 3; 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* A 32-bit varint is used to store size information in btrees. 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Objects are rarely larger than 2MiB limit of a 3-byte varint. 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** A 3-byte varint is sufficient, for example, to record the size 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of a 1048569-byte BLOB or string. 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** We only unroll the first 1-, 2-, and 3- byte cases. The very 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** rare larger cases can be handled by the slower 64-bit varint 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** routine. 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 1 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u64 v64; 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 n; 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p -= 2; 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = sqlite3GetVarint(p, &v64); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( n>3 && n<=9 ); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (v64 & SQLITE_MAX_U32)!=v64 ){ 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = 0xffffffff; 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = (u32)v64; 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return n; 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* For following code (kept for historical record only) shows an 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** unrolling for the 3- and 4-byte varint cases. This code is 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** slightly faster, but it is also larger and much harder to test. 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = b<<14; 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b |= *p; 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* b: p1<<14 | p3 (unmasked) */ 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(b&0x80)) 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Values between 2097152 and 268435455 */ 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b &= (0x7f<<14)|(0x7f); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a &= (0x7f<<14)|(0x7f); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = a<<7; 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = a | b; 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 4; 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p++; 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = a<<14; 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a |= *p; 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* a: p0<<28 | p2<<14 | p4 (unmasked) */ 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(a&0x80)) 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Values between 268435456 and 34359738367 */ 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a &= SLOT_4_2_0; 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b &= SLOT_4_2_0; 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = b<<7; 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = a | b; 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 5; 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We can only reach this point when reading a corrupt database 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** file. In that case we are not in any hurry. Use the (relatively 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** slow) general-purpose sqlite3GetVarint() routine to extract the 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** value. */ 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u64 v64; 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 n; 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p -= 4; 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = sqlite3GetVarint(p, &v64); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( n>5 && n<=9 ); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *v = (u32)v64; 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return n; 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of bytes that will be needed to store the given 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 64-bit integer. 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VarintLen(u64 v){ 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = 0; 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do{ 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i++; 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v >>= 7; 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }while( v!=0 && ALWAYS(i<9) ); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return i; 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Read or write a four-byte big-endian integer value. 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)u32 sqlite3Get4byte(const u8 *p){ 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3Put4byte(unsigned char *p, u32 v){ 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p[0] = (u8)(v>>24); 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p[1] = (u8)(v>>16); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p[2] = (u8)(v>>8); 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p[3] = (u8)v; 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_BLOB_LITERAL) || defined(SQLITE_HAS_CODEC) 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Translate a single byte of Hex into an integer. 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine only works if h really is a valid hexadecimal 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** character: 0..9a..fA..F 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static u8 hexToInt(int h){ 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( (h>='0' && h<='9') || (h>='a' && h<='f') || (h>='A' && h<='F') ); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ASCII 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) h += 9*(1&(h>>6)); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_EBCDIC 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) h += 9*(1&~(h>>4)); 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (u8)(h & 0xf); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* !SQLITE_OMIT_BLOB_LITERAL || SQLITE_HAS_CODEC */ 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_BLOB_LITERAL) || defined(SQLITE_HAS_CODEC) 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Convert a BLOB literal of the form "x'hhhhhh'" into its binary 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value. Return a pointer to its binary value. Space to hold the 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** binary value has been obtained from malloc and must be freed by 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the calling routine. 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void *sqlite3HexToBlob(sqlite3 *db, const char *z, int n){ 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zBlob; 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zBlob = (char *)sqlite3DbMallocRaw(db, n/2 + 1); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n--; 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zBlob ){ 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<n; i+=2){ 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zBlob[i/2] = (hexToInt(z[i])<<4) | hexToInt(z[i+1]); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zBlob[i/2] = 0; 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return zBlob; 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* !SQLITE_OMIT_BLOB_LITERAL || SQLITE_HAS_CODEC */ 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Log an error that is an API call on a connection pointer that should 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** not have been used. The "type" of connection pointer is given as the 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** argument. The zType is a word like "NULL" or "closed" or "invalid". 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void logBadConnection(const char *zType){ 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_log(SQLITE_MISUSE, 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "API call with %s database connection pointer", 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zType 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Check to make sure we have a valid db pointer. This test is not 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** foolproof but it does provide some measure of protection against 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** misuse of the interface such as passing in db pointers that are 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL or which have been previously closed. If this routine returns 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1 it means that the db pointer is valid and 0 if it should not be 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** dereferenced for any reason. The calling function should invoke 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_MISUSE immediately. 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3SafetyCheckOk() requires that the db pointer be valid for 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** use. sqlite3SafetyCheckSickOrOk() allows a db pointer that failed to 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** open properly and is not fit for general use but which can be 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** used as an argument to sqlite3_errmsg() or sqlite3_close(). 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3SafetyCheckOk(sqlite3 *db){ 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u32 magic; 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db==0 ){ 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logBadConnection("NULL"); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) magic = db->magic; 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( magic!=SQLITE_MAGIC_OPEN ){ 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3SafetyCheckSickOrOk(db) ){ 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( sqlite3GlobalConfig.xLog!=0 ); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logBadConnection("unopened"); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3SafetyCheckSickOrOk(sqlite3 *db){ 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u32 magic; 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) magic = db->magic; 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( magic!=SQLITE_MAGIC_SICK && 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) magic!=SQLITE_MAGIC_OPEN && 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) magic!=SQLITE_MAGIC_BUSY ){ 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( sqlite3GlobalConfig.xLog!=0 ); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logBadConnection("invalid"); 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Attempt to add, substract, or multiply the 64-bit signed value iB against 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the other 64-bit signed integer at *pA and store the result in *pA. 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return 0 on success. Or if the operation would have resulted in an 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** overflow, leave *pA unchanged and return 1. 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3AddInt64(i64 *pA, i64 iB){ 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i64 iA = *pA; 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( iA==0 ); testcase( iA==1 ); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( iB==-1 ); testcase( iB==0 ); 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iB>=0 ){ 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( iA>0 && LARGEST_INT64 - iA == iB ); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( iA>0 && LARGEST_INT64 - iA == iB - 1 ); 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iA>0 && LARGEST_INT64 - iA < iB ) return 1; 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pA += iB; 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( iA<0 && -(iA + LARGEST_INT64) == iB + 1 ); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( iA<0 && -(iA + LARGEST_INT64) == iB + 2 ); 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iA<0 && -(iA + LARGEST_INT64) > iB + 1 ) return 1; 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pA += iB; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3SubInt64(i64 *pA, i64 iB){ 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( iB==SMALLEST_INT64+1 ); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iB==SMALLEST_INT64 ){ 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( (*pA)==(-1) ); testcase( (*pA)==0 ); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (*pA)>=0 ) return 1; 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pA -= iB; 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3AddInt64(pA, -iB); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TWOPOWER32 (((i64)1)<<32) 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TWOPOWER31 (((i64)1)<<31) 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3MulInt64(i64 *pA, i64 iB){ 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i64 iA = *pA; 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i64 iA1, iA0, iB1, iB0, r; 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iA1 = iA/TWOPOWER32; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iA0 = iA % TWOPOWER32; 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iB1 = iB/TWOPOWER32; 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iB0 = iB % TWOPOWER32; 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iA1*iB1 != 0 ) return 1; 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( iA1*iB0==0 || iA0*iB1==0 ); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r = iA1*iB0 + iA0*iB1; 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( r==(-TWOPOWER31)-1 ); 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( r==(-TWOPOWER31) ); 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( r==TWOPOWER31 ); 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( r==TWOPOWER31-1 ); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( r<(-TWOPOWER31) || r>=TWOPOWER31 ) return 1; 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r *= TWOPOWER32; 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3AddInt64(&r, iA0*iB0) ) return 1; 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pA = r; 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Compute the absolute value of a 32-bit signed integer, of possible. Or 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if the integer has a value of -2147483648, return +2147483647 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3AbsInt32(int x){ 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( x>=0 ) return x; 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( x==(int)0x80000000 ) return 0x7fffffff; 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -x; 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1151