mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-02 02:32:27 +00:00
Upgrade SQLite to 3.40 (#699)
This commit is contained in:
parent
bcae817215
commit
0dc0758574
151 changed files with 27917 additions and 22169 deletions
131
third_party/sqlite3/util.c
vendored
131
third_party/sqlite3/util.c
vendored
|
@ -15,23 +15,8 @@
|
|||
** strings, and stuff like that.
|
||||
**
|
||||
*/
|
||||
/* clang-format off */
|
||||
|
||||
#include "third_party/sqlite3/sqliteInt.inc"
|
||||
#ifndef SQLITE_OMIT_FLOATING_POINT
|
||||
#include "libc/math.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Routine needed to support the testcase() macro.
|
||||
*/
|
||||
#ifdef SQLITE_COVERAGE_TEST
|
||||
void sqlite3Coverage(int x){
|
||||
static unsigned dummy = 0;
|
||||
dummy += (unsigned)x;
|
||||
}
|
||||
#endif
|
||||
|
||||
#include "third_party/sqlite3/sqliteInt.h"
|
||||
|
||||
/*
|
||||
** Calls to sqlite3FaultSim() are used to simulate a failure during testing,
|
||||
** or to bypass normal error detection during testing in order to let
|
||||
|
@ -61,11 +46,21 @@ int sqlite3FaultSim(int iTest){
|
|||
#ifndef SQLITE_OMIT_FLOATING_POINT
|
||||
/*
|
||||
** Return true if the floating point value is Not a Number (NaN).
|
||||
**
|
||||
** Use the math library isnan() function if compiled with SQLITE_HAVE_ISNAN.
|
||||
** Otherwise, we have our own implementation that works on most systems.
|
||||
*/
|
||||
int sqlite3IsNaN(double x){
|
||||
int rc; /* The value return */
|
||||
#if !SQLITE_HAVE_ISNAN && !HAVE_ISNAN
|
||||
u64 y;
|
||||
memcpy(&y,&x,sizeof(y));
|
||||
return IsNaN(y);
|
||||
rc = IsNaN(y);
|
||||
#else
|
||||
rc = isnan(x);
|
||||
#endif /* HAVE_ISNAN */
|
||||
testcase( rc );
|
||||
return rc;
|
||||
}
|
||||
#endif /* SQLITE_OMIT_FLOATING_POINT */
|
||||
|
||||
|
@ -90,8 +85,14 @@ int sqlite3Strlen30(const char *z){
|
|||
** the column name if and only if the COLFLAG_HASTYPE flag is set.
|
||||
*/
|
||||
char *sqlite3ColumnType(Column *pCol, char *zDflt){
|
||||
if( (pCol->colFlags & COLFLAG_HASTYPE)==0 ) return zDflt;
|
||||
return pCol->zName + strlen(pCol->zName) + 1;
|
||||
if( pCol->colFlags & COLFLAG_HASTYPE ){
|
||||
return pCol->zCnName + strlen(pCol->zCnName) + 1;
|
||||
}else if( pCol->eCType ){
|
||||
assert( pCol->eCType<=SQLITE_N_STDTYPE );
|
||||
return (char*)sqlite3StdType[pCol->eCType-1];
|
||||
}else{
|
||||
return zDflt;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -112,7 +113,11 @@ static SQLITE_NOINLINE void sqlite3ErrorFinish(sqlite3 *db, int err_code){
|
|||
void sqlite3Error(sqlite3 *db, int err_code){
|
||||
assert( db!=0 );
|
||||
db->errCode = err_code;
|
||||
if( err_code || db->pErr ) sqlite3ErrorFinish(db, err_code);
|
||||
if( err_code || db->pErr ){
|
||||
sqlite3ErrorFinish(db, err_code);
|
||||
}else{
|
||||
db->errByteOffset = -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -122,6 +127,7 @@ void sqlite3Error(sqlite3 *db, int err_code){
|
|||
void sqlite3ErrorClear(sqlite3 *db){
|
||||
assert( db!=0 );
|
||||
db->errCode = SQLITE_OK;
|
||||
db->errByteOffset = -1;
|
||||
if( db->pErr ) sqlite3ValueSetNull(db->pErr);
|
||||
}
|
||||
|
||||
|
@ -142,17 +148,8 @@ void sqlite3SystemError(sqlite3 *db, int rc){
|
|||
** handle "db". The error code is set to "err_code".
|
||||
**
|
||||
** If it is not NULL, string zFormat specifies the format of the
|
||||
** error string in the style of the printf functions: The following
|
||||
** format characters are allowed:
|
||||
**
|
||||
** %s Insert a string
|
||||
** %z A string that should be freed after use
|
||||
** %d Insert an integer
|
||||
** %T Insert a token
|
||||
** %S Insert the first element of a SrcList
|
||||
**
|
||||
** zFormat and any string tokens that follow it are assumed to be
|
||||
** encoded in UTF-8.
|
||||
** error string. zFormat and any string tokens that follow it are
|
||||
** assumed to be encoded in UTF-8.
|
||||
**
|
||||
** To clear the most recent error for sqlite handle "db", sqlite3Error
|
||||
** should be called with err_code set to SQLITE_OK and zFormat set
|
||||
|
@ -176,13 +173,6 @@ void sqlite3ErrorWithMsg(sqlite3 *db, int err_code, const char *zFormat, ...){
|
|||
|
||||
/*
|
||||
** Add an error message to pParse->zErrMsg and increment pParse->nErr.
|
||||
** The following formatting characters are allowed:
|
||||
**
|
||||
** %s Insert a string
|
||||
** %z A string that should be freed after use
|
||||
** %d Insert an integer
|
||||
** %T Insert a token
|
||||
** %S Insert the first element of a SrcList
|
||||
**
|
||||
** This function should be used to report any error that occurs while
|
||||
** compiling an SQL statement (i.e. within sqlite3_prepare()). The
|
||||
|
@ -195,11 +185,19 @@ void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){
|
|||
char *zMsg;
|
||||
va_list ap;
|
||||
sqlite3 *db = pParse->db;
|
||||
assert( db!=0 );
|
||||
assert( db->pParse==pParse || db->pParse->pToplevel==pParse );
|
||||
db->errByteOffset = -2;
|
||||
va_start(ap, zFormat);
|
||||
zMsg = sqlite3VMPrintf(db, zFormat, ap);
|
||||
va_end(ap);
|
||||
if( db->errByteOffset<-1 ) db->errByteOffset = -1;
|
||||
if( db->suppressErr ){
|
||||
sqlite3DbFree(db, zMsg);
|
||||
if( db->mallocFailed ){
|
||||
pParse->nErr++;
|
||||
pParse->rc = SQLITE_NOMEM;
|
||||
}
|
||||
}else{
|
||||
pParse->nErr++;
|
||||
sqlite3DbFree(db, pParse->zErrMsg);
|
||||
|
@ -262,11 +260,34 @@ void sqlite3Dequote(char *z){
|
|||
z[j] = 0;
|
||||
}
|
||||
void sqlite3DequoteExpr(Expr *p){
|
||||
assert( !ExprHasProperty(p, EP_IntValue) );
|
||||
assert( sqlite3Isquote(p->u.zToken[0]) );
|
||||
p->flags |= p->u.zToken[0]=='"' ? EP_Quoted|EP_DblQuoted : EP_Quoted;
|
||||
sqlite3Dequote(p->u.zToken);
|
||||
}
|
||||
|
||||
/*
|
||||
** If the input token p is quoted, try to adjust the token to remove
|
||||
** the quotes. This is not always possible:
|
||||
**
|
||||
** "abc" -> abc
|
||||
** "ab""cd" -> (not possible because of the interior "")
|
||||
**
|
||||
** Remove the quotes if possible. This is a optimization. The overall
|
||||
** system should still return the correct answer even if this routine
|
||||
** is always a no-op.
|
||||
*/
|
||||
void sqlite3DequoteToken(Token *p){
|
||||
unsigned int i;
|
||||
if( p->n<2 ) return;
|
||||
if( !sqlite3Isquote(p->z[0]) ) return;
|
||||
for(i=1; i<p->n-1; i++){
|
||||
if( sqlite3Isquote(p->z[i]) ) return;
|
||||
}
|
||||
p->n -= 2;
|
||||
p->z++;
|
||||
}
|
||||
|
||||
/*
|
||||
** Generate a Token object from a string
|
||||
*/
|
||||
|
@ -1372,13 +1393,13 @@ static void logBadConnection(const char *zType){
|
|||
** used as an argument to sqlite3_errmsg() or sqlite3_close().
|
||||
*/
|
||||
int sqlite3SafetyCheckOk(sqlite3 *db){
|
||||
u32 magic;
|
||||
u8 eOpenState;
|
||||
if( db==0 ){
|
||||
logBadConnection("NULL");
|
||||
return 0;
|
||||
}
|
||||
magic = db->magic;
|
||||
if( magic!=SQLITE_MAGIC_OPEN ){
|
||||
eOpenState = db->eOpenState;
|
||||
if( eOpenState!=SQLITE_STATE_OPEN ){
|
||||
if( sqlite3SafetyCheckSickOrOk(db) ){
|
||||
testcase( sqlite3GlobalConfig.xLog!=0 );
|
||||
logBadConnection("unopened");
|
||||
|
@ -1389,11 +1410,11 @@ int sqlite3SafetyCheckOk(sqlite3 *db){
|
|||
}
|
||||
}
|
||||
int sqlite3SafetyCheckSickOrOk(sqlite3 *db){
|
||||
u32 magic;
|
||||
magic = db->magic;
|
||||
if( magic!=SQLITE_MAGIC_SICK &&
|
||||
magic!=SQLITE_MAGIC_OPEN &&
|
||||
magic!=SQLITE_MAGIC_BUSY ){
|
||||
u8 eOpenState;
|
||||
eOpenState = db->eOpenState;
|
||||
if( eOpenState!=SQLITE_STATE_SICK &&
|
||||
eOpenState!=SQLITE_STATE_OPEN &&
|
||||
eOpenState!=SQLITE_STATE_BUSY ){
|
||||
testcase( sqlite3GlobalConfig.xLog!=0 );
|
||||
logBadConnection("invalid");
|
||||
return 0;
|
||||
|
@ -1558,7 +1579,6 @@ LogEst sqlite3LogEst(u64 x){
|
|||
return a[x&7] + y - 10;
|
||||
}
|
||||
|
||||
#ifndef SQLITE_OMIT_VIRTUALTABLE
|
||||
/*
|
||||
** Convert a double into a LogEst
|
||||
** In other words, compute an approximation for 10*log2(x).
|
||||
|
@ -1573,16 +1593,9 @@ LogEst sqlite3LogEstFromDouble(double x){
|
|||
e = (a>>52) - 1022;
|
||||
return e*10;
|
||||
}
|
||||
#endif /* SQLITE_OMIT_VIRTUALTABLE */
|
||||
|
||||
#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \
|
||||
defined(SQLITE_ENABLE_STAT4) || \
|
||||
defined(SQLITE_EXPLAIN_ESTIMATED_ROWS)
|
||||
/*
|
||||
** Convert a LogEst into an integer.
|
||||
**
|
||||
** Note that this routine is only used when one or more of various
|
||||
** non-standard compile-time options is enabled.
|
||||
*/
|
||||
u64 sqlite3LogEstToInt(LogEst x){
|
||||
u64 n;
|
||||
|
@ -1590,17 +1603,9 @@ u64 sqlite3LogEstToInt(LogEst x){
|
|||
x /= 10;
|
||||
if( n>=5 ) n -= 2;
|
||||
else if( n>=1 ) n -= 1;
|
||||
#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \
|
||||
defined(SQLITE_EXPLAIN_ESTIMATED_ROWS)
|
||||
if( x>60 ) return (u64)LARGEST_INT64;
|
||||
#else
|
||||
/* If only SQLITE_ENABLE_STAT4 is on, then the largest input
|
||||
** possible to this routine is 310, resulting in a maximum x of 31 */
|
||||
assert( x<=60 );
|
||||
#endif
|
||||
return x>=3 ? (n+8)<<(x-3) : (n+8)>>(3-x);
|
||||
}
|
||||
#endif /* defined SCANSTAT or STAT4 or ESTIMATED_ROWS */
|
||||
|
||||
/*
|
||||
** Add a new name/number pair to a VList. This might require that the
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue