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