sqlite-amalgamation-3450000.zip

git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4776 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
Cory McWilliams 2024-01-15 20:58:15 +00:00
parent 1335a6e1e5
commit 6e57845512
3 changed files with 5701 additions and 2610 deletions

195
deps/sqlite/shell.c vendored
View File

@ -296,7 +296,7 @@ extern LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText);
** CIO_WIN_WC_XLATE is defined as 0 or 1, reflecting whether console I/O ** CIO_WIN_WC_XLATE is defined as 0 or 1, reflecting whether console I/O
** translation for Windows is effected for the build. ** translation for Windows is effected for the build.
*/ */
#define HAVE_CONSOLE_IO_H 1
#ifndef SQLITE_INTERNAL_LINKAGE #ifndef SQLITE_INTERNAL_LINKAGE
# define SQLITE_INTERNAL_LINKAGE extern /* external to translation unit */ # define SQLITE_INTERNAL_LINKAGE extern /* external to translation unit */
# include <stdio.h> # include <stdio.h>
@ -434,8 +434,8 @@ SQLITE_INTERNAL_LINKAGE int ePutsUtf8(const char *z);
#ifdef CONSIO_SPUTB #ifdef CONSIO_SPUTB
SQLITE_INTERNAL_LINKAGE int SQLITE_INTERNAL_LINKAGE int
fPutbUtf8(FILE *pfOut, const char *cBuf, int nAccept); fPutbUtf8(FILE *pfOut, const char *cBuf, int nAccept);
#endif
/* Like fPutbUtf8 except stream is always the designated output. */ /* Like fPutbUtf8 except stream is always the designated output. */
#endif
SQLITE_INTERNAL_LINKAGE int SQLITE_INTERNAL_LINKAGE int
oPutbUtf8(const char *cBuf, int nAccept); oPutbUtf8(const char *cBuf, int nAccept);
/* Like fPutbUtf8 except stream is always the designated error. */ /* Like fPutbUtf8 except stream is always the designated error. */
@ -575,9 +575,11 @@ zSkipValidUtf8(const char *z, int nAccept, long ccm);
# include <stdlib.h> # include <stdlib.h>
# include <limits.h> # include <limits.h>
# include <assert.h> # include <assert.h>
# include "console_io.h"
/* # include "sqlite3.h" */ /* # include "sqlite3.h" */
#endif #endif
#ifndef HAVE_CONSOLE_IO_H
# include "console_io.h"
#endif
#ifndef SQLITE_CIO_NO_TRANSLATE #ifndef SQLITE_CIO_NO_TRANSLATE
# if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT # if (defined(_WIN32) || defined(WIN32)) && !SQLITE_OS_WINRT
@ -1100,12 +1102,11 @@ zSkipValidUtf8(const char *z, int nAccept, long ccm){
#endif /*!(defined(SQLITE_CIO_NO_UTF8SCAN)&&defined(SQLITE_CIO_NO_TRANSLATE))*/ #endif /*!(defined(SQLITE_CIO_NO_UTF8SCAN)&&defined(SQLITE_CIO_NO_TRANSLATE))*/
#ifndef SQLITE_CIO_NO_TRANSLATE #ifndef SQLITE_CIO_NO_TRANSLATE
# ifdef CONSIO_SPUTB
#ifdef CONSIO_SPUTB
SQLITE_INTERNAL_LINKAGE int SQLITE_INTERNAL_LINKAGE int
fPutbUtf8(FILE *pfO, const char *cBuf, int nAccept){ fPutbUtf8(FILE *pfO, const char *cBuf, int nAccept){
assert(pfO!=0); assert(pfO!=0);
# if CIO_WIN_WC_XLATE # if CIO_WIN_WC_XLATE
PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */ PerStreamTags pst = PST_INITIALIZER; /* for unknown streams */
PerStreamTags *ppst = getEmitStreamInfo(0, &pst, &pfO); PerStreamTags *ppst = getEmitStreamInfo(0, &pst, &pfO);
if( pstReachesConsole(ppst) ){ if( pstReachesConsole(ppst) ){
@ -1115,13 +1116,13 @@ fPutbUtf8(FILE *pfO, const char *cBuf, int nAccept){
if( 0 == isKnownWritable(ppst->pf) ) restoreConsoleArb(ppst); if( 0 == isKnownWritable(ppst->pf) ) restoreConsoleArb(ppst);
return rv; return rv;
}else { }else {
# endif # endif
return (int)fwrite(cBuf, 1, nAccept, pfO); return (int)fwrite(cBuf, 1, nAccept, pfO);
# if CIO_WIN_WC_XLATE # if CIO_WIN_WC_XLATE
} }
# endif # endif
} }
#endif /* defined(CONSIO_SPUTB) */ # endif
SQLITE_INTERNAL_LINKAGE int SQLITE_INTERNAL_LINKAGE int
oPutbUtf8(const char *cBuf, int nAccept){ oPutbUtf8(const char *cBuf, int nAccept){
@ -1232,6 +1233,7 @@ SQLITE_INTERNAL_LINKAGE char* fGetsUtf8(char *cBuf, int ncMax, FILE *pfIn){
/************************* End ../ext/consio/console_io.c ********************/ /************************* End ../ext/consio/console_io.c ********************/
#ifndef SQLITE_SHELL_FIDDLE #ifndef SQLITE_SHELL_FIDDLE
/* From here onward, fgets() is redirected to the console_io library. */ /* From here onward, fgets() is redirected to the console_io library. */
# define fgets(b,n,f) fGetsUtf8(b,n,f) # define fgets(b,n,f) fGetsUtf8(b,n,f)
/* /*
@ -1256,6 +1258,7 @@ SQLITE_INTERNAL_LINKAGE char* fGetsUtf8(char *cBuf, int ncMax, FILE *pfIn){
# define eputz(z) ePutsUtf8(z) # define eputz(z) ePutsUtf8(z)
# define eputf ePrintfUtf8 # define eputf ePrintfUtf8
# define oputb(buf,na) oPutbUtf8(buf,na) # define oputb(buf,na) oPutbUtf8(buf,na)
#else #else
/* For Fiddle, all console handling and emit redirection is omitted. */ /* For Fiddle, all console handling and emit redirection is omitted. */
# define sputz(fp,z) fputs(z,fp) # define sputz(fp,z) fputs(z,fp)
@ -1339,7 +1342,7 @@ static void endTimer(void){
sqlite3_int64 iEnd = timeOfDay(); sqlite3_int64 iEnd = timeOfDay();
struct rusage sEnd; struct rusage sEnd;
getrusage(RUSAGE_SELF, &sEnd); getrusage(RUSAGE_SELF, &sEnd);
oputf("Run Time: real %.3f user %f sys %f\n", sputf(stdout, "Run Time: real %.3f user %f sys %f\n",
(iEnd - iBegin)*0.001, (iEnd - iBegin)*0.001,
timeDiff(&sBegin.ru_utime, &sEnd.ru_utime), timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
timeDiff(&sBegin.ru_stime, &sEnd.ru_stime)); timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
@ -1418,7 +1421,7 @@ static void endTimer(void){
FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd; FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
sqlite3_int64 ftWallEnd = timeOfDay(); sqlite3_int64 ftWallEnd = timeOfDay();
getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd); getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
oputf("Run Time: real %.3f user %f sys %f\n", sputf(stdout, "Run Time: real %.3f user %f sys %f\n",
(ftWallEnd - ftWallBegin)*0.001, (ftWallEnd - ftWallBegin)*0.001,
timeDiff(&ftUserBegin, &ftUserEnd), timeDiff(&ftUserBegin, &ftUserEnd),
timeDiff(&ftKernelBegin, &ftKernelEnd)); timeDiff(&ftKernelBegin, &ftKernelEnd));
@ -1715,14 +1718,14 @@ static int strlenChar(const char *z){
*/ */
static FILE * openChrSource(const char *zFile){ static FILE * openChrSource(const char *zFile){
#if defined(_WIN32) || defined(WIN32) #if defined(_WIN32) || defined(WIN32)
struct _stat x = {0}; struct __stat64 x = {0};
# define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0) # define STAT_CHR_SRC(mode) ((mode & (_S_IFCHR|_S_IFIFO|_S_IFREG))!=0)
/* On Windows, open first, then check the stream nature. This order /* On Windows, open first, then check the stream nature. This order
** is necessary because _stat() and sibs, when checking a named pipe, ** is necessary because _stat() and sibs, when checking a named pipe,
** effectively break the pipe as its supplier sees it. */ ** effectively break the pipe as its supplier sees it. */
FILE *rv = fopen(zFile, "rb"); FILE *rv = fopen(zFile, "rb");
if( rv==0 ) return 0; if( rv==0 ) return 0;
if( _fstat(_fileno(rv), &x) != 0 if( _fstat64(_fileno(rv), &x) != 0
|| !STAT_CHR_SRC(x.st_mode)){ || !STAT_CHR_SRC(x.st_mode)){
fclose(rv); fclose(rv);
rv = 0; rv = 0;
@ -14827,6 +14830,7 @@ static int dbdataNext(sqlite3_vtab_cursor *pCursor){
bNextPage = 1; bNextPage = 1;
}else{ }else{
iOff += dbdataGetVarintU32(&pCsr->aPage[iOff], &nPayload); iOff += dbdataGetVarintU32(&pCsr->aPage[iOff], &nPayload);
if( nPayload>0x7fffff00 ) nPayload &= 0x3fff;
} }
/* If this is a leaf intkey cell, load the rowid */ /* If this is a leaf intkey cell, load the rowid */
@ -18143,6 +18147,7 @@ struct ShellState {
u8 eTraceType; /* SHELL_TRACE_* value for type of trace */ u8 eTraceType; /* SHELL_TRACE_* value for type of trace */
u8 bSafeMode; /* True to prohibit unsafe operations */ u8 bSafeMode; /* True to prohibit unsafe operations */
u8 bSafeModePersist; /* The long-term value of bSafeMode */ u8 bSafeModePersist; /* The long-term value of bSafeMode */
u8 eRestoreState; /* See comments above doAutoDetectRestore() */
ColModeOpts cmOpts; /* Option values affecting columnar mode output */ ColModeOpts cmOpts; /* Option values affecting columnar mode output */
unsigned statsOn; /* True to display memory stats before each finalize */ unsigned statsOn; /* True to display memory stats before each finalize */
unsigned mEqpLines; /* Mask of vertical lines in the EQP output graph */ unsigned mEqpLines; /* Mask of vertical lines in the EQP output graph */
@ -22170,7 +22175,6 @@ static void open_db(ShellState *p, int openFlags){
break; break;
} }
} }
globalDb = p->db;
if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){
eputf("Error: unable to open database \"%s\": %s\n", eputf("Error: unable to open database \"%s\": %s\n",
zDbFilename, sqlite3_errmsg(p->db)); zDbFilename, sqlite3_errmsg(p->db));
@ -22187,6 +22191,7 @@ static void open_db(ShellState *p, int openFlags){
zDbFilename); zDbFilename);
} }
} }
globalDb = p->db;
sqlite3_db_config(p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, (int)0, (int*)0); sqlite3_db_config(p->db, SQLITE_DBCONFIG_STMT_SCANSTATUS, (int)0, (int*)0);
/* Reflect the use or absence of --unsafe-testing invocation. */ /* Reflect the use or absence of --unsafe-testing invocation. */
@ -23582,7 +23587,6 @@ static int lintDotCommand(
return SQLITE_ERROR; return SQLITE_ERROR;
} }
#if !defined SQLITE_OMIT_VIRTUALTABLE
static void shellPrepare( static void shellPrepare(
sqlite3 *db, sqlite3 *db,
int *pRc, int *pRc,
@ -23601,12 +23605,8 @@ static void shellPrepare(
/* /*
** Create a prepared statement using printf-style arguments for the SQL. ** Create a prepared statement using printf-style arguments for the SQL.
**
** This routine is could be marked "static". But it is not always used,
** depending on compile-time options. By omitting the "static", we avoid
** nuisance compiler warnings about "defined but not used".
*/ */
void shellPreparePrintf( static void shellPreparePrintf(
sqlite3 *db, sqlite3 *db,
int *pRc, int *pRc,
sqlite3_stmt **ppStmt, sqlite3_stmt **ppStmt,
@ -23629,13 +23629,10 @@ void shellPreparePrintf(
} }
} }
/* Finalize the prepared statement created using shellPreparePrintf(). /*
** ** Finalize the prepared statement created using shellPreparePrintf().
** This routine is could be marked "static". But it is not always used,
** depending on compile-time options. By omitting the "static", we avoid
** nuisance compiler warnings about "defined but not used".
*/ */
void shellFinalize( static void shellFinalize(
int *pRc, int *pRc,
sqlite3_stmt *pStmt sqlite3_stmt *pStmt
){ ){
@ -23651,6 +23648,7 @@ void shellFinalize(
} }
} }
#if !defined SQLITE_OMIT_VIRTUALTABLE
/* Reset the prepared statement created using shellPreparePrintf(). /* Reset the prepared statement created using shellPreparePrintf().
** **
** This routine is could be marked "static". But it is not always used, ** This routine is could be marked "static". But it is not always used,
@ -24717,6 +24715,30 @@ FROM (\
} }
} }
/*
** Check if the sqlite_schema table contains one or more virtual tables. If
** parameter zLike is not NULL, then it is an SQL expression that the
** sqlite_schema row must also match. If one or more such rows are found,
** print the following warning to the output:
**
** WARNING: Script requires that SQLITE_DBCONFIG_DEFENSIVE be disabled
*/
static int outputDumpWarning(ShellState *p, const char *zLike){
int rc = SQLITE_OK;
sqlite3_stmt *pStmt = 0;
shellPreparePrintf(p->db, &rc, &pStmt,
"SELECT 1 FROM sqlite_schema o WHERE "
"sql LIKE 'CREATE VIRTUAL TABLE%%' AND %s", zLike ? zLike : "true"
);
if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
oputz("/* WARNING: "
"Script requires that SQLITE_DBCONFIG_DEFENSIVE be disabled */\n"
);
}
shellFinalize(&rc, pStmt);
return rc;
}
/* /*
** If an input line begins with "." then invoke this routine to ** If an input line begins with "." then invoke this routine to
** process that line. ** process that line.
@ -25179,6 +25201,7 @@ static int do_meta_command(char *zLine, ShellState *p){
open_db(p, 0); open_db(p, 0);
outputDumpWarning(p, zLike);
if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){ if( (p->shellFlgs & SHFLG_DumpDataOnly)==0 ){
/* When playing back a "dump", the content might appear in an order /* When playing back a "dump", the content might appear in an order
** which causes immediate foreign key constraints to be violated. ** which causes immediate foreign key constraints to be violated.
@ -27607,6 +27630,7 @@ static int do_meta_command(char *zLine, ShellState *p){
{"fk_no_action", SQLITE_TESTCTRL_FK_NO_ACTION, 0, "BOOLEAN" }, {"fk_no_action", SQLITE_TESTCTRL_FK_NO_ACTION, 0, "BOOLEAN" },
{"imposter", SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"}, {"imposter", SQLITE_TESTCTRL_IMPOSTER,1,"SCHEMA ON/OFF ROOTPAGE"},
{"internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,"" }, {"internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS,0,"" },
{"json_selfcheck", SQLITE_TESTCTRL_JSON_SELFCHECK ,0,"BOOLEAN" },
{"localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN" }, {"localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN" },
{"never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN" }, {"never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN" },
{"optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK" }, {"optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK" },
@ -27825,6 +27849,16 @@ static int do_meta_command(char *zLine, ShellState *p){
isOk = 3; isOk = 3;
} }
break; break;
case SQLITE_TESTCTRL_JSON_SELFCHECK:
if( nArg==2 ){
rc2 = -1;
isOk = 1;
}else{
rc2 = booleanValue(azArg[2]);
isOk = 3;
}
sqlite3_test_control(testctrl, &rc2);
break;
} }
} }
if( isOk==0 && iCtrl>=0 ){ if( isOk==0 && iCtrl>=0 ){
@ -28231,6 +28265,88 @@ static int line_is_complete(char *zSql, int nSql){
return rc; return rc;
} }
/*
** This function is called after processing each line of SQL in the
** runOneSqlLine() function. Its purpose is to detect scenarios where
** defensive mode should be automatically turned off. Specifically, when
**
** 1. The first line of input is "PRAGMA foreign_keys=OFF;",
** 2. The second line of input is "BEGIN TRANSACTION;",
** 3. The database is empty, and
** 4. The shell is not running in --safe mode.
**
** The implementation uses the ShellState.eRestoreState to maintain state:
**
** 0: Have not seen any SQL.
** 1: Have seen "PRAGMA foreign_keys=OFF;".
** 2-6: Currently running .dump transaction. If the "2" bit is set,
** disable DEFENSIVE when done. If "4" is set, disable DQS_DDL.
** 7: Nothing left to do. This function becomes a no-op.
*/
static int doAutoDetectRestore(ShellState *p, const char *zSql){
int rc = SQLITE_OK;
if( p->eRestoreState<7 ){
switch( p->eRestoreState ){
case 0: {
const char *zExpect = "PRAGMA foreign_keys=OFF;";
assert( strlen(zExpect)==24 );
if( p->bSafeMode==0 && memcmp(zSql, zExpect, 25)==0 ){
p->eRestoreState = 1;
}else{
p->eRestoreState = 7;
}
break;
};
case 1: {
int bIsDump = 0;
const char *zExpect = "BEGIN TRANSACTION;";
assert( strlen(zExpect)==18 );
if( memcmp(zSql, zExpect, 19)==0 ){
/* Now check if the database is empty. */
const char *zQuery = "SELECT 1 FROM sqlite_schema LIMIT 1";
sqlite3_stmt *pStmt = 0;
bIsDump = 1;
shellPrepare(p->db, &rc, zQuery, &pStmt);
if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
bIsDump = 0;
}
shellFinalize(&rc, pStmt);
}
if( bIsDump && rc==SQLITE_OK ){
int bDefense = 0;
int bDqsDdl = 0;
sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &bDefense);
sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, -1, &bDqsDdl);
sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, 1, 0);
p->eRestoreState = (bDefense ? 2 : 0) + (bDqsDdl ? 4 : 0);
}else{
p->eRestoreState = 7;
}
break;
}
default: {
if( sqlite3_get_autocommit(p->db) ){
if( (p->eRestoreState & 2) ){
sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 1, 0);
}
if( (p->eRestoreState & 4) ){
sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, 0, 0);
}
p->eRestoreState = 7;
}
break;
}
}
}
return rc;
}
/* /*
** Run a single line of SQL. Return the number of errors. ** Run a single line of SQL. Return the number of errors.
*/ */
@ -28278,6 +28394,8 @@ static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){
sqlite3_changes64(p->db), sqlite3_total_changes64(p->db)); sqlite3_changes64(p->db), sqlite3_total_changes64(p->db));
oputf("%s\n", zLineBuf); oputf("%s\n", zLineBuf);
} }
if( doAutoDetectRestore(p, zSql) ) return 1;
return 0; return 0;
} }
@ -28711,14 +28829,14 @@ static void printBold(const char *zText){
FOREGROUND_RED|FOREGROUND_INTENSITY FOREGROUND_RED|FOREGROUND_INTENSITY
); );
#endif #endif
oputz(zText); sputz(stdout, zText);
#if !SQLITE_OS_WINRT #if !SQLITE_OS_WINRT
SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes); SetConsoleTextAttribute(out, defaultScreenInfo.wAttributes);
#endif #endif
} }
#else #else
static void printBold(const char *zText){ static void printBold(const char *zText){
oputf("\033[1m%s\033[0m", zText); sputf(stdout, "\033[1m%s\033[0m", zText);
} }
#endif #endif
@ -28912,10 +29030,6 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
}else if( cli_strcmp(z,"-init")==0 ){ }else if( cli_strcmp(z,"-init")==0 ){
zInitFile = cmdline_option_value(argc, argv, ++i); zInitFile = cmdline_option_value(argc, argv, ++i);
}else if( cli_strcmp(z,"-interactive")==0 ){ }else if( cli_strcmp(z,"-interactive")==0 ){
/* Need to check for interactive override here to so that it can
** affect console setup (for Windows only) and testing thereof.
*/
stdin_is_interactive = 1;
}else if( cli_strcmp(z,"-batch")==0 ){ }else if( cli_strcmp(z,"-batch")==0 ){
/* Need to check for batch mode here to so we can avoid printing /* Need to check for batch mode here to so we can avoid printing
** informational messages (like from process_sqliterc) before ** informational messages (like from process_sqliterc) before
@ -29185,11 +29299,14 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
}else if( cli_strcmp(z,"-bail")==0 ){ }else if( cli_strcmp(z,"-bail")==0 ){
/* No-op. The bail_on_error flag should already be set. */ /* No-op. The bail_on_error flag should already be set. */
}else if( cli_strcmp(z,"-version")==0 ){ }else if( cli_strcmp(z,"-version")==0 ){
oputf("%s %s (%d-bit)\n", sqlite3_libversion(), sqlite3_sourceid(), sputf(stdout, "%s %s (%d-bit)\n",
8*(int)sizeof(char*)); sqlite3_libversion(), sqlite3_sourceid(), 8*(int)sizeof(char*));
return 0; return 0;
}else if( cli_strcmp(z,"-interactive")==0 ){ }else if( cli_strcmp(z,"-interactive")==0 ){
/* already handled */ /* Need to check for interactive override here to so that it can
** affect console setup (for Windows only) and testing thereof.
*/
stdin_is_interactive = 1;
}else if( cli_strcmp(z,"-batch")==0 ){ }else if( cli_strcmp(z,"-batch")==0 ){
/* already handled */ /* already handled */
}else if( cli_strcmp(z,"-utf8")==0 ){ }else if( cli_strcmp(z,"-utf8")==0 ){
@ -29318,13 +29435,13 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
#else #else
# define SHELL_CIO_CHAR_SET "" # define SHELL_CIO_CHAR_SET ""
#endif #endif
oputf("SQLite version %s %.19s%s\n" /*extra-version-info*/ sputf(stdout, "SQLite version %s %.19s%s\n" /*extra-version-info*/
"Enter \".help\" for usage hints.\n", "Enter \".help\" for usage hints.\n",
sqlite3_libversion(), sqlite3_sourceid(), SHELL_CIO_CHAR_SET); sqlite3_libversion(), sqlite3_sourceid(), SHELL_CIO_CHAR_SET);
if( warnInmemoryDb ){ if( warnInmemoryDb ){
oputz("Connected to a "); sputz(stdout, "Connected to a ");
printBold("transient in-memory database"); printBold("transient in-memory database");
oputz(".\nUse \".open FILENAME\" to reopen on a" sputz(stdout, ".\nUse \".open FILENAME\" to reopen on a"
" persistent database.\n"); " persistent database.\n");
} }
zHistory = getenv("SQLITE_HISTORY"); zHistory = getenv("SQLITE_HISTORY");

8025
deps/sqlite/sqlite3.c vendored

File diff suppressed because it is too large Load Diff

91
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.44.2" #define SQLITE_VERSION "3.45.0"
#define SQLITE_VERSION_NUMBER 3044002 #define SQLITE_VERSION_NUMBER 3045000
#define SQLITE_SOURCE_ID "2023-11-24 11:41:44 ebead0e7230cd33bcec9f95d2183069565b9e709bf745c9b5db65cc0cbf92c0f" #define SQLITE_SOURCE_ID "2024-01-15 17:01:13 1066602b2b1976fe58b5150777cced894af17c803e068f5918390d6915b46e1d"
/* /*
** CAPI3REF: Run-Time Library Version Numbers ** CAPI3REF: Run-Time Library Version Numbers
@ -3954,15 +3954,17 @@ SQLITE_API void sqlite3_free_filename(sqlite3_filename);
** </ul> ** </ul>
** **
** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language ** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language
** text that describes the error, as either UTF-8 or UTF-16 respectively. ** text that describes the error, as either UTF-8 or UTF-16 respectively,
** or NULL if no error message is available.
** (See how SQLite handles [invalid UTF] for exceptions to this rule.) ** (See how SQLite handles [invalid UTF] for exceptions to this rule.)
** ^(Memory to hold the error message string is managed internally. ** ^(Memory to hold the error message string is managed internally.
** The application does not need to worry about freeing the result. ** The application does not need to worry about freeing the result.
** However, the error string might be overwritten or deallocated by ** However, the error string might be overwritten or deallocated by
** subsequent calls to other SQLite interface functions.)^ ** subsequent calls to other SQLite interface functions.)^
** **
** ^The sqlite3_errstr() interface returns the English-language text ** ^The sqlite3_errstr(E) interface returns the English-language text
** that describes the [result code], as UTF-8. ** that describes the [result code] E, as UTF-8, or NULL if E is not an
** result code for which a text error message is available.
** ^(Memory to hold the error message string is managed internally ** ^(Memory to hold the error message string is managed internally
** and must not be freed by the application)^. ** and must not be freed by the application)^.
** **
@ -8037,9 +8039,11 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*);
** **
** ^(Some systems (for example, Windows 95) do not support the operation ** ^(Some systems (for example, Windows 95) do not support the operation
** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() ** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try()
** will always return SQLITE_BUSY. The SQLite core only ever uses ** will always return SQLITE_BUSY. In most cases the SQLite core only uses
** sqlite3_mutex_try() as an optimization so this is acceptable ** sqlite3_mutex_try() as an optimization, so this is acceptable
** behavior.)^ ** behavior. The exceptions are unix builds that set the
** SQLITE_ENABLE_SETLK_TIMEOUT build option. In that case a working
** sqlite3_mutex_try() is required.)^
** **
** ^The sqlite3_mutex_leave() routine exits a mutex that was ** ^The sqlite3_mutex_leave() routine exits a mutex that was
** previously entered by the same thread. The behavior ** previously entered by the same thread. The behavior
@ -8298,6 +8302,7 @@ SQLITE_API int sqlite3_test_control(int op, ...);
#define SQLITE_TESTCTRL_ASSERT 12 #define SQLITE_TESTCTRL_ASSERT 12
#define SQLITE_TESTCTRL_ALWAYS 13 #define SQLITE_TESTCTRL_ALWAYS 13
#define SQLITE_TESTCTRL_RESERVE 14 /* NOT USED */ #define SQLITE_TESTCTRL_RESERVE 14 /* NOT USED */
#define SQLITE_TESTCTRL_JSON_SELFCHECK 14
#define SQLITE_TESTCTRL_OPTIMIZATIONS 15 #define SQLITE_TESTCTRL_OPTIMIZATIONS 15
#define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */ #define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */
#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */ #define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */
@ -12811,8 +12816,11 @@ struct Fts5PhraseIter {
** created with the "columnsize=0" option. ** created with the "columnsize=0" option.
** **
** xColumnText: ** xColumnText:
** This function attempts to retrieve the text of column iCol of the ** If parameter iCol is less than zero, or greater than or equal to the
** current document. If successful, (*pz) is set to point to a buffer ** number of columns in the table, SQLITE_RANGE is returned.
**
** Otherwise, this function attempts to retrieve the text of column iCol of
** the current document. If successful, (*pz) is set to point to a buffer
** containing the text in utf-8 encoding, (*pn) is set to the size in bytes ** containing the text in utf-8 encoding, (*pn) is set to the size in bytes
** (not characters) of the buffer and SQLITE_OK is returned. Otherwise, ** (not characters) of the buffer and SQLITE_OK is returned. Otherwise,
** if an error occurs, an SQLite error code is returned and the final values ** if an error occurs, an SQLite error code is returned and the final values
@ -12822,8 +12830,10 @@ struct Fts5PhraseIter {
** Returns the number of phrases in the current query expression. ** Returns the number of phrases in the current query expression.
** **
** xPhraseSize: ** xPhraseSize:
** Returns the number of tokens in phrase iPhrase of the query. Phrases ** If parameter iCol is less than zero, or greater than or equal to the
** are numbered starting from zero. ** number of phrases in the current query, as returned by xPhraseCount,
** 0 is returned. Otherwise, this function returns the number of tokens in
** phrase iPhrase of the query. Phrases are numbered starting from zero.
** **
** xInstCount: ** xInstCount:
** Set *pnInst to the total number of occurrences of all phrases within ** Set *pnInst to the total number of occurrences of all phrases within
@ -12839,12 +12849,13 @@ struct Fts5PhraseIter {
** Query for the details of phrase match iIdx within the current row. ** Query for the details of phrase match iIdx within the current row.
** Phrase matches are numbered starting from zero, so the iIdx argument ** Phrase matches are numbered starting from zero, so the iIdx argument
** should be greater than or equal to zero and smaller than the value ** should be greater than or equal to zero and smaller than the value
** output by xInstCount(). ** output by xInstCount(). If iIdx is less than zero or greater than
** or equal to the value returned by xInstCount(), SQLITE_RANGE is returned.
** **
** Usually, output parameter *piPhrase is set to the phrase number, *piCol ** Otherwise, output parameter *piPhrase is set to the phrase number, *piCol
** to the column in which it occurs and *piOff the token offset of the ** to the column in which it occurs and *piOff the token offset of the
** first token of the phrase. Returns SQLITE_OK if successful, or an error ** first token of the phrase. SQLITE_OK is returned if successful, or an
** code (i.e. SQLITE_NOMEM) if an error occurs. ** error code (i.e. SQLITE_NOMEM) if an error occurs.
** **
** This API can be quite slow if used with an FTS5 table created with the ** This API can be quite slow if used with an FTS5 table created with the
** "detail=none" or "detail=column" option. ** "detail=none" or "detail=column" option.
@ -12870,6 +12881,10 @@ struct Fts5PhraseIter {
** Invoking Api.xUserData() returns a copy of the pointer passed as ** Invoking Api.xUserData() returns a copy of the pointer passed as
** the third argument to pUserData. ** the third argument to pUserData.
** **
** If parameter iPhrase is less than zero, or greater than or equal to
** the number of phrases in the query, as returned by xPhraseCount(),
** this function returns SQLITE_RANGE.
**
** If the callback function returns any value other than SQLITE_OK, the ** If the callback function returns any value other than SQLITE_OK, the
** query is abandoned and the xQueryPhrase function returns immediately. ** query is abandoned and the xQueryPhrase function returns immediately.
** If the returned value is SQLITE_DONE, xQueryPhrase returns SQLITE_OK. ** If the returned value is SQLITE_DONE, xQueryPhrase returns SQLITE_OK.
@ -12984,9 +12999,42 @@ struct Fts5PhraseIter {
** **
** xPhraseNextColumn() ** xPhraseNextColumn()
** See xPhraseFirstColumn above. ** See xPhraseFirstColumn above.
**
** xQueryToken(pFts5, iPhrase, iToken, ppToken, pnToken)
** This is used to access token iToken of phrase iPhrase of the current
** query. Before returning, output parameter *ppToken is set to point
** to a buffer containing the requested token, and *pnToken to the
** size of this buffer in bytes.
**
** If iPhrase or iToken are less than zero, or if iPhrase is greater than
** or equal to the number of phrases in the query as reported by
** xPhraseCount(), or if iToken is equal to or greater than the number of
** tokens in the phrase, SQLITE_RANGE is returned and *ppToken and *pnToken
are both zeroed.
**
** The output text is not a copy of the query text that specified the
** token. It is the output of the tokenizer module. For tokendata=1
** tables, this includes any embedded 0x00 and trailing data.
**
** xInstToken(pFts5, iIdx, iToken, ppToken, pnToken)
** This is used to access token iToken of phrase hit iIdx within the
** current row. If iIdx is less than zero or greater than or equal to the
** value returned by xInstCount(), SQLITE_RANGE is returned. Otherwise,
** output variable (*ppToken) is set to point to a buffer containing the
** matching document token, and (*pnToken) to the size of that buffer in
** bytes. This API is not available if the specified token matches a
** prefix query term. In that case both output variables are always set
** to 0.
**
** The output text is not a copy of the document text that was tokenized.
** It is the output of the tokenizer module. For tokendata=1 tables, this
** includes any embedded 0x00 and trailing data.
**
** This API can be quite slow if used with an FTS5 table created with the
** "detail=none" or "detail=column" option.
*/ */
struct Fts5ExtensionApi { struct Fts5ExtensionApi {
int iVersion; /* Currently always set to 2 */ int iVersion; /* Currently always set to 3 */
void *(*xUserData)(Fts5Context*); void *(*xUserData)(Fts5Context*);
@ -13021,6 +13069,13 @@ struct Fts5ExtensionApi {
int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*); int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*);
void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol); void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol);
/* Below this point are iVersion>=3 only */
int (*xQueryToken)(Fts5Context*,
int iPhrase, int iToken,
const char **ppToken, int *pnToken
);
int (*xInstToken)(Fts5Context*, int iIdx, int iToken, const char**, int*);
}; };
/* /*