sqlite-amalgamation-3380500.zip

git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3875 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
Cory McWilliams 2022-05-21 01:36:16 +00:00
parent b688a89b66
commit 787e929747
3 changed files with 398 additions and 167 deletions

70
deps/sqlite/shell.c vendored
View File

@ -7964,9 +7964,14 @@ static int zipfileFilter(
zipfileCursorErr(pCsr, "zipfile() function requires an argument"); zipfileCursorErr(pCsr, "zipfile() function requires an argument");
return SQLITE_ERROR; return SQLITE_ERROR;
}else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){ }else if( sqlite3_value_type(argv[0])==SQLITE_BLOB ){
static const u8 aEmptyBlob = 0;
const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]); const u8 *aBlob = (const u8*)sqlite3_value_blob(argv[0]);
int nBlob = sqlite3_value_bytes(argv[0]); int nBlob = sqlite3_value_bytes(argv[0]);
assert( pTab->pFirstEntry==0 ); assert( pTab->pFirstEntry==0 );
if( aBlob==0 ){
aBlob = &aEmptyBlob;
nBlob = 0;
}
rc = zipfileLoadDirectory(pTab, aBlob, nBlob); rc = zipfileLoadDirectory(pTab, aBlob, nBlob);
pCsr->pFreeEntry = pTab->pFirstEntry; pCsr->pFreeEntry = pTab->pFirstEntry;
pTab->pFirstEntry = pTab->pLastEntry = 0; pTab->pFirstEntry = pTab->pLastEntry = 0;
@ -14425,6 +14430,8 @@ static void exec_prepared_stmt_columnar(
int bNextLine = 0; int bNextLine = 0;
int bMultiLineRowExists = 0; int bMultiLineRowExists = 0;
int bw = p->cmOpts.bWordWrap; int bw = p->cmOpts.bWordWrap;
const char *zEmpty = "";
const char *zShowNull = p->nullValue;
rc = sqlite3_step(pStmt); rc = sqlite3_step(pStmt);
if( rc!=SQLITE_ROW ) return; if( rc!=SQLITE_ROW ) return;
@ -14486,12 +14493,14 @@ static void exec_prepared_stmt_columnar(
if( wx<0 ) wx = -wx; if( wx<0 ) wx = -wx;
if( useNextLine ){ if( useNextLine ){
uz = azNextLine[i]; uz = azNextLine[i];
if( uz==0 ) uz = (u8*)zEmpty;
}else if( p->cmOpts.bQuote ){ }else if( p->cmOpts.bQuote ){
sqlite3_free(azQuoted[i]); sqlite3_free(azQuoted[i]);
azQuoted[i] = quoted_column(pStmt,i); azQuoted[i] = quoted_column(pStmt,i);
uz = (const unsigned char*)azQuoted[i]; uz = (const unsigned char*)azQuoted[i];
}else{ }else{
uz = (const unsigned char*)sqlite3_column_text(pStmt,i); uz = (const unsigned char*)sqlite3_column_text(pStmt,i);
if( uz==0 ) uz = (u8*)zShowNull;
} }
azData[nRow*nColumn + i] azData[nRow*nColumn + i]
= translateForDisplayAndDup(uz, &azNextLine[i], wx, bw); = translateForDisplayAndDup(uz, &azNextLine[i], wx, bw);
@ -14505,7 +14514,7 @@ static void exec_prepared_stmt_columnar(
nTotal = nColumn*(nRow+1); nTotal = nColumn*(nRow+1);
for(i=0; i<nTotal; i++){ for(i=0; i<nTotal; i++){
z = azData[i]; z = azData[i];
if( z==0 ) z = p->nullValue; if( z==0 ) z = (char*)zEmpty;
n = strlenChar(z); n = strlenChar(z);
j = i%nColumn; j = i%nColumn;
if( n>p->actualWidth[j] ) p->actualWidth[j] = n; if( n>p->actualWidth[j] ) p->actualWidth[j] = n;
@ -14609,7 +14618,10 @@ columnar_end:
utf8_printf(p->out, "Interrupt\n"); utf8_printf(p->out, "Interrupt\n");
} }
nData = (nRow+1)*nColumn; nData = (nRow+1)*nColumn;
for(i=0; i<nData; i++) free(azData[i]); for(i=0; i<nData; i++){
z = azData[i];
if( z!=zEmpty && z!=zShowNull ) free(azData[i]);
}
sqlite3_free(azData); sqlite3_free(azData);
sqlite3_free((void*)azNextLine); sqlite3_free((void*)azNextLine);
sqlite3_free(abRowDiv); sqlite3_free(abRowDiv);
@ -19035,12 +19047,12 @@ SELECT\
','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\ ','||iif((cpos-1)%4>0, ' ', x'0a'||' '))\
||')' AS ColsSpec \ ||')' AS ColsSpec \
FROM (\ FROM (\
SELECT cpos, printf('\"%w\"',printf('%.*s%s', nlen-chop,name,suff)) AS cname \ SELECT cpos, printf('\"%w\"',printf('%!.*s%s', nlen-chop,name,suff)) AS cname \
FROM ColNames ORDER BY cpos\ FROM ColNames ORDER BY cpos\
)"; )";
static const char * const zRenamesDone = static const char * const zRenamesDone =
"SELECT group_concat(" "SELECT group_concat("
" printf('\"%w\" to \"%w\"',name,printf('%.*s%s', nlen-chop, name, suff))," " printf('\"%w\" to \"%w\"',name,printf('%!.*s%s', nlen-chop, name, suff)),"
" ','||x'0a')" " ','||x'0a')"
"FROM ColNames WHERE suff<>'' OR chop!=0" "FROM ColNames WHERE suff<>'' OR chop!=0"
; ;
@ -19906,7 +19918,7 @@ static int do_meta_command(char *zLine, ShellState *p){
if( c=='i' && strncmp(azArg[0], "import", n)==0 ){ if( c=='i' && strncmp(azArg[0], "import", n)==0 ){
char *zTable = 0; /* Insert data into this table */ char *zTable = 0; /* Insert data into this table */
char *zSchema = "main"; /* within this schema */ char *zSchema = 0; /* within this schema (may default to "main") */
char *zFile = 0; /* Name of file to extra content from */ char *zFile = 0; /* Name of file to extra content from */
sqlite3_stmt *pStmt = NULL; /* A statement */ sqlite3_stmt *pStmt = NULL; /* A statement */
int nCol; /* Number of columns in the table */ int nCol; /* Number of columns in the table */
@ -19915,11 +19927,13 @@ static int do_meta_command(char *zLine, ShellState *p){
int needCommit; /* True to COMMIT or ROLLBACK at end */ int needCommit; /* True to COMMIT or ROLLBACK at end */
int nSep; /* Number of bytes in p->colSeparator[] */ int nSep; /* Number of bytes in p->colSeparator[] */
char *zSql; /* An SQL statement */ char *zSql; /* An SQL statement */
char *zFullTabName; /* Table name with schema if applicable */
ImportCtx sCtx; /* Reader context */ ImportCtx sCtx; /* Reader context */
char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */ char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */
int eVerbose = 0; /* Larger for more console output */ int eVerbose = 0; /* Larger for more console output */
int nSkip = 0; /* Initial lines to skip */ int nSkip = 0; /* Initial lines to skip */
int useOutputMode = 1; /* Use output mode to determine separators */ int useOutputMode = 1; /* Use output mode to determine separators */
char *zCreate = 0; /* CREATE TABLE statement text */
failIfSafeMode(p, "cannot run .import in safe mode"); failIfSafeMode(p, "cannot run .import in safe mode");
memset(&sCtx, 0, sizeof(sCtx)); memset(&sCtx, 0, sizeof(sCtx));
@ -20042,7 +20056,6 @@ static int do_meta_command(char *zLine, ShellState *p){
import_cleanup(&sCtx); import_cleanup(&sCtx);
goto meta_command_exit; goto meta_command_exit;
} }
/* Below, resources must be freed before exit. */
if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){ if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){
char zSep[2]; char zSep[2];
zSep[1] = 0; zSep[1] = 0;
@ -20054,11 +20067,17 @@ static int do_meta_command(char *zLine, ShellState *p){
output_c_string(p->out, zSep); output_c_string(p->out, zSep);
utf8_printf(p->out, "\n"); utf8_printf(p->out, "\n");
} }
/* Below, resources must be freed before exit. */
while( (nSkip--)>0 ){ while( (nSkip--)>0 ){
while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){} while( xRead(&sCtx) && sCtx.cTerm==sCtx.cColSep ){}
} }
zSql = sqlite3_mprintf("SELECT * FROM \"%w\".\"%w\"", zSchema, zTable); if( zSchema!=0 ){
if( zSql==0 ){ zFullTabName = sqlite3_mprintf("\"%w\".\"%w\"", zSchema, zTable);
}else{
zFullTabName = sqlite3_mprintf("\"%w\"", zTable);
}
zSql = sqlite3_mprintf("SELECT * FROM %s", zFullTabName);
if( zSql==0 || zFullTabName==0 ){
import_cleanup(&sCtx); import_cleanup(&sCtx);
shell_out_of_memory(); shell_out_of_memory();
} }
@ -20066,11 +20085,10 @@ static int do_meta_command(char *zLine, ShellState *p){
rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */ import_append_char(&sCtx, 0); /* To ensure sCtx.z is allocated */
if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){ if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(p->db))==0 ){
char *zCreate = sqlite3_mprintf("CREATE TABLE \"%w\".\"%w\"",
zSchema, zTable);
sqlite3 *dbCols = 0; sqlite3 *dbCols = 0;
char *zRenames = 0; char *zRenames = 0;
char *zColDefs; char *zColDefs;
zCreate = sqlite3_mprintf("CREATE TABLE %s", zFullTabName);
while( xRead(&sCtx) ){ while( xRead(&sCtx) ){
zAutoColumn(sCtx.z, &dbCols, 0); zAutoColumn(sCtx.z, &dbCols, 0);
if( sCtx.cTerm!=sCtx.cColSep ) break; if( sCtx.cTerm!=sCtx.cColSep ) break;
@ -20084,9 +20102,12 @@ static int do_meta_command(char *zLine, ShellState *p){
} }
assert(dbCols==0); assert(dbCols==0);
if( zColDefs==0 ){ if( zColDefs==0 ){
sqlite3_free(zCreate);
import_cleanup(&sCtx);
utf8_printf(stderr,"%s: empty file\n", sCtx.zFile); utf8_printf(stderr,"%s: empty file\n", sCtx.zFile);
import_fail:
sqlite3_free(zCreate);
sqlite3_free(zSql);
sqlite3_free(zFullTabName);
import_cleanup(&sCtx);
rc = 1; rc = 1;
goto meta_command_exit; goto meta_command_exit;
} }
@ -20097,22 +20118,18 @@ static int do_meta_command(char *zLine, ShellState *p){
rc = sqlite3_exec(p->db, zCreate, 0, 0, 0); rc = sqlite3_exec(p->db, zCreate, 0, 0, 0);
if( rc ){ if( rc ){
utf8_printf(stderr, "%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db)); utf8_printf(stderr, "%s failed:\n%s\n", zCreate, sqlite3_errmsg(p->db));
sqlite3_free(zCreate); goto import_fail;
import_cleanup(&sCtx);
rc = 1;
goto meta_command_exit;
} }
sqlite3_free(zCreate); sqlite3_free(zCreate);
zCreate = 0;
rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
} }
sqlite3_free(zSql);
if( rc ){ if( rc ){
if (pStmt) sqlite3_finalize(pStmt); if (pStmt) sqlite3_finalize(pStmt);
utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db)); utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db));
import_cleanup(&sCtx); goto import_fail;
rc = 1;
goto meta_command_exit;
} }
sqlite3_free(zSql);
nCol = sqlite3_column_count(pStmt); nCol = sqlite3_column_count(pStmt);
sqlite3_finalize(pStmt); sqlite3_finalize(pStmt);
pStmt = 0; pStmt = 0;
@ -20122,8 +20139,7 @@ static int do_meta_command(char *zLine, ShellState *p){
import_cleanup(&sCtx); import_cleanup(&sCtx);
shell_out_of_memory(); shell_out_of_memory();
} }
sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\".\"%w\" VALUES(?", sqlite3_snprintf(nByte+20, zSql, "INSERT INTO %s VALUES(?", zFullTabName);
zSchema, zTable);
j = strlen30(zSql); j = strlen30(zSql);
for(i=1; i<nCol; i++){ for(i=1; i<nCol; i++){
zSql[j++] = ','; zSql[j++] = ',';
@ -20135,14 +20151,13 @@ static int do_meta_command(char *zLine, ShellState *p){
utf8_printf(p->out, "Insert using: %s\n", zSql); utf8_printf(p->out, "Insert using: %s\n", zSql);
} }
rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
sqlite3_free(zSql);
if( rc ){ if( rc ){
utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
if (pStmt) sqlite3_finalize(pStmt); if (pStmt) sqlite3_finalize(pStmt);
import_cleanup(&sCtx); goto import_fail;
rc = 1;
goto meta_command_exit;
} }
sqlite3_free(zSql);
sqlite3_free(zFullTabName);
needCommit = sqlite3_get_autocommit(p->db); needCommit = sqlite3_get_autocommit(p->db);
if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0); if( needCommit ) sqlite3_exec(p->db, "BEGIN", 0, 0, 0);
do{ do{
@ -22636,7 +22651,8 @@ static int process_input(ShellState *p){
qss = QSS_Start; qss = QSS_Start;
} }
} }
if( nSql && QSS_PLAINDARK(qss) ){ if( nSql ){
/* This may be incomplete. Let the SQL parser deal with that. */
errCnt += runOneSqlLine(p, zSql, p->in, startline); errCnt += runOneSqlLine(p, zSql, p->in, startline);
} }
free(zSql); free(zSql);

459
deps/sqlite/sqlite3.c vendored
View File

@ -1,6 +1,6 @@
/****************************************************************************** /******************************************************************************
** This file is an amalgamation of many separate C source files from SQLite ** This file is an amalgamation of many separate C source files from SQLite
** version 3.38.0. By combining all the individual C code files into this ** version 3.38.5. By combining all the individual C code files into this
** single large file, the entire code can be compiled as a single translation ** single large file, the entire code can be compiled as a single translation
** unit. This allows many compilers to do optimizations that would not be ** unit. This allows many compilers to do optimizations that would not be
** possible if the files were compiled separately. Performance improvements ** possible if the files were compiled separately. Performance improvements
@ -452,9 +452,9 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()]. ** [sqlite_version()] and [sqlite_source_id()].
*/ */
#define SQLITE_VERSION "3.38.0" #define SQLITE_VERSION "3.38.5"
#define SQLITE_VERSION_NUMBER 3038000 #define SQLITE_VERSION_NUMBER 3038005
#define SQLITE_SOURCE_ID "2022-02-22 18:58:40 40fa792d359f84c3b9e9d6623743e1a59826274e221df1bde8f47086968a1bab" #define SQLITE_SOURCE_ID "2022-05-06 15:25:27 78d9c993d404cdfaa7fdd2973fa1052e3da9f66215cff9c5540ebe55c407d9fe"
/* /*
** CAPI3REF: Run-Time Library Version Numbers ** CAPI3REF: Run-Time Library Version Numbers
@ -5285,6 +5285,10 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** even empty strings, are always zero-terminated. ^The return ** even empty strings, are always zero-terminated. ^The return
** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. ** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer.
** **
** ^Strings returned by sqlite3_column_text16() always have the endianness
** which is native to the platform, regardless of the text encoding set
** for the database.
**
** <b>Warning:</b> ^The object returned by [sqlite3_column_value()] is an ** <b>Warning:</b> ^The object returned by [sqlite3_column_value()] is an
** [unprotected sqlite3_value] object. In a multithreaded environment, ** [unprotected sqlite3_value] object. In a multithreaded environment,
** an unprotected sqlite3_value object may only be used safely with ** an unprotected sqlite3_value object may only be used safely with
@ -5298,7 +5302,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** [application-defined SQL functions] or [virtual tables], not within ** [application-defined SQL functions] or [virtual tables], not within
** top-level application code. ** top-level application code.
** **
** The these routines may attempt to convert the datatype of the result. ** These routines may attempt to convert the datatype of the result.
** ^For example, if the internal representation is FLOAT and a text result ** ^For example, if the internal representation is FLOAT and a text result
** is requested, [sqlite3_snprintf()] is used internally to perform the ** is requested, [sqlite3_snprintf()] is used internally to perform the
** conversion automatically. ^(The following table details the conversions ** conversion automatically. ^(The following table details the conversions
@ -5323,7 +5327,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** <tr><td> TEXT <td> BLOB <td> No change ** <tr><td> TEXT <td> BLOB <td> No change
** <tr><td> BLOB <td> INTEGER <td> [CAST] to INTEGER ** <tr><td> BLOB <td> INTEGER <td> [CAST] to INTEGER
** <tr><td> BLOB <td> FLOAT <td> [CAST] to REAL ** <tr><td> BLOB <td> FLOAT <td> [CAST] to REAL
** <tr><td> BLOB <td> TEXT <td> Add a zero terminator if needed ** <tr><td> BLOB <td> TEXT <td> [CAST] to TEXT, ensure zero terminator
** </table> ** </table>
** </blockquote>)^ ** </blockquote>)^
** **
@ -10073,7 +10077,7 @@ SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut);
** ^When xBestIndex returns, the sqlite3_value object returned by ** ^When xBestIndex returns, the sqlite3_value object returned by
** sqlite3_vtab_rhs_value() is automatically deallocated. ** sqlite3_vtab_rhs_value() is automatically deallocated.
** **
** The "_rhs_" in the name of this routine is an appreviation for ** The "_rhs_" in the name of this routine is an abbreviation for
** "Right-Hand Side". ** "Right-Hand Side".
*/ */
SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal); SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal);
@ -19925,6 +19929,7 @@ SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr*);
SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr*, u8); SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr*, u8);
SQLITE_PRIVATE int sqlite3ExprIsConstantOrGroupBy(Parse*, Expr*, ExprList*); SQLITE_PRIVATE int sqlite3ExprIsConstantOrGroupBy(Parse*, Expr*, ExprList*);
SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr*,int); SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr*,int);
SQLITE_PRIVATE int sqlite3ExprIsTableConstraint(Expr*,const SrcItem*);
#ifdef SQLITE_ENABLE_CURSOR_HINTS #ifdef SQLITE_ENABLE_CURSOR_HINTS
SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr*); SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr*);
#endif #endif
@ -20364,7 +20369,12 @@ SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3*, int, const char *, char **);
SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse*, Table*); SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse*, Table*);
SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3*, int, const char *); SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3*, int, const char *);
SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *); SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *);
SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*); SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*);
#if (defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST)) \
&& !defined(SQLITE_OMIT_VIRTUALTABLE)
SQLITE_PRIVATE void sqlite3VtabWriteAll(sqlite3_index_info*);
#endif
SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*); SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*);
SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int); SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int);
SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *); SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *);
@ -23654,7 +23664,7 @@ static int toLocaltime(
p->D = sLocal.tm_mday; p->D = sLocal.tm_mday;
p->h = sLocal.tm_hour; p->h = sLocal.tm_hour;
p->m = sLocal.tm_min; p->m = sLocal.tm_min;
p->s = sLocal.tm_sec; p->s = sLocal.tm_sec + (p->iJD%1000)*0.001;
p->validYMD = 1; p->validYMD = 1;
p->validHMS = 1; p->validHMS = 1;
p->validJD = 0; p->validJD = 0;
@ -29328,8 +29338,9 @@ SQLITE_PRIVATE char *sqlite3DbSpanDup(sqlite3 *db, const char *zStart, const cha
** Free any prior content in *pz and replace it with a copy of zNew. ** Free any prior content in *pz and replace it with a copy of zNew.
*/ */
SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zNew){ SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zNew){
char *z = sqlite3DbStrDup(db, zNew);
sqlite3DbFree(db, *pz); sqlite3DbFree(db, *pz);
*pz = sqlite3DbStrDup(db, zNew); *pz = z;
} }
/* /*
@ -39682,11 +39693,17 @@ static int unixShmLock(
int flags /* What to do with the lock */ int flags /* What to do with the lock */
){ ){
unixFile *pDbFd = (unixFile*)fd; /* Connection holding shared memory */ unixFile *pDbFd = (unixFile*)fd; /* Connection holding shared memory */
unixShm *p = pDbFd->pShm; /* The shared memory being locked */ unixShm *p; /* The shared memory being locked */
unixShmNode *pShmNode = p->pShmNode; /* The underlying file iNode */ unixShmNode *pShmNode; /* The underlying file iNode */
int rc = SQLITE_OK; /* Result code */ int rc = SQLITE_OK; /* Result code */
u16 mask; /* Mask of locks to take or release */ u16 mask; /* Mask of locks to take or release */
int *aLock = pShmNode->aLock; int *aLock;
p = pDbFd->pShm;
if( p==0 ) return SQLITE_IOERR_SHMLOCK;
pShmNode = p->pShmNode;
if( NEVER(pShmNode==0) ) return SQLITE_IOERR_SHMLOCK;
aLock = pShmNode->aLock;
assert( pShmNode==pDbFd->pInode->pShmNode ); assert( pShmNode==pDbFd->pInode->pShmNode );
assert( pShmNode->pInode==pDbFd->pInode ); assert( pShmNode->pInode==pDbFd->pInode );
@ -46974,10 +46991,14 @@ static int winShmLock(
winFile *pDbFd = (winFile*)fd; /* Connection holding shared memory */ winFile *pDbFd = (winFile*)fd; /* Connection holding shared memory */
winShm *p = pDbFd->pShm; /* The shared memory being locked */ winShm *p = pDbFd->pShm; /* The shared memory being locked */
winShm *pX; /* For looping over all siblings */ winShm *pX; /* For looping over all siblings */
winShmNode *pShmNode = p->pShmNode; winShmNode *pShmNode;
int rc = SQLITE_OK; /* Result code */ int rc = SQLITE_OK; /* Result code */
u16 mask; /* Mask of locks to take or release */ u16 mask; /* Mask of locks to take or release */
if( p==0 ) return SQLITE_IOERR_SHMLOCK;
pShmNode = p->pShmNode;
if( NEVER(pShmNode==0) ) return SQLITE_IOERR_SHMLOCK;
assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK ); assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK );
assert( n>=1 ); assert( n>=1 );
assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED) assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED)
@ -50907,7 +50928,8 @@ SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr *p){
** make it so. ** make it so.
*/ */
SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){ SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){
assert( p->nRef>0 ); assert( p->nRef>0 || p->pCache->bPurgeable==0 );
testcase( p->nRef==0 );
assert( sqlite3PcachePageSanity(p) ); assert( sqlite3PcachePageSanity(p) );
if( p->flags & (PGHDR_CLEAN|PGHDR_DONT_WRITE) ){ /*OPTIMIZATION-IF-FALSE*/ if( p->flags & (PGHDR_CLEAN|PGHDR_DONT_WRITE) ){ /*OPTIMIZATION-IF-FALSE*/
p->flags &= ~PGHDR_DONT_WRITE; p->flags &= ~PGHDR_DONT_WRITE;
@ -56039,6 +56061,9 @@ static int pager_playback(Pager *pPager, int isHot){
goto end_playback; goto end_playback;
} }
pPager->dbSize = mxPg; pPager->dbSize = mxPg;
if( pPager->mxPgno<mxPg ){
pPager->mxPgno = mxPg;
}
} }
/* Copy original pages out of the journal and back into the /* Copy original pages out of the journal and back into the
@ -65398,7 +65423,9 @@ struct MemPage {
u8 *apOvfl[4]; /* Pointers to the body of overflow cells */ u8 *apOvfl[4]; /* Pointers to the body of overflow cells */
BtShared *pBt; /* Pointer to BtShared that this page is part of */ BtShared *pBt; /* Pointer to BtShared that this page is part of */
u8 *aData; /* Pointer to disk image of the page data */ u8 *aData; /* Pointer to disk image of the page data */
u8 *aDataEnd; /* One byte past the end of usable data */ u8 *aDataEnd; /* One byte past the end of the entire page - not just
** the usable space, the entire page. Used to prevent
** corruption-induced of buffer overflow. */
u8 *aCellIdx; /* The cell index area */ u8 *aCellIdx; /* The cell index area */
u8 *aDataOfst; /* Same as aData for leaves. aData+4 for interior */ u8 *aDataOfst; /* Same as aData for leaves. aData+4 for interior */
DbPage *pDbPage; /* Pager page handle */ DbPage *pDbPage; /* Pager page handle */
@ -67739,6 +67766,8 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){
** fragmented bytes within the page. */ ** fragmented bytes within the page. */
memcpy(&aData[iAddr], &aData[pc], 2); memcpy(&aData[iAddr], &aData[pc], 2);
aData[hdr+7] += (u8)x; aData[hdr+7] += (u8)x;
testcase( pc+x>maxPC );
return &aData[pc];
}else if( x+pc > maxPC ){ }else if( x+pc > maxPC ){
/* This slot extends off the end of the usable part of the page */ /* This slot extends off the end of the usable part of the page */
*pRc = SQLITE_CORRUPT_PAGE(pPg); *pRc = SQLITE_CORRUPT_PAGE(pPg);
@ -68183,7 +68212,7 @@ static int btreeInitPage(MemPage *pPage){
pPage->nOverflow = 0; pPage->nOverflow = 0;
pPage->cellOffset = pPage->hdrOffset + 8 + pPage->childPtrSize; pPage->cellOffset = pPage->hdrOffset + 8 + pPage->childPtrSize;
pPage->aCellIdx = data + pPage->childPtrSize + 8; pPage->aCellIdx = data + pPage->childPtrSize + 8;
pPage->aDataEnd = pPage->aData + pBt->usableSize; pPage->aDataEnd = pPage->aData + pBt->pageSize;
pPage->aDataOfst = pPage->aData + pPage->childPtrSize; pPage->aDataOfst = pPage->aData + pPage->childPtrSize;
/* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the
** number of cells on the page. */ ** number of cells on the page. */
@ -68218,7 +68247,7 @@ static void zeroPage(MemPage *pPage, int flags){
u8 hdr = pPage->hdrOffset; u8 hdr = pPage->hdrOffset;
u16 first; u16 first;
assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno ); assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno || CORRUPT_DB );
assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage );
assert( sqlite3PagerGetData(pPage->pDbPage) == data ); assert( sqlite3PagerGetData(pPage->pDbPage) == data );
assert( sqlite3PagerIswriteable(pPage->pDbPage) ); assert( sqlite3PagerIswriteable(pPage->pDbPage) );
@ -68234,7 +68263,7 @@ static void zeroPage(MemPage *pPage, int flags){
pPage->nFree = (u16)(pBt->usableSize - first); pPage->nFree = (u16)(pBt->usableSize - first);
decodeFlags(pPage, flags); decodeFlags(pPage, flags);
pPage->cellOffset = first; pPage->cellOffset = first;
pPage->aDataEnd = &data[pBt->usableSize]; pPage->aDataEnd = &data[pBt->pageSize];
pPage->aCellIdx = &data[first]; pPage->aCellIdx = &data[first];
pPage->aDataOfst = &data[pPage->childPtrSize]; pPage->aDataOfst = &data[pPage->childPtrSize];
pPage->nOverflow = 0; pPage->nOverflow = 0;
@ -68360,7 +68389,7 @@ static int getAndInitPage(
goto getAndInitPage_error2; goto getAndInitPage_error2;
} }
} }
assert( (*ppPage)->pgno==pgno ); assert( (*ppPage)->pgno==pgno || CORRUPT_DB );
assert( (*ppPage)->aData==sqlite3PagerGetData(pDbPage) ); assert( (*ppPage)->aData==sqlite3PagerGetData(pDbPage) );
/* If obtaining a child page for a cursor, we must verify that the page is /* If obtaining a child page for a cursor, we must verify that the page is
@ -71447,7 +71476,7 @@ static int moveToRoot(BtCursor *pCur){
pCur->curIntKey = pCur->pPage->intKey; pCur->curIntKey = pCur->pPage->intKey;
} }
pRoot = pCur->pPage; pRoot = pCur->pPage;
assert( pRoot->pgno==pCur->pgnoRoot ); assert( pRoot->pgno==pCur->pgnoRoot || CORRUPT_DB );
/* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor /* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor
** expected to open it on an index b-tree. Otherwise, if pKeyInfo is ** expected to open it on an index b-tree. Otherwise, if pKeyInfo is
@ -71938,7 +71967,7 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto(
assert( lwr==upr+1 || (pPage->intKey && !pPage->leaf) ); assert( lwr==upr+1 || (pPage->intKey && !pPage->leaf) );
assert( pPage->isInit ); assert( pPage->isInit );
if( pPage->leaf ){ if( pPage->leaf ){
assert( pCur->ix<pCur->pPage->nCell ); assert( pCur->ix<pCur->pPage->nCell || CORRUPT_DB );
pCur->ix = (u16)idx; pCur->ix = (u16)idx;
*pRes = c; *pRes = c;
rc = SQLITE_OK; rc = SQLITE_OK;
@ -74462,7 +74491,7 @@ static int balance_nonroot(
iOvflSpace += sz; iOvflSpace += sz;
assert( sz<=pBt->maxLocal+23 ); assert( sz<=pBt->maxLocal+23 );
assert( iOvflSpace <= (int)pBt->pageSize ); assert( iOvflSpace <= (int)pBt->pageSize );
for(k=0; b.ixNx[k]<=i && ALWAYS(k<NB*2); k++){} for(k=0; b.ixNx[k]<=j && ALWAYS(k<NB*2); k++){}
pSrcEnd = b.apEnd[k]; pSrcEnd = b.apEnd[k];
if( SQLITE_WITHIN(pSrcEnd, pCell, pCell+sz) ){ if( SQLITE_WITHIN(pSrcEnd, pCell, pCell+sz) ){
rc = SQLITE_CORRUPT_BKPT; rc = SQLITE_CORRUPT_BKPT;
@ -74978,24 +75007,6 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
assert( (flags & (BTREE_SAVEPOSITION|BTREE_APPEND|BTREE_PREFORMAT))==flags ); assert( (flags & (BTREE_SAVEPOSITION|BTREE_APPEND|BTREE_PREFORMAT))==flags );
assert( (flags & BTREE_PREFORMAT)==0 || seekResult || pCur->pKeyInfo==0 ); assert( (flags & BTREE_PREFORMAT)==0 || seekResult || pCur->pKeyInfo==0 );
if( pCur->eState==CURSOR_FAULT ){
assert( pCur->skipNext!=SQLITE_OK );
return pCur->skipNext;
}
assert( cursorOwnsBtShared(pCur) );
assert( (pCur->curFlags & BTCF_WriteFlag)!=0
&& pBt->inTransaction==TRANS_WRITE
&& (pBt->btsFlags & BTS_READ_ONLY)==0 );
assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) );
/* Assert that the caller has been consistent. If this cursor was opened
** expecting an index b-tree, then the caller should be inserting blob
** keys with no associated data. If the cursor was opened expecting an
** intkey table, the caller should be inserting integer keys with a
** blob of associated data. */
assert( (flags & BTREE_PREFORMAT) || (pX->pKey==0)==(pCur->pKeyInfo==0) );
/* Save the positions of any other cursors open on this table. /* Save the positions of any other cursors open on this table.
** **
** In some cases, the call to btreeMoveto() below is a no-op. For ** In some cases, the call to btreeMoveto() below is a no-op. For
@ -75020,6 +75031,24 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
} }
} }
if( pCur->eState>=CURSOR_REQUIRESEEK ){
rc = moveToRoot(pCur);
if( rc && rc!=SQLITE_EMPTY ) return rc;
}
assert( cursorOwnsBtShared(pCur) );
assert( (pCur->curFlags & BTCF_WriteFlag)!=0
&& pBt->inTransaction==TRANS_WRITE
&& (pBt->btsFlags & BTS_READ_ONLY)==0 );
assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) );
/* Assert that the caller has been consistent. If this cursor was opened
** expecting an index b-tree, then the caller should be inserting blob
** keys with no associated data. If the cursor was opened expecting an
** intkey table, the caller should be inserting integer keys with a
** blob of associated data. */
assert( (flags & BTREE_PREFORMAT) || (pX->pKey==0)==(pCur->pKeyInfo==0) );
if( pCur->pKeyInfo==0 ){ if( pCur->pKeyInfo==0 ){
assert( pX->pKey==0 ); assert( pX->pKey==0 );
/* If this is an insert into a table b-tree, invalidate any incrblob /* If this is an insert into a table b-tree, invalidate any incrblob
@ -75108,14 +75137,13 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
} }
} }
assert( pCur->eState==CURSOR_VALID assert( pCur->eState==CURSOR_VALID
|| (pCur->eState==CURSOR_INVALID && loc) || (pCur->eState==CURSOR_INVALID && loc) );
|| CORRUPT_DB );
pPage = pCur->pPage; pPage = pCur->pPage;
assert( pPage->intKey || pX->nKey>=0 || (flags & BTREE_PREFORMAT) ); assert( pPage->intKey || pX->nKey>=0 || (flags & BTREE_PREFORMAT) );
assert( pPage->leaf || !pPage->intKey ); assert( pPage->leaf || !pPage->intKey );
if( pPage->nFree<0 ){ if( pPage->nFree<0 ){
if( NEVER(pCur->eState>CURSOR_INVALID) ){ if( pCur->eState>CURSOR_INVALID ){
rc = SQLITE_CORRUPT_BKPT; rc = SQLITE_CORRUPT_BKPT;
}else{ }else{
rc = btreeComputeFreeSpace(pPage); rc = btreeComputeFreeSpace(pPage);
@ -75396,12 +75424,16 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){
assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) ); assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) );
assert( !hasReadConflicts(p, pCur->pgnoRoot) ); assert( !hasReadConflicts(p, pCur->pgnoRoot) );
assert( (flags & ~(BTREE_SAVEPOSITION | BTREE_AUXDELETE))==0 ); assert( (flags & ~(BTREE_SAVEPOSITION | BTREE_AUXDELETE))==0 );
if( pCur->eState==CURSOR_REQUIRESEEK ){ if( pCur->eState!=CURSOR_VALID ){
if( pCur->eState>=CURSOR_REQUIRESEEK ){
rc = btreeRestoreCursorPosition(pCur); rc = btreeRestoreCursorPosition(pCur);
assert( rc!=SQLITE_OK || CORRUPT_DB || pCur->eState==CURSOR_VALID ); assert( rc!=SQLITE_OK || CORRUPT_DB || pCur->eState==CURSOR_VALID );
if( rc || pCur->eState!=CURSOR_VALID ) return rc; if( rc || pCur->eState!=CURSOR_VALID ) return rc;
}else{
return SQLITE_CORRUPT_BKPT;
} }
assert( CORRUPT_DB || pCur->eState==CURSOR_VALID ); }
assert( pCur->eState==CURSOR_VALID );
iCellDepth = pCur->iPage; iCellDepth = pCur->iPage;
iCellIdx = pCur->ix; iCellIdx = pCur->ix;
@ -78024,7 +78056,11 @@ SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){
assert( !sqlite3VdbeMemIsRowSet(pMem) ); assert( !sqlite3VdbeMemIsRowSet(pMem) );
assert( desiredEnc==SQLITE_UTF8 || desiredEnc==SQLITE_UTF16LE assert( desiredEnc==SQLITE_UTF8 || desiredEnc==SQLITE_UTF16LE
|| desiredEnc==SQLITE_UTF16BE ); || desiredEnc==SQLITE_UTF16BE );
if( !(pMem->flags&MEM_Str) || pMem->enc==desiredEnc ){ if( !(pMem->flags&MEM_Str) ){
pMem->enc = desiredEnc;
return SQLITE_OK;
}
if( pMem->enc==desiredEnc ){
return SQLITE_OK; return SQLITE_OK;
} }
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
@ -78736,6 +78772,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetPointer(
void (*xDestructor)(void*) void (*xDestructor)(void*)
){ ){
assert( pMem->flags==MEM_Null ); assert( pMem->flags==MEM_Null );
vdbeMemClear(pMem);
pMem->u.zPType = zPType ? zPType : ""; pMem->u.zPType = zPType ? zPType : "";
pMem->z = pPtr; pMem->z = pPtr;
pMem->flags = MEM_Null|MEM_Dyn|MEM_Subtype|MEM_Term; pMem->flags = MEM_Null|MEM_Dyn|MEM_Subtype|MEM_Term;
@ -88350,6 +88387,8 @@ case OP_Gosub: { /* jump */
/* Most jump operations do a goto to this spot in order to update /* Most jump operations do a goto to this spot in order to update
** the pOp pointer. */ ** the pOp pointer. */
jump_to_p2: jump_to_p2:
assert( pOp->p2>0 ); /* There are never any jumps to instruction 0 */
assert( pOp->p2<p->nOp ); /* Jumps must be in range */
pOp = &aOp[pOp->p2 - 1]; pOp = &aOp[pOp->p2 - 1];
break; break;
} }
@ -89990,11 +90029,19 @@ case OP_Offset: { /* out3 */
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); assert( pOp->p1>=0 && pOp->p1<p->nCursor );
pC = p->apCsr[pOp->p1]; pC = p->apCsr[pOp->p1];
pOut = &p->aMem[pOp->p3]; pOut = &p->aMem[pOp->p3];
if( NEVER(pC==0) || pC->eCurType!=CURTYPE_BTREE ){ if( pC==0 || pC->eCurType!=CURTYPE_BTREE ){
sqlite3VdbeMemSetNull(pOut);
}else{
if( pC->deferredMoveto ){
rc = sqlite3VdbeFinishMoveto(pC);
if( rc ) goto abort_due_to_error;
}
if( sqlite3BtreeEof(pC->uc.pCursor) ){
sqlite3VdbeMemSetNull(pOut); sqlite3VdbeMemSetNull(pOut);
}else{ }else{
sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeOffset(pC->uc.pCursor)); sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeOffset(pC->uc.pCursor));
} }
}
break; break;
} }
#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */ #endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */
@ -93072,6 +93119,10 @@ case OP_Rowid: { /* out2 */
** Move the cursor P1 to a null row. Any OP_Column operations ** Move the cursor P1 to a null row. Any OP_Column operations
** that occur while the cursor is on the null row will always ** that occur while the cursor is on the null row will always
** write a NULL. ** write a NULL.
**
** Or, if P1 is a Pseudo-Cursor (a cursor opened using OP_OpenPseudo)
** just reset the cache for that cursor. This causes the row of
** content held by the pseudo-cursor to be reparsed.
*/ */
case OP_NullRow: { case OP_NullRow: {
VdbeCursor *pC; VdbeCursor *pC;
@ -104718,6 +104769,38 @@ SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr *p, int iCur){
return exprIsConst(p, 3, iCur); return exprIsConst(p, 3, iCur);
} }
/*
** Check pExpr to see if it is an invariant constraint on data source pSrc.
** This is an optimization. False negatives will perhaps cause slower
** queries, but false positives will yield incorrect answers. So when in
** double, return 0.
**
** To be an invariant constraint, the following must be true:
**
** (1) pExpr cannot refer to any table other than pSrc->iCursor.
**
** (2) pExpr cannot use subqueries or non-deterministic functions.
**
** (*) ** Not applicable to this branch **
**
** (4) If pSrc is the right operand of a LEFT JOIN, then...
** (4a) pExpr must come from an ON clause..
** (4b) and specifically the ON clause associated with the LEFT JOIN.
**
** (5) If pSrc is not the right operand of a LEFT JOIN or the left
** operand of a RIGHT JOIN, then pExpr must be from the WHERE
** clause, not an ON clause.
*/
SQLITE_PRIVATE int sqlite3ExprIsTableConstraint(Expr *pExpr, const SrcItem *pSrc){
if( pSrc->fg.jointype & JT_LEFT ){
if( !ExprHasProperty(pExpr, EP_FromJoin) ) return 0; /* rule (4a) */
if( pExpr->w.iRightJoinTable!=pSrc->iCursor ) return 0; /* rule (4b) */
}else{
if( ExprHasProperty(pExpr, EP_FromJoin) ) return 0; /* rule (5) */
}
return sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor); /* rules (1), (2) */
}
/* /*
** sqlite3WalkExpr() callback used by sqlite3ExprIsConstantOrGroupBy(). ** sqlite3WalkExpr() callback used by sqlite3ExprIsConstantOrGroupBy().
@ -109918,19 +110001,21 @@ static int renameParseSql(
){ ){
int rc; int rc;
db->init.iDb = bTemp ? 1 : sqlite3FindDbName(db, zDb);
/* Parse the SQL statement passed as the first argument. If no error
** occurs and the parse does not result in a new table, index or
** trigger object, the database must be corrupt. */
sqlite3ParseObjectInit(p, db); sqlite3ParseObjectInit(p, db);
if( zSql==0 ){
return SQLITE_NOMEM;
}
if( sqlite3StrNICmp(zSql,"CREATE ",7)!=0 ){
return SQLITE_CORRUPT_BKPT;
}
db->init.iDb = bTemp ? 1 : sqlite3FindDbName(db, zDb);
p->eParseMode = PARSE_MODE_RENAME; p->eParseMode = PARSE_MODE_RENAME;
p->db = db; p->db = db;
p->nQueryLoop = 1; p->nQueryLoop = 1;
rc = zSql ? sqlite3RunParser(p, zSql) : SQLITE_NOMEM; rc = sqlite3RunParser(p, zSql);
if( db->mallocFailed ) rc = SQLITE_NOMEM; if( db->mallocFailed ) rc = SQLITE_NOMEM;
if( rc==SQLITE_OK if( rc==SQLITE_OK
&& p->pNewTable==0 && p->pNewIndex==0 && p->pNewTrigger==0 && NEVER(p->pNewTable==0 && p->pNewIndex==0 && p->pNewTrigger==0)
){ ){
rc = SQLITE_CORRUPT_BKPT; rc = SQLITE_CORRUPT_BKPT;
} }
@ -116679,6 +116764,11 @@ SQLITE_PRIVATE void sqlite3EndTable(
int addrInsLoop; /* Top of the loop for inserting rows */ int addrInsLoop; /* Top of the loop for inserting rows */
Table *pSelTab; /* A table that describes the SELECT results */ Table *pSelTab; /* A table that describes the SELECT results */
if( IN_SPECIAL_PARSE ){
pParse->rc = SQLITE_ERROR;
pParse->nErr++;
return;
}
regYield = ++pParse->nMem; regYield = ++pParse->nMem;
regRec = ++pParse->nMem; regRec = ++pParse->nMem;
regRowid = ++pParse->nMem; regRowid = ++pParse->nMem;
@ -123258,8 +123348,8 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){
INLINE_FUNC(likelihood, 2, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), INLINE_FUNC(likelihood, 2, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY),
INLINE_FUNC(likely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), INLINE_FUNC(likely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY),
#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
FUNCTION2(sqlite_offset, 1, 0, 0, noopFunc, SQLITE_FUNC_OFFSET| {1, SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_FUNC_OFFSET|SQLITE_FUNC_TYPEOF,
SQLITE_FUNC_TYPEOF), 0, 0, noopFunc, 0, 0, 0, "sqlite_offset", {0} },
#endif #endif
FUNCTION(ltrim, 1, 1, 0, trimFunc ), FUNCTION(ltrim, 1, 1, 0, trimFunc ),
FUNCTION(ltrim, 2, 1, 0, trimFunc ), FUNCTION(ltrim, 2, 1, 0, trimFunc ),
@ -125063,7 +125153,7 @@ SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){
} }
for(i=j=0; i<pTab->nCol; i++){ for(i=j=0; i<pTab->nCol; i++){
assert( pTab->aCol[i].affinity!=0 ); assert( pTab->aCol[i].affinity!=0 || sqlite3VdbeParser(v)->nErr>0 );
if( (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ){ if( (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ){
zColAff[j++] = pTab->aCol[i].affinity; zColAff[j++] = pTab->aCol[i].affinity;
} }
@ -125677,7 +125767,11 @@ SQLITE_PRIVATE void sqlite3Insert(
** **
** This is the 2nd template. ** This is the 2nd template.
*/ */
if( pColumn==0 && xferOptimization(pParse, pTab, pSelect, onError, iDb) ){ if( pColumn==0
&& pSelect!=0
&& pTrigger==0
&& xferOptimization(pParse, pTab, pSelect, onError, iDb)
){
assert( !pTrigger ); assert( !pTrigger );
assert( pList==0 ); assert( pList==0 );
goto insert_end; goto insert_end;
@ -127648,18 +127742,13 @@ static int xferOptimization(
int destHasUniqueIdx = 0; /* True if pDest has a UNIQUE index */ int destHasUniqueIdx = 0; /* True if pDest has a UNIQUE index */
int regData, regRowid; /* Registers holding data and rowid */ int regData, regRowid; /* Registers holding data and rowid */
if( pSelect==0 ){ assert( pSelect!=0 );
return 0; /* Must be of the form INSERT INTO ... SELECT ... */
}
if( pParse->pWith || pSelect->pWith ){ if( pParse->pWith || pSelect->pWith ){
/* Do not attempt to process this query if there are an WITH clauses /* Do not attempt to process this query if there are an WITH clauses
** attached to it. Proceeding may generate a false "no such table: xxx" ** attached to it. Proceeding may generate a false "no such table: xxx"
** error if pSelect reads from a CTE named "xxx". */ ** error if pSelect reads from a CTE named "xxx". */
return 0; return 0;
} }
if( sqlite3TriggerList(pParse, pDest) ){
return 0; /* tab1 must not have triggers */
}
#ifndef SQLITE_OMIT_VIRTUALTABLE #ifndef SQLITE_OMIT_VIRTUALTABLE
if( IsVirtual(pDest) ){ if( IsVirtual(pDest) ){
return 0; /* tab1 must not be a virtual table */ return 0; /* tab1 must not be a virtual table */
@ -133505,7 +133594,7 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl
sqlite3ResetAllSchemasOfConnection(db); sqlite3ResetAllSchemasOfConnection(db);
pDb = &db->aDb[iDb]; pDb = &db->aDb[iDb];
}else }else
if( rc==SQLITE_OK || (db->flags&SQLITE_NoSchemaError)){ if( rc==SQLITE_OK || ((db->flags&SQLITE_NoSchemaError) && rc!=SQLITE_NOMEM)){
/* Hack: If the SQLITE_NoSchemaError flag is set, then consider /* Hack: If the SQLITE_NoSchemaError flag is set, then consider
** the schema loaded, even if errors (other than OOM) occurred. In ** the schema loaded, even if errors (other than OOM) occurred. In
** this situation the current sqlite3_prepare() operation will fail, ** this situation the current sqlite3_prepare() operation will fail,
@ -133779,6 +133868,14 @@ SQLITE_PRIVATE void sqlite3ParseObjectInit(Parse *pParse, sqlite3 *db){
if( db->mallocFailed ) sqlite3ErrorMsg(pParse, "out of memory"); if( db->mallocFailed ) sqlite3ErrorMsg(pParse, "out of memory");
} }
/*
** Maximum number of times that we will try again to prepare a statement
** that returns SQLITE_ERROR_RETRY.
*/
#ifndef SQLITE_MAX_PREPARE_RETRY
# define SQLITE_MAX_PREPARE_RETRY 25
#endif
/* /*
** Compile the UTF-8 encoded SQL statement zSql into a statement handle. ** Compile the UTF-8 encoded SQL statement zSql into a statement handle.
*/ */
@ -133953,7 +134050,7 @@ static int sqlite3LockAndPrepare(
rc = sqlite3Prepare(db, zSql, nBytes, prepFlags, pOld, ppStmt, pzTail); rc = sqlite3Prepare(db, zSql, nBytes, prepFlags, pOld, ppStmt, pzTail);
assert( rc==SQLITE_OK || *ppStmt==0 ); assert( rc==SQLITE_OK || *ppStmt==0 );
if( rc==SQLITE_OK || db->mallocFailed ) break; if( rc==SQLITE_OK || db->mallocFailed ) break;
}while( rc==SQLITE_ERROR_RETRY }while( (rc==SQLITE_ERROR_RETRY && (cnt++)<SQLITE_MAX_PREPARE_RETRY)
|| (rc==SQLITE_SCHEMA && (sqlite3ResetOneSchema(db,-1), cnt++)==0) ); || (rc==SQLITE_SCHEMA && (sqlite3ResetOneSchema(db,-1), cnt++)==0) );
sqlite3BtreeLeaveAll(db); sqlite3BtreeLeaveAll(db);
rc = sqlite3ApiExit(db, rc); rc = sqlite3ApiExit(db, rc);
@ -138995,8 +139092,7 @@ static int pushDownWhereTerms(
Parse *pParse, /* Parse context (for malloc() and error reporting) */ Parse *pParse, /* Parse context (for malloc() and error reporting) */
Select *pSubq, /* The subquery whose WHERE clause is to be augmented */ Select *pSubq, /* The subquery whose WHERE clause is to be augmented */
Expr *pWhere, /* The WHERE clause of the outer query */ Expr *pWhere, /* The WHERE clause of the outer query */
int iCursor, /* Cursor number of the subquery */ SrcItem *pSrc /* The subquery term of the outer FROM clause */
int isLeftJoin /* True if pSubq is the right term of a LEFT JOIN */
){ ){
Expr *pNew; Expr *pNew;
int nChng = 0; int nChng = 0;
@ -139031,10 +139127,11 @@ static int pushDownWhereTerms(
return 0; /* restriction (3) */ return 0; /* restriction (3) */
} }
while( pWhere->op==TK_AND ){ while( pWhere->op==TK_AND ){
nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight, nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight, pSrc);
iCursor, isLeftJoin);
pWhere = pWhere->pLeft; pWhere = pWhere->pLeft;
} }
#if 0 /* Legacy code. Checks now done by sqlite3ExprIsTableConstraint() */
if( isLeftJoin if( isLeftJoin
&& (ExprHasProperty(pWhere,EP_FromJoin)==0 && (ExprHasProperty(pWhere,EP_FromJoin)==0
|| pWhere->w.iRightJoinTable!=iCursor) || pWhere->w.iRightJoinTable!=iCursor)
@ -139046,7 +139143,9 @@ static int pushDownWhereTerms(
){ ){
return 0; /* restriction (5) */ return 0; /* restriction (5) */
} }
if( sqlite3ExprIsTableConstant(pWhere, iCursor) ){ #endif
if( sqlite3ExprIsTableConstraint(pWhere, pSrc) ){
nChng++; nChng++;
pSubq->selFlags |= SF_PushDown; pSubq->selFlags |= SF_PushDown;
while( pSubq ){ while( pSubq ){
@ -139054,8 +139153,8 @@ static int pushDownWhereTerms(
pNew = sqlite3ExprDup(pParse->db, pWhere, 0); pNew = sqlite3ExprDup(pParse->db, pWhere, 0);
unsetJoinExpr(pNew, -1); unsetJoinExpr(pNew, -1);
x.pParse = pParse; x.pParse = pParse;
x.iTable = iCursor; x.iTable = pSrc->iCursor;
x.iNewTable = iCursor; x.iNewTable = pSrc->iCursor;
x.isLeftJoin = 0; x.isLeftJoin = 0;
x.pEList = pSubq->pEList; x.pEList = pSubq->pEList;
pNew = substExpr(&x, pNew); pNew = substExpr(&x, pNew);
@ -140837,8 +140936,7 @@ SQLITE_PRIVATE int sqlite3Select(
if( OptimizationEnabled(db, SQLITE_PushDown) if( OptimizationEnabled(db, SQLITE_PushDown)
&& (pItem->fg.isCte==0 && (pItem->fg.isCte==0
|| (pItem->u2.pCteUse->eM10d!=M10d_Yes && pItem->u2.pCteUse->nUse<2)) || (pItem->u2.pCteUse->eM10d!=M10d_Yes && pItem->u2.pCteUse->nUse<2))
&& pushDownWhereTerms(pParse, pSub, p->pWhere, pItem->iCursor, && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem)
(pItem->fg.jointype & JT_OUTER)!=0)
){ ){
#if SELECTTRACE_ENABLED #if SELECTTRACE_ENABLED
if( sqlite3SelectTrace & 0x100 ){ if( sqlite3SelectTrace & 0x100 ){
@ -142372,6 +142470,7 @@ static TriggerStep *triggerStepAllocate(
sqlite3 *db = pParse->db; sqlite3 *db = pParse->db;
TriggerStep *pTriggerStep; TriggerStep *pTriggerStep;
if( pParse->nErr ) return 0;
pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n + 1); pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n + 1);
if( pTriggerStep ){ if( pTriggerStep ){
char *z = (char*)&pTriggerStep[1]; char *z = (char*)&pTriggerStep[1];
@ -146250,6 +146349,7 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
sqlite3ParseObjectInit(&sParse, db); sqlite3ParseObjectInit(&sParse, db);
sParse.eParseMode = PARSE_MODE_DECLARE_VTAB; sParse.eParseMode = PARSE_MODE_DECLARE_VTAB;
sParse.disableTriggers = 1;
/* We should never be able to reach this point while loading the /* We should never be able to reach this point while loading the
** schema. Nevertheless, defend against that (turn off db->init.busy) ** schema. Nevertheless, defend against that (turn off db->init.busy)
** in case a bug arises. */ ** in case a bug arises. */
@ -148185,6 +148285,7 @@ static int codeAllEqualityTerms(
VdbeCoverageIf(v, bRev!=0); VdbeCoverageIf(v, bRev!=0);
VdbeComment((v, "begin skip-scan on %s", pIdx->zName)); VdbeComment((v, "begin skip-scan on %s", pIdx->zName));
j = sqlite3VdbeAddOp0(v, OP_Goto); j = sqlite3VdbeAddOp0(v, OP_Goto);
assert( pLevel->addrSkip==0 );
pLevel->addrSkip = sqlite3VdbeAddOp4Int(v, (bRev?OP_SeekLT:OP_SeekGT), pLevel->addrSkip = sqlite3VdbeAddOp4Int(v, (bRev?OP_SeekLT:OP_SeekGT),
iIdxCur, 0, regBase, nSkip); iIdxCur, 0, regBase, nSkip);
VdbeCoverageIf(v, bRev==0); VdbeCoverageIf(v, bRev==0);
@ -148627,6 +148728,7 @@ static void preserveExpr(IdxExprTrans *pTrans, Expr *pExpr){
static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ static int whereIndexExprTransNode(Walker *p, Expr *pExpr){
IdxExprTrans *pX = p->u.pIdxTrans; IdxExprTrans *pX = p->u.pIdxTrans;
if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){ if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){
pExpr = sqlite3ExprSkipCollate(pExpr);
preserveExpr(pX, pExpr); preserveExpr(pX, pExpr);
pExpr->affExpr = sqlite3ExprAffinity(pExpr); pExpr->affExpr = sqlite3ExprAffinity(pExpr);
pExpr->op = TK_COLUMN; pExpr->op = TK_COLUMN;
@ -148782,9 +148884,12 @@ static SQLITE_NOINLINE void filterPullDown(
WhereLevel *pLevel = &pWInfo->a[iLevel]; WhereLevel *pLevel = &pWInfo->a[iLevel];
WhereLoop *pLoop = pLevel->pWLoop; WhereLoop *pLoop = pLevel->pWLoop;
if( pLevel->regFilter==0 ) continue; if( pLevel->regFilter==0 ) continue;
if( pLevel->pWLoop->nSkip ) continue;
/* ,--- Because sqlite3ConstructBloomFilter() has will not have set /* ,--- Because sqlite3ConstructBloomFilter() has will not have set
** vvvvv--' pLevel->regFilter if this were true. */ ** vvvvv--' pLevel->regFilter if this were true. */
if( NEVER(pLoop->prereq & notReady) ) continue; if( NEVER(pLoop->prereq & notReady) ) continue;
assert( pLevel->addrBrk==0 );
pLevel->addrBrk = addrNxt;
if( pLoop->wsFlags & WHERE_IPK ){ if( pLoop->wsFlags & WHERE_IPK ){
WhereTerm *pTerm = pLoop->aLTerm[0]; WhereTerm *pTerm = pLoop->aLTerm[0];
int regRowid; int regRowid;
@ -148811,6 +148916,7 @@ static SQLITE_NOINLINE void filterPullDown(
VdbeCoverage(pParse->pVdbe); VdbeCoverage(pParse->pVdbe);
} }
pLevel->regFilter = 0; pLevel->regFilter = 0;
pLevel->addrBrk = 0;
} }
} }
@ -148916,7 +149022,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
int iReg; /* P3 Value for OP_VFilter */ int iReg; /* P3 Value for OP_VFilter */
int addrNotFound; int addrNotFound;
int nConstraint = pLoop->nLTerm; int nConstraint = pLoop->nLTerm;
int iIn; /* Counter for IN constraints */
iReg = sqlite3GetTempRange(pParse, nConstraint+2); iReg = sqlite3GetTempRange(pParse, nConstraint+2);
addrNotFound = pLevel->addrBrk; addrNotFound = pLevel->addrBrk;
@ -148962,50 +149067,54 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext; pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext;
pLevel->p2 = sqlite3VdbeCurrentAddr(v); pLevel->p2 = sqlite3VdbeCurrentAddr(v);
assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 ); assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 );
if( pLoop->wsFlags & WHERE_IN_ABLE ){
iIn = pLevel->u.in.nIn; for(j=0; j<nConstraint; j++){
}else{
iIn = 0;
}
for(j=nConstraint-1; j>=0; j--){
int bIn; /* True to generate byte code to loop over RHS IN values */
pTerm = pLoop->aLTerm[j]; pTerm = pLoop->aLTerm[j];
if( (pTerm->eOperator & WO_IN)!=0
&& (SMASKBIT32(j) & pLoop->u.vtab.mHandleIn)==0
){
bIn = 1;
}else{
bIn = 0;
}
if( bIn ) iIn--;
if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){ if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){
disableTerm(pLevel, pTerm); disableTerm(pLevel, pTerm);
}else if( bIn && sqlite3ExprVectorSize(pTerm->pExpr->pLeft)==1 ){ continue;
}
if( (pTerm->eOperator & WO_IN)!=0
&& (SMASKBIT32(j) & pLoop->u.vtab.mHandleIn)==0
&& !db->mallocFailed
){
Expr *pCompare; /* The comparison operator */ Expr *pCompare; /* The comparison operator */
Expr *pRight; /* RHS of the comparison */ Expr *pRight; /* RHS of the comparison */
VdbeOp *pOp; /* Opcode to access the value of the IN constraint */ VdbeOp *pOp; /* Opcode to access the value of the IN constraint */
int iIn; /* IN loop corresponding to the j-th constraint */
/* Reload the constraint value into reg[iReg+j+2]. The same value /* Reload the constraint value into reg[iReg+j+2]. The same value
** was loaded into the same register prior to the OP_VFilter, but ** was loaded into the same register prior to the OP_VFilter, but
** the xFilter implementation might have changed the datatype or ** the xFilter implementation might have changed the datatype or
** encoding of the value in the register, so it *must* be reloaded. */ ** encoding of the value in the register, so it *must* be reloaded.
assert( pLevel->u.in.aInLoop!=0 || db->mallocFailed ); */
if( !db->mallocFailed ){ for(iIn=0; ALWAYS(iIn<pLevel->u.in.nIn); iIn++){
assert( iIn>=0 && iIn<pLevel->u.in.nIn );
pOp = sqlite3VdbeGetOp(v, pLevel->u.in.aInLoop[iIn].addrInTop); pOp = sqlite3VdbeGetOp(v, pLevel->u.in.aInLoop[iIn].addrInTop);
assert( pOp->opcode==OP_Column || pOp->opcode==OP_Rowid ); if( (pOp->opcode==OP_Column && pOp->p3==iReg+j+2)
assert( pOp->opcode!=OP_Column || pOp->p3==iReg+j+2 ); || (pOp->opcode==OP_Rowid && pOp->p2==iReg+j+2)
assert( pOp->opcode!=OP_Rowid || pOp->p2==iReg+j+2 ); ){
testcase( pOp->opcode==OP_Rowid ); testcase( pOp->opcode==OP_Rowid );
sqlite3VdbeAddOp3(v, pOp->opcode, pOp->p1, pOp->p2, pOp->p3); sqlite3VdbeAddOp3(v, pOp->opcode, pOp->p1, pOp->p2, pOp->p3);
break;
}
} }
/* Generate code that will continue to the next row if /* Generate code that will continue to the next row if
** the IN constraint is not satisfied */ ** the IN constraint is not satisfied
*/
pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0); pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0);
assert( pCompare!=0 || db->mallocFailed ); if( !db->mallocFailed ){
if( pCompare ){ int iFld = pTerm->u.x.iField;
pCompare->pLeft = pTerm->pExpr->pLeft; Expr *pLeft = pTerm->pExpr->pLeft;
assert( pLeft!=0 );
if( iFld>0 ){
assert( pLeft->op==TK_VECTOR );
assert( ExprUseXList(pLeft) );
assert( iFld<=pLeft->x.pList->nExpr );
pCompare->pLeft = pLeft->x.pList->a[iFld-1].pExpr;
}else{
pCompare->pLeft = pLeft;
}
pCompare->pRight = pRight = sqlite3Expr(db, TK_REGISTER, 0); pCompare->pRight = pRight = sqlite3Expr(db, TK_REGISTER, 0);
if( pRight ){ if( pRight ){
pRight->iTable = iReg+j+2; pRight->iTable = iReg+j+2;
@ -149014,11 +149123,11 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
); );
} }
pCompare->pLeft = 0; pCompare->pLeft = 0;
}
sqlite3ExprDelete(db, pCompare); sqlite3ExprDelete(db, pCompare);
} }
} }
}
assert( iIn==0 || db->mallocFailed );
/* These registers need to be preserved in case there is an IN operator /* These registers need to be preserved in case there is an IN operator
** loop. So we could deallocate the registers here (and potentially ** loop. So we could deallocate the registers here (and potentially
** reuse them later) if (pLoop->wsFlags & WHERE_IN_ABLE)==0. But it seems ** reuse them later) if (pLoop->wsFlags & WHERE_IN_ABLE)==0. But it seems
@ -149728,6 +149837,14 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
** the initialization of the right-hand operand of the vector comparison ** the initialization of the right-hand operand of the vector comparison
** might not occur, or might occur only in an OR branch that is not ** might not occur, or might occur only in an OR branch that is not
** taken. dbsqlfuzz 80a9fade844b4fb43564efc972bcb2c68270f5d1. ** taken. dbsqlfuzz 80a9fade844b4fb43564efc972bcb2c68270f5d1.
**
** 2022-03-03: Do not push down expressions that involve subqueries.
** The subquery might get coded as a subroutine. Any table-references
** in the subquery might be resolved to index-references for the index on
** the OR branch in which the subroutine is coded. But if the subroutine
** is invoked from a different OR branch that uses a different index, such
** index-references will not work. tag-20220303a
** https://sqlite.org/forum/forumpost/36937b197273d403
*/ */
if( pWC->nTerm>1 ){ if( pWC->nTerm>1 ){
int iTerm; int iTerm;
@ -149741,7 +149858,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
continue; continue;
} }
if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue; if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue;
testcase( pWC->a[iTerm].wtFlags & TERM_ORINFO ); if( ExprHasProperty(pExpr, EP_Subquery) ) continue; /* tag-20220303a */
pExpr = sqlite3ExprDup(db, pExpr, 0); pExpr = sqlite3ExprDup(db, pExpr, 0);
pAndExpr = sqlite3ExprAnd(pParse, pAndExpr, pExpr); pAndExpr = sqlite3ExprAnd(pParse, pAndExpr, pExpr);
} }
@ -152748,8 +152865,7 @@ static SQLITE_NOINLINE void constructAutomaticIndex(
** WHERE clause (or the ON clause of a LEFT join) that constrain which ** WHERE clause (or the ON clause of a LEFT join) that constrain which
** rows of the target table (pSrc) that can be used. */ ** rows of the target table (pSrc) that can be used. */
if( (pTerm->wtFlags & TERM_VIRTUAL)==0 if( (pTerm->wtFlags & TERM_VIRTUAL)==0
&& ((pSrc->fg.jointype&JT_LEFT)==0 || ExprHasProperty(pExpr,EP_FromJoin)) && sqlite3ExprIsTableConstraint(pExpr, pSrc)
&& sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor)
){ ){
pPartial = sqlite3ExprAnd(pParse, pPartial, pPartial = sqlite3ExprAnd(pParse, pPartial,
sqlite3ExprDup(pParse->db, pExpr, 0)); sqlite3ExprDup(pParse->db, pExpr, 0));
@ -152988,7 +153104,7 @@ static SQLITE_NOINLINE void sqlite3ConstructBloomFilter(
for(pTerm=pWInfo->sWC.a; pTerm<pWCEnd; pTerm++){ for(pTerm=pWInfo->sWC.a; pTerm<pWCEnd; pTerm++){
Expr *pExpr = pTerm->pExpr; Expr *pExpr = pTerm->pExpr;
if( (pTerm->wtFlags & TERM_VIRTUAL)==0 if( (pTerm->wtFlags & TERM_VIRTUAL)==0
&& sqlite3ExprIsTableConstant(pExpr, iCur) && sqlite3ExprIsTableConstraint(pExpr, pItem)
){ ){
sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL); sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL);
} }
@ -153018,7 +153134,10 @@ static SQLITE_NOINLINE void sqlite3ConstructBloomFilter(
pLoop->wsFlags &= ~WHERE_BLOOMFILTER; pLoop->wsFlags &= ~WHERE_BLOOMFILTER;
if( OptimizationDisabled(pParse->db, SQLITE_BloomPulldown) ) break; if( OptimizationDisabled(pParse->db, SQLITE_BloomPulldown) ) break;
while( ++iLevel < pWInfo->nLevel ){ while( ++iLevel < pWInfo->nLevel ){
const SrcItem *pTabItem;
pLevel = &pWInfo->a[iLevel]; pLevel = &pWInfo->a[iLevel];
pTabItem = &pWInfo->pTabList->a[pLevel->iFrom];
if( pTabItem->fg.jointype & JT_LEFT ) continue;
pLoop = pLevel->pWLoop; pLoop = pLevel->pWLoop;
if( NEVER(pLoop==0) ) continue; if( NEVER(pLoop==0) ) continue;
if( pLoop->prereq & notReady ) continue; if( pLoop->prereq & notReady ) continue;
@ -154531,9 +154650,18 @@ static void whereLoopOutputAdjust(
/* If there are extra terms in the WHERE clause not used by an index /* If there are extra terms in the WHERE clause not used by an index
** that depend only on the table being scanned, and that will tend to ** that depend only on the table being scanned, and that will tend to
** cause many rows to be omitted, then mark that table as ** cause many rows to be omitted, then mark that table as
** "self-culling". */ ** "self-culling".
**
** 2022-03-24: Self-culling only applies if either the extra terms
** are straight comparison operators that are non-true with NULL
** operand, or if the loop is not a LEFT JOIN.
*/
if( (pTerm->eOperator & 0x3f)!=0
|| (pWC->pWInfo->pTabList->a[pLoop->iTab].fg.jointype & JT_LEFT)==0
){
pLoop->wsFlags |= WHERE_SELFCULL; pLoop->wsFlags |= WHERE_SELFCULL;
} }
}
if( pTerm->truthProb<=0 ){ if( pTerm->truthProb<=0 ){
/* If a truth probability is specified using the likelihood() hints, /* If a truth probability is specified using the likelihood() hints,
** then use the probability provided by the application. */ ** then use the probability provided by the application. */
@ -155701,7 +155829,6 @@ SQLITE_API int sqlite3_vtab_rhs_value(
return rc; return rc;
} }
/* /*
** Return true if ORDER BY clause may be handled as DISTINCT. ** Return true if ORDER BY clause may be handled as DISTINCT.
*/ */
@ -155713,6 +155840,22 @@ SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info *pIdxInfo){
return pHidden->eDistinct; return pHidden->eDistinct;
} }
#if (defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST)) \
&& !defined(SQLITE_OMIT_VIRTUALTABLE)
/*
** Cause the prepared statement that is associated with a call to
** xBestIndex to open write transactions on all attached schemas.
** This is used by the (built-in) sqlite_dbpage virtual table.
*/
SQLITE_PRIVATE void sqlite3VtabWriteAll(sqlite3_index_info *pIdxInfo){
HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1];
Parse *pParse = pHidden->pParse;
int nDb = pParse->db->nDb;
int i;
for(i=0; i<nDb; i++) sqlite3BeginWriteOperation(pParse, 0, i);
}
#endif
/* /*
** Add all WhereLoop objects for a table of the join identified by ** Add all WhereLoop objects for a table of the join identified by
** pBuilder->pNew->iTab. That table is guaranteed to be a virtual table. ** pBuilder->pNew->iTab. That table is guaranteed to be a virtual table.
@ -157816,6 +157959,26 @@ whereBeginError:
} }
#endif #endif
#ifdef SQLITE_DEBUG
/*
** Return true if cursor iCur is opened by instruction k of the
** bytecode. Used inside of assert() only.
*/
static int cursorIsOpen(Vdbe *v, int iCur, int k){
while( k>=0 ){
VdbeOp *pOp = sqlite3VdbeGetOp(v,k--);
if( pOp->p1!=iCur ) continue;
if( pOp->opcode==OP_Close ) return 0;
if( pOp->opcode==OP_OpenRead ) return 1;
if( pOp->opcode==OP_OpenWrite ) return 1;
if( pOp->opcode==OP_OpenDup ) return 1;
if( pOp->opcode==OP_OpenAutoindex ) return 1;
if( pOp->opcode==OP_OpenEphemeral ) return 1;
}
return 0;
}
#endif /* SQLITE_DEBUG */
/* /*
** Generate the end of the WHERE loop. See comments on ** Generate the end of the WHERE loop. See comments on
** sqlite3WhereBegin() for additional information. ** sqlite3WhereBegin() for additional information.
@ -158068,6 +158231,11 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
){ ){
int x = pOp->p2; int x = pOp->p2;
assert( pIdx->pTable==pTab ); assert( pIdx->pTable==pTab );
#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
if( pOp->opcode==OP_Offset ){
/* Do not need to translate the column number */
}else
#endif
if( !HasRowid(pTab) ){ if( !HasRowid(pTab) ){
Index *pPk = sqlite3PrimaryKeyIndex(pTab); Index *pPk = sqlite3PrimaryKeyIndex(pTab);
x = pPk->aiColumn[x]; x = pPk->aiColumn[x];
@ -158081,9 +158249,22 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
pOp->p2 = x; pOp->p2 = x;
pOp->p1 = pLevel->iIdxCur; pOp->p1 = pLevel->iIdxCur;
OpcodeRewriteTrace(db, k, pOp); OpcodeRewriteTrace(db, k, pOp);
}else{
/* Unable to translate the table reference into an index
** reference. Verify that this is harmless - that the
** table being referenced really is open.
*/
#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0
|| cursorIsOpen(v,pOp->p1,k)
|| pOp->opcode==OP_Offset
);
#else
assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0
|| cursorIsOpen(v,pOp->p1,k)
);
#endif
} }
assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 || x>=0
|| pWInfo->eOnePass );
}else if( pOp->opcode==OP_Rowid ){ }else if( pOp->opcode==OP_Rowid ){
pOp->p1 = pLevel->iIdxCur; pOp->p1 = pLevel->iIdxCur;
pOp->opcode = OP_IdxRowid; pOp->opcode = OP_IdxRowid;
@ -159071,7 +159252,11 @@ static int disallowAggregatesInOrderByCb(Walker *pWalker, Expr *pExpr){
*/ */
SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){
int rc = SQLITE_OK; int rc = SQLITE_OK;
if( p->pWin && p->pPrior==0 && ALWAYS((p->selFlags & SF_WinRewrite)==0) ){ if( p->pWin
&& p->pPrior==0
&& ALWAYS((p->selFlags & SF_WinRewrite)==0)
&& ALWAYS(!IN_RENAME_OBJECT)
){
Vdbe *v = sqlite3GetVdbe(pParse); Vdbe *v = sqlite3GetVdbe(pParse);
sqlite3 *db = pParse->db; sqlite3 *db = pParse->db;
Select *pSub = 0; /* The subquery */ Select *pSub = 0; /* The subquery */
@ -159146,6 +159331,7 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){
for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
ExprList *pArgs; ExprList *pArgs;
assert( ExprUseXList(pWin->pOwner) ); assert( ExprUseXList(pWin->pOwner) );
assert( pWin->pFunc!=0 );
pArgs = pWin->pOwner->x.pList; pArgs = pWin->pOwner->x.pList;
if( pWin->pFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){ if( pWin->pFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){
selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist); selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist);
@ -159838,7 +160024,7 @@ static void windowAggStep(
for(iEnd=sqlite3VdbeCurrentAddr(v); iOp<iEnd; iOp++){ for(iEnd=sqlite3VdbeCurrentAddr(v); iOp<iEnd; iOp++){
VdbeOp *pOp = sqlite3VdbeGetOp(v, iOp); VdbeOp *pOp = sqlite3VdbeGetOp(v, iOp);
if( pOp->opcode==OP_Column && pOp->p1==pWin->iEphCsr ){ if( pOp->opcode==OP_Column && pOp->p1==pMWin->iEphCsr ){
pOp->p1 = csr; pOp->p1 = csr;
} }
} }
@ -194156,15 +194342,16 @@ static JsonNode *jsonLookupStep(
*pzErr = zPath; *pzErr = zPath;
return 0; return 0;
} }
testcase( nKey==0 );
}else{ }else{
zKey = zPath; zKey = zPath;
for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){} for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){}
nKey = i; nKey = i;
}
if( nKey==0 ){ if( nKey==0 ){
*pzErr = zPath; *pzErr = zPath;
return 0; return 0;
} }
}
j = 1; j = 1;
for(;;){ for(;;){
while( j<=pRoot->n ){ while( j<=pRoot->n ){
@ -195311,6 +195498,33 @@ static int jsonEachNext(sqlite3_vtab_cursor *cur){
return SQLITE_OK; return SQLITE_OK;
} }
/* Append an object label to the JSON Path being constructed
** in pStr.
*/
static void jsonAppendObjectPathElement(
JsonString *pStr,
JsonNode *pNode
){
int jj, nn;
const char *z;
assert( pNode->eType==JSON_STRING );
assert( pNode->jnFlags & JNODE_LABEL );
assert( pNode->eU==1 );
z = pNode->u.zJContent;
nn = pNode->n;
assert( nn>=2 );
assert( z[0]=='"' );
assert( z[nn-1]=='"' );
if( nn>2 && sqlite3Isalpha(z[1]) ){
for(jj=2; jj<nn-1 && sqlite3Isalnum(z[jj]); jj++){}
if( jj==nn-1 ){
z++;
nn -= 2;
}
}
jsonPrintf(nn+2, pStr, ".%.*s", nn, z);
}
/* Append the name of the path for element i to pStr /* Append the name of the path for element i to pStr
*/ */
static void jsonEachComputePath( static void jsonEachComputePath(
@ -195335,10 +195549,7 @@ static void jsonEachComputePath(
}else{ }else{
assert( pUp->eType==JSON_OBJECT ); assert( pUp->eType==JSON_OBJECT );
if( (pNode->jnFlags & JNODE_LABEL)==0 ) pNode--; if( (pNode->jnFlags & JNODE_LABEL)==0 ) pNode--;
assert( pNode->eType==JSON_STRING ); jsonAppendObjectPathElement(pStr, pNode);
assert( pNode->jnFlags & JNODE_LABEL );
assert( pNode->eU==1 );
jsonPrintf(pNode->n+1, pStr, ".%.*s", pNode->n-2, pNode->u.zJContent+1);
} }
} }
@ -195409,8 +195620,7 @@ static int jsonEachColumn(
if( p->eType==JSON_ARRAY ){ if( p->eType==JSON_ARRAY ){
jsonPrintf(30, &x, "[%d]", p->iRowid); jsonPrintf(30, &x, "[%d]", p->iRowid);
}else if( p->eType==JSON_OBJECT ){ }else if( p->eType==JSON_OBJECT ){
assert( pThis->eU==1 ); jsonAppendObjectPathElement(&x, pThis);
jsonPrintf(pThis->n, &x, ".%.*s", pThis->n-2, pThis->u.zJContent+1);
} }
} }
jsonResult(&x); jsonResult(&x);
@ -209957,6 +210167,7 @@ static int dbpageBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
){ ){
pIdxInfo->orderByConsumed = 1; pIdxInfo->orderByConsumed = 1;
} }
sqlite3VtabWriteAll(pIdxInfo);
return SQLITE_OK; return SQLITE_OK;
} }
@ -232311,7 +232522,7 @@ static int fts5SorterNext(Fts5Cursor *pCsr){
rc = sqlite3_step(pSorter->pStmt); rc = sqlite3_step(pSorter->pStmt);
if( rc==SQLITE_DONE ){ if( rc==SQLITE_DONE ){
rc = SQLITE_OK; rc = SQLITE_OK;
CsrFlagSet(pCsr, FTS5CSR_EOF); CsrFlagSet(pCsr, FTS5CSR_EOF|FTS5CSR_REQUIRE_CONTENT);
}else if( rc==SQLITE_ROW ){ }else if( rc==SQLITE_ROW ){
const u8 *a; const u8 *a;
const u8 *aBlob; const u8 *aBlob;
@ -234300,7 +234511,7 @@ static void fts5SourceIdFunc(
){ ){
assert( nArg==0 ); assert( nArg==0 );
UNUSED_PARAM2(nArg, apUnused); UNUSED_PARAM2(nArg, apUnused);
sqlite3_result_text(pCtx, "fts5: 2022-02-22 18:58:40 40fa792d359f84c3b9e9d6623743e1a59826274e221df1bde8f47086968a1bab", -1, SQLITE_TRANSIENT); sqlite3_result_text(pCtx, "fts5: 2022-05-06 15:25:27 78d9c993d404cdfaa7fdd2973fa1052e3da9f66215cff9c5540ebe55c407d9fe", -1, SQLITE_TRANSIENT);
} }
/* /*

16
deps/sqlite/sqlite3.h vendored
View File

@ -146,9 +146,9 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()]. ** [sqlite_version()] and [sqlite_source_id()].
*/ */
#define SQLITE_VERSION "3.38.0" #define SQLITE_VERSION "3.38.5"
#define SQLITE_VERSION_NUMBER 3038000 #define SQLITE_VERSION_NUMBER 3038005
#define SQLITE_SOURCE_ID "2022-02-22 18:58:40 40fa792d359f84c3b9e9d6623743e1a59826274e221df1bde8f47086968a1bab" #define SQLITE_SOURCE_ID "2022-05-06 15:25:27 78d9c993d404cdfaa7fdd2973fa1052e3da9f66215cff9c5540ebe55c407d9fe"
/* /*
** CAPI3REF: Run-Time Library Version Numbers ** CAPI3REF: Run-Time Library Version Numbers
@ -4979,6 +4979,10 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** even empty strings, are always zero-terminated. ^The return ** even empty strings, are always zero-terminated. ^The return
** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. ** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer.
** **
** ^Strings returned by sqlite3_column_text16() always have the endianness
** which is native to the platform, regardless of the text encoding set
** for the database.
**
** <b>Warning:</b> ^The object returned by [sqlite3_column_value()] is an ** <b>Warning:</b> ^The object returned by [sqlite3_column_value()] is an
** [unprotected sqlite3_value] object. In a multithreaded environment, ** [unprotected sqlite3_value] object. In a multithreaded environment,
** an unprotected sqlite3_value object may only be used safely with ** an unprotected sqlite3_value object may only be used safely with
@ -4992,7 +4996,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** [application-defined SQL functions] or [virtual tables], not within ** [application-defined SQL functions] or [virtual tables], not within
** top-level application code. ** top-level application code.
** **
** The these routines may attempt to convert the datatype of the result. ** These routines may attempt to convert the datatype of the result.
** ^For example, if the internal representation is FLOAT and a text result ** ^For example, if the internal representation is FLOAT and a text result
** is requested, [sqlite3_snprintf()] is used internally to perform the ** is requested, [sqlite3_snprintf()] is used internally to perform the
** conversion automatically. ^(The following table details the conversions ** conversion automatically. ^(The following table details the conversions
@ -5017,7 +5021,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
** <tr><td> TEXT <td> BLOB <td> No change ** <tr><td> TEXT <td> BLOB <td> No change
** <tr><td> BLOB <td> INTEGER <td> [CAST] to INTEGER ** <tr><td> BLOB <td> INTEGER <td> [CAST] to INTEGER
** <tr><td> BLOB <td> FLOAT <td> [CAST] to REAL ** <tr><td> BLOB <td> FLOAT <td> [CAST] to REAL
** <tr><td> BLOB <td> TEXT <td> Add a zero terminator if needed ** <tr><td> BLOB <td> TEXT <td> [CAST] to TEXT, ensure zero terminator
** </table> ** </table>
** </blockquote>)^ ** </blockquote>)^
** **
@ -9767,7 +9771,7 @@ SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut);
** ^When xBestIndex returns, the sqlite3_value object returned by ** ^When xBestIndex returns, the sqlite3_value object returned by
** sqlite3_vtab_rhs_value() is automatically deallocated. ** sqlite3_vtab_rhs_value() is automatically deallocated.
** **
** The "_rhs_" in the name of this routine is an appreviation for ** The "_rhs_" in the name of this routine is an abbreviation for
** "Right-Hand Side". ** "Right-Hand Side".
*/ */
SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal); SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal);