MFV r357163:

Update sqlite3-3.30.1 (3300100) --> sqlite3-3.31.0 (3310000)

MFC after:	1 month
This commit is contained in:
Cy Schubert 2020-01-28 13:13:41 +00:00
commit 882f88ff77
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=357201
11 changed files with 9241 additions and 5543 deletions

View File

@ -210,6 +210,12 @@ OPTIMIZATIONS = 2
SESSION = 0 SESSION = 0
!ENDIF !ENDIF
# Set this to non-0 to enable support for the rbu extension.
#
!IFNDEF RBU
RBU = 0
!ENDIF
# Set the source code file to be used by executables and libraries when # Set the source code file to be used by executables and libraries when
# they need the amalgamation. # they need the amalgamation.
# #
@ -282,7 +288,6 @@ OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_JSON1=1
OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_STMTVTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_STMTVTAB=1
OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DBPAGE_VTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DBPAGE_VTAB=1
OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DBSTAT_VTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DBSTAT_VTAB=1
OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_INTROSPECTION_PRAGMAS=1
OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DESERIALIZE=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DESERIALIZE=1
!ENDIF !ENDIF
OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_COLUMN_METADATA=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_COLUMN_METADATA=1
@ -296,6 +301,13 @@ OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_SESSION=1
OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_PREUPDATE_HOOK=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_PREUPDATE_HOOK=1
!ENDIF !ENDIF
# Should the rbu extension be enabled? If so, add compilation options
# to enable it.
#
!IF $(RBU)!=0
OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_RBU=1
!ENDIF
# These are the "extended" SQLite compilation options used when compiling for # These are the "extended" SQLite compilation options used when compiling for
# the Windows 10 platform. # the Windows 10 platform.
# #
@ -978,7 +990,7 @@ Replace.exe:
sqlite3.def: Replace.exe $(LIBOBJ) sqlite3.def: Replace.exe $(LIBOBJ)
echo EXPORTS > sqlite3.def echo EXPORTS > sqlite3.def
dumpbin /all $(LIBOBJ) \ dumpbin /all $(LIBOBJ) \
| .\Replace.exe "^\s+/EXPORT:_?(sqlite3(?:session|changeset|changegroup|rebaser)?_[^@,]*)(?:@\d+|,DATA)?$$" $$1 true \ | .\Replace.exe "^\s+/EXPORT:_?(sqlite3(?:session|changeset|changegroup|rebaser|rbu)?_[^@,]*)(?:@\d+|,DATA)?$$" $$1 true \
| sort >> sqlite3.def | sort >> sqlite3.def
$(SQLITE3EXE): shell.c $(SHELL_CORE_DEP) $(LIBRESOBJS) $(SHELL_CORE_SRC) $(SQLITE3H) $(SQLITE3EXE): shell.c $(SHELL_CORE_DEP) $(LIBRESOBJS) $(SHELL_CORE_SRC) $(SQLITE3H)

View File

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for sqlite 3.30.1. # Generated by GNU Autoconf 2.69 for sqlite 3.31.0.
# #
# Report bugs to <http://www.sqlite.org>. # Report bugs to <http://www.sqlite.org>.
# #
@ -590,8 +590,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='sqlite' PACKAGE_NAME='sqlite'
PACKAGE_TARNAME='sqlite' PACKAGE_TARNAME='sqlite'
PACKAGE_VERSION='3.30.1' PACKAGE_VERSION='3.31.0'
PACKAGE_STRING='sqlite 3.30.1' PACKAGE_STRING='sqlite 3.31.0'
PACKAGE_BUGREPORT='http://www.sqlite.org' PACKAGE_BUGREPORT='http://www.sqlite.org'
PACKAGE_URL='' PACKAGE_URL=''
@ -1341,7 +1341,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures sqlite 3.30.1 to adapt to many kinds of systems. \`configure' configures sqlite 3.31.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1412,7 +1412,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of sqlite 3.30.1:";; short | recursive ) echo "Configuration of sqlite 3.31.0:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1537,7 +1537,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
sqlite configure 3.30.1 sqlite configure 3.31.0
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@ -1952,7 +1952,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by sqlite $as_me 3.30.1, which was It was created by sqlite $as_me 3.31.0, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@ -2818,7 +2818,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='sqlite' PACKAGE='sqlite'
VERSION='3.30.1' VERSION='3.31.0'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@ -13653,7 +13653,7 @@ else
fi fi
if test x"$enable_rtree" = "xyes"; then if test x"$enable_rtree" = "xyes"; then
BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_RTREE" BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY"
fi fi
#----------------------------------------------------------------------- #-----------------------------------------------------------------------
@ -14438,7 +14438,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by sqlite $as_me 3.30.1, which was This file was extended by sqlite $as_me 3.31.0, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -14495,7 +14495,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
sqlite config.status 3.30.1 sqlite config.status 3.31.0
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@ -10,7 +10,7 @@
# #
AC_PREREQ(2.61) AC_PREREQ(2.61)
AC_INIT(sqlite, 3.30.1, http://www.sqlite.org) AC_INIT(sqlite, 3.31.0, http://www.sqlite.org)
AC_CONFIG_SRCDIR([sqlite3.c]) AC_CONFIG_SRCDIR([sqlite3.c])
AC_CONFIG_AUX_DIR([.]) AC_CONFIG_AUX_DIR([.])
@ -161,7 +161,7 @@ AC_ARG_ENABLE(rtree, [AS_HELP_STRING(
[--enable-rtree], [include rtree support [default=yes]])], [--enable-rtree], [include rtree support [default=yes]])],
[], [enable_rtree=yes]) [], [enable_rtree=yes])
if test x"$enable_rtree" = "xyes"; then if test x"$enable_rtree" = "xyes"; then
BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_RTREE" BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY"
fi fi
#----------------------------------------------------------------------- #-----------------------------------------------------------------------

View File

@ -2007,19 +2007,23 @@ int sqlite3_shathree_init(
int rc = SQLITE_OK; int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi); SQLITE_EXTENSION_INIT2(pApi);
(void)pzErrMsg; /* Unused parameter */ (void)pzErrMsg; /* Unused parameter */
rc = sqlite3_create_function(db, "sha3", 1, SQLITE_UTF8, 0, rc = sqlite3_create_function(db, "sha3", 1,
sha3Func, 0, 0); SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
0, sha3Func, 0, 0);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
rc = sqlite3_create_function(db, "sha3", 2, SQLITE_UTF8, 0, rc = sqlite3_create_function(db, "sha3", 2,
sha3Func, 0, 0); SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
0, sha3Func, 0, 0);
} }
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
rc = sqlite3_create_function(db, "sha3_query", 1, SQLITE_UTF8, 0, rc = sqlite3_create_function(db, "sha3_query", 1,
sha3QueryFunc, 0, 0); SQLITE_UTF8 | SQLITE_DIRECTONLY,
0, sha3QueryFunc, 0, 0);
} }
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
rc = sqlite3_create_function(db, "sha3_query", 2, SQLITE_UTF8, 0, rc = sqlite3_create_function(db, "sha3_query", 2,
sha3QueryFunc, 0, 0); SQLITE_UTF8 | SQLITE_DIRECTONLY,
0, sha3QueryFunc, 0, 0);
} }
return rc; return rc;
} }
@ -2613,6 +2617,7 @@ static int fsdirConnect(
pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) ); pNew = (fsdir_tab*)sqlite3_malloc( sizeof(*pNew) );
if( pNew==0 ) return SQLITE_NOMEM; if( pNew==0 ) return SQLITE_NOMEM;
memset(pNew, 0, sizeof(*pNew)); memset(pNew, 0, sizeof(*pNew));
sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
} }
*ppVtab = (sqlite3_vtab*)pNew; *ppVtab = (sqlite3_vtab*)pNew;
return rc; return rc;
@ -3006,10 +3011,12 @@ int sqlite3_fileio_init(
int rc = SQLITE_OK; int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi); SQLITE_EXTENSION_INIT2(pApi);
(void)pzErrMsg; /* Unused parameter */ (void)pzErrMsg; /* Unused parameter */
rc = sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0, rc = sqlite3_create_function(db, "readfile", 1,
SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
readfileFunc, 0, 0); readfileFunc, 0, 0);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
rc = sqlite3_create_function(db, "writefile", -1, SQLITE_UTF8, 0, rc = sqlite3_create_function(db, "writefile", -1,
SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
writefileFunc, 0, 0); writefileFunc, 0, 0);
} }
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
@ -3144,6 +3151,7 @@ static int completionConnect(
#define COMPLETION_COLUMN_WHOLELINE 2 /* Entire line seen so far */ #define COMPLETION_COLUMN_WHOLELINE 2 /* Entire line seen so far */
#define COMPLETION_COLUMN_PHASE 3 /* ePhase - used for debugging only */ #define COMPLETION_COLUMN_PHASE 3 /* ePhase - used for debugging only */
sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
rc = sqlite3_declare_vtab(db, rc = sqlite3_declare_vtab(db,
"CREATE TABLE x(" "CREATE TABLE x("
" candidate TEXT," " candidate TEXT,"
@ -4578,6 +4586,7 @@ static int zipfileConnect(
zipfileDequote(pNew->zFile); zipfileDequote(pNew->zFile);
} }
} }
sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
*ppVtab = (sqlite3_vtab*)pNew; *ppVtab = (sqlite3_vtab*)pNew;
return rc; return rc;
} }
@ -5190,25 +5199,25 @@ static int zipfileDeflate(
u8 **ppOut, int *pnOut, /* Output */ u8 **ppOut, int *pnOut, /* Output */
char **pzErr /* OUT: Error message */ char **pzErr /* OUT: Error message */
){ ){
sqlite3_int64 nAlloc = compressBound(nIn);
u8 *aOut;
int rc = SQLITE_OK; int rc = SQLITE_OK;
sqlite3_int64 nAlloc;
z_stream str;
u8 *aOut;
memset(&str, 0, sizeof(str));
str.next_in = (Bytef*)aIn;
str.avail_in = nIn;
deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
nAlloc = deflateBound(&str, nIn);
aOut = (u8*)sqlite3_malloc64(nAlloc); aOut = (u8*)sqlite3_malloc64(nAlloc);
if( aOut==0 ){ if( aOut==0 ){
rc = SQLITE_NOMEM; rc = SQLITE_NOMEM;
}else{ }else{
int res; int res;
z_stream str;
memset(&str, 0, sizeof(str));
str.next_in = (Bytef*)aIn;
str.avail_in = nIn;
str.next_out = aOut; str.next_out = aOut;
str.avail_out = nAlloc; str.avail_out = nAlloc;
deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
res = deflate(&str, Z_FINISH); res = deflate(&str, Z_FINISH);
if( res==Z_STREAM_END ){ if( res==Z_STREAM_END ){
*ppOut = aOut; *ppOut = aOut;
*pnOut = (int)str.total_out; *pnOut = (int)str.total_out;
@ -5517,10 +5526,10 @@ static int zipfileBestIndex(
idx = i; idx = i;
} }
} }
pIdxInfo->estimatedCost = 1000.0;
if( idx>=0 ){ if( idx>=0 ){
pIdxInfo->aConstraintUsage[idx].argvIndex = 1; pIdxInfo->aConstraintUsage[idx].argvIndex = 1;
pIdxInfo->aConstraintUsage[idx].omit = 1; pIdxInfo->aConstraintUsage[idx].omit = 1;
pIdxInfo->estimatedCost = 1000.0;
pIdxInfo->idxNum = 1; pIdxInfo->idxNum = 1;
}else if( unusable ){ }else if( unusable ){
return SQLITE_CONSTRAINT; return SQLITE_CONSTRAINT;
@ -5642,8 +5651,8 @@ static int zipfileGetMode(
** identical, ignoring any trailing '/' character in either path. */ ** identical, ignoring any trailing '/' character in either path. */
static int zipfileComparePath(const char *zA, const char *zB, int nB){ static int zipfileComparePath(const char *zA, const char *zB, int nB){
int nA = (int)strlen(zA); int nA = (int)strlen(zA);
if( zA[nA-1]=='/' ) nA--; if( nA>0 && zA[nA-1]=='/' ) nA--;
if( zB[nB-1]=='/' ) nB--; if( nB>0 && zB[nB-1]=='/' ) nB--;
if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0; if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0;
return 1; return 1;
} }
@ -5653,6 +5662,10 @@ static int zipfileBegin(sqlite3_vtab *pVtab){
int rc = SQLITE_OK; int rc = SQLITE_OK;
assert( pTab->pWriteFd==0 ); assert( pTab->pWriteFd==0 );
if( pTab->zFile==0 || pTab->zFile[0]==0 ){
pTab->base.zErrMsg = sqlite3_mprintf("zipfile: missing filename");
return SQLITE_ERROR;
}
/* Open a write fd on the file. Also load the entire central directory /* Open a write fd on the file. Also load the entire central directory
** structure into memory. During the transaction any new file data is ** structure into memory. During the transaction any new file data is
@ -5827,6 +5840,7 @@ static int zipfileUpdate(
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
zPath = (const char*)sqlite3_value_text(apVal[2]); zPath = (const char*)sqlite3_value_text(apVal[2]);
if( zPath==0 ) zPath = "";
nPath = (int)strlen(zPath); nPath = (int)strlen(zPath);
mTime = zipfileGetTime(apVal[4]); mTime = zipfileGetTime(apVal[4]);
} }
@ -5836,11 +5850,15 @@ static int zipfileUpdate(
** '/'. This appears to be required for compatibility with info-zip ** '/'. This appears to be required for compatibility with info-zip
** (the unzip command on unix). It does not create directories ** (the unzip command on unix). It does not create directories
** otherwise. */ ** otherwise. */
if( zPath[nPath-1]!='/' ){ if( nPath<=0 || zPath[nPath-1]!='/' ){
zFree = sqlite3_mprintf("%s/", zPath); zFree = sqlite3_mprintf("%s/", zPath);
if( zFree==0 ){ rc = SQLITE_NOMEM; }
zPath = (const char*)zFree; zPath = (const char*)zFree;
nPath++; if( zFree==0 ){
rc = SQLITE_NOMEM;
nPath = 0;
}else{
nPath = (int)strlen(zPath);
}
} }
} }
@ -6233,19 +6251,19 @@ void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){
** at the end of the path. Or, if this is not a directory and the path ** at the end of the path. Or, if this is not a directory and the path
** ends in '/' it is an error. */ ** ends in '/' it is an error. */
if( bIsDir==0 ){ if( bIsDir==0 ){
if( zName[nName-1]=='/' ){ if( nName>0 && zName[nName-1]=='/' ){
zErr = sqlite3_mprintf("non-directory name must not end with /"); zErr = sqlite3_mprintf("non-directory name must not end with /");
rc = SQLITE_ERROR; rc = SQLITE_ERROR;
goto zipfile_step_out; goto zipfile_step_out;
} }
}else{ }else{
if( zName[nName-1]!='/' ){ if( nName==0 || zName[nName-1]!='/' ){
zName = zFree = sqlite3_mprintf("%s/", zName); zName = zFree = sqlite3_mprintf("%s/", zName);
nName++;
if( zName==0 ){ if( zName==0 ){
rc = SQLITE_NOMEM; rc = SQLITE_NOMEM;
goto zipfile_step_out; goto zipfile_step_out;
} }
nName = (int)strlen(zName);
}else{ }else{
while( nName>1 && zName[nName-2]=='/' ) nName--; while( nName>1 && zName[nName-2]=='/' ) nName--;
} }
@ -6501,10 +6519,12 @@ int sqlite3_sqlar_init(
int rc = SQLITE_OK; int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi); SQLITE_EXTENSION_INIT2(pApi);
(void)pzErrMsg; /* Unused parameter */ (void)pzErrMsg; /* Unused parameter */
rc = sqlite3_create_function(db, "sqlar_compress", 1, SQLITE_UTF8, 0, rc = sqlite3_create_function(db, "sqlar_compress", 1,
SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
sqlarCompressFunc, 0, 0); sqlarCompressFunc, 0, 0);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
rc = sqlite3_create_function(db, "sqlar_uncompress", 2, SQLITE_UTF8, 0, rc = sqlite3_create_function(db, "sqlar_uncompress", 2,
SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
sqlarUncompressFunc, 0, 0); sqlarUncompressFunc, 0, 0);
} }
return rc; return rc;
@ -6525,8 +6545,8 @@ int sqlite3_sqlar_init(
** **
************************************************************************* *************************************************************************
*/ */
#if !defined(SQLITEEXPERT_H)
#define SQLITEEXPERT_H 1
/* #include "sqlite3.h" */ /* #include "sqlite3.h" */
typedef struct sqlite3expert sqlite3expert; typedef struct sqlite3expert sqlite3expert;
@ -6680,7 +6700,7 @@ const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport);
*/ */
void sqlite3_expert_destroy(sqlite3expert*); void sqlite3_expert_destroy(sqlite3expert*);
#endif /* !defined(SQLITEEXPERT_H) */
/************************* End ../ext/expert/sqlite3expert.h ********************/ /************************* End ../ext/expert/sqlite3expert.h ********************/
/************************* Begin ../ext/expert/sqlite3expert.c ******************/ /************************* Begin ../ext/expert/sqlite3expert.c ******************/
@ -9566,6 +9586,7 @@ struct ShellState {
int outCount; /* Revert to stdout when reaching zero */ int outCount; /* Revert to stdout when reaching zero */
int cnt; /* Number of records displayed so far */ int cnt; /* Number of records displayed so far */
int lineno; /* Line number of last line read from in */ int lineno; /* Line number of last line read from in */
int openFlags; /* Additional flags to open. (SQLITE_OPEN_NOFOLLOW) */
FILE *in; /* Read commands from this stream */ FILE *in; /* Read commands from this stream */
FILE *out; /* Write results here */ FILE *out; /* Write results here */
FILE *traceOut; /* Output for sqlite3_trace() */ FILE *traceOut; /* Output for sqlite3_trace() */
@ -10400,19 +10421,22 @@ static int shell_callback(
const int *colWidth; const int *colWidth;
int showHdr; int showHdr;
char *rowSep; char *rowSep;
int nWidth;
if( p->cMode==MODE_Column ){ if( p->cMode==MODE_Column ){
colWidth = p->colWidth; colWidth = p->colWidth;
nWidth = ArraySize(p->colWidth);
showHdr = p->showHeader; showHdr = p->showHeader;
rowSep = p->rowSeparator; rowSep = p->rowSeparator;
}else{ }else{
colWidth = aExplainWidths; colWidth = aExplainWidths;
nWidth = ArraySize(aExplainWidths);
showHdr = 1; showHdr = 1;
rowSep = SEP_Row; rowSep = SEP_Row;
} }
if( p->cnt++==0 ){ if( p->cnt++==0 ){
for(i=0; i<nArg; i++){ for(i=0; i<nArg; i++){
int w, n; int w, n;
if( i<ArraySize(p->colWidth) ){ if( i<nWidth ){
w = colWidth[i]; w = colWidth[i];
}else{ }else{
w = 0; w = 0;
@ -11302,6 +11326,9 @@ static void restore_debug_trace_modes(void){
/* Create the TEMP table used to store parameter bindings */ /* Create the TEMP table used to store parameter bindings */
static void bind_table_init(ShellState *p){ static void bind_table_init(ShellState *p){
int wrSchema = 0; int wrSchema = 0;
int defensiveMode = 0;
sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &defensiveMode);
sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema); sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, -1, &wrSchema);
sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0); sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, 1, 0);
sqlite3_exec(p->db, sqlite3_exec(p->db,
@ -11311,6 +11338,7 @@ static void bind_table_init(ShellState *p){
") WITHOUT ROWID;", ") WITHOUT ROWID;",
0, 0, 0); 0, 0, 0);
sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0); sqlite3_db_config(p->db, SQLITE_DBCONFIG_WRITABLE_SCHEMA, wrSchema, 0);
sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, defensiveMode, 0);
} }
/* /*
@ -12053,9 +12081,7 @@ static const char *(azHelp[]) = {
".excel Display the output of next command in spreadsheet", ".excel Display the output of next command in spreadsheet",
".exit ?CODE? Exit this program with return-code CODE", ".exit ?CODE? Exit this program with return-code CODE",
".expert EXPERIMENTAL. Suggest indexes for queries", ".expert EXPERIMENTAL. Suggest indexes for queries",
/* Because explain mode comes on automatically now, the ".explain" mode ".explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto",
** is removed from the help screen. It is still supported for legacy, however */
/*".explain ?on|off|auto? Turn EXPLAIN output mode on or off",*/
".filectrl CMD ... Run various sqlite3_file_control() operations", ".filectrl CMD ... Run various sqlite3_file_control() operations",
" Run \".filectrl\" with no arguments for details", " Run \".filectrl\" with no arguments for details",
".fullschema ?--indent? Show schema and the content of sqlite_stat tables", ".fullschema ?--indent? Show schema and the content of sqlite_stat tables",
@ -12106,6 +12132,7 @@ static const char *(azHelp[]) = {
" --maxsize N Maximum size for --hexdb or --deserialized database", " --maxsize N Maximum size for --hexdb or --deserialized database",
#endif #endif
" --new Initialize FILE to an empty database", " --new Initialize FILE to an empty database",
" --nofollow Do not follow symbolic links",
" --readonly Open FILE readonly", " --readonly Open FILE readonly",
" --zip FILE is a ZIP archive", " --zip FILE is a ZIP archive",
".output ?FILE? Send output to FILE or stdout if FILE is omitted", ".output ?FILE? Send output to FILE or stdout if FILE is omitted",
@ -12670,7 +12697,7 @@ static void open_db(ShellState *p, int openFlags){
switch( p->openMode ){ switch( p->openMode ){
case SHELL_OPEN_APPENDVFS: { case SHELL_OPEN_APPENDVFS: {
sqlite3_open_v2(p->zDbFilename, &p->db, sqlite3_open_v2(p->zDbFilename, &p->db,
SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, "apndvfs"); SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs");
break; break;
} }
case SHELL_OPEN_HEXDB: case SHELL_OPEN_HEXDB:
@ -12683,12 +12710,14 @@ static void open_db(ShellState *p, int openFlags){
break; break;
} }
case SHELL_OPEN_READONLY: { case SHELL_OPEN_READONLY: {
sqlite3_open_v2(p->zDbFilename, &p->db, SQLITE_OPEN_READONLY, 0); sqlite3_open_v2(p->zDbFilename, &p->db,
SQLITE_OPEN_READONLY|p->openFlags, 0);
break; break;
} }
case SHELL_OPEN_UNSPEC: case SHELL_OPEN_UNSPEC:
case SHELL_OPEN_NORMAL: { case SHELL_OPEN_NORMAL: {
sqlite3_open(p->zDbFilename, &p->db); sqlite3_open_v2(p->zDbFilename, &p->db,
SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0);
break; break;
} }
} }
@ -13462,7 +13491,7 @@ static unsigned int get4byteInt(unsigned char *a){
} }
/* /*
** Implementation of the ".info" command. ** Implementation of the ".dbinfo" command.
** **
** Return 1 on error, 2 to exit, and 0 otherwise. ** Return 1 on error, 2 to exit, and 0 otherwise.
*/ */
@ -15699,20 +15728,22 @@ static int do_meta_command(char *zLine, ShellState *p){
const char *zName; const char *zName;
int op; int op;
} aDbConfig[] = { } aDbConfig[] = {
{ "defensive", SQLITE_DBCONFIG_DEFENSIVE },
{ "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL },
{ "dqs_dml", SQLITE_DBCONFIG_DQS_DML },
{ "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY },
{ "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG },
{ "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER },
{ "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW }, { "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW },
{ "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
{ "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE },
{ "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT },
{ "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
{ "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE },
{ "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG },
{ "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP },
{ "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE },
{ "defensive", SQLITE_DBCONFIG_DEFENSIVE }, { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP },
{ "trusted_schema", SQLITE_DBCONFIG_TRUSTED_SCHEMA },
{ "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, { "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA },
{ "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE },
{ "dqs_dml", SQLITE_DBCONFIG_DQS_DML },
{ "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL },
}; };
int ii, v; int ii, v;
open_db(p, 0); open_db(p, 0);
@ -15722,7 +15753,7 @@ static int do_meta_command(char *zLine, ShellState *p){
sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0); sqlite3_db_config(p->db, aDbConfig[ii].op, booleanValue(azArg[2]), 0);
} }
sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v); sqlite3_db_config(p->db, aDbConfig[ii].op, -1, &v);
utf8_printf(p->out, "%18s %s\n", aDbConfig[ii].zName, v ? "on" : "off"); utf8_printf(p->out, "%19s %s\n", aDbConfig[ii].zName, v ? "on" : "off");
if( nArg>1 ) break; if( nArg>1 ) break;
} }
if( nArg>1 && ii==ArraySize(aDbConfig) ){ if( nArg>1 && ii==ArraySize(aDbConfig) ){
@ -16303,10 +16334,19 @@ static int do_meta_command(char *zLine, ShellState *p){
char *zCollist = 0; char *zCollist = 0;
sqlite3_stmt *pStmt; sqlite3_stmt *pStmt;
int tnum = 0; int tnum = 0;
int isWO = 0; /* True if making an imposter of a WITHOUT ROWID table */
int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */
int i; int i;
if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){ if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){
utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n" utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"
" .imposter off\n"); " .imposter off\n");
/* Also allowed, but not documented:
**
** .imposter TABLE IMPOSTER
**
** where TABLE is a WITHOUT ROWID table. In that case, the
** imposter is another WITHOUT ROWID table with the columns in
** storage order. */
rc = 1; rc = 1;
goto meta_command_exit; goto meta_command_exit;
} }
@ -16315,19 +16355,22 @@ static int do_meta_command(char *zLine, ShellState *p){
sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1); sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1);
goto meta_command_exit; goto meta_command_exit;
} }
zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master" zSql = sqlite3_mprintf(
" WHERE name='%q' AND type='index'", azArg[1]); "SELECT rootpage, 0 FROM sqlite_master"
" WHERE name='%q' AND type='index'"
"UNION ALL "
"SELECT rootpage, 1 FROM sqlite_master"
" WHERE name='%q' AND type='table'"
" AND sql LIKE '%%without%%rowid%%'",
azArg[1], azArg[1]
);
sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
sqlite3_free(zSql); sqlite3_free(zSql);
if( sqlite3_step(pStmt)==SQLITE_ROW ){ if( sqlite3_step(pStmt)==SQLITE_ROW ){
tnum = sqlite3_column_int(pStmt, 0); tnum = sqlite3_column_int(pStmt, 0);
isWO = sqlite3_column_int(pStmt, 1);
} }
sqlite3_finalize(pStmt); sqlite3_finalize(pStmt);
if( tnum==0 ){
utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
rc = 1;
goto meta_command_exit;
}
zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]); zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]);
rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
sqlite3_free(zSql); sqlite3_free(zSql);
@ -16344,6 +16387,9 @@ static int do_meta_command(char *zLine, ShellState *p){
zCol = zLabel; zCol = zLabel;
} }
} }
if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){
lenPK = (int)strlen(zCollist);
}
if( zCollist==0 ){ if( zCollist==0 ){
zCollist = sqlite3_mprintf("\"%w\"", zCol); zCollist = sqlite3_mprintf("\"%w\"", zCol);
}else{ }else{
@ -16351,9 +16397,16 @@ static int do_meta_command(char *zLine, ShellState *p){
} }
} }
sqlite3_finalize(pStmt); sqlite3_finalize(pStmt);
if( i==0 || tnum==0 ){
utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]);
rc = 1;
sqlite3_free(zCollist);
goto meta_command_exit;
}
if( lenPK==0 ) lenPK = 100000;
zSql = sqlite3_mprintf( zSql = sqlite3_mprintf(
"CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID", "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID",
azArg[2], zCollist, zCollist); azArg[2], zCollist, lenPK, zCollist);
sqlite3_free(zCollist); sqlite3_free(zCollist);
rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum); rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
@ -16364,7 +16417,8 @@ static int do_meta_command(char *zLine, ShellState *p){
}else{ }else{
utf8_printf(stdout, "%s;\n", zSql); utf8_printf(stdout, "%s;\n", zSql);
raw_printf(stdout, raw_printf(stdout,
"WARNING: writing to an imposter table will corrupt the index!\n" "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n",
azArg[1], isWO ? "table" : "index"
); );
} }
}else{ }else{
@ -16562,6 +16616,7 @@ static int do_meta_command(char *zLine, ShellState *p){
sqlite3_free(p->zFreeOnClose); sqlite3_free(p->zFreeOnClose);
p->zFreeOnClose = 0; p->zFreeOnClose = 0;
p->openMode = SHELL_OPEN_UNSPEC; p->openMode = SHELL_OPEN_UNSPEC;
p->openFlags = 0;
p->szMax = 0; p->szMax = 0;
/* Check for command-line arguments */ /* Check for command-line arguments */
for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){ for(iName=1; iName<nArg && azArg[iName][0]=='-'; iName++){
@ -16576,6 +16631,8 @@ static int do_meta_command(char *zLine, ShellState *p){
p->openMode = SHELL_OPEN_APPENDVFS; p->openMode = SHELL_OPEN_APPENDVFS;
}else if( optionMatch(z, "readonly") ){ }else if( optionMatch(z, "readonly") ){
p->openMode = SHELL_OPEN_READONLY; p->openMode = SHELL_OPEN_READONLY;
}else if( optionMatch(z, "nofollow") ){
p->openFlags |= SQLITE_OPEN_NOFOLLOW;
#ifdef SQLITE_ENABLE_DESERIALIZE #ifdef SQLITE_ENABLE_DESERIALIZE
}else if( optionMatch(z, "deserialize") ){ }else if( optionMatch(z, "deserialize") ){
p->openMode = SHELL_OPEN_DESERIALIZE; p->openMode = SHELL_OPEN_DESERIALIZE;
@ -17732,7 +17789,7 @@ static int do_meta_command(char *zLine, ShellState *p){
{ "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,"BOOLEAN" }, { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,"BOOLEAN" },
/*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, "" },*/ /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, "" },*/
{ "imposter", SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"}, { "imposter", SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"},
{ "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "BOOLEAN" }, { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "" },
{ "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN" }, { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN" },
{ "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN" }, { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN" },
{ "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK" }, { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK" },
@ -17848,7 +17905,6 @@ static int do_meta_command(char *zLine, ShellState *p){
/* sqlite3_test_control(int, int) */ /* sqlite3_test_control(int, int) */
case SQLITE_TESTCTRL_ASSERT: case SQLITE_TESTCTRL_ASSERT:
case SQLITE_TESTCTRL_ALWAYS: case SQLITE_TESTCTRL_ALWAYS:
case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
if( nArg==3 ){ if( nArg==3 ){
int opt = booleanValue(azArg[2]); int opt = booleanValue(azArg[2]);
rc2 = sqlite3_test_control(testctrl, opt); rc2 = sqlite3_test_control(testctrl, opt);
@ -17866,6 +17922,12 @@ static int do_meta_command(char *zLine, ShellState *p){
} }
break; break;
/* sqlite3_test_control(sqlite3*) */
case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS:
rc2 = sqlite3_test_control(testctrl, p->db);
isOk = 3;
break;
case SQLITE_TESTCTRL_IMPOSTER: case SQLITE_TESTCTRL_IMPOSTER:
if( nArg==5 ){ if( nArg==5 ){
rc2 = sqlite3_test_control(testctrl, p->db, rc2 = sqlite3_test_control(testctrl, p->db,
@ -18496,6 +18558,7 @@ static const char zOptions[] =
" -multiplex enable the multiplexor VFS\n" " -multiplex enable the multiplexor VFS\n"
#endif #endif
" -newline SEP set output row separator. Default: '\\n'\n" " -newline SEP set output row separator. Default: '\\n'\n"
" -nofollow refuse to open symbolic links to database files\n"
" -nullvalue TEXT set text string for NULL values. Default ''\n" " -nullvalue TEXT set text string for NULL values. Default ''\n"
" -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n" " -pagecache SIZE N use N slots of SZ bytes each for page cache memory\n"
" -quote set output mode to 'quote'\n" " -quote set output mode to 'quote'\n"
@ -18806,6 +18869,8 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
#endif #endif
}else if( strcmp(z,"-readonly")==0 ){ }else if( strcmp(z,"-readonly")==0 ){
data.openMode = SHELL_OPEN_READONLY; data.openMode = SHELL_OPEN_READONLY;
}else if( strcmp(z,"-nofollow")==0 ){
data.openFlags = SQLITE_OPEN_NOFOLLOW;
#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
}else if( strncmp(z, "-A",2)==0 ){ }else if( strncmp(z, "-A",2)==0 ){
/* All remaining command-line arguments are passed to the ".archive" /* All remaining command-line arguments are passed to the ".archive"
@ -18909,6 +18974,8 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
#endif #endif
}else if( strcmp(z,"-readonly")==0 ){ }else if( strcmp(z,"-readonly")==0 ){
data.openMode = SHELL_OPEN_READONLY; data.openMode = SHELL_OPEN_READONLY;
}else if( strcmp(z,"-nofollow")==0 ){
data.openFlags |= SQLITE_OPEN_NOFOLLOW;
}else if( strcmp(z,"-ascii")==0 ){ }else if( strcmp(z,"-ascii")==0 ){
data.mode = MODE_Ascii; data.mode = MODE_Ascii;
sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator, sqlite3_snprintf(sizeof(data.colSeparator), data.colSeparator,

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -324,6 +324,12 @@ struct sqlite3_api_routines {
int (*value_frombind)(sqlite3_value*); int (*value_frombind)(sqlite3_value*);
/* Version 3.30.0 and later */ /* Version 3.30.0 and later */
int (*drop_modules)(sqlite3*,const char**); int (*drop_modules)(sqlite3*,const char**);
/* Version 3.31.0 and later */
sqlite3_int64 (*hard_heap_limit64)(sqlite3_int64);
const char *(*uri_key)(const char*,int);
const char *(*filename_database)(const char*);
const char *(*filename_journal)(const char*);
const char *(*filename_wal)(const char*);
}; };
/* /*
@ -618,6 +624,12 @@ typedef int (*sqlite3_loadext_entry)(
#define sqlite3_value_frombind sqlite3_api->frombind #define sqlite3_value_frombind sqlite3_api->frombind
/* Version 3.30.0 and later */ /* Version 3.30.0 and later */
#define sqlite3_drop_modules sqlite3_api->drop_modules #define sqlite3_drop_modules sqlite3_api->drop_modules
/* Version 3.31.0 andn later */
#define sqlite3_hard_heap_limit64 sqlite3_api->hard_heap_limit64
#define sqlite3_uri_key sqlite3_api->uri_key
#define sqlite3_filename_database sqlite3_api->filename_database
#define sqlite3_filename_journal sqlite3_api->filename_journal
#define sqlite3_filename_wal sqlite3_api->filename_wal
#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)

View File

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for sqlite 3.30.1. # Generated by GNU Autoconf 2.69 for sqlite 3.31.0.
# #
# #
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@ -577,8 +577,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='sqlite' PACKAGE_NAME='sqlite'
PACKAGE_TARNAME='sqlite' PACKAGE_TARNAME='sqlite'
PACKAGE_VERSION='3.30.1' PACKAGE_VERSION='3.31.0'
PACKAGE_STRING='sqlite 3.30.1' PACKAGE_STRING='sqlite 3.31.0'
PACKAGE_BUGREPORT='' PACKAGE_BUGREPORT=''
PACKAGE_URL='' PACKAGE_URL=''
@ -1303,7 +1303,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures sqlite 3.30.1 to adapt to many kinds of systems. \`configure' configures sqlite 3.31.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1365,7 +1365,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of sqlite 3.30.1:";; short | recursive ) echo "Configuration of sqlite 3.31.0:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1467,7 +1467,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
sqlite configure 3.30.1 sqlite configure 3.31.0
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@ -1878,7 +1878,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by sqlite $as_me 3.30.1, which was It was created by sqlite $as_me 3.31.0, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@ -9373,7 +9373,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by sqlite $as_me 3.30.1, which was This file was extended by sqlite $as_me 3.31.0, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -9426,7 +9426,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
sqlite config.status 3.30.1 sqlite config.status 3.31.0
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@ -19,7 +19,7 @@ dnl to configure the system for the local environment.
# so you can encode the package version directly into the source files. # so you can encode the package version directly into the source files.
#----------------------------------------------------------------------- #-----------------------------------------------------------------------
AC_INIT([sqlite], [3.30.1]) AC_INIT([sqlite], [3.31.0])
#-------------------------------------------------------------------- #--------------------------------------------------------------------
# Call TEA_INIT as the first TEA_ macro to set up initial vars. # Call TEA_INIT as the first TEA_ macro to set up initial vars.

View File

@ -2346,20 +2346,22 @@ static int SQLITE_TCLAPI DbObjCmd(
const char *zName; const char *zName;
int op; int op;
} aDbConfig[] = { } aDbConfig[] = {
{ "defensive", SQLITE_DBCONFIG_DEFENSIVE },
{ "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL },
{ "dqs_dml", SQLITE_DBCONFIG_DQS_DML },
{ "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY },
{ "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG },
{ "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER },
{ "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW }, { "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW },
{ "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER },
{ "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE },
{ "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT },
{ "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
{ "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE },
{ "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG },
{ "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP },
{ "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE },
{ "defensive", SQLITE_DBCONFIG_DEFENSIVE }, { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP },
{ "trusted_schema", SQLITE_DBCONFIG_TRUSTED_SCHEMA },
{ "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, { "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA },
{ "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE },
{ "dqs_dml", SQLITE_DBCONFIG_DQS_DML },
{ "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL },
}; };
Tcl_Obj *pResult; Tcl_Obj *pResult;
int ii; int ii;
@ -2823,6 +2825,7 @@ static int SQLITE_TCLAPI DbObjCmd(
** --argcount N Function has exactly N arguments ** --argcount N Function has exactly N arguments
** --deterministic The function is pure ** --deterministic The function is pure
** --directonly Prohibit use inside triggers and views ** --directonly Prohibit use inside triggers and views
** --innocuous Has no side effects or information leaks
** --returntype TYPE Specify the return type of the function ** --returntype TYPE Specify the return type of the function
*/ */
case DB_FUNCTION: { case DB_FUNCTION: {
@ -2859,6 +2862,9 @@ static int SQLITE_TCLAPI DbObjCmd(
if( n>1 && strncmp(z, "-directonly",n)==0 ){ if( n>1 && strncmp(z, "-directonly",n)==0 ){
flags |= SQLITE_DIRECTONLY; flags |= SQLITE_DIRECTONLY;
}else }else
if( n>1 && strncmp(z, "-innocuous",n)==0 ){
flags |= SQLITE_INNOCUOUS;
}else
if( n>1 && strncmp(z, "-returntype", n)==0 ){ if( n>1 && strncmp(z, "-returntype", n)==0 ){
const char *azType[] = {"integer", "real", "text", "blob", "any", 0}; const char *azType[] = {"integer", "real", "text", "blob", "any", 0};
assert( SQLITE_INTEGER==1 && SQLITE_FLOAT==2 && SQLITE_TEXT==3 ); assert( SQLITE_INTEGER==1 && SQLITE_FLOAT==2 && SQLITE_TEXT==3 );
@ -2875,7 +2881,7 @@ static int SQLITE_TCLAPI DbObjCmd(
}else{ }else{
Tcl_AppendResult(interp, "bad option \"", z, Tcl_AppendResult(interp, "bad option \"", z,
"\": must be -argcount, -deterministic, -directonly," "\": must be -argcount, -deterministic, -directonly,"
" or -returntype", (char*)0 " -innocuous, or -returntype", (char*)0
); );
return TCL_ERROR; return TCL_ERROR;
} }
@ -3675,6 +3681,7 @@ static int sqliteCmdUsage(
){ ){
Tcl_WrongNumArgs(interp, 1, objv, Tcl_WrongNumArgs(interp, 1, objv,
"HANDLE ?FILENAME? ?-vfs VFSNAME? ?-readonly BOOLEAN? ?-create BOOLEAN?" "HANDLE ?FILENAME? ?-vfs VFSNAME? ?-readonly BOOLEAN? ?-create BOOLEAN?"
" ?-nofollow BOOLEAN?"
" ?-nomutex BOOLEAN? ?-fullmutex BOOLEAN? ?-uri BOOLEAN?" " ?-nomutex BOOLEAN? ?-fullmutex BOOLEAN? ?-uri BOOLEAN?"
#if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_CODEC_FROM_TCL) #if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_CODEC_FROM_TCL)
" ?-key CODECKEY?" " ?-key CODECKEY?"
@ -3686,6 +3693,7 @@ static int sqliteCmdUsage(
/* /*
** sqlite3 DBNAME FILENAME ?-vfs VFSNAME? ?-key KEY? ?-readonly BOOLEAN? ** sqlite3 DBNAME FILENAME ?-vfs VFSNAME? ?-key KEY? ?-readonly BOOLEAN?
** ?-create BOOLEAN? ?-nomutex BOOLEAN? ** ?-create BOOLEAN? ?-nomutex BOOLEAN?
** ?-nofollow BOOLEAN?
** **
** This is the main Tcl command. When the "sqlite" Tcl command is ** This is the main Tcl command. When the "sqlite" Tcl command is
** invoked, this routine runs to process that command. ** invoked, this routine runs to process that command.
@ -3784,6 +3792,14 @@ static int SQLITE_TCLAPI DbMain(
}else{ }else{
flags &= ~SQLITE_OPEN_CREATE; flags &= ~SQLITE_OPEN_CREATE;
} }
}else if( strcmp(zArg, "-nofollow")==0 ){
int b;
if( Tcl_GetBooleanFromObj(interp, objv[i], &b) ) return TCL_ERROR;
if( b ){
flags |= SQLITE_OPEN_NOFOLLOW;
}else{
flags &= ~SQLITE_OPEN_NOFOLLOW;
}
}else if( strcmp(zArg, "-nomutex")==0 ){ }else if( strcmp(zArg, "-nomutex")==0 ){
int b; int b;
if( Tcl_GetBooleanFromObj(interp, objv[i], &b) ) return TCL_ERROR; if( Tcl_GetBooleanFromObj(interp, objv[i], &b) ) return TCL_ERROR;

View File

@ -153,7 +153,7 @@ Please `cd` to its location first.
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
PROJECT = sqlite3 PROJECT = tclsqlite3
!include "rules.vc" !include "rules.vc"
# nmakehelp -V <file> <tag> will search the file for tag, skips until a # nmakehelp -V <file> <tag> will search the file for tag, skips until a
@ -162,18 +162,15 @@ PROJECT = sqlite3
!if [echo REM = This file is generated from Makefile.vc > versions.vc] !if [echo REM = This file is generated from Makefile.vc > versions.vc]
!endif !endif
# get project version from row "AC_INIT([sqlite], [3.7.14])" # get project version from row "AC_INIT([sqlite], [3.x.y])"
!if [echo DOTVERSION = \>> versions.vc] \ !if [echo DOTVERSION = \>> versions.vc] \
&& [nmakehlp -V ..\configure.in AC_INIT >> versions.vc] && [nmakehlp -V ..\configure.ac AC_INIT >> versions.vc]
!endif !endif
!include "versions.vc" !include "versions.vc"
VERSION = $(DOTVERSION:.=) VERSION = $(DOTVERSION:.=)
STUBPREFIX = $(PROJECT)stub STUBPREFIX = $(PROJECT)stub
DLLOBJS = \
$(TMP_DIR)\tclsqlite3.obj
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# Target names and paths ( shouldn't need changing ) # Target names and paths ( shouldn't need changing )
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -182,7 +179,7 @@ BINROOT = .
ROOT = .. ROOT = ..
PRJIMPLIB = $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX).lib PRJIMPLIB = $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX).lib
PRJLIBNAME = $(PROJECT)$(VERSION)$(SUFX).$(EXT) PRJLIBNAME = $(PROJECT).$(EXT)
PRJLIB = $(OUT_DIR)\$(PRJLIBNAME) PRJLIB = $(OUT_DIR)\$(PRJLIBNAME)
PRJSTUBLIBNAME = $(STUBPREFIX)$(VERSION).lib PRJSTUBLIBNAME = $(STUBPREFIX)$(VERSION).lib
@ -204,6 +201,17 @@ DOCDIR = $(ROOT)\doc
TOOLSDIR = $(ROOT)\tools TOOLSDIR = $(ROOT)\tools
COMPATDIR = $(ROOT)\compat COMPATDIR = $(ROOT)\compat
### Figure out where the primary source code file(s) is/are.
!if exist("$(ROOT)\..\..\sqlite3.c") && exist("$(ROOT)\..\..\src\tclsqlite.c")
SQL_INCLUDES = -I"$(ROOT)\..\.."
SQLITE_SRCDIR = $(ROOT)\..\..
TCLSQLITE_SRCDIR = $(ROOT)\..\..\src
DLLOBJS = $(TMP_DIR)\sqlite3.obj $(TMP_DIR)\tclsqlite.obj
!else
TCLSQLITE_SRCDIR = $(ROOT)\generic
DLLOBJS = $(TMP_DIR)\tclsqlite3.obj
!endif
#--------------------------------------------------------------------- #---------------------------------------------------------------------
# Compile flags # Compile flags
#--------------------------------------------------------------------- #---------------------------------------------------------------------
@ -223,7 +231,7 @@ cdebug = -Z7 -WX -Od -GZ
!endif !endif
### Declarations common to all compiler options ### Declarations common to all compiler options
cflags = -nologo -c -W3 -YX -Fp$(TMP_DIR)^\ cflags = -nologo -c -W3 -D_CRT_SECURE_NO_WARNINGS -YX -Fp$(TMP_DIR)^\
!if $(MSVCRT) !if $(MSVCRT)
!if $(DEBUG) !if $(DEBUG)
@ -239,8 +247,8 @@ crt = -MT
!endif !endif
!endif !endif
INCLUDES = $(TCL_INCLUDES) -I"$(WINDIR)" -I"$(GENERICDIR)" \ INCLUDES = $(SQL_INCLUDES) $(TCL_INCLUDES) -I"$(WINDIR)" \
-I"$(ROOT)\.." -I"$(GENERICDIR)" -I"$(ROOT)\.."
BASE_CLFAGS = $(cflags) $(cdebug) $(crt) $(INCLUDES) \ BASE_CLFAGS = $(cflags) $(cdebug) $(crt) $(INCLUDES) \
-DSQLITE_3_SUFFIX_ONLY=1 -DSQLITE_ENABLE_RTREE=1 \ -DSQLITE_3_SUFFIX_ONLY=1 -DSQLITE_ENABLE_RTREE=1 \
-DSQLITE_ENABLE_FTS3=1 -DSQLITE_OMIT_DEPRECATED=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_OMIT_DEPRECATED=1
@ -341,20 +349,17 @@ $(PRJSTUBLIB): $(PRJSTUBOBJS)
# Implicit rules # Implicit rules
#--------------------------------------------------------------------- #---------------------------------------------------------------------
{$(WINDIR)}.c{$(TMP_DIR)}.obj:: $(TMP_DIR)\sqlite3.obj: $(SQLITE_SRCDIR)\sqlite3.c
$(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$(TMP_DIR)\ @<< $(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$(TMP_DIR)\ \
$< -c $(SQLITE_SRCDIR)\sqlite3.c
<<
{$(GENERICDIR)}.c{$(TMP_DIR)}.obj:: $(TMP_DIR)\tclsqlite.obj: $(TCLSQLITE_SRCDIR)\tclsqlite.c
$(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$(TMP_DIR)\ @<< $(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$(TMP_DIR)\ \
$< -c $(TCLSQLITE_SRCDIR)\tclsqlite.c
<<
{$(COMPATDIR)}.c{$(TMP_DIR)}.obj:: $(TMP_DIR)\tclsqlite3.obj: $(TCLSQLITE_SRCDIR)\tclsqlite3.c
$(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$(TMP_DIR)\ @<< $(cc32) $(TCL_CFLAGS) -DBUILD_$(PROJECT) -Fo$(TMP_DIR)\ \
$< -c $(TCLSQLITE_SRCDIR)\tclsqlite3.c
<<
{$(WINDIR)}.rc{$(TMP_DIR)}.res: {$(WINDIR)}.rc{$(TMP_DIR)}.res:
$(rc32) -fo $@ -r -i "$(GENERICDIR)" -D__WIN32__ \ $(rc32) -fo $@ -r -i "$(GENERICDIR)" -D__WIN32__ \