From 4d9565b80555347bc6d0a1eb431ef32114b9fbdb Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Wed, 12 Dec 2018 19:43:10 -0500 Subject: [PATCH] Snapshot of upstream SQLite 3.26.0 --- Makefile.in | 81 +- Makefile.msc | 15 +- VERSION | 2 +- configure | 18 +- doc/lemon.html | 3 + ext/expert/sqlite3expert.c | 1 + ext/fts3/fts3.c | 30 +- ext/fts3/fts3_aux.c | 3 +- ext/fts3/fts3_term.c | 3 +- ext/fts3/fts3_tokenize_vtab.c | 3 +- ext/fts3/fts3_write.c | 23 +- ext/fts5/fts5_index.c | 2 +- ext/fts5/fts5_main.c | 18 +- ext/fts5/fts5_test_tok.c | 3 +- ext/fts5/fts5_vocab.c | 7 +- ext/fts5/test/fts5aa.test | 1 + ext/fts5/test/fts5connect.test | 1 - ext/fts5/test/fts5corrupt.test | 4 +- ext/fts5/test/fts5corrupt2.test | 2 + ext/fts5/test/fts5corrupt3.test | 9 + ext/fts5/test/fts5first.test | 1 - ext/fts5/test/fts5integrity.test | 1 + ext/fts5/test/fts5rank.test | 1 - ext/fts5/test/fts5rebuild.test | 1 + ext/fts5/test/fts5rowid.test | 1 + ext/fts5/test/fts5version.test | 4 +- ext/fts5/test/fts5vocab.test | 2 +- ext/fts5/test/fts5vocab2.test | 3 +- ext/misc/amatch.c | 3 +- ext/misc/btreeinfo.c | 1 + ext/misc/closure.c | 3 +- ext/misc/completion.c | 3 +- ext/misc/csv.c | 131 ++- ext/misc/explain.c | 322 ++++++++ ext/misc/fileio.c | 88 +- ext/misc/json1.c | 64 +- ext/misc/memstat.c | 428 ++++++++++ ext/misc/series.c | 62 +- ext/misc/sha1.c | 2 +- ext/misc/shathree.c | 2 +- ext/misc/spellfix.c | 12 + ext/misc/stmt.c | 1 + ext/misc/templatevtab.c | 3 +- ext/misc/unionvtab.c | 3 +- ext/misc/vtablog.c | 1 + ext/misc/zipfile.c | 23 +- ext/rbu/rbu1.test | 1 - ext/rbu/rbu10.test | 1 - ext/rbu/rbu11.test | 1 - ext/rbu/rbu12.test | 1 - ext/rbu/rbu13.test | 1 - ext/rbu/rbu14.test | 1 - ext/rbu/rbu3.test | 2 - ext/rbu/rbu5.test | 4 - ext/rbu/rbu6.test | 1 - ext/rbu/rbu7.test | 2 - ext/rbu/rbu8.test | 1 - ext/rbu/rbu9.test | 1 - ext/rbu/rbuA.test | 1 - ext/rbu/rbuB.test | 1 - ext/rbu/rbuC.test | 1 - ext/rbu/rbucollate.test | 1 - ext/rbu/rbucrash.test | 1 - ext/rbu/rbucrash2.test | 1 - ext/rbu/rbudiff.test | 1 - ext/rbu/rbudor.test | 1 - ext/rbu/rbufault.test | 1 - ext/rbu/rbufault2.test | 1 - ext/rbu/rbufault3.test | 1 - ext/rbu/rbufault4.test | 1 - ext/rbu/rbufts.test | 1 - ext/rbu/rbumulti.test | 1 - ext/rbu/rbuprogress.test | 1 - ext/rbu/rburesume.test | 1 - ext/rbu/rbusave.test | 1 - ext/rbu/rbusplit.test | 1 - ext/rbu/rbutemplimit.test | 1 - ext/rbu/rbuvacuum.test | 1 - ext/rbu/rbuvacuum2.test | 1 - ext/rbu/sqlite3rbu.c | 100 ++- ext/repair/test/checkindex01.test | 2 - ext/rtree/geopoly.c | 204 ++++- ext/rtree/rtree.c | 19 +- ext/rtree/rtree8.test | 2 + ext/rtree/rtreeA.test | 3 +- ext/rtree/rtreecheck.test | 4 +- ext/rtree/sqlite3rtree.h | 2 +- ext/rtree/visual01.txt | 13 + ext/session/changesetfuzz.c | 1240 +++++++++++++++++++++++++++++ ext/session/changesetfuzz1.test | 84 ++ ext/session/session1.test | 7 + ext/session/sessionC.test | 1 - ext/session/sessionD.test | 1 - ext/session/sessionE.test | 2 - ext/session/sessionF.test | 1 - ext/session/sessionG.test | 1 - ext/session/sessionH.test | 1 - ext/session/session_common.tcl | 17 + ext/session/sessionfault2.test | 1 - ext/session/sessioninvert.test | 159 ++++ ext/session/sessionrebase.test | 1 - ext/session/sessionstat1.test | 1 - ext/session/sessionwor.test | 1 - ext/session/sqlite3session.c | 201 +++-- ext/session/sqlite3session.h | 79 +- ext/session/test_session.c | 117 ++- main.mk | 43 +- manifest | 564 ++++++------- manifest.uuid | 2 +- src/alter.c | 44 +- src/attach.c | 2 +- src/auth.c | 2 + src/btree.c | 13 +- src/build.c | 89 ++- src/callback.c | 19 +- src/ctime.c | 6 + src/dbpage.c | 10 +- src/dbstat.c | 45 +- src/delete.c | 51 +- src/expr.c | 101 +-- src/fkey.c | 2 +- src/global.c | 1 + src/hash.c | 56 ++ src/insert.c | 37 +- src/loadext.c | 9 +- src/main.c | 21 +- src/os_unix.c | 125 +-- src/os_win.c | 30 +- src/pager.c | 35 +- src/pager.h | 9 +- src/parse.y | 5 +- src/pcache.c | 11 +- src/pcache.h | 4 + src/pcache1.c | 3 +- src/pragma.c | 66 +- src/pragma.h | 157 ++-- src/prepare.c | 292 ++++++- src/resolve.c | 64 +- src/select.c | 46 +- src/shell.c.in | 423 ++++++---- src/sqlite.h.in | 55 +- src/sqlite3ext.h | 5 + src/sqliteInt.h | 68 +- src/test1.c | 120 ++- src/test_config.c | 8 +- src/test_intarray.c | 5 +- src/test_intarray.h | 9 +- src/test_onefile.c | 1 + src/tokenize.c | 67 ++ src/treeview.c | 70 +- src/update.c | 62 +- src/vacuum.c | 3 +- src/vdbe.c | 32 +- src/vdbeInt.h | 7 + src/vdbeapi.c | 10 + src/vdbeaux.c | 19 +- src/vdbemem.c | 3 +- src/vtab.c | 7 +- src/walker.c | 4 +- src/where.c | 57 +- src/whereInt.h | 21 + src/wherecode.c | 4 +- src/whereexpr.c | 21 +- src/window.c | 12 +- test/alter.test | 9 + test/alter2.test | 2 + test/alterauth2.test | 98 +++ test/altercol.test | 11 + test/alterlegacy.test | 1 - test/altermalloc.test | 2 +- test/altertab.test | 46 +- test/altertab2.test | 45 +- test/analyze.test | 1 + test/attach.test | 26 + test/attachmalloc.test | 2 +- test/autoinc.test | 7 + test/autoindex5.test | 85 ++ test/bestindex4.test | 55 ++ test/bestindex5.test | 1 - test/capi3.test | 4 +- test/capi3c.test | 4 +- test/corrupt.test | 1 + test/corrupt2.test | 2 + test/corrupt5.test | 1 + test/corruptI.test | 1 + test/corruptK.test | 2 +- test/countofview.test | 1 - test/crash5.test | 2 +- test/csv01.test | 61 +- test/dbfuzz2-seed1.db | Bin 0 -> 3584 bytes test/dbfuzz2.c | 138 ++++ test/dbpage.test | 1 + test/dbstatus.test | 4 +- test/default.test | 1 + test/e_fkey.test | 2 + test/e_fts3.test | 1 + test/e_reindex.test | 2 + test/fkey2.test | 6 + test/fts3auto.test | 1 + test/fts3corrupt.test | 1 + test/fts3corrupt2.test | 1 + test/fts3corrupt3.test | 1 + test/fts3corrupt4.test | 148 ++++ test/fts3cov.test | 2 + test/fts3d.test | 1 + test/fts3defer.test | 4 + test/fts3defer2.test | 3 + test/fts3matchinfo.test | 3 + test/fts3misc.test | 1 + test/fts3query.test | 1 + test/fts3snippet.test | 1 + test/fts4check.test | 5 + test/fts4growth.test | 1 + test/fts4merge.test | 1 + test/fts4opt.test | 1 + test/fuzz_malloc.test | 5 - test/fuzzcheck.c | 6 +- test/fuzzdata7.db | Bin 0 -> 16369664 bytes test/incrblob_err.test | 2 +- test/incrvacuum.test | 50 ++ test/index.test | 6 + test/index3.test | 1 + test/indexexpr2.test | 72 ++ test/intarray.test | 7 + test/lemon-test01.y | 75 ++ test/like3.test | 2 + test/loadext.test | 6 +- test/malloctraceviewer.tcl | 253 ++++++ test/misc1.test | 3 + test/misc4.test | 1 + test/misc5.test | 1 + test/misc7.test | 1 + test/mjournal.test | 1 - test/normalize.test | 289 +++++++ test/notnull.test | 1 - test/ossfuzz.c | 21 +- test/pager1.test | 2 + test/parser1.test | 1 + test/permutations.test | 127 +-- test/pragma.test | 1 + test/pragma3.test | 6 +- test/pragma4.test | 142 ++++ test/printf.test | 36 +- test/releasetest.tcl | 4 + test/resetdb.test | 3 + test/rowvalue.test | 11 + test/shared.test | 62 +- test/shared8.test | 1 + test/shell1.test | 2 +- test/snapshot2.test | 1 - test/snapshot3.test | 1 - test/snapshot4.test | 1 - test/snapshot_up.test | 1 - test/swarmvtab3.test | 1 - test/swarmvtabfault.test | 1 - test/tabfunc01.test | 13 +- test/table.test | 1 + test/tableapi.test | 26 +- test/tempdb2.test | 21 + test/tester.tcl | 32 +- test/trigger7.test | 1 + test/triggerA.test | 7 - test/triggerE.test | 1 + test/unionvtab.test | 1 - test/unionvtabfault.test | 1 - test/vtab1.test | 1 + test/vtab_err.test | 28 +- test/wal64k.test | 12 + test/where.test | 13 + test/whereL.test | 11 + test/wherelimit2.test | 1 - test/window1.test | 45 ++ test/window5.test | 1 - test/window6.test | 31 +- test/windowfault.test | 1 - test/with1.test | 21 + test/without_rowid3.test | 6 + test/zipfile.test | 34 + test/zipfile2.test | 1 - tool/genfkey.test | 1 - tool/lempar.c | 4 +- tool/mkpragmatab.tcl | 65 +- tool/sqldiff.c | 30 +- tool/warnings.sh | 8 +- 284 files changed, 7619 insertions(+), 1561 deletions(-) create mode 100644 ext/misc/explain.c create mode 100644 ext/misc/memstat.c create mode 100644 ext/session/changesetfuzz.c create mode 100644 ext/session/changesetfuzz1.test create mode 100644 ext/session/sessioninvert.test create mode 100644 test/alterauth2.test create mode 100644 test/dbfuzz2-seed1.db create mode 100644 test/dbfuzz2.c create mode 100644 test/fts3corrupt4.test create mode 100644 test/fuzzdata7.db create mode 100644 test/lemon-test01.y create mode 100644 test/malloctraceviewer.tcl diff --git a/Makefile.in b/Makefile.in index f84dcc2..d2f9710 100644 --- a/Makefile.in +++ b/Makefile.in @@ -22,7 +22,7 @@ TOP = @abs_srcdir@ # BCC = @BUILD_CC@ @BUILD_CFLAGS@ -# TCC is the C Compile and options for use in building executables that +# TCC is the C Compile and options for use in building executables that # will run on the target platform. (BCC and TCC are usually the # same unless your are cross-compiling.) Separate CC and CFLAGS macros # are provide so that these aspects of the build process can be changed @@ -32,10 +32,11 @@ CC = @CC@ CFLAGS = @CPPFLAGS@ @CFLAGS@ TCC = ${CC} ${CFLAGS} -I. -I${TOP}/src -I${TOP}/ext/rtree -I${TOP}/ext/icu TCC += -I${TOP}/ext/fts3 -I${TOP}/ext/async -I${TOP}/ext/session +TCC += -I${TOP}/ext/userauth # Define this for the autoconf-based build, so that the code knows it can # include the generated config.h -# +# TCC += -D_HAVE_SQLITE_CONFIG_H -DBUILD_sqlite # Define -DNDEBUG to compile without debugging (i.e., for production usage) @@ -66,7 +67,7 @@ LIBREADLINE = @TARGET_READLINE_LIBS@ TCC += -DSQLITE_THREADSAFE=@SQLITE_THREADSAFE@ # Any target libraries which libsqlite must be linked against -# +# TLIBS = @LIBS@ $(LIBS) # Flags controlling use of the in memory btree implementation @@ -78,8 +79,8 @@ TLIBS = @LIBS@ $(LIBS) TEMP_STORE = -DSQLITE_TEMP_STORE=@TEMP_STORE@ # Enable/disable loadable extensions, and other optional features -# based on configuration. (-DSQLITE_OMIT*, -DSQLITE_ENABLE*). -# The same set of OMIT and ENABLE flags should be passed to the +# based on configuration. (-DSQLITE_OMIT*, -DSQLITE_ENABLE*). +# The same set of OMIT and ENABLE flags should be passed to the # LEMON parser generator and the mkkeywordhash tool as well. OPT_FEATURE_FLAGS = @OPT_FEATURE_FLAGS@ @@ -126,8 +127,8 @@ SHLIB_SUFFIX = @TCL_SHLIB_SUFFIX@ # If gcov support was enabled by the configure script, add the appropriate # flags here. It's not always as easy as just having the user add the right # CFLAGS / LDFLAGS, because libtool wants to use CFLAGS when linking, which -# causes build errors with -fprofile-arcs -ftest-coverage with some GCCs. -# Supposedly GCC does the right thing if you use --coverage, but in +# causes build errors with -fprofile-arcs -ftest-coverage with some GCCs. +# Supposedly GCC does the right thing if you use --coverage, but in # practice it still fails. See: # # http://www.mail-archive.com/debian-gcc@lists.debian.org/msg26197.html @@ -187,7 +188,7 @@ LIBOBJS0 = alter.lo analyze.lo attach.lo auth.lo \ random.lo resolve.lo rowset.lo rtree.lo \ sqlite3session.lo select.lo sqlite3rbu.lo status.lo stmt.lo \ table.lo threads.lo tokenize.lo treeview.lo trigger.lo \ - update.lo upsert.lo util.lo vacuum.lo \ + update.lo userauth.lo upsert.lo util.lo vacuum.lo \ vdbe.lo vdbeapi.lo vdbeaux.lo vdbeblob.lo vdbemem.lo vdbesort.lo \ vdbetrace.lo wal.lo walker.lo where.lo wherecode.lo whereexpr.lo \ window.lo utf.lo vtab.lo @@ -355,6 +356,9 @@ SRC += \ SRC += \ $(TOP)/ext/session/sqlite3session.c \ $(TOP)/ext/session/sqlite3session.h +SRC += \ + $(TOP)/ext/userauth/userauth.c \ + $(TOP)/ext/userauth/sqlite3userauth.h SRC += \ $(TOP)/ext/rbu/sqlite3rbu.h \ $(TOP)/ext/rbu/sqlite3rbu.c @@ -425,7 +429,7 @@ TESTSRC = \ $(TOP)/ext/fts3/fts3_term.c \ $(TOP)/ext/fts3/fts3_test.c \ $(TOP)/ext/session/test_session.c \ - $(TOP)/ext/rbu/test_rbu.c + $(TOP)/ext/rbu/test_rbu.c # Statically linked extensions # @@ -437,6 +441,7 @@ TESTSRC += \ $(TOP)/ext/misc/closure.c \ $(TOP)/ext/misc/csv.c \ $(TOP)/ext/misc/eval.c \ + $(TOP)/ext/misc/explain.c \ $(TOP)/ext/misc/fileio.c \ $(TOP)/ext/misc/fuzzer.c \ $(TOP)/ext/fts5/fts5_tcl.c \ @@ -454,7 +459,8 @@ TESTSRC += \ $(TOP)/ext/misc/totype.c \ $(TOP)/ext/misc/unionvtab.c \ $(TOP)/ext/misc/wholenumber.c \ - $(TOP)/ext/misc/zipfile.c + $(TOP)/ext/misc/zipfile.c \ + $(TOP)/ext/userauth/userauth.c # Source code to the library files needed by the test fixture # @@ -470,6 +476,7 @@ TESTSRC2 = \ $(TOP)/src/dbstat.c \ $(TOP)/src/expr.c \ $(TOP)/src/func.c \ + $(TOP)/src/global.c \ $(TOP)/src/insert.c \ $(TOP)/src/wal.c \ $(TOP)/src/main.c \ @@ -506,7 +513,7 @@ TESTSRC2 = \ $(TOP)/ext/fts3/fts3_write.c \ $(TOP)/ext/async/sqlite3async.c \ $(TOP)/ext/session/sqlite3session.c \ - $(TOP)/ext/misc/stmt.c + $(TOP)/ext/misc/stmt.c # Header files used by all library source files. # @@ -559,6 +566,8 @@ EXTHDR += \ $(TOP)/ext/icu/sqliteicu.h EXTHDR += \ $(TOP)/ext/rtree/sqlite3rtree.h +EXTHDR += \ + $(TOP)/ext/userauth/sqlite3userauth.h # executables needed for testing # @@ -578,7 +587,8 @@ FUZZDATA = \ $(TOP)/test/fuzzdata3.db \ $(TOP)/test/fuzzdata4.db \ $(TOP)/test/fuzzdata5.db \ - $(TOP)/test/fuzzdata6.db + $(TOP)/test/fuzzdata6.db \ + $(TOP)/test/fuzzdata7.db # Standard options to testfixture # @@ -595,13 +605,14 @@ SHELL_OPT += -DSQLITE_ENABLE_STMTVTAB SHELL_OPT += -DSQLITE_ENABLE_DBPAGE_VTAB SHELL_OPT += -DSQLITE_ENABLE_DBSTAT_VTAB SHELL_OPT += -DSQLITE_ENABLE_OFFSET_SQL_FUNC +SHELL_OPT += -DSQLITE_ENABLE_DESERIALIZE SHELL_OPT += -DSQLITE_INTROSPECTION_PRAGMAS FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 -DSQLITE_OSS_FUZZ FUZZCHECK_OPT += -DSQLITE_MAX_MEMORY=50000000 FUZZCHECK_OPT += -DSQLITE_PRINTF_PRECISION_LIMIT=1000 FUZZCHECK_SRC = $(TOP)/test/fuzzcheck.c $(TOP)/test/ossfuzz.c -DBFUZZ_OPT = +DBFUZZ_OPT = # This is the default Makefile target. The objects listed here # are what get build when you type just "make" with no arguments. @@ -663,6 +674,22 @@ sessionfuzz$(TEXE): $(TOP)/test/sessionfuzz.c sqlite3.c sqlite3.h dbfuzz$(TEXE): $(TOP)/test/dbfuzz.c sqlite3.c sqlite3.h $(LTLINK) -o $@ $(DBFUZZ_OPT) $(TOP)/test/dbfuzz.c sqlite3.c $(TLIBS) +DBFUZZ2_OPTS = \ + -DSQLITE_THREADSAFE=0 \ + -DSQLITE_OMIT_LOAD_EXTENSION \ + -DSQLITE_ENABLE_DESERIALIZE \ + -DSQLITE_DEBUG \ + -DSQLITE_ENABLE_DBSTAT_VTAB \ + -DSQLITE_ENABLE_RTREE \ + -DSQLITE_ENABLE_FTS4 \ + -DSQLITE_EANBLE_FTS5 + +dbfuzz2: $(TOP)/test/dbfuzz2.c sqlite3.c sqlite3.h + clang-6.0 -I. -g -O0 -fsanitize=fuzzer,undefined,address -o dbfuzz2 \ + $(DBFUZZ2_OPTS) $(TOP)/test/dbfuzz2.c sqlite3.c + mkdir -p dbfuzz2-dir + cp $(TOP)/test/dbfuzz2-seed* dbfuzz2-dir + mptester$(TEXE): sqlite3.lo $(TOP)/mptest/mptest.c $(LTLINK) -o $@ -I. $(TOP)/mptest/mptest.c sqlite3.lo \ $(TLIBS) -rpath "$(libdir)" @@ -1098,7 +1125,10 @@ fts3_write.lo: $(TOP)/ext/fts3/fts3_write.c $(HDR) $(EXTHDR) rtree.lo: $(TOP)/ext/rtree/rtree.c $(HDR) $(EXTHDR) $(LTCOMPILE) -DSQLITE_CORE -c $(TOP)/ext/rtree/rtree.c -sqlite3session.lo: $(TOP)/ext/session/sqlite3session.c $(HDR) $(EXTHDR) +sqlite3session.lo: $(TOP)/ext/userauth/userauth.c $(HDR) $(EXTHDR) + $(LTCOMPILE) -DSQLITE_CORE -c $(TOP)/ext/userauth/userauth.c + +userauth.lo: $(TOP)/ext/session/sqlite3session.c $(HDR) $(EXTHDR) $(LTCOMPILE) -DSQLITE_CORE -c $(TOP)/ext/session/sqlite3session.c json1.lo: $(TOP)/ext/misc/json1.c @@ -1126,7 +1156,7 @@ FTS5_SRC = \ $(TOP)/ext/fts5/fts5_varint.c \ $(TOP)/ext/fts5/fts5_vocab.c \ -fts5parse.c: $(TOP)/ext/fts5/fts5parse.y lemon +fts5parse.c: $(TOP)/ext/fts5/fts5parse.y lemon cp $(TOP)/ext/fts5/fts5parse.y . rm -f fts5parse.h ./lemon$(BEXE) $(OPTS) fts5parse.y @@ -1153,7 +1183,7 @@ sqlite3rbu.lo: $(TOP)/ext/rbu/sqlite3rbu.c $(HDR) $(EXTHDR) # TESTFIXTURE_FLAGS = -DSQLITE_TEST=1 -DSQLITE_CRASH_TEST=1 TESTFIXTURE_FLAGS += -DTCLSH_INIT_PROC=sqlite3TestInit -TESTFIXTURE_FLAGS += -DSQLITE_SERVER=1 -DSQLITE_PRIVATE="" -DSQLITE_CORE +TESTFIXTURE_FLAGS += -DSQLITE_SERVER=1 -DSQLITE_PRIVATE="" -DSQLITE_CORE TESTFIXTURE_FLAGS += -DBUILD_sqlite TESTFIXTURE_FLAGS += -DSQLITE_SERIES_CONSTRAINT_VERIFY=1 TESTFIXTURE_FLAGS += -DSQLITE_DEFAULT_PAGE_SIZE=1024 @@ -1169,6 +1199,10 @@ testfixture$(TEXE): $(TESTFIXTURE_SRC) $(LTLINK) -DSQLITE_NO_SYNC=1 $(TEMP_STORE) $(TESTFIXTURE_FLAGS) \ -o $@ $(TESTFIXTURE_SRC) $(LIBTCL) $(TLIBS) +coretestprogs: $(TESTPROGS) + +testprogs: coretestprogs srcck1$(BEXE) fuzzcheck$(TEXE) sessionfuzz$(TEXE) + # A very detailed test running most or all test cases fulltest: $(TESTPROGS) fuzztest ./testfixture$(TEXE) $(TOP)/test/all.test $(TESTOPTS) @@ -1228,7 +1262,7 @@ sqlite3_analyzer.c: sqlite3.c $(TOP)/src/tclsqlite.c $(TOP)/tool/spaceanal.tcl $ sqlite3_analyzer$(TEXE): sqlite3_analyzer.c $(LTLINK) sqlite3_analyzer.c -o $@ $(LIBTCL) $(TLIBS) -sqltclsh.c: sqlite3.c $(TOP)/src/tclsqlite.c $(TOP)/tool/sqltclsh.tcl $(TOP)/ext/misc/appendvfs.c $(TOP)/tool/mkccode.tcl $(TOP)/tool/sqltclsh.c.in +sqltclsh.c: sqlite3.c $(TOP)/src/tclsqlite.c $(TOP)/tool/sqltclsh.tcl $(TOP)/ext/misc/appendvfs.c $(TOP)/tool/mkccode.tcl $(TOP)/tool/sqltclsh.c.in $(TCLSH_CMD) $(TOP)/tool/mkccode.tcl $(TOP)/tool/sqltclsh.c.in >sqltclsh.c sqltclsh$(TEXE): sqltclsh.c @@ -1275,6 +1309,9 @@ showshm$(TEXE): $(TOP)/tool/showshm.c changeset$(TEXE): $(TOP)/ext/session/changeset.c sqlite3.lo $(LTLINK) -o $@ $(TOP)/ext/session/changeset.c sqlite3.lo $(TLIBS) +changesetfuzz$(TEXE): $(TOP)/ext/session/changesetfuzz.c sqlite3.lo + $(LTLINK) -o $@ $(TOP)/ext/session/changesetfuzz.c sqlite3.lo $(TLIBS) + rollback-test$(TEXE): $(TOP)/tool/rollback-test.c sqlite3.lo $(LTLINK) -o $@ $(TOP)/tool/rollback-test.c sqlite3.lo $(TLIBS) @@ -1295,7 +1332,7 @@ KV_OPT += -DSQLITE_DIRECT_OVERFLOW_READ kvtest$(TEXE): $(TOP)/test/kvtest.c sqlite3.c $(LTLINK) $(KV_OPT) -o $@ $(TOP)/test/kvtest.c sqlite3.c $(TLIBS) -rbu$(EXE): $(TOP)/ext/rbu/rbu.c $(TOP)/ext/rbu/sqlite3rbu.c sqlite3.lo +rbu$(EXE): $(TOP)/ext/rbu/rbu.c $(TOP)/ext/rbu/sqlite3rbu.c sqlite3.lo $(LTLINK) -I. -o $@ $(TOP)/ext/rbu/rbu.c sqlite3.lo $(TLIBS) loadfts$(EXE): $(TOP)/tool/loadfts.c libsqlite3.la @@ -1323,7 +1360,7 @@ snapshot-tarball: sqlite3.c # The next two rules are used to support the "threadtest" target. Building # threadtest runs a few thread-safety tests that are implemented in C. This # target is invoked by the releasetest.tcl script. -# +# THREADTEST3_SRC = $(TOP)/test/threadtest3.c \ $(TOP)/test/tt3_checkpoint.c \ $(TOP)/test/tt3_index.c \ @@ -1337,7 +1374,7 @@ threadtest3$(TEXE): sqlite3.lo $(THREADTEST3_SRC) threadtest: threadtest3$(TEXE) ./threadtest3$(TEXE) -releasetest: +releasetest: $(TCLSH_CMD) $(TOP)/test/releasetest.tcl # Standard install and cleanup targets @@ -1345,7 +1382,7 @@ releasetest: lib_install: libsqlite3.la $(INSTALL) -d $(DESTDIR)$(libdir) $(LTINSTALL) libsqlite3.la $(DESTDIR)$(libdir) - + install: sqlite3$(TEXE) lib_install sqlite3.h sqlite3.pc ${HAVE_TCL:1=tcl_install} $(INSTALL) -d $(DESTDIR)$(bindir) $(LTINSTALL) sqlite3$(TEXE) $(DESTDIR)$(bindir) @@ -1363,7 +1400,7 @@ tcl_install: lib_install libtclsqlite3.la pkgIndex.tcl rm -f $(DESTDIR)$(TCLLIBDIR)/libtclsqlite3.la $(DESTDIR)$(TCLLIBDIR)/libtclsqlite3.a $(INSTALL) -m 0644 pkgIndex.tcl $(DESTDIR)$(TCLLIBDIR) -clean: +clean: rm -f *.lo *.la *.o sqlite3$(TEXE) libsqlite3.la rm -f sqlite3.h opcodes.* rm -rf .libs .deps diff --git a/Makefile.msc b/Makefile.msc index 4c6cdfb..e3feffa 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -345,6 +345,7 @@ 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_DBSTAT_VTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_INTROSPECTION_PRAGMAS=1 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DESERIALIZE=1 !ENDIF OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_COLUMN_METADATA=1 !ENDIF @@ -1515,6 +1516,7 @@ TESTEXT = \ $(TOP)\ext\misc\closure.c \ $(TOP)\ext\misc\csv.c \ $(TOP)\ext\misc\eval.c \ + $(TOP)\ext\misc\explain.c \ $(TOP)\ext\misc\fileio.c \ $(TOP)\ext\misc\fuzzer.c \ $(TOP)\ext\fts5\fts5_tcl.c \ @@ -1622,7 +1624,8 @@ FUZZDATA = \ $(TOP)\test\fuzzdata3.db \ $(TOP)\test\fuzzdata4.db \ $(TOP)\test\fuzzdata5.db \ - $(TOP)\test\fuzzdata6.db + $(TOP)\test\fuzzdata6.db \ + $(TOP)\test\fuzzdata7.db # <> # Additional compiler options for the shell. These are only effective @@ -1632,6 +1635,7 @@ FUZZDATA = \ SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_FTS4=1 SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_EXPLAIN_COMMENTS=1 SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_OFFSET_SQL_FUNC=1 +SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_DESERIALIZE=1 !ENDIF # <> @@ -2334,6 +2338,10 @@ extensiontest: testfixture.exe testloadext.dll @set PATH=$(LIBTCLPATH);$(PATH) .\testfixture.exe $(TOP)\test\loadext.test $(TESTOPTS) +coretestprogs: $(TESTPROGS) + +testprogs: coretestprogs srcck1.exe fuzzcheck.exe sessionfuzz.exe + fulltest: $(TESTPROGS) fuzztest @set PATH=$(LIBTCLPATH);$(PATH) .\testfixture.exe $(TOP)\test\all.test $(TESTOPTS) @@ -2441,6 +2449,11 @@ changeset.exe: $(TOP)\ext\session\changeset.c $(SQLITE3C) $(SQLITE3H) -DSQLITE_ENABLE_SESSION=1 -DSQLITE_ENABLE_PREUPDATE_HOOK=1 \ $(TOP)\ext\session\changeset.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) +changesetfuzz.exe: $(TOP)\ext\session\changesetfuzz.c $(SQLITE3C) $(SQLITE3H) + $(LTLINK) $(NO_WARN) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ + -DSQLITE_ENABLE_SESSION=1 -DSQLITE_ENABLE_PREUPDATE_HOOK=1 \ + $(TOP)\ext\session\changesetfuzz.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) + fts3view.exe: $(TOP)\ext\fts3\tool\fts3view.c $(SQLITE3C) $(SQLITE3H) $(LTLINK) $(NO_WARN) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ $(TOP)\ext\fts3\tool\fts3view.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) diff --git a/VERSION b/VERSION index 427f346..419ede3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.25.2 +3.26.0 diff --git a/configure b/configure index 038abd4..51653aa 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for sqlite 3.25.2. +# Generated by GNU Autoconf 2.69 for sqlite 3.26.0. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -726,8 +726,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='sqlite' PACKAGE_TARNAME='sqlite' -PACKAGE_VERSION='3.25.2' -PACKAGE_STRING='sqlite 3.25.2' +PACKAGE_VERSION='3.26.0' +PACKAGE_STRING='sqlite 3.26.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1466,7 +1466,7 @@ if test "$ac_init_help" = "long"; then # 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. cat <<_ACEOF -\`configure' configures sqlite 3.25.2 to adapt to many kinds of systems. +\`configure' configures sqlite 3.26.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1531,7 +1531,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sqlite 3.25.2:";; + short | recursive ) echo "Configuration of sqlite 3.26.0:";; esac cat <<\_ACEOF @@ -1657,7 +1657,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sqlite configure 3.25.2 +sqlite configure 3.26.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2076,7 +2076,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sqlite $as_me 3.25.2, which was +It was created by sqlite $as_me 3.26.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -12232,7 +12232,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sqlite $as_me 3.25.2, which was +This file was extended by sqlite $as_me 3.26.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -12298,7 +12298,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -sqlite config.status 3.25.2 +sqlite config.status 3.26.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/doc/lemon.html b/doc/lemon.html index 4f0849e..056ae5f 100644 --- a/doc/lemon.html +++ b/doc/lemon.html @@ -777,6 +777,9 @@ For example:

This might be needed, for example, if some of the C actions in the grammar call functions that are prototyped in unistd.h.

+

Use the %code directive to add code to +the end of the generated parser.

+

The %left directive

diff --git a/ext/expert/sqlite3expert.c b/ext/expert/sqlite3expert.c index 695aaec..e88fb7e 100644 --- a/ext/expert/sqlite3expert.c +++ b/ext/expert/sqlite3expert.c @@ -644,6 +644,7 @@ static int idxRegisterVtab(sqlite3expert *p){ 0, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ + 0, /* xShadowName */ }; return sqlite3_create_module(p->dbv, "expert", &expertModule, (void*)p); diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index d0e6d9b..f6fb931 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -1821,7 +1821,7 @@ static int fts3ScanInteriorNode( const char *zCsr = zNode; /* Cursor to iterate through node */ const char *zEnd = &zCsr[nNode];/* End of interior node buffer */ char *zBuffer = 0; /* Buffer to load terms into */ - int nAlloc = 0; /* Size of allocated buffer */ + i64 nAlloc = 0; /* Size of allocated buffer */ int isFirstTerm = 1; /* True when processing first term on page */ sqlite3_int64 iChild; /* Block id of child node to descend to */ @@ -1859,14 +1859,14 @@ static int fts3ScanInteriorNode( zCsr += fts3GetVarint32(zCsr, &nSuffix); assert( nPrefix>=0 && nSuffix>=0 ); - if( &zCsr[nSuffix]>zEnd ){ + if( nPrefix>zCsr-zNode || nSuffix>zEnd-zCsr ){ rc = FTS_CORRUPT_VTAB; goto finish_scan; } - if( nPrefix+nSuffix>nAlloc ){ + if( (i64)nPrefix+nSuffix>nAlloc ){ char *zNew; - nAlloc = (nPrefix+nSuffix) * 2; - zNew = (char *)sqlite3_realloc(zBuffer, nAlloc); + nAlloc = ((i64)nPrefix+nSuffix) * 2; + zNew = (char *)sqlite3_realloc64(zBuffer, nAlloc); if( !zNew ){ rc = SQLITE_NOMEM; goto finish_scan; @@ -3846,8 +3846,23 @@ static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ return SQLITE_OK; } +/* +** Return true if zName is the extension on one of the shadow tables used +** by this module. +*/ +static int fts3ShadowName(const char *zName){ + static const char *azName[] = { + "content", "docsize", "segdir", "segments", "stat", + }; + unsigned int i; + for(i=0; i&pReader->aNode[pReader->nNode] + if( nSuffix<=0 + || (&pReader->aNode[pReader->nNode] - pNext)pReader->nTermAlloc ){ return FTS_CORRUPT_VTAB; } - if( nPrefix+nSuffix>pReader->nTermAlloc ){ - int nNew = (nPrefix+nSuffix)*2; - char *zNew = sqlite3_realloc(pReader->zTerm, nNew); + /* Both nPrefix and nSuffix were read by fts3GetVarint32() and so are + ** between 0 and 0x7FFFFFFF. But the sum of the two may cause integer + ** overflow - hence the (i64) casts. */ + if( (i64)nPrefix+nSuffix>(i64)pReader->nTermAlloc ){ + i64 nNew = ((i64)nPrefix+nSuffix)*2; + char *zNew = sqlite3_realloc64(pReader->zTerm, nNew); if( !zNew ){ return SQLITE_NOMEM; } @@ -1404,7 +1408,7 @@ static int fts3SegReaderNext( ** b-tree node. And that the final byte of the doclist is 0x00. If either ** of these statements is untrue, then the data structure is corrupt. */ - if( &pReader->aDoclist[pReader->nDoclist]>&pReader->aNode[pReader->nNode] + if( (&pReader->aNode[pReader->nNode] - pReader->aDoclist)nDoclist || (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1]) ){ return FTS_CORRUPT_VTAB; @@ -3730,6 +3734,9 @@ static int nodeReaderNext(NodeReader *p){ } p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &nSuffix); + if( nPrefix>p->iOff || nSuffix>p->nNode-p->iOff ){ + return SQLITE_CORRUPT_VTAB; + } blobGrowBuffer(&p->term, nPrefix+nSuffix, &rc); if( rc==SQLITE_OK ){ memcpy(&p->term.a[nPrefix], &p->aNode[p->iOff], nSuffix); @@ -3737,6 +3744,9 @@ static int nodeReaderNext(NodeReader *p){ p->iOff += nSuffix; if( p->iChild==0 ){ p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &p->nDoclist); + if( (p->nNode-p->iOff)nDoclist ){ + return SQLITE_CORRUPT_VTAB; + } p->aDoclist = &p->aNode[p->iOff]; p->iOff += p->nDoclist; } @@ -3744,7 +3754,6 @@ static int nodeReaderNext(NodeReader *p){ } assert( p->iOff<=p->nNode ); - return rc; } diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 394280b..0a6d8d2 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5402,7 +5402,7 @@ int sqlite3Fts5IndexQuery( fts5CloseReader(p); } - *ppIter = &pRet->base; + *ppIter = (Fts5IndexIter*)pRet; sqlite3Fts5BufferFree(&buf); } return fts5IndexReturn(p); diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index e9ec2de..e5ff393 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -2645,9 +2645,24 @@ static void fts5SourceIdFunc( sqlite3_result_text(pCtx, "--FTS5-SOURCE-ID--", -1, SQLITE_TRANSIENT); } +/* +** Return true if zName is the extension on one of the shadow tables used +** by this module. +*/ +static int fts5ShadowName(const char *zName){ + static const char *azName[] = { + "config", "content", "data", "docsize", "idx" + }; + unsigned int i; + for(i=0; iiInstPos; int *po = &pCsr->iInstOff; + assert( sqlite3Fts5IterEof(pIter)==0 ); + assert( pCsr->bEof==0 ); while( eDetail==FTS5_DETAIL_NONE || sqlite3Fts5PoslistNext64(pIter->pData, pIter->nData, po, pp) ){ @@ -440,7 +442,7 @@ static int fts5VocabInstanceNext(Fts5VocabCursor *pCsr){ rc = sqlite3Fts5IterNextScan(pCsr->pIter); if( rc==SQLITE_OK ){ rc = fts5VocabInstanceNewTerm(pCsr); - if( eDetail==FTS5_DETAIL_NONE ) break; + if( pCsr->bEof || eDetail==FTS5_DETAIL_NONE ) break; } if( rc ){ pCsr->bEof = 1; @@ -755,10 +757,9 @@ int sqlite3Fts5VocabInit(Fts5Global *pGlobal, sqlite3 *db){ /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ 0, + /* xShadowName */ 0 }; void *p = (void*)pGlobal; return sqlite3_create_module_v2(db, "fts5vocab", &fts5Vocab, p, 0); } - - diff --git a/ext/fts5/test/fts5aa.test b/ext/fts5/test/fts5aa.test index 6fa3ad8..b6a2499 100644 --- a/ext/fts5/test/fts5aa.test +++ b/ext/fts5/test/fts5aa.test @@ -409,6 +409,7 @@ do_test 14.3 { do_execsql_test 15.0 { INSERT INTO t1(t1) VALUES('integrity-check'); } +sqlite3_db_config db DEFENSIVE 0 do_execsql_test 15.1 { UPDATE t1_content SET c1 = 'xyz xyz xyz xyz xyz abc' WHERE rowid = 1; } diff --git a/ext/fts5/test/fts5connect.test b/ext/fts5/test/fts5connect.test index c615d4c..4607734 100644 --- a/ext/fts5/test/fts5connect.test +++ b/ext/fts5/test/fts5connect.test @@ -244,4 +244,3 @@ foreach {tn sql res} { } finish_test - diff --git a/ext/fts5/test/fts5corrupt.test b/ext/fts5/test/fts5corrupt.test index 1462912..5f13513 100644 --- a/ext/fts5/test/fts5corrupt.test +++ b/ext/fts5/test/fts5corrupt.test @@ -41,6 +41,7 @@ db_save do_execsql_test 1.2 { INSERT INTO t1(t1) VALUES('integrity-check') } set segid [lindex [fts5_level_segids t1] 0] +sqlite3_db_config db DEFENSIVE 0 do_test 1.3 { execsql { DELETE FROM t1_data WHERE rowid = fts5_rowid('segment', $segid, 4); @@ -50,6 +51,7 @@ do_test 1.3 { do_test 1.4 { db_restore_and_reopen + sqlite3_db_config db DEFENSIVE 0 execsql { UPDATE t1_data set block = X'00000000' || substr(block, 5) WHERE rowid = fts5_rowid('segment', $segid, 4); @@ -89,7 +91,7 @@ do_execsql_test 3.0 { do_execsql_test 3.1 { SELECT * FROM t3 WHERE t3 MATCH 'o' } {{one o} {three o} {five o}} - +sqlite3_db_config db DEFENSIVE 0 do_catchsql_test 3.1 { DELETE FROM t3_content WHERE rowid = 3; SELECT * FROM t3 WHERE t3 MATCH 'o'; diff --git a/ext/fts5/test/fts5corrupt2.test b/ext/fts5/test/fts5corrupt2.test index 74721e5..a815320 100644 --- a/ext/fts5/test/fts5corrupt2.test +++ b/ext/fts5/test/fts5corrupt2.test @@ -99,6 +99,7 @@ foreach {tno stmt} { set lrowid [db one {SELECT max(rowid) FROM t1_data WHERE (rowid & $mask)=0}] set nbyte [db one {SELECT length(block) FROM t1_data WHERE rowid=$lrowid}] set all [db eval {SELECT rowid FROM t1}] +sqlite3_db_config db DEFENSIVE 0 for {set i [expr $nbyte-2]} {$i>=0} {incr i -1} { do_execsql_test 2.$i.1 { BEGIN; @@ -248,6 +249,7 @@ foreach {tn hdr} { #-------------------------------------------------------------------- reset_db +sqlite3_db_config db DEFENSIVE 0 do_execsql_test 6.1 { CREATE VIRTUAL TABLE x5 USING fts5(tt); INSERT INTO x5 VALUES('a'); diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 72e9ab1..ec823b3 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -51,6 +51,7 @@ do_test 1.1 { set {} {} } {} +sqlite3_db_config db DEFENSIVE 0 for {set i 0} {$i < $L} {incr i} { do_test 1.2.$i { catchsql { @@ -86,6 +87,7 @@ do_execsql_test 2.2 { # reset_db do_test 3.0 { create_t1 } {} +sqlite3_db_config db DEFENSIVE 0 do_execsql_test 3.1 { SELECT count(*) FROM t1_data; @@ -158,6 +160,7 @@ do_3_test 3.10 # Test that segments that end unexpectedly are identified as corruption. # reset_db +sqlite3_db_config db DEFENSIVE 0 do_test 4.0 { execsql { CREATE VIRTUAL TABLE t1 USING fts5(x); @@ -182,6 +185,7 @@ for {set i 1} {1} {incr i} { db close sqlite3 db test.db + sqlite3_db_config db DEFENSIVE 0 db eval { BEGIN; @@ -257,6 +261,7 @@ foreach rowid [db eval {SELECT rowid FROM x1_data WHERE rowid>100}] { #------------------------------------------------------------------------ # reset_db +sqlite3_db_config db DEFENSIVE 0 do_execsql_test 6.1.0 { CREATE VIRTUAL TABLE t1 USING fts5(a); INSERT INTO t1 VALUES('bbbbb ccccc'); @@ -273,6 +278,7 @@ do_catchsql_test 6.1.2 { #------- reset_db +sqlite3_db_config db DEFENSIVE 0 do_execsql_test 6.2.0 { CREATE VIRTUAL TABLE t1 USING fts5(a); INSERT INTO t1(t1, rank) VALUES('pgsz', 32); @@ -288,6 +294,7 @@ do_catchsql_test 6.2.2 { #------- reset_db +sqlite3_db_config db DEFENSIVE 0 do_execsql_test 6.3.0 { CREATE VIRTUAL TABLE t1 USING fts5(a); INSERT INTO t1 VALUES('abc abcdef abcdefghi'); @@ -362,6 +369,7 @@ do_test 7.0 { } } {} +sqlite3_db_config db DEFENSIVE 0 do_test 7.1 { foreach i [db eval { SELECT rowid FROM t5_data WHERE rowid>100 }] { db eval BEGIN @@ -383,6 +391,7 @@ do_execsql_test 8.1 { INSERT INTO t1 VALUES('one', 'two'); } +sqlite3_db_config db DEFENSIVE 0 do_test 9.1.1 { set blob "12345678" ;# cookie append blob "0105" ;# 1 level, total of 5 segments diff --git a/ext/fts5/test/fts5first.test b/ext/fts5/test/fts5first.test index b2cac1f..357672d 100644 --- a/ext/fts5/test/fts5first.test +++ b/ext/fts5/test/fts5first.test @@ -93,4 +93,3 @@ do_catchsql_test 3.3 { SELECT * FROM x2('^a'); } {1 {fts5: phrase queries are not supported (detail!=full)}} finish_test - diff --git a/ext/fts5/test/fts5integrity.test b/ext/fts5/test/fts5integrity.test index a38b164..25c7277 100644 --- a/ext/fts5/test/fts5integrity.test +++ b/ext/fts5/test/fts5integrity.test @@ -71,6 +71,7 @@ do_execsql_test 4.1 { INSERT INTO aa(aa) VALUES('integrity-check'); } +sqlite3_db_config db DEFENSIVE 0 do_catchsql_test 4.2 { BEGIN; UPDATE aa_docsize SET sz = X'44' WHERE rowid = 3; diff --git a/ext/fts5/test/fts5rank.test b/ext/fts5/test/fts5rank.test index 0a986b5..e8f5473 100644 --- a/ext/fts5/test/fts5rank.test +++ b/ext/fts5/test/fts5rank.test @@ -163,4 +163,3 @@ do_execsql_test 5.1 { } {30 31 32 33 34 35 36 37 38 39 40} finish_test - diff --git a/ext/fts5/test/fts5rebuild.test b/ext/fts5/test/fts5rebuild.test index 0191831..ae881c0 100644 --- a/ext/fts5/test/fts5rebuild.test +++ b/ext/fts5/test/fts5rebuild.test @@ -39,6 +39,7 @@ do_execsql_test 1.4 { INSERT INTO f1(f1) VALUES('integrity-check'); } {} +sqlite3_db_config db DEFENSIVE 0 do_execsql_test 1.5 { DELETE FROM f1_data; } {} diff --git a/ext/fts5/test/fts5rowid.test b/ext/fts5/test/fts5rowid.test index e7fd1bc..8935ecf 100644 --- a/ext/fts5/test/fts5rowid.test +++ b/ext/fts5/test/fts5rowid.test @@ -70,6 +70,7 @@ set res [db one {SELECT count(*) FROM x1_data}] do_execsql_test 2.3 { SELECT count(fts5_decode(rowid, block)) FROM x1_data; } $res +sqlite3_db_config db DEFENSIVE 0 do_execsql_test 2.4 { UPDATE x1_data SET block = X''; SELECT count(fts5_decode(rowid, block)) FROM x1_data; diff --git a/ext/fts5/test/fts5version.test b/ext/fts5/test/fts5version.test index 58cd348..60ec81c 100644 --- a/ext/fts5/test/fts5version.test +++ b/ext/fts5/test/fts5version.test @@ -36,9 +36,10 @@ do_execsql_test 1.3 { SELECT rowid FROM t1 WHERE t1 MATCH 'a'; } {1} +sqlite3_db_config db DEFENSIVE 0 do_execsql_test 1.4 { UPDATE t1_config set v=5 WHERE k='version'; -} +} do_test 1.5 { db close @@ -53,6 +54,7 @@ do_test 1.6 { } {1 {invalid fts5 file format (found 5, expected 4) - run 'rebuild'}} do_test 1.7 { + sqlite3_db_config db DEFENSIVE 0 execsql { DELETE FROM t1_config WHERE k='version' } db close sqlite3 db test.db diff --git a/ext/fts5/test/fts5vocab.test b/ext/fts5/test/fts5vocab.test index 8c40316..d3c8b76 100644 --- a/ext/fts5/test/fts5vocab.test +++ b/ext/fts5/test/fts5vocab.test @@ -420,6 +420,7 @@ if {[detail_is_none]} { set resc [row_to_col $resr] } do_execsql_test 8.1.1 { SELECT * FROM x1_r; } $resr do_execsql_test 8.1.2 { SELECT * FROM x1_c } $resc +sqlite3_db_config db DEFENSIVE 0 do_execsql_test 8.2 { PRAGMA writable_schema = 1; UPDATE sqlite_master @@ -481,4 +482,3 @@ do_test 9.6 { finish_test - diff --git a/ext/fts5/test/fts5vocab2.test b/ext/fts5/test/fts5vocab2.test index 4a0a1f4..8edea54 100644 --- a/ext/fts5/test/fts5vocab2.test +++ b/ext/fts5/test/fts5vocab2.test @@ -13,7 +13,7 @@ # source [file join [file dirname [info script]] fts5_common.tcl] -set testprefix fts5vocab +set testprefix fts5vocab2 # If SQLITE_ENABLE_FTS5 is defined, omit this file. ifcapable !fts5 { @@ -206,4 +206,3 @@ do_execsql_test 3.5 { } finish_test - diff --git a/ext/misc/amatch.c b/ext/misc/amatch.c index 914e263..142e354 100644 --- a/ext/misc/amatch.c +++ b/ext/misc/amatch.c @@ -1473,7 +1473,8 @@ static sqlite3_module amatchModule = { 0, /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ - 0 /* xRollbackTo */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ }; #endif /* SQLITE_OMIT_VIRTUALTABLE */ diff --git a/ext/misc/btreeinfo.c b/ext/misc/btreeinfo.c index 131b210..3d818f2 100644 --- a/ext/misc/btreeinfo.c +++ b/ext/misc/btreeinfo.c @@ -411,6 +411,7 @@ int sqlite3BinfoRegister(sqlite3 *db){ 0, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ + 0 /* xShadowName */ }; return sqlite3_create_module(db, "sqlite_btreeinfo", &binfo_module, 0); } diff --git a/ext/misc/closure.c b/ext/misc/closure.c index 74bffc7..03f13c0 100644 --- a/ext/misc/closure.c +++ b/ext/misc/closure.c @@ -938,7 +938,8 @@ static sqlite3_module closureModule = { 0, /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ - 0 /* xRollbackTo */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ }; #endif /* SQLITE_OMIT_VIRTUALTABLE */ diff --git a/ext/misc/completion.c b/ext/misc/completion.c index 4a4b918..72ad23d 100644 --- a/ext/misc/completion.c +++ b/ext/misc/completion.c @@ -468,7 +468,8 @@ static sqlite3_module completionModule = { 0, /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ - 0 /* xRollbackTo */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ }; #endif /* SQLITE_OMIT_VIRTUALTABLE */ diff --git a/ext/misc/csv.c b/ext/misc/csv.c index ec90f96..8cca8ae 100644 --- a/ext/misc/csv.c +++ b/ext/misc/csv.c @@ -19,9 +19,9 @@ ** CREATE VIRTUAL TABLE temp.csv USING csv(filename=FILENAME); ** SELECT * FROM csv; ** -** The columns are named "c1", "c2", "c3", ... by default. But the -** application can define its own CREATE TABLE statement as an additional -** parameter. For example: +** The columns are named "c1", "c2", "c3", ... by default. Or the +** application can define its own CREATE TABLE statement using the +** schema= parameter, like this: ** ** CREATE VIRTUAL TABLE temp.csv2 USING csv( ** filename = "../http.log", @@ -32,9 +32,9 @@ ** the data= parameter. ** ** If the columns=N parameter is supplied, then the CSV file is assumed to have -** N columns. If the columns parameter is omitted, the CSV file is opened -** as soon as the virtual table is constructed and the first row of the CSV -** is read in order to count the tables. +** N columns. If both the columns= and schema= parameters are omitted, then +** the number and names of the columns is determined by the first line of +** the CSV input. ** ** Some extra debugging features (used for testing virtual tables) are available ** if this module is compiled with -DSQLITE_TEST. @@ -436,6 +436,34 @@ static int csv_boolean(const char *z){ return -1; } +/* Check to see if the string is of the form: "TAG = BOOLEAN" or just "TAG". +** If it is, set *pValue to be the value of the boolean ("true" if there is +** not "= BOOLEAN" component) and return non-zero. If the input string +** does not begin with TAG, return zero. +*/ +static int csv_boolean_parameter( + const char *zTag, /* Tag we are looking for */ + int nTag, /* Size of the tag in bytes */ + const char *z, /* Input parameter */ + int *pValue /* Write boolean value here */ +){ + int b; + z = csv_skip_whitespace(z); + if( strncmp(zTag, z, nTag)!=0 ) return 0; + z = csv_skip_whitespace(z + nTag); + if( z[0]==0 ){ + *pValue = 1; + return 1; + } + if( z[0]!='=' ) return 0; + z = csv_skip_whitespace(z+1); + b = csv_boolean(z); + if( b>=0 ){ + *pValue = b; + return 1; + } + return 0; +} /* ** Parameters: @@ -469,6 +497,7 @@ static int csvtabConnect( #ifdef SQLITE_TEST int tstFlags = 0; /* Value for testflags=N parameter */ #endif + int b; /* Value of a boolean parameter */ int nCol = -99; /* Value of the columns= parameter */ CsvReader sRdr; /* A CSV file reader used to store an error ** message and/or to count the number of columns */ @@ -493,21 +522,12 @@ static int csvtabConnect( if( j=0 ){ csv_errmsg(&sRdr, "more than one 'header' parameter"); goto csvtab_connect_error; } - x = csv_boolean(zValue); - if( x==1 ){ - bHeader = 1; - }else if( x==0 ){ - bHeader = 0; - }else{ - csv_errmsg(&sRdr, "unrecognized argument to 'header': %s", zValue); - goto csvtab_connect_error; - } + bHeader = b; }else #ifdef SQLITE_TEST if( (zValue = csv_parameter("testflags",9,z))!=0 ){ @@ -521,53 +541,94 @@ static int csvtabConnect( } nCol = atoi(zValue); if( nCol<=0 ){ - csv_errmsg(&sRdr, "must have at least one column"); + csv_errmsg(&sRdr, "column= value must be positive"); goto csvtab_connect_error; } }else { - csv_errmsg(&sRdr, "unrecognized parameter '%s'", z); + csv_errmsg(&sRdr, "bad parameter: '%s'", z); goto csvtab_connect_error; } } if( (CSV_FILENAME==0)==(CSV_DATA==0) ){ - csv_errmsg(&sRdr, "must either filename= or data= but not both"); + csv_errmsg(&sRdr, "must specify either filename= or data= but not both"); goto csvtab_connect_error; } - if( nCol<=0 && csv_reader_open(&sRdr, CSV_FILENAME, CSV_DATA) ){ + + if( (nCol<=0 || bHeader==1) + && csv_reader_open(&sRdr, CSV_FILENAME, CSV_DATA) + ){ goto csvtab_connect_error; } pNew = sqlite3_malloc( sizeof(*pNew) ); *ppVtab = (sqlite3_vtab*)pNew; if( pNew==0 ) goto csvtab_connect_oom; memset(pNew, 0, sizeof(*pNew)); - if( nCol>0 ){ + if( CSV_SCHEMA==0 ){ + sqlite3_str *pStr = sqlite3_str_new(0); + char *zSep = ""; + int iCol = 0; + sqlite3_str_appendf(pStr, "CREATE TABLE x("); + if( nCol<0 && bHeader<1 ){ + nCol = 0; + do{ + csv_read_one_field(&sRdr); + nCol++; + }while( sRdr.cTerm==',' ); + } + if( nCol>0 && bHeader<1 ){ + for(iCol=0; iCol0 && iColnCol = nCol; - }else{ + sqlite3_str_appendf(pStr, ")"); + CSV_SCHEMA = sqlite3_str_finish(pStr); + if( CSV_SCHEMA==0 ) goto csvtab_connect_oom; + }else if( nCol<0 ){ do{ csv_read_one_field(&sRdr); pNew->nCol++; }while( sRdr.cTerm==',' ); + }else{ + pNew->nCol = nCol; } pNew->zFilename = CSV_FILENAME; CSV_FILENAME = 0; pNew->zData = CSV_DATA; CSV_DATA = 0; #ifdef SQLITE_TEST pNew->tstFlags = tstFlags; #endif - pNew->iStart = bHeader==1 ? ftell(sRdr.in) : 0; - csv_reader_reset(&sRdr); - if( CSV_SCHEMA==0 ){ - char *zSep = ""; - CSV_SCHEMA = sqlite3_mprintf("CREATE TABLE x("); - if( CSV_SCHEMA==0 ) goto csvtab_connect_oom; - for(i=0; inCol; i++){ - CSV_SCHEMA = sqlite3_mprintf("%z%sc%d TEXT",CSV_SCHEMA, zSep, i); - zSep = ","; - } - CSV_SCHEMA = sqlite3_mprintf("%z);", CSV_SCHEMA); + if( bHeader!=1 ){ + pNew->iStart = 0; + }else if( pNew->zData ){ + pNew->iStart = (int)sRdr.iIn; + }else{ + pNew->iStart = ftell(sRdr.in); } + csv_reader_reset(&sRdr); rc = sqlite3_declare_vtab(db, CSV_SCHEMA); - if( rc ) goto csvtab_connect_error; + if( rc ){ + csv_errmsg(&sRdr, "bad schema: '%s' - %s", CSV_SCHEMA, sqlite3_errmsg(db)); + goto csvtab_connect_error; + } for(i=0; i +#include + +#ifndef SQLITE_OMIT_VIRTUALTABLE + +/* explain_vtab is a subclass of sqlite3_vtab which will +** serve as the underlying representation of a explain virtual table +*/ +typedef struct explain_vtab explain_vtab; +struct explain_vtab { + sqlite3_vtab base; /* Base class - must be first */ + sqlite3 *db; /* Database connection for this explain vtab */ +}; + +/* explain_cursor is a subclass of sqlite3_vtab_cursor which will +** serve as the underlying representation of a cursor that scans +** over rows of the result from an EXPLAIN operation. +*/ +typedef struct explain_cursor explain_cursor; +struct explain_cursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + sqlite3 *db; /* Database connection for this cursor */ + char *zSql; /* Value for the EXPLN_COLUMN_SQL column */ + sqlite3_stmt *pExplain; /* Statement being explained */ + int rc; /* Result of last sqlite3_step() on pExplain */ +}; + +/* +** The explainConnect() method is invoked to create a new +** explain_vtab that describes the explain virtual table. +** +** Think of this routine as the constructor for explain_vtab objects. +** +** All this routine needs to do is: +** +** (1) Allocate the explain_vtab object and initialize all fields. +** +** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the +** result set of queries against explain will look like. +*/ +static int explainConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + explain_vtab *pNew; + int rc; + +/* Column numbers */ +#define EXPLN_COLUMN_ADDR 0 /* Instruction address */ +#define EXPLN_COLUMN_OPCODE 1 /* Opcode */ +#define EXPLN_COLUMN_P1 2 /* Operand 1 */ +#define EXPLN_COLUMN_P2 3 /* Operand 2 */ +#define EXPLN_COLUMN_P3 4 /* Operand 3 */ +#define EXPLN_COLUMN_P4 5 /* Operand 4 */ +#define EXPLN_COLUMN_P5 6 /* Operand 5 */ +#define EXPLN_COLUMN_COMMENT 7 /* Comment */ +#define EXPLN_COLUMN_SQL 8 /* SQL that is being explained */ + + + rc = sqlite3_declare_vtab(db, + "CREATE TABLE x(addr,opcode,p1,p2,p3,p4,p5,comment,sql HIDDEN)"); + if( rc==SQLITE_OK ){ + pNew = sqlite3_malloc( sizeof(*pNew) ); + *ppVtab = (sqlite3_vtab*)pNew; + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + pNew->db = db; + } + return rc; +} + +/* +** This method is the destructor for explain_cursor objects. +*/ +static int explainDisconnect(sqlite3_vtab *pVtab){ + sqlite3_free(pVtab); + return SQLITE_OK; +} + +/* +** Constructor for a new explain_cursor object. +*/ +static int explainOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + explain_cursor *pCur; + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + pCur->db = ((explain_vtab*)p)->db; + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* +** Destructor for a explain_cursor. +*/ +static int explainClose(sqlite3_vtab_cursor *cur){ + explain_cursor *pCur = (explain_cursor*)cur; + sqlite3_finalize(pCur->pExplain); + sqlite3_free(pCur->zSql); + sqlite3_free(pCur); + return SQLITE_OK; +} + + +/* +** Advance a explain_cursor to its next row of output. +*/ +static int explainNext(sqlite3_vtab_cursor *cur){ + explain_cursor *pCur = (explain_cursor*)cur; + pCur->rc = sqlite3_step(pCur->pExplain); + if( pCur->rc!=SQLITE_DONE && pCur->rc!=SQLITE_ROW ) return pCur->rc; + return SQLITE_OK; +} + +/* +** Return values of columns for the row at which the explain_cursor +** is currently pointing. +*/ +static int explainColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + explain_cursor *pCur = (explain_cursor*)cur; + if( i==EXPLN_COLUMN_SQL ){ + sqlite3_result_text(ctx, pCur->zSql, -1, SQLITE_TRANSIENT); + }else{ + sqlite3_result_value(ctx, sqlite3_column_value(pCur->pExplain, i)); + } + return SQLITE_OK; +} + +/* +** Return the rowid for the current row. In this implementation, the +** rowid is the same as the output value. +*/ +static int explainRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + explain_cursor *pCur = (explain_cursor*)cur; + *pRowid = sqlite3_column_int64(pCur->pExplain, 0); + return SQLITE_OK; +} + +/* +** Return TRUE if the cursor has been moved off of the last +** row of output. +*/ +static int explainEof(sqlite3_vtab_cursor *cur){ + explain_cursor *pCur = (explain_cursor*)cur; + return pCur->rc!=SQLITE_ROW; +} + +/* +** This method is called to "rewind" the explain_cursor object back +** to the first row of output. This method is always called at least +** once prior to any call to explainColumn() or explainRowid() or +** explainEof(). +** +** The argv[0] is the SQL statement that is to be explained. +*/ +static int explainFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + explain_cursor *pCur = (explain_cursor *)pVtabCursor; + char *zSql = 0; + int rc; + sqlite3_finalize(pCur->pExplain); + pCur->pExplain = 0; + if( sqlite3_value_type(argv[0])!=SQLITE_TEXT ){ + pCur->rc = SQLITE_DONE; + return SQLITE_OK; + } + sqlite3_free(pCur->zSql); + pCur->zSql = sqlite3_mprintf("%s", sqlite3_value_text(argv[0])); + if( pCur->zSql ){ + zSql = sqlite3_mprintf("EXPLAIN %s", pCur->zSql); + } + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(pCur->db, zSql, -1, &pCur->pExplain, 0); + sqlite3_free(zSql); + } + if( rc ){ + sqlite3_finalize(pCur->pExplain); + pCur->pExplain = 0; + sqlite3_free(pCur->zSql); + pCur->zSql = 0; + }else{ + pCur->rc = sqlite3_step(pCur->pExplain); + rc = (pCur->rc==SQLITE_DONE || pCur->rc==SQLITE_ROW) ? SQLITE_OK : pCur->rc; + } + return rc; +} + +/* +** SQLite will invoke this method one or more times while planning a query +** that uses the explain virtual table. This routine needs to create +** a query plan for each invocation and compute an estimated cost for that +** plan. +*/ +static int explainBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + int i; /* Loop counter */ + int idx = -1; /* Index of a usable == constraint against SQL */ + int unusable = 0; /* True if there are unusable constraints on SQL */ + + pIdxInfo->estimatedRows = 500; + for(i=0; inConstraint; i++){ + struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[i]; + if( p->iColumn!=EXPLN_COLUMN_SQL ) continue; + if( !p->usable ){ + unusable = 1; + }else if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + idx = i; + } + } + if( idx>=0 ){ + /* There exists a usable == constraint against the SQL column */ + pIdxInfo->estimatedCost = 10.0; + pIdxInfo->idxNum = 1; + pIdxInfo->aConstraintUsage[idx].argvIndex = 1; + pIdxInfo->aConstraintUsage[idx].omit = 1; + }else if( unusable ){ + /* There are unusable constraints against the SQL column. Do not allow + ** this plan to continue forward. */ + return SQLITE_CONSTRAINT; + } + return SQLITE_OK; +} + +/* +** This following structure defines all the methods for the +** explain virtual table. +*/ +static sqlite3_module explainModule = { + 0, /* iVersion */ + 0, /* xCreate */ + explainConnect, /* xConnect */ + explainBestIndex, /* xBestIndex */ + explainDisconnect, /* xDisconnect */ + 0, /* xDestroy */ + explainOpen, /* xOpen - open a cursor */ + explainClose, /* xClose - close a cursor */ + explainFilter, /* xFilter - configure scan constraints */ + explainNext, /* xNext - advance a cursor */ + explainEof, /* xEof - check for end of scan */ + explainColumn, /* xColumn - read data */ + explainRowid, /* xRowid - read data */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindMethod */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0, /* xShadowName */ +}; + +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +int sqlite3ExplainVtabInit(sqlite3 *db){ + int rc = SQLITE_OK; +#ifndef SQLITE_OMIT_VIRTUALTABLE + rc = sqlite3_create_module(db, "explain", &explainModule, 0); +#endif + return rc; +} + +#ifdef _WIN32 +__declspec(dllexport) +#endif +int sqlite3_explain_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc = SQLITE_OK; + SQLITE_EXTENSION_INIT2(pApi); +#ifndef SQLITE_OMIT_VIRTUALTABLE + rc = sqlite3ExplainVtabInit(db); +#endif + return rc; +} diff --git a/ext/misc/fileio.c b/ext/misc/fileio.c index 816a353..3a4fa18 100644 --- a/ext/misc/fileio.c +++ b/ext/misc/fileio.c @@ -106,7 +106,18 @@ SQLITE_EXTENSION_INIT1 #include +/* +** Structure of the fsdir() table-valued function +*/ + /* 0 1 2 3 4 5 */ #define FSDIR_SCHEMA "(name,mode,mtime,data,path HIDDEN,dir HIDDEN)" +#define FSDIR_COLUMN_NAME 0 /* Name of the file */ +#define FSDIR_COLUMN_MODE 1 /* Access mode */ +#define FSDIR_COLUMN_MTIME 2 /* Last modification time */ +#define FSDIR_COLUMN_DATA 3 /* File content */ +#define FSDIR_COLUMN_PATH 4 /* Path to top of search */ +#define FSDIR_COLUMN_DIR 5 /* Path is relative to this directory */ + /* ** Set the result stored by context ctx to a blob containing the @@ -695,20 +706,20 @@ static int fsdirColumn( ){ fsdir_cursor *pCur = (fsdir_cursor*)cur; switch( i ){ - case 0: { /* name */ + case FSDIR_COLUMN_NAME: { sqlite3_result_text(ctx, &pCur->zPath[pCur->nBase], -1, SQLITE_TRANSIENT); break; } - case 1: /* mode */ + case FSDIR_COLUMN_MODE: sqlite3_result_int64(ctx, pCur->sStat.st_mode); break; - case 2: /* mtime */ + case FSDIR_COLUMN_MTIME: sqlite3_result_int64(ctx, pCur->sStat.st_mtime); break; - case 3: { /* data */ + case FSDIR_COLUMN_DATA: { mode_t m = pCur->sStat.st_mode; if( S_ISDIR(m) ){ sqlite3_result_null(ctx); @@ -738,6 +749,12 @@ static int fsdirColumn( readFileContents(ctx, pCur->zPath); } } + case FSDIR_COLUMN_PATH: + default: { + /* The FSDIR_COLUMN_PATH and FSDIR_COLUMN_DIR are input parameters. + ** always return their values as NULL */ + break; + } } return SQLITE_OK; } @@ -764,6 +781,9 @@ static int fsdirEof(sqlite3_vtab_cursor *cur){ /* ** xFilter callback. +** +** idxNum==1 PATH parameter only +** idxNum==2 Both PATH and DIR supplied */ static int fsdirFilter( sqlite3_vtab_cursor *cur, @@ -816,40 +836,63 @@ static int fsdirFilter( ** In this implementation idxNum is used to represent the ** query plan. idxStr is unused. ** -** The query plan is represented by bits in idxNum: +** The query plan is represented by values of idxNum: ** -** (1) start = $value -- constraint exists -** (2) stop = $value -- constraint exists -** (4) step = $value -- constraint exists -** (8) output in descending order +** (1) The path value is supplied by argv[0] +** (2) Path is in argv[0] and dir is in argv[1] */ static int fsdirBestIndex( sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo ){ int i; /* Loop over constraints */ - int idx4 = -1; - int idx5 = -1; + int idxPath = -1; /* Index in pIdxInfo->aConstraint of PATH= */ + int idxDir = -1; /* Index in pIdxInfo->aConstraint of DIR= */ + int seenPath = 0; /* True if an unusable PATH= constraint is seen */ + int seenDir = 0; /* True if an unusable DIR= constraint is seen */ const struct sqlite3_index_constraint *pConstraint; (void)tab; pConstraint = pIdxInfo->aConstraint; for(i=0; inConstraint; i++, pConstraint++){ - if( pConstraint->usable==0 ) continue; if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; - if( pConstraint->iColumn==4 ) idx4 = i; - if( pConstraint->iColumn==5 ) idx5 = i; + switch( pConstraint->iColumn ){ + case FSDIR_COLUMN_PATH: { + if( pConstraint->usable ){ + idxPath = i; + seenPath = 0; + }else if( idxPath<0 ){ + seenPath = 1; + } + break; + } + case FSDIR_COLUMN_DIR: { + if( pConstraint->usable ){ + idxDir = i; + seenDir = 0; + }else if( idxDir<0 ){ + seenDir = 1; + } + break; + } + } + } + if( seenPath || seenDir ){ + /* If input parameters are unusable, disallow this plan */ + return SQLITE_CONSTRAINT; } - if( idx4<0 ){ + if( idxPath<0 ){ pIdxInfo->idxNum = 0; - pIdxInfo->estimatedCost = (double)(((sqlite3_int64)1) << 50); + /* The pIdxInfo->estimatedCost should have been initialized to a huge + ** number. Leave it unchanged. */ + pIdxInfo->estimatedRows = 0x7fffffff; }else{ - pIdxInfo->aConstraintUsage[idx4].omit = 1; - pIdxInfo->aConstraintUsage[idx4].argvIndex = 1; - if( idx5>=0 ){ - pIdxInfo->aConstraintUsage[idx5].omit = 1; - pIdxInfo->aConstraintUsage[idx5].argvIndex = 2; + pIdxInfo->aConstraintUsage[idxPath].omit = 1; + pIdxInfo->aConstraintUsage[idxPath].argvIndex = 1; + if( idxDir>=0 ){ + pIdxInfo->aConstraintUsage[idxDir].omit = 1; + pIdxInfo->aConstraintUsage[idxDir].argvIndex = 2; pIdxInfo->idxNum = 2; pIdxInfo->estimatedCost = 10.0; }else{ @@ -888,7 +931,8 @@ static int fsdirRegister(sqlite3 *db){ 0, /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ - 0 /* xRollbackTo */ + 0, /* xRollbackTo */ + 0, /* xShadowName */ }; int rc = sqlite3_create_module(db, "fsdir", &fsdirModule, 0); diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 85b1143..a5b4549 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -1994,6 +1994,9 @@ static int jsonEachConnect( #define JEACH_PARENT 5 #define JEACH_FULLKEY 6 #define JEACH_PATH 7 +/* The xBestIndex method assumes that the JSON and ROOT columns are +** the last two columns in the table. Should this ever changes, be +** sure to update the xBestIndex method. */ #define JEACH_JSON 8 #define JEACH_ROOT 9 @@ -2251,35 +2254,54 @@ static int jsonEachBestIndex( sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo ){ - int i; - int jsonIdx = -1; - int rootIdx = -1; + int i; /* Loop counter or computed array index */ + int aIdx[2]; /* Index of constraints for JSON and ROOT */ + int unusableMask = 0; /* Mask of unusable JSON and ROOT constraints */ + int idxMask = 0; /* Mask of usable == constraints JSON and ROOT */ const struct sqlite3_index_constraint *pConstraint; + /* This implementation assumes that JSON and ROOT are the last two + ** columns in the table */ + assert( JEACH_ROOT == JEACH_JSON+1 ); UNUSED_PARAM(tab); + aIdx[0] = aIdx[1] = -1; pConstraint = pIdxInfo->aConstraint; for(i=0; inConstraint; i++, pConstraint++){ - if( pConstraint->usable==0 ) continue; - if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; - switch( pConstraint->iColumn ){ - case JEACH_JSON: jsonIdx = i; break; - case JEACH_ROOT: rootIdx = i; break; - default: /* no-op */ break; + int iCol; + int iMask; + if( pConstraint->iColumn < JEACH_JSON ) continue; + iCol = pConstraint->iColumn - JEACH_JSON; + assert( iCol==0 || iCol==1 ); + iMask = 1 << iCol; + if( pConstraint->usable==0 ){ + unusableMask |= iMask; + }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + aIdx[iCol] = i; + idxMask |= iMask; } } - if( jsonIdx<0 ){ + if( (unusableMask & ~idxMask)!=0 ){ + /* If there are any unusable constraints on JSON or ROOT, then reject + ** this entire plan */ + return SQLITE_CONSTRAINT; + } + if( aIdx[0]<0 ){ + /* No JSON input. Leave estimatedCost at the huge value that it was + ** initialized to to discourage the query planner from selecting this + ** plan. */ pIdxInfo->idxNum = 0; - pIdxInfo->estimatedCost = 1e99; }else{ pIdxInfo->estimatedCost = 1.0; - pIdxInfo->aConstraintUsage[jsonIdx].argvIndex = 1; - pIdxInfo->aConstraintUsage[jsonIdx].omit = 1; - if( rootIdx<0 ){ - pIdxInfo->idxNum = 1; + i = aIdx[0]; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + pIdxInfo->aConstraintUsage[i].omit = 1; + if( aIdx[1]<0 ){ + pIdxInfo->idxNum = 1; /* Only JSON supplied. Plan 1 */ }else{ - pIdxInfo->aConstraintUsage[rootIdx].argvIndex = 2; - pIdxInfo->aConstraintUsage[rootIdx].omit = 1; - pIdxInfo->idxNum = 3; + i = aIdx[1]; + pIdxInfo->aConstraintUsage[i].argvIndex = 2; + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->idxNum = 3; /* Both JSON and ROOT are supplied. Plan 3 */ } } return SQLITE_OK; @@ -2388,7 +2410,8 @@ static sqlite3_module jsonEachModule = { 0, /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ - 0 /* xRollbackTo */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ }; /* The methods of the json_tree virtual table. */ @@ -2415,7 +2438,8 @@ static sqlite3_module jsonTreeModule = { 0, /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ - 0 /* xRollbackTo */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ }; #endif /* SQLITE_OMIT_VIRTUALTABLE */ diff --git a/ext/misc/memstat.c b/ext/misc/memstat.c new file mode 100644 index 0000000..dcd5742 --- /dev/null +++ b/ext/misc/memstat.c @@ -0,0 +1,428 @@ +/* +** 2018-09-27 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file demonstrates an eponymous virtual table that returns information +** from sqlite3_status64() and sqlite3_db_status(). +** +** Usage example: +** +** .load ./memstat +** .mode quote +** .header on +** SELECT * FROM memstat; +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_MEMSTATVTAB) +#if !defined(SQLITEINT_H) +#include "sqlite3ext.h" +#endif +SQLITE_EXTENSION_INIT1 +#include +#include + +#ifndef SQLITE_OMIT_VIRTUALTABLE + +/* memstat_vtab is a subclass of sqlite3_vtab which will +** serve as the underlying representation of a memstat virtual table +*/ +typedef struct memstat_vtab memstat_vtab; +struct memstat_vtab { + sqlite3_vtab base; /* Base class - must be first */ + sqlite3 *db; /* Database connection for this memstat vtab */ +}; + +/* memstat_cursor is a subclass of sqlite3_vtab_cursor which will +** serve as the underlying representation of a cursor that scans +** over rows of the result +*/ +typedef struct memstat_cursor memstat_cursor; +struct memstat_cursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + sqlite3 *db; /* Database connection for this cursor */ + int iRowid; /* Current row in aMemstatColumn[] */ + int iDb; /* Which schema we are looking at */ + int nDb; /* Number of schemas */ + char **azDb; /* Names of all schemas */ + sqlite3_int64 aVal[2]; /* Result values */ +}; + +/* +** The memstatConnect() method is invoked to create a new +** memstat_vtab that describes the memstat virtual table. +** +** Think of this routine as the constructor for memstat_vtab objects. +** +** All this routine needs to do is: +** +** (1) Allocate the memstat_vtab object and initialize all fields. +** +** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the +** result set of queries against memstat will look like. +*/ +static int memstatConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + memstat_vtab *pNew; + int rc; + +/* Column numbers */ +#define MSV_COLUMN_NAME 0 /* Name of quantity being measured */ +#define MSV_COLUMN_SCHEMA 1 /* schema name */ +#define MSV_COLUMN_VALUE 2 /* Current value */ +#define MSV_COLUMN_HIWTR 3 /* Highwater mark */ + + rc = sqlite3_declare_vtab(db,"CREATE TABLE x(name,schema,value,hiwtr)"); + if( rc==SQLITE_OK ){ + pNew = sqlite3_malloc( sizeof(*pNew) ); + *ppVtab = (sqlite3_vtab*)pNew; + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + pNew->db = db; + } + return rc; +} + +/* +** This method is the destructor for memstat_cursor objects. +*/ +static int memstatDisconnect(sqlite3_vtab *pVtab){ + sqlite3_free(pVtab); + return SQLITE_OK; +} + +/* +** Constructor for a new memstat_cursor object. +*/ +static int memstatOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + memstat_cursor *pCur; + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + pCur->db = ((memstat_vtab*)p)->db; + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* +** Clear all the schema names from a cursor +*/ +static void memstatClearSchema(memstat_cursor *pCur){ + int i; + if( pCur->azDb==0 ) return; + for(i=0; inDb; i++){ + sqlite3_free(pCur->azDb[i]); + } + sqlite3_free(pCur->azDb); + pCur->azDb = 0; + pCur->nDb = 0; +} + +/* +** Fill in the azDb[] array for the cursor. +*/ +static int memstatFindSchemas(memstat_cursor *pCur){ + sqlite3_stmt *pStmt = 0; + int rc; + if( pCur->nDb ) return SQLITE_OK; + rc = sqlite3_prepare_v2(pCur->db, "PRAGMA database_list", -1, &pStmt, 0); + if( rc ){ + sqlite3_finalize(pStmt); + return rc; + } + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + char **az, *z; + az = sqlite3_realloc(pCur->azDb, sizeof(char*)*(pCur->nDb+1)); + if( az==0 ){ + memstatClearSchema(pCur); + return SQLITE_NOMEM; + } + pCur->azDb = az; + z = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 1)); + if( z==0 ){ + memstatClearSchema(pCur); + return SQLITE_NOMEM; + } + pCur->azDb[pCur->nDb] = z; + pCur->nDb++; + } + sqlite3_finalize(pStmt); + return SQLITE_OK; +} + + +/* +** Destructor for a memstat_cursor. +*/ +static int memstatClose(sqlite3_vtab_cursor *cur){ + memstat_cursor *pCur = (memstat_cursor*)cur; + memstatClearSchema(pCur); + sqlite3_free(cur); + return SQLITE_OK; +} + + +/* +** Allowed values for aMemstatColumn[].eType +*/ +#define MSV_GSTAT 0 /* sqlite3_status64() information */ +#define MSV_DB 1 /* sqlite3_db_status() information */ +#define MSV_ZIPVFS 2 /* ZIPVFS file-control with 64-bit return */ + +/* +** An array of quantities that can be measured and reported by +** this virtual table +*/ +static const struct MemstatColumns { + const char *zName; /* Symbolic name */ + unsigned char eType; /* Type of interface */ + unsigned char mNull; /* Bitmask of which columns are NULL */ + /* 2: dbname, 4: current, 8: hiwtr */ + int eOp; /* Opcode */ +} aMemstatColumn[] = { + {"MEMORY_USED", MSV_GSTAT, 2, SQLITE_STATUS_MEMORY_USED }, + {"MALLOC_SIZE", MSV_GSTAT, 6, SQLITE_STATUS_MALLOC_SIZE }, + {"MALLOC_COUNT", MSV_GSTAT, 2, SQLITE_STATUS_MALLOC_COUNT }, + {"PAGECACHE_USED", MSV_GSTAT, 2, SQLITE_STATUS_PAGECACHE_USED }, + {"PAGECACHE_OVERFLOW", MSV_GSTAT, 2, SQLITE_STATUS_PAGECACHE_OVERFLOW }, + {"PAGECACHE_SIZE", MSV_GSTAT, 6, SQLITE_STATUS_PAGECACHE_SIZE }, + {"PARSER_STACK", MSV_GSTAT, 6, SQLITE_STATUS_PARSER_STACK }, + {"DB_LOOKASIDE_USED", MSV_DB, 2, SQLITE_DBSTATUS_LOOKASIDE_USED }, + {"DB_LOOKASIDE_HIT", MSV_DB, 6, SQLITE_DBSTATUS_LOOKASIDE_HIT }, + {"DB_LOOKASIDE_MISS_SIZE", MSV_DB, 6, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE}, + {"DB_LOOKASIDE_MISS_FULL", MSV_DB, 6, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL}, + {"DB_CACHE_USED", MSV_DB, 10, SQLITE_DBSTATUS_CACHE_USED }, +#if SQLITE_VERSION_NUMBER >= 3140000 + {"DB_CACHE_USED_SHARED", MSV_DB, 10, SQLITE_DBSTATUS_CACHE_USED_SHARED }, +#endif + {"DB_SCHEMA_USED", MSV_DB, 10, SQLITE_DBSTATUS_SCHEMA_USED }, + {"DB_STMT_USED", MSV_DB, 10, SQLITE_DBSTATUS_STMT_USED }, + {"DB_CACHE_HIT", MSV_DB, 10, SQLITE_DBSTATUS_CACHE_HIT }, + {"DB_CACHE_MISS", MSV_DB, 10, SQLITE_DBSTATUS_CACHE_MISS }, + {"DB_CACHE_WRITE", MSV_DB, 10, SQLITE_DBSTATUS_CACHE_WRITE }, +#if SQLITE_VERSION_NUMBER >= 3230000 + {"DB_CACHE_SPILL", MSV_DB, 10, SQLITE_DBSTATUS_CACHE_SPILL }, +#endif + {"DB_DEFERRED_FKS", MSV_DB, 10, SQLITE_DBSTATUS_DEFERRED_FKS }, +#ifdef SQLITE_ENABLE_ZIPVFS + {"ZIPVFS_CACHE_USED", MSV_ZIPVFS, 8, 231454 }, + {"ZIPVFS_CACHE_HIT", MSV_ZIPVFS, 8, 231455 }, + {"ZIPVFS_CACHE_MISS", MSV_ZIPVFS, 8, 231456 }, + {"ZIPVFS_CACHE_WRITE", MSV_ZIPVFS, 8, 231457 }, + {"ZIPVFS_DIRECT_READ", MSV_ZIPVFS, 8, 231458 }, + {"ZIPVFS_DIRECT_BYTES", MSV_ZIPVFS, 8, 231459 }, +#endif /* SQLITE_ENABLE_ZIPVFS */ +}; +#define MSV_NROW (sizeof(aMemstatColumn)/sizeof(aMemstatColumn[0])) + +/* +** Advance a memstat_cursor to its next row of output. +*/ +static int memstatNext(sqlite3_vtab_cursor *cur){ + memstat_cursor *pCur = (memstat_cursor*)cur; + int i; + assert( pCur->iRowid<=MSV_NROW ); + while(1){ + i = (int)pCur->iRowid - 1; + if( i<0 || (aMemstatColumn[i].mNull & 2)!=0 || (++pCur->iDb)>=pCur->nDb ){ + pCur->iRowid++; + if( pCur->iRowid>MSV_NROW ) return SQLITE_OK; /* End of the table */ + pCur->iDb = 0; + i++; + } + pCur->aVal[0] = 0; + pCur->aVal[1] = 0; + switch( aMemstatColumn[i].eType ){ + case MSV_GSTAT: { + if( sqlite3_libversion_number()>=3010000 ){ + sqlite3_status64(aMemstatColumn[i].eOp, + &pCur->aVal[0], &pCur->aVal[1],0); + }else{ + int xCur, xHiwtr; + sqlite3_status(aMemstatColumn[i].eOp, &xCur, &xHiwtr, 0); + pCur->aVal[0] = xCur; + pCur->aVal[1] = xHiwtr; + } + break; + } + case MSV_DB: { + int xCur, xHiwtr; + sqlite3_db_status(pCur->db, aMemstatColumn[i].eOp, &xCur, &xHiwtr, 0); + pCur->aVal[0] = xCur; + pCur->aVal[1] = xHiwtr; + break; + } + case MSV_ZIPVFS: { + int rc; + rc = sqlite3_file_control(pCur->db, pCur->azDb[pCur->iDb], + aMemstatColumn[i].eOp, (void*)&pCur->aVal[0]); + if( rc!=SQLITE_OK ) continue; + break; + } + } + break; + } + return SQLITE_OK; +} + + +/* +** Return values of columns for the row at which the memstat_cursor +** is currently pointing. +*/ +static int memstatColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int iCol /* Which column to return */ +){ + memstat_cursor *pCur = (memstat_cursor*)cur; + int i; + assert( pCur->iRowid>0 && pCur->iRowid<=MSV_NROW ); + i = (int)pCur->iRowid - 1; + if( (aMemstatColumn[i].mNull & (1<azDb[pCur->iDb], -1, 0); + break; + } + case MSV_COLUMN_VALUE: { + sqlite3_result_int64(ctx, pCur->aVal[0]); + break; + } + case MSV_COLUMN_HIWTR: { + sqlite3_result_int64(ctx, pCur->aVal[1]); + break; + } + } + return SQLITE_OK; +} + +/* +** Return the rowid for the current row. In this implementation, the +** rowid is the same as the output value. +*/ +static int memstatRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + memstat_cursor *pCur = (memstat_cursor*)cur; + *pRowid = pCur->iRowid*1000 + pCur->iDb; + return SQLITE_OK; +} + +/* +** Return TRUE if the cursor has been moved off of the last +** row of output. +*/ +static int memstatEof(sqlite3_vtab_cursor *cur){ + memstat_cursor *pCur = (memstat_cursor*)cur; + return pCur->iRowid>MSV_NROW; +} + +/* +** This method is called to "rewind" the memstat_cursor object back +** to the first row of output. This method is always called at least +** once prior to any call to memstatColumn() or memstatRowid() or +** memstatEof(). +*/ +static int memstatFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + memstat_cursor *pCur = (memstat_cursor *)pVtabCursor; + int rc = memstatFindSchemas(pCur); + if( rc ) return rc; + pCur->iRowid = 0; + pCur->iDb = 0; + return memstatNext(pVtabCursor); +} + +/* +** SQLite will invoke this method one or more times while planning a query +** that uses the memstat virtual table. This routine needs to create +** a query plan for each invocation and compute an estimated cost for that +** plan. +*/ +static int memstatBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + pIdxInfo->estimatedCost = (double)500; + pIdxInfo->estimatedRows = 500; + return SQLITE_OK; +} + +/* +** This following structure defines all the methods for the +** memstat virtual table. +*/ +static sqlite3_module memstatModule = { + 0, /* iVersion */ + 0, /* xCreate */ + memstatConnect, /* xConnect */ + memstatBestIndex, /* xBestIndex */ + memstatDisconnect, /* xDisconnect */ + 0, /* xDestroy */ + memstatOpen, /* xOpen - open a cursor */ + memstatClose, /* xClose - close a cursor */ + memstatFilter, /* xFilter - configure scan constraints */ + memstatNext, /* xNext - advance a cursor */ + memstatEof, /* xEof - check for end of scan */ + memstatColumn, /* xColumn - read data */ + memstatRowid, /* xRowid - read data */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindMethod */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0, /* xShadowName */ +}; + +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +int sqlite3MemstatVtabInit(sqlite3 *db){ + int rc = SQLITE_OK; +#ifndef SQLITE_OMIT_VIRTUALTABLE + rc = sqlite3_create_module(db, "sqlite_memstat", &memstatModule, 0); +#endif + return rc; +} + +#ifndef SQLITE_CORE +#ifdef _WIN32 +__declspec(dllexport) +#endif +int sqlite3_memstat_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc = SQLITE_OK; + SQLITE_EXTENSION_INIT2(pApi); +#ifndef SQLITE_OMIT_VIRTUALTABLE + rc = sqlite3MemstatVtabInit(db); +#endif + return rc; +} +#endif /* SQLITE_CORE */ +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_MEMSTATVTAB) */ diff --git a/ext/misc/series.c b/ext/misc/series.c index 3df0a37..86309dd 100644 --- a/ext/misc/series.c +++ b/ext/misc/series.c @@ -313,44 +313,45 @@ static int seriesBestIndex( sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo ){ - int i; /* Loop over constraints */ + int i, j; /* Loop over constraints */ int idxNum = 0; /* The query plan bitmask */ - int startIdx = -1; /* Index of the start= constraint, or -1 if none */ - int stopIdx = -1; /* Index of the stop= constraint, or -1 if none */ - int stepIdx = -1; /* Index of the step= constraint, or -1 if none */ + int unusableMask = 0; /* Mask of unusable constraints */ int nArg = 0; /* Number of arguments that seriesFilter() expects */ - + int aIdx[3]; /* Constraints on start, stop, and step */ const struct sqlite3_index_constraint *pConstraint; + + /* This implementation assumes that the start, stop, and step columns + ** are the last three columns in the virtual table. */ + assert( SERIES_COLUMN_STOP == SERIES_COLUMN_START+1 ); + assert( SERIES_COLUMN_STEP == SERIES_COLUMN_START+2 ); + aIdx[0] = aIdx[1] = aIdx[2] = -1; pConstraint = pIdxInfo->aConstraint; for(i=0; inConstraint; i++, pConstraint++){ - if( pConstraint->usable==0 ) continue; - if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; - switch( pConstraint->iColumn ){ - case SERIES_COLUMN_START: - startIdx = i; - idxNum |= 1; - break; - case SERIES_COLUMN_STOP: - stopIdx = i; - idxNum |= 2; - break; - case SERIES_COLUMN_STEP: - stepIdx = i; - idxNum |= 4; - break; + int iCol; /* 0 for start, 1 for stop, 2 for step */ + int iMask; /* bitmask for those column */ + if( pConstraint->iColumniColumn - SERIES_COLUMN_START; + assert( iCol>=0 && iCol<=2 ); + iMask = 1 << iCol; + if( pConstraint->usable==0 ){ + unusableMask |= iMask; + continue; + }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + idxNum |= iMask; + aIdx[iCol] = i; } } - if( startIdx>=0 ){ - pIdxInfo->aConstraintUsage[startIdx].argvIndex = ++nArg; - pIdxInfo->aConstraintUsage[startIdx].omit= !SQLITE_SERIES_CONSTRAINT_VERIFY; + for(i=0; i<3; i++){ + if( (j = aIdx[i])>=0 ){ + pIdxInfo->aConstraintUsage[j].argvIndex = ++nArg; + pIdxInfo->aConstraintUsage[j].omit = !SQLITE_SERIES_CONSTRAINT_VERIFY; + } } - if( stopIdx>=0 ){ - pIdxInfo->aConstraintUsage[stopIdx].argvIndex = ++nArg; - pIdxInfo->aConstraintUsage[stopIdx].omit = !SQLITE_SERIES_CONSTRAINT_VERIFY; - } - if( stepIdx>=0 ){ - pIdxInfo->aConstraintUsage[stepIdx].argvIndex = ++nArg; - pIdxInfo->aConstraintUsage[stepIdx].omit = !SQLITE_SERIES_CONSTRAINT_VERIFY; + if( (unusableMask & ~idxNum)!=0 ){ + /* The start, stop, and step columns are inputs. Therefore if there + ** are unusable constraints on any of start, stop, or step then + ** this plan is unusable */ + return SQLITE_CONSTRAINT; } if( (idxNum & 3)==3 ){ /* Both start= and stop= boundaries are available. This is the @@ -365,7 +366,6 @@ static int seriesBestIndex( /* If either boundary is missing, we have to generate a huge span ** of numbers. Make this case very expensive so that the query ** planner will work hard to avoid it. */ - pIdxInfo->estimatedCost = (double)2147483647; pIdxInfo->estimatedRows = 2147483647; } pIdxInfo->idxNum = idxNum; diff --git a/ext/misc/sha1.c b/ext/misc/sha1.c index e2843bd..886b1db 100644 --- a/ext/misc/sha1.c +++ b/ext/misc/sha1.c @@ -10,7 +10,7 @@ ** ****************************************************************************** ** -** This SQLite extension implements a functions that compute SHA1 hashes. +** This SQLite extension implements functions that compute SHA1 hashes. ** Two SQL functions are implemented: ** ** sha1(X) diff --git a/ext/misc/shathree.c b/ext/misc/shathree.c index e5c9540..e35fa49 100644 --- a/ext/misc/shathree.c +++ b/ext/misc/shathree.c @@ -10,7 +10,7 @@ ** ****************************************************************************** ** -** This SQLite extension implements a functions that compute SHA1 hashes. +** This SQLite extension implements functions that compute SHA3 hashes. ** Two SQL functions are implemented: ** ** sha3(X,SIZE) diff --git a/ext/misc/spellfix.c b/ext/misc/spellfix.c index faceea1..81bef13 100644 --- a/ext/misc/spellfix.c +++ b/ext/misc/spellfix.c @@ -1295,6 +1295,9 @@ typedef struct Transliteration Transliteration; struct Transliteration { unsigned short int cFrom; unsigned char cTo0, cTo1, cTo2, cTo3; +#ifdef SQLITE_SPELLFIX_5BYTE_MAPPINGS + unsigned char cTo4; +#endif }; /* @@ -1708,7 +1711,11 @@ static const Transliteration *spellfixFindTranslit(int c, int *pxTop){ ** should be freed by the caller. */ static unsigned char *transliterate(const unsigned char *zIn, int nIn){ +#ifdef SQLITE_SPELLFIX_5BYTE_MAPPINGS + unsigned char *zOut = sqlite3_malloc64( nIn*5 + 1 ); +#else unsigned char *zOut = sqlite3_malloc64( nIn*4 + 1 ); +#endif int c, sz, nOut; if( zOut==0 ) return 0; nOut = 0; @@ -1732,6 +1739,11 @@ static unsigned char *transliterate(const unsigned char *zIn, int nIn){ zOut[nOut++] = tbl[x].cTo2; if( tbl[x].cTo3 ){ zOut[nOut++] = tbl[x].cTo3; +#ifdef SQLITE_SPELLFIX_5BYTE_MAPPINGS + if( tbl[x].cTo4 ){ + zOut[nOut++] = tbl[x].cTo4; + } +#endif /* SQLITE_SPELLFIX_5BYTE_MAPPINGS */ } } } diff --git a/ext/misc/stmt.c b/ext/misc/stmt.c index dbaa0bd..d2b33e7 100644 --- a/ext/misc/stmt.c +++ b/ext/misc/stmt.c @@ -266,6 +266,7 @@ static sqlite3_module stmtModule = { 0, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ + 0, /* xShadowName */ }; #endif /* SQLITE_OMIT_VIRTUALTABLE */ diff --git a/ext/misc/templatevtab.c b/ext/misc/templatevtab.c index 95b5f60..d7efa2b 100644 --- a/ext/misc/templatevtab.c +++ b/ext/misc/templatevtab.c @@ -248,7 +248,8 @@ static sqlite3_module templatevtabModule = { /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ 0, - /* xRollbackTo */ 0 + /* xRollbackTo */ 0, + /* xShadowName */ 0 }; diff --git a/ext/misc/unionvtab.c b/ext/misc/unionvtab.c index 94a5c8f..2d2053c 100644 --- a/ext/misc/unionvtab.c +++ b/ext/misc/unionvtab.c @@ -1350,7 +1350,8 @@ static int createUnionVtab(sqlite3 *db){ 0, /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ - 0 /* xRollbackTo */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ }; int rc; diff --git a/ext/misc/vtablog.c b/ext/misc/vtablog.c index 9e03fd4..424b345 100644 --- a/ext/misc/vtablog.c +++ b/ext/misc/vtablog.c @@ -492,6 +492,7 @@ static sqlite3_module vtablogModule = { 0, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ + 0, /* xShadowName */ }; #ifdef _WIN32 diff --git a/ext/misc/zipfile.c b/ext/misc/zipfile.c index 9f2258e..e57dc38 100644 --- a/ext/misc/zipfile.c +++ b/ext/misc/zipfile.c @@ -1296,25 +1296,26 @@ static int zipfileBestIndex( sqlite3_index_info *pIdxInfo ){ int i; + int idx = -1; + int unusable = 0; for(i=0; inConstraint; i++){ const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i]; - if( pCons->usable==0 ) continue; - if( pCons->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; if( pCons->iColumn!=ZIPFILE_F_COLUMN_IDX ) continue; - break; + if( pCons->usable==0 ){ + unusable = 1; + }else if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + idx = i; + } } - - if( inConstraint ){ - pIdxInfo->aConstraintUsage[i].argvIndex = 1; - pIdxInfo->aConstraintUsage[i].omit = 1; + if( idx>=0 ){ + pIdxInfo->aConstraintUsage[idx].argvIndex = 1; + pIdxInfo->aConstraintUsage[idx].omit = 1; pIdxInfo->estimatedCost = 1000.0; pIdxInfo->idxNum = 1; - }else{ - pIdxInfo->estimatedCost = (double)(((sqlite3_int64)1) << 50); - pIdxInfo->idxNum = 0; + }else if( unusable ){ + return SQLITE_CONSTRAINT; } - return SQLITE_OK; } diff --git a/ext/rbu/rbu1.test b/ext/rbu/rbu1.test index 1d16c1c..7ec075b 100644 --- a/ext/rbu/rbu1.test +++ b/ext/rbu/rbu1.test @@ -670,4 +670,3 @@ foreach {tn3 create_vfs destroy_vfs} { finish_test - diff --git a/ext/rbu/rbu10.test b/ext/rbu/rbu10.test index 4b398b6..a7c63cf 100644 --- a/ext/rbu/rbu10.test +++ b/ext/rbu/rbu10.test @@ -185,4 +185,3 @@ do_test 4.3 { finish_test - diff --git a/ext/rbu/rbu11.test b/ext/rbu/rbu11.test index fdc701a..5a4219b 100644 --- a/ext/rbu/rbu11.test +++ b/ext/rbu/rbu11.test @@ -195,4 +195,3 @@ do_test 4.7.2 { } {1 {SQLITE_ERROR - rbu_state mismatch error}} finish_test - diff --git a/ext/rbu/rbu12.test b/ext/rbu/rbu12.test index a83d089..7816bfe 100644 --- a/ext/rbu/rbu12.test +++ b/ext/rbu/rbu12.test @@ -232,4 +232,3 @@ do_multiclient_test tn { } finish_test - diff --git a/ext/rbu/rbu13.test b/ext/rbu/rbu13.test index ad67a98..624c587 100644 --- a/ext/rbu/rbu13.test +++ b/ext/rbu/rbu13.test @@ -62,4 +62,3 @@ do_execsql_test 1.4 { finish_test - diff --git a/ext/rbu/rbu14.test b/ext/rbu/rbu14.test index d4f97ac..07f6784 100644 --- a/ext/rbu/rbu14.test +++ b/ext/rbu/rbu14.test @@ -92,4 +92,3 @@ foreach {tn schema} { finish_test - diff --git a/ext/rbu/rbu3.test b/ext/rbu/rbu3.test index 995b312..da87561 100644 --- a/ext/rbu/rbu3.test +++ b/ext/rbu/rbu3.test @@ -203,5 +203,3 @@ do_test 5.3 { do_test 6.1 { sqlite3rbu_internal_test } {} finish_test - - diff --git a/ext/rbu/rbu5.test b/ext/rbu/rbu5.test index 8e4ae8c..3696dfb 100644 --- a/ext/rbu/rbu5.test +++ b/ext/rbu/rbu5.test @@ -300,7 +300,3 @@ foreach {tn idx} { finish_test - - - - diff --git a/ext/rbu/rbu6.test b/ext/rbu/rbu6.test index f057215..bb5b17f 100644 --- a/ext/rbu/rbu6.test +++ b/ext/rbu/rbu6.test @@ -100,4 +100,3 @@ for {set nStep 8} {$nStep < 20} {incr nStep} { finish_test - diff --git a/ext/rbu/rbu7.test b/ext/rbu/rbu7.test index f773c9e..1e3bc17 100644 --- a/ext/rbu/rbu7.test +++ b/ext/rbu/rbu7.test @@ -106,5 +106,3 @@ foreach {tn tbl} { } finish_test - - diff --git a/ext/rbu/rbu8.test b/ext/rbu/rbu8.test index 75edd4e..c0ccd8c 100644 --- a/ext/rbu/rbu8.test +++ b/ext/rbu/rbu8.test @@ -72,4 +72,3 @@ integrity_check 1.3.3 finish_test - diff --git a/ext/rbu/rbu9.test b/ext/rbu/rbu9.test index 3ce649d..0efdc1d 100644 --- a/ext/rbu/rbu9.test +++ b/ext/rbu/rbu9.test @@ -125,4 +125,3 @@ foreach {tn idx} { finish_test - diff --git a/ext/rbu/rbuA.test b/ext/rbu/rbuA.test index 286194c..642caca 100644 --- a/ext/rbu/rbuA.test +++ b/ext/rbu/rbuA.test @@ -80,4 +80,3 @@ do_test 2.2 { finish_test - diff --git a/ext/rbu/rbuB.test b/ext/rbu/rbuB.test index c007fb7..ece51c3 100644 --- a/ext/rbu/rbuB.test +++ b/ext/rbu/rbuB.test @@ -59,4 +59,3 @@ sqlite3_shutdown test_sqlite3_log sqlite3_initialize finish_test - diff --git a/ext/rbu/rbuC.test b/ext/rbu/rbuC.test index 89fd015..ff3d4d5 100644 --- a/ext/rbu/rbuC.test +++ b/ext/rbu/rbuC.test @@ -139,4 +139,3 @@ foreach {tn schema} { finish_test - diff --git a/ext/rbu/rbucollate.test b/ext/rbu/rbucollate.test index 3b3b022..ccc0976 100644 --- a/ext/rbu/rbucollate.test +++ b/ext/rbu/rbucollate.test @@ -60,4 +60,3 @@ do_test 1.2 { #forcedelete testrbu.db finish_test - diff --git a/ext/rbu/rbucrash.test b/ext/rbu/rbucrash.test index f422181..34ac2c8 100644 --- a/ext/rbu/rbucrash.test +++ b/ext/rbu/rbucrash.test @@ -145,4 +145,3 @@ for {set nPre 0} {$nPre < $rbu_num_steps} {incr nPre} { } finish_test - diff --git a/ext/rbu/rbucrash2.test b/ext/rbu/rbucrash2.test index 5f2ba60..9ff6eba 100644 --- a/ext/rbu/rbucrash2.test +++ b/ext/rbu/rbucrash2.test @@ -103,4 +103,3 @@ for {set x 1} {$x < 2} {incr x} { } finish_test - diff --git a/ext/rbu/rbudiff.test b/ext/rbu/rbudiff.test index 6f6af82..965ce29 100644 --- a/ext/rbu/rbudiff.test +++ b/ext/rbu/rbudiff.test @@ -300,4 +300,3 @@ tablE t1 USING FTs5(c); finish_test - diff --git a/ext/rbu/rbudor.test b/ext/rbu/rbudor.test index dcee7ac..df4d934 100644 --- a/ext/rbu/rbudor.test +++ b/ext/rbu/rbudor.test @@ -56,4 +56,3 @@ do_execsql_test 1.4 { } [list 1 $bigA 2 $bigB] finish_test - diff --git a/ext/rbu/rbufault.test b/ext/rbu/rbufault.test index 3e78b6e..247a991 100644 --- a/ext/rbu/rbufault.test +++ b/ext/rbu/rbufault.test @@ -234,4 +234,3 @@ foreach {tn2 setup sql expect} { } finish_test - diff --git a/ext/rbu/rbufault2.test b/ext/rbu/rbufault2.test index ec89397..5b006f7 100644 --- a/ext/rbu/rbufault2.test +++ b/ext/rbu/rbufault2.test @@ -55,4 +55,3 @@ do_faultsim_test 1 -faults oom* -prep { finish_test - diff --git a/ext/rbu/rbufault3.test b/ext/rbu/rbufault3.test index 4fd202d..5d44885 100644 --- a/ext/rbu/rbufault3.test +++ b/ext/rbu/rbufault3.test @@ -95,4 +95,3 @@ foreach {fault errlist} { } finish_test - diff --git a/ext/rbu/rbufault4.test b/ext/rbu/rbufault4.test index fe6cc90..551b8b2 100644 --- a/ext/rbu/rbufault4.test +++ b/ext/rbu/rbufault4.test @@ -63,4 +63,3 @@ for {set tn 1} {1} {incr tn} { finish_test - diff --git a/ext/rbu/rbufts.test b/ext/rbu/rbufts.test index c2821a9..95d4e75 100644 --- a/ext/rbu/rbufts.test +++ b/ext/rbu/rbufts.test @@ -131,4 +131,3 @@ do_test 3.3 { finish_test - diff --git a/ext/rbu/rbumulti.test b/ext/rbu/rbumulti.test index 59c6538..5579a5f 100644 --- a/ext/rbu/rbumulti.test +++ b/ext/rbu/rbumulti.test @@ -172,4 +172,3 @@ for {set i 0} {$i<=3} {incr i} { finish_test - diff --git a/ext/rbu/rbuprogress.test b/ext/rbu/rbuprogress.test index 078b3b0..db479e3 100644 --- a/ext/rbu/rbuprogress.test +++ b/ext/rbu/rbuprogress.test @@ -416,4 +416,3 @@ foreach {bReopen} { 0 1 } { finish_test - diff --git a/ext/rbu/rburesume.test b/ext/rbu/rburesume.test index d03894e..a2cf9bc 100644 --- a/ext/rbu/rburesume.test +++ b/ext/rbu/rburesume.test @@ -251,4 +251,3 @@ for {set n 1} {$n < 5000} {incr n} { } finish_test - diff --git a/ext/rbu/rbusave.test b/ext/rbu/rbusave.test index 1bb71a8..210d7b5 100644 --- a/ext/rbu/rbusave.test +++ b/ext/rbu/rbusave.test @@ -102,4 +102,3 @@ do_execsql_test 1.5 { } {1 one 1 3 3 3 4 4 4 1 one 1 3 3 3 4 4 4} finish_test - diff --git a/ext/rbu/rbusplit.test b/ext/rbu/rbusplit.test index 678f388..34fef38 100644 --- a/ext/rbu/rbusplit.test +++ b/ext/rbu/rbusplit.test @@ -92,4 +92,3 @@ foreach {tn cmd} { } finish_test - diff --git a/ext/rbu/rbutemplimit.test b/ext/rbu/rbutemplimit.test index 274f870..9397b56 100644 --- a/ext/rbu/rbutemplimit.test +++ b/ext/rbu/rbutemplimit.test @@ -126,4 +126,3 @@ do_test 1.6.1 { do_test 1.6.2 { info commands rbu } {} finish_test - diff --git a/ext/rbu/rbuvacuum.test b/ext/rbu/rbuvacuum.test index dba0ef3..1785f52 100644 --- a/ext/rbu/rbuvacuum.test +++ b/ext/rbu/rbuvacuum.test @@ -397,4 +397,3 @@ do_test 3.5 { catch { db close } finish_test - diff --git a/ext/rbu/rbuvacuum2.test b/ext/rbu/rbuvacuum2.test index 0a1fe3d..4713580 100644 --- a/ext/rbu/rbuvacuum2.test +++ b/ext/rbu/rbuvacuum2.test @@ -232,4 +232,3 @@ do_test 6.3 { } {ok} finish_test - diff --git a/ext/rbu/sqlite3rbu.c b/ext/rbu/sqlite3rbu.c index 065b13c..cd2f96c 100644 --- a/ext/rbu/sqlite3rbu.c +++ b/ext/rbu/sqlite3rbu.c @@ -405,7 +405,8 @@ struct rbu_vfs { sqlite3_vfs *pRealVfs; /* Underlying VFS */ sqlite3_mutex *mutex; /* Mutex to protect pMain */ sqlite3rbu *pRbu; /* Owner RBU object */ - rbu_file *pMain; /* Linked list of main db files */ + rbu_file *pMain; /* List of main db files */ + rbu_file *pMainRbu; /* List of main db files with pRbu!=0 */ }; /* @@ -434,6 +435,7 @@ struct rbu_file { const char *zWal; /* Wal filename for this main db file */ rbu_file *pWalFd; /* Wal file descriptor for this main db */ rbu_file *pMainNext; /* Next MAIN_DB file */ + rbu_file *pMainRbuNext; /* Next MAIN_DB file with pRbu!=0 */ }; /* @@ -4030,6 +4032,69 @@ static int rbuUpdateTempSize(rbu_file *pFd, sqlite3_int64 nNew){ return SQLITE_OK; } +/* +** Add an item to the main-db lists, if it is not already present. +** +** There are two main-db lists. One for all file descriptors, and one +** for all file descriptors with rbu_file.pDb!=0. If the argument has +** rbu_file.pDb!=0, then it is assumed to already be present on the +** main list and is only added to the pDb!=0 list. +*/ +static void rbuMainlistAdd(rbu_file *p){ + rbu_vfs *pRbuVfs = p->pRbuVfs; + rbu_file *pIter; + assert( (p->openFlags & SQLITE_OPEN_MAIN_DB) ); + sqlite3_mutex_enter(pRbuVfs->mutex); + if( p->pRbu==0 ){ + for(pIter=pRbuVfs->pMain; pIter; pIter=pIter->pMainNext); + p->pMainNext = pRbuVfs->pMain; + pRbuVfs->pMain = p; + }else{ + for(pIter=pRbuVfs->pMainRbu; pIter && pIter!=p; pIter=pIter->pMainRbuNext){} + if( pIter==0 ){ + p->pMainRbuNext = pRbuVfs->pMainRbu; + pRbuVfs->pMainRbu = p; + } + } + sqlite3_mutex_leave(pRbuVfs->mutex); +} + +/* +** Remove an item from the main-db lists. +*/ +static void rbuMainlistRemove(rbu_file *p){ + rbu_file **pp; + sqlite3_mutex_enter(p->pRbuVfs->mutex); + for(pp=&p->pRbuVfs->pMain; *pp && *pp!=p; pp=&((*pp)->pMainNext)){} + if( *pp ) *pp = p->pMainNext; + p->pMainNext = 0; + for(pp=&p->pRbuVfs->pMainRbu; *pp && *pp!=p; pp=&((*pp)->pMainRbuNext)){} + if( *pp ) *pp = p->pMainRbuNext; + p->pMainRbuNext = 0; + sqlite3_mutex_leave(p->pRbuVfs->mutex); +} + +/* +** Given that zWal points to a buffer containing a wal file name passed to +** either the xOpen() or xAccess() VFS method, search the main-db list for +** a file-handle opened by the same database connection on the corresponding +** database file. +** +** If parameter bRbu is true, only search for file-descriptors with +** rbu_file.pDb!=0. +*/ +static rbu_file *rbuFindMaindb(rbu_vfs *pRbuVfs, const char *zWal, int bRbu){ + rbu_file *pDb; + sqlite3_mutex_enter(pRbuVfs->mutex); + if( bRbu ){ + for(pDb=pRbuVfs->pMainRbu; pDb && pDb->zWal!=zWal; pDb=pDb->pMainRbuNext){} + }else{ + for(pDb=pRbuVfs->pMain; pDb && pDb->zWal!=zWal; pDb=pDb->pMainNext){} + } + sqlite3_mutex_leave(pRbuVfs->mutex); + return pDb; +} + /* ** Close an rbu file. */ @@ -4047,17 +4112,14 @@ static int rbuVfsClose(sqlite3_file *pFile){ sqlite3_free(p->zDel); if( p->openFlags & SQLITE_OPEN_MAIN_DB ){ - rbu_file **pp; - sqlite3_mutex_enter(p->pRbuVfs->mutex); - for(pp=&p->pRbuVfs->pMain; *pp!=p; pp=&((*pp)->pMainNext)); - *pp = p->pMainNext; - sqlite3_mutex_leave(p->pRbuVfs->mutex); + rbuMainlistRemove(p); rbuUnlockShm(p); p->pReal->pMethods->xShmUnmap(p->pReal, 0); } else if( (p->openFlags & SQLITE_OPEN_DELETEONCLOSE) && p->pRbu ){ rbuUpdateTempSize(p, 0); } + assert( p->pMainNext==0 && p->pRbuVfs->pMain!=p ); /* Close the underlying file handle */ rc = p->pReal->pMethods->xClose(p->pReal); @@ -4316,6 +4378,9 @@ static int rbuVfsFileControl(sqlite3_file *pFile, int op, void *pArg){ }else if( rc==SQLITE_NOTFOUND ){ pRbu->pTargetFd = p; p->pRbu = pRbu; + if( p->openFlags & SQLITE_OPEN_MAIN_DB ){ + rbuMainlistAdd(p); + } if( p->pWalFd ) p->pWalFd->pRbu = pRbu; rc = SQLITE_OK; } @@ -4477,20 +4542,6 @@ static int rbuVfsShmUnmap(sqlite3_file *pFile, int delFlag){ return rc; } -/* -** Given that zWal points to a buffer containing a wal file name passed to -** either the xOpen() or xAccess() VFS method, return a pointer to the -** file-handle opened by the same database connection on the corresponding -** database file. -*/ -static rbu_file *rbuFindMaindb(rbu_vfs *pRbuVfs, const char *zWal){ - rbu_file *pDb; - sqlite3_mutex_enter(pRbuVfs->mutex); - for(pDb=pRbuVfs->pMain; pDb && pDb->zWal!=zWal; pDb=pDb->pMainNext){} - sqlite3_mutex_leave(pRbuVfs->mutex); - return pDb; -} - /* ** A main database named zName has just been opened. The following ** function returns a pointer to a buffer owned by SQLite that contains @@ -4569,7 +4620,7 @@ static int rbuVfsOpen( pFd->zWal = rbuMainToWal(zName, flags); } else if( flags & SQLITE_OPEN_WAL ){ - rbu_file *pDb = rbuFindMaindb(pRbuVfs, zName); + rbu_file *pDb = rbuFindMaindb(pRbuVfs, zName, 0); if( pDb ){ if( pDb->pRbu && pDb->pRbu->eStage==RBU_STAGE_OAL ){ /* This call is to open a *-wal file. Intead, open the *-oal. This @@ -4621,10 +4672,7 @@ static int rbuVfsOpen( ** mutex protected linked list of all such files. */ pFile->pMethods = &rbuvfs_io_methods; if( flags & SQLITE_OPEN_MAIN_DB ){ - sqlite3_mutex_enter(pRbuVfs->mutex); - pFd->pMainNext = pRbuVfs->pMain; - pRbuVfs->pMain = pFd; - sqlite3_mutex_leave(pRbuVfs->mutex); + rbuMainlistAdd(pFd); } }else{ sqlite3_free(pFd->zDel); @@ -4672,7 +4720,7 @@ static int rbuVfsAccess( ** file opened instead. */ if( rc==SQLITE_OK && flags==SQLITE_ACCESS_EXISTS ){ - rbu_file *pDb = rbuFindMaindb(pRbuVfs, zPath); + rbu_file *pDb = rbuFindMaindb(pRbuVfs, zPath, 1); if( pDb && pDb->pRbu && pDb->pRbu->eStage==RBU_STAGE_OAL ){ if( *pResOut ){ rc = SQLITE_CANTOPEN; diff --git a/ext/repair/test/checkindex01.test b/ext/repair/test/checkindex01.test index 2593039..97973ae 100644 --- a/ext/repair/test/checkindex01.test +++ b/ext/repair/test/checkindex01.test @@ -347,5 +347,3 @@ do_index_check_test 7.3 t7i3 { do_index_check_test 7.4 t7i4 { {} 1,1 {} 3,3 } - - diff --git a/ext/rtree/geopoly.c b/ext/rtree/geopoly.c index a34ca12..f6a31f5 100644 --- a/ext/rtree/geopoly.c +++ b/ext/rtree/geopoly.c @@ -106,14 +106,24 @@ typedef float GeoCoord; ** ** encoding (1 byte) 0=big-endian, 1=little-endian ** nvertex (3 bytes) Number of vertexes as a big-endian integer +** +** Enough space is allocated for 4 coordinates, to work around over-zealous +** warnings coming from some compiler (notably, clang). In reality, the size +** of each GeoPoly memory allocate is adjusted as necessary so that the +** GeoPoly.a[] array at the end is the appropriate size. */ typedef struct GeoPoly GeoPoly; struct GeoPoly { int nVertex; /* Number of vertexes */ unsigned char hdr[4]; /* Header for on-disk representation */ - GeoCoord a[2]; /* 2*nVertex values. X (longitude) first, then Y */ + GeoCoord a[8]; /* 2*nVertex values. X (longitude) first, then Y */ }; +/* The size of a memory allocation needed for a GeoPoly object sufficient +** to hold N coordinate pairs. +*/ +#define GEOPOLY_SZ(N) (sizeof(GeoPoly) + sizeof(GeoCoord)*2*((N)-4)) + /* ** State of a parse of a GeoJSON input. */ @@ -138,7 +148,7 @@ static void geopolySwab32(unsigned char *a){ /* Skip whitespace. Return the next non-whitespace character. */ static char geopolySkipSpace(GeoParse *p){ - while( p->z[0] && safe_isspace(p->z[0]) ) p->z++; + while( safe_isspace(p->z[0]) ) p->z++; return p->z[0]; } @@ -158,7 +168,7 @@ static int geopolyParseNumber(GeoParse *p, GeoCoord *pVal){ if( c=='0' && z[j+1]>='0' && z[j+1]<='9' ) return 0; for(;; j++){ c = z[j]; - if( c>='0' && c<='9' ) continue; + if( safe_isdigit(c) ) continue; if( c=='.' ){ if( z[j-1]=='-' ) return 0; if( seenDP ) return 0; @@ -180,7 +190,17 @@ static int geopolyParseNumber(GeoParse *p, GeoCoord *pVal){ break; } if( z[j-1]<'0' ) return 0; - if( pVal ) *pVal = (GeoCoord)atof((const char*)p->z); + if( pVal ){ +#ifdef SQLITE_AMALGAMATION + /* The sqlite3AtoF() routine is much much faster than atof(), if it + ** is available */ + double r; + (void)sqlite3AtoF((const char*)p->z, &r, j, SQLITE_UTF8); + *pVal = r; +#else + *pVal = (GeoCoord)atof((const char*)p->z); +#endif + } p->z += j; return 1; } @@ -238,12 +258,10 @@ static GeoPoly *geopolyParseJson(const unsigned char *z, int *pRc){ && s.a[1]==s.a[s.nVertex*2-1] && (s.z++, geopolySkipSpace(&s)==0) ){ - int nByte; GeoPoly *pOut; int x = 1; s.nVertex--; /* Remove the redundant vertex at the end */ - nByte = sizeof(GeoPoly) * s.nVertex*2*sizeof(GeoCoord); - pOut = sqlite3_malloc64( nByte ); + pOut = sqlite3_malloc64( GEOPOLY_SZ(s.nVertex) ); x = 1; if( pOut==0 ) goto parse_json_err; pOut->nVertex = s.nVertex; @@ -446,6 +464,27 @@ static void geopolyXformFunc( } } +/* +** Compute the area enclosed by the polygon. +** +** This routine can also be used to detect polygons that rotate in +** the wrong direction. Polygons are suppose to be counter-clockwise (CCW). +** This routine returns a negative value for clockwise (CW) polygons. +*/ +static double geopolyArea(GeoPoly *p){ + double rArea = 0.0; + int ii; + for(ii=0; iinVertex-1; ii++){ + rArea += (p->a[ii*2] - p->a[ii*2+2]) /* (x0 - x1) */ + * (p->a[ii*2+1] + p->a[ii*2+3]) /* (y0 + y1) */ + * 0.5; + } + rArea += (p->a[ii*2] - p->a[0]) /* (xN - x0) */ + * (p->a[ii*2+1] + p->a[1]) /* (yN + y0) */ + * 0.5; + return rArea; +} + /* ** Implementation of the geopoly_area(X) function. ** @@ -461,21 +500,106 @@ static void geopolyAreaFunc( ){ GeoPoly *p = geopolyFuncParam(context, argv[0], 0); if( p ){ - double rArea = 0.0; - int ii; - for(ii=0; iinVertex-1; ii++){ - rArea += (p->a[ii*2] - p->a[ii*2+2]) /* (x0 - x1) */ - * (p->a[ii*2+1] + p->a[ii*2+3]) /* (y0 + y1) */ - * 0.5; - } - rArea += (p->a[ii*2] - p->a[0]) /* (xN - x0) */ - * (p->a[ii*2+1] + p->a[1]) /* (yN + y0) */ - * 0.5; - sqlite3_result_double(context, rArea); + sqlite3_result_double(context, geopolyArea(p)); sqlite3_free(p); } } +/* +** Implementation of the geopoly_ccw(X) function. +** +** If the rotation of polygon X is clockwise (incorrect) instead of +** counter-clockwise (the correct winding order according to RFC7946) +** then reverse the order of the vertexes in polygon X. +** +** In other words, this routine returns a CCW polygon regardless of the +** winding order of its input. +** +** Use this routine to sanitize historical inputs that that sometimes +** contain polygons that wind in the wrong direction. +*/ +static void geopolyCcwFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + if( p ){ + if( geopolyArea(p)<0.0 ){ + int ii, jj; + for(ii=2, jj=p->nVertex*2 - 2; iia[ii]; + p->a[ii] = p->a[jj]; + p->a[jj] = t; + t = p->a[ii+1]; + p->a[ii+1] = p->a[jj+1]; + p->a[jj+1] = t; + } + } + sqlite3_result_blob(context, p->hdr, + 4+8*p->nVertex, SQLITE_TRANSIENT); + sqlite3_free(p); + } +} + +#define GEOPOLY_PI 3.1415926535897932385 + +/* Fast approximation for sine(X) for X between -0.5*pi and 2*pi +*/ +static double geopolySine(double r){ + assert( r>=-0.5*GEOPOLY_PI && r<=2.0*GEOPOLY_PI ); + if( r>=1.5*GEOPOLY_PI ){ + r -= 2.0*GEOPOLY_PI; + } + if( r>=0.5*GEOPOLY_PI ){ + return -geopolySine(r-GEOPOLY_PI); + }else{ + double r2 = r*r; + double r3 = r2*r; + double r5 = r3*r2; + return 0.9996949*r - 0.1656700*r3 + 0.0075134*r5; + } +} + +/* +** Function: geopoly_regular(X,Y,R,N) +** +** Construct a simple, convex, regular polygon centered at X, Y +** with circumradius R and with N sides. +*/ +static void geopolyRegularFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + double x = sqlite3_value_double(argv[0]); + double y = sqlite3_value_double(argv[1]); + double r = sqlite3_value_double(argv[2]); + int n = sqlite3_value_int(argv[3]); + int i; + GeoPoly *p; + + if( n<3 || r<=0.0 ) return; + if( n>1000 ) n = 1000; + p = sqlite3_malloc64( sizeof(*p) + (n-1)*2*sizeof(GeoCoord) ); + if( p==0 ){ + sqlite3_result_error_nomem(context); + return; + } + i = 1; + p->hdr[0] = *(unsigned char*)&i; + p->hdr[1] = 0; + p->hdr[2] = (n>>8)&0xff; + p->hdr[3] = n&0xff; + for(i=0; ia[i*2] = x - r*geopolySine(rAngle-0.5*GEOPOLY_PI); + p->a[i*2+1] = y + r*geopolySine(rAngle); + } + sqlite3_result_blob(context, p->hdr, 4+8*n, SQLITE_TRANSIENT); + sqlite3_free(p); +} + /* ** If pPoly is a polygon, compute its bounding box. Then: ** @@ -520,7 +644,7 @@ static GeoPoly *geopolyBBox( if( pRc ) *pRc = SQLITE_OK; if( aCoord==0 ){ geopolyBboxFill: - pOut = sqlite3_realloc(p, sizeof(GeoPoly)+sizeof(GeoCoord)*6); + pOut = sqlite3_realloc(p, GEOPOLY_SZ(4)); if( pOut==0 ){ sqlite3_free(p); if( context ) sqlite3_result_error_nomem(context); @@ -1548,7 +1672,16 @@ static int geopolyUpdate( if( sqlite3_value_nochange(aData[2]) ){ sqlite3_bind_null(pUp, 2); }else{ - sqlite3_bind_value(pUp, 2, aData[2]); + GeoPoly *p = 0; + if( sqlite3_value_type(aData[2])==SQLITE_TEXT + && (p = geopolyFuncParam(0, aData[2], &rc))!=0 + && rc==SQLITE_OK + ){ + sqlite3_bind_blob(pUp, 2, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT); + }else{ + sqlite3_bind_value(pUp, 2, aData[2]); + } + sqlite3_free(p); nChange = 1; } for(jj=1; jjnAux; jj++){ @@ -1592,7 +1725,7 @@ static int geopolyFindFunction( static sqlite3_module geopolyModule = { - 2, /* iVersion */ + 3, /* iVersion */ geopolyCreate, /* xCreate - create a table */ geopolyConnect, /* xConnect - connect to an existing table */ geopolyBestIndex, /* xBestIndex - Determine search strategy */ @@ -1615,25 +1748,29 @@ static sqlite3_module geopolyModule = { rtreeSavepoint, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ + rtreeShadowName /* xShadowName */ }; static int sqlite3_geopoly_init(sqlite3 *db){ int rc = SQLITE_OK; static const struct { void (*xFunc)(sqlite3_context*,int,sqlite3_value**); - int nArg; + signed char nArg; + unsigned char bPure; const char *zName; } aFunc[] = { - { geopolyAreaFunc, 1, "geopoly_area" }, - { geopolyBlobFunc, 1, "geopoly_blob" }, - { geopolyJsonFunc, 1, "geopoly_json" }, - { geopolySvgFunc, -1, "geopoly_svg" }, - { geopolyWithinFunc, 2, "geopoly_within" }, - { geopolyContainsPointFunc, 3, "geopoly_contains_point" }, - { geopolyOverlapFunc, 2, "geopoly_overlap" }, - { geopolyDebugFunc, 1, "geopoly_debug" }, - { geopolyBBoxFunc, 1, "geopoly_bbox" }, - { geopolyXformFunc, 7, "geopoly_xform" }, + { geopolyAreaFunc, 1, 1, "geopoly_area" }, + { geopolyBlobFunc, 1, 1, "geopoly_blob" }, + { geopolyJsonFunc, 1, 1, "geopoly_json" }, + { geopolySvgFunc, -1, 1, "geopoly_svg" }, + { geopolyWithinFunc, 2, 1, "geopoly_within" }, + { geopolyContainsPointFunc, 3, 1, "geopoly_contains_point" }, + { geopolyOverlapFunc, 2, 1, "geopoly_overlap" }, + { geopolyDebugFunc, 1, 0, "geopoly_debug" }, + { geopolyBBoxFunc, 1, 1, "geopoly_bbox" }, + { geopolyXformFunc, 7, 1, "geopoly_xform" }, + { geopolyRegularFunc, 4, 1, "geopoly_regular" }, + { geopolyCcwFunc, 1, 1, "geopoly_ccw" }, }; static const struct { void (*xStep)(sqlite3_context*,int,sqlite3_value**); @@ -1644,8 +1781,9 @@ static int sqlite3_geopoly_init(sqlite3 *db){ }; int i; for(i=0; i' +.print '

Regular Polygons

' +.print '' +SELECT geopoly_svg(geopoly_regular(100,100,40,3),'style="fill:none;stroke:red;stroke-width:1"'); +SELECT geopoly_svg(geopoly_regular(200,100,40,4),'style="fill:none;stroke:orange;stroke-width:1"'); +SELECT geopoly_svg(geopoly_regular(300,100,40,5),'style="fill:none;stroke:green;stroke-width:1"'); +SELECT geopoly_svg(geopoly_regular(400,100,40,6),'style="fill:none;stroke:blue;stroke-width:1"'); +SELECT geopoly_svg(geopoly_regular(500,100,40,7),'style="fill:none;stroke:purple;stroke-width:1"'); +SELECT geopoly_svg(geopoly_regular(600,100,40,8),'style="fill:none;stroke:red;stroke-width:1"'); +SELECT geopoly_svg(geopoly_regular(700,100,40,10),'style="fill:none;stroke:orange;stroke-width:1"'); +SELECT geopoly_svg(geopoly_regular(800,100,40,20),'style="fill:none;stroke:green;stroke-width:1"'); +SELECT geopoly_svg(geopoly_regular(900,100,40,30),'style="fill:none;stroke:blue;stroke-width:1"'); +.print '' + .print '' diff --git a/ext/session/changesetfuzz.c b/ext/session/changesetfuzz.c new file mode 100644 index 0000000..fd88733 --- /dev/null +++ b/ext/session/changesetfuzz.c @@ -0,0 +1,1240 @@ +/* +** 2018-11-01 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains code to implement the "changesetfuzz" command +** line utility for fuzzing changeset blobs without corrupting them. +*/ + + +/************************************************************************ +** USAGE: +** +** This program may be invoked in two ways: +** +** changesetfuzz INPUT +** changesetfuzz INPUT SEED N +** +** Argument INPUT must be the name of a file containing a binary changeset. +** In the first form above, this program outputs a human-readable version +** of the same changeset. This is chiefly for debugging. +** +** As well as changesets, this program can also dump and fuzz patchsets. +** The term "changeset" is used for both patchsets and changesets from this +** point on. +** +** In the second form, arguments SEED and N must both be integers. In this +** case, this program writes N binary changesets to disk. Each output +** changeset is a slightly modified - "fuzzed" - version of the input. +** The output changesets are written to files name "INPUT-$n", where $n is +** an integer between 0 and N-1, inclusive. Output changesets are always +** well-formed. Parameter SEED is used to seed the PRNG - any two +** invocations of this program with the same SEED and input changeset create +** the same N output changesets. +** +** The ways in which an input changeset may be fuzzed are as follows: +** +** 1. Any two values within the changeset may be exchanged. +** +** 2. Any TEXT, BLOB, INTEGER or REAL value within the changeset +** may have a single bit of its content flipped. +** +** 3. Any value within a changeset may be replaced by a pseudo-randomly +** generated value. +** +** The above operations never set a PRIMARY KEY column to NULL. Nor do they +** set any value to "undefined", or replace any "undefined" value with +** another. Any such operation risks producing a changeset that is not +** well-formed. +** +** 4. A single change may be duplicated. +** +** 5. A single change may be removed, so long as this does not mean that +** there are zero changes following a table-header within the changeset. +** +** 6. A single change may have its type (INSERT, DELETE, UPDATE) changed. +** If an INSERT is changed to a DELETE (or vice versa), the type is +** simply changed - no other modifications are required. If an INSERT +** or DELETE is changed to an UPDATE, then the single record is duplicated +** (as both the old.* and new.* records of the new UPDATE change). If an +** UPDATE is changed to a DELETE or INSERT, the new.* record is discarded +** and any "undefined" fields replaced with pseudo-randomly generated +** values. +** +** 7. An UPDATE change that modifies N table columns may be modified so +** that it updates N-1 columns, so long as (N>1). +** +** 8. The "indirect" flag may be toggled for any change. +** +** Entire group of changes may also be operated on: +** +** 9. Duplicate an existing group. +** +** 10. Remove an existing group. +** +** 11. The positions of two groups may be exchanged. +** +** There are also schema changes: +** +** 12. A non-PK column may be added to a table. In this case a NULL +** value is appended to all records. +** +** 13. A PK column may be added to a table. In this case a non-NULL +** value is appended to all INSERT, DELETE and UPDATE old.* records. +** An "undefined" is appended to new.* UPDATE records. +** +** 14. A column may be removed from a table, provided that it is not the +** only PRIMARY KEY column in the table. In this case the corresponding +** field is removed from all records. In cases where this leaves an UPDATE +** with no non-PK, non-undefined fields, the entire change is removed. +*/ + +#include "sqlite3.h" +#include +#include +#include +#include +#include + +#define FUZZ_VALUE_SUB 1 /* Replace one value with a copy of another */ +#define FUZZ_VALUE_MOD 2 /* Modify content by 1 bit */ +#define FUZZ_VALUE_RND 3 /* Replace with pseudo-random value */ + +#define FUZZ_CHANGE_DUP 4 /* Duplicate an existing change */ +#define FUZZ_CHANGE_DEL 5 /* Completely remove one change */ +#define FUZZ_CHANGE_TYPE 6 /* Change the type of one change */ +#define FUZZ_CHANGE_FIELD 7 /* Change an UPDATE to modify fewer columns */ +#define FUZZ_CHANGE_INDIRECT 8 /* Toggle the "indirect" flag of a change */ + +#define FUZZ_GROUP_DUP 9 /* Duplicate a change group */ +#define FUZZ_GROUP_DEL 10 /* Delete an entire change group */ +#define FUZZ_GROUP_SWAP 11 /* Exchange the position of two groups */ + +#define FUZZ_COLUMN_ADD 12 /* Add column to table definition */ +#define FUZZ_COLUMN_ADDPK 13 /* Add PK column to table definition */ +#define FUZZ_COLUMN_DEL 14 /* Remove column from table definition */ + + + +typedef unsigned char u8; +typedef sqlite3_uint64 u64; +typedef sqlite3_int64 i64; +typedef unsigned int u32; + +/* +** Show a usage message on stderr then quit. +*/ +static void usage(const char *argv0){ + fprintf(stderr, "Usage: %s FILENAME ?SEED N?\n", argv0); + exit(1); +} + +/* +** Read the content of a disk file into an in-memory buffer +*/ +static void fuzzReadFile(const char *zFilename, int *pSz, void **ppBuf){ + FILE *f; + int sz; + void *pBuf; + f = fopen(zFilename, "rb"); + if( f==0 ){ + fprintf(stderr, "cannot open \"%s\" for reading\n", zFilename); + exit(1); + } + fseek(f, 0, SEEK_END); + sz = (int)ftell(f); + rewind(f); + pBuf = sqlite3_malloc( sz ? sz : 1 ); + if( pBuf==0 ){ + fprintf(stderr, "cannot allocate %d to hold content of \"%s\"\n", + sz, zFilename); + exit(1); + } + if( sz>0 ){ + if( fread(pBuf, sz, 1, f)!=1 ){ + fprintf(stderr, "cannot read all %d bytes of \"%s\"\n", sz, zFilename); + exit(1); + } + fclose(f); + } + *pSz = sz; + *ppBuf = pBuf; +} + +/* +** Write the contents of buffer pBuf, size nBuf bytes, into file zFilename +** on disk. zFilename, if it already exists, is clobbered. +*/ +static void fuzzWriteFile(const char *zFilename, void *pBuf, int nBuf){ + FILE *f; + f = fopen(zFilename, "wb"); + if( f==0 ){ + fprintf(stderr, "cannot open \"%s\" for writing\n", zFilename); + exit(1); + } + if( fwrite(pBuf, nBuf, 1, f)!=1 ){ + fprintf(stderr, "cannot write to \"%s\"\n", zFilename); + exit(1); + } + fclose(f); +} + +static int fuzzCorrupt(){ + return SQLITE_CORRUPT; +} + +/************************************************************************* +** The following block is a copy of the implementation of SQLite function +** sqlite3_randomness. This version has two important differences: +** +** 1. It always uses the same seed. So the sequence of random data output +** is the same for every run of the program. +** +** 2. It is not threadsafe. +*/ +static struct sqlite3PrngType { + unsigned char i, j; /* State variables */ + unsigned char s[256]; /* State variables */ +} sqlite3Prng = { + 0xAF, 0x28, + { + 0x71, 0xF5, 0xB4, 0x6E, 0x80, 0xAB, 0x1D, 0xB8, + 0xFB, 0xB7, 0x49, 0xBF, 0xFF, 0x72, 0x2D, 0x14, + 0x79, 0x09, 0xE3, 0x78, 0x76, 0xB0, 0x2C, 0x0A, + 0x8E, 0x23, 0xEE, 0xDF, 0xE0, 0x9A, 0x2F, 0x67, + 0xE1, 0xBE, 0x0E, 0xA7, 0x08, 0x97, 0xEB, 0x77, + 0x78, 0xBA, 0x9D, 0xCA, 0x49, 0x4C, 0x60, 0x9A, + 0xF6, 0xBD, 0xDA, 0x7F, 0xBC, 0x48, 0x58, 0x52, + 0xE5, 0xCD, 0x83, 0x72, 0x23, 0x52, 0xFF, 0x6D, + 0xEF, 0x0F, 0x82, 0x29, 0xA0, 0x83, 0x3F, 0x7D, + 0xA4, 0x88, 0x31, 0xE7, 0x88, 0x92, 0x3B, 0x9B, + 0x3B, 0x2C, 0xC2, 0x4C, 0x71, 0xA2, 0xB0, 0xEA, + 0x36, 0xD0, 0x00, 0xF1, 0xD3, 0x39, 0x17, 0x5D, + 0x2A, 0x7A, 0xE4, 0xAD, 0xE1, 0x64, 0xCE, 0x0F, + 0x9C, 0xD9, 0xF5, 0xED, 0xB0, 0x22, 0x5E, 0x62, + 0x97, 0x02, 0xA3, 0x8C, 0x67, 0x80, 0xFC, 0x88, + 0x14, 0x0B, 0x15, 0x10, 0x0F, 0xC7, 0x40, 0xD4, + 0xF1, 0xF9, 0x0E, 0x1A, 0xCE, 0xB9, 0x1E, 0xA1, + 0x72, 0x8E, 0xD7, 0x78, 0x39, 0xCD, 0xF4, 0x5D, + 0x2A, 0x59, 0x26, 0x34, 0xF2, 0x73, 0x0B, 0xA0, + 0x02, 0x51, 0x2C, 0x03, 0xA3, 0xA7, 0x43, 0x13, + 0xE8, 0x98, 0x2B, 0xD2, 0x53, 0xF8, 0xEE, 0x91, + 0x7D, 0xE7, 0xE3, 0xDA, 0xD5, 0xBB, 0xC0, 0x92, + 0x9D, 0x98, 0x01, 0x2C, 0xF9, 0xB9, 0xA0, 0xEB, + 0xCF, 0x32, 0xFA, 0x01, 0x49, 0xA5, 0x1D, 0x9A, + 0x76, 0x86, 0x3F, 0x40, 0xD4, 0x89, 0x8F, 0x9C, + 0xE2, 0xE3, 0x11, 0x31, 0x37, 0xB2, 0x49, 0x28, + 0x35, 0xC0, 0x99, 0xB6, 0xD0, 0xBC, 0x66, 0x35, + 0xF7, 0x83, 0x5B, 0xD7, 0x37, 0x1A, 0x2B, 0x18, + 0xA6, 0xFF, 0x8D, 0x7C, 0x81, 0xA8, 0xFC, 0x9E, + 0xC4, 0xEC, 0x80, 0xD0, 0x98, 0xA7, 0x76, 0xCC, + 0x9C, 0x2F, 0x7B, 0xFF, 0x8E, 0x0E, 0xBB, 0x90, + 0xAE, 0x13, 0x06, 0xF5, 0x1C, 0x4E, 0x52, 0xF7 + } +}; + +/* +** Generate and return single random byte +*/ +static unsigned char fuzzRandomByte(void){ + unsigned char t; + sqlite3Prng.i++; + t = sqlite3Prng.s[sqlite3Prng.i]; + sqlite3Prng.j += t; + sqlite3Prng.s[sqlite3Prng.i] = sqlite3Prng.s[sqlite3Prng.j]; + sqlite3Prng.s[sqlite3Prng.j] = t; + t += sqlite3Prng.s[sqlite3Prng.i]; + return sqlite3Prng.s[t]; +} + +/* +** Return N random bytes. +*/ +static void fuzzRandomBlob(int nBuf, unsigned char *zBuf){ + int i; + for(i=0; i0 ); + fuzzRandomBlob(sizeof(ret), (unsigned char*)&ret); + return (ret % nRange); +} + +static u64 fuzzRandomU64(){ + u64 ret; + fuzzRandomBlob(sizeof(ret), (unsigned char*)&ret); + return ret; +} + +static void fuzzRandomSeed(unsigned int iSeed){ + int i; + for(i=0; i<256; i+=4){ + sqlite3Prng.s[i] ^= ((iSeed >> 24) & 0xFF); + sqlite3Prng.s[i+1] ^= ((iSeed >> 16) & 0xFF); + sqlite3Prng.s[i+2] ^= ((iSeed >> 8) & 0xFF); + sqlite3Prng.s[i+3] ^= ((iSeed >> 0) & 0xFF); + } +} +/* +** End of code for generating pseudo-random values. +*************************************************************************/ + +typedef struct FuzzChangeset FuzzChangeset; +typedef struct FuzzChangesetGroup FuzzChangesetGroup; +typedef struct FuzzChange FuzzChange; + +/* +** Object containing partially parsed changeset. +*/ +struct FuzzChangeset { + int bPatchset; /* True for a patchset */ + FuzzChangesetGroup **apGroup; /* Array of groups in changeset */ + int nGroup; /* Number of items in list pGroup */ + u8 **apVal; /* Array of all values in changeset */ + int nVal; /* Number of used slots in apVal[] */ + int nChange; /* Number of changes in changeset */ + int nUpdate; /* Number of UPDATE changes in changeset */ +}; + +/* +** There is one object of this type for each change-group (table header) +** in the input changeset. +*/ +struct FuzzChangesetGroup { + const char *zTab; /* Name of table */ + int nCol; /* Number of columns in table */ + u8 *aPK; /* PK array for this table */ + u8 *aChange; /* Buffer containing array of changes */ + int szChange; /* Size of buffer aChange[] in bytes */ + int nChange; /* Number of changes in buffer aChange[] */ +}; + +/* +** Description of a fuzz change to be applied to a changeset. +*/ +struct FuzzChange { + int eType; /* One of the FUZZ_* constants above */ + int iChange; /* Change or UPDATE to modify */ + int iGroup; /* Group to modify */ + int iDelete; /* Field to remove (FUZZ_COLUMN_DEL) */ + u8 *pSub1; /* Replace this value with pSub2 */ + u8 *pSub2; /* And this one with pSub1 */ + u8 aSub[128]; /* Buffer for substitute value */ + int iCurrent; /* Current change number */ +}; + +/* +** Allocate and return nByte bytes of zeroed memory. +*/ +static void *fuzzMalloc(int nByte){ + void *pRet = sqlite3_malloc(nByte); + if( pRet ){ + memset(pRet, 0, nByte); + } + return pRet; +} + +/* +** Free the buffer indicated by the first argument. This function is used +** to free buffers allocated by fuzzMalloc(). +*/ +static void fuzzFree(void *p){ + sqlite3_free(p); +} + +/* +** Argument p points to a buffer containing an SQLite varint that, assuming the +** input is not corrupt, may be between 0 and 0x7FFFFFFF, inclusive. Before +** returning, this function sets (*pnVal) to the value of that varint, and +** returns the number of bytes of space that it takes up. +*/ +static int fuzzGetVarint(u8 *p, int *pnVal){ + int i; + sqlite3_uint64 nVal = 0; + for(i=0; i<9; i++){ + nVal = (nVal<<7) + (p[i] & 0x7F); + if( (p[i] & 0x80)==0 ){ + i++; + break; + } + } + *pnVal = (int)nVal; + return i; +} + +/* +** Write value nVal into the buffer indicated by argument p as an SQLite +** varint. nVal is guaranteed to be between 0 and (2^21-1), inclusive. +** Return the number of bytes written to buffer p. +*/ +static int fuzzPutVarint(u8 *p, int nVal){ + assert( nVal>0 && nVal<2097152 ); + if( nVal<128 ){ + p[0] = nVal; + return 1; + } + if( nVal<16384 ){ + p[0] = ((nVal >> 7) & 0x7F) | 0x80; + p[1] = (nVal & 0x7F); + return 2; + } + + p[0] = ((nVal >> 14) & 0x7F) | 0x80; + p[1] = ((nVal >> 7) & 0x7F) | 0x80; + p[2] = (nVal & 0x7F); + return 3; +} + +/* +** Read a 64-bit big-endian integer value from buffer aRec[]. Return +** the value read. +*/ +static i64 fuzzGetI64(u8 *aRec){ + return (i64)( + (((u64)aRec[0]) << 56) + + (((u64)aRec[1]) << 48) + + (((u64)aRec[2]) << 40) + + (((u64)aRec[3]) << 32) + + (((u64)aRec[4]) << 24) + + (((u64)aRec[5]) << 16) + + (((u64)aRec[6]) << 8) + + (((u64)aRec[7]) << 0) + ); +} + +/* +** Write value iVal to buffer aRec[] as an unsigned 64-bit big-endian integer. +*/ +static void fuzzPutU64(u8 *aRec, u64 iVal){ + aRec[0] = (iVal>>56) & 0xFF; + aRec[1] = (iVal>>48) & 0xFF; + aRec[2] = (iVal>>40) & 0xFF; + aRec[3] = (iVal>>32) & 0xFF; + aRec[4] = (iVal>>24) & 0xFF; + aRec[5] = (iVal>>16) & 0xFF; + aRec[6] = (iVal>> 8) & 0xFF; + aRec[7] = (iVal) & 0xFF; +} + +/* +** Parse a single table-header from the input. Allocate a new change-group +** object with the results. Return SQLITE_OK if successful, or an error code +** otherwise. +*/ +static int fuzzParseHeader( + FuzzChangeset *pParse, /* Changeset parse object */ + u8 **ppHdr, /* IN/OUT: Iterator */ + u8 *pEnd, /* 1 byte past EOF */ + FuzzChangesetGroup **ppGrp /* OUT: New change-group object */ +){ + int rc = SQLITE_OK; + FuzzChangesetGroup *pGrp; + u8 cHdr = (pParse->bPatchset ? 'P' : 'T'); + + assert( pEnd>(*ppHdr) ); + pGrp = (FuzzChangesetGroup*)fuzzMalloc(sizeof(FuzzChangesetGroup)); + if( !pGrp ){ + rc = SQLITE_NOMEM; + }else{ + u8 *p = *ppHdr; + if( p[0]!=cHdr ){ + rc = fuzzCorrupt(); + }else{ + p++; + p += fuzzGetVarint(p, &pGrp->nCol); + pGrp->aPK = p; + p += pGrp->nCol; + pGrp->zTab = (const char*)p; + p = &p[strlen(p)+1]; + + if( p>=pEnd ){ + rc = fuzzCorrupt(); + } + } + *ppHdr = p; + } + + if( rc!=SQLITE_OK ){ + fuzzFree(pGrp); + pGrp = 0; + } + + *ppGrp = pGrp; + return rc; +} + +/* +** Argument p points to a buffer containing a single changeset-record value. +** This function attempts to determine the size of the value in bytes. If +** successful, it sets (*pSz) to the size and returns SQLITE_OK. Or, if the +** buffer does not contain a valid value, SQLITE_CORRUPT is returned and +** the final value of (*pSz) is undefined. +*/ +static int fuzzChangeSize(u8 *p, int *pSz){ + u8 eType = p[0]; + switch( eType ){ + case 0x00: /* undefined */ + case 0x05: /* null */ + *pSz = 1; + break; + + case 0x01: /* integer */ + case 0x02: /* real */ + *pSz = 9; + break; + + case 0x03: /* text */ + case 0x04: { /* blob */ + int nTxt; + int sz; + sz = fuzzGetVarint(&p[1], &nTxt); + *pSz = 1 + sz + nTxt; + break; + } + + default: + return fuzzCorrupt(); + } + return SQLITE_OK; +} + +/* +** When this function is called, (*ppRec) points to the start of a +** record in a changeset being parsed. This function adds entries +** to the pParse->apVal[] array for all values and advances (*ppRec) +** to one byte past the end of the record. Argument pEnd points to +** one byte past the end of the input changeset. +** +** Argument bPkOnly is true if the record being parsed is part of +** a DELETE record in a patchset. In this case, all non-primary-key +** fields have been omitted from the record. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +static int fuzzParseRecord( + u8 **ppRec, /* IN/OUT: Iterator */ + u8 *pEnd, /* One byte after end of input data */ + FuzzChangeset *pParse, /* Changeset parse context */ + int bPkOnly /* True if non-PK fields omitted */ +){ + int rc = SQLITE_OK; + FuzzChangesetGroup *pGrp = pParse->apGroup[pParse->nGroup-1]; + int i; + u8 *p = *ppRec; + + for(i=0; rc==SQLITE_OK && inCol; i++){ + if( bPkOnly==0 || pGrp->aPK[i] ){ + int sz; + if( p>=pEnd ) break; + if( (pParse->nVal & (pParse->nVal-1))==0 ){ + int nNew = pParse->nVal ? pParse->nVal*2 : 4; + u8 **apNew = (u8**)sqlite3_realloc(pParse->apVal, nNew*sizeof(u8*)); + if( apNew==0 ) return SQLITE_NOMEM; + pParse->apVal = apNew; + } + pParse->apVal[pParse->nVal++] = p; + rc = fuzzChangeSize(p, &sz); + p += sz; + } + } + + if( rc==SQLITE_OK && inCol ){ + rc = fuzzCorrupt(); + } + + *ppRec = p; + return rc; +} + +/* +** Parse the array of changes starting at (*ppData) and add entries for +** all values to the pParse->apVal[] array. Argument pEnd points to one byte +** past the end of the input changeset. If successful, set (*ppData) to point +** to one byte past the end of the change array and return SQLITE_OK. +** Otherwise, return an SQLite error code. The final value of (*ppData) is +** undefined in this case. +*/ +static int fuzzParseChanges(u8 **ppData, u8 *pEnd, FuzzChangeset *pParse){ + u8 cHdr = (pParse->bPatchset ? 'P' : 'T'); + FuzzChangesetGroup *pGrp = pParse->apGroup[pParse->nGroup-1]; + int rc = SQLITE_OK; + u8 *p = *ppData; + + pGrp->aChange = p; + while( rc==SQLITE_OK && pnUpdate++; + if( pParse->bPatchset==0 ){ + rc = fuzzParseRecord(&p, pEnd, pParse, 0); + } + }else if( eOp!=SQLITE_INSERT && eOp!=SQLITE_DELETE ){ + rc = fuzzCorrupt(); + } + if( rc==SQLITE_OK ){ + int bPkOnly = (eOp==SQLITE_DELETE && pParse->bPatchset); + rc = fuzzParseRecord(&p, pEnd, pParse, bPkOnly); + } + pGrp->nChange++; + pParse->nChange++; + } + pGrp->szChange = p - pGrp->aChange; + + *ppData = p; + return rc; +} + +/* +** Parse the changeset stored in buffer pChangeset (nChangeset bytes in +** size). If successful, write the results into (*pParse) and return +** SQLITE_OK. Or, if an error occurs, return an SQLite error code. The +** final state of (*pParse) is undefined in this case. +*/ +static int fuzzParseChangeset( + u8 *pChangeset, /* Buffer containing changeset */ + int nChangeset, /* Size of buffer in bytes */ + FuzzChangeset *pParse /* OUT: Results of parse */ +){ + u8 *pEnd = &pChangeset[nChangeset]; + u8 *p = pChangeset; + int rc = SQLITE_OK; + + memset(pParse, 0, sizeof(FuzzChangeset)); + if( nChangeset>0 ){ + pParse->bPatchset = (pChangeset[0]=='P'); + } + + while( rc==SQLITE_OK && papGroup, sizeof(FuzzChangesetGroup*)*(pParse->nGroup+1) + ); + if( apNew==0 ){ + rc = SQLITE_NOMEM; + }else{ + apNew[pParse->nGroup] = pGrp; + pParse->apGroup = apNew; + pParse->nGroup++; + } + rc = fuzzParseChanges(&p, pEnd, pParse); + } + } + + return rc; +} + +/* +** When this function is called, (*ppRec) points to the first byte of +** a record that is part of change-group pGrp. This function attempts +** to output a human-readable version of the record to stdout and advance +** (*ppRec) to point to the first byte past the end of the record before +** returning. If successful, SQLITE_OK is returned. Otherwise, an SQLite +** error code. +** +** If parameter bPkOnly is non-zero, then all non-primary-key fields have +** been omitted from the record. This occurs for records that are part +** of DELETE changes in patchsets. +*/ +static int fuzzPrintRecord(FuzzChangesetGroup *pGrp, u8 **ppRec, int bPKOnly){ + int rc = SQLITE_OK; + u8 *p = *ppRec; + int i; + const char *zPre = " ("; + + for(i=0; inCol; i++){ + if( bPKOnly==0 || pGrp->aPK[i] ){ + u8 eType = p++[0]; + switch( eType ){ + case 0x00: /* undefined */ + printf("%sn/a", zPre); + break; + + case 0x01: { /* integer */ + sqlite3_int64 iVal = 0; + iVal = fuzzGetI64(p); + printf("%s%lld", zPre, iVal); + p += 8; + break; + } + + case 0x02: { /* real */ + sqlite3_int64 iVal = 0; + double fVal = 0.0; + iVal = fuzzGetI64(p); + memcpy(&fVal, &iVal, 8); + printf("%s%f", zPre, fVal); + p += 8; + break; + } + + case 0x03: /* text */ + case 0x04: { /* blob */ + int nTxt; + int sz; + int i; + p += fuzzGetVarint(p, &nTxt); + printf("%s%s", zPre, eType==0x03 ? "'" : "X'"); + for(i=0; i>4 ]); + printf("%c", aHex[ p[i] & 0x0F ]); + } + } + printf("'"); + p += nTxt; + break; + } + + case 0x05: /* null */ + printf("%sNULL", zPre); + break; + } + zPre = ", "; + } + } + printf(")"); + + *ppRec = p; + return rc; +} + +/* +** Print a human-readable version of the table-header and all changes in the +** change-group passed as the second argument. +*/ +static void fuzzPrintGroup(FuzzChangeset *pParse, FuzzChangesetGroup *pGrp){ + int i; + u8 *p; + + /* The table header */ + printf("TABLE: %s nCol=%d aPK=", pGrp->zTab, pGrp->nCol); + for(i=0; inCol; i++){ + printf("%d", (int)pGrp->aPK[i]); + } + printf("\n"); + + /* The array of changes */ + p = pGrp->aChange; + for(i=0; inChange; i++){ + u8 eType = p[0]; + u8 bIndirect = p[1]; + printf("%s (ind=%d):", + (eType==SQLITE_INSERT) ? "INSERT" : + (eType==SQLITE_DELETE ? "DELETE" : "UPDATE"), + bIndirect + ); + p += 2; + + if( pParse->bPatchset==0 && eType==SQLITE_UPDATE ){ + fuzzPrintRecord(pGrp, &p, 0); + } + fuzzPrintRecord(pGrp, &p, eType==SQLITE_DELETE && pParse->bPatchset); + printf("\n"); + } +} + +/* +** Initialize the object passed as the second parameter with details +** of the change that will be attempted (type of change, to which part of the +** changeset it applies etc.). If successful, return SQLITE_OK. Or, if an +** error occurs, return an SQLite error code. +** +** If a negative value is returned, then the selected change would have +** produced a non-well-formed changeset. In this case the caller should +** call this function again. +*/ +static int fuzzSelectChange(FuzzChangeset *pParse, FuzzChange *pChange){ + int iSub; + + memset(pChange, 0, sizeof(FuzzChange)); + pChange->eType = fuzzRandomInt(FUZZ_COLUMN_DEL) + 1; + + assert( pChange->eType==FUZZ_VALUE_SUB + || pChange->eType==FUZZ_VALUE_MOD + || pChange->eType==FUZZ_VALUE_RND + || pChange->eType==FUZZ_CHANGE_DUP + || pChange->eType==FUZZ_CHANGE_DEL + || pChange->eType==FUZZ_CHANGE_TYPE + || pChange->eType==FUZZ_CHANGE_FIELD + || pChange->eType==FUZZ_CHANGE_INDIRECT + || pChange->eType==FUZZ_GROUP_DUP + || pChange->eType==FUZZ_GROUP_DEL + || pChange->eType==FUZZ_GROUP_SWAP + || pChange->eType==FUZZ_COLUMN_ADD + || pChange->eType==FUZZ_COLUMN_ADDPK + || pChange->eType==FUZZ_COLUMN_DEL + ); + + pChange->iGroup = fuzzRandomInt(pParse->nGroup); + pChange->iChange = fuzzRandomInt(pParse->nChange); + if( pChange->eType==FUZZ_CHANGE_FIELD ){ + if( pParse->nUpdate==0 ) return -1; + pChange->iChange = fuzzRandomInt(pParse->nUpdate); + } + + pChange->iDelete = -1; + if( pChange->eType==FUZZ_COLUMN_DEL ){ + FuzzChangesetGroup *pGrp = pParse->apGroup[pChange->iGroup]; + int i; + pChange->iDelete = fuzzRandomInt(pGrp->nCol); + for(i=pGrp->nCol-1; i>=0; i--){ + if( pGrp->aPK[i] && pChange->iDelete!=i ) break; + } + if( i<0 ) return -1; + } + + if( pChange->eType==FUZZ_GROUP_SWAP ){ + FuzzChangesetGroup *pGrp; + int iGrp = pChange->iGroup; + if( pParse->nGroup==1 ) return -1; + while( iGrp==pChange->iGroup ){ + iGrp = fuzzRandomInt(pParse->nGroup); + } + pGrp = pParse->apGroup[pChange->iGroup]; + pParse->apGroup[pChange->iGroup] = pParse->apGroup[iGrp]; + pParse->apGroup[iGrp] = pGrp; + } + + if( pChange->eType==FUZZ_VALUE_SUB + || pChange->eType==FUZZ_VALUE_MOD + || pChange->eType==FUZZ_VALUE_RND + ){ + iSub = fuzzRandomInt(pParse->nVal); + pChange->pSub1 = pParse->apVal[iSub]; + if( pChange->eType==FUZZ_VALUE_SUB ){ + iSub = fuzzRandomInt(pParse->nVal); + pChange->pSub2 = pParse->apVal[iSub]; + }else{ + pChange->pSub2 = pChange->aSub; + } + + if( pChange->eType==FUZZ_VALUE_RND ){ + pChange->aSub[0] = (u8)(fuzzRandomInt(5) + 1); + switch( pChange->aSub[0] ){ + case 0x01: { /* integer */ + u64 iVal = fuzzRandomU64(); + fuzzPutU64(&pChange->aSub[1], iVal); + break; + } + + case 0x02: { /* real */ + u64 iVal1 = fuzzRandomU64(); + u64 iVal2 = fuzzRandomU64(); + double d = (double)iVal1 / (double)iVal2; + memcpy(&iVal1, &d, sizeof(iVal1)); + fuzzPutU64(&pChange->aSub[1], iVal1); + break; + } + + case 0x03: /* text */ + case 0x04: { /* blob */ + int nByte = fuzzRandomInt(48); + pChange->aSub[1] = nByte; + fuzzRandomBlob(nByte, &pChange->aSub[2]); + if( pChange->aSub[0]==0x03 ){ + int i; + for(i=0; iaSub[2+i] &= 0x7F; + } + } + break; + } + } + } + if( pChange->eType==FUZZ_VALUE_MOD ){ + int sz; + int iMod = -1; + fuzzChangeSize(pChange->pSub1, &sz); + memcpy(pChange->aSub, pChange->pSub1, sz); + switch( pChange->aSub[0] ){ + case 0x01: + case 0x02: + iMod = fuzzRandomInt(8) + 1; + break; + + case 0x03: /* text */ + case 0x04: { /* blob */ + int nByte; + int iFirst = 1 + fuzzGetVarint(&pChange->aSub[1], &nByte); + if( nByte>0 ){ + iMod = fuzzRandomInt(nByte) + iFirst; + } + break; + } + } + + if( iMod>=0 ){ + u8 mask = (1 << fuzzRandomInt(8 - (pChange->aSub[0]==0x03))); + pChange->aSub[iMod] ^= mask; + } + } + } + + return SQLITE_OK; +} + +/* +** Copy a single change from the input to the output changeset, making +** any modifications specified by (*pFuzz). +*/ +static int fuzzCopyChange( + FuzzChangeset *pParse, + int iGrp, + FuzzChange *pFuzz, + u8 **pp, u8 **ppOut /* IN/OUT: Input and output pointers */ +){ + int bPS = pParse->bPatchset; + FuzzChangesetGroup *pGrp = pParse->apGroup[iGrp]; + u8 *p = *pp; + u8 *pOut = *ppOut; + u8 eType = p++[0]; + int iRec; + int nRec = ((eType==SQLITE_UPDATE && !bPS) ? 2 : 1); + int iUndef = -1; + int nUpdate = 0; + + u8 eNew = eType; + if( pFuzz->iCurrent==pFuzz->iChange && pFuzz->eType==FUZZ_CHANGE_TYPE ){ + switch( eType ){ + case SQLITE_INSERT: + eNew = SQLITE_DELETE; + break; + case SQLITE_DELETE: + eNew = SQLITE_UPDATE; + break; + case SQLITE_UPDATE: + eNew = SQLITE_INSERT; + break; + } + } + + if( pFuzz->iCurrent==pFuzz->iChange + && pFuzz->eType==FUZZ_CHANGE_FIELD && eType==SQLITE_UPDATE + ){ + int sz; + int i; + int nDef = 0; + u8 *pCsr = p+1; + for(i=0; inCol; i++){ + if( pCsr[0] && pGrp->aPK[i]==0 ) nDef++; + fuzzChangeSize(pCsr, &sz); + pCsr += sz; + } + if( nDef<=1 ) return -1; + nDef = fuzzRandomInt(nDef); + pCsr = p+1; + for(i=0; inCol; i++){ + if( pCsr[0] && pGrp->aPK[i]==0 ){ + if( nDef==0 ) iUndef = i; + nDef--; + } + fuzzChangeSize(pCsr, &sz); + pCsr += sz; + } + } + + /* Copy the change type and indirect flag. If the fuzz mode is + ** FUZZ_CHANGE_INDIRECT, and the current change is the one selected for + ** fuzzing, invert the indirect flag. */ + *(pOut++) = eNew; + if( pFuzz->eType==FUZZ_CHANGE_INDIRECT && pFuzz->iCurrent==pFuzz->iChange ){ + *(pOut++) = !(*(p++)); + }else{ + *(pOut++) = *(p++); + } + + for(iRec=0; iRecnCol; i++){ + int sz; + u8 *pCopy = p; + + /* If this is a patchset, and the input is a DELETE, then the only + ** fields present are the PK fields. So, if this is not a PK, skip to + ** the next column. If the current fuzz is FUZZ_CHANGE_TYPE, then + ** write a randomly selected value to the output. */ + if( bPS && eType==SQLITE_DELETE && pGrp->aPK[i]==0 ){ + if( eType!=eNew ){ + assert( eNew==SQLITE_UPDATE ); + do { + pCopy = pParse->apVal[fuzzRandomInt(pParse->nVal)]; + }while( pCopy[0]==0x00 ); + fuzzChangeSize(pCopy, &sz); + memcpy(pOut, pCopy, sz); + pOut += sz; + } + continue; + } + + if( p==pFuzz->pSub1 ){ + pCopy = pFuzz->pSub2; + }else if( p==pFuzz->pSub2 ){ + pCopy = pFuzz->pSub1; + }else if( i==iUndef ){ + pCopy = "\0"; + } + + if( pCopy[0]==0x00 && eNew!=eType && eType==SQLITE_UPDATE && iRec==0 ){ + while( pCopy[0]==0x00 ){ + pCopy = pParse->apVal[fuzzRandomInt(pParse->nVal)]; + } + }else if( p[0]==0x00 && pCopy[0]!=0x00 ){ + return -1; + }else{ + if( pGrp->aPK[i]>0 && pCopy[0]==0x05 ) return -1; + } + + if( (pFuzz->iGroup!=iGrp || i!=pFuzz->iDelete) + && (eNew==eType || eType!=SQLITE_UPDATE || iRec==0) + && (eNew==eType || eNew!=SQLITE_DELETE || !bPS || pGrp->aPK[i]) + ){ + fuzzChangeSize(pCopy, &sz); + memcpy(pOut, pCopy, sz); + pOut += sz; + nUpdate += (pGrp->aPK[i]==0 && pCopy[0]!=0x00); + } + + fuzzChangeSize(p, &sz); + p += sz; + } + + if( iGrp==pFuzz->iGroup ){ + if( pFuzz->eType==FUZZ_COLUMN_ADD ){ + if( !bPS || eType!=SQLITE_DELETE ) *(pOut++) = 0x05; + }else if( pFuzz->eType==FUZZ_COLUMN_ADDPK ){ + if( iRec==1 ){ + *(pOut++) = 0x00; + }else{ + u8 *pNew; + int szNew; + do { + pNew = pParse->apVal[fuzzRandomInt(pParse->nVal)]; + }while( pNew[0]==0x00 || pNew[0]==0x05 ); + fuzzChangeSize(pNew, &szNew); + memcpy(pOut, pNew, szNew); + pOut += szNew; + } + } + } + } + + if( pFuzz->iCurrent==pFuzz->iChange ){ + if( pFuzz->eType==FUZZ_CHANGE_DUP ){ + int nByte = pOut - (*ppOut); + memcpy(pOut, *ppOut, nByte); + pOut += nByte; + } + + if( pFuzz->eType==FUZZ_CHANGE_DEL ){ + pOut = *ppOut; + } + if( eNew!=eType && eNew==SQLITE_UPDATE && !bPS ){ + int i; + u8 *pCsr = (*ppOut) + 2; + for(i=0; inCol; i++){ + int sz; + u8 *pCopy = pCsr; + if( pGrp->aPK[i] ) pCopy = "\0"; + fuzzChangeSize(pCopy, &sz); + memcpy(pOut, pCopy, sz); + pOut += sz; + fuzzChangeSize(pCsr, &sz); + pCsr += sz; + } + } + } + + /* If a column is being deleted from this group, and this change was an + ** UPDATE, and there are now no non-PK, non-undefined columns in the + ** change, remove it altogether. */ + if( pFuzz->eType==FUZZ_COLUMN_DEL && pFuzz->iGroup==iGrp + && eType==SQLITE_UPDATE && nUpdate==0 + ){ + pOut = *ppOut; + } + + *pp = p; + *ppOut = pOut; + pFuzz->iCurrent += (eType==SQLITE_UPDATE || pFuzz->eType!=FUZZ_CHANGE_FIELD); + return SQLITE_OK; +} + +/* +** Fuzz the changeset parsed into object pParse and write the results +** to file zOut on disk. Argument pBuf points to a buffer that is guaranteed +** to be large enough to hold the fuzzed changeset. +** +** Return SQLITE_OK if successful, or an SQLite error code if an error occurs. +*/ +static int fuzzDoOneFuzz( + const char *zOut, /* Filename to write modified changeset to */ + u8 *pBuf, /* Buffer to use for modified changeset */ + FuzzChangeset *pParse /* Parse of input changeset */ +){ + FuzzChange change; + int iGrp; + int rc = -1; + + while( rc<0 ){ + u8 *pOut = pBuf; + rc = fuzzSelectChange(pParse, &change); + for(iGrp=0; rc==SQLITE_OK && iGrpnGroup; iGrp++){ + FuzzChangesetGroup *pGrp = pParse->apGroup[iGrp]; + int nTab = strlen(pGrp->zTab) + 1; + int j; + int nRep = 1; + + /* If this is the group to delete for a FUZZ_GROUP_DEL change, jump to + ** the next group. Unless this is the only group in the changeset - in + ** that case this change cannot be applied. + ** + ** Or, if this is a FUZZ_GROUP_DUP, set nRep to 2 to output two + ** copies of the group. */ + if( change.iGroup==iGrp ){ + if( change.eType==FUZZ_GROUP_DEL ){ + if( pParse->nGroup==1 ) rc = -1; + continue; + } + else if( change.eType==FUZZ_GROUP_DUP ){ + nRep = 2; + } + } + + for(j=0; jaChange; + int nCol = pGrp->nCol; + int iPKDel = 0; + if( iGrp==change.iGroup ){ + if( change.eType==FUZZ_COLUMN_ADD + || change.eType==FUZZ_COLUMN_ADDPK + ){ + nCol++; + }else if( change.eType==FUZZ_COLUMN_DEL ){ + nCol--; + iPKDel = pGrp->aPK[change.iDelete]; + } + } + + /* Output a table header */ + pOut++[0] = pParse->bPatchset ? 'P' : 'T'; + pOut += fuzzPutVarint(pOut, nCol); + + for(i=0; inCol; i++){ + if( iGrp!=change.iGroup || i!=change.iDelete ){ + u8 v = pGrp->aPK[i]; + if( iPKDel && v>iPKDel ) v--; + *(pOut++) = v; + } + } + if( nCol>pGrp->nCol ){ + if( change.eType==FUZZ_COLUMN_ADD ){ + *(pOut++) = 0x00; + }else{ + u8 max = 0; + for(i=0; inCol; i++){ + if( pGrp->aPK[i]>max ) max = pGrp->aPK[i]; + } + *(pOut++) = max+1; + } + } + memcpy(pOut, pGrp->zTab, nTab); + pOut += nTab; + + /* Output the change array. */ + pSaved = pOut; + for(i=0; rc==SQLITE_OK && inChange; i++){ + rc = fuzzCopyChange(pParse, iGrp, &change, &p, &pOut); + } + if( pOut==pSaved ) rc = -1; + } + } + if( rc==SQLITE_OK ){ + fuzzWriteFile(zOut, pBuf, pOut-pBuf); + } + } + + return rc; +} + +int main(int argc, char **argv){ + int nRepeat = 0; /* Number of output files */ + int iSeed = 0; /* Value of PRNG seed */ + const char *zInput; /* Name of input file */ + void *pChangeset = 0; /* Input changeset */ + int nChangeset = 0; /* Size of input changeset in bytes */ + int i; /* Current output file */ + FuzzChangeset changeset; /* Partially parsed changeset */ + int rc; + u8 *pBuf = 0; + + if( argc!=4 && argc!=2 ) usage(argv[0]); + zInput = argv[1]; + + fuzzReadFile(zInput, &nChangeset, &pChangeset); + rc = fuzzParseChangeset(pChangeset, nChangeset, &changeset); + + if( rc==SQLITE_OK ){ + if( argc==2 ){ + for(i=0; inAlloc-p->nBufnAlloc ? p->nAlloc : 128; + i64 nNew = p->nAlloc ? p->nAlloc : 128; do { nNew = nNew*2; - }while( nNew<(p->nBuf+nByte) ); + }while( (nNew-p->nBuf)aBuf, nNew); + aNew = (u8 *)sqlite3_realloc64(p->aBuf, nNew); if( 0==aNew ){ *pRc = SQLITE_NOMEM; }else{ @@ -2396,12 +2435,12 @@ static int sessionGenerateChangeset( rc = sqlite3_reset(pSel); } - /* If the buffer is now larger than SESSIONS_STRM_CHUNK_SIZE, pass + /* If the buffer is now larger than sessions_strm_chunk_size, pass ** its contents to the xOutput() callback. */ if( xOutput && rc==SQLITE_OK && buf.nBuf>nNoop - && buf.nBuf>SESSIONS_STRM_CHUNK_SIZE + && buf.nBuf>sessions_strm_chunk_size ){ rc = xOutput(pOut, (void*)buf.aBuf, buf.nBuf); nNoop = -1; @@ -2540,7 +2579,8 @@ static int sessionChangesetStart( int (*xInput)(void *pIn, void *pData, int *pnData), void *pIn, int nChangeset, /* Size of buffer pChangeset in bytes */ - void *pChangeset /* Pointer to buffer containing changeset */ + void *pChangeset, /* Pointer to buffer containing changeset */ + int bInvert /* True to invert changeset */ ){ sqlite3_changeset_iter *pRet; /* Iterator to return */ int nByte; /* Number of bytes to allocate for iterator */ @@ -2560,6 +2600,7 @@ static int sessionChangesetStart( pRet->in.xInput = xInput; pRet->in.pIn = pIn; pRet->in.bEof = (xInput ? 0 : 1); + pRet->bInvert = bInvert; /* Populate the output variable and return success. */ *pp = pRet; @@ -2574,7 +2615,16 @@ int sqlite3changeset_start( int nChangeset, /* Size of buffer pChangeset in bytes */ void *pChangeset /* Pointer to buffer containing changeset */ ){ - return sessionChangesetStart(pp, 0, 0, nChangeset, pChangeset); + return sessionChangesetStart(pp, 0, 0, nChangeset, pChangeset, 0); +} +int sqlite3changeset_start_v2( + sqlite3_changeset_iter **pp, /* OUT: Changeset iterator handle */ + int nChangeset, /* Size of buffer pChangeset in bytes */ + void *pChangeset, /* Pointer to buffer containing changeset */ + int flags +){ + int bInvert = !!(flags & SQLITE_CHANGESETSTART_INVERT); + return sessionChangesetStart(pp, 0, 0, nChangeset, pChangeset, bInvert); } /* @@ -2585,7 +2635,16 @@ int sqlite3changeset_start_strm( int (*xInput)(void *pIn, void *pData, int *pnData), void *pIn ){ - return sessionChangesetStart(pp, xInput, pIn, 0, 0); + return sessionChangesetStart(pp, xInput, pIn, 0, 0, 0); +} +int sqlite3changeset_start_v2_strm( + sqlite3_changeset_iter **pp, /* OUT: Changeset iterator handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int flags +){ + int bInvert = !!(flags & SQLITE_CHANGESETSTART_INVERT); + return sessionChangesetStart(pp, xInput, pIn, 0, 0, bInvert); } /* @@ -2593,7 +2652,7 @@ int sqlite3changeset_start_strm( ** object and the buffer is full, discard some data to free up space. */ static void sessionDiscardData(SessionInput *pIn){ - if( pIn->xInput && pIn->iNext>=SESSIONS_STRM_CHUNK_SIZE ){ + if( pIn->xInput && pIn->iNext>=sessions_strm_chunk_size ){ int nMove = pIn->buf.nBuf - pIn->iNext; assert( nMove>=0 ); if( nMove>0 ){ @@ -2616,7 +2675,7 @@ static int sessionInputBuffer(SessionInput *pIn, int nByte){ int rc = SQLITE_OK; if( pIn->xInput ){ while( !pIn->bEof && (pIn->iNext+nByte)>=pIn->nData && rc==SQLITE_OK ){ - int nNew = SESSIONS_STRM_CHUNK_SIZE; + int nNew = sessions_strm_chunk_size; if( pIn->bNoDiscard==0 ) sessionDiscardData(pIn); if( SQLITE_OK==sessionBufferGrow(&pIn->buf, nNew, &rc) ){ @@ -2964,10 +3023,10 @@ static int sessionChangesetNext( op = p->in.aData[p->in.iNext++]; } - if( p->zTab==0 ){ + if( p->zTab==0 || (p->bPatchset && p->bInvert) ){ /* The first record in the changeset is not a table header. Must be a ** corrupt changeset. */ - assert( p->in.iNext==1 ); + assert( p->in.iNext==1 || p->zTab ); return (p->rc = SQLITE_CORRUPT_BKPT); } @@ -2992,33 +3051,39 @@ static int sessionChangesetNext( *paRec = &p->in.aData[p->in.iNext]; p->in.iNext += *pnRec; }else{ + sqlite3_value **apOld = (p->bInvert ? &p->apValue[p->nCol] : p->apValue); + sqlite3_value **apNew = (p->bInvert ? p->apValue : &p->apValue[p->nCol]); /* If this is an UPDATE or DELETE, read the old.* record. */ if( p->op!=SQLITE_INSERT && (p->bPatchset==0 || p->op==SQLITE_DELETE) ){ u8 *abPK = p->bPatchset ? p->abPK : 0; - p->rc = sessionReadRecord(&p->in, p->nCol, abPK, p->apValue); + p->rc = sessionReadRecord(&p->in, p->nCol, abPK, apOld); if( p->rc!=SQLITE_OK ) return p->rc; } /* If this is an INSERT or UPDATE, read the new.* record. */ if( p->op!=SQLITE_DELETE ){ - p->rc = sessionReadRecord(&p->in, p->nCol, 0, &p->apValue[p->nCol]); + p->rc = sessionReadRecord(&p->in, p->nCol, 0, apNew); if( p->rc!=SQLITE_OK ) return p->rc; } - if( p->bPatchset && p->op==SQLITE_UPDATE ){ + if( (p->bPatchset || p->bInvert) && p->op==SQLITE_UPDATE ){ /* If this is an UPDATE that is part of a patchset, then all PK and ** modified fields are present in the new.* record. The old.* record ** is currently completely empty. This block shifts the PK fields from ** new.* to old.*, to accommodate the code that reads these arrays. */ for(i=0; inCol; i++){ - assert( p->apValue[i]==0 ); + assert( p->bPatchset==0 || p->apValue[i]==0 ); if( p->abPK[i] ){ + assert( p->apValue[i]==0 ); p->apValue[i] = p->apValue[i+p->nCol]; if( p->apValue[i]==0 ) return (p->rc = SQLITE_CORRUPT_BKPT); p->apValue[i+p->nCol] = 0; } } + }else if( p->bInvert ){ + if( p->op==SQLITE_INSERT ) p->op = SQLITE_DELETE; + else if( p->op==SQLITE_DELETE ) p->op = SQLITE_INSERT; } } @@ -3335,7 +3400,7 @@ static int sessionChangesetInvert( } assert( rc==SQLITE_OK ); - if( xOutput && sOut.nBuf>=SESSIONS_STRM_CHUNK_SIZE ){ + if( xOutput && sOut.nBuf>=sessions_strm_chunk_size ){ rc = xOutput(pOut, sOut.aBuf, sOut.nBuf); sOut.nBuf = 0; if( rc!=SQLITE_OK ) goto finished_invert; @@ -3414,7 +3479,8 @@ struct SessionApplyCtx { int bDeferConstraints; /* True to defer constraints */ SessionBuffer constraints; /* Deferred constraints are stored here */ SessionBuffer rebase; /* Rebase information (if any) here */ - int bRebaseStarted; /* If table header is already in rebase */ + u8 bRebaseStarted; /* If table header is already in rebase */ + u8 bRebase; /* True to collect rebase information */ }; /* @@ -3811,35 +3877,36 @@ static int sessionRebaseAdd( sqlite3_changeset_iter *pIter /* Iterator pointing at current change */ ){ int rc = SQLITE_OK; - int i; - int eOp = pIter->op; - if( p->bRebaseStarted==0 ){ - /* Append a table-header to the rebase buffer */ - const char *zTab = pIter->zTab; - sessionAppendByte(&p->rebase, 'T', &rc); - sessionAppendVarint(&p->rebase, p->nCol, &rc); - sessionAppendBlob(&p->rebase, p->abPK, p->nCol, &rc); - sessionAppendBlob(&p->rebase, (u8*)zTab, (int)strlen(zTab)+1, &rc); - p->bRebaseStarted = 1; - } - - assert( eType==SQLITE_CHANGESET_REPLACE||eType==SQLITE_CHANGESET_OMIT ); - assert( eOp==SQLITE_DELETE || eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE ); - - sessionAppendByte(&p->rebase, - (eOp==SQLITE_DELETE ? SQLITE_DELETE : SQLITE_INSERT), &rc - ); - sessionAppendByte(&p->rebase, (eType==SQLITE_CHANGESET_REPLACE), &rc); - for(i=0; inCol; i++){ - sqlite3_value *pVal = 0; - if( eOp==SQLITE_DELETE || (eOp==SQLITE_UPDATE && p->abPK[i]) ){ - sqlite3changeset_old(pIter, i, &pVal); - }else{ - sqlite3changeset_new(pIter, i, &pVal); + if( p->bRebase ){ + int i; + int eOp = pIter->op; + if( p->bRebaseStarted==0 ){ + /* Append a table-header to the rebase buffer */ + const char *zTab = pIter->zTab; + sessionAppendByte(&p->rebase, 'T', &rc); + sessionAppendVarint(&p->rebase, p->nCol, &rc); + sessionAppendBlob(&p->rebase, p->abPK, p->nCol, &rc); + sessionAppendBlob(&p->rebase, (u8*)zTab, (int)strlen(zTab)+1, &rc); + p->bRebaseStarted = 1; } - sessionAppendValue(&p->rebase, pVal, &rc); - } + assert( eType==SQLITE_CHANGESET_REPLACE||eType==SQLITE_CHANGESET_OMIT ); + assert( eOp==SQLITE_DELETE || eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE ); + + sessionAppendByte(&p->rebase, + (eOp==SQLITE_DELETE ? SQLITE_DELETE : SQLITE_INSERT), &rc + ); + sessionAppendByte(&p->rebase, (eType==SQLITE_CHANGESET_REPLACE), &rc); + for(i=0; inCol; i++){ + sqlite3_value *pVal = 0; + if( eOp==SQLITE_DELETE || (eOp==SQLITE_UPDATE && p->abPK[i]) ){ + sqlite3changeset_old(pIter, i, &pVal); + }else{ + sqlite3changeset_new(pIter, i, &pVal); + } + sessionAppendValue(&p->rebase, pVal, &rc); + } + } return rc; } @@ -4182,7 +4249,7 @@ static int sessionRetryConstraints( SessionBuffer cons = pApply->constraints; memset(&pApply->constraints, 0, sizeof(SessionBuffer)); - rc = sessionChangesetStart(&pIter2, 0, 0, cons.nBuf, cons.aBuf); + rc = sessionChangesetStart(&pIter2, 0, 0, cons.nBuf, cons.aBuf, 0); if( rc==SQLITE_OK ){ int nByte = 2*pApply->nCol*sizeof(sqlite3_value*); int rc2; @@ -4248,6 +4315,7 @@ static int sessionChangesetApply( pIter->in.bNoDiscard = 1; memset(&sApply, 0, sizeof(sApply)); + sApply.bRebase = (ppRebase && pnRebase); sqlite3_mutex_enter(sqlite3_db_mutex(db)); if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){ rc = sqlite3_exec(db, "SAVEPOINT changeset_apply", 0, 0, 0); @@ -4398,7 +4466,8 @@ static int sessionChangesetApply( } } - if( rc==SQLITE_OK && bPatchset==0 && ppRebase && pnRebase ){ + assert( sApply.bRebase || sApply.rebase.nBuf==0 ); + if( rc==SQLITE_OK && bPatchset==0 && sApply.bRebase ){ *ppRebase = (void*)sApply.rebase.aBuf; *pnRebase = sApply.rebase.nBuf; sApply.rebase.aBuf = 0; @@ -4436,7 +4505,8 @@ int sqlite3changeset_apply_v2( int flags ){ sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */ - int rc = sqlite3changeset_start(&pIter, nChangeset, pChangeset); + int bInverse = !!(flags & SQLITE_CHANGESETAPPLY_INVERT); + int rc = sessionChangesetStart(&pIter, 0, 0, nChangeset, pChangeset,bInverse); if( rc==SQLITE_OK ){ rc = sessionChangesetApply( db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags @@ -4493,7 +4563,8 @@ int sqlite3changeset_apply_v2_strm( int flags ){ sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */ - int rc = sqlite3changeset_start_strm(&pIter, xInput, pIn); + int bInverse = !!(flags & SQLITE_CHANGESETAPPLY_INVERT); + int rc = sessionChangesetStart(&pIter, xInput, pIn, 0, 0, bInverse); if( rc==SQLITE_OK ){ rc = sessionChangesetApply( db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags @@ -4866,13 +4937,12 @@ static int sessionChangegroupOutput( sessionAppendByte(&buf, p->op, &rc); sessionAppendByte(&buf, p->bIndirect, &rc); sessionAppendBlob(&buf, p->aRecord, p->nRecord, &rc); + if( rc==SQLITE_OK && xOutput && buf.nBuf>=sessions_strm_chunk_size ){ + rc = xOutput(pOut, buf.aBuf, buf.nBuf); + buf.nBuf = 0; + } } } - - if( rc==SQLITE_OK && xOutput && buf.nBuf>=SESSIONS_STRM_CHUNK_SIZE ){ - rc = xOutput(pOut, buf.aBuf, buf.nBuf); - buf.nBuf = 0; - } } if( rc==SQLITE_OK ){ @@ -5263,7 +5333,7 @@ static int sessionRebase( sessionAppendByte(&sOut, pIter->bIndirect, &rc); sessionAppendBlob(&sOut, aRec, nRec, &rc); } - if( rc==SQLITE_OK && xOutput && sOut.nBuf>SESSIONS_STRM_CHUNK_SIZE ){ + if( rc==SQLITE_OK && xOutput && sOut.nBuf>sessions_strm_chunk_size ){ rc = xOutput(pOut, sOut.aBuf, sOut.nBuf); sOut.nBuf = 0; } @@ -5374,4 +5444,25 @@ void sqlite3rebaser_delete(sqlite3_rebaser *p){ } } +/* +** Global configuration +*/ +int sqlite3session_config(int op, void *pArg){ + int rc = SQLITE_OK; + switch( op ){ + case SQLITE_SESSION_CONFIG_STRMSIZE: { + int *pInt = (int*)pArg; + if( *pInt>0 ){ + sessions_strm_chunk_size = *pInt; + } + *pInt = sessions_strm_chunk_size; + break; + } + default: + rc = SQLITE_MISUSE; + break; + } + return rc; +} + #endif /* SQLITE_ENABLE_SESSION && SQLITE_ENABLE_PREUPDATE_HOOK */ diff --git a/ext/session/sqlite3session.h b/ext/session/sqlite3session.h index a3def5f..3d1df42 100644 --- a/ext/session/sqlite3session.h +++ b/ext/session/sqlite3session.h @@ -473,12 +473,38 @@ int sqlite3session_isempty(sqlite3_session *pSession); ** consecutively. There is no chance that the iterator will visit a change ** the applies to table X, then one for table Y, and then later on visit ** another change for table X. +** +** The behavior of sqlite3changeset_start_v2() and its streaming equivalent +** may be modified by passing a combination of +** [SQLITE_CHANGESETSTART_INVERT | supported flags] as the 4th parameter. +** +** Note that the sqlite3changeset_start_v2() API is still experimental +** and therefore subject to change. */ int sqlite3changeset_start( sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ int nChangeset, /* Size of changeset blob in bytes */ void *pChangeset /* Pointer to blob containing changeset */ ); +int sqlite3changeset_start_v2( + sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ + int nChangeset, /* Size of changeset blob in bytes */ + void *pChangeset, /* Pointer to blob containing changeset */ + int flags /* SESSION_CHANGESETSTART_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3changeset_start_v2 +** +** The following flags may passed via the 4th parameter to +** [sqlite3changeset_start_v2] and [sqlite3changeset_start_v2_strm]: +** +**
SQLITE_CHANGESETAPPLY_INVERT
+** Invert the changeset while iterating through it. This is equivalent to +** inverting a changeset using sqlite3changeset_invert() before applying it. +** It is an error to specify this flag with a patchset. +*/ +#define SQLITE_CHANGESETSTART_INVERT 0x0002 /* @@ -1133,7 +1159,7 @@ int sqlite3changeset_apply_v2( ), void *pCtx, /* First argument passed to xConflict */ void **ppRebase, int *pnRebase, /* OUT: Rebase data */ - int flags /* Combination of SESSION_APPLY_* flags */ + int flags /* SESSION_CHANGESETAPPLY_* flags */ ); /* @@ -1151,8 +1177,14 @@ int sqlite3changeset_apply_v2( ** causes the sessions module to omit this savepoint. In this case, if the ** caller has an open transaction or savepoint when apply_v2() is called, ** it may revert the partially applied changeset by rolling it back. +** +**
SQLITE_CHANGESETAPPLY_INVERT
+** Invert the changeset before applying it. This is equivalent to inverting +** a changeset using sqlite3changeset_invert() before applying it. It is +** an error to specify this flag with a patchset. */ #define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001 +#define SQLITE_CHANGESETAPPLY_INVERT 0x0002 /* ** CAPI3REF: Constants Passed To The Conflict Handler @@ -1546,6 +1578,12 @@ int sqlite3changeset_start_strm( int (*xInput)(void *pIn, void *pData, int *pnData), void *pIn ); +int sqlite3changeset_start_v2_strm( + sqlite3_changeset_iter **pp, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int flags +); int sqlite3session_changeset_strm( sqlite3_session *pSession, int (*xOutput)(void *pOut, const void *pData, int nData), @@ -1572,6 +1610,45 @@ int sqlite3rebaser_rebase_strm( void *pOut ); +/* +** CAPI3REF: Configure global parameters +** +** The sqlite3session_config() interface is used to make global configuration +** changes to the sessions module in order to tune it to the specific needs +** of the application. +** +** The sqlite3session_config() interface is not threadsafe. If it is invoked +** while any other thread is inside any other sessions method then the +** results are undefined. Furthermore, if it is invoked after any sessions +** related objects have been created, the results are also undefined. +** +** The first argument to the sqlite3session_config() function must be one +** of the SQLITE_SESSION_CONFIG_XXX constants defined below. The +** interpretation of the (void*) value passed as the second parameter and +** the effect of calling this function depends on the value of the first +** parameter. +** +**
+**
SQLITE_SESSION_CONFIG_STRMSIZE
+** By default, the sessions module streaming interfaces attempt to input +** and output data in approximately 1 KiB chunks. This operand may be used +** to set and query the value of this configuration setting. The pointer +** passed as the second argument must point to a value of type (int). +** If this value is greater than 0, it is used as the new streaming data +** chunk size for both input and output. Before returning, the (int) value +** pointed to by pArg is set to the final value of the streaming interface +** chunk size. +**
+** +** This function returns SQLITE_OK if successful, or an SQLite error code +** otherwise. +*/ +int sqlite3session_config(int op, void *pArg); + +/* +** CAPI3REF: Values for sqlite3session_config(). +*/ +#define SQLITE_SESSION_CONFIG_STRMSIZE 1 /* ** Make sure we can call this stuff from C++. diff --git a/ext/session/test_session.c b/ext/session/test_session.c index 3b6c24f..1e76616 100644 --- a/ext/session/test_session.c +++ b/ext/session/test_session.c @@ -737,20 +737,32 @@ static int SQLITE_TCLAPI testSqlite3changesetApply( sStr.nStream = test_tcl_integer(interp, SESSION_STREAM_TCL_VAR); /* Check for the -nosavepoint flag */ - if( bV2 && objc>1 ){ - const char *z1 = Tcl_GetString(objv[1]); - int n = strlen(z1); - if( n>1 && n<=12 && 0==sqlite3_strnicmp("-nosavepoint", z1, n) ){ - flags = SQLITE_CHANGESETAPPLY_NOSAVEPOINT; - objc--; - objv++; + if( bV2 ){ + if( objc>1 ){ + const char *z1 = Tcl_GetString(objv[1]); + int n = strlen(z1); + if( n>1 && n<=12 && 0==sqlite3_strnicmp("-nosavepoint", z1, n) ){ + flags |= SQLITE_CHANGESETAPPLY_NOSAVEPOINT; + objc--; + objv++; + } + } + if( objc>1 ){ + const char *z1 = Tcl_GetString(objv[1]); + int n = strlen(z1); + if( n>1 && n<=7 && 0==sqlite3_strnicmp("-invert", z1, n) ){ + flags |= SQLITE_CHANGESETAPPLY_INVERT; + objc--; + objv++; + } } } if( objc!=4 && objc!=5 ){ const char *zMsg; if( bV2 ){ - zMsg = "?-nosavepoint? DB CHANGESET CONFLICT-SCRIPT ?FILTER-SCRIPT?"; + zMsg = "?-nosavepoint? ?-inverse? " + "DB CHANGESET CONFLICT-SCRIPT ?FILTER-SCRIPT?"; }else{ zMsg = "DB CHANGESET CONFLICT-SCRIPT ?FILTER-SCRIPT?"; } @@ -969,31 +981,56 @@ static int SQLITE_TCLAPI test_sqlite3session_foreach( Tcl_Obj *pCS; Tcl_Obj *pScript; int isCheckNext = 0; + int isInvert = 0; TestStreamInput sStr; memset(&sStr, 0, sizeof(sStr)); - if( objc>1 ){ + while( objc>1 ){ char *zOpt = Tcl_GetString(objv[1]); - isCheckNext = (strcmp(zOpt, "-next")==0); + int nOpt = strlen(zOpt); + if( zOpt[0]!='-' ) break; + if( nOpt<=7 && 0==sqlite3_strnicmp(zOpt, "-invert", nOpt) ){ + isInvert = 1; + }else + if( nOpt<=5 && 0==sqlite3_strnicmp(zOpt, "-next", nOpt) ){ + isCheckNext = 1; + }else{ + break; + } + objv++; + objc--; } - if( objc!=4+isCheckNext ){ - Tcl_WrongNumArgs(interp, 1, objv, "?-next? VARNAME CHANGESET SCRIPT"); + if( objc!=4 ){ + Tcl_WrongNumArgs( + interp, 1, objv, "?-next? ?-invert? VARNAME CHANGESET SCRIPT"); return TCL_ERROR; } - pVarname = objv[1+isCheckNext]; - pCS = objv[2+isCheckNext]; - pScript = objv[3+isCheckNext]; + pVarname = objv[1]; + pCS = objv[2]; + pScript = objv[3]; pChangeset = (void *)Tcl_GetByteArrayFromObj(pCS, &nChangeset); sStr.nStream = test_tcl_integer(interp, SESSION_STREAM_TCL_VAR); - if( sStr.nStream==0 ){ - rc = sqlite3changeset_start(&pIter, nChangeset, pChangeset); + if( isInvert ){ + int f = SQLITE_CHANGESETSTART_INVERT; + if( sStr.nStream==0 ){ + rc = sqlite3changeset_start_v2(&pIter, nChangeset, pChangeset, f); + }else{ + void *pCtx = (void*)&sStr; + sStr.aData = (unsigned char*)pChangeset; + sStr.nData = nChangeset; + rc = sqlite3changeset_start_v2_strm(&pIter, testStreamInput, pCtx, f); + } }else{ - sStr.aData = (unsigned char*)pChangeset; - sStr.nData = nChangeset; - rc = sqlite3changeset_start_strm(&pIter, testStreamInput, (void*)&sStr); + if( sStr.nStream==0 ){ + rc = sqlite3changeset_start(&pIter, nChangeset, pChangeset); + }else{ + sStr.aData = (unsigned char*)pChangeset; + sStr.nData = nChangeset; + rc = sqlite3changeset_start_strm(&pIter, testStreamInput, (void*)&sStr); + } } if( rc!=SQLITE_OK ){ return test_session_error(interp, rc, 0); @@ -1202,6 +1239,45 @@ static int SQLITE_TCLAPI test_sqlite3rebaser_create( return TCL_OK; } +/* +** tclcmd: sqlite3rebaser_configure OP VALUE +*/ +static int SQLITE_TCLAPI test_sqlite3session_config( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + struct ConfigOpt { + const char *zSub; + int op; + } aSub[] = { + { "strm_size", SQLITE_SESSION_CONFIG_STRMSIZE }, + { "invalid", 0 }, + { 0 } + }; + int rc; + int iSub; + int iVal; + + if( objc!=3 ){ + Tcl_WrongNumArgs(interp, 1, objv, "OP VALUE"); + return SQLITE_ERROR; + } + rc = Tcl_GetIndexFromObjStruct(interp, + objv[1], aSub, sizeof(aSub[0]), "sub-command", 0, &iSub + ); + if( rc!=TCL_OK ) return rc; + if( Tcl_GetIntFromObj(interp, objv[2], &iVal) ) return TCL_ERROR; + + rc = sqlite3session_config(aSub[iSub].op, (void*)&iVal); + if( rc!=SQLITE_OK ){ + return test_session_error(interp, rc, 0); + } + Tcl_SetObjResult(interp, Tcl_NewIntObj(iVal)); + return TCL_OK; +} + int TestSession_Init(Tcl_Interp *interp){ struct Cmd { const char *zCmd; @@ -1217,6 +1293,7 @@ int TestSession_Init(Tcl_Interp *interp){ test_sqlite3changeset_apply_replace_all }, { "sql_exec_changeset", test_sql_exec_changeset }, { "sqlite3rebaser_create", test_sqlite3rebaser_create }, + { "sqlite3session_config", test_sqlite3session_config }, }; int i; diff --git a/main.mk b/main.mk index f32624d..d18313b 100644 --- a/main.mk +++ b/main.mk @@ -19,7 +19,7 @@ # EXE The suffix to add to executable files. ".exe" for windows # and "" for Unix. # -# TCC C Compiler and options for use in building executables that +# TCC C Compiler and options for use in building executables that # will run on the target platform. This is usually the same # as BCC, unless you are cross-compiling. # @@ -43,7 +43,7 @@ # This is how we compile # -TCCX = $(TCC) $(OPTS) -I. -I$(TOP)/src -I$(TOP) +TCCX = $(TCC) $(OPTS) -I. -I$(TOP)/src -I$(TOP) TCCX += -I$(TOP)/ext/rtree -I$(TOP)/ext/icu -I$(TOP)/ext/fts3 TCCX += -I$(TOP)/ext/async -I$(TOP)/ext/userauth TCCX += -I$(TOP)/ext/session @@ -236,7 +236,7 @@ SRC += \ $(TOP)/ext/session/sqlite3session.h SRC += \ $(TOP)/ext/userauth/userauth.c \ - $(TOP)/ext/userauth/sqlite3userauth.h + $(TOP)/ext/userauth/sqlite3userauth.h SRC += \ $(TOP)/ext/rbu/sqlite3rbu.c \ $(TOP)/ext/rbu/sqlite3rbu.h @@ -251,7 +251,7 @@ FTS5_HDR = \ $(TOP)/ext/fts5/fts5.h \ $(TOP)/ext/fts5/fts5Int.h \ fts5parse.h - + FTS5_SRC = \ $(TOP)/ext/fts5/fts5_aux.c \ $(TOP)/ext/fts5/fts5_buffer.c \ @@ -361,6 +361,7 @@ TESTSRC += \ $(TOP)/ext/misc/closure.c \ $(TOP)/ext/misc/csv.c \ $(TOP)/ext/misc/eval.c \ + $(TOP)/ext/misc/explain.c \ $(TOP)/ext/misc/fileio.c \ $(TOP)/ext/misc/fuzzer.c \ $(TOP)/ext/misc/ieee754.c \ @@ -395,6 +396,7 @@ TESTSRC2 = \ $(TOP)/src/dbstat.c \ $(TOP)/src/expr.c \ $(TOP)/src/func.c \ + $(TOP)/src/global.c \ $(TOP)/src/insert.c \ $(TOP)/src/wal.c \ $(TOP)/src/main.c \ @@ -430,7 +432,7 @@ TESTSRC2 = \ $(TOP)/ext/async/sqlite3async.c \ $(TOP)/ext/misc/stmt.c \ $(TOP)/ext/session/sqlite3session.c \ - $(TOP)/ext/session/test_session.c + $(TOP)/ext/session/test_session.c # Header files used by all library source files. # @@ -483,7 +485,7 @@ EXTHDR += \ EXTHDR += \ $(TOP)/ext/fts5/fts5Int.h \ fts5parse.h \ - $(TOP)/ext/fts5/fts5.h + $(TOP)/ext/fts5/fts5.h EXTHDR += \ $(TOP)/ext/userauth/sqlite3userauth.h @@ -506,7 +508,8 @@ FUZZDATA = \ $(TOP)/test/fuzzdata3.db \ $(TOP)/test/fuzzdata4.db \ $(TOP)/test/fuzzdata5.db \ - $(TOP)/test/fuzzdata6.db + $(TOP)/test/fuzzdata6.db \ + $(TOP)/test/fuzzdata7.db # Standard options to testfixture # @@ -799,7 +802,7 @@ rtree.o: $(TOP)/ext/rtree/rtree.c $(HDR) $(EXTHDR) -fts5parse.c: $(TOP)/ext/fts5/fts5parse.y lemon +fts5parse.c: $(TOP)/ext/fts5/fts5parse.y lemon cp $(TOP)/ext/fts5/fts5parse.y . rm -f fts5parse.h ./lemon $(OPTS) fts5parse.y @@ -833,13 +836,13 @@ sqlite3_analyzer.c: sqlite3.c $(TOP)/src/tclsqlite.c $(TOP)/tool/spaceanal.tcl $ tclsh $(TOP)/tool/mkccode.tcl $(TOP)/tool/sqlite3_analyzer.c.in >sqlite3_analyzer.c sqlite3_analyzer$(EXE): sqlite3_analyzer.c - $(TCCX) $(TCL_FLAGS) sqlite3_analyzer.c -o $@ $(LIBTCL) $(THREADLIB) + $(TCCX) $(TCL_FLAGS) sqlite3_analyzer.c -o $@ $(LIBTCL) $(THREADLIB) sqltclsh.c: sqlite3.c $(TOP)/src/tclsqlite.c $(TOP)/tool/sqltclsh.tcl $(TOP)/ext/misc/appendvfs.c $(TOP)/tool/mkccode.tcl tclsh $(TOP)/tool/mkccode.tcl $(TOP)/tool/sqltclsh.c.in >sqltclsh.c sqltclsh$(EXE): sqltclsh.c - $(TCCX) $(TCL_FLAGS) sqltclsh.c -o $@ $(LIBTCL) $(THREADLIB) + $(TCCX) $(TCL_FLAGS) sqltclsh.c -o $@ $(LIBTCL) $(THREADLIB) sqlite3_expert$(EXE): $(TOP)/ext/expert/sqlite3expert.h $(TOP)/ext/expert/sqlite3expert.c $(TOP)/ext/expert/expert.c sqlite3.c $(TCCX) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION $(TOP)/ext/expert/sqlite3expert.c $(TOP)/ext/expert/expert.c sqlite3.c -o sqlite3_expert$(EXE) $(THREADLIB) @@ -892,6 +895,10 @@ fts3-testfixture$(EXE): sqlite3.c fts3amal.c $(TESTSRC) $(TOP)/src/tclsqlite.c $(TESTSRC) $(TOP)/src/tclsqlite.c sqlite3.c fts3amal.c \ -o testfixture$(EXE) $(LIBTCL) $(THREADLIB) +coretestprogs: $(TESTPROGS) + +testprogs: coretestprogs srcck1$(EXE) fuzzcheck$(EXE) sessionfuzz$(EXE) + fulltest: $(TESTPROGS) fuzztest ./testfixture$(EXE) $(TOP)/test/all.test $(TESTOPTS) @@ -948,7 +955,7 @@ smoketest: $(TESTPROGS) fuzzcheck$(EXE) # The next two rules are used to support the "threadtest" target. Building # threadtest runs a few thread-safety tests that are implemented in C. This # target is invoked by the releasetest.tcl script. -# +# THREADTEST3_SRC = $(TOP)/test/threadtest3.c \ $(TOP)/test/tt3_checkpoint.c \ $(TOP)/test/tt3_index.c \ @@ -992,6 +999,10 @@ changeset$(EXE): $(TOP)/ext/session/changeset.c sqlite3.o $(TCC) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION -o changeset$(EXE) \ $(TOP)/ext/session/changeset.c sqlite3.o $(THREADLIB) +changesetfuzz$(EXE): $(TOP)/ext/session/changesetfuzz.c sqlite3.o + $(TCC) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION -o changesetfuzz$(EXE) \ + $(TOP)/ext/session/changesetfuzz.c sqlite3.o $(THREADLIB) + fts3view$(EXE): $(TOP)/ext/fts3/tool/fts3view.c sqlite3.o $(TCC) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION -o fts3view$(EXE) \ $(TOP)/ext/fts3/tool/fts3view.c sqlite3.o $(THREADLIB) @@ -1012,12 +1023,12 @@ wordcount$(EXE): $(TOP)/test/wordcount.c sqlite3.c $(TOP)/test/wordcount.c sqlite3.c speedtest1$(EXE): $(TOP)/test/speedtest1.c sqlite3.c - $(TCCX) -I. $(ST_OPT) -o speedtest1$(EXE) $(TOP)/test/speedtest1.c sqlite3.c $(THREADLIB) + $(TCCX) -I. $(ST_OPT) -o speedtest1$(EXE) $(TOP)/test/speedtest1.c sqlite3.c $(THREADLIB) kvtest$(EXE): $(TOP)/test/kvtest.c sqlite3.c - $(TCCX) -I. $(KV_OPT) -o kvtest$(EXE) $(TOP)/test/kvtest.c sqlite3.c $(THREADLIB) + $(TCCX) -I. $(KV_OPT) -o kvtest$(EXE) $(TOP)/test/kvtest.c sqlite3.c $(THREADLIB) -rbu$(EXE): $(TOP)/ext/rbu/rbu.c $(TOP)/ext/rbu/sqlite3rbu.c sqlite3.o +rbu$(EXE): $(TOP)/ext/rbu/rbu.c $(TOP)/ext/rbu/sqlite3rbu.c sqlite3.o $(TCC) -I. -o rbu$(EXE) $(TOP)/ext/rbu/rbu.c sqlite3.o \ $(THREADLIB) @@ -1049,7 +1060,7 @@ install: sqlite3 libsqlite3.a sqlite3.h mv libsqlite3.a /usr/lib mv sqlite3.h /usr/include -clean: +clean: rm -f *.o sqlite3 sqlite3.exe libsqlite3.a sqlite3.h opcodes.* rm -f lemon lemon.exe lempar.c parse.* sqlite*.tar.gz rm -f mkkeywordhash mkkeywordhash.exe keywordhash.h @@ -1077,7 +1088,7 @@ clean: rm -f sqlite3rc.h rm -f shell.c sqlite3ext.h rm -f sqlite3_analyzer sqlite3_analyzer.exe sqlite3_analyzer.c - rm -f sqlite3_expert sqlite3_expert.exe + rm -f sqlite3_expert sqlite3_expert.exe rm -f sqlite-*-output.vsix rm -f mptester mptester.exe rm -f fuzzershell fuzzershell.exe diff --git a/manifest b/manifest index eaeb48b..bb8f372 100644 --- a/manifest +++ b/manifest @@ -1,12 +1,12 @@ -C Version\s3.25.2 -D 2018-09-25T19:08:10.988 +C Version\s3.26.0 +D 2018-12-01T12:34:55.966 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea -F Makefile.in 6b650013511fd9d8b094203ac268af9220d292cc7d4e1bc9fbca15aacd8c7995 +F Makefile.in a050c8670ea0d7b37b2192306cbb50d392acd9902b84e9b56f3444d006f97a6c F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 -F Makefile.msc a889c6981a222d639f8a548adcfb3183ac07871e27452ace4d810735750f216a +F Makefile.msc 0d6831ff7951b302e888d86d4c469e2ec3c22f59eba4118b8c38d5a51d9e2d4f F README.md 377233394b905d3b2e2b33741289e093bc93f2e7adbe00923b2c5958c9a9edee -F VERSION 8d89a0e3dbf2fe06a028ad03f03d38e30295290cf2ef425a877547b193acaa58 +F VERSION 654da1d4053fb09ffc33a3910e6d427182a7dcdc67e934fa83de2849ac83fccb F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 @@ -33,11 +33,11 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55 -F configure 6876c95d54c96d8675f0e39838b6b557eb5fc7ce619ba014e31e0e261dff1f25 x +F configure 5811ffcd4866902d1706dcf8e0527f89165ec52859659942c9649bb1d3e4cc7b x F configure.ac 3552d3aecade98a9d4b64bceb48ffb7726cbc85902efde956812942f060fbd0a F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd -F doc/lemon.html ac63db056bce24b7368e29319cd1a7eb5f1798cc85922d96a80b6c3a4ff9f51b +F doc/lemon.html 24956ab2995e55fe171e55bdd04f22b553957dc8bb43501dbb9311e30187e0d3 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 F doc/vfs-shm.txt e101f27ea02a8387ce46a05be2b1a902a021d37a F ext/README.md fd5f78013b0a2bc6f0067afb19e6ad040e89a10179b4f6f03eee58fac5f169bd @@ -47,7 +47,7 @@ F ext/async/sqlite3async.h f489b080af7e72aec0e1ee6f1d98ab6cf2e4dcef F ext/expert/README.md b321c2762bb93c18ea102d5a5f7753a4b8bac646cb392b3b437f633caf2020c3 F ext/expert/expert.c d548d603a4cc9e61f446cc179c120c6713511c413f82a4a32b1e1e69d3f086a4 F ext/expert/expert1.test 333d037021c901322f9afc4a5687648ea23d56f1a0a079358a390664babf01be -F ext/expert/sqlite3expert.c 89b7b59be610b929958db02416539a46ac088fd84f81623c4190aff62e92c3c4 +F ext/expert/sqlite3expert.c 3da865f2286433588260f41e796422c611bceaca3a0bbf9139a619cf7d062c19 F ext/expert/sqlite3expert.h af6354f8ee5c9e025024e63fec3bd640a802afcc3099a44d804752cf0791d811 F ext/expert/test_expert.c d56c194b769bdc90cf829a14c9ecbc1edca9c850b837a4d0b13be14095c32a72 F ext/fts1/README.txt 20ac73b006a70bcfd80069bdaf59214b6cf1db5e @@ -80,25 +80,25 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 53020b61dac31c167668f098ec83c0387ecd65b9e89ba3659f2f8d3e76efdf1e +F ext/fts3/fts3.c 65b8489e35da23b127992c6dd6cfd382a486f8c87bf26dfa72876efe46e551bb F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 3378157f383540857a466420b8279626204434c3eb0dc948ad9bcd3991fc41f5 -F ext/fts3/fts3_aux.c 9edc3655fcb287f0467d0a4b886a01c6185fe9f1 +F ext/fts3/fts3_aux.c e9b465f8469acc2cd700a90c0242912a3202e4e4e15df72d7db7f1e3a2222c85 F ext/fts3/fts3_expr.c 3b1dbceddd8622599f3cc2626897667fe40487aaa1676707d6c37ec5a8422fc1 F ext/fts3/fts3_hash.c 29b986e43f4e9dd40110eafa377dc0d63c422c60 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c deb46f7020d87ea7a14a433fb7a7f4bef42a9652 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 F ext/fts3/fts3_snippet.c 68ae118b0f834ea53d2b89e4087fc0f0b8c4ee4e -F ext/fts3/fts3_term.c 88c55a6fa1a51ab494e33dced0401a6c28791fd7 +F ext/fts3/fts3_term.c 9b8065cc70ad514fcc25a7b099ddab8b5333f724dedd57184b7e79238e2b2a39 F ext/fts3/fts3_test.c 79f2a7fbb3f672fa032e5a432ca274ea3ee93c34 -F ext/fts3/fts3_tokenize_vtab.c a27593ab19657166f6fa5ec073b678cc29a75860 +F ext/fts3/fts3_tokenize_vtab.c a47c2a33de6db00816704315ac0a9afdfa1c71fa5b99f79171c0f7b30861f784 F ext/fts3/fts3_tokenizer.c a22bf311a71f3efa9d7012d8cc48fc9b0f3dace7 F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 525a3bd9a7564603c5c061b7de55403a565307758a94600e8a2f6b00d1c40d9d F ext/fts3/fts3_unicode2.c cc04fc672bfd42b1e650398cb0bf71f64f9aae032cfe75bbcfe75b9cf966029c -F ext/fts3/fts3_write.c b583dede85eb0c3c3026f8d7ccb781ea4e845ae583754fecb2ca425b5907d87d +F ext/fts3/fts3_write.c a85bc4885fde7f1b44c9de013b62f7cd3332dc59e208053d878729b1d04745bc F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -115,20 +115,20 @@ F ext/fts5/fts5_buffer.c 1dd1ec0446b3acfc2d7d407eb894762a461613e2695273f48e449bf F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 F ext/fts5/fts5_expr.c 5aef080ba3c8947e22f38ce1ff9fe548e4a740e72b77241f35ed941ae128d2c7 F ext/fts5/fts5_hash.c 32be400cf761868c9db33efe81a06eb19a17c5402ad477ee9efb51301546dd55 -F ext/fts5/fts5_index.c d1b2d7d92cb2b72b9465da35b7d7c30e4b426c7f208bf6f94ce86b50eed8a1cb -F ext/fts5/fts5_main.c 7e52868e6b444e5353ff30e1dcd2a9273e8eaa543ddccf0c94b3cd2c235ff104 +F ext/fts5/fts5_index.c baf3ad4451d32d35c2bd692ee4a81235ca7f26bd6f7613f7f73505474c33bbf2 +F ext/fts5/fts5_main.c 287a1a56580df304d7fa2fc1890f85b9cb6ac6b9e7c8af7dfa2151528db4b059 F ext/fts5/fts5_storage.c 4bec8a1b3905978b22a67bca5f4a3cfdb94af234cf51efb36f4f2d733d278634 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 65864ba1e5c34a61d409c4c587e0bbe0466eb4f8f478d85dc42a92caad1338e6 -F ext/fts5/fts5_test_tok.c ffd657dd67e7fcdb31bf63fb60b6d867299a581d0f46e97086abacd66c2a9b26 +F ext/fts5/fts5_test_tok.c 80de1a4b1a3caa216c3be8862440f0117a8357dd9b7cfc5a2a2ce11fe6eb64ae F ext/fts5/fts5_tokenize.c ebd13d034f3dc7c841e1c32c364a4fca5cc2e05a0b91682a93fa1e6defcd4292 F ext/fts5/fts5_unicode2.c 543cf0987c27ad59e5a7a6222480b917b5431009b7b139027c9581a63e39e37e F ext/fts5/fts5_varint.c a5aceacda04dafcbae725413d7a16818ecd65738 -F ext/fts5/fts5_vocab.c 1cd79854cb21543e66507b25b0578bc1b20aa6a1349b7feceb8e8fed0e7a77a6 +F ext/fts5/fts5_vocab.c fbe38044889b2d2d99babeeef239c620fb0332bb928a84506ac748d81500b354 F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba F ext/fts5/test/fts5_common.tcl b01c584144b5064f30e6c648145a2dd6bc440841 -F ext/fts5/test/fts5aa.test 87f4b50e755b52c6192c76ceccf4247d462bb44b52fa17358f273d8ce5d975f0 +F ext/fts5/test/fts5aa.test 840081efaee97f5ec570146bbdd79cfdfaea0ab303de3d5037b6d6c78b42ccdd F ext/fts5/test/fts5ab.test 9205c839332c908aaad2b01ab8670ece8b161e8f2ec8a9fabf18ca9385880bb7 F ext/fts5/test/fts5ac.test a7aa7e1fefc6e1918aa4d3111d5c44a09177168e962c5fd2cca9620de8a7ed6d F ext/fts5/test/fts5ad.test e8cf959dfcd57c8e46d6f5f25665686f3b6627130a9a981371dafdf6482790de @@ -151,11 +151,11 @@ F ext/fts5/test/fts5colset.test a30473451321bbf0b6218af62e96b4ae5fa99931cfdb210b F ext/fts5/test/fts5columnsize.test 45459ce4dd9fd853b6044cdc9674921bff89e3d840f348ca8c1630f9edbf5482 F ext/fts5/test/fts5config.test 60094712debc59286c59aef0e6cf511c37d866802776a825ce437d26afe0817f F ext/fts5/test/fts5conflict.test 655925678e630d3cdf145d18725a558971806416f453ac8410ca8c04d934238d -F ext/fts5/test/fts5connect.test b12a2a8b02af3c31c18abbc33aa8100d364de19a888a44457484d21dbccb18a7 +F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c073e19b3ae9126b2f4 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 -F ext/fts5/test/fts5corrupt.test 8957f0f7e57e0f8a102c5b6e1a7326d6a1966b28e1d99c5883822af1e6038e9e -F ext/fts5/test/fts5corrupt2.test 6deaf9f9606b3c957529db9881622bb3a7829b19bb3cdf8f276f074d684ede56 -F ext/fts5/test/fts5corrupt3.test 1b489101212206da1f27d0d03b9667e54571cba72db7e70b195fdf39f867b48c +F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe +F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f +F ext/fts5/test/fts5corrupt3.test ff9aee403611461e2619d2217c0d7d101a9c0179277c13c8a89516d7cf0dda43 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -175,11 +175,11 @@ F ext/fts5/test/fts5fault9.test 098e6b894bbdf9b2192f994a30f4043673fb3f338b6b8ab1 F ext/fts5/test/fts5faultA.test be4487576bff8c22cee6597d1893b312f306504a8c6ccd3c53ca85af12290c8c F ext/fts5/test/fts5faultB.test e6d04f9ea7b21be1d89abb8df2cb4baf65b0453b744d5a805fcd3ef45ff86a7e F ext/fts5/test/fts5faultD.test cc5d1225556e356615e719c612e845d41bff7d5a -F ext/fts5/test/fts5first.test 707a591b1b7d893fcfcb2366cbfe56aefab5d9c7cfa58bef35eba73a1dbf3b29 +F ext/fts5/test/fts5first.test 3fcf2365c00a15fc9704233674789a3b95131d12de18a9b996159f6909dc8079 F ext/fts5/test/fts5full.test 49b565da02918c06e58f51f0b953b0302b96f155aa68baba24782b81570685e2 F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e F ext/fts5/test/fts5hash.test a4cf51acad99bfc43c16fb74f9d22495dc221ae0701fc5e908ca963a9b26a02b -F ext/fts5/test/fts5integrity.test 6c4aad7f7380ec459a0c27ebbc0cb314fa67f3a3dad0cc820f612d33aa887166 +F ext/fts5/test/fts5integrity.test 4317561cd25eca7df16aa1f7d1a700ee958059fa639785f94aba0a84df9ab17b F ext/fts5/test/fts5lastrowid.test be98fe3e03235296585b72daad7aed5717ba0062bae5e5c18dd6e04e194c6b28 F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad F ext/fts5/test/fts5matchinfo.test 79129ff6c9a2d86943b287a5a8caa7ee639f6dcf004d8975d15c279374e82e35 @@ -195,10 +195,10 @@ F ext/fts5/test/fts5porter.test 8d08010c28527db66bc3feebd2b8767504aaeb9b101a9863 F ext/fts5/test/fts5porter2.test 0d251a673f02fa13ca7f011654873b3add20745f7402f108600a23e52d8c7457 F ext/fts5/test/fts5prefix.test a0fa67b06650f2deaa7bf27745899d94e0fb547ad9ecbd08bfad98c04912c056 F ext/fts5/test/fts5query.test ac363b17a442620bb0780e93c24f16a5f963dfe2f23dc85647b869efcfada728 -F ext/fts5/test/fts5rank.test beb1adae7b076beea98277f140e713f9713f503866d3ff7286c9805b220dd4a2 -F ext/fts5/test/fts5rebuild.test 6d09fd54b1170a1e54fe17b808bbf17fba3154956cc2f065dd94bf1e3d254f63 +F ext/fts5/test/fts5rank.test ca5000241924ecc2882db33c60f4f3a62b1ee6b16b5a9c8c6ddd9b6b2138489c +F ext/fts5/test/fts5rebuild.test 55d6f17715cddbf825680dd6551efbc72ed916d8cf1cde40a46fc5d785b451e7 F ext/fts5/test/fts5restart.test 835ecc8f449e3919f72509ab58056d0cedca40d1fe04108ccf8ac4c2ba41f415 -F ext/fts5/test/fts5rowid.test 365997f5aebd619df3ae46c2a4bfc8edba361899bc4e52cebfba0dbcbf720522 +F ext/fts5/test/fts5rowid.test b8790ec170a8dc1942a15aef3db926a5f3061b1ff171013003d8297203a20ad6 F ext/fts5/test/fts5simple.test 313ad28ef38ebe25f0a1673dd18f2fac446e25feb15bbb0c223a65ea00594f72 F ext/fts5/test/fts5simple2.test 258a1b0c590409bfa5271e872c79572b319d2a56554d0585f68f146a0da603f0 F ext/fts5/test/fts5simple3.test d5c74a9d3ca71bd5dd5cacb7c55b86ea12cdddfc8b1910e3de2995206898380f @@ -213,9 +213,9 @@ F ext/fts5/test/fts5unicode3.test c3caecbe8264629ffe653b43ca5790b9793eba4422f922 F ext/fts5/test/fts5unicode4.test 6463301d669f963c83988017aa354108be0b947d325aef58d3abddf27147b687 F ext/fts5/test/fts5unindexed.test 9021af86a0fb9fc616f7a69a996db0116e7936d0db63892db6bafabbec21af4d F ext/fts5/test/fts5update.test 0737876e20e97a6a6abf45de19fc99315727bcee6a83fadcada1cc080b9aa8f0 -F ext/fts5/test/fts5version.test 99b81372630fbf359107c96580fa761e41cdfb1dafc9966e148629ca72efee71 -F ext/fts5/test/fts5vocab.test 2ba98bcef0fcab3e5fead8eaabd6c0efb7e57bfe707a5cfcc18572ca9b277360 -F ext/fts5/test/fts5vocab2.test 2beeec974a305a1d79b91426622cc922c87065874437d22b400de7438979959e +F ext/fts5/test/fts5version.test c8f2cc105f0abf0224965f93e584633dee3e06c91478bc67e468f7cfdf97fd6a +F ext/fts5/test/fts5vocab.test 2de834ee6405130d3373817ced8fefbfee392b63d932e471740e09829f1e4510 +F ext/fts5/test/fts5vocab2.test d6039b20118e886113fc63614d9ad39a466fc2af34184f3e915b9f92b7ebfa10 F ext/fts5/tool/fts5speed.tcl b0056f91a55b2d1a3684ec05729de92b042e2f85 F ext/fts5/tool/fts5txt2db.tcl 526a9979c963f1c54fd50976a05a502e533a4c59 F ext/fts5/tool/loadfts5.tcl 95b03429ee6b138645703c6ca192c3ac96eaf093 @@ -270,21 +270,23 @@ F ext/lsm1/test/lsm1_common.tcl 5ed4bab07c93be2e4f300ebe46007ecf4b3e20bc5fbe1ded F ext/lsm1/test/lsm1_simple.test ca949efefa102f4644231dcd9291d8cda7699a4ce1006b26e0e3fcb72233f422 F ext/lsm1/tool/mklsm1c.tcl f31561bbee5349f0a554d1ad7236ac1991fc09176626f529f6078e07335398b0 F ext/misc/README.md d6dd0fe1d8af77040216798a6a2b0c46c73054d2f0ea544fbbcdccf6f238c240 -F ext/misc/amatch.c 6db4607cb17c54b853a2d7c7c36046d004853f65b9b733e6f019d543d5dfae87 +F ext/misc/amatch.c c0a6a807a553eaa220bf69fca0353cd1587a3bfb3d2224fa425e3e6efcacc98a F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a22525eddb F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb1967af7 -F ext/misc/btreeinfo.c 78c8c57d325185ccc04b7679e5b020e34a4d9c87453e6b7ac943d0a26cee3256 +F ext/misc/btreeinfo.c 4f0ebf278f46e68e6306c667917766cebc5550fd35d5de17847988e22892d4d2 F ext/misc/carray.c ed96c218ea940b85c9a274c4d9c59fe9491c299147a38a8bba537687bd6c6005 -F ext/misc/closure.c fe928228e8dfb2f00227311c203ccba9c2e5561f4f6de6da87e5b4a30cd8af15 -F ext/misc/completion.c fc811dda86d899c15848079c32cad40c181da1dd7a1a4f8d768a2c6ce07a1904 +F ext/misc/closure.c 9f8fa11aa6c6e2f6d7296ffa88f103df4b46abd9602bcab3ea2f8fc24f334f63 +F ext/misc/completion.c cec672d40604075bb341a7f11ac48393efdcd90a979269b8fe7977ea62d0547f F ext/misc/compress.c dd4f8a6d0baccff3c694757db5b430f3bbd821d8686d1fc24df55cf9f035b189 -F ext/misc/csv.c 65297bcce8d5acd5aadef42acbe739aef5a2ef5e74c7b73361ca19f3e21de657 +F ext/misc/csv.c 88333dc9f7dcf6a8148406f10ae04261e24e3b4c721550ae33e9e71f1265c1f1 F ext/misc/dbdump.c 12389a10c410fadf1e68eeb382def92d5a7fa9ce7cce4fb86a736fa2bac1000a F ext/misc/eval.c 6ea9b22a5fa0dd973b67ca4e53555be177bc0b7b263aadf1024429457c82c0e3 -F ext/misc/fileio.c 7317d825fab6a3c48f6e3822a00a6a22e08e55af31700ac96f16a523f83069fd +F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f +F ext/misc/fileio.c e3153b04433897a18a3d17185845f286892e96fdf87f4301290d09c36ae1759f F ext/misc/fuzzer.c 7c64b8197bb77b7d64eff7cac7848870235d4c25 F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c -F ext/misc/json1.c 276f87dc8365b34b0fffb7ef32481dd07fac6fdb3224e2822396a48377ac8363 +F ext/misc/json1.c 3f017d2659e531d021d015ec5d69ea0b1c71f2e15bf9768b1e149fcdf6c3e0b1 +F ext/misc/memstat.c 941928c6104d8ed569a6c47caa756dc78b8091f7a15f87d3004f3b1e576b10da F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 F ext/misc/mmapwarm.c 70b618f2d0bde43fae288ad0b7498a629f2b6f61b50a27e06fae3cd23c83af29 F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 @@ -294,59 +296,59 @@ F ext/misc/regexp.c a68d25c659bd2d893cd1215667bbf75ecb9dc7d4 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 540a169cb0d74f15522a8930b0cccdcb37a4fd071d219a5a083a319fc6e8db77 F ext/misc/scrub.c db9fff56fed322ca587d73727c6021b11ae79ce3f31b389e1d82891d144f22ad -F ext/misc/series.c c7197db304f7009b08d6459a9de02e7f51ad0e1a3fdacbc1ebf5252a9a346959 -F ext/misc/sha1.c 0b9e9b855354910d3ca467bf39099d570e73db56 -F ext/misc/shathree.c 9e960ba50483214c6a7a4b1517f8d8cef799e9db381195178c3fd3ad207e10c0 +F ext/misc/series.c 0c97f63378fddc9f425e82ba139b9aaf902211f24ced115c2b6ae12b425f7334 +F ext/misc/sha1.c df0a667211baa2c0612d8486acbf6331b9f8633fd4d605c17c7cccd26d59c6bd +F ext/misc/shathree.c 22ba7ca84a433d6466a7d05dcc876910b435a715da8cc462517db9351412b8c8 F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52 -F ext/misc/spellfix.c 54d650f44f3a69a851814791bd4d304575cdbbf78d96d4f0801b44a8f31a58c5 +F ext/misc/spellfix.c f88ecb2c0294453ce8b7704b211f5350c41b085b38c8e056852e3a08b0f5e484 F ext/misc/sqlar.c 57d5bc45cd5492208e451f697404be88f8612527d64c9d42f96b325b64983d74 -F ext/misc/stmt.c 6f16443abb3551e3f5813bb13ba19a30e7032830015b0f92fe0c0453045c0a11 -F ext/misc/templatevtab.c 8251b31011dd00fc38e739c78c234c930be42b3b274bbe0493b79cd40db02a9e +F ext/misc/stmt.c 8a8dc4675042e4551e4afe99b8d0cc7a4a2fc1a8dacc0a9ce1b1bbff145da93d +F ext/misc/templatevtab.c 8a16a91a5ceaccfcbd6aaaa56d46828806e460dd194965b3f77bf38f14b942c4 F ext/misc/totype.c 4a167594e791abeed95e0a8db028822b5e8fe512 -F ext/misc/unionvtab.c 0b3173f69b8899da640a13a345dc5ef1400199405f738abe6145b2454195b8ff +F ext/misc/unionvtab.c acf947858054850db2d4a611bfeae072cdc6d9f517b46a993fe1f2f1ea20031e F ext/misc/vfslog.c fe40fab5c077a40477f7e5eba994309ecac6cc95 F ext/misc/vfsstat.c bf10ef0bc51e1ad6756629e1edb142f7a8db1178 -F ext/misc/vtablog.c 31d0d8f4406795679dcd3a67917c213d3a2a5fb3ea5de35f6e773491ed7e13c9 +F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 -F ext/misc/zipfile.c c4de8f0ad446ce4a49aae11ff7b771cd7af60d7136c0bcfb53da1475b9075e79 +F ext/misc/zipfile.c 1d731db326c40e11fc608f38132acff31619946c000e85ab8efe75bbedc2a441 F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce -F ext/rbu/rbu1.test 41123c64e8c88bd14eb7d3f8562f37fa87aaeb154b1eade2881de21d3504be55 -F ext/rbu/rbu10.test 1846519a438697f45e9dcb246908af81b551c29e1078d0304fae83f1fed7e9ee -F ext/rbu/rbu11.test 9bc68c2d3dbeb1720153626e3bd0466dcc017702 -F ext/rbu/rbu12.test bde22ed0004dd5d1888c72a84ae407e574aeae16 -F ext/rbu/rbu13.test 462ff799c4afedc3ef8a47ff818c0ffbf14ae4f2 -F ext/rbu/rbu14.test 01f5dcba904aecadbaea69d4ccdc2ea43dd30560 -F ext/rbu/rbu3.test 8bd4c6b87367c358981b6a47dc3d654fa60bff90 -F ext/rbu/rbu5.test cf1fa84d6107efd73e292a7be8e1fb31953ca45c -F ext/rbu/rbu6.test 32e8ed60631b6facdb6366bd2b5f5f25245e7edb -F ext/rbu/rbu7.test fd025d5ba440fcfe151fbb0e3835e1e7fe964fa1 -F ext/rbu/rbu8.test 3bbf2c35d71a843c463efe93946f14ad10c3ede0 -F ext/rbu/rbu9.test 0806d1772c9f4981774ff028de6656e4183082af -F ext/rbu/rbuA.test 4e58e46e60d4064248614c43303d71f1b18cc804dd834ce6a913b3861828b28d -F ext/rbu/rbuB.test c25bc325b8072a766e56bb76c001866b405925c2 -F ext/rbu/rbuC.test efe47db508a0269b683cb2a1913a425ffd39a831 +F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 +F ext/rbu/rbu10.test 0a201c32202143f23c81c0144503da339786fc20acb7a2fda11601b65659f314 +F ext/rbu/rbu11.test 5c834cf491086b45e071eabf71f708febc143e86a384a92de69e0b1a4cace144 +F ext/rbu/rbu12.test 29f8b2118f6c96fac3755bd6d2b55c2db24f878b1f11fbfbe294f3a230a3dcdc +F ext/rbu/rbu13.test 1285298e3360ec74511764841b3c174dcfe21da2f618c22febf1a20abd0365c2 +F ext/rbu/rbu14.test 4a7bf0b3a4516d3ab0bc0ba4ceb53eb7e3324147ccda152e561060f659dbba31 +F ext/rbu/rbu3.test d6c6cc7a1326e8e23b9820f30bd3054f22092e503fadfd2a660ae006653f6d80 +F ext/rbu/rbu5.test 724b38ea5f722e3d22dc76343860bd998bb676c3f78c4bc8175df5c5d7720e23 +F ext/rbu/rbu6.test 401064236d3cf86b7edc01c586d7c5554f48553946fbfa1a3af35d7e47dce9e3 +F ext/rbu/rbu7.test ae25f47b56f178197fc1098537a35a39176cc73d1629b03dc9d795929fc36ec2 +F ext/rbu/rbu8.test b98a6fc58ead84a0e6ddee775b9702cd981f318d5d4fd1d4df0fa0c40db7251b +F ext/rbu/rbu9.test 0e4d985e25620d61920597e8ea69c871c9e8c1f5a0be2ae9fa70bb641d74378c +F ext/rbu/rbuA.test b34a90cb495682c25b5fc03a9d5e7a4fc99541c29256f25e2e2a4f6542b4f5b3 +F ext/rbu/rbuB.test 52b07158824c6927b7e25554ace92a695cdebfc296ae3d308ac386984aded9bc +F ext/rbu/rbuC.test 80f1cc2fb74f44b1128fd0ed8eedab3a76fefeb72a947860e2869ef76fc8dc6b F ext/rbu/rbu_common.tcl acfb7fbbaf8d46a9f6f6a5ec795616c84d705e1565d918afe43f0ff53ea0efa5 -F ext/rbu/rbucollate.test 86d6fc9b8f59a27b7b5a6e20b5e29816d338a0dbdea8c54bfcc549a0d437f3ea -F ext/rbu/rbucrash.test 61470d977a06a0abc2ec35b05d82a1d7d87d10f4ffabad14c1c231edc942ad66 -F ext/rbu/rbucrash2.test b2ecbdd7bb72c88bd217c65bd00dafa07f7f2d4d -F ext/rbu/rbudiff.test 3e605cf624d00d04d0fb1316a3acec4fbe3b3ac5 -F ext/rbu/rbudor.test 99b05cc0df613e962c2c8085cfb05686a09cf315 -F ext/rbu/rbufault.test 2654aef20f8ee7de37c9c1997a44f2773dc7bf24887adea39fb19314ef32cb90 -F ext/rbu/rbufault2.test 9a7f19edd6ea35c4c9f807d8a3db0a03a5670c06 -F ext/rbu/rbufault3.test 0913c1aeaee266d9c36c33179341a5a504aad7d423d1979cfec43c8346a29899 -F ext/rbu/rbufault4.test 34e70701cbec51571ffbd9fbf9d4e0f2ec495ca7 -F ext/rbu/rbufts.test a2bbd202c9321fba15fb4a62a90add7d70e07bd8404e1e598135adbfff8a0508 -F ext/rbu/rbumulti.test 2cf153ab3d5861ff26517dc6cbaec430787a59f1d50e8771fe7a7529a0551cf1 -F ext/rbu/rbuprogress.test 1849d4e0e50616edf5ce75ce7db86622e656b5cf -F ext/rbu/rburesume.test 8acb77f4a422ff55acfcfc9cc15a5cb210b1de83 -F ext/rbu/rbusave.test 0f43b6686084f426ddd040b878426452fd2c2f48 -F ext/rbu/rbusplit.test 69271c790732b28bd465551d80b0a9a3f074e189896ee8490ce56d22078c124d -F ext/rbu/rbutemplimit.test cd553a9288d515d0b5f87d277e76fd18c4aa740b761e7880fab11ce986ea18d1 -F ext/rbu/rbuvacuum.test ff357e9b556ca7ad4673da0ff7f244def919ff858e0f9f350d3e30fdd83a62a8 -F ext/rbu/rbuvacuum2.test 2074ab14fe66e1c7e7210c62562650dcd215bbaa -F ext/rbu/sqlite3rbu.c f438fea899d15d13ff3e3133242b9e378c37b5a3d76add8c342c68bdd65c6819 +F ext/rbu/rbucollate.test cac528a9a46318cba42e61258bb42660bbbf4fdb9a8c863de5a54ad0c658d197 +F ext/rbu/rbucrash.test 000981a1fe8a6e4d9a684232f6a129e66a3ef595f5ed74655e2f9c68ffa613b4 +F ext/rbu/rbucrash2.test efa143cc94228eb0266d3f1abfbee60a5838a84cef7cc3fcb8c145b74d96fd41 +F ext/rbu/rbudiff.test 156957851136b63c143478518dc1bda6c832103cdbe8ac1d7cdd47edb3cbe0a3 +F ext/rbu/rbudor.test e3e8623926012f43eebe51fedf06a102df2640750d971596b052495f2536db20 +F ext/rbu/rbufault.test 2d7f567b79d558f6e093c58808cab4354f8a174e3802f69e7790a9689b3c09f8 +F ext/rbu/rbufault2.test 06e735c002c17802d93debca41f59b027e7429db7de17f2a81318ecfd3c651d4 +F ext/rbu/rbufault3.test e0052ccba428ffdd2bb989d3ae84716f058ec5ab5f7196c64ba407b9d23c7255 +F ext/rbu/rbufault4.test 03d2849c3df7d7bd14a622e789ff049e5080edd34a79cd432e01204db2a5930a +F ext/rbu/rbufts.test 0ae8d1da191c75bd776b86e24456db0fb6e97b7c944259fae5407ea55d23c31d +F ext/rbu/rbumulti.test 5fb139058f37ddc5a113c5b93238de915b769b7792de41b44c983bc7c18cf5b9 +F ext/rbu/rbuprogress.test 04614ff8820bab9c1ec1b7dbec1edc4b45474421d4fe7abbd2a879a9c02884f9 +F ext/rbu/rburesume.test dbdc4ca504e9c76375a69e5f0d91205db967dcc509a5166ca80231f8fda49eb1 +F ext/rbu/rbusave.test f4190a1a86fccf84f723af5c93813365ae33feda35845ba107b59683d1cdd926 +F ext/rbu/rbusplit.test b37e7b40b38760881dc9c854bd40b4744c6b6cd74990754eca3bda0f407051e8 +F ext/rbu/rbutemplimit.test 7f408f49b90fa0a720d7599f3aec74a3c85e6cd78e56fdf726ce00af9147a341 +F ext/rbu/rbuvacuum.test 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697d79f73534 +F ext/rbu/rbuvacuum2.test 0a7669bbabdaeed915f02f59f33fe20e13d4932ba2086fe00a82064d9424c80b +F ext/rbu/sqlite3rbu.c 71f8c09948d09ec9c5a8dbe7127e8ef61ef0853e698b2650be2485ac7b9c75c8 F ext/rbu/sqlite3rbu.h b42bcd4d8357268c6c39ab2a60b29c091e89328fa8cc49c8fac5ab8d007e79b2 F ext/rbu/test_rbu.c baa23eb28457580673d2175e5f0c29ced0cd320ee819b13ad362398c53b96e90 F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 @@ -356,11 +358,11 @@ F ext/repair/sqlite3_checker.c.in 4a5a3af3f450fe503e5a2985e98516dc2a6b9ad247449e F ext/repair/sqlite3_checker.tcl a9a2caa9660567257c177a91124d8c0dccdfa341e25c51e6da7f1fd9e601eafa F ext/repair/test/README.md 34b2f542cf5be7bffe479242b33ee3492cea30711e447cc4a1a86cb5915f419e F ext/repair/test/checkfreelist01.test 3e8aa6aeb4007680c94a8d07b41c339aa635cc78249442da72ff3f8297398a69 -F ext/repair/test/checkindex01.test 6945d0ffc0c1dc993b2ce88036b26e0f5d6fcc65da70fc9df27c2647bb358b0f +F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c335096108c12c01bddbadcec F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/geopoly.c 415a8ca5dfab54eea779e0bf31a859afb0b869a5147a726df4aec4b57c1bad57 -F ext/rtree/rtree.c 6cc2e673cf1e9ea1619f13ab990f12389dfb951b131acbc2fbe164cee8992a20 +F ext/rtree/geopoly.c d56ff997f2646b03be742eb85e8206f779d777f3a282fe0da576780ca0e11f20 +F ext/rtree/rtree.c 7125183bf6c37b8b8ee1a04d2b0fe258531fd31650fdd050ed041817f1943d17 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 309afc04d4287542b2cd74f933296832cc681c7b014d9405cb329b62053a5349 F ext/rtree/rtree2.test 5f25b01acd03470067a2d52783b2eb0a50bf836803d4342d20ca39e541220fe2 @@ -369,9 +371,9 @@ F ext/rtree/rtree4.test 304de65d484540111b896827e4261815e5dca4ce28eeecd58be648cd F ext/rtree/rtree5.test 49c9041d713d54560b315c2c7ef7207ee287eba1b20f8266968a06f2e55d3142 F ext/rtree/rtree6.test 593e0d36510d5ac1d1fb39b018274ff17604fe8fdca8cf1f8e16559cea1477f4 F ext/rtree/rtree7.test c8fb2e555b128dd0f0bdb520c61380014f497f8a23c40f2e820acc9f9e4fdce5 -F ext/rtree/rtree8.test 924926d7c64ac59fcca0809de472d9dd73c612f54daae1cf992bdd7dac90305b +F ext/rtree/rtree8.test 2d99006a1386663978c9e1df167554671e4f711c419175b39f332719deb1ce0e F ext/rtree/rtree9.test c646f12c8c1c68ef015c6c043d86a0c42488e2e68ed1bb1b0771a7ca246cbabf -F ext/rtree/rtreeA.test 20623ca337ca3bd7e008cc9fb49e44dbe97f1a80b238e10a12bb4afcd0da3776 +F ext/rtree/rtreeA.test ed2f1be9c06dde0b1ab93a95dd9e87eeaa02db2d30bcb4b9179b69ee3dc3319b F ext/rtree/rtreeB.test 4cec297f8e5c588654bbf3c6ed0903f10612be8a2878055dd25faf8c71758bc9 F ext/rtree/rtreeC.test 128928549d22b65c381ab1366760d08703cd75e34f6a7a506ece38f9330b7282 F ext/rtree/rtreeD.test fe46aa7f012e137bd58294409b16c0d43976c3bb92c8f710481e577c4a1100dc @@ -381,15 +383,17 @@ F ext/rtree/rtreeG.test 1b9ca6e3effb48f4161edaa463ddeaa8fca4b2526d084f9cbf5dbe4e F ext/rtree/rtreeH.test aa08cc4fa8005b4c67446c7110205055b4d6da90e760e6f44b82dfa4cdf8d87a F ext/rtree/rtree_perf.tcl 6c18c1f23cd48e0f948930c98dfdd37dfccb5195 F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b587936f5f6bceed -F ext/rtree/rtreecheck.test 4d29103d1e16fcbf90135d1c637b833688492b063b2971dfb5dc6ba76555cfee +F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/sqlite3rtree.h 9c5777af3d2921c7b4ae4954e8e5697502289d28 +F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 -F ext/rtree/visual01.txt 17c3afefc208c375607aa82242e97fa79c316e539bcd0b7b3e59344c69445d05 +F ext/rtree/visual01.txt e9c2564083bcd30ec51b07f881bffbf0e12b50a3f6fced0c222c5c1d2f94ac66 F ext/session/changeset.c 4ccbaa4531944c24584bf6a61ba3a39c62b6267a -F ext/session/session1.test 4532116484f525110eb4cfff7030c59354c0cde9def4d109466b0df2b35ad5cc +F ext/session/changesetfuzz.c 255826ee367781ec4c29a36c7c63e9ee6387dc03a8346cf240feb8d597958b0e +F ext/session/changesetfuzz1.test 2e1b90d888fbf0eea5e1bd2f1e527a48cc85f8e0ff75df1ec4e320b21f580b3a +F ext/session/session1.test 0b2f88995832ea040ae8e83a1ad4afa99c00b85c779d213da73a95ea4113233e F ext/session/session2.test 284de45abae4cc1082bc52012ee81521d5ac58e0 F ext/session/session3.test ce9ce3dfa489473987f899e9f6a0f2db9bde3479 F ext/session/session4.test 6778997065b44d99c51ff9cece047ff9244a32856b328735ae27ddef68979c40 @@ -399,31 +403,32 @@ F ext/session/session8.test 8e194b3f655d861ca36de5d4de53f702751bab3b F ext/session/session9.test 5409d90d8141881d08285ed1c2c0d8d10fb92069 F ext/session/sessionA.test 1feeab0b8e03527f08f2f1defb442da25480138f F ext/session/sessionB.test 886252dcb7e692e62ef7e357456200912e367823 -F ext/session/sessionC.test 97556f5164ac29f2344b24bd7de6a3a35a95c390 -F ext/session/sessionD.test d3617e29aa15c9413aee5286d99587633245d58d2ad28f3f331c822735418a22 -F ext/session/sessionE.test 0a616c4ad8fd2c05f23217ebb6212ef80b7fef30f5f086a6633a081f93e84637 -F ext/session/sessionF.test c2f178d4dfd723a5fd94a730ea2ccb44c669e3ce -F ext/session/sessionG.test 3edde849c4071078d92bd682c836186f6e4e5a3fb6bcf3fc1de1a7caa5e4427d -F ext/session/sessionH.test 332b60e4c2e0a680105e11936201cabe378216f307e2747803cea56fa7d9ebae -F ext/session/session_common.tcl ee925e0d233677e45e395fb1f559b84068ce7baa8aa1034441739d3e87ee249c +F ext/session/sessionC.test f8a5508bc059ae646e5ec9bdbca66ad24bc92fe99fda5790ac57e1f59fce2fdf +F ext/session/sessionD.test 4f91d0ca8afc4c3969c72c9f0b5ea9527e21de29039937d0d973f821e8470724 +F ext/session/sessionE.test b2010949c9d7415306f64e3c2072ddabc4b8250c98478d3c0c4d064bce83111d +F ext/session/sessionF.test d37ed800881e742c208df443537bf29aa49fd56eac520d0f0c6df3e6320f3401 +F ext/session/sessionG.test 3828b944cd1285f4379340fd36f8b64c464fc84df6ff3ccbc95578fd87140b9c +F ext/session/sessionH.test a417559f29a7e775950fc5fc82b3d01256a7cbe793ddf1180df234df823d56e2 +F ext/session/session_common.tcl 29ec9910aca1e996ca1c8531b8cecabf96eb576aa53de65a8ff03d848b9a2a8b F ext/session/session_speed_test.c edc1f96fd5e0e4b16eb03e2a73041013d59e8723 F ext/session/sessionat.test efe88965e74ff1bc2af9c310b28358c02d420c1fb2705cc7a28f0c1cc142c3ec F ext/session/sessiondiff.test ad13dd65664bae26744e1f18eb3cbd5588349b7e9118851d8f9364248d67bcec F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 -F ext/session/sessionfault2.test 555a8504de03d59b369ef20209585da5aeb2671dedabc4584e9ffe6269689185 -F ext/session/sessionrebase.test 4e1bcfd26fd8ed8ac571746f56cceeb45184f4d65490ea0d405227cfc8a9cba8 -F ext/session/sessionstat1.test 41cd97c2e48619a41cdf8ae749e1b25f34719de638689221aa43971be693bf4e -F ext/session/sessionwor.test 2f3744236dc8b170a695b7d8ddc8c743c7e79fdc -F ext/session/sqlite3session.c 2d29bbd888599b94b2c8b31ff433675e008273a4d225b336508b18e6187fec1d -F ext/session/sqlite3session.h c01820d5b6e73e86d88008f4d1c1c7dfb83422963018292b864028a0400ceccf -F ext/session/test_session.c dba36c6c0153b22501112d3e8882b5c946cf617c955153b6712bd2f8ba1428c0 +F ext/session/sessionfault2.test dd593f80b6b4786f7adfe83c5939620bc505559770cc181332da26f29cddd7bb +F ext/session/sessioninvert.test ae1a003a9ab1f8d64227dbb5c3a4c97e65b561b01e7b2953cf48683fb2724169 +F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2f05e82363b9142810 +F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5 +F ext/session/sessionwor.test 07f0b304dc4df5454906069140bf6ec67edcaa3c548f3683354003cf2c22b64a +F ext/session/sqlite3session.c dbd6f7a89c1236d8e7b58f4e217391670ce91b9e6f85c16ba02832674ef0cf3c +F ext/session/sqlite3session.h 05351d2f50a1203fdffbeb590fdbbc796c9a6bfcd0c9b26cf6db3854e3eb4294 +F ext/session/test_session.c 98797aba475a799376c9a42214f2d1debf2d0c3cb657d9c8bbf4f70bf3fb4aec F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04 F ext/userauth/userauth.c f81aa5a3ecacf406f170c62a144405858f6f6de51dbdc0920134e629edbe2648 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 1db6df4bff24ed6684917e3fe311ce28f5924d6417c698fe4326f7cadf02df31 +F main.mk eeaa279fa6acdcfa6555058548075569a06f891fd67f5901b1e7700d18052fda F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -435,37 +440,37 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 70dd115eb1f949f69f61773733dc89d6494915ec6a736f259c7a7de4aeb51726 +F src/alter.c f886160da189e4e99093cd5a2aca625652cc9b027d5100b87f81c175d1056387 F src/analyze.c 3dc6b98cf007b005af89df165c966baaa48e8124f38c87b4d2b276fe7f0b9eb9 -F src/attach.c 4bd5b92633671d3e8ce431153ebb1893b50335818423b5373f3f27969f79769a -F src/auth.c 32a5bbe3b755169ab6c66311c5225a3cd4f75a46c041f7fb117e0cbb68055114 +F src/attach.c 92b51739a885da8bd84bc9a05485f1e48148bce5c15432f059b45af98fff75cd +F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 3f5e1a03db871e627bf5da21092bf7434ecfc5c5980bbd7d45eba13341340173 +F src/btree.c ba7c7eef4461790f37c309936bfc5d0d6ba9b194b02d3c8ff1fd53b420ea6d3b F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 -F src/build.c 0b3d422770877d74ee6d54f4c122d82c48f7d04ee3bfb91702e402de7f5c45ac -F src/callback.c 36caff1e7eb7deb58572d59c41cee8f064a11d00297616995c5050ea0cfc1288 +F src/build.c 127d33ad57b455a9339e9fabff41284c8b030cc6247ca7a2a6c0ad7abfc1ce85 +F src/callback.c 789bd33d188146f66c0dd8306472a72d1c05f71924b24a91caf6bd45cf9aba73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e -F src/ctime.c b157b01081f92442f8b0218ddb93ddce8ebddad36dbddeecfdd771561dd4f387 +F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 -F src/dbpage.c 4aa7f26198934dbd002e69418220eae3dbc71b010bbac32bd78faf86b52ce6c3 -F src/dbstat.c edabb82611143727511a45ca0859b8cd037851ebe756ae3db289859dd18b6f91 -F src/delete.c 107e28d3ef8bd72fd11953374ca9107cd74e8b09c3ded076a6048742d26ce7d2 -F src/expr.c d8da79a5cb19bbded56181337a221ead5f4ad3cbf0fbcb5da2156abefab566cd +F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 +F src/dbstat.c 3c8bd4e77f0244fd2bd7cc90acf116ad2f8e82d70e536637f35ac2bc99b726f9 +F src/delete.c f7938125847e8ef485448db5fbad29acb2991381a02887dd854c1617315ab9fb +F src/expr.c 9aacc0b72348ba90010b672dcbbbe2fa56e1182043bc917a3a147b2bc57a5497 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c f59253c0be4b1e9dfcb073b6d6d6ab83090ae50c08b5c113b76013c4b157cd6a +F src/fkey.c 972a4ba14296bef2303a0abbad1e3d82bc3c61f9e6ce4e8e9528bdee68748812 F src/func.c 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f -F src/global.c 9bf034fd560bdd514715170ed8460bb7f823cec113f0569ef3f18a20c7ccd128 -F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a +F src/global.c 8291eee0782b83124de14ec0389ec9fd6ae1873358a6b0d9469fe17a46ad803b +F src/hash.c 931ec82d7e070654a8facb42549bbb3a25720171d73ba94c3d3160580d01ef1f F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c c723716f0de7aa0a679300f7d3541c89645f4a9882161cecdb3093fc07f8cc4b +F src/insert.c 6b81aae27b196925d8ff78824f4bbd435d6a40cd38dc324685e21735bb402109 F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e -F src/loadext.c 30b140d0e5031924c56f802760506c0a235ced0dff9f3d95119aa86df12856e2 -F src/main.c 6275ece0699a957c4709a7ebe29476f132adbe459d18a6b497e234e4669abf91 +F src/loadext.c 9050dd153b5583804184be9c9dee9ebb554178d6db1f8ac280899e8aad9060e6 +F src/main.c 4cfb3913cc9e65d3ac649b1785ac753fc225d29425d5437e012f7eac0cefe0eb F src/malloc.c 07295435093ce354c6d9063ac05a2eeae28bd251d2e63c48b3d67c12c76f7e18 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -485,33 +490,33 @@ F src/os.c 8aeb0b0f40f8f5b0da03fe49706695adaf42d2f516ab95abc72e86c245e119de F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c 7cfd67db0e2f926243f646db7ec1caa33ca9bee45799b0160ddfcd6ccfc175d2 -F src/os_win.c 070cdbb400097c6cda54aa005356095afdc2f3ee691d17192c54724ef146a971 +F src/os_unix.c f6e91b8fd82af7afbfd073c4974ad6cdb8e62d9f65ceddb45167835a0567fdc0 +F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c a0d8f686ef64549ad5b356fd30429bd9ee7a06dd42b4d6faa096352ff26b1c5b -F src/pager.h ecc554a55bc55d1c4ba5e17137b72e238e00bd81e72ff2662d8b9c8c10ae3963 -F src/parse.y 4118dbf9c37c410e5c4775c033b1aaf67ac8ff7965df7a4bb429dd5db2dbe374 -F src/pcache.c 135ef0bc6fb2e3b7178d49ab5c9176254c8a691832c1bceb1156b2fbdd0869bd -F src/pcache.h 072f94d29281cffd99e46c1539849f248c4b56ae7684c1f36626797fee375170 -F src/pcache1.c 716975564c15eb6679e97f734cec1bfd6c16ac3d4010f05f1f8e509fc7d19880 -F src/pragma.c 79abc65c08d2754048efee3ba99fe91863dfeab0ba699a4439fa5053ec87cf36 -F src/pragma.h fb46b1e663128f6827979ad8ebddb55be2a0276ea923c47adeac02144207a682 -F src/prepare.c f8e260d940a0e08494c0f30744521b2f832d7263eca9d02b050cea0ba144b097 +F src/pager.c 75e0f3cfa3962c714f519f8a3d1e67ecca1c91de0e010a036b988e40ce9e4c73 +F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 +F src/parse.y 6840fe7c0b5eb4dd25ee5d075213bc8255ed4c0678d71bfb6744d0520d91c179 +F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee +F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 +F src/pcache1.c bf9fcea656dce1cd2cca6b77a1d1d3552050d55a31c98bf0d9f405930a83bc95 +F src/pragma.c 4e056f042683b99c4ea0db395f68d051b1a95833ab40951c40d3ef7e1fee1354 +F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13 +F src/prepare.c f81f8d707e583192c28fea0b2e19385415b7d188123b23f49b038076408d7a69 F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 352c6af1a99441206ff62a6f7429dbf537827f42c428639695220b9c8639e33b +F src/resolve.c 4cfc44def0f0690ceaab8f6481f5d76284d7f9509aab6e218a679b4836a54614 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 8afcc2b56a6ef76717bb59b6109cd3de0f6fae2803894d6f806640c0aa24dfac -F src/shell.c.in 6e0aad854be738a5d0368940459399be211e9ac43aebe92bb9ed46cfe38d0e1f -F src/sqlite.h.in 4b4c2f2daeeed4412ba9d81bc78092c69831fe6eda4f0ae5bf951da51a8dccec +F src/select.c 61e867a906f140b73baf4ce7a201ad6dcba30820969f5618ee40e9a0d32c6f5f +F src/shell.c.in 482e23a370cbe5b0d4c73a0f0f5fce34f7caa08a14a8d75e12f0225c4e14915c +F src/sqlite.h.in cce9feede1c1c03923c091b4bbbd081dd77aaf92024cc2cdbf65f712c2f668c3 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 -F src/sqlite3ext.h 305adca1b5da4a33ce2db5bd236935768e951d5651bfe5560ed55cfcdbce6a63 -F src/sqliteInt.h 10d7835f2a1ae736a468c38a413b754933051fc97255aa2f4ac2df2ad349e863 +F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 +F src/sqliteInt.h 1161f7579cdd6217737a66517ef27f4016426603eff492e9b31f45a7d7d4c61f F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c e72862a271348d779672b45a730c33fd0c535e630ff927e8ce4a0c908d1d28c6 -F src/test1.c 31c491ccb536bd9916a084e732ffe783b3c8973f2586d5a56aed0e3a9701dfff +F src/test1.c 5390e5afb31fed61f72d0be0cb1b322d198a6e03fc13ff245ae76d17b4dcf2e9 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 18ec393bb4d0ad1de729f0b94da7267270f3d8e6 @@ -526,7 +531,7 @@ F src/test_backup.c bf5da90c9926df0a4b941f2d92825a01bbe090a0 F src/test_bestindex.c 78809f11026f18a93fcfd798d9479cba37e1201c830260bf1edc674b2fa9b857 F src/test_blob.c ae4a0620b478548afb67963095a7417cd06a4ec0a56adb453542203bfdcb31ce F src/test_btree.c 8b2dc8b8848cf3a4db93f11578f075e82252a274 -F src/test_config.c 6c3f341ece48020c4ddbce055643a91c653283b3a6853c46ea18d22e5c72847d +F src/test_config.c 5ebafbcd5c75ac1c16bb0c8fe926dc325cc03e780943a88ca50e0d9a4fc4d2f5 F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f F src/test_demovfs.c a0c3bdd45ed044115c2c9f7779e56eafff18741e F src/test_devsym.c 1960abbb234b97e9b920f07e99503fc04b443f62bbc3c6ff2c2cea2133e3b8a2 @@ -534,8 +539,8 @@ F src/test_fs.c 35a2f7dd8a915900873386331386d9ba1ae1b5026d74fd20c2807bc76221f291 F src/test_func.c d12d805953bcb3bb19f71d29cdc93383b7b7a3369504d2b7e398a1bd77376294 F src/test_hexio.c 1d4469ca61ab202a1fcec6543f584d2407205e8d F src/test_init.c 4413c211a94b62157ca4c145b3f27c497f03c664 -F src/test_intarray.c 988fc61cb0ff539f4172c0d95f15287c92516f64 -F src/test_intarray.h f3b7672f5d1056eac563c0d6ea8480a660b1475c +F src/test_intarray.c 39b4181662a0f33a427748d87218e7578d913e683dc27eab7098bb41617cac71 +F src/test_intarray.h d57ae92f420cda25e22790dac474d60961bd0c500cbaa3338a05152d4a669ef7 F src/test_journal.c 619f2aa10e0d7a5f87c0f06825bc61dfce1c6b9c7f3ad990fb13de6c3b8874a3 F src/test_loadext.c 337056bae59f80b9eb00ba82088b39d0f4fe6dfd F src/test_malloc.c dec0aa821b230773aeb3dd11d652c1193f7cedb18a20b25659bc672288115242 @@ -543,7 +548,7 @@ F src/test_md5.c 7268e1e8c399d4a5e181b64ac20e1e6f3bc4dd9fc87abac02db145a3d951fa8 F src/test_multiplex.c e054459f7633f3ff8ce1245da724f9a8be189e4e F src/test_multiplex.h 5436d03f2d0501d04f3ed50a75819e190495b635 F src/test_mutex.c 7f4337ba23ee6b1d2ec81c189653608cb069926a -F src/test_onefile.c 416f87a28d6d673352d33fc4b1c7d39db878e50f +F src/test_onefile.c f31e52e891c5fef6709b9fcef54ce660648a34172423a9cbdf4cbce3ba0049f4 F src/test_osinst.c 98ef31ff03d55497829ca0f6c74a9f4e1aa48690 F src/test_pcache.c a5cd24730cb43c5b18629043314548c9169abb00 F src/test_quota.c 6cb9297115b551f433a9ad1741817a9831abed99 @@ -564,33 +569,33 @@ F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a9 F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c 9f55961518f77793edd56eee860ecf035d4370ebbb0726ad2f6cada6637fd16b -F src/treeview.c e7a7f90552bb418533cdd0309b5eb71d4effa50165b880fc8c2001e613577e5f +F src/tokenize.c 9e781e1ca80eefe7b5d6a9e2cd5c678c847da55fd6f093781fad7950934d4c83 +F src/treeview.c 7b12ac059de54c939b6eb0dbffc9410c29c80d2470cee5cbe07d5ff9ea2d9253 F src/trigger.c d3d78568f37fb2e6cdcc2d1e7b60156f15b0b600adec55b83c5d42f6cad250bd -F src/update.c 345ce35eb1332eb4829857aa8b1f65a614b07dae91d0346c0dc2baacafbcc51b +F src/update.c 1816d56c1bca1ba4e0ef98cac2f49be62858e9df1dc08844c7067eb41cc44274 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157 -F src/vacuum.c 36e7d21a20c0bf6ef4ef7c399d192b5239410b7c4d3c1070fba4e30810d0b855 -F src/vdbe.c 7433ac76608b80b745f57b8544416dc0178db52ce2cc806a10353309e5f781fb +F src/vacuum.c 836cadc922de866c849e23a75f93d344cdc143d388339305d09a3fed27e8798d +F src/vdbe.c 005e691ea4c7d51e6c1a69d9389aeb34700884c85f51681817ddea3fdc2fc39b F src/vdbe.h 5081dcc497777efe5e9ebe7330d283a044a005e4bdda2e2e984f03bf89a0d907 -F src/vdbeInt.h f1f35f70460698d8f5a2bdef1001114babf318e2983a067804e2ae077d8e9827 -F src/vdbeapi.c 2ba821c5929a2769e4b217dd85843479c718b8989d414723ec8af0616a83d611 -F src/vdbeaux.c c3c397274380f13db702baa3506ba87379446a4d71135a1177b624f73dd3c830 +F src/vdbeInt.h 437e6c6af679fdf157867eb83a8adc6cf5145d6774453c2214cfd0bd01d92980 +F src/vdbeapi.c ecccfce6f614c33a95952efeec969d163e8349eac314ee2b7b163eda921b5eb0 +F src/vdbeaux.c f547901b1aa9e2d81c63f06893f633648e434180666a827aacb547d7d6c8a601 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 -F src/vdbemem.c 81329ab760e4ec0162119d9cd10193e0303c45c5935bb20c7ae9139d44dd6641 +F src/vdbemem.c 7b3305bc4a5139f4536ac9b5f61da0f915e49d2e3fdfa87dfdfa9d7aba8bc1e9 F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392 -F src/vtab.c 8665561f244c137a2d17b5c3e5910d7303054fe841c5d510e53f23beb0089594 +F src/vtab.c 70188a745dc4e57d26e942681ff4b2912b7c8249ad5de3f60f0677b4337bcfaa F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a -F src/walker.c ba7225773931760cf60bf22f34d0cce2588df7ce5ce0f215a52eb88234b55ac4 -F src/where.c 2019126801437944c38cc62a99491e98591460b7cc07ab57eb66165f710a289b -F src/whereInt.h b90ef9b9707ef750eab2a7a080c48fb4900315033274689def32d0cf5a81ebe4 -F src/wherecode.c 4f88f5b39ad4aeb5bdd47a546d74149bb902ef49ca9f02a45b2a5bd2dd70b6bd -F src/whereexpr.c eb462ebe085f6cbb6bdda797a041fbd7e3724586203344043d1088a2117d8e44 -F src/window.c 4b503da928dace3e845b891381a4d98eeb8c5744313ae3643df8d8d21fdcca65 +F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66 +F src/where.c 3818e8a736a05d2cb194e64399af707e367fbcc5c251d785804d02eaf121288e +F src/whereInt.h f125f29fca80890768e0b2caa14f95db74b2dacd3a122a168f97aa7b64d6968f +F src/wherecode.c c45f03aefc2266b990df0fc4d7acc4e27f56f881f4fc0fc355b7cbc4d7189da5 +F src/whereexpr.c 491f0894ad9903750cdecb7894437a0cabdffdd88f574d2b1c9ac85d14fe4b9c +F src/window.c 6550e2850ebced51100ef83d49b00a1cf03f81a482dafedafb0320df647ed8fc F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -598,19 +603,20 @@ F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 18b00de006597e960a6b27ccec51474ac66cf1070a87c1933e5694dc02190ef1 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13 -F test/alter.test 99e72759d48d6531ac2a9f346b4a9b5fe8f89c67a0fa5e916a3990d3b1fe9d09 -F test/alter2.test 7ea05c7d92ac99349a802ef7ada17294dd647060 +F test/alter.test 93dee7c0ff9106fbd53a8bbf519107904b884050a99c4565412c58c37d68c802 +F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687 F test/alter3.test 4d79934d812eaeacc6f22781a080f8cfe012fdc3 F test/alter4.test 7e93a21fe131e1dfeb317e90056856f96b10381fc7fe3a05e765569a23400433 F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959 -F test/altercol.test 53fb5e218c9296afc160f2c4fcbeaf42bd0604815d9b3896a7d2eec583ad8704 -F test/alterlegacy.test e7c07d605c2a85e7d1696c89e6bf64dfc932fc6d9320fe8708c8f5fc0b524d41 -F test/altermalloc.test e81ac9657ed25c6c5bb09bebfa5a047cd8e4acfc +F test/alterauth2.test c0a1ddf5b93d93cb0d15ba7acaf0c5c6fb515bbe861ede75b2d3fabad33b6499 +F test/altercol.test 313ed080ed61691c52cd87053129889f71582d6d0efebdd5f3edad2a98c66874 +F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3eab2f44b +F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b -F test/altertab.test 3b830144c18ae00abd2a27e3d2851c8bb1ee8fe655fa16d8a5971066dc71b58a -F test/altertab2.test 159fd5f7b23ddc841fe678f579f9b1b8e69f44296f3ff75d1b4c155d37a59832 +F test/altertab.test 17e46baa6b2234048c91891a303141afceca4da95a36ee1a0a9fec6ccef1f4da +F test/altertab2.test 0d64de5632ca5de13b023839cfe5b8952d029e4622befcea1433adaa93883220 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f -F test/analyze.test b3a9c67d00e1df7588a5b7be9a0292899f94fe8cac1f94a017277474ca2e59df +F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 F test/analyze4.test cdf88f3f72b0f0643a1ff6c730fc5af1e42464d47478d9fbac84c333f72c014e F test/analyze5.test 765c4e284aa69ca172772aa940946f55629bc8c4 @@ -634,21 +640,21 @@ F test/atof1.test ff0b0156fd705b67c506e1f2bfe9e26102bea9bd F test/atomic.test 065a453dde33c77ff586d91ccaa6ed419829d492dbb1a5694b8a09f3f9d7d061 F test/atomic2.test b6863b4aa552543874f80b42fb3063f1c8c2e3d8e56b6562f00a3cc347b5c1da F test/atrc.c ec92d56d8fbed9eb3e11aaf1ab98cf7dd59e69dae31f128013f1d97e54e7dfed -F test/attach.test f4b8918ba2f3e88e6883b8452340545f10a1388af808343c37fc5c577be8281c +F test/attach.test 21bce8681f780a8d631a5ec7ecd0d849bfe84611257b038ae4ffeccc609d8a4e F test/attach2.test 256bd240da1835fb8408dd59fb7ef71f8358c7a756c46662434d11d07ba3a0ce F test/attach3.test c59d92791070c59272e00183b7353eeb94915976 F test/attach4.test 53bf502f17647c6d6c5add46dda6bac8b6f4665c -F test/attachmalloc.test 3a4bfca9545bfe906a8d2e622de10fbac5b711b0 +F test/attachmalloc.test 12c4f028e570acf9e0a4b0b7fe6f536e21f3d5ebddcece423603d0569beaf438 F test/auth.test 3310d9c08e928beca42d3eadaaf53cef619d9d275f598565a3758a21ce63138e F test/auth2.test 9eb7fce9f34bf1f50d3f366fb3e606be5a2000a1 F test/auth3.test db21405b95257c24d29273b6b31d0efc59e1d337e3d5804ba2d1fd4897b1ae49 F test/autoanalyze1.test b9cc3f32a990fa56669b668d237c6d53e983554ae80c0604992e18869a0b2dec -F test/autoinc.test 9d202b7dce6571e52b744138eff12610214501acd635abdd72d18736cd06fd22 +F test/autoinc.test 381f494fefa90acd999933829e2934efb6b40906db9d6a39e822e3f7b4c8bf61 F test/autoindex1.test a09958fa756129af10b6582bcbf3cbdf11e305e027b393f393caef801159dee0 F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df F test/autoindex3.test 2dd997d6590438b53e4f715f9278aa91c9299cf3f81246a0915269c35beb790e F test/autoindex4.test 49d3cd791a9baa16fb461d7ea3de80d019a819cf -F test/autoindex5.test 5f0135dc3b266277b8c1904624439097d8e8020dd7197eda13fda23c35c21a05 +F test/autoindex5.test 4a0eb6c7c7ae456d97a2061d4c8d6380946272c5c91d91507c1feb1af3dc7cce F test/autovacuum.test 0831cd34e14695d297187f7f6519265e3121c5b0a1720e548e86829e796129e9 F test/autovacuum_ioerr2.test 8a367b224183ad801e0e24dcb7d1501f45f244b4 F test/avtrans.test b7dc25459ecbd86c6fa9c606ee3068f59d81e225118617dcf2bbb6ded2ade89e @@ -665,8 +671,8 @@ F test/bc_common.tcl b5e42d80305be95697e6370e015af571e5333a1c F test/bestindex1.test 852170bddbb21daa121fabcc274640ff83d7d8705912e8b5fe7ed2c5a9a9224a F test/bestindex2.test 9a0ccd320b6525eec3a706aae6cdab7e1b7b5abca75027e39f39f755e76e5928 F test/bestindex3.test 001788a114ad96d81d5154fe77c7f1e26e84b3a2b5635ca29e4f96f6decc534e -F test/bestindex4.test 4cb5ff7dbaebadb87d366f51969271778423b455 -F test/bestindex5.test 412b42f8036b28d8b2f3534d89389ad946a4b1a65a12263f51936f7424296f1b +F test/bestindex4.test 038e3d0789332f3f1d61474f9bbc9c6d08c6bd1783a978f31f38ad82688de601 +F test/bestindex5.test 67c1166131bb59f9e47c00118f7d432ca5491e6cae6ca3f87ca9db20103a78f9 F test/bestindex6.test d856a9bb63d927493575823eed44053bc36251e241aa364e54d0f2a2d302e1d4 F test/between.test 34d375fb5ce1ae283ffe82b6b233e9f38e84fc6c F test/bigfile.test aa74f4e5db51c8e54a1d9de9fa65d01d1eb20b59 @@ -694,9 +700,9 @@ F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de F test/cacheflush.test af25bb1509df04c1da10e38d8f322d66eceedf61 F test/cachespill.test 895997f84a25b323b166aecb69baab2d6380ea98f9e0bcc688c4493c535cfab9 F test/capi2.test 34a1a9a96d543a2ec2c209696b11b164444f57253b1f2cba1c2e53fadede6c7b -F test/capi3.test 36f5c859c91a9bb0075d6ddcfcf2476cad629b09f7bfd135776fb94b06c04706 +F test/capi3.test 3910a73c38ac76d69778dd9eb481ab7cd6ed59117fc047b4f6056a5c72529de1 F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 -F test/capi3c.test 7ebed1d8fa2f3190149d556fe8cff5a006be62af437c5c4640db614470126098 +F test/capi3c.test 54e2dc0c8fd7c34ad1590d1be6864397da2438c95a9f5aee2f8fbc60c112e44b F test/capi3d.test 485048dc5cd07bc68011e4917ad035ad6047ab82 F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe F test/cast.test 5ceb920718d280b61163500a7d29e0e0a86458b1cbd92d96f962c9d970aa3857 @@ -722,11 +728,11 @@ F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9 F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4 -F test/corrupt.test 141c39ea650c1365e85a49e402fa05cb9617fb97 -F test/corrupt2.test fdfdffab9bc37d6d173f56ffb82472206f11dd4a68caad9360ac4db2eddb34c8 +F test/corrupt.test d7cb0300e4a297147b6a05e92a1684bc8973635c3bcaa3d66e983c9cbdbf47a3 +F test/corrupt2.test a7f95356d19a4e8bf9423622ad865cabf48ae49dad40eb7a17a0b39f1cdd6948 F test/corrupt3.test f95d7bf78109e0b84eb285a787ce91a3fd6a2dd7d0cb55882abff3bdc081a57e F test/corrupt4.test 8d1d86b850fcc43e417450454f2044e52d55778a -F test/corrupt5.test 8ead52af76006f3286e9396cb41898018ccea107 +F test/corrupt5.test 387be3250795e2a86e6234745558b80efb248a357d0cd8e53bce75c7463f545d F test/corrupt6.test fc6a891716139665dae0073b6945e3670bf92568 F test/corrupt7.test b036f94bda4b0b23a2919bf717046ce9ecca4543 F test/corrupt8.test 2399dfe40d2c0c63af86706e30f3e6302a8d0516 @@ -739,18 +745,18 @@ F test/corruptE.test 82ccf4f8f543fdbedd4aa42c709cb077f7374c62 F test/corruptF.test be9fde98e4c93648f1ba52b74e5318edc8f59fe4 F test/corruptG.test adf79b669cbfd19e28c8191a610d083ae53a6d51 F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 -F test/corruptI.test 075fe1d75aa1d84e2949be56b6264376c41502e4 +F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 -F test/corruptK.test 91550557849244a9904f4e090052e3f2c1c3f1106840d58b00ffaa3a8c2d3fc0 +F test/corruptK.test 5ef338c560ca4dfb7360828da16f1829be4deba3b378cafdc7a1cdaf027eb5c4 F test/cost.test b37db8a10d467a69e71a9f3d40bbb266c2f587742b37c6912f6e3f7185a0e216 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c -F test/countofview.test 2d0ce23daca1bada0522c3d62e0e0c0d69ec4e0fc41df2bcd662a5e11169b9c9 +F test/countofview.test e3d4cd6900e4e4f074968ab24b8b87d3671cd624961bef40fd3a6b8f574343cf F test/coveridxscan.test 5ec98719a2e2914e8908dc75f7247d9b54a26df04625f846ac7900d5483f7296 F test/crash.test fb9dc4a02dcba30d4aa5c2c226f98b220b2b959f F test/crash2.test 5b14d4eb58b880e231361d3b609b216acda86651 F test/crash3.test 8f5de9d32ab9ab95475a9efe7f47a940aa889418 F test/crash4.test fe2821baf37168dc59dd733dcf7dba2a401487bc -F test/crash5.test 05dd3aa9dbb751a22d5cdaf22a9c49b6667aa219 +F test/crash5.test f14ff37eddc41991be4eb63568f86caa306fd9962a0ae3750db8836777bb7aae F test/crash6.test 4c56f1e40d0291e1110790a99807aa875b1647ba F test/crash7.test 1a194c4900a255258cf94b7fcbfd29536db572df F test/crash8.test 64366e459c28dd62edfb7ad87253a409c7533b92d16fcc479a6a8131bdcc3100 @@ -758,7 +764,7 @@ F test/crashM.test d95f59046fa749b0d0822edf18a717788c8f318d F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2 F test/createtab.test b5de160630b209c4b8925bdcbbaf48cc90b67fe8 F test/cse.test 277350a26264495e86b1785f34d2d0c8600e021c -F test/csv01.test 6e1445b3207d574cff22fc41a8e549dfcf2466ee90546ada97d22a90fa89eb58 +F test/csv01.test 4a92840619ef435b905e6d3f35cd0644df23225d7b7967d7940b40f06d6a90a6 F test/ctime.test 78749e6c9a5f0010d67985be80788f841e3cd2da18114e2ed6010399a7d807f3 F test/cursorhint.test 7bc346788390475e77a345da2b92270d04d35856 F test/cursorhint2.test 6f3aa9cb19e7418967a10ec6905209bcbb5968054da855fc36c8beee9ae9c42f @@ -766,10 +772,12 @@ F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68 F test/date.test 9b73bbeb1b82d9c1f44dec5cf563bf7da58d2373 F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b10 F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e -F test/dbpage.test dbf50a4d361f9e45a979432c727506065113124478a7d2db12074fa655e65d6c -F test/dbstatus.test c15fa97f743dac7ce996814c84b56317e138895ee15ce27f15b608aa6924c90a +F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee +F test/dbfuzz2.c 652f85bac1770e927da139db513234a3eba308f72ac2f8b32f0093d7d19def70 +F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 +F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef -F test/default.test 0cb49b1c315a0d81c81d775e407f66906a2a604d +F test/default.test 3e46c421eebefd2787c2f96673efabf792d360f3a1d5073918cbe450ce672a62 F test/delete.test 31832b0c45ecb51a54348c68db173be462985901e6ed7f403d6d7a8f70ab4ef0 F test/delete2.test 3a03f2cca1f9a67ec469915cb8babd6485db43fa F test/delete3.test 555e84a00a99230b7d049d477a324a631126a6ab @@ -792,10 +800,10 @@ F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e F test/e_droptrigger.test 3cd080807622c13e5bbb61fc9a57bd7754da2412 F test/e_dropview.test 21ce09c361227ddbc9819a5608ee2700c276bdd5 F test/e_expr.test ca8896601ade1e27c6559614c7f32c63d44636fdfa720436a160f09b8bf66c89 -F test/e_fkey.test 9778696ef9fceacebed8d482d02b47287981faaedf6f73db563ea8a7afb546da -F test/e_fts3.test 8cf40550bb088a6aa187c818c00fabe26ef82900a4cd5c66b427ccafe28bedaa +F test/e_fkey.test 2febb2084aef9b0186782421c07bc9d377abf067c9cb4efd49d9647ae31f5afe +F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5ee07 F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e -F test/e_reindex.test 2bebf7b393e519198b7c654407221cf171a439b8 +F test/e_reindex.test 2b0e29344497d9a8a999453a003cb476b6b1d2eef2d6c120f83c2d3a429f3164 F test/e_resolve.test a61751c368b109db73df0f20fc75fb47e166b1d8 F test/e_select.test c5a669b4d63217aa10094ba737ba3ddd07bd439d4bc7a5b798f6ea32511cbe7c F test/e_select2.test aceb80ab927d46fba5ce7586ebabf23e2bb0604f @@ -826,7 +834,7 @@ F test/fallocate.test 07416bd593a116d5893cb244f45a94d5c6fe030561df3bd972e6135f81 F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 -F test/fkey2.test 6206484a0eba570902a1a4d86489df24d0265f6994daebf851861d8f0cf4a27b +F test/fkey2.test d35d1c81e7569bdd2b872e91750f7098117d2e8291369f70b7e3d50a0e523dc2 F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d F test/fkey5.test 24dd28eb3d9f1b5a174f47e9899ace5facb08373a4223593c8c631e6cf9f7d5a @@ -889,20 +897,21 @@ F test/fts3am.test 218aa6ba0dfc50c7c16b2022aac5c6be593d08d8 F test/fts3an.test a49ccadc07a2f7d646ec1b81bc09da2d85a85b18 F test/fts3ao.test 266989148fec6d9f1bb6c5382f7aa3dcea0e9cd444576e28dd2b9287ac7dd220 F test/fts3atoken.test 4b4c16fdcfc972f2cdbba212375a060a86ccf5f1 -F test/fts3auto.test b981fea19b132b4e6878f50d7c1f369b28f68eb9 +F test/fts3auto.test 19097050a3ca7ab7a43b2be967cb3dfd8ddf841dfdc4eac88deb172ad2f209f2 F test/fts3aux1.test 7a170e172afdbceb67f5baa05941fd4fbf56af42f61daa3d140f4b4bf4cb68f6 F test/fts3aux2.test 7ae2b2c13aefdf4169279a27a5f51780ce57f6ba F test/fts3b.test c15c4a9d04e210d0be67e54ce6a87b927168fbf9c1e3faec8c1a732c366fd491 F test/fts3c.test fc723a9cf10b397fdfc2b32e73c53c8b1ec02958 F test/fts3comp1.test a0f5b16a2df44dd0b15751787130af2183167c0c F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f5a76b -F test/fts3corrupt.test 2710b77983cc7789295ddbffea52c1d3b7506dbb -F test/fts3corrupt2.test 6d96efae2f8a6af3eeaf283aba437e6d0e5447ba -F test/fts3corrupt3.test 56e0ee83e90b57f5f3644cb7d1b36a067b7b8b19cdf0dedce45e5e13cf752f65 -F test/fts3cov.test 9c3681325b9a850bca8dd75cc29dde73e9a87972bb75204e97d826f13c7181f9 -F test/fts3d.test d3e9c8fb75135ada06bf3bab4f9666224965d708 -F test/fts3defer.test 0be4440b73a2e651fc1e472066686d6ada4b9963 -F test/fts3defer2.test c540f5f5c2840f70c68fd9b597df817ec7170468 +F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae +F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 +F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f +F test/fts3corrupt4.test a27259f4f25d60b4eca481d050b3cfee97eddb0d937d38f231408c5239066e11 +F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 +F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f +F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de +F test/fts3defer2.test 3da52ca2114e300e9971eee2f0cc1a2e5f27e6a9ee67957d49e63e41fdfcc0e7 F test/fts3defer3.test dd53fc13223c6d8264a98244e9b19abd35ed71cd F test/fts3drop.test 1b906e293d6773812587b3dc458cb9e8f3f0c297 F test/fts3e.test 1f6c6ac9cc8b772ca256e6b22aaeed50c9350851 @@ -916,37 +925,37 @@ F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f943 F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641 F test/fts3join.test 949b4f5ae3ae9cc2423cb865d711e32476bdb205ab2be923fdf48246e4a44166 F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 -F test/fts3matchinfo.test ce864e0bd92429df8008f31cf557269ba172482a -F test/fts3misc.test ba03a83b831555cfd18c6c862b24b70a53ce7497fe55077f7c4b7c9ce83c2eed +F test/fts3matchinfo.test aa66cc50615578b30f6df9984819ae5b702511cf8a94251ec7c594096a703a4a +F test/fts3misc.test 0b20083efab36a42804bf8017a003f72f963c46163403dae7256493367d2f9d3 F test/fts3near.test 7e3354d46f155a822b59c0e957fd2a70c1d7e905 F test/fts3offsets.test b85fd382abdc78ebce721d8117bd552dfb75094c F test/fts3prefix.test fa794eaab0bdae466494947b0b153d7844478ab2 F test/fts3prefix2.test e1f0a822ca661dced7f12ce392e14eaf65609dce -F test/fts3query.test ca5dffabdfe9aef2ebcc89e02ce515898f86f8c30a365283831c53e0e08e5821 +F test/fts3query.test ca033ff2ebcc22c69d89032fb0bc1850997d31e7e60ecd26440796ba1654e78f F test/fts3rank.test cd99bc83a3c923c8d52afd90d86979cf05fc41849f892faeac3988055ef37b99 F test/fts3rnd.test 1320d8826a845e38a96e769562bf83d7a92a15d0 F test/fts3shared.test 57e26a801f21027b7530da77db54286a6fe4997e -F test/fts3snippet.test 01a4231816e03a0660ae53ba2404fe69012fe0db +F test/fts3snippet.test 8cf586fe4b6878192602a81a665448aacbbad80ade0867bb5299d40e73584311 F test/fts3sort.test ed34c716a11cc2009a35210e84ad5f9c102362ca F test/fts3tok1.test a663f4cac22a9505400bc22aacb818d7055240409c28729669ea7d4cc2120d15 F test/fts3tok_err.test 52273cd193b9036282f7bacb43da78c6be87418d F test/fts3varint.test 752c08ed5d32c5d7dc211b056f4ed68a76b7e36e F test/fts4aa.test 10aac8e9d62c7357590acfabe3fad01e9a9ce1cb -F test/fts4check.test c3056eab9524232e4c9bdcd119912947e07bcc1c +F test/fts4check.test 6259f856604445d7b684c9b306b2efb6346834c3f50e8fc4a59a2ca6d5319ad0 F test/fts4content.test 1518195a9f92b711d94419f76409a31cc78755854fb0abb1da2b74b9e0cf843e F test/fts4docid.test e33c383cfbdff0284685604d256f347a18fdbf01 -F test/fts4growth.test e5390da74619cacc389711bac9349640b32c4f9a +F test/fts4growth.test 289833c34ad45a5e6e6133b53b6a71647231fb89d36ddcb8d9c87211b6721d7f F test/fts4growth2.test 13ad4e76451af6e6906c95cdc725d01b00044269 F test/fts4incr.test 4e353a0bd886ea984e56fce9e77724fc923b8d0d F test/fts4langid.test 2168ba330af34f8a1c8832de0aab4c4b6fa195a16419c9c0c8aad59ceb6ff714 F test/fts4lastrowid.test 185835895948d5325c7710649824042373b2203149abe8024a9319d25234dfd7 -F test/fts4merge.test 10b55f410fade8691a455210b0b9302ef178a4f06fba0ad1941801caab82f5a9 +F test/fts4merge.test 1096e30b58ad616bd502141bfe5bfe4c3a518df89e958d41a5ed1ce322369b9c F test/fts4merge2.test 5faa558d1b672f82b847d2a337465fa745e46891 F test/fts4merge3.test 8d9ccb4a3d41c4c617a149d6c4b13ad02de797d0 F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b F test/fts4noti.test 5553d7bb2e20bf4a06b23e849352efc022ce6309 F test/fts4onepass.test d69ddc4ee3415e40b0c5d1d0408488a87614d4f63ba9c44f3e52db541d6b7cc7 -F test/fts4opt.test fd6a11684b965e1999564ae763797b7fb9e34c96 +F test/fts4opt.test 0fd0cc84000743ff2a883b9b84b4a5be07249f0ba790c8848a757164cdd46b2a F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e6b3a7c95 F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d F test/func.test 09dda479bcfc568f99f3070413e9672a8eeedc1be9c5d819bf55d4788c2583b7 @@ -960,14 +969,15 @@ F test/fuzz.test 96083052bf5765e4518c1ba686ce2bab785670d1 F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1 F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c31 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b -F test/fuzz_malloc.test 5b257a7652d8ee90b22e9cf80d9dbea31a4f3e6fed1d33de57b24b1bdb211d79 -F test/fuzzcheck.c 8074a35ed4ec3735a5e144b7e0e9123d9821a92281756c1a40d43e302dd79243 +F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 +F test/fuzzcheck.c fda41c0e4e667fae96b002410bb19cece7a33314264ed6bbc6d012909ee9fd58 F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e42ed2 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 +F test/fuzzdata7.db a1bf54eb455e9772942abae1b2d1cf1e3d3659f0e5dd14f00792fd01411ae8ef F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -991,16 +1001,16 @@ F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 F test/incrblob2.test a494c9e848560039a23974b9119cfc2cf3ad3bd15cc2694ee6367ae537ef8f1f F test/incrblob3.test d8d036fde015d4a159cd3cbae9d29003b37227a4 F test/incrblob4.test 21a52a6843a56cdcce968c6a86b72a7066d0e6ba -F test/incrblob_err.test 69f9247fed50278d48ea710d1a8f9cdb09e4c0b8 +F test/incrblob_err.test 89372a28f1d98254f03fed705f9efcd34ef61a674df16d2dbb4726944a2de5e9 F test/incrblobfault.test 74dd8ac108304cea0b4a0df6df63a1567e558758 F test/incrcorrupt.test 6c567fbf870aa9e91866fe52ce6f200cd548939a -F test/incrvacuum.test b729aab1d4983037da57e66c20dfd7458561a85626dcf824f60175e35f4ce152 +F test/incrvacuum.test 2aaee202b1f230e55779f70d155f6ba67bbdff8481d650214d256ab0f97d4a2b F test/incrvacuum2.test 7d26cfda66c7e55898d196de54ac4ec7d86a4e3d F test/incrvacuum3.test 75256fb1377e7c39ef2de62bfc42bbff67be295a F test/incrvacuum_ioerr.test 6ae2f783424e47a0033304808fe27789cf93e635 -F test/index.test fe3c7a1aad82af92623747e9c3f3aa94ccd51238 +F test/index.test df4cddf4435314a948237fdfa9acee67de21f7bebc789beab4b89b575b4f6a70 F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407 -F test/index3.test 81bc47890b8abfb181bc35f8d10b56c069803386 +F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0 F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 F test/index6.test d07ea75b8c21f125c6f325522e8df8c05c91e9251ec923a31d0582b2ba4a617d @@ -1009,7 +1019,7 @@ F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e F test/indexexpr1.test 635261197bcdc19b9b2c59bbfa7227d525c00e9587faddb2d293c44d287ce60e -F test/indexexpr2.test 08551aa8956a91582979e17b6d369f321a5cb6ed6d3e952925a3e54e9e7de216 +F test/indexexpr2.test fc994dcd4b3da932d4add8e65ed7ca08166d541e00a46874cfacd98dfb93a31b F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 5604b1ff5675cc84c34a5b315792b958f48c32edccc0dafcc81d3b776270b70a @@ -1019,7 +1029,7 @@ F test/insert4.test 46bead5f39e181850ee56adcf49d3a3157c460c52249211714612ac89fe3 F test/insert5.test 394f96728d1258f406fe5f5aeb0aaf29487c39a6 F test/instr.test 9a8802f28437d8ade53fedfc47b2ca599b4e48ba F test/instrfault.test 0f870b218ea17cd477bb19ed330eecdb460dd53a -F test/intarray.test 46d95b457916638c5d8b1af21fb174804b3acf8b +F test/intarray.test 8319986182af37c8eb4879c6bfe9cf0074e9d43b193a4c728a0efa3417c53fb7 F test/interrupt.test 16ea879ec728cb76414c148c5f24afd5d1f91054 F test/interrupt2.test e4408ca770a6feafbadb0801e54a0dcd1a8d108d F test/intpkey.test ac71107a49a06492b69b82aafaf225400598d3c8 @@ -1051,12 +1061,13 @@ F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff F test/kvtest.c 94da54bb66aae7a54e47cf7e4ea4acecc0f217560f79ad3abfcc0361d6d557ba F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 +F test/lemon-test01.y 58b764610fd934e189ffbb0bbfa33d171b9cb06019b55bdc04d090d6767e11d7 F test/like.test 11cfd7d4ef8625389df9efc46735ff0b0b41d5e62047ef0f3bc24c380d28a7a6 F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da -F test/like3.test cf0ff2d06c9d8456283aeff405b911642298441206306aeaeaa93973233b1195 +F test/like3.test 430691e6057e11a59e934be74c06b85605b80061d45af5714d52886a811efeb7 F test/limit.test 0c99a27a87b14c646a9d583c7c89fd06c352663e F test/limit2.test 9409b033284642a859fafc95f29a5a6a557bd57c1f0d7c3f554bd64ed69df77e -F test/loadext.test d077450695ddb5c1ea3ad7d48e5f5850fe732ad9 +F test/loadext.test faa4f6eed07a5aac35d57fdd7bc07f8fc82464cfd327567c10cf0ba3c86cde04 F test/loadext2.test 0408380b57adca04004247179837a18e866a74f7 F test/lock.test be4fe08118fb988fed741f429b7dd5d65e1c90db F test/lock2.test 5242d8ac4e2d59c403aebff606af449b455aceff @@ -1092,6 +1103,7 @@ F test/mallocK.test 1f4b5efbf61715ab79b20b38739ff4b3d110ceb53f54e5db6da1f01c0837 F test/mallocL.test fb311ff80afddf3b1a75e52289081f4754d901dc F test/mallocM.test 78bbe9d3da84a5c679123cdb40d7b2010b18fc46e13897e4f253c6ba6fbff134 F test/malloc_common.tcl aac62499b76be719fac31e7a3e54a7fd53272e7f +F test/malloctraceviewer.tcl b7a54595270c1d201abf1c3f3d461f27eaf24cdef623ad08a0fe5e411264c8a9 F test/manydb.test 28385ae2087967aa05c38624cec7d96ec74feb3e F test/mem5.test c6460fba403c5703141348cd90de1c294188c68f F test/memdb.test c1f2a343ad14398d5d6debda6ea33e80d0dafcc7 @@ -1103,16 +1115,16 @@ F test/minmax.test 6751e87b409fe11b02e70a306d846fa544e25a41 F test/minmax2.test dae92964ac87c1d2ef978c582e81a95e11c00f1cbef68980bfb2abaf10315063 F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354 F test/minmax4.test 936941484ebdceb8adec7c86b6cd9b6e5e897c1f -F test/misc1.test 704ea2cc7e7b9deb622b37953f0e77d0879826e8c3bfc1d7a691528035405061 +F test/misc1.test c8cfd1c3f842b3341fda9d81a96236d5c76ca89973aeff3fe50bac6fefcfc421 F test/misc2.test 00d7de54eda90e237fc9a38b9e5ccc769ebf6d4d F test/misc3.test cf3dda47d5dda3e53fc5804a100d3c82be736c9d -F test/misc4.test 0d8be3466adf123a7791a66ba2bc8e8d229e87f3 -F test/misc5.test 60e1fc758a93cacd19eb2fafcd1d40d150a05047546c7a92389c98047d621901 +F test/misc4.test 10cd6addb2fa9093df4751a1b92b50440175dd5468a6ec84d0386e78f087db0e +F test/misc5.test c4aeaa0fa28faa08f2485309c38db4719e6cd1364215d5687a5b96d340a3fa58 F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91 -F test/misc7.test 349855706310f0de6b91645d199f6874f518627fd057743fa4e3689b60d06efc +F test/misc7.test 10d639a5e0fdf1bd51ad42be705393a38780ad71b6957110035a4e6c1e5e7f40 F test/misc8.test 8fb0f31d7a8aed484d759773ab8ad12ec746a477f4a67394a4af0e677494c3ca F test/misuse.test 9e7f78402005e833af71dcab32d048003869eca5abcaccc985d4f8dc1d86bcc7 -F test/mjournal.test 9d86e697dcbc5da2c4e8caba9b176b5765fe65e80c88c278b8c09a917e436795 +F test/mjournal.test 28a08d5cb5fb5b5702a46e19176e45e964e0800d1f894677169e79f34030e152 F test/mmap1.test fb04e0c10492455007624ade884ca0c8852ff3e4e11d95408f9709ca2ef7f626 F test/mmap2.test 9d6dd9ddb4ad2379f29cc78f38ce1e63ed418022 F test/mmap3.test b3c297e78e6a8520aafcc1a8f140535594c9086e @@ -1128,11 +1140,11 @@ F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 F test/nan.test 437d40e6d0778b050d7750726c0cbd2c9936b81962926e8f8c48ca698f00f4d1 F test/nockpt.test 8c43b25af63b0bd620cf1b003529e37b6f1dc53bd22690e96a1bd73f78dde53a F test/nolock.test f196cf8b8fbea4e2ca345140a2b3f3b0da45c76e -F test/normalize.test 1dedf653ca33b0b55fd0c7967d2861a51f1801a7aa899a02d4c0d7adfcd5acdc +F test/normalize.test 6a80564d2000702b5919ed2c1069fef0f95762142bc96a71b4c124a845165713 F test/notify1.test 669b2b743618efdc18ca4b02f45423d5d2304abf F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 -F test/notnull.test b6999231221df3534827e45e2005dd7a815fdd5f2c2e1afb9be21ead410816f8 +F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 @@ -1151,10 +1163,10 @@ F test/orderby7.test 3d1383d52ade5b9eb3a173b3147fdd296f0202da F test/orderby8.test 23ef1a5d72bd3adcc2f65561c654295d1b8047bd F test/orderby9.test 87fb9548debcc2cd141c5299002dd94672fa76a3 F test/oserror.test e7b3416be4b9d5dd2fe0b42dd394daaddbb6c83eeec1f0e47b120b53e0ad3ace -F test/ossfuzz.c c4c4547e2c92ac52f10038b073a03248251a23c1c559728f63a18aeca0e79f03 +F test/ossfuzz.c 273eaea2d65b70d77ea4f01404114b9e0244488943f768dc39458c72bd722e0e F test/ossshell.c f125c5bd16e537a2549aa579b328dd1c59905e7ab1338dfc210e755bb7b69f17 F test/ovfl.test 199c482696defceacee8c8e0e0ef36da62726b2f -F test/pager1.test a32ce299ed01ffb06e84a3af467ae1f3389786b316f40c4359f442c79144736b +F test/pager1.test 1e9ee778bdeaf4f7f09997d029cdaca6a42dfc2092edafe4f5e590acbf1eab13 F test/pager2.test 67b8f40ae98112bcdba1f2b2d03ea83266418c71 F test/pager3.test 4e9a83d6ca0838d7c602c9eb93d1357562d9059c1e02ffb138a8271020838370 F test/pager4.test a122e9e6925d5b23b31e3dfef8c6a44bbf19590e @@ -1163,19 +1175,19 @@ F test/pagerfault2.test caf4c7facb914fd3b03a17b31ae2b180c8d6ca1f F test/pagerfault3.test 1003fcda009bf48a8e22a516e193b6ef0dd1bbd8 F test/pageropt.test 84e4cc5cbca285357f7906e99b21be4f2bf5abc0 F test/pagesize.test 5769fc62d8c890a83a503f67d47508dfdc543305 -F test/parser1.test 391b9bf9a229547a129c61ac345ed1a6f5eb1854 +F test/parser1.test 6ccdf5e459a5dc4673d3273dc311a7e9742ca952dd0551a6a6320d27035ce4b3 F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff -F test/permutations.test fdcb2d733fc21396e0300206023795463ba0d0ee5eda2042863b044933391da3 +F test/permutations.test cf0b4e498db1d0143c19641d4420df7cc27fab2c95ed0abd2c7c5753beab25b8 F test/pg_common.tcl 301ac19c1a52fd55166d26db929b3b89165c634d52b5f8ad76ea8cb06960db30 -F test/pragma.test 7c8cfc328a1717a95663cf8edb06c52ddfeaf97bb0aee69ae7457132e8d39e7d +F test/pragma.test c267bf02742c823a191960895b3d52933cebd7beee26757d1ed694f213fcd867 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f -F test/pragma3.test 14c12bc5352b1e100e0b6b44f371053a81ccf8ed -F test/pragma4.test 3046501bee2f652dc2a4f9c87781e2741361d6864439c8381aba6c3b774b335c +F test/pragma3.test 8300aa9c63cff1027006ca34bf413a148abbd6dcd471fa9a1ded322fe18c0df9 +F test/pragma4.test 52d8186f9e8d09b87189432cdd401dfa66d0b32445e837fa19046c8ae7621b0e F test/pragma5.test 824ce6ced5d6b7ec71abe37fc6005ff836fe39d638273dc5192b39864b9ee983 F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 -F test/printf.test b3ff34e73d59124140eaf89f7672e21bc2ca5fcc +F test/printf.test a3e559bc9d922e7fe44e9d05c6965fee34fe3bc28300a4248c6a063425246ffd F test/printf2.test 30b5dd0b4b992dc5626496846ecce17ff592cacbcb11c3e589f3ac4d7e129dae F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc @@ -1193,8 +1205,8 @@ F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8 F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c F test/reindex.test 44edd3966b474468b823d481eafef0c305022254 -F test/releasetest.tcl c5b474f9880073fc3b69729ee05d5284653a9ee101af572204917d9dcb1d9015 x -F test/resetdb.test 684a6ffde5a5141bba79f3101981cc38dcfc3403f61e643b7b3aa68bef0b8408 +F test/releasetest.tcl b290d538ffcb2ff711f09eadc7396c1a42580f3fb078605471dc8875ca0b4d1e x +F test/resetdb.test 373a9eb8fcbd58bf87affec6a88c6353038f98a5d25be5ab75a0b9636c462a36 F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6 @@ -1202,7 +1214,7 @@ F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 F test/rowid.test 5b7509f384f4f6fae1af3c8c104c8ca299fea18d -F test/rowvalue.test ef851a80f7e6de93b51caca9e4b6b7d2dcd540bbcca7d51860e80435b8b4c0de +F test/rowvalue.test b8680f07d19c8c5223b808bba998faffcec6d505f5689ff6070280119173bb51 F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 F test/rowvalue4.test 2b20468da3775aba971caf3158e9696a4d99c69a7623fb495f332a596daebbee @@ -1251,19 +1263,19 @@ F test/server1.test c2b00864514a68a0e6fd518659dc95d0050307a357a08969872bef027d78 F test/session.test 78fa2365e93d3663a6e933f86e7afc395adf18be F test/sessionfuzz-data1.db 1f8d5def831f19b1c74571037f0d53a588ea49a6c4ca2a028fc0c27ef896dbcb F test/sessionfuzz.c b0fcdcf757451957e17396a3af5171f1fdf9b2babc81da9fa35675df46c4729a -F test/shared.test 1da9dbad400cee0d93f252ccf76e1ae007a63746 +F test/shared.test 1826673eb5eb745fb91a3bdac99a7737057742ae38dcb0fe076a384d6727578b F test/shared2.test 03eb4a8d372e290107d34b6ce1809919a698e879 F test/shared3.test ab693f9b6e156b8bfb2a0ad94f29fe69602a5d38 F test/shared4.test c75f476804e76e26bf6fa0e7b421fb0ca7d07558 F test/shared6.test 866bb4982c45ce216c61ded5e8fde4e7e2f3ffa9 F test/shared7.test a81e99f83e6c51b02ac99c96fb3a2a7b5978c956 -F test/shared8.test 00a07bf5e1337ecf72e94542bdefdc330d7a2538 +F test/shared8.test 933ed7d71f598bb6c7a8c192a3cd30f2562fdccf514df383798599c34ffa672f F test/shared9.test 5f2a8f79b4d6c7d107a01ffa1ed05ae7e6333e21 F test/sharedA.test 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69e281 F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 -F test/shell1.test 707c03fbd07ac506cfb6fa09da4ee22e2b50453c3db2f404694116eb990168f3 +F test/shell1.test d2bf5daeb6f449f0169c9ef3094db17a16a02199c5dcf1a635a3e79b07eb0edd F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 F test/shell4.test 89ad573879a745974ff2df20ff97c5d6ffffbd5d @@ -1281,11 +1293,11 @@ F test/skipscan3.test ec5bab3f81c7038b43450e7b3062e04a198bdbb5 F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2 F test/skipscan6.test 0b4cd1b4ac9f84d91454df513c99a4932fa07e8f27b8049bea605068b3e34ac7 F test/snapshot.test a504f2e7009f512ef66c719f0ea1c55a556bdaf1e1312c80a04d46fc1a3e9632 -F test/snapshot2.test 4fc84a0121e882d6980333bf14dfc1143dfb94f5afbb909c084977a945b45beb -F test/snapshot3.test d6ec952e437e5c06a293d0f5ec1be1b45771d46d93bccfb3818ca2617dcb11e7 -F test/snapshot4.test 0f7e6bd6f1370d112ee820c541d0dd0e7b8ab4ea77429e65106d81c9ad2185a6 +F test/snapshot2.test 8d6ff5dd9cc503f6e12d408a30409c3f9c653507b24408d9cd7195931c89bc54 +F test/snapshot3.test 8744313270c55f6e18574283553d3c5c5fe4c5970585663613a0e75c151e599b +F test/snapshot4.test d4e9347ef2fcabc491fc893506c7bbaf334da3be111d6eb4f3a97cc623b78322 F test/snapshot_fault.test 508ae6f211d4991e9ff3b5080aeb0a179bf6755138aabeac4bca8083044d895a -F test/snapshot_up.test 93fec2d847ec12e3bae0f6486da2abc965a606e099e4e870454045f5f56f71ba +F test/snapshot_up.test a0a29c4cf33475fcef07c3f8e64af795e24ab91b4cc68295863402a393cdd41c F test/soak.test 18944cf21b94a7fe0df02016a6ee1e9632bc4e8d095a0cb49d95e15d5cca2d5c F test/softheap1.test 843cd84db9891b2d01b9ab64cef3e9020f98d087 F test/sort.test c2adc635c2564241fefec0b3a68391ef6868fd3b @@ -1324,26 +1336,26 @@ F test/subtype1.test 7fe09496352f97053af1437150751be2d0a0cae8 F test/superlock.test ec94f0556b6488d97f71c79f9061ae08d9ab8f12 F test/swarmvtab.test 9a3fd5ab3e9b3c976ad1b3d7646aab725114f2ac26b59395d0778b33bab6cdaf F test/swarmvtab2.test c948cb2fdfc5b01d85e8f6d6504854202dc1a0782ab2a0ed61538f27cbd0aa5c -F test/swarmvtab3.test 6cb664669630fcec4102a09333e52068734858fd2761eee3b0465c14cdbcee29 -F test/swarmvtabfault.test 00aec54665909490f5c383f3cae3b5d18bd97c12490b429ff8752a3027acfa42 +F test/swarmvtab3.test 247aa38b6ebd2b99db2075847ae47e789ac34f1c2ab5c720dfcffd990004c544 +F test/swarmvtabfault.test 8a67a9f27c61073a47990829e92bc0c64420a807cb642b15a25f6c788210ed95 F test/symlink.test 0d816670325536b8973ec08d32b45136baddb80bd45fd178e0ce7a9e8153f3e7 F test/sync.test 89539f4973c010eda5638407e71ca7fddbcd8e0594f4c9980229f804d4333092 F test/sync2.test 8f9f7d4f6d5be8ca8941a8dadcc4299e558cb6a1ff653a9469146c7a76ef2039 F test/syscall.test a39d9a36f852ae6e4800f861bc2f2e83f68bbc2112d9399931ecfadeabd2d69d F test/sysfault.test c9f2b0d8d677558f74de750c75e12a5454719d04 -F test/tabfunc01.test c47171c36b3d411df2bd49719dcaa5d034f8d277477fd41d253940723b969a51 -F test/table.test b708f3e5fa2542fa51dfab21fc07b36ea445cb2f -F test/tableapi.test 2674633fa95d80da917571ebdd759a14d9819126 +F test/tabfunc01.test 54300134f76db817685194d2f0e63e3fbf7380b45e0d426e00a9aee752497cfb +F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 +F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 F test/tclsqlite.test dca8aa30d84175e7d8c8fc43d3ffa11fa56e23fbdac2679d03833a0f326edf34 F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08 -F test/tempdb2.test 4749545409c6d7438b435c3f05cdd139cf4145a954a6908d19e3443ffd8724b3 +F test/tempdb2.test 2479226e4cb96f4c663eccd2d12c077cf6bda29ca5cc69a8a58a06127105dd62 F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 F test/temptable2.test d2940417496e2b9548e01d09990763fbe88c316504033256d51493e1f1a5ce6a F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc -F test/tester.tcl d5138d226cc2aaacb6934cdd79acaa5edd17cad862482895b833bbf62c49aca0 +F test/tester.tcl fa5656391e3b477508abe12b3b81f019b2e71397399ab38a2f32d8d7f3bf8e56 F test/thread001.test b61a29dd87cf669f5f6ac96124a7c97d71b0c80d9012746072055877055cf9ef F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 @@ -1513,14 +1525,14 @@ F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945 F test/trigger4.test 74700b76ebf3947b2f7a92405141eb2cf2a5d359 F test/trigger5.test 619391a3e9fc194081d22cefd830d811e7badf83 F test/trigger6.test 0e411654f122552da6590f0b4e6f781048a4a9b9 -F test/trigger7.test 93cfa9b48ab9104b2b3d87bc544ac8021405643e36f23ee84635fbfaf9b8fef5 +F test/trigger7.test e7ce54bfda67a88d778aea42544e151c465547a7e617127b6914c2221a6d53c1 F test/trigger8.test 30cb0530bd7c4728055420e3f739aa00412eafa4 F test/trigger9.test 2226ec795a33b0460ab5cf8891e9054cc7edef41 -F test/triggerA.test fe5597f47ee21bacb4936dc827994ed94161e332 +F test/triggerA.test 837be862d8721f903dba3f3ceff05b32e0bee5214cf6ea3da5fadf12d3650e9d F test/triggerB.test 56780c031b454abac2340dbb3b71ac5c56c3d7fe F test/triggerC.test 302d8995f5ffe63bbc15053abb3ef7a39cf5a092 F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650 -F test/triggerE.test d9e9b364dfd527c84ac0de53045406325487feecb32888d482eca64421a50d99 +F test/triggerE.test ede2e4bce4ba802337bd69d39447fa04a938e06d84a8bfc53c76850fc36ed86d F test/triggerF.test 6a8c22bd058cf467f0c7d112afe87f7a8c579c0c4681b914b8f19020f48528a4 F test/triggerG.test d5caeef6144ede2426dd13211fd72248241ff2ebc68e12a4c0bf30f5faa21499 F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 @@ -1531,8 +1543,8 @@ F test/tt3_vacuum.c 1753f45917699c9c1f66b64c717a717c9379f776 F test/types.test bf816ce73c7dfcfe26b700c19f97ef4050d194ff F test/types2.test 1aeb81976841a91eef292723649b5c4fe3bc3cac F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a -F test/unionvtab.test 595fb601de00188ca5e7c6dbe266c17a0faf234cf434ce85eccec1a929ef9baf -F test/unionvtabfault.test 26b6854d5aef9005cd630513025690bff1b7378ae9c97b81e2a3cbe84eee0f58 +F test/unionvtab.test 5ae0f0b4f302a4c6bb310b64386f9ac6a4c1c271c08f31cc7c5d92722e2b2729 +F test/unionvtabfault.test e8759f3d14fb938ce9657e2342db34aeac0fb9bc1692b0d1ebb0069630151d06 F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 @@ -1557,7 +1569,7 @@ F test/vacuummem.test 7b42abb3208bd82dd23a7536588396f295a314f2 F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 F test/view.test 71e1bf4c0e2e0d37c84d7db5b33cd47eb4a7662c19d93ede4112b350b186f61f -F test/vtab1.test 8f91b9538d1404c3932293a588c4344218a0c94792d4289bb55e41020e7b3fff +F test/vtab1.test 60b4f70aafa6078d6fdfc11417af3bd216d7ef5eafce16707a6ca3dae5166d20 F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e F test/vtab4.test 8e73ed268f3d596bc3590f45fc948fb40f28e9c3 @@ -1576,7 +1588,7 @@ F test/vtabH.test 3cf9aa1c1c4381b3b3ac33f933376f06fbb99d2294a83c79b7562d3ed87be4 F test/vtabI.test 751b07636700dbdea328e4265b6077ccd6811a3f F test/vtabJ.test d7b73675708cf63cfcb9d443bb451fc01a028347275b7311e51f9fdf3ca6757f F test/vtab_alter.test 736e66fb5ec7b4fee58229aa3ada2f27ec58bc58c00edae4836890c3784c6783 -F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8 +F test/vtab_err.test dcc8b7b9cb67522b3fe7a272c73856829dae4ab7fdb30399aea1b6981bda2b65 F test/vtab_shared.test 5253bff2355a9a3f014c15337da7e177ab0ef8ad F test/wal.test 613efec03e517e1775d86b993a54877d2e29a477 F test/wal2.test 155b9efa999bdb38ce1cd729b9a4fcdbffd6b88be27f039bad1d2929d287d918 @@ -1584,7 +1596,7 @@ F test/wal3.test 2a93004bc0fb2b5c29888964024695bade278ab2 F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c F test/wal5.test 9c11da7aeccd83a46d79a556ad11a18d3cb15aa9 F test/wal6.test b602704e4b066199bc89d91ca9000f335dcf4572 -F test/wal64k.test 163655ecd2cb8afef4737cac2a40fdd2eeaf20b8 +F test/wal64k.test 2a525c0f45d709bae3765c71045ccec5df7d100ccbd3a7860fdba46c9addb965 F test/wal7.test 2ae8f427d240099cc4b2dfef63cff44e2a68a1bd F test/wal8.test d9df3fba4caad5854ed69ed673c68482514203c8 F test/wal9.test 378e76a9ad09cd9bee06c172ad3547b0129a6750 @@ -1611,7 +1623,7 @@ F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cf F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 -F test/where.test 480cfc1758ac9df3f70c6a2541ff586f6a4833354d5ecb548f643e30e31fddc8 +F test/where.test 8215d220633f08da331781cf9ede7fb7aed50eb113473c10acd39a643fd258ba F test/where2.test 478d2170637b9211f593120648858593bf2445a1 F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8 @@ -1631,34 +1643,34 @@ F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2 F test/whereI.test b7769ee8dbefd987fb266715fee887f05f9ff180016b06fca7fa402df739193b F test/whereJ.test 88287550f6ee604422403b053455b1ad894eeaa5c35d348532dfa1439286cb9a F test/whereK.test f8e3cf26a8513ecc7f514f54df9f0572c046c42b -F test/whereL.test 84de61afe4b8e5a3ff7d741c990d85cb44b3ce798cd8412d5603930f3f75014f +F test/whereL.test 0a19fc44cd1122040f56c934f1b14d0ca85bde28f270268a428dd9796ea0634c F test/wherefault.test 1374c3aa198388925246475f84ad4cd5f9528864 F test/wherelfault.test 9012e4ef5259058b771606616bd007af5d154e64cc25fa9fd4170f6411db44e3 F test/wherelimit.test 592081800806d297dd7449b1030c863d2883d6d42901837ccd2e5a9bd962edb0 -F test/wherelimit2.test be78ba3aa1831c6358fd7d5b9809bfd520f0c2a7d63a295e8f182e140ff137c3 +F test/wherelimit2.test 9bf0aa56cca40ea0e4c5e2915341355a2bbc0859ec4ce1589197fe2a9d94635f F test/wild001.test bca33f499866f04c24510d74baf1e578d4e44b1c F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2aeee74 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 474bef1a6ac291755e51d1f9458dc11117c1870ac5e08b4d3938649b215f8334 +F test/window1.test 02e481ac48c445b43bab7b3cf1e4115165b5127a1aa29e14f5372922c836f1a4 F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143 F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e F test/window3.tcl 577a3b1ff913208e5248c04dab9df17fd760ce159a752789e26d0cb4a5f91823 F test/window3.test e274b7f8952ca4ed25996e0e45c047192b066e0aaff2a822d4293c8c4f1d8d98 F test/window4.tcl 511425f6b0abf9b953df54cc9c7295cc7c25d78f4ed6f7a74b094eec0120eccb F test/window4.test c5d6bf3403e4ade2f19df2afe4c16f29fb817c392c6c1c8017edb7165c191a62 -F test/window5.test 8187f46597c90b73e8f96659e893353cbda337479cc582f7a488eab351ba08d3 -F test/window6.test 7574778c79cae89f1781df237bf9ff5063886deca91a36efc53934315f0e7612 -F test/windowfault.test 23abad97b72c6f609002255ddd41ef5c8922408f918f9b98ad6005ab316e482f -F test/with1.test 58475190cd8caaeebea8cfeb2a264ec97a0c492b8ffe9ad20cefbb23df462f96 +F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652821e +F test/window6.test 5eae4ae7a590ccf1e605880969ca0bad3955616ac91cad3031baea38748badb3 +F test/windowfault.test 12ceb6bbb355d13e8fcd88c5731a57256dfdf77b9a7ae20842a76fcd4623df5b +F test/with1.test 2465d98ffce80d00553ac7135697c18b0369275b6ecc750daa2af320b8c812ca F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab F test/with3.test 5e8ce2c585170bbbc0544e2a01a4941fa0be173ba5265e5c92eb588cd99a232d F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 F test/without_rowid1.test 533add9100255e4cc430d371b3ecfb79f11f956b86c3a1b9d34413bf8e482d8f F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 -F test/without_rowid3.test e1bb85362d9b7b63ea2b93c433bb2923fff8badb98e463474365531c1cd5f880 +F test/without_rowid3.test ea4b59dd1b0d7f5f5e4b7cca978cdb905752a9d7c57dc4344a591dba765a3691 F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a F test/without_rowid6.test 1f99644e6508447fb050f73697350c7ceca3392e @@ -1666,8 +1678,8 @@ F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912ade F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc F test/zeroblob.test 3857870fe681b8185654414a9bccfde80b62a0fa F test/zerodamage.test 9c41628db7e8d9e8a0181e59ea5f189df311a9f6ce99cc376dc461f66db6f8dc -F test/zipfile.test a61f6ba6dbaaf4983849df84a31df140c7ddd1362e2fa9ecd3cdf5cd123b7f18 -F test/zipfile2.test 8a18965530258140ce301b2c2f4245bc505ffead2e17a97fa34c7ace379ea5e0 +F test/zipfile.test b3b558639f7a103e095713ad0f57fec1fce1b7d60c8054df5789b98f7547a395 +F test/zipfile2.test 9903388a602a3834189857a985106ff95c3bba6a3969e0134127df991889db5d F test/zipfilefault.test 44d4d7a7f7cca7521d569d7f71026b241d65a6b1757aa409c1a168827edbbc2c F tool/GetFile.cs a15e08acb5dd7539b75ba23501581d7c2b462cb5 F tool/GetTclKit.bat 8995df40c4209808b31f24de0b58f90930239a234f7591e3675d45bfbb990c5d @@ -1683,11 +1695,11 @@ F tool/fast_vacuum.c 5ba0d6f5963a0a63bdc42840f678bad75b2ebce1 F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439 F tool/fuzzershell.c e1d90a03ca790d7c331c2aae08ca46ff435f1ae1faa6cb9cc48f4687c18fdc6e F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 -F tool/genfkey.test 4196a8928b78f51d54ef58e99e99401ab2f0a7e5 +F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a5a4f F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f F tool/lemon.c 60d1e1eb0f7ebae709f68f1472d77fbf291c5345cd98ff417219da7e74fd09e9 -F tool/lempar.c 6020ce61dd7a536a3866952eb1e616c7e8b14b8f623368ed5a98f0639cedf048 +F tool/lempar.c 452f12d40229847634a160e5666b6c4ec4392fd81941c3443861b48d497054cc F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca @@ -1700,7 +1712,7 @@ F tool/mkmsvcmin.tcl cad0c7b54d7dd92bc87d59f36d4cc4f070eb2e625f14159dc2f5c4204e6 F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl 8b9b448b5eb7222d4e3f7afb3c678596784180d319eb4e01c842887ed8213b85 +F tool/mkpragmatab.tcl a1334e70a08fdf5de32cd0093613212bb11ac8f880487540987175c536ac335f F tool/mkshellc.tcl 1f45770aea226ac093a9c72f718efbb88a2a2833409ec2e1c4cecae4202626f5 F tool/mksourceid.c d458f9004c837bee87a6382228ac20d3eae3c49ea3b0a5aace936f8b60748d3b F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1732,7 +1744,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 7ce07da76b5e745783e703a834417d725b7d45fd F tool/split-sqlite3c.tcl 3efcd4240b738f6bb2b5af0aea7e1e0ef9bc1c61654f645076cec883030b710c -F tool/sqldiff.c 579d7e4e42c30a963781654c87d2868823120b55d59e16ca77b0edbab0218713 +F tool/sqldiff.c 7b9b7238284f02131dbb8f21a4e862409bff728045c5473139d28c67ac87580e F tool/sqlite3_analyzer.c.in 7eeaae8b0d7577662acaabbb11107af0659d1b41bc1dfdd4d91422de27127968 F tool/sqltclsh.c.in 1bcc2e9da58fadf17b0bf6a50e68c1159e602ce057210b655d50bad5aaaef898 F tool/sqltclsh.tcl 862f4cf1418df5e1315b5db3b5ebe88969e2a784525af5fbf9596592f14ed848 @@ -1744,7 +1756,7 @@ F tool/varint.c 5d94cb5003db9dbbcbcc5df08d66f16071aee003 F tool/vdbe-compress.tcl 5926c71f9c12d2ab73ef35c29376e756eb68361c F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 -F tool/warnings.sh 8a4acea31e0f9c562949a2d767329533c0930d699ea19c6704c0ca0aa9154068 +F tool/warnings.sh 09311479bdc290e20ec8e35a3d1b14b096bbd96222277cfd6274c3a99b3d012f F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F vsixtest/App.xaml b76d3b48860e7454775c47ea38ffea9c4abe3e85 F vsixtest/App.xaml.cpp c465147f50871165c60ca16955219f6c5812d6d8 @@ -1767,11 +1779,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 32ac0014266706baa4e98de808eb5a6d0ffdb39dc37b4e37668f339e9e238183 -R ddde28c6e30330f60d15473895b4b263 +P 23684cb841ac2cb0d69e5470253bd96feb733762a7553b952a08470834fe85fa +R dcc394af10af6094607f56a6086fb748 T +bgcolor * #d0c0ff T +sym-release * -T +sym-version-3.25.2 * +T +sym-version-3.26.0 * U drh -Z 46b344691181d24f6c0596b245d11075 +Z 560a5decbb241d53eb97e72267b6e6e8 # Remove this line to create a well-formed manifest. diff --git a/manifest.uuid b/manifest.uuid index b4eb106..166b1b3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fb90e7189ae6d62e77ba3a308ca5d683f90bbe633cf681865365b8e92792d1c7 +bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238b4f9 diff --git a/src/alter.c b/src/alter.c index 6833a8c..1280e90 100644 --- a/src/alter.c +++ b/src/alter.c @@ -667,10 +667,16 @@ static void renameTokenCheckAll(Parse *pParse, void *pPtr){ #endif /* -** Add a new RenameToken object mapping parse tree element pPtr into -** token *pToken to the Parse object currently under construction. +** Remember that the parser tree element pPtr was created using +** the token pToken. ** -** Return a copy of pPtr. +** In other words, construct a new RenameToken object and add it +** to the list of RenameToken objects currently being built up +** in pParse->pRename. +** +** The pPtr argument is returned so that this routine can be used +** with tail recursion in tokenExpr() routine, for a small performance +** improvement. */ void *sqlite3RenameTokenMap(Parse *pParse, void *pPtr, Token *pToken){ RenameToken *pNew; @@ -803,7 +809,7 @@ static int renameColumnExprCb(Walker *pWalker, Expr *pExpr){ renameTokenFind(pWalker->pParse, p, (void*)pExpr); }else if( pExpr->op==TK_COLUMN && pExpr->iColumn==p->iCol - && p->pTab==pExpr->pTab + && p->pTab==pExpr->y.pTab ){ renameTokenFind(pWalker->pParse, p, (void*)pExpr); } @@ -1061,9 +1067,14 @@ static int renameResolveTrigger(Parse *pParse, const char *zDb){ db->aDb[sqlite3SchemaToIndex(db, pNew->pTabSchema)].zDbSName ); pParse->eTriggerOp = pNew->op; + /* ALWAYS() because if the table of the trigger does not exist, the + ** error would have been hit before this point */ + if( ALWAYS(pParse->pTriggerTab) ){ + rc = sqlite3ViewGetColumnNames(pParse, pParse->pTriggerTab); + } /* Resolve symbols in WHEN clause */ - if( pNew->pWhen ){ + if( rc==SQLITE_OK && pNew->pWhen ){ rc = sqlite3ResolveExprNames(&sNC, pNew->pWhen); } @@ -1177,15 +1188,8 @@ static void renameParseCleanup(Parse *pParse){ ** into zNew. The name should be quoted if bQuote is true. ** ** This function is used internally by the ALTER TABLE RENAME COLUMN command. -** Though accessible to application code, it is not intended for use by -** applications. The existance of this function, and the way it works, -** is subject to change without notice. -** -** If any of the parameters are out-of-bounds, then simply return NULL. -** An out-of-bounds parameter can only occur when the application calls -** this function directly. The parameters will always be well-formed when -** this routine is invoked by the bytecode for a legitimate ALTER TABLE -** statement. +** It is only accessible to SQL created using sqlite3NestedParse(). It is +** not reachable from ordinary SQL passed into sqlite3_prepare(). */ static void renameColumnFunc( sqlite3_context *context, @@ -1341,8 +1345,8 @@ renameColumnFunc_done: */ static int renameTableExprCb(Walker *pWalker, Expr *pExpr){ RenameCtx *p = pWalker->u.pRename; - if( pExpr->op==TK_COLUMN && p->pTab==pExpr->pTab ){ - renameTokenFind(pWalker->pParse, p, (void*)&pExpr->pTab); + if( pExpr->op==TK_COLUMN && p->pTab==pExpr->y.pTab ){ + renameTokenFind(pWalker->pParse, p, (void*)&pExpr->y.pTab); } return WRC_Continue; } @@ -1439,7 +1443,7 @@ static void renameTableFunc( }else{ /* Modify any FK definitions to point to the new table. */ #ifndef SQLITE_OMIT_FOREIGN_KEY - if( db->flags & SQLITE_ForeignKeys ){ + if( isLegacy==0 || (db->flags & SQLITE_ForeignKeys) ){ FKey *pFKey; for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){ if( sqlite3_stricmp(pFKey->zTo, zOld)==0 ){ @@ -1593,9 +1597,9 @@ static void renameTableTest( */ void sqlite3AlterFunctions(void){ static FuncDef aAlterTableFuncs[] = { - FUNCTION(sqlite_rename_column, 9, 0, 0, renameColumnFunc), - FUNCTION(sqlite_rename_table, 7, 0, 0, renameTableFunc), - FUNCTION(sqlite_rename_test, 5, 0, 0, renameTableTest), + INTERNAL_FUNCTION(sqlite_rename_column, 9, renameColumnFunc), + INTERNAL_FUNCTION(sqlite_rename_table, 7, renameTableFunc), + INTERNAL_FUNCTION(sqlite_rename_test, 5, renameTableTest), }; sqlite3InsertBuiltinFuncs(aAlterTableFuncs, ArraySize(aAlterTableFuncs)); } diff --git a/src/attach.c b/src/attach.c index 42ae536..0b87d24 100644 --- a/src/attach.c +++ b/src/attach.c @@ -100,7 +100,7 @@ static void attachFunc( if( pNew->pBt ) sqlite3BtreeClose(pNew->pBt); pNew->pBt = 0; pNew->pSchema = 0; - rc = sqlite3BtreeOpen(pVfs, "x", db, &pNew->pBt, 0, SQLITE_OPEN_MAIN_DB); + rc = sqlite3BtreeOpen(pVfs, "x\0", db, &pNew->pBt, 0, SQLITE_OPEN_MAIN_DB); }else{ /* This is a real ATTACH ** diff --git a/src/auth.c b/src/auth.c index 918ff46..6fcdce2 100644 --- a/src/auth.c +++ b/src/auth.c @@ -151,6 +151,7 @@ void sqlite3AuthRead( int iCol; /* Index of column in table */ assert( pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER ); + assert( !IN_RENAME_OBJECT || db->xAuth==0 ); if( db->xAuth==0 ) return; iDb = sqlite3SchemaToIndex(pParse->db, pSchema); if( iDb<0 ){ @@ -207,6 +208,7 @@ int sqlite3AuthCheck( /* Don't do any authorization checks if the database is initialising ** or if the parser is being invoked from within sqlite3_declare_vtab. */ + assert( !IN_RENAME_OBJECT || db->xAuth==0 ); if( db->init.busy || IN_SPECIAL_PARSE ){ return SQLITE_OK; } diff --git a/src/btree.c b/src/btree.c index 2fb5285..137500e 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3112,7 +3112,7 @@ static int lockBtree(BtShared *pBt){ pageSize-usableSize); return rc; } - if( (pBt->db->flags & SQLITE_WriteSchema)==0 && nPage>nPageFile ){ + if( sqlite3WritableSchema(pBt->db)==0 && nPage>nPageFile ){ rc = SQLITE_CORRUPT_BKPT; goto page1_init_failed; } @@ -3586,6 +3586,7 @@ static int relocatePage( eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE ); assert( sqlite3_mutex_held(pBt->mutex) ); assert( pDbPage->pBt==pBt ); + if( iDbPage<3 ) return SQLITE_CORRUPT_BKPT; /* Move page iDbPage from its current location to page number iFreePage */ TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d type %d)\n", @@ -4757,9 +4758,6 @@ static int accessPayload( /* Need to read this page properly. It contains some of the ** range of data that is being read (eOp==0) or written (eOp!=0). */ -#ifdef SQLITE_DIRECT_OVERFLOW_READ - sqlite3_file *fd; /* File from which to do direct overflow read */ -#endif int a = amt; if( a + offset > ovflSize ){ a = ovflSize - offset; @@ -4770,7 +4768,7 @@ static int accessPayload( ** ** 1) this is a read operation, and ** 2) data is required from the start of this overflow page, and - ** 3) there is no open write-transaction, and + ** 3) there are no dirty pages in the page-cache ** 4) the database is file-backed, and ** 5) the page is not in the WAL file ** 6) at least 4 bytes have already been read into the output buffer @@ -4781,11 +4779,10 @@ static int accessPayload( */ if( eOp==0 /* (1) */ && offset==0 /* (2) */ - && pBt->inTransaction==TRANS_READ /* (3) */ - && (fd = sqlite3PagerFile(pBt->pPager))->pMethods /* (4) */ - && 0==sqlite3PagerUseWal(pBt->pPager, nextPage) /* (5) */ + && sqlite3PagerDirectReadOk(pBt->pPager, nextPage) /* (3,4,5) */ && &pBuf[-4]>=pBufStart /* (6) */ ){ + sqlite3_file *fd = sqlite3PagerFile(pBt->pPager); u8 aSave[4]; u8 *aWrite = &pBuf[-4]; assert( aWrite>=pBufStart ); /* due to (6) */ diff --git a/src/build.c b/src/build.c index b404138..e0fed8a 100644 --- a/src/build.c +++ b/src/build.c @@ -356,17 +356,15 @@ Table *sqlite3LocateTable( if( p==0 ){ const char *zMsg = flags & LOCATE_VIEW ? "no such view" : "no such table"; #ifndef SQLITE_OMIT_VIRTUALTABLE - if( sqlite3FindDbName(db, zDbase)<1 ){ - /* If zName is the not the name of a table in the schema created using - ** CREATE, then check to see if it is the name of an virtual table that - ** can be an eponymous virtual table. */ - Module *pMod = (Module*)sqlite3HashFind(&db->aModule, zName); - if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){ - pMod = sqlite3PragmaVtabRegister(db, zName); - } - if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){ - return pMod->pEpoTab; - } + /* If zName is the not the name of a table in the schema created using + ** CREATE, then check to see if it is the name of an virtual table that + ** can be an eponymous virtual table. */ + Module *pMod = (Module*)sqlite3HashFind(&db->aModule, zName); + if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){ + pMod = sqlite3PragmaVtabRegister(db, zName); + } + if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){ + return pMod->pEpoTab; } #endif if( (flags & LOCATE_NOERR)==0 ){ @@ -546,17 +544,22 @@ void sqlite3ResetOneSchema(sqlite3 *db, int iDb){ void sqlite3ResetAllSchemasOfConnection(sqlite3 *db){ int i; sqlite3BtreeEnterAll(db); - assert( db->nSchemaLock==0 ); for(i=0; inDb; i++){ Db *pDb = &db->aDb[i]; if( pDb->pSchema ){ - sqlite3SchemaClear(pDb->pSchema); + if( db->nSchemaLock==0 ){ + sqlite3SchemaClear(pDb->pSchema); + }else{ + DbSetProperty(db, i, DB_ResetWanted); + } } } db->mDbFlags &= ~(DBFLAG_SchemaChange|DBFLAG_SchemaKnownOk); sqlite3VtabUnlockList(db); sqlite3BtreeLeaveAll(db); - sqlite3CollapseDatabaseArray(db); + if( db->nSchemaLock==0 ){ + sqlite3CollapseDatabaseArray(db); + } } /* @@ -633,6 +636,12 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){ /* Delete the Table structure itself. */ +#ifdef SQLITE_ENABLE_NORMALIZE + if( pTable->pColHash ){ + sqlite3HashClear(pTable->pColHash); + sqlite3_free(pTable->pColHash); + } +#endif sqlite3DeleteColumnNames(db, pTable); sqlite3DbFree(db, pTable->zName); sqlite3DbFree(db, pTable->zColAff); @@ -791,6 +800,20 @@ int sqlite3TwoPartName( return iDb; } +/* +** True if PRAGMA writable_schema is ON +*/ +int sqlite3WritableSchema(sqlite3 *db){ + testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))==0 ); + testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))== + SQLITE_WriteSchema ); + testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))== + SQLITE_Defensive ); + testcase( (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))== + (SQLITE_WriteSchema|SQLITE_Defensive) ); + return (db->flags&(SQLITE_WriteSchema|SQLITE_Defensive))==SQLITE_WriteSchema; +} + /* ** This routine is used to check if the UTF-8 string zName is a legal ** unqualified name for a new schema object (table, index, view or @@ -800,7 +823,7 @@ int sqlite3TwoPartName( */ int sqlite3CheckObjectName(Parse *pParse, const char *zName){ if( !pParse->db->init.busy && pParse->nested==0 - && (pParse->db->flags & SQLITE_WriteSchema)==0 + && sqlite3WritableSchema(pParse->db)==0 && 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){ sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", zName); return SQLITE_ERROR; @@ -1876,6 +1899,36 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ recomputeColumnsNotIndexed(pPk); } +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Return true if zName is a shadow table name in the current database +** connection. +** +** zName is temporarily modified while this routine is running, but is +** restored to its original value prior to this routine returning. +*/ +static int isShadowTableName(sqlite3 *db, char *zName){ + char *zTail; /* Pointer to the last "_" in zName */ + Table *pTab; /* Table that zName is a shadow of */ + Module *pMod; /* Module for the virtual table */ + + zTail = strrchr(zName, '_'); + if( zTail==0 ) return 0; + *zTail = 0; + pTab = sqlite3FindTable(db, zName, 0); + *zTail = '_'; + if( pTab==0 ) return 0; + if( !IsVirtual(pTab) ) return 0; + pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->azModuleArg[0]); + if( pMod==0 ) return 0; + if( pMod->pModule->iVersion<3 ) return 0; + if( pMod->pModule->xShadowName==0 ) return 0; + return pMod->pModule->xShadowName(zTail+1); +} +#else +# define isShadowTableName(x,y) 0 +#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */ + /* ** This routine is called to report the final ")" that terminates ** a CREATE TABLE statement. @@ -1915,6 +1968,10 @@ void sqlite3EndTable( p = pParse->pNewTable; if( p==0 ) return; + if( pSelect==0 && isShadowTableName(db, p->zName) ){ + p->tabFlags |= TF_Shadow; + } + /* If the db->init.busy is 1 it means we are reading the SQL off the ** "sqlite_master" or "sqlite_temp_master" table on the disk. ** So do not write to the disk again. Extract the root page number @@ -2422,7 +2479,7 @@ void sqlite3RootPageMoved(sqlite3 *db, int iDb, int iFrom, int iTo){ static void destroyRootPage(Parse *pParse, int iTable, int iDb){ Vdbe *v = sqlite3GetVdbe(pParse); int r1 = sqlite3GetTempReg(pParse); - assert( iTable>1 ); + if( iTable<2 ) sqlite3ErrorMsg(pParse, "corrupt schema"); sqlite3VdbeAddOp3(v, OP_Destroy, iTable, r1, iDb); sqlite3MayAbort(pParse); #ifndef SQLITE_OMIT_AUTOVACUUM diff --git a/src/callback.c b/src/callback.c index a629b68..faf6d52 100644 --- a/src/callback.c +++ b/src/callback.c @@ -295,6 +295,21 @@ static FuncDef *functionSearch( } return 0; } +#ifdef SQLITE_ENABLE_NORMALIZE +FuncDef *sqlite3FunctionSearchN( + int h, /* Hash of the name */ + const char *zFunc, /* Name of function */ + int nFunc /* Length of the name */ +){ + FuncDef *p; + for(p=sqlite3BuiltinFunctions.a[h]; p; p=p->u.pHash){ + if( sqlite3StrNICmp(p->zName, zFunc, nFunc)==0 ){ + return p; + } + } + return 0; +} +#endif /* SQLITE_ENABLE_NORMALIZE */ /* ** Insert a new FuncDef into a FuncDefHash hash table. @@ -308,7 +323,7 @@ void sqlite3InsertBuiltinFuncs( FuncDef *pOther; const char *zName = aDef[i].zName; int nName = sqlite3Strlen30(zName); - int h = (zName[0] + nName) % SQLITE_FUNC_HASH_SZ; + int h = SQLITE_FUNC_HASH(zName[0], nName); assert( zName[0]>='a' && zName[0]<='z' ); pOther = functionSearch(h, zName); if( pOther ){ @@ -387,7 +402,7 @@ FuncDef *sqlite3FindFunction( */ if( !createFlag && (pBest==0 || (db->mDbFlags & DBFLAG_PreferBuiltin)!=0) ){ bestScore = 0; - h = (sqlite3UpperToLower[(u8)zName[0]] + nName) % SQLITE_FUNC_HASH_SZ; + h = SQLITE_FUNC_HASH(sqlite3UpperToLower[(u8)zName[0]], nName); p = functionSearch(h, zName); while( p ){ int score = matchQuality(p, nArg, enc); diff --git a/src/ctime.c b/src/ctime.c index f408a3b..27fc4fe 100644 --- a/src/ctime.c +++ b/src/ctime.c @@ -235,6 +235,9 @@ static const char * const sqlite3azCompileOpt[] = { #if SQLITE_ENABLE_FTS5 "ENABLE_FTS5", #endif +#if SQLITE_ENABLE_GEOPOLY + "ENABLE_GEOPOLY", +#endif #if SQLITE_ENABLE_HIDDEN_COLUMNS "ENABLE_HIDDEN_COLUMNS", #endif @@ -265,6 +268,9 @@ static const char * const sqlite3azCompileOpt[] = { #if SQLITE_ENABLE_MULTIPLEX "ENABLE_MULTIPLEX", #endif +#if SQLITE_ENABLE_NORMALIZE + "ENABLE_NORMALIZE", +#endif #if SQLITE_ENABLE_NULL_TRIM "ENABLE_NULL_TRIM", #endif diff --git a/src/dbpage.c b/src/dbpage.c index 5b19abd..27c962d 100644 --- a/src/dbpage.c +++ b/src/dbpage.c @@ -119,9 +119,8 @@ static int dbpageBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ if( p->iColumn!=DBPAGE_COLUMN_SCHEMA ) continue; if( p->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; if( !p->usable ){ - /* No solution. Use the default SQLITE_BIG_DBL cost */ - pIdxInfo->estimatedRows = 0x7fffffff; - return SQLITE_OK; + /* No solution. */ + return SQLITE_CONSTRAINT; } iPlan = 2; pIdxInfo->aConstraintUsage[i].argvIndex = 1; @@ -313,6 +312,10 @@ static int dbpageUpdate( Pager *pPager; int szPage; + if( pTab->db->flags & SQLITE_Defensive ){ + zErr = "read-only"; + goto update_fail; + } if( argc==1 ){ zErr = "cannot delete"; goto update_fail; @@ -403,6 +406,7 @@ int sqlite3DbpageRegister(sqlite3 *db){ 0, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ + 0 /* xShadowName */ }; return sqlite3_create_module(db, "sqlite_dbpage", &dbpage_module, 0); } diff --git a/src/dbstat.c b/src/dbstat.c index 0f1fd0a..a6e521b 100644 --- a/src/dbstat.c +++ b/src/dbstat.c @@ -194,17 +194,15 @@ static int statDisconnect(sqlite3_vtab *pVtab){ static int statBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ int i; - pIdxInfo->estimatedCost = 1.0e6; /* Initial cost estimate */ - /* Look for a valid schema=? constraint. If found, change the idxNum to ** 1 and request the value of that constraint be sent to xFilter. And ** lower the cost estimate to encourage the constrained version to be ** used. */ for(i=0; inConstraint; i++){ - if( pIdxInfo->aConstraint[i].usable==0 ) continue; - if( pIdxInfo->aConstraint[i].op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; if( pIdxInfo->aConstraint[i].iColumn!=10 ) continue; + if( pIdxInfo->aConstraint[i].usable==0 ) return SQLITE_CONSTRAINT; + if( pIdxInfo->aConstraint[i].op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; pIdxInfo->idxNum = 1; pIdxInfo->estimatedCost = 1.0; pIdxInfo->aConstraintUsage[i].argvIndex = 1; @@ -254,7 +252,7 @@ static int statOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ return SQLITE_OK; } -static void statClearPage(StatPage *p){ +static void statClearCells(StatPage *p){ int i; if( p->aCell ){ for(i=0; inCell; i++){ @@ -262,6 +260,12 @@ static void statClearPage(StatPage *p){ } sqlite3_free(p->aCell); } + p->nCell = 0; + p->aCell = 0; +} + +static void statClearPage(StatPage *p){ + statClearCells(p); sqlite3PagerUnref(p->pPg); sqlite3_free(p->zPath); memset(p, 0, sizeof(StatPage)); @@ -324,22 +328,33 @@ static int statDecodePage(Btree *pBt, StatPage *p){ u8 *aHdr = &aData[p->iPgno==1 ? 100 : 0]; p->flags = aHdr[0]; + if( p->flags==0x0A || p->flags==0x0D ){ + isLeaf = 1; + nHdr = 8; + }else if( p->flags==0x05 || p->flags==0x02 ){ + isLeaf = 0; + nHdr = 12; + }else{ + goto statPageIsCorrupt; + } + if( p->iPgno==1 ) nHdr += 100; p->nCell = get2byte(&aHdr[3]); p->nMxPayload = 0; - - isLeaf = (p->flags==0x0A || p->flags==0x0D); - nHdr = 12 - isLeaf*4 + (p->iPgno==1)*100; + szPage = sqlite3BtreeGetPageSize(pBt); nUnused = get2byte(&aHdr[5]) - nHdr - 2*p->nCell; nUnused += (int)aHdr[7]; iOff = get2byte(&aHdr[1]); while( iOff ){ + int iNext; + if( iOff>=szPage ) goto statPageIsCorrupt; nUnused += get2byte(&aData[iOff+2]); - iOff = get2byte(&aData[iOff]); + iNext = get2byte(&aData[iOff]); + if( iNext0 ) goto statPageIsCorrupt; + iOff = iNext; } p->nUnused = nUnused; p->iRightChildPg = isLeaf ? 0 : sqlite3Get4byte(&aHdr[8]); - szPage = sqlite3BtreeGetPageSize(pBt); if( p->nCell ){ int i; /* Used to iterate through cells */ @@ -356,6 +371,7 @@ static int statDecodePage(Btree *pBt, StatPage *p){ StatCell *pCell = &p->aCell[i]; iOff = get2byte(&aData[nHdr+i*2]); + if( iOff=szPage ) goto statPageIsCorrupt; if( !isLeaf ){ pCell->iChildPg = sqlite3Get4byte(&aData[iOff]); iOff += 4; @@ -372,13 +388,14 @@ static int statDecodePage(Btree *pBt, StatPage *p){ } if( nPayload>(u32)p->nMxPayload ) p->nMxPayload = nPayload; getLocalPayload(nUsable, p->flags, nPayload, &nLocal); + if( nLocal<0 ) goto statPageIsCorrupt; pCell->nLocal = nLocal; - assert( nLocal>=0 ); assert( nPayload>=(u32)nLocal ); assert( nLocal<=(nUsable-35) ); if( nPayload>(u32)nLocal ){ int j; int nOvfl = ((nPayload - nLocal) + nUsable-4 - 1) / (nUsable - 4); + if( iOff+nLocal>nUsable ) goto statPageIsCorrupt; pCell->nLastOvfl = (nPayload-nLocal) - (nOvfl-1) * (nUsable-4); pCell->nOvfl = nOvfl; pCell->aOvfl = sqlite3_malloc64(sizeof(u32)*nOvfl); @@ -402,6 +419,11 @@ static int statDecodePage(Btree *pBt, StatPage *p){ } return SQLITE_OK; + +statPageIsCorrupt: + p->flags = 0; + statClearCells(p); + return SQLITE_OK; } /* @@ -697,6 +719,7 @@ int sqlite3DbstatRegister(sqlite3 *db){ 0, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ + 0 /* xShadowName */ }; return sqlite3_create_module(db, "dbstat", &dbstat_module, 0); } diff --git a/src/delete.c b/src/delete.c index 746f672..4ba8e42 100644 --- a/src/delete.c +++ b/src/delete.c @@ -44,32 +44,49 @@ Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){ return pTab; } +/* Return true if table pTab is read-only. +** +** A table is read-only if any of the following are true: +** +** 1) It is a virtual table and no implementation of the xUpdate method +** has been provided +** +** 2) It is a system table (i.e. sqlite_master), this call is not +** part of a nested parse and writable_schema pragma has not +** been specified +** +** 3) The table is a shadow table, the database connection is in +** defensive mode, and the current sqlite3_prepare() +** is for a top-level SQL statement. +*/ +static int tabIsReadOnly(Parse *pParse, Table *pTab){ + sqlite3 *db; + if( IsVirtual(pTab) ){ + return sqlite3GetVTable(pParse->db, pTab)->pMod->pModule->xUpdate==0; + } + if( (pTab->tabFlags & (TF_Readonly|TF_Shadow))==0 ) return 0; + db = pParse->db; + if( (pTab->tabFlags & TF_Readonly)!=0 ){ + return sqlite3WritableSchema(db)==0 && pParse->nested==0; + } + assert( pTab->tabFlags & TF_Shadow ); + return (db->flags & SQLITE_Defensive)!=0 +#ifndef SQLITE_OMIT_VIRTUALTABLE + && db->pVtabCtx==0 +#endif + && db->nVdbeExec==0; +} + /* ** Check to make sure the given table is writable. If it is not ** writable, generate an error message and return 1. If it is ** writable return 0; */ int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){ - /* A table is not writable under the following circumstances: - ** - ** 1) It is a virtual table and no implementation of the xUpdate method - ** has been provided, or - ** 2) It is a system table (i.e. sqlite_master), this call is not - ** part of a nested parse and writable_schema pragma has not - ** been specified. - ** - ** In either case leave an error message in pParse and return non-zero. - */ - if( ( IsVirtual(pTab) - && sqlite3GetVTable(pParse->db, pTab)->pMod->pModule->xUpdate==0 ) - || ( (pTab->tabFlags & TF_Readonly)!=0 - && (pParse->db->flags & SQLITE_WriteSchema)==0 - && pParse->nested==0 ) - ){ + if( tabIsReadOnly(pParse, pTab) ){ sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName); return 1; } - #ifndef SQLITE_OMIT_VIEW if( !viewOk && pTab->pSelect ){ sqlite3ErrorMsg(pParse,"cannot modify %s because it is a view",pTab->zName); diff --git a/src/expr.c b/src/expr.c index 3372fef..d4eb9de 100644 --- a/src/expr.c +++ b/src/expr.c @@ -58,8 +58,8 @@ char sqlite3ExprAffinity(Expr *pExpr){ return sqlite3AffinityType(pExpr->u.zToken, 0); } #endif - if( (op==TK_AGG_COLUMN || op==TK_COLUMN) && pExpr->pTab ){ - return sqlite3TableColumnAffinity(pExpr->pTab, pExpr->iColumn); + if( (op==TK_AGG_COLUMN || op==TK_COLUMN) && pExpr->y.pTab ){ + return sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); } if( op==TK_SELECT_COLUMN ){ assert( pExpr->pLeft->flags&EP_xIsSelect ); @@ -143,13 +143,13 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ if( p->flags & EP_Generic ) break; if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_REGISTER || op==TK_TRIGGER) - && p->pTab!=0 + && p->y.pTab!=0 ){ - /* op==TK_REGISTER && p->pTab!=0 happens when pExpr was originally + /* op==TK_REGISTER && p->y.pTab!=0 happens when pExpr was originally ** a TK_COLUMN but was previously evaluated and cached in a register */ int j = p->iColumn; if( j>=0 ){ - const char *zColl = p->pTab->aCol[j].zColl; + const char *zColl = p->y.pTab->aCol[j].zColl; pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0); } break; @@ -1052,6 +1052,10 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ assert( p!=0 ); /* Sanity check: Assert that the IntValue is non-negative if it exists */ assert( !ExprHasProperty(p, EP_IntValue) || p->u.iValue>=0 ); + + assert( !ExprHasProperty(p, EP_WinFunc) || p->y.pWin!=0 || db->mallocFailed ); + assert( p->op!=TK_FUNCTION || ExprHasProperty(p, EP_TokenOnly|EP_Reduced) + || p->y.pWin==0 || ExprHasProperty(p, EP_WinFunc) ); #ifdef SQLITE_DEBUG if( ExprHasProperty(p, EP_Leaf) && !ExprHasProperty(p, EP_TokenOnly) ){ assert( p->pLeft==0 ); @@ -1070,8 +1074,9 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ }else{ sqlite3ExprListDelete(db, p->x.pList); } - if( !ExprHasProperty(p, EP_Reduced) ){ - sqlite3WindowDelete(db, p->pWin); + if( ExprHasProperty(p, EP_WinFunc) ){ + assert( p->op==TK_FUNCTION ); + sqlite3WindowDelete(db, p->y.pWin); } } if( ExprHasProperty(p, EP_MemToken) ) sqlite3DbFree(db, p->u.zToken); @@ -1135,7 +1140,7 @@ static int dupedExprStructSize(Expr *p, int flags){ assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 ); if( 0==flags || p->op==TK_SELECT_COLUMN #ifndef SQLITE_OMIT_WINDOWFUNC - || p->pWin + || ExprHasProperty(p, EP_WinFunc) #endif ){ nSize = EXPR_FULLSIZE; @@ -1162,7 +1167,7 @@ static int dupedExprStructSize(Expr *p, int flags){ static int dupedExprNodeSize(Expr *p, int flags){ int nByte = dupedExprStructSize(p, flags) & 0xfff; if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ - nByte += sqlite3Strlen30(p->u.zToken)+1; + nByte += sqlite3Strlen30NN(p->u.zToken)+1; } return ROUND8(nByte); } @@ -1265,22 +1270,24 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ } /* Fill in pNew->pLeft and pNew->pRight. */ - zAlloc += dupedExprNodeSize(p, dupFlags); - if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly) ){ + if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly|EP_WinFunc) ){ + zAlloc += dupedExprNodeSize(p, dupFlags); if( !ExprHasProperty(pNew, EP_TokenOnly|EP_Leaf) ){ pNew->pLeft = p->pLeft ? exprDup(db, p->pLeft, EXPRDUP_REDUCE, &zAlloc) : 0; pNew->pRight = p->pRight ? exprDup(db, p->pRight, EXPRDUP_REDUCE, &zAlloc) : 0; } - }else{ #ifndef SQLITE_OMIT_WINDOWFUNC - if( ExprHasProperty(p, EP_Reduced|EP_TokenOnly) ){ - pNew->pWin = 0; - }else{ - pNew->pWin = sqlite3WindowDup(db, pNew, p->pWin); + if( ExprHasProperty(p, EP_WinFunc) ){ + pNew->y.pWin = sqlite3WindowDup(db, pNew, p->y.pWin); + assert( ExprHasProperty(pNew, EP_WinFunc) ); } #endif /* SQLITE_OMIT_WINDOWFUNC */ + if( pzBuffer ){ + *pzBuffer = zAlloc; + } + }else{ if( !ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ if( pNew->op==TK_SELECT_COLUMN ){ pNew->pLeft = p->pLeft; @@ -1292,9 +1299,6 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ pNew->pRight = sqlite3ExprDup(db, p->pRight, 0); } } - if( pzBuffer ){ - *pzBuffer = zAlloc; - } } return pNew; } @@ -2089,8 +2093,8 @@ int sqlite3ExprCanBeNull(const Expr *p){ return 0; case TK_COLUMN: return ExprHasProperty(p, EP_CanBeNull) || - p->pTab==0 || /* Reference to column of index on expression */ - (p->iColumn>=0 && p->pTab->aCol[p->iColumn].notNull==0); + p->y.pTab==0 || /* Reference to column of index on expression */ + (p->iColumn>=0 && p->y.pTab->aCol[p->iColumn].notNull==0); default: return 1; } @@ -2145,6 +2149,14 @@ int sqlite3IsRowid(const char *z){ if( sqlite3StrICmp(z, "OID")==0 ) return 1; return 0; } +#ifdef SQLITE_ENABLE_NORMALIZE +int sqlite3IsRowidN(const char *z, int n){ + if( sqlite3StrNICmp(z, "_ROWID_", n)==0 ) return 1; + if( sqlite3StrNICmp(z, "ROWID", n)==0 ) return 1; + if( sqlite3StrNICmp(z, "OID", n)==0 ) return 1; + return 0; +} +#endif /* ** pX is the RHS of an IN operator. If pX is a SELECT statement @@ -3378,7 +3390,7 @@ expr_code_doover: ** constant. */ int iReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft,target); - int aff = sqlite3TableColumnAffinity(pExpr->pTab, pExpr->iColumn); + int aff = sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); if( aff!=SQLITE_AFF_BLOB ){ static const char zAff[] = "B\000C\000D\000E"; assert( SQLITE_AFF_BLOB=='A' ); @@ -3402,7 +3414,7 @@ expr_code_doover: iTab = pParse->iSelfTab - 1; } } - return sqlite3ExprCodeGetColumn(pParse, pExpr->pTab, + return sqlite3ExprCodeGetColumn(pParse, pExpr->y.pTab, pExpr->iColumn, iTab, target, pExpr->op2); } @@ -3616,8 +3628,8 @@ expr_code_doover: CollSeq *pColl = 0; /* A collating sequence */ #ifndef SQLITE_OMIT_WINDOWFUNC - if( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) && pExpr->pWin ){ - return pExpr->pWin->regResult; + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + return pExpr->y.pWin->regResult; } #endif @@ -3860,7 +3872,7 @@ expr_code_doover: ** p1==1 -> old.a p1==4 -> new.a ** p1==2 -> old.b p1==5 -> new.b */ - Table *pTab = pExpr->pTab; + Table *pTab = pExpr->y.pTab; int p1 = pExpr->iTable * (pTab->nCol+1) + 1 + pExpr->iColumn; assert( pExpr->iTable==0 || pExpr->iTable==1 ); @@ -3871,7 +3883,7 @@ expr_code_doover: sqlite3VdbeAddOp2(v, OP_Param, p1, target); VdbeComment((v, "r[%d]=%s.%s", target, (pExpr->iTable ? "new" : "old"), - (pExpr->iColumn<0 ? "rowid" : pExpr->pTab->aCol[pExpr->iColumn].zName) + (pExpr->iColumn<0 ? "rowid" : pExpr->y.pTab->aCol[pExpr->iColumn].zName) )); #ifndef SQLITE_OMIT_FLOATING_POINT @@ -4722,6 +4734,20 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ if( pA->op!=TK_COLUMN && pA->op!=TK_AGG_COLUMN && pA->u.zToken ){ if( pA->op==TK_FUNCTION ){ if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; +#ifndef SQLITE_OMIT_WINDOWFUNC + /* Justification for the assert(): + ** window functions have p->op==TK_FUNCTION but aggregate functions + ** have p->op==TK_AGG_FUNCTION. So any comparison between an aggregate + ** function and a window function should have failed before reaching + ** this point. And, it is not possible to have a window function and + ** a scalar function with the same name and number of arguments. So + ** if we reach this point, either A and B both window functions or + ** neither are a window functions. */ + assert( ExprHasProperty(pA,EP_WinFunc)==ExprHasProperty(pB,EP_WinFunc) ); + if( ExprHasProperty(pA,EP_WinFunc) ){ + if( sqlite3WindowCompare(pParse,pA->y.pWin,pB->y.pWin)!=0 ) return 2; + } +#endif }else if( pA->op==TK_COLLATE ){ if( sqlite3_stricmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; }else if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ @@ -4741,21 +4767,6 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ if( pA->iTable!=pB->iTable && (pA->iTable!=iTab || NEVER(pB->iTable>=0)) ) return 2; } -#ifndef SQLITE_OMIT_WINDOWFUNC - /* Justification for the assert(): - ** window functions have p->op==TK_FUNCTION but aggregate functions - ** have p->op==TK_AGG_FUNCTION. So any comparison between an aggregate - ** function and a window function should have failed before reaching - ** this point. And, it is not possible to have a window function and - ** a scalar function with the same name and number of arguments. So - ** if we reach this point, either A and B both window functions or - ** neither are a window functions. */ - assert( (pA->pWin==0)==(pB->pWin==0) ); - - if( pA->pWin!=0 ){ - if( sqlite3WindowCompare(pParse,pA->pWin,pB->pWin)!=0 ) return 2; - } -#endif } return 0; } @@ -4896,8 +4907,8 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_LE ); testcase( pExpr->op==TK_GT ); testcase( pExpr->op==TK_GE ); - if( (pExpr->pLeft->op==TK_COLUMN && IsVirtual(pExpr->pLeft->pTab)) - || (pExpr->pRight->op==TK_COLUMN && IsVirtual(pExpr->pRight->pTab)) + if( (pExpr->pLeft->op==TK_COLUMN && IsVirtual(pExpr->pLeft->y.pTab)) + || (pExpr->pRight->op==TK_COLUMN && IsVirtual(pExpr->pRight->y.pTab)) ){ return WRC_Prune; } @@ -5128,7 +5139,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ && (k = addAggInfoColumn(pParse->db, pAggInfo))>=0 ){ pCol = &pAggInfo->aCol[k]; - pCol->pTab = pExpr->pTab; + pCol->pTab = pExpr->y.pTab; pCol->iTable = pExpr->iTable; pCol->iColumn = pExpr->iColumn; pCol->iMem = ++pParse->nMem; diff --git a/src/fkey.c b/src/fkey.c index 0f5248f..6777d71 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -502,7 +502,7 @@ static Expr *exprTableColumn( ){ Expr *pExpr = sqlite3Expr(db, TK_COLUMN, 0); if( pExpr ){ - pExpr->pTab = pTab; + pExpr->y.pTab = pTab; pExpr->iTable = iCursor; pExpr->iColumn = iCol; } diff --git a/src/global.c b/src/global.c index f0362d1..f1a3912 100644 --- a/src/global.c +++ b/src/global.c @@ -240,6 +240,7 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = { 0, /* xTestCallback */ #endif 0, /* bLocaltimeFault */ + 0, /* bInternalFunctions */ 0x7ffffffe, /* iOnceResetThreshold */ SQLITE_DEFAULT_SORTERREF_SIZE /* szSorterRef */ }; diff --git a/src/hash.c b/src/hash.c index 79bb85a..fba9dc9 100644 --- a/src/hash.c +++ b/src/hash.c @@ -64,6 +64,20 @@ static unsigned int strHash(const char *z){ } return h; } +#ifdef SQLITE_ENABLE_NORMALIZE +static unsigned int strHashN(const char *z, int n){ + unsigned int h = 0; + int i; + for(i=0; iht ){ /*OPTIMIZATION-IF-TRUE*/ + struct _ht *pEntry; + h = strHashN(pKey, nKey) % pH->htsize; + pEntry = &pH->ht[h]; + elem = pEntry->chain; + count = pEntry->count; + }else{ + h = 0; + elem = pH->first; + count = pH->count; + } + if( pHash ) *pHash = h; + while( count-- ){ + assert( elem!=0 ); + if( sqlite3StrNICmp(elem->pKey,pKey,nKey)==0 ){ + return elem; + } + elem = elem->next; + } + return &nullElement; +} +#endif /* SQLITE_ENABLE_NORMALIZE */ /* Remove a single entry from the hash table given a pointer to that ** element and a hash on the element's key. @@ -219,6 +267,14 @@ void *sqlite3HashFind(const Hash *pH, const char *pKey){ assert( pKey!=0 ); return findElementWithHash(pH, pKey, 0)->data; } +#ifdef SQLITE_ENABLE_NORMALIZE +void *sqlite3HashFindN(const Hash *pH, const char *pKey, int nKey){ + assert( pH!=0 ); + assert( pKey!=0 ); + assert( nKey>=0 ); + return findElementWithHashN(pH, pKey, nKey, 0)->data; +} +#endif /* SQLITE_ENABLE_NORMALIZE */ /* Insert an element into the hash table pH. The key is pKey ** and the data is "data". diff --git a/src/insert.c b/src/insert.c index 12a6bb8..7a94139 100644 --- a/src/insert.c +++ b/src/insert.c @@ -146,7 +146,8 @@ void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ }while( i>=0 && zColAff[i]==SQLITE_AFF_BLOB ); pTab->zColAff = zColAff; } - i = sqlite3Strlen30(zColAff); + assert( zColAff!=0 ); + i = sqlite3Strlen30NN(zColAff); if( i ){ if( iReg ){ sqlite3VdbeAddOp4(v, OP_Affinity, iReg, i, 0, zColAff, i); @@ -1126,14 +1127,15 @@ insert_cleanup: #endif /* -** Meanings of bits in of pWalker->eCode for checkConstraintUnchanged() +** Meanings of bits in of pWalker->eCode for +** sqlite3ExprReferencesUpdatedColumn() */ #define CKCNSTRNT_COLUMN 0x01 /* CHECK constraint uses a changing column */ #define CKCNSTRNT_ROWID 0x02 /* CHECK constraint references the ROWID */ -/* This is the Walker callback from checkConstraintUnchanged(). Set -** bit 0x01 of pWalker->eCode if -** pWalker->eCode to 0 if this expression node references any of the +/* This is the Walker callback from sqlite3ExprReferencesUpdatedColumn(). +* Set bit 0x01 of pWalker->eCode if pWalker->eCode to 0 and if this +** expression node references any of the ** columns that are being modifed by an UPDATE statement. */ static int checkConstraintExprNode(Walker *pWalker, Expr *pExpr){ @@ -1155,12 +1157,21 @@ static int checkConstraintExprNode(Walker *pWalker, Expr *pExpr){ ** only columns that are modified by the UPDATE are those for which ** aiChng[i]>=0, and also the ROWID is modified if chngRowid is true. ** -** Return true if CHECK constraint pExpr does not use any of the +** Return true if CHECK constraint pExpr uses any of the ** changing columns (or the rowid if it is changing). In other words, -** return true if this CHECK constraint can be skipped when validating +** return true if this CHECK constraint must be validated for ** the new row in the UPDATE statement. +** +** 2018-09-15: pExpr might also be an expression for an index-on-expressions. +** The operation of this routine is the same - return true if an only if +** the expression uses one or more of columns identified by the second and +** third arguments. */ -static int checkConstraintUnchanged(Expr *pExpr, int *aiChng, int chngRowid){ +int sqlite3ExprReferencesUpdatedColumn( + Expr *pExpr, /* The expression to be checked */ + int *aiChng, /* aiChng[x]>=0 if column x changed by the UPDATE */ + int chngRowid /* True if UPDATE changes the rowid */ +){ Walker w; memset(&w, 0, sizeof(w)); w.eCode = 0; @@ -1175,7 +1186,7 @@ static int checkConstraintUnchanged(Expr *pExpr, int *aiChng, int chngRowid){ testcase( w.eCode==CKCNSTRNT_COLUMN ); testcase( w.eCode==CKCNSTRNT_ROWID ); testcase( w.eCode==(CKCNSTRNT_ROWID|CKCNSTRNT_COLUMN) ); - return !w.eCode; + return w.eCode!=0; } /* @@ -1381,7 +1392,13 @@ void sqlite3GenerateConstraintChecks( for(i=0; inExpr; i++){ int allOk; Expr *pExpr = pCheck->a[i].pExpr; - if( aiChng && checkConstraintUnchanged(pExpr, aiChng, pkChng) ) continue; + if( aiChng + && !sqlite3ExprReferencesUpdatedColumn(pExpr, aiChng, pkChng) + ){ + /* The check constraints do not reference any of the columns being + ** updated so there is no point it verifying the check constraint */ + continue; + } allOk = sqlite3VdbeMakeLabel(v); sqlite3VdbeVerifyAbortable(v, onError); sqlite3ExprIfTrue(pParse, pExpr, allOk, SQLITE_JUMPIFNULL); diff --git a/src/loadext.c b/src/loadext.c index 72bfd5c..966d2dd 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -84,6 +84,7 @@ # define sqlite3_declare_vtab 0 # define sqlite3_vtab_config 0 # define sqlite3_vtab_on_conflict 0 +# define sqlite3_vtab_collation 0 #endif #ifdef SQLITE_OMIT_SHARED_CACHE @@ -451,7 +452,13 @@ static const sqlite3_api_routines sqlite3Apis = { sqlite3_str_length, sqlite3_str_value, /* Version 3.25.0 and later */ - sqlite3_create_window_function + sqlite3_create_window_function, + /* Version 3.26.0 and later */ +#ifdef SQLITE_ENABLE_NORMALIZE + sqlite3_normalized_sql +#else + 0 +#endif }; /* diff --git a/src/main.c b/src/main.c index 8935a19..46c8346 100644 --- a/src/main.c +++ b/src/main.c @@ -835,6 +835,7 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){ { SQLITE_DBCONFIG_ENABLE_QPSG, SQLITE_EnableQPSG }, { SQLITE_DBCONFIG_TRIGGER_EQP, SQLITE_TriggerEQP }, { SQLITE_DBCONFIG_RESET_DATABASE, SQLITE_ResetDatabase }, + { SQLITE_DBCONFIG_DEFENSIVE, SQLITE_Defensive }, }; unsigned int i; rc = SQLITE_ERROR; /* IMP: R-42790-23372 */ @@ -3061,6 +3062,9 @@ static int openDatabase( #endif #if defined(SQLITE_ENABLE_QPSG) | SQLITE_EnableQPSG +#endif +#if defined(SQLITE_DEFAULT_DEFENSIVE) + | SQLITE_Defensive #endif ; sqlite3HashInit(&db->aCollSeq); @@ -3949,15 +3953,26 @@ int sqlite3_test_control(int op, ...){ /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, int onoff); ** - ** If parameter onoff is non-zero, configure the wrappers so that all - ** subsequent calls to localtime() and variants fail. If onoff is zero, - ** undo this setting. + ** If parameter onoff is non-zero, subsequent calls to localtime() + ** and its variants fail. If onoff is zero, undo this setting. */ case SQLITE_TESTCTRL_LOCALTIME_FAULT: { sqlite3GlobalConfig.bLocaltimeFault = va_arg(ap, int); break; } + /* sqlite3_test_control(SQLITE_TESTCTRL_INTERNAL_FUNCS, int onoff); + ** + ** If parameter onoff is non-zero, internal-use-only SQL functions + ** are visible to ordinary SQL. This is useful for testing but is + ** unsafe because invalid parameters to those internal-use-only functions + ** can result in crashes or segfaults. + */ + case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: { + sqlite3GlobalConfig.bInternalFunctions = va_arg(ap, int); + break; + } + /* sqlite3_test_control(SQLITE_TESTCTRL_NEVER_CORRUPT, int); ** ** Set or clear a flag that indicates that the database file is always well- diff --git a/src/os_unix.c b/src/os_unix.c index 6a11950..f20763e 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -136,12 +136,10 @@ #define SQLITE_FSFLAGS_IS_MSDOS 0x1 /* -** If we are to be thread-safe, include the pthreads header and define -** the SQLITE_UNIX_THREADS macro. +** If we are to be thread-safe, include the pthreads header. */ #if SQLITE_THREADSAFE # include -# define SQLITE_UNIX_THREADS 1 #endif /* @@ -1119,8 +1117,7 @@ struct unixFileId { /* ** An instance of the following structure is allocated for each open -** inode. Or, on LinuxThreads, there is one of these structures for -** each inode opened by each thread. +** inode. ** ** A single inode can have multiple file descriptors, so each unixFile ** structure contains a pointer to an instance of this object and this @@ -1166,13 +1163,16 @@ struct unixInodeInfo { /* ** A lists of all unixInodeInfo objects. +** +** Must hold unixBigLock in order to read or write this variable. */ static unixInodeInfo *inodeList = 0; /* All unixInodeInfo objects */ #ifdef SQLITE_DEBUG /* -** True if the inode mutex is held, or not. Used only within assert() -** to help verify correct mutex usage. +** True if the inode mutex (on the unixFile.pFileMutex field) is held, or not. +** This routine is used only within assert() to help verify correct mutex +** usage. */ int unixFileMutexHeld(unixFile *pFile){ assert( pFile->pInode ); @@ -1300,8 +1300,8 @@ static void closePendingFds(unixFile *pFile){ /* ** Release a unixInodeInfo structure previously allocated by findInodeInfo(). ** -** The mutex entered using the unixEnterMutex() function must be held -** when this function is called. +** The global mutex must be held when this routine is called, but the mutex +** on the inode being deleted must NOT be held. */ static void releaseInodeInfo(unixFile *pFile){ unixInodeInfo *pInode = pFile->pInode; @@ -1336,8 +1336,7 @@ static void releaseInodeInfo(unixFile *pFile){ ** describes that file descriptor. Create a new one if necessary. The ** return value might be uninitialized if an error occurs. ** -** The mutex entered using the unixEnterMutex() function must be held -** when this function is called. +** The global mutex must held when calling this routine. ** ** Return an appropriate error code. */ @@ -1398,6 +1397,7 @@ static int findInodeInfo( #else fileId.ino = (u64)statbuf.st_ino; #endif + assert( unixMutexHeld() ); pInode = inodeList; while( pInode && memcmp(&fileId, &pInode->fileId, sizeof(fileId)) ){ pInode = pInode->pNext; @@ -1417,6 +1417,7 @@ static int findInodeInfo( } } pInode->nRef = 1; + assert( unixMutexHeld() ); pInode->pNext = inodeList; pInode->pPrev = 0; if( inodeList ) inodeList->pPrev = pInode; @@ -4214,18 +4215,18 @@ static int unixGetpagesize(void){ ** ** The following fields are read-only after the object is created: ** -** fid +** hShm ** zFilename ** -** Either unixShmNode.mutex must be held or unixShmNode.nRef==0 and +** Either unixShmNode.pShmMutex must be held or unixShmNode.nRef==0 and ** unixMutexHeld() is true when reading or writing any other field ** in this structure. */ struct unixShmNode { unixInodeInfo *pInode; /* unixInodeInfo that owns this SHM node */ - sqlite3_mutex *mutex; /* Mutex to access this object */ + sqlite3_mutex *pShmMutex; /* Mutex to access this object */ char *zFilename; /* Name of the mmapped file */ - int h; /* Open file descriptor */ + int hShm; /* Open file descriptor */ int szRegion; /* Size of shared-memory regions */ u16 nRegion; /* Size of array apRegion */ u8 isReadonly; /* True if read-only */ @@ -4247,16 +4248,16 @@ struct unixShmNode { ** The following fields are initialized when this object is created and ** are read-only thereafter: ** -** unixShm.pFile +** unixShm.pShmNode ** unixShm.id ** -** All other fields are read/write. The unixShm.pFile->mutex must be held -** while accessing any read/write fields. +** All other fields are read/write. The unixShm.pShmNode->pShmMutex must +** be held while accessing any read/write fields. */ struct unixShm { unixShmNode *pShmNode; /* The underlying unixShmNode object */ unixShm *pNext; /* Next unixShm with the same unixShmNode */ - u8 hasMutex; /* True if holding the unixShmNode mutex */ + u8 hasMutex; /* True if holding the unixShmNode->pShmMutex */ u8 id; /* Id of this connection within its unixShmNode */ u16 sharedMask; /* Mask of shared locks held */ u16 exclMask; /* Mask of exclusive locks held */ @@ -4286,7 +4287,8 @@ static int unixShmSystemLock( /* Access to the unixShmNode object is serialized by the caller */ pShmNode = pFile->pInode->pShmNode; - assert( pShmNode->nRef==0 || sqlite3_mutex_held(pShmNode->mutex) ); + assert( pShmNode->nRef==0 || sqlite3_mutex_held(pShmNode->pShmMutex) ); + assert( pShmNode->nRef>0 || unixMutexHeld() ); /* Shared locks never span more than one byte */ assert( n==1 || lockType!=F_RDLCK ); @@ -4294,13 +4296,13 @@ static int unixShmSystemLock( /* Locks are within range */ assert( n>=1 && n<=SQLITE_SHM_NLOCK ); - if( pShmNode->h>=0 ){ + if( pShmNode->hShm>=0 ){ /* Initialize the locking parameters */ f.l_type = lockType; f.l_whence = SEEK_SET; f.l_start = ofst; f.l_len = n; - rc = osSetPosixAdvisoryLock(pShmNode->h, &f, pFile); + rc = osSetPosixAdvisoryLock(pShmNode->hShm, &f, pFile); rc = (rc!=(-1)) ? SQLITE_OK : SQLITE_BUSY; } @@ -4372,18 +4374,18 @@ static void unixShmPurge(unixFile *pFd){ int nShmPerMap = unixShmRegionPerMap(); int i; assert( p->pInode==pFd->pInode ); - sqlite3_mutex_free(p->mutex); + sqlite3_mutex_free(p->pShmMutex); for(i=0; inRegion; i+=nShmPerMap){ - if( p->h>=0 ){ + if( p->hShm>=0 ){ osMunmap(p->apRegion[i], p->szRegion); }else{ sqlite3_free(p->apRegion[i]); } } sqlite3_free(p->apRegion); - if( p->h>=0 ){ - robust_close(pFd, p->h, __LINE__); - p->h = -1; + if( p->hShm>=0 ){ + robust_close(pFd, p->hShm, __LINE__); + p->hShm = -1; } p->pInode->pShmNode = 0; sqlite3_free(p); @@ -4425,7 +4427,7 @@ static int unixLockSharedMemory(unixFile *pDbFd, unixShmNode *pShmNode){ lock.l_start = UNIX_SHM_DMS; lock.l_len = 1; lock.l_type = F_WRLCK; - if( osFcntl(pShmNode->h, F_GETLK, &lock)!=0 ) { + if( osFcntl(pShmNode->hShm, F_GETLK, &lock)!=0 ) { rc = SQLITE_IOERR_LOCK; }else if( lock.l_type==F_UNLCK ){ if( pShmNode->isReadonly ){ @@ -4433,7 +4435,12 @@ static int unixLockSharedMemory(unixFile *pDbFd, unixShmNode *pShmNode){ rc = SQLITE_READONLY_CANTINIT; }else{ rc = unixShmSystemLock(pDbFd, F_WRLCK, UNIX_SHM_DMS, 1); - if( rc==SQLITE_OK && robust_ftruncate(pShmNode->h, 0) ){ + /* The first connection to attach must truncate the -shm file. We + ** truncate to 3 bytes (an arbitrary small number, less than the + ** -shm header size) rather than 0 as a system debugging aid, to + ** help detect if a -shm file truncation is legitimate or is the work + ** or a rogue process. */ + if( rc==SQLITE_OK && robust_ftruncate(pShmNode->hShm, 3) ){ rc = unixLogError(SQLITE_IOERR_SHMOPEN,"ftruncate",pShmNode->zFilename); } } @@ -4539,12 +4546,12 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ sqlite3_snprintf(nShmFilename, zShm, "%s-shm", zBasePath); sqlite3FileSuffix3(pDbFd->zPath, zShm); #endif - pShmNode->h = -1; + pShmNode->hShm = -1; pDbFd->pInode->pShmNode = pShmNode; pShmNode->pInode = pDbFd->pInode; if( sqlite3GlobalConfig.bCoreMutex ){ - pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); - if( pShmNode->mutex==0 ){ + pShmNode->pShmMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); + if( pShmNode->pShmMutex==0 ){ rc = SQLITE_NOMEM_BKPT; goto shm_open_err; } @@ -4552,11 +4559,11 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ if( pInode->bProcessLock==0 ){ if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){ - pShmNode->h = robust_open(zShm, O_RDWR|O_CREAT, (sStat.st_mode&0777)); + pShmNode->hShm = robust_open(zShm, O_RDWR|O_CREAT,(sStat.st_mode&0777)); } - if( pShmNode->h<0 ){ - pShmNode->h = robust_open(zShm, O_RDONLY, (sStat.st_mode&0777)); - if( pShmNode->h<0 ){ + if( pShmNode->hShm<0 ){ + pShmNode->hShm = robust_open(zShm, O_RDONLY, (sStat.st_mode&0777)); + if( pShmNode->hShm<0 ){ rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zShm); goto shm_open_err; } @@ -4567,7 +4574,7 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ ** is owned by the same user that owns the original database. Otherwise, ** the original owner will not be able to connect. */ - robustFchown(pShmNode->h, sStat.st_uid, sStat.st_gid); + robustFchown(pShmNode->hShm, sStat.st_uid, sStat.st_gid); rc = unixLockSharedMemory(pDbFd, pShmNode); if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err; @@ -4587,13 +4594,13 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ ** the cover of the unixEnterMutex() mutex and the pointer from the ** new (struct unixShm) object to the pShmNode has been set. All that is ** left to do is to link the new object into the linked list starting - ** at pShmNode->pFirst. This must be done while holding the pShmNode->mutex - ** mutex. + ** at pShmNode->pFirst. This must be done while holding the + ** pShmNode->pShmMutex. */ - sqlite3_mutex_enter(pShmNode->mutex); + sqlite3_mutex_enter(pShmNode->pShmMutex); p->pNext = pShmNode->pFirst; pShmNode->pFirst = p; - sqlite3_mutex_leave(pShmNode->mutex); + sqlite3_mutex_leave(pShmNode->pShmMutex); return rc; /* Jump here on any error */ @@ -4645,7 +4652,7 @@ static int unixShmMap( p = pDbFd->pShm; pShmNode = p->pShmNode; - sqlite3_mutex_enter(pShmNode->mutex); + sqlite3_mutex_enter(pShmNode->pShmMutex); if( pShmNode->isUnlocked ){ rc = unixLockSharedMemory(pDbFd, pShmNode); if( rc!=SQLITE_OK ) goto shmpage_out; @@ -4653,8 +4660,8 @@ static int unixShmMap( } assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 ); assert( pShmNode->pInode==pDbFd->pInode ); - assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 ); - assert( pShmNode->h<0 || pDbFd->pInode->bProcessLock==0 ); + assert( pShmNode->hShm>=0 || pDbFd->pInode->bProcessLock==1 ); + assert( pShmNode->hShm<0 || pDbFd->pInode->bProcessLock==0 ); /* Minimum number of regions required to be mapped. */ nReqRegion = ((iRegion+nShmPerMap) / nShmPerMap) * nShmPerMap; @@ -4666,12 +4673,12 @@ static int unixShmMap( pShmNode->szRegion = szRegion; - if( pShmNode->h>=0 ){ + if( pShmNode->hShm>=0 ){ /* The requested region is not mapped into this processes address space. ** Check to see if it has been allocated (i.e. if the wal-index file is ** large enough to contain the requested region). */ - if( osFstat(pShmNode->h, &sStat) ){ + if( osFstat(pShmNode->hShm, &sStat) ){ rc = SQLITE_IOERR_SHMSIZE; goto shmpage_out; } @@ -4699,7 +4706,7 @@ static int unixShmMap( assert( (nByte % pgsz)==0 ); for(iPg=(sStat.st_size/pgsz); iPg<(nByte/pgsz); iPg++){ int x = 0; - if( seekAndWriteFd(pShmNode->h, iPg*pgsz + pgsz-1, "", 1, &x)!=1 ){ + if( seekAndWriteFd(pShmNode->hShm, iPg*pgsz + pgsz-1,"",1,&x)!=1 ){ const char *zFile = pShmNode->zFilename; rc = unixLogError(SQLITE_IOERR_SHMSIZE, "write", zFile); goto shmpage_out; @@ -4722,22 +4729,22 @@ static int unixShmMap( int nMap = szRegion*nShmPerMap; int i; void *pMem; - if( pShmNode->h>=0 ){ + if( pShmNode->hShm>=0 ){ pMem = osMmap(0, nMap, pShmNode->isReadonly ? PROT_READ : PROT_READ|PROT_WRITE, - MAP_SHARED, pShmNode->h, szRegion*(i64)pShmNode->nRegion + MAP_SHARED, pShmNode->hShm, szRegion*(i64)pShmNode->nRegion ); if( pMem==MAP_FAILED ){ rc = unixLogError(SQLITE_IOERR_SHMMAP, "mmap", pShmNode->zFilename); goto shmpage_out; } }else{ - pMem = sqlite3_malloc64(szRegion); + pMem = sqlite3_malloc64(nMap); if( pMem==0 ){ rc = SQLITE_NOMEM_BKPT; goto shmpage_out; } - memset(pMem, 0, szRegion); + memset(pMem, 0, nMap); } for(i=0; iisReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY; - sqlite3_mutex_leave(pShmNode->mutex); + sqlite3_mutex_leave(pShmNode->pShmMutex); return rc; } @@ -4788,12 +4795,12 @@ static int unixShmLock( || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED) || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) ); assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 ); - assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 ); - assert( pShmNode->h<0 || pDbFd->pInode->bProcessLock==0 ); + assert( pShmNode->hShm>=0 || pDbFd->pInode->bProcessLock==1 ); + assert( pShmNode->hShm<0 || pDbFd->pInode->bProcessLock==0 ); mask = (1<<(ofst+n)) - (1<1 || mask==(1<mutex); + sqlite3_mutex_enter(pShmNode->pShmMutex); if( flags & SQLITE_SHM_UNLOCK ){ u16 allMask = 0; /* Mask of locks held by siblings */ @@ -4866,7 +4873,7 @@ static int unixShmLock( } } } - sqlite3_mutex_leave(pShmNode->mutex); + sqlite3_mutex_leave(pShmNode->pShmMutex); OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x\n", p->id, osGetpid(0), p->sharedMask, p->exclMask)); return rc; @@ -4916,14 +4923,14 @@ static int unixShmUnmap( /* Remove connection p from the set of connections associated ** with pShmNode */ - sqlite3_mutex_enter(pShmNode->mutex); + sqlite3_mutex_enter(pShmNode->pShmMutex); for(pp=&pShmNode->pFirst; (*pp)!=p; pp = &(*pp)->pNext){} *pp = p->pNext; /* Free the connection p */ sqlite3_free(p); pDbFd->pShm = 0; - sqlite3_mutex_leave(pShmNode->mutex); + sqlite3_mutex_leave(pShmNode->pShmMutex); /* If pShmNode->nRef has reached 0, then close the underlying ** shared-memory file, too */ @@ -4932,7 +4939,7 @@ static int unixShmUnmap( assert( pShmNode->nRef>0 ); pShmNode->nRef--; if( pShmNode->nRef==0 ){ - if( deleteFlag && pShmNode->h>=0 ){ + if( deleteFlag && pShmNode->hShm>=0 ){ osUnlink(pShmNode->zFilename); } unixShmPurge(pDbFd); diff --git a/src/os_win.c b/src/os_win.c index 2a4b613..aafc89f 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -284,8 +284,7 @@ struct winFile { int nFetchOut; /* Number of outstanding xFetch references */ HANDLE hMap; /* Handle for accessing memory mapping */ void *pMapRegion; /* Area memory mapped */ - sqlite3_int64 mmapSize; /* Usable size of mapped region */ - sqlite3_int64 mmapSizeActual; /* Actual size of mapped region */ + sqlite3_int64 mmapSize; /* Size of mapped region */ sqlite3_int64 mmapSizeMax; /* Configured FCNTL_MMAP_SIZE value */ #endif }; @@ -2906,6 +2905,26 @@ static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){ DWORD lastErrno; #if SQLITE_MAX_MMAP_SIZE>0 sqlite3_int64 oldMmapSize; + if( pFile->nFetchOut>0 ){ + /* File truncation is a no-op if there are outstanding memory mapped + ** pages. This is because truncating the file means temporarily unmapping + ** the file, and that might delete memory out from under existing cursors. + ** + ** This can result in incremental vacuum not truncating the file, + ** if there is an active read cursor when the incremental vacuum occurs. + ** No real harm comes of this - the database file is not corrupted, + ** though some folks might complain that the file is bigger than it + ** needs to be. + ** + ** The only feasible work-around is to defer the truncation until after + ** all references to memory-mapped content are closed. That is doable, + ** but involves adding a few branches in the common write code path which + ** could slow down normal operations slightly. Hence, we have decided for + ** now to simply make trancations a no-op if there are pending reads. We + ** can maybe revisit this decision in the future. + */ + return SQLITE_OK; + } #endif assert( pFile ); @@ -4334,9 +4353,9 @@ shmpage_out: static int winUnmapfile(winFile *pFile){ assert( pFile!=0 ); OSTRACE(("UNMAP-FILE pid=%lu, pFile=%p, hMap=%p, pMapRegion=%p, " - "mmapSize=%lld, mmapSizeActual=%lld, mmapSizeMax=%lld\n", + "mmapSize=%lld, mmapSizeMax=%lld\n", osGetCurrentProcessId(), pFile, pFile->hMap, pFile->pMapRegion, - pFile->mmapSize, pFile->mmapSizeActual, pFile->mmapSizeMax)); + pFile->mmapSize, pFile->mmapSizeMax)); if( pFile->pMapRegion ){ if( !osUnmapViewOfFile(pFile->pMapRegion) ){ pFile->lastErrno = osGetLastError(); @@ -4348,7 +4367,6 @@ static int winUnmapfile(winFile *pFile){ } pFile->pMapRegion = 0; pFile->mmapSize = 0; - pFile->mmapSizeActual = 0; } if( pFile->hMap!=NULL ){ if( !osCloseHandle(pFile->hMap) ){ @@ -4459,7 +4477,6 @@ static int winMapfile(winFile *pFd, sqlite3_int64 nByte){ } pFd->pMapRegion = pNew; pFd->mmapSize = nMap; - pFd->mmapSizeActual = nMap; } OSTRACE(("MAP-FILE pid=%lu, pFile=%p, rc=SQLITE_OK\n", @@ -5261,7 +5278,6 @@ static int winOpen( pFile->hMap = NULL; pFile->pMapRegion = 0; pFile->mmapSize = 0; - pFile->mmapSizeActual = 0; pFile->mmapSizeMax = sqlite3GlobalConfig.szMmap; #endif diff --git a/src/pager.c b/src/pager.c index 92d32fd..e252a4b 100644 --- a/src/pager.c +++ b/src/pager.c @@ -825,19 +825,30 @@ static const unsigned char aJournalMagic[] = { */ #define isOpen(pFd) ((pFd)->pMethods!=0) +#ifdef SQLITE_DIRECT_OVERFLOW_READ /* -** Return true if this pager uses a write-ahead log to read page pgno. -** Return false if the pager reads pgno directly from the database. +** Return true if page pgno can be read directly from the database file +** by the b-tree layer. This is the case if: +** +** * the database file is open, +** * there are no dirty pages in the cache, and +** * the desired page is not currently in the wal file. */ -#if !defined(SQLITE_OMIT_WAL) && defined(SQLITE_DIRECT_OVERFLOW_READ) -int sqlite3PagerUseWal(Pager *pPager, Pgno pgno){ - u32 iRead = 0; - int rc; - if( pPager->pWal==0 ) return 0; - rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iRead); - return rc || iRead; +int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ + if( pPager->fd->pMethods==0 ) return 0; + if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; +#ifndef SQLITE_OMIT_WAL + if( pPager->pWal ){ + u32 iRead = 0; + int rc; + rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iRead); + return (rc==SQLITE_OK && iRead==0); + } +#endif + return 1; } #endif + #ifndef SQLITE_OMIT_WAL # define pagerUseWal(x) ((x)->pWal!=0) #else @@ -7021,7 +7032,11 @@ void sqlite3PagerSetCodec( void (*xCodecFree)(void*), void *pCodec ){ - if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec); + if( pPager->xCodecFree ){ + pPager->xCodecFree(pPager->pCodec); + }else{ + pager_reset(pPager); + } pPager->xCodec = pPager->memDb ? 0 : xCodec; pPager->xCodecSizeChng = xCodecSizeChng; pPager->xCodecFree = xCodecFree; diff --git a/src/pager.h b/src/pager.h index 5b07a22..de96dc5 100644 --- a/src/pager.h +++ b/src/pager.h @@ -179,9 +179,6 @@ int sqlite3PagerSharedLock(Pager *pPager); int sqlite3PagerWalCallback(Pager *pPager); int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen); int sqlite3PagerCloseWal(Pager *pPager, sqlite3*); -# ifdef SQLITE_DIRECT_OVERFLOW_READ - int sqlite3PagerUseWal(Pager *pPager, Pgno); -# endif # ifdef SQLITE_ENABLE_SNAPSHOT int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppSnapshot); int sqlite3PagerSnapshotOpen(Pager *pPager, sqlite3_snapshot *pSnapshot); @@ -189,8 +186,10 @@ int sqlite3PagerSharedLock(Pager *pPager); int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pSnapshot); void sqlite3PagerSnapshotUnlock(Pager *pPager); # endif -#else -# define sqlite3PagerUseWal(x,y) 0 +#endif + +#ifdef SQLITE_DIRECT_OVERFLOW_READ + int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno); #endif #ifdef SQLITE_ENABLE_ZIPVFS diff --git a/src/parse.y b/src/parse.y index f2cb072..b150c73 100644 --- a/src/parse.y +++ b/src/parse.y @@ -941,13 +941,10 @@ idlist(A) ::= nm(Y). p->pLeft = p->pRight = 0; p->x.pList = 0; p->pAggInfo = 0; - p->pTab = 0; + p->y.pTab = 0; p->op2 = 0; p->iTable = 0; p->iColumn = 0; -#ifndef SQLITE_OMIT_WINDOWFUNC - p->pWin = 0; -#endif p->u.zToken = (char*)&p[1]; memcpy(p->u.zToken, t.z, t.n); p->u.zToken[t.n] = 0; diff --git a/src/pcache.c b/src/pcache.c index 41fb031..8311049 100644 --- a/src/pcache.c +++ b/src/pcache.c @@ -32,7 +32,7 @@ ** The PCache.pSynced variable is used to optimize searching for a dirty ** page to eject from the cache mid-transaction. It is better to eject ** a page that does not require a journal sync than one that does. -** Therefore, pSynced is maintained to that it *almost* always points +** Therefore, pSynced is maintained so that it *almost* always points ** to either the oldest page in the pDirty/pDirtyTail list that has a ** clear PGHDR_NEED_SYNC flag or to a page that is older than this one ** (so that the right page to eject can be found by following pDirtyPrev @@ -856,6 +856,15 @@ int sqlite3PCachePercentDirty(PCache *pCache){ return nCache ? (int)(((i64)nDirty * 100) / nCache) : 0; } +#ifdef SQLITE_DIRECT_OVERFLOW_READ +/* +** Return true if there are one or more dirty pages in the cache. Else false. +*/ +int sqlite3PCacheIsDirty(PCache *pCache){ + return (pCache->pDirty!=0); +} +#endif + #if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG) /* ** For all dirty pages currently in the cache, invoke the specified diff --git a/src/pcache.h b/src/pcache.h index bbc2cb4..eb55396 100644 --- a/src/pcache.h +++ b/src/pcache.h @@ -183,4 +183,8 @@ int sqlite3HeaderSizePcache1(void); /* Number of dirty pages as a percentage of the configured cache size */ int sqlite3PCachePercentDirty(PCache*); +#ifdef SQLITE_DIRECT_OVERFLOW_READ +int sqlite3PCacheIsDirty(PCache *pCache); +#endif + #endif /* _PCACHE_H_ */ diff --git a/src/pcache1.c b/src/pcache1.c index fc3cbc5..2880c2c 100644 --- a/src/pcache1.c +++ b/src/pcache1.c @@ -105,7 +105,8 @@ struct PgHdr1 { }; /* -** A page is pinned if it is no on the LRU list +** A page is pinned if it is not on the LRU list. To be "pinned" means +** that the page is in active use and must not be deallocated. */ #define PAGE_IS_PINNED(p) ((p)->pLruNext==0) #define PAGE_IS_UNPINNED(p) ((p)->pLruNext!=0) diff --git a/src/pragma.c b/src/pragma.c index 9381724..ada652c 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1037,7 +1037,7 @@ void sqlite3Pragma( setPragmaResultColumnNames(v, pPragma); returnSingleInt(v, (db->flags & pPragma->iArg)!=0 ); }else{ - int mask = pPragma->iArg; /* Mask of bits to set or clear. */ + u64 mask = pPragma->iArg; /* Mask of bits to set or clear. */ if( db->autoCommit==0 ){ /* Foreign key support may not be enabled or disabled while not ** in auto-commit mode. */ @@ -1086,15 +1086,17 @@ void sqlite3Pragma( Table *pTab; pTab = sqlite3LocateTable(pParse, LOCATE_NOERR, zRight, zDb); if( pTab ){ + int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); int i, k; int nHidden = 0; Column *pCol; Index *pPk = sqlite3PrimaryKeyIndex(pTab); - pParse->nMem = 6; - sqlite3CodeVerifySchema(pParse, iDb); + pParse->nMem = 7; + sqlite3CodeVerifySchema(pParse, iTabDb); sqlite3ViewGetColumnNames(pParse, pTab); for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ - if( IsHiddenColumn(pCol) ){ + int isHidden = IsHiddenColumn(pCol); + if( isHidden && pPragma->iArg==0 ){ nHidden++; continue; } @@ -1106,13 +1108,14 @@ void sqlite3Pragma( for(k=1; k<=pTab->nCol && pPk->aiColumn[k-1]!=i; k++){} } assert( pCol->pDflt==0 || pCol->pDflt->op==TK_SPAN ); - sqlite3VdbeMultiLoad(v, 1, "issisi", + sqlite3VdbeMultiLoad(v, 1, pPragma->iArg ? "issisii" : "issisi", i-nHidden, pCol->zName, sqlite3ColumnType(pCol,""), pCol->notNull ? 1 : 0, pCol->pDflt ? pCol->pDflt->u.zToken : 0, - k); + k, + isHidden); } } } @@ -1150,6 +1153,7 @@ void sqlite3Pragma( Table *pTab; pIdx = sqlite3FindIndex(db, zRight, zDb); if( pIdx ){ + int iIdxDb = sqlite3SchemaToIndex(db, pIdx->pSchema); int i; int mx; if( pPragma->iArg ){ @@ -1162,7 +1166,7 @@ void sqlite3Pragma( pParse->nMem = 3; } pTab = pIdx->pTable; - sqlite3CodeVerifySchema(pParse, iDb); + sqlite3CodeVerifySchema(pParse, iIdxDb); assert( pParse->nMem<=pPragma->nPragCName ); for(i=0; iaiColumn[i]; @@ -1186,8 +1190,9 @@ void sqlite3Pragma( int i; pTab = sqlite3FindTable(db, zRight, zDb); if( pTab ){ + int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); pParse->nMem = 5; - sqlite3CodeVerifySchema(pParse, iDb); + sqlite3CodeVerifySchema(pParse, iTabDb); for(pIdx=pTab->pIndex, i=0; pIdx; pIdx=pIdx->pNext, i++){ const char *azOrigin[] = { "c", "u", "pk" }; sqlite3VdbeMultiLoad(v, 1, "isisi", @@ -1234,6 +1239,7 @@ void sqlite3Pragma( pParse->nMem = 2; for(i=0; iu.pHash ){ + if( p->funcFlags & SQLITE_FUNC_INTERNAL ) continue; sqlite3VdbeMultiLoad(v, 1, "si", p->zName, 1); } } @@ -1275,9 +1281,10 @@ void sqlite3Pragma( if( pTab ){ pFK = pTab->pFKey; if( pFK ){ + int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); int i = 0; pParse->nMem = 8; - sqlite3CodeVerifySchema(pParse, iDb); + sqlite3CodeVerifySchema(pParse, iTabDb); while(pFK){ int j; for(j=0; jnCol; j++){ @@ -1322,9 +1329,9 @@ void sqlite3Pragma( pParse->nMem += 4; regKey = ++pParse->nMem; regRow = ++pParse->nMem; - sqlite3CodeVerifySchema(pParse, iDb); k = sqliteHashFirst(&db->aDb[iDb].pSchema->tblHash); while( k ){ + int iTabDb; if( zRight ){ pTab = sqlite3LocateTable(pParse, 0, zRight, zDb); k = 0; @@ -1333,21 +1340,23 @@ void sqlite3Pragma( k = sqliteHashNext(k); } if( pTab==0 || pTab->pFKey==0 ) continue; - sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); + iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); + sqlite3CodeVerifySchema(pParse, iTabDb); + sqlite3TableLock(pParse, iTabDb, pTab->tnum, 0, pTab->zName); if( pTab->nCol+regRow>pParse->nMem ) pParse->nMem = pTab->nCol + regRow; - sqlite3OpenTable(pParse, 0, iDb, pTab, OP_OpenRead); + sqlite3OpenTable(pParse, 0, iTabDb, pTab, OP_OpenRead); sqlite3VdbeLoadString(v, regResult, pTab->zName); for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){ pParent = sqlite3FindTable(db, pFK->zTo, zDb); if( pParent==0 ) continue; pIdx = 0; - sqlite3TableLock(pParse, iDb, pParent->tnum, 0, pParent->zName); + sqlite3TableLock(pParse, iTabDb, pParent->tnum, 0, pParent->zName); x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, 0); if( x==0 ){ if( pIdx==0 ){ - sqlite3OpenTable(pParse, i, iDb, pParent, OP_OpenRead); + sqlite3OpenTable(pParse, i, iTabDb, pParent, OP_OpenRead); }else{ - sqlite3VdbeAddOp3(v, OP_OpenRead, i, pIdx->tnum, iDb); + sqlite3VdbeAddOp3(v, OP_OpenRead, i, pIdx->tnum, iTabDb); sqlite3VdbeSetP4KeyInfo(pParse, pIdx); } }else{ @@ -2116,12 +2125,24 @@ void sqlite3Pragma( #endif #ifdef SQLITE_HAS_CODEC + /* Pragma iArg + ** ---------- ------ + ** key 0 + ** rekey 1 + ** hexkey 2 + ** hexrekey 3 + ** textkey 4 + ** textrekey 5 + */ case PragTyp_KEY: { - if( zRight ) sqlite3_key_v2(db, zDb, zRight, sqlite3Strlen30(zRight)); - break; - } - case PragTyp_REKEY: { - if( zRight ) sqlite3_rekey_v2(db, zDb, zRight, sqlite3Strlen30(zRight)); + if( zRight ){ + int n = pPragma->iArg<4 ? sqlite3Strlen30(zRight) : -1; + if( (pPragma->iArg & 1)==0 ){ + sqlite3_key_v2(db, zDb, zRight, n); + }else{ + sqlite3_rekey_v2(db, zDb, zRight, n); + } + } break; } case PragTyp_HEXKEY: { @@ -2133,7 +2154,7 @@ void sqlite3Pragma( iByte = (iByte<<4) + sqlite3HexToInt(zRight[i]); if( (i&1)!=0 ) zKey[i/2] = iByte; } - if( (zLeft[3] & 0xf)==0xb ){ + if( (pPragma->iArg & 1)==0 ){ sqlite3_key_v2(db, zDb, zKey, i/2); }else{ sqlite3_rekey_v2(db, zDb, zKey, i/2); @@ -2463,7 +2484,8 @@ static const sqlite3_module pragmaVtabModule = { 0, /* xRename - rename the table */ 0, /* xSavepoint */ 0, /* xRelease */ - 0 /* xRollbackTo */ + 0, /* xRollbackTo */ + 0 /* xShadowName */ }; /* diff --git a/src/pragma.h b/src/pragma.h index 55d9a8c..b1d4155 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -48,10 +48,9 @@ #define PragTyp_ACTIVATE_EXTENSIONS 40 #define PragTyp_HEXKEY 41 #define PragTyp_KEY 42 -#define PragTyp_REKEY 43 -#define PragTyp_LOCK_STATUS 44 -#define PragTyp_PARSER_TRACE 45 -#define PragTyp_STATS 46 +#define PragTyp_LOCK_STATUS 43 +#define PragTyp_PARSER_TRACE 44 +#define PragTyp_STATS 45 /* Property flags associated with various pragma. */ #define PragFlg_NeedSchema 0x01 /* Force schema load before running */ @@ -68,58 +67,57 @@ ** result column is different from the name of the pragma */ static const char *const pragCName[] = { - /* 0 */ "cache_size", /* Used by: default_cache_size */ - /* 1 */ "cid", /* Used by: table_info */ - /* 2 */ "name", - /* 3 */ "type", - /* 4 */ "notnull", - /* 5 */ "dflt_value", - /* 6 */ "pk", - /* 7 */ "tbl", /* Used by: stats */ - /* 8 */ "idx", - /* 9 */ "wdth", - /* 10 */ "hght", - /* 11 */ "flgs", - /* 12 */ "seqno", /* Used by: index_info */ - /* 13 */ "cid", - /* 14 */ "name", + /* 0 */ "id", /* Used by: foreign_key_list */ + /* 1 */ "seq", + /* 2 */ "table", + /* 3 */ "from", + /* 4 */ "to", + /* 5 */ "on_update", + /* 6 */ "on_delete", + /* 7 */ "match", + /* 8 */ "cid", /* Used by: table_xinfo */ + /* 9 */ "name", + /* 10 */ "type", + /* 11 */ "notnull", + /* 12 */ "dflt_value", + /* 13 */ "pk", + /* 14 */ "hidden", + /* table_info reuses 8 */ /* 15 */ "seqno", /* Used by: index_xinfo */ /* 16 */ "cid", /* 17 */ "name", /* 18 */ "desc", /* 19 */ "coll", /* 20 */ "key", - /* 21 */ "seq", /* Used by: index_list */ - /* 22 */ "name", - /* 23 */ "unique", - /* 24 */ "origin", - /* 25 */ "partial", - /* 26 */ "seq", /* Used by: database_list */ + /* 21 */ "tbl", /* Used by: stats */ + /* 22 */ "idx", + /* 23 */ "wdth", + /* 24 */ "hght", + /* 25 */ "flgs", + /* 26 */ "seq", /* Used by: index_list */ /* 27 */ "name", - /* 28 */ "file", - /* 29 */ "name", /* Used by: function_list */ - /* 30 */ "builtin", - /* 31 */ "name", /* Used by: module_list pragma_list */ - /* 32 */ "seq", /* Used by: collation_list */ - /* 33 */ "name", - /* 34 */ "id", /* Used by: foreign_key_list */ - /* 35 */ "seq", - /* 36 */ "table", - /* 37 */ "from", - /* 38 */ "to", - /* 39 */ "on_update", - /* 40 */ "on_delete", - /* 41 */ "match", - /* 42 */ "table", /* Used by: foreign_key_check */ - /* 43 */ "rowid", - /* 44 */ "parent", - /* 45 */ "fkid", - /* 46 */ "busy", /* Used by: wal_checkpoint */ - /* 47 */ "log", - /* 48 */ "checkpointed", - /* 49 */ "timeout", /* Used by: busy_timeout */ - /* 50 */ "database", /* Used by: lock_status */ - /* 51 */ "status", + /* 28 */ "unique", + /* 29 */ "origin", + /* 30 */ "partial", + /* 31 */ "table", /* Used by: foreign_key_check */ + /* 32 */ "rowid", + /* 33 */ "parent", + /* 34 */ "fkid", + /* index_info reuses 15 */ + /* 35 */ "seq", /* Used by: database_list */ + /* 36 */ "name", + /* 37 */ "file", + /* 38 */ "busy", /* Used by: wal_checkpoint */ + /* 39 */ "log", + /* 40 */ "checkpointed", + /* 41 */ "name", /* Used by: function_list */ + /* 42 */ "builtin", + /* collation_list reuses 26 */ + /* 43 */ "database", /* Used by: lock_status */ + /* 44 */ "status", + /* 45 */ "cache_size", /* Used by: default_cache_size */ + /* module_list pragma_list reuses 9 */ + /* 46 */ "timeout", /* Used by: busy_timeout */ }; /* Definitions of all built-in pragmas */ @@ -129,7 +127,7 @@ typedef struct PragmaName { u8 mPragFlg; /* Zero or more PragFlg_XXX values */ u8 iPragCName; /* Start of column names in pragCName[] */ u8 nPragCName; /* Num of col names. 0 means use pragma name */ - u32 iArg; /* Extra argument */ + u64 iArg; /* Extra argument */ } PragmaName; static const PragmaName aPragmaName[] = { #if defined(SQLITE_HAS_CODEC) || defined(SQLITE_ENABLE_CEROD) @@ -165,7 +163,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "busy_timeout", /* ePragTyp: */ PragTyp_BUSY_TIMEOUT, /* ePragFlg: */ PragFlg_Result0, - /* ColNames: */ 49, 1, + /* ColNames: */ 46, 1, /* iArg: */ 0 }, #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) {/* zName: */ "cache_size", @@ -202,7 +200,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "collation_list", /* ePragTyp: */ PragTyp_COLLATION_LIST, /* ePragFlg: */ PragFlg_Result0, - /* ColNames: */ 32, 2, + /* ColNames: */ 26, 2, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS) @@ -237,14 +235,14 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "database_list", /* ePragTyp: */ PragTyp_DATABASE_LIST, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0, - /* ColNames: */ 26, 3, + /* ColNames: */ 35, 3, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) {/* zName: */ "default_cache_size", /* ePragTyp: */ PragTyp_DEFAULT_CACHE_SIZE, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, - /* ColNames: */ 0, 1, + /* ColNames: */ 45, 1, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) @@ -274,14 +272,14 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "foreign_key_check", /* ePragTyp: */ PragTyp_FOREIGN_KEY_CHECK, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0, - /* ColNames: */ 42, 4, + /* ColNames: */ 31, 4, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FOREIGN_KEY) {/* zName: */ "foreign_key_list", /* ePragTyp: */ PragTyp_FOREIGN_KEY_LIST, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, - /* ColNames: */ 34, 8, + /* ColNames: */ 0, 8, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) @@ -317,7 +315,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "function_list", /* ePragTyp: */ PragTyp_FUNCTION_LIST, /* ePragFlg: */ PragFlg_Result0, - /* ColNames: */ 29, 2, + /* ColNames: */ 41, 2, /* iArg: */ 0 }, #endif #endif @@ -326,12 +324,12 @@ static const PragmaName aPragmaName[] = { /* ePragTyp: */ PragTyp_HEXKEY, /* ePragFlg: */ 0, /* ColNames: */ 0, 0, - /* iArg: */ 0 }, + /* iArg: */ 2 }, {/* zName: */ "hexrekey", /* ePragTyp: */ PragTyp_HEXKEY, /* ePragFlg: */ 0, /* ColNames: */ 0, 0, - /* iArg: */ 0 }, + /* iArg: */ 3 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_CHECK) @@ -353,12 +351,12 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "index_info", /* ePragTyp: */ PragTyp_INDEX_INFO, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, - /* ColNames: */ 12, 3, + /* ColNames: */ 15, 3, /* iArg: */ 0 }, {/* zName: */ "index_list", /* ePragTyp: */ PragTyp_INDEX_LIST, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, - /* ColNames: */ 21, 5, + /* ColNames: */ 26, 5, /* iArg: */ 0 }, {/* zName: */ "index_xinfo", /* ePragTyp: */ PragTyp_INDEX_INFO, @@ -415,7 +413,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "lock_status", /* ePragTyp: */ PragTyp_LOCK_STATUS, /* ePragFlg: */ PragFlg_Result0, - /* ColNames: */ 50, 2, + /* ColNames: */ 43, 2, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) @@ -441,7 +439,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "module_list", /* ePragTyp: */ PragTyp_MODULE_LIST, /* ePragFlg: */ PragFlg_Result0, - /* ColNames: */ 31, 1, + /* ColNames: */ 9, 1, /* iArg: */ 0 }, #endif #endif @@ -474,7 +472,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "pragma_list", /* ePragTyp: */ PragTyp_PRAGMA_LIST, /* ePragFlg: */ PragFlg_Result0, - /* ColNames: */ 31, 1, + /* ColNames: */ 9, 1, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) @@ -505,10 +503,10 @@ static const PragmaName aPragmaName[] = { #endif #if defined(SQLITE_HAS_CODEC) {/* zName: */ "rekey", - /* ePragTyp: */ PragTyp_REKEY, + /* ePragTyp: */ PragTyp_KEY, /* ePragFlg: */ 0, /* ColNames: */ 0, 0, - /* iArg: */ 0 }, + /* iArg: */ 1 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) {/* zName: */ "reverse_unordered_selects", @@ -561,7 +559,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "stats", /* ePragTyp: */ PragTyp_STATS, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, - /* ColNames: */ 7, 5, + /* ColNames: */ 21, 5, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) @@ -575,8 +573,13 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "table_info", /* ePragTyp: */ PragTyp_TABLE_INFO, /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, - /* ColNames: */ 1, 6, + /* ColNames: */ 8, 6, /* iArg: */ 0 }, + {/* zName: */ "table_xinfo", + /* ePragTyp: */ PragTyp_TABLE_INFO, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 8, 7, + /* iArg: */ 1 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) {/* zName: */ "temp_store", @@ -589,6 +592,18 @@ static const PragmaName aPragmaName[] = { /* ePragFlg: */ PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ 0 }, +#endif +#if defined(SQLITE_HAS_CODEC) + {/* zName: */ "textkey", + /* ePragTyp: */ PragTyp_KEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 4 }, + {/* zName: */ "textrekey", + /* ePragTyp: */ PragTyp_KEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 5 }, #endif {/* zName: */ "threads", /* ePragTyp: */ PragTyp_THREADS, @@ -640,7 +655,7 @@ static const PragmaName aPragmaName[] = { {/* zName: */ "wal_checkpoint", /* ePragTyp: */ PragTyp_WAL_CHECKPOINT, /* ePragFlg: */ PragFlg_NeedSchema, - /* ColNames: */ 46, 3, + /* ColNames: */ 38, 3, /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) @@ -648,7 +663,7 @@ static const PragmaName aPragmaName[] = { /* ePragTyp: */ PragTyp_FLAG, /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, - /* iArg: */ SQLITE_WriteSchema }, + /* iArg: */ SQLITE_WriteSchema|SQLITE_NoSchemaError }, #endif }; -/* Number of pragmas: 61 on by default, 78 total. */ +/* Number of pragmas: 62 on by default, 81 total. */ diff --git a/src/prepare.c b/src/prepare.c index 602e4dc..4d33f0b 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -327,8 +327,8 @@ int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFlags){ rc = SQLITE_NOMEM_BKPT; sqlite3ResetAllSchemasOfConnection(db); } - if( rc==SQLITE_OK || (db->flags&SQLITE_WriteSchema)){ - /* Black magic: If the SQLITE_WriteSchema flag is set, then consider + if( rc==SQLITE_OK || (db->flags&SQLITE_NoSchemaError)){ + /* Black magic: If the SQLITE_NoSchemaError flag is set, then consider ** the schema loaded, even if errors occurred. In this situation the ** current sqlite3_prepare() operation will fail, but the following one ** will attempt to compile the supplied statement against whatever subset @@ -709,6 +709,294 @@ static int sqlite3LockAndPrepare( return rc; } +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Checks if the specified token is a table, column, or function name, +** based on the databases associated with the statement being prepared. +** If the function fails, zero is returned and pRc is filled with the +** error code. +*/ +static int shouldTreatAsIdentifier( + sqlite3 *db, /* Database handle. */ + const char *zToken, /* Pointer to start of token to be checked */ + int nToken, /* Length of token to be checked */ + int *pRc /* Pointer to error code upon failure */ +){ + int bFound = 0; /* Non-zero if token is an identifier name. */ + int i, j; /* Database and column loop indexes. */ + Schema *pSchema; /* Schema for current database. */ + Hash *pHash; /* Hash table of tables for current database. */ + HashElem *e; /* Hash element for hash table iteration. */ + Table *pTab; /* Database table for columns being checked. */ + + if( sqlite3IsRowidN(zToken, nToken) ){ + return 1; + } + if( nToken>0 ){ + int hash = SQLITE_FUNC_HASH(sqlite3UpperToLower[(u8)zToken[0]], nToken); + if( sqlite3FunctionSearchN(hash, zToken, nToken) ) return 1; + } + assert( db!=0 ); + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeEnterAll(db); + for(i=0; inDb; i++){ + pHash = &db->aFunc; + if( sqlite3HashFindN(pHash, zToken, nToken) ){ + bFound = 1; + break; + } + pSchema = db->aDb[i].pSchema; + if( pSchema==0 ) continue; + pHash = &pSchema->tblHash; + if( sqlite3HashFindN(pHash, zToken, nToken) ){ + bFound = 1; + break; + } + for(e=sqliteHashFirst(pHash); e; e=sqliteHashNext(e)){ + pTab = sqliteHashData(e); + if( pTab==0 ) continue; + pHash = pTab->pColHash; + if( pHash==0 ){ + pTab->pColHash = pHash = sqlite3_malloc(sizeof(Hash)); + if( pHash ){ + sqlite3HashInit(pHash); + for(j=0; jnCol; j++){ + Column *pCol = &pTab->aCol[j]; + sqlite3HashInsert(pHash, pCol->zName, pCol); + } + }else{ + *pRc = SQLITE_NOMEM_BKPT; + bFound = 0; + goto done; + } + } + if( pHash && sqlite3HashFindN(pHash, zToken, nToken) ){ + bFound = 1; + goto done; + } + } + } +done: + sqlite3BtreeLeaveAll(db); + sqlite3_mutex_leave(db->mutex); + return bFound; +} + +/* +** Attempt to estimate the final output buffer size needed for the fully +** normalized version of the specified SQL string. This should take into +** account any potential expansion that could occur (e.g. via IN clauses +** being expanded, etc). This size returned is the total number of bytes +** including the NUL terminator. +*/ +static int estimateNormalizedSize( + const char *zSql, /* The original SQL string */ + int nSql, /* Length of original SQL string */ + u8 prepFlags /* The flags passed to sqlite3_prepare_v3() */ +){ + int nOut = nSql + 4; + const char *z = zSql; + while( nOut0 ){ + zOut[j++] = '"'; + continue; + }else if( k==nToken-1 ){ + zOut[j++] = '"'; + continue; + } + } + if( bKeyword ){ + zOut[j++] = sqlite3Toupper(zSql[iIn+k]); + }else{ + zOut[j++] = sqlite3Tolower(zSql[iIn+k]); + } + } + *piOut = j; +} + +/* +** Perform normalization of the SQL contained in the prepared statement and +** store the result in the zNormSql field. The schema for the associated +** databases are consulted while performing the normalization in order to +** determine if a token appears to be an identifier. All identifiers are +** left intact in the normalized SQL and all literals are replaced with a +** single '?'. +*/ +void sqlite3Normalize( + Vdbe *pVdbe, /* VM being reprepared */ + const char *zSql, /* The original SQL string */ + int nSql, /* Size of the input string in bytes */ + u8 prepFlags /* The flags passed to sqlite3_prepare_v3() */ +){ + sqlite3 *db; /* Database handle. */ + char *z; /* The output string */ + int nZ; /* Size of the output string in bytes */ + int i; /* Next character to read from zSql[] */ + int j; /* Next character to fill in on z[] */ + int tokenType = 0; /* Type of the next token */ + int prevTokenType = 0; /* Type of the previous token, except spaces */ + int n; /* Size of the next token */ + int nParen = 0; /* Nesting level of parenthesis */ + Hash inHash; /* Table of parenthesis levels to output index. */ + + db = sqlite3VdbeDb(pVdbe); + assert( db!=0 ); + assert( pVdbe->zNormSql==0 ); + if( zSql==0 ) return; + nZ = estimateNormalizedSize(zSql, nSql, prepFlags); + z = sqlite3DbMallocRawNN(db, nZ); + if( z==0 ) return; + sqlite3HashInit(&inHash); + for(i=j=0; i0 ){ + sqlite3HashInsert(&inHash, zSql+nParen, 0); + assert( jj+6=0 ); + assert( nZ-1-j=0 ); + /* Fall through */ + } + case TK_MINUS: + case TK_SEMI: + case TK_PLUS: + case TK_STAR: + case TK_SLASH: + case TK_REM: + case TK_EQ: + case TK_LE: + case TK_NE: + case TK_LSHIFT: + case TK_LT: + case TK_RSHIFT: + case TK_GT: + case TK_GE: + case TK_BITOR: + case TK_CONCAT: + case TK_COMMA: + case TK_BITAND: + case TK_BITNOT: + case TK_DOT: + case TK_IN: + case TK_IS: + case TK_NOT: + case TK_NULL: + case TK_ID: { + if( tokenType==TK_NULL ){ + if( prevTokenType==TK_IS || prevTokenType==TK_NOT ){ + /* NULL is a keyword in this case, not a literal value */ + }else{ + /* Here the NULL is a literal value */ + z[j++] = '?'; + break; + } + } + if( j>0 && sqlite3IsIdChar(z[j-1]) && sqlite3IsIdChar(zSql[i]) ){ + z[j++] = ' '; + } + if( tokenType==TK_ID ){ + int i2 = i, n2 = n, rc = SQLITE_OK; + if( nParen>0 ){ + assert( nParen0 && z[j-1]==' ' ){ j--; } + if( j>0 && z[j-1]!=';' ){ z[j++] = ';'; } + z[j] = 0; + assert( jzNormSql = z; + sqlite3HashClear(&inHash); +} +#endif /* SQLITE_ENABLE_NORMALIZE */ + /* ** Rerun the compilation of a statement after a schema change. ** diff --git a/src/resolve.c b/src/resolve.c index 9fb4d4c..0c7dfc0 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -159,7 +159,7 @@ int sqlite3MatchSpanName( ** (even if X is implied). ** pExpr->iTable Set to the cursor number for the table obtained ** from pSrcList. -** pExpr->pTab Points to the Table structure of X.Y (even if +** pExpr->y.pTab Points to the Table structure of X.Y (even if ** X and/or Y are implied.) ** pExpr->iColumn Set to the column number within the table. ** pExpr->op Set to TK_COLUMN. @@ -203,7 +203,6 @@ static int lookupName( /* Initialize the node to no-match */ pExpr->iTable = -1; - pExpr->pTab = 0; ExprSetVVAProperty(pExpr, EP_NoReduce); /* Translate the schema name in zDb into a pointer to the corresponding @@ -265,7 +264,7 @@ static int lookupName( continue; } if( IN_RENAME_OBJECT && pItem->zAlias ){ - sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->pTab); + sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->y.pTab); } } if( 0==(cntTab++) ){ @@ -291,13 +290,13 @@ static int lookupName( } if( pMatch ){ pExpr->iTable = pMatch->iCursor; - pExpr->pTab = pMatch->pTab; + pExpr->y.pTab = pMatch->pTab; /* RIGHT JOIN not (yet) supported */ assert( (pMatch->fg.jointype & JT_RIGHT)==0 ); if( (pMatch->fg.jointype & JT_LEFT)!=0 ){ ExprSetProperty(pExpr, EP_CanBeNull); } - pSchema = pExpr->pTab->pSchema; + pSchema = pExpr->y.pTab->pSchema; } } /* if( pSrcList ) */ @@ -354,7 +353,7 @@ static int lookupName( testcase( iCol==(-1) ); if( IN_RENAME_OBJECT ){ pExpr->iColumn = iCol; - pExpr->pTab = pTab; + pExpr->y.pTab = pTab; eNewExprOp = TK_COLUMN; }else{ pExpr->iTable = pNC->uNC.pUpsert->regData + iCol; @@ -376,7 +375,7 @@ static int lookupName( testcase( iCol==32 ); pParse->newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<pTab = pTab; + pExpr->y.pTab = pTab; pExpr->iColumn = (i16)iCol; eNewExprOp = TK_TRIGGER; #endif /* SQLITE_OMIT_TRIGGER */ @@ -476,7 +475,7 @@ static int lookupName( assert( pExpr->op==TK_ID ); if( ExprHasProperty(pExpr,EP_DblQuoted) ){ pExpr->op = TK_STRING; - pExpr->pTab = 0; + pExpr->y.pTab = 0; return WRC_Prune; } if( sqlite3ExprIdToTrueFalse(pExpr) ){ @@ -554,9 +553,9 @@ Expr *sqlite3CreateColumnExpr(sqlite3 *db, SrcList *pSrc, int iSrc, int iCol){ Expr *p = sqlite3ExprAlloc(db, TK_COLUMN, 0, 0); if( p ){ struct SrcList_item *pItem = &pSrc->a[iSrc]; - p->pTab = pItem->pTab; + p->y.pTab = pItem->pTab; p->iTable = pItem->iCursor; - if( p->pTab->iPKey==iCol ){ + if( p->y.pTab->iPKey==iCol ){ p->iColumn = -1; }else{ p->iColumn = (ynVar)iCol; @@ -646,7 +645,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pItem = pSrcList->a; assert( HasRowid(pItem->pTab) && pItem->pTab->pSelect==0 ); pExpr->op = TK_COLUMN; - pExpr->pTab = pItem->pTab; + pExpr->y.pTab = pItem->pTab; pExpr->iTable = pItem->iCursor; pExpr->iColumn = -1; pExpr->affinity = SQLITE_AFF_INTEGER; @@ -690,9 +689,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ zColumn = pRight->u.zToken; if( IN_RENAME_OBJECT ){ sqlite3RenameTokenRemap(pParse, (void*)pExpr, (void*)pRight); - } - if( IN_RENAME_OBJECT ){ - sqlite3RenameTokenRemap(pParse, (void*)&pExpr->pTab, (void*)pLeft); + sqlite3RenameTokenRemap(pParse, (void*)&pExpr->y.pTab, (void*)pLeft); } } return lookupName(pParse, zDb, zTable, zColumn, pNC, pExpr); @@ -774,6 +771,15 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ notValid(pParse, pNC, "non-deterministic functions", NC_IdxExpr|NC_PartIdx); } + if( (pDef->funcFlags & SQLITE_FUNC_INTERNAL)!=0 + && pParse->nested==0 + && sqlite3Config.bInternalFunctions==0 + ){ + /* Internal-use-only functions are disallowed unless the + ** SQL is being compiled using sqlite3NestedParse() */ + no_such_func = 1; + pDef = 0; + } } if( 0==IN_RENAME_OBJECT ){ @@ -782,18 +788,18 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ || (pDef->xValue==0 && pDef->xInverse==0) || (pDef->xValue && pDef->xInverse && pDef->xSFunc && pDef->xFinalize) ); - if( pDef && pDef->xValue==0 && pExpr->pWin ){ + if( pDef && pDef->xValue==0 && ExprHasProperty(pExpr, EP_WinFunc) ){ sqlite3ErrorMsg(pParse, "%.*s() may not be used as a window function", nId, zId ); pNC->nErr++; }else if( (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) - || (is_agg && (pDef->funcFlags & SQLITE_FUNC_WINDOW) && !pExpr->pWin) - || (is_agg && pExpr->pWin && (pNC->ncFlags & NC_AllowWin)==0) + || (is_agg && (pDef->funcFlags&SQLITE_FUNC_WINDOW) && !pExpr->y.pWin) + || (is_agg && pExpr->y.pWin && (pNC->ncFlags & NC_AllowWin)==0) ){ const char *zType; - if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || pExpr->pWin ){ + if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || pExpr->y.pWin ){ zType = "window"; }else{ zType = "aggregate"; @@ -823,7 +829,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ } if( is_agg ){ #ifndef SQLITE_OMIT_WINDOWFUNC - pNC->ncFlags &= ~(pExpr->pWin ? NC_AllowWin : NC_AllowAgg); + pNC->ncFlags &= ~(pExpr->y.pWin ? NC_AllowWin : NC_AllowAgg); #else pNC->ncFlags &= ~NC_AllowAgg; #endif @@ -832,17 +838,17 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ sqlite3WalkExprList(pWalker, pList); if( is_agg ){ #ifndef SQLITE_OMIT_WINDOWFUNC - if( pExpr->pWin ){ + if( pExpr->y.pWin ){ Select *pSel = pNC->pWinSelect; - sqlite3WalkExprList(pWalker, pExpr->pWin->pPartition); - sqlite3WalkExprList(pWalker, pExpr->pWin->pOrderBy); - sqlite3WalkExpr(pWalker, pExpr->pWin->pFilter); - sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->pWin, pDef); + sqlite3WalkExprList(pWalker, pExpr->y.pWin->pPartition); + sqlite3WalkExprList(pWalker, pExpr->y.pWin->pOrderBy); + sqlite3WalkExpr(pWalker, pExpr->y.pWin->pFilter); + sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->y.pWin, pDef); if( 0==pSel->pWin - || 0==sqlite3WindowCompare(pParse, pSel->pWin, pExpr->pWin) + || 0==sqlite3WindowCompare(pParse, pSel->pWin, pExpr->y.pWin) ){ - pExpr->pWin->pNextWin = pSel->pWin; - pSel->pWin = pExpr->pWin; + pExpr->y.pWin->pNextWin = pSel->pWin; + pSel->pWin = pExpr->y.pWin; } pNC->ncFlags |= NC_AllowWin; }else @@ -1265,13 +1271,13 @@ static int resolveOrderGroupBy( for(j=0; jpEList->nExpr; j++){ if( sqlite3ExprCompare(0, pE, pSelect->pEList->a[j].pExpr, -1)==0 ){ #ifndef SQLITE_OMIT_WINDOWFUNC - if( pE->pWin ){ + if( ExprHasProperty(pE, EP_WinFunc) ){ /* Since this window function is being changed into a reference ** to the same window function the result set, remove the instance ** of this window function from the Select.pWin list. */ Window **pp; for(pp=&pSelect->pWin; *pp; pp=&(*pp)->pNextWin){ - if( *pp==pE->pWin ){ + if( *pp==pE->y.pWin ){ *pp = (*pp)->pNextWin; } } diff --git a/src/select.c b/src/select.c index bc5960f..c60ff27 100644 --- a/src/select.c +++ b/src/select.c @@ -803,7 +803,7 @@ static void selectExprDefer( struct ExprList_item *pItem = &pEList->a[i]; if( pItem->u.x.iOrderByCol==0 ){ Expr *pExpr = pItem->pExpr; - Table *pTab = pExpr->pTab; + Table *pTab = pExpr->y.pTab; if( pExpr->op==TK_COLUMN && pExpr->iColumn>=0 && pTab && !IsVirtual(pTab) && (pTab->aCol[pExpr->iColumn].colFlags & COLFLAG_SORTERREF) ){ @@ -826,12 +826,12 @@ static void selectExprDefer( Expr *pNew = sqlite3PExpr(pParse, TK_COLUMN, 0, 0); if( pNew ){ pNew->iTable = pExpr->iTable; - pNew->pTab = pExpr->pTab; + pNew->y.pTab = pExpr->y.pTab; pNew->iColumn = pPk ? pPk->aiColumn[k] : -1; pExtra = sqlite3ExprListAppend(pParse, pExtra, pNew); } } - pSort->aDefer[nDefer].pTab = pExpr->pTab; + pSort->aDefer[nDefer].pTab = pExpr->y.pTab; pSort->aDefer[nDefer].iCsr = pExpr->iTable; pSort->aDefer[nDefer].nKey = nKey; nDefer++; @@ -1680,7 +1680,7 @@ static const char *columnTypeImpl( break; } - assert( pTab && pExpr->pTab==pTab ); + assert( pTab && pExpr->y.pTab==pTab ); if( pS ){ /* The "table" is actually a sub-select or a view in the FROM clause ** of the SELECT statement. Return the declaration type and origin @@ -1865,7 +1865,7 @@ static void generateColumnNames( assert( p!=0 ); assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */ - assert( p->op!=TK_COLUMN || p->pTab!=0 ); /* Covering idx not yet coded */ + assert( p->op!=TK_COLUMN || p->y.pTab!=0 ); /* Covering idx not yet coded */ if( pEList->a[i].zName ){ /* An AS clause always takes first priority */ char *zName = pEList->a[i].zName; @@ -1873,7 +1873,7 @@ static void generateColumnNames( }else if( srcName && p->op==TK_COLUMN ){ char *zCol; int iCol = p->iColumn; - pTab = p->pTab; + pTab = p->y.pTab; assert( pTab!=0 ); if( iCol<0 ) iCol = pTab->iPKey; assert( iCol==-1 || (iCol>=0 && iColnCol) ); @@ -1964,7 +1964,7 @@ int sqlite3ColumnsFromExprList( if( pColExpr->op==TK_COLUMN ){ /* For columns use the column name name */ int iCol = pColExpr->iColumn; - Table *pTab = pColExpr->pTab; + Table *pTab = pColExpr->y.pTab; assert( pTab!=0 ); if( iCol<0 ) iCol = pTab->iPKey; zName = iCol>=0 ? pTab->aCol[iCol].zName : "rowid"; @@ -2318,6 +2318,13 @@ static void generateWithRecursiveQuery( Expr *pLimit; /* Saved LIMIT and OFFSET */ int regLimit, regOffset; /* Registers used by LIMIT and OFFSET */ +#ifndef SQLITE_OMIT_WINDOWFUNC + if( p->pWin ){ + sqlite3ErrorMsg(pParse, "cannot use window functions in recursive queries"); + return; + } +#endif + /* Obtain authorization to do a recursive query */ if( sqlite3AuthCheck(pParse, SQLITE_RECURSIVE, 0, 0, 0) ) return; @@ -4067,7 +4074,7 @@ static int flattenSubquery( #endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ /* -** A structure to keep track of all of the column values that fixed to +** A structure to keep track of all of the column values that are fixed to ** a known value due to WHERE clause constraints of the form COLUMN=VALUE. */ typedef struct WhereConst WhereConst; @@ -4079,13 +4086,28 @@ struct WhereConst { }; /* -** Add a new entry to the pConst object +** Add a new entry to the pConst object. Except, do not add duplicate +** pColumn entires. */ static void constInsert( - WhereConst *pConst, - Expr *pColumn, - Expr *pValue + WhereConst *pConst, /* The WhereConst into which we are inserting */ + Expr *pColumn, /* The COLUMN part of the constraint */ + Expr *pValue /* The VALUE part of the constraint */ ){ + int i; + assert( pColumn->op==TK_COLUMN ); + + /* 2018-10-25 ticket [cf5ed20f] + ** Make sure the same pColumn is not inserted more than once */ + for(i=0; inConst; i++){ + const Expr *pExpr = pConst->apExpr[i*2]; + assert( pExpr->op==TK_COLUMN ); + if( pExpr->iTable==pColumn->iTable + && pExpr->iColumn==pColumn->iColumn + ){ + return; /* Already present. Return without doing anything. */ + } + } pConst->nConst++; pConst->apExpr = sqlite3DbReallocOrFree(pConst->pParse->db, pConst->apExpr, diff --git a/src/shell.c.in b/src/shell.c.in index 8f6ef7f..ad5a149 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1059,11 +1059,12 @@ struct ShellState { /* Allowed values for ShellState.openMode */ -#define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */ -#define SHELL_OPEN_NORMAL 1 /* Normal database file */ -#define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */ -#define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */ -#define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */ +#define SHELL_OPEN_UNSPEC 0 /* No open-mode specified */ +#define SHELL_OPEN_NORMAL 1 /* Normal database file */ +#define SHELL_OPEN_APPENDVFS 2 /* Use appendvfs */ +#define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */ +#define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */ +#define SHELL_OPEN_DESERIALIZE 5 /* Open using sqlite3_deserialize() */ /* ** These are the allowed shellFlgs values @@ -1273,7 +1274,7 @@ static void editFunc( if( bBin ){ sqlite3_result_blob64(context, p, sz, sqlite3_free); }else{ - int i, j; + sqlite3_int64 i, j; if( hasCRNL ){ /* If the original contains \r\n then do no conversions back to \n */ j = sz; @@ -3335,137 +3336,238 @@ static int run_schema_dump_query( } /* -** Text of a help message +** Text of help messages. +** +** The help text for each individual command begins with a line that starts +** with ".". Subsequent lines are supplimental information. +** +** There must be two or more spaces between the end of the command and the +** start of the description of what that command does. */ -static char zHelp[] = +static const char *(azHelp[]) = { #if defined(SQLITE_HAVE_ZLIB) && !defined(SQLITE_OMIT_VIRTUALTABLE) - ".archive ... Manage SQL archives: \".archive --help\" for details\n" + ".archive ... Manage SQL archives", + " Each command must have exactly one of the following options:", + " -c, --create Create a new archive", + " -u, --update Update or add files to an existing archive", + " -t, --list List contents of archive", + " -x, --extract Extract files from archive", + " Optional arguments:", + " -v, --verbose Print each filename as it is processed", + " -f FILE, --file FILE Operate on archive FILE (default is current db)", + " -a FILE, --append FILE Operate on FILE opened using the apndvfs VFS", + " -C DIR, --directory DIR Change to directory DIR to read/extract files", + " -n, --dryrun Show the SQL that would have occurred", + " Examples:", + " .ar -cf archive.sar foo bar # Create archive.sar from files foo and bar", + " .ar -tf archive.sar # List members of archive.sar", + " .ar -xvf archive.sar # Verbosely extract files from archive.sar", + " See also:", + " http://sqlite.org/cli.html#sqlar_archive_support", #endif #ifndef SQLITE_OMIT_AUTHORIZATION - ".auth ON|OFF Show authorizer callbacks\n" + ".auth ON|OFF Show authorizer callbacks", #endif - ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n" - " Add \"--append\" to open using appendvfs.\n" - ".bail on|off Stop after hitting an error. Default OFF\n" - ".binary on|off Turn binary output on or off. Default OFF\n" - ".cd DIRECTORY Change the working directory to DIRECTORY\n" - ".changes on|off Show number of rows changed by SQL\n" - ".check GLOB Fail if output since .testcase does not match\n" - ".clone NEWDB Clone data into NEWDB from the existing database\n" - ".databases List names and files of attached databases\n" - ".dbconfig ?op? ?val? List or change sqlite3_db_config() options\n" - ".dbinfo ?DB? Show status information about the database\n" - ".dump ?TABLE? ... Dump the database in an SQL text format\n" - " If TABLE specified, only dump tables matching\n" - " LIKE pattern TABLE.\n" - ".echo on|off Turn command echo on or off\n" - ".eqp on|off|full Enable or disable automatic EXPLAIN QUERY PLAN\n" - ".excel Display the output of next command in a spreadsheet\n" - ".exit Exit this program\n" - ".expert EXPERIMENTAL. Suggest indexes for specified queries\n" + ".backup ?DB? FILE Backup DB (default \"main\") to FILE", + " --append Use the appendvfs", + ".bail on|off Stop after hitting an error. Default OFF", + ".binary on|off Turn binary output on or off. Default OFF", + ".cd DIRECTORY Change the working directory to DIRECTORY", + ".changes on|off Show number of rows changed by SQL", + ".check GLOB Fail if output since .testcase does not match", + ".clone NEWDB Clone data into NEWDB from the existing database", + ".databases List names and files of attached databases", + ".dbconfig ?op? ?val? List or change sqlite3_db_config() options", + ".dbinfo ?DB? Show status information about the database", + ".dump ?TABLE? ... Render all database content as SQL", + " Options:", + " --preserve-rowids Include ROWID values in the output", + " --newlines Allow unescaped newline characters in output", + " TABLE is LIKE pattern for the tables to dump", + ".echo on|off Turn command echo on or off", + ".eqp on|off|full Enable or disable automatic EXPLAIN QUERY PLAN", + ".excel Display the output of next command in a spreadsheet", + ".exit ?CODE? Exit this program with return-code CODE", + ".expert EXPERIMENTAL. Suggest indexes for specified queries", /* Because explain mode comes on automatically now, the ".explain" mode ** is removed from the help screen. It is still supported for legacy, however */ -/*".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic\n"*/ - ".fullschema ?--indent? Show schema and the content of sqlite_stat tables\n" - ".headers on|off Turn display of headers on or off\n" - ".help Show this message\n" - ".import FILE TABLE Import data from FILE into TABLE\n" +/*".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic",*/ + ".fullschema ?--indent? Show schema and the content of sqlite_stat tables", + ".headers on|off Turn display of headers on or off", + ".help ?-all? ?PATTERN? Show help text for PATTERN", + ".import FILE TABLE Import data from FILE into TABLE", #ifndef SQLITE_OMIT_TEST_CONTROL - ".imposter INDEX TABLE Create imposter table TABLE on index INDEX\n" + ".imposter INDEX TABLE Create imposter table TABLE on index INDEX", #endif - ".indexes ?TABLE? Show names of all indexes\n" - " If TABLE specified, only show indexes for tables\n" - " matching LIKE pattern TABLE.\n" + ".indexes ?TABLE? Show names of indexes", + " If TABLE is specified, only show indexes for", + " tables matching TABLE using the LIKE operator.", #ifdef SQLITE_ENABLE_IOTRACE - ".iotrace FILE Enable I/O diagnostic logging to FILE\n" + ".iotrace FILE Enable I/O diagnostic logging to FILE", #endif - ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n" - ".lint OPTIONS Report potential schema issues. Options:\n" - " fkey-indexes Find missing foreign key indexes\n" + ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT", + ".lint OPTIONS Report potential schema issues.", + " Options:", + " fkey-indexes Find missing foreign key indexes", #ifndef SQLITE_OMIT_LOAD_EXTENSION - ".load FILE ?ENTRY? Load an extension library\n" + ".load FILE ?ENTRY? Load an extension library", #endif - ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n" - ".mode MODE ?TABLE? Set output mode where MODE is one of:\n" - " ascii Columns/rows delimited by 0x1F and 0x1E\n" - " csv Comma-separated values\n" - " column Left-aligned columns. (See .width)\n" - " html HTML code\n" - " insert SQL insert statements for TABLE\n" - " line One value per line\n" - " list Values delimited by \"|\"\n" - " quote Escape answers as for SQL\n" - " tabs Tab-separated values\n" - " tcl TCL list elements\n" - ".nullvalue STRING Use STRING in place of NULL values\n" - ".once (-e|-x|FILE) Output for the next SQL command only to FILE\n" - " or invoke system text editor (-e) or spreadsheet (-x)\n" - " on the output.\n" - ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE\n" - " The --new option starts with an empty file\n" - " Other options: --readonly --append --zip\n" - ".output ?FILE? Send output to FILE or stdout\n" - ".print STRING... Print literal STRING\n" - ".prompt MAIN CONTINUE Replace the standard prompts\n" - ".quit Exit this program\n" - ".read FILENAME Execute SQL in FILENAME\n" - ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n" - ".save FILE Write in-memory database into FILE\n" - ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off\n" - ".schema ?PATTERN? Show the CREATE statements matching PATTERN\n" - " Add --indent for pretty-printing\n" - ".selftest ?--init? Run tests defined in the SELFTEST table\n" - ".separator COL ?ROW? Change the column separator and optionally the row\n" - " separator for both the output mode and .import\n" + ".log FILE|off Turn logging on or off. FILE can be stderr/stdout", + ".mode MODE ?TABLE? Set output mode", + " MODE is one of:", + " ascii Columns/rows delimited by 0x1F and 0x1E", + " csv Comma-separated values", + " column Left-aligned columns. (See .width)", + " html HTML
code", + " insert SQL insert statements for TABLE", + " line One value per line", + " list Values delimited by \"|\"", + " quote Escape answers as for SQL", + " tabs Tab-separated values", + " tcl TCL list elements", + ".nullvalue STRING Use STRING in place of NULL values", + ".once (-e|-x|FILE) Output for the next SQL command only to FILE", + " If FILE begins with '|' then open as a pipe", + " Other options:", + " -e Invoke system text editor", + " -x Open in a spreadsheet", + ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE", + " Options:", + " --append Use appendvfs to append database to the end of FILE", +#ifdef SQLITE_ENABLE_DESERIALIZE + " --deserialize Load into memory useing sqlite3_deserialize()", +#endif + " --new Initialize FILE to an empty database", + " --readonly Open FILE readonly", + " --zip FILE is a ZIP archive", + ".output ?FILE? Send output to FILE or stdout if FILE is omitted", + " If FILE begins with '|' then open it as a pipe.", + ".print STRING... Print literal STRING", + ".prompt MAIN CONTINUE Replace the standard prompts", + ".quit Exit this program", + ".read FILE Read input from FILE", + ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE", + ".save FILE Write in-memory database into FILE", + ".scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off", + ".schema ?PATTERN? Show the CREATE statements matching PATTERN", + " Options:", + " --indent Try to pretty-print the schema", + ".selftest ?OPTIONS? Run tests defined in the SELFTEST table", + " Options:", + " --init Create a new SELFTEST table", + " -v Verbose output", + ".separator COL ?ROW? Change the column and row separators", #if defined(SQLITE_ENABLE_SESSION) - ".session CMD ... Create or control sessions\n" + ".session ?NAME? CMD ... Create or control sessions", + " Subcommands:", + " attach TABLE Attach TABLE", + " changeset FILE Write a changeset into FILE", + " close Close one session", + " enable ?BOOLEAN? Set or query the enable bit", + " filter GLOB... Reject tables matching GLOBs", + " indirect ?BOOLEAN? Mark or query the indirect status", + " isempty Query whether the session is empty", + " list List currently open session names", + " open DB NAME Open a new session on DB", + " patchset FILE Write a patchset into FILE", + " If ?NAME? is omitted, the first defined session is used.", #endif - ".sha3sum ?OPTIONS...? Compute a SHA3 hash of database content\n" + ".sha3sum ... Compute a SHA3 hash of database content", + " Options:", + " --schema Also hash the sqlite_master table", + " --sha3-224 Use the sha3-224 algorithm", + " --sha3-256 Use the sha3-256 algorithm. This is the default.", + " --sha3-384 Use the sha3-384 algorithm", + " --sha3-512 Use the sha3-512 algorithm", + " Any other argument is a LIKE pattern for tables to hash", #ifndef SQLITE_NOHAVE_SYSTEM - ".shell CMD ARGS... Run CMD ARGS... in a system shell\n" + ".shell CMD ARGS... Run CMD ARGS... in a system shell", #endif - ".show Show the current values for various settings\n" - ".stats ?on|off? Show stats or turn stats on or off\n" + ".show Show the current values for various settings", + ".stats ?on|off? Show stats or turn stats on or off", #ifndef SQLITE_NOHAVE_SYSTEM - ".system CMD ARGS... Run CMD ARGS... in a system shell\n" + ".system CMD ARGS... Run CMD ARGS... in a system shell", #endif - ".tables ?TABLE? List names of tables\n" - " If TABLE specified, only list tables matching\n" - " LIKE pattern TABLE.\n" - ".testcase NAME Begin redirecting output to 'testcase-out.txt'\n" - ".timeout MS Try opening locked tables for MS milliseconds\n" - ".timer on|off Turn SQL timer on or off\n" - ".trace FILE|off Output each SQL statement as it is run\n" - ".vfsinfo ?AUX? Information about the top-level VFS\n" - ".vfslist List all available VFSes\n" - ".vfsname ?AUX? Print the name of the VFS stack\n" - ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n" - " Negative values right-justify\n" -; + ".tables ?TABLE? List names of tables matching LIKE pattern TABLE", + ".testcase NAME Begin redirecting output to 'testcase-out.txt'", + ".timeout MS Try opening locked tables for MS milliseconds", + ".timer on|off Turn SQL timer on or off", + ".trace FILE|off Output each SQL statement as it is run", + ".vfsinfo ?AUX? Information about the top-level VFS", + ".vfslist List all available VFSes", + ".vfsname ?AUX? Print the name of the VFS stack", + ".width NUM1 NUM2 ... Set column widths for \"column\" mode", + " Negative values right-justify", +}; -#if defined(SQLITE_ENABLE_SESSION) /* -** Print help information for the ".sessions" command +** Output help text. +** +** zPattern describes the set of commands for which help text is provided. +** If zPattern is NULL, then show all commands, but only give a one-line +** description of each. +** +** Return the number of matches. */ -void session_help(ShellState *p){ - raw_printf(p->out, - ".session ?NAME? SUBCOMMAND ?ARGS...?\n" - "If ?NAME? is omitted, the first defined session is used.\n" - "Subcommands:\n" - " attach TABLE Attach TABLE\n" - " changeset FILE Write a changeset into FILE\n" - " close Close one session\n" - " enable ?BOOLEAN? Set or query the enable bit\n" - " filter GLOB... Reject tables matching GLOBs\n" - " indirect ?BOOLEAN? Mark or query the indirect status\n" - " isempty Query whether the session is empty\n" - " list List currently open session names\n" - " open DB NAME Open a new session on DB\n" - " patchset FILE Write a patchset into FILE\n" - ); +static int showHelp(FILE *out, const char *zPattern){ + int i = 0; + int j = 0; + int n = 0; + char *zPat; + if( zPattern==0 + || zPattern[0]=='0' + || strcmp(zPattern,"-a")==0 + || strcmp(zPattern,"-all")==0 + ){ + /* Show all commands, but only one line per command */ + if( zPattern==0 ) zPattern = ""; + for(i=0; idb); + break; + } case SHELL_OPEN_ZIPFILE: { sqlite3_open(":memory:", &p->db); break; @@ -3675,6 +3786,18 @@ static void open_db(ShellState *p, int openFlags){ sqlite3_exec(p->db, zSql, 0, 0, 0); sqlite3_free(zSql); } +#ifdef SQLITE_ENABLE_DESERIALIZE + else if( p->openMode==SHELL_OPEN_DESERIALIZE ){ + int nData = 0; + unsigned char *aData = (unsigned char*)readFile(p->zDbFilename, &nData); + int rc = sqlite3_deserialize(p->db, "main", aData, nData, nData, + SQLITE_DESERIALIZE_RESIZEABLE | + SQLITE_DESERIALIZE_FREEONCLOSE); + if( rc ){ + utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc); + } + } +#endif } } @@ -4879,6 +5002,7 @@ static void shellPreparePrintf( char *z; va_start(ap, zFmt); z = sqlite3_vmprintf(zFmt, ap); + va_end(ap); if( z==0 ){ *pRc = SQLITE_NOMEM; }else{ @@ -4941,32 +5065,7 @@ struct ArCommand { ** Print a usage message for the .ar command to stderr and return SQLITE_ERROR. */ static int arUsage(FILE *f){ - raw_printf(f, -"\n" -"Usage: .ar [OPTION...] [FILE...]\n" -"The .ar command manages sqlar archives.\n" -"\n" -"Examples:\n" -" .ar -cf archive.sar foo bar # Create archive.sar from files foo and bar\n" -" .ar -tf archive.sar # List members of archive.sar\n" -" .ar -xvf archive.sar # Verbosely extract files from archive.sar\n" -"\n" -"Each command line must feature exactly one command option:\n" -" -c, --create Create a new archive\n" -" -u, --update Update or add files to an existing archive\n" -" -t, --list List contents of archive\n" -" -x, --extract Extract files from archive\n" -"\n" -"And zero or more optional options:\n" -" -v, --verbose Print each filename as it is processed\n" -" -f FILE, --file FILE Operate on archive FILE (default is current db)\n" -" -a FILE, --append FILE Operate on FILE opened using the apndvfs VFS\n" -" -C DIR, --directory DIR Change to directory DIR to read/extract files\n" -" -n, --dryrun Show the SQL that would have occurred\n" -"\n" -"See also: http://sqlite.org/cli.html#sqlar_archive_support\n" -"\n" -); + showHelp(f,"archive"); return SQLITE_ERROR; } @@ -5073,6 +5172,7 @@ static int arParseCommand( struct ArSwitch *pEnd = &aSwitch[nSwitch]; if( nArg<=1 ){ + utf8_printf(stderr, "Wrong number of arguments. Usage:\n"); return arUsage(stderr); }else{ char *z = azArg[1]; @@ -5844,7 +5944,10 @@ static int do_meta_command(char *zLine, ShellState *p){ }else if( c=='d' && n>=3 && strncmp(azArg[0], "dbconfig", n)==0 ){ - static const struct DbConfigChoices {const char *zName; int op;} aDbConfig[] = { + static const struct DbConfigChoices { + const char *zName; + int op; + } aDbConfig[] = { { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, @@ -5853,6 +5956,7 @@ static int do_meta_command(char *zLine, ShellState *p){ { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG }, { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP }, { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, + { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, }; int ii, v; open_db(p, 0); @@ -6091,7 +6195,14 @@ static int do_meta_command(char *zLine, ShellState *p){ }else if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ - utf8_printf(p->out, "%s", zHelp); + if( nArg>=2 ){ + n = showHelp(p->out, azArg[1]); + if( n==0 ){ + utf8_printf(p->out, "Nothing matches '%s'\n", azArg[1]); + } + }else{ + showHelp(p->out, 0); + } }else if( c=='i' && strncmp(azArg[0], "import", n)==0 ){ @@ -6568,6 +6679,10 @@ static int do_meta_command(char *zLine, ShellState *p){ p->openMode = SHELL_OPEN_APPENDVFS; }else if( optionMatch(z, "readonly") ){ p->openMode = SHELL_OPEN_READONLY; +#ifdef SQLITE_ENABLE_DESERIALIZE + }else if( optionMatch(z, "deserialize") ){ + p->openMode = SHELL_OPEN_DESERIALIZE; +#endif }else if( z[0]=='-' ){ utf8_printf(stderr, "unknown option: %s\n", z); rc = 1; @@ -7095,7 +7210,7 @@ static int do_meta_command(char *zLine, ShellState *p){ }else /* If no command name matches, show a syntax error */ session_syntax_error: - session_help(p); + showHelp(p->out, "session"); }else #endif @@ -7562,6 +7677,7 @@ static int do_meta_command(char *zLine, ShellState *p){ { "byteorder", SQLITE_TESTCTRL_BYTEORDER, "" }, /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, "" }, */ { "imposter", SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"}, + { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "BOOLEAN" }, { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN" }, { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN" }, { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK" }, @@ -7656,6 +7772,7 @@ static int do_meta_command(char *zLine, ShellState *p){ /* sqlite3_test_control(int, int) */ case SQLITE_TESTCTRL_ASSERT: case SQLITE_TESTCTRL_ALWAYS: + case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: if( nArg==3 ){ int opt = booleanValue(azArg[2]); rc2 = sqlite3_test_control(testctrl, opt); @@ -7950,7 +8067,7 @@ static int line_is_command_terminator(const char *zLine){ ** user-friendly, but it does seem to work. */ #ifdef SQLITE_OMIT_COMPLETE -int sqlite3_complete(const char *zSql){ return 1; } +#define sqlite3_complete(x) 1 #endif /* @@ -8536,6 +8653,10 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ #endif }else if( strcmp(z,"-append")==0 ){ data.openMode = SHELL_OPEN_APPENDVFS; +#ifdef SQLITE_ENABLE_DESERIALIZE + }else if( strcmp(z,"-deserialize")==0 ){ + data.openMode = SHELL_OPEN_DESERIALIZE; +#endif }else if( strcmp(z,"-readonly")==0 ){ data.openMode = SHELL_OPEN_READONLY; #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) @@ -8631,6 +8752,10 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ #endif }else if( strcmp(z,"-append")==0 ){ data.openMode = SHELL_OPEN_APPENDVFS; +#ifdef SQLITE_ENABLE_DESERIALIZE + }else if( strcmp(z,"-deserialize")==0 ){ + data.openMode = SHELL_OPEN_DESERIALIZE; +#endif }else if( strcmp(z,"-readonly")==0 ){ data.openMode = SHELL_OPEN_READONLY; }else if( strcmp(z,"-ascii")==0 ){ @@ -8775,7 +8900,7 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ */ if( stdin_is_interactive ){ char *zHome; - char *zHistory = 0; + char *zHistory; int nHistory; printf( "SQLite version %s %.19s\n" /*extra-version-info*/ @@ -8788,8 +8913,10 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ printf(".\nUse \".open FILENAME\" to reopen on a " "persistent database.\n"); } - zHome = find_home_dir(0); - if( zHome ){ + zHistory = getenv("SQLITE_HISTORY"); + if( zHistory ){ + zHistory = strdup(zHistory); + }else if( (zHome = find_home_dir(0))!=0 ){ nHistory = strlen30(zHome) + 20; if( (zHistory = malloc(nHistory))!=0 ){ sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome); diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 2d090e3..85ef363 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2017,6 +2017,7 @@ struct sqlite3_mem_methods { ** is invoked. ** **
+** [[SQLITE_DBCONFIG_LOOKASIDE]] **
SQLITE_DBCONFIG_LOOKASIDE
**
^This option takes three additional arguments that determine the ** [lookaside memory allocator] configuration for the [database connection]. @@ -2039,6 +2040,7 @@ struct sqlite3_mem_methods { ** memory is in use leaves the configuration unchanged and returns ** [SQLITE_BUSY].)^
** +** [[SQLITE_DBCONFIG_ENABLE_FKEY]] **
SQLITE_DBCONFIG_ENABLE_FKEY
**
^This option is used to enable or disable the enforcement of ** [foreign key constraints]. There should be two additional arguments. @@ -2049,6 +2051,7 @@ struct sqlite3_mem_methods { ** following this call. The second parameter may be a NULL pointer, in ** which case the FK enforcement setting is not reported back.
** +** [[SQLITE_DBCONFIG_ENABLE_TRIGGER]] **
SQLITE_DBCONFIG_ENABLE_TRIGGER
**
^This option is used to enable or disable [CREATE TRIGGER | triggers]. ** There should be two additional arguments. @@ -2059,6 +2062,7 @@ struct sqlite3_mem_methods { ** following this call. The second parameter may be a NULL pointer, in ** which case the trigger setting is not reported back.
** +** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]] **
SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
**
^This option is used to enable or disable the two-argument ** version of the [fts3_tokenizer()] function which is part of the @@ -2072,6 +2076,7 @@ struct sqlite3_mem_methods { ** following this call. The second parameter may be a NULL pointer, in ** which case the new setting is not reported back.
** +** [[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION]] **
SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
**
^This option is used to enable or disable the [sqlite3_load_extension()] ** interface independently of the [load_extension()] SQL function. @@ -2089,7 +2094,7 @@ struct sqlite3_mem_methods { ** be a NULL pointer, in which case the new setting is not reported back. **
** -**
SQLITE_DBCONFIG_MAINDBNAME
+** [[SQLITE_DBCONFIG_MAINDBNAME]]
SQLITE_DBCONFIG_MAINDBNAME
**
^This option is used to change the name of the "main" database ** schema. ^The sole argument is a pointer to a constant UTF8 string ** which will become the new schema name in place of "main". ^SQLite @@ -2098,6 +2103,7 @@ struct sqlite3_mem_methods { ** until after the database connection closes. **
** +** [[SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE]] **
SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
**
Usually, when a database in wal mode is closed or detached from a ** database handle, SQLite checks if this will mean that there are now no @@ -2111,7 +2117,7 @@ struct sqlite3_mem_methods { ** have been disabled - 0 if they are not disabled, 1 if they are. **
** -**
SQLITE_DBCONFIG_ENABLE_QPSG
+** [[SQLITE_DBCONFIG_ENABLE_QPSG]]
SQLITE_DBCONFIG_ENABLE_QPSG
**
^(The SQLITE_DBCONFIG_ENABLE_QPSG option activates or deactivates ** the [query planner stability guarantee] (QPSG). When the QPSG is active, ** a single SQL query statement will always use the same algorithm regardless @@ -2127,7 +2133,7 @@ struct sqlite3_mem_methods { ** following this call. **
** -**
SQLITE_DBCONFIG_TRIGGER_EQP
+** [[SQLITE_DBCONFIG_TRIGGER_EQP]]
SQLITE_DBCONFIG_TRIGGER_EQP
**
By default, the output of EXPLAIN QUERY PLAN commands does not ** include output for any operations performed by trigger programs. This ** option is used to set or clear (the default) a flag that governs this @@ -2139,7 +2145,7 @@ struct sqlite3_mem_methods { ** it is not disabled, 1 if it is. **
** -**
SQLITE_DBCONFIG_RESET_DATABASE
+** [[SQLITE_DBCONFIG_RESET_DATABASE]]
SQLITE_DBCONFIG_RESET_DATABASE
**
Set the SQLITE_DBCONFIG_RESET_DATABASE flag and then run ** [VACUUM] in order to reset a database back to an empty database ** with no schema and no content. The following process works even for @@ -2158,6 +2164,18 @@ struct sqlite3_mem_methods { ** Because resetting a database is destructive and irreversible, the ** process requires the use of this obscure API and multiple steps to help ** ensure that it does not happen by accident. +** +** [[SQLITE_DBCONFIG_DEFENSIVE]]
SQLITE_DBCONFIG_DEFENSIVE
+**
The SQLITE_DBCONFIG_DEFENSIVE option activates or deactivates the +** "defensive" flag for a database connection. When the defensive +** flag is enabled, language features that allow ordinary SQL to +** deliberately corrupt the database file are disabled. The disabled +** features include but are not limited to the following: +**
    +**
  • The [PRAGMA writable_schema=ON] statement. +**
  • Writes to the [sqlite_dbpage] virtual table. +**
  • Direct writes to [shadow tables]. +**
**
**
*/ @@ -2171,7 +2189,8 @@ struct sqlite3_mem_methods { #define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */ #define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */ #define SQLITE_DBCONFIG_RESET_DATABASE 1009 /* int int* */ -#define SQLITE_DBCONFIG_MAX 1009 /* Largest DBCONFIG */ +#define SQLITE_DBCONFIG_DEFENSIVE 1010 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1010 /* Largest DBCONFIG */ /* ** CAPI3REF: Enable Or Disable Extended Result Codes @@ -3609,9 +3628,19 @@ int sqlite3_limit(sqlite3*, int id, int newVal); ** on this hint by avoiding the use of [lookaside memory] so as not to ** deplete the limited store of lookaside memory. Future versions of ** SQLite may act on this hint differently. +** +** [[SQLITE_PREPARE_NORMALIZE]] ^(
SQLITE_PREPARE_NORMALIZE
+**
The SQLITE_PREPARE_NORMALIZE flag indicates that a normalized +** representation of the SQL statement should be calculated and then +** associated with the prepared statement, which can be obtained via +** the [sqlite3_normalized_sql()] interface.)^ The semantics used to +** normalize a SQL statement are unspecified and subject to change. +** At a minimum, literal values will be replaced with suitable +** placeholders. ** */ #define SQLITE_PREPARE_PERSISTENT 0x01 +#define SQLITE_PREPARE_NORMALIZE 0x02 /* ** CAPI3REF: Compiling An SQL Statement @@ -3769,6 +3798,11 @@ int sqlite3_prepare16_v3( ** ^The sqlite3_expanded_sql(P) interface returns a pointer to a UTF-8 ** string containing the SQL text of prepared statement P with ** [bound parameters] expanded. +** ^The sqlite3_normalized_sql(P) interface returns a pointer to a UTF-8 +** string containing the normalized SQL text of prepared statement P. The +** semantics used to normalize a SQL statement are unspecified and subject +** to change. At a minimum, literal values will be replaced with suitable +** placeholders. ** ** ^(For example, if a prepared statement is created using the SQL ** text "SELECT $abc,:xyz" and if parameter $abc is bound to integer 2345 @@ -3784,14 +3818,16 @@ int sqlite3_prepare16_v3( ** bound parameter expansions. ^The [SQLITE_OMIT_TRACE] compile-time ** option causes sqlite3_expanded_sql() to always return NULL. ** -** ^The string returned by sqlite3_sql(P) is managed by SQLite and is -** automatically freed when the prepared statement is finalized. +** ^The strings returned by sqlite3_sql(P) and sqlite3_normalized_sql(P) +** are managed by SQLite and are automatically freed when the prepared +** statement is finalized. ** ^The string returned by sqlite3_expanded_sql(P), on the other hand, ** is obtained from [sqlite3_malloc()] and must be free by the application ** by passing it to [sqlite3_free()]. */ const char *sqlite3_sql(sqlite3_stmt *pStmt); char *sqlite3_expanded_sql(sqlite3_stmt *pStmt); +const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt); /* ** CAPI3REF: Determine If An SQL Statement Writes The Database @@ -6281,6 +6317,9 @@ struct sqlite3_module { int (*xSavepoint)(sqlite3_vtab *pVTab, int); int (*xRelease)(sqlite3_vtab *pVTab, int); int (*xRollbackTo)(sqlite3_vtab *pVTab, int); + /* The methods above are in versions 1 and 2 of the sqlite_module object. + ** Those below are for version 3 and greater. */ + int (*xShadowName)(const char*); }; /* @@ -7203,6 +7242,7 @@ int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_OPTIMIZATIONS 15 #define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */ #define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */ +#define SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 17 #define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 #define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */ #define SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD 19 @@ -8615,6 +8655,7 @@ int sqlite3_vtab_config(sqlite3*, int op, ...); ** can use to customize and optimize their behavior. ** **
+** [[SQLITE_VTAB_CONSTRAINT_SUPPORT]] **
SQLITE_VTAB_CONSTRAINT_SUPPORT **
Calls of the form ** [sqlite3_vtab_config](db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X) are supported, diff --git a/src/sqlite3ext.h b/src/sqlite3ext.h index 35d9950..34c41fd 100644 --- a/src/sqlite3ext.h +++ b/src/sqlite3ext.h @@ -310,12 +310,15 @@ struct sqlite3_api_routines { int (*str_errcode)(sqlite3_str*); int (*str_length)(sqlite3_str*); char *(*str_value)(sqlite3_str*); + /* Version 3.25.0 and later */ int (*create_window_function)(sqlite3*,const char*,int,int,void*, void (*xStep)(sqlite3_context*,int,sqlite3_value**), void (*xFinal)(sqlite3_context*), void (*xValue)(sqlite3_context*), void (*xInv)(sqlite3_context*,int,sqlite3_value**), void(*xDestroy)(void*)); + /* Version 3.26.0 and later */ + const char *(*normalized_sql)(sqlite3_stmt*); }; /* @@ -603,6 +606,8 @@ typedef int (*sqlite3_loadext_entry)( #define sqlite3_str_value sqlite3_api->str_value /* Version 3.25.0 and later */ #define sqlite3_create_window_function sqlite3_api->create_window_function +/* Version 3.26.0 and later */ +#define sqlite3_normalized_sql sqlite3_api->normalized_sql #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 90d6456..051aa40 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1305,12 +1305,14 @@ struct LookasideSlot { ** functions use a regular table table from hash.h.) ** ** Hash each FuncDef structure into one of the FuncDefHash.a[] slots. -** Collisions are on the FuncDef.u.pHash chain. +** Collisions are on the FuncDef.u.pHash chain. Use the SQLITE_FUNC_HASH() +** macro to compute a hash on the function name. */ #define SQLITE_FUNC_HASH_SZ 23 struct FuncDefHash { FuncDef *a[SQLITE_FUNC_HASH_SZ]; /* Hash table for functions */ }; +#define SQLITE_FUNC_HASH(C,L) (((C)+(L))%SQLITE_FUNC_HASH_SZ) #ifdef SQLITE_USER_AUTHENTICATION /* @@ -1371,7 +1373,7 @@ struct sqlite3 { Db *aDb; /* All backends */ int nDb; /* Number of backends currently in use */ u32 mDbFlags; /* flags recording internal state */ - u32 flags; /* flags settable by pragmas. See below */ + u64 flags; /* flags settable by pragmas. See below */ i64 lastRowid; /* ROWID of most recent insert (see above) */ i64 szMmap; /* Default mmap_size setting */ u32 nSchemaLock; /* Do not reset the schema when non-zero */ @@ -1537,14 +1539,17 @@ struct sqlite3 { #define SQLITE_TriggerEQP 0x01000000 /* Show trigger EXPLAIN QUERY PLAN */ #define SQLITE_ResetDatabase 0x02000000 /* Reset the database */ #define SQLITE_LegacyAlter 0x04000000 /* Legacy ALTER TABLE behaviour */ +#define SQLITE_NoSchemaError 0x08000000 /* Do not report schema parse errors*/ +#define SQLITE_Defensive 0x10000000 /* Input SQL is likely hostile */ /* Flags used only if debugging */ +#define HI(X) ((u64)(X)<<32) #ifdef SQLITE_DEBUG -#define SQLITE_SqlTrace 0x08000000 /* Debug print SQL as it executes */ -#define SQLITE_VdbeListing 0x10000000 /* Debug listings of VDBE programs */ -#define SQLITE_VdbeTrace 0x20000000 /* True to trace VDBE execution */ -#define SQLITE_VdbeAddopTrace 0x40000000 /* Trace sqlite3VdbeAddOp() calls */ -#define SQLITE_VdbeEQP 0x80000000 /* Debug EXPLAIN QUERY PLAN */ +#define SQLITE_SqlTrace HI(0x0001) /* Debug print SQL as it executes */ +#define SQLITE_VdbeListing HI(0x0002) /* Debug listings of VDBE progs */ +#define SQLITE_VdbeTrace HI(0x0004) /* True to trace VDBE execution */ +#define SQLITE_VdbeAddopTrace HI(0x0008) /* Trace sqlite3VdbeAddOp() calls */ +#define SQLITE_VdbeEQP HI(0x0010) /* Debug EXPLAIN QUERY PLAN */ #endif /* @@ -1678,8 +1683,9 @@ struct FuncDestructor { ** single query - might change over time */ #define SQLITE_FUNC_AFFINITY 0x4000 /* Built-in affinity() function */ #define SQLITE_FUNC_OFFSET 0x8000 /* Built-in sqlite_offset() function */ -#define SQLITE_FUNC_WINDOW 0x10000 /* Built-in window-only function */ -#define SQLITE_FUNC_WINDOW_SIZE 0x20000 /* Requires partition size as arg. */ +#define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */ +#define SQLITE_FUNC_WINDOW_SIZE 0x20000 /* Requires partition size as arg. */ +#define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */ /* ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are @@ -1755,10 +1761,13 @@ struct FuncDestructor { #define AGGREGATE2(zName, nArg, arg, nc, xStep, xFinal, extraFlags) \ {nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|extraFlags, \ SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,xFinal,0,#zName, {0}} - #define WAGGREGATE(zName, nArg, arg, nc, xStep, xFinal, xValue, xInverse, f) \ {nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|f, \ SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,xValue,xInverse,#zName, {0}} +#define INTERNAL_FUNCTION(zName, nArg, xFunc) \ + {nArg, SQLITE_FUNC_INTERNAL|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \ + 0, 0, xFunc, 0, 0, 0, #zName, {0} } + /* ** All current savepoints are stored in a linked list starting at @@ -1943,6 +1952,9 @@ struct VTable { struct Table { char *zName; /* Name of the table or view */ Column *aCol; /* Information about each column */ +#ifdef SQLITE_ENABLE_NORMALIZE + Hash *pColHash; /* All columns indexed by name */ +#endif Index *pIndex; /* List of SQL indexes on this table. */ Select *pSelect; /* NULL for tables. Points to definition if a view. */ FKey *pFKey; /* Linked list of all foreign keys in this table */ @@ -1993,6 +2005,7 @@ struct Table { #define TF_StatsUsed 0x0100 /* Query planner decisions affected by ** Index.aiRowLogEst[] values */ #define TF_HasNotNull 0x0200 /* Contains NOT NULL constraints */ +#define TF_Shadow 0x0400 /* True for a shadow table */ /* ** Test to see whether or not a table is a virtual table. This is @@ -2279,6 +2292,12 @@ struct IndexSample { tRowcnt *anDLt; /* Est. number of distinct keys less than this sample */ }; +/* +** Possible values to use within the flags argument to sqlite3GetToken(). +*/ +#define SQLITE_TOKEN_QUOTED 0x1 /* Token is a quoted identifier. */ +#define SQLITE_TOKEN_KEYWORD 0x2 /* Token is a keyword. */ + /* ** Each token coming out of the lexer is an instance of ** this structure. Tokens are also used as part of an expression. @@ -2460,11 +2479,11 @@ struct Expr { ** TK_COLUMN: the value of p5 for OP_Column ** TK_AGG_FUNCTION: nesting depth */ AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */ - Table *pTab; /* Table for TK_COLUMN expressions. Can be NULL - ** for a column of an index on an expression */ -#ifndef SQLITE_OMIT_WINDOWFUNC - Window *pWin; /* Window definition for window functions */ -#endif + union { + Table *pTab; /* TK_COLUMN: Table containing column. Can be NULL + ** for a column of an index on an expression */ + Window *pWin; /* TK_FUNCTION: Window definition for the func */ + } y; }; /* @@ -2494,6 +2513,7 @@ struct Expr { #define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */ #define EP_Alias 0x400000 /* Is an alias for a result set column */ #define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ +#define EP_WinFunc 0x1000000 /* TK_FUNCTION with Expr.y.pWin set */ /* ** The EP_Propagate mask is a set of properties that automatically propagate @@ -3179,6 +3199,7 @@ struct AuthContext { */ #define OPFLAG_NCHANGE 0x01 /* OP_Insert: Set to update db->nChange */ /* Also used in P2 (not P5) of OP_Delete */ +#define OPFLAG_NOCHNG 0x01 /* OP_VColumn nochange for UPDATE */ #define OPFLAG_EPHEM 0x01 /* OP_Column: Ephemeral output is ok */ #define OPFLAG_LASTROWID 0x20 /* Set to update db->lastRowid */ #define OPFLAG_ISUPDATE 0x04 /* This OP_Insert is an sql UPDATE */ @@ -3397,6 +3418,7 @@ struct Sqlite3Config { int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ #endif int bLocaltimeFault; /* True to fail localtime() calls */ + int bInternalFunctions; /* Internal SQL functions are visible */ int iOnceResetThreshold; /* When to reset OP_Once counters */ u32 szSorterRef; /* Min size in bytes to use sorter-refs */ }; @@ -3650,6 +3672,7 @@ int sqlite3IsIdChar(u8); */ int sqlite3StrICmp(const char*,const char*); int sqlite3Strlen30(const char*); +#define sqlite3Strlen30NN(C) (strlen(C)&0x3fffffff) char *sqlite3ColumnType(Column*,char*); #define sqlite3StrNICmp sqlite3_strnicmp @@ -3766,6 +3789,7 @@ char *sqlite3VMPrintf(sqlite3*,const char*, va_list); void sqlite3TreeViewExpr(TreeView*, const Expr*, u8); void sqlite3TreeViewBareExprList(TreeView*, const ExprList*, const char*); void sqlite3TreeViewExprList(TreeView*, const ExprList*, u8, const char*); + void sqlite3TreeViewSrcList(TreeView*, const SrcList*); void sqlite3TreeViewSelect(TreeView*, const Select*, u8); void sqlite3TreeViewWith(TreeView*, const With*, u8); #ifndef SQLITE_OMIT_WINDOWFUNC @@ -3998,11 +4022,15 @@ int sqlite3ExprIsInteger(Expr*, int*); int sqlite3ExprCanBeNull(const Expr*); int sqlite3ExprNeedsNoAffinityChange(const Expr*, char); int sqlite3IsRowid(const char*); +#ifdef SQLITE_ENABLE_NORMALIZE +int sqlite3IsRowidN(const char*, int); +#endif void sqlite3GenerateRowDelete( Parse*,Table*,Trigger*,int,int,int,i16,u8,u8,u8,int); void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int, int*, int); int sqlite3GenerateIndexKey(Parse*, Index*, int, int, int, int*,Index*,int); void sqlite3ResolvePartIdxLabel(Parse*,int); +int sqlite3ExprReferencesUpdatedColumn(Expr*,int*,int); void sqlite3GenerateConstraintChecks(Parse*,Table*,int*,int,int,int,int, u8,u8,int,int*,int*,Upsert*); #ifdef SQLITE_ENABLE_NULL_TRIM @@ -4023,6 +4051,9 @@ ExprList *sqlite3ExprListDup(sqlite3*,ExprList*,int); SrcList *sqlite3SrcListDup(sqlite3*,SrcList*,int); IdList *sqlite3IdListDup(sqlite3*,IdList*); Select *sqlite3SelectDup(sqlite3*,Select*,int); +#ifdef SQLITE_ENABLE_NORMALIZE +FuncDef *sqlite3FunctionSearchN(int,const char*,int); +#endif void sqlite3InsertBuiltinFuncs(FuncDef*,int); FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,u8,u8); void sqlite3RegisterBuiltinFunctions(void); @@ -4180,6 +4211,7 @@ Expr *sqlite3ExprAddCollateToken(Parse *pParse, Expr*, const Token*, int); Expr *sqlite3ExprAddCollateString(Parse*,Expr*,const char*); Expr *sqlite3ExprSkipCollate(Expr*); int sqlite3CheckCollSeq(Parse *, CollSeq *); +int sqlite3WritableSchema(sqlite3*); int sqlite3CheckObjectName(Parse *, const char *); void sqlite3VdbeSetChanges(sqlite3 *, int); int sqlite3AddInt64(i64*,i64); @@ -4226,6 +4258,9 @@ void sqlite3AlterFunctions(void); void sqlite3AlterRenameTable(Parse*, SrcList*, Token*); void sqlite3AlterRenameColumn(Parse*, SrcList*, Token*, Token*); int sqlite3GetToken(const unsigned char *, int *); +#ifdef SQLITE_ENABLE_NORMALIZE +int sqlite3GetTokenNormalized(const unsigned char *, int *, int *); +#endif void sqlite3NestedParse(Parse*, const char*, ...); void sqlite3ExpirePreparedStatements(sqlite3*, int); int sqlite3CodeSubselect(Parse*, Expr *, int, int); @@ -4383,6 +4418,9 @@ sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*); int sqlite3VdbeParameterIndex(Vdbe*, const char*, int); int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *); void sqlite3ParserReset(Parse*); +#ifdef SQLITE_ENABLE_NORMALIZE +void sqlite3Normalize(Vdbe*, const char*, int, u8); +#endif int sqlite3Reprepare(Vdbe*); void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*); CollSeq *sqlite3BinaryCompareCollSeq(Parse *, Expr *, Expr *); diff --git a/src/test1.c b/src/test1.c index 7f30171..e2048cb 100644 --- a/src/test1.c +++ b/src/test1.c @@ -4218,6 +4218,7 @@ static int SQLITE_TCLAPI test_prepare_v2( char *zCopy = 0; /* malloc() copy of zSql */ int bytes; const char *zTail = 0; + const char **pzTail; sqlite3_stmt *pStmt = 0; char zBuf[50]; int rc; @@ -4242,7 +4243,8 @@ static int SQLITE_TCLAPI test_prepare_v2( zCopy = malloc(n); memcpy(zCopy, zSql, n); } - rc = sqlite3_prepare_v2(db, zCopy, bytes, &pStmt, objc>=5 ? &zTail : 0); + pzTail = objc>=5 ? &zTail : 0; + rc = sqlite3_prepare_v2(db, zCopy, bytes, &pStmt, pzTail); free(zCopy); zTail = &zSql[(zTail - zCopy)]; @@ -4269,6 +4271,79 @@ static int SQLITE_TCLAPI test_prepare_v2( return TCL_OK; } +/* +** Usage: sqlite3_prepare_v3 DB sql bytes flags ?tailvar? +** +** Compile up to bytes of the supplied SQL string using +** database handle and flags . The parameter is +** the name of a global variable that is set to the unused portion of +** (if any). A STMT handle is returned. +*/ +static int SQLITE_TCLAPI test_prepare_v3( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + sqlite3 *db; + const char *zSql; + char *zCopy = 0; /* malloc() copy of zSql */ + int bytes, flags; + const char *zTail = 0; + const char **pzTail; + sqlite3_stmt *pStmt = 0; + char zBuf[50]; + int rc; + + if( objc!=6 && objc!=5 ){ + Tcl_AppendResult(interp, "wrong # args: should be \"", + Tcl_GetString(objv[0]), " DB sql bytes flags tailvar", 0); + return TCL_ERROR; + } + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; + zSql = Tcl_GetString(objv[2]); + if( Tcl_GetIntFromObj(interp, objv[3], &bytes) ) return TCL_ERROR; + if( Tcl_GetIntFromObj(interp, objv[4], &flags) ) return TCL_ERROR; + + /* Instead of using zSql directly, make a copy into a buffer obtained + ** directly from malloc(). The idea is to make it easier for valgrind + ** to spot buffer overreads. */ + if( bytes>=0 ){ + zCopy = malloc(bytes); + memcpy(zCopy, zSql, bytes); + }else{ + int n = (int)strlen(zSql) + 1; + zCopy = malloc(n); + memcpy(zCopy, zSql, n); + } + pzTail = objc>=6 ? &zTail : 0; + rc = sqlite3_prepare_v3(db, zCopy, bytes, (unsigned int)flags,&pStmt,pzTail); + free(zCopy); + zTail = &zSql[(zTail - zCopy)]; + + assert(rc==SQLITE_OK || pStmt==0); + Tcl_ResetResult(interp); + if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR; + if( rc==SQLITE_OK && zTail && objc>=6 ){ + if( bytes>=0 ){ + bytes = bytes - (int)(zTail-zSql); + } + Tcl_ObjSetVar2(interp, objv[5], 0, Tcl_NewStringObj(zTail, bytes), 0); + } + if( rc!=SQLITE_OK ){ + assert( pStmt==0 ); + sqlite3_snprintf(sizeof(zBuf), zBuf, "(%d) ", rc); + Tcl_AppendResult(interp, zBuf, sqlite3_errmsg(db), 0); + return TCL_ERROR; + } + + if( pStmt ){ + if( sqlite3TestMakePointerStr(interp, zBuf, pStmt) ) return TCL_ERROR; + Tcl_AppendResult(interp, zBuf, 0); + } + return TCL_OK; +} + /* ** Usage: sqlite3_prepare_tkt3134 DB ** @@ -4676,6 +4751,25 @@ static int SQLITE_TCLAPI test_ex_sql( sqlite3_free(z); return TCL_OK; } +#ifdef SQLITE_ENABLE_NORMALIZE +static int SQLITE_TCLAPI test_norm_sql( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + sqlite3_stmt *pStmt; + + if( objc!=2 ){ + Tcl_WrongNumArgs(interp, 1, objv, "STMT"); + return TCL_ERROR; + } + + if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; + Tcl_SetResult(interp, (char *)sqlite3_normalized_sql(pStmt), TCL_VOLATILE); + return TCL_OK; +} +#endif /* SQLITE_ENABLE_NORMALIZE */ /* ** Usage: sqlite3_column_count STMT @@ -6235,7 +6329,7 @@ static int SQLITE_TCLAPI reset_prng_state( /* ** tclcmd: database_may_be_corrupt ** -** Indicate that database files might be corrupt. In other words, set the normal +** Indicate that database files might be corrupt. In other words, set the normal ** state of operation. */ static int SQLITE_TCLAPI database_may_be_corrupt( @@ -6250,8 +6344,9 @@ static int SQLITE_TCLAPI database_may_be_corrupt( /* ** tclcmd: database_never_corrupt ** -** Indicate that database files are always well-formed. This enables extra assert() -** statements that test conditions that are always true for well-formed databases. +** Indicate that database files are always well-formed. This enables +** extra assert() statements that test conditions that are always true +** for well-formed databases. */ static int SQLITE_TCLAPI database_never_corrupt( ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ @@ -6617,9 +6712,10 @@ static int SQLITE_TCLAPI test_test_control( const char *zName; int i; } aVerb[] = { - { "SQLITE_TESTCTRL_LOCALTIME_FAULT", SQLITE_TESTCTRL_LOCALTIME_FAULT }, - { "SQLITE_TESTCTRL_SORTER_MMAP", SQLITE_TESTCTRL_SORTER_MMAP }, - { "SQLITE_TESTCTRL_IMPOSTER", SQLITE_TESTCTRL_IMPOSTER }, + { "SQLITE_TESTCTRL_LOCALTIME_FAULT", SQLITE_TESTCTRL_LOCALTIME_FAULT }, + { "SQLITE_TESTCTRL_SORTER_MMAP", SQLITE_TESTCTRL_SORTER_MMAP }, + { "SQLITE_TESTCTRL_IMPOSTER", SQLITE_TESTCTRL_IMPOSTER }, + { "SQLITE_TESTCTRL_INTERNAL_FUNCTIONS", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS}, }; int iVerb; int iFlag; @@ -6637,6 +6733,7 @@ static int SQLITE_TCLAPI test_test_control( iFlag = aVerb[iVerb].i; switch( iFlag ){ + case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: case SQLITE_TESTCTRL_LOCALTIME_FAULT: { int val; if( objc!=3 ){ @@ -6644,7 +6741,7 @@ static int SQLITE_TCLAPI test_test_control( return TCL_ERROR; } if( Tcl_GetBooleanFromObj(interp, objv[2], &val) ) return TCL_ERROR; - sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, val); + sqlite3_test_control(iFlag, val); break; } @@ -7038,6 +7135,7 @@ static int SQLITE_TCLAPI tclLoadStaticExtensionCmd( extern int sqlite3_closure_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_csv_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_eval_init(sqlite3*,char**,const sqlite3_api_routines*); + extern int sqlite3_explain_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_fileio_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_fuzzer_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_ieee_init(sqlite3*,char**,const sqlite3_api_routines*); @@ -7062,6 +7160,7 @@ static int SQLITE_TCLAPI tclLoadStaticExtensionCmd( { "closure", sqlite3_closure_init }, { "csv", sqlite3_csv_init }, { "eval", sqlite3_eval_init }, + { "explain", sqlite3_explain_init }, { "fileio", sqlite3_fileio_init }, { "fuzzer", sqlite3_fuzzer_init }, { "ieee754", sqlite3_ieee_init }, @@ -7460,6 +7559,7 @@ static int SQLITE_TCLAPI test_sqlite3_db_config( { "QPSG", SQLITE_DBCONFIG_ENABLE_QPSG }, { "TRIGGER_EQP", SQLITE_DBCONFIG_TRIGGER_EQP }, { "RESET_DB", SQLITE_DBCONFIG_RESET_DATABASE }, + { "DEFENSIVE", SQLITE_DBCONFIG_DEFENSIVE }, }; int i; int v; @@ -7644,6 +7744,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ { "sqlite3_prepare", test_prepare ,0 }, { "sqlite3_prepare16", test_prepare16 ,0 }, { "sqlite3_prepare_v2", test_prepare_v2 ,0 }, + { "sqlite3_prepare_v3", test_prepare_v3 ,0 }, { "sqlite3_prepare_tkt3134", test_prepare_tkt3134, 0}, { "sqlite3_prepare16_v2", test_prepare16_v2 ,0 }, { "sqlite3_finalize", test_finalize ,0 }, @@ -7655,6 +7756,9 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ { "sqlite3_step", test_step ,0 }, { "sqlite3_sql", test_sql ,0 }, { "sqlite3_expanded_sql", test_ex_sql ,0 }, +#ifdef SQLITE_ENABLE_NORMALIZE + { "sqlite3_normalized_sql", test_norm_sql ,0 }, +#endif { "sqlite3_next_stmt", test_next_stmt ,0 }, { "sqlite3_stmt_readonly", test_stmt_readonly ,0 }, { "sqlite3_stmt_busy", test_stmt_busy ,0 }, diff --git a/src/test_config.c b/src/test_config.c index d1837d4..0500234 100644 --- a/src/test_config.c +++ b/src/test_config.c @@ -124,7 +124,7 @@ static void set_options(Tcl_Interp *interp){ STRINGVALUE(SQLITE_MAX_WORKER_THREADS), TCL_GLOBAL_ONLY ); -#if 1 /* def SQLITE_MEMDEBUG */ +#ifdef SQLITE_MEMDEBUG Tcl_SetVar2(interp, "sqlite_options", "memdebug", "1", TCL_GLOBAL_ONLY); #else Tcl_SetVar2(interp, "sqlite_options", "memdebug", "0", TCL_GLOBAL_ONLY); @@ -762,6 +762,12 @@ Tcl_SetVar2(interp, "sqlite_options", "mergesort", "1", TCL_GLOBAL_ONLY); Tcl_SetVar2(interp, "sqlite_options", "uri_00_error", "0", TCL_GLOBAL_ONLY); #endif +#if defined(SQLITE_ENABLE_NORMALIZE) + Tcl_SetVar2(interp, "sqlite_options", "normalize", "1", TCL_GLOBAL_ONLY); +#else + Tcl_SetVar2(interp, "sqlite_options", "normalize", "0", TCL_GLOBAL_ONLY); +#endif + #ifdef SQLITE_OMIT_WINDOWFUNC Tcl_SetVar2(interp, "sqlite_options", "windowfunc", "0", TCL_GLOBAL_ONLY); #else diff --git a/src/test_intarray.c b/src/test_intarray.c index ddfb13f..8c74a04 100644 --- a/src/test_intarray.c +++ b/src/test_intarray.c @@ -13,6 +13,10 @@ ** This file implements a read-only VIRTUAL TABLE that contains the ** content of a C-language array of integer values. See the corresponding ** header file for full details. +** +** This virtual table is used for internal testing of SQLite only. It is +** not recommended for use in production. For a similar virtual table that +** is production-ready, see the "carray" virtual table over in ext/misc. */ #include "test_intarray.h" #include @@ -315,7 +319,6 @@ static int SQLITE_TCLAPI test_intarray_create( rc = sqlite3_intarray_create(db, zName, &pArray); #endif if( rc!=SQLITE_OK ){ - assert( pArray==0 ); Tcl_AppendResult(interp, sqlite3ErrName(rc), (char*)0); return TCL_ERROR; } diff --git a/src/test_intarray.h b/src/test_intarray.h index cee55b5..116e3bd 100644 --- a/src/test_intarray.h +++ b/src/test_intarray.h @@ -13,6 +13,10 @@ ** This is the C-language interface definition for the "intarray" or ** integer array virtual table for SQLite. ** +** This virtual table is used for internal testing of SQLite only. It is +** not recommended for use in production. For a similar virtual table that +** is production-ready, see the "carray" virtual table over in ext/misc. +** ** The intarray virtual table is designed to facilitate using an ** array of integers as the right-hand side of an IN operator. So ** instead of doing a prepared statement like this: @@ -72,7 +76,10 @@ ** virtual table is dropped. Since the virtual tables are created in the ** TEMP database, they are automatically dropped when the database connection ** closes so the application does not normally need to take any special -** action to free the intarray objects. +** action to free the intarray objects. Because of the way virtual tables +** work and the (somewhat goofy) way that the intarray virtual table is +** implemented, it is not allowed to invoke sqlite3_intarray_create(D,N,P) +** more than once with the same D and N values. */ #include "sqlite3.h" #ifndef SQLITE_INTARRAY_H diff --git a/src/test_onefile.c b/src/test_onefile.c index 46c8bc9..037f4fb 100644 --- a/src/test_onefile.c +++ b/src/test_onefile.c @@ -560,6 +560,7 @@ static int fsCheckReservedLock(sqlite3_file *pFile, int *pResOut){ ** File control method. For custom operations on an fs-file. */ static int fsFileControl(sqlite3_file *pFile, int op, void *pArg){ + if( op==SQLITE_FCNTL_PRAGMA ) return SQLITE_NOTFOUND; return SQLITE_OK; } diff --git a/src/tokenize.c b/src/tokenize.c index 262144f..05ca86e 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -545,6 +545,73 @@ int sqlite3GetToken(const unsigned char *z, int *tokenType){ return i; } +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Return the length (in bytes) of the token that begins at z[0]. +** Store the token type in *tokenType before returning. If flags has +** SQLITE_TOKEN_NORMALIZE flag enabled, use the identifier token type +** for keywords. Add SQLITE_TOKEN_QUOTED to flags if the token was +** actually a quoted identifier. Add SQLITE_TOKEN_KEYWORD to flags +** if the token was recognized as a keyword; this is useful when the +** SQLITE_TOKEN_NORMALIZE flag is used, because it enables the caller +** to differentiate between a keyword being treated as an identifier +** (for normalization purposes) and an actual identifier. +*/ +int sqlite3GetTokenNormalized( + const unsigned char *z, + int *tokenType, + int *flags +){ + int n; + unsigned char iClass = aiClass[*z]; + if( iClass==CC_KYWD ){ + int i; + for(i=1; aiClass[z[i]]<=CC_KYWD; i++){} + if( IdChar(z[i]) ){ + /* This token started out using characters that can appear in keywords, + ** but z[i] is a character not allowed within keywords, so this must + ** be an identifier instead */ + i++; + while( IdChar(z[i]) ){ i++; } + *tokenType = TK_ID; + return i; + } + *tokenType = TK_ID; + n = keywordCode((char*)z, i, tokenType); + /* If the token is no longer considered to be an identifier, then it is a + ** keyword of some kind. Make the token back into an identifier and then + ** set the SQLITE_TOKEN_KEYWORD flag. Several non-identifier tokens are + ** used verbatim, including IN, IS, NOT, and NULL. */ + switch( *tokenType ){ + case TK_ID: { + /* do nothing, handled by caller */ + break; + } + case TK_IN: + case TK_IS: + case TK_NOT: + case TK_NULL: { + *flags |= SQLITE_TOKEN_KEYWORD; + break; + } + default: { + *tokenType = TK_ID; + *flags |= SQLITE_TOKEN_KEYWORD; + break; + } + } + }else{ + n = sqlite3GetToken(z, tokenType); + /* If the token is considered to be an identifier and the character class + ** of the first character is a quote, set the SQLITE_TOKEN_QUOTED flag. */ + if( *tokenType==TK_ID && (iClass==CC_QUOTE || iClass==CC_QUOTE2) ){ + *flags |= SQLITE_TOKEN_QUOTED; + } + } + return n; +} +#endif /* SQLITE_ENABLE_NORMALIZE */ + /* ** Run the parser on the given SQL string. The parser structure is ** passed in. An SQLITE_ status code is returned. If an error occurs diff --git a/src/treeview.c b/src/treeview.c index cde776d..16fe5c2 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -121,6 +121,42 @@ void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 moreToFollow){ } } +/* +** Generate a human-readable description of a SrcList object. +*/ +void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ + int i; + for(i=0; inSrc; i++){ + const struct SrcList_item *pItem = &pSrc->a[i]; + StrAccum x; + char zLine[100]; + sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); + sqlite3_str_appendf(&x, "{%d,*}", pItem->iCursor); + if( pItem->zDatabase ){ + sqlite3_str_appendf(&x, " %s.%s", pItem->zDatabase, pItem->zName); + }else if( pItem->zName ){ + sqlite3_str_appendf(&x, " %s", pItem->zName); + } + if( pItem->pTab ){ + sqlite3_str_appendf(&x, " tabname=%Q", pItem->pTab->zName); + } + if( pItem->zAlias ){ + sqlite3_str_appendf(&x, " (AS %s)", pItem->zAlias); + } + if( pItem->fg.jointype & JT_LEFT ){ + sqlite3_str_appendf(&x, " LEFT-JOIN"); + } + sqlite3StrAccumFinish(&x); + sqlite3TreeViewItem(pView, zLine, inSrc-1); + if( pItem->pSelect ){ + sqlite3TreeViewSelect(pView, pItem->pSelect, 0); + } + if( pItem->fg.isTabFunc ){ + sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:"); + } + sqlite3TreeViewPop(pView); + } +} /* ** Generate a human-readable description of a Select object. @@ -175,39 +211,9 @@ void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 moreToFollow){ } #endif if( p->pSrc && p->pSrc->nSrc ){ - int i; pView = sqlite3TreeViewPush(pView, (n--)>0); sqlite3TreeViewLine(pView, "FROM"); - for(i=0; ipSrc->nSrc; i++){ - struct SrcList_item *pItem = &p->pSrc->a[i]; - StrAccum x; - char zLine[100]; - sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); - sqlite3_str_appendf(&x, "{%d,*}", pItem->iCursor); - if( pItem->zDatabase ){ - sqlite3_str_appendf(&x, " %s.%s", pItem->zDatabase, pItem->zName); - }else if( pItem->zName ){ - sqlite3_str_appendf(&x, " %s", pItem->zName); - } - if( pItem->pTab ){ - sqlite3_str_appendf(&x, " tabname=%Q", pItem->pTab->zName); - } - if( pItem->zAlias ){ - sqlite3_str_appendf(&x, " (AS %s)", pItem->zAlias); - } - if( pItem->fg.jointype & JT_LEFT ){ - sqlite3_str_appendf(&x, " LEFT-JOIN"); - } - sqlite3StrAccumFinish(&x); - sqlite3TreeViewItem(pView, zLine, ipSrc->nSrc-1); - if( pItem->pSelect ){ - sqlite3TreeViewSelect(pView, pItem->pSelect, 0); - } - if( pItem->fg.isTabFunc ){ - sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:"); - } - sqlite3TreeViewPop(pView); - } + sqlite3TreeViewSrcList(pView, p->pSrc); sqlite3TreeViewPop(pView); } if( p->pWhere ){ @@ -497,7 +503,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ }else{ pFarg = pExpr->x.pList; #ifndef SQLITE_OMIT_WINDOWFUNC - pWin = pExpr->pWin; + pWin = pExpr->y.pWin; #else pWin = 0; #endif diff --git a/src/update.c b/src/update.c index 94e169f..70f4f67 100644 --- a/src/update.c +++ b/src/update.c @@ -79,6 +79,57 @@ void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ #endif } +/* +** Check to see if column iCol of index pIdx references any of the +** columns defined by aXRef and chngRowid. Return true if it does +** and false if not. This is an optimization. False-positives are a +** performance degradation, but false-negatives can result in a corrupt +** index and incorrect answers. +** +** aXRef[j] will be non-negative if column j of the original table is +** being updated. chngRowid will be true if the rowid of the table is +** being updated. +*/ +static int indexColumnIsBeingUpdated( + Index *pIdx, /* The index to check */ + int iCol, /* Which column of the index to check */ + int *aXRef, /* aXRef[j]>=0 if column j is being updated */ + int chngRowid /* true if the rowid is being updated */ +){ + i16 iIdxCol = pIdx->aiColumn[iCol]; + assert( iIdxCol!=XN_ROWID ); /* Cannot index rowid */ + if( iIdxCol>=0 ){ + return aXRef[iIdxCol]>=0; + } + assert( iIdxCol==XN_EXPR ); + assert( pIdx->aColExpr!=0 ); + assert( pIdx->aColExpr->a[iCol].pExpr!=0 ); + return sqlite3ExprReferencesUpdatedColumn(pIdx->aColExpr->a[iCol].pExpr, + aXRef,chngRowid); +} + +/* +** Check to see if index pIdx is a partial index whose conditional +** expression might change values due to an UPDATE. Return true if +** the index is subject to change and false if the index is guaranteed +** to be unchanged. This is an optimization. False-positives are a +** performance degradation, but false-negatives can result in a corrupt +** index and incorrect answers. +** +** aXRef[j] will be non-negative if column j of the original table is +** being updated. chngRowid will be true if the rowid of the table is +** being updated. +*/ +static int indexWhereClauseMightChange( + Index *pIdx, /* The index to check */ + int *aXRef, /* aXRef[j]>=0 if column j is being updated */ + int chngRowid /* true if the rowid is being updated */ +){ + if( pIdx->pPartIdxWhere==0 ) return 0; + return sqlite3ExprReferencesUpdatedColumn(pIdx->pPartIdxWhere, + aXRef, chngRowid); +} + /* ** Process an UPDATE statement. ** @@ -302,19 +353,18 @@ void sqlite3Update( /* There is one entry in the aRegIdx[] array for each index on the table ** being updated. Fill in aRegIdx[] with a register number that will hold ** the key for accessing each index. - ** - ** FIXME: Be smarter about omitting indexes that use expressions. */ for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ int reg; - if( chngKey || hasFK>1 || pIdx->pPartIdxWhere || pIdx==pPk ){ + if( chngKey || hasFK>1 || pIdx==pPk + || indexWhereClauseMightChange(pIdx,aXRef,chngRowid) + ){ reg = ++pParse->nMem; pParse->nMem += pIdx->nColumn; }else{ reg = 0; for(i=0; inKeyCol; i++){ - i16 iIdxCol = pIdx->aiColumn[i]; - if( iIdxCol<0 || aXRef[iIdxCol]>=0 ){ + if( indexColumnIsBeingUpdated(pIdx, i, aXRef, chngRowid) ){ reg = ++pParse->nMem; pParse->nMem += pIdx->nColumn; if( (onError==OE_Replace) @@ -863,7 +913,7 @@ static void updateVirtualTable( sqlite3ExprCode(pParse, pChanges->a[aXRef[i]].pExpr, regArg+2+i); }else{ sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, i, regArg+2+i); - sqlite3VdbeChangeP5(v, 1); /* Enable sqlite3_vtab_nochange() */ + sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG);/* Enable sqlite3_vtab_nochange() */ } } if( HasRowid(pTab) ){ diff --git a/src/vacuum.c b/src/vacuum.c index 04ad5e7..5fb0489 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -166,7 +166,8 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ saved_mTrace = db->mTrace; db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks; db->mDbFlags |= DBFLAG_PreferBuiltin | DBFLAG_Vacuum; - db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder | SQLITE_CountRows); + db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder + | SQLITE_Defensive | SQLITE_CountRows); db->mTrace = 0; zDbMain = db->aDb[iDb].zDbSName; diff --git a/src/vdbe.c b/src/vdbe.c index e57a197..14f3e1b 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2894,17 +2894,25 @@ case OP_MakeRecord: { if( nVarintdb->aLimit[SQLITE_LIMIT_LENGTH] ){ - goto too_big; - } /* Make sure the output register has a buffer large enough to store ** the new record. The output register (pOp->p3) is not allowed to ** be one of the input registers (because the following call to ** sqlite3VdbeMemClearAndResize() could clobber the value before it is used). */ - if( sqlite3VdbeMemClearAndResize(pOut, (int)nByte) ){ - goto no_mem; + if( nByte+nZero<=pOut->szMalloc ){ + /* The output register is already large enough to hold the record. + ** No error checks or buffer enlargement is required */ + pOut->z = pOut->zMalloc; + }else{ + /* Need to make sure that the output is not too big and then enlarge + ** the output register to hold the full result */ + if( nByte+nZero>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; + } + if( sqlite3VdbeMemClearAndResize(pOut, (int)nByte) ){ + goto no_mem; + } } zNewRecord = (u8 *)pOut->z; @@ -5760,7 +5768,7 @@ case OP_ParseSchema: { { zMaster = MASTER_NAME; initData.db = db; - initData.iDb = pOp->p1; + initData.iDb = iDb; initData.pzErrMsg = &p->zErrMsg; initData.mInitFlags = 0; zSql = sqlite3MPrintf(db, @@ -6957,10 +6965,11 @@ case OP_VFilter: { /* jump */ ** ** If the VColumn opcode is being used to fetch the value of ** an unchanging column during an UPDATE operation, then the P5 -** value is 1. Otherwise, P5 is 0. The P5 value is returned -** by sqlite3_vtab_nochange() routine and can be used -** by virtual table implementations to return special "no-change" -** marks which can be more efficient, depending on the virtual table. +** value is OPFLAG_NOCHNG. This will cause the sqlite3_vtab_nochange() +** function to return true inside the xColumn method of the virtual +** table implementation. The P5 column might also contain other +** bits (OPFLAG_LENGTHARG or OPFLAG_TYPEOFARG) but those bits are +** unused by OP_VColumn. */ case OP_VColumn: { sqlite3_vtab *pVtab; @@ -6982,7 +6991,8 @@ case OP_VColumn: { assert( pModule->xColumn ); memset(&sContext, 0, sizeof(sContext)); sContext.pOut = pDest; - if( pOp->p5 ){ + testcase( (pOp->p5 & OPFLAG_NOCHNG)==0 && pOp->p5!=0 ); + if( pOp->p5 & OPFLAG_NOCHNG ){ sqlite3VdbeMemSetNull(pDest); pDest->flags = MEM_Null|MEM_Zero; pDest->u.nZero = 0; diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 107e5ca..5c71992 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -406,6 +406,9 @@ struct Vdbe { yDbMask lockMask; /* Subset of btreeMask that requires a lock */ u32 aCounter[7]; /* Counters used by sqlite3_stmt_status() */ char *zSql; /* Text of the SQL statement that generated this */ +#ifdef SQLITE_ENABLE_NORMALIZE + char *zNormSql; /* Normalization of the associated SQL statement */ +#endif void *pFree; /* Free this when deleting the vdbe */ VdbeFrame *pFrame; /* Parent frame */ VdbeFrame *pDelFrame; /* List of frame objects to free on VM reset */ @@ -468,7 +471,9 @@ int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *); int sqlite3VdbeIdxKeyCompare(sqlite3*,VdbeCursor*,UnpackedRecord*,int*); int sqlite3VdbeIdxRowid(sqlite3*, BtCursor*, i64*); int sqlite3VdbeExec(Vdbe*); +#ifndef SQLITE_OMIT_EXPLAIN int sqlite3VdbeList(Vdbe*); +#endif int sqlite3VdbeHalt(Vdbe*); int sqlite3VdbeChangeEncoding(Mem *, int); int sqlite3VdbeMemTooBig(Mem*); @@ -507,7 +512,9 @@ int sqlite3VdbeMemFinalize(Mem*, FuncDef*); #ifndef SQLITE_OMIT_WINDOWFUNC int sqlite3VdbeMemAggValue(Mem*, Mem*, FuncDef*); #endif +#ifndef SQLITE_OMIT_EXPLAIN const char *sqlite3OpcodeName(int); +#endif int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve); int sqlite3VdbeMemClearAndResize(Mem *pMem, int n); int sqlite3VdbeCloseStatement(Vdbe *, int); diff --git a/src/vdbeapi.c b/src/vdbeapi.c index b21f70e..59327be 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1702,6 +1702,16 @@ char *sqlite3_expanded_sql(sqlite3_stmt *pStmt){ #endif } +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Return the normalized SQL associated with a prepared statement. +*/ +const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe *)pStmt; + return p ? p->zNormSql : 0; +} +#endif /* SQLITE_ENABLE_NORMALIZE */ + #ifdef SQLITE_ENABLE_PREUPDATE_HOOK /* ** Allocate and populate an UnpackedRecord structure based on the serialized diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 5ec3d13..f1496a3 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -64,6 +64,13 @@ void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n, u8 prepFlags){ } assert( p->zSql==0 ); p->zSql = sqlite3DbStrNDup(p->db, z, n); +#ifdef SQLITE_ENABLE_NORMALIZE + assert( p->zNormSql==0 ); + if( p->zSql && (prepFlags & SQLITE_PREPARE_NORMALIZE)!=0 ){ + sqlite3Normalize(p, p->zSql, n, prepFlags); + assert( p->zNormSql!=0 || p->db->mallocFailed ); + } +#endif } /* @@ -85,6 +92,11 @@ void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ zTmp = pA->zSql; pA->zSql = pB->zSql; pB->zSql = zTmp; +#ifdef SQLITE_ENABLE_NORMALIZE + zTmp = pA->zNormSql; + pA->zNormSql = pB->zNormSql; + pB->zNormSql = zTmp; +#endif pB->expmask = pA->expmask; pB->prepFlags = pA->prepFlags; memcpy(pB->aCounter, pA->aCounter, sizeof(pB->aCounter)); @@ -3156,6 +3168,9 @@ void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ vdbeFreeOpArray(db, p->aOp, p->nOp); sqlite3DbFree(db, p->aColName); sqlite3DbFree(db, p->zSql); +#ifdef SQLITE_ENABLE_NORMALIZE + sqlite3DbFree(db, p->zNormSql); +#endif #ifdef SQLITE_ENABLE_STMT_SCANSTATUS { int i; @@ -4557,7 +4572,9 @@ int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){ (void)getVarint32((u8*)m.z, szHdr); testcase( szHdr==3 ); testcase( szHdr==m.n ); - if( unlikely(szHdr<3 || (int)szHdr>m.n) ){ + testcase( szHdr>0x7fffffff ); + assert( m.n>=0 ); + if( unlikely(szHdr<3 || szHdr>(unsigned)m.n) ){ goto idx_rowid_corruption; } diff --git a/src/vdbemem.c b/src/vdbemem.c index d204dc8..db8fedd 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -377,7 +377,8 @@ int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){ assert( fg & MEM_Real ); sqlite3_snprintf(nByte, pMem->z, "%!.15g", pMem->u.r); } - pMem->n = sqlite3Strlen30(pMem->z); + assert( pMem->z!=0 ); + pMem->n = sqlite3Strlen30NN(pMem->z); pMem->enc = SQLITE_UTF8; pMem->flags |= MEM_Str|MEM_Term; if( bForce ) pMem->flags &= ~(MEM_Int|MEM_Real); diff --git a/src/vtab.c b/src/vtab.c index 7b459be..1b8d283 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -328,7 +328,6 @@ void sqlite3VtabBeginParse( Token *pModuleName, /* Name of the module for the virtual table */ int ifNotExists /* No error if the table already exists */ ){ - int iDb; /* The database the table is being created in */ Table *pTable; /* The new virtual table */ sqlite3 *db; /* Database connection */ @@ -338,8 +337,6 @@ void sqlite3VtabBeginParse( assert( 0==pTable->pIndex ); db = pParse->db; - iDb = sqlite3SchemaToIndex(db, pTable->pSchema); - assert( iDb>=0 ); assert( pTable->nModuleArg==0 ); addModuleArgument(db, pTable, sqlite3NameFromToken(db, pModuleName)); @@ -359,6 +356,8 @@ void sqlite3VtabBeginParse( ** The second call, to obtain permission to create the table, is made now. */ if( pTable->azModuleArg ){ + int iDb = sqlite3SchemaToIndex(db, pTable->pSchema); + assert( iDb>=0 ); /* The database the table is being created in */ sqlite3AuthCheck(pParse, SQLITE_CREATE_VTABLE, pTable->zName, pTable->azModuleArg[0], pParse->db->aDb[iDb].zDbSName); } @@ -1053,7 +1052,7 @@ FuncDef *sqlite3VtabOverloadFunction( /* Check to see the left operand is a column in a virtual table */ if( NEVER(pExpr==0) ) return pDef; if( pExpr->op!=TK_COLUMN ) return pDef; - pTab = pExpr->pTab; + pTab = pExpr->y.pTab; if( pTab==0 ) return pDef; if( !IsVirtual(pTab) ) return pDef; pVtab = sqlite3GetVTable(db, pTab)->pVtab; diff --git a/src/walker.c b/src/walker.c index b3d4cd8..c31d94f 100644 --- a/src/walker.c +++ b/src/walker.c @@ -55,8 +55,8 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; } #ifndef SQLITE_OMIT_WINDOWFUNC - if( !ExprHasProperty(pExpr, EP_Reduced) && pExpr->pWin ){ - Window *pWin = pExpr->pWin; + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + Window *pWin = pExpr->y.pWin; if( sqlite3WalkExprList(pWalker, pWin->pPartition) ) return WRC_Abort; if( sqlite3WalkExprList(pWalker, pWin->pOrderBy) ) return WRC_Abort; if( sqlite3WalkExpr(pWalker, pWin->pFilter) ) return WRC_Abort; diff --git a/src/where.c b/src/where.c index d8d577d..8e01660 100644 --- a/src/where.c +++ b/src/where.c @@ -854,7 +854,6 @@ static void constructAutomaticIndex( translateColumnToCopy(pParse, addrTop, pLevel->iTabCur, pTabItem->regResult, 1); sqlite3VdbeGoto(v, addrTop); - pTabItem->fg.viaCoroutine = 0; }else{ sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); VdbeCoverage(v); } @@ -1032,9 +1031,11 @@ static sqlite3_index_info *allocateIndexInfo( ** method of the virtual table with the sqlite3_index_info object that ** comes in as the 3rd argument to this function. ** -** If an error occurs, pParse is populated with an error message and a -** non-zero value is returned. Otherwise, 0 is returned and the output -** part of the sqlite3_index_info structure is left populated. +** If an error occurs, pParse is populated with an error message and an +** appropriate error code is returned. A return of SQLITE_CONSTRAINT from +** xBestIndex is not considered an error. SQLITE_CONSTRAINT indicates that +** the current configuration of "unusable" flags in sqlite3_index_info can +** not result in a valid plan. ** ** Whether or not an error is returned, it is the responsibility of the ** caller to eventually free p->idxStr if p->needToFreeIdxStr indicates @@ -1048,7 +1049,7 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ rc = pVtab->pModule->xBestIndex(pVtab, p); TRACE_IDX_OUTPUTS(p); - if( rc!=SQLITE_OK ){ + if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT ){ if( rc==SQLITE_NOMEM ){ sqlite3OomFault(pParse->db); }else if( !pVtab->zErrMsg ){ @@ -1059,19 +1060,7 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ } sqlite3_free(pVtab->zErrMsg); pVtab->zErrMsg = 0; - -#if 0 - /* This error is now caught by the caller. - ** Search for "xBestIndex malfunction" below */ - for(i=0; inConstraint; i++){ - if( !p->aConstraint[i].usable && p->aConstraintUsage[i].argvIndex>0 ){ - sqlite3ErrorMsg(pParse, - "table %s: xBestIndex returned an invalid plan", pTab->zName); - } - } -#endif - - return pParse->nErr; + return rc; } #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) */ @@ -2126,6 +2115,14 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ sqlite3 *db = pWInfo->pParse->db; int rc; + /* Stop the search once we hit the query planner search limit */ + if( pBuilder->iPlanLimit==0 ){ + WHERETRACE(0xffffffff,("=== query planner search limit reached ===\n")); + if( pBuilder->pOrSet ) pBuilder->pOrSet->n = 0; + return SQLITE_DONE; + } + pBuilder->iPlanLimit--; + /* If pBuilder->pOrSet is defined, then only keep track of the costs ** and prereqs. */ @@ -3136,7 +3133,17 @@ static int whereLoopAddVirtualOne( /* Invoke the virtual table xBestIndex() method */ rc = vtabBestIndex(pParse, pSrc->pTab, pIdxInfo); - if( rc ) return rc; + if( rc ){ + if( rc==SQLITE_CONSTRAINT ){ + /* If the xBestIndex method returns SQLITE_CONSTRAINT, that means + ** that the particular combination of parameters provided is unusable. + ** Make no entries in the loop table. + */ + WHERETRACE(0xffff, (" ^^^^--- non-viable plan rejected!\n")); + return SQLITE_OK; + } + return rc; + } mxTerm = -1; assert( pNew->nLSlot>=nConstraint ); @@ -3532,9 +3539,11 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ /* Loop over the tables in the join, from left to right */ pNew = pBuilder->pNew; whereLoopInit(pNew); + pBuilder->iPlanLimit = SQLITE_QUERY_PLANNER_LIMIT; for(iTab=0, pItem=pTabList->a; pItemiTab = iTab; + pBuilder->iPlanLimit += SQLITE_QUERY_PLANNER_LIMIT_INCR; pNew->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, pItem->iCursor); if( ((pItem->fg.jointype|priorJointype) & (JT_LEFT|JT_CROSS))!=0 ){ /* This condition is true when pItem is the FROM clause term on the @@ -3560,7 +3569,15 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ rc = whereLoopAddOr(pBuilder, mPrereq, mUnusable); } mPrior |= pNew->maskSelf; - if( rc || db->mallocFailed ) break; + if( rc || db->mallocFailed ){ + if( rc==SQLITE_DONE ){ + /* We hit the query planner search limit set by iPlanLimit */ + sqlite3_log(SQLITE_WARNING, "abbreviated query algorithm search"); + rc = SQLITE_OK; + }else{ + break; + } + } } whereLoopClear(db, pNew); diff --git a/src/whereInt.h b/src/whereInt.h index 8c87eff..209ac42 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -402,12 +402,33 @@ struct WhereLoopBuilder { int nRecValid; /* Number of valid fields currently in pRec */ #endif unsigned int bldFlags; /* SQLITE_BLDF_* flags */ + unsigned int iPlanLimit; /* Search limiter */ }; /* Allowed values for WhereLoopBuider.bldFlags */ #define SQLITE_BLDF_INDEXED 0x0001 /* An index is used */ #define SQLITE_BLDF_UNIQUE 0x0002 /* All keys of a UNIQUE index used */ +/* The WhereLoopBuilder.iPlanLimit is used to limit the number of +** index+constraint combinations the query planner will consider for a +** particular query. If this parameter is unlimited, then certain +** pathological queries can spend excess time in the sqlite3WhereBegin() +** routine. The limit is high enough that is should not impact real-world +** queries. +** +** SQLITE_QUERY_PLANNER_LIMIT is the baseline limit. The limit is +** increased by SQLITE_QUERY_PLANNER_LIMIT_INCR before each term of the FROM +** clause is processed, so that every table in a join is guaranteed to be +** able to propose a some index+constraint combinations even if the initial +** baseline limit was exhausted by prior tables of the join. +*/ +#ifndef SQLITE_QUERY_PLANNER_LIMIT +# define SQLITE_QUERY_PLANNER_LIMIT 20000 +#endif +#ifndef SQLITE_QUERY_PLANNER_LIMIT_INCR +# define SQLITE_QUERY_PLANNER_LIMIT_INCR 1000 +#endif + /* ** The WHERE clause processing routine has two halves. The ** first part does the start of the WHERE loop and the second diff --git a/src/wherecode.c b/src/wherecode.c index 65cbc4c..e371cb8 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -425,7 +425,7 @@ static Expr *removeUnindexableInClauseTerms( for(i=iEq; inLTerm; i++){ if( pLoop->aLTerm[i]->pExpr==pX ){ int iField = pLoop->aLTerm[i]->iField - 1; - assert( pOrigRhs->a[iField].pExpr!=0 ); + if( pOrigRhs->a[iField].pExpr==0 ) continue; /* Duplicate PK column */ pRhs = sqlite3ExprListAppend(pParse, pRhs, pOrigRhs->a[iField].pExpr); pOrigRhs->a[iField].pExpr = 0; assert( pOrigLhs->a[iField].pExpr!=0 ); @@ -1117,7 +1117,7 @@ static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ pExpr->op = TK_COLUMN; pExpr->iTable = pX->iIdxCur; pExpr->iColumn = pX->iIdxCol; - pExpr->pTab = 0; + pExpr->y.pTab = 0; return WRC_Prune; }else{ return WRC_Continue; diff --git a/src/whereexpr.c b/src/whereexpr.c index 808c0d2..dbb7f0d 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -281,7 +281,7 @@ static int isLikeOrGlob( ){ if( pLeft->op!=TK_COLUMN || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT - || IsVirtual(pLeft->pTab) /* Value might be numeric */ + || IsVirtual(pLeft->y.pTab) /* Value might be numeric */ ){ sqlite3ExprDelete(db, pPrefix); sqlite3ValueFree(pVal); @@ -382,7 +382,7 @@ static int isAuxiliaryVtabOperator( ** MATCH(expression,vtab_column) */ pCol = pList->a[1].pExpr; - if( pCol->op==TK_COLUMN && IsVirtual(pCol->pTab) ){ + if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){ for(i=0; iu.zToken, aOp[i].zOp)==0 ){ *peOp2 = aOp[i].eOp2; @@ -404,12 +404,12 @@ static int isAuxiliaryVtabOperator( ** with function names in an arbitrary case. */ pCol = pList->a[0].pExpr; - if( pCol->op==TK_COLUMN && IsVirtual(pCol->pTab) ){ + if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){ sqlite3_vtab *pVtab; sqlite3_module *pMod; void (*xNotUsed)(sqlite3_context*,int,sqlite3_value**); void *pNotUsed; - pVtab = sqlite3GetVTable(db, pCol->pTab)->pVtab; + pVtab = sqlite3GetVTable(db, pCol->y.pTab)->pVtab; assert( pVtab!=0 ); assert( pVtab->pModule!=0 ); pMod = (sqlite3_module *)pVtab->pModule; @@ -427,10 +427,10 @@ static int isAuxiliaryVtabOperator( int res = 0; Expr *pLeft = pExpr->pLeft; Expr *pRight = pExpr->pRight; - if( pLeft->op==TK_COLUMN && IsVirtual(pLeft->pTab) ){ + if( pLeft->op==TK_COLUMN && IsVirtual(pLeft->y.pTab) ){ res++; } - if( pRight && pRight->op==TK_COLUMN && IsVirtual(pRight->pTab) ){ + if( pRight && pRight->op==TK_COLUMN && IsVirtual(pRight->y.pTab) ){ res++; SWAP(Expr*, pLeft, pRight); } @@ -1382,6 +1382,7 @@ static void exprAnalyze( if( pExpr->op==TK_NOTNULL && pExpr->pLeft->op==TK_COLUMN && pExpr->pLeft->iColumn>=0 + && !ExprHasProperty(pExpr, EP_FromJoin) && OptimizationEnabled(db, SQLITE_Stat34) ){ Expr *pNewExpr; @@ -1573,6 +1574,7 @@ void sqlite3WhereTabFuncArgs( pArgs = pItem->u1.pFuncArg; if( pArgs==0 ) return; for(j=k=0; jnExpr; j++){ + Expr *pRhs; while( knCol && (pTab->aCol[k].colFlags & COLFLAG_HIDDEN)==0 ){k++;} if( k>=pTab->nCol ){ sqlite3ErrorMsg(pParse, "too many arguments on %s() - max %d", @@ -1583,9 +1585,10 @@ void sqlite3WhereTabFuncArgs( if( pColRef==0 ) return; pColRef->iTable = pItem->iCursor; pColRef->iColumn = k++; - pColRef->pTab = pTab; - pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef, - sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0)); + pColRef->y.pTab = pTab; + pRhs = sqlite3PExpr(pParse, TK_UPLUS, + sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0), 0); + pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef, pRhs); whereClauseInsert(pWC, pTerm, TERM_DYNAMIC); } } diff --git a/src/window.c b/src/window.c index ce51de7..f5deae9 100644 --- a/src/window.c +++ b/src/window.c @@ -624,12 +624,12 @@ static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){ switch( pExpr->op ){ case TK_FUNCTION: - if( pExpr->pWin==0 ){ + if( !ExprHasProperty(pExpr, EP_WinFunc) ){ break; }else{ Window *pWin; for(pWin=p->pWin; pWin; pWin=pWin->pNextWin){ - if( pExpr->pWin==pWin ){ + if( pExpr->y.pWin==pWin ){ assert( pWin->pOwner==pExpr ); return WRC_Prune; } @@ -746,7 +746,7 @@ static ExprList *exprListAppendList( */ int sqlite3WindowRewrite(Parse *pParse, Select *p){ int rc = SQLITE_OK; - if( p->pWin ){ + if( p->pWin && p->pPrior==0 ){ Vdbe *v = sqlite3GetVdbe(pParse); sqlite3 *db = pParse->db; Select *pSub = 0; /* The subquery */ @@ -959,11 +959,13 @@ windowAllocErr: */ void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){ if( p ){ + assert( p->op==TK_FUNCTION ); /* This routine is only called for the parser. If pWin was not ** allocated due to an OOM, then the parser would fail before ever ** invoking this routine */ if( ALWAYS(pWin) ){ - p->pWin = pWin; + p->y.pWin = pWin; + ExprSetProperty(p, EP_WinFunc); pWin->pOwner = p; if( p->flags & EP_Distinct ){ sqlite3ErrorMsg(pParse, @@ -2126,7 +2128,7 @@ static void windowCodeDefaultStep( */ Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ Window *pNew = 0; - if( p ){ + if( ALWAYS(p) ){ pNew = sqlite3DbMallocZero(db, sizeof(Window)); if( pNew ){ pNew->zName = sqlite3DbStrDup(db, p->zName); diff --git a/test/alter.test b/test/alter.test index 807a8f0..d20e5eb 100644 --- a/test/alter.test +++ b/test/alter.test @@ -684,6 +684,7 @@ do_test alter-8.2 { # alter-9.X - Special test: Make sure the sqlite_rename_column() and # rename_table() functions do not crash when handed bad input. # +sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 do_test alter-9.1 { execsql {SELECT SQLITE_RENAME_COLUMN(0,0,0,0,0,0,0,0,0)} } {{}} @@ -696,6 +697,14 @@ foreach {tn sql} { catch { execsql $sql } } 1 } +sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 + +# If the INTERNAL_FUNCTIONS test-control is disabled (which is the default), +# then the sqlite_rename_table() SQL function is not accessible to ordinary SQL. +# +do_catchsql_test alter-9.3 { + SELECT sqlite_rename_table(0,0,0,0,0,0,0); +} {1 {no such function: sqlite_rename_table}} #------------------------------------------------------------------------ # alter-10.X - Make sure ALTER TABLE works with multi-byte UTF-8 characters diff --git a/test/alter2.test b/test/alter2.test index 14be637..aae0061 100644 --- a/test/alter2.test +++ b/test/alter2.test @@ -64,6 +64,7 @@ proc alter_table {tbl sql {file_format 2}} { sqlite3 dbat test.db set s [string map {' ''} $sql] set t [string map {' ''} $tbl] + sqlite3_db_config dbat DEFENSIVE 0 dbat eval [subst { PRAGMA writable_schema = 1; UPDATE sqlite_master SET sql = '$s' WHERE name = '$t' AND type = 'table'; @@ -91,6 +92,7 @@ do_test alter2-1.0 { #----------------------------------------------------------------------- # Some basic tests to make sure short rows are handled. # +sqlite3_db_config db DEFENSIVE 0 do_test alter2-1.1 { execsql { CREATE TABLE abc(a, b); diff --git a/test/alterauth2.test b/test/alterauth2.test new file mode 100644 index 0000000..bd589cd --- /dev/null +++ b/test/alterauth2.test @@ -0,0 +1,98 @@ +# 2018 October 6 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#************************************************************************* +# + +set testdir [file dirname $argv0] + +source $testdir/tester.tcl + +# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. +ifcapable !altertable { + finish_test + return +} +set testprefix alterauth2 + +set ::auth [list] +proc xAuth {type args} { + lappend ::auth [concat $type [lrange $args 0 3]] + if {$type=="SQLITE_READ" && [lindex $args 0] == "t2"} breakpoint + return SQLITE_OK +} +db auth xAuth + +proc do_auth_test {tn sql authcode} { + set script " + set ::auth \[list\] + execsql {$sql} + lsort -unique \[set ::auth\] + " + + set normal [list {*}$authcode] + uplevel [list do_test $tn $script $normal] +} + +do_execsql_test 1.0 { + CREATE TABLE t1(a, b, c); + CREATE VIEW v1 AS SELECT * FROM t1; + CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN + DELETE FROM t1 WHERE a5Lp6n*D?_9uP?%&~ic>WUq13NI+)g{G4%8O(A@d9T3EjJK z;mRN2s_06=jVlrH2e?r|K{wvKB$H0TO*b9sTqf_{yquhucMtE*y>n}QXtH2?@6p4) z2@=K`z`8-e7@MO@(^Z*Efvj%G<52vsaE`4;H|Oc81Bc-wUg9pEVufy|%Fb)YZ#L03 z{mq@sbWBHIy`8T0(xA6?Wjzf{Cmgj_9LHa1;_`5Jkc~`2Kc@s;-?*0E3ur31u|bZo ztJ3ion@9_6yfrYfngr9FMaSV*G-!p&u79amKQW1%Tt6YyD9WPkR>%({V-t%>q~){7 z3$VzG1!vo|`6RL(_M^>Ku8qWdhTr&s&lJq;f6lL&@L}p4Xw+d;qY;X T(NJ|vhaS{X +#include +#include +#include +#include +#include +#include +#include "sqlite3.h" + +/* +** This is the is the SQL that is run against the database. +*/ +static const char *azSql[] = { + "PRAGMA integrity_check;", + "SELECT * FROM sqlite_master;", + "SELECT sum(length(name)) FROM dbstat;", + "UPDATE t1 SET b=a, a=b WHERE a=1 ){ + printf("************** nByte=%d ***************\n", (int)nByte); + fflush(stdout); + } + rc = sqlite3_open(0, &db); + if( rc ) return 1; + a = sqlite3_malloc64(nByte+1); + if( a==0 ) return 1; + memcpy(a, aData, nByte); + sqlite3_deserialize(db, "main", a, nByte, nByte, + SQLITE_DESERIALIZE_RESIZEABLE | + SQLITE_DESERIALIZE_FREEONCLOSE); + for(i=0; i=1 ){ + printf("%s\n", azSql[i]); + fflush(stdout); + } + sqlite3_exec(db, azSql[i], 0, 0, 0); + } + rc = sqlite3_close(db); + if( rc!=SQLITE_OK ){ + fprintf(stdout, "sqlite3_close() returns %d\n", rc); + } + if( sqlite3_memory_used()!=0 ){ + int nAlloc = 0; + int nNotUsed = 0; + sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &nAlloc, &nNotUsed, 0); + fprintf(stderr,"Memory leak: %lld bytes in %d allocations\n", + sqlite3_memory_used(), nAlloc); + exit(1); + } + return 0; +} + +/* libFuzzer invokes this routine once when the executable starts, to +** process the command-line arguments. +*/ +int LLVMFuzzerInitialize(int *pArgc, char ***pArgv){ + int i, j; + int argc = *pArgc; + char **newArgv; + char **argv = *pArgv; + newArgv = malloc( sizeof(char*)*(argc+1) ); + if( newArgv==0 ) return 0; + newArgv[0] = argv[0]; + for(i=j=1; i10000; UPDATE t1_segments @@ -225,6 +226,7 @@ foreach {tn setup} { execsql { CREATE VIRTUAL TABLE t1 USING FTS4 } foreach doc $data { execsql { INSERT INTO t1 VALUES($doc) } } add_empty_records 1000 + sqlite3_db_config db DEFENSIVE 0 execsql $zero_long_doclists } 4 { @@ -233,6 +235,7 @@ foreach {tn setup} { foreach doc $data { execsql { INSERT INTO t1 VALUES($doc) } } add_empty_records 1000 execsql "INSERT INTO t1(t1) VALUES('optimize')" + sqlite3_db_config db DEFENSIVE 0 execsql $zero_long_doclists } 5 { @@ -240,6 +243,7 @@ foreach {tn setup} { execsql { CREATE VIRTUAL TABLE t1 USING FTS4(matchinfo=fts3) } foreach doc $data { execsql { INSERT INTO t1 VALUES($doc) } } add_empty_records 1000 + sqlite3_db_config db DEFENSIVE 0 execsql $zero_long_doclists } } { diff --git a/test/fts3defer2.test b/test/fts3defer2.test index 275e0f0..46b62b9 100644 --- a/test/fts3defer2.test +++ b/test/fts3defer2.test @@ -46,6 +46,7 @@ do_execsql_test 1.1.4 { INSERT INTO t1 VALUES(''); INSERT INTO t1(t1) VALUES('optimize'); } +sqlite3_db_config db DEFENSIVE 0 do_execsql_test 1.1.4 { SELECT count(*) FROM t1_segments WHERE length(block)>10000; UPDATE t1_segments SET block = zeroblob(length(block)) WHERE length(block)>10000; @@ -98,6 +99,7 @@ foreach {tn sql} { WHERE length(block)>10000; } } { + sqlite3_db_config db DEFENSIVE 0 execsql $sql do_execsql_test 2.2.$tn.1 { @@ -152,6 +154,7 @@ foreach {tn sql} { WHERE length(block)>10000; } } { + sqlite3_db_config db DEFENSIVE 0 execsql $sql do_execsql_test 2.4.$tn { SELECT docid, mit(matchinfo(t3, 'pcxnal')) FROM t3 WHERE t3 MATCH '"a b c"'; diff --git a/test/fts3matchinfo.test b/test/fts3matchinfo.test index 8cbcd69..af0b1cd 100644 --- a/test/fts3matchinfo.test +++ b/test/fts3matchinfo.test @@ -278,6 +278,7 @@ do_matchinfo_test 4.3.6 t5 {t5 MATCH 'a OR b'} { s {1 2 1 1} } do_execsql_test 4.4.0.1 { INSERT INTO t5(t5) VALUES('optimize') } ifcapable fts4_deferred { + sqlite3_db_config db DEFENSIVE 0 do_execsql_test 4.4.0.2 { UPDATE t5_segments SET block = zeroblob(length(block)) @@ -339,6 +340,7 @@ do_execsql_test 6.1 { SELECT offsets(t9) FROM t9 WHERE t9 MATCH 'to'; } {{0 0 20 2 0 0 27 2}} +sqlite3_db_config db DEFENSIVE 0 do_catchsql_test 6.2 { UPDATE t9_content SET c0content = 'this record is used to'; SELECT offsets(t9) FROM t9 WHERE t9 MATCH 'to'; @@ -392,6 +394,7 @@ do_execsql_test 8.3 { } {{204 1 3 3 0} {204 1 3 3 0} {204 1 3 3 0}} # Corruption related tests. +sqlite3_db_config db DEFENSIVE 0 do_execsql_test 8.4.1.1 { UPDATE t11_stat SET value = X'0000'; } do_catchsql_test 8.5.1.2 { SELECT mit(matchinfo(t11, 'nxa')) FROM t11 WHERE t11 MATCH 'a*' diff --git a/test/fts3misc.test b/test/fts3misc.test index 8020472..60126dd 100644 --- a/test/fts3misc.test +++ b/test/fts3misc.test @@ -160,6 +160,7 @@ ifcapable fts4_deferred { do_execsql_test 4.2 { SELECT quote(value) from t4_stat where id=0 } {X'C03EC0B204C0A608'} + sqlite3_db_config db DEFENSIVE 0 do_execsql_test 4.3 { UPDATE t4_stat SET value = X'C03EC0B204C0A60800' WHERE id=0; } diff --git a/test/fts3query.test b/test/fts3query.test index bc25699..ca3ee66 100644 --- a/test/fts3query.test +++ b/test/fts3query.test @@ -167,6 +167,7 @@ do_select_tests 5.3 -errorformat { 3 "SELECT snippet(content) FROM t2 WHERE t2 MATCH 'history'" snippet 4 "SELECT optimize(content) FROM t2 WHERE t2 MATCH 'history'" optimize } +sqlite3_db_config db DEFENSIVE 0 do_execsql_test 5.4.0 { UPDATE t2_content SET c0content = X'1234' } do_select_tests 5.4 -errorformat { illegal first argument to %s diff --git a/test/fts3snippet.test b/test/fts3snippet.test index 887011c..4a0b787 100644 --- a/test/fts3snippet.test +++ b/test/fts3snippet.test @@ -184,6 +184,7 @@ foreach {DO_MALLOC_TEST enc} { [list 0 0 $off 10 1 0 $off 10] [list 0 0 $off 10] # Test a corruption case: + sqlite3_db_config db DEFENSIVE 0 execsql { UPDATE ft_content SET c1b = 'hello world' WHERE c1b = $numbers } do_error_test $T.2.3 { SELECT offsets(ft) FROM ft WHERE ft MATCH 'onehundred' diff --git a/test/fts4check.test b/test/fts4check.test index 1e2f6b2..c94c359 100644 --- a/test/fts4check.test +++ b/test/fts4check.test @@ -66,6 +66,7 @@ foreach {tn disruption} { ); } } { + sqlite3_db_config db DEFENSIVE 0 do_execsql_test 1.2.1.$tn "BEGIN; $disruption" do_catchsql_test 1.2.2.$tn { INSERT INTO t1 (t1) VALUES('integrity-check') @@ -100,6 +101,7 @@ foreach {tn disruption} { ); } } { + sqlite3_db_config db DEFENSIVE 0 do_execsql_test 2.2.1.$tn "BEGIN; $disruption" do_catchsql_test 2.2.2.$tn { INSERT INTO t2 (t2) VALUES('integrity-check') @@ -145,6 +147,7 @@ foreach {tn disruption} { ) } } { + sqlite3_db_config db DEFENSIVE 0 do_execsql_test 3.2.1.$tn "BEGIN; $disruption" do_catchsql_test 3.2.2.$tn { INSERT INTO t3 (t3) VALUES('integrity-check') @@ -163,6 +166,7 @@ do_execsql_test 4.0 { INSERT INTO t4(t4) VALUES('integrity-check'); } +sqlite3_db_config db DEFENSIVE 0 do_execsql_test 4.1 { PRAGMA writable_schema = 1; UPDATE sqlite_master @@ -197,6 +201,7 @@ do_execsql_test 5.1 { INSERT INTO t5(t5) VALUES('integrity-check'); } {} +sqlite3_db_config db DEFENSIVE 0 do_catchsql_test 5.2 { INSERT INTO t5_content VALUES(5, 'his hardy mountain pony'); INSERT INTO t5(t5) VALUES('integrity-check'); diff --git a/test/fts4growth.test b/test/fts4growth.test index 4dc2212..5cf8777 100644 --- a/test/fts4growth.test +++ b/test/fts4growth.test @@ -25,6 +25,7 @@ ifcapable !fts3 { source $testdir/genesis.tcl +sqlite3_db_config db DEFENSIVE 0 do_execsql_test 1.1 { CREATE VIRTUAL TABLE x1 USING fts3; } do_test 1.2 { diff --git a/test/fts4merge.test b/test/fts4merge.test index 63272c4..48661af 100644 --- a/test/fts4merge.test +++ b/test/fts4merge.test @@ -156,6 +156,7 @@ foreach mod {fts3 fts4} { SELECT quote(value) FROM t4_stat WHERE rowid=1 } {X'0006'} + sqlite3_db_config db DEFENSIVE 0 do_execsql_test 4.4.2 { DELETE FROM t4_stat WHERE rowid=1; INSERT INTO t4(t4) VALUES('merge=1,12'); diff --git a/test/fts4opt.test b/test/fts4opt.test index 0d0ed9f..4b3d003 100644 --- a/test/fts4opt.test +++ b/test/fts4opt.test @@ -37,6 +37,7 @@ fts_kjv_genesis # incremental optimize routine. # proc prepare_for_optimize {db tbl} { + sqlite3_db_config $db DEFENSIVE 0 $db eval [string map [list % $tbl] { BEGIN; CREATE TEMP TABLE tmp_segdir( diff --git a/test/fuzz_malloc.test b/test/fuzz_malloc.test index 531da55..4449ea8 100644 --- a/test/fuzz_malloc.test +++ b/test/fuzz_malloc.test @@ -17,11 +17,6 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl -ifcapable !memdebug { - finish_test - return -} - source $testdir/malloc_common.tcl source $testdir/fuzz_common.tcl diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 85126e1..005f59b 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -405,7 +405,10 @@ static void blobListFree(Blob *p){ static sqlite3_int64 timeOfDay(void){ static sqlite3_vfs *clockVfs = 0; sqlite3_int64 t; - if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0); + if( clockVfs==0 ){ + clockVfs = sqlite3_vfs_find(0); + if( clockVfs==0 ) return 0; + } if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){ clockVfs->xCurrentTimeInt64(clockVfs, &t); }else{ @@ -866,6 +869,7 @@ int main(int argc, char **argv){ sqlite3_vfs *pDfltVfs; /* The default VFS */ int openFlags4Data; /* Flags for sqlite3_open_v2() */ + sqlite3_initialize(); iBegin = timeOfDay(); #ifdef __unix__ signal(SIGALRM, timeoutHandler); diff --git a/test/fuzzdata7.db b/test/fuzzdata7.db new file mode 100644 index 0000000000000000000000000000000000000000..69469f9fcd82b97ffa85c1573763db763fb623ff GIT binary patch literal 16369664 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

@HpD4}}ZeyMLGEw{S3riO& zWEVD$RnRgFjf1t>z~E~ApWZ~IC&5D(BLW{kwsf&Vc3xwwQj;DYzlhbT6avP;i{o&* zeEAhnyW6X&B=+f!0Cew72XrTp?rsWt)YdW#Z<7P7Wn*LUHMp`!EM=sptQ;#84a=A; zVAH-;(+w8FhpQGLU7J`Rsgew%g#r|rcj?0k9RdB)DSCL8V$#G)jOS8X!H?zIYM;=E zjr~_>#OBEA$ylHNa|xlBnBTyEA`rOcu+sY!a&HRG;EZERH>T-=cEi}E&-_vUHmy2% zo3Z-}MZ>~_xKsChvU9Na=MRkjr{n>`J_&WZFDzZ6kXur~{}~%}9M>)tD83Wb7STd( z%Q*kLRISTnm-%11jKBvSA`lh=pO{m6ze09Lv1d1+HhUc7wlPhY8n7S3>wVm;g%1%{ z`BN*=2_g9=rMPNL>Eg)O55PJGr35+hidsv^GjgMj8s}mGN|h$O=@}J`yA>SA2KWA7 zd%e*P1$$uLUr`Hcx^Pv`HHEJINzBQZwH$f5FyiXvz0kuNGZt*2;L8nptxqxy4}$y^ zy~#C5UcA5C%JM&noKEOQ@B+Ax=St(S1aqReMroOuAX0KlvVT{N)JSlNyLO_pKGj*e zR3Q(gz@U*hJp9FES?~3m^|49B8d}06a#63uLO!-V zlD@4cQqRZIdk0Gs3i;{={n6HI>^Pj-ON|r`KXo%oNCzkcRkee5Q%~AKwe&;0@X-N) z$?Lr5oYH!Qd}U$lf|$>I{OzT6FbS=Tq>R4Q$n0_!#8_OlZ8O7iwgh_3SlsVxPH&=l z587|+9UtwFefGjc6sgpiV=HcF!w#Ywr>3%cM3}4u}_GXRjP-)rwNZ}--YW>kWrniz&kSKByfB>?{9(Dl> zP-3`cYRvxr#E|P4k_^!Nf&ORws6>BCBo&`9XH$|?chNaZw zgTdShuN#k1g1=Tmu7*T*unal6r61c`+Mtk6M6-Sv3v`X;U&{JFrGHA`gD&|9>^!Tq zQ6YPJxf>5GQ9!ATy@jKzuyy1U&tXlYxH6Z9{6VOW5#kDoh z*($nAs|-H>Q}QvwKC!snA1-Zz-F??#i)QeLuUwIY7R~Hz>ZfO!j7&IN5(?BlkM#HU z=ghD144&pUtp9!7`nJ_wC-EE$FQEU^99W~aO1r)9?Ygvdxk7GUfkP8(2RJkdJjNqo z{r@aN&uZ_!E~NCk-d?&wAvZ<9KO%L`6h+&DmI-(MhxPw%zioes-xpi>J%7gop}lUs zNibmXtj%OQ-z6fTA z4bt#h+%aEN3H)Vt)+vv3H(gvk6r5>!84O)*nV6ii*w`VaxF9=oI;SHfnVk9T5#3BC z6SLB10sbXGufML7%(oIpwB~z~36w*wgb=Rb9qMR%GJNI0`Rb97 z`f1X&U;U`a#)ILdE+GfQJK&k7M{O&hZ&%?wYn(0=JPPPFySgZ#uPj{*76&D3QYwW4 z`Uu8m*r(rU&e>Tb*&5u?=+xsv#~@rTEA;G#l0aZW)iqZsp31FzKnjN!w*DuRlZf;V z@+J83=5Bmj>1u_1@)DQnS;S%%$SLOEOiNcO+pT+2PXRaGDd4WmUept>}9eZH<5DiHtr@oG*S)@6=dB5d{7QG zjUKCurVP{qH9a8&Cp)Lf4o63eCc}Blov%V3fRI|>w7O_Qx)!MEiJu#q{vY`wVV{J% z-RG9Bft|ufA^FcL3YYT(>DgMh^(07|LLU)LdzdTz|20D3(_U`3RJv9ndpmJBVfBu~ ziJ;*mM3P50nPBtF+kKn+KkX;*LFa_PuJcMoFb1#$hYN;MT84{l{r;^?57{gt3YAuc zI9%AZW>fzM8DJr6mPw2V-sdGmR+;oQN;|NH-FI&&!jei&M1cj3^nQ9b-3q&}+tUfr zqhrveO_z>m7wS

NH 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ðv^Ws)eO(=unB_pT4aY~Sa?`F+8hFA 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

hmUb*L#55ZXwLOx>q`+wz>qN|Cegwjl# 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