From fde8392888f5858ead2276971a0fa97d26fcbb66 Mon Sep 17 00:00:00 2001 From: swiftlyfalling Date: Mon, 4 Mar 2019 18:06:58 -0500 Subject: [PATCH 1/3] Update SQLite to 3.27.2 --- sqlite/Makefile.in | 43 +- sqlite/Makefile.msc | 25 +- sqlite/VERSION | 2 +- sqlite/autoconf/Makefile.msc | 2 + sqlite/configure | 18 +- sqlite/ext/expert/expert1.test | 6 +- sqlite/ext/fts3/fts3.c | 128 +- sqlite/ext/fts3/fts3Int.h | 14 + sqlite/ext/fts3/fts3_aux.c | 10 +- sqlite/ext/fts3/fts3_expr.c | 15 +- sqlite/ext/fts3/fts3_hash.c | 4 +- sqlite/ext/fts3/fts3_icu.c | 4 +- sqlite/ext/fts3/fts3_snippet.c | 64 +- sqlite/ext/fts3/fts3_term.c | 6 +- sqlite/ext/fts3/fts3_test.c | 31 +- sqlite/ext/fts3/fts3_tokenize_vtab.c | 2 +- sqlite/ext/fts3/fts3_unicode.c | 17 +- sqlite/ext/fts3/fts3_unicode2.c | 71 +- sqlite/ext/fts3/fts3_write.c | 47 +- sqlite/ext/fts3/unicode/mkunicode.tcl | 53 +- sqlite/ext/fts3/unicode/parseunicode.tcl | 31 +- sqlite/ext/fts5/fts5.h | 20 +- sqlite/ext/fts5/fts5Int.h | 28 +- sqlite/ext/fts5/fts5_aux.c | 20 +- sqlite/ext/fts5/fts5_buffer.c | 12 +- sqlite/ext/fts5/fts5_config.c | 8 +- sqlite/ext/fts5/fts5_expr.c | 55 +- sqlite/ext/fts5/fts5_hash.c | 22 +- sqlite/ext/fts5/fts5_index.c | 253 +- sqlite/ext/fts5/fts5_main.c | 302 +- sqlite/ext/fts5/fts5_storage.c | 25 +- sqlite/ext/fts5/fts5_test_mi.c | 4 +- sqlite/ext/fts5/fts5_test_tok.c | 6 +- sqlite/ext/fts5/fts5_tokenize.c | 37 +- sqlite/ext/fts5/fts5_unicode2.c | 82 +- sqlite/ext/fts5/fts5_varint.c | 3 +- sqlite/ext/fts5/fts5_vocab.c | 69 +- sqlite/ext/fts5/test/fts5aa.test | 3 +- sqlite/ext/fts5/test/fts5ai.test | 6 + sqlite/ext/fts5/test/fts5ak.test | 8 + sqlite/ext/fts5/test/fts5circref.test | 80 + sqlite/ext/fts5/test/fts5corrupt3.test | 7374 +++++++++++++++++++++- sqlite/ext/fts5/test/fts5interrupt.test | 67 + sqlite/ext/fts5/test/fts5tokenizer.test | 2 +- sqlite/ext/fts5/test/fts5umlaut.test | 65 + sqlite/ext/fts5/test/fts5unicode3.test | 24 +- sqlite/ext/fts5/test/fts5update.test | 38 + sqlite/ext/fts5/test/fts5vocab.test | 66 +- sqlite/ext/fts5/test/fts5vocab2.test | 39 +- sqlite/ext/misc/amatch.c | 10 +- sqlite/ext/misc/closure.c | 6 +- sqlite/ext/misc/csv.c | 2 +- sqlite/ext/misc/dbdump.c | 2 +- sqlite/ext/misc/eval.c | 2 +- sqlite/ext/misc/fileio.c | 45 +- sqlite/ext/misc/fuzzer.c | 16 +- sqlite/ext/misc/json1.c | 6 +- sqlite/ext/misc/memstat.c | 2 +- sqlite/ext/misc/memtrace.c | 108 + sqlite/ext/misc/mmapwarm.c | 1 - sqlite/ext/misc/nextchar.c | 4 +- sqlite/ext/misc/percentile.c | 2 +- sqlite/ext/misc/prefixes.c | 319 + sqlite/ext/misc/regexp.c | 6 +- sqlite/ext/misc/unionvtab.c | 8 +- sqlite/ext/misc/vfslog.c | 2 +- sqlite/ext/misc/zipfile.c | 24 +- sqlite/ext/rbu/rbu_common.tcl | 13 +- sqlite/ext/rbu/rbuvacuum2.test | 27 +- sqlite/ext/rbu/rbuvacuum3.test | 63 + sqlite/ext/rbu/sqlite3rbu.c | 13 +- sqlite/ext/rbu/sqlite3rbu.h | 6 +- sqlite/ext/rbu/test_rbu.c | 1 + sqlite/ext/rtree/geopoly.c | 95 +- sqlite/ext/rtree/rtree.c | 135 +- sqlite/ext/rtree/rtree1.test | 14 + sqlite/ext/rtree/rtree6.test | 13 + sqlite/ext/rtree/rtreecirc.test | 66 + sqlite/ext/rtree/rtreefuzz001.test | 777 +++ sqlite/ext/session/changeset.c | 6 +- sqlite/ext/session/changesetfuzz.c | 15 +- sqlite/ext/session/session_speed_test.c | 2 - sqlite/ext/session/sessionwor.test | 76 +- sqlite/ext/session/sqlite3session.c | 36 +- sqlite/ext/session/sqlite3session.h | 2 +- sqlite/main.mk | 31 +- sqlite/manifest | 427 +- sqlite/manifest.uuid | 2 +- sqlite/src/alter.c | 56 +- sqlite/src/analyze.c | 2 +- sqlite/src/attach.c | 15 +- sqlite/src/btree.c | 401 +- sqlite/src/btree.h | 1 + sqlite/src/btreeInt.h | 13 +- sqlite/src/build.c | 134 +- sqlite/src/callback.c | 21 +- sqlite/src/dbstat.c | 10 +- sqlite/src/delete.c | 8 +- sqlite/src/expr.c | 652 +- sqlite/src/fkey.c | 22 +- sqlite/src/func.c | 10 +- sqlite/src/global.c | 12 +- sqlite/src/hash.c | 56 - sqlite/src/insert.c | 72 +- sqlite/src/legacy.c | 5 +- sqlite/src/loadext.c | 2 +- sqlite/src/main.c | 68 +- sqlite/src/memdb.c | 46 +- sqlite/src/pager.c | 5 +- sqlite/src/parse.y | 43 +- sqlite/src/pcache1.c | 31 +- sqlite/src/pragma.c | 25 +- sqlite/src/pragma.h | 13 +- sqlite/src/prepare.c | 320 +- sqlite/src/printf.c | 199 +- sqlite/src/resolve.c | 174 +- sqlite/src/select.c | 107 +- sqlite/src/shell.c.in | 458 +- sqlite/src/sqlite.h.in | 53 +- sqlite/src/sqliteInt.h | 69 +- sqlite/src/tclsqlite.c | 55 +- sqlite/src/test1.c | 80 + sqlite/src/test_journal.c | 2 +- sqlite/src/test_vfs.c | 125 +- sqlite/src/tokenize.c | 211 +- sqlite/src/treeview.c | 3 +- sqlite/src/trigger.c | 5 +- sqlite/src/update.c | 11 +- sqlite/src/util.c | 7 +- sqlite/src/vacuum.c | 72 +- sqlite/src/vdbe.c | 148 +- sqlite/src/vdbe.h | 21 +- sqlite/src/vdbeInt.h | 30 +- sqlite/src/vdbeapi.c | 40 +- sqlite/src/vdbeaux.c | 214 +- sqlite/src/vdbemem.c | 13 +- sqlite/src/vtab.c | 2 + sqlite/src/walker.c | 31 +- sqlite/src/where.c | 65 +- sqlite/src/whereInt.h | 3 + sqlite/src/wherecode.c | 52 +- sqlite/src/whereexpr.c | 6 +- sqlite/src/window.c | 20 +- sqlite/test/altercol.test | 26 + sqlite/test/altertab.test | 53 + sqlite/test/altertab2.test | 263 +- sqlite/test/altertab3.test | 86 + sqlite/test/autoindex1.test | 8 +- sqlite/test/bestindex3.test | 18 +- sqlite/test/btree02.test | 18 +- sqlite/test/conflict.test | 12 +- sqlite/test/corruptL.test | 725 +++ sqlite/test/cost.test | 21 +- sqlite/test/csv01.test | 23 + sqlite/test/dbfuzz001.test | 374 ++ sqlite/test/dbfuzz2.c | 237 +- sqlite/test/e_select.test | 15 +- sqlite/test/eqp.test | 28 +- sqlite/test/fallocate.test | 9 + sqlite/test/fkey8.test | 34 + sqlite/test/fts3_common.tcl | 4 + sqlite/test/fts3aa.test | 11 + sqlite/test/fts3aux2.test | 24 + sqlite/test/fts3corrupt4.test | 2908 +++++++++ sqlite/test/fts3expr5.test | 19 + sqlite/test/fts3fault.test | 16 + sqlite/test/fts3fuzz001.test | 114 + sqlite/test/fts3snippet.test | 5 + sqlite/test/fts4umlaut.test | 64 + sqlite/test/fuzz4.test | 82 + sqlite/test/fuzzcheck.c | 550 +- sqlite/test/fuzzdata7.db | Bin 16369664 -> 16417792 bytes sqlite/test/fuzzdata8.db | Bin 0 -> 960512 bytes sqlite/test/in.test | 64 + sqlite/test/index6.test | 21 +- sqlite/test/indexexpr2.test | 47 + sqlite/test/insert.test | 9 + sqlite/test/insertfault.test | 36 + sqlite/test/join.test | 48 +- sqlite/test/join5.test | 18 +- sqlite/test/json101.test | 19 +- sqlite/test/lock_common.tcl | 10 +- sqlite/test/memdb1.test | 27 +- sqlite/test/misc1.test | 14 + sqlite/test/misc7.test | 3 + sqlite/test/normalize.test | 18 +- sqlite/test/ossfuzz.c | 5 + sqlite/test/permutations.test | 20 +- sqlite/test/prefixes.test | 88 + sqlite/test/releasetest.tcl | 1 + sqlite/test/resetdb.test | 8 +- sqlite/test/rowvalue4.test | 4 +- sqlite/test/select1.test | 21 +- sqlite/test/shell1.test | 2 +- sqlite/test/shell4.test | 10 +- sqlite/test/shmlock.test | 180 + sqlite/test/snapshot_fault.test | 25 + sqlite/test/tabfunc01.test | 5 + sqlite/test/tester.tcl | 10 +- sqlite/test/triggerC.test | 16 + sqlite/test/triggerF.test | 2 +- sqlite/test/unionvtab.test | 4 +- sqlite/test/update2.test | 16 + sqlite/test/vacuum-into.test | 90 + sqlite/test/vtabdrop.test | 127 + sqlite/test/wal.test | 90 +- sqlite/test/walfault2.test | 91 + sqlite/test/walvfs.test | 429 ++ sqlite/test/where.test | 12 + sqlite/test/where7.test | 6 +- sqlite/test/where9.test | 18 +- sqlite/test/whereI.test | 12 +- sqlite/test/window1.test | 127 + sqlite/test/with1.test | 47 + sqlite/test/with3.test | 2 +- sqlite/test/zeroblob.test | 11 + sqlite/tool/dbtotxt.c | 146 + sqlite/tool/dbtotxt.md | 56 + sqlite/tool/index_usage.c | 233 + sqlite/tool/lemon.c | 12 +- sqlite/tool/lempar.c | 26 +- sqlite/tool/mkpragmatab.tcl | 5 +- 222 files changed, 21259 insertions(+), 2794 deletions(-) create mode 100644 sqlite/ext/fts5/test/fts5circref.test create mode 100644 sqlite/ext/fts5/test/fts5interrupt.test create mode 100644 sqlite/ext/fts5/test/fts5umlaut.test create mode 100644 sqlite/ext/misc/memtrace.c create mode 100644 sqlite/ext/misc/prefixes.c create mode 100644 sqlite/ext/rbu/rbuvacuum3.test create mode 100644 sqlite/ext/rtree/rtreecirc.test create mode 100644 sqlite/ext/rtree/rtreefuzz001.test create mode 100644 sqlite/test/altertab3.test create mode 100644 sqlite/test/corruptL.test create mode 100644 sqlite/test/dbfuzz001.test create mode 100644 sqlite/test/fts3fuzz001.test create mode 100644 sqlite/test/fts4umlaut.test create mode 100644 sqlite/test/fuzz4.test create mode 100644 sqlite/test/fuzzdata8.db create mode 100644 sqlite/test/insertfault.test create mode 100644 sqlite/test/prefixes.test create mode 100644 sqlite/test/shmlock.test create mode 100644 sqlite/test/vacuum-into.test create mode 100644 sqlite/test/vtabdrop.test create mode 100644 sqlite/test/walfault2.test create mode 100644 sqlite/test/walvfs.test create mode 100644 sqlite/tool/dbtotxt.c create mode 100644 sqlite/tool/dbtotxt.md create mode 100644 sqlite/tool/index_usage.c diff --git a/sqlite/Makefile.in b/sqlite/Makefile.in index d2f97100..65530e33 100644 --- a/sqlite/Makefile.in +++ b/sqlite/Makefile.in @@ -452,6 +452,7 @@ TESTSRC += \ $(TOP)/ext/misc/nextchar.c \ $(TOP)/ext/misc/normalize.c \ $(TOP)/ext/misc/percentile.c \ + $(TOP)/ext/misc/prefixes.c \ $(TOP)/ext/misc/regexp.c \ $(TOP)/ext/misc/remember.c \ $(TOP)/ext/misc/series.c \ @@ -588,7 +589,8 @@ FUZZDATA = \ $(TOP)/test/fuzzdata4.db \ $(TOP)/test/fuzzdata5.db \ $(TOP)/test/fuzzdata6.db \ - $(TOP)/test/fuzzdata7.db + $(TOP)/test/fuzzdata7.db \ + $(TOP)/test/fuzzdata8.db # Standard options to testfixture # @@ -611,6 +613,12 @@ 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_OPT += -DSQLITE_ENABLE_DESERIALIZE +FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS4 +#FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS5 +FUZZCHECK_OPT += -DSQLITE_ENABLE_RTREE +FUZZCHECK_OPT += -DSQLITE_ENABLE_GEOPOLY +FUZZCHECK_OPT += -DSQLITE_ENABLE_DBSTAT_VTAB FUZZCHECK_SRC = $(TOP)/test/fuzzcheck.c $(TOP)/test/ossfuzz.c DBFUZZ_OPT = @@ -669,7 +677,7 @@ ossshell$(TEXE): $(TOP)/test/ossfuzz.c $(TOP)/test/ossshell.c sqlite3.c sqlite3. $(TOP)/test/ossfuzz.c sqlite3.c $(TLIBS) sessionfuzz$(TEXE): $(TOP)/test/sessionfuzz.c sqlite3.c sqlite3.h - $(CC) $(CFLAGS) -I. -o $@ $(TOP)/test/sessionfuzz.c $(TLIBS) + $(LTLINK) -o $@ $(TOP)/test/sessionfuzz.c $(TLIBS) dbfuzz$(TEXE): $(TOP)/test/dbfuzz.c sqlite3.c sqlite3.h $(LTLINK) -o $@ $(DBFUZZ_OPT) $(TOP)/test/dbfuzz.c sqlite3.c $(TLIBS) @@ -682,11 +690,26 @@ DBFUZZ2_OPTS = \ -DSQLITE_ENABLE_DBSTAT_VTAB \ -DSQLITE_ENABLE_RTREE \ -DSQLITE_ENABLE_FTS4 \ - -DSQLITE_EANBLE_FTS5 + -DSQLITE_ENABLE_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 +dbfuzz2$(TEXE): $(TOP)/test/dbfuzz2.c sqlite3.c sqlite3.h + $(CC) $(OPT_FEATURE_FLAGS) $(OPTS) -I. -g -O0 \ + -DSTANDALONE -o dbfuzz2 \ + $(DBFUZZ2_OPTS) $(TOP)/test/dbfuzz2.c sqlite3.c $(TLIBS) + mkdir -p dbfuzz2-dir + cp $(TOP)/test/dbfuzz2-seed* dbfuzz2-dir + +dbfuzz2-asan: $(TOP)/test/dbfuzz2.c sqlite3.c sqlite3.h + clang-6.0 $(OPT_FEATURE_FLAGS) $(OPTS) -I. -g -O0 \ + -fsanitize=fuzzer,undefined,address -o dbfuzz2-asan \ + $(DBFUZZ2_OPTS) $(TOP)/test/dbfuzz2.c sqlite3.c $(TLIBS) + mkdir -p dbfuzz2-dir + cp $(TOP)/test/dbfuzz2-seed* dbfuzz2-dir + +dbfuzz2-msan: $(TOP)/test/dbfuzz2.c sqlite3.c sqlite3.h + clang-6.0 $(OPT_FEATURE_FLAGS) $(OPTS) -I. -g -O0 \ + -fsanitize=fuzzer,undefined,memory -o dbfuzz2-msan \ + $(DBFUZZ2_OPTS) $(TOP)/test/dbfuzz2.c sqlite3.c $(TLIBS) mkdir -p dbfuzz2-dir cp $(TOP)/test/dbfuzz2-seed* dbfuzz2-dir @@ -1052,6 +1075,7 @@ SHELL_SRC = \ $(TOP)/ext/expert/sqlite3expert.c \ $(TOP)/ext/expert/sqlite3expert.h \ $(TOP)/ext/misc/zipfile.c \ + $(TOP)/ext/misc/memtrace.c \ $(TOP)/src/test_windirent.c shell.c: $(SHELL_SRC) $(TOP)/tool/mkshellc.tcl @@ -1189,6 +1213,7 @@ TESTFIXTURE_FLAGS += -DSQLITE_SERIES_CONSTRAINT_VERIFY=1 TESTFIXTURE_FLAGS += -DSQLITE_DEFAULT_PAGE_SIZE=1024 TESTFIXTURE_FLAGS += -DSQLITE_ENABLE_STMTVTAB TESTFIXTURE_FLAGS += -DSQLITE_ENABLE_DBPAGE_VTAB +TESTFIXTURE_FLAGS += -DSQLITE_ENABLE_DESERIALIZE TESTFIXTURE_SRC0 = $(TESTSRC2) libsqlite3.la TESTFIXTURE_SRC1 = sqlite3.c @@ -1291,6 +1316,9 @@ dbdump$(TEXE): $(TOP)/ext/misc/dbdump.c sqlite3.lo $(LTLINK) -DDBDUMP_STANDALONE -o $@ \ $(TOP)/ext/misc/dbdump.c sqlite3.lo $(TLIBS) +dbtotxt$(TEXE): $(TOP)/tool/dbtotxt.c + $(LTLINK)-o $@ $(TOP)/tool/dbtotxt.c + showdb$(TEXE): $(TOP)/tool/showdb.c sqlite3.lo $(LTLINK) -o $@ $(TOP)/tool/showdb.c sqlite3.lo $(TLIBS) @@ -1306,6 +1334,9 @@ showwal$(TEXE): $(TOP)/tool/showwal.c sqlite3.lo showshm$(TEXE): $(TOP)/tool/showshm.c $(LTLINK) -o $@ $(TOP)/tool/showshm.c +index_usage$(TEXE): $(TOP)/tool/index_usage.c sqlite3.lo + $(LTLINK) $(SHELL_OPT) -o $@ $(TOP)/tool/index_usage.c sqlite3.lo $(TLIBS) + changeset$(TEXE): $(TOP)/ext/session/changeset.c sqlite3.lo $(LTLINK) -o $@ $(TOP)/ext/session/changeset.c sqlite3.lo $(TLIBS) diff --git a/sqlite/Makefile.msc b/sqlite/Makefile.msc index e3feffab..b4fa372f 100644 --- a/sqlite/Makefile.msc +++ b/sqlite/Makefile.msc @@ -1527,6 +1527,7 @@ TESTEXT = \ $(TOP)\ext\misc\nextchar.c \ $(TOP)\ext\misc\normalize.c \ $(TOP)\ext\misc\percentile.c \ + $(TOP)\ext\misc\prefixes.c \ $(TOP)\ext\misc\regexp.c \ $(TOP)\ext\misc\remember.c \ $(TOP)\ext\misc\series.c \ @@ -1625,7 +1626,8 @@ FUZZDATA = \ $(TOP)\test\fuzzdata4.db \ $(TOP)\test\fuzzdata5.db \ $(TOP)\test\fuzzdata6.db \ - $(TOP)\test\fuzzdata7.db + $(TOP)\test\fuzzdata7.db \ + $(TOP)\test\fuzzdata8.db # <> # Additional compiler options for the shell. These are only effective @@ -1643,7 +1645,13 @@ SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_DESERIALIZE=1 # MPTESTER_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 FUZZERSHELL_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 -FUZZCHECK_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 -DSQLITE_OSS_FUZZ -DSQLITE_MAX_MEMORY=50000000 -DSQLITE_PRINTF_PRECISION_LIMIT=1000 +FUZZCHECK_OPTS = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 -DSQLITE_OSS_FUZZ -DSQLITE_MAX_MEMORY=50000000 -DSQLITE_PRINTF_PRECISION_LIMIT=1000 +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_DESERIALIZE +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_FTS4 +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_RTREE +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_GEOPOLY +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_DBSTAT_VTAB + FUZZCHECK_SRC = $(TOP)\test\fuzzcheck.c $(TOP)\test\ossfuzz.c OSSSHELL_SRC = $(TOP)\test\ossshell.c $(TOP)\test\ossfuzz.c DBFUZZ_COMPILE_OPTS = -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION @@ -1730,10 +1738,10 @@ dbfuzz.exe: $(TOP)\test\dbfuzz.c $(SQLITE3C) $(SQLITE3H) $(LTLINK) $(NO_WARN) $(DBFUZZ_COMPILE_OPTS) $(TOP)\test\dbfuzz.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) fuzzcheck.exe: $(FUZZCHECK_SRC) $(SQLITE3C) $(SQLITE3H) - $(LTLINK) $(NO_WARN) $(FUZZCHECK_COMPILE_OPTS) $(FUZZCHECK_SRC) $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) + $(LTLINK) $(NO_WARN) $(FUZZCHECK_OPTS) $(FUZZCHECK_SRC) $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) ossshell.exe: $(OSSSHELL_SRC) $(SQLITE3C) $(SQLITE3H) - $(LTLINK) $(NO_WARN) $(FUZZCHECK_COMPILE_OPTS) $(OSSSHELL_SRC) $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) + $(LTLINK) $(NO_WARN) $(FUZZCHECK_OPTS) $(OSSSHELL_SRC) $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) sessionfuzz.exe: zlib $(TOP)\test\sessionfuzz.c $(SQLITE3C) $(SQLITE3H) $(LTLINK) $(NO_WARN) -I$(ZLIBINCDIR) $(TOP)\test\sessionfuzz.c /link $(LDFLAGS) $(LTLINKOPTS) /LIBPATH:$(ZLIBLIBDIR) $(ZLIBLIB) @@ -2130,6 +2138,7 @@ SHELL_SRC = \ $(TOP)\ext\misc\completion.c \ $(TOP)\ext\expert\sqlite3expert.c \ $(TOP)\ext\expert\sqlite3expert.h \ + $(TOP)\ext\misc\memtrace.c \ $(TOP)\src\test_windirent.c # If use of zlib is enabled, add the "zipfile.c" source file. @@ -2298,6 +2307,7 @@ TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_DEFAULT_PAGE_SIZE=1024 TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_ENABLE_STMTVTAB=1 TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_ENABLE_DBPAGE_VTAB=1 TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_ENABLE_JSON1=1 +TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_ENABLE_DESERIALIZE=1 TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) $(TEST_CCONV_OPTS) TESTFIXTURE_SRC0 = $(TESTEXT) $(TESTSRC2) @@ -2425,6 +2435,9 @@ testloadext.lo: $(TOP)\src\test_loadext.c $(SQLITE3H) testloadext.dll: testloadext.lo $(LD) $(LDFLAGS) $(LTLINKOPTS) $(LTLIBPATHS) /DLL /OUT:$@ testloadext.lo +dbtotxt.exe: $(TOP)\tool\dbtotxt.c + $(LTLINK) $(NO_WARN) $(TOP)\tool\dbtotxt.c /link $(LDFLAGS) $(LTLINKOPTS) + showdb.exe: $(TOP)\tool\showdb.c $(SQLITE3C) $(SQLITE3H) $(LTLINK) $(NO_WARN) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ $(TOP)\tool\showdb.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) @@ -2444,6 +2457,10 @@ showwal.exe: $(TOP)\tool\showwal.c $(SQLITE3C) $(SQLITE3H) showshm.exe: $(TOP)\tool\showshm.c $(LTLINK) $(NO_WARN) $(TOP)\tool\showshm.c /link $(LDFLAGS) $(LTLINKOPTS) +index_usage.exe: $(TOP)\tool\index_usage.c $(SQLITE3C) $(SQLITE3H) + $(LTLINK) $(NO_WARN) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ + $(TOP)\tool\index_usage.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) + changeset.exe: $(TOP)\ext\session\changeset.c $(SQLITE3C) $(SQLITE3H) $(LTLINK) $(NO_WARN) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ -DSQLITE_ENABLE_SESSION=1 -DSQLITE_ENABLE_PREUPDATE_HOOK=1 \ diff --git a/sqlite/VERSION b/sqlite/VERSION index 419ede3b..8e6b2f2e 100644 --- a/sqlite/VERSION +++ b/sqlite/VERSION @@ -1 +1 @@ -3.26.0 +3.27.2 diff --git a/sqlite/autoconf/Makefile.msc b/sqlite/autoconf/Makefile.msc index 270c83c2..a131d4c6 100644 --- a/sqlite/autoconf/Makefile.msc +++ b/sqlite/autoconf/Makefile.msc @@ -283,6 +283,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 @@ -937,6 +938,7 @@ LIBRESOBJS = 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 diff --git a/sqlite/configure b/sqlite/configure index 51653aa5..ce6389ef 100755 --- a/sqlite/configure +++ b/sqlite/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.26.0. +# Generated by GNU Autoconf 2.69 for sqlite 3.27.2. # # # 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.26.0' -PACKAGE_STRING='sqlite 3.26.0' +PACKAGE_VERSION='3.27.2' +PACKAGE_STRING='sqlite 3.27.2' 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.26.0 to adapt to many kinds of systems. +\`configure' configures sqlite 3.27.2 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.26.0:";; + short | recursive ) echo "Configuration of sqlite 3.27.2:";; 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.26.0 +sqlite configure 3.27.2 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.26.0, which was +It was created by sqlite $as_me 3.27.2, 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.26.0, which was +This file was extended by sqlite $as_me 3.27.2, 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.26.0 +sqlite config.status 3.27.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/sqlite/ext/expert/expert1.test b/sqlite/ext/expert/expert1.test index 2b466834..912c074c 100644 --- a/sqlite/ext/expert/expert1.test +++ b/sqlite/ext/expert/expert1.test @@ -243,8 +243,10 @@ do_setup_rec_test $tn.12.1 { CREATE INDEX t7_idx_00000062 ON t7(b); CREATE INDEX t7_idx_00000061 ON t7(a); MULTI-INDEX OR - SEARCH TABLE t7 USING INDEX t7_idx_00000061 (a=?) - SEARCH TABLE t7 USING INDEX t7_idx_00000062 (b=?) + INDEX 1 + SEARCH TABLE t7 USING INDEX t7_idx_00000061 (a=?) + INDEX 2 + SEARCH TABLE t7 USING INDEX t7_idx_00000062 (b=?) } # rowid terms. diff --git a/sqlite/ext/fts3/fts3.c b/sqlite/ext/fts3/fts3.c index f6fb931d..bd0003d0 100644 --- a/sqlite/ext/fts3/fts3.c +++ b/sqlite/ext/fts3/fts3.c @@ -320,6 +320,14 @@ int sqlite3Fts3Never(int b) { assert( !b ); return b; } # endif #endif +/* +** This variable is set to false when running tests for which the on disk +** structures should not be corrupt. Otherwise, true. If it is false, extra +** assert() conditions in the fts3 code are activated - conditions that are +** only true if it is guaranteed that the fts3 database is not corrupt. +*/ +int sqlite3_fts3_may_be_corrupt = 1; + /* ** Write a 64-bit variable-length integer to memory starting at p[0]. ** The length of data written will be between 1 and FTS3_VARINT_MAX bytes. @@ -338,7 +346,7 @@ int sqlite3Fts3PutVarint(char *p, sqlite_int64 v){ } #define GETVARINT_STEP(v, ptr, shift, mask1, mask2, var, ret) \ - v = (v & mask1) | ( (*ptr++) << shift ); \ + v = (v & mask1) | ( (*(const unsigned char*)(ptr++)) << shift ); \ if( (v & mask2)==0 ){ var = v; return ret; } #define GETVARINT_INIT(v, ptr, shift, mask1, mask2, var, ret) \ v = (*ptr++); \ @@ -376,20 +384,21 @@ int sqlite3Fts3GetVarint(const char *pBuf, sqlite_int64 *v){ ** a non-negative 32-bit integer before it is returned. */ int sqlite3Fts3GetVarint32(const char *p, int *pi){ + const unsigned char *ptr = (const unsigned char*)p; u32 a; #ifndef fts3GetVarint32 - GETVARINT_INIT(a, p, 0, 0x00, 0x80, *pi, 1); + GETVARINT_INIT(a, ptr, 0, 0x00, 0x80, *pi, 1); #else - a = (*p++); + a = (*ptr++); assert( a & 0x80 ); #endif - GETVARINT_STEP(a, p, 7, 0x7F, 0x4000, *pi, 2); - GETVARINT_STEP(a, p, 14, 0x3FFF, 0x200000, *pi, 3); - GETVARINT_STEP(a, p, 21, 0x1FFFFF, 0x10000000, *pi, 4); + GETVARINT_STEP(a, ptr, 7, 0x7F, 0x4000, *pi, 2); + GETVARINT_STEP(a, ptr, 14, 0x3FFF, 0x200000, *pi, 3); + GETVARINT_STEP(a, ptr, 21, 0x1FFFFF, 0x10000000, *pi, 4); a = (a & 0x0FFFFFFF ); - *pi = (int)(a | ((u32)(*p & 0x07) << 28)); + *pi = (int)(a | ((u32)(*ptr & 0x07) << 28)); assert( 0==(a & 0x80000000) ); assert( *pi>=0 ); return 5; @@ -560,13 +569,18 @@ static int fts3DestroyMethod(sqlite3_vtab *pVtab){ sqlite3 *db = p->db; /* Database handle */ /* Drop the shadow tables */ - if( p->zContentTbl==0 ){ - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_content'", zDb, p->zName); - } - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_segments'", zDb,p->zName); - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_segdir'", zDb, p->zName); - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_docsize'", zDb, p->zName); - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_stat'", zDb, p->zName); + fts3DbExec(&rc, db, + "DROP TABLE IF EXISTS %Q.'%q_segments';" + "DROP TABLE IF EXISTS %Q.'%q_segdir';" + "DROP TABLE IF EXISTS %Q.'%q_docsize';" + "DROP TABLE IF EXISTS %Q.'%q_stat';" + "%s DROP TABLE IF EXISTS %Q.'%q_content';", + zDb, p->zName, + zDb, p->zName, + zDb, p->zName, + zDb, p->zName, + (p->zContentTbl ? "--" : ""), zDb,p->zName + ); /* If everything has worked, invoke fts3DisconnectMethod() to free the ** memory associated with the Fts3Table structure and return SQLITE_OK. @@ -798,10 +812,10 @@ static void fts3Appendf( ** memory. */ static char *fts3QuoteId(char const *zInput){ - int nRet; + sqlite3_int64 nRet; char *zRet; nRet = 2 + (int)strlen(zInput)*2 + 1; - zRet = sqlite3_malloc(nRet); + zRet = sqlite3_malloc64(nRet); if( zRet ){ int i; char *z = zRet; @@ -982,7 +996,7 @@ static int fts3PrefixParameter( } } - aIndex = sqlite3_malloc(sizeof(struct Fts3Index) * nIndex); + aIndex = sqlite3_malloc64(sizeof(struct Fts3Index) * nIndex); *apIndex = aIndex; if( !aIndex ){ return SQLITE_NOMEM; @@ -1061,7 +1075,7 @@ static int fts3ContentColumns( if( rc==SQLITE_OK ){ const char **azCol; /* Output array */ - int nStr = 0; /* Size of all column names (incl. 0x00) */ + sqlite3_int64 nStr = 0; /* Size of all column names (incl. 0x00) */ int nCol; /* Number of table columns */ int i; /* Used to iterate through columns */ @@ -1071,11 +1085,11 @@ static int fts3ContentColumns( nCol = sqlite3_column_count(pStmt); for(i=0; i0 ); if( bDescDoclist ){ - aOut = sqlite3_malloc(*pnRight + FTS3_VARINT_MAX); + aOut = sqlite3_malloc64((sqlite3_int64)*pnRight + FTS3_VARINT_MAX); if( aOut==0 ) return SQLITE_NOMEM; }else{ aOut = aRight; @@ -2782,6 +2810,7 @@ static int fts3TermSelectMerge( pTS->anOutput[0] = nDoclist; if( pTS->aaOutput[0] ){ memcpy(pTS->aaOutput[0], aDoclist, nDoclist); + memset(&pTS->aaOutput[0][nDoclist], 0, FTS3_VARINT_MAX); }else{ return SQLITE_NOMEM; } @@ -2833,8 +2862,8 @@ static int fts3SegReaderCursorAppend( ){ if( (pCsr->nSegment%16)==0 ){ Fts3SegReader **apNew; - int nByte = (pCsr->nSegment + 16)*sizeof(Fts3SegReader*); - apNew = (Fts3SegReader **)sqlite3_realloc(pCsr->apSegment, nByte); + sqlite3_int64 nByte = (pCsr->nSegment + 16)*sizeof(Fts3SegReader*); + apNew = (Fts3SegReader **)sqlite3_realloc64(pCsr->apSegment, nByte); if( !apNew ){ sqlite3Fts3SegReaderFree(pNew); return SQLITE_NOMEM; @@ -2898,7 +2927,7 @@ static int fts3SegReaderCursor( /* If zTerm is not NULL, and this segment is not stored entirely on its ** root node, the range of leaves scanned can be reduced. Do this. */ - if( iStartBlock && zTerm ){ + if( iStartBlock && zTerm && zRoot ){ sqlite3_int64 *pi = (isPrefix ? &iLeavesEndBlock : 0); rc = fts3SelectLeaf(p, zTerm, nTerm, zRoot, nRoot, &iStartBlock, pi); if( rc!=SQLITE_OK ) goto finished; @@ -3840,7 +3869,6 @@ static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ Fts3Table *p = (Fts3Table*)pVtab; UNUSED_PARAMETER(iSavepoint); assert( p->inTransaction ); - assert( p->mxSavepoint >= iSavepoint ); TESTONLY( p->mxSavepoint = iSavepoint ); sqlite3Fts3PendingTermsClear(p); return SQLITE_OK; @@ -4615,9 +4643,10 @@ static int fts3EvalIncrPhraseNext( if( bEof==0 ){ int nList = 0; int nByte = a[p->nToken-1].nList; - char *aDoclist = sqlite3_malloc(nByte+1); + char *aDoclist = sqlite3_malloc(nByte+FTS3_BUFFER_PADDING); if( !aDoclist ) return SQLITE_NOMEM; memcpy(aDoclist, a[p->nToken-1].pList, nByte+1); + memset(&aDoclist[nByte], 0, FTS3_BUFFER_PADDING); for(i=0; i<(p->nToken-1); i++){ if( a[i].bIgnore==0 ){ @@ -5008,7 +5037,7 @@ static int fts3EvalStart(Fts3Cursor *pCsr){ if( rc==SQLITE_OK && nToken>1 && pTab->bFts4 ){ Fts3TokenAndCost *aTC; Fts3Expr **apOr; - aTC = (Fts3TokenAndCost *)sqlite3_malloc( + aTC = (Fts3TokenAndCost *)sqlite3_malloc64( sizeof(Fts3TokenAndCost) * nToken + sizeof(Fts3Expr *) * nOr * 2 ); @@ -5319,7 +5348,7 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR) ){ Fts3Expr *p; - int nTmp = 0; /* Bytes of temp space */ + sqlite3_int64 nTmp = 0; /* Bytes of temp space */ char *aTmp; /* Temp space for PoslistNearMerge() */ /* Allocate temporary working space. */ @@ -5328,7 +5357,7 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ nTmp += p->pRight->pPhrase->doclist.nList; } nTmp += p->pPhrase->doclist.nList; - aTmp = sqlite3_malloc(nTmp*2); + aTmp = sqlite3_malloc64(nTmp*2); if( !aTmp ){ *pRc = SQLITE_NOMEM; res = 0; @@ -5598,15 +5627,14 @@ static void fts3EvalRestart( ** found in Fts3Expr.pPhrase->doclist.pList for each of the phrase ** expression nodes. */ -static void fts3EvalUpdateCounts(Fts3Expr *pExpr){ +static void fts3EvalUpdateCounts(Fts3Expr *pExpr, int nCol){ if( pExpr ){ Fts3Phrase *pPhrase = pExpr->pPhrase; if( pPhrase && pPhrase->doclist.pList ){ int iCol = 0; char *p = pPhrase->doclist.pList; - assert( *p ); - while( 1 ){ + do{ u8 c = 0; int iCnt = 0; while( 0xFE & (*p | c) ){ @@ -5622,11 +5650,11 @@ static void fts3EvalUpdateCounts(Fts3Expr *pExpr){ if( *p==0x00 ) break; p++; p += fts3GetVarint32(p, &iCol); - } + }while( iColpLeft); - fts3EvalUpdateCounts(pExpr->pRight); + fts3EvalUpdateCounts(pExpr->pLeft, nCol); + fts3EvalUpdateCounts(pExpr->pRight, nCol); } } @@ -5670,7 +5698,7 @@ static int fts3EvalGatherStats( for(p=pRoot; p; p=p->pLeft){ Fts3Expr *pE = (p->eType==FTSQUERY_PHRASE?p:p->pRight); assert( pE->aMI==0 ); - pE->aMI = (u32 *)sqlite3_malloc(pTab->nColumn * 3 * sizeof(u32)); + pE->aMI = (u32 *)sqlite3_malloc64(pTab->nColumn * 3 * sizeof(u32)); if( !pE->aMI ) return SQLITE_NOMEM; memset(pE->aMI, 0, pTab->nColumn * 3 * sizeof(u32)); } @@ -5696,7 +5724,7 @@ static int fts3EvalGatherStats( ); if( rc==SQLITE_OK && pCsr->isEof==0 ){ - fts3EvalUpdateCounts(pRoot); + fts3EvalUpdateCounts(pRoot, pTab->nColumn); } } diff --git a/sqlite/ext/fts3/fts3Int.h b/sqlite/ext/fts3/fts3Int.h index 077bad7f..9436e169 100644 --- a/sqlite/ext/fts3/fts3Int.h +++ b/sqlite/ext/fts3/fts3Int.h @@ -95,6 +95,8 @@ SQLITE_EXTENSION_INIT3 */ #define FTS3_VARINT_MAX 10 +#define FTS3_BUFFER_PADDING 8 + /* ** FTS4 virtual tables may maintain multiple indexes - one index of all terms ** in the document set and zero or more prefix indexes. All indexes are stored @@ -127,6 +129,18 @@ SQLITE_EXTENSION_INIT3 #define POS_COLUMN (1) /* Column-list terminator */ #define POS_END (0) /* Position-list terminator */ +/* +** The assert_fts3_nc() macro is similar to the assert() macro, except that it +** is used for assert() conditions that are true only if it can be +** guranteed that the database is not corrupt. +*/ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) +extern int sqlite3_fts3_may_be_corrupt; +# define assert_fts3_nc(x) assert(sqlite3_fts3_may_be_corrupt || (x)) +#else +# define assert_fts3_nc(x) assert(x) +#endif + /* ** This section provides definitions to allow the ** FTS3 extension to be compiled outside of the diff --git a/sqlite/ext/fts3/fts3_aux.c b/sqlite/ext/fts3/fts3_aux.c index 54aea6f7..08edc00f 100644 --- a/sqlite/ext/fts3/fts3_aux.c +++ b/sqlite/ext/fts3/fts3_aux.c @@ -66,7 +66,7 @@ static int fts3auxConnectMethod( char const *zFts3; /* Name of fts3 table */ int nDb; /* Result of strlen(zDb) */ int nFts3; /* Result of strlen(zFts3) */ - int nByte; /* Bytes of space to allocate here */ + sqlite3_int64 nByte; /* Bytes of space to allocate here */ int rc; /* value returned by declare_vtab() */ Fts3auxTable *p; /* Virtual table object to return */ @@ -98,7 +98,7 @@ static int fts3auxConnectMethod( if( rc!=SQLITE_OK ) return rc; nByte = sizeof(Fts3auxTable) + sizeof(Fts3Table) + nDb + nFts3 + 2; - p = (Fts3auxTable *)sqlite3_malloc(nByte); + p = (Fts3auxTable *)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, nByte); @@ -248,7 +248,7 @@ static int fts3auxCloseMethod(sqlite3_vtab_cursor *pCursor){ static int fts3auxGrowStatArray(Fts3auxCursor *pCsr, int nSize){ if( nSize>pCsr->nStat ){ struct Fts3auxColstats *aNew; - aNew = (struct Fts3auxColstats *)sqlite3_realloc(pCsr->aStat, + aNew = (struct Fts3auxColstats *)sqlite3_realloc64(pCsr->aStat, sizeof(struct Fts3auxColstats) * nSize ); if( aNew==0 ) return SQLITE_NOMEM; @@ -416,15 +416,15 @@ static int fts3auxFilterMethod( assert( (iEq==0 && iGe==-1) || (iEq==-1 && iGe==0) ); if( zStr ){ pCsr->filter.zTerm = sqlite3_mprintf("%s", zStr); - pCsr->filter.nTerm = sqlite3_value_bytes(apVal[0]); if( pCsr->filter.zTerm==0 ) return SQLITE_NOMEM; + pCsr->filter.nTerm = (int)strlen(pCsr->filter.zTerm); } } if( iLe>=0 ){ pCsr->zStop = sqlite3_mprintf("%s", sqlite3_value_text(apVal[iLe])); - pCsr->nStop = sqlite3_value_bytes(apVal[iLe]); if( pCsr->zStop==0 ) return SQLITE_NOMEM; + pCsr->nStop = (int)strlen(pCsr->zStop); } if( iLangid>=0 ){ diff --git a/sqlite/ext/fts3/fts3_expr.c b/sqlite/ext/fts3/fts3_expr.c index 9f42b44a..5775fbca 100644 --- a/sqlite/ext/fts3/fts3_expr.c +++ b/sqlite/ext/fts3/fts3_expr.c @@ -122,8 +122,8 @@ static int fts3isspace(char c){ ** zero the memory before returning a pointer to it. If unsuccessful, ** return NULL. */ -static void *fts3MallocZero(int nByte){ - void *pRet = sqlite3_malloc(nByte); +static void *fts3MallocZero(sqlite3_int64 nByte){ + void *pRet = sqlite3_malloc64(nByte); if( pRet ) memset(pRet, 0, nByte); return pRet; } @@ -198,7 +198,7 @@ static int getNextToken( if( rc==SQLITE_OK ){ const char *zToken; int nToken = 0, iStart = 0, iEnd = 0, iPosition = 0; - int nByte; /* total space to allocate */ + sqlite3_int64 nByte; /* total space to allocate */ rc = pModule->xNext(pCursor, &zToken, &nToken, &iStart, &iEnd, &iPosition); if( rc==SQLITE_OK ){ @@ -252,8 +252,8 @@ static int getNextToken( ** Enlarge a memory allocation. If an out-of-memory allocation occurs, ** then free the old allocation. */ -static void *fts3ReallocOrFree(void *pOrig, int nNew){ - void *pRet = sqlite3_realloc(pOrig, nNew); +static void *fts3ReallocOrFree(void *pOrig, sqlite3_int64 nNew){ + void *pRet = sqlite3_realloc64(pOrig, nNew); if( !pRet ){ sqlite3_free(pOrig); } @@ -497,7 +497,6 @@ static int getNextNode( int nConsumed = 0; pParse->nNest++; rc = fts3ExprParse(pParse, zInput+1, nInput-1, ppExpr, &nConsumed); - if( rc==SQLITE_OK && !*ppExpr ){ rc = SQLITE_DONE; } *pnConsumed = (int)(zInput - z) + 1 + nConsumed; return rc; }else if( *zInput==')' ){ @@ -796,7 +795,7 @@ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ if( rc==SQLITE_OK ){ if( (eType==FTSQUERY_AND || eType==FTSQUERY_OR) ){ Fts3Expr **apLeaf; - apLeaf = (Fts3Expr **)sqlite3_malloc(sizeof(Fts3Expr *) * nMaxDepth); + apLeaf = (Fts3Expr **)sqlite3_malloc64(sizeof(Fts3Expr *) * nMaxDepth); if( 0==apLeaf ){ rc = SQLITE_NOMEM; }else{ @@ -1216,7 +1215,7 @@ static void fts3ExprTestCommon( zExpr = (const char *)sqlite3_value_text(argv[1]); nExpr = sqlite3_value_bytes(argv[1]); nCol = argc-2; - azCol = (char **)sqlite3_malloc(nCol*sizeof(char *)); + azCol = (char **)sqlite3_malloc64(nCol*sizeof(char *)); if( !azCol ){ sqlite3_result_error_nomem(context); goto exprtest_out; diff --git a/sqlite/ext/fts3/fts3_hash.c b/sqlite/ext/fts3/fts3_hash.c index 1a32a537..63e55b3d 100644 --- a/sqlite/ext/fts3/fts3_hash.c +++ b/sqlite/ext/fts3/fts3_hash.c @@ -35,8 +35,8 @@ /* ** Malloc and Free functions */ -static void *fts3HashMalloc(int n){ - void *p = sqlite3_malloc(n); +static void *fts3HashMalloc(sqlite3_int64 n){ + void *p = sqlite3_malloc64(n); if( p ){ memset(p, 0, n); } diff --git a/sqlite/ext/fts3/fts3_icu.c b/sqlite/ext/fts3/fts3_icu.c index 6f90e1eb..0848a5aa 100644 --- a/sqlite/ext/fts3/fts3_icu.c +++ b/sqlite/ext/fts3/fts3_icu.c @@ -60,7 +60,7 @@ static int icuCreate( if( argc>0 ){ n = strlen(argv[0])+1; } - p = (IcuTokenizer *)sqlite3_malloc(sizeof(IcuTokenizer)+n); + p = (IcuTokenizer *)sqlite3_malloc64(sizeof(IcuTokenizer)+n); if( !p ){ return SQLITE_NOMEM; } @@ -117,7 +117,7 @@ static int icuOpen( nInput = strlen(zInput); } nChar = nInput+1; - pCsr = (IcuCursor *)sqlite3_malloc( + pCsr = (IcuCursor *)sqlite3_malloc64( sizeof(IcuCursor) + /* IcuCursor */ ((nChar+3)&~3) * sizeof(UChar) + /* IcuCursor.aChar[] */ (nChar+1) * sizeof(int) /* IcuCursor.aOffset[] */ diff --git a/sqlite/ext/fts3/fts3_snippet.c b/sqlite/ext/fts3/fts3_snippet.c index a0771c0b..115e98ab 100644 --- a/sqlite/ext/fts3/fts3_snippet.c +++ b/sqlite/ext/fts3/fts3_snippet.c @@ -178,7 +178,7 @@ static void (*fts3MIBufferAlloc(MatchinfoBuffer *p, u32 **paOut))(void*){ aOut = &p->aMatchinfo[p->nElem+2]; xRet = fts3MIBufferFree; }else{ - aOut = (u32*)sqlite3_malloc(p->nElem * sizeof(u32)); + aOut = (u32*)sqlite3_malloc64(p->nElem * sizeof(u32)); if( aOut ){ xRet = sqlite3_free; if( p->bGlobal ) memcpy(aOut, &p->aMatchinfo[1], p->nElem*sizeof(u32)); @@ -433,7 +433,8 @@ static void fts3SnippetDetails( int j; u64 mPhrase = (u64)1 << i; u64 mPos = (u64)1 << (iCsr - iStart); - assert( iCsr>=iStart ); + assert( iCsr>=iStart && (iCsr - iStart)<=64 ); + assert( i>=0 && i<=64 ); if( (mCover|mCovered)&mPhrase ){ iScore++; }else{ @@ -475,11 +476,14 @@ static int fts3SnippetFindPositions(Fts3Expr *pExpr, int iPhrase, void *ctx){ int iFirst = 0; pPhrase->pList = pCsr; fts3GetDeltaPosition(&pCsr, &iFirst); - assert( iFirst>=0 ); - pPhrase->pHead = pCsr; - pPhrase->pTail = pCsr; - pPhrase->iHead = iFirst; - pPhrase->iTail = iFirst; + if( iFirst<0 ){ + rc = FTS_CORRUPT_VTAB; + }else{ + pPhrase->pHead = pCsr; + pPhrase->pTail = pCsr; + pPhrase->iHead = iFirst; + pPhrase->iTail = iFirst; + } }else{ assert( rc!=SQLITE_OK || ( pPhrase->pList==0 && pPhrase->pHead==0 && pPhrase->pTail==0 @@ -516,7 +520,7 @@ static int fts3BestSnippet( int rc; /* Return Code */ int nList; /* Number of phrases in expression */ SnippetIter sIter; /* Iterates through snippet candidates */ - int nByte; /* Number of bytes of space to allocate */ + sqlite3_int64 nByte; /* Number of bytes of space to allocate */ int iBestScore = -1; /* Best snippet score found so far */ int i; /* Loop counter */ @@ -534,7 +538,7 @@ static int fts3BestSnippet( ** the required space using malloc(). */ nByte = sizeof(SnippetPhrase) * nList; - sIter.aPhrase = (SnippetPhrase *)sqlite3_malloc(nByte); + sIter.aPhrase = (SnippetPhrase *)sqlite3_malloc64(nByte); if( !sIter.aPhrase ){ return SQLITE_NOMEM; } @@ -604,8 +608,8 @@ static int fts3StringAppend( ** appended data. */ if( pStr->n+nAppend+1>=pStr->nAlloc ){ - int nAlloc = pStr->nAlloc+nAppend+100; - char *zNew = sqlite3_realloc(pStr->z, nAlloc); + sqlite3_int64 nAlloc = pStr->nAlloc+(sqlite3_int64)nAppend+100; + char *zNew = sqlite3_realloc64(pStr->z, nAlloc); if( !zNew ){ return SQLITE_NOMEM; } @@ -660,6 +664,7 @@ static int fts3SnippetShift( for(nLeft=0; !(hlmask & ((u64)1 << nLeft)); nLeft++); for(nRight=0; !(hlmask & ((u64)1 << (nSnippet-1-nRight))); nRight++); + assert( (nSnippet-1-nRight)<=63 && (nSnippet-1-nRight)>=0 ); nDesired = (nLeft-nRight)/2; /* Ideally, the start of the snippet should be pushed forward in the @@ -852,7 +857,7 @@ static int fts3ColumnlistCount(char **ppCollist){ /* ** This function gathers 'y' or 'b' data for a single phrase. */ -static void fts3ExprLHits( +static int fts3ExprLHits( Fts3Expr *pExpr, /* Phrase expression node */ MatchInfo *p /* Matchinfo context */ ){ @@ -882,25 +887,29 @@ static void fts3ExprLHits( if( *pIter!=0x01 ) break; pIter++; pIter += fts3GetVarint32(pIter, &iCol); + if( iCol>=p->nCol ) return FTS_CORRUPT_VTAB; } + return SQLITE_OK; } /* ** Gather the results for matchinfo directives 'y' and 'b'. */ -static void fts3ExprLHitGather( +static int fts3ExprLHitGather( Fts3Expr *pExpr, MatchInfo *p ){ + int rc = SQLITE_OK; assert( (pExpr->pLeft==0)==(pExpr->pRight==0) ); if( pExpr->bEof==0 && pExpr->iDocid==p->pCursor->iPrevId ){ if( pExpr->pLeft ){ - fts3ExprLHitGather(pExpr->pLeft, p); - fts3ExprLHitGather(pExpr->pRight, p); + rc = fts3ExprLHitGather(pExpr->pLeft, p); + if( rc==SQLITE_OK ) rc = fts3ExprLHitGather(pExpr->pRight, p); }else{ - fts3ExprLHits(pExpr, p); + rc = fts3ExprLHits(pExpr, p); } } + return rc; } /* @@ -1117,11 +1126,12 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ int i; int iCol; int nToken = 0; + int rc = SQLITE_OK; /* Allocate and populate the array of LcsIterator objects. The array ** contains one element for each matchable phrase in the query. **/ - aIter = sqlite3_malloc(sizeof(LcsIterator) * pCsr->nPhrase); + aIter = sqlite3_malloc64(sizeof(LcsIterator) * pCsr->nPhrase); if( !aIter ) return SQLITE_NOMEM; memset(aIter, 0, sizeof(LcsIterator) * pCsr->nPhrase); (void)fts3ExprIterate(pCsr->pExpr, fts3MatchinfoLcsCb, (void*)aIter); @@ -1137,13 +1147,16 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ int nLive = 0; /* Number of iterators in aIter not at EOF */ for(i=0; inPhrase; i++){ - int rc; LcsIterator *pIt = &aIter[i]; rc = sqlite3Fts3EvalPhrasePoslist(pCsr, pIt->pExpr, iCol, &pIt->pRead); - if( rc!=SQLITE_OK ) return rc; + if( rc!=SQLITE_OK ) goto matchinfo_lcs_out; if( pIt->pRead ){ pIt->iPos = pIt->iPosOffset; - fts3LcsIteratorAdvance(&aIter[i]); + fts3LcsIteratorAdvance(pIt); + if( pIt->pRead==0 ){ + rc = FTS_CORRUPT_VTAB; + goto matchinfo_lcs_out; + } nLive++; } } @@ -1175,8 +1188,9 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ pInfo->aMatchinfo[iCol] = nLcs; } + matchinfo_lcs_out: sqlite3_free(aIter); - return SQLITE_OK; + return rc; } /* @@ -1272,7 +1286,7 @@ static int fts3MatchinfoValues( case FTS3_MATCHINFO_LHITS: { int nZero = fts3MatchinfoSize(pInfo, zArg[i]) * sizeof(u32); memset(pInfo->aMatchinfo, 0, nZero); - fts3ExprLHitGather(pCsr->pExpr, pInfo); + rc = fts3ExprLHitGather(pCsr->pExpr, pInfo); break; } @@ -1424,6 +1438,10 @@ void sqlite3Fts3Snippet( return; } + /* Limit the snippet length to 64 tokens. */ + if( nToken<-64 ) nToken = -64; + if( nToken>+64 ) nToken = +64; + for(nSnippet=1; 1; nSnippet++){ int iSnip; /* Loop counter 0..nSnippet-1 */ @@ -1566,7 +1584,7 @@ void sqlite3Fts3Offsets( if( rc!=SQLITE_OK ) goto offsets_out; /* Allocate the array of TermOffset iterators. */ - sCtx.aTerm = (TermOffset *)sqlite3_malloc(sizeof(TermOffset)*nToken); + sCtx.aTerm = (TermOffset *)sqlite3_malloc64(sizeof(TermOffset)*nToken); if( 0==sCtx.aTerm ){ rc = SQLITE_NOMEM; goto offsets_out; diff --git a/sqlite/ext/fts3/fts3_term.c b/sqlite/ext/fts3/fts3_term.c index aaa24042..e8372190 100644 --- a/sqlite/ext/fts3/fts3_term.c +++ b/sqlite/ext/fts3/fts3_term.c @@ -68,9 +68,9 @@ static int fts3termConnectMethod( char const *zFts3; /* Name of fts3 table */ int nDb; /* Result of strlen(zDb) */ int nFts3; /* Result of strlen(zFts3) */ - int nByte; /* Bytes of space to allocate here */ + sqlite3_int64 nByte; /* Bytes of space to allocate here */ int rc; /* value returned by declare_vtab() */ - Fts3termTable *p; /* Virtual table object to return */ + Fts3termTable *p; /* Virtual table object to return */ int iIndex = 0; UNUSED_PARAMETER(pCtx); @@ -96,7 +96,7 @@ static int fts3termConnectMethod( if( rc!=SQLITE_OK ) return rc; nByte = sizeof(Fts3termTable) + sizeof(Fts3Table) + nDb + nFts3 + 2; - p = (Fts3termTable *)sqlite3_malloc(nByte); + p = (Fts3termTable *)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, nByte); diff --git a/sqlite/ext/fts3/fts3_test.c b/sqlite/ext/fts3/fts3_test.c index a48a556c..8bf7804d 100644 --- a/sqlite/ext/fts3/fts3_test.c +++ b/sqlite/ext/fts3/fts3_test.c @@ -574,6 +574,33 @@ static int SQLITE_TCLAPI fts3_test_varint_cmd( ** End of tokenizer code. **************************************************************************/ +/* +** sqlite3_fts3_may_be_corrupt BOOLEAN +** +** Set or clear the global "may-be-corrupt" flag. Return the old value. +*/ +static int SQLITE_TCLAPI fts3_may_be_corrupt( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + int bOld = sqlite3_fts3_may_be_corrupt; + + if( objc!=2 && objc!=1 ){ + Tcl_WrongNumArgs(interp, 1, objv, "?BOOLEAN?"); + return TCL_ERROR; + } + if( objc==2 ){ + int bNew; + if( Tcl_GetBooleanFromObj(interp, objv[1], &bNew) ) return TCL_ERROR; + sqlite3_fts3_may_be_corrupt = bNew; + } + + Tcl_SetObjResult(interp, Tcl_NewIntObj(bOld)); + return TCL_OK; +} + int Sqlitetestfts3_Init(Tcl_Interp *interp){ Tcl_CreateObjCommand(interp, "fts3_near_match", fts3_near_match_cmd, 0, 0); Tcl_CreateObjCommand(interp, @@ -582,10 +609,12 @@ int Sqlitetestfts3_Init(Tcl_Interp *interp){ Tcl_CreateObjCommand( interp, "fts3_test_tokenizer", fts3_test_tokenizer_cmd, 0, 0 ); - Tcl_CreateObjCommand( interp, "fts3_test_varint", fts3_test_varint_cmd, 0, 0 ); + Tcl_CreateObjCommand( + interp, "sqlite3_fts3_may_be_corrupt", fts3_may_be_corrupt, 0, 0 + ); return TCL_OK; } #endif /* SQLITE_ENABLE_FTS3 || SQLITE_ENABLE_FTS4 */ diff --git a/sqlite/ext/fts3/fts3_tokenize_vtab.c b/sqlite/ext/fts3/fts3_tokenize_vtab.c index a3d24bc6..b5bf8add 100644 --- a/sqlite/ext/fts3/fts3_tokenize_vtab.c +++ b/sqlite/ext/fts3/fts3_tokenize_vtab.c @@ -122,7 +122,7 @@ static int fts3tokDequoteArray( nByte += (int)(strlen(argv[i]) + 1); } - *pazDequote = azDequote = sqlite3_malloc(sizeof(char *)*argc + nByte); + *pazDequote = azDequote = sqlite3_malloc64(sizeof(char *)*argc + nByte); if( azDequote==0 ){ rc = SQLITE_NOMEM; }else{ diff --git a/sqlite/ext/fts3/fts3_unicode.c b/sqlite/ext/fts3/fts3_unicode.c index dfb2680c..b06d9921 100644 --- a/sqlite/ext/fts3/fts3_unicode.c +++ b/sqlite/ext/fts3/fts3_unicode.c @@ -82,7 +82,7 @@ typedef struct unicode_cursor unicode_cursor; struct unicode_tokenizer { sqlite3_tokenizer base; - int bRemoveDiacritic; + int eRemoveDiacritic; int nException; int *aiException; }; @@ -155,7 +155,7 @@ static int unicodeAddExceptions( int *aNew; /* New aiException[] array */ int nNew; /* Number of valid entries in array aNew[] */ - aNew = sqlite3_realloc(p->aiException, (p->nException+nEntry)*sizeof(int)); + aNew = sqlite3_realloc64(p->aiException,(p->nException+nEntry)*sizeof(int)); if( aNew==0 ) return SQLITE_NOMEM; nNew = p->nException; @@ -227,17 +227,20 @@ static int unicodeCreate( pNew = (unicode_tokenizer *) sqlite3_malloc(sizeof(unicode_tokenizer)); if( pNew==NULL ) return SQLITE_NOMEM; memset(pNew, 0, sizeof(unicode_tokenizer)); - pNew->bRemoveDiacritic = 1; + pNew->eRemoveDiacritic = 1; for(i=0; rc==SQLITE_OK && ibRemoveDiacritic = 1; + pNew->eRemoveDiacritic = 1; } else if( n==19 && memcmp("remove_diacritics=0", z, 19)==0 ){ - pNew->bRemoveDiacritic = 0; + pNew->eRemoveDiacritic = 0; + } + else if( n==19 && memcmp("remove_diacritics=2", z, 19)==0 ){ + pNew->eRemoveDiacritic = 2; } else if( n>=11 && memcmp("tokenchars=", z, 11)==0 ){ rc = unicodeAddExceptions(pNew, 1, &z[11], n-11); @@ -341,7 +344,7 @@ static int unicodeNext( /* Grow the output buffer if required. */ if( (zOut-pCsr->zToken)>=(pCsr->nAlloc-4) ){ - char *zNew = sqlite3_realloc(pCsr->zToken, pCsr->nAlloc+64); + char *zNew = sqlite3_realloc64(pCsr->zToken, pCsr->nAlloc+64); if( !zNew ) return SQLITE_NOMEM; zOut = &zNew[zOut - pCsr->zToken]; pCsr->zToken = zNew; @@ -350,7 +353,7 @@ static int unicodeNext( /* Write the folded case of the last character read to the output */ zEnd = z; - iOut = sqlite3FtsUnicodeFold((int)iCode, p->bRemoveDiacritic); + iOut = sqlite3FtsUnicodeFold((int)iCode, p->eRemoveDiacritic); if( iOut ){ WRITE_UTF8(zOut, iOut); } diff --git a/sqlite/ext/fts3/fts3_unicode2.c b/sqlite/ext/fts3/fts3_unicode2.c index da7251ed..c5101624 100644 --- a/sqlite/ext/fts3/fts3_unicode2.c +++ b/sqlite/ext/fts3/fts3_unicode2.c @@ -1,5 +1,5 @@ /* -** 2012 May 25 +** 2012-05-25 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: @@ -159,32 +159,48 @@ int sqlite3FtsUnicodeIsalnum(int c){ ** E"). The resuls of passing a codepoint that corresponds to an ** uppercase letter are undefined. */ -static int remove_diacritic(int c){ +static int remove_diacritic(int c, int bComplex){ unsigned short aDia[] = { 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, - 3456, 3696, 3712, 3728, 3744, 3896, 3912, 3928, - 3968, 4008, 4040, 4106, 4138, 4170, 4202, 4234, - 4266, 4296, 4312, 4344, 4408, 4424, 4472, 4504, - 6148, 6198, 6264, 6280, 6360, 6429, 6505, 6529, - 61448, 61468, 61534, 61592, 61642, 61688, 61704, 61726, - 61784, 61800, 61836, 61880, 61914, 61948, 61998, 62122, - 62154, 62200, 62218, 62302, 62364, 62442, 62478, 62536, - 62554, 62584, 62604, 62640, 62648, 62656, 62664, 62730, - 62924, 63050, 63082, 63274, 63390, + 3456, 3696, 3712, 3728, 3744, 3766, 3832, 3896, + 3912, 3928, 3944, 3968, 4008, 4040, 4056, 4106, + 4138, 4170, 4202, 4234, 4266, 4296, 4312, 4344, + 4408, 4424, 4442, 4472, 4488, 4504, 6148, 6198, + 6264, 6280, 6360, 6429, 6505, 6529, 61448, 61468, + 61512, 61534, 61592, 61610, 61642, 61672, 61688, 61704, + 61726, 61784, 61800, 61816, 61836, 61880, 61896, 61914, + 61948, 61998, 62062, 62122, 62154, 62184, 62200, 62218, + 62252, 62302, 62364, 62410, 62442, 62478, 62536, 62554, + 62584, 62604, 62640, 62648, 62656, 62664, 62730, 62766, + 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, + 63182, 63242, 63274, 63310, 63368, 63390, }; - char aChar[] = { - '\0', 'a', 'c', 'e', 'i', 'n', 'o', 'u', 'y', 'y', 'a', 'c', - 'd', 'e', 'e', 'g', 'h', 'i', 'j', 'k', 'l', 'n', 'o', 'r', - 's', 't', 'u', 'u', 'w', 'y', 'z', 'o', 'u', 'a', 'i', 'o', - 'u', 'g', 'k', 'o', 'j', 'g', 'n', 'a', 'e', 'i', 'o', 'r', - 'u', 's', 't', 'h', 'a', 'e', 'o', 'y', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', 'a', 'b', 'd', 'd', 'e', 'f', 'g', 'h', - 'h', 'i', 'k', 'l', 'l', 'm', 'n', 'p', 'r', 'r', 's', 't', - 'u', 'v', 'w', 'w', 'x', 'y', 'z', 'h', 't', 'w', 'y', 'a', - 'e', 'i', 'o', 'u', 'y', +#define HIBIT ((unsigned char)0x80) + unsigned char aChar[] = { + '\0', 'a', 'c', 'e', 'i', 'n', + 'o', 'u', 'y', 'y', 'a', 'c', + 'd', 'e', 'e', 'g', 'h', 'i', + 'j', 'k', 'l', 'n', 'o', 'r', + 's', 't', 'u', 'u', 'w', 'y', + 'z', 'o', 'u', 'a', 'i', 'o', + 'u', 'u'|HIBIT, 'a'|HIBIT, 'g', 'k', 'o', + 'o'|HIBIT, 'j', 'g', 'n', 'a'|HIBIT, 'a', + 'e', 'i', 'o', 'r', 'u', 's', + 't', 'h', 'a', 'e', 'o'|HIBIT, 'o', + 'o'|HIBIT, 'y', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', 'a', 'b', + 'c'|HIBIT, 'd', 'd', 'e'|HIBIT, 'e', 'e'|HIBIT, + 'f', 'g', 'h', 'h', 'i', 'i'|HIBIT, + 'k', 'l', 'l'|HIBIT, 'l', 'm', 'n', + 'o'|HIBIT, 'p', 'r', 'r'|HIBIT, 'r', 's', + 's'|HIBIT, 't', 'u', 'u'|HIBIT, 'v', 'w', + 'w', 'x', 'y', 'z', 'h', 't', + 'w', 'y', 'a', 'a'|HIBIT, 'a'|HIBIT, 'a'|HIBIT, + 'e', 'e'|HIBIT, 'e'|HIBIT, 'i', 'o', 'o'|HIBIT, + 'o'|HIBIT, 'o'|HIBIT, 'u', 'u'|HIBIT, 'u'|HIBIT, 'y', }; unsigned int key = (((unsigned int)c)<<3) | 0x00000007; @@ -201,7 +217,8 @@ static int remove_diacritic(int c){ } } assert( key>=aDia[iRes] ); - return ((c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : (int)aChar[iRes]); + if( bComplex==0 && (aChar[iRes] & 0x80) ) return c; + return (c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : ((int)aChar[iRes] & 0x7F); } @@ -214,8 +231,8 @@ int sqlite3FtsUnicodeIsdiacritic(int c){ unsigned int mask1 = 0x000361F8; if( c<768 || c>817 ) return 0; return (c < 768+32) ? - (mask0 & (1 << (c-768))) : - (mask1 & (1 << (c-768-32))); + (mask0 & ((unsigned int)1 << (c-768))) : + (mask1 & ((unsigned int)1 << (c-768-32))); } @@ -228,7 +245,7 @@ int sqlite3FtsUnicodeIsdiacritic(int c){ ** The results are undefined if the value passed to this function ** is less than zero. */ -int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){ +int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){ /* Each entry in the following array defines a rule for folding a range ** of codepoints to lower case. The rule applies to a range of nRange ** codepoints starting at codepoint iCode. @@ -351,7 +368,9 @@ int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){ assert( ret>0 ); } - if( bRemoveDiacritic ) ret = remove_diacritic(ret); + if( eRemoveDiacritic ){ + ret = remove_diacritic(ret, eRemoveDiacritic==2); + } } else if( c>=66560 && c<66600 ){ diff --git a/sqlite/ext/fts3/fts3_write.c b/sqlite/ext/fts3/fts3_write.c index 8fc65891..031b7b35 100644 --- a/sqlite/ext/fts3/fts3_write.c +++ b/sqlite/ext/fts3/fts3_write.c @@ -396,10 +396,12 @@ static int fts3SqlStmt( pStmt = p->aStmt[eStmt]; if( !pStmt ){ + int f = SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB; char *zSql; if( eStmt==SQL_CONTENT_INSERT ){ zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName, p->zWriteExprlist); }else if( eStmt==SQL_SELECT_CONTENT_BY_ROWID ){ + f &= ~SQLITE_PREPARE_NO_VTAB; zSql = sqlite3_mprintf(azSql[eStmt], p->zReadExprlist); }else{ zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName); @@ -407,8 +409,7 @@ static int fts3SqlStmt( if( !zSql ){ rc = SQLITE_NOMEM; }else{ - rc = sqlite3_prepare_v3(p->db, zSql, -1, SQLITE_PREPARE_PERSISTENT, - &pStmt, NULL); + rc = sqlite3_prepare_v3(p->db, zSql, -1, f, &pStmt, NULL); sqlite3_free(zSql); assert( rc==SQLITE_OK || pStmt==0 ); p->aStmt[eStmt] = pStmt; @@ -566,7 +567,7 @@ static sqlite3_int64 getAbsoluteLevel( int iLevel /* Level of segments */ ){ sqlite3_int64 iBase; /* First absolute level for iLangid/iIndex */ - assert( iLangid>=0 ); + assert_fts3_nc( iLangid>=0 ); assert( p->nIndex>0 ); assert( iIndex>=0 && iIndexnIndex ); @@ -1408,7 +1409,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->aNode[pReader->nNode] - pReader->aDoclist)nDoclist + if( pReader->nDoclist > pReader->nNode-(pReader->aDoclist-pReader->aNode) || (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1]) ){ return FTS_CORRUPT_VTAB; @@ -1608,8 +1609,13 @@ int sqlite3Fts3SegReaderNew( Fts3SegReader *pReader; /* Newly allocated SegReader object */ int nExtra = 0; /* Bytes to allocate segment root node */ - assert( iStartLeaf<=iEndLeaf ); + assert( zRoot!=0 || nRoot==0 ); +#ifdef CORRUPT_DB + assert( zRoot!=0 || CORRUPT_DB ); +#endif + if( iStartLeaf==0 ){ + if( iEndLeaf!=0 ) return FTS_CORRUPT_VTAB; nExtra = nRoot + FTS3_NODE_PADDING; } @@ -1629,7 +1635,7 @@ int sqlite3Fts3SegReaderNew( pReader->aNode = (char *)&pReader[1]; pReader->rootOnly = 1; pReader->nNode = nRoot; - memcpy(pReader->aNode, zRoot, nRoot); + if( nRoot ) memcpy(pReader->aNode, zRoot, nRoot); memset(&pReader->aNode[nRoot], 0, FTS3_NODE_PADDING); }else{ pReader->iCurrentBlock = iStartLeaf-1; @@ -2249,6 +2255,11 @@ static int fts3SegWriterAdd( nPrefix = fts3PrefixCompress(pWriter->zTerm, pWriter->nTerm, zTerm, nTerm); nSuffix = nTerm-nPrefix; + /* If nSuffix is zero or less, then zTerm/nTerm must be a prefix of + ** pWriter->zTerm/pWriter->nTerm. i.e. must be equal to or less than when + ** compared with BINARY collation. This indicates corruption. */ + if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; + /* Figure out how many bytes are required by this new entry */ nReq = sqlite3Fts3VarintLen(nPrefix) + /* varint containing prefix size */ sqlite3Fts3VarintLen(nSuffix) + /* varint containing suffix size */ @@ -2956,7 +2967,9 @@ int sqlite3Fts3SegReaderStep( }else{ iDelta = iDocid - iPrev; } - assert( iDelta>0 || (nDoclist==0 && iDelta==iDocid) ); + if( iDelta<=0 && (nDoclist>0 || iDelta!=iDocid) ){ + return FTS_CORRUPT_VTAB; + } assert( nDoclist>0 || iDelta==iDocid ); nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0); @@ -3322,14 +3335,16 @@ static void fts3DecodeIntArray( const char *zBuf, /* The BLOB containing the varints */ int nBuf /* size of the BLOB */ ){ - int i, j; - UNUSED_PARAMETER(nBuf); - for(i=j=0; iiOff += fts3GetVarint32(&p->aNode[p->iOff], &nSuffix); if( nPrefix>p->iOff || nSuffix>p->nNode-p->iOff ){ - return SQLITE_CORRUPT_VTAB; + return FTS_CORRUPT_VTAB; } blobGrowBuffer(&p->term, nPrefix+nSuffix, &rc); if( rc==SQLITE_OK ){ @@ -3745,7 +3760,7 @@ static int nodeReaderNext(NodeReader *p){ if( p->iChild==0 ){ p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &p->nDoclist); if( (p->nNode-p->iOff)nDoclist ){ - return SQLITE_CORRUPT_VTAB; + return FTS_CORRUPT_VTAB; } p->aDoclist = &p->aNode[p->iOff]; p->iOff += p->nDoclist; diff --git a/sqlite/ext/fts3/unicode/mkunicode.tcl b/sqlite/ext/fts3/unicode/mkunicode.tcl index 84b8ddc8..7e24aaa4 100644 --- a/sqlite/ext/fts3/unicode/mkunicode.tcl +++ b/sqlite/ext/fts3/unicode/mkunicode.tcl @@ -9,11 +9,12 @@ proc print_rd {map} { set nRange 1 set iFirst [lindex $map 0 0] set cPrev [lindex $map 0 1] + set fPrev [lindex $map 0 2] foreach m [lrange $map 1 end] { - foreach {i c} $m {} + foreach {i c f} $m {} - if {$cPrev == $c} { + if {$cPrev == $c && $fPrev==$f} { for {set j [expr $iFirst+$nRange]} {$j<$i} {incr j} { if {[info exists tl_lookup_table($j)]==0} break } @@ -29,13 +30,16 @@ proc print_rd {map} { lappend lRange [list $iFirst $nRange] lappend aChar $cPrev + lappend aFlag $fPrev set iFirst $i set cPrev $c + set fPrev $f set nRange 1 } lappend lRange [list $iFirst $nRange] lappend aChar $cPrev + lappend aFlag $fPrev puts "/*" puts "** If the argument is a codepoint corresponding to a lowercase letter" @@ -45,7 +49,7 @@ proc print_rd {map} { puts "** E\"). The resuls of passing a codepoint that corresponds to an" puts "** uppercase letter are undefined." puts "*/" - puts "static int ${::remove_diacritic}(int c)\{" + puts "static int ${::remove_diacritic}(int c, int bComplex)\{" puts " unsigned short aDia\[\] = \{" puts -nonewline " 0, " set i 1 @@ -59,14 +63,19 @@ proc print_rd {map} { } puts "" puts " \};" - puts " char aChar\[\] = \{" - puts -nonewline " '\\0', " + puts "#define HIBIT ((unsigned char)0x80)" + puts " unsigned char aChar\[\] = \{" + puts -nonewline " '\\0', " set i 1 - foreach c $aChar { - set str "'$c', " - if {$c == ""} { set str "'\\0', " } + foreach c $aChar f $aFlag { + if { $f } { + set str "'$c'|HIBIT, " + } else { + set str "'$c', " + } + if {$c == ""} { set str "'\\0', " } - if {($i % 12)==0} {puts "" ; puts -nonewline " " } + if {($i % 6)==0} {puts "" ; puts -nonewline " " } incr i puts -nonewline "$str" } @@ -87,7 +96,8 @@ proc print_rd {map} { } } assert( key>=aDia[iRes] ); - return ((c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : (int)aChar[iRes]);} + if( bComplex==0 && (aChar[iRes] & 0x80) ) return c; + return (c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : ((int)aChar[iRes] & 0x7F);} puts "\}" } @@ -95,7 +105,8 @@ proc print_isdiacritic {zFunc map} { set lCode [list] foreach m $map { - foreach {code char} $m {} + foreach {code char flag} $m {} + if {$flag} continue if {$code && $char == ""} { lappend lCode $code } } set lCode [lsort -integer $lCode] @@ -124,8 +135,8 @@ proc print_isdiacritic {zFunc map} { puts " if( c<$iFirst || c>$iLast ) return 0;" puts " return (c < $iFirst+32) ?" - puts " (mask0 & (1 << (c-$iFirst))) :" - puts " (mask1 & (1 << (c-$iFirst-32)));" + puts " (mask0 & ((unsigned int)1 << (c-$iFirst))) :" + puts " (mask1 & ((unsigned int)1 << (c-$iFirst-32)));" puts "\}" } @@ -472,7 +483,7 @@ proc print_fold {zFunc} { puts "** The results are undefined if the value passed to this function" puts "** is less than zero." puts "*/" - puts "int ${zFunc}\(int c, int bRemoveDiacritic)\{" + puts "int ${zFunc}\(int c, int eRemoveDiacritic)\{" set liOff [tl_generate_ioff_table $lRecord] tl_print_table_header @@ -516,7 +527,9 @@ proc print_fold {zFunc} { assert( ret>0 ); } - if( bRemoveDiacritic ) ret = ${::remove_diacritic}(ret); + if( eRemoveDiacritic ){ + ret = ${::remove_diacritic}(ret, eRemoveDiacritic==2); + } } }] @@ -605,10 +618,6 @@ proc print_categories {lMap} { set nCat [expr [llength [array names C]] + 1] puts [code { - int sqlite3Fts5UnicodeNCat(void) { - return $nCat; - } - int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ aArray[0] = 1; switch( zCat[0] ){ @@ -691,7 +700,7 @@ proc print_categories {lMap} { static u16 aFts5UnicodeMap[] = {$aMapArray}; static u16 aFts5UnicodeData[] = {$aDataArray}; - int sqlite3Fts5UnicodeCategory(int iCode) { + int sqlite3Fts5UnicodeCategory(u32 iCode) { int iRes = -1; int iHi; int iLo; @@ -774,7 +783,7 @@ proc print_test_categories {lMap} { aArray[0] = 1; } - c = sqlite3Fts5UnicodeCategory(i); + c = sqlite3Fts5UnicodeCategory((u32)i); if( aArray[c]==0 ){ *piCode = i; return 1; @@ -829,7 +838,7 @@ proc print_fold_test {zFunc mappings} { proc print_fileheader {} { puts [string trim { /* -** 2012 May 25 +** 2012-05-25 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: diff --git a/sqlite/ext/fts3/unicode/parseunicode.tcl b/sqlite/ext/fts3/unicode/parseunicode.tcl index 966d7bdd..7c246a4a 100644 --- a/sqlite/ext/fts3/unicode/parseunicode.tcl +++ b/sqlite/ext/fts3/unicode/parseunicode.tcl @@ -7,12 +7,24 @@ # character that it should be replaced with, or an empty string if the # codepoint should simply be removed from the input. Examples: # -# { 224 a } (replace codepoint 224 to "a") -# { 769 "" } (remove codepoint 769 from input) +# { 224 a 0 } (replace codepoint 224 to "a") +# { 769 "" 0 } (remove codepoint 769 from input) # # Mappings are only returned for non-upper case codepoints. It is assumed # that the input has already been folded to lower case. # +# The third value in the list is always either 0 or 1. 0 if the +# UnicodeData.txt file maps the codepoint to a single ASCII character and +# a diacritic, or 1 if the mapping is indirect. For example, consider the +# two entries: +# +# 1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC +# 1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8 +# +# The first codepoint is a direct mapping (as 006F is ASCII and 0323 is a +# diacritic). The second is an indirect mapping, as it maps to the +# first codepoint plus 0302 (a diacritic). +# proc rd_load_unicodedata_text {zName} { global tl_lookup_table @@ -53,18 +65,29 @@ proc rd_load_unicodedata_text {zName} { set iAscii [expr "0x[lindex $character_decomposition_mapping 0]"] set iDia [expr "0x[lindex $character_decomposition_mapping 1]"] + # Filter out upper-case characters, as they will be mapped to their + # lower-case equivalents before this data is used. if {[info exists tl_lookup_table($iCode)]} continue + # Check if this is an indirect mapping. If so, set bIndirect to true + # and change $iAscii to the indirectly mappped ASCII character. + set bIndirect 0 + if {[info exists dia($iDia)] && [info exists mapping($iAscii)]} { + set iAscii $mapping($iAscii) + set bIndirect 1 + } + if { ($iAscii >= 97 && $iAscii <= 122) || ($iAscii >= 65 && $iAscii <= 90) } { - lappend lRet [list $iCode [string tolower [format %c $iAscii]]] + lappend lRet [list $iCode [string tolower [format %c $iAscii]] $bIndirect] + set mapping($iCode) $iAscii set dia($iDia) 1 } } foreach d [array names dia] { - lappend lRet [list $d ""] + lappend lRet [list $d "" 0] } set lRet [lsort -integer -index 0 $lRet] diff --git a/sqlite/ext/fts5/fts5.h b/sqlite/ext/fts5/fts5.h index 037da64d..f0b7d558 100644 --- a/sqlite/ext/fts5/fts5.h +++ b/sqlite/ext/fts5/fts5.h @@ -120,12 +120,8 @@ struct Fts5PhraseIter { ** ** Usually, output parameter *piPhrase is set to the phrase number, *piCol ** to the column in which it occurs and *piOff the token offset of the -** first token of the phrase. The exception is if the table was created -** with the offsets=0 option specified. In this case *piOff is always -** set to -1. -** -** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM) -** if an error occurs. +** first token of the phrase. Returns SQLITE_OK if successful, or an error +** code (i.e. SQLITE_NOMEM) if an error occurs. ** ** This API can be quite slow if used with an FTS5 table created with the ** "detail=none" or "detail=column" option. @@ -414,11 +410,11 @@ struct Fts5ExtensionApi { ** the tokenizer substitutes "first" for "1st" and the query works ** as expected. ** -**
  • By adding multiple synonyms for a single term to the FTS index. -** In this case, when tokenizing query text, the tokenizer may -** provide multiple synonyms for a single term within the document. -** FTS5 then queries the index for each synonym individually. For -** example, faced with the query: +**
  • By querying the index for all synonyms of each query term +** separately. In this case, when tokenizing query text, the +** tokenizer may provide multiple synonyms for a single term +** within the document. FTS5 then queries the index for each +** synonym individually. For example, faced with the query: ** ** ** ... MATCH 'first place' @@ -442,7 +438,7 @@ struct Fts5ExtensionApi { ** "place". ** ** This way, even if the tokenizer does not provide synonyms -** when tokenizing query text (it should not - to do would be +** when tokenizing query text (it should not - to do so would be ** inefficient), it doesn't matter if the user queries for ** 'first + place' or '1st + place', as there are entries in the ** FTS index corresponding to both forms of the first token. diff --git a/sqlite/ext/fts5/fts5Int.h b/sqlite/ext/fts5/fts5Int.h index a460a7af..e9337623 100644 --- a/sqlite/ext/fts5/fts5Int.h +++ b/sqlite/ext/fts5/fts5Int.h @@ -87,6 +87,12 @@ extern int sqlite3_fts5_may_be_corrupt; # define assert_nc(x) assert(x) #endif +/* +** A version of memcmp() that does not cause asan errors if one of the pointer +** parameters is NULL and the number of bytes to compare is zero. +*/ +#define fts5Memcmp(s1, s2, n) ((n)==0 ? 0 : memcmp((s1), (s2), (n))) + /* Mark a function parameter as unused, to suppress nuisance compiler ** warnings. */ #ifndef UNUSED_PARAM @@ -274,7 +280,7 @@ void sqlite3Fts5Put32(u8*, int); int sqlite3Fts5Get32(const u8*); #define FTS5_POS2COLUMN(iPos) (int)(iPos >> 32) -#define FTS5_POS2OFFSET(iPos) (int)(iPos & 0xFFFFFFFF) +#define FTS5_POS2OFFSET(iPos) (int)(iPos & 0x7FFFFFFF) typedef struct Fts5PoslistReader Fts5PoslistReader; struct Fts5PoslistReader { @@ -309,7 +315,7 @@ int sqlite3Fts5PoslistNext64( ); /* Malloc utility */ -void *sqlite3Fts5MallocZero(int *pRc, int nByte); +void *sqlite3Fts5MallocZero(int *pRc, sqlite3_int64 nByte); char *sqlite3Fts5Strndup(int *pRc, const char *pIn, int nIn); /* Character set tests (like isspace(), isalpha() etc.) */ @@ -520,8 +526,18 @@ int sqlite3Fts5PutVarint(unsigned char *p, u64 v); /************************************************************************** -** Interface to code in fts5.c. +** Interface to code in fts5_main.c. +*/ + +/* +** Virtual-table object. */ +typedef struct Fts5Table Fts5Table; +struct Fts5Table { + sqlite3_vtab base; /* Base class used by SQLite core */ + Fts5Config *pConfig; /* Virtual table configuration */ + Fts5Index *pIndex; /* Full-text index */ +}; int sqlite3Fts5GetTokenizer( Fts5Global*, @@ -532,7 +548,9 @@ int sqlite3Fts5GetTokenizer( char **pzErr ); -Fts5Index *sqlite3Fts5IndexFromCsrid(Fts5Global*, i64, Fts5Config **); +Fts5Table *sqlite3Fts5TableFromCsrid(Fts5Global*, i64); + +int sqlite3Fts5FlushToDisk(Fts5Table*); /* ** End of interface to code in fts5.c. @@ -788,7 +806,7 @@ int sqlite3Fts5UnicodeIsdiacritic(int c); int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic); int sqlite3Fts5UnicodeCatParse(const char*, u8*); -int sqlite3Fts5UnicodeCategory(int iCode); +int sqlite3Fts5UnicodeCategory(u32 iCode); void sqlite3Fts5UnicodeAscii(u8*, u8*); /* ** End of interface to code in fts5_unicode2.c. diff --git a/sqlite/ext/fts5/fts5_aux.c b/sqlite/ext/fts5/fts5_aux.c index 594b981d..f7b9d0a4 100644 --- a/sqlite/ext/fts5/fts5_aux.c +++ b/sqlite/ext/fts5/fts5_aux.c @@ -136,7 +136,7 @@ static void fts5HighlightAppend( HighlightContext *p, const char *z, int n ){ - if( *pRc==SQLITE_OK ){ + if( *pRc==SQLITE_OK && z ){ if( n<0 ) n = (int)strlen(z); p->zOut = sqlite3_mprintf("%z%.*s", p->zOut, n, z); if( p->zOut==0 ) *pRc = SQLITE_NOMEM; @@ -268,7 +268,7 @@ static int fts5SentenceFinderAdd(Fts5SFinder *p, int iAdd){ int nNew = p->nFirstAlloc ? p->nFirstAlloc*2 : 64; int *aNew; - aNew = (int*)sqlite3_realloc(p->aFirst, nNew*sizeof(int)); + aNew = (int*)sqlite3_realloc64(p->aFirst, nNew*sizeof(int)); if( aNew==0 ) return SQLITE_NOMEM; p->aFirst = aNew; p->nFirstAlloc = nNew; @@ -335,11 +335,12 @@ static int fts5SnippetScore( int nInst; int nScore = 0; int iLast = 0; + sqlite3_int64 iEnd = (sqlite3_int64)iPos + nToken; rc = pApi->xInstCount(pFts, &nInst); for(i=0; ixInst(pFts, i, &ip, &ic, &iOff); - if( rc==SQLITE_OK && ic==iCol && iOff>=iPos && iOff<(iPos+nToken) ){ + if( rc==SQLITE_OK && ic==iCol && iOff>=iPos && iOffnDocsize ) iAdj = nDocsize - nToken; if( iAdj<0 ) iAdj = 0; *piPos = iAdj; @@ -442,7 +443,9 @@ static void fts5SnippetFunction( int jj; rc = pApi->xInst(pFts, ii, &ip, &ic, &io); - if( ic!=i || rc!=SQLITE_OK ) continue; + if( ic!=i ) continue; + if( io>nDocsize ) rc = FTS5_CORRUPT; + if( rc!=SQLITE_OK ) continue; memset(aSeen, 0, nPhrase); rc = fts5SnippetScore(pApi, pFts, nDocsize, aSeen, i, io, nToken, &nScore, &iAdj @@ -568,13 +571,13 @@ static int fts5Bm25GetData( int nPhrase; /* Number of phrases in query */ sqlite3_int64 nRow = 0; /* Number of rows in table */ sqlite3_int64 nToken = 0; /* Number of tokens in table */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ int i; /* Allocate the Fts5Bm25Data object */ nPhrase = pApi->xPhraseCount(pFts); nByte = sizeof(Fts5Bm25Data) + nPhrase*2*sizeof(double); - p = (Fts5Bm25Data*)sqlite3_malloc(nByte); + p = (Fts5Bm25Data*)sqlite3_malloc64(nByte); if( p==0 ){ rc = SQLITE_NOMEM; }else{ @@ -586,6 +589,7 @@ static int fts5Bm25GetData( /* Calculate the average document length for this FTS5 table */ if( rc==SQLITE_OK ) rc = pApi->xRowCount(pFts, &nRow); + assert( rc!=SQLITE_OK || nRow>0 ); if( rc==SQLITE_OK ) rc = pApi->xColumnTotalSize(pFts, -1, &nToken); if( rc==SQLITE_OK ) p->avgdl = (double)nToken / (double)nRow; @@ -710,5 +714,3 @@ int sqlite3Fts5AuxInit(fts5_api *pApi){ return rc; } - - diff --git a/sqlite/ext/fts5/fts5_buffer.c b/sqlite/ext/fts5/fts5_buffer.c index b1168974..61eb105f 100644 --- a/sqlite/ext/fts5/fts5_buffer.c +++ b/sqlite/ext/fts5/fts5_buffer.c @@ -17,12 +17,12 @@ int sqlite3Fts5BufferSize(int *pRc, Fts5Buffer *pBuf, u32 nByte){ if( (u32)pBuf->nSpacenSpace ? pBuf->nSpace : 64; + u64 nNew = pBuf->nSpace ? pBuf->nSpace : 64; u8 *pNew; while( nNewp, nNew); + pNew = sqlite3_realloc64(pBuf->p, nNew); if( pNew==0 ){ *pRc = SQLITE_NOMEM; return 1; @@ -52,7 +52,7 @@ void sqlite3Fts5Put32(u8 *aBuf, int iVal){ } int sqlite3Fts5Get32(const u8 *aBuf){ - return (aBuf[0] << 24) + (aBuf[1] << 16) + (aBuf[2] << 8) + aBuf[3]; + return (int)((((u32)aBuf[0])<<24) + (aBuf[1]<<16) + (aBuf[2]<<8) + aBuf[3]); } /* @@ -183,7 +183,7 @@ int sqlite3Fts5PoslistNext64( iOff = ((i64)iVal) << 32; fts5FastGetVarint32(a, i, iVal); } - *piOff = iOff + (iVal-2); + *piOff = iOff + ((iVal-2) & 0x7FFFFFFF); *pi = i; return 0; } @@ -244,10 +244,10 @@ int sqlite3Fts5PoslistWriterAppend( return SQLITE_OK; } -void *sqlite3Fts5MallocZero(int *pRc, int nByte){ +void *sqlite3Fts5MallocZero(int *pRc, sqlite3_int64 nByte){ void *pRet = 0; if( *pRc==SQLITE_OK ){ - pRet = sqlite3_malloc(nByte); + pRet = sqlite3_malloc64(nByte); if( pRet==0 ){ if( nByte>0 ) *pRc = SQLITE_NOMEM; }else{ diff --git a/sqlite/ext/fts5/fts5_config.c b/sqlite/ext/fts5/fts5_config.c index 17fc43e0..b422c95a 100644 --- a/sqlite/ext/fts5/fts5_config.c +++ b/sqlite/ext/fts5/fts5_config.c @@ -295,7 +295,7 @@ static int fts5ConfigParseSpecial( if( sqlite3_strnicmp("tokenize", zCmd, nCmd)==0 ){ const char *p = (const char*)zArg; - int nArg = (int)strlen(zArg) + 1; + sqlite3_int64 nArg = strlen(zArg) + 1; char **azArg = sqlite3Fts5MallocZero(&rc, sizeof(char*) * nArg); char *pDel = sqlite3Fts5MallocZero(&rc, nArg * 2); char *pSpace = pDel; @@ -425,8 +425,8 @@ static const char *fts5ConfigGobbleWord( ){ const char *zRet = 0; - int nIn = (int)strlen(zIn); - char *zOut = sqlite3_malloc(nIn+1); + sqlite3_int64 nIn = strlen(zIn); + char *zOut = sqlite3_malloc64(nIn+1); assert( *pRc==SQLITE_OK ); *pbQuoted = 0; @@ -529,7 +529,7 @@ int sqlite3Fts5ConfigParse( int rc = SQLITE_OK; /* Return code */ Fts5Config *pRet; /* New object to return */ int i; - int nByte; + sqlite3_int64 nByte; *ppOut = pRet = (Fts5Config*)sqlite3_malloc(sizeof(Fts5Config)); if( pRet==0 ) return SQLITE_NOMEM; diff --git a/sqlite/ext/fts5/fts5_expr.c b/sqlite/ext/fts5/fts5_expr.c index a09fe7de..c5bfb087 100644 --- a/sqlite/ext/fts5/fts5_expr.c +++ b/sqlite/ext/fts5/fts5_expr.c @@ -211,7 +211,7 @@ static int fts5ExprGetToken( return tok; } -static void *fts5ParseAlloc(u64 t){ return sqlite3_malloc((int)t); } +static void *fts5ParseAlloc(u64 t){ return sqlite3_malloc64((sqlite3_int64)t);} static void fts5ParseFree(void *p){ sqlite3_free(p); } int sqlite3Fts5ExprNew( @@ -356,8 +356,8 @@ static int fts5ExprSynonymList( if( sqlite3Fts5IterEof(pIter)==0 && pIter->iRowid==iRowid ){ if( pIter->nData==0 ) continue; if( nIter==nAlloc ){ - int nByte = sizeof(Fts5PoslistReader) * nAlloc * 2; - Fts5PoslistReader *aNew = (Fts5PoslistReader*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(Fts5PoslistReader) * nAlloc * 2; + Fts5PoslistReader *aNew = (Fts5PoslistReader*)sqlite3_malloc64(nByte); if( aNew==0 ){ rc = SQLITE_NOMEM; goto synonym_poslist_out; @@ -437,8 +437,8 @@ static int fts5ExprPhraseIsMatch( /* If the aStatic[] array is not large enough, allocate a large array ** using sqlite3_malloc(). This approach could be improved upon. */ if( pPhrase->nTerm>ArraySize(aStatic) ){ - int nByte = sizeof(Fts5PoslistReader) * pPhrase->nTerm; - aIter = (Fts5PoslistReader*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(Fts5PoslistReader) * pPhrase->nTerm; + aIter = (Fts5PoslistReader*)sqlite3_malloc64(nByte); if( !aIter ) return SQLITE_NOMEM; } memset(aIter, 0, sizeof(Fts5PoslistReader) * pPhrase->nTerm); @@ -572,7 +572,7 @@ static int fts5ExprNearIsMatch(int *pRc, Fts5ExprNearset *pNear){ /* If the aStatic[] array is not large enough, allocate a large array ** using sqlite3_malloc(). This approach could be improved upon. */ if( pNear->nPhrase>ArraySize(aStatic) ){ - int nByte = sizeof(Fts5NearTrimmer) * pNear->nPhrase; + sqlite3_int64 nByte = sizeof(Fts5NearTrimmer) * pNear->nPhrase; a = (Fts5NearTrimmer*)sqlite3Fts5MallocZero(&rc, nByte); }else{ memset(aStatic, 0, sizeof(aStatic)); @@ -1481,8 +1481,9 @@ Fts5ExprNearset *sqlite3Fts5ParseNearset( return pNear; } if( pNear==0 ){ - int nByte = sizeof(Fts5ExprNearset) + SZALLOC * sizeof(Fts5ExprPhrase*); - pRet = sqlite3_malloc(nByte); + sqlite3_int64 nByte; + nByte = sizeof(Fts5ExprNearset) + SZALLOC * sizeof(Fts5ExprPhrase*); + pRet = sqlite3_malloc64(nByte); if( pRet==0 ){ pParse->rc = SQLITE_NOMEM; }else{ @@ -1490,9 +1491,10 @@ Fts5ExprNearset *sqlite3Fts5ParseNearset( } }else if( (pNear->nPhrase % SZALLOC)==0 ){ int nNew = pNear->nPhrase + SZALLOC; - int nByte = sizeof(Fts5ExprNearset) + nNew * sizeof(Fts5ExprPhrase*); + sqlite3_int64 nByte; - pRet = (Fts5ExprNearset*)sqlite3_realloc(pNear, nByte); + nByte = sizeof(Fts5ExprNearset) + nNew * sizeof(Fts5ExprPhrase*); + pRet = (Fts5ExprNearset*)sqlite3_realloc64(pNear, nByte); if( pRet==0 ){ pParse->rc = SQLITE_NOMEM; } @@ -1556,8 +1558,8 @@ static int fts5ParseTokenize( if( pPhrase && pPhrase->nTerm>0 && (tflags & FTS5_TOKEN_COLOCATED) ){ Fts5ExprTerm *pSyn; - int nByte = sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer) + nToken+1; - pSyn = (Fts5ExprTerm*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer) + nToken+1; + pSyn = (Fts5ExprTerm*)sqlite3_malloc64(nByte); if( pSyn==0 ){ rc = SQLITE_NOMEM; }else{ @@ -1573,7 +1575,7 @@ static int fts5ParseTokenize( Fts5ExprPhrase *pNew; int nNew = SZALLOC + (pPhrase ? pPhrase->nTerm : 0); - pNew = (Fts5ExprPhrase*)sqlite3_realloc(pPhrase, + pNew = (Fts5ExprPhrase*)sqlite3_realloc64(pPhrase, sizeof(Fts5ExprPhrase) + sizeof(Fts5ExprTerm) * nNew ); if( pNew==0 ){ @@ -1659,9 +1661,9 @@ Fts5ExprPhrase *sqlite3Fts5ParseTerm( if( pAppend==0 ){ if( (pParse->nPhrase % 8)==0 ){ - int nByte = sizeof(Fts5ExprPhrase*) * (pParse->nPhrase + 8); + sqlite3_int64 nByte = sizeof(Fts5ExprPhrase*) * (pParse->nPhrase + 8); Fts5ExprPhrase **apNew; - apNew = (Fts5ExprPhrase**)sqlite3_realloc(pParse->apPhrase, nByte); + apNew = (Fts5ExprPhrase**)sqlite3_realloc64(pParse->apPhrase, nByte); if( apNew==0 ){ pParse->rc = SQLITE_NOMEM; fts5ExprPhraseFree(sCtx.pPhrase); @@ -1716,8 +1718,10 @@ int sqlite3Fts5ExprClonePhrase( if( rc==SQLITE_OK ){ Fts5Colset *pColsetOrig = pOrig->pNode->pNear->pColset; if( pColsetOrig ){ - int nByte = sizeof(Fts5Colset) + (pColsetOrig->nCol-1) * sizeof(int); - Fts5Colset *pColset = (Fts5Colset*)sqlite3Fts5MallocZero(&rc, nByte); + sqlite3_int64 nByte; + Fts5Colset *pColset; + nByte = sizeof(Fts5Colset) + (pColsetOrig->nCol-1) * sizeof(int); + pColset = (Fts5Colset*)sqlite3Fts5MallocZero(&rc, nByte); if( pColset ){ memcpy(pColset, pColsetOrig, nByte); } @@ -1837,7 +1841,7 @@ static Fts5Colset *fts5ParseColset( assert( pParse->rc==SQLITE_OK ); assert( iCol>=0 && iColpConfig->nCol ); - pNew = sqlite3_realloc(p, sizeof(Fts5Colset) + sizeof(int)*nCol); + pNew = sqlite3_realloc64(p, sizeof(Fts5Colset) + sizeof(int)*nCol); if( pNew==0 ){ pParse->rc = SQLITE_NOMEM; }else{ @@ -1933,7 +1937,7 @@ Fts5Colset *sqlite3Fts5ParseColset( static Fts5Colset *fts5CloneColset(int *pRc, Fts5Colset *pOrig){ Fts5Colset *pRet; if( pOrig ){ - int nByte = sizeof(Fts5Colset) + (pOrig->nCol-1) * sizeof(int); + sqlite3_int64 nByte = sizeof(Fts5Colset) + (pOrig->nCol-1) * sizeof(int); pRet = (Fts5Colset*)sqlite3Fts5MallocZero(pRc, nByte); if( pRet ){ memcpy(pRet, pOrig, nByte); @@ -2087,7 +2091,7 @@ Fts5ExprNode *sqlite3Fts5ParseNode( if( pParse->rc==SQLITE_OK ){ int nChild = 0; /* Number of children of returned node */ - int nByte; /* Bytes of space to allocate for this node */ + sqlite3_int64 nByte; /* Bytes of space to allocate for this node */ assert( (eType!=FTS5_STRING && !pNear) || (eType==FTS5_STRING && !pLeft && !pRight) @@ -2219,7 +2223,7 @@ Fts5ExprNode *sqlite3Fts5ParseImplicitAnd( } static char *fts5ExprTermPrint(Fts5ExprTerm *pTerm){ - int nByte = 0; + sqlite3_int64 nByte = 0; Fts5ExprTerm *p; char *zQuoted; @@ -2227,7 +2231,7 @@ static char *fts5ExprTermPrint(Fts5ExprTerm *pTerm){ for(p=pTerm; p; p=p->pSynonym){ nByte += (int)strlen(pTerm->zTerm) * 2 + 3 + 2; } - zQuoted = sqlite3_malloc(nByte); + zQuoted = sqlite3_malloc64(nByte); if( zQuoted ){ int i = 0; @@ -2467,7 +2471,7 @@ static void fts5ExprFunction( } nConfig = 3 + (nArg-iArg); - azConfig = (const char**)sqlite3_malloc(sizeof(char*) * nConfig); + azConfig = (const char**)sqlite3_malloc64(sizeof(char*) * nConfig); if( azConfig==0 ){ sqlite3_result_error_nomem(pCtx); return; @@ -2553,7 +2557,7 @@ static void fts5ExprIsAlnum( sqlite3Fts5UnicodeCatParse("N*", aArr); sqlite3Fts5UnicodeCatParse("Co", aArr); iCode = sqlite3_value_int(apVal[0]); - sqlite3_result_int(pCtx, aArr[sqlite3Fts5UnicodeCategory(iCode)]); + sqlite3_result_int(pCtx, aArr[sqlite3Fts5UnicodeCategory((u32)iCode)]); } static void fts5ExprFold( @@ -2648,7 +2652,7 @@ struct Fts5PoslistPopulator { Fts5PoslistPopulator *sqlite3Fts5ExprClearPoslists(Fts5Expr *pExpr, int bLive){ Fts5PoslistPopulator *pRet; - pRet = sqlite3_malloc(sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); + pRet = sqlite3_malloc64(sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); if( pRet ){ int i; memset(pRet, 0, sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); @@ -2847,4 +2851,3 @@ int sqlite3Fts5ExprPhraseCollist( return rc; } - diff --git a/sqlite/ext/fts5/fts5_hash.c b/sqlite/ext/fts5/fts5_hash.c index 17570615..e0b91f09 100644 --- a/sqlite/ext/fts5/fts5_hash.c +++ b/sqlite/ext/fts5/fts5_hash.c @@ -90,14 +90,14 @@ int sqlite3Fts5HashNew(Fts5Config *pConfig, Fts5Hash **ppNew, int *pnByte){ if( pNew==0 ){ rc = SQLITE_NOMEM; }else{ - int nByte; + sqlite3_int64 nByte; memset(pNew, 0, sizeof(Fts5Hash)); pNew->pnByte = pnByte; pNew->eDetail = pConfig->eDetail; pNew->nSlot = 1024; nByte = sizeof(Fts5HashEntry*) * pNew->nSlot; - pNew->aSlot = (Fts5HashEntry**)sqlite3_malloc(nByte); + pNew->aSlot = (Fts5HashEntry**)sqlite3_malloc64(nByte); if( pNew->aSlot==0 ){ sqlite3_free(pNew); *ppNew = 0; @@ -165,7 +165,7 @@ static int fts5HashResize(Fts5Hash *pHash){ Fts5HashEntry **apNew; Fts5HashEntry **apOld = pHash->aSlot; - apNew = (Fts5HashEntry**)sqlite3_malloc(nNew*sizeof(Fts5HashEntry*)); + apNew = (Fts5HashEntry**)sqlite3_malloc64(nNew*sizeof(Fts5HashEntry*)); if( !apNew ) return SQLITE_NOMEM; memset(apNew, 0, nNew*sizeof(Fts5HashEntry*)); @@ -259,7 +259,7 @@ int sqlite3Fts5HashWrite( if( p==0 ){ /* Figure out how much space to allocate */ char *zKey; - int nByte = sizeof(Fts5HashEntry) + (nToken+1) + 1 + 64; + sqlite3_int64 nByte = sizeof(Fts5HashEntry) + (nToken+1) + 1 + 64; if( nByte<128 ) nByte = 128; /* Grow the Fts5Hash.aSlot[] array if necessary. */ @@ -270,7 +270,7 @@ int sqlite3Fts5HashWrite( } /* Allocate new Fts5HashEntry and add it to the hash table. */ - p = (Fts5HashEntry*)sqlite3_malloc(nByte); + p = (Fts5HashEntry*)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, sizeof(Fts5HashEntry)); p->nAlloc = nByte; @@ -309,12 +309,12 @@ int sqlite3Fts5HashWrite( ** + 5 bytes for the new position offset (32-bit max). */ if( (p->nAlloc - p->nData) < (9 + 4 + 1 + 3 + 5) ){ - int nNew = p->nAlloc * 2; + sqlite3_int64 nNew = p->nAlloc * 2; Fts5HashEntry *pNew; Fts5HashEntry **pp; - pNew = (Fts5HashEntry*)sqlite3_realloc(p, nNew); + pNew = (Fts5HashEntry*)sqlite3_realloc64(p, nNew); if( pNew==0 ) return SQLITE_NOMEM; - pNew->nAlloc = nNew; + pNew->nAlloc = (int)nNew; for(pp=&pHash->aSlot[iHash]; *pp!=p; pp=&(*pp)->pHashNext); *pp = pNew; p = pNew; @@ -438,7 +438,7 @@ static int fts5HashEntrySort( int i; *ppSorted = 0; - ap = sqlite3_malloc(sizeof(Fts5HashEntry*) * nMergeSlot); + ap = sqlite3_malloc64(sizeof(Fts5HashEntry*) * nMergeSlot); if( !ap ) return SQLITE_NOMEM; memset(ap, 0, sizeof(Fts5HashEntry*) * nMergeSlot); @@ -483,7 +483,8 @@ int sqlite3Fts5HashQuery( for(p=pHash->aSlot[iHash]; p; p=p->pHashNext){ zKey = fts5EntryKey(p); - if( memcmp(zKey, pTerm, nTerm)==0 && zKey[nTerm]==0 ) break; + assert( p->nKey+1==(int)strlen(zKey) ); + if( nTerm==p->nKey+1 && memcmp(zKey, pTerm, nTerm)==0 ) break; } if( p ){ @@ -534,4 +535,3 @@ void sqlite3Fts5HashScanEntry( *pnDoclist = 0; } } - diff --git a/sqlite/ext/fts5/fts5_index.c b/sqlite/ext/fts5/fts5_index.c index 0a6d8d23..5ce75bd1 100644 --- a/sqlite/ext/fts5/fts5_index.c +++ b/sqlite/ext/fts5/fts5_index.c @@ -512,7 +512,6 @@ struct Fts5Iter { Fts5IndexIter base; /* Base class containing output vars */ Fts5Index *pIndex; /* Index that owns this iterator */ - Fts5Structure *pStruct; /* Database structure for this iterator */ Fts5Buffer poslist; /* Buffer containing current poslist */ Fts5Colset *pColset; /* Restrict matches to these columns */ @@ -573,7 +572,7 @@ static u16 fts5GetU16(const u8 *aIn){ ** If an OOM error is encountered, return NULL and set the error code in ** the Fts5Index handle passed as the first argument. */ -static void *fts5IdxMalloc(Fts5Index *p, int nByte){ +static void *fts5IdxMalloc(Fts5Index *p, sqlite3_int64 nByte){ return sqlite3Fts5MallocZero(&p->rc, nByte); } @@ -607,7 +606,7 @@ static int fts5BufferCompareBlob( */ static int fts5BufferCompare(Fts5Buffer *pLeft, Fts5Buffer *pRight){ int nCmp = MIN(pLeft->n, pRight->n); - int res = memcmp(pLeft->p, pRight->p, nCmp); + int res = fts5Memcmp(pLeft->p, pRight->p, nCmp); return (res==0 ? (pLeft->n - pRight->n) : res); } @@ -673,8 +672,8 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ if( rc==SQLITE_OK ){ u8 *aOut = 0; /* Read blob data into this buffer */ int nByte = sqlite3_blob_bytes(p->pReader); - int nAlloc = sizeof(Fts5Data) + nByte + FTS5_DATA_PADDING; - pRet = (Fts5Data*)sqlite3_malloc(nAlloc); + sqlite3_int64 nAlloc = sizeof(Fts5Data) + nByte + FTS5_DATA_PADDING; + pRet = (Fts5Data*)sqlite3_malloc64(nAlloc); if( pRet ){ pRet->nn = nByte; aOut = pRet->p = (u8*)&pRet[1]; @@ -690,6 +689,7 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ pRet = 0; }else{ /* TODO1: Fix this */ + pRet->p[nByte] = 0x00; pRet->szLeaf = fts5GetU16(&pRet->p[2]); } } @@ -729,7 +729,8 @@ static int fts5IndexPrepareStmt( if( p->rc==SQLITE_OK ){ if( zSql ){ p->rc = sqlite3_prepare_v3(p->pConfig->db, zSql, -1, - SQLITE_PREPARE_PERSISTENT, ppStmt, 0); + SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB, + ppStmt, 0); }else{ p->rc = SQLITE_NOMEM; } @@ -770,23 +771,12 @@ static void fts5DataDelete(Fts5Index *p, i64 iFirst, i64 iLast){ if( p->rc!=SQLITE_OK ) return; if( p->pDeleter==0 ){ - int rc; Fts5Config *pConfig = p->pConfig; char *zSql = sqlite3_mprintf( "DELETE FROM '%q'.'%q_data' WHERE id>=? AND id<=?", pConfig->zDb, pConfig->zName ); - if( zSql==0 ){ - rc = SQLITE_NOMEM; - }else{ - rc = sqlite3_prepare_v3(pConfig->db, zSql, -1, - SQLITE_PREPARE_PERSISTENT, &p->pDeleter, 0); - sqlite3_free(zSql); - } - if( rc!=SQLITE_OK ){ - p->rc = rc; - return; - } + if( fts5IndexPrepareStmt(p, &p->pDeleter, zSql) ) return; } sqlite3_bind_int64(p->pDeleter, 1, iFirst); @@ -858,7 +848,7 @@ static int fts5StructureDecode( int iLvl; int nLevel = 0; int nSegment = 0; - int nByte; /* Bytes of space to allocate at pRet */ + sqlite3_int64 nByte; /* Bytes of space to allocate at pRet */ Fts5Structure *pRet = 0; /* Structure object to return */ /* Grab the cookie value */ @@ -869,6 +859,11 @@ static int fts5StructureDecode( ** structure record. */ i += fts5GetVarint32(&pData[i], nLevel); i += fts5GetVarint32(&pData[i], nSegment); + if( nLevel>FTS5_MAX_SEGMENT || nLevel<0 + || nSegment>FTS5_MAX_SEGMENT || nSegment<0 + ){ + return FTS5_CORRUPT; + } nByte = ( sizeof(Fts5Structure) + /* Main structure */ sizeof(Fts5StructureLevel) * (nLevel-1) /* aLevel[] array */ @@ -891,25 +886,35 @@ static int fts5StructureDecode( }else{ i += fts5GetVarint32(&pData[i], pLvl->nMerge); i += fts5GetVarint32(&pData[i], nTotal); - assert( nTotal>=pLvl->nMerge ); + if( nTotalnMerge ) rc = FTS5_CORRUPT; pLvl->aSeg = (Fts5StructureSegment*)sqlite3Fts5MallocZero(&rc, nTotal * sizeof(Fts5StructureSegment) ); + nSegment -= nTotal; } if( rc==SQLITE_OK ){ pLvl->nSeg = nTotal; for(iSeg=0; iSegaSeg[iSeg]; if( i>=nData ){ rc = FTS5_CORRUPT; break; } - i += fts5GetVarint32(&pData[i], pLvl->aSeg[iSeg].iSegid); - i += fts5GetVarint32(&pData[i], pLvl->aSeg[iSeg].pgnoFirst); - i += fts5GetVarint32(&pData[i], pLvl->aSeg[iSeg].pgnoLast); + i += fts5GetVarint32(&pData[i], pSeg->iSegid); + i += fts5GetVarint32(&pData[i], pSeg->pgnoFirst); + i += fts5GetVarint32(&pData[i], pSeg->pgnoLast); + if( pSeg->pgnoLastpgnoFirst ){ + rc = FTS5_CORRUPT; + break; + } } + if( iLvl>0 && pLvl[-1].nMerge && nTotal==0 ) rc = FTS5_CORRUPT; + if( iLvl==nLevel-1 && pLvl->nMerge ) rc = FTS5_CORRUPT; } } + if( nSegment!=0 && rc==SQLITE_OK ) rc = FTS5_CORRUPT; + if( rc!=SQLITE_OK ){ fts5StructureRelease(pRet); pRet = 0; @@ -927,12 +932,12 @@ static void fts5StructureAddLevel(int *pRc, Fts5Structure **ppStruct){ if( *pRc==SQLITE_OK ){ Fts5Structure *pStruct = *ppStruct; int nLevel = pStruct->nLevel; - int nByte = ( + sqlite3_int64 nByte = ( sizeof(Fts5Structure) + /* Main structure */ sizeof(Fts5StructureLevel) * (nLevel+1) /* aLevel[] array */ ); - pStruct = sqlite3_realloc(pStruct, nByte); + pStruct = sqlite3_realloc64(pStruct, nByte); if( pStruct ){ memset(&pStruct->aLevel[nLevel], 0, sizeof(Fts5StructureLevel)); pStruct->nLevel++; @@ -957,10 +962,10 @@ static void fts5StructureExtendLevel( if( *pRc==SQLITE_OK ){ Fts5StructureLevel *pLvl = &pStruct->aLevel[iLvl]; Fts5StructureSegment *aNew; - int nByte; + sqlite3_int64 nByte; nByte = (pLvl->nSeg + nExtra) * sizeof(Fts5StructureSegment); - aNew = sqlite3_realloc(pLvl->aSeg, nByte); + aNew = sqlite3_realloc64(pLvl->aSeg, nByte); if( aNew ){ if( bInsert==0 ){ memset(&aNew[pLvl->nSeg], 0, sizeof(Fts5StructureSegment) * nExtra); @@ -1474,10 +1479,10 @@ static Fts5DlidxIter *fts5DlidxIterInit( int bDone = 0; for(i=0; p->rc==SQLITE_OK && bDone==0; i++){ - int nByte = sizeof(Fts5DlidxIter) + i * sizeof(Fts5DlidxLvl); + sqlite3_int64 nByte = sizeof(Fts5DlidxIter) + i * sizeof(Fts5DlidxLvl); Fts5DlidxIter *pNew; - pNew = (Fts5DlidxIter*)sqlite3_realloc(pIter, nByte); + pNew = (Fts5DlidxIter*)sqlite3_realloc64(pIter, nByte); if( pNew==0 ){ p->rc = SQLITE_NOMEM; }else{ @@ -1647,12 +1652,13 @@ static void fts5SegIterLoadTerm(Fts5Index *p, Fts5SegIter *pIter, int nKeep){ int nNew; /* Bytes of new data */ iOff += fts5GetVarint32(&a[iOff], nNew); - if( iOff+nNew>pIter->pLeaf->nn ){ + if( iOff+nNew>pIter->pLeaf->szLeaf || nKeep>pIter->term.n || nNew==0 ){ p->rc = FTS5_CORRUPT; return; } pIter->term.n = nKeep; fts5BufferAppendBlob(&p->rc, &pIter->term, nNew, &a[iOff]); + assert( pIter->term.n<=pIter->term.nSpace ); iOff += nNew; pIter->iTermLeafOffset = iOff; pIter->iTermLeafPgno = pIter->iLeafPgno; @@ -1717,7 +1723,7 @@ static void fts5SegIterInit( if( p->rc==SQLITE_OK ){ pIter->iLeafOffset = 4; assert_nc( pIter->pLeaf->nn>4 ); - assert( fts5LeafFirstTermOff(pIter->pLeaf)==4 ); + assert_nc( fts5LeafFirstTermOff(pIter->pLeaf)==4 ); pIter->iPgidxOff = pIter->pLeaf->szLeaf+1; fts5SegIterLoadTerm(p, pIter, 0); fts5SegIterLoadNPos(p, pIter); @@ -1773,7 +1779,7 @@ static void fts5SegIterReverseInitPage(Fts5Index *p, Fts5SegIter *pIter){ /* If necessary, grow the pIter->aRowidOffset[] array. */ if( iRowidOffset>=pIter->nRowidOffset ){ int nNew = pIter->nRowidOffset + 8; - int *aNew = (int*)sqlite3_realloc(pIter->aRowidOffset, nNew*sizeof(int)); + int *aNew = (int*)sqlite3_realloc64(pIter->aRowidOffset,nNew*sizeof(int)); if( aNew==0 ){ p->rc = SQLITE_NOMEM; break; @@ -2227,10 +2233,10 @@ static void fts5LeafSeek( int szLeaf = pIter->pLeaf->szLeaf; int n = pIter->pLeaf->nn; - int nMatch = 0; - int nKeep = 0; - int nNew = 0; - int iTermOff; + u32 nMatch = 0; + u32 nKeep = 0; + u32 nNew = 0; + u32 iTermOff; int iPgidx; /* Current offset in pgidx */ int bEndOfPage = 0; @@ -2254,15 +2260,15 @@ static void fts5LeafSeek( assert( nKeep>=nMatch ); if( nKeep==nMatch ){ - int nCmp; - int i; - nCmp = MIN(nNew, nTerm-nMatch); + u32 nCmp; + u32 i; + nCmp = (u32)MIN(nNew, nTerm-nMatch); for(i=0; ipLeaf->p[iPgidx], iOff); if( iOff<4 || iOff>=pIter->pLeaf->szLeaf ){ p->rc = FTS5_CORRUPT; + return; }else{ nKeep = 0; iTermOff = iOff; @@ -2318,8 +2325,11 @@ static void fts5LeafSeek( } search_success: - pIter->iLeafOffset = iOff + nNew; + if( pIter->iLeafOffset>n || nNew<1 ){ + p->rc = FTS5_CORRUPT; + return; + } pIter->iTermLeafOffset = pIter->iLeafOffset; pIter->iTermLeafPgno = pIter->iLeafPgno; @@ -2426,7 +2436,7 @@ static void fts5SegIterSeekInit( ** 4) the FTS5INDEX_QUERY_SCAN flag was set and the iterator points ** to an entry with a term greater than or equal to (pTerm/nTerm). */ - assert( p->rc!=SQLITE_OK /* 1 */ + assert_nc( p->rc!=SQLITE_OK /* 1 */ || pIter->pLeaf==0 /* 2 */ || fts5BufferCompareBlob(&pIter->term, pTerm, nTerm)==0 /* 3 */ || (bGe && fts5BufferCompareBlob(&pIter->term, pTerm, nTerm)>0) /* 4 */ @@ -2524,7 +2534,7 @@ static void fts5AssertComparisonResult( assert( pRes->iFirst==i1 ); }else{ int nMin = MIN(p1->term.n, p2->term.n); - int res = memcmp(p1->term.p, p2->term.p, nMin); + int res = fts5Memcmp(p1->term.p, p2->term.p, nMin); if( res==0 ) res = p1->term.n - p2->term.n; if( res==0 ){ @@ -2747,7 +2757,6 @@ static void fts5MultiIterFree(Fts5Iter *pIter){ for(i=0; inSeg; i++){ fts5SegIterClear(&pIter->aSeg[i]); } - fts5StructureRelease(pIter->pStruct); fts5BufferFree(&pIter->poslist); sqlite3_free(pIter); } @@ -3095,7 +3104,8 @@ static void fts5SegiterPoslist( Fts5Colset *pColset, Fts5Buffer *pBuf ){ - if( 0==fts5BufferGrow(&p->rc, pBuf, pSeg->nPos) ){ + if( 0==fts5BufferGrow(&p->rc, pBuf, pSeg->nPos+FTS5_DATA_ZERO_PADDING) ){ + memset(&pBuf->p[pBuf->n+pSeg->nPos], 0, FTS5_DATA_ZERO_PADDING); if( pColset==0 ){ fts5ChunkIterate(p, pSeg, (void*)pBuf, fts5PoslistCallback); }else{ @@ -3393,9 +3403,7 @@ static void fts5MultiIterNew( if( pNew==0 ) return; pNew->bRev = (0!=(flags & FTS5INDEX_QUERY_DESC)); pNew->bSkipEmpty = (0!=(flags & FTS5INDEX_QUERY_SKIPEMPTY)); - pNew->pStruct = pStruct; pNew->pColset = pColset; - fts5StructureRef(pStruct); if( (flags & FTS5INDEX_QUERY_NOOUTPUT)==0 ){ fts5IterSetOutputCb(&p->rc, pNew); } @@ -3573,24 +3581,24 @@ static int fts5AllocateSegid(Fts5Index *p, Fts5Structure *pStruct){ for(iLvl=0; iLvlnLevel; iLvl++){ for(iSeg=0; iSegaLevel[iLvl].nSeg; iSeg++){ int iId = pStruct->aLevel[iLvl].aSeg[iSeg].iSegid; - if( iId<=FTS5_MAX_SEGMENT ){ - aUsed[(iId-1) / 32] |= 1 << ((iId-1) % 32); + if( iId<=FTS5_MAX_SEGMENT && iId>0 ){ + aUsed[(iId-1) / 32] |= (u32)1 << ((iId-1) % 32); } } } for(i=0; aUsed[i]==0xFFFFFFFF; i++); mask = aUsed[i]; - for(iSegid=0; mask & (1 << iSegid); iSegid++); + for(iSegid=0; mask & ((u32)1 << iSegid); iSegid++); iSegid += 1 + i*32; #ifdef SQLITE_DEBUG for(iLvl=0; iLvlnLevel; iLvl++){ for(iSeg=0; iSegaLevel[iLvl].nSeg; iSeg++){ - assert( iSegid!=pStruct->aLevel[iLvl].aSeg[iSeg].iSegid ); + assert_nc( iSegid!=pStruct->aLevel[iLvl].aSeg[iSeg].iSegid ); } } - assert( iSegid>0 && iSegid<=FTS5_MAX_SEGMENT ); + assert_nc( iSegid>0 && iSegid<=FTS5_MAX_SEGMENT ); { sqlite3_stmt *pIdxSelect = fts5IdxSelectStmt(p); @@ -3598,7 +3606,7 @@ static int fts5AllocateSegid(Fts5Index *p, Fts5Structure *pStruct){ u8 aBlob[2] = {0xff, 0xff}; sqlite3_bind_int(pIdxSelect, 1, iSegid); sqlite3_bind_blob(pIdxSelect, 2, aBlob, 2, SQLITE_STATIC); - assert( sqlite3_step(pIdxSelect)!=SQLITE_ROW ); + assert_nc( sqlite3_step(pIdxSelect)!=SQLITE_ROW ); p->rc = sqlite3_reset(pIdxSelect); sqlite3_bind_null(pIdxSelect, 2); } @@ -3668,7 +3676,7 @@ static int fts5WriteDlidxGrow( int nLvl ){ if( p->rc==SQLITE_OK && nLvl>=pWriter->nDlidx ){ - Fts5DlidxWriter *aDlidx = (Fts5DlidxWriter*)sqlite3_realloc( + Fts5DlidxWriter *aDlidx = (Fts5DlidxWriter*)sqlite3_realloc64( pWriter->aDlidx, sizeof(Fts5DlidxWriter) * nLvl ); if( aDlidx==0 ){ @@ -3747,8 +3755,10 @@ static void fts5WriteBtreeTerm( int nTerm, const u8 *pTerm /* First term on new page */ ){ fts5WriteFlushBtree(p, pWriter); - fts5BufferSet(&p->rc, &pWriter->btterm, nTerm, pTerm); - pWriter->iBtPage = pWriter->writer.pgno; + if( p->rc==SQLITE_OK ){ + fts5BufferSet(&p->rc, &pWriter->btterm, nTerm, pTerm); + pWriter->iBtPage = pWriter->writer.pgno; + } } /* @@ -3899,6 +3909,7 @@ static void fts5WriteAppendTerm( int nPrefix; /* Bytes of prefix compression for term */ Fts5PageWriter *pPage = &pWriter->writer; Fts5Buffer *pPgidx = &pWriter->writer.pgidx; + int nMin = MIN(pPage->term.n, nTerm); assert( p->rc==SQLITE_OK ); assert( pPage->buf.n>=4 ); @@ -3908,6 +3919,7 @@ static void fts5WriteAppendTerm( if( (pPage->buf.n + pPgidx->n + nTerm + 2)>=p->pConfig->pgsz ){ if( pPage->buf.n>4 ){ fts5WriteFlushLeaf(p, pWriter); + if( p->rc!=SQLITE_OK ) return; } fts5BufferGrow(&p->rc, &pPage->buf, nTerm+FTS5_DATA_PADDING); } @@ -3940,13 +3952,14 @@ static void fts5WriteAppendTerm( ** inefficient, but still correct. */ int n = nTerm; if( pPage->term.n ){ - n = 1 + fts5PrefixCompress(pPage->term.n, pPage->term.p, pTerm); + n = 1 + fts5PrefixCompress(nMin, pPage->term.p, pTerm); } fts5WriteBtreeTerm(p, pWriter, n, pTerm); + if( p->rc!=SQLITE_OK ) return; pPage = &pWriter->writer; } }else{ - nPrefix = fts5PrefixCompress(pPage->term.n, pPage->term.p, pTerm); + nPrefix = fts5PrefixCompress(nMin, pPage->term.p, pTerm); fts5BufferAppendVarint(&p->rc, &pPage->buf, nPrefix); } @@ -3993,7 +4006,7 @@ static void fts5WriteAppendRowid( if( pWriter->bFirstRowidInDoclist || pWriter->bFirstRowidInPage ){ fts5BufferAppendVarint(&p->rc, &pPage->buf, iRowid); }else{ - assert( p->rc || iRowid>pWriter->iPrevRowid ); + assert_nc( p->rc || iRowid>pWriter->iPrevRowid ); fts5BufferAppendVarint(&p->rc, &pPage->buf, iRowid - pWriter->iPrevRowid); } pWriter->iPrevRowid = iRowid; @@ -4115,7 +4128,7 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ int i; Fts5Buffer buf; memset(&buf, 0, sizeof(Fts5Buffer)); - for(i=0; inSeg; i++){ + for(i=0; inSeg && p->rc==SQLITE_OK; i++){ Fts5SegIter *pSeg = &pIter->aSeg[i]; if( pSeg->pSeg==0 ){ /* no-op */ @@ -4133,35 +4146,43 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ u8 aHdr[4] = {0x00, 0x00, 0x00, 0x00}; iLeafRowid = FTS5_SEGMENT_ROWID(iId, pSeg->iTermLeafPgno); - pData = fts5DataRead(p, iLeafRowid); + pData = fts5LeafRead(p, iLeafRowid); if( pData ){ - fts5BufferZero(&buf); - fts5BufferGrow(&p->rc, &buf, pData->nn); - fts5BufferAppendBlob(&p->rc, &buf, sizeof(aHdr), aHdr); - fts5BufferAppendVarint(&p->rc, &buf, pSeg->term.n); - fts5BufferAppendBlob(&p->rc, &buf, pSeg->term.n, pSeg->term.p); - fts5BufferAppendBlob(&p->rc, &buf, pData->szLeaf-iOff, &pData->p[iOff]); - if( p->rc==SQLITE_OK ){ - /* Set the szLeaf field */ - fts5PutU16(&buf.p[2], (u16)buf.n); - } + if( iOff>pData->szLeaf ){ + /* This can occur if the pages that the segments occupy overlap - if + ** a single page has been assigned to more than one segment. In + ** this case a prior iteration of this loop may have corrupted the + ** segment currently being trimmed. */ + p->rc = FTS5_CORRUPT; + }else{ + fts5BufferZero(&buf); + fts5BufferGrow(&p->rc, &buf, pData->nn); + fts5BufferAppendBlob(&p->rc, &buf, sizeof(aHdr), aHdr); + fts5BufferAppendVarint(&p->rc, &buf, pSeg->term.n); + fts5BufferAppendBlob(&p->rc, &buf, pSeg->term.n, pSeg->term.p); + fts5BufferAppendBlob(&p->rc, &buf, pData->szLeaf-iOff,&pData->p[iOff]); + if( p->rc==SQLITE_OK ){ + /* Set the szLeaf field */ + fts5PutU16(&buf.p[2], (u16)buf.n); + } - /* Set up the new page-index array */ - fts5BufferAppendVarint(&p->rc, &buf, 4); - if( pSeg->iLeafPgno==pSeg->iTermLeafPgno - && pSeg->iEndofDoclistszLeaf - ){ - int nDiff = pData->szLeaf - pSeg->iEndofDoclist; - fts5BufferAppendVarint(&p->rc, &buf, buf.n - 1 - nDiff - 4); - fts5BufferAppendBlob(&p->rc, &buf, - pData->nn - pSeg->iPgidxOff, &pData->p[pSeg->iPgidxOff] - ); - } + /* Set up the new page-index array */ + fts5BufferAppendVarint(&p->rc, &buf, 4); + if( pSeg->iLeafPgno==pSeg->iTermLeafPgno + && pSeg->iEndofDoclistszLeaf + ){ + int nDiff = pData->szLeaf - pSeg->iEndofDoclist; + fts5BufferAppendVarint(&p->rc, &buf, buf.n - 1 - nDiff - 4); + fts5BufferAppendBlob(&p->rc, &buf, + pData->nn - pSeg->iPgidxOff, &pData->p[pSeg->iPgidxOff] + ); + } + pSeg->pSeg->pgnoFirst = pSeg->iTermLeafPgno; + fts5DataDelete(p, FTS5_SEGMENT_ROWID(iId, 1), iLeafRowid); + fts5DataWrite(p, iLeafRowid, buf.p, buf.n); + } fts5DataRelease(pData); - pSeg->pSeg->pgnoFirst = pSeg->iTermLeafPgno; - fts5DataDelete(p, FTS5_SEGMENT_ROWID(iId, 1), iLeafRowid); - fts5DataWrite(p, iLeafRowid, buf.p, buf.n); } } } @@ -4253,7 +4274,7 @@ static void fts5IndexMergeLevel( const u8 *pTerm; pTerm = fts5MultiIterTerm(pIter, &nTerm); - if( nTerm!=term.n || memcmp(pTerm, term.p, nTerm) ){ + if( nTerm!=term.n || fts5Memcmp(pTerm, term.p, nTerm) ){ if( pnRem && writer.nLeafWritten>nRem ){ break; } @@ -4508,6 +4529,7 @@ static void fts5FlushOneHash(Fts5Index *p){ /* Write the term for this entry to disk. */ sqlite3Fts5HashScanEntry(pHash, &zTerm, &pDoclist, &nDoclist); fts5WriteAppendTerm(p, &writer, (int)strlen(zTerm), (const u8*)zTerm); + if( p->rc!=SQLITE_OK ) break; assert( writer.bFirstRowidInPage==0 ); if( pgsz>=(pBuf->n + pPgidx->n + nDoclist + 1) ){ @@ -4530,6 +4552,7 @@ static void fts5FlushOneHash(Fts5Index *p){ pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iRowid); writer.bFirstRowidInPage = 0; fts5WriteDlidxAppend(p, &writer, iRowid); + if( p->rc!=SQLITE_OK ) break; }else{ pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iDelta); } @@ -4587,7 +4610,7 @@ static void fts5FlushOneHash(Fts5Index *p){ /* TODO2: Doclist terminator written here. */ /* pBuf->p[pBuf->n++] = '\0'; */ assert( pBuf->n<=pBuf->nSpace ); - sqlite3Fts5HashScanNext(pHash); + if( p->rc==SQLITE_OK ) sqlite3Fts5HashScanNext(pHash); } sqlite3Fts5HashClear(pHash); fts5WriteFinish(p, &writer, &pgnoLast); @@ -4631,7 +4654,7 @@ static Fts5Structure *fts5IndexOptimizeStruct( Fts5Structure *pStruct ){ Fts5Structure *pNew = 0; - int nByte = sizeof(Fts5Structure); + sqlite3_int64 nByte = sizeof(Fts5Structure); int nSeg = pStruct->nSegment; int i; @@ -4761,11 +4784,13 @@ static void fts5AppendPoslist( Fts5Buffer *pBuf ){ int nData = pMulti->base.nData; + int nByte = nData + 9 + 9 + FTS5_DATA_ZERO_PADDING; assert( nData>0 ); - if( p->rc==SQLITE_OK && 0==fts5BufferGrow(&p->rc, pBuf, nData+9+9) ){ + if( p->rc==SQLITE_OK && 0==fts5BufferGrow(&p->rc, pBuf, nByte) ){ fts5BufferSafeAppendVarint(pBuf, iDelta); fts5BufferSafeAppendVarint(pBuf, nData*2); fts5BufferSafeAppendBlob(pBuf, pMulti->base.pData, nData); + memset(&pBuf->p[pBuf->n], 0, FTS5_DATA_ZERO_PADDING); } } @@ -4946,6 +4971,8 @@ static void fts5MergePrefixLists( int iOff2 = 0; u8 *a1 = &i1.aPoslist[i1.nSize]; u8 *a2 = &i2.aPoslist[i2.nSize]; + int nCopy; + u8 *aCopy; i64 iPrev = 0; Fts5PoslistWriter writer; @@ -4977,7 +5004,7 @@ static void fts5MergePrefixLists( sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1); if( iPos1<0 ) break; }else{ - assert( iPos2!=iPrev ); + assert_nc( iPos2!=iPrev ); sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos2); sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2); if( iPos2<0 ) break; @@ -4989,11 +5016,16 @@ static void fts5MergePrefixLists( if( iPos1!=iPrev ){ sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos1); } - fts5BufferSafeAppendBlob(&tmp, &a1[iOff1], i1.nPoslist-iOff1); + aCopy = &a1[iOff1]; + nCopy = i1.nPoslist - iOff1; }else{ assert( iPos2>=0 && iPos2!=iPrev ); sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos2); - fts5BufferSafeAppendBlob(&tmp, &a2[iOff2], i2.nPoslist-iOff2); + aCopy = &a2[iOff2]; + nCopy = i2.nPoslist - iOff2; + } + if( nCopy>0 ){ + fts5BufferSafeAppendBlob(&tmp, aCopy, nCopy); } /* WRITEPOSLISTSIZE */ @@ -5001,6 +5033,7 @@ static void fts5MergePrefixLists( fts5BufferSafeAppendBlob(&out, tmp.p, tmp.n); fts5DoclistIterNext(&i1); fts5DoclistIterNext(&i2); + assert( out.n<=(p1->n+p2->n+9) ); if( i1.aPoslist==0 || i2.aPoslist==0 ) break; } } @@ -5102,7 +5135,7 @@ static void fts5SetupPrefixIter( } fts5MultiIterFree(p1); - pData = fts5IdxMalloc(p, sizeof(Fts5Data) + doclist.n); + pData = fts5IdxMalloc(p, sizeof(Fts5Data)+doclist.n+FTS5_DATA_ZERO_PADDING); if( pData ){ pData->p = (u8*)&pData[1]; pData->nn = pData->szLeaf = doclist.n; @@ -5864,11 +5897,11 @@ static void fts5IndexIntegrityCheckSegment( iOff = fts5LeafFirstTermOff(pLeaf); iRowidOff = fts5LeafFirstRowidOff(pLeaf); - if( iRowidOff>=iOff ){ + if( iRowidOff>=iOff || iOff>=pLeaf->szLeaf ){ p->rc = FTS5_CORRUPT; }else{ iOff += fts5GetVarint32(&pLeaf->p[iOff], nTerm); - res = memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm)); + res = fts5Memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm)); if( res==0 ) res = nTerm - nIdxTerm; if( res<0 ) p->rc = FTS5_CORRUPT; } @@ -6263,7 +6296,7 @@ static void fts5DecodeFunction( u8 *a = 0; Fts5Buffer s; /* Build up text to return here */ int rc = SQLITE_OK; /* Return code */ - int nSpace = 0; + sqlite3_int64 nSpace = 0; int eDetailNone = (sqlite3_user_data(pCtx)!=0); assert( nArg==2 ); @@ -6279,8 +6312,7 @@ static void fts5DecodeFunction( nSpace = n + FTS5_DATA_ZERO_PADDING; a = (u8*)sqlite3Fts5MallocZero(&rc, nSpace); if( a==0 ) goto decode_out; - memcpy(a, aBlob, n); - + if( n>0 ) memcpy(a, aBlob, n); fts5DecodeRowid(iRowid, &iSegid, &bDlidx, &iHeight, &iPgno); @@ -6375,6 +6407,9 @@ static void fts5DecodeFunction( iPgidxOff = szLeaf = fts5GetU16(&a[2]); if( iPgidxOffn ){ + rc = FTS5_CORRUPT; + goto decode_out; } } @@ -6386,14 +6421,22 @@ static void fts5DecodeFunction( }else{ iOff = szLeaf; } + if( iOff>n ){ + rc = FTS5_CORRUPT; + goto decode_out; + } fts5DecodePoslist(&rc, &s, &a[4], iOff-4); /* Decode any more doclist data that appears on the page before the ** first term. */ nDoclist = (iTermOff ? iTermOff : szLeaf) - iOff; + if( nDoclist+iOff>n ){ + rc = FTS5_CORRUPT; + goto decode_out; + } fts5DecodeDoclist(&rc, &s, &a[iOff], nDoclist); - while( iPgidxOffszLeaf ){ + rc = FTS5_CORRUPT; + break; + } if( bFirst==0 ){ iOff += fts5GetVarint32(&a[iOff], nByte); + if( nByte>term.n ){ + rc = FTS5_CORRUPT; + break; + } term.n = nByte; } iOff += fts5GetVarint32(&a[iOff], nByte); + if( iOff+nByte>n ){ + rc = FTS5_CORRUPT; + break; + } fts5BufferAppendBlob(&rc, &term, nByte, &a[iOff]); iOff += nByte; diff --git a/sqlite/ext/fts5/fts5_main.c b/sqlite/ext/fts5/fts5_main.c index e5ff3936..f20c01b0 100644 --- a/sqlite/ext/fts5/fts5_main.c +++ b/sqlite/ext/fts5/fts5_main.c @@ -28,8 +28,8 @@ int sqlite3_fts5_may_be_corrupt = 1; typedef struct Fts5Auxdata Fts5Auxdata; typedef struct Fts5Auxiliary Fts5Auxiliary; typedef struct Fts5Cursor Fts5Cursor; +typedef struct Fts5FullTable Fts5FullTable; typedef struct Fts5Sorter Fts5Sorter; -typedef struct Fts5Table Fts5Table; typedef struct Fts5TokenizerModule Fts5TokenizerModule; /* @@ -110,13 +110,8 @@ struct Fts5TokenizerModule { Fts5TokenizerModule *pNext; /* Next registered tokenizer module */ }; -/* -** Virtual-table object. -*/ -struct Fts5Table { - sqlite3_vtab base; /* Base class used by SQLite core */ - Fts5Config *pConfig; /* Virtual table configuration */ - Fts5Index *pIndex; /* Full-text index */ +struct Fts5FullTable { + Fts5Table p; /* Public class members from fts5Int.h */ Fts5Storage *pStorage; /* Document store */ Fts5Global *pGlobal; /* Global (connection wide) data */ Fts5Cursor *pSortCsr; /* Sort data from this cursor */ @@ -254,7 +249,7 @@ struct Fts5Auxdata { #define FTS5_SAVEPOINT 5 #define FTS5_RELEASE 6 #define FTS5_ROLLBACKTO 7 -static void fts5CheckTransactionState(Fts5Table *p, int op, int iSavepoint){ +static void fts5CheckTransactionState(Fts5FullTable *p, int op, int iSavepoint){ switch( op ){ case FTS5_BEGIN: assert( p->ts.eState==0 ); @@ -293,7 +288,7 @@ static void fts5CheckTransactionState(Fts5Table *p, int op, int iSavepoint){ case FTS5_ROLLBACKTO: assert( p->ts.eState==1 ); - assert( iSavepoint>=0 ); + assert( iSavepoint>=-1 ); assert( iSavepoint<=p->ts.iSavepoint ); p->ts.iSavepoint = iSavepoint; break; @@ -306,18 +301,18 @@ static void fts5CheckTransactionState(Fts5Table *p, int op, int iSavepoint){ /* ** Return true if pTab is a contentless table. */ -static int fts5IsContentless(Fts5Table *pTab){ - return pTab->pConfig->eContent==FTS5_CONTENT_NONE; +static int fts5IsContentless(Fts5FullTable *pTab){ + return pTab->p.pConfig->eContent==FTS5_CONTENT_NONE; } /* ** Delete a virtual table handle allocated by fts5InitVtab(). */ -static void fts5FreeVtab(Fts5Table *pTab){ +static void fts5FreeVtab(Fts5FullTable *pTab){ if( pTab ){ - sqlite3Fts5IndexClose(pTab->pIndex); + sqlite3Fts5IndexClose(pTab->p.pIndex); sqlite3Fts5StorageClose(pTab->pStorage); - sqlite3Fts5ConfigFree(pTab->pConfig); + sqlite3Fts5ConfigFree(pTab->p.pConfig); sqlite3_free(pTab); } } @@ -326,7 +321,7 @@ static void fts5FreeVtab(Fts5Table *pTab){ ** The xDisconnect() virtual table method. */ static int fts5DisconnectMethod(sqlite3_vtab *pVtab){ - fts5FreeVtab((Fts5Table*)pVtab); + fts5FreeVtab((Fts5FullTable*)pVtab); return SQLITE_OK; } @@ -337,7 +332,7 @@ static int fts5DestroyMethod(sqlite3_vtab *pVtab){ Fts5Table *pTab = (Fts5Table*)pVtab; int rc = sqlite3Fts5DropAll(pTab->pConfig); if( rc==SQLITE_OK ){ - fts5FreeVtab((Fts5Table*)pVtab); + fts5FreeVtab((Fts5FullTable*)pVtab); } return rc; } @@ -366,28 +361,28 @@ static int fts5InitVtab( const char **azConfig = (const char**)argv; int rc = SQLITE_OK; /* Return code */ Fts5Config *pConfig = 0; /* Results of parsing argc/argv */ - Fts5Table *pTab = 0; /* New virtual table object */ + Fts5FullTable *pTab = 0; /* New virtual table object */ /* Allocate the new vtab object and parse the configuration */ - pTab = (Fts5Table*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5Table)); + pTab = (Fts5FullTable*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5FullTable)); if( rc==SQLITE_OK ){ rc = sqlite3Fts5ConfigParse(pGlobal, db, argc, azConfig, &pConfig, pzErr); assert( (rc==SQLITE_OK && *pzErr==0) || pConfig==0 ); } if( rc==SQLITE_OK ){ - pTab->pConfig = pConfig; + pTab->p.pConfig = pConfig; pTab->pGlobal = pGlobal; } /* Open the index sub-system */ if( rc==SQLITE_OK ){ - rc = sqlite3Fts5IndexOpen(pConfig, bCreate, &pTab->pIndex, pzErr); + rc = sqlite3Fts5IndexOpen(pConfig, bCreate, &pTab->p.pIndex, pzErr); } /* Open the storage sub-system */ if( rc==SQLITE_OK ){ rc = sqlite3Fts5StorageOpen( - pConfig, pTab->pIndex, bCreate, &pTab->pStorage, pzErr + pConfig, pTab->p.pIndex, bCreate, &pTab->pStorage, pzErr ); } @@ -400,8 +395,8 @@ static int fts5InitVtab( if( rc==SQLITE_OK ){ assert( pConfig->pzErrmsg==0 ); pConfig->pzErrmsg = pzErr; - rc = sqlite3Fts5IndexLoadConfig(pTab->pIndex); - sqlite3Fts5IndexRollback(pTab->pIndex); + rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); + sqlite3Fts5IndexRollback(pTab->p.pIndex); pConfig->pzErrmsg = 0; } @@ -614,7 +609,7 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ return SQLITE_OK; } -static int fts5NewTransaction(Fts5Table *pTab){ +static int fts5NewTransaction(Fts5FullTable *pTab){ Fts5Cursor *pCsr; for(pCsr=pTab->pGlobal->pCsr; pCsr; pCsr=pCsr->pNext){ if( pCsr->base.pVtab==(sqlite3_vtab*)pTab ) return SQLITE_OK; @@ -626,16 +621,16 @@ static int fts5NewTransaction(Fts5Table *pTab){ ** Implementation of xOpen method. */ static int fts5OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ - Fts5Table *pTab = (Fts5Table*)pVTab; - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)pVTab; + Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = 0; /* New cursor object */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ int rc; /* Return code */ rc = fts5NewTransaction(pTab); if( rc==SQLITE_OK ){ nByte = sizeof(Fts5Cursor) + pConfig->nCol * sizeof(int); - pCsr = (Fts5Cursor*)sqlite3_malloc(nByte); + pCsr = (Fts5Cursor*)sqlite3_malloc64(nByte); if( pCsr ){ Fts5Global *pGlobal = pTab->pGlobal; memset(pCsr, 0, nByte); @@ -673,7 +668,7 @@ static void fts5CsrNewrow(Fts5Cursor *pCsr){ } static void fts5FreeCursorComponents(Fts5Cursor *pCsr){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); Fts5Auxdata *pData; Fts5Auxdata *pNext; @@ -717,7 +712,7 @@ static void fts5FreeCursorComponents(Fts5Cursor *pCsr){ */ static int fts5CloseMethod(sqlite3_vtab_cursor *pCursor){ if( pCursor ){ - Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCursor->pVtab); Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; Fts5Cursor **pp; @@ -774,7 +769,7 @@ static int fts5SorterNext(Fts5Cursor *pCsr){ ** Set the FTS5CSR_REQUIRE_RESEEK flag on all FTS5_PLAN_MATCH cursors ** open on table pTab. */ -static void fts5TripCursors(Fts5Table *pTab){ +static void fts5TripCursors(Fts5FullTable *pTab){ Fts5Cursor *pCsr; for(pCsr=pTab->pGlobal->pCsr; pCsr; pCsr=pCsr->pNext){ if( pCsr->ePlan==FTS5_PLAN_MATCH @@ -801,11 +796,11 @@ static int fts5CursorReseek(Fts5Cursor *pCsr, int *pbSkip){ int rc = SQLITE_OK; assert( *pbSkip==0 ); if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_RESEEK) ){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); int bDesc = pCsr->bDesc; i64 iRowid = sqlite3Fts5ExprRowid(pCsr->pExpr); - rc = sqlite3Fts5ExprFirst(pCsr->pExpr, pTab->pIndex, iRowid, bDesc); + rc = sqlite3Fts5ExprFirst(pCsr->pExpr, pTab->p.pIndex, iRowid, bDesc); if( rc==SQLITE_OK && iRowid!=sqlite3Fts5ExprRowid(pCsr->pExpr) ){ *pbSkip = 1; } @@ -902,18 +897,22 @@ static int fts5PrepareStatement( return rc; } -static int fts5CursorFirstSorted(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ - Fts5Config *pConfig = pTab->pConfig; +static int fts5CursorFirstSorted( + Fts5FullTable *pTab, + Fts5Cursor *pCsr, + int bDesc +){ + Fts5Config *pConfig = pTab->p.pConfig; Fts5Sorter *pSorter; int nPhrase; - int nByte; + sqlite3_int64 nByte; int rc; const char *zRank = pCsr->zRank; const char *zRankArgs = pCsr->zRankArgs; nPhrase = sqlite3Fts5ExprPhraseCount(pCsr->pExpr); nByte = sizeof(Fts5Sorter) + sizeof(int) * (nPhrase-1); - pSorter = (Fts5Sorter*)sqlite3_malloc(nByte); + pSorter = (Fts5Sorter*)sqlite3_malloc64(nByte); if( pSorter==0 ) return SQLITE_NOMEM; memset(pSorter, 0, nByte); pSorter->nIdx = nPhrase; @@ -950,10 +949,10 @@ static int fts5CursorFirstSorted(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ return rc; } -static int fts5CursorFirst(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ +static int fts5CursorFirst(Fts5FullTable *pTab, Fts5Cursor *pCsr, int bDesc){ int rc; Fts5Expr *pExpr = pCsr->pExpr; - rc = sqlite3Fts5ExprFirst(pExpr, pTab->pIndex, pCsr->iFirstRowid, bDesc); + rc = sqlite3Fts5ExprFirst(pExpr, pTab->p.pIndex, pCsr->iFirstRowid, bDesc); if( sqlite3Fts5ExprEof(pExpr) ){ CsrFlagSet(pCsr, FTS5CSR_EOF); } @@ -968,7 +967,7 @@ static int fts5CursorFirst(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ ** parameters. */ static int fts5SpecialMatch( - Fts5Table *pTab, + Fts5FullTable *pTab, Fts5Cursor *pCsr, const char *zQuery ){ @@ -979,18 +978,18 @@ static int fts5SpecialMatch( while( z[0]==' ' ) z++; for(n=0; z[n] && z[n]!=' '; n++); - assert( pTab->base.zErrMsg==0 ); + assert( pTab->p.base.zErrMsg==0 ); pCsr->ePlan = FTS5_PLAN_SPECIAL; if( 0==sqlite3_strnicmp("reads", z, n) ){ - pCsr->iSpecial = sqlite3Fts5IndexReads(pTab->pIndex); + pCsr->iSpecial = sqlite3Fts5IndexReads(pTab->p.pIndex); } else if( 0==sqlite3_strnicmp("id", z, n) ){ pCsr->iSpecial = pCsr->iCsrId; } else{ /* An unrecognized directive. Return an error message. */ - pTab->base.zErrMsg = sqlite3_mprintf("unknown special query: %.*s", n, z); + pTab->p.base.zErrMsg = sqlite3_mprintf("unknown special query: %.*s", n, z); rc = SQLITE_ERROR; } @@ -1002,7 +1001,7 @@ static int fts5SpecialMatch( ** pTab. If one is found, return a pointer to the corresponding Fts5Auxiliary ** structure. Otherwise, if no such function exists, return NULL. */ -static Fts5Auxiliary *fts5FindAuxiliary(Fts5Table *pTab, const char *zName){ +static Fts5Auxiliary *fts5FindAuxiliary(Fts5FullTable *pTab, const char *zName){ Fts5Auxiliary *pAux; for(pAux=pTab->pGlobal->pAux; pAux; pAux=pAux->pNext){ @@ -1015,8 +1014,8 @@ static Fts5Auxiliary *fts5FindAuxiliary(Fts5Table *pTab, const char *zName){ static int fts5FindRankFunction(Fts5Cursor *pCsr){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); + Fts5Config *pConfig = pTab->p.pConfig; int rc = SQLITE_OK; Fts5Auxiliary *pAux = 0; const char *zRank = pCsr->zRank; @@ -1032,7 +1031,7 @@ static int fts5FindRankFunction(Fts5Cursor *pCsr){ assert( rc==SQLITE_OK || pCsr->pRankArgStmt==0 ); if( rc==SQLITE_OK ){ if( SQLITE_ROW==sqlite3_step(pStmt) ){ - int nByte; + sqlite3_int64 nByte; pCsr->nRankArg = sqlite3_column_count(pStmt); nByte = sizeof(sqlite3_value*)*pCsr->nRankArg; pCsr->apRankArg = (sqlite3_value**)sqlite3Fts5MallocZero(&rc, nByte); @@ -1054,8 +1053,8 @@ static int fts5FindRankFunction(Fts5Cursor *pCsr){ if( rc==SQLITE_OK ){ pAux = fts5FindAuxiliary(pTab, zRank); if( pAux==0 ){ - assert( pTab->base.zErrMsg==0 ); - pTab->base.zErrMsg = sqlite3_mprintf("no such function: %s", zRank); + assert( pTab->p.base.zErrMsg==0 ); + pTab->p.base.zErrMsg = sqlite3_mprintf("no such function: %s", zRank); rc = SQLITE_ERROR; } } @@ -1130,8 +1129,8 @@ static int fts5FilterMethod( int nVal, /* Number of elements in apVal */ sqlite3_value **apVal /* Arguments for the indexing scheme */ ){ - Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCursor->pVtab); + Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; int rc = SQLITE_OK; /* Error code */ int iVal = 0; /* Counter for apVal[] */ @@ -1160,8 +1159,8 @@ static int fts5FilterMethod( assert( pCsr->zRank==0 ); assert( pCsr->zRankArgs==0 ); - assert( pzErrmsg==0 || pzErrmsg==&pTab->base.zErrMsg ); - pConfig->pzErrmsg = &pTab->base.zErrMsg; + assert( pzErrmsg==0 || pzErrmsg==&pTab->p.base.zErrMsg ); + pConfig->pzErrmsg = &pTab->p.base.zErrMsg; /* Decode the arguments passed through to this function. ** @@ -1227,7 +1226,7 @@ static int fts5FilterMethod( ** but a request for an internal parameter. */ rc = fts5SpecialMatch(pTab, pCsr, &zExpr[1]); }else{ - char **pzErr = &pTab->base.zErrMsg; + char **pzErr = &pTab->p.base.zErrMsg; rc = sqlite3Fts5ExprNew(pConfig, iCol, zExpr, &pCsr->pExpr, pzErr); if( rc==SQLITE_OK ){ if( bOrderByRank ){ @@ -1250,7 +1249,7 @@ static int fts5FilterMethod( ** by rowid (ePlan==FTS5_PLAN_ROWID). */ pCsr->ePlan = (pRowidEq ? FTS5_PLAN_ROWID : FTS5_PLAN_SCAN); rc = sqlite3Fts5StorageStmt( - pTab->pStorage, fts5StmtType(pCsr), &pCsr->pStmt, &pTab->base.zErrMsg + pTab->pStorage, fts5StmtType(pCsr), &pCsr->pStmt, &pTab->p.base.zErrMsg ); if( rc==SQLITE_OK ){ if( pCsr->ePlan==FTS5_PLAN_ROWID ){ @@ -1333,12 +1332,12 @@ static int fts5SeekCursor(Fts5Cursor *pCsr, int bErrormsg){ /* If the cursor does not yet have a statement handle, obtain one now. */ if( pCsr->pStmt==0 ){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); int eStmt = fts5StmtType(pCsr); rc = sqlite3Fts5StorageStmt( - pTab->pStorage, eStmt, &pCsr->pStmt, (bErrormsg?&pTab->base.zErrMsg:0) + pTab->pStorage, eStmt, &pCsr->pStmt, (bErrormsg?&pTab->p.base.zErrMsg:0) ); - assert( rc!=SQLITE_OK || pTab->base.zErrMsg==0 ); + assert( rc!=SQLITE_OK || pTab->p.base.zErrMsg==0 ); assert( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_CONTENT) ); } @@ -1360,11 +1359,11 @@ static int fts5SeekCursor(Fts5Cursor *pCsr, int bErrormsg){ return rc; } -static void fts5SetVtabError(Fts5Table *p, const char *zFormat, ...){ +static void fts5SetVtabError(Fts5FullTable *p, const char *zFormat, ...){ va_list ap; /* ... printf arguments */ va_start(ap, zFormat); - assert( p->base.zErrMsg==0 ); - p->base.zErrMsg = sqlite3_vmprintf(zFormat, ap); + assert( p->p.base.zErrMsg==0 ); + p->p.base.zErrMsg = sqlite3_vmprintf(zFormat, ap); va_end(ap); } @@ -1384,11 +1383,11 @@ static void fts5SetVtabError(Fts5Table *p, const char *zFormat, ...){ ** more commands are added to this function. */ static int fts5SpecialInsert( - Fts5Table *pTab, /* Fts5 table object */ + Fts5FullTable *pTab, /* Fts5 table object */ const char *zCmd, /* Text inserted into table-name column */ sqlite3_value *pVal /* Value inserted into rank column */ ){ - Fts5Config *pConfig = pTab->pConfig; + Fts5Config *pConfig = pTab->p.pConfig; int rc = SQLITE_OK; int bError = 0; @@ -1423,9 +1422,9 @@ static int fts5SpecialInsert( pConfig->bPrefixIndex = sqlite3_value_int(pVal); #endif }else{ - rc = sqlite3Fts5IndexLoadConfig(pTab->pIndex); + rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); if( rc==SQLITE_OK ){ - rc = sqlite3Fts5ConfigSetValue(pTab->pConfig, zCmd, pVal, &bError); + rc = sqlite3Fts5ConfigSetValue(pTab->p.pConfig, zCmd, pVal, &bError); } if( rc==SQLITE_OK ){ if( bError ){ @@ -1439,7 +1438,7 @@ static int fts5SpecialInsert( } static int fts5SpecialDelete( - Fts5Table *pTab, + Fts5FullTable *pTab, sqlite3_value **apVal ){ int rc = SQLITE_OK; @@ -1453,7 +1452,7 @@ static int fts5SpecialDelete( static void fts5StorageInsert( int *pRc, - Fts5Table *pTab, + Fts5FullTable *pTab, sqlite3_value **apVal, i64 *piRowid ){ @@ -1487,8 +1486,8 @@ static int fts5UpdateMethod( sqlite3_value **apVal, /* Array of arguments */ sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */ ){ - Fts5Table *pTab = (Fts5Table*)pVtab; - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; + Fts5Config *pConfig = pTab->p.pConfig; int eType0; /* value_type() of apVal[0] */ int rc = SQLITE_OK; /* Return code */ @@ -1497,12 +1496,11 @@ static int fts5UpdateMethod( assert( pVtab->zErrMsg==0 ); assert( nArg==1 || nArg==(2+pConfig->nCol+2) ); - assert( nArg==1 - || sqlite3_value_type(apVal[1])==SQLITE_INTEGER - || sqlite3_value_type(apVal[1])==SQLITE_NULL + assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER + || sqlite3_value_type(apVal[0])==SQLITE_NULL ); - assert( pTab->pConfig->pzErrmsg==0 ); - pTab->pConfig->pzErrmsg = &pTab->base.zErrMsg; + assert( pTab->p.pConfig->pzErrmsg==0 ); + pTab->p.pConfig->pzErrmsg = &pTab->p.base.zErrMsg; /* Put any active cursors into REQUIRE_SEEK state. */ fts5TripCursors(pTab); @@ -1543,7 +1541,7 @@ static int fts5UpdateMethod( /* Filter out attempts to run UPDATE or DELETE on contentless tables. ** This is not suported. */ if( eType0==SQLITE_INTEGER && fts5IsContentless(pTab) ){ - pTab->base.zErrMsg = sqlite3_mprintf( + pTab->p.base.zErrMsg = sqlite3_mprintf( "cannot %s contentless fts5 table: %s", (nArg>1 ? "UPDATE" : "DELETE from"), pConfig->zName ); @@ -1556,46 +1554,52 @@ static int fts5UpdateMethod( rc = sqlite3Fts5StorageDelete(pTab->pStorage, iDel, 0); } - /* INSERT */ - else if( eType0!=SQLITE_INTEGER ){ - /* If this is a REPLACE, first remove the current entry (if any) */ - if( eConflict==SQLITE_REPLACE - && sqlite3_value_type(apVal[1])==SQLITE_INTEGER - ){ - i64 iNew = sqlite3_value_int64(apVal[1]); /* Rowid to delete */ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); + /* INSERT or UPDATE */ + else{ + int eType1 = sqlite3_value_numeric_type(apVal[1]); + + if( eType1!=SQLITE_INTEGER && eType1!=SQLITE_NULL ){ + rc = SQLITE_MISMATCH; } - fts5StorageInsert(&rc, pTab, apVal, pRowid); - } - /* UPDATE */ - else{ - i64 iOld = sqlite3_value_int64(apVal[0]); /* Old rowid */ - i64 iNew = sqlite3_value_int64(apVal[1]); /* New rowid */ - if( iOld!=iNew ){ - if( eConflict==SQLITE_REPLACE ){ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); - if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); - } - fts5StorageInsert(&rc, pTab, apVal, pRowid); - }else{ - rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, apVal, pRowid); - if( rc==SQLITE_OK ){ + else if( eType0!=SQLITE_INTEGER ){ + /* If this is a REPLACE, first remove the current entry (if any) */ + if( eConflict==SQLITE_REPLACE && eType1==SQLITE_INTEGER ){ + i64 iNew = sqlite3_value_int64(apVal[1]); /* Rowid to delete */ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); + } + fts5StorageInsert(&rc, pTab, apVal, pRowid); + } + + /* UPDATE */ + else{ + i64 iOld = sqlite3_value_int64(apVal[0]); /* Old rowid */ + i64 iNew = sqlite3_value_int64(apVal[1]); /* New rowid */ + if( eType1==SQLITE_INTEGER && iOld!=iNew ){ + if( eConflict==SQLITE_REPLACE ){ rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); + } + fts5StorageInsert(&rc, pTab, apVal, pRowid); + }else{ + rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, apVal, pRowid); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageIndexInsert(pTab->pStorage, apVal,*pRowid); + } } - if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageIndexInsert(pTab->pStorage, apVal, *pRowid); - } + }else{ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + fts5StorageInsert(&rc, pTab, apVal, pRowid); } - }else{ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); - fts5StorageInsert(&rc, pTab, apVal, pRowid); } } } - pTab->pConfig->pzErrmsg = 0; + pTab->p.pConfig->pzErrmsg = 0; return rc; } @@ -1604,12 +1608,12 @@ static int fts5UpdateMethod( */ static int fts5SyncMethod(sqlite3_vtab *pVtab){ int rc; - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; fts5CheckTransactionState(pTab, FTS5_SYNC, 0); - pTab->pConfig->pzErrmsg = &pTab->base.zErrMsg; + pTab->p.pConfig->pzErrmsg = &pTab->p.base.zErrMsg; fts5TripCursors(pTab); rc = sqlite3Fts5StorageSync(pTab->pStorage); - pTab->pConfig->pzErrmsg = 0; + pTab->p.pConfig->pzErrmsg = 0; return rc; } @@ -1617,8 +1621,8 @@ static int fts5SyncMethod(sqlite3_vtab *pVtab){ ** Implementation of xBegin() method. */ static int fts5BeginMethod(sqlite3_vtab *pVtab){ - fts5CheckTransactionState((Fts5Table*)pVtab, FTS5_BEGIN, 0); - fts5NewTransaction((Fts5Table*)pVtab); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_BEGIN, 0); + fts5NewTransaction((Fts5FullTable*)pVtab); return SQLITE_OK; } @@ -1629,7 +1633,7 @@ static int fts5BeginMethod(sqlite3_vtab *pVtab){ */ static int fts5CommitMethod(sqlite3_vtab *pVtab){ UNUSED_PARAM(pVtab); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState((Fts5Table*)pVtab, FTS5_COMMIT, 0); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_COMMIT, 0); return SQLITE_OK; } @@ -1639,7 +1643,7 @@ static int fts5CommitMethod(sqlite3_vtab *pVtab){ */ static int fts5RollbackMethod(sqlite3_vtab *pVtab){ int rc; - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; fts5CheckTransactionState(pTab, FTS5_ROLLBACK, 0); rc = sqlite3Fts5StorageRollback(pTab->pStorage); return rc; @@ -1663,13 +1667,13 @@ static int fts5ApiColumnTotalSize( sqlite3_int64 *pnToken ){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); return sqlite3Fts5StorageSize(pTab->pStorage, iCol, pnToken); } static int fts5ApiRowCount(Fts5Context *pCtx, i64 *pnRow){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); return sqlite3Fts5StorageRowCount(pTab->pStorage, pnRow); } @@ -1704,7 +1708,9 @@ static int fts5ApiColumnText( ){ int rc = SQLITE_OK; Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - if( fts5IsContentless((Fts5Table*)(pCsr->base.pVtab)) ){ + if( fts5IsContentless((Fts5FullTable*)(pCsr->base.pVtab)) + || pCsr->ePlan==FTS5_PLAN_SPECIAL + ){ *pz = 0; *pn = 0; }else{ @@ -1773,10 +1779,11 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ int rc = SQLITE_OK; Fts5PoslistReader *aIter; /* One iterator for each phrase */ int nIter; /* Number of iterators/phrases */ + int nCol = ((Fts5Table*)pCsr->base.pVtab)->pConfig->nCol; nIter = sqlite3Fts5ExprPhraseCount(pCsr->pExpr); if( pCsr->aInstIter==0 ){ - int nByte = sizeof(Fts5PoslistReader) * nIter; + sqlite3_int64 nByte = sizeof(Fts5PoslistReader) * nIter; pCsr->aInstIter = (Fts5PoslistReader*)sqlite3Fts5MallocZero(&rc, nByte); } aIter = pCsr->aInstIter; @@ -1811,7 +1818,7 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ nInst++; if( nInst>=pCsr->nInstAlloc ){ pCsr->nInstAlloc = pCsr->nInstAlloc ? pCsr->nInstAlloc*2 : 32; - aInst = (int*)sqlite3_realloc( + aInst = (int*)sqlite3_realloc64( pCsr->aInst, pCsr->nInstAlloc*sizeof(int)*3 ); if( aInst ){ @@ -1826,6 +1833,10 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ aInst[0] = iBest; aInst[1] = FTS5_POS2COLUMN(aIter[iBest].iPos); aInst[2] = FTS5_POS2OFFSET(aIter[iBest].iPos); + if( aInst[1]<0 || aInst[1]>=nCol ){ + rc = FTS5_CORRUPT; + break; + } sqlite3Fts5PoslistReaderNext(&aIter[iBest]); } } @@ -1898,8 +1909,8 @@ static int fts5ColumnSizeCb( static int fts5ApiColumnSize(Fts5Context *pCtx, int iCol, int *pnToken){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); + Fts5Config *pConfig = pTab->p.pConfig; int rc = SQLITE_OK; if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_DOCSIZE) ){ @@ -2155,7 +2166,7 @@ static int fts5ApiQueryPhrase( int(*xCallback)(const Fts5ExtensionApi*, Fts5Context*, void*) ){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); int rc; Fts5Cursor *pNew = 0; @@ -2232,25 +2243,19 @@ static void fts5ApiCallback( /* -** Given cursor id iId, return a pointer to the corresponding Fts5Index +** Given cursor id iId, return a pointer to the corresponding Fts5Table ** object. Or NULL If the cursor id does not exist. -** -** If successful, set *ppConfig to point to the associated config object -** before returning. */ -Fts5Index *sqlite3Fts5IndexFromCsrid( +Fts5Table *sqlite3Fts5TableFromCsrid( Fts5Global *pGlobal, /* FTS5 global context for db handle */ - i64 iCsrId, /* Id of cursor to find */ - Fts5Config **ppConfig /* OUT: Configuration object */ + i64 iCsrId /* Id of cursor to find */ ){ Fts5Cursor *pCsr; - Fts5Table *pTab; - pCsr = fts5CursorFromCsrid(pGlobal, iCsrId); - pTab = (Fts5Table*)pCsr->base.pVtab; - *ppConfig = pTab->pConfig; - - return pTab->pIndex; + if( pCsr ){ + return (Fts5Table*)pCsr->base.pVtab; + } + return 0; } /* @@ -2330,8 +2335,8 @@ static int fts5ColumnMethod( sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */ int iCol /* Index of column to read value from */ ){ - Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCursor->pVtab); + Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; int rc = SQLITE_OK; @@ -2383,7 +2388,7 @@ static int fts5FindFunctionMethod( void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */ void **ppArg /* OUT: User data for *pxFunc */ ){ - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; Fts5Auxiliary *pAux; UNUSED_PARAM(nUnused); @@ -2405,21 +2410,24 @@ static int fts5RenameMethod( sqlite3_vtab *pVtab, /* Virtual table handle */ const char *zName /* New name of table */ ){ - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; return sqlite3Fts5StorageRename(pTab->pStorage, zName); } +int sqlite3Fts5FlushToDisk(Fts5Table *pTab){ + fts5TripCursors((Fts5FullTable*)pTab); + return sqlite3Fts5StorageSync(((Fts5FullTable*)pTab)->pStorage); +} + /* ** The xSavepoint() method. ** ** Flush the contents of the pending-terms table to disk. */ static int fts5SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts5Table *pTab = (Fts5Table*)pVtab; UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState(pTab, FTS5_SAVEPOINT, iSavepoint); - fts5TripCursors(pTab); - return sqlite3Fts5StorageSync(pTab->pStorage); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_SAVEPOINT, iSavepoint); + return sqlite3Fts5FlushToDisk((Fts5Table*)pVtab); } /* @@ -2428,11 +2436,9 @@ static int fts5SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ ** This is a no-op. */ static int fts5ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts5Table *pTab = (Fts5Table*)pVtab; UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState(pTab, FTS5_RELEASE, iSavepoint); - fts5TripCursors(pTab); - return sqlite3Fts5StorageSync(pTab->pStorage); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_RELEASE, iSavepoint); + return sqlite3Fts5FlushToDisk((Fts5Table*)pVtab); } /* @@ -2441,7 +2447,7 @@ static int fts5ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ ** Discard the contents of the pending terms table. */ static int fts5RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ fts5CheckTransactionState(pTab, FTS5_ROLLBACKTO, iSavepoint); fts5TripCursors(pTab); diff --git a/sqlite/ext/fts5/fts5_storage.c b/sqlite/ext/fts5/fts5_storage.c index 70d71351..c6dda28c 100644 --- a/sqlite/ext/fts5/fts5_storage.c +++ b/sqlite/ext/fts5/fts5_storage.c @@ -115,7 +115,7 @@ static int fts5StorageGetStmt( char *zBind; int i; - zBind = sqlite3_malloc(1 + nCol*2); + zBind = sqlite3_malloc64(1 + nCol*2); if( zBind ){ for(i=0; idb, zSql, -1, - SQLITE_PREPARE_PERSISTENT, &p->aStmt[eStmt], 0); + int f = SQLITE_PREPARE_PERSISTENT; + if( eStmt>FTS5_STMT_LOOKUP ) f |= SQLITE_PREPARE_NO_VTAB; + rc = sqlite3_prepare_v3(pC->db, zSql, -1, f, &p->aStmt[eStmt], 0); sqlite3_free(zSql); if( rc!=SQLITE_OK && pzErrMsg ){ *pzErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pC->db)); @@ -281,11 +282,11 @@ int sqlite3Fts5StorageOpen( ){ int rc = SQLITE_OK; Fts5Storage *p; /* New object */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ nByte = sizeof(Fts5Storage) /* Fts5Storage object */ + pConfig->nCol * sizeof(i64); /* Fts5Storage.aTotalSize[] */ - *pp = p = (Fts5Storage*)sqlite3_malloc(nByte); + *pp = p = (Fts5Storage*)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, nByte); @@ -296,7 +297,7 @@ int sqlite3Fts5StorageOpen( if( bCreate ){ if( pConfig->eContent==FTS5_CONTENT_NORMAL ){ int nDefn = 32 + pConfig->nCol*10; - char *zDefn = sqlite3_malloc(32 + pConfig->nCol * 10); + char *zDefn = sqlite3_malloc64(32 + (sqlite3_int64)pConfig->nCol * 10); if( zDefn==0 ){ rc = SQLITE_NOMEM; }else{ @@ -587,7 +588,7 @@ int sqlite3Fts5StorageRebuild(Fts5Storage *p){ Fts5Config *pConfig = p->pConfig; sqlite3_stmt *pScan = 0; Fts5InsertCtx ctx; - int rc; + int rc, rc2; memset(&ctx, 0, sizeof(Fts5InsertCtx)); ctx.pStorage = p; @@ -626,6 +627,8 @@ int sqlite3Fts5StorageRebuild(Fts5Storage *p){ } } sqlite3_free(buf.p); + rc2 = sqlite3_reset(pScan); + if( rc==SQLITE_OK ) rc = rc2; /* Write the averages record */ if( rc==SQLITE_OK ){ @@ -875,7 +878,7 @@ int sqlite3Fts5StorageIntegrity(Fts5Storage *p){ memset(&ctx, 0, sizeof(Fts5IntegrityCtx)); ctx.pConfig = p->pConfig; - aTotalSize = (i64*)sqlite3_malloc(pConfig->nCol * (sizeof(int)+sizeof(i64))); + aTotalSize = (i64*)sqlite3_malloc64(pConfig->nCol*(sizeof(int)+sizeof(i64))); if( !aTotalSize ) return SQLITE_NOMEM; aColSize = (int*)&aTotalSize[pConfig->nCol]; memset(aTotalSize, 0, sizeof(i64) * pConfig->nCol); @@ -1075,7 +1078,13 @@ int sqlite3Fts5StorageSize(Fts5Storage *p, int iCol, i64 *pnToken){ int sqlite3Fts5StorageRowCount(Fts5Storage *p, i64 *pnRow){ int rc = fts5StorageLoadTotals(p, 0); if( rc==SQLITE_OK ){ + /* nTotalRow being zero does not necessarily indicate a corrupt + ** database - it might be that the FTS5 table really does contain zero + ** rows. However this function is only called from the xRowCount() API, + ** and there is no way for that API to be invoked if the table contains + ** no rows. Hence the FTS5_CORRUPT return. */ *pnRow = p->nTotalRow; + if( p->nTotalRow<=0 ) rc = FTS5_CORRUPT; } return rc; } diff --git a/sqlite/ext/fts5/fts5_test_mi.c b/sqlite/ext/fts5/fts5_test_mi.c index 481d09b2..6f2d6e7e 100644 --- a/sqlite/ext/fts5/fts5_test_mi.c +++ b/sqlite/ext/fts5/fts5_test_mi.c @@ -309,7 +309,7 @@ static Fts5MatchinfoCtx *fts5MatchinfoNew( int nPhrase; int i; int nInt; - int nByte; + sqlite3_int64 nByte; int rc; nCol = pApi->xColumnCount(pFts); @@ -330,7 +330,7 @@ static Fts5MatchinfoCtx *fts5MatchinfoNew( nByte = sizeof(Fts5MatchinfoCtx) /* The struct itself */ + sizeof(u32) * nInt /* The p->aRet[] array */ + (i+1); /* The p->zArg string */ - p = (Fts5MatchinfoCtx*)sqlite3_malloc(nByte); + p = (Fts5MatchinfoCtx*)sqlite3_malloc64(nByte); if( p==0 ){ sqlite3_result_error_nomem(pCtx); return 0; diff --git a/sqlite/ext/fts5/fts5_test_tok.c b/sqlite/ext/fts5/fts5_test_tok.c index 6f71e653..b5d4162f 100644 --- a/sqlite/ext/fts5/fts5_test_tok.c +++ b/sqlite/ext/fts5/fts5_test_tok.c @@ -137,7 +137,7 @@ static int fts5tokDequoteArray( nByte += (int)(strlen(argv[i]) + 1); } - *pazDequote = azDequote = sqlite3_malloc(sizeof(char *)*argc + nByte); + *pazDequote = azDequote = sqlite3_malloc64(sizeof(char *)*argc + nByte); if( azDequote==0 ){ rc = SQLITE_NOMEM; }else{ @@ -335,7 +335,7 @@ static int fts5tokCb( if( (pCsr->nRow & (pCsr->nRow-1))==0 ){ int nNew = pCsr->nRow ? pCsr->nRow*2 : 32; Fts5tokRow *aNew; - aNew = (Fts5tokRow*)sqlite3_realloc(pCsr->aRow, nNew*sizeof(Fts5tokRow)); + aNew = (Fts5tokRow*)sqlite3_realloc64(pCsr->aRow, nNew*sizeof(Fts5tokRow)); if( aNew==0 ) return SQLITE_NOMEM; memset(&aNew[pCsr->nRow], 0, sizeof(Fts5tokRow)*(nNew-pCsr->nRow)); pCsr->aRow = aNew; @@ -378,7 +378,7 @@ static int fts5tokFilterMethod( if( pCsr->zInput==0 ){ rc = SQLITE_NOMEM; }else{ - memcpy(pCsr->zInput, zByte, nByte); + if( nByte>0 ) memcpy(pCsr->zInput, zByte, nByte); pCsr->zInput[nByte] = 0; rc = pTab->tok.xTokenize( pTab->pTok, (void*)pCsr, 0, zByte, nByte, fts5tokCb diff --git a/sqlite/ext/fts5/fts5_tokenize.c b/sqlite/ext/fts5/fts5_tokenize.c index af2bc222..9fced72b 100644 --- a/sqlite/ext/fts5/fts5_tokenize.c +++ b/sqlite/ext/fts5/fts5_tokenize.c @@ -152,7 +152,7 @@ static int fts5AsciiTokenize( nByte = ie-is; if( nByte>nFold ){ if( pFold!=aFold ) sqlite3_free(pFold); - pFold = sqlite3_malloc(nByte*2); + pFold = sqlite3_malloc64((sqlite3_int64)nByte*2); if( pFold==0 ){ rc = SQLITE_NOMEM; break; @@ -234,13 +234,18 @@ struct Unicode61Tokenizer { unsigned char aTokenChar[128]; /* ASCII range token characters */ char *aFold; /* Buffer to fold text into */ int nFold; /* Size of aFold[] in bytes */ - int bRemoveDiacritic; /* True if remove_diacritics=1 is set */ + int eRemoveDiacritic; /* True if remove_diacritics=1 is set */ int nException; int *aiException; unsigned char aCategory[32]; /* True for token char categories */ }; +/* Values for eRemoveDiacritic (must match internals of fts5_unicode2.c) */ +#define FTS5_REMOVE_DIACRITICS_NONE 0 +#define FTS5_REMOVE_DIACRITICS_SIMPLE 1 +#define FTS5_REMOVE_DIACRITICS_COMPLEX 2 + static int fts5UnicodeAddExceptions( Unicode61Tokenizer *p, /* Tokenizer object */ const char *z, /* Characters to treat as exceptions */ @@ -251,13 +256,14 @@ static int fts5UnicodeAddExceptions( int *aNew; if( n>0 ){ - aNew = (int*)sqlite3_realloc(p->aiException, (n+p->nException)*sizeof(int)); + aNew = (int*)sqlite3_realloc64(p->aiException, + (n+p->nException)*sizeof(int)); if( aNew ){ int nNew = p->nException; const unsigned char *zCsr = (const unsigned char*)z; const unsigned char *zTerm = (const unsigned char*)&z[n]; while( zCsriCode ) break; + if( (u32)aNew[i]>iCode ) break; } memmove(&aNew[i+1], &aNew[i], (nNew-i)*sizeof(int)); aNew[i] = iCode; @@ -361,7 +367,7 @@ static int fts5UnicodeCreate( int i; memset(p, 0, sizeof(Unicode61Tokenizer)); - p->bRemoveDiacritic = 1; + p->eRemoveDiacritic = FTS5_REMOVE_DIACRITICS_SIMPLE; p->nFold = 64; p->aFold = sqlite3_malloc(p->nFold * sizeof(char)); if( p->aFold==0 ){ @@ -382,10 +388,15 @@ static int fts5UnicodeCreate( for(i=0; rc==SQLITE_OK && ieRemoveDiacritic = (zArg[0] - '0'); + assert( p->eRemoveDiacritic==FTS5_REMOVE_DIACRITICS_NONE + || p->eRemoveDiacritic==FTS5_REMOVE_DIACRITICS_SIMPLE + || p->eRemoveDiacritic==FTS5_REMOVE_DIACRITICS_COMPLEX + ); } - p->bRemoveDiacritic = (zArg[0]=='1'); }else if( 0==sqlite3_stricmp(azArg[i], "tokenchars") ){ rc = fts5UnicodeAddExceptions(p, zArg, 1); @@ -419,7 +430,7 @@ static int fts5UnicodeCreate( */ static int fts5UnicodeIsAlnum(Unicode61Tokenizer *p, int iCode){ return ( - p->aCategory[sqlite3Fts5UnicodeCategory(iCode)] + p->aCategory[sqlite3Fts5UnicodeCategory((u32)iCode)] ^ fts5UnicodeIsException(p, iCode) ); } @@ -448,7 +459,7 @@ static int fts5UnicodeTokenize( /* Each iteration of this loop gobbles up a contiguous run of separators, ** then the next token. */ while( rc==SQLITE_OK ){ - int iCode; /* non-ASCII codepoint read from input */ + u32 iCode; /* non-ASCII codepoint read from input */ char *zOut = aFold; int is; int ie; @@ -480,7 +491,7 @@ static int fts5UnicodeTokenize( /* Grow the output buffer so that there is sufficient space to fit the ** largest possible utf-8 character. */ if( zOut>pEnd ){ - aFold = sqlite3_malloc(nFold*2); + aFold = sqlite3_malloc64((sqlite3_int64)nFold*2); if( aFold==0 ){ rc = SQLITE_NOMEM; goto tokenize_done; @@ -499,7 +510,7 @@ static int fts5UnicodeTokenize( READ_UTF8(zCsr, zTerm, iCode); if( fts5UnicodeIsAlnum(p,iCode)||sqlite3Fts5UnicodeIsdiacritic(iCode) ){ non_ascii_tokenchar: - iCode = sqlite3Fts5UnicodeFold(iCode, p->bRemoveDiacritic); + iCode = sqlite3Fts5UnicodeFold(iCode, p->eRemoveDiacritic); if( iCode ) WRITE_UTF8(zOut, iCode); }else{ break; @@ -1274,5 +1285,3 @@ int sqlite3Fts5TokenizerInit(fts5_api *pApi){ return rc; } - - diff --git a/sqlite/ext/fts5/fts5_unicode2.c b/sqlite/ext/fts5/fts5_unicode2.c index 8c48aaa4..d3981226 100644 --- a/sqlite/ext/fts5/fts5_unicode2.c +++ b/sqlite/ext/fts5/fts5_unicode2.c @@ -1,5 +1,5 @@ /* -** 2012 May 25 +** 2012-05-25 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: @@ -28,32 +28,48 @@ ** E"). The resuls of passing a codepoint that corresponds to an ** uppercase letter are undefined. */ -static int fts5_remove_diacritic(int c){ +static int fts5_remove_diacritic(int c, int bComplex){ unsigned short aDia[] = { 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, - 3456, 3696, 3712, 3728, 3744, 3896, 3912, 3928, - 3968, 4008, 4040, 4106, 4138, 4170, 4202, 4234, - 4266, 4296, 4312, 4344, 4408, 4424, 4472, 4504, - 6148, 6198, 6264, 6280, 6360, 6429, 6505, 6529, - 61448, 61468, 61534, 61592, 61642, 61688, 61704, 61726, - 61784, 61800, 61836, 61880, 61914, 61948, 61998, 62122, - 62154, 62200, 62218, 62302, 62364, 62442, 62478, 62536, - 62554, 62584, 62604, 62640, 62648, 62656, 62664, 62730, - 62924, 63050, 63082, 63274, 63390, + 3456, 3696, 3712, 3728, 3744, 3766, 3832, 3896, + 3912, 3928, 3944, 3968, 4008, 4040, 4056, 4106, + 4138, 4170, 4202, 4234, 4266, 4296, 4312, 4344, + 4408, 4424, 4442, 4472, 4488, 4504, 6148, 6198, + 6264, 6280, 6360, 6429, 6505, 6529, 61448, 61468, + 61512, 61534, 61592, 61610, 61642, 61672, 61688, 61704, + 61726, 61784, 61800, 61816, 61836, 61880, 61896, 61914, + 61948, 61998, 62062, 62122, 62154, 62184, 62200, 62218, + 62252, 62302, 62364, 62410, 62442, 62478, 62536, 62554, + 62584, 62604, 62640, 62648, 62656, 62664, 62730, 62766, + 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, + 63182, 63242, 63274, 63310, 63368, 63390, }; - char aChar[] = { - '\0', 'a', 'c', 'e', 'i', 'n', 'o', 'u', 'y', 'y', 'a', 'c', - 'd', 'e', 'e', 'g', 'h', 'i', 'j', 'k', 'l', 'n', 'o', 'r', - 's', 't', 'u', 'u', 'w', 'y', 'z', 'o', 'u', 'a', 'i', 'o', - 'u', 'g', 'k', 'o', 'j', 'g', 'n', 'a', 'e', 'i', 'o', 'r', - 'u', 's', 't', 'h', 'a', 'e', 'o', 'y', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', 'a', 'b', 'd', 'd', 'e', 'f', 'g', 'h', - 'h', 'i', 'k', 'l', 'l', 'm', 'n', 'p', 'r', 'r', 's', 't', - 'u', 'v', 'w', 'w', 'x', 'y', 'z', 'h', 't', 'w', 'y', 'a', - 'e', 'i', 'o', 'u', 'y', +#define HIBIT ((unsigned char)0x80) + unsigned char aChar[] = { + '\0', 'a', 'c', 'e', 'i', 'n', + 'o', 'u', 'y', 'y', 'a', 'c', + 'd', 'e', 'e', 'g', 'h', 'i', + 'j', 'k', 'l', 'n', 'o', 'r', + 's', 't', 'u', 'u', 'w', 'y', + 'z', 'o', 'u', 'a', 'i', 'o', + 'u', 'u'|HIBIT, 'a'|HIBIT, 'g', 'k', 'o', + 'o'|HIBIT, 'j', 'g', 'n', 'a'|HIBIT, 'a', + 'e', 'i', 'o', 'r', 'u', 's', + 't', 'h', 'a', 'e', 'o'|HIBIT, 'o', + 'o'|HIBIT, 'y', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', 'a', 'b', + 'c'|HIBIT, 'd', 'd', 'e'|HIBIT, 'e', 'e'|HIBIT, + 'f', 'g', 'h', 'h', 'i', 'i'|HIBIT, + 'k', 'l', 'l'|HIBIT, 'l', 'm', 'n', + 'o'|HIBIT, 'p', 'r', 'r'|HIBIT, 'r', 's', + 's'|HIBIT, 't', 'u', 'u'|HIBIT, 'v', 'w', + 'w', 'x', 'y', 'z', 'h', 't', + 'w', 'y', 'a', 'a'|HIBIT, 'a'|HIBIT, 'a'|HIBIT, + 'e', 'e'|HIBIT, 'e'|HIBIT, 'i', 'o', 'o'|HIBIT, + 'o'|HIBIT, 'o'|HIBIT, 'u', 'u'|HIBIT, 'u'|HIBIT, 'y', }; unsigned int key = (((unsigned int)c)<<3) | 0x00000007; @@ -70,7 +86,8 @@ static int fts5_remove_diacritic(int c){ } } assert( key>=aDia[iRes] ); - return ((c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : (int)aChar[iRes]); + if( bComplex==0 && (aChar[iRes] & 0x80) ) return c; + return (c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : ((int)aChar[iRes] & 0x7F); } @@ -83,8 +100,8 @@ int sqlite3Fts5UnicodeIsdiacritic(int c){ unsigned int mask1 = 0x000361F8; if( c<768 || c>817 ) return 0; return (c < 768+32) ? - (mask0 & (1 << (c-768))) : - (mask1 & (1 << (c-768-32))); + (mask0 & ((unsigned int)1 << (c-768))) : + (mask1 & ((unsigned int)1 << (c-768-32))); } @@ -97,7 +114,7 @@ int sqlite3Fts5UnicodeIsdiacritic(int c){ ** The results are undefined if the value passed to this function ** is less than zero. */ -int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic){ +int sqlite3Fts5UnicodeFold(int c, int eRemoveDiacritic){ /* Each entry in the following array defines a rule for folding a range ** of codepoints to lower case. The rule applies to a range of nRange ** codepoints starting at codepoint iCode. @@ -220,7 +237,9 @@ int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic){ assert( ret>0 ); } - if( bRemoveDiacritic ) ret = fts5_remove_diacritic(ret); + if( eRemoveDiacritic ){ + ret = fts5_remove_diacritic(ret, eRemoveDiacritic==2); + } } else if( c>=66560 && c<66600 ){ @@ -231,12 +250,6 @@ int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic){ } -#if 0 -int sqlite3Fts5UnicodeNCat(void) { - return 32; -} -#endif - int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ aArray[0] = 1; switch( zCat[0] ){ @@ -718,7 +731,7 @@ static u16 aFts5UnicodeData[] = { 34, 3074, 7692, 63, 63, }; -int sqlite3Fts5UnicodeCategory(int iCode) { +int sqlite3Fts5UnicodeCategory(u32 iCode) { int iRes = -1; int iHi; int iLo; @@ -756,9 +769,8 @@ void sqlite3Fts5UnicodeAscii(u8 *aArray, u8 *aAscii){ int bToken = aArray[ aFts5UnicodeData[iTbl] & 0x1F ]; int n = (aFts5UnicodeData[iTbl] >> 5) + i; for(; i<128 && i3 && n<=9 ); return n; } @@ -342,4 +342,3 @@ int sqlite3Fts5GetVarintLen(u32 iVal){ if( iVal<(1 << 28) ) return 4; return 5; } - diff --git a/sqlite/ext/fts5/fts5_vocab.c b/sqlite/ext/fts5/fts5_vocab.c index e475d077..2550c9d6 100644 --- a/sqlite/ext/fts5/fts5_vocab.c +++ b/sqlite/ext/fts5/fts5_vocab.c @@ -55,7 +55,7 @@ struct Fts5VocabTable { struct Fts5VocabCursor { sqlite3_vtab_cursor base; sqlite3_stmt *pStmt; /* Statement holding lock on pIndex */ - Fts5Index *pIndex; /* Associated FTS5 index */ + Fts5Table *pFts5; /* Associated FTS5 table */ int bEof; /* True if this cursor is at EOF */ Fts5IndexIter *pIter; /* Term/rowid iterator object */ @@ -64,7 +64,6 @@ struct Fts5VocabCursor { char *zLeTerm; /* (term <= $zLeTerm) paramater, or NULL */ /* These are used by 'col' tables only */ - Fts5Config *pConfig; /* Fts5 table configuration */ int iCol; i64 *aCnt; i64 *aDoc; @@ -327,8 +326,7 @@ static int fts5VocabOpenMethod( sqlite3_vtab_cursor **ppCsr ){ Fts5VocabTable *pTab = (Fts5VocabTable*)pVTab; - Fts5Index *pIndex = 0; - Fts5Config *pConfig = 0; + Fts5Table *pFts5 = 0; Fts5VocabCursor *pCsr = 0; int rc = SQLITE_OK; sqlite3_stmt *pStmt = 0; @@ -347,31 +345,34 @@ static int fts5VocabOpenMethod( if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ i64 iId = sqlite3_column_int64(pStmt, 0); - pIndex = sqlite3Fts5IndexFromCsrid(pTab->pGlobal, iId, &pConfig); + pFts5 = sqlite3Fts5TableFromCsrid(pTab->pGlobal, iId); } - if( rc==SQLITE_OK && pIndex==0 ){ - rc = sqlite3_finalize(pStmt); - pStmt = 0; - if( rc==SQLITE_OK ){ - pVTab->zErrMsg = sqlite3_mprintf( - "no such fts5 table: %s.%s", pTab->zFts5Db, pTab->zFts5Tbl - ); - rc = SQLITE_ERROR; + if( rc==SQLITE_OK ){ + if( pFts5==0 ){ + rc = sqlite3_finalize(pStmt); + pStmt = 0; + if( rc==SQLITE_OK ){ + pVTab->zErrMsg = sqlite3_mprintf( + "no such fts5 table: %s.%s", pTab->zFts5Db, pTab->zFts5Tbl + ); + rc = SQLITE_ERROR; + } + }else{ + rc = sqlite3Fts5FlushToDisk(pFts5); } } if( rc==SQLITE_OK ){ - int nByte = pConfig->nCol * sizeof(i64) * 2 + sizeof(Fts5VocabCursor); + int nByte = pFts5->pConfig->nCol * sizeof(i64)*2 + sizeof(Fts5VocabCursor); pCsr = (Fts5VocabCursor*)sqlite3Fts5MallocZero(&rc, nByte); } if( pCsr ){ - pCsr->pIndex = pIndex; + pCsr->pFts5 = pFts5; pCsr->pStmt = pStmt; - pCsr->pConfig = pConfig; pCsr->aCnt = (i64*)&pCsr[1]; - pCsr->aDoc = &pCsr->aCnt[pConfig->nCol]; + pCsr->aDoc = &pCsr->aCnt[pFts5->pConfig->nCol]; }else{ sqlite3_finalize(pStmt); } @@ -387,6 +388,7 @@ static void fts5VocabResetCursor(Fts5VocabCursor *pCsr){ sqlite3_free(pCsr->zLeTerm); pCsr->nLeTerm = -1; pCsr->zLeTerm = 0; + pCsr->bEof = 0; } /* @@ -425,7 +427,7 @@ static int fts5VocabInstanceNewTerm(Fts5VocabCursor *pCsr){ } static int fts5VocabInstanceNext(Fts5VocabCursor *pCsr){ - int eDetail = pCsr->pConfig->eDetail; + int eDetail = pCsr->pFts5->pConfig->eDetail; int rc = SQLITE_OK; Fts5IndexIter *pIter = pCsr->pIter; i64 *pp = &pCsr->iInstPos; @@ -460,7 +462,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; Fts5VocabTable *pTab = (Fts5VocabTable*)pCursor->pVtab; int rc = SQLITE_OK; - int nCol = pCsr->pConfig->nCol; + int nCol = pCsr->pFts5->pConfig->nCol; pCsr->rowid++; @@ -482,6 +484,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ int nTerm; zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm); + assert( nTerm>=0 ); if( pCsr->nLeTerm>=0 ){ int nCmp = MIN(nTerm, pCsr->nLeTerm); int bCmp = memcmp(pCsr->zLeTerm, zTerm, nCmp); @@ -498,7 +501,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ assert( pTab->eType==FTS5_VOCAB_COL || pTab->eType==FTS5_VOCAB_ROW ); while( rc==SQLITE_OK ){ - int eDetail = pCsr->pConfig->eDetail; + int eDetail = pCsr->pFts5->pConfig->eDetail; const u8 *pPos; int nPos; /* Position list */ i64 iPos = 0; /* 64-bit position read from poslist */ int iOff = 0; /* Current offset within position list */ @@ -521,7 +524,6 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ int iCol = -1; while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff, &iPos) ){ int ii = FTS5_POS2COLUMN(iPos); - pCsr->aCnt[ii]++; if( iCol!=ii ){ if( ii>=nCol ){ rc = FTS5_CORRUPT; @@ -530,6 +532,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ pCsr->aDoc[ii]++; iCol = ii; } + pCsr->aCnt[ii]++; } }else if( eDetail==FTS5_DETAIL_COLUMNS ){ while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff,&iPos) ){ @@ -558,7 +561,9 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ if( rc==SQLITE_OK ){ zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm); - if( nTerm!=pCsr->term.n || memcmp(zTerm, pCsr->term.p, nTerm) ){ + if( nTerm!=pCsr->term.n + || (nTerm>0 && memcmp(zTerm, pCsr->term.p, nTerm)) + ){ break; } if( sqlite3Fts5IterEof(pCsr->pIter) ) break; @@ -569,7 +574,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ if( rc==SQLITE_OK && pCsr->bEof==0 && pTab->eType==FTS5_VOCAB_COL ){ while( pCsr->aDoc[pCsr->iCol]==0 ) pCsr->iCol++; - assert( pCsr->iColpConfig->nCol ); + assert( pCsr->iColpFts5->pConfig->nCol ); } return rc; } @@ -616,6 +621,7 @@ static int fts5VocabFilterMethod( } if( pLe ){ const char *zCopy = (const char *)sqlite3_value_text(pLe); + if( zCopy==0 ) zCopy = ""; pCsr->nLeTerm = sqlite3_value_bytes(pLe); pCsr->zLeTerm = sqlite3_malloc(pCsr->nLeTerm+1); if( pCsr->zLeTerm==0 ){ @@ -627,14 +633,15 @@ static int fts5VocabFilterMethod( } if( rc==SQLITE_OK ){ - rc = sqlite3Fts5IndexQuery(pCsr->pIndex, zTerm, nTerm, f, 0, &pCsr->pIter); + Fts5Index *pIndex = pCsr->pFts5->pIndex; + rc = sqlite3Fts5IndexQuery(pIndex, zTerm, nTerm, f, 0, &pCsr->pIter); } if( rc==SQLITE_OK && eType==FTS5_VOCAB_INSTANCE ){ rc = fts5VocabInstanceNewTerm(pCsr); } - if( rc==SQLITE_OK - && !pCsr->bEof - && (eType!=FTS5_VOCAB_INSTANCE || pCsr->pConfig->eDetail!=FTS5_DETAIL_NONE) + if( rc==SQLITE_OK && !pCsr->bEof + && (eType!=FTS5_VOCAB_INSTANCE + || pCsr->pFts5->pConfig->eDetail!=FTS5_DETAIL_NONE) ){ rc = fts5VocabNextMethod(pCursor); } @@ -657,7 +664,7 @@ static int fts5VocabColumnMethod( int iCol /* Index of column to read value from */ ){ Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; - int eDetail = pCsr->pConfig->eDetail; + int eDetail = pCsr->pFts5->pConfig->eDetail; int eType = ((Fts5VocabTable*)(pCursor->pVtab))->eType; i64 iVal = 0; @@ -669,7 +676,7 @@ static int fts5VocabColumnMethod( assert( iCol==1 || iCol==2 || iCol==3 ); if( iCol==1 ){ if( eDetail!=FTS5_DETAIL_NONE ){ - const char *z = pCsr->pConfig->azCol[pCsr->iCol]; + const char *z = pCsr->pFts5->pConfig->azCol[pCsr->iCol]; sqlite3_result_text(pCtx, z, -1, SQLITE_STATIC); } }else if( iCol==2 ){ @@ -697,8 +704,8 @@ static int fts5VocabColumnMethod( }else if( eDetail==FTS5_DETAIL_COLUMNS ){ ii = (int)pCsr->iInstPos; } - if( ii>=0 && iipConfig->nCol ){ - const char *z = pCsr->pConfig->azCol[ii]; + if( ii>=0 && iipFts5->pConfig->nCol ){ + const char *z = pCsr->pFts5->pConfig->azCol[ii]; sqlite3_result_text(pCtx, z, -1, SQLITE_STATIC); } break; diff --git a/sqlite/ext/fts5/test/fts5aa.test b/sqlite/ext/fts5/test/fts5aa.test index b6a2499b..0fe60932 100644 --- a/sqlite/ext/fts5/test/fts5aa.test +++ b/sqlite/ext/fts5/test/fts5aa.test @@ -38,8 +38,7 @@ do_execsql_test 1.0 { do_execsql_test 1.1 { DROP TABLE t1; SELECT name, sql FROM sqlite_master; -} { -} +} {} #------------------------------------------------------------------------- # diff --git a/sqlite/ext/fts5/test/fts5ai.test b/sqlite/ext/fts5/test/fts5ai.test index 24e780a7..20e10693 100644 --- a/sqlite/ext/fts5/test/fts5ai.test +++ b/sqlite/ext/fts5/test/fts5ai.test @@ -51,6 +51,12 @@ do_execsql_test 1.1 { do_execsql_test 1.2 { INSERT INTO t1(t1) VALUES('integrity-check'); } + +do_execsql_test 1.3 { + SAVEPOINT one; + INSERT INTO t1 VALUES('v w x'); + ROLLBACK TO one; +} } diff --git a/sqlite/ext/fts5/test/fts5ak.test b/sqlite/ext/fts5/test/fts5ak.test index cab0ae2d..0a3cd6a7 100644 --- a/sqlite/ext/fts5/test/fts5ak.test +++ b/sqlite/ext/fts5/test/fts5ak.test @@ -144,6 +144,14 @@ do_execsql_test 3.1 { {[a b c d e]} } +do_execsql_test 3.2 { + SELECT highlight(ft, 0, NULL, NULL) FROM ft WHERE ft MATCH 'a+b+c AND c+d+e'; +} { + {a b c x c d e} + {a b c c d e} + {a b c d e} +} + } finish_test diff --git a/sqlite/ext/fts5/test/fts5circref.test b/sqlite/ext/fts5/test/fts5circref.test new file mode 100644 index 00000000..ea992195 --- /dev/null +++ b/sqlite/ext/fts5/test/fts5circref.test @@ -0,0 +1,80 @@ +# 2018 Dec 22 +# +# 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 implements regression tests for SQLite library. The +# focus of this script is testing the FTS5 module. +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5circref + +# If SQLITE_ENABLE_FTS5 is not defined, omit this file. +ifcapable !fts5 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE tt USING fts5(a); + SELECT name FROM sqlite_master ORDER BY 1; +} { + tt tt_config tt_content tt_data tt_docsize tt_idx +} +db_save_and_close + +foreach {tn schema sql} { + 1 { + CREATE TRIGGER tr1 AFTER INSERT ON tt_config BEGIN + SELECT * FROM tt; + END; + } { + INSERT INTO tt(tt, rank) VALUES('usermerge', 4); + } + + 2 { + CREATE TRIGGER tr1 AFTER INSERT ON tt_docsize BEGIN + SELECT * FROM tt; + END; + } { + INSERT INTO tt(a) VALUES('one two three'); + } + + 3 { + CREATE TRIGGER tr1 AFTER INSERT ON tt_content BEGIN + SELECT * FROM tt; + END; + } { + INSERT INTO tt(a) VALUES('one two three'); + } + + 4 { + CREATE TRIGGER tr1 AFTER INSERT ON tt_data BEGIN + SELECT * FROM tt; + END; + } { + INSERT INTO tt(a) VALUES('one two three'); + } + + 5 { + CREATE TRIGGER tr1 AFTER INSERT ON tt_idx BEGIN + SELECT * FROM tt; + END; + } { + INSERT INTO tt(a) VALUES('one two three'); + } +} { + db_restore_and_reopen + do_execsql_test 1.1.$tn.1 $schema + do_catchsql_test 1.1.$tn.2 $sql {1 {SQL logic error}} + db close +} + + +finish_test diff --git a/sqlite/ext/fts5/test/fts5corrupt3.test b/sqlite/ext/fts5/test/fts5corrupt3.test index ec823b32..d74fbcce 100644 --- a/sqlite/ext/fts5/test/fts5corrupt3.test +++ b/sqlite/ext/fts5/test/fts5corrupt3.test @@ -23,6 +23,7 @@ ifcapable !fts5 { return } sqlite3_fts5_may_be_corrupt 1 +database_may_be_corrupt proc create_t1 {} { expr srand(0) @@ -35,8 +36,6 @@ proc create_t1 {} { } } -if 1 { - # Create a simple FTS5 table containing 100 documents. Each document # contains 10 terms, each of which start with the character "x". # @@ -380,8 +379,6 @@ do_test 7.1 { } } {} -} - #------------------------------------------------------------------------ # Corruption within the structure record. # @@ -416,5 +413,7374 @@ do_catchsql_test 9.2.2 { SELECT * FROM t1('one AND two'); } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 10.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename c9.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f e8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 02 06 36 b0 a0 10 21 ck.....ft..6...! +| 4064: d6 f7 07 46 96 d6 97 a6 05 01 03 00 10 03 03 0f ...F............ +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f ec 0f e0 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f ee 00 0f fa 0f f4 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 62 6c 65 74 31 74 31 43 52 45 41 54 45 20 heblet1t1CREATE +| page 8 offset 28672 +| 0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31 VIRTUAL TABLE t1 +| 16: 20 55 53 49 4e 47 20 66 74 73 35 28 63 6f 6e 74 USING fts5(cont +| 32: 65 6e 74 29 0d 00 00 00 03 0f bd 00 0f e8 0f ef ent)............ +| 48: 0f bd 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| end c9.db + }] +} {} +do_catchsql_test 10.1 { + SELECT * FROM t1 WHERE t1 MATCH 'abandon'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +# +reset_db +do_test 11.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c10b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 01 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ..08...........m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 44 d9 (id INTEGER PRD. +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 06 0f 59 00 0f e8 0f ef 0f bd 0f b0 ......Y......... +| 16: 0f 73 0f 59 00 00 00 00 00 00 00 00 00 00 00 00 .s.Y............ +| 3920: 00 00 00 00 00 00 00 00 00 13 84 80 80 80 80 04 ................ +| 3936: 03 01 2a 0a 00 00 00 00 01 02 02 00 02 01 01 01 ..*............. +| 3952: 02 01 01 36 84 80 80 80 80 03 03 05 66 00 40 00 ...6........f.@. +| 3968: 00 00 01 00 00 00 29 07 30 61 63 74 69 76 65 04 ......).0active. +| 3984: 02 02 02 03 74 6f 6d 06 02 02 05 02 69 63 07 02 ....tom.....ic.. +| 4000: 02 01 06 62 6f 6f 6d 65 72 05 02 02 04 0b 08 07 ...boomer....... +| 4016: 06 84 80 80 80 80 02 03 01 10 01 07 07 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 02 02 02 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 03 03 0f on.............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 02 0f f3 00 0f fa 0f f3 00 00 00 00 ................ +| 4080: 00 00 00 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 07 0f b6 00 0f f6 0f ec 0f e0 0f d5 ................ +| 16: 0f ca 0f c1 0f b6 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 09 07 03 00 19 61 74 6f 6d 69 ...........atomi +| 4032: 63 07 06 03 00 15 61 74 6f 6d 09 05 03 00 19 62 c.....atom.....b +| 4048: 6f 6f 6d 65 72 09 04 03 00 19 61 63 74 69 76 65 oomer.....active +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 07 0f d6 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 00 00 00 00 00 00 00 00 00 00 ................ +| 4048: 00 00 00 00 00 00 04 07 03 00 0e 01 04 06 03 00 ................ +| 4064: 0e 01 04 05 03 00 0e 01 04 04 03 00 0e 01 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c10b.db +}]} {} + +# This returns SQLITE_CONSTRAINT instead of SQLITE_CORRUPT. The problem is +# that the corrupted structure-record leads fts5 to try to use a segment-id +# that is already in use. This is caught by the PRIMARY KEY constraint on +# the %_idx table. +# +do_catchsql_test 11.1 { + UPDATE t1 SET content='abc' WHERE content='boomer'; +} {1 {constraint failed}} + +#------------------------------------------------------------------------- +# +reset_db +do_test 12.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c2.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f d8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 02 02 02 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 03 03 0f on.............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 20 01 01 01 01 ...$....... .... +| page 3 offset 8192 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f ec 0f e0 3f e0 ..............?. +| 16: a0 30 30 01 b6 16 26 16 e6 46 f6 e0 80 20 30 01 .00...&..F... 0. +| 32: 76 16 26 16 67 40 80 10 30 01 76 16 26 16 36 b0 v.&.g@..0.v.&.6. +| 48: d0 00 00 00 30 fe e0 00 ff a0 ff 40 fe 00 00 00 ....0......@.... +| page 5 offset 16384 +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c2.db +}]} {} + +do_catchsql_test 11.1 { + SELECT * FROM t1 WHERE t1 MATCH 'abandon'; +} {1 {vtable constructor failed: t1}} + +do_catchsql_test 11.2 { + INSERT INTO t1(t1, rank) VALUES('merge', 500); +} {1 {vtable constructor failed: t1}} + +#------------------------------------------------------------------------- +# +reset_db +do_test 13.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c13.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 4f 69 64 ATE TABLE 't1Oid +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f e8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 02 02 02 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 03 03 0f on.............. +| 4080: 0a 03 00 24 00 eb 00 00 00 01 01 01 00 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 01 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f ec 0f e0 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f ee 00 0f fa 0f f2 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c13.db +SELECT * FROM t1 WHERE t1 MATCH 'abandon'; +}]} {} + +do_catchsql_test 13.1 { + SELECT * FROM t1 WHERE t1 MATCH 'abandon'; +} {1 {vtable constructor failed: t1}} + +#------------------------------------------------------------------------- +reset_db +do_test 14.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c14b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 01 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ..08...........m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 0f ef 00 04 0f 18 00 0f e8 0f 18 0f bd 0f 2c ..............., +| 3856: 00 00 00 00 00 00 00 00 12 0a 03 00 2a 00 00 00 ............*... +| 3872: 00 01 02 02 00 02 01 01 01 02 01 01 81 09 88 80 ................ +| 3888: 80 80 80 01 04 00 82 16 00 00 00 79 06 30 61 62 ...........y.0ab +| 3904: 61 63 6b 08 02 07 04 04 6e 64 6f 6e 08 02 05 02 ack.....ndon.... +| 3920: 05 63 74 69 76 65 04 02 02 04 02 0b 02 04 6c 70 .ctive........lp +| 3936: 68 61 08 04 02 0a 02 03 74 6b 6d 06 02 02 03 02 ha......tkm..... +| 3952: 6f 6d 08 02 09 05 02 69 63 07 02 02 01 06 62 61 om.....ic.....ba +| 3968: 63 6b 75 70 08 02 04 02 05 6f 6f 6d 65 72 05 02 ckup.....oomer.. +| 3984: 02 01 0c 63 68 61 6e 6e 65 62 6f 6f 6d 65 72 08 ...channeboomer. +| 4000: 02 08 07 01 6c 08 02 03 01 04 74 65 73 74 08 02 ....l.....test.. +| 4016: 06 04 0a 09 0d 0a 08 07 07 0b 0a 11 06 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 02 02 02 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 03 9a 07 05 01 03 00 10 08 11 00 on.............. +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 02 0f f3 00 0f fa 0f f3 00 00 00 00 ................ +| 4080: 00 00 00 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 08 0f 6a 00 0f f6 0f ec 0f e0 0f d5 ......j......... +| 16: 0f ca 0f c1 0f b6 0f 6a 00 00 00 00 00 00 00 00 .......j........ +| 3936: 00 00 00 00 00 00 00 00 00 00 4a 08 04 00 81 19 ..........J..... +| 3952: 61 6c 70 68 61 20 63 68 61 6e 6e 65 6c 20 62 61 alpha channel ba +| 3968: 63 6b 75 70 20 61 62 61 6e 64 6f 6e 20 74 65 73 ckup abandon tes +| 3984: 74 20 61 62 61 63 6b 20 63 68 61 6e 6e 65 62 6f t aback channebo +| 4000: 6f 6d 65 72 20 61 74 6f 6d 20 61 6c 70 68 61 20 omer atom alpha +| 4016: 61 63 74 69 76 65 09 07 03 00 19 61 74 6f 6d 69 active.....atomi +| 4032: 63 07 06 03 00 15 61 74 6b 6d 09 05 03 00 19 62 c.....atkm.....b +| 4048: 6f 6f 6d 65 72 09 04 03 00 19 61 63 74 69 76 65 oomer.....active +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 08 0f d0 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0a 04 07 03 00 0e 01 04 06 03 00 ................ +| 4064: 0e 01 04 05 03 00 0e 01 04 04 03 00 0e 01 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c14b.db +}]} {} + +do_catchsql_test 14.1 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + +#--------------------------------------------------------------------------- +# +reset_db +do_test 15.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename c16.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 00 0f f6 0f ec ..!!...tabl..... +| 3680: 0f e0 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ..sizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f e8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 00 02 22 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 04 67 90 38 2a 07 05 01 03 00 10 03 03 0f on.g.8*......... +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f ec 0f e0 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f ee 00 0f fa 0f f4 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| page 8 offset 28672 +| 0: 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 31 5f .......-tablet1_ +| 16: 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 54 45 idxt1_idx.CREATE +| 32: 20 54 41 42 4c 45 20 27 74 31 5f 66 17 42 03 30 TABLE 't1_f.B.0 +| 48: 01 00 00 10 10 04 02 02 00 00 00 00 00 00 00 00 ................ +| 64: 70 00 00 00 00 00 00 00 00 00 00 00 70 00 00 00 p...........p... +| end c16.db +}]} {} + +do_catchsql_test 15.1 { + INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + +#--------------------------------------------------------------------------- +# +reset_db +do_test 16.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c17.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f e8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 00 02 22 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 03 03 0f on.............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 41 01 ...$..........A. +| page 3 offset 8192 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f ec 0f e0 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f ee 00 0f fa 0f f4 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c17.db +}]} {} + +do_catchsql_test 16.1 { +INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {vtable constructor failed: t1}} + +#-------------------------------------------------------------------------- +reset_db +do_test 17.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c18.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f e8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 00 02 22 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 03 03 0f on.............. +| 4080: 0a 03 00 24 00 00 0a aa aa aa aa aa aa aa aa aa ...$............ +| page 3 offset 8192 +| 0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ +| 16: aa aa aa aa aa aa aa aa 00 00 10 10 10 00 10 10 ................ +| 32: 10 10 a0 00 00 00 10 ff a0 00 ff 52 05 64 95 25 ...........R.d.% +| 48: 45 54 14 c2 05 44 14 24 c4 52 07 43 12 05 55 34 ET...D.$.R.C..U4 +| 64: 94 e4 72 06 67 47 33 52 86 36 f6 e7 46 56 e7 42 ..r.gG3R.6..FV.B +| 80: 90 d0 00 00 00 30 fb d0 00 fe 80 fe f0 fb 00 00 .....0.......... +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f ec 0f e0 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f ee 00 0f fa 0f f4 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c18.db +}]} {} + +do_catchsql_test 17.1 { + SELECT * FROM t1 WHERE t1 MATCH 'abandon'; +} {1 {vtable constructor failed: t1}} + +#-------------------------------------------------------------------------- +reset_db +do_test 18.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c19b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 01 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ..08...........m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 09 a6 00 06 09 22 00 0f e8 09 22 0f bd 0f 2c ..............., +| 16: 09 bd 09 3c 00 00 00 00 00 00 00 00 00 00 00 00 ...<............ +| 2336: 00 00 18 0a 03 00 36 00 00 00 00 01 04 04 00 04 ......6......... +| 2352: 01 01 01 02 01 01 03 01 01 04 01 01 63 90 80 80 ............c... +| 2368: 80 80 01 04 00 81 4a 00 00 00 56 06 30 61 62 61 ......J...V.0aba +| 2384: 63 6b 08 01 04 04 6e 64 6f 6e 03 01 05 01 02 05 ck....ndon...... +| 2400: 63 74 69 76 65 08 01 02 04 6c 70 68 61 08 01 02 ctive....lpha... +| 2416: 03 74 6f 6d 08 01 01 06 62 61 63 6b 75 70 08 01 .tom....backup.. +| 2432: 01 0c 63 68 61 6e 6e 65 62 6f 6f 6d 65 72 08 01 ..channeboomer.. +| 2448: 07 01 6c 08 01 01 04 74 65 73 74 08 01 04 09 0a ..l....test..... +| 2464: 09 08 07 0a 10 05 0f 18 00 17 30 00 00 00 00 01 ..........0..... +| 2480: 03 03 00 03 01 01 01 02 01 01 03 01 01 8a 53 8c ..............S. +| 2496: 80 80 80 80 01 04 00 95 2a 00 00 05 35 0d 30 30 ........*...5.00 +| 2512: 31 30 66 66 61 30 30 30 66 66 61 05 02 1c 02 49 10ffa000ffa....I +| 2528: 33 34 33 35 32 34 35 34 31 35 34 34 35 32 30 35 3435245415445205 +| 2544: 34 34 31 34 32 34 63 34 35 32 30 32 37 37 34 33 441424c452027743 +| 2560: 31 35 66 36 39 36 34 37 38 32 37 32 38 37 33 36 15f6964782728736 +| 2576: 35 36 37 36 39 36 34 32 63 32 30 37 34 36 35 37 56769642c2074657 +| 2592: 32 36 64 32 63 32 30 37 30 05 02 12 02 3b 36 31 26d2c2070....;61 +| 2608: 37 32 31 32 31 30 31 37 37 37 34 36 31 36 32 35 7212101777461625 +| 2624: 63 36 35 37 34 33 31 35 66 36 33 36 66 36 65 37 c6574315f636f6e7 +| 2640: 34 36 35 36 65 37 34 37 34 33 31 35 66 36 33 36 4656e7474315f636 +| 2656: 66 36 65 37 34 36 35 36 65 05 04 07 07 01 04 31 f6e74656e......1 +| 2672: 66 62 64 05 02 19 01 44 32 34 38 34 38 30 38 30 fbd....D24848080 +| 2688: 38 30 38 30 30 31 30 33 30 30 34 65 30 30 30 30 80800103004e0000 +| 2704: 30 30 31 65 30 36 33 30 36 31 36 32 36 31 36 33 001e063061626163 +| 2720: 36 62 30 31 30 32 30 32 30 34 30 32 36 36 37 34 6b01020204026674 +| 2736: 30 32 30 32 30 32 30 34 30 34 36 65 05 02 1a 02 02020204046e.... +| 2752: 03 66 65 72 05 02 1d 01 28 33 65 37 34 36 35 36 .fer....(3e74656 +| 2768: 65 37 34 32 39 30 64 30 30 30 30 30 30 30 33 30 e74290d000000030 +| 2784: 66 62 64 30 30 30 66 65 38 30 66 65 66 30 66 62 fbd000fe80fef0fb +| 2800: 64 05 02 18 01 4a 34 31 35 32 35 39 32 30 34 62 d....J415259204b +| 2816: 34 35 35 39 32 63 32 30 36 32 36 63 36 66 36 33 45592c20626c6f63 +| 2832: 36 62 32 30 34 32 34 63 34 66 34 32 32 39 33 61 6b20424c4f42293a +| 2848: 30 31 30 36 31 37 31 31 31 31 30 38 36 33 37 34 0106171111086374 +| 2864: 36 31 36 32 36 63 36 35 37 34 33 31 37 34 33 31 61626c6574317431 +| 2880: 05 02 16 02 49 33 35 32 34 35 34 31 35 34 34 35 ....I35245415445 +| 2896: 32 30 35 36 34 39 35 32 35 34 35 35 34 31 34 63 205649525455414c +| 2912: 32 30 35 34 34 31 34 32 34 63 34 35 32 30 37 34 205441424c452074 +| 2928: 33 31 6f 30 35 35 35 33 34 39 34 65 34 37 32 30 31o05553494e4720 +| 2944: 36 36 37 34 37 33 33 35 32 38 36 33 36 66 05 02 6674733528636f.. +| 2960: 17 02 49 35 32 30 35 34 34 31 34 32 34 63 34 35 ..I5205441424c45 +| 2976: 32 30 32 37 37 34 33 31 35 66 36 33 36 66 36 65 202774315f636f6e +| 2992: 37 34 36 35 36 65 37 34 32 37 32 38 36 39 36 34 74656e7427286964 +| 3008: 32 30 34 39 34 65 35 34 34 35 34 37 34 35 35 32 20494e5445474552 +| 3024: 32 30 35 30 35 32 34 39 34 64 34 31 05 02 0e 44 205052494d41...D +| 3040: 29 62 30 35 30 37 31 37 32 31 32 31 30 31 38 31 )b05071721210181 +| 3056: 30 31 37 34 36 31 36 32 36 63 36 35 37 34 33 31 017461626c657431 +| 3072: 35 66 36 34 36 66 36 33 37 33 05 02 09 01 4a 35 5f646f6373....J5 +| 3088: 32 34 35 34 31 35 34 34 35 32 30 35 34 34 31 34 2454154452054414 +| 3104: 32 34 63 34 35 32 30 32 37 37 34 33 31 35 66 36 24c45202774315f6 +| 3120: 34 36 31 37 34 36 31 32 37 32 38 36 39 36 34 32 4617461272869642 +| 3136: 30 34 39 34 65 35 34 34 35 34 37 34 35 35 32 32 0494e54454745522 +| 3152: 30 35 30 35 32 34 39 34 64 05 02 15 03 3a 35 39 05052494d....:59 +| 3168: 32 30 34 62 34 35 35 39 32 63 32 30 36 33 33 30 204b45592c206330 +| 3184: 32 39 36 39 30 33 30 37 31 37 31 39 31 39 30 31 2969030717191901 +| 3200: 38 31 32 64 37 34 36 31 36 32 36 63 36 35 37 34 812d7461626c6574 +| 3216: 33 31 35 66 36 39 79 79 05 02 0f 02 49 34 32 30 315f69yy....I420 +| 3232: 35 32 34 66 35 37 34 39 34 34 35 35 30 32 30 37 524f574944550207 +| 3248: 31 37 31 62 31 62 30 31 38 31 30 31 37 34 36 31 171b1b0181017461 +| 3264: 36 32 36 63 36 37 37 34 33 31 35 66 36 34 36 31 626c6774315f6461 +| 3280: 37 34 36 31 37 34 33 31 35 66 36 34 36 31 37 34 746174315f646174 +| 3296: 36 31 30 32 34 33 05 02 14 02 07 66 36 39 36 34 610243.....f6964 +| 3312: 37 38 05 02 11 01 4a 36 34 36 66 36 65 30 33 30 78....J646f6e030 +| 3328: 32 30 32 30 34 30 61 30 37 30 35 30 31 30 33 30 202040a070501030 +| 3344: 30 31 30 30 33 30 33 30 66 30 61 30 33 30 30 32 01003030f0a03002 +| 3360: 34 30 30 30 30 30 30 30 30 30 31 30 31 30 31 30 4000000000101010 +| 3376: 30 30 31 30 31 30 31 30 31 30 61 30 30 30 30 30 0010101010a00000 +| 3392: 30 05 02 1b 02 49 35 32 37 32 38 36 39 36 34 32 0....I5272869642 +| 3408: 30 34 39 34 65 35 34 34 35 34 37 34 35 35 32 32 0494e54454745522 +| 3424: 30 35 30 35 32 34 39 34 64 34 31 35 32 35 39 32 05052494d4152592 +| 3440: 30 34 62 34 35 35 39 32 63 32 30 37 33 37 61 32 04b45592c20737a2 +| 3456: 30 34 32 34 63 34 66 34 32 32 39 35 35 30 34 05 0424c4f42295504. +| 3472: 04 06 07 02 49 37 36 65 36 66 32 63 32 30 35 30 ....I76e6f2c2050 +| 3488: 35 32 34 39 34 64 34 31 35 32 35 39 32 30 34 62 52494d415259204b +| 3504: 34 35 35 39 32 38 37 33 36 35 36 37 36 39 36 34 4559287365676964 +| 3520: 32 63 32 30 37 34 36 35 37 32 36 64 32 39 32 39 2c207465726d2929 +| 3536: 32 30 35 37 34 39 35 34 34 38 34 66 35 35 05 02 20574954484f55.. +| 3552: 13 02 49 39 37 61 36 35 37 34 33 31 35 66 36 34 ..I97a6574315f64 +| 3568: 36 66 36 33 37 33 36 39 37 61 36 35 30 35 34 33 6f6373697a650543 +| 3584: 35 32 34 35 34 31 35 34 34 35 32 30 35 34 34 31 5245415445205441 +| 3600: 34 32 34 63 34 35 32 30 32 37 37 34 33 31 35 66 424c45202774315f +| 3616: 36 34 36 66 36 33 37 33 36 39 37 61 05 04 05 07 646f6373697a.... +| 3632: 01 0e 37 34 30 34 34 33 35 32 34 35 34 31 35 34 ..74044352454154 +| 3648: 05 04 08 07 02 49 36 32 39 32 30 35 37 34 39 35 .....I6292057495 +| 3664: 34 34 38 34 66 35 35 35 34 32 30 35 32 34 66 35 4484f555420524f5 +| 3680: 37 34 39 34 34 35 62 30 35 30 37 31 37 32 31 32 749445b050717212 +| 3696: 31 30 31 38 31 30 31 37 34 36 31 36 32 36 63 36 10181017461626c6 +| 3712: 35 37 34 33 31 35 66 36 34 36 66 36 33 37 33 05 574315f646f6373. +| 3728: 02 04 01 06 62 61 63 6b 75 70 05 02 1e 02 05 65 ....backup.....e +| 3744: 61 6d 65 72 05 02 02 02 05 6f 6f 6d 65 72 05 01 amer.....oomer.. +| 3760: 02 40 75 6d 6d 32 34 63 34 35 32 30 32 37 37 34 .@umm24c45202774 +| 3776: 33 31 35 66 36 33 36 66 36 65 36 36 36 39 36 37 315f636f6e666967 +| 3792: 32 37 32 38 36 62 32 30 35 30 35 32 34 39 34 64 27286b205052494d +| 3808: 34 31 35 32 35 39 32 30 34 62 34 35 35 39 32 63 415259204b45592c +| 3824: 32 30 05 02 03 01 04 79 65 6b 72 05 02 10 04 11 20.....yekr..... +| 3840: 4e 41 09 49 08 2d 4f 4e 4e 2e 4f 3f 4e 0c 4f 4f NA.I.-ONN.O?N.OO +| 3856: 4e 4f 14 4e 0b 0a 09 45 0f ef 00 14 2a 00 00 00 NO.N...E....*... +| 3872: 00 01 02 02 00 02 01 01 01 02 01 01 81 09 88 80 ................ +| 3888: 80 80 80 01 04 00 82 16 00 00 00 79 06 30 61 62 ...........y.0ab +| 3904: 61 63 6b 08 02 07 04 04 6e 64 6f 6e 08 02 05 02 ack.....ndon.... +| 3920: 05 63 74 69 76 65 04 02 02 04 02 0b 02 04 6c 70 .ctive........lp +| 3936: 68 61 08 04 02 0a 02 03 74 6b 6d 06 02 02 03 02 ha......tkm..... +| 3952: 6f 6d 08 02 09 05 02 69 63 07 02 02 01 06 62 61 om.....ic.....ba +| 3968: 63 6b 75 70 08 02 04 02 05 6f 6f 6d 65 72 05 02 ckup.....oomer.. +| 3984: 02 01 0c 63 68 61 6e 6e 65 62 6f 6f 6d 65 72 08 ...channeboomer. +| 4000: 02 08 07 01 6c 08 02 03 01 04 74 65 73 74 08 02 ....l.....test.. +| 4016: 06 04 0a 09 0d 0a 08 07 07 0b 0a 11 06 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 08 02 04 02 66 74 00 02 22 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 06 22 00 on.............. +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 04 0f e5 00 0f fa 0f f3 0f ec 0f e5 ................ +| 4064: 00 00 00 00 00 06 04 01 0c 01 04 02 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 0f 68 00 06 08 98 00 0f f6 0f ec 0f d5 08 98 ..h............. +| 16: 0f c1 0f b6 0f 68 0f 68 00 00 00 00 00 00 00 00 .....h.h........ +| 2192: 00 00 00 00 00 00 00 00 8d 4d 05 04 00 9b 1f 62 .........M.....b +| 2208: 65 61 6d 65 72 20 62 75 6d 6d 32 34 63 34 35 32 eamer bumm24c452 +| 2224: 30 32 37 37 34 33 31 35 66 36 33 36 66 36 65 36 02774315f636f6e6 +| 2240: 36 36 39 36 37 32 37 32 38 36 62 32 30 35 30 35 6696727286b20505 +| 2256: 32 34 39 34 64 34 31 35 32 35 39 32 30 34 62 34 2494d415259204b4 +| 2272: 35 35 39 32 63 32 30 0a 37 36 32 39 32 30 35 37 5592c20.76292057 +| 2288: 34 39 35 34 34 38 34 66 35 35 35 34 32 30 35 32 4954484f55542052 +| 2304: 34 66 35 37 34 39 34 34 35 62 30 35 30 37 31 37 4f5749445b050717 +| 2320: 32 31 32 31 30 31 38 31 30 31 37 34 36 31 36 32 2121018101746162 +| 2336: 36 63 36 35 37 34 33 31 35 66 36 34 36 66 36 33 6c6574315f646f63 +| 2352: 37 33 0a 36 39 37 61 36 35 37 34 33 31 35 66 36 73.697a6574315f6 +| 2368: 34 36 66 36 33 37 33 36 39 37 61 36 35 30 35 34 46f6373697a65054 +| 2384: 33 35 32 34 35 34 31 35 34 34 35 32 30 35 34 34 3524541544520544 +| 2400: 31 34 32 34 63 34 35 32 30 32 37 37 34 33 31 35 1424c45202774315 +| 2416: 66 36 34 36 66 36 33 37 33 36 39 37 61 0a 36 35 f646f6373697a.65 +| 2432: 32 37 32 38 36 39 36 34 32 30 34 39 34 65 35 34 2728696420494e54 +| 2448: 34 35 34 37 34 35 35 32 32 30 35 30 35 32 34 39 4547455220505249 +| 2464: 34 64 34 31 35 32 35 39 32 30 34 62 34 35 35 39 4d415259204b4559 +| 2480: 32 63 32 30 37 33 37 61 32 30 34 32 34 63 34 66 2c20737a20424c4f +| 2496: 34 32 32 39 35 35 30 34 0a 30 36 31 37 32 31 32 42295504.0617212 +| 2512: 31 30 31 37 37 37 34 36 31 36 32 35 63 36 35 37 101777461625c657 +| 2528: 34 33 31 35 66 36 33 36 66 36 65 37 34 36 35 36 4315f636f6e74656 +| 2544: 65 37 34 37 34 33 31 35 66 36 33 36 66 36 65 37 e7474315f636f6e7 +| 2560: 34 36 35 36 65 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 4656e........... +| 2576: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 2592: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 2608: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 2624: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 2640: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 2656: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 37 34 30 .............740 +| 2672: 34 34 33 35 32 34 35 34 31 35 34 0a 34 35 32 30 44352454154.4520 +| 2688: 35 34 34 31 34 32 34 63 34 35 32 30 32 37 37 34 5441424c45202774 +| 2704: 33 31 35 66 36 33 36 66 36 65 37 34 36 35 36 65 315f636f6e74656e +| 2720: 37 34 32 37 32 38 36 39 36 34 32 30 34 39 34 65 742728696420494e +| 2736: 35 34 34 35 34 37 34 35 35 32 32 30 35 30 35 62 544547455220505b +| 2752: 30 35 30 37 31 37 32 31 32 31 30 31 38 31 30 31 0507172121018101 +| 2768: 37 34 36 31 36 32 36 63 36 35 37 34 33 31 35 66 7461626c6574315f +| 2784: 36 34 36 66 36 33 37 33 0a 36 39 37 61 36 35 37 646f6373.697a657 +| 2800: 34 33 31 35 66 36 34 36 66 36 33 37 33 36 39 37 4315f646f6373697 +| 2816: 61 36 35 30 35 34 33 35 32 34 35 34 31 35 34 34 a650543524541544 +| 2832: 35 32 30 35 34 34 31 34 32 34 63 34 35 32 30 32 5205441424c45202 +| 2848: 37 37 34 33 31 35 66 36 34 36 66 36 33 37 33 36 774315f646f63736 +| 2864: 39 37 61 0a 36 35 32 37 32 38 36 39 36 34 32 30 97a.652728696420 +| 2880: 34 39 34 65 35 34 34 35 34 37 34 35 35 32 32 30 494e544547455220 +| 2896: 35 30 35 32 34 39 34 64 34 31 35 32 35 39 32 30 5052494d41525920 +| 2912: 34 62 34 35 35 39 32 63 32 30 37 33 37 61 32 30 4b45592c20737a20 +| 2928: 34 32 34 63 34 66 34 32 32 39 35 35 30 34 0a 30 424c4f42295504.0 +| 2944: 36 31 37 32 31 32 31 30 31 37 37 37 34 36 31 36 6172121017774616 +| 2960: 32 35 63 36 35 37 34 33 31 35 66 36 33 36 66 36 25c6574315f636f6 +| 2976: 65 37 34 36 35 36 65 37 34 37 34 33 31 35 66 36 e74656e7474315f6 +| 2992: 33 36 66 36 65 37 34 36 35 36 65 0b 0b 0b 0b 0b 36f6e74656e..... +| 3008: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 3024: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 3040: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 3056: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 3072: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 3088: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 3104: 0b 0b 0b 37 34 30 34 34 33 35 32 34 35 34 31 35 ...7404435245415 +| 3120: 34 0a 34 35 32 30 35 34 34 31 34 32 34 63 34 35 4.45205441424c45 +| 3136: 32 30 32 37 37 34 33 31 35 66 36 33 36 66 36 65 202774315f636f6e +| 3152: 37 34 36 35 36 65 37 34 32 37 32 38 36 39 36 34 74656e7427286964 +| 3168: 32 30 34 39 34 65 35 34 34 35 34 37 34 35 35 32 20494e5445474552 +| 3184: 32 30 35 30 35 32 34 39 34 64 34 31 0a 35 32 35 205052494d41.525 +| 3200: 39 32 30 34 62 34 35 35 39 32 63 32 30 36 33 33 9204b45592c20633 +| 3216: 30 32 39 36 39 30 33 30 37 31 37 31 39 31 39 30 0296903071719190 +| 3232: 31 38 31 32 64 37 34 36 31 36 32 36 63 36 35 37 1812d7461626c657 +| 3248: 34 33 31 35 66 36 39 c3 bf c3 bf 7e c3 bf c3 89 4315f69....~.... +| 3264: 4b 52 c2 81 35 66 36 39 36 34 37 38 0a 30 33 34 KR..5f696478.034 +| 3280: 33 35 32 34 35 34 31 35 34 34 35 32 30 35 34 34 3524541544520544 +| 3296: 31 34 32 34 63 34 35 32 30 32 37 37 34 33 31 35 1424c45202774315 +| 3312: 66 36 39 36 34 37 38 32 37 32 38 37 33 36 35 36 f696478272873656 +| 3328: 37 36 39 36 34 32 63 32 30 37 34 36 35 37 32 36 769642c207465726 +| 3344: 64 32 63 32 30 37 30 0a 36 37 36 65 36 66 32 63 d2c2070.676e6f2c +| 3360: 32 30 35 30 35 32 34 39 34 64 34 31 35 32 35 39 205052494d415259 +| 3376: 32 30 34 62 34 35 35 39 32 38 37 33 36 35 36 37 204b455928736567 +| 3392: 36 39 36 34 32 63 32 30 37 34 36 35 37 32 36 64 69642c207465726d +| 3408: 32 39 32 39 32 30 35 37 34 39 35 34 34 38 34 66 292920574954484f +| 3424: 35 35 0a 35 34 32 30 35 32 34 66 35 37 34 39 34 55.5420524f57494 +| 3440: 34 35 35 30 32 30 37 31 37 31 62 31 62 30 31 38 4550207171b1b018 +| 3456: 31 30 31 37 34 36 31 36 32 36 63 36 37 37 34 33 1017461626c67743 +| 3472: 31 35 66 36 34 36 31 37 34 36 31 37 34 33 31 35 15f6461746174315 +| 3488: 66 36 34 36 31 37 34 36 31 30 32 34 33 0a 35 32 f646174610243.52 +| 3504: 34 35 34 31 35 34 34 35 32 30 35 34 34 31 34 32 4541544520544142 +| 3520: 34 63 34 35 32 30 32 37 37 34 33 31 35 66 36 34 4c45202774315f64 +| 3536: 36 31 37 34 36 31 32 37 32 38 36 39 36 34 32 30 6174612728696420 +| 3552: 34 39 34 65 35 34 34 35 34 37 34 35 35 32 32 30 494e544547455220 +| 3568: 35 30 35 32 34 39 34 64 0a 34 31 35 32 35 39 32 5052494d.4152592 +| 3584: 30 34 62 34 35 35 39 32 63 32 30 36 32 36 63 36 04b45592c20626c6 +| 3600: 66 36 33 36 62 32 30 34 32 34 63 34 66 34 32 32 f636b20424c4f422 +| 3616: 39 33 61 30 31 30 36 31 37 31 31 31 31 30 38 36 93a0106171111086 +| 3632: 33 37 34 36 31 36 32 36 63 36 35 37 34 33 31 37 37461626c6574317 +| 3648: 34 33 31 0a 34 33 35 32 34 35 34 31 35 34 34 35 431.435245415445 +| 3664: 32 30 35 36 34 39 35 32 35 34 35 35 34 31 34 63 205649525455414c +| 3680: 32 30 35 34 34 31 34 32 34 63 34 35 32 30 37 34 205441424c452074 +| 3696: 33 31 c3 94 30 35 35 35 33 34 39 34 65 34 37 32 31..05553494e472 +| 3712: 30 36 36 37 34 37 33 33 35 32 38 36 33 36 66 0a 06674733528636f. +| 3728: 33 65 37 34 36 35 36 65 37 34 32 39 30 64 30 30 3e74656e74290d00 +| 3744: 30 30 30 30 30 33 30 66 62 64 30 30 30 66 65 38 0000030fbd000fe8 +| 3760: 30 66 65 66 30 66 62 64 0a 5b 31 66 62 64 5d 32 0fef0fbd.[1fbd]2 +| 3776: 34 38 34 38 30 38 30 38 30 38 30 30 31 30 33 30 4848080808001030 +| 3792: 30 34 65 30 30 30 30 30 30 31 65 30 36 33 30 36 04e0000001e06306 +| 3808: 31 36 32 36 31 36 33 36 62 30 31 30 32 30 32 30 16261636b0102020 +| 3824: 34 30 32 36 36 37 34 30 32 30 32 30 32 30 34 30 4026674020202040 +| 3840: 34 36 65 0a 36 34 36 66 36 65 30 33 30 32 30 32 46e.646f6e030202 +| 3856: 30 34 30 61 30 37 30 35 30 31 30 33 30 30 31 30 040a070501030010 +| 3872: 30 33 30 33 30 66 30 61 30 33 30 30 32 34 30 30 03030f0a03002400 +| 3888: 30 30 30 30 30 30 30 31 30 31 30 31 30 30 30 31 0000000101010001 +| 3904: 30 31 30 31 30 31 30 61 30 30 30 30 30 30 0a 30 0101010a000000.0 +| 3920: 31 30 66 66 61 30 30 30 66 66 61 0a 5b 32 66 65 10ffa000ffa.[2fe +| 3936: 72 20 62 61 63 6b 75 70 0f ca 00 4e 81 1d 61 6c r backup...N..al +| 3952: 70 68 61 20 63 68 61 6e 6e 65 6c 20 c2 af 62 61 pha channel ..ba +| 3968: 63 6b 75 70 20 61 62 61 6e 64 6f 6e 20 74 65 73 ckup abandon tes +| 3984: 74 20 61 62 61 63 6b 20 63 68 61 6e 6e 65 62 6f t aback channebo +| 4000: 6f 6d 65 72 20 61 74 6f 6d 20 61 6c 70 68 61 20 omer atom alpha +| 4016: 61 63 74 69 76 65 09 07 03 00 19 61 74 6f 6d 69 active.....atomi +| 4032: 63 07 06 03 00 15 61 74 6b 6d 0f e0 00 0b 19 62 c.....atkm.....b +| 4048: 6f 6f 6d 65 72 09 04 03 00 19 61 63 74 69 76 65 oomer.....active +| 4064: 00 00 00 0c 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 66 21 66 74 08 01 03 00 17 61 62 61 63 6b .af!ft.....aback +| page 5 offset 16384 +| 0: 0d 0f ee 00 06 0f d6 00 0f fa 0f f4 0f e8 0f e2 ................ +| 16: 0f dc 0f d6 0f d0 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 0f ee 00 06 0e 0a 04 07 03 00 0e 01 04 06 03 00 ................ +| 4064: 0e 01 04 05 03 00 0e 1d 04 04 03 00 0e 01 00 00 ................ +| 4080: 00 06 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c19b.db +}]} {} + +do_catchsql_test 18.1 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + +#-------------------------------------------------------------------------- +reset_db +do_test 19.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c20b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 01 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ..08...........m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 0f 20 00 05 0e a0 00 0f e8 0e a0 0f bd 0f 34 .. ............4 +| 16: 0e b7 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3744: 15 0a 03 00 30 00 00 00 00 01 03 03 00 03 01 01 ....0........... +| 3760: 01 02 01 01 03 01 01 62 8c 80 80 80 80 01 04 00 .......b........ +| 3776: 81 48 00 00 00 55 06 30 61 62 61 63 6b 08 01 04 .H...U.0aback... +| 3792: 04 6e 64 6f 6e 03 01 05 01 02 05 63 74 69 76 65 .ndon......ctive +| 3808: 08 01 02 04 6c 70 68 61 08 01 02 03 74 6f 6d 08 ....lpha....tom. +| 3824: 01 01 06 62 61 63 6b 75 70 08 01 02 05 6f 6f 6d ...backup....oom +| 3840: 65 72 08 01 01 07 63 68 61 6e 6e 65 6c 08 01 01 er....channel... +| 3856: 04 74 65 73 74 08 01 04 09 0a 09 08 07 0a 09 0b .test........... +| 3872: 0f ef 00 14 2a 00 00 00 00 01 02 02 00 02 01 01 ....*........... +| 3888: 01 02 01 01 81 01 88 80 80 80 80 01 04 00 82 06 ................ +| 3904: 00 00 00 72 06 30 61 62 61 63 6b 08 02 07 04 04 ...r.0aback..... +| 3920: 6e 64 6f 6e 08 02 05 02 05 63 74 69 76 65 04 02 ndon.....ctive.. +| 3936: 02 04 02 0b 02 04 6c 70 68 61 08 04 02 0a 02 03 ......lpha...... +| 3952: 74 6f 6d 06 02 02 02 02 09 05 02 69 63 07 02 02 tom........ic... +| 3968: 01 06 62 61 63 6b 75 70 08 02 04 02 05 6f 6f 66 ..backup.....oof +| 3984: 65 72 05 02 02 04 03 6d 65 72 08 02 08 01 07 63 er.....mer.....c +| 4000: 68 61 6e 6e 65 6c 08 02 03 01 04 74 65 73 74 08 hannel.....test. +| 4016: 02 06 04 0a 09 0d 0a 0b 07 0b 0a 08 0c 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 66 04 00 22 74 00 02 22 04 04 6e 64 ck..f...t.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 06 06 00 on.............. +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 0f e0 00 06 0f b6 00 0f f6 0f ec 0f d5 0f ca ................ +| 16: 0f c1 0f b6 0f 70 0f 70 00 00 00 00 00 00 00 00 .....p.p........ +| 3952: 0f e0 00 46 81 0d 61 6c 70 68 61 20 63 68 61 6e ...F..alpha chan +| 3968: 6e 65 6c 20 62 61 63 6b 75 70 20 61 62 61 6e 64 nel backup aband +| 3984: 6f 6e 20 74 65 73 74 20 61 62 61 63 6b 20 62 6f on test aback bo +| 4000: 6f 6d 65 72 20 61 74 6f 6d 20 61 6c 70 68 61 20 omer atom alpha +| 4016: 61 63 74 69 76 65 09 07 03 00 19 61 74 6f 6d 69 active.....atomi +| 4032: 63 07 06 03 00 15 61 74 6f 6d 09 05 03 00 19 62 c.....atom.....b +| 4048: 6f 6f 66 65 72 09 04 03 00 19 61 63 74 69 76 65 oofer.....active +| 4064: 00 00 00 0c 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 0f ee 00 06 0f d6 00 0f fa 0f f4 0f e8 0f e2 ................ +| 16: 0f dc 0f d6 0f d0 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 0f ee 00 06 0e 0a 04 07 03 00 0e 01 04 06 03 00 ................ +| 4064: 0e 01 04 05 03 00 0e 01 04 04 03 00 0e 01 00 00 ................ +| 4080: 00 06 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 86 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 .eck....optimize +| end c20b.db +}]} {} + +do_catchsql_test 19.1 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + +#-------------------------------------------------------------------------- +reset_db +do_test 20.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-cf347c523f793c.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f e8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 02 02 02 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 03 03 0f on.............. +| 4080: 0a 03 00 24 00 00 00 0e ee ee ee ee ee ee ee ee ...$............ +| page 3 offset 8192 +| 0: ee ee ee ee ee ee ee ee ee ee ee ee ee ee ee ee ................ +| 16: ee ee ee ee ee ee ee ee ee ee ee ee ee ee ee ee ................ +| 32: ee ee ee ee ee ee ee ee ee ee ee ee 00 10 10 10 ................ +| 48: 00 10 10 10 10 a0 00 00 00 10 ff a0 00 ff 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f ec 0f e0 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f ee 00 0f fa 0f f4 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end crash-cf347c523f793c.db +}]} {} + +do_catchsql_test 20.1 { + SELECT * FROM t1 WHERE t1 MATCH 'abandon'; +} {1 {vtable constructor failed: t1}} + +#------------------------------------------------------------------------- +reset_db +do_test 21.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c22b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 01 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ..08...........m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 0e 8e 00 06 0e 2f 00 0f e8 0e 2f 0f bd 0f 3b ....../..../...; +| 16: 0e a5 0e 49 00 00 00 00 00 00 00 00 00 00 00 00 ...I............ +| 3616: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 ................ +| 3632: 0a 03 00 36 00 00 00 00 01 04 04 00 04 01 01 01 ...6............ +| 3648: 02 01 01 03 01 01 04 01 01 3e 90 80 80 80 80 01 .........>...... +| 3664: 04 00 81 00 00 00 00 36 06 30 62 61 63 6b 75 05 .......6.0backu. +| 3680: 02 04 05 02 04 02 05 65 61 6d 65 72 05 02 02 05 .......eamer.... +| 3696: 02 02 02 05 6f 6f 6d 65 72 05 01 05 01 02 05 75 ....oomer......u +| 3712: 6d 6d 65 72 05 02 03 05 02 03 04 0d 0d 0b 0f 27 mmer...........' +| 3728: 00 17 30 00 00 00 00 01 03 03 00 03 01 01 01 02 ..0............. +| 3744: 01 01 03 01 01 7b 8c 80 80 80 80 01 04 00 81 7a ...............z +| 3760: 00 00 00 6d 06 30 61 62 61 63 6b 0d 02 07 04 04 ...m.0aback..... +| 3776: 6e 64 6f 6e 0d 02 05 02 05 63 74 69 76 65 09 02 ndon.....ctive.. +| 3792: 02 04 02 0b 02 04 6c 70 68 61 0d 04 02 0a 02 03 ......lpha...... +| 3808: 74 6f 6d 0b 02 02 02 02 09 05 02 69 63 0c 02 02 tom........ic... +| 3824: 01 06 62 61 63 6b 75 70 0d 02 04 02 05 6f 6f 6d ..backup.....oom +| 3840: 65 72 0a 02 02 03 02 08 01 07 63 68 61 6e 6e 65 er........channe +| 3856: 6c 0d 02 03 01 04 74 65 73 74 0d 02 06 04 0a 09 l.....test...... +| 3872: 0d 0a 0b 07 0b 0d 0c 0f ef 00 14 2a 00 00 00 00 ...........*.... +| 3888: 01 02 02 00 02 01 01 01 02 01 01 7b 88 80 80 80 ................ +| 3904: 80 01 04 00 81 7a 00 00 00 6d 06 30 61 62 61 63 .....z...m.0abac +| 3920: 6b 08 02 07 04 04 6e 64 6f 6e 08 02 05 02 05 63 k.....ndon.....c +| 3936: 74 69 76 65 04 02 02 04 02 0b 02 04 6c 70 68 61 tive........lpha +| 3952: 08 04 02 0a 02 03 74 6f 6d 06 02 02 02 02 09 05 ......tom....... +| 3968: 02 69 63 07 02 02 01 06 62 61 63 6b 75 70 08 02 .ic.....backup.. +| 3984: 04 02 05 6f 6f 6d 65 72 05 02 02 03 02 08 01 07 ...oomer........ +| 4000: 63 68 61 6e 6e 65 6c 08 02 03 01 04 74 65 73 74 channel.....test +| 4016: 08 02 06 04 0a 09 0d 0a 0b 07 0b 0d 0c 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 00 02 22 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 08 0a 07 05 01 03 00 10 0d 23 00 on............#. +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 04 0f e5 00 0f fa 0f f3 0f ec 0f e5 ................ +| 4064: 00 00 00 00 00 06 04 01 0c 01 04 02 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 0f 5a 00 0d 0e ce 00 0f f6 0f ec 0f e0 0f d5 ..Z............. +| 16: 0e e7 0f c1 0f b6 0f 70 0f 65 0e ce 0f 51 0f 46 .......p.e...Q.F +| 32: 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3776: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 0a ................ +| 3792: 03 00 35 62 65 61 6d 65 72 20 62 75 6d 6d 65 72 ..5beamer bummer +| 3808: 20 62 61 63 6b 75 29 17 05 03 00 35 62 65 61 6d backu)....5beam +| 3824: 65 72 20 62 75 6d 6d 65 72 20 62 61 63 6b 75 29 er bummer backu) +| 3840: 44 0d 04 00 81 0d 61 6c 70 68 61 20 63 68 61 6e D.....alpha chan +| 3856: 6e 65 6c 20 62 61 63 6b 75 70 20 61 62 61 6e 64 nel backup aband +| 3872: 6f 6e 20 74 65 73 74 20 61 62 61 63 6b 20 62 6f on test aback bo +| 3888: 6f 6d 65 72 20 61 74 6f 6d 20 61 6c 70 68 61 20 omer atom alpha +| 3904: 61 63 74 69 76 65 09 0c 03 00 19 61 74 6f 6d 69 active.....atomi +| 3920: 63 07 0b 03 00 15 61 74 6f 6d 0f ca 00 0b 19 62 c.....atom.....b +| 3936: 6f 6f 6d 65 72 09 09 03 00 19 61 63 74 69 76 65 oomer.....active +| 3952: 44 08 04 00 81 0d 61 6c 70 68 61 20 63 68 61 6e D.....alpha chan +| 3968: 6e 65 6c 20 62 61 63 6b 75 70 20 61 62 61 6e 64 nel backup aband +| 3984: 6f 6e 20 74 65 73 74 20 61 62 61 63 6b 20 62 6f on test aback bo +| 4000: 6f 6d 65 72 20 61 74 6f 6d 20 61 6c 70 68 61 20 omer atom alpha +| 4016: 61 63 74 69 76 65 09 07 03 00 19 61 74 6f 6d 69 active.....atomi +| 4032: 63 07 06 03 00 15 61 74 6f 6d 00 00 00 0b 19 62 c.....atom.....b +| 4048: 6f 6f 6d 65 72 09 04 03 00 19 61 63 74 69 76 65 oomer.....active +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 0d 0f b2 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 0f ca 0f c4 0f be 0f b8 ................ +| 32: 0f b2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 04 0d 03 00 0e 0a 04 0c 03 00 0e 01 04 0b ................ +| 4032: 03 00 0e 01 04 0a 03 00 0e 03 04 09 03 00 0e 01 ................ +| 4048: 04 08 03 00 0e 0a 04 07 03 00 0e 01 04 06 03 00 ................ +| 4064: 0e 01 04 05 03 00 0e 03 04 04 03 00 0e 01 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c22b.db +}]} {} + +do_catchsql_test 21.1 { + DELETE FROM t1 WHERE t1 MATCH 'ab*ndon'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +# +reset_db +do_test 22.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c22b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 02 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 ................ +| 96: 00 2e 30 38 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ..08...........m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 41 62 6c 65 74 31 5f 64 ..!!...tAblet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 75 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 uAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 0f 15 00 05 08 4e 00 0f e8 08 4e 0f bd 0f 29 ......N....N...) +| 16: 08 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .e.............. +| 2112: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 0a ................ +| 2128: 03 00 30 00 00 00 00 01 03 02 01 03 01 01 01 02 ..0............. +| 2144: 01 01 03 01 01 8d 28 8c 80 80 80 80 01 04 00 9a ......(......... +| 2160: 54 00 00 06 77 19 30 30 30 30 30 30 33 30 66 65 T...w.00000030fe +| 2176: 65 30 30 30 66 66 61 30 66 66 34 30 66 65 65 05 e000ffa0ff40fee. +| 2192: 02 19 02 0b 31 30 66 66 61 30 30 30 66 66 61 05 ....10ffa000ffa. +| 2208: 06 13 18 09 02 25 33 34 33 35 32 34 35 34 31 35 .....%3435245415 +| 2224: 34 34 35 32 30 35 34 34 31 34 32 34 63 34 35 32 445205441424c452 +| 2240: 30 32 37 37 34 33 31 35 66 36 39 05 02 07 02 37 02774315f69....7 +| 2256: 34 30 33 30 33 30 30 30 65 30 31 30 34 30 32 30 40303000e0104020 +| 2272: 33 30 30 30 65 30 31 30 34 30 31 30 33 30 30 30 3000e01040103000 +| 2288: 65 30 31 30 61 30 30 30 30 30 30 30 31 30 66 66 e010a000000010ff +| 2304: 34 30 30 30 66 66 34 05 02 1b 02 27 35 30 34 30 4000ff4....'5040 +| 2320: 39 30 63 30 31 30 32 30 64 30 30 30 30 30 30 30 90c01020d0000000 +| 2336: 33 30 66 65 30 30 30 30 66 66 36 30 66 65 63 30 30fe0000ff60fec0 +| 2352: 66 65 30 05 02 2c 27 02 66 30 05 02 16 02 1d 36 fe0..,'.f0.....6 +| 2368: 31 37 31 31 31 31 30 38 36 33 37 34 36 31 36 32 1711110863746162 +| 2384: 36 63 36 35 37 34 33 31 37 34 33 31 05 02 0d 02 6c6574317431.... +| 2400: 29 39 30 33 30 32 31 62 37 32 36 35 36 32 37 35 )903021b72656275 +| 2416: 36 34 36 31 37 34 36 31 37 34 33 31 35 66 36 34 6461746174315f64 +| 2432: 36 31 37 34 36 31 30 32 34 33 05 02 1f 02 43 61 6174610243....Ca +| 2448: 30 33 30 33 30 30 31 62 36 31 36 32 36 31 36 65 0303001b6162616e +| 2464: 36 34 36 66 36 65 30 38 30 32 30 33 30 30 31 37 646f6e0802030017 +| 2480: 36 31 36 32 36 31 36 36 37 34 30 38 30 31 30 33 6162616674080103 +| 2496: 30 30 31 37 36 31 36 32 36 31 36 33 36 62 30 64 0017616261636b0d +| 2512: 30 30 05 02 18 34 1d 33 36 62 30 31 30 32 30 32 00...4.36b010202 +| 2528: 30 34 30 32 36 36 37 34 30 32 30 32 30 32 30 34 0402667402020204 +| 2544: 30 34 36 65 05 02 2e 02 33 62 30 33 31 62 30 31 046e....3b031b01 +| 2560: 37 36 36 35 37 32 37 33 36 39 36 66 36 65 30 34 76657273696f6e04 +| 2576: 30 64 30 30 30 30 30 30 30 33 30 66 64 36 30 30 0d000000030fd600 +| 2592: 30 66 66 34 30 66 65 31 30 66 64 36 05 02 1d 01 0ff40fe10fd6.... +| 2608: 04 31 66 62 64 05 04 10 18 01 01 32 05 02 14 02 .1fbd......2.... +| 2624: 43 34 38 34 38 30 38 30 38 30 38 30 30 31 30 33 C484808080800103 +| 2640: 30 30 34 65 30 30 30 30 30 30 31 65 30 36 33 30 004e0000001e0630 +| 2656: 36 31 36 32 36 31 36 33 36 62 30 31 30 32 30 32 616261636b010202 +| 2672: 30 34 30 32 36 36 37 34 30 32 30 32 30 32 30 34 0402667402020204 +| 2688: 30 34 36 65 05 04 11 18 02 01 66 05 02 2a 03 02 046e......f..*.. +| 2704: 65 72 05 02 31 01 08 33 35 32 38 36 33 36 66 05 er..1..3528636f. +| 2720: 02 24 02 03 66 65 30 05 04 17 18 01 2b 34 31 35 .$..fe0.....+415 +| 2736: 32 35 39 32 30 34 62 34 35 35 39 32 63 32 30 36 259204b45592c206 +| 2752: 32 36 63 36 66 36 33 36 62 32 30 34 32 34 63 34 26c6f636b20424c4 +| 2768: 66 34 32 32 39 33 61 30 05 02 0c 2c 1f 31 30 36 f42293a0...,.106 +| 2784: 31 37 31 31 31 31 30 38 36 33 37 34 36 31 36 32 1711110863746162 +| 2800: 36 63 36 35 37 34 33 31 37 34 33 31 05 02 22 02 6c6574317431.... +| 2816: 40 33 35 32 34 35 34 31 35 34 34 35 32 30 35 36 @352454154452056 +| 2832: 34 39 35 32 35 34 37 35 34 31 34 63 32 30 35 34 49525475414c2054 +| 2848: 34 31 34 32 34 63 34 35 32 30 37 34 33 31 32 30 41424c4520743120 +| 2864: 35 35 35 33 34 39 34 65 34 37 32 30 36 36 37 34 5553494e47206674 +| 2880: 37 05 02 23 42 09 33 33 35 32 38 36 33 36 66 05 7..#B.33528636f. +| 2896: 02 0e 02 03 66 65 65 05 02 1a 01 34 35 32 34 35 ....fee....45245 +| 2912: 34 31 35 34 34 35 32 30 35 34 34 31 34 32 34 63 415445205441424c +| 2928: 34 35 32 30 32 37 37 34 33 31 35 66 36 34 36 31 45202774315f6461 +| 2944: 37 34 36 31 32 37 32 38 36 39 36 34 32 30 34 39 7461272869642049 +| 2960: 05 02 20 16 37 c3 b0 35 32 30 32 37 37 34 33 31 .. .7..520277431 +| 2976: 35 66 36 34 36 31 37 34 36 31 32 37 32 38 36 39 5f64617461272869 +| 2992: 36 34 32 30 34 39 34 65 35 34 34 35 34 37 34 35 6420494e54454745 +| 3008: 35 32 32 30 35 30 35 32 34 39 34 64 05 02 0b 03 52205052494d.... +| 3024: 48 35 39 32 30 34 62 34 35 35 39 32 63 32 30 36 H59204b45592c206 +| 3040: 33 33 30 32 39 36 39 30 33 30 30 30 31 35 37 35 3302969030001575 +| 3056: 33 31 31 39 32 36 64 37 34 36 31 36 32 36 63 36 311926d7461626c6 +| 3072: 35 37 34 33 31 35 66 36 39 36 34 37 38 37 34 33 574315f696478743 +| 3088: 31 35 66 36 39 36 34 37 38 05 02 06 02 38 34 32 15f696478....842 +| 3104: 30 35 32 34 66 35 37 34 39 34 34 35 35 30 32 30 0524f57494455020 +| 3120: 37 31 37 31 62 31 62 30 31 38 31 30 31 37 34 36 7171b1b018101746 +| 3136: 31 36 32 36 63 36 35 37 34 33 31 35 66 31 37 34 1626c6574315f174 +| 3152: 36 31 30 32 34 33 05 02 0a 02 03 66 66 34 05 02 610243.....ff4.. +| 3168: 1c 01 4a 36 34 36 66 36 65 30 33 30 32 30 32 30 ..J646f6e0302020 +| 3184: 34 30 61 30 37 30 35 30 31 30 33 30 30 31 30 30 40a0705010300100 +| 3200: 33 30 33 30 66 30 61 30 33 30 30 32 34 30 30 30 3030f0a030024000 +| 3216: 30 30 30 30 30 30 31 30 31 30 31 30 30 30 31 30 0000001010100010 +| 3232: 31 30 31 30 30 39 61 30 30 30 30 30 30 05 02 2f 101009a000000../ +| 3248: 42 09 31 30 61 30 30 30 30 30 30 05 02 28 08 43 B.10a000000..(.C +| 3264: 74 30 32 30 32 30 34 30 61 30 37 30 35 30 31 30 t0202040a0705010 +| 3280: 33 30 30 31 30 30 33 30 33 30 66 30 61 30 33 30 3001003030f0a030 +| 3296: 30 32 34 30 30 30 30 30 30 30 30 30 31 30 31 30 0240000000001010 +| 3312: 31 30 30 30 31 30 31 30 31 30 31 30 61 30 30 30 100010101010a000 +| 3328: 30 30 30 05 02 12 02 49 37 36 65 36 66 32 63 32 000....I76e6f2c2 +| 3344: 30 35 30 35 32 34 39 34 64 34 31 35 32 35 39 32 05052494d4152592 +| 3360: 30 34 62 34 35 35 39 32 38 37 33 36 35 36 37 36 04b4559287365676 +| 3376: 39 36 34 32 63 32 30 37 34 36 35 37 32 36 64 32 9642c207465726d2 +| 3392: 39 32 39 32 30 35 37 34 39 35 34 34 38 34 66 35 92920574954484f5 +| 3408: 35 05 02 09 02 4c 39 37 61 36 35 37 34 33 31 35 5....L97a6574315 +| 3424: 66 36 34 36 66 36 33 37 33 36 39 37 61 36 35 30 f646f6373697a650 +| 3440: 35 34 33 35 32 34 35 34 31 35 34 34 35 32 30 35 5435245415445205 +| 3456: 34 38 36 39 36 34 32 30 34 39 34 65 35 34 34 35 48696420494e5445 +| 3472: 34 37 34 35 35 32 32 30 35 30 35 32 34 39 34 34 4745522050524944 +| 3488: 64 31 05 02 05 02 27 65 37 34 36 35 36 65 37 34 d1....'e74656e74 +| 3504: 32 39 30 64 30 30 30 30 30 30 30 33 30 66 62 64 290d000000030fbd +| 3520: 30 30 30 62 65 38 30 66 65 66 30 66 62 64 05 02 000be80fef0fbd.. +| 3536: 0f 1e 0b 66 65 38 30 66 65 66 30 66 62 64 05 02 ...fe80fef0fbd.. +| 3552: 25 02 03 66 64 36 05 02 1e 01 4a 37 36 32 39 32 %..fd6....J76292 +| 3568: 30 35 37 34 39 35 34 34 38 34 66 35 35 35 34 32 0574954484f55542 +| 3584: 30 35 32 34 66 35 37 34 39 34 34 35 62 30 35 30 0524f5749445b050 +| 3600: 37 31 37 32 31 32 31 30 31 38 31 30 31 37 34 36 7172121018101746 +| 3616: 31 36 32 36 63 36 35 37 34 33 31 35 66 36 34 36 1626c6574315f646 +| 3632: 66 36 33 37 33 05 02 04 02 21 38 32 37 32 38 37 f6373....!827287 +| 3648: 33 36 35 36 37 36 39 36 34 32 63 32 30 37 34 36 3656769642c20746 +| 3664: 35 37 32 36 64 32 63 32 30 37 30 05 02 08 01 01 5726d2c2070..... +| 3680: 61 05 02 2b 01 06 62 61 63 6b 75 70 05 02 32 02 a..+..backup..2. +| 3696: 05 65 61 6d 65 72 05 02 02 02 05 6f 6f 6d 65 72 .eamer.....oomer +| 3712: 05 01 02 40 75 6d 6d 32 34 63 34 35 32 30 32 37 ...@umm24c452027 +| 3728: 37 34 33 31 35 66 36 33 36 66 36 65 36 36 36 39 74315f636f6e6669 +| 3744: 36 37 32 37 32 38 36 62 32 30 35 30 35 32 34 39 6727286b20505249 +| 3760: 34 64 34 31 35 32 35 39 32 30 34 62 34 35 35 39 4d415259204b4559 +| 3776: 32 63 32 30 05 02 03 01 15 65 35 34 34 35 34 37 2c20.....e544547 +| 3792: 34 35 35 32 32 30 35 30 35 32 34 39 34 64 05 02 4552205052494d.. +| 3808: 21 01 02 66 61 05 02 15 04 1d 12 2a 3c 2c 07 22 !..fa......*<,.. +| 3824: 2e 48 22 38 0a 06 49 06 07 0d 09 30 24 45 0e 08 .H.8..I....0$E.. +| 3840: 39 3c 4d 3d 08 4f 0e 48 4e 51 2c 10 08 4f 26 06 9.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 b2 04 55 85 44 54 e5 34 MIT LOAD..U.DT.4 +| 3216: 94 f4 e5 84 e4 f4 34 15 34 51 e1 f0 50 03 30 f1 ......4.4Q..P.0. +| 3232: 74 f4 d4 95 42 04 c4 f4 14 42 04 55 85 44 54 e5 t...B....B.U.DT. +| 3248: 34 94 f4 e5 85 25 45 24 94 d1 f1 e0 50 03 30 f1 4....%E$....P.0. +| 3264: 94 d4 15 82 04 d4 54 d4 f5 25 93 d3 53 03 03 03 ......T..%..S... +| 3280: 03 03 03 05 84 24 94 e4 15 25 91 f1 d0 50 03 30 .....$...%...P.0 +| 3296: f1 94 d4 15 82 04 d4 54 d4 f5 25 93 d3 53 03 03 .......T..%..S.. +| 3312: 03 03 03 03 05 84 e4 f4 34 15 34 51 e1 c0 50 03 ........4.4Q..P. +| 3328: 30 f1 74 d4 15 82 04 d4 54 d4 f5 25 93 d3 53 03 0.t.....T..%..S. +| 3344: 03 03 03 03 03 05 85 25 45 24 94 d1 81 b0 50 02 .......%E$....P. +| 3360: 50 f1 94 54 e4 14 24 c4 52 05 25 45 24 54 55 84 P..T..$.R.%E$TU. +| 3376: 24 94 e4 15 25 91 81 a0 50 02 50 f1 94 54 e4 14 $...%...P.P..T.. +| 3392: 24 c4 52 05 25 45 24 54 55 84 e4 f4 34 15 34 51 $.R.%E$TU...4.4Q +| 3408: 71 90 50 02 50 f1 74 54 e4 14 24 c4 52 05 25 45 q.P.P.tT..$.R.%E +| 3424: 24 54 55 85 25 45 24 94 d1 a1 80 50 02 90 f1 94 $TU.%E$....P.... +| 3440: 54 e4 14 24 c4 52 04 d4 54 d5 35 95 33 55 84 24 T..$.R..T.5.3U.$ +| 3456: 94 e4 15 25 91 a1 70 50 02 90 f1 94 54 e4 14 24 ...%..pP....T..$ +| 3472: c4 52 04 d4 54 d5 35 95 33 55 84 e4 f4 34 15 34 .R..T.5.3U...4.4 +| 3488: 51 91 60 50 02 90 f1 74 54 e4 14 24 c4 52 04 d4 Q.`P...tT..$.R.. +| 3504: 54 d5 35 95 33 55 85 25 45 24 94 d1 81 50 50 02 T.5.3U.%E$...PP. +| 3520: 50 f1 94 54 e4 14 24 c4 52 04 a5 34 f4 e3 15 84 P..T..$.R..4.... +| 3536: 24 94 e4 15 25 91 81 40 50 02 50 f1 94 54 e4 14 $...%..@P.P..T.. +| 3552: 24 c4 52 04 a5 34 f4 e3 15 84 e4 f4 34 15 34 51 $.R..4......4.4Q +| 3568: 71 30 50 02 50 f1 74 54 e4 14 24 c4 52 04 a5 34 q0P.P.tT..$.R..4 +| 3584: f4 e3 15 85 25 45 24 94 d1 a1 20 50 02 90 f1 94 ....%E$... P.... +| 3600: 54 e4 14 24 c4 52 04 74 54 f5 04 f4 c5 95 84 24 T..$.R.tT......$ +| 3616: 94 e4 15 25 91 a1 10 50 02 90 f1 94 54 e4 14 24 ...%...P....T..$ +| 3632: c4 52 04 74 54 f5 04 f4 c5 95 84 e4 f4 34 15 34 .R.tT........4.4 +| 3648: 51 91 00 50 02 90 f1 74 54 e4 14 24 c4 52 04 74 Q..P...tT..$.R.t +| 3664: 54 f5 04 f4 c5 95 85 25 45 24 94 d1 70 f0 50 02 T......%E$..p.P. +| 3680: 30 f1 94 54 e4 14 24 c5 20 46 54 53 35 58 42 49 0..T..$. FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 97 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 02 02 50 08 5f 17 44 45 42 55 47 CASE...P._.DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-b87dfef02880fe.db +}]} {} + +do_catchsql_test 24.1 { + UPDATE t1 SET b=quote(zeroblob(200)) WHERE a MATCH 'thread*'; +} {1 {database disk image is malformed}} + +do_catchsql_test 24.2 { + INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + +#-------------------------------------------------------------------------- +reset_db +do_test 25.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-e3b1b19e4d4bcc.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 06 00 00 00 00 .....@ ........ +| 32: 00 00 00 00 00 00 00 06 00 00 00 04 00 00 00 00 ................ +| 48: 03 20 54 35 24 54 15 44 52 04 94 e4 44 55 82 07 . T5$T.DR...DU.. +| 64: 43 27 a2 04 f4 e2 07 43 22 87 a2 95 30 30 71 71 C'.....C....00qq +| 80: 11 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 .SQLite format 3 +| 96: 00 10 00 01 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 03 30 01 00 00 10 .....N.....0.... +| 128: 10 04 02 02 00 00 00 00 00 00 00 00 30 00 00 00 ............0... +| 144: 00 00 00 00 00 00 00 00 20 00 00 00 40 00 00 00 ........ ...@... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 d9 44 (id INTEGER PR.D +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f e8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 02 02 02 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 03 03 0f on.............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f e0 fe 00 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 00 03 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f ee 00 0f fa 0f f4 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 01 fe 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end crash-e3b1b19e4d4bcc.db +}]} {} + +do_catchsql_test 25.1 { + INSERT INTO t1(t1) VALUES('rebuild'); +} {1 {database disk image is malformed}} + +do_execsql_test 25.2 { + PRAGMA page_size=512; +} + +#-------------------------------------------------------------------------- +reset_db +do_test 26.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename c30b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 01 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 01 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ..08...........6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 0c 0f 00 05 09 fe 00 0f e6 09 fe 0c 94 0c 23 ...............# +| 16: 0a 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 2544: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 0a ................ +| 2560: 03 00 30 00 00 00 00 01 03 03 00 03 01 01 01 02 ..0............. +| 2576: 01 01 03 01 01 83 72 8c 80 80 80 80 01 04 00 87 ......r......... +| 2592: 68 00 00 01 e4 02 30 30 03 03 06 02 83 0f 30 30 h.....00......00 +| 2608: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2624: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2640: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2656: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2672: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2688: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2704: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2720: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2736: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2752: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2768: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2784: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2800: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2816: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2832: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2848: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2864: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2880: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2896: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2912: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2928: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2944: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2960: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2976: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2992: 30 30 30 30 30 30 30 30 30 30 30 30 30 03 06 01 0000000000000... +| 3008: 01 03 01 08 32 30 31 36 30 36 30 39 03 03 07 01 ....20160609.... +| 3024: 01 34 03 03 05 01 01 35 03 03 04 01 06 62 69 6e .4.....5.....bin +| 3040: 61 72 79 03 07 01 02 02 01 08 63 6f 6d 70 69 6c ary.......compil +| 3056: 65 72 03 03 02 01 03 67 63 63 03 03 03 01 01 78 er.....gcc.....x +| 3072: 03 07 01 01 02 04 06 83 17 0d 06 06 0d 0d 08 0f ................ +| 3088: ef 00 14 2a 00 00 00 00 01 02 02 00 02 01 01 01 ...*............ +| 3104: 02 01 01 6a 88 80 80 80 80 01 04 00 81 58 00 00 ...j.........X.. +| 3120: 00 5f 07 30 62 69 6e 61 72 79 0c 01 03 01 01 06 ._.0binary...... +| 3136: 65 6e 61 62 6c 65 0a 01 01 01 01 01 01 01 01 01 enable.......... +| 3152: 01 01 01 04 66 74 73 34 0a 01 01 01 01 01 04 01 ....fts4........ +| 3168: 35 0d 01 01 01 01 01 01 06 6e 6f 63 61 73 65 0b 5........nocase. +| 3184: 01 03 01 01 05 72 74 72 69 6d 0a 01 03 01 01 01 .....rtrim...... +| 3200: 78 0a 01 01 01 01 01 01 01 01 01 01 01 04 0c 14 x............... +| 3216: 0c 09 0c 0b 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 03 57 34 56 ..threadsafe.W4V +| 3840: 94 64 91 46 85 84 04 76 74 61 62 07 02 04 01 02 .d.F...vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 10 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 1e 4e 1f 1e 00 D..@........N... +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 0e 5b 00 1e 0a 4d 00 0f d8 0f af 0a 4d 0f 74 ..[...M......M.t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e 40 0e 24 0e 08 .a.N./.....@.$.. +| 32: 0d ef 0d d5 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 ...........h.O.5 +| 48: 0d 1b 0c fb 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e ...........x.W.> +| 64: 0c 24 0c 0a 0c 0a 0c 0a 0c 0a 0c 0a 0c 0a 0c 0a .$.............. +| 2624: 00 00 00 00 00 00 00 00 00 00 00 00 00 83 3a 03 ..............:. +| 2640: 06 00 43 86 33 19 43 4f 4d 50 49 4c 45 52 3d 67 ..C.3.COMPILER=g +| 2656: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 2672: 39 58 27 30 30 30 30 30 30 30 30 30 30 30 30 30 9X'0000000000000 +| 2688: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2704: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2720: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2736: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2752: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2768: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2784: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2800: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2816: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2832: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2848: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2864: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2880: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2896: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2912: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2928: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2944: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2960: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2976: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2992: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 3008: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 3024: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 3040: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 3056: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 3072: 30 30 30 27 42 49 4e 41 52 59 18 24 05 00 25 0f 000'BINARY.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 42 60 2d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 B`-EMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 0f 86 00 94 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 00 00 00 7b 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 00 00 00 E FTS5XNOCASE... +| 3728: 62 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 b#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 00 00 00 4a 23 0f 19 45 4e 41 42 RTRIM...J#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 00 00 LE FTS4XBINARY.. +| 3776: 00 31 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 .1#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 00 00 00 18 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 24 15 48 4e 4f 43 41 53 45 1d TAT VT$.HNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 00 00 00 29 43 0f 19 43 4f 4d XRTRIM...)C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 0f 88 00 1e 0e e0 00 0f f8 0f f0 0f b0 0f e0 ................ +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f 80 0f 78 0f 70 .............x.p +| 32: 0f 68 0f 60 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 .h.`.X.P.H.@.8.0 +| 48: 0f 28 0f 20 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 .(. ............ +| 64: 0e e8 0e e0 0e e0 0e e0 0e e0 0e e0 0e e0 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 0f e8 00 28 12 02 01 01 ...........(.... +| 3984: 00 00 00 28 12 02 01 01 00 00 00 20 12 02 01 01 ...(....... .... +| 4000: 00 00 00 18 12 02 01 01 00 00 00 10 12 02 01 01 ................ +| 4016: 06 03 03 00 12 06 02 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 00 00 00 08 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end c30b.db +}]} {} + +do_catchsql_test 26.1 { + BEGIN; + INSERT INTO t1(t1) VALUES('rebuild'); + INSERT INTO t1(t1) VALUES('integrity-check'); + COMMIT; +} {0 {}} + +#-------------------------------------------------------------------------- +reset_db +do_test 27.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename timeout-2ca5b0658c98.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 20 01 02 02 02 01 02 02 01 06 64 iler. .........d +| 3408: 62 73 7c cc cc cc cc cc cc cc cc cc cc cc cc cc bs|............. +| 3424: cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc ................ +| 3440: cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc ................ +| 3456: cc cc cc cc cc cc c4 61 74 07 02 03 01 02 03 01 .......at....... +| 3472: 02 03 02 04 65 62 75 67 04 02 02 01 02 02 01 02 ....ebug........ +| 3488: 02 01 06 65 6e 61 62 6c 65 07 02 02 01 02 02 01 ...enable....... +| 3504: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3520: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3536: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 05 23 ...............# +| 3552: d6 76 36 32 d3 52 e3 42 e3 02 03 23 03 13 63 03 .v62.R.B...#..c. +| 3568: 63 03 95 84 e4 f4 34 15 34 52 60 10 50 04 30 f1 c.....4.4R`.P.0. +| 3584: 74 34 f4 d5 04 94 c4 55 23 d6 76 36 32 d3 52 e3 t4.....U#.v62.R. +| 3600: 42 e3 02 03 23 03 13 63 03 63 03 95 85 25 45 24 B...#..c.c...%E$ +| 3616: 94 d0 d0 00 00 02 40 ee 00 00 ff 80 ff 00 fe 80 ......@......... +| 3632: fe 00 fd 80 fd 00 fc 80 fc 00 fb 80 fb 00 fa 80 ................ +| 3648: fa 00 f9 80 f9 00 f8 80 f8 00 f7 80 f7 00 f6 80 ................ +| 3664: f6 00 f5 80 f5 00 f4 80 f4 00 f8 0f 30 0f 28 0f ............0.(. +| 3680: 20 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e ............... +| 3696: e0 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 5f e8 54 45 4e OMIT LOAD E_.TEN +| 3248: 53 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f SIONXRTRIM....3. +| 3264: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 31 81 .MAX MEMORY=501. +| 3280: 40 50 02 50 f1 94 54 e4 14 24 c4 52 04 a5 35 f4 @P.P..T..$.R..5. +| 3296: e3 15 84 e4 f4 34 15 34 51 71 30 50 02 50 f1 74 .....4.4Qq0P.P.t +| 3312: 54 e4 14 24 c4 52 04 a5 34 f4 e3 15 85 25 45 24 T..$.R..4....%E$ +| 3328: 94 d1 a1 20 50 02 90 f1 94 54 e4 14 24 c4 52 04 ... P....T..$.R. +| 3344: 74 54 f5 04 f4 c5 95 84 24 94 e4 15 25 91 a1 10 tT......$...%... +| 3360: 50 02 90 f1 94 54 e4 14 24 c4 52 04 74 54 f5 04 P....T..$.R.tT.. +| 3376: f4 c5 95 84 e4 f4 34 15 34 51 91 00 50 02 90 f1 ......4.4Q..P... +| 3392: 74 54 e4 14 24 c4 52 04 74 54 f5 04 f4 c5 95 85 tT..$.R.tT...... +| 3408: 25 45 24 94 d1 70 f0 50 02 30 f1 94 54 e4 14 24 %E$..p.P.0..T..$ +| 3424: c4 52 04 65 45 33 55 84 24 94 e4 15 25 91 70 e0 .R.eE3U.$...%.p. +| 3440: 50 02 30 f1 94 54 e4 14 24 c4 52 04 65 45 33 55 P.0..T..$.R.eE3U +| 3456: 84 e4 f4 34 15 34 51 60 d0 50 02 30 f1 74 54 e4 ...4.4Q`.P.0.tT. +| 3472: 14 24 c4 52 04 65 45 33 55 85 25 45 24 94 d1 70 .$.R.eE3U.%E$..p +| 3488: c0 50 02 30 f1 94 54 e4 14 24 c4 52 04 65 45 33 .P.0..T..$.R.eE3 +| 3504: 45 84 24 94 e4 15 25 91 70 b0 50 02 30 f1 94 54 E.$...%.p.P.0..T +| 3520: e4 14 24 c4 52 04 65 45 33 45 84 e4 f4 34 15 34 ..$.R.eE3E...4.4 +| 3536: 51 60 a0 50 02 30 f1 74 54 e4 14 24 c4 52 04 65 Q`.P.0.tT..$.R.e +| 3552: 45 33 45 85 25 45 24 94 d1 e0 90 50 03 10 f1 94 E3E.%E$....P.... +| 3568: 54 e4 42 4c 45 20 44 42 53 54 41 54 20 56 54 41 T.BLE DBSTAT VTA +| 3584: 42 58 42 49 4e 41 52 59 1e 08 05 00 31 0f 19 45 BXBINARY....1..E +| 3600: e4 14 24 c4 52 04 44 25 35 44 15 42 05 65 42 41 ..$.R.D%5D.B.eBA +| 3616: 54 84 e4 f4 34 15 34 51 d0 70 50 03 10 f1 74 54 T...4.4Q.pP...tT +| 3632: e4 14 24 c4 52 04 44 25 35 44 15 42 05 65 44 14 ..$.R.D%5D.B.eD. +| 3648: 25 85 25 45 24 94 d1 10 60 50 01 70 f1 94 44 54 %.%E$...`P.p..DT +| 3664: 25 54 75 84 24 94 e4 15 25 91 10 50 50 01 70 f1 %Tu.$...%..PP.p. +| 3680: 94 44 54 25 54 75 84 e4 f4 34 15 34 51 00 40 50 .DT%Tu...4.4Q.@P +| 3696: 01 70 f1 74 44 54 25 54 75 85 25 45 24 94 d2 70 .p.tDT%Tu.%E$..p +| 3712: 30 50 04 30 f1 94 34 f4 d5 04 94 c4 55 23 d6 76 0P.0..4.....U#.v +| 3728: 36 32 d3 52 e3 42 e3 02 03 23 03 13 63 03 63 03 62.R.B...#..c.c. +| 3744: 95 84 24 94 e4 15 25 92 70 20 50 04 30 f1 94 34 ..$...%.p P.0..4 +| 3760: f4 d5 04 94 c4 53 30 01 00 00 10 10 04 02 02 00 .....S0......... +| 3776: 00 00 00 00 00 00 00 80 00 00 00 20 00 00 00 10 ........... .... +| 3792: 00 00 00 90 00 00 00 40 00 00 00 00 00 00 00 00 .......@........ +| page 6 offset 20480 +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end timeout-2ca5b0658c98.db +}]} {} + +do_catchsql_test 27.1 { + DELETE FROM t1 WHERE a MATCH 'fts*'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 28.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-e2d47e0624a42c.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 06 01 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 04 06 06 06 08 08 0f ef 00 14 2a 00 00 00 ............*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 02 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 00 00 2e 02 30 61 01 02 02 01 01 62 01 .t.....0a.....b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 20 ....c.....g.... +| 4048: 10 16 80 10 60 10 20 30 10 16 90 10 60 10 20 40 ....`. 0....`. @ +| 4064: 40 60 60 60 80 80 70 10 30 01 40 30 90 00 90 00 @```..p.0.@0.... +| 4080: 00 01 12 40 00 00 00 00 10 10 10 00 10 10 10 10 ...@............ +| page 3 offset 8192 +| 0: a0 00 00 00 30 fe c0 00 ff a0 ff 30 fe 00 00 00 ....0......0.... +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f e8 00 0f f8 0f f0 0f e8 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 03 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 01 01 68 .d...e...f.....h +| 4048: 01 01 01 01 01 69 01 01 01 04 06 06 06 04 04 04 .....i.......... +| 4064: 06 06 07 01 03 00 14 03 09 09 09 0f 0a 03 00 24 ...............$ +| 4080: 00 00 00 00 01 01 01 00 01 01 01 01 0a 00 00 00 ................ +| page 8 offset 28672 +| 0: 01 0f fa 00 0f fa 00 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 1f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-e2d47e0624a42c.db +}]} {} + +do_catchsql_test 28.1 { + SELECT count( fts5_decode(id, block) ) FROM t2_data; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 29.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-e114c036e13dde.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 08 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 06 0d b6 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d b6 00 00 00 00 00 00 ...k............ +| 3504: 00 00 00 00 00 00 56 07 06 17 1f 1f 01 7d 74 61 ......V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c af 00 0f e6 0f ef 0c af 00 00 ................ +| 3232: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 86 ................ +| 3248: 2f 84 80 80 80 80 01 04 00 8c 62 00 00 03 12 02 /.........b..... +| 3264: 30 30 01 04 05 03 01 04 05 03 01 04 05 03 1f 02 00.............. +| 3280: 03 01 02 03 01 02 03 01 08 35 30 30 30 30 30 30 .........5000000 +| 3296: 30 1c 02 04 01 02 04 01 02 04 01 01 36 01 02 04 0...........6... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 05 63 6c 61 6e ............clan +| 3392: 67 01 02 03 01 02 03 01 02 03 02 07 6f 6d 70 69 g...........ompi +| 3408: 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 62 ler...........db +| 3424: 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 65 stat...........e +| 3440: 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 6e bug...........en +| 3456: 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 02 able............ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3520: 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 04 .....xtension... +| 3536: 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 03 ........fts4.... +| 3552: 01 02 01 02 03 04 01 35 0d 02 03 01 02 03 01 02 .......5........ +| 3568: 03 01 07 67 65 6f 70 6f 6c 79 10 02 03 01 02 03 ...geopoly...... +| 3584: 01 02 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 .....json1...... +| 3600: 01 02 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 .....load....... +| 3616: 02 03 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 ....max......... +| 3632: 02 05 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 ..emory......... +| 3648: 04 04 73 79 73 35 16 02 03 01 02 03 01 02 03 01 ..sys5.......... +| 3664: 06 6e 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 .nocase......... +| 3680: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3696: 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 ................ +| 3712: 06 01 02 02 03 06 01 02 02 03 06 01 12 02 03 06 ................ +| 3728: 01 02 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 .....omit....... +| 3744: 02 02 01 05 72 74 72 65 65 19 02 03 01 02 03 01 ....rtree....... +| 3760: 02 03 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 ....im.......... +| 3776: 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 ................ +| 3792: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3808: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3824: 02 02 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 ....threadsafe.. +| 3840: 02 01 02 02 01 02 02 01 04 76 74 61 62 07 02 04 .........vtab... +| 3856: 01 02 04 01 02 04 01 01 78 01 06 01 01 02 01 06 ........x....... +| 3872: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3888: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3904: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3920: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3936: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3952: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3968: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3984: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 4000: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 4016: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4032: 01 01 02 01 06 01 01 02 01 06 01 01 02 04 18 13 ................ +| 4048: 0c 44 10 12 11 0f 47 13 0f 0c 12 10 0f 0e 10 0f .D....G......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 57 24 24 0f D..@.......$W$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 1f 00 0f df 0f bd 0f 9b 0f 89 ....$........... +| 16: 0f 76 0f 63 0f 44 0f 24 0f 04 0e ec 0e d3 0e ba .v.c.D.$........ +| 32: 0e a2 0e 89 0e 70 e5 50 e3 90 e1 d0 e0 40 de a0 .....p.P.....@.. +| 48: dd 00 db 50 d9 90 d7 ea ca ea be d0 d6 40 d4 a0 ...P.........@.. +| 64: d3 00 d1 00 ce f0 cc e0 ca e0 c8 d0 c6 c0 c5 30 ...............0 +| 80: c3 90 c1 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3088: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 ................ +| 3104: 24 05 00 25 0f 19 54 48 52 45 41 44 53 41 46 45 $..%..THREADSAFE +| 3120: 3d 30 58 42 49 4e 41 52 59 18 23 05 00 25 0f 19 =0XBINARY.#..%.. +| 3136: 54 48 52 45 41 44 53 41 46 45 3d 30 58 4e 4f 43 THREADSAFE=0XNOC +| 3152: 41 53 45 17 22 05 00 25 0f 17 54 48 52 45 41 44 ASE....%..THREAD +| 3168: 53 41 46 45 3d 30 05 00 33 0f 19 4f 4d 49 54 20 SAFE=0..3..OMIT +| 3184: 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 58 42 LOAD EXTENSIONXB +| 3200: 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f 4d 49 54 INARY. ..3..OMIT +| 3216: 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 58 LOAD EXTENSIONX +| 3232: 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 4f 4d 49 NOCASE....3..OMI +| 3248: 54 20 4c f4 14 42 04 55 85 44 54 e5 34 94 f4 e5 T L..B.U.DT.4... +| 3264: 85 25 45 24 94 d1 f1 e0 50 03 30 f1 94 d4 15 82 .%E$....P.0..... +| 3280: 04 d4 54 d4 f5 25 93 d3 53 03 03 03 03 03 03 05 ..T..%..S....... +| 3296: 84 24 94 e4 15 25 91 f1 d0 50 03 30 f1 94 d4 15 .$...%...P.0.... +| 3312: 82 04 d4 54 d4 f5 25 93 d3 53 03 03 03 03 03 03 ...T..%..S...... +| 3328: 05 84 e4 f4 34 15 34 51 e1 c0 50 03 30 f1 74 d4 ....4.4Q..P.0.t. +| 3344: 15 82 04 d4 54 d4 f2 90 f1 74 54 e4 14 24 c4 52 ....T....tT..$.R +| 3360: 04 74 54 f5 04 f4 c5 95 85 25 45 24 94 d1 70 f0 .tT......%E$..p. +| 3376: 50 02 30 f1 94 54 e4 14 24 c4 52 04 65 45 33 55 P.0..T..$.R.eE3U +| 3392: 84 24 94 e4 15 25 91 70 e0 50 02 30 f1 94 54 e4 .$...%.p.P.0..T. +| 3408: 14 24 c4 52 04 65 45 33 55 84 e4 f4 34 15 34 51 .$.R.eE3U...4.4Q +| 3424: 60 d0 50 02 30 f1 74 54 e4 14 24 c4 52 04 65 45 `.P.0.tT..$.R.eE +| 3440: 33 55 85 25 45 24 94 d1 70 c0 50 02 30 f1 94 54 3U.%E$..p.P.0..T +| 3456: e4 14 24 c4 52 04 65 45 33 45 84 24 94 e4 15 25 ..$.R.eE3E.$...% +| 3472: 91 70 b0 50 02 30 f1 94 54 e4 14 24 c4 52 04 65 .p.P.0..T..$.R.e +| 3488: 45 33 45 84 e4 f4 34 15 34 51 60 a0 74 54 e4 14 E3E...4.4Q`.tT.. +| 3504: 24 c4 52 04 65 45 33 45 85 25 45 24 94 d1 e0 90 $.R.eE3E.%E$.... +| 3520: 50 03 10 f1 94 54 e4 14 24 c4 52 04 44 25 35 44 P....T..$.R.D%5D +| 3536: 15 42 05 65 44 14 25 84 24 94 e4 15 25 91 e0 80 .B.eD.%.$...%... +| 3552: 50 03 10 f1 94 54 e4 14 24 c4 52 04 44 25 35 44 P....T..$.R.D%5D +| 3568: 15 42 05 65 44 14 25 84 e4 f4 34 15 34 51 d0 70 .B.eD.%...4.4Q.p +| 3584: 50 03 10 f1 74 54 e4 14 24 c4 52 04 44 25 35 44 P...tT..$.R.D%5D +| 3600: 15 42 05 65 44 14 25 85 25 45 24 94 d1 10 60 50 .B.eD.%.%E$...`P +| 3616: 01 70 f1 94 44 54 25 54 75 84 24 94 e4 15 25 91 .p..DT%Tu.$...%. +| 3632: 10 50 50 01 70 f1 94 44 54 25 54 75 84 e4 f4 34 .PP.p..DT%Tu...4 +| 3648: 15 34 51 00 40 50 01 70 f1 74 44 54 25 54 75 85 .4Q.@P.p.tDT%Tu. +| 3664: 25 45 24 94 d2 00 30 50 03 50 f1 94 34 f4 d5 04 %E$...0P.P..4... +| 3680: 94 c4 55 23 d6 36 c6 16 e6 72 d3 62 e3 02 e3 05 ..U#.6...r.b.... +| 3696: 84 24 94 e4 15 25 92 00 20 50 03 50 f1 94 34 f4 .$...%.. P.P..4. +| 3712: d5 04 94 c4 55 23 d6 36 c6 16 e6 72 d3 62 e3 02 ....U#.6...r.b.. +| 3728: e3 05 84 e4 f4 34 15 34 51 f0 10 50 03 50 f1 74 .....4.4Q..P.P.t +| 3744: 34 f4 d5 04 94 c4 55 23 d6 36 c6 16 e6 72 d3 62 4.....U#.6...r.b +| 3760: e3 02 e3 05 85 25 45 24 94 d0 d0 00 00 02 40 ee .....%E$......@. +| 3776: 00 00 ff 80 ff 00 fe 80 fe 00 fd 80 fd 00 fc 80 ................ +| 3792: fc 00 fb 80 fb 00 fa 80 fa 00 f9 80 f9 00 f8 80 ................ +| 3808: f8 00 f7 80 f7 00 f6 80 f6 00 f5 80 f5 00 f4 80 ................ +| 3824: f4 00 f3 80 f3 00 f2 80 f2 00 f1 80 f1 00 f0 80 ................ +| 3840: f0 00 ef 80 ef 00 ee 80 ee 00 00 00 00 00 00 00 ................ +| page 6 offset 20480 +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 05 01 01 ................ +| 4080: 06 02 03 00 12 05 01 01 06 01 03 00 12 05 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-e114c036e13dde.db +}]} {} + +do_catchsql_test 29.1 { + CREATE VIRTUAL TABLE t3 USING fts5vocab('t1','col'); +} {0 {}} +do_catchsql_test 29.2 { + SELECT rowid, quote(term), * FROM t3 WHERE term=='nocase'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 30.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-eef41e30b388a0.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 06 01 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 00 00 66 46 08 08 0f ef 00 14 2a 00 00 00 ....fF......*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 02 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 00 00 2e 02 30 61 01 02 02 01 01 62 01 .t.....0a.....b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 02 ....c.....g..... +| 4048: 01 01 68 01 06 01 02 03 01 01 69 01 06 01 02 04 ..h.......i..... +| 4064: 04 06 06 06 08 08 07 01 03 00 14 03 09 00 09 00 ................ +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 52 06 66 72 06 82 06 90 .a b cd R.fr.... +| page 5 offset 16384 +| 0: d0 00 00 00 30 fe 80 00 ff 80 ff 00 fe 00 00 00 ....0........... +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 03 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 04 04 06 06 07 01 03 00 14 03 09 09 09 0f ................ +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-eef41e30b388a0.db +}]} {} + +do_catchsql_test 30.1 { + SELECT fts5_decode(id, block) FROM t1_data; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 31.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 8192 pagesize 4096 filename crash-7629f35f11d48e.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 02 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 01 0f c7 00 0f c7 00 00 ................ +| 4032: 00 00 00 00 00 00 00 37 01 06 17 15 15 01 53 74 .......7......St +| 4048: 61 62 6c 65 64 75 61 6c 64 75 61 6c 02 43 52 45 abledualdual.CRE +| 4064: 41 54 45 20 54 41 42 4c 45 20 64 75 61 6c 28 64 ATE TABLE dual(d +| 4080: 75 6d 6d 79 20 76 61 72 28 31 29 29 0d 00 00 00 ummy var(1)).... +| page 2 offset 4096 +| 0: 01 0f fb 00 0f fb 00 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 03 01 02 0f 58 ...............X +| end crash-7629f35f11d48e.db +}]} {} + +do_execsql_test 31.1 { + CREATE VIRTUAL TABLE t1 USING fts5(a,b,c); + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<72) + INSERT INTO t1(a) SELECT randomblob(2829) FROM c; + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<10) + INSERT INTO t1(a) SELECT randomblob(3000) FROM c; +} + +do_catchsql_test 31.2 { + DELETE FROM t1 WHERE a MATCH X'6620e574f32a'; +} {0 {}} + +#------------------------------------------------------------------------- +reset_db +do_test 32.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-e2d47e0624a42c.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 06 01 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 04 06 06 06 08 08 0f ef 00 14 2a 00 00 00 ............*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 02 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 00 00 2e 02 30 61 01 02 02 01 01 62 01 .t.....0a.....b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 20 ....c.....g.... +| 4048: 10 16 80 10 60 10 20 30 10 16 90 10 60 10 20 40 ....`. 0....`. @ +| 4064: 40 60 60 60 80 80 70 10 30 01 40 30 90 00 90 00 @```..p.0.@0.... +| 4080: 00 01 12 40 00 00 00 00 10 10 10 00 10 10 10 10 ...@............ +| page 3 offset 8192 +| 0: a0 00 00 00 30 fe c0 00 ff a0 ff 30 fe 00 00 00 ....0......0.... +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f e8 00 0f f8 0f f0 0f e8 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 03 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 01 01 68 .d...e...f.....h +| 4048: 01 01 01 01 01 69 01 01 01 04 06 06 06 04 04 04 .....i.......... +| 4064: 06 06 07 01 03 00 14 03 09 09 09 0f 0a 03 00 24 ...............$ +| 4080: 00 00 00 00 01 01 01 00 01 01 01 01 0a 00 00 00 ................ +| page 8 offset 28672 +| 0: 01 0f fa 00 0f fa 00 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 1f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-e2d47e0624a42c.db +}]} {} + +do_catchsql_test 32.1 { + SELECT snippet(t1, -1, '.', '..', '[', ']'), + highlight(t1, 2, '[', ']') + FROM t1('g + h') + WHERE rank MATCH 'bm25(1.0, 1.0)' ORDER BY rank; +} {1 {vtable constructor failed: t1}} + +do_catchsql_test 32.2 { + SELECT * FROM t3; +} {1 {database disk image is malformed}} + +do_catchsql_test 32.3 { + SELECT * FROM t4; +} {1 {database disk image is malformed}} + +do_catchsql_test 32.4 { + SELECT fts5_decode(id, block) FROM t1_data; +} {1 {database disk image is malformed}} + +do_catchsql_test 32.5 { + SELECT fts5_decode(id, block) FROM t2_data; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 33.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-fed6e90021ba5d.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 08 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 06 0d b6 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d b6 00 00 00 00 00 00 ...k............ +| 3504: 00 00 00 00 00 00 56 07 06 17 1f 1f 01 7d 74 61 ......V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 8a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsi.et1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c af 00 0f e6 0f ef 0c af 00 00 ................ +| 3232: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 86 ................ +| 3248: 2f 84 80 80 80 80 01 04 00 8c 62 00 00 03 12 02 /.........b..... +| 3264: 30 30 01 04 05 03 01 04 05 03 01 04 05 03 1f 02 00.............. +| 3280: 03 01 02 03 01 02 03 01 08 35 30 30 30 30 30 30 .........5000000 +| 3296: 30 1c 02 04 01 0e ee ca ec ea ea ab e4 f5 ca b1 0............... +| 3312: ac ee ec de ef 3e ee ca ee ec f2 f8 0f f0 0f e8 .....>.......... +| 3328: 0f e0 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 ................ +| 3344: 0f a0 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 ...........x.p.h +| 3360: 0f 60 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 .`.X.P.H.@.8.0.( +| 3376: 0f 20 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 . .............. +| 3392: 0e e0 02 03 01 02 03 01 02 03 02 07 6f 6d 70 69 ............ompi +| 3408: 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 62 ler...........db +| 3424: 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 65 stat...........e +| 3440: 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 6e bug...........en +| 3456: 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 02 able............ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3520: 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 04 .....xtension... +| 3536: 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 03 ........fts4.... +| 3552: 01 02 01 02 03 04 01 35 0d 02 03 01 02 03 01 02 .......5........ +| 3568: 03 01 07 67 65 6f 70 6f 6c 79 10 02 03 01 02 03 ...geopoly...... +| 3584: 01 02 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 .....json1...... +| 3600: 01 02 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 .....load....... +| 3616: 02 03 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 ....max......... +| 3632: 02 05 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 ..emory......... +| 3648: 04 04 73 79 73 35 16 02 03 01 02 03 01 02 03 01 ..sys5.......... +| 3664: 06 6e 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 .nocase......... +| 3680: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3696: 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 ................ +| 3712: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3728: 01 02 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 .....omit....... +| 3744: 02 02 01 05 72 74 72 65 65 19 02 03 01 02 03 01 ....rtree....... +| 3760: 02 03 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 ....im.......... +| 3776: 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 ................ +| 3792: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3808: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3824: 02 02 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 ....threadsafe.. +| 3840: 02 01 02 02 01 02 02 01 04 76 74 61 62 07 02 04 .........vtab... +| 3856: 01 02 04 01 02 04 01 01 78 01 06 01 01 02 01 06 ........x....... +| 3872: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3888: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3904: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3920: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3936: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3952: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3968: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3984: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 4000: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 4016: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4032: 01 01 02 01 06 01 01 02 01 06 01 01 02 04 18 13 ................ +| 4048: 0c 44 10 12 11 0f 47 13 0f 0c 12 10 0f 0e 10 0f .D....G......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 57 24 24 0f D..@.......$W$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 1f 00 0f df 0f bd 0f 9b 0f 89 ....$........... +| 16: 0f 76 0f 63 0f 44 0f 24 0f 04 0e ec 0e d3 0e ba .v.c.D.$........ +| 32: 0e a2 0e 89 0e 70 0e 55 0e 39 0e 1d 0e 04 0d ea .....p.U.9...... +| 48: 0d d0 0d b5 0d 99 0d 7d 0d 64 0d 4a 0d 30 0d 10 .........d.J.0.. +| 64: 0c ef 0c ce 0c ae 54 d5 35 95 33 55 84 24 94 e4 ......T.5.3U.$.. +| 80: 15 25 91 a1 70 50 02 90 f1 94 54 e4 14 24 c4 52 .%..pP....T..$.R +| 96: 04 d4 54 d5 35 95 33 55 84 e4 f4 34 15 34 51 91 ..T.5.3U...4.4Q. +| 112: 60 50 02 90 f1 74 54 e4 14 24 c4 52 04 d4 54 d5 `P...tT..$.R..T. +| 128: 35 95 33 55 85 25 45 24 94 d1 81 50 50 02 50 f1 5.3U.%E$...PP.P. +| 144: 94 54 e4 14 24 c4 52 04 a5 34 f4 e3 15 84 24 94 .T..$.R..4....$. +| 160: e4 15 25 91 81 40 50 02 50 f1 94 54 e4 14 24 c4 ..%..@P.P..T..$. +| 176: 52 04 a5 34 f4 e3 15 84 e4 f4 34 15 34 51 71 30 R..4......4.4Qq0 +| 192: 50 02 50 f1 74 54 e4 14 24 c4 52 04 ae 4f 41 33 P.P.tT..$.R..OA3 +| 208: 55 85 25 45 24 94 d1 a1 20 50 02 90 f1 94 54 e4 U.%E$... P....T. +| 224: 14 24 c4 52 04 74 54 f5 04 f4 c5 95 84 24 94 e4 .$.R.tT......$.. +| 240: 15 25 91 a1 10 50 02 90 f1 94 54 e4 14 24 c4 52 .%...P....T..$.R +| 256: 04 74 54 f5 04 f4 c5 95 84 e4 f4 34 15 34 51 91 .tT........4.4Q. +| 272: 00 50 02 90 f1 74 54 e4 14 24 c4 52 04 74 54 f5 .P...tT..$.R.tT. +| 288: 04 f4 c5 95 85 25 45 24 94 d1 70 f0 50 02 30 f1 .....%E$..p.P.0. +| 304: 94 54 e4 14 24 c4 52 04 65 45 33 55 84 24 94 e4 .T..$.R.eE3U.$.. +| 320: 15 25 91 70 e0 50 02 30 f1 94 54 e4 40 0f 38 0f .%.p.P.0..T.@.8. +| 336: 30 0f 28 0f 20 0f 18 0f 10 0f 08 0f 00 0e f8 0e 0.(. ........... +| 352: f0 0e e8 0e e0 00 00 00 00 00 00 00 00 00 00 00 ................ +| page 6 offset 20480 +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 05 01 01 ................ +| 4080: 06 02 03 00 12 05 01 01 06 01 03 00 12 05 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 52 59 11 05 05 00 ..........RY.... +| 16: 17 0f 19 44 45 42 55 47 58 4e 4f 43 41 53 45 10 ...DEBUGXNOCASE. +| 32: 04 05 00 17 0f 17 44 45 42 55 47 58 52 54 52 49 ......DEBUGXRTRI +| 48: 4d 20 03 05 00 35 0f 19 43 4f 4d 50 49 4c 45 52 M ...5..COMPILER +| 64: 3d 63 6c 61 6e 67 2d 36 2e 30 2e 30 58 42 49 4e =clang-6.0.0XBIN +| 80: 41 52 59 20 02 05 00 35 0f 19 43 4f 4d 50 49 4c ARY ...5..COMPIL +| 96: 45 52 3d 63 6c 61 6e 67 2d 36 2e 30 2e 30 58 4e ER=clang-6.0.0XN +| 112: 4f 43 41 53 45 1f 01 05 00 35 0f 17 43 4f 4d 50 OCASE....5..COMP +| 128: 49 4c 45 52 3d 63 6c 61 6e 67 2d 36 2e 30 2e 30 ILER=clang-6.0.0 +| 144: 58 52 54 52 49 4d 0d 00 00 00 24 0e e0 00 0f 6f XRTRIM....$....o +| 160: 6e 74 65 6e 74 05 43 52 45 41 54 45 20 54 41 42 ntent.CREATE TAB +| 176: 4c 45 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 LE 't1_content'( +| 192: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 208: 52 59 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 RY KEY, c0, c1, +| 224: 63 32 29 69 04 07 17 19 19 01 81 2d 74 61 62 6c c2)i.......-tabl +| 240: 65 74 31 5f 69 64 78 74 31 5f 69 64 78 04 43 52 et1_idxt1_idx.CR +| 256: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 EATE TABLE 't1_i +| 272: 64 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c dx'(segid, term, +| 288: 20 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b pgno, PRIMARY K +| 304: 45 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 EY(segid, term)) +| 320: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 03 WITHOUT ROWIDU. +| 336: 07 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 .......tablet1_d +| 352: 61 74 61 74 31 5f 64 61 74 61 03 43 52 45 41 54 atat1_data.CREAT +| 368: 45 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 E TABLE 't1_data +| 384: 27 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 '(id INTEGER PRI +| 400: 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 MARY KEY, block +| 416: 42 4c 4f 42 29 38 02 06 17 11 11 08 5f 74 61 62 BLOB)8......_tab +| 432: 6c 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 let1t1CREATE VIR +| 448: 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 TUAL TABLE t1 US +| 464: 49 4e 47 20 66 74 73 35 28 61 2c 62 2c 63 29 00 ING fts5(a,b,c). +| 480: 00 00 39 00 00 00 00 00 00 00 00 00 00 00 00 00 ..9............. +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-fed6e90021ba5d.db +}]} {} + +do_execsql_test 33.1 { + CREATE VIRTUAL TABLE t2 USING fts5vocab('t1','row'); + CREATE VIRTUAL TABLE t3 USING fts5vocab('t1','col'); + CREATE VIRTUAL TABLE t4 USING fts5vocab('t1','instance'); +} + +do_catchsql_test 33.2 { + SELECT * FROM t2; +} {1 {database disk image is malformed}} + +do_catchsql_test 33.3 { + SELECT * FROM t2, t3, t4 WHERE t2.term=t3.term AND t3.term=t4.term; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 34.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-a60a9da4c8932f.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 20 68 20 69 0d 00 00 00 03 0f e8 ...t. h i....... +| 3904: 00 0f f8 0f f0 0f e8 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 00 ................ +| 4080: 60 20 30 01 20 30 00 30 60 10 30 01 20 30 00 30 ` 0. 0.0`.0. 0.0 +| page 6 offset 20480 +| 0: a0 00 00 00 10 ff 40 00 ff 00 00 00 00 00 00 00 ......@......... +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 00 00 00 00 00 00 00 00 00 11 87 89 06 26 ...............& +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 44 00 06 06 07 01 03 00 14 03 09 09 09 0f ..D............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-a60a9da4c8932f.db +}]} {} + +do_catchsql_test 34.1 { + SELECT fts5_decode(id, block) FROM t1_data; +} {1 {database disk image is malformed}} + +do_catchsql_test 34.2 { + SELECT fts5_decode(id, block) FROM t2_data; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 35.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-ae135cb10977c7.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 3d ......0000000..= +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 07 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0e fc 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 01 2f 0d d5 ...t.[.@.$.../.. +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 8f DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 57 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000WBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 59 4e 4f 43 41 53 45 17 LE RTREEYNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4f 41 42 4c NARY....)..EOABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 51 53 45 E GEOPOLYXNOCQSE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 1d 05 E FTS5XNOCASE... +| 3728: 00 23 0f a4 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 55 53 34 58 42 49 4e 41 52 59 17 0b LE FUS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-ae135cb10977c7.db +}]} {} + +do_catchsql_test 35.1 { + SELECT * FROM t1 WHERE t1 MATCH 'e*'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 36.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename crash-a6651222df1bd1.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 62 6c 65 (a)V.......table +| 3648: 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_configt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 63 73 !...tablet1_docs +| 3744: 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 04 43 52 izet1_docsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........tabl +| 3936: 65 74 31 5f 64 61 74 61 74 31 5f 64 61 74 61 02 et1_datat1_data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 11 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 31 2c 32 2c 33 ,b,prefix=.1,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e7 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e ad ...m.K.,........ +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0d 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cc 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 0a cc 0a ad ...~.H.......... +| 96: 0a 8c 0a 6d 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 01 11 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 74 73 34 03 02 02 01 04 6e .....4fts4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 03 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 75 6d 03 06 01 ...<.....3num... +| 2528: 01 05 01 03 74 61 62 03 02 03 04 0a 19 8c 80 80 ....tab......... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 32 77 68 03 02 .....8.....2wh.. +| 2560: 04 00 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 00 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a 00 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 00 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 13 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 05 06 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: 06 01 01 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c 65 03 02 03 07 1c 8c 80 80 80 .0table......... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 03 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 12 03 00 16 00 00 00 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0e 03 00 3c 00 00 00 16 01 01 02 04 .......<........ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 13 32 .........<.....2 +| 3104: 74 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 th........3and.. +| 3120: 04 0a 1b 88 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 00 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 02 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 03 00 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 08 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 00 00 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 17 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 05 04 08 08 84 80 80 80 80 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 80 80 80 80 11 03 00 3c 00 00 .............<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 03 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 09 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 70 72 65 01 02 05 01 ..<.....3pre.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 16 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 .......6.....2ta +| 3744: 01 06 01 01 05 02 01 65 01 02 04 04 09 19 84 80 .......e........ +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 04 09 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 01 01 70 01 02 05 04 08 18 84 80 80 ......p......... +| 3888: 80 80 06 03 00 36 00 00 00 13 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 01 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 64 61 62 ............0dab +| 3968: 6c 65 01 06 01 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 68 01 02 03 01 03 66 .....0each.....f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 0f f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 90 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: 0f 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 01 03 34 74 20 07 04 01 0e 01 03 34 1e .....4t ......4. +| 3680: 09 04 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 08 ....2.......1t.. +| 3744: 04 01 10 01 03 31 6e 0e 07 04 01 0e 01 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 03 02 08 04 01 ...0n........... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 01 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 14 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 04 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 04 09 10 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 74 .....2th......2t +| 4016: 16 07 04 09 10 01 32 69 14 07 04 09 10 01 32 66 ......2i......2f +| 4032: 12 07 04 09 10 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 30 74 65 ......1......0te +| 4064: 0a 07 04 09 10 01 30 74 08 07 04 09 10 01 30 70 ......0t......0p +| 4080: 06 08 04 09 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 04 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 18 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 0c e9 ................ +| end crash-a6651222df1bd1.db +}]} {} + +do_catchsql_test 36.1 { + INSERT INTO t1(b) VALUES( + x'78de3fa24af3733ca8769291a0fee3669f9fddefc5cba913e4225d4b6ce2b04f26b87fad3ee6f9b7d90a1ea62a169bf41e5d32707a6ca5c3d05e4bde05c9d89eaaa8c50e74333d2e9fcd7dfe95528a3a016aac1102d825c5cd70cf99d8a88e0ea7f798d4334386518b7ad359beb168b93aba059a2a3bd93112d65b44c12b9904ea786b204d80531cdf0504bf9b203dbe927061974caf7b9f30cbc3397b61f802e732012a6663d41c3607d6f1c0dbcfd489adac05ca500c0b04439d894cd93a840159225ef73b627e178b9f84b3ffe66cf22a963a8368813ff7961fc47f573211ccec95e0220dcbb3bf429f4a50ba54d7a53784ac51bfef346e6a'); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 37.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename null-memcmp-param-1..db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 66 74 34 74 34 43 .....utablft4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 64 44 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G dDs5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 06 01 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 04 06 06 06 08 08 0f ef 00 14 2a 00 00 00 ............*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 01 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 00 00 2e 02 30 61 01 5a 02 01 01 62 01 .t.....0a.Z...b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 02 ....c.....g..... +| 4048: 01 01 68 01 06 01 02 03 01 01 69 01 06 01 02 04 ..h.......i..... +| 4064: 04 06 06 06 08 08 07 01 03 00 14 03 09 00 09 00 ................ +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f e8 00 0f f8 0f f0 0f e8 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 03 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 04 04 06 06 07 01 03 00 14 03 09 09 09 0f ................ +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 30 69 .a b cd e fg h0i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end null-memcmp-param-1..db +}]} {} + +do_catchsql_test 37.1 { + SELECT * FROM t3; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 37.0 { + CREATE VIRTUAL TABLE t1 USING fts5(b, c); + INSERT INTO t1 VALUES('a', 'b'); + SELECT quote(block) FROM t1_data WHERE rowid=10; +} {X'000000000101010001010101'} + +do_execsql_test 37.1 { + UPDATE t1_data SET block = X'FFFFFFFF0101010001010101' WHERE rowid = 10; + SELECT rowid FROM t1('a'); +} {1} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 38.0 { + CREATE VIRTUAL TABLE t1 USING fts5(b, c); + INSERT INTO t1 VALUES('a', 'b'); + INSERT INTO t1 VALUES('a', 'b'); + SELECT quote(block) FROM t1_data WHERE rowid=1; +} {X'020202'} + +do_execsql_test 38.1 { + SELECT * FROM t1('a b') ORDER BY rank; +} {a b a b} + +do_execsql_test 38.2 { + UPDATE t1_data SET block = X'000202' WHERE rowid=1; +} +breakpoint +do_catchsql_test 38.3 { + SELECT * FROM t1('a b') ORDER BY rank; +} {1 {database disk image is malformed}} + +db close +sqlite3 db test.db +do_catchsql_test 38.4 { + SELECT * FROM t1('a b') ORDER BY rank; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 38.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-fd2a1313e5b5e9.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 b8 31 5f 63 6f 6e 74 !...table.1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 01 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 ec 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 01 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 60 35 30 30 30 30 MAX MEMORY`50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 44 4d 4f 52 59 3d 35 30 30 30 .MAX MDMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 16 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 05 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 10 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 05 f1 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-fd2a1313e5b5e9.db +}]} {} + +do_catchsql_test 38.1 { + UPDATE t1 SET b=quote(zeroblob(200)) WHERE t1 MATCH 'thread*'; +} {0 {}} + +#------------------------------------------------------------------------- +reset_db +do_test 39.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 24576 pagesize 4096 filename crash-e650fe95502908.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 62 6c 65 (a)V.......table +| 3648: 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_configt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 63 73 !...tablet1_docs +| 3744: 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 04 43 52 izet1_docsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........tabl +| 3936: 65 74 31 5f 64 61 74 61 74 31 5f 64 61 74 61 02 et1_datat1_data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 11 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 32 2c 32 2c 33 ,b,prefix=.2,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e7 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e ad ...m.K.,........ +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0d 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cc 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 0a cc 0a ad ...~.H.......... +| 96: 0a 8c 0a 6d 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 01 01 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 74 73 34 03 02 02 01 04 6e .....4fts4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 03 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 75 6d 03 06 01 ...<.....3num... +| 2528: 01 05 01 03 74 61 62 03 02 03 04 0a 19 8c 80 80 ....tab......... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 32 77 68 03 02 .....8.....2wh.. +| 2560: 04 00 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 00 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a ff 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 01 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 13 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 05 06 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: 06 00 f1 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c 65 03 02 03 07 1c 8c 80 80 80 .0table......... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 03 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 12 03 00 16 00 00 00 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0e 03 00 3c 00 00 00 16 01 01 02 04 .......<........ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 03 32 .........<.....2 +| 3104: 74 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 th........3and.. +| 3120: 04 0a 1b 88 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 00 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 02 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 03 00 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 08 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 00 00 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 17 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 05 04 08 08 84 80 80 80 81 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 61 80 80 80 11 03 00 3c 00 00 ......a......<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 03 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 09 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 70 72 65 01 02 05 01 ..<.....3pre.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 16 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 71 .......6.....2tq +| 3744: 01 06 01 01 05 02 01 65 01 02 04 04 09 19 84 80 .......e........ +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 0b 89 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 01 01 70 01 02 05 04 08 18 84 80 80 ......p......... +| 3888: 80 80 06 03 00 36 00 00 00 13 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 01 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 74 61 62 ............0tab +| 3968: 6c 65 01 06 01 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 f4 01 02 03 01 03 66 .....0eac......f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 0f f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 90 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: 0f 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 01 03 34 74 20 07 04 01 0e 01 03 34 1e .....4t ......4. +| 3680: 09 04 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 08 ....2.......1t.. +| 3744: 04 01 10 01 03 31 6e 0e 07 04 01 0e 01 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 03 02 08 04 01 ...0n........... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 b3 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 04 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 05 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 04 09 10 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 2d .....2th......2- +| 4016: 16 07 04 09 10 01 32 69 14 07 04 09 10 01 32 66 ......2i......2f +| 4032: 12 07 04 09 10 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 30 74 65 ......1......0te +| 4064: 0a 07 04 09 10 01 30 74 08 07 04 09 10 01 30 70 ......0t......0p +| 4080: 06 08 04 09 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 03 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 18 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 02 09 ................ +| end crash-e650fe95502908.db +}]} {} + +do_execsql_test 39.1 { + SELECT rowid FROM t1('t*'); +} {1 2 3} + +#------------------------------------------------------------------------- +reset_db +do_test 40.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 24576 pagesize 4096 filename crash2.txt.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 52 6c 65 (a)V.......taRle +| 3648: 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_configt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 73 73 !...tablet1_doss +| 3744: 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 04 43 52 izet1_docsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........tabl +| 3936: 65 74 31 5f 64 61 74 61 74 31 5f 64 61 74 61 02 et1_datat1_data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 11 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 31 2c 32 2c 33 ,b,prefix=.1,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e7 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e ad ...m.K.,........ +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0d 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cc 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 0a cc 0a ad ...~.H.......... +| 96: 0a 8c 0a 6d 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 01 01 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 75 73 34 03 02 02 01 04 6e .....4fus4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 03 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 75 6d 03 06 01 ...<.....3num... +| 2528: 01 05 01 03 74 61 62 05 62 03 04 0a 19 8c 80 80 ....tab.b....... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 32 77 68 03 02 .....8.....2wh.. +| 2560: 04 00 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 00 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a ff 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 01 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 13 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 05 06 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: 06 01 01 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c 65 03 02 03 07 1c 8c 80 80 80 .0table......... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 03 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 11 03 00 16 00 00 00 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0e 03 00 3c 00 00 00 16 02 01 02 04 .......<........ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 03 32 .........<.....2 +| 3104: 74 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 th........3and.. +| 3120: 04 0a 1b 88 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 00 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 02 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 03 00 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 08 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 00 00 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 17 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 06 04 08 08 84 80 80 80 80 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 80 80 80 80 11 03 00 3c 00 00 .............<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 03 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 09 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 70 72 65 01 02 05 01 ..<.....3pre.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 16 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 .......6.....2ta +| 3744: 01 06 01 01 05 02 01 65 01 02 04 04 09 19 84 80 .......e........ +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 04 09 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 01 01 70 01 02 05 04 08 18 84 80 80 ......p......... +| 3888: 80 80 06 03 00 36 00 00 00 13 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 01 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 74 61 62 ............0tab +| 3968: 6c 65 01 06 00 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 68 01 02 03 01 03 66 .....0each.....f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 10 f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 90 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: bd 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 01 03 34 74 20 07 04 01 0e 01 03 34 1e .....4t ......4. +| 3680: 09 04 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 08 ....2.......1t.. +| 3744: 04 01 10 01 03 31 6e 0e 07 04 01 0e 01 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 05 52 08 04 01 ...0n.......R... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 b3 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 04 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 04 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 04 09 10 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 74 .....2th......2t +| 4016: 16 07 04 09 10 01 32 69 14 07 04 09 10 01 32 66 ......2i......2f +| 4032: 12 07 04 09 10 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 30 74 65 ......1......0te +| 4064: 0a 07 04 09 10 01 30 74 08 07 04 09 10 01 30 70 ......0t......0p +| 4080: 06 08 04 09 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 04 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 18 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 02 09 ................ +| end crash2.txt.db +}]} {} + +do_execsql_test 40.1 { + BEGIN; + INSERT INTO t1(b) VALUES(X'819192e578de3fa24af3733ca8769291a0fee3669f9fddefc5cba913e4225d4b6ce2b04f26b87fad3ee6f9b7d90a1ea62a169bf41e5d32707a6ca5c3d05e4bde05c9d89eaaa8c50e74333d2e9fcd7dfe95528a3a016aac1102d825c5cd70cf99d8a88e0ea7f798d4334386518b7ad359beb168b93aba059a2a3bd93112d65b44c12b9904ea786b204d80531cdf0504bf9b203dbe927061974caf7b9f30cbc3397b61f802e732012a6663d41c3607d6f1c0dbcfd489adac05ca500c0b04439d894cd93a840159225ef73b627e178b9f84b3ffe66cf22a963a8368813ff7961fc47f573211ccec95e0220dcbb3bf429f4a50ba54d7a53784ac51bf'); + INSERT INTO t1(b) VALUES(X'c8ae0d0e7c3175946e62ba2b449511d4eb504079984a20f77969f62206c9f3d7ea25358ab705e6978627290b6d48db9032f815a06a79a4f4b809841a0942eed12954ed166f666111812a508abc3bec87958846edaec0a6fe14564bc0a4b78f1c35ebcacca6bae29cc37ae9b59d8a2d7593af1e47dda0ece2268a98d20febafad037964f139851f9a57f48b3706b01721769071991412044cd6006f1d72eb6eb4aa5ad77e378176db8c15575fbeee47165e38a7c6c5a557ac2dfe11813976eaf6741cf593a9e457053a3c34cddfbe605a6e25419f993de8374fafcd3636509d8416a51dc7bcc14cfca322ae343078f47e23522431c17d0da0c033'); + INSERT INTO t1(b) VALUES(X'dc29a94e873a45a4243fce9b912aaefbadf1d0423e0345793874b356eeb500b92fb05284c1601fe9bad3143f72162f10242cec27c44ebf764c8fc9fb0824e32c4161472a4f914f579e0e8274f08ca1a02e59b9d8eec1f31061f9ccb9ed97a6f06534e991f7992c761489e6a7724f6e9c2b581e77487ded3a986d53c4419bbd3e9747cee300e670dd7294874c77e2ed48da68eaa6c3ec954a09ac410493d98e34d6686e54fbbe80696705f10e040c66093efb40746b33600685c94c664c7942835a9e954866121d5dcfb2cb12e92521ea3df175ee17072502dad9b9c1565f801b2179799011eb7418bfa00323e3157589e648ff7378be233c79b7'); +} + +do_catchsql_test 40.2 { + INSERT INTO t1(a,b) VALUES(1,11),(2,22),(3, true ),(4,44); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 41.0 { + CREATE VIRTUAL TABLE t1 USING fts5(a,b,c); + REPLACE INTO t1_data VALUES(1,X'255a5824'); + REPLACE INTO t1_data VALUES(10,X'0a1000000102020002010101020101'); + INSERT INTO t1_data VALUES(137438953473,X'0000032b0030300102060102060102061f0203010203010203010832303136303630390102070102070102070101340102050102050102050101350102040102040102040207303030303030301c0204010204010204010662696e6272790306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020108636f6d70696c657201020201020201020201066462737461740702030102030102030424656275670402020102020102020106656e61626c6507020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020202087874656e73696f6e1f02040102040102040104667473340a02030102030102030401350d020301020301020301036763630102030102030102030206656f706f6c7910020301020301020301056a736f6e3113020301020301020301046c6f61641f020301020301020301036d61781c02020102020102020205656d6f72791c020301020301020304047379733516020301020301020301066e6f6361736502060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020301b10202030601020201046f6d69741f0202010202010202010572747265651902030102030102030402696d010601020203060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020306010202010a746872656164736166652202020102020102020104767461620702040102040102040101780106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020415130c0c124413110f47130f0c0e11100f0e100f440f1040150f'); + INSERT INTO t1_data VALUES(274877906945,X'00000183023030250601011d010331c2ba250601010d0101342506010121010135250601011e02036ec2ba250601012b0101382506010112010161250a0101021a1d02016f2506010111010162250601013201026377250601012f010166250801011f0c010167250601012701026863250601010f02026473250601013002016b2506010133020175250601010e010169250601012c0204386ec2be250601012001016a250601010401056bc2b2cebc250601010901016c25060101150203cebc71250601011301036dd18a250601010c01016f25060101260102706425060101240101712506010122010173250a010116040d02016f2506010134010175250801011b14020161250601010b010376c2aa25060101100202d7ac250601010601017725060101030201752506010114010179250a0101190e050202357a250601010701017a250601012e0102c2aa250801011c100201b3250601010a0202ba6225060101310203be656625060101080103c5a77425060101050102de8e250601011704080a08080a080a080809090809090808080b080c080a0a0809080a0809080a0908080a09080a08090a0a'); + INSERT INTO t1_idx VALUES(1,X'',2); + INSERT INTO t1_idx VALUES(2,X'',2); +} + +do_catchsql_test 41.1 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + +do_catchsql_test 41.2 { + INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 42.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename 8cfba7fbb67e48de92c6.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 62 72 79 03 06 ........binbry.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 01 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0b 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4f 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 OARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 57 42 49 NABLE GEOPOLYWBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 42 41 53 45 E GEOPOLYXNOBASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 52 02 49 4e 41 52 59 27 20160609R.INARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 5d 69 7a 65 uild....opti]ize +| end 8cfba7fbb67e48de92c6.db +}]} {} + +do_catchsql_test 42.1 { + INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 43.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename 89028ffd2c29b679e250.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 62 6c 65 (a)V.......table +| 3648: 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_configt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 63 73 !...tablet1_docs +| 3744: 69 7a 65 74 31 5f 12 6f 63 73 69 7a 65 04 43 52 izet1_.ocsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........tabl +| 3936: 65 74 31 5f 64 61 74 61 74 31 5e 64 61 74 61 02 et1_datat1^data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 11 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 31 2c 32 2c 33 ,b,prefix=.1,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e8 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e ad ...m.K.,........ +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0d 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cc 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 0a cc 0a ad ...~.H.......... +| 96: 0a 8c 0a 6d 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 00 01 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 74 73 34 03 02 02 01 04 6e .....4fts4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 03 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 75 6d 03 06 01 ...<.....3num... +| 2528: 01 05 01 03 74 61 62 03 02 03 04 0a 19 8c 80 80 ....tab......... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 32 77 68 03 02 .....8.....2wh.. +| 2560: 04 00 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 94 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a 00 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 01 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 13 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 05 06 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: 06 01 01 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c 65 03 02 03 07 1c 8c 80 80 80 .0table......... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 04 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 12 03 00 16 00 00 00 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0e 03 00 3c 00 00 00 16 01 01 02 04 .......<........ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 03 32 .........<.....2 +| 3104: 74 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 th........3and.. +| 3120: 04 0a 1b 88 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 00 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 02 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 00 90 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 07 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 00 00 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 17 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 05 04 08 08 84 80 80 80 80 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 80 80 80 80 11 03 00 3c 00 00 .............<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 03 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 09 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 70 72 65 01 02 05 01 ..<.....3pre.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 16 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 .......6.....2ta +| 3744: 01 06 01 01 05 02 01 65 01 02 04 04 09 19 84 80 .......e........ +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 04 09 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 01 01 71 01 02 05 04 08 18 84 80 80 ......q......... +| 3888: 80 80 06 03 00 36 00 00 00 13 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 01 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 74 61 62 ............0tab +| 3968: 6c 65 01 06 01 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 68 01 02 03 01 03 66 .....0each.....f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 0f f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 91 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: 0f 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 01 03 34 74 20 07 04 01 0e 01 03 34 1e .....4t ......4. +| 3680: 09 05 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 08 ....2.......1t.. +| 3744: 04 01 10 01 03 31 6e 0e 07 04 01 0e 01 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 03 02 08 04 01 ...0n........... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 02 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 04 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 04 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 04 09 10 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 74 .....2th......2t +| 4016: 16 07 04 09 10 01 32 69 14 07 04 09 10 01 32 66 ......2i......2f +| 4032: 12 07 04 09 10 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 30 74 65 ......1......0te +| 4064: 0a 07 04 09 10 01 30 74 08 07 04 09 10 01 30 70 ......0t......0p +| 4080: 06 08 04 09 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 04 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 18 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 02 09 ................ +| end 89028ffd2c29b679e250.db +}]} {} + +do_catchsql_test 43.1 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 44.1 { + CREATE VIRTUAL TABLE t1 USING fts5(a,b unindexed,c,tokenize="porter ascii"); + REPLACE INTO t1_data VALUES(1,X'03090009'); + REPLACE INTO t1_data VALUES(10,X'000000000103030003010101020101030101'); + INSERT INTO t1_data VALUES(137438953473,X'0000002e023061011202010162010203010163010204010167010601020201016801050102030101690106010204040606060808'); + INSERT INTO t1_data VALUES(274877906945,X'0000001f02306702080201020201016802080301020301016a420804010204040909'); + INSERT INTO t1_data VALUES(412316860417,X'0000002e023061030202010162030203010163030204010167030601020201016803060102030101690306010204040606060808'); + INSERT INTO t1_idx VALUES(1,X'',2); + INSERT INTO t1_idx VALUES(2,X'',2); + INSERT INTO t1_idx VALUES(3,X'',2); + INSERT INTO t1_content VALUES(1,'a b c','d e f','g h i'); + INSERT INTO t1_content VALUES(2,'g h i','a b c','g h i'); + INSERT INTO t1_content VALUES(3,'a b c','g h i','g h i'); + INSERT INTO t1_docsize VALUES(1,X'030003'); + INSERT INTO t1_docsize VALUES(2,X'030003'); + INSERT INTO t1_docsize VALUES(3,X'030003'); +} {} + +do_catchsql_test 44.2 { +INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + +do_catchsql_test 44.2 { + SELECT snippet(t1, -1, '.', '..', '', 2 ) FROM t1('g h') ORDER BY rank; +} {1 {database disk image is malformed}} + +#-------------------------------------------------------------------------- +reset_db +do_test 45.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename crash-0b162c9e69b999.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 52 6c 65 (a)V.......taRle +| 3648: 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_configt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 73 73 !...tablet1_doss +| 3744: 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 04 43 52 izet1_docsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........tabl +| 3936: 65 74 31 5f 64 61 74 61 74 31 5f 64 61 74 61 02 et1_datat1_data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 11 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 31 2c 32 2c 33 ,b,prefix=.1,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e7 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e ad ...m.K.,........ +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0d 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cc 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 0a cc 0a ad ...~.H.......... +| 96: 0a 8c 0a 6d 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 01 01 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 75 73 34 03 02 02 01 04 6e .....4fus4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 03 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 74 6d 03 06 01 ...<.....3ntm... +| 2528: 01 05 01 03 74 61 62 05 62 03 04 0a 19 8c 80 80 ....tab.b....... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 32 77 68 03 02 .....8.....2wh.. +| 2560: 04 00 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 00 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a ff 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 01 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 13 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 05 06 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: 06 01 01 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c 65 03 02 03 07 1c 8c 80 80 80 .0table......... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 03 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 11 03 00 16 00 00 01 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0e 03 00 3c 00 00 00 16 02 01 02 04 .......<........ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 03 32 .........<.....2 +| 3104: 74 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 th........3and.. +| 3120: 04 0a 1b 88 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 00 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 02 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 03 00 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 08 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 00 00 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 17 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 06 04 08 08 84 80 80 80 80 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 80 80 80 80 11 03 00 3c 00 00 .............<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 03 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 09 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 70 72 65 01 02 05 01 ..<.....3pre.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 16 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 .......6.....2ta +| 3744: 01 06 01 01 05 02 01 65 01 02 04 04 09 19 84 80 .......e........ +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 04 09 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 01 01 70 01 02 05 04 08 18 84 80 80 ......p......... +| 3888: 80 80 06 03 00 36 00 00 00 13 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 01 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 74 61 62 ............0tab +| 3968: 6c 65 01 06 00 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 68 01 02 03 01 03 66 .....0each.....f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 10 f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 90 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: bd 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 2f 03 34 74 20 07 04 01 0e 01 03 34 1e .../.4t ......4. +| 3680: 09 04 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 08 ....2.......1t.. +| 3744: 04 01 10 01 03 31 6e 0e 07 04 01 0e 02 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 05 52 08 04 01 ...0n.......R... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 b3 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 04 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 04 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 04 09 10 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 74 .....2th......2t +| 4016: 16 07 04 09 10 01 32 69 14 07 04 09 10 01 32 66 ......2i......2f +| 4032: 12 07 04 09 10 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 30 74 65 ......1......0te +| 4064: 0a 07 04 09 10 01 30 74 08 07 04 09 10 01 30 70 ......0t......0p +| 4080: 06 08 04 09 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 04 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 18 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 02 09 ................ +}]} {} + +do_catchsql_test 45.2 { + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); +} {0 {}} + +#-------------------------------------------------------------------------- +reset_db +do_test 46.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-1ee8bd451dd1ad.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 60 t2(x)V.......t` +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 3d ......0000000..= +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 07 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 06 e2 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 31 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DS1FE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 40 42 4c 45 20 52 54 52 ...%..EN@BLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 59 42 ..ENABLE JSON1YB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 15 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f a4 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 04 f0 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 22 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 a2 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-1ee8bd451dd1ad.db +}]} {} + +do_catchsql_test 46.1 { + SELECT snippet(t1,'[','', '--',-1,10) FROM t1('*'); +} {0 {{}}} + +#-------------------------------------------------------------------------- +reset_db +do_test 47.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename 4b6fc659283f2735616c.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 7d 42 5f 63 6f 6e 66 69 67 74 32 table.B_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6f 74 74 31 5f 63 6f 6e 74 1_conteott1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 46 52 20 50 52 49 4d 41 52 59 INTEGFR PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 06 01 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 04 06 06 06 08 08 0f ef 00 14 2a 00 00 00 ............*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 02 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 00 00 2e 02 30 61 01 02 02 01 01 62 01 .t.....0a.....b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 01 ....c.....g..... +| 4048: 01 01 68 01 06 01 02 03 01 01 69 01 06 01 02 04 ..h.......i..... +| 4064: 04 06 06 06 08 08 07 01 03 00 14 03 09 00 09 00 ................ +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f e8 00 0f f8 0f f0 0f e8 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 03 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 04 04 06 06 07 01 03 00 14 03 09 09 09 0f ................ +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end 4b6fc659283f2735616c.db +}]} {} + +do_catchsql_test 47.1 { + SELECT snippet(t1, -1, '.', '..', '[', 50), + highlight(t1, 2, '[', ']') FROM t1('g h') + WHERE rank MATCH 'bm25(1.0, 1.0)' ORDER BY rank; +} {1 {database disk image is malformed}} + +#-------------------------------------------------------------------------- +reset_db +do_test 48.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-44a8305b4bd86f.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 62 72 79 03 06 ........binbry.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 01 03 16 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 04 71 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ..q.........comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 03 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 13 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0b 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4f 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 OARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 46 45 58 4e 4f 43 41 53 45 17 LE RTRFEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 57 42 49 NABLE GEOPOLYWBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 42 41 53 45 E GEOPOLYXNOBASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 66 54 41 42 58 52 54 52 49 4d 11 06 TAT fTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 62 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XbTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 52 02 49 4e 41 52 59 27 20160609R.INARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 5d 69 71 a5 uild....opti]iq. +| end crash-44a8305b4bd86f.db +}]} {} + +do_catchsql_test 48.1 { + INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + +#-------------------------------------------------------------------------- +reset_db +do_test 49.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-fd87385402ecf5.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 20 68 20 69 0d 00 00 00 03 0f e8 ...t. h i....... +| 3904: 00 0f f8 0f f0 0f e8 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 00 ................ +| 4080: 60 20 30 d6 20 30 00 30 60 10 30 01 20 30 00 30 ` 0. 0.0`.0. 0.0 +| page 6 offset 20480 +| 0: a0 00 00 00 10 ff 40 00 ff 00 00 00 00 00 00 00 ......@......... +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 00 00 00 00 00 00 00 00 00 11 87 89 06 26 ...............& +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 44 00 06 06 07 01 03 00 14 03 09 09 09 0f ..D............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 9d 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-fd87385402ecf5.db +}]} {} + +do_catchsql_test 49.1 { + SELECT term FROM t4 WHERE term LIKE 'oase'; +} {1 {database disk image is malformed}} + +#-------------------------------------------------------------------------- +reset_db +do_test 50.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-695bce8a3e107c.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 20 68 20 69 0d 00 00 00 03 0f e8 ...t. h i....... +| 3904: 00 0f f8 0f f0 0f e8 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 00 ................ +| 4080: 60 20 30 d6 20 30 00 30 60 10 30 01 20 30 00 30 ` 0. 0.0`.0. 0.0 +| page 6 offset 20480 +| 0: a0 00 00 00 10 ff 40 00 ff 00 00 00 00 00 00 00 ......@......... +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 00 00 00 00 00 00 00 00 00 11 87 89 06 26 ...............& +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 44 00 06 06 07 01 03 00 14 03 09 09 09 0f ..D............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 9d 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-695bce8a3e107c.db +}]} {} + +do_catchsql_test 50.1 { + SELECT term FROM t4 WHERE term LIKE '»as'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 51.1 { +BEGIN TRANSACTION; +PRAGMA writable_schema=ON; +CREATE VIRTUAL TABLE t1 USING fts5(a,b,c); +CREATE TABLE IF NOT EXISTS 't1_data'(id INTEGER PRIMARY KEY, block BLOB); +REPLACE INTO t1_data VALUES(1,X'2eb1182424'); +REPLACE INTO t1_data VALUES(10,X'000000000102080002010101020107'); +INSERT INTO t1_data VALUES(137438953473,X'0000032b0230300102060102060102061f0203010203010203010832303136303630390102070102070102070101340102050102050102050101350102040102040102040207303030303030301c023d010204010204010662696e6172790306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020108636f6d70696c657201020201020201020201066462737461740702030102030102030204656275670402020102020102020107656e61626c6507020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020202087874656e73696f6e1f02040102040102040104667473340a02030102030102030401350d020301020301020301036763630102030102030102030206656f706f6c7910020301020301020301056a736f6e3113020301020301020301046c6f61641f020301020301020301036d61781c02020102020102020205656d6f72791c020301020301020304047379733516020301020301020301066e6f6361736502060102020306010202030601020213060102020306010202030601020203060102020306010202030601020203060102020306010202030601020201046f6d69741f0202010202010202010572747265651902030102030102030402696d010601020203060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020306010202010a7468726561647361666522020201020201020201047674616207020401020401020401017801060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102ad060101020106010102010601010201060101020106010101010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020415130c0c124413110f47130efc0e11100f0e100f440f1040150f'); +INSERT INTO t1_data VALUES(274877906945,X'00000e96023030011a042319320d3b123d812b5a31120110446e581b66814a05010a4537814274010e8102815c810f3d0104846d01081581204401103741043c59416b44010a404655265301103f73811a11114213010a821235820f020135030484320201360104816a020162020484550302390301710a04824a020166030483690201670704837d0201690404822602016a0504825c02026b620504817502016f0904810d0303e79c88060482760201700a04826302017204048155020373c2be050481130201770204846202027962050482710202c2ba010482140203e58496070483330204e8b2b879010483710101310110545c0c814b0e3a6501082c815d5b011a2a0e2f0d765c3d686014061d0d0112810733112c2e82141101048313010e5c6f632e813e42010c811882370548010e19158146822f1f01104d364a708146135a010a237b0a55210201610904841703027678090481270201620304810002026374060484660202657a0704827602016601048351090483540301660704814b02016b03025f0304c582caba0204816602016c01025f0302cebc0904843e02016e0804821802016f0a04817503016f070483100201720304822c020484380201740404842e0102460201770104812f0204836c02027a6f040483110202cebc02048267040161020484650205d5bd62cebc0604845b0204f2a580880204842a0206f38184a179670502750204f696a3aa0a04814601013201063330390110812281378114600d010c03716c5e822d010e81226b542a814d010a72740f83000108813a1e0b010c5681046f812c010c07814a777328011664244219531b1a2f811e4a010c4d81557c7f1b0201300704810702013307048230010484050202367807048175020239710804832502016204026b0204814d020363306108048262020265650504817602026667070483150201690704832f0301360a04814d02016c08024702016d0304843e0303cfb2630204814002016e0804837503016203048416030370c2be0304821b02016f0604834b0201700504816b030175070210020273660604841c020676c2bac2b2640604830a02017704027d02017808048141010482700201790504811d0202c2ba0502470206ca8d73ecbab9010483340204f09e9ab504048367010133010c3e04814f82250114812e814b2e0411811305010c811337811e6e010c82085e2b0e5d010c61812054811c01148122451b0781050c813d010c17823762643e011e080c1720814a10364306143b0d33260112810f0c2a810c816b13010a8163810e470201370404811102056176c2aa36050481530202646e0904846202026a730404827402016b0a020c02036f616b0404830a0201750504820d02017605025e0201770a04820702027a73050482460202c2ba0604824a020483330203cba434040483200203cebc790304847e01013401124181442c1d091f81580108601d8336011081320a2b8125820001123b0b81158116811f070110078112817a817308010e6682410d810e2601122d0d6413378147351e01105081021d3525812d01128246510a622204054101105c1b620e81302b05020130020483480104822702013102027e020132030483270201350304844802023770030207020261710604823f0201640802570204830a020265770304831f020168070483210201690204825b02016f020481280704835402057037e18b8d0904810802017304048439030172020481440303c2bd6b0a02630201760202490804815e0201770304816e050483550201780704816902017a070483280207c2b2f093aabc780a0482240301b303024e0301bc0604837a0202cb800204834a0202cebc04048201040484410203d3ad770a04814f0202d5a508048371010135011630817e0f81040d2c041552010c813d3b7e8115010c40692182693a01121f810d810d0a32814701101d1d1f642281742e01068229240110811231810a387f4c01100f50810f8165810d0114811f26443152593c104a010e641e1a3357820e020132030481540201340204815402023778040207020163060481020204815b020164020483010201670a0481540304f0948f870904811a0201690704835502016d0604832203027b01022803017a0a025102016e020484260404816002026f690502680301720104834e02017208024f02021d020475e69c8e0504814c0202767602025f0302de870a04837b020178090483200104835003026a72090484400201790504837204022302017a0104836b0202c2aa0a0481070303bcc2b3090484370203c7866403027501013601087c158303011212814305813e7b0e090118141a1c49713a211e0c74630f010a59826d8113011203328166037781561a01101d7f1d2a1f822533010e820e070f7b40160110811f40292c813226010a2d20824a32010a81418158670201300304840a0201660404817d02016d0804826902016e080626817f0104820b02016f0404825a02017003023b020272750804840c0301760a04844d02017403025b020175080484200202766e060482360303c2ba6c030482220202c2aa0204810e0301b20204835703048421040484240301bc0802410202d2a1010482630204e1b18f3704048354010137010c08816337812f01101382211532424d39010881248123010e7724810267815f011081236029813e273301101b7b29812a5b813b01128150810324814b220b01060c8417010e165b6c81708117010a1782346f6c0201380804816803016b0604840102013908023f0201610204816c0201630302760201640304832604023e0204833902016502048203020266770804821a0201670a04830002026964080484500304f29e9eb70802250201700204811b0201710904832d0201730304826b05048403020174010481000205776a62c2b2050482630201790202260206c2b2eaaeb464050485020301b3080482480303bac7af0a0484550203c695650804822a0202ceb90a0481170202dbae05023f010138011819814a2703390a61090c6912011a21181304812523811b5f164e050114110f35128123423f810c010c817573817c03010e7182590c812b0401142503597e6e0e2f3a3759011252813a811a2b75091a010882162a31010e17450a81048279010858658208020231670a048205020361c2b906023b02016301048236020164050482520201650904833d0201670904811b0201690604825002026a7a0604837c02016e0204832002017002026d0302c789010481020201720504835e0201740604810002017502020a0702630302676306025f0303e4a0a70102640203786a75010484440201790104841402047ac2be72070481340207c2ba3766673576090482790301bd07048142010481600202c7b309027a0401740604823b0202d2bf0304830f0204e989a6300a02600204f4bd91b60702120101390106518369010e19254641823711010c258267288121010e817c810d2b17250110810a578133812f4c0110415681067b288121010e0881208119347101140b8131543c8100343d1101088203813e01100d742e3230820f3802013006048107020134080481440202356501021a02013808048147020162020482230201630304833c030162050483390206656cf093b5bd070484140202677303048502020769e3ad9669c2b90304847402016b0804836402016c0404841f02016d010481250904825202016e06025402016f0704842a0201700a04834a0201720a0483530201750304822e020676f097b18374030482140201780604833d0202c2b9010481550301be070483720204826f0202ca80060481630202d5a80504833f0101610114551047810e130a78660c011a364611206c0b13080705733d5501240f08070c090b0c20813d1471042e4351131e011204412d814f0913104201263036110d060b1f811a301b0f4e1a29092f181c012808071e221a2a81075b320503065a0f140c1a0a26011c07231d0e6f3715063b760c6b091501121111303e3a71566d6d010e0867814d816a0c01181e18240d41724d221b3f384b0201300204830b060483080302c2b30204837f0201310a026e020134050481560301730902690201360406827c0f0201370204825d06020a0201390904815b0304f3bfb2a70a04822c0201610404810e020262660604841a03017608025b02016309088112825f020164090482310201650a0484480302396f01025d02026774010482090302df9b06048321020168070661813303016f03048248020169030483610504814001048401010483460301300704824203016a0204824402016a0504813303021d03017209048412030277380804824502016c0104814c02036ec2ba0804835702016f0204811d030176020238020270360a04840d02017107048201030469ca99690602350201720304812d0104845e02017304022c02017409022b020175050484140302caaf0402410201760404831f020177010484180704845203026f6d04024b02017a030482660202c2aa0204810a0301b30a04817b0302bd76020483780302be6a0302440202c58207025e0202c69901027a0302ad77010483200206c993f099b183070484270203caa1660204841a0204f29788ac0804831d0204f4ba9f950504843c010162011c0e33810216341c2413042130780501184d373e53131f2f052907423e010c830e3781390e011c1320461f81041b811b041e15243d011e241b10816c310b130c3133033b0741011a11816d3139100c13140b395848011c580e411a06304306810a3138330d011a441707092c70140c1643813920010c73653581374f010c826c81210f0402013803024f07048172020161020481650204810c020162030483470301370404813602016307048379020483280201640304815501048176010481060201650104812a0104841f0201660504821f0201670302700201680804846403016b0a04831d0301700904845502016908025c02016a010483560904827602026b6306023402016c0404832602016d040484410204825702016e0504831603027831020482160302c2be0504827d02026f6a05048121020171030232020483220304845402023a0201720204845c0304846e03013607048224020174060484480201780704844303016f0604814f045807070a0707070707080709070709070808090a5c07080708080b07060a06080707070b0a0b0808070b0a0b0a55070b08080a0908080707060709070709070706080c060b07070c0a66070b08080609070607080c0909660b06070707080a0807070b0b0707080a0b07070d0607080c0908630707070b07070a070d060b0707090a07080b080a070809085f0707070c0706080706070809080f06080a5807070607060e070807080907070b070b060c0709090807690808070707070708070608070709070809070a0d0b07070809095b070707070707070c080d07070b06070707070c07080b0808811a0b08060706080a070a07080609070707080808071307070a0708070907060807090b06060707070b0707080708070707080c090a0a81080a0b07070b0f0b0706070707060b07070b07080808110b070707'); +INSERT INTO t1_data VALUES(274877906946,X'00000e880330627a020482240202c2aa0a04833f0301b30704844b0302b9650704824f0301ba0204845f0202c9820a0483640202d194060482300203e19cbd0904844b0203e691b4050483510205e78dadde9b0104821201016301142a6c033b8151085c094601140b813d49313f81110e1c011681163611221527257f5d38011c150f22811a0a3c12350631238117011c3e26420b402c1d81080c40150b2f01181c3143382640273d60132e070118663b1d162a1b0e2e8111393e0110821117310e52811c01141a2f49810181391f2b130112323c0305812a6f2e390201320204842702023334020481340201350202610201360304844603023362040484470203376a360a04826b02013808026203016f0704830d02013902025502016106088170827a0301320a04820403016c0404831502016204048327050484030201630a04814302016401048349020484760302430301640204845d02016504048249020367c2bd07020a0302cebc0902150201680a02500201690204846102016a06024c0301770504842b02016b0104830e0704811803023370040483580301710404845f02016c0504844f0204820d0204837f0302c2aa0104833702016d0104844c02016e0804834f03026c6a07025702046fecbd9a01023a020270330204830a0301740304837c020271350204811e0201720706833b310206736ef09289b70104832b020174070483290301320204827c02017608022802017806025b0302c2b30904835202027978080483040303c9b56f0904846a0202c2aa04048127050482120301b30504813a0301b901024204016a0704840c0202c5820704823c0202c999010482470202cebc0602400203db91670602730202dca7050482760203e1a3950304817e0203e786a702048273010164011a0612105b292b817c1211080d5a01147c1d420b35451c36811a011e0e168117081c0c2e051d474055192d011e02050a1c81180420250f815f300f21011c02316a37143321443a10042d54230112761428810e4750054101101805072b8215294e0116680f0f5381445a3e0b070901224e4a41210c361c281b101c43051325130f01185a1e19108106300f2e3f4538020130060481370202327305022002013405048168020335377a03021802013704027b02013804048260020161030882118101030263650904814d0201620604822502016303048419030135090483240201640602280301380404817e0201650404823c0304f097ac9f010482680201660a0267030566e2b6936f0104821c0201680704813302016b0604832002016c01026a0301610204843202016d0804845e03026d6d03023c020270730a04817f0304c2be797a0804832e020271710504835f02017203021b0201740204825a02017706027202017805048451010683572e03016e0a04814c0201790304811702017a080484450302c2b90204837b0202c2aa0604825b0303b273630104841c0301b9050485040301bc0a027b0303bd37680502670202c98b0204826b0203cfa1740504823a0203d199610202350203e3bf87040483570204f1baaba90504817301016501120b8104392d0d20180f011645213f292e4d0d082f8165011e0b400c07341b2329307f193338173a012055292409050c560a272a0f4403245718011a1c3a183f1c43264c3126060829012081208102043a044d0621650b180e150e011a066c030e513d7d265e1313130c0118171953040457347b114d191901261b1c060c26090d6f0d332a1519096e03101d1d012207342f1f2c7e2517251d0f310d2a17081e02013005020a02013308048247020135030483660201380704841b030132030482180201610102600604825f0304c2bdc2ba02023a02016209021f0201630604813002056663cebc610604841e0201670504816a0104842703037177310604833f03027872080482350201680604825e02016a040483320104840d02016b0304813f02026c6408020602016d070481590104837d03016c08020d02016e060484630301780404815c02016f0104826b0804825e02017008027b0302c2aa0504847c0201710404836d0201730402510302cebc08048338020375c7bf05048344020177010482660304822303026479070481630204786ec2ba0204814f0202796a0a04834f02017a01048407030484660604810603026561020483180204c2b278390504813d0301b304024f04026536010483110302b9330604813e0301be0304840b040484560202c4a702022d0206c6a5f7ada9990402350202c79f090481180202caa60502140204cebcc2bd080483320202db900a0481250205f4b5aa9079040484360204f7b985bd0204835e01016601128101285c096981190e01121f813f0d431a8135530114698102813228492f190a011260161881328101812601188155780d813257050c0b04060114161681340772811b5e25011c4505810e13290b253a0c0c0a1a4b011a3714133e1235812b136b062c0b011a6b591356810c3c240906250b1001148127810d413e0e81090d020231680504822c0302c2bc0204830c0201360104840c0303656a740902110302d1950504824f0201370902130201390a0482530303e0a9ae0904844c0201610804810d0201620a04810c03023039030481330302356902048268020163060483470201650504822d02016706048200030483560302713509025002026a79010484410804825902016c0504822002016e07020d0304843a02016f0204842d0201710304837604048361030482430201720904840f020173020482520804810b02017406068425320201760202420201780804845d02037979650704814802017a080481110301780804812c0202c2bd070484600202cebc0508813082410102770401610202250202ddb40302310205f19e9a937a030482410101670118365558195a0a062d0581260a011881068143330844041f0a1851011a2025141e1081204f550e077521011a193b1f58351912265681220821011812070528472f4e2f407f204a01124d1e1f811b810d7b4d01180f1d3481034a35580a12811f011c2303340d1470150778070c812331011620411939703c032915143f01104281116a3d323c6a0201350604842902013703023f0201390a04816e0201610604826402016202023f0201630a04843302016409048258020165020482620404814702016602061b833f0201670404827d03026369020227020169040483490301670604847602016a0604845d0404840902016c04024601088150822b010482350204830a0301690304844902016d0202710704820002016f03048509020482380304836603026e74010483580201700504817a020171020481080204826a0201720304837b0202410302160302c2b3080484550201730904816e020174040248010484280304834e020275730404836e020176060484720104815c02017709026a020178060275040483790201790504821501026c030170080483770304cfb269710704815102017a0204813303016f090483160202c2aa050481400301ba0804810b0401630804830d0301be0604844d0202c8a30a02110203cba0640204816a0202cebf060482420204e487856e030481080204ec97bd6d080484080205f09eb3a0770502260208f687999931ed878703048424010168011a12460e090c036e151b812e065501161708411982151738471f35011a2d1c0678340c1f04425c21200c010c2a087f255d4a011a0d0b6c33814a212c3a0a401b1e011c501f2381010a0481201c0c6012280118150b5228520e0a036c1c8123011a15810a060408030a81563f381601185b1b06212a143f332a60160e011a221b1e62411d2048090e0b0f5502033072350804826a020131020482530201320304823b0201330104814502033677380204813102026174020483540304dbbf6f620404835d0201620504846a0104831803017103048323020164060483740201660a02410201690102130104821402016a0504823f02016c0404832e02016d09022602026e640a04822702016f070482000301750402670201710304813106020d0202726304048220020173060484530201750504831e020483400302c2bd0704843a020177020483470203786371030483740201790904810002017a0302300202c2b9080483280301bc010481700303bd33720304825e0205c99973c2bd040483160203d5a6330a04842b0204e7b3b3300904813c0205f099a68f72090209010169011c21101d4b2d0e0e066b4253074c140118070a0910447556030833541d01163733816837402b3909122501183c5b1139102e2d430c662334011e27050f21621230323503332b6a0332011e1e07031843202e6e3c2850094d410c01163955220b16812d24521212011681250b0a3505460481176f011a2c09266b162968051c0a1481170116022e1e820c352037263a070201310104825d0602110303696869020484070201320204826e0201610304832203016f040232020162050642843f03048336020484540301370804833c03026c6105027a0203636165090483120201640502770304833e03017107022f0301780702470201650a04811e020167080238020168040481160102230404826b030170040483000201690304836f0302766c0304811402016b0504812e02026c6108027702016d0308827d81530604837302026e790904842602016f06048208020170060481680302320201710204812902017307048255020274320104822a02017506026803016e0a04821303017207025f0302c2b90504834a020177020483130201780604836b0402210301320604847302017a010483130202c2aa0804823c0301b9030482600301ba0104845304016c0504837e0202c3b8080484600204cf9d6379020483660202d3860704812e0203e3a4be0402560203e58784010481210204f09e95ac0102580204f5aea5890a023301016a01123428131a1f6c81445601141e227c1a7b5f1918810301182318812e17455605460d811c011a28820221311a6e12093f050a0c0120082c0b0f1362074457460c3b070d5132011c2143052a20133d160a358117591f01103136813b136e6247011c100e4c28060d16815a320a3e11070124462c03582e262d45110804113326040808070807080809090b81050708060708090607060907070b070e07070807060706070b08070f0807070709080708080c070706060808090c07060708080708080909811307070708060709080707070607070a060b070706070707080a080607060c070707080809070608080908090a812406070707070a0906070b0b0908070b07070b0607070b0608070608090b080a080f080a0608080b070b08070a080b0a810408080708080607090707080807070b070c070a070f070b080607090707080d06070b810b070607070607070b08070707070b14070a0f08070b0d08070e080b060a0a070a0707080707070709080a0a0a0e810f0907070709080a0b0707060a0707060807060a08070b08070907060807090b090a0a81140a09070706100707090a060607060e07070807070d08070a07070806070608070a070708070707080a0808090909'); +INSERT INTO t1_data VALUES(274877906947,X'00080e7f073c23110a1a18392f66090524183704276d6703306a320404824e030164080483520305c2bd7ac2bc0604815a0201360704833202016106021f020482400201630304822a0708817e8204030173040483500201640404824803016d0804824a03017709023002016606048367020268680a04815802016902088339811804027f0302656e0704834e0303d5a5370604816702036a3366090484470303c2ba660904826e02016b0904837c02016c07021403026c610604835802016d0204816802016e0104831202016f0104822f020270720602060201710704822202017206048174020273690204824602017409020c020175090482140201760a0482720301660404824403016a090484290201790404845703025d0203c2bc33040484620301bd0304824c020484540202c78607022403019a010482380202ca87070484390202d39d030485050203e184940404831b0203e6a881060483480203e8b18c0a04816d0203ee8d850104814801016b0110467257393c81272c011a053e815d3b190517064524521f011c3823590a8115372004313b1f3216011a5a20780b102d0804426916112c011a182f810781082d12137026161501221a180516811611051c131207811515173501180320112581062e05621c1407011c2d0e0617811522062208065a21520114582841621e6c203f1e2001161647411a272533815b1c2602013009048309020232630104835a0301720104817f0201330604836f0302ddb5080482560202347a07048102020135020483460104827b02043678ca800a04835f0201370404814b0104846002016103048246010482220301700204833f0201620404824d060481150201650304824f02016606088110834c0201670604821d0303c2be66010481790201680404843b030176050482270201690a04830e02016e0904844202016f040481010301630304822f020270640204822f03016e0704845802027177090482710206736ec2b2796a0104832e0306dab1d485377004048304020174050481700201750a0212020378627604048164030173080483190201790704833d0204823a02017a0506820e67030178070484530202c2b2060481500104823f020483030301b3020484310301bc04027e0402caaf0a026a0301be040482590204842e0202540202c79f0804824d0202cfa30804815a0204f29a92970204823301016c01140f63351a0a653b650d22011c09117a3e1538123537046a15043101141310082f49052f772b0c011c11121781583c2a5010133228241301287f3e0a2b1244080503060a100f413b4f0d070e2a01103e4e1f04814e7b1601183d0404052877111f230f811d01123a100f053e5c076910011a031732102381243d1b1727507301180e5d273e810803812e0f192a02013301048271070481330204821d020134080263020135060481280201610104830a0201640604826d020165060483050201670204841c0504841c0304841b0201680a04845602016a0104811c01024f030481080204813102016b0204837008024502016d0404836c04068207780301670704842302016f0404821203016d040484490301720404837e0201700104821d03048407030165050483050201720a04811602017307023502017407020503016f080484240302c2b90504821b020175090484090201770a088119822503026d6905048300020178030482680604812a0201790104830c0204833a0303d9a06806022002017a060482600203c2aa33030481560301b904020a0301bd0504820f0202d0b90904817c0202d3820202200202daa9080482030203de966e02024b0202df9d080484350204f098b0a20604845e01016d01220304456608322258060a031d4c38340f090112310c070e4238626e6601124a318109030513812f0118240d561e533742188113101b01160b24444b224d44814d4806011c05774e483410330d23541b28090401141f29062581131e221b6d011e81053a037a03320b0e4c24360d2310011a0e321d3c141825111d54637a1c0114093d3c2e58571a35293a0201350104840a03017701048330020136060217020138030483370201610a0482650201620504815e0201630704827701048201020164080483690201660804846703016904048113020167070483080201680504837d05022c0302cdb10a04815f0201690104833a0404824302026a360a04823b02016b0a04813502016d0504831a0204833803021a02026e360404825e02016f080484140201720304844b0404816603056ff09d899b0304823f020275390204816e0301780a04824202017604088308812703027902027770050482040201790104827e040482750204812902017a060483030304c2bdc2b30104836f0203c2aa62040484040301b903021c0302bd6b090484300301be0704814d0202c99402025603049a65656b090484020202ca92090482060203d19a730504844a0203d49f690804836e0202dfa8020482710204f09180860704822901016e011a0c0b8104243647521f43231f36011a2e1b33432c3d0b414905054d17011010573a6c0a816c1801160e063582340a5239050b06011a4481063d1b67250f2044200839012044591d1857291214135814101a1b361d011225067e8147111a4a4301166b13362e17195f3812186f01141c465b032b290406373301182a152a2281300f8107054e3f02023274080481770305c2bacf8168020481450201340604832f0201350704842e02013605020e0201380404841d0201610404810d020483750201620304812b020484230301610804834503026c6a0304816d0201630102380305613577337405048359020165040482720201660904826202066736f094b0af0a0482250201680104811f02016b0304847202016c0404822403016f0904822c0302c2b301025002016d0504817b01023f02016e020483090802040303e7bda10804832d02036f6b740404811402017005048419020484220202716506026303026b760904830a020172080482430304706c73620504825f02017308048413020174080481070201760104827f0204836e020477e7b89a0104840e02017a030483700206c2aa35657065050482740301b30804842b04046cc2be78090481040301b903020d0301bc010484260904813f0203c7a5620302330203c99f36050481010301a30704815b0202ca8b090483250202cdbb0604820a0202cebc0102170401380304842b0207eca2a6f29c87950904824001016f01221d17052b58101241060e3a201f1021633a0114816919811c142443100801280426080e2620042a812c531a490e121707131710011273432e493347811a340112195f671f46721c325e0118380c052b812822478107600b0116021c21821b2019263433040126021b05351b2a286b05181f071b5628111a330a012014533e073d0c0e5469141d1e2734050901220318051b44412803632e0642370e0a3a2b020131070481770201320a04812f0202346e04022b020136030483590304f09a81b60404834702016105048210020162030205030167010268020163010481540604820202048300020264310902420201650804834b02016703048247030365c6b602048205030573f098b890030481450201690204832802016a0a04826703016c0104825e02016b0604815e03016c03048334030677c2aa74c2bc09023d02016c0304823903027777060484540303df866c0104815b02016d0204811f0303796f7704020302016e0204814d07024a02016f0902680201700604840a0104831a0204835a020172070484440201730a023703026b660604830e030278790304815b0201750904822402017704025b020178030482350307f4b2a3896a343407026b0201790902720302633409020402017a020484590302dea004025f0202c2b20204816b050481200202de900402160204ee85a5770204822c0101700114143a0d391a60812d4e09011a2f313104201c372c3a3411321b011a268140144226334145050d1c4d01164e081f20671f088107237901186b123c1f6d07261e2b732e210116511116342a3d32376e083001106882257a0a17141101163039192b0c05812d735f3b01262a3e0841030b17181411051e0a18530e272b6d01182f322b260e24581d5381050f02013104048353020132050482370301690204843e02013302020d0201340104841f0201350a048139020137050482770201380204833a02016105025a0504832f0201620304836d020163050484100304832003016c030481290201640304837e020482490304822b010482290201660a04827002046964dc960204833102016c0704814502016d010482000201700104817e02037176760904821f020473eb91a708048152020174090482770201750404831e01063a825d03017a0904826a020276730a0254020177080260030277630104815c020178070481220202020301720804841202017a0204834c0202c2aa040484010301ba080482580202c6a3020481320203cdbf690502790202ce90070483140301bc030481470205d1a371cebc060481590203d2976a0404830c0203dfba6e0604814b01017101163732393b8120422f054b0e010e030b211d815d1c01165641757c080d81311d090e0112816581542d2313054301224e07121706516606080e39102d231c4b39010a2d81402d5e011a132527428114080d6e1111721c011a814a1a341538251023100d1c4c011e22182622623712411e38162a182d3b01142b67611981470f1f1f250201310a04824e0202336207048217020238730204815a0303cf886d06025a02033962620404833803016f0a04814e020161060483140302726d050483450301790904810c02036376690504811c02016403024d020165010483280802550301650904827f0304ebb8b561070482340201670302670301660804810e020168040482340201690704844d0302616404020f02016a030481060301700704827802016b070481240104814b0302c2bd0504816102016c0604837f03017a0404837902036dc2b90804810002016e0904821602016f0304812c03016401024b02017103048233060483600303e5848e04023a020172040481050305f3978aa06c070481151708070b070a0d0707070607080c080909090706080707070707070806070707070a090b070708080909090981140708070708080b0a0b0b070b070907090707070707070807080c0c070609070b0807100706070e08080a81110f06070707070f07120a0c070707070b0707060607080709080b0b080709060708070808080a810f0707060707070b070707070a080b08070e08070b0b08070c080f070a09060807070a080909080a810b080b070706070b0b0708060b07070c07070707070a0a09090b0708070a07070b0a070c070a060b080907080807070d8123070707070a0706060f070707090b07070707070b07080907080a060f070608080706070c060707070c070a810f07070706070707070a070b0713070a070707090a070c070706080a07070807080808070b0909810607080808090707080709060a070a060707070707070b080707090707060b0807'); +INSERT INTO t1_data VALUES(274877906948,X'00000e8a0330717304048359030134050481100203756371070482190201760704817b0301770804821d0201770204844d0201780204836c0404826103017504026a0202c2aa020482420301b305022c040267390602570301b9080481540301bc0102290206c99cf6b5aa80080481430202cebc02026e02048120010172011a1c2f15158108048125463f251d010811811539011412423105812181171549011847284a30234e5b33042632120118351e8113817d0f2b220d111901264f104a211004061d0a2a0b35121a0a2118341f011c81160a1b030d2a0610243e445f0c011c6f0c1e3b1768141e322717500b140110537f810169811625011a492847203e210f532c16480627020135020481780302caae0104811a020261330904846c0201620804812d0201630404814a0201650704837503017301048276020168050213020169010484540604842b0302796f0504833302016a0304831b02016b0604701302016d0604815302016e070483630204815202027071020481520201710104835b02037266700704843002027362040481490201740904817d020175020481040304f59e9c9407048218020176060484060204776dc2aa020483070201780504812503016601048159020279790704840502027a730904826c030178030482740202c2aa04023d010483540301bd06026b0203cab877010483290202cdbf060482410202cebc04025c0401690204827f04016c0904840e0202cf880104835d0203dfbe6c01025b0204f0aeb7b2030481680205f1a7b5bb390504826a010173011a22810d12415003071f81181839011a3220221511546d810012052b57011a0c4274300d154e81111f041e10011e293f4213051b2276560817312811170120092136122418370e4e782b3912080f3201262b3b340f222b0c09142a0822116a135c1c130c0114320c4e385a0d0415075f01163543340f06362381133c0c012224180981742048191d110e180e180d310f011a20632450281f043027114b034e0203316a61030482160201360104826e0201380a0484570201610104844d0504814a0201620904820f020164010481630304810403027761040258020165080481550302c9b70204827a0204677367690102660201680104831b020169020483760301720a04814502016a04020c02016b04023405023c030269630504840502016c08048463020170030482670202716d080482000201720304835c03016507024d020174030482520504821503016505048207020175040208030137060481710201760a04833d0201780404832302027a6f080481200202c2ba0204812c0301bd0404821e0205c3a66865730702540202c7890804816f0205cebcc7af730504815c0202d2930202540202db89020481160203e8b8a00304825d0205f0958db331070481620305989b8569780a04813d0204f69299a5020210010174011a7b3829100a4e511f1a281c17140114812626032c372634234c01140a520e815a810815200501123e4f3531042d57615b011a041f3e64070f1f1913274a20770114811d0f5d743e0634161c01162c2782130c1b810520280d01164a513110480b402b810d13011e522d08042c1146137012201e810512011a290903182c05301e5d811944290201390a04836d0301610104836e02016208027803036cc2bc07048261020263640a0481480301730704813602016408022b020165050484310301720702260301780402500203666d73070484470201670104825b02016a040481590304836702016c0304835601025e02016d060484110301340204813702016f04021802017006068336280201710304813507025902017201026508022903016d0604812f0201740304827e03016a010482440201750404834b02017604021a010484150504836a02057773c2b2380602520201780204823e0302cebc080484040303d2956403048171020179020484240204813c0202c2b303048307020484410301be0204816f030484250203c798680104843d03019c030482570204e19ea86a020482350302a0950a0482280204e5a4bc780304810e0101750126090a35030a03220a1731630f31252f0c4b1e31011e39200e3715282a03103b56090f6b1501121d4916246e6d460d6501162609380406361e816d203f011a22166008124f58202e182025150114390f3a25713f0e3f715c011a5a11191123466025710c313312011e3c191326811c1444055f1f5109051201143b106f1181000d068155012043381381020d81080d0603171824260a0201300404844a02013207024203026b390204833803066eeebabb35660604842102013308020302023f02013503048243020436716b66040481440201380a04843d020261690704836002016203048209030484670201630a04841d020264790104822b0201650502340302c2bd060484300201670202620201680704810d020169010484430104843402026b67040481540306eea3ad77c2aa0a04836702016c020258040482270104830a02016d0404824102036e716a0604843e02016f0104832a04020c0204836803036530650a04817402017005025b0301630604843d020171070275020273720404827002017504048133010484120301370102270201760104814f03026203016d0904844802017701048375080481220301660202330301700a04827f020378c2b2030484710202796806023c0301730704813d02017a0404815f0104817202048407010483390202c2b204026802048254040266640204831e0301b3090482230302b963060482010401750a0483290306ba35f2999dac09020f0203ca926e090483350203cdb4780302350202cebc0a020f0204d7a7696d010483100206f097bc996d71040481480101760114185b2258291610821c0e01160272173107154f5b813722011a81020c200e1826250d39811f07011a7911152a2a45131504422c81070120050d3f5b23342e3e4139032a3813042d0116592d1c15630c0c0a814649011c1a362f5c4a35511f0804033e372b01102981262a352e8205010e0b4b6282388106011e26810a2d125f361a12170d1721311e0201300204832b0201320104811b050483790201350204832202016404024c0202657a090483710202666307022703016c07048362030277750604842f0201670304843d0104844c0203686f7a07027202016a0102430204847502046ce0a2b20704810302016d0204827b02026e330804826c02016f0104835502017102027606026c020172060483490202736505048371020174030484130302387602025d02017502048345020376346b0904825c0201770904814b0303c2bd720804812b020178040483600201790804816402017a08026e0202c2b90704811c0301bd0504821e0204cdbcc7a108021a0202cfb8080481490204f09f96a50204842101017701180207232d37812d0c045c4a0a011a06163b3408171c52213a26592201206d08581605811a171e0c0a1347104914011282181324082b73320f01122f6e811d2c3d410a44011e551414206a092f133f333d150a3e0f011e235b170e37060627471b13373b3e27011a0e1e816b270c10102d53381045011a060e1e254d044932651234691e011a158138300a04810c0a8121071802013003027707048214020131080481370201320a04835502013304048271020538ceb369650802310201390a0481440202616c0502570302c7a104026c0201620804811c02016301048168020241020164040481560104820b020165080484460102400202686c060232020269670604827302016a0108810c826e0704824e02026b6c0604816902016c0304831c02016d0304811903016407022b02016e01022e0604845a030237780702040301710804815102016f0104842903017a0704826902017003048445020482080202713002024e0201720804822003016202022302017303048111010482790204812d03067479c39f66700a0210020174020229020175090484430301690604820402017606020202017a01021b0104843a0202c2b90604842b0301bd030484570202c69b0504815d0202c8a30a02240202ceb8090484690301bc0404832f0202df85020481230101780116812b0a16810e4b045a3b2a01205b1305811134092f62072343100f0f05011e5734152612030b4c4134123009361601121781653207780a6a0d01164a25210824138107738139011481341f088158060c8133010e5920193a4c2331011a0510358101231a1b3609702732011a2f07631610033436810256174c011a1342040a58110721378139101602033067750802720201320604834303017109048244020133090481700203366f79010483520201390404810902016301048411050483420201640a048432020265310704832b02026774040481000302d5b2010259020369756c0504832902016c07048365030233700904824102016d010482670404834c0504830c02016e0104831604048120030169090481750303eba6990104835f02016f0604834c030379c2ba0a0481560201700404815e06048256020174040482370201760a04820d0201770604811c02017a0404812e06020b0202c2b9030481660301bd0a04816c0301be030483620206c99b6d7777750304835b0206ceb0646b66610402490202d8bf030482250206e8bfbc626964080482510204f09c9a9e0404830f010179010e2081335661371c01220e4e2718124f0d0649812b0b0a063b040b011402741d1235810805211a011409161d732b8106325f6a01182e330325068107703728302b011e3723081c0d0a3f810c183e061b067f0106834a12011a044030185a1e810704220a0541011245602b0e421441817801144b03811a1a29614e224b02013003048139020132050485050304f09caba6010482230201350104822708048413020138020483430201610402230201620902440108812181070301300304815e020263710404831002016403048226010483660604823c020165010484510201670104816407048418030334c2b20a0481120201690404814c02016a010481500904810f02036b75610304836402016d01027902016f0304817b03056f6373cebc0a0483010201700104817d020171050482680104843b0302383203048128040807090707070b0608060707060c0b810e07080807070707060b080707070b0807090807070a070a07070808070b06090807070708080a0b81230907070b070b0707080907070706090807070807060b07060707070808070a080b0708090b0b09810a0707060908070607060609070b0a070706080a09070707070e0a0708090b0c0b09070a080a811a0706080c09070a07080b0708060806070b080c0e07090e09060706080b060a070b0607090707130b080708070b0908070a0c810d070b0706080707080b080a0a070807090708070707090709070706080709080a81170a0707070a070707070a0b0a07080d080707060a070707070b0707060f0b060707060a08070807080708810d0807070709070b070808070907080f0b070907090b0707070a0807070c0b080c0a810107070a0b07060c07080f070b09070b0906070b070b'); +INSERT INTO t1_data VALUES(274877906949,X'00000e5c033079720404826c0404833002021b03026f6b020482100201740904842e010484150303c2b36f0204840e0201760704826b02017708048273020578f48ba5b50a0481400201790904845902017a050483280304c2bac2bd0404841e0203c2aa680904843a0301bc070481100301be0304820304016a050481630202ca8103027b0202cb860604840d0204ceb56e370204832e0302bc740202520202cf8d07027e0205d8ae39c2aa0104813c0204e887b3770404816a0204f1bfb0970204832f01017a0118101e282f07045961813a193e011e69162f0d2b051c060f084460063053011e06810c20330d0733815c220515220c011210290a7e07810c3a18011a1f2f064a19155212472781047c010a123e45825501166c6062182718167131092f0112331b812c0b6e81470b01184f3a230d45261e271c36111701140a8128456b291248391a0201300104840d0204812502013401048318020137070483070201380904823b03016704026402013907023403016e060481380201610204812f0404824504045243020162050481150104824003016a0804827a020163070484590204817903017a02048209020164020484200203653077030482610302737601048424020166070481730201670304841e0504840e03016b0504825302016901048235010484400404841002016a010483680404845f02046bc2b97407023302026c7a0704812d02027161070209030378cebc0a021f020172040483750404815f0201730304813c030131020482040201740704824d0302793901027502017604048423020177040620813103048313020179030484540204833c04022503017a0904826302017a050483530203c2b2660404840f0307ba6272f397bd92010483070301be020482760202c6b9050482410203c9a3650604812c0202cbae020482180202d38c0704812f0204f096adb7070483490204f6a69c8b030484390102c2aa010c815e81147969010c811c827f0417010e81077a4c03815f010a2e8100820c010a810d148140010c0a7481201a13010c0b831525323d010a8206358129010c21637a33812701083c8340390301300504820a0304326939770404841c03016107048334030165030484150302696c0704810103016c0704812a03027178090481620301730504830e0301750504846303017802021c0301790304836803017a0604834e040135030482650302cdbf010483330304ceb23169070484090303e4849a0504817d0201b201088219744601082210832c010629846001121c8137182211816232010a81668122690108817281080110816a433581102f3e010e7481001b3481190106814e1b010e3646823a810e070301310504840b030161010481720301660604822f0301680804821003016a0704844803016b0104845b03016c0504823403026f700802340301710804826004026d3106024a03017509068458070301770a04836c04016b01021f0301790a0482790302c2b20a02270401b3040482130303ceae6e010484330302df9e040482100201b3010881656e750106820b50010e81434a27048153010a812b068122010843810c0401048211010a50817d812e010c811a8163810801061e832c010c811f81418101030163030481210301640504831102048104030482440301680a048202040271300404841303066b6576cebc6a0104843603026f7a08026d0303756a7808023e030176040483610301770704814403027973020484360302c2b906020c0401bc010484490401bd0804835c0302d38c0304846f0304eaae96750a0484020201b9010c3b824018322d010e0468315a5c817901067d583401060b810e010865118169010c0e07826b813a01066f8265010c3b8239633852010e61161e7030821b01068241210301350804843d0301620302480301690402610403e7a1910704812103016d080269030673c2bac2b36c090483070301760504821d02048454030278350702620302c2ba010483320304ca897a750804813b0401b5070482350303cebc6d050483120302d199020483020402ad660604840c0302d2a1010482550302daa30202340201ba01026d01085119826a010c2f5e82008110010882028221010481090108821b812d01068128460208810b8264010c810971812d440301310304820e0301320504825e05048221030333756d010482720301340502700301640604813d03016607020c0301690204823a03016b0104812203016c0704842103016d0304835f03016e0a04813c03016f0304834d030173060482660401710604810f0301740104843c0303d48174040482690201bc010482690108813c83290114090f816045242e148111010a810616822701048456010e2c81167a638115010a3a3b83204001067a8367010c8114127a2265010a824f7f5c230301300604833e0302616f020483560301640104827d090481280301650502150301660804841a03016804048221030169030481120301720104827803017606023d04016e020481700302c2aa0904836c0401ba090484100201bd01088240224f010843813674020a81185068620106822a44010e14154a8101825e010c19814a1b826c010c81221f81651b010a815a4d812c01082d7281160301300804843c030231300304836703013509048353030365c2bc0304814d0302667504027a0301670604831503016c09025d03016d03048178030172020483620301730104816b0402c2b30404823203017401027204016a08048451030175090237040177090481690301770302190301780a04823d03027a350a0481260302c2aa060481620401b3090481090304f098a1a30a04825d0201be010a0d730b816f010c821d81236c2b010c6f8208358119010681236801087d4e831e0108823c8235010667794b010683165e010e05812e3d3c820d010c81148123817403043531c2ba0204824c03083875c2bceba7957a03020803016302020804036dcebc0304814e0301640304843704033379790504823203016b08023603016d070481090304825804013707027a03016f080484530301710a04842203017809025e0304c2aa6135010481460401b90a04836b0401bc0704814f0306c6ab66e3afb9080482660103c39f350304821f0201b0050481110301680602030201b8040481310604810403016c0a024803017108024b0201be06048323030482650301300504812d0304f48990ae060482740103c491680a0483700301760a0481290201a7010484090202b177020482380201b3030482280102c5800602090301360104826a02018202048173040483780301370104814102018b090482730201930504810f0102c680020483790404830c020183020228020185030484400704820b02028d7a0a04821c0201920404835e02019507048437010484070301760204836102019a020214080483100303d795680504820602019e030481050201a30404820a05048436030177070484290201a50704843b0201a8060482690304816f03027735020483630202ab79050484430201b6060481050201b904024003016d070481130201bd090484350201bf06048361030163020481580102c781040484560201830604833a020286650404842a0301750a04821a020189070483370303e0b9b30904836602018c0104816c04020602021d030171050484570201960a04842d03016b0204821903016c04021e03016e0204845002019a0a04844402019d0704835103013103021702039f77750704827e0201a1090483340201a301022b0404831d0304616363750502520302cfb2040483720201a50a0481530202ad760902310201af0104811d0908816281390301640404843c0201b3080483240201bb030483480201bd040484290304840a0203bf646a0404843f03017a040482450102c89d05020f0201a1090483550201a3060483550201ab0904813203017a04024a0201ad030482210201b10204824302025d0303656577030483600202b46e010482240201b6090484410204bce39f9d020484570102c9870604813202018b0804843603017a06027102018d080481130204840c02018f0104836309026202029164020484430201930504816d0201970304843402039c6c73070483700201a0070483470201a203048262030364d7960a0484010201a80304832a060484390202a96a080481170303c69532090481440201ac040214020481180202ae770604832c0201b0090482300201b40804845a0201b5070482110302716f010482160201ba0504837b0201bb02048149030165050483250201bc07088105833002067f824d0302d19f0402330201bd04024d03017a0904814f0102ca800a048321020181040481580201820604821e020383693707048417020287630704840002018a0904834c0104835c02018b06022f02018c0704814702018d0704810a0104831a020490e7b38308048423020191020482510201920304832f030135030483710201950304833207026802019902026b02019b0904832a02019d09024c02019f0802210201a4010484080202a5710a0481680203a777670804831e0301790902100201ae0402700104834e0201af040484650202b673080484190201b705048221010483520201b808048465030167010484400104cb81cab90104834802018602048317020689777568cf920804842602018b0404817b020191050484200202a0720304833e0201a3040625827f0201a4030485080102cdb1070881408205020483700201b30404840e0202b735080482640201b80504815a0201b90a0482370206bb31cebc6c730304842f030133070483010103ce80370304826d0201900202770201ae0504844e0201b1050484080201b20904815f0201b3040483430201b40702600201b50804823b0201b90304846e0302c9a1070483300201ba0404844d0104847e0201bb050482780201bc010882378223010e811105814d8134010a8142823f2d0106811c52010a6e1814816b02088168824b010a438137812d011019060c6b812f811c010a81314e811b03033366660404825503013502048263030238620904820703016303048120040f080b0907070b07070a0907070707080a07070b0a0a81060b0707070606070f0b070b07070908070b070f0b090807080b07070707070c0e0707090d07080908080a0a50070a0707080708070706070707080a094d07070707070707070707080706070707090844070f07080c0708070708070707080a4707060609060c0b07080a07090808080737070b09060706070707070707070707094807080b0607070707060708074107080709070706070707080607060706070808070a460a0d06090709060b060707060a07070c0907060b06060b070a090707080707070b0707070c060b08070b070a09070b07070b08080706070707070807080707090d070707060707070609070a090807070d0707070b09070707070706070a0908070a0807060b0a080707090707090b08090a08070707080707070e07060708070709080b06070b0a0707070a06070606070809060a07080b07070a070c07070808070e070807070c07090607070707060707080b0743090708'); +INSERT INTO t1_data VALUES(274877906950,X'00040e1807020e0830cebc66f09f97b60604840703016b06021003016c0804835103016d0a0484050301710602560301730304822d030275770904834e0301770204824d0302797707022e0302c2b2070482640402bc6d0a025e0303c3a6370602530305cebc7768690a04823f0201be0504816f0301780a0482780201bf0a04833a0305f09e919a790a0483440103cf80340604827e0201810404823e0201830304843a0504837f0301780704834c02018407048139020186030881038372030178010231020187010481100201880204835b0204845a0104825a0201890204825c0604831802018a0704841502028c340304845e02018e0602180301390204833c0203936e770104820f0201940704823702039765630304847b020199080484110301710704821402029b650704827102019d0304845802019f0504845c0303e7ba880502690202a163090484160201a3060483020301680102470201a90a0482480201ab0104837f030482570201af050482190201b20a0481020201b30504842903026f64040483650203b873780704826d0201bb0704831c030177020481410102d0b0070482560202b17a050484460201b2040483400201b40402390202b671020484220202b777090483510201ba030481750202bb6301021e0202bc620a0484080201bd0204815d0201be060482470201bf040483340102d1800904825002028470050482290202876f06022202048872c5820104826202028b680504845d02018c0a027302018d0a0205020197090483210202986b0a02780201a3030481580201a70604835e020483670201a901048379060483780201ad0a04816b0201af010482310201b1080482020201b3060484610202b5640804814c03026e690304847c0201bb080482710201bd020482020201bf06048435010482590107d28b37c2ba61640104831702018d0704810b020393c5890204836e0201950602070305f6a5989a74040484450201970104813702029f790a04843f0202a57407027f0201a90504835b0202ab750502490202b9760a04827d0301780304826e0202bb6f060481780203bd7130050483630103d3866f09023602028a6c0604825302018c0304845302028e650404833a02028f6f0104821302039d356d090484320201a5020481130404813f0201ab0704835b0201b90a0482380201bd0904833c0201bf060484450302307604027f0102d491050483300201930a024603036bd291070483060201970704826702079b72c2b3356f730904844f02019d010482610201a10404814d0202a36b0502250203a5c7b3080483780201ab02023d0103d5a1640102260201a206026a0301660804813c0201a5030481180201a7050483360201a9040483510201aa060482020201ab0504811e0201bb090481680202bd740702160202be700304846d0102d6840a027d02068534f0988d910a0483730102d78f0404832804048462020390766601027802019202027405024b0201940a04834d020298770904815702039a6c6b0304846802049c73616e080483420201b0010481050202b565050481290206b67376c2aa640a0483280201b80704830e0102d89d0202150802720201a60602480202b073090481480201ba0204836f0102d9a50202670201b40a04822a030337c2b20a04820f0102da800604831c0201840604842802038636380804811e020188090484190201920504815402019a0304830c0201a301023d0201a6040481460201a8020484100201af0104842a0204825f0201b50304827c0201bb0804830f0105dbb878c2bc0502580107dc97e69eaf6764020259020299610104812902029d680502110202a0690a0483270203a56372030483540202a96a0204842c0205acf094abac0704821c0102dd92020483410203946d790304814f020395d7ac090228020296300404830302039b397809020a02029c770504833d0202a2700504821a0201ab010483400202b0760a04813a0201b2040483130203b3c7a10104833d0204b4e8a5a40604816f0201b90604830d0201ba090483630102de800904810a020281740a02380201880704826802018f030481670201900202790203916e710404833502019206048418020399ddba080481240202a3630a02250202b86e070481670204830d0201b90604811f0201bc070481530102df820102390201830304830102038e367901024f02039134620a0482080201920104814b020198030484790202a06b060481240201ba0802090201be08022f03023670010482170202bf6f01022d0103e0a1960304831d0302bb75060483700202a2900804817c0202a49e050485010202a6b2040482030202aa80040481720202abb30304843c0301ba0204833b0203aca677010481120206ae9f613566730504841e0202afa001020a0302a979080484060202b1a1010483730203b2a46a070482460301ba020484580203b39b610804834a0202b6a60304813b0202bfae0404837c0103e185930304845f02038889780a04826802028a85070484620301b90304826c020298a3070483270203af8962050484620202b5b7070481170202b8970602190202bd8f0a0482620103e2848f04021b0203afa861020484010301b70704824a0103e3828f05048214020284a50304812f0202909e0904824d020292b907026302049ba0336604020602029c8e0204840d0202ad860202750302a16a0802180202ae880602040202b480010483150202b7b1090483780202bdbf070482050103e480ab06020f0202889605024f020293b9030483310204968fdc93080483110202a295010484150202a69a0804844d0202a78e0a02080202aa9b0a04825f0203b2b8670402720203b5b764060482550204babacf87070481270202bd9b010481780206be9a6878696805021e0103e58bba0304821202049eab6a630a04827702029faf08024d0202a2b50a02400202a3af0704827c0203a4bd6f0504840c0202ad9d030485010202b1be040483780202b5b9060484500103e689b10404844602028abc0704811902038e98690802320203968b35090482680203979971010483060202b6a4030484050301be0a04833e0103e780a601048171020282be0304824d020286b105021b02028f960a048266020291be0804831c020299900204815502029ea70702400202a0ba040481410204a69e3870030481220202a9800602310202afb8020482170203b1af6d0802140203b5a06a0702740104e88c9a6c06048426020295bc05048326020296af0304846b02059cad72d4aa060484780205baa97364680404837b0103e983840104843902029a8a010481490203a1ac770504812c0301ba050483410202af8c0302620202b1af0302500103ea8fa60a023e020297b50904812e020298a90704825702039ea76b0304847f0202a59e080481460202a68e080482590204a9b1c6a8010481350203b38d75040482750203b89e6f0a0484030103eb828f0704824e020384837109048178020397b6690104821a02039e9e330704837f0203a68b73030484440203b980320804822c0103ec8fa80204814302039588760a04826902029bb80a024e0203afb6630802710203b4a268060483000103ed8cb50104811602029982060481550104ee8085760304834502028a870904845702028f8b04027602039da470030483040202a1a20504813c0202a8ae0504837f0202af9d0402570205b1b773d8b4080482120202bd880904832c0202be930104827b0104ef88ae680704835d0205a8ab63c2be06022e0203aaa16c080481090204adb779660804823f0202b8ae080484220203bb9165030481340106f08798b1636a0604824f0203908ea80404826203029f880402530303b4ad740a04833302039184b6090484650302acb3080483340302b1b703048272020a9281a23578f098b1893001048210030291a50404816803029d8f070483200302afa5080484440302b49f020481010303bd833603026a020393839a07024c0304a3ad6e300504842d0303abb16d0502660302adae0904830e02039481a406048164030386a16c070483530302b2a8050484320302bfb9080483170204958eb8720304832b0302b1ba090481200302babe05048209020496888b6708048358030293b4050483400304b4927a6f050483770204978b93320104810a03048fb9c7890704822803029ba702022a0302a39d060484490302a4be0a0484530302adaa0a026b0302af92040483700302b9bc0404821b02049884b56404048352030486b1716f0904827a030296b80904811d03049d9e797a060483390302a5a00a04844a0303b5856d0a04822e0302bcbd040483310303bd91740704845102039983a20a04816503039d8a330a02140303b9826b0404814e02069a8b8438687403026b0302a599010481740302a6ac0704840f0303b6896d0404831a0302b785010484370302bfac08027d02059b86b770610404845203028fbd020483550303a0be75090483620302a295040482390302b6970404813002039c97bb0a04841103059d8976c2be0604824e0302afbc05023c02039d87b40504825903028daf03048172030292be040482310302a0ab0502290303b2a16b03025d02039e929d050483040302a69f060484150302aa8607025502049f9f8b66020483160302a3be060481120203a8afad0904835e0204acb1af640204845b0204b282a47a040481610203baa68a010482490204bb9f8366060483130203bfa48f0704817c0104f18191920802220204828cad360a0482730203859c9a050481670204888eb23408025f020492ba9c3202026502049bb0bf7008021f02039f94a60104835c0203a6b496030482760203a98c960504824e0203acb7b8030483240203afa0b703023d0206b3a38c683972060483340203bbaaad0902070105f282848f790804833a020384b79f0a048170020590a98c616a0804843b02049a92be730904822f02039da18b080482530203a28f8f06048309070d06070706070807070807080b0707070b09070b07070906070f0b07080607090709070708070708080706070b070707080907070808070608080707080707070808070a0806060707070b0b07070707080807070b0d0709060b0708070707080708090808070808090b0707070707080609070d07070709060806070707070707070708070c0c08090708090a07080c070a0608070707090807090707070607070b07070a0c08070809080b08090808080808070807090a07070807070706090709070c070707070809070708060608070908080808080807090c07080809070908080909080708090807080809070908080709080707070808080807080a0808070808090a080b090a070708090808080908080909080709080708080807080a070808080a08080b0b0908090707070808080908080a0909090909090909090907080909080a0807090808070b08080a0a090a08090c090709090808100808080808080a0808090908080a08080a080a0a0a0708080708080a0a080a080908090908090b08080908070b08090808090b0709080807080908070a08090a0a090a09090a0909090909090909080c080b090b0a09'); +INSERT INTO t1_data VALUES(274877906951,X'000002020630f2abab907a060481130204b381af77040481790203bea6a6070484250108f380b5a33633737701048229020383be9f0404837102048495bf73070481060204938c9a6e0904823502039eb39201022302049fbb9f6c0a0481500204a3909e620404837d0204a9ac9a75020483110203bd8c850a048111030293ad0a048247030294b9040483550203bea4ac0702220105f483b5ab66030482440302bda306048141020584b2bb643804048142020586b1a8677a0204831d0205878c916c770804821f02038da1bf0704824302038f81bd0304825102039e91b20302420203b29b9403021f0203b3a1b10704825a0203b5afb4040481210204b98da0780a02060104f582b1b00404811002038f9fbc010482200302b8a406048419020394b7b80404834c02039bb5b005022b0203aa88b9060481390203aba48f0604842a0205af969438680602360203b88d8903026c0104f68386ad0904846702049aae8f79030483520203a8989a0604836c0203b18cb4070482260203b9a98d050483730203bebc870104824c0104f78283840804816703028db20302600303a8b46106020b020389b2a80104835002048e809339010481190205929193d0b409048253020393aebc0204816202059787b96f690704817202079b949dc78934620404817f02039db28b020483750205a288a7c7a3080482780203a5948d0204811a040b0a090e090a0a080a0a0a090808080b080b0b0b090908080909090a0908090809090a080a0a090909090a0708090a0b090b0d090b'); +CREATE TABLE IF NOT EXISTS 't1_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID; +INSERT INTO t1_idx VALUES(2,X'',2); +INSERT INTO t1_idx VALUES(2,X'30627a',4); +INSERT INTO t1_idx VALUES(2,X'306a32',6); +INSERT INTO t1_idx VALUES(2,X'307173',8); +INSERT INTO t1_idx VALUES(2,X'307972',10); +INSERT INTO t1_idx VALUES(2,X'30cebc66',12); +INSERT INTO t1_idx VALUES(2,X'30f2ab',14); +CREATE TABLE IF NOT EXISTS 't1_content'(id INTEGER PRIMARY KEY, c0, c1,Öc2); +INSERT INTO t1_content VALUES(1,'COMPILER=gcc-5.4.0 20160609','X','RTRIM'); +INSERT INTO t1_content VALUES(2,'COMPILER=gcc-5.4.0 20160609','X','NOCASE'); +INSERT INTO t1_content VALUES(3,'COMPILER=gcc-5.4.0 20160609','X','BINARY'); +INSERT INTO t1_content VALUES(4,'DEBUG','X','RTRIM'); +INSERT INTO t1_content VALUES(5,'DEBUG','X','NOCASE'); +INSERT INTO t1_content VALUES(6,'DEBUG','X','BINARY'); +INSERT INTO t1_content VALUES(7,'ENABLE DBSTAT VTAB','X','RTRIM'); +INSERT INTO t1_content VALUES(8,'ENABLE DBSTAT VTAB','X','NOCASE'); +INSERT INTO t1_content VALUES(9,'ENABLE DBSTAT VTAB','X','BINARY'); +INSERT INTO t1_content VALUES(10,'ENABLE FTS4','X','RTRIM'); +INSERT INTO t1_content VALUES(11,'ENABLE FTS4','X','NOCASE'); +INSERT INTO t1_content VALUES(12,'ENABLE FUS4','X','BINARY'); +INSERT INTO t1_content VALUES(0,NULL,NULL,NULL); +INSERT INTO t1_content VALUES(33,'OMIT LOAD EXTENSION','X','BINARY'); +INSERT INTO t1_content VALUES(32,'OMIT LOAD EXTENSION','X','NOCASE'); +INSERT INTO t1_content VALUES(31,'OMYT LOAD EXTENSION','X','RTRIM'); +INSERT INTO t1_content VALUES(30,'MAX MEMORY=50000000','W','BINARY'); +INSERT INTO t1_content VALUES(29,'MAX MEMORY=50000000','X','NOCASE'); +INSERT INTO t1_content VALUES(28,'MAX MEMORY=50000000','X','RTRIM'); +INSERT INTO t1_content VALUES(27,'ENABLE RTREE','X','BINARY'); +INSERT INTO t1_content VALUES(26,'ENABLE RTREE','Y','NOCASE'); +INSERT INTO t1_content VALUES(25,'ENABLE RTREE','X','RTRIM'); +INSERT INTO t1_content VALUES(24,'ENABLE MEMSYS5','X','BINARY'); +INSERT INTO t1_content VALUES(23,'ENABLE MEMSYS5','X','NOCASE'); +INSERT INTO t1_content VALUES(22,'ENABLE MEMSYS5','X','RTRIM'); +INSERT INTO t1_content VALUES(21,'ENABLE JSON1','X','BINARY'); +INSERT INTO t1_content VALUES(20,'ENABLE JSON1','X','NOCASE'); +INSERT INTO t1_content VALUES(18,'ENABLE GEOPOLY','X','BINARY'); +INSERT INTO t1_content VALUES(17,'EOABLE GEOPOLY','X','NOCQSE'); +INSERT INTO t1_content VALUES(16,'ENABLE GEOPOLY','X','RTRIM'); +INSERT INTO t1_content VALUES(15,'ENABLE FTS5','X','BINARY'); +INSERT INTO t1_content VALUES(14,'ENABLE FTS5','X','NOCASE'); +CREATE TABLE IF NOT EXISTS 't1_docsize'(id INTEGER PRIMARY KEY, sz BLOB); +CREATE TABLE IF NOT EXISTS 't1_config'(k PRIMARY KEY, v) WITHOUT ROWID; +CREATE TABLE t2(x); +INSERT INTO t2 VALUES('optimize'); +INSERT INTO t2 VALUES('rebuild'); +INSERT INTO t2 VALUES('integrity-check'); +PRAGMA writable_schema=OFF; +COMMIT; +} {} + +do_catchsql_test 51.1 { + SELECT max(rowid)==0 FROM t1('e*'); +} {0 0} + +#-------------------------------------------------------------------------- +reset_db +do_test 52.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-2b92f77ddfe191.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 75 74 32 5f 63 6f 6e 66 69 67 74 32 tablut2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: e8 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 .csize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6f 74 74 31 5f 63 6f 6e 74 1_conteott1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 08 c1 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 04 06 06 06 08 08 0f ef 00 14 2a 00 00 00 ............*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 02 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 14 00 2e 02 30 61 01 02 02 01 01 62 01 .t.....0a.....b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 02 ....c.....g..... +| 4048: 01 01 68 01 06 01 02 03 01 01 69 01 06 01 02 03 ..h.......i..... +| 4064: f4 06 06 06 08 08 07 01 03 00 14 03 09 00 09 00 ................ +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 00 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 16: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f e8 00 0f f8 0f f0 0f e8 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 04 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3968: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 3984: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4000: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4016: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4032: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4048: 06 04 04 04 06 06 07 01 03 00 14 03 09 09 09 0f ................ +| 4064: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| 4080: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| page 8 offset 28672 +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-2b92f77ddfe191.db +}]} {} + +do_catchsql_test 52.1 { + SELECT fts5_decode(id, block) FROM t1_data; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 53.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename crash-dbe9b7614da103.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 62 6c 65 (a)V.......table +| 3648: 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_configt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 63 73 !...tablet1_docs +| 3744: 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 04 43 52 izet1_docsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6b WIDU........tabk +| 3936: 65 74 31 5f 64 61 74 61 74 31 5f 64 61 74 61 02 et1_datat1_data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 10 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 31 2c 32 2c 33 ,b,prefix=.1,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e7 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e 2a ...m.K.,.......* +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0e 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cc 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 0a cc 0a ad ...~.H.......... +| 96: 0a 8c 0a 6d 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 01 01 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 74 73 34 03 02 02 01 04 6e .....4fts4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 03 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 75 6d 03 06 01 ...<.....3num... +| 2528: 01 05 01 03 74 61 62 03 02 03 04 0a 19 8c 80 80 ....tab......... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 32 77 68 03 02 .....8.....2wh.. +| 2560: 04 00 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 00 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a 00 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 01 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 13 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 05 06 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: 06 01 01 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c 65 03 02 03 07 1c 8c 80 80 80 .0table......... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 03 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 12 03 00 16 00 00 00 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0e 03 00 3c 00 00 00 16 01 01 02 04 .......<........ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 03 32 .........<.....2 +| 3104: 74 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 th........3and.. +| 3120: 04 0a 1b 89 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 00 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 02 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 03 00 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 08 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 00 00 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 16 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 05 04 08 08 84 80 80 80 80 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 80 80 80 80 11 03 00 3c 00 00 .............<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 03 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 09 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 70 72 65 01 02 05 01 ..<.....3pre.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 16 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 .......6.....2ta +| 3744: 01 06 01 01 05 02 01 65 01 02 04 04 09 19 84 70 .......e.......p +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 04 09 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 01 01 70 01 02 05 04 08 18 84 80 80 ......p......... +| 3888: 80 80 06 03 00 36 00 00 00 03 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 02 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 74 61 62 ............0tab +| 3968: 6c 65 01 06 01 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 68 01 02 03 01 03 66 .....0each.....f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 0f f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 90 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: 0f 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 86 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 01 03 34 74 20 07 04 01 0e 01 03 34 1e .....4t ......4. +| 3680: 09 04 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 07 ....2.......1t.. +| 3744: f4 01 10 01 03 31 6e 0e 07 04 01 0e 01 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 03 02 08 04 01 ...0n........... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 01 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 04 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 04 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 04 09 10 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 74 .....2th......2t +| 4016: 16 07 04 09 0f 01 32 69 14 07 04 09 10 01 32 66 ......2i......2f +| 4032: 12 07 04 09 00 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 33 44 65 ......1......3De +| 4064: 0a 07 04 09 10 01 30 74 08 07 04 09 10 01 30 75 ......0t......0u +| 4080: 26 08 04 09 12 01 30 66 74 04 05 04 09 0c 01 02 &.....0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 04 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 08 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 03 0f f2 00 0f 00 00 00 00 00 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 0c e9 ................ +| end crash-dbe9b7614da103.db +}]} {} + +do_catchsql_test 53.1 { + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x<>1 FROM c WHERE x<10) + INSERT INTO t1(a) SELECT randomblob(3000) FROM c; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 54.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename crash-03a1855566d9ae.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 62 6c 65 (a)V.......table +| 3648: 74 31 5f 63 2a 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_c*nfigt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 73 73 !...tablet1_doss +| 3744: 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 04 43 52 izet1_docsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........tabl +| 3936: 65 74 31 5f 64 61 74 61 74 31 5f 64 61 74 61 02 et1_datat1_data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 11 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 32 2c 32 2c 33 ,b,prefix=.2,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e7 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e ad ...m.K.,........ +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0d 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cd 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 0a cc 0a ad ...~.H.......... +| 96: 0a 8c 0a 6d 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 01 01 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 74 73 34 03 02 02 01 04 6e .....4fts4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 03 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 75 6d 03 06 01 ...<.....3num... +| 2528: 01 05 01 03 74 61 62 05 62 03 04 0a 19 8c 80 80 ....tab.b....... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 39 a7 68 03 02 .....8.....9.h.. +| 2560: 04 10 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 00 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a ff 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 01 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 13 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 05 06 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: 06 01 01 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c cc 03 02 03 07 1c 8c 80 80 80 .0tabl.......... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 03 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 12 03 00 16 00 00 00 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0e 03 05 0c 00 00 00 16 01 01 02 04 ................ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 03 32 .........<.....2 +| 3104: 84 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 .h........3and.. +| 3120: 04 0a 1b 88 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 00 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 12 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 11 01 04 0a 15 88 80 80 80 80 05 03 00 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 08 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 08 f0 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 17 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 06 04 08 08 84 80 80 80 80 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 80 80 80 80 11 03 00 3c 00 00 .............<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 03 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 09 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 70 72 65 01 02 05 01 ..<.....3pre.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 16 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 .......6.....2ta +| 3744: 01 06 01 01 05 02 01 65 00 02 04 04 09 19 84 80 .......e........ +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 04 09 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 de 01 70 01 02 05 04 08 18 84 80 80 ......p......... +| 3888: 80 80 06 03 00 36 00 00 00 13 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 01 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 74 61 62 ............0tab +| 3968: 6c 65 01 06 01 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 68 00 f2 03 01 03 66 .....0each.....f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 0f f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 90 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: 0f 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 01 03 34 74 20 07 04 01 0e 01 03 34 1e .....4t ......4. +| 3680: 09 04 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 08 ....2.......1t.. +| 3744: 04 01 10 01 03 31 6e 0e 07 04 01 0e 01 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 05 52 08 04 01 ...0n.......R... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 b3 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 04 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 04 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 f4 09 11 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 e4 .....2th......2. +| 4016: 16 07 04 09 10 01 32 69 14 07 04 09 10 01 32 66 ......2i......2f +| 4032: 12 07 04 09 10 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 30 74 65 ......1......0te +| 4064: 0a 07 04 09 10 01 30 74 08 07 04 09 10 01 30 70 ......0t......0p +| 4080: 06 08 04 09 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 04 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 18 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 23 03 02 01 03 03 02 02 01 02 02 00 f2 09 ..#............. +| end crash-03a1855566d9ae.db +}]} {} + +do_catchsql_test 54.1 { + SELECT rowid==-1 FROM t1('t*'); +} {0 {0 0 0}} + +#------------------------------------------------------------------------- +reset_db +do_test 55.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-b366b5ac0d3887.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 05 90 00 00 09 00 00 00 04 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 43 4c 4f 42 29 5e 05 07 17 21 Y, sz CLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 32 5f 69 64 78 74 ...-tablet2_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 42 52 59 20 4b 45 59 EGER PRIMBRY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 f1 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 08 d6 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 00 00 00 00 .......x.W.>.... +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 20 f5 00 33 0f 19 4f 4d 0XRTRIM. ..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4c 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 LAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 30 45 4e 41 42 INARY....%.0ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4f 41 42 4c 45 20 46 54 53 35 58 .#..EOABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 31 42 58 42 49 4e 41 52 59 1e TAT VT1BXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 15 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 42 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XBTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 1f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 07 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 05 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 01 17 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 02 f0 12 06 01 01 ................ +| 4080: 06 02 03 00 13 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 77 72 .........+intewr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-b366b5ac0d3887.db +}]} {} + +do_execsql_test 55.1 { + SAVEPOINT one; + DELETE FROM t1 WHERE a MATCH 'ts'; +} + +do_execsql_test 55.2 { + ROLLBACK TO one; +} + sqlite3_fts5_may_be_corrupt 0 finish_test + diff --git a/sqlite/ext/fts5/test/fts5interrupt.test b/sqlite/ext/fts5/test/fts5interrupt.test new file mode 100644 index 00000000..ca682852 --- /dev/null +++ b/sqlite/ext/fts5/test/fts5interrupt.test @@ -0,0 +1,67 @@ +# 2019 Jan 4 +# +# 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 implements regression tests for SQLite library. The +# focus of this script is testing the FTS5 module. +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5interrupt + +# If SQLITE_ENABLE_FTS5 is not defined, omit this file. +ifcapable !fts5 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE t1 USING fts5(a); + INSERT INTO t1(t1, rank) VALUES('pgsz', 40); +} +db_save_and_close + +proc progress_handler {args} { + incr ::progress_handler_delay -1 + if {$::progress_handler_delay<=0} { return 1 } + return 0 +} + +foreach {tn sql} { + 1 { INSERT INTO t1(rowid, a) VALUES(0, 'z z z z') } + 2 { COMMIT } +} { + set bDone 0 + for {set i 1} {$bDone==0} {incr i} { + do_test 1.$tn.$i { + db_restore_and_reopen + execsql { + BEGIN; + INSERT INTO t1(rowid, a) VALUES(1, 'a b c d'); + INSERT INTO t1(rowid, a) VALUES(2, 'd e f g'); + INSERT INTO t1(rowid, a) VALUES(3, 'h i j k'); + INSERT INTO t1(rowid, a) VALUES(4, 'l m n o'); + } + + set ::progress_handler_delay $i + db progress 1 progress_handler + set res [catchsql $sql] + db close + if {$res=="0 {}"} { + set bDone 1 + } else { + if {$res!="1 interrupted"} { error "got: $res" } + } + set {} {} + } {} + } +} + +finish_test + diff --git a/sqlite/ext/fts5/test/fts5tokenizer.test b/sqlite/ext/fts5/test/fts5tokenizer.test index e71979ec..27370657 100644 --- a/sqlite/ext/fts5/test/fts5tokenizer.test +++ b/sqlite/ext/fts5/test/fts5tokenizer.test @@ -189,7 +189,7 @@ do_catchsql_test 6.2 { } {1 {error in tokenizer constructor}} do_catchsql_test 6.3 { CREATE VIRTUAL TABLE a3 USING fts5( - x, y, tokenize = 'unicode61 remove_diacritics 2' + x, y, tokenize = 'unicode61 remove_diacritics 3' ); } {1 {error in tokenizer constructor}} do_catchsql_test 6.4 { diff --git a/sqlite/ext/fts5/test/fts5umlaut.test b/sqlite/ext/fts5/test/fts5umlaut.test new file mode 100644 index 00000000..fa948107 --- /dev/null +++ b/sqlite/ext/fts5/test/fts5umlaut.test @@ -0,0 +1,65 @@ +# 2014 June 17 +# +# 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 implements regression tests for SQLite library. The +# focus of this script is testing the FTS5 module. +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5umlaut + +# If SQLITE_ENABLE_FTS5 is not defined, omit this file. +ifcapable !fts5 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE t1 USING fts5(x); + CREATE VIRTUAL TABLE t2 USING fts5( + x, + tokenize="unicode61 remove_diacritics 2" + ); +} + +foreach {tn q res1 res2} { + 1 "Hà Ná»™i" 0 1 + 2 "Hà Noi" 1 1 + 3 "Ha Noi" 1 1 + 4 "Ha N\u1ed9i" 0 1 + 5 "Ha N\u006fi" 1 1 + 6 "Ha N\u006f\u0302i" 1 1 + 7 "Ha N\u006f\u0323\u0302i" 1 1 +} { + do_execsql_test 1.$tn.1 { + DELETE FROM t1; + INSERT INTO t1(rowid, x) VALUES (1, 'Ha Noi'); + SELECT count(*) FROM t1($q) + } $res1 + do_execsql_test 1.$tn.2 { + DELETE FROM t1; + INSERT INTO t1(rowid, x) VALUES (1, $q); + SELECT count(*) FROM t1('Ha Noi') + } $res1 + + do_execsql_test 1.$tn.2 { + DELETE FROM t2; + INSERT INTO t2(rowid, x) VALUES (1, 'Ha Noi'); + SELECT count(*) FROM t2($q) + } $res2 + do_execsql_test 1.$tn.2 { + DELETE FROM t2; + INSERT INTO t2(rowid, x) VALUES (1, $q); + SELECT count(*) FROM t2('Ha Noi') + } $res2 +} + +finish_test + diff --git a/sqlite/ext/fts5/test/fts5unicode3.test b/sqlite/ext/fts5/test/fts5unicode3.test index 99f9c8c9..30eb3c41 100644 --- a/sqlite/ext/fts5/test/fts5unicode3.test +++ b/sqlite/ext/fts5/test/fts5unicode3.test @@ -21,7 +21,7 @@ ifcapable !fts5 { } proc fts3_unicode_path {file} { - file join [file dirname [info script]] .. .. fts3 unicode $file + file join .. [file dirname [info script]] .. .. fts3 unicode $file } source [fts3_unicode_path parseunicode.tcl] @@ -36,24 +36,26 @@ foreach x [an_load_unicodedata_text $UD] { } foreach {y} [rd_load_unicodedata_text $UD] { - foreach {code ascii} $y {} + foreach {code ascii f} $y {} if {$ascii==""} { set int 0 } else { binary scan $ascii c int } - set aDiacritic($code) $int + set aDiacritic($code,$f) $int + if {$f==0} { set aDiacritic($code,1) $int } } proc tcl_fold {i {bRemoveDiacritic 0}} { global tl_lookup_table global aDiacritic + set f [expr $bRemoveDiacritic==2] if {[info exists tl_lookup_table($i)]} { set i $tl_lookup_table($i) } - if {$bRemoveDiacritic && [info exists aDiacritic($i)]} { - set i $aDiacritic($i) + if {$bRemoveDiacritic && [info exists aDiacritic($i,$f)]} { + set i $aDiacritic($i,$f) } expr $i } @@ -85,7 +87,7 @@ do_execsql_test 1.1 { SELECT count(*), min(i) FROM ii WHERE fts5_fold(i)!=CAST(tcl_fold(i) AS int); } {0 {}} -do_execsql_test 1.2 { +do_execsql_test 1.2.1 { WITH ii(i) AS ( SELECT -1 UNION ALL @@ -95,6 +97,16 @@ do_execsql_test 1.2 { WHERE fts5_fold(i,1)!=CAST(tcl_fold(i,1) AS int); } {0 {}} +do_execsql_test 1.2.2 { + WITH ii(i) AS ( + SELECT -1 + UNION ALL + SELECT i+1 FROM ii WHERE i<100000 + ) + SELECT count(*), min(i) FROM ii + WHERE fts5_fold(i,2)!=CAST(tcl_fold(i,2) AS int); +} {0 {}} + do_execsql_test 1.3 { WITH ii(i) AS ( SELECT -1 diff --git a/sqlite/ext/fts5/test/fts5update.test b/sqlite/ext/fts5/test/fts5update.test index b558c2fb..75598b47 100644 --- a/sqlite/ext/fts5/test/fts5update.test +++ b/sqlite/ext/fts5/test/fts5update.test @@ -115,5 +115,43 @@ do_execsql_test 2.2.integrity { INSERT INTO x2(x2) VALUES('integrity-check'); } +#------------------------------------------------------------------------- +# +do_execsql_test 3.0 { + CREATE VIRTUAL TABLE x3 USING fts5(x, detail=%DETAIL%); + INSERT INTO x3 VALUES('one'); + INSERT INTO x3 VALUES('two'); + INSERT INTO x3 VALUES('one'); + INSERT INTO x3 VALUES('two'); + INSERT INTO x3 VALUES('one'); } + +do_test 3.1 { + db eval { SELECT * FROM x3('one') } { + db eval { + INSERT INTO x3(x3) VALUES('optimize'); + } + } +} {} + +do_execsql_test 4.0 { + CREATE VIRTUAL TABLE x4 USING fts5(a, detail=%DETAIL%); + INSERT INTO x4 VALUES('one two three'); + INSERT INTO x4(rowid, a) VALUES('2', 'one two three'); + INSERT INTO x4(rowid, a) VALUES('3.0', 'one two three'); +} +do_catchsql_test 4.1 { + INSERT INTO x4(rowid, a) VALUES('four', 'one two three'); +} {1 {datatype mismatch}} + +do_catchsql_test 4.2 { + UPDATE x4 SET rowid = 'four' WHERE rowid=1; +} {1 {datatype mismatch}} + + +} + +reset_db +do_catchsql_test 4.0 { CREATE VIRTUAL TABLE t1 USING fts5(a,b,c); } {0 {}} +do_catchsql_test 4.1 { DELETE FROM t1 WHERE t1 MATCH 'f*'; } {0 {}} finish_test diff --git a/sqlite/ext/fts5/test/fts5vocab.test b/sqlite/ext/fts5/test/fts5vocab.test index d3c8b760..a1bf2a4e 100644 --- a/sqlite/ext/fts5/test/fts5vocab.test +++ b/sqlite/ext/fts5/test/fts5vocab.test @@ -79,8 +79,8 @@ do_execsql_test 1.1.2 { 3 cnt {} 0 {} 0 } -do_execsql_test 1.2.1 { SELECT * FROM v1 } { } -do_execsql_test 1.2.2 { SELECT * FROM v2 } { } +do_execsql_test 1.2.1 { SELECT * FROM v1 } {} +do_execsql_test 1.2.2 { SELECT * FROM v2 } {} do_execsql_test 1.3 { INSERT INTO t1 VALUES('x y z'); @@ -479,6 +479,68 @@ do_test 9.6 { expr [lsearch $e2 SorterSort]<0 } 0 +#------------------------------------------------------------------------- +do_execsql_test 10.0 { + CREATE VIRTUAL TABLE ft USING fts5(a, b, c); + CREATE VIRTUAL TABLE t2 USING fts5vocab('ft','row'); + CREATE VIRTUAL TABLE t3 USING fts5vocab('ft','row'); +} + +do_execsql_test 10.1 { + BEGIN; + INSERT INTO ft(b) VALUES('x y'); +} + +do_execsql_test 10.2 { + SELECT t2.term FROM t2; +} {x y} + +do_execsql_test 10.3 { + SELECT t2.term, t3.term FROM t2, t3; +} {x x x y y x y y} + +do_execsql_test 10.4 { + COMMIT; +} + +do_execsql_test 10.5 { + BEGIN; + INSERT INTO ft(a) VALUES('1 2 3'); + INSERT INTO ft(a) VALUES('4 5 6'); + INSERT INTO ft(a) VALUES('1 2 3'); + INSERT INTO ft(a) VALUES('4 5 6'); + INSERT INTO ft(a) VALUES('1 2 3'); + INSERT INTO ft(a) VALUES('4 5 6'); +} +do_test 10.6 { + set res [list] + db eval { SELECT rowid FROM ft('4') } x { + db eval { SELECT * FROM t2 } + lappend res $x(rowid) + } + db eval COMMIT + set res +} {3 5 7} + +do_execsql_test 10.6.1 { + SELECT * FROM t2 WHERE termNULL; +} +do_execsql_test 10.6.3 { + SELECT * FROM t2 WHERE term=NULL; +} +do_execsql_test 10.7.1 { + SELECT * FROM t2 WHERE term?; +} +do_execsql_test 10.7.3 { + SELECT * FROM t2 WHERE term=?; +} finish_test + diff --git a/sqlite/ext/fts5/test/fts5vocab2.test b/sqlite/ext/fts5/test/fts5vocab2.test index 8edea549..45d65714 100644 --- a/sqlite/ext/fts5/test/fts5vocab2.test +++ b/sqlite/ext/fts5/test/fts5vocab2.test @@ -80,8 +80,7 @@ do_execsql_test 1.4 { do_execsql_test 1.5 { DELETE FROM t1; SELECT * FROM v1; -} { -} +} {} #------------------------------------------------------------------------- # @@ -143,8 +142,7 @@ do_execsql_test 2.4 { do_execsql_test 2.5 { DELETE FROM t1; SELECT * FROM v1; -} { -} +} {} #------------------------------------------------------------------------- # @@ -202,7 +200,38 @@ do_execsql_test 3.4 { do_execsql_test 3.5 { DELETE FROM t1; SELECT * FROM v1; -} { +} {} + +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 4.0 { + CREATE VIRTUAL TABLE v1 USING fts5vocab(nosuchtable, col); +} + +do_catchsql_test 4.1 { + SELECT * FROM v1 WHERE term=='nosuchterm'; +} {1 {no such fts5 table: main.nosuchtable}} + +do_execsql_test 4.2.1 { + CREATE TABLE nosuchtable(nosuchtable, y, z); +} +do_catchsql_test 4.2.2 { + SELECT * FROM v1 WHERE term=='nosuchterm'; +} {1 {no such fts5 table: main.nosuchtable}} + +ifcapable fts3 { + do_execsql_test 4.3.1 { + DROP TABLE nosuchtable; + CREATE VIRTUAL TABLE nosuchtable USING fts3(a, b); + } {} + do_catchsql_test 4.3.2 { + SELECT * FROM v1 WHERE term=='nosuchterm'; + } {1 {no such fts5 table: main.nosuchtable}} + do_catchsql_test 4.3.3 { + INSERT INTO nosuchtable VALUES('id', '*id'); + SELECT * FROM v1 WHERE term=='nosuchterm'; + } {1 {no such fts5 table: main.nosuchtable}} } finish_test diff --git a/sqlite/ext/misc/amatch.c b/sqlite/ext/misc/amatch.c index 142e354f..7d96ed50 100644 --- a/sqlite/ext/misc/amatch.c +++ b/sqlite/ext/misc/amatch.c @@ -619,7 +619,7 @@ static int amatchLoadOneRule( if( p->rDel==0 || p->rDel>rCost ) p->rDel = rCost; }else { - pRule = sqlite3_malloc( sizeof(*pRule) + nFrom + nTo ); + pRule = sqlite3_malloc64( sizeof(*pRule) + nFrom + nTo ); if( pRule==0 ){ rc = SQLITE_NOMEM; }else{ @@ -738,11 +738,11 @@ static int amatchLoadRules( ** `mno` becomes mno */ static char *amatchDequote(const char *zIn){ - int nIn; /* Size of input string, in bytes */ + sqlite3_int64 nIn; /* Size of input string, in bytes */ char *zOut; /* Output (dequoted) string */ - nIn = (int)strlen(zIn); - zOut = sqlite3_malloc(nIn+1); + nIn = strlen(zIn); + zOut = sqlite3_malloc64(nIn+1); if( zOut ){ char q = zIn[0]; /* Quote character (if any ) */ @@ -1069,7 +1069,7 @@ static void amatchAddWord( } return; } - pWord = sqlite3_malloc( sizeof(*pWord) + nBase + nTail - 1 ); + pWord = sqlite3_malloc64( sizeof(*pWord) + nBase + nTail - 1 ); if( pWord==0 ) return; memset(pWord, 0, sizeof(*pWord)); pWord->rCost = rCost; diff --git a/sqlite/ext/misc/closure.c b/sqlite/ext/misc/closure.c index 03f13c0c..2f83198a 100644 --- a/sqlite/ext/misc/closure.c +++ b/sqlite/ext/misc/closure.c @@ -422,11 +422,11 @@ static closure_avl *queuePull(closure_queue *pQueue){ ** `mno` becomes mno */ static char *closureDequote(const char *zIn){ - int nIn; /* Size of input string, in bytes */ + sqlite3_int64 nIn; /* Size of input string, in bytes */ char *zOut; /* Output (dequoted) string */ - nIn = (int)strlen(zIn); - zOut = sqlite3_malloc(nIn+1); + nIn = strlen(zIn); + zOut = sqlite3_malloc64(nIn+1); if( zOut ){ char q = zIn[0]; /* Quote character (if any ) */ diff --git a/sqlite/ext/misc/csv.c b/sqlite/ext/misc/csv.c index 8cca8aeb..09e970ee 100644 --- a/sqlite/ext/misc/csv.c +++ b/sqlite/ext/misc/csv.c @@ -621,7 +621,7 @@ static int csvtabConnect( }else if( pNew->zData ){ pNew->iStart = (int)sRdr.iIn; }else{ - pNew->iStart = ftell(sRdr.in); + pNew->iStart = (int)(ftell(sRdr.in) - sRdr.nIn + sRdr.iIn); } csv_reader_reset(&sRdr); rc = sqlite3_declare_vtab(db, CSV_SCHEMA); diff --git a/sqlite/ext/misc/dbdump.c b/sqlite/ext/misc/dbdump.c index 0b4b4bfa..157e646b 100644 --- a/sqlite/ext/misc/dbdump.c +++ b/sqlite/ext/misc/dbdump.c @@ -195,7 +195,7 @@ static char **tableColumnList(DState *p, const char *zTab){ if( nCol>=nAlloc-2 ){ char **azNew; nAlloc = nAlloc*2 + nCol + 10; - azNew = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0])); + azNew = sqlite3_realloc64(azCol, nAlloc*sizeof(azCol[0])); if( azNew==0 ) goto col_oom; azCol = azNew; azCol[0] = 0; diff --git a/sqlite/ext/misc/eval.c b/sqlite/ext/misc/eval.c index e90bfc01..fd27ed6c 100644 --- a/sqlite/ext/misc/eval.c +++ b/sqlite/ext/misc/eval.c @@ -44,7 +44,7 @@ static int callback(void *pCtx, int argc, char **argv, char **colnames){ /* Using sqlite3_realloc64() would be better, but it is a recent ** addition and will cause a segfault if loaded by an older version ** of SQLite. */ - zNew = p->nAlloc<=0x7fffffff ? sqlite3_realloc(p->z, (int)p->nAlloc) : 0; + zNew = p->nAlloc<=0x7fffffff ? sqlite3_realloc64(p->z, p->nAlloc) : 0; if( zNew==0 ){ sqlite3_free(p->z); memset(p, 0, sizeof(*p)); diff --git a/sqlite/ext/misc/fileio.c b/sqlite/ext/misc/fileio.c index 3a4fa18f..b15e0fda 100644 --- a/sqlite/ext/misc/fileio.c +++ b/sqlite/ext/misc/fileio.c @@ -121,22 +121,47 @@ SQLITE_EXTENSION_INIT1 /* ** Set the result stored by context ctx to a blob containing the -** contents of file zName. +** contents of file zName. Or, leave the result unchanged (NULL) +** if the file does not exist or is unreadable. +** +** If the file exceeds the SQLite blob size limit, through an +** SQLITE_TOOBIG error. +** +** Throw an SQLITE_IOERR if there are difficulties pulling the file +** off of disk. */ static void readFileContents(sqlite3_context *ctx, const char *zName){ FILE *in; - long nIn; + sqlite3_int64 nIn; void *pBuf; + sqlite3 *db; + int mxBlob; in = fopen(zName, "rb"); - if( in==0 ) return; + if( in==0 ){ + /* File does not exist or is unreadable. Leave the result set to NULL. */ + return; + } fseek(in, 0, SEEK_END); nIn = ftell(in); rewind(in); - pBuf = sqlite3_malloc( nIn ); - if( pBuf && 1==fread(pBuf, nIn, 1, in) ){ - sqlite3_result_blob(ctx, pBuf, nIn, sqlite3_free); + db = sqlite3_context_db_handle(ctx); + mxBlob = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1); + if( nIn>mxBlob ){ + sqlite3_result_error_code(ctx, SQLITE_TOOBIG); + fclose(in); + return; + } + pBuf = sqlite3_malloc64( nIn ); + if( pBuf==0 ){ + sqlite3_result_error_nomem(ctx); + fclose(in); + return; + } + if( 1==fread(pBuf, nIn, 1, in) ){ + sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free); }else{ + sqlite3_result_error_code(ctx, SQLITE_IOERR); sqlite3_free(pBuf); } fclose(in); @@ -646,8 +671,8 @@ static int fsdirNext(sqlite3_vtab_cursor *cur){ FsdirLevel *pLvl; if( iNew>=pCur->nLvl ){ int nNew = iNew+1; - int nByte = nNew*sizeof(FsdirLevel); - FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc(pCur->aLvl, nByte); + sqlite3_int64 nByte = nNew*sizeof(FsdirLevel); + FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte); if( aNew==0 ) return SQLITE_NOMEM; memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl)); pCur->aLvl = aNew; @@ -727,7 +752,7 @@ static int fsdirColumn( }else if( S_ISLNK(m) ){ char aStatic[64]; char *aBuf = aStatic; - int nBuf = 64; + sqlite3_int64 nBuf = 64; int n; while( 1 ){ @@ -735,7 +760,7 @@ static int fsdirColumn( if( nzBasis = (char*)&pNew[1]; diff --git a/sqlite/ext/misc/json1.c b/sqlite/ext/misc/json1.c index a5b45491..d99d360b 100644 --- a/sqlite/ext/misc/json1.c +++ b/sqlite/ext/misc/json1.c @@ -691,7 +691,7 @@ static JSON_NOINLINE int jsonParseAddNodeExpand( assert( pParse->nNode>=pParse->nAlloc ); if( pParse->oom ) return -1; nNew = pParse->nAlloc*2 + 10; - pNew = sqlite3_realloc(pParse->aNode, sizeof(JsonNode)*nNew); + pNew = sqlite3_realloc64(pParse->aNode, sizeof(JsonNode)*nNew); if( pNew==0 ){ pParse->oom = 1; return -1; @@ -965,7 +965,7 @@ static void jsonParseFillInParentage(JsonParse *pParse, u32 i, u32 iParent){ static int jsonParseFindParents(JsonParse *pParse){ u32 *aUp; assert( pParse->aUp==0 ); - aUp = pParse->aUp = sqlite3_malloc( sizeof(u32)*pParse->nNode ); + aUp = pParse->aUp = sqlite3_malloc64( sizeof(u32)*pParse->nNode ); if( aUp==0 ){ pParse->oom = 1; return SQLITE_NOMEM; @@ -1027,7 +1027,7 @@ static JsonParse *jsonParseCached( pMatch->iHold = iMaxHold+1; return pMatch; } - p = sqlite3_malloc( sizeof(*p) + nJson + 1 ); + p = sqlite3_malloc64( sizeof(*p) + nJson + 1 ); if( p==0 ){ sqlite3_result_error_nomem(pCtx); return 0; diff --git a/sqlite/ext/misc/memstat.c b/sqlite/ext/misc/memstat.c index dcd5742f..800a86e7 100644 --- a/sqlite/ext/misc/memstat.c +++ b/sqlite/ext/misc/memstat.c @@ -143,7 +143,7 @@ static int memstatFindSchemas(memstat_cursor *pCur){ } while( sqlite3_step(pStmt)==SQLITE_ROW ){ char **az, *z; - az = sqlite3_realloc(pCur->azDb, sizeof(char*)*(pCur->nDb+1)); + az = sqlite3_realloc64(pCur->azDb, sizeof(char*)*(pCur->nDb+1)); if( az==0 ){ memstatClearSchema(pCur); return SQLITE_NOMEM; diff --git a/sqlite/ext/misc/memtrace.c b/sqlite/ext/misc/memtrace.c new file mode 100644 index 00000000..19ff4c41 --- /dev/null +++ b/sqlite/ext/misc/memtrace.c @@ -0,0 +1,108 @@ +/* +** 2019-01-21 +** +** 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 implements an extension that uses the SQLITE_CONFIG_MALLOC +** mechanism to add a tracing layer on top of SQLite. If this extension +** is registered prior to sqlite3_initialize(), it will cause all memory +** allocation activities to be logged on standard output, or to some other +** FILE specified by the initializer. +** +** This file needs to be compiled into the application that uses it. +** +** This extension is used to implement the --memtrace option of the +** command-line shell. +*/ +#include +#include +#include + +/* The original memory allocation routines */ +static sqlite3_mem_methods memtraceBase; +static FILE *memtraceOut; + +/* Methods that trace memory allocations */ +static void *memtraceMalloc(int n){ + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n", + memtraceBase.xRoundup(n)); + } + return memtraceBase.xMalloc(n); +} +static void memtraceFree(void *p){ + if( p==0 ) return; + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p)); + } + memtraceBase.xFree(p); +} +static void *memtraceRealloc(void *p, int n){ + if( p==0 ) return memtraceMalloc(n); + if( n==0 ){ + memtraceFree(p); + return 0; + } + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n", + memtraceBase.xSize(p), memtraceBase.xRoundup(n)); + } + return memtraceBase.xRealloc(p, n); +} +static int memtraceSize(void *p){ + return memtraceBase.xSize(p); +} +static int memtraceRoundup(int n){ + return memtraceBase.xRoundup(n); +} +static int memtraceInit(void *p){ + return memtraceBase.xInit(p); +} +static void memtraceShutdown(void *p){ + memtraceBase.xShutdown(p); +} + +/* The substitute memory allocator */ +static sqlite3_mem_methods ersaztMethods = { + memtraceMalloc, + memtraceFree, + memtraceRealloc, + memtraceSize, + memtraceRoundup, + memtraceInit, + memtraceShutdown, + 0 +}; + +/* Begin tracing memory allocations to out. */ +int sqlite3MemTraceActivate(FILE *out){ + int rc = SQLITE_OK; + if( memtraceBase.xMalloc==0 ){ + rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase); + if( rc==SQLITE_OK ){ + rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods); + } + } + memtraceOut = out; + return rc; +} + +/* Deactivate memory tracing */ +int sqlite3MemTraceDeactivate(void){ + int rc = SQLITE_OK; + if( memtraceBase.xMalloc!=0 ){ + rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase); + if( rc==SQLITE_OK ){ + memset(&memtraceBase, 0, sizeof(memtraceBase)); + } + } + memtraceOut = 0; + return rc; +} diff --git a/sqlite/ext/misc/mmapwarm.c b/sqlite/ext/misc/mmapwarm.c index 4e23638a..970a873f 100644 --- a/sqlite/ext/misc/mmapwarm.c +++ b/sqlite/ext/misc/mmapwarm.c @@ -105,4 +105,3 @@ int sqlite3_mmap_warm(sqlite3 *db, const char *zDb){ return rc; } - diff --git a/sqlite/ext/misc/nextchar.c b/sqlite/ext/misc/nextchar.c index 49dfd24f..bf44e064 100644 --- a/sqlite/ext/misc/nextchar.c +++ b/sqlite/ext/misc/nextchar.c @@ -85,7 +85,7 @@ static void nextCharAppend(nextCharContext *p, unsigned c){ if( p->nUsed+1 > p->nAlloc ){ unsigned int *aNew; int n = p->nAlloc*2 + 30; - aNew = sqlite3_realloc(p->aResult, n*sizeof(unsigned int)); + aNew = sqlite3_realloc64(p->aResult, n*sizeof(unsigned int)); if( aNew==0 ){ p->mallocFailed = 1; return; @@ -269,7 +269,7 @@ static void nextCharFunc( sqlite3_result_error_nomem(context); }else{ unsigned char *pRes; - pRes = sqlite3_malloc( c.nUsed*4 + 1 ); + pRes = sqlite3_malloc64( c.nUsed*4 + 1 ); if( pRes==0 ){ sqlite3_result_error_nomem(context); }else{ diff --git a/sqlite/ext/misc/percentile.c b/sqlite/ext/misc/percentile.c index a5d7e849..a8e4981f 100644 --- a/sqlite/ext/misc/percentile.c +++ b/sqlite/ext/misc/percentile.c @@ -151,7 +151,7 @@ static void percentStep(sqlite3_context *pCtx, int argc, sqlite3_value **argv){ /* Allocate and store the Y */ if( p->nUsed>=p->nAlloc ){ unsigned n = p->nAlloc*2 + 250; - double *a = sqlite3_realloc(p->a, sizeof(double)*n); + double *a = sqlite3_realloc64(p->a, sizeof(double)*n); if( a==0 ){ sqlite3_free(p->a); memset(p, 0, sizeof(*p)); diff --git a/sqlite/ext/misc/prefixes.c b/sqlite/ext/misc/prefixes.c new file mode 100644 index 00000000..3aa579b8 --- /dev/null +++ b/sqlite/ext/misc/prefixes.c @@ -0,0 +1,319 @@ +/* +** 2018-04-19 +** +** 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 implements a table-valued function: +** +** prefixes('abcdefg') +** +** The function has a single (non-HIDDEN) column named prefix that takes +** on all prefixes of the string in its argument, including an empty string +** and the input string itself. The order of prefixes is from longest +** to shortest. +*/ +#if !defined(SQLITE_CORE) || !defined(SQLITE_OMIT_VIRTUALTABLE) +#if !defined(SQLITEINT_H) +#include "sqlite3ext.h" +#endif +SQLITE_EXTENSION_INIT1 +#include +#include + +/* prefixes_vtab is a subclass of sqlite3_vtab which is +** underlying representation of the virtual table +*/ +typedef struct prefixes_vtab prefixes_vtab; +struct prefixes_vtab { + sqlite3_vtab base; /* Base class - must be first */ + /* No additional fields are necessary */ +}; + +/* prefixes_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 prefixes_cursor prefixes_cursor; +struct prefixes_cursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + sqlite3_int64 iRowid; /* The rowid */ + char *zStr; /* Original string to be prefixed */ + int nStr; /* Length of the string in bytes */ +}; + +/* +** The prefixesConnect() method is invoked to create a new +** template virtual table. +** +** Think of this routine as the constructor for prefixes_vtab objects. +** +** All this routine needs to do is: +** +** (1) Allocate the prefixes_vtab object and initialize all fields. +** +** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the +** result set of queries against the virtual table will look like. +*/ +static int prefixesConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + prefixes_vtab *pNew; + int rc; + + rc = sqlite3_declare_vtab(db, + "CREATE TABLE prefixes(prefix TEXT, original_string TEXT 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)); + } + return rc; +} + +/* +** This method is the destructor for prefixes_vtab objects. +*/ +static int prefixesDisconnect(sqlite3_vtab *pVtab){ + prefixes_vtab *p = (prefixes_vtab*)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Constructor for a new prefixes_cursor object. +*/ +static int prefixesOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + prefixes_cursor *pCur; + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* +** Destructor for a prefixes_cursor. +*/ +static int prefixesClose(sqlite3_vtab_cursor *cur){ + prefixes_cursor *pCur = (prefixes_cursor*)cur; + sqlite3_free(pCur->zStr); + sqlite3_free(pCur); + return SQLITE_OK; +} + + +/* +** Advance a prefixes_cursor to its next row of output. +*/ +static int prefixesNext(sqlite3_vtab_cursor *cur){ + prefixes_cursor *pCur = (prefixes_cursor*)cur; + pCur->iRowid++; + return SQLITE_OK; +} + +/* +** Return values of columns for the row at which the prefixes_cursor +** is currently pointing. +*/ +static int prefixesColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + prefixes_cursor *pCur = (prefixes_cursor*)cur; + switch( i ){ + case 0: + sqlite3_result_text(ctx, pCur->zStr, pCur->nStr - (int)pCur->iRowid, + 0); + break; + default: + sqlite3_result_text(ctx, pCur->zStr, pCur->nStr, 0); + 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 prefixesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + prefixes_cursor *pCur = (prefixes_cursor*)cur; + *pRowid = pCur->iRowid; + return SQLITE_OK; +} + +/* +** Return TRUE if the cursor has been moved off of the last +** row of output. +*/ +static int prefixesEof(sqlite3_vtab_cursor *cur){ + prefixes_cursor *pCur = (prefixes_cursor*)cur; + return pCur->iRowid>pCur->nStr; +} + +/* +** This method is called to "rewind" the prefixes_cursor object back +** to the first row of output. This method is always called at least +** once prior to any call to prefixesColumn() or prefixesRowid() or +** prefixesEof(). +*/ +static int prefixesFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + prefixes_cursor *pCur = (prefixes_cursor *)pVtabCursor; + sqlite3_free(pCur->zStr); + if( argc>0 ){ + pCur->zStr = sqlite3_mprintf("%s", sqlite3_value_text(argv[0])); + pCur->nStr = pCur->zStr ? (int)strlen(pCur->zStr) : 0; + }else{ + pCur->zStr = 0; + pCur->nStr = 0; + } + pCur->iRowid = 0; + return SQLITE_OK; +} + +/* +** SQLite will invoke this method one or more times while planning a query +** that uses the virtual table. This routine needs to create +** a query plan for each invocation and compute an estimated cost for that +** plan. +*/ +static int prefixesBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + /* Search for a usable equality constraint against column 1 + ** (original_string) and use it if at all possible */ + int i; + const struct sqlite3_index_constraint *p; + + for(i=0, p=pIdxInfo->aConstraint; inConstraint; i++, p++){ + if( p->iColumn!=1 ) continue; + if( p->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + if( !p->usable ) continue; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->estimatedCost = (double)10; + pIdxInfo->estimatedRows = 10; + return SQLITE_OK; + } + pIdxInfo->estimatedCost = (double)1000000000; + pIdxInfo->estimatedRows = 1000000000; + return SQLITE_OK; +} + +/* +** This following structure defines all the methods for the +** virtual table. +*/ +static sqlite3_module prefixesModule = { + /* iVersion */ 0, + /* xCreate */ 0, + /* xConnect */ prefixesConnect, + /* xBestIndex */ prefixesBestIndex, + /* xDisconnect */ prefixesDisconnect, + /* xDestroy */ 0, + /* xOpen */ prefixesOpen, + /* xClose */ prefixesClose, + /* xFilter */ prefixesFilter, + /* xNext */ prefixesNext, + /* xEof */ prefixesEof, + /* xColumn */ prefixesColumn, + /* xRowid */ prefixesRowid, + /* xUpdate */ 0, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindMethod */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ 0 +}; + +/* +** This is a copy of the SQLITE_SKIP_UTF8(zIn) macro in sqliteInt.h. +** +** Assuming zIn points to the first byte of a UTF-8 character, +** advance zIn to point to the first byte of the next UTF-8 character. +*/ +#define PREFIX_SKIP_UTF8(zIn) { \ + if( (*(zIn++))>=0xc0 ){ \ + while( (*zIn & 0xc0)==0x80 ){ zIn++; } \ + } \ +} + +/* +** Implementation of function prefix_length(). This function accepts two +** strings as arguments and returns the length in characters (not bytes), +** of the longest prefix shared by the two strings. For example: +** +** prefix_length('abcdxxx', 'abcyy') == 3 +** prefix_length('abcdxxx', 'bcyyy') == 0 +** prefix_length('abcdxxx', 'ab') == 2 +** prefix_length('ab', 'abcd') == 2 +** +** This function assumes the input is well-formed utf-8. If it is not, +** it is possible for this function to return -1. +*/ +static void prefixLengthFunc( + sqlite3_context *ctx, + int nVal, + sqlite3_value **apVal +){ + int nByte; /* Number of bytes to compare */ + int nRet = 0; /* Return value */ + const unsigned char *zL = sqlite3_value_text(apVal[0]); + const unsigned char *zR = sqlite3_value_text(apVal[1]); + int nL = sqlite3_value_bytes(apVal[0]); + int nR = sqlite3_value_bytes(apVal[1]); + int i; + + nByte = (nL > nR ? nL : nR); + for(i=0; inState ); + pToFree = sqlite3_malloc64( sizeof(ReStateNumber)*2*pRe->nState ); if( pToFree==0 ) return -1; aStateSet[0].aState = pToFree; } @@ -337,10 +337,10 @@ static int re_match(ReCompiled *pRe, const unsigned char *zIn, int nIn){ static int re_resize(ReCompiled *p, int N){ char *aOp; int *aArg; - aOp = sqlite3_realloc(p->aOp, N*sizeof(p->aOp[0])); + aOp = sqlite3_realloc64(p->aOp, N*sizeof(p->aOp[0])); if( aOp==0 ) return 1; p->aOp = aOp; - aArg = sqlite3_realloc(p->aArg, N*sizeof(p->aArg[0])); + aArg = sqlite3_realloc64(p->aArg, N*sizeof(p->aArg[0])); if( aArg==0 ) return 1; p->aArg = aArg; p->nAlloc = N; diff --git a/sqlite/ext/misc/unionvtab.c b/sqlite/ext/misc/unionvtab.c index 2d2053ce..73660231 100644 --- a/sqlite/ext/misc/unionvtab.c +++ b/sqlite/ext/misc/unionvtab.c @@ -250,11 +250,11 @@ struct UnionCsr { ** is attempted but fails, NULL is returned and *pRc is set to ** SQLITE_NOMEM. */ -static void *unionMalloc(int *pRc, int nByte){ +static void *unionMalloc(int *pRc, sqlite3_int64 nByte){ void *pRet; assert( nByte>0 ); if( *pRc==SQLITE_OK ){ - pRet = sqlite3_malloc(nByte); + pRet = sqlite3_malloc64(nByte); if( pRet ){ memset(pRet, 0, nByte); }else{ @@ -276,7 +276,7 @@ static void *unionMalloc(int *pRc, int nByte){ static char *unionStrdup(int *pRc, const char *zIn){ char *zRet = 0; if( zIn ){ - int nByte = (int)strlen(zIn) + 1; + sqlite3_int64 nByte = strlen(zIn) + 1; zRet = unionMalloc(pRc, nByte); if( zRet ){ memcpy(zRet, zIn, nByte); @@ -939,7 +939,7 @@ static int unionConnect( /* Grow the pTab->aSrc[] array if required. */ if( nAlloc<=pTab->nSrc ){ int nNew = nAlloc ? nAlloc*2 : 8; - UnionSrc *aNew = (UnionSrc*)sqlite3_realloc( + UnionSrc *aNew = (UnionSrc*)sqlite3_realloc64( pTab->aSrc, nNew*sizeof(UnionSrc) ); if( aNew==0 ){ diff --git a/sqlite/ext/misc/vfslog.c b/sqlite/ext/misc/vfslog.c index b55b06fc..24a46a92 100644 --- a/sqlite/ext/misc/vfslog.c +++ b/sqlite/ext/misc/vfslog.c @@ -276,7 +276,7 @@ static VLogLog *vlogLogOpen(const char *zFilename){ && sqlite3_strglob("-mj??????9??", zFilename+nName-12)==0 ){ return 0; /* Do not log master journal files */ } - pTemp = sqlite3_malloc( sizeof(*pLog)*2 + nName + 60 ); + pTemp = sqlite3_malloc64( sizeof(*pLog)*2 + nName + 60 ); if( pTemp==0 ) return 0; pMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); sqlite3_mutex_enter(pMutex); diff --git a/sqlite/ext/misc/zipfile.c b/sqlite/ext/misc/zipfile.c index e57dc38f..0b14917c 100644 --- a/sqlite/ext/misc/zipfile.c +++ b/sqlite/ext/misc/zipfile.c @@ -358,7 +358,7 @@ static int zipfileConnect( rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA); if( rc==SQLITE_OK ){ - pNew = (ZipfileTab*)sqlite3_malloc(nByte+nFile); + pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile); if( pNew==0 ) return SQLITE_NOMEM; memset(pNew, 0, nByte+nFile); pNew->db = db; @@ -806,7 +806,7 @@ static int zipfileGetEntry( } if( rc==SQLITE_OK ){ - int nAlloc; + sqlite3_int64 nAlloc; ZipfileEntry *pNew; int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]); @@ -818,7 +818,7 @@ static int zipfileGetEntry( nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]); } - pNew = (ZipfileEntry*)sqlite3_malloc(nAlloc); + pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc); if( pNew==0 ){ rc = SQLITE_NOMEM; }else{ @@ -981,11 +981,11 @@ static int zipfileDeflate( u8 **ppOut, int *pnOut, /* Output */ char **pzErr /* OUT: Error message */ ){ - int nAlloc = (int)compressBound(nIn); + sqlite3_int64 nAlloc = compressBound(nIn); u8 *aOut; int rc = SQLITE_OK; - aOut = (u8*)sqlite3_malloc(nAlloc); + aOut = (u8*)sqlite3_malloc64(nAlloc); if( aOut==0 ){ rc = SQLITE_NOMEM; }else{ @@ -1058,7 +1058,7 @@ static int zipfileColumn( if( pCsr->pCurrent->aData ){ aBuf = pCsr->pCurrent->aData; }else{ - aBuf = aFree = sqlite3_malloc(sz); + aBuf = aFree = sqlite3_malloc64(sz); if( aBuf==0 ){ rc = SQLITE_NOMEM; }else{ @@ -1897,14 +1897,14 @@ struct ZipfileCtx { static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){ if( pBuf->n+nByte>pBuf->nAlloc ){ u8 *aNew; - int nNew = pBuf->n ? pBuf->n*2 : 512; + sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512; int nReq = pBuf->n + nByte; while( nNewa, nNew); + aNew = sqlite3_realloc64(pBuf->a, nNew); if( aNew==0 ) return SQLITE_NOMEM; pBuf->a = aNew; - pBuf->nAlloc = nNew; + pBuf->nAlloc = (int)nNew; } return SQLITE_OK; } @@ -2095,7 +2095,7 @@ void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){ void zipfileFinal(sqlite3_context *pCtx){ ZipfileCtx *p; ZipfileEOCD eocd; - int nZip; + sqlite3_int64 nZip; u8 *aZip; p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx)); @@ -2108,14 +2108,14 @@ void zipfileFinal(sqlite3_context *pCtx){ eocd.iOffset = p->body.n; nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ; - aZip = (u8*)sqlite3_malloc(nZip); + aZip = (u8*)sqlite3_malloc64(nZip); if( aZip==0 ){ sqlite3_result_error_nomem(pCtx); }else{ memcpy(aZip, p->body.a, p->body.n); memcpy(&aZip[p->body.n], p->cds.a, p->cds.n); zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]); - sqlite3_result_blob(pCtx, aZip, nZip, zipfileFree); + sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree); } } diff --git a/sqlite/ext/rbu/rbu_common.tcl b/sqlite/ext/rbu/rbu_common.tcl index 2b263b76..b5e63aaf 100644 --- a/sqlite/ext/rbu/rbu_common.tcl +++ b/sqlite/ext/rbu/rbu_common.tcl @@ -86,12 +86,13 @@ proc step_rbu_legacy {target rbu} { set rc } -proc do_rbu_vacuum_test {tn step} { - forcedelete state.db - uplevel [list do_test $tn.1 { - if {$step==0} { sqlite3rbu_vacuum rbu test.db state.db } +proc do_rbu_vacuum_test {tn step {statedb state.db}} { + forcedelete $statedb + if {$statedb=="" && $step==1} breakpoint + uplevel [list do_test $tn.1 [string map [list %state% $statedb] { + if {$step==0} { sqlite3rbu_vacuum rbu test.db {%state%}} while 1 { - if {$step==1} { sqlite3rbu_vacuum rbu test.db state.db } + if {$step==1} { sqlite3rbu_vacuum rbu test.db {%state%}} set state [rbu state] check_prestep_state test.db $state set rc [rbu step] @@ -100,7 +101,7 @@ proc do_rbu_vacuum_test {tn step} { if {$step==1} { rbu close } } rbu close - } {SQLITE_DONE}] + }] {SQLITE_DONE}] uplevel [list do_execsql_test $tn.2 { PRAGMA integrity_check diff --git a/sqlite/ext/rbu/rbuvacuum2.test b/sqlite/ext/rbu/rbuvacuum2.test index 4713580c..6d6dfde9 100644 --- a/sqlite/ext/rbu/rbuvacuum2.test +++ b/sqlite/ext/rbu/rbuvacuum2.test @@ -16,8 +16,11 @@ source [file join [file dirname [info script]] rbu_common.tcl] -foreach step {0 1} { - set ::testprefix rbuvacuum2-$step +foreach {step} {0 1} { +foreach {ttt state} { + s state.db t test.db-vacuum n {} +} { + set ::testprefix rbuvacuum2-$step$ttt #------------------------------------------------------------------------- # Test that a database that contains fts3 tables can be vacuumed. @@ -29,7 +32,7 @@ foreach step {0 1} { INSERT INTO t1 VALUES('fix this issue', 'at some point'); } - do_rbu_vacuum_test 1.2 $step + do_rbu_vacuum_test 1.2 $step $state do_execsql_test 1.3 { SELECT * FROM t1; @@ -46,7 +49,7 @@ foreach step {0 1} { INSERT INTO t1 VALUES('a b c', 'x y z'); } - do_rbu_vacuum_test 1.6 $step + do_rbu_vacuum_test 1.6 $step $state do_execsql_test 1.7 { INSERT INTO t1(t1) VALUES('integrity-check'); SELECT * FROM t1; @@ -67,7 +70,7 @@ foreach step {0 1} { INSERT INTO t1 VALUES('fix this issue', 'at some point'); } - do_rbu_vacuum_test 2.2 $step + do_rbu_vacuum_test 2.2 $step $state do_execsql_test 2.3 { SELECT * FROM t1; @@ -84,7 +87,7 @@ foreach step {0 1} { INSERT INTO t1 VALUES('a b c', 'x y z'); } - do_rbu_vacuum_test 2.6 $step + do_rbu_vacuum_test 2.6 $step $state do_execsql_test 2.7 { INSERT INTO t1(t1) VALUES('integrity-check'); SELECT * FROM t1; @@ -107,7 +110,7 @@ foreach step {0 1} { INSERT INTO rt VALUES(3, 55, 65); } - do_rbu_vacuum_test 3.2 $step + do_rbu_vacuum_test 3.2 $step $state do_execsql_test 3.3 { SELECT * FROM rt; @@ -120,7 +123,7 @@ foreach step {0 1} { SELECT rowid FROM rt WHERE x2>59 AND x1 < 59 } {2 3} - do_rbu_vacuum_test 3.5 $step + do_rbu_vacuum_test 3.5 $step $state do_execsql_test 3.6.1 { SELECT rowid FROM rt WHERE x2>51 AND x1 < 51 @@ -147,7 +150,7 @@ foreach step {0 1} { trigger tr1 t1 0 {CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN SELECT 1; END} } - do_rbu_vacuum_test 4.3 $step + do_rbu_vacuum_test 4.3 $step $state do_execsql_test 4.4 { SELECT * FROM sqlite_master; } { @@ -157,6 +160,7 @@ foreach step {0 1} { } } } +} #------------------------------------------------------------------------- # Test that passing a NULL value as the second argument to @@ -231,4 +235,9 @@ do_test 6.3 { execsql { PRAGMA integrity_check } } {ok} +do_test 6.4 { + sqlite3rbu_vacuum rbu test.db test.db-vactmp + list [catch { rbu close } msg] $msg +} {1 SQLITE_MISUSE} + finish_test diff --git a/sqlite/ext/rbu/rbuvacuum3.test b/sqlite/ext/rbu/rbuvacuum3.test new file mode 100644 index 00000000..7e1e337f --- /dev/null +++ b/sqlite/ext/rbu/rbuvacuum3.test @@ -0,0 +1,63 @@ +# 2019 Jan 3 +# +# 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 tests for the RBU module. More specifically, it +# contains tests to ensure that the sqlite3rbu_vacuum() API works as +# expected. +# + +source [file join [file dirname [info script]] rbu_common.tcl] +set testprefix rbuvacuum3 + +do_execsql_test 1.0 { + CREATE TABLE t1(a PRIMARY KEY, b, c); + CREATE INDEX i1b ON t1(b); + CREATE INDEX i1c ON t1(c); + + WITH s(i) AS ( + VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<100 + ) + INSERT INTO t1 SELECT i, randomblob(100), randomblob(100) FROM s; +} + +forcedelete state.db +do_test 1.1 { + sqlite3rbu_vacuum rbu test.db state.db + while {1} { + set rc [rbu step] + if {$rc!="SQLITE_OK"} break + rbu savestate + } + rbu close +} {SQLITE_DONE} + +do_test 1.2 { + sqlite3rbu_vacuum rbu test.db state.db + while {1} { + set rc [rbu step] + if {$rc!="SQLITE_OK"} break + rbu savestate + } + rbu close +} {SQLITE_DONE} + +do_test 1.3 { + while {1} { + sqlite3rbu_vacuum rbu test.db state.db + set rc [rbu step] + if {$rc!="SQLITE_OK"} break + rbu savestate + rbu close + } + rbu close +} {SQLITE_DONE} + +finish_test diff --git a/sqlite/ext/rbu/sqlite3rbu.c b/sqlite/ext/rbu/sqlite3rbu.c index cd2f96c5..e86606be 100644 --- a/sqlite/ext/rbu/sqlite3rbu.c +++ b/sqlite/ext/rbu/sqlite3rbu.c @@ -2477,7 +2477,7 @@ static void rbuOpenDatabase(sqlite3rbu *p, int *pbRetry){ if( *zExtra=='\0' ) zExtra = 0; } - zTarget = sqlite3_mprintf("file:%s-vacuum?rbu_memory=1%s%s", + zTarget = sqlite3_mprintf("file:%s-vactmp?rbu_memory=1%s%s", sqlite3_db_filename(p->dbRbu, "main"), (zExtra==0 ? "" : "&"), (zExtra==0 ? "" : zExtra) ); @@ -3743,6 +3743,12 @@ sqlite3rbu *sqlite3rbu_vacuum( const char *zState ){ if( zTarget==0 ){ return rbuMisuseError(); } + if( zState ){ + int n = strlen(zState); + if( n>=7 && 0==memcmp("-vactmp", &zState[n-7], 7) ){ + return rbuMisuseError(); + } + } /* TODO: Check that both arguments are non-NULL */ return openRbuHandle(0, zTarget, zState); } @@ -3939,7 +3945,10 @@ int sqlite3rbu_savestate(sqlite3rbu *p){ if( p->eStage==RBU_STAGE_OAL ){ assert( rc!=SQLITE_DONE ); if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, 0); - if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbRbu, "BEGIN IMMEDIATE", 0, 0, 0); + if( rc==SQLITE_OK ){ + const char *zBegin = rbuIsVacuum(p) ? "BEGIN" : "BEGIN IMMEDIATE"; + rc = sqlite3_exec(p->dbRbu, zBegin, 0, 0, 0); + } if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbMain, "BEGIN IMMEDIATE", 0, 0,0); } diff --git a/sqlite/ext/rbu/sqlite3rbu.h b/sqlite/ext/rbu/sqlite3rbu.h index 1acbcca4..69d89500 100644 --- a/sqlite/ext/rbu/sqlite3rbu.h +++ b/sqlite/ext/rbu/sqlite3rbu.h @@ -333,7 +333,11 @@ SQLITE_API sqlite3rbu *sqlite3rbu_open( ** name of the state database is "-vacuum", where ** is the name of the target database file. In this case, on UNIX, if the ** state database is not already present in the file-system, it is created -** with the same permissions as the target db is made. +** with the same permissions as the target db is made. +** +** With an RBU vacuum, it is an SQLITE_MISUSE error if the name of the +** state database ends with "-vactmp". This name is reserved for internal +** use. ** ** This function does not delete the state database after an RBU vacuum ** is completed, even if it created it. However, if the call to diff --git a/sqlite/ext/rbu/test_rbu.c b/sqlite/ext/rbu/test_rbu.c index e0b4d77a..6d04bfe8 100644 --- a/sqlite/ext/rbu/test_rbu.c +++ b/sqlite/ext/rbu/test_rbu.c @@ -273,6 +273,7 @@ static int SQLITE_TCLAPI test_sqlite3rbu_vacuum( zCmd = Tcl_GetString(objv[1]); zTarget = Tcl_GetString(objv[2]); if( objc==4 ) zStateDb = Tcl_GetString(objv[3]); + if( zStateDb && zStateDb[0]=='\0' ) zStateDb = 0; pRbu = sqlite3rbu_vacuum(zTarget, zStateDb); Tcl_CreateObjCommand(interp, zCmd, test_sqlite3rbu_cmd, (ClientData)pRbu, 0); diff --git a/sqlite/ext/rtree/geopoly.c b/sqlite/ext/rtree/geopoly.c index f6a31f54..d93eca23 100644 --- a/sqlite/ext/rtree/geopoly.c +++ b/sqlite/ext/rtree/geopoly.c @@ -124,6 +124,14 @@ struct GeoPoly { */ #define GEOPOLY_SZ(N) (sizeof(GeoPoly) + sizeof(GeoCoord)*2*((N)-4)) +/* Macros to access coordinates of a GeoPoly. +** We have to use these macros, rather than just say p->a[i] in order +** to silence (incorrect) UBSAN warnings if the array index is too large. +*/ +#define GeoX(P,I) (((GeoCoord*)(P)->a)[(I)*2]) +#define GeoY(P,I) (((GeoCoord*)(P)->a)[(I)*2+1]) + + /* ** State of a parse of a GeoJSON input. */ @@ -316,8 +324,9 @@ static GeoPoly *geopolyFuncParam( memcpy(p->hdr, a, nByte); if( a[0] != *(unsigned char*)&x ){ int ii; - for(ii=0; iia[ii]); + for(ii=0; iihdr[0] ^= 1; } @@ -376,9 +385,9 @@ static void geopolyJsonFunc( int i; sqlite3_str_append(x, "[", 1); for(i=0; inVertex; i++){ - sqlite3_str_appendf(x, "[%!g,%!g],", p->a[i*2], p->a[i*2+1]); + sqlite3_str_appendf(x, "[%!g,%!g],", GeoX(p,i), GeoY(p,i)); } - sqlite3_str_appendf(x, "[%!g,%!g]]", p->a[0], p->a[1]); + sqlite3_str_appendf(x, "[%!g,%!g]]", GeoX(p,0), GeoY(p,0)); sqlite3_result_text(context, sqlite3_str_finish(x), -1, sqlite3_free); sqlite3_free(p); } @@ -395,7 +404,9 @@ static void geopolySvgFunc( int argc, sqlite3_value **argv ){ - GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + GeoPoly *p; + if( argc<1 ) return; + p = geopolyFuncParam(context, argv[0], 0); if( p ){ sqlite3 *db = sqlite3_context_db_handle(context); sqlite3_str *x = sqlite3_str_new(db); @@ -403,10 +414,10 @@ static void geopolySvgFunc( char cSep = '\''; sqlite3_str_appendf(x, "a[i*2], p->a[i*2+1]); + sqlite3_str_appendf(x, "%c%g,%g", cSep, GeoX(p,i), GeoY(p,i)); cSep = ' '; } - sqlite3_str_appendf(x, " %g,%g'", p->a[0], p->a[1]); + sqlite3_str_appendf(x, " %g,%g'", GeoX(p,0), GeoY(p,0)); for(i=1; inVertex; ii++){ - x0 = p->a[ii*2]; - y0 = p->a[ii*2+1]; + x0 = GeoX(p,ii); + y0 = GeoY(p,ii); x1 = (GeoCoord)(A*x0 + B*y0 + E); y1 = (GeoCoord)(C*x0 + D*y0 + F); - p->a[ii*2] = x1; - p->a[ii*2+1] = y1; + GeoX(p,ii) = x1; + GeoY(p,ii) = y1; } sqlite3_result_blob(context, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT); @@ -475,12 +486,12 @@ 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) */ + rArea += (GeoX(p,ii) - GeoX(p,ii+1)) /* (x0 - x1) */ + * (GeoY(p,ii) + GeoY(p,ii+1)) /* (y0 + y1) */ * 0.5; } - rArea += (p->a[ii*2] - p->a[0]) /* (xN - x0) */ - * (p->a[ii*2+1] + p->a[1]) /* (yN + y0) */ + rArea += (GeoX(p,ii) - GeoX(p,0)) /* (xN - x0) */ + * (GeoY(p,ii) + GeoY(p,0)) /* (yN + y0) */ * 0.5; return rArea; } @@ -527,13 +538,13 @@ static void geopolyCcwFunc( 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; + for(ii=1, jj=p->nVertex-1; iihdr, @@ -593,8 +604,8 @@ static void geopolyRegularFunc( 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); + GeoX(p,i) = x - r*geopolySine(rAngle-0.5*GEOPOLY_PI); + GeoY(p,i) = y + r*geopolySine(rAngle); } sqlite3_result_blob(context, p->hdr, 4+8*n, SQLITE_TRANSIENT); sqlite3_free(p); @@ -631,13 +642,13 @@ static GeoPoly *geopolyBBox( } if( p ){ int ii; - mnX = mxX = p->a[0]; - mnY = mxY = p->a[1]; + mnX = mxX = GeoX(p,0); + mnY = mxY = GeoY(p,0); for(ii=1; iinVertex; ii++){ - double r = p->a[ii*2]; + double r = GeoX(p,ii); if( rmxX ) mxX = (float)r; - r = p->a[ii*2+1]; + r = GeoY(p,ii); if( rmxY ) mxY = (float)r; } @@ -657,14 +668,14 @@ static GeoPoly *geopolyBBox( pOut->hdr[1] = 0; pOut->hdr[2] = 0; pOut->hdr[3] = 4; - pOut->a[0] = mnX; - pOut->a[1] = mnY; - pOut->a[2] = mxX; - pOut->a[3] = mnY; - pOut->a[4] = mxX; - pOut->a[5] = mxY; - pOut->a[6] = mnX; - pOut->a[7] = mxY; + GeoX(pOut,0) = mnX; + GeoY(pOut,0) = mnY; + GeoX(pOut,1) = mxX; + GeoY(pOut,1) = mnY; + GeoX(pOut,2) = mxX; + GeoY(pOut,2) = mxY; + GeoX(pOut,3) = mnX; + GeoY(pOut,3) = mxY; }else{ sqlite3_free(p); aCoord[0].f = mnX; @@ -802,14 +813,14 @@ static void geopolyContainsPointFunc( int ii; if( p1==0 ) return; for(ii=0; iinVertex-1; ii++){ - v = pointBeneathLine(x0,y0,p1->a[ii*2],p1->a[ii*2+1], - p1->a[ii*2+2],p1->a[ii*2+3]); + v = pointBeneathLine(x0,y0,GeoX(p1,ii), GeoY(p1,ii), + GeoX(p1,ii+1),GeoY(p1,ii+1)); if( v==2 ) break; cnt += v; } if( v!=2 ){ - v = pointBeneathLine(x0,y0,p1->a[ii*2],p1->a[ii*2+1], - p1->a[0],p1->a[1]); + v = pointBeneathLine(x0,y0,GeoX(p1,ii), GeoY(p1,ii), + GeoX(p1,0), GeoY(p1,0)); } if( v==2 ){ sqlite3_result_int(context, 1); @@ -931,10 +942,10 @@ static void geopolyAddSegments( unsigned int i; GeoCoord *x; for(i=0; i<(unsigned)pPoly->nVertex-1; i++){ - x = pPoly->a + (i*2); + x = &GeoX(pPoly,i); geopolyAddOneSegment(p, x[0], x[1], x[2], x[3], side, i); } - x = pPoly->a + (i*2); + x = &GeoX(pPoly,i); geopolyAddOneSegment(p, x[0], x[1], pPoly->a[0], pPoly->a[1], side, i); } diff --git a/sqlite/ext/rtree/rtree.c b/sqlite/ext/rtree/rtree.c index 4b044cb7..73d06614 100644 --- a/sqlite/ext/rtree/rtree.c +++ b/sqlite/ext/rtree/rtree.c @@ -128,6 +128,9 @@ struct Rtree { u8 inWrTrans; /* True if inside write transaction */ u8 nAux; /* # of auxiliary columns in %_rowid */ u8 nAuxNotNull; /* Number of initial not-null aux columns */ +#ifdef SQLITE_DEBUG + u8 bCorrupt; /* Shadow table corruption detected */ +#endif int iDepth; /* Current depth of the r-tree structure */ char *zDb; /* Name of database containing r-tree table */ char *zName; /* Name of r-tree table */ @@ -187,6 +190,15 @@ struct Rtree { # define RTREE_ZERO 0.0 #endif +/* +** Set the Rtree.bCorrupt flag +*/ +#ifdef SQLITE_DEBUG +# define RTREE_IS_CORRUPT(X) ((X)->bCorrupt = 1) +#else +# define RTREE_IS_CORRUPT(X) +#endif + /* ** When doing a search of an r-tree, instances of the following structure ** record intermediate results from the tree walk. @@ -553,8 +565,8 @@ static void nodeZero(Rtree *pRtree, RtreeNode *p){ ** Given a node number iNode, return the corresponding key to use ** in the Rtree.aHash table. */ -static int nodeHash(i64 iNode){ - return iNode % HASHSIZE; +static unsigned int nodeHash(i64 iNode){ + return ((unsigned)iNode) % HASHSIZE; } /* @@ -599,7 +611,7 @@ static void nodeHashDelete(Rtree *pRtree, RtreeNode *pNode){ */ static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){ RtreeNode *pNode; - pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode) + pRtree->iNodeSize); + pNode = (RtreeNode *)sqlite3_malloc64(sizeof(RtreeNode) + pRtree->iNodeSize); if( pNode ){ memset(pNode, 0, sizeof(RtreeNode) + pRtree->iNodeSize); pNode->zData = (u8 *)&pNode[1]; @@ -623,6 +635,18 @@ static void nodeBlobReset(Rtree *pRtree){ } } +/* +** Check to see if pNode is the same as pParent or any of the parents +** of pParent. +*/ +static int nodeInParentChain(const RtreeNode *pNode, const RtreeNode *pParent){ + do{ + if( pNode==pParent ) return 1; + pParent = pParent->pParent; + }while( pParent ); + return 0; +} + /* ** Obtain a reference to an r-tree node. */ @@ -641,6 +665,10 @@ static int nodeAcquire( if( (pNode = nodeHashLookup(pRtree, iNode))!=0 ){ assert( !pParent || !pNode->pParent || pNode->pParent==pParent ); if( pParent && !pNode->pParent ){ + if( nodeInParentChain(pNode, pParent) ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; + } pParent->nRef++; pNode->pParent = pParent; } @@ -671,9 +699,12 @@ static int nodeAcquire( *ppNode = 0; /* If unable to open an sqlite3_blob on the desired row, that can only ** be because the shadow tables hold erroneous data. */ - if( rc==SQLITE_ERROR ) rc = SQLITE_CORRUPT_VTAB; + if( rc==SQLITE_ERROR ){ + rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); + } }else if( pRtree->iNodeSize==sqlite3_blob_bytes(pRtree->pNodeBlob) ){ - pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode)+pRtree->iNodeSize); + pNode = (RtreeNode *)sqlite3_malloc64(sizeof(RtreeNode)+pRtree->iNodeSize); if( !pNode ){ rc = SQLITE_NOMEM; }else{ @@ -686,7 +717,6 @@ static int nodeAcquire( pNode->pNext = 0; rc = sqlite3_blob_read(pRtree->pNodeBlob, pNode->zData, pRtree->iNodeSize, 0); - nodeReference(pParent); } } @@ -700,6 +730,7 @@ static int nodeAcquire( pRtree->iDepth = readInt16(pNode->zData); if( pRtree->iDepth>RTREE_MAX_DEPTH ){ rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); } } @@ -710,14 +741,17 @@ static int nodeAcquire( if( pNode && rc==SQLITE_OK ){ if( NCELL(pNode)>((pRtree->iNodeSize-4)/pRtree->nBytesPerCell) ){ rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); } } if( rc==SQLITE_OK ){ if( pNode!=0 ){ + nodeReference(pParent); nodeHashInsert(pRtree, pNode); }else{ rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); } *ppNode = pNode; }else{ @@ -943,7 +977,7 @@ static void rtreeRelease(Rtree *pRtree){ pRtree->inWrTrans = 0; assert( pRtree->nCursor==0 ); nodeBlobReset(pRtree); - assert( pRtree->nNodeRef==0 ); + assert( pRtree->nNodeRef==0 || pRtree->bCorrupt ); sqlite3_finalize(pRtree->pWriteNode); sqlite3_finalize(pRtree->pDeleteNode); sqlite3_finalize(pRtree->pReadRowid); @@ -1002,7 +1036,7 @@ static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ Rtree *pRtree = (Rtree *)pVTab; RtreeCursor *pCsr; - pCsr = (RtreeCursor *)sqlite3_malloc(sizeof(RtreeCursor)); + pCsr = (RtreeCursor *)sqlite3_malloc64(sizeof(RtreeCursor)); if( pCsr ){ memset(pCsr, 0, sizeof(RtreeCursor)); pCsr->base.pVtab = pVTab; @@ -1275,6 +1309,7 @@ static int nodeRowidIndex( return SQLITE_OK; } } + RTREE_IS_CORRUPT(pRtree); return SQLITE_CORRUPT_VTAB; } @@ -1368,7 +1403,7 @@ static RtreeSearchPoint *rtreeEnqueue( RtreeSearchPoint *pNew; if( pCur->nPoint>=pCur->nPointAlloc ){ int nNew = pCur->nPointAlloc*2 + 8; - pNew = sqlite3_realloc(pCur->aPoint, nNew*sizeof(pCur->aPoint[0])); + pNew = sqlite3_realloc64(pCur->aPoint, nNew*sizeof(pCur->aPoint[0])); if( pNew==0 ) return 0; pCur->aPoint = pNew; pCur->nPointAlloc = nNew; @@ -1770,7 +1805,7 @@ static int rtreeFilter( */ rc = nodeAcquire(pRtree, 1, 0, &pRoot); if( rc==SQLITE_OK && argc>0 ){ - pCsr->aConstraint = sqlite3_malloc(sizeof(RtreeConstraint)*argc); + pCsr->aConstraint = sqlite3_malloc64(sizeof(RtreeConstraint)*argc); pCsr->nConstraint = argc; if( !pCsr->aConstraint ){ rc = SQLITE_NOMEM; @@ -1915,20 +1950,20 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ ){ u8 op; switch( p->op ){ - case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break; - case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break; - case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break; - case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break; - case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break; - default: - assert( p->op==SQLITE_INDEX_CONSTRAINT_MATCH ); - op = RTREE_MATCH; - break; + case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break; + case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break; + case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break; + case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break; + case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break; + case SQLITE_INDEX_CONSTRAINT_MATCH: op = RTREE_MATCH; break; + default: op = 0; break; + } + if( op ){ + zIdxStr[iIdx++] = op; + zIdxStr[iIdx++] = (char)(p->iColumn - 1 + '0'); + pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2); + pIdxInfo->aConstraintUsage[ii].omit = 1; } - zIdxStr[iIdx++] = op; - zIdxStr[iIdx++] = (char)(p->iColumn - 1 + '0'); - pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2); - pIdxInfo->aConstraintUsage[ii].omit = 1; } } @@ -1964,11 +1999,11 @@ static RtreeDValue cellArea(Rtree *pRtree, RtreeCell *p){ #endif { switch( pRtree->nDim ){ - case 5: area = p->aCoord[9].i - p->aCoord[8].i; - case 4: area *= p->aCoord[7].i - p->aCoord[6].i; - case 3: area *= p->aCoord[5].i - p->aCoord[4].i; - case 2: area *= p->aCoord[3].i - p->aCoord[2].i; - default: area *= p->aCoord[1].i - p->aCoord[0].i; + case 5: area = (i64)p->aCoord[9].i - (i64)p->aCoord[8].i; + case 4: area *= (i64)p->aCoord[7].i - (i64)p->aCoord[6].i; + case 3: area *= (i64)p->aCoord[5].i - (i64)p->aCoord[4].i; + case 2: area *= (i64)p->aCoord[3].i - (i64)p->aCoord[2].i; + default: area *= (i64)p->aCoord[1].i - (i64)p->aCoord[0].i; } } return area; @@ -2137,12 +2172,14 @@ static int AdjustTree( RtreeCell *pCell /* This cell was just inserted */ ){ RtreeNode *p = pNode; + int cnt = 0; while( p->pParent ){ RtreeNode *pParent = p->pParent; RtreeCell cell; int iCell; - if( nodeParentIndex(pRtree, p, &iCell) ){ + if( (++cnt)>1000 || nodeParentIndex(pRtree, p, &iCell) ){ + RTREE_IS_CORRUPT(pRtree); return SQLITE_CORRUPT_VTAB; } @@ -2339,9 +2376,9 @@ static int splitNodeStartree( int iBestSplit = 0; RtreeDValue fBestMargin = RTREE_ZERO; - int nByte = (pRtree->nDim+1)*(sizeof(int*)+nCell*sizeof(int)); + sqlite3_int64 nByte = (pRtree->nDim+1)*(sizeof(int*)+nCell*sizeof(int)); - aaSorted = (int **)sqlite3_malloc(nByte); + aaSorted = (int **)sqlite3_malloc64(nByte); if( !aaSorted ){ return SQLITE_NOMEM; } @@ -2462,7 +2499,7 @@ static int SplitNode( /* Allocate an array and populate it with a copy of pCell and ** all cells from node pLeft. Then zero the original node. */ - aCell = sqlite3_malloc((sizeof(RtreeCell)+sizeof(int))*(nCell+1)); + aCell = sqlite3_malloc64((sizeof(RtreeCell)+sizeof(int))*(nCell+1)); if( !aCell ){ rc = SQLITE_NOMEM; goto splitnode_out; @@ -2610,7 +2647,10 @@ static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){ } rc = sqlite3_reset(pRtree->pReadParent); if( rc==SQLITE_OK ) rc = rc2; - if( rc==SQLITE_OK && !pChild->pParent ) rc = SQLITE_CORRUPT_VTAB; + if( rc==SQLITE_OK && !pChild->pParent ){ + RTREE_IS_CORRUPT(pRtree); + rc = SQLITE_CORRUPT_VTAB; + } pChild = pChild->pParent; } return rc; @@ -2750,7 +2790,7 @@ static int Reinsert( /* Allocate the buffers used by this operation. The allocation is ** relinquished before this function returns. */ - aCell = (RtreeCell *)sqlite3_malloc(n * ( + aCell = (RtreeCell *)sqlite3_malloc64(n * ( sizeof(RtreeCell) + /* aCell array */ sizeof(int) + /* aOrder array */ sizeof(int) + /* aSpare array */ @@ -2924,8 +2964,12 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ rc = findLeafNode(pRtree, iDelete, &pLeaf, 0); } +#ifdef CORRUPT_DB + assert( pLeaf!=0 || rc!=SQLITE_OK || CORRUPT_DB ); +#endif + /* Delete the cell in question from the leaf node. */ - if( rc==SQLITE_OK ){ + if( rc==SQLITE_OK && pLeaf ){ int rc2; rc = nodeRowidIndex(pRtree, pLeaf, iDelete, &iCell); if( rc==SQLITE_OK ){ @@ -3197,7 +3241,7 @@ static int rtreeUpdate( rc = rc2; } } - if( pRtree->nAux ){ + if( rc==SQLITE_OK && pRtree->nAux ){ sqlite3_stmt *pUp = pRtree->pWriteAux; int jj; sqlite3_bind_int64(pUp, 1, *pRowid); @@ -3395,6 +3439,7 @@ static int rtreeSqlInit( }; sqlite3_stmt **appStmt[N_STATEMENT]; int i; + const int f = SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB; pRtree->db = db; @@ -3451,8 +3496,7 @@ static int rtreeSqlInit( } zSql = sqlite3_mprintf(zFormat, zDb, zPrefix); if( zSql ){ - rc = sqlite3_prepare_v3(db, zSql, -1, SQLITE_PREPARE_PERSISTENT, - appStmt[i], 0); + rc = sqlite3_prepare_v3(db, zSql, -1, f, appStmt[i], 0); }else{ rc = SQLITE_NOMEM; } @@ -3482,8 +3526,7 @@ static int rtreeSqlInit( if( zSql==0 ){ rc = SQLITE_NOMEM; }else{ - rc = sqlite3_prepare_v3(db, zSql, -1, SQLITE_PREPARE_PERSISTENT, - &pRtree->pWriteAux, 0); + rc = sqlite3_prepare_v3(db, zSql, -1, f, &pRtree->pWriteAux, 0); sqlite3_free(zSql); } } @@ -3559,6 +3602,7 @@ static int getNodeSize( *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); }else if( pRtree->iNodeSize<(512-64) ){ rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); *pzErr = sqlite3_mprintf("undersize RTree blobs in \"%q_node\"", pRtree->zName); } @@ -3614,7 +3658,7 @@ static int rtreeInit( /* Allocate the sqlite3_vtab structure */ nDb = (int)strlen(argv[1]); nName = (int)strlen(argv[2]); - pRtree = (Rtree *)sqlite3_malloc(sizeof(Rtree)+nDb+nName+2); + pRtree = (Rtree *)sqlite3_malloc64(sizeof(Rtree)+nDb+nName+2); if( !pRtree ){ return SQLITE_NOMEM; } @@ -3882,8 +3926,7 @@ static void rtreeCheckAppendMsg(RtreeCheck *pCheck, const char *zFmt, ...){ static u8 *rtreeCheckGetNode(RtreeCheck *pCheck, i64 iNode, int *pnNode){ u8 *pRet = 0; /* Return value */ - assert( pCheck->rc==SQLITE_OK ); - if( pCheck->pGetNode==0 ){ + if( pCheck->rc==SQLITE_OK && pCheck->pGetNode==0 ){ pCheck->pGetNode = rtreeCheckPrepare(pCheck, "SELECT data FROM %Q.'%q_node' WHERE nodeno=?", pCheck->zDb, pCheck->zTab @@ -3895,7 +3938,7 @@ static u8 *rtreeCheckGetNode(RtreeCheck *pCheck, i64 iNode, int *pnNode){ if( sqlite3_step(pCheck->pGetNode)==SQLITE_ROW ){ int nNode = sqlite3_column_bytes(pCheck->pGetNode, 0); const u8 *pNode = (const u8*)sqlite3_column_blob(pCheck->pGetNode, 0); - pRet = sqlite3_malloc(nNode); + pRet = sqlite3_malloc64(nNode); if( pRet==0 ){ pCheck->rc = SQLITE_NOMEM; }else{ @@ -4328,12 +4371,12 @@ static void rtreeMatchArgFree(void *pArg){ static void geomCallback(sqlite3_context *ctx, int nArg, sqlite3_value **aArg){ RtreeGeomCallback *pGeomCtx = (RtreeGeomCallback *)sqlite3_user_data(ctx); RtreeMatchArg *pBlob; - int nBlob; + sqlite3_int64 nBlob; int memErr = 0; nBlob = sizeof(RtreeMatchArg) + (nArg-1)*sizeof(RtreeDValue) + nArg*sizeof(sqlite3_value*); - pBlob = (RtreeMatchArg *)sqlite3_malloc(nBlob); + pBlob = (RtreeMatchArg *)sqlite3_malloc64(nBlob); if( !pBlob ){ sqlite3_result_error_nomem(ctx); }else{ diff --git a/sqlite/ext/rtree/rtree1.test b/sqlite/ext/rtree/rtree1.test index bdaad542..77494573 100644 --- a/sqlite/ext/rtree/rtree1.test +++ b/sqlite/ext/rtree/rtree1.test @@ -647,5 +647,19 @@ do_execsql_test 16.130 { SELECT * FROM rt1 WHERE id IN (1, 2, 3, 4); } {1 1.0 2.0 aux1 2 2.0 3.0 aux2 3 3.0 4.0 aux3 4 4.0 5.0 aux4} +reset_db +do_execsql_test 17.0 { + CREATE VIRTUAL TABLE t1 USING rtree(id, x1 PRIMARY KEY, x2, y1, y2); + CREATE VIRTUAL TABLE t2 USING rtree(id, x1, x2, y1, y2 UNIQUE); +} +do_execsql_test 17.1 { + REINDEX t1; + REINDEX t2; +} {} + +do_execsql_test 17.2 { + REINDEX; +} {} + expand_all_sql db finish_test diff --git a/sqlite/ext/rtree/rtree6.test b/sqlite/ext/rtree/rtree6.test index 6800b4bb..bc9ff842 100644 --- a/sqlite/ext/rtree/rtree6.test +++ b/sqlite/ext/rtree/rtree6.test @@ -15,6 +15,7 @@ if {![info exists testdir]} { set testdir [file join [file dirname [info script]] .. .. test] } source $testdir/tester.tcl +set testprefix rtree6 ifcapable {!rtree || rtree_int_only} { finish_test @@ -58,6 +59,9 @@ do_test rtree6-1.1 { do_test rtree6-1.2 { rtree_strategy {SELECT * FROM t1 WHERE x1>10} } {E0} +do_test rtree6-1.2.1 { + rtree_strategy {SELECT * FROM t1 WHERE x1>10 AND x2 LIKE '%x%'} +} {E0} do_test rtree6-1.3 { rtree_strategy {SELECT * FROM t1 WHERE x1<10} @@ -164,5 +168,14 @@ do_execsql_test rtree6-3.5 { x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>1.1 } {} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 4.0 { + CREATE VIRTUAL TABLE t1 USING rtree(id,x0,x1,y0,y1); +} +do_execsql_test 4.1 { + DELETE FROM t1 WHERE x0>1 AND x1<2 OR y0<92; +} + expand_all_sql db finish_test diff --git a/sqlite/ext/rtree/rtreecirc.test b/sqlite/ext/rtree/rtreecirc.test new file mode 100644 index 00000000..d77ed04b --- /dev/null +++ b/sqlite/ext/rtree/rtreecirc.test @@ -0,0 +1,66 @@ +# 2018 Dec 22 +# +# 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 implements regression tests for SQLite library. The +# focus of this script is testing the FTS5 module. +# + +if {![info exists testdir]} { + set testdir [file join [file dirname [info script]] .. .. test] +} +source [file join [file dirname [info script]] rtree_util.tcl] +source $testdir/tester.tcl +set testprefix rtreecirc + +ifcapable !rtree { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE rt USING rtree(id, x1, x2, y1, y2); + SELECT name FROM sqlite_master ORDER BY 1; +} { + rt rt_node rt_parent rt_rowid +} +db_save_and_close + +foreach {tn schema sql} { + 1 { + CREATE TRIGGER tr1 AFTER INSERT ON rt_node BEGIN + SELECT * FROM rt; + END; + } { + INSERT INTO rt VALUES(1, 2, 3, 4, 5); + } + 2 { + CREATE TRIGGER tr1 AFTER INSERT ON rt_parent BEGIN + SELECT * FROM rt; + END; + } { + INSERT INTO rt VALUES(1, 2, 3, 4, 5); + } + 3 { + CREATE TRIGGER tr1 AFTER INSERT ON rt_rowid BEGIN + SELECT * FROM rt; + END; + } { + INSERT INTO rt VALUES(1, 2, 3, 4, 5); + } +} { + db_restore_and_reopen + do_execsql_test 1.1.$tn.1 $schema + do_catchsql_test 1.1.$tn.2 $sql {1 {no such table: main.rt}} + db close +} + + +finish_test + diff --git a/sqlite/ext/rtree/rtreefuzz001.test b/sqlite/ext/rtree/rtreefuzz001.test new file mode 100644 index 00000000..201308ce --- /dev/null +++ b/sqlite/ext/rtree/rtreefuzz001.test @@ -0,0 +1,777 @@ +# 2012-12-21 +# +# 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. +# +#*********************************************************************** +# +# Test cases for corrupt database files. + +if {![info exists testdir]} { + set testdir [file join [file dirname [info script]] .. .. test] +} +source $testdir/tester.tcl + +ifcapable !deserialize||!rtree { + finish_test + return +} +database_may_be_corrupt + +do_test rtreefuzz001-100 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename c1b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 03 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 ................ +| 96: 00 2e 30 38 0d 00 00 00 04 0e 9c 00 0f ad 0f 4f ..08...........O +| 112: 0e fc 0e 9c 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3728: 00 00 00 00 00 00 00 00 00 00 00 00 5e 04 07 17 ............^... +| 3744: 1f 1f 01 81 0b 74 61 62 6c 65 74 31 5f 70 61 72 .....tablet1_par +| 3760: 65 6e 74 74 31 5f 70 61 72 65 6e 74 04 43 52 45 entt1_parent.CRE +| 3776: 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 70 61 ATE TABLE .t1_pa +| 3792: 72 66 6e 74 22 28 6e 6f 64 65 6e 6f 20 49 4e 54 rfnt.(nodeno INT +| 3808: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3824: 2c 70 61 72 65 6e 74 6e 6f 64 65 29 51 03 06 17 ,parentnode)Q... +| 3840: 1b 1b 01 7b 74 61 62 6c 65 74 31 5f 6e 6f 64 65 ....tablet1_node +| 3856: 74 31 5f 6e 6f 64 65 03 43 52 45 41 54 45 20 54 t1_node.CREATE T +| 3872: 41 42 4c 45 20 22 74 31 5f 6e 6f 64 65 22 28 6e ABLE .t1_node.(n +| 3888: 6f 64 65 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 odeno INTEGER PR +| 3904: 49 4d 41 52 59 20 4b 45 59 2c 64 61 74 61 29 5c IMARY KEY,data). +| 3920: 02 07 17 1d 1d 01 81 0b 74 61 62 6c 65 74 31 5f ........tablet1_ +| 3936: 72 6f 77 69 64 74 31 5f 72 6f 77 69 64 02 43 52 rowidt1_rowid.CR +| 3952: 45 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 72 EATE TABLE .t1_r +| 3968: 6f 77 69 64 22 28 72 6f 77 69 64 20 49 4e 54 45 owid.(rowid INTE +| 3984: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY, +| 4000: 6e 6f 64 65 6e 6f 2c 61 30 2c 61 31 29 51 01 07 nodeno,a0,a1)Q.. +| 4016: 17 11 11 08 81 0f 74 61 62 6c 65 74 31 74 31 43 ......tablet1t1C +| 4032: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 4048: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 72 74 72 BLE t1 USING rtr +| 4064: 65 65 28 69 64 2c 78 30 2c 78 31 2c 79 30 2c 79 ee(id,x0,x1,y0,y +| 4080: 31 2c 2b 6c 61 62 65 6c 2c 2b 6f 74 68 65 72 29 1,+label,+other) +| page 2 offset 4096 +| 0: 0d 0c cd 00 74 08 75 01 0f e8 0c b3 0f d0 0f b7 ....t.u......... +| 16: 0f 9e 0f 91 0f 81 0f 70 0f 5e 0f 4f 0f 39 0f 29 .......p.^.O.9.) +| 32: 0f 18 0f 06 0e f7 0c 65 0e 58 0d c2 0d 2c 0c 25 .......e.X...,.% +| 48: 0b 85 0a e5 0a 45 09 a5 09 05 0c 83 0c 93 0c a3 .....E.......... +| 64: 0f f0 0c 15 0b 75 0a d5 0a 35 09 95 08 f5 0e d8 .....u...5...... +| 80: 0e 42 0d ac 0d 16 0c 05 0b 65 0a c5 0a 25 09 85 .B.......e...%.. +| 96: 08 e5 0e c8 0e 32 0d 9c 0d 06 0b f5 0b 55 0a b5 .....2.......U.. +| 112: 0a 15 09 75 08 d5 0e b8 0e 22 0d 8c 0c f6 0b e5 ...u............ +| 128: 0b 45 0a a5 0a 05 09 65 08 c5 0e a8 0e 12 0d 7c .E.....e.......| +| 144: 0c e6 0b d5 0b 35 0a 95 09 f5 09 55 08 b5 0e 98 .....5.....U.... +| 160: 0e 02 0d 6c 0c d6 0b c5 0b 25 0a 85 09 e5 09 45 ...l.....%.....E +| 176: 08 a5 0e 88 0d f2 0d 5c 0c 55 0b b5 0b 15 0a 75 .........U.....u +| 192: 09 d5 09 35 08 95 0e 78 0d e2 0d 4c 0c 45 0b a5 ...5...x...L.E.. +| 208: 0b 05 0a 65 09 c5 09 25 08 85 0e 68 0d d2 0d 3c ...e...%...h...< +| 224: 0c 35 0b 95 0a f5 0a 55 09 b5 09 15 08 75 0c 75 .5.....U.....u.u +| 2160: 00 00 00 00 00 0d 8e 75 05 00 01 1b 00 04 62 6f .......u......bo +| 2176: 78 2d 39 2c 39 0d 8e 11 05 00 01 1b 00 02 62 6f x-9,9.........bo +| 2192: 78 2d 39 2c 38 0d 8d 2d 05 00 01 1b 00 02 62 6f x-9,8..-......bo +| 2208: 78 2d 39 2c 37 0d 8c 49 05 00 01 1b 00 02 62 6f x-9,7..I......bo +| 2224: 78 2d 39 2c 36 0d 8b 65 05 00 01 1b 00 02 62 6f x-9,6..e......bo +| 2240: 78 2d 39 2c 35 0d 8b 01 05 00 01 1b 00 02 62 6f x-9,5.........bo +| 2256: 78 2d 39 2c 34 0d 8a 1d 05 00 01 1b 00 02 62 6f x-9,4.........bo +| 2272: 78 2d 39 2c 33 0d 89 39 05 00 01 1b 00 02 62 6f x-9,3..9......bo +| 2288: 78 2d 39 2c 32 0d 88 55 05 00 01 1b 00 02 62 6f x-9,2..U......bo +| 2304: 78 2d 39 2c 31 0d 87 71 05 00 01 1b 00 02 62 6f x-9,1..q......bo +| 2320: 78 2d 39 2c 30 0d 8e 74 05 00 01 1b 00 04 62 6f x-9,0..t......bo +| 2336: 78 2d 38 2c 39 0d 8e 10 05 00 01 1b 00 02 62 6f x-8,9.........bo +| 2352: 78 2d 38 2c 38 0d 8d 2c 05 00 01 1b 00 02 62 6f x-8,8..,......bo +| 2368: 78 2d 38 2c 37 0d 8c 48 05 00 01 1b 00 02 62 6f x-8,7..H......bo +| 2384: 78 2d 38 2c 36 0d 8b 64 05 00 01 1b 00 02 62 6f x-8,6..d......bo +| 2400: 78 2d 38 2c 35 0d 8b 00 05 00 01 1b 00 02 62 6f x-8,5.........bo +| 2416: 78 2d 38 2c 34 0d 8a 1c 05 00 01 1b 00 02 62 6f x-8,4.........bo +| 2432: 78 2d 38 2c 33 0d 89 38 05 00 01 1b 00 02 62 6f x-8,3..8......bo +| 2448: 78 2d 38 2c 32 0d 88 54 05 00 01 1b 00 02 62 6f x-8,2..T......bo +| 2464: 78 2d 38 2c 31 0d 87 70 05 00 01 1b 00 02 62 6f x-8,1..p......bo +| 2480: 78 2d 38 2c 30 0d 8e 73 05 00 01 1b 00 05 62 6f x-8,0..s......bo +| 2496: 78 2d 37 2c 39 0d 8e 0f 05 00 01 1b 00 05 62 6f x-7,9.........bo +| 2512: 78 2d 37 2c 38 0d 8d 2b 05 00 01 1b 00 05 62 6f x-7,8..+......bo +| 2528: 78 2d 37 2c 37 0d 8c 47 05 00 01 1b 00 05 62 6f x-7,7..G......bo +| 2544: 78 2d 37 2c 36 0d 8b 63 05 00 01 1b 00 05 62 6f x-7,6..c......bo +| 2560: 78 2d 37 2c 35 0d 8a 7f 05 00 01 1b 00 05 62 6f x-7,5.........bo +| 2576: 78 2d 37 2c 34 0d 8a 1b 05 00 01 1b 00 05 62 6f x-7,4.........bo +| 2592: 78 2d 37 2c 33 0d 89 37 05 00 01 1b 00 05 62 6f x-7,3..7......bo +| 2608: 78 2d 37 2c 32 0d 88 53 05 00 01 1b 00 05 62 6f x-7,2..S......bo +| 2624: 78 2d 37 2c 31 0d 87 6f 05 00 01 1b 00 05 62 6f x-7,1..o......bo +| 2640: 78 2d 37 2c 30 0d 8e 72 05 00 01 1b 00 04 62 6f x-7,0..r......bo +| 2656: 78 2d 36 2c 39 0d 8e 0e 05 00 01 1b 00 05 62 6f x-6,9.........bo +| 2672: 78 2d 36 2c 38 0d 8d 2a 05 00 01 1b 00 05 62 6f x-6,8..*......bo +| 2688: 78 2d 36 2c 37 0d 8c 46 05 00 01 1b 00 05 62 6f x-6,7..F......bo +| 2704: 78 2d 36 2c 36 0d 8b 62 05 00 01 1b 00 05 62 6f x-6,6..b......bo +| 2720: 78 2d 36 2c 35 0d 8a 7e 05 00 01 1b 00 05 62 6f x-6,5..~......bo +| 2736: 78 2d 36 2c 34 0d 8a 1a 05 00 01 1b 00 05 62 6f x-6,4.........bo +| 2752: 78 2d 36 2c 33 0d 89 36 05 00 01 1b 00 05 62 6f x-6,3..6......bo +| 2768: 78 2d 36 2c 32 0d 88 52 05 00 01 1b 00 05 62 6f x-6,2..R......bo +| 2784: 78 2d 36 2c 31 0d 87 6e 05 00 01 1b 00 05 62 6f x-6,1..n......bo +| 2800: 78 2d 36 2c 30 0d 8e 71 05 00 01 1b 00 04 62 6f x-6,0..q......bo +| 2816: 78 2d 35 2c 39 0d 8e 0d 05 00 01 1b 00 05 62 6f x-5,9.........bo +| 2832: 78 2d 35 2c 38 0d 8d 29 05 00 01 1b 00 05 62 6f x-5,8..)......bo +| 2848: 78 2d 35 2c 37 0d 8c 45 05 00 01 1b 00 05 62 6f x-5,7..E......bo +| 2864: 78 2d 35 2c 36 0d 8b 61 05 00 01 1b 00 05 62 6f x-5,6..a......bo +| 2880: 78 2d 35 2c 35 0d 8a 7d 05 00 01 1b 00 05 62 6f x-5,5.........bo +| 2896: 78 2d 35 2c 34 0d 8a 19 05 00 01 1b 00 05 62 6f x-5,4.........bo +| 2912: 78 2d 35 2c 33 0d 89 35 05 00 01 1b 00 05 62 6f x-5,3..5......bo +| 2928: 78 2d 35 2c 32 0d 88 51 05 00 01 1b 00 05 62 6f x-5,2..Q......bo +| 2944: 78 2d 35 2c 31 0d 87 6d 05 00 01 1b 00 05 62 6f x-5,1..m......bo +| 2960: 78 2d 35 2c 30 0d 8e 70 05 00 01 1b 00 04 62 6f x-5,0..p......bo +| 2976: 78 2d 34 2c 39 0d 8e 0c 05 00 01 1b 00 04 62 6f x-4,9.........bo +| 2992: 78 2d 34 2c 38 0d 8d 28 05 00 01 1b 00 04 62 6f x-4,8..(......bo +| 3008: 78 2d 34 2c 37 0d 8c 44 05 00 01 1b 00 04 62 6f x-4,7..D......bo +| 3024: 78 2d 34 2c 36 0d 8b 60 05 00 01 1b 00 02 62 6f x-4,6..`......bo +| 3040: 78 2d 34 2c 35 0d 8a 7c 05 00 01 1b 00 02 62 6f x-4,5..|......bo +| 3056: 78 2d 34 2c 34 0d 8a 18 05 00 01 1b 00 02 62 6f x-4,4.........bo +| 3072: 78 2d 34 2c 33 0d 89 34 05 00 01 1b 00 02 62 6f x-4,3..4......bo +| 3088: 78 2d 34 2c 32 0d 88 50 05 00 01 1b 00 02 62 6f x-4,2..P......bo +| 3104: 78 2d 34 2c 31 0d 87 6c 05 00 01 1b 00 02 62 6f x-4,1..l......bo +| 3120: 78 2d 34 2c 30 0d 8e 6f 05 00 01 1b 00 04 62 6f x-4,0..o......bo +| 3136: 78 2d 33 2c 39 0d 8e 0b 05 00 01 1b 00 04 62 6f x-3,9.........bo +| 3152: 78 2d 33 2c 38 0d 8d 27 05 00 01 1b 00 04 62 6f x-3,8..'......bo +| 3168: 78 2d 33 2c 37 0d 87 68 05 00 01 1b 00 03 62 6f x-3,7..h......bo +| 3184: 78 2d 30 2c 30 06 90 d9 80 80 81 84 4c 05 00 01 x-0,0.......L... +| 3200: 00 00 03 0d 88 4c 05 00 01 1b 00 02 62 6f 78 2d .....L......box- +| 3216: 30 2c 31 0d 88 4d 05 00 01 1b 00 02 62 6f 78 2d 0,1..M......box- +| 3232: 31 2c 31 0d 88 4e 05 00 01 1b 00 02 62 6f 78 2d 1,1..N......box- +| 3248: 32 2c 31 17 01 05 00 01 2f 00 02 6c 6f 77 65 72 2,1...../..lower +| 3264: 2d 6c 65 66 74 20 63 6f 72 6e 65 72 0d 0d 26 00 -left corner..&. +| 3280: 09 00 01 00 00 04 0d 8c 43 05 00 01 1b 00 04 62 ........C......b +| 3296: 6f 78 2d 33 2c 36 0d 8b 5f 05 00 01 1b 00 02 62 ox-3,6.._......b +| 3312: 6f 78 2d 33 2c 35 0d 8a 7b 05 00 01 1b 00 02 62 ox-3,5.........b +| 3328: 6f 78 2d 33 2c 34 0d 8a 17 05 00 01 1b 00 02 62 ox-3,4.........b +| 3344: 6f 78 2d 33 2c 33 0d 89 33 05 00 01 1b 00 02 62 ox-3,3..3......b +| 3360: 6f 78 2d 33 2c 32 0d bc 00 06 00 09 0d 87 6b 05 ox-3,2........k. +| 3376: 00 01 1b 00 03 62 6f 78 2d 33 2c 30 0d 8e 6e 05 .....box-3,0..n. +| 3392: 00 01 1b 00 04 62 6f 78 2d 32 2c 39 0d 8e 0a 05 .....box-2,9.... +| 3408: 00 01 1b 00 04 62 6f 78 2d 32 2c 38 0d 8d 26 05 .....box-2,8..&. +| 3424: 00 01 1b 00 04 62 6f 78 2d 32 2c 37 0d 8c 42 05 .....box-2,7..B. +| 3440: 00 01 1b 00 04 62 6f 78 2d 32 2c 36 0d 8b 5e 05 .....box-2,6..^. +| 3456: 00 01 1b 00 02 62 6f 78 2d 32 2c 35 0d 8a 7a 05 .....box-2,5..z. +| 3472: 00 01 1b 00 02 62 6f 78 2d 32 2c 34 0d 8a 16 05 .....box-2,4.... +| 3488: 00 01 1b 00 02 62 6f 78 2d 32 2c 33 0d 89 32 05 .....box-2,3..2. +| 3504: 00 01 1b 00 02 62 6f 78 2d 32 2c 32 0e 52 00 06 .....box-2,2.R.. +| 3520: 00 09 0d 87 6a 05 00 01 1b 00 03 62 6f 78 2d 32 ....j......box-2 +| 3536: 2c 30 0d 8e 6d 05 00 01 1b 00 04 62 6f 78 2d 31 ,0..m......box-1 +| 3552: 2c 39 0d 8e 09 05 00 01 1b 00 04 62 6f 78 2d 31 ,9.........box-1 +| 3568: 2c 38 0d 8d 25 05 00 01 1b 00 04 62 6f 78 2d 31 ,8..%......box-1 +| 3584: 2c 37 0d 8c 41 05 00 01 1b 00 04 62 6f 78 2d 31 ,7..A......box-1 +| 3600: 2c 36 0d 8b 5d 05 00 01 1b 00 02 62 6f 78 2d 31 ,6..]......box-1 +| 3616: 2c 35 0d 8a 79 05 00 01 1b 00 02 62 6f 78 2d 31 ,5..y......box-1 +| 3632: 2c 34 0d 8a 15 05 00 01 1b 00 02 62 6f 78 2d 31 ,4.........box-1 +| 3648: 2c 33 0d 89 31 05 00 01 1b 00 02 62 6f 78 2d 31 ,3..1......box-1 +| 3664: 2c 32 0e e8 00 06 00 09 0d 87 69 05 00 01 1b 00 ,2........i..... +| 3680: 03 62 6f 78 2d 31 2c 30 0d 8e 6c 05 00 01 1b 00 .box-1,0..l..... +| 3696: 04 62 6f 78 2d 30 2c 39 0d 8e 08 05 00 01 1b 00 .box-0,9........ +| 3712: 04 62 6f 78 2d 30 2c 38 0d 8d 24 05 00 01 1b 00 .box-0,8..$..... +| 3728: 04 62 6f 78 2d 30 2c 37 0d 8c 40 05 00 01 1b 00 .box-0,7..@..... +| 3744: 04 62 6f 78 2d 30 2c 36 0d 8b 5c 05 00 01 1b 00 .box-0,6........ +| 3760: 02 62 6f 78 2d 30 2c 35 0d 8a 78 05 00 01 1b 00 .box-0,5..x..... +| 3776: 02 62 6f 78 2d 30 2c 34 0d 8a 14 05 00 01 1b 00 .box-0,4........ +| 3792: 02 62 6f 78 2d 30 2c 33 0d 89 30 05 00 01 1b 00 .box-0,3..0..... +| 3808: 02 62 6f 78 2d 30 2c 32 00 00 00 0f 00 09 1b 00 .box-0,2........ +| 3824: 62 6f 78 2d 30 2c 30 0d 0e 05 00 09 1d 00 74 6f box-0,0.......to +| 3840: 70 20 68 61 6c 66 10 0d 05 00 09 23 00 62 6f 74 p half.....#.bot +| 3856: 74 6f 6d 20 68 61 6c 66 0f 0c 02 05 09 01 00 72 tom half.......r +| 3872: 69 67 68 74 20 68 61 6c 66 0e 0b 05 00 09 1f 00 ight half....... +| 3888: 6c 65 66 74 20 68 61 6c 66 14 0a 05 00 09 2b 00 left half.....+. +| 3904: 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 0d the whole thing. +| 3920: 09 05 00 09 1d 00 74 6f 70 20 65 64 67 65 10 08 ......top edge.. +| 3936: 05 00 09 23 00 62 6f 74 74 6f 6d 20 65 64 67 65 ...#.bottom edge +| 3952: 0f 07 05 00 09 21 00 72 69 67 68 74 20 65 64 67 .....!.right edg +| 3968: 65 0e 06 05 00 09 1f 00 6c 65 66 74 20 65 64 67 e.......left edg +| 3984: 65 0b 05 05 00 09 19 00 63 65 6e 74 65 72 17 04 e.......center.. +| 4000: 05 00 09 31 00 75 70 70 65 72 2d 72 69 67 68 74 ...1.upper-right +| 4016: 20 63 6f 72 6e 65 72 17 03 05 00 09 31 00 6c 6f corner.....1.lo +| 4032: 77 65 72 2d 72 69 67 68 74 20 63 6f 72 6e 65 72 wer-right corner +| 4048: 16 02 05 00 09 2f 00 75 70 70 65 72 2d 6c 65 66 ...../.upper-lef +| 4064: 74 20 63 6f 72 6e 65 72 06 00 05 00 01 00 00 03 t corner........ +| 4080: 0d 88 4f 05 00 01 1b 00 02 62 6f 78 2d 33 2c 31 ..O......box-3,1 +| page 3 offset 8192 +| 0: 05 00 00 00 01 0f fb 00 00 00 00 06 0f fb 00 00 ................ +| 384: 00 00 00 00 00 00 00 89 50 03 04 00 93 24 00 00 ........P....$.. +| 400: 00 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 688: 00 00 00 00 42 c8 00 00 42 4c 00 00 42 00 00 00 ....B...BL..B... +| 720: 03 eb 40 40 00 00 40 80 00 00 00 00 00 00 3f 80 ..@@..@.......?. +| 736: 00 00 00 00 00 00 00 00 03 ea 40 00 00 00 40 40 ..........@...@@ +| 752: 00 00 00 00 00 00 3f 80 00 00 00 00 00 00 00 00 ......?......... +| 768: 03 e9 3f 80 00 00 40 00 00 00 00 00 00 00 3f 80 ..?...@.......?. +| 784: 00 00 00 00 00 00 00 00 03 e8 00 00 00 00 3f 80 ..............?. +| 800: 00 00 00 00 00 00 3f 80 00 00 00 00 00 00 00 00 ......?......... +| 1616: 00 00 00 00 00 00 00 00 00 00 89 50 02 04 00 93 ...........P.... +| 1632: 24 00 00 00 33 00 00 00 00 00 00 00 01 00 00 00 $...3........... +| 1648: 00 41 20 00 00 00 00 00 00 41 0e 00 00 00 00 00 .A ......A...... +| 1664: 00 00 00 04 4f 40 40 00 00 40 80 00 00 3f 80 00 ....O@@..@...?.. +| 1680: 00 40 00 00 00 00 00 00 00 00 00 04 4e 40 00 00 .@..........N@.. +| 1696: 00 40 40 00 00 3f 80 00 00 40 00 00 00 00 00 00 .@@..?...@...... +| 1712: 00 00 00 04 4d 3f 80 00 00 40 00 00 00 3f 80 00 ....M?...@...?.. +| 1728: 00 40 00 00 00 00 00 00 00 00 00 04 4c 00 00 00 .@..........L... +| 1744: 00 3f 80 00 00 3f 80 00 00 40 00 00 00 00 00 00 .?...?...@...... +| 1760: 00 00 00 04 b3 40 40 00 00 40 80 00 00 40 00 00 .....@@..@...@.. +| 1776: 00 40 40 00 00 00 00 00 00 00 00 04 b2 40 00 00 .@@..........@.. +| 1792: 00 40 40 00 00 40 00 00 00 40 40 00 00 00 00 00 .@@..@...@@..... +| 1808: 00 00 00 04 b1 3f 80 00 00 40 00 00 00 40 00 00 .....?...@...@.. +| 1824: 00 40 40 00 00 00 00 00 00 00 00 04 b0 00 00 00 .@@............. +| 1840: 00 3f 80 00 00 40 00 00 00 40 40 00 00 00 00 00 .?...@...@@..... +| 1856: 00 00 00 05 17 40 40 00 00 40 80 00 00 40 40 00 .....@@..@...@@. +| 1872: 00 40 80 00 00 00 00 00 00 00 00 05 16 40 00 00 .@...........@.. +| 1888: 00 40 40 00 00 40 40 00 00 40 80 00 00 00 00 00 .@@..@@..@...... +| 1904: 00 00 00 05 15 3f 80 00 00 40 00 00 00 40 40 00 .....?...@...@@. +| 1920: 00 40 80 00 00 00 00 00 00 00 00 05 14 00 00 00 .@.............. +| 1936: 00 3f 80 00 00 40 40 00 00 40 80 00 00 00 00 00 .?...@@..@...... +| 1952: 00 00 00 05 7b 40 40 00 00 40 80 00 00 40 80 00 .....@@..@...@.. +| 1968: 00 40 a0 00 00 00 00 00 00 00 00 05 7a 40 00 00 .@..........z@.. +| 1984: 00 40 40 00 00 40 80 00 00 40 a0 00 00 00 00 00 .@@..@...@...... +| 2000: 00 00 00 05 79 3f 80 00 00 40 00 00 00 40 80 00 ....y?...@...@.. +| 2016: 00 40 a0 00 00 00 00 00 00 00 00 05 78 00 00 00 .@..........x... +| 2032: 00 3f 80 00 00 40 80 00 00 40 a0 00 00 00 00 00 .?...@...@...... +| 2048: 00 00 00 05 df 40 40 00 00 40 80 00 00 40 a0 00 .....@@..@...@.. +| 2064: 00 40 c0 00 00 00 00 00 00 00 00 05 de 40 00 00 .@...........@.. +| 2080: 00 40 40 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .@@..@...@...... +| 2096: 00 00 00 05 dd 3f 80 00 00 40 00 00 00 40 a0 00 .....?...@...@.. +| 2112: 00 40 c0 00 00 00 00 00 00 00 00 05 dc 00 00 00 .@.............. +| 2128: 00 3f 80 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .?...@...@...... +| 2144: 00 00 00 06 43 40 40 00 00 40 80 00 00 40 c0 00 ....C@@..@...@.. +| 2160: 00 40 e0 00 00 00 00 00 00 00 00 06 42 40 00 00 .@..........B@.. +| 2176: 00 40 40 00 00 40 c0 00 00 40 e0 00 00 00 00 00 .@@..@...@...... +| 2192: 00 00 00 06 41 3f 80 00 00 40 00 00 00 40 c0 00 ....A?...@...@.. +| 2208: 00 40 e0 00 00 00 00 00 00 00 00 06 40 00 00 00 .@..........@... +| 2224: 00 3f 80 00 00 40 c0 00 00 40 e0 00 00 00 00 00 .?...@...@...... +| 2240: 00 00 00 06 a7 40 40 00 00 40 80 00 00 40 e0 00 .....@@..@...@.. +| 2256: 00 41 00 00 00 00 00 00 00 00 00 06 a6 40 00 00 .A...........@.. +| 2272: 00 40 40 00 00 40 e0 00 00 41 00 00 00 00 00 00 .@@..@...A...... +| 2288: 00 00 00 06 a5 3f 80 00 00 40 00 00 00 40 e0 00 .....?...@...@.. +| 2304: 00 41 00 00 00 00 00 00 00 00 00 06 a4 00 00 00 .A.............. +| 2320: 00 3f 80 00 00 40 e0 00 00 41 00 00 00 00 00 00 .?...@...A...... +| 2336: 00 00 00 07 0a 40 00 00 00 40 40 00 00 41 00 00 .....@...@@..A.. +| 2352: 00 41 10 00 00 00 00 00 00 00 00 07 09 3f 80 00 .A...........?.. +| 2368: 00 40 00 00 00 41 00 00 00 41 10 00 00 00 00 00 .@...A...A...... +| 2384: 00 00 00 07 08 00 00 00 00 3f 80 00 00 41 00 00 .........?...A.. +| 2400: 00 41 10 00 00 00 00 00 00 00 00 07 6e 40 00 00 .A..........n@.. +| 2416: 00 40 40 00 00 41 10 00 00 41 20 00 00 00 00 00 .@@..A...A ..... +| 2432: 00 00 00 07 6d 3f 80 00 00 40 00 00 00 41 10 00 ....m?...@...A.. +| 2448: 00 41 20 00 00 00 00 00 00 00 00 07 6c 00 00 00 .A .........l... +| 2464: 00 3f 80 00 00 41 10 00 00 41 20 00 00 00 00 00 .?...A...A ..... +| 2480: 00 00 00 07 0b 40 40 00 00 40 80 00 00 41 00 00 .....@@..@...A.. +| 2496: 00 41 10 00 00 00 00 00 00 00 00 07 6f 40 40 00 .A..........o@@. +| 2512: 00 40 80 00 00 41 10 00 00 41 20 00 00 00 00 00 .@...A...A ..... +| 2528: 00 00 00 03 ec 40 80 00 00 40 a0 00 00 00 00 00 .....@...@...... +| 2544: 00 3f 80 00 00 00 00 00 00 00 00 04 50 40 80 00 .?..........P@.. +| 2560: 00 40 a0 00 00 3f 80 00 00 40 00 00 00 00 00 00 .@...?...@...... +| 2576: 00 00 00 04 b4 40 80 00 00 40 a0 00 00 40 00 00 .....@...@...@.. +| 2592: 00 40 40 00 00 00 00 00 00 00 00 05 18 40 80 00 .@@..........@.. +| 2608: 00 40 a0 00 00 40 40 00 00 40 80 00 00 00 00 00 .@...@@..@...... +| 2624: 00 00 00 05 7c 40 80 00 00 40 a0 00 00 40 80 00 ....|@...@...@.. +| 2640: 00 40 a0 00 00 00 00 00 00 00 00 05 e0 40 80 00 .@...........@.. +| 2656: 00 40 a0 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .@...@...@...... +| 2672: 00 00 00 06 44 40 80 00 00 40 a0 00 00 40 c0 00 ....D@...@...@.. +| 2688: 00 40 e0 00 00 00 00 00 00 00 00 06 a8 40 80 00 .@...........@.. +| 2704: 00 40 a0 00 00 40 e0 00 00 41 00 00 00 00 00 00 .@...@...A...... +| 2720: 00 00 00 07 0c 40 80 00 00 40 a0 00 00 41 00 00 .....@...@...A.. +| 2736: 00 41 10 00 00 00 00 00 00 00 00 07 70 40 80 00 .A..........p@.. +| 2752: 00 40 a0 00 00 41 10 00 00 41 20 00 00 00 00 00 .@...A...A ..... +| 2768: 00 00 00 03 ed 40 a0 00 00 40 c0 00 00 00 00 00 .....@...@...... +| 2784: 00 3f 80 00 00 00 00 00 00 00 00 04 51 40 a0 00 .?..........Q@.. +| 2800: 00 40 c0 00 00 3f 80 00 00 40 00 00 00 00 00 00 .@...?...@...... +| 2816: 00 00 00 04 b5 40 a0 00 00 40 c0 00 00 40 00 00 .....@...@...@.. +| 2832: 00 40 40 00 00 00 00 00 00 00 00 05 19 40 a0 00 .@@..........@.. +| 2848: 00 40 c0 00 00 40 40 00 00 40 80 00 00 89 50 01 .@...@@..@....P. +| 2864: 04 00 93 24 00 01 00 02 00 00 00 00 00 00 00 03 ...$............ +| 2880: 00 00 00 00 40 80 00 00 00 00 00 00 3f 80 00 00 ....@.......?... +| 2896: 00 00 00 00 00 00 00 02 00 00 00 00 41 20 00 00 ............A .. +| 2912: 00 00 00 00 41 20 00 00 00 00 00 00 00 00 00 00 ....A .......... +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 03 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 03 01 87 00 0b 2d 06 5a 01 87 00 00 .........-.Z.... +| 384: 00 00 00 00 00 00 00 89 50 03 04 00 93 24 00 00 ........P....$.. +| 400: 00 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 688: 00 00 00 00 42 c8 00 00 42 4c 00 00 42 00 00 00 ....B...BL..B... +| 720: 03 eb 40 40 00 00 40 80 00 00 00 00 00 00 3f 80 ..@@..@.......?. +| 736: 00 00 00 00 00 00 00 00 03 ea 40 00 00 00 40 40 ..........@...@@ +| 752: 00 00 00 00 00 00 3f 80 00 00 00 00 00 00 00 00 ......?......... +| 768: 03 e9 3f 80 00 00 40 00 00 00 00 00 00 00 3f 80 ..?...@.......?. +| 784: 00 00 00 00 00 00 00 00 03 e8 00 00 00 00 3f 80 ..............?. +| 800: 00 00 00 00 00 00 3f 80 00 00 00 00 00 00 00 00 ......?......... +| 1616: 00 00 00 00 00 00 00 00 00 00 89 50 02 04 00 93 ...........P.... +| 1632: 24 00 00 00 2d 00 00 00 00 00 00 04 4c 00 00 00 $...-.......L... +| 1648: 00 3f 80 00 00 3f 80 00 00 40 00 00 00 00 00 00 .?...?...@...... +| 1664: 00 00 00 04 b0 00 00 00 00 3f 80 00 00 40 00 00 .........?...@.. +| 1680: 00 40 40 00 00 00 00 00 00 00 00 05 14 00 00 00 .@@............. +| 1696: 00 3f 80 00 00 40 40 00 00 40 80 00 00 00 00 00 .?...@@..@...... +| 1712: 00 00 00 05 78 00 00 00 00 3f 80 00 00 40 80 00 ....x....?...@.. +| 1728: 00 40 a0 00 00 00 00 00 00 00 00 05 dc 00 00 00 .@.............. +| 1744: 00 3f 80 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .?...@...@...... +| 1760: 00 00 00 00 01 00 00 00 00 41 20 00 00 00 00 00 .........A ..... +| 1776: 00 41 0e 00 00 00 00 00 00 00 00 04 4d 3f 80 00 .A..........M?.. +| 1792: 00 40 00 00 00 3f 80 00 00 40 00 00 00 00 00 00 .@...?...@...... +| 1808: 00 00 00 04 b1 3f 80 00 00 40 00 00 00 40 00 00 .....?...@...@.. +| 1824: 00 40 40 00 00 00 00 00 00 00 00 05 15 3f 80 00 .@@..........?.. +| 1840: 00 40 00 00 00 40 40 00 00 40 80 00 00 00 00 00 .@...@@..@...... +| 1856: 00 00 00 05 79 3f 80 00 00 40 00 00 00 40 80 00 ....y?...@...@.. +| 1872: 00 40 a0 00 00 00 00 00 00 00 00 05 dd 3f 80 00 .@...........?.. +| 1888: 00 40 00 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .@...@...@...... +| 1904: 00 00 00 04 4e 40 00 00 00 40 40 00 00 3f 80 00 ....N@...@@..?.. +| 1920: 00 40 00 00 00 00 00 00 00 00 00 04 b2 40 00 00 .@...........@.. +| 1936: 00 40 40 00 00 40 00 00 00 40 40 00 00 00 00 00 .@@..@...@@..... +| 1952: 00 00 00 05 16 40 00 00 00 40 40 00 00 40 40 00 .....@...@@..@@. +| 1968: 00 40 80 00 00 00 00 00 00 00 00 05 7a 40 00 00 .@..........z@.. +| 1984: 00 40 40 00 00 40 80 00 00 40 a0 00 00 00 00 00 .@@..@...@...... +| 2000: 00 00 00 05 de 40 00 00 00 40 40 00 00 40 a0 00 .....@...@@..@.. +| 2016: 00 40 c0 00 00 00 00 00 00 00 00 04 4f 40 40 00 .@..........O@@. +| 2032: 00 40 80 00 00 3f 80 00 00 40 00 00 00 00 00 00 .@...?...@...... +| 2048: 00 00 00 04 b3 40 40 00 00 40 80 00 00 40 00 00 .....@@..@...@.. +| 2064: 00 40 40 00 00 00 00 00 00 00 00 05 17 40 40 00 .@@..........@@. +| 2080: 00 40 80 00 00 40 40 00 00 40 80 00 00 00 00 00 .@...@@..@...... +| 2096: 00 00 00 05 7b 40 40 00 00 40 80 00 00 40 80 00 .....@@..@...@.. +| 2112: 00 40 a0 00 00 00 00 00 00 00 00 05 df 40 40 00 .@...........@@. +| 2128: 00 40 80 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .@...@...@...... +| 2144: 00 00 00 03 ec 40 80 00 00 40 a0 00 00 00 00 00 .....@...@...... +| 2160: 00 3f 80 00 00 00 00 00 00 00 00 04 50 40 80 00 .?..........P@.. +| 2176: 00 40 a0 00 00 3f 80 00 00 40 00 00 00 00 00 00 .@...?...@...... +| 2192: 00 00 00 04 b4 40 80 00 00 40 a0 00 00 40 00 00 .....@...@...@.. +| 2208: 00 40 40 00 00 00 00 00 00 00 00 05 18 40 80 00 .@@..........@.. +| 2224: 00 40 a0 00 00 40 40 00 00 40 80 00 00 00 00 00 .@...@@..@...... +| 2240: 00 00 00 05 7c 40 80 00 00 40 a0 00 00 40 80 00 ....|@...@...@.. +| 2256: 00 40 a0 00 00 00 00 00 00 00 00 05 e0 40 80 00 .@...........@.. +| 2272: 00 40 a0 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .@...@...@...... +| 2288: 00 00 00 03 f0 41 00 00 00 41 10 00 00 00 00 00 .....A...A...... +| 2304: 00 3f 80 00 00 00 00 00 00 00 00 04 54 41 00 00 .?..........TA.. +| 2320: 00 41 10 00 00 3f 80 00 00 40 00 00 00 00 00 00 .A...?...@...... +| 2336: 00 00 00 04 b8 41 00 00 00 41 10 00 00 40 00 00 .....A...A...@.. +| 2352: 00 40 40 00 00 00 00 00 00 00 00 05 1c 41 00 00 .@@..........A.. +| 2368: 00 41 10 00 00 40 40 00 00 40 80 00 00 00 00 00 .A...@@..@...... +| 2384: 00 00 00 05 80 41 00 00 00 41 10 00 00 40 80 00 .....A...A...@.. +| 2400: 00 40 a0 00 00 00 00 00 00 00 00 05 e4 41 00 00 .@...........A.. +| 2416: 00 41 10 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .A...@...@...... +| 2432: 00 00 00 06 48 41 00 00 00 41 10 00 00 40 c0 00 ....HA...A...@.. +| 2448: 00 40 e0 00 00 00 00 00 00 00 00 06 ac 41 00 00 .@...........A.. +| 2464: 00 41 10 00 00 40 e0 00 00 41 00 00 00 00 00 00 .A...@...A...... +| 2480: 00 00 00 07 10 41 00 00 00 41 10 00 00 41 00 00 .....A...A...A.. +| 2496: 00 41 10 00 00 00 00 00 00 00 00 03 f1 41 10 00 .A...........A.. +| 2512: 00 41 20 00 00 00 00 00 00 3f 80 00 00 00 00 00 .A ......?...... +| 2528: 00 00 00 04 55 41 10 00 00 41 20 00 00 3f 80 00 ....UA...A ..?.. +| 2544: 00 40 00 00 00 00 00 00 00 00 00 04 b9 41 10 00 .@...........A.. +| 2560: 00 41 20 00 00 40 00 00 00 40 40 00 00 00 00 00 .A ..@...@@..... +| 2576: 00 00 00 05 1d 41 10 00 00 41 20 00 00 40 40 00 .....A...A ..@@. +| 2592: 00 40 80 00 00 00 00 00 00 00 00 05 81 41 10 00 .@...........A.. +| 2608: 00 41 20 00 00 40 80 00 00 40 a0 00 00 00 00 00 .A ..@...@...... +| 2624: 00 00 00 05 e5 41 10 00 00 41 20 00 00 40 a0 00 .....A...A ..@.. +| 2640: 00 40 c0 00 00 00 00 00 00 00 00 06 49 41 10 00 .@..........IA.. +| 2656: 00 41 20 00 00 40 c0 00 00 40 e0 00 00 00 00 00 .A ..@...@...... +| 2672: 00 00 00 06 ad 41 10 00 00 41 20 00 00 40 e0 00 .....A...A ..@.. +| 2688: 00 41 00 00 00 00 00 00 00 00 00 07 11 41 10 00 .A...........A.. +| 2704: 00 41 20 00 00 41 00 00 00 41 10 00 00 00 00 00 .A ..A...A...... +| 2848: 00 00 00 00 00 00 00 00 00 00 00 00 00 89 50 01 ..............P. +| 2864: 04 00 93 24 00 01 00 04 00 00 00 00 00 00 00 03 ...$............ +| 2880: 00 00 00 00 40 80 00 00 00 00 00 00 3f 80 00 00 ....@.......?... +| 2896: 00 00 00 00 00 00 00 02 00 00 00 00 41 20 00 00 ............A .. +| 2912: 00 00 00 00 41 10 00 00 00 00 00 00 00 00 00 04 ....A........... +| 2928: 00 00 00 00 41 20 00 00 40 c0 00 00 41 20 00 00 ....A ..@...A .. +| 2944: 00 00 00 00 00 00 00 05 40 a0 00 00 41 00 00 00 ........@...A... +| 2960: 00 00 00 00 41 20 00 00 00 00 00 00 00 00 00 00 ....A .......... +| page 6 offset 20480 +| 0: 0d 00 00 00 02 06 5a 00 0b 2d 06 5a 00 00 00 00 ......Z..-.Z.... +| 1616: 00 00 00 00 00 00 00 00 00 00 89 50 05 04 00 93 ...........P.... +| 1632: 24 00 00 00 1c 00 00 00 00 00 00 03 ed 40 a0 00 $............@.. +| 1648: 00 40 c0 00 00 00 00 00 00 3f 80 00 00 00 00 00 .@.......?...... +| 1664: 00 00 00 04 51 40 a0 00 00 40 c0 00 00 3f 80 00 ....Q@...@...?.. +| 1680: 00 40 00 00 00 00 00 00 00 00 00 04 b5 40 a0 00 .@...........@.. +| 1696: 00 40 c0 00 00 40 00 00 00 40 40 00 00 00 00 00 .@...@...@@..... +| 1712: 00 00 00 05 19 40 a0 00 00 40 c0 00 00 40 40 00 .....@...@...@@. +| 1728: 00 40 80 00 00 00 00 00 00 00 00 05 7d 40 a0 00 .@...........@.. +| 1744: 00 40 c0 00 00 40 80 00 00 40 a0 00 00 00 00 00 .@...@...@...... +| 1760: 00 00 00 05 e1 40 a0 00 00 40 c0 00 00 40 a0 00 .....@...@...@.. +| 1776: 00 40 c0 00 00 00 00 00 00 00 00 06 45 40 a0 00 .@..........E@.. +| 1792: 00 40 c0 00 00 40 c0 00 00 40 e0 00 00 00 00 00 .@...@...@...... +| 1808: 00 00 00 06 a9 40 a0 00 00 40 c0 00 00 40 e0 00 .....@...@...@.. +| 1824: 00 41 00 00 00 00 00 00 00 00 00 07 0d 40 a0 00 .A...........@.. +| 1840: 00 40 c0 00 00 41 00 00 00 41 10 00 00 00 00 00 .@...A...A...... +| 1856: 00 00 00 03 ee 40 c0 00 00 40 e0 00 00 00 00 00 .....@...@...... +| 1872: 00 3f 80 00 00 00 00 00 00 00 00 04 52 40 c0 00 .?..........R@.. +| 1888: 00 40 e0 00 00 3f 80 00 00 40 00 00 00 00 00 00 .@...?...@...... +| 1904: 00 00 00 04 b6 40 c0 00 00 40 e0 00 00 40 00 00 .....@...@...@.. +| 1920: 00 40 40 00 00 00 00 00 00 00 00 05 1a 40 c0 00 .@@..........@.. +| 1936: 00 40 e0 00 00 40 40 00 00 40 80 00 00 00 00 00 .@...@@..@...... +| 1952: 00 00 00 05 7e 40 c0 00 00 40 e0 00 00 40 80 00 ....~@...@...@.. +| 1968: 00 40 a0 00 00 00 00 00 00 00 00 05 e2 40 c0 00 .@...........@.. +| 1984: 00 40 e0 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .@...@...@...... +| 2000: 00 00 00 06 46 40 c0 00 00 40 e0 00 00 40 c0 00 ....F@...@...@.. +| 2016: 00 40 e0 00 00 00 00 00 00 00 00 06 aa 40 c0 00 .@...........@.. +| 2032: 00 40 e0 00 00 40 e0 00 00 41 00 00 00 00 00 00 .@...@...A...... +| 2048: 00 00 00 07 0e 40 c0 00 00 40 e0 00 00 41 00 00 .....@...@...A.. +| 2064: 00 41 10 00 00 00 00 00 00 00 00 03 ef 40 e0 00 .A...........@.. +| 2080: 00 41 00 00 00 00 00 00 00 3f 80 00 00 00 00 00 .A.......?...... +| 2096: 00 00 00 04 53 40 e0 00 00 41 00 00 00 3f 80 00 ....S@...A...?.. +| 2112: 00 40 00 00 00 00 00 00 00 00 00 04 b7 40 e0 00 .@...........@.. +| 2128: 00 41 00 00 00 40 00 00 00 40 40 00 00 00 00 00 .A...@...@@..... +| 2144: 00 00 00 05 1b 40 e0 00 00 41 00 00 00 40 40 00 .....@...A...@@. +| 2160: 00 40 80 00 00 00 00 00 00 00 00 05 7f 40 e0 00 .@...........@.. +| 2176: 00 41 00 00 00 40 80 00 00 40 a0 00 00 00 00 00 .A...@...@...... +| 2192: 00 00 00 05 e3 40 e0 00 00 41 00 00 00 40 a0 00 .....@...A...@.. +| 2208: 00 40 c0 00 00 00 00 00 00 00 00 06 47 40 e0 00 .@..........G@.. +| 2224: 00 41 00 00 00 40 c0 00 00 40 e0 00 00 00 00 00 .A...@...@...... +| 2240: 00 00 00 06 ab 40 e0 00 00 41 00 00 00 40 e0 00 .....@...A...@.. +| 2256: 00 41 00 00 00 00 00 00 00 00 00 07 0f 40 e0 00 .A...........@.. +| 2272: 00 41 00 00 00 41 00 00 00 41 10 00 00 00 00 00 .A...A...A...... +| 2288: 00 00 00 07 73 40 e0 00 00 41 00 00 00 41 10 00 ....s@...A...A.. +| 2304: 00 41 20 00 00 00 00 00 00 00 00 00 00 00 00 00 .A ............. +| 2848: 00 00 00 00 00 00 00 00 00 00 00 00 00 89 50 04 ..............P. +| 2864: 04 00 93 24 00 00 00 18 00 00 00 00 00 00 06 43 ...$...........C +| 2880: 40 40 00 00 40 80 00 00 40 c0 00 00 40 e0 00 00 @@..@...@...@... +| 2896: 00 00 00 00 00 00 06 42 40 00 00 00 40 40 00 00 .......B@...@@.. +| 2912: 40 c0 00 00 40 e0 00 00 00 00 00 00 00 00 06 41 @...@..........A +| 2928: 3f 80 00 00 40 00 00 00 40 c0 00 00 40 e0 00 00 ?...@...@...@... +| 2944: 00 00 00 00 00 00 06 40 00 00 00 00 3f 80 00 00 .......@....?... +| 2960: 40 c0 00 00 40 e0 00 00 00 00 00 00 00 00 06 44 @...@..........D +| 2976: 40 80 00 00 40 a0 00 00 40 c0 00 00 40 e0 00 00 @...@...@...@... +| 2992: 00 00 00 00 00 00 06 a7 40 40 00 00 40 80 00 00 ........@@..@... +| 3008: 40 e0 00 00 41 00 00 00 00 00 00 00 00 00 06 a6 @...A........... +| 3024: 40 00 00 00 40 40 00 00 40 e0 00 00 41 00 00 00 @...@@..@...A... +| 3040: 00 00 00 00 00 00 06 a5 3f 80 00 00 40 00 00 00 ........?...@... +| 3056: 40 e0 00 00 41 00 00 00 00 00 00 00 00 00 06 a4 @...A........... +| 3072: 00 00 00 00 3f 80 00 00 40 e0 00 00 41 00 00 00 ....?...@...A... +| 3088: 00 00 00 00 00 00 06 a8 40 80 00 00 40 a0 00 00 ........@...@... +| 3104: 40 e0 00 00 41 00 00 00 00 00 00 00 00 00 07 0a @...A........... +| 3120: 40 00 00 00 40 40 00 00 41 00 00 00 41 10 00 00 @...@@..A...A... +| 3136: 00 00 00 00 00 00 07 09 3f 80 00 00 40 00 00 00 ........?...@... +| 3152: 41 00 00 00 41 10 00 00 00 00 00 00 00 00 07 08 A...A........... +| 3168: 00 00 00 00 3f 80 00 00 41 00 00 00 41 10 00 00 ....?...A...A... +| 3184: 00 00 00 00 00 00 07 0b 40 40 00 00 40 80 00 00 ........@@..@... +| 3200: 41 00 00 00 41 10 00 00 00 00 00 00 00 00 07 0c A...A........... +| 3216: 40 80 00 00 40 a0 00 00 41 00 00 00 41 10 00 00 @...@...A...A... +| 3232: 00 00 00 00 00 00 07 6e 40 00 00 00 40 40 00 00 .......n@...@@.. +| 3248: 41 10 00 00 41 20 00 00 00 00 00 00 00 00 07 6d A...A .........m +| 3264: 3f 80 00 00 40 00 00 00 41 10 00 00 41 20 00 00 ?...@...A...A .. +| 3280: 00 00 00 00 00 00 07 6c 00 00 00 00 3f 80 00 00 .......l....?... +| 3296: 41 10 00 00 41 20 00 00 00 00 00 00 00 00 07 6f A...A .........o +| 3312: 40 40 00 00 40 80 00 00 41 10 00 00 41 20 00 00 @@..@...A...A .. +| 3328: 00 00 00 00 00 00 07 70 40 80 00 00 40 a0 00 00 .......p@...@... +| 3344: 41 10 00 00 41 20 00 00 00 00 00 00 00 00 07 71 A...A .........q +| 3360: 40 a0 00 00 40 c0 00 00 41 10 00 00 41 20 00 00 @...@...A...A .. +| 3376: 00 00 00 00 00 00 07 72 40 c0 00 00 40 e0 00 00 .......r@...@... +| 3392: 41 10 00 00 41 20 00 00 00 00 00 00 00 00 07 74 A...A .........t +| 3408: 41 00 00 00 41 10 00 00 41 10 00 00 41 20 00 00 A...A...A...A .. +| 3424: 00 00 00 00 00 00 07 75 41 10 00 00 41 20 00 00 .......uA...A .. +| 3440: 41 10 00 00 41 20 00 00 00 00 00 00 00 00 00 00 A...A .......... +| end c1b.db + }] + catchsql { + SELECT rtreecheck('t1'); + } +} {1 {SQL logic error}} + +do_test rtreefuzz001-200 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 16384 pagesize 4096 filename c3.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 04 .....@ ........ +| 32: 00 00 00 00 01 00 00 00 00 00 00 04 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 04 0e 9c 00 0f ad 0f 4f ...............O +| 112: 0e fc 0e 9c 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3728: 00 00 00 00 00 00 00 00 00 00 00 00 5e 04 07 17 ............^... +| 3744: 1f 1f 01 81 0b 74 61 62 6c 65 74 31 5f 70 61 72 .....tablet1_par +| 3760: 65 6e 74 74 31 5f 70 61 72 65 6e 74 04 43 52 45 entt1_parent.CRE +| 3776: 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 70 61 ATE TABLE .t1_pa +| 3792: 72 65 6e 74 22 28 6e 6f 64 65 6e 6f 20 49 4e 54 rent.(nodeno INT +| 3808: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3824: 2c 70 61 72 65 6e 74 6e 6f 64 65 29 51 03 06 17 ,parentnode)Q... +| 3840: 1b 1b 01 7b 74 61 62 6c 65 74 31 5f 6e 6f 64 65 ....tablet1_node +| 3856: 74 31 5f 6e 6f 64 65 03 43 52 45 41 54 45 20 54 t1_node.CREATE T +| 3872: 41 42 4c 45 20 22 74 31 5f 6e 6f 64 65 22 28 6e ABLE .t1_node.(n +| 3888: 6f 64 65 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 odeno INTEGER PR +| 3904: 49 4d 41 52 59 20 4b 45 59 2c 64 61 74 61 29 5c IMARY KEY,data). +| 3920: 02 07 17 1d 1d 01 81 0b 74 61 62 6c 65 74 31 5f ........tablet1_ +| 3936: 72 6f 77 69 64 74 31 5f 72 6f 77 69 64 02 43 52 rowidt1_rowid.CR +| 3952: 45 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 72 EATE TABLE .t1_r +| 3968: 6f 77 69 64 22 28 72 6f 77 69 64 20 49 4e 54 45 owid.(rowid INTE +| 3984: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY, +| 4000: 6e 6f 64 65 6e 6f 2c 61 30 2c 61 31 29 51 01 07 nodeno,a0,a1)Q.. +| 4016: 17 11 11 08 81 0f 74 61 62 6c 65 74 31 74 31 43 ......tablet1t1C +| 4032: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 4048: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 72 74 72 BLE t1 USING rtr +| 4064: 65 65 28 69 64 2c 78 30 2c 78 31 2c 79 30 2c 79 ee(id,x0,x1,y0,y +| 4080: 31 2c 2b 6c 61 62 65 6c 2c 2b 6f 74 68 65 72 29 1,+label,+other) +| page 2 offset 4096 +| 0: 0d 00 00 00 0e 0e f7 00 0f e8 0f d0 0f b7 0f 9e ................ +| 16: 0f 91 0f 81 0f 70 0f 5e 0f 4f 0f 39 0f 29 0f 18 .....p.^.O.9.).. +| 32: 0f 06 0e f7 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3824: 00 00 00 00 00 00 00 0d 0e 05 00 09 1d 00 74 6f ..............to +| 3840: 70 20 68 61 6c 66 10 0d 05 00 09 23 00 62 6f 74 p half.....#.bot +| 3856: 74 6f 6d 20 68 61 6c 66 0f 0c 05 00 09 21 00 72 tom half.....!.r +| 3872: 69 67 68 74 20 68 61 6c 66 0e 0b 05 00 09 1f 00 ight half....... +| 3888: 6c 65 66 74 20 68 61 6c 66 14 0a 05 00 09 2b 00 left half.....+. +| 3904: 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 0d the whole thing. +| 3920: 09 05 00 09 1d 00 74 6f 70 20 65 64 67 65 10 08 ......top edge.. +| 3936: 05 00 09 23 00 62 6f 74 74 6f 6d 20 65 64 67 65 ...#.bottom edge +| 3952: 0f 07 05 00 09 21 00 72 69 67 68 74 20 65 64 67 .....!.right edg +| 3968: 65 0e 06 05 00 09 1f 00 6c 65 66 74 20 65 64 67 e.......left edg +| 3984: 65 0b 05 05 00 09 19 00 63 65 6e 74 65 72 17 04 e.......center.. +| 4000: 05 00 09 31 00 75 70 70 65 72 2d 72 69 67 68 74 ...1.upper-right +| 4016: 20 63 6f 72 6e 65 72 17 03 05 00 09 31 00 6c 6f corner.....1.lo +| 4032: 77 65 72 2d 72 69 67 68 74 27 60 f6 32 6e 65 72 wer-right'`.2ner +| 4048: 16 02 05 00 09 2f 00 75 70 70 65 72 2d 6c 65 66 ...../.upper-lef +| 4064: 74 20 63 6f 72 6e 65 72 16 01 05 00 09 2f 00 6c t corner...../.l +| 4080: 6f 77 65 72 2d 6c 65 66 74 20 63 6f 72 6e 65 72 ower-left corner +| page 3 offset 8192 +| 0: 0d 00 00 00 02 0b 2d 00 0b 2d 00 00 00 00 00 00 ......-..-...... +| 2848: 00 00 00 00 00 00 00 00 00 00 00 00 00 89 50 01 ..............P. +| 2864: 04 00 93 24 00 00 00 0e 00 00 00 00 00 00 00 01 ...$............ +| 2880: 00 00 00 00 41 20 00 00 00 00 00 00 41 20 01 00 ....A ......A .. +| 2896: 00 00 00 00 00 00 00 02 00 00 00 00 41 00 00 04 ............A... +| 2912: 2b 40 00 0c 42 c8 00 00 00 00 00 00 00 00 00 03 +@..B........... +| 2928: 42 b4 00 00 42 c8 00 00 00 00 00 00 41 20 00 00 B...B.......A .. +| 2944: 00 00 00 00 00 00 00 04 42 b4 00 00 42 c8 00 00 ........B...B... +| 2960: 42 b4 00 00 42 c8 00 00 00 00 00 00 00 00 00 05 B...B........... +| 2976: 42 20 00 00 42 70 00 00 42 20 00 00 42 70 00 00 B ..Bp..B ..Bp.. +| 2992: 00 00 00 00 00 00 00 60 00 00 00 04 0a 00 00 00 .......`........ +| 3008: 00 00 00 42 c8 00 00 00 00 00 00 00 00 00 07 42 ...B...........B +| 3024: be 00 00 42 c8 00 00 00 00 00 00 42 c8 00 00 00 ...B.......B.... +| 3040: 00 00 00 00 00 00 08 00 00 00 00 42 c8 00 00 00 ...........B.... +| 3056: 00 00 00 40 a0 00 00 00 00 00 00 00 00 00 09 00 ...@............ +| 3072: 00 00 00 42 c8 00 00 42 be 00 00 42 c8 00 00 00 ...B...B...B.... +| 3088: 00 00 00 00 00 00 0a 00 00 00 00 42 c8 00 00 00 ...........B.... +| 3104: 00 00 00 42 c8 00 00 00 00 00 00 00 00 00 0b 00 ...B............ +| 3120: 00 00 00 42 48 00 00 00 00 00 04 2c 80 00 00 00 ...BH......,.... +| 3136: 00 00 00 00 00 00 c4 24 c0 00 04 2c 80 00 00 00 .......$...,.... +| 3152: 00 00 04 2c 80 00 00 00 00 00 00 00 00 00 d0 00 ...,............ +| 3168: 00 00 04 2c 80 00 00 00 00 00 04 24 80 00 00 00 ...,.......$.... +| 3184: 00 00 00 00 00 00 e0 00 00 00 04 2c 80 00 04 24 ...........,...$ +| 3200: c0 00 04 2c 00 00 00 00 00 00 00 00 00 00 00 00 ...,............ +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| end c3.db + }] + catchsql { + WITH RECURSIVE + c1(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM c1 WHERE x<99), + c2(y) AS (VALUES(0) UNION ALL SELECT y+1 FROM c2 WHERE y<99) + INSERT INTO t1(id, x0,x1,y0,y1,label) + SELECT 1000+x+y*100, x, x+1, y, y+1, printf('box-%d,%d',x,y) FROM c1, c2; + } +} {1 {database disk image is malformed}} +do_test rtreefuzz001-210 { + catchsql { + SELECT rtreecheck('t1'); + } +} {/1 .*corrupt.*/} + +do_test rtreefuzz001-300 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 16384 pagesize 4096 filename c4.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 04 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 04 ................ +| 96: 00 00 00 00 0d 00 00 00 04 0e 9c 00 0f ad 0f 4f ...............O +| 112: 0e fc 0e 9c 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3728: 00 00 00 00 00 00 00 00 00 00 00 00 5e 04 07 17 ............^... +| 3744: 1f 1f 01 81 0b 74 61 62 6c 65 74 31 5f 70 61 72 .....tablet1_par +| 3760: 65 6e 74 74 31 5f 70 61 72 65 6e 74 04 43 52 45 entt1_parent.CRE +| 3776: 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 70 61 ATE TABLE .t1_pa +| 3792: 72 65 6e 74 22 28 6e 6f 64 65 6e 6f 20 49 4e 54 rent.(nodeno INT +| 3808: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3824: 2c 70 61 72 65 6e 74 6e 6f 64 65 29 51 03 06 17 ,parentnode)Q... +| 3840: 1b 1b 01 7b 74 61 62 6c 65 74 31 5f 6e 6f 64 65 ....tablet1_node +| 3856: 74 31 5f 6e 6f 64 65 03 43 52 45 41 54 45 20 54 t1_node.CREATE T +| 3872: 41 42 4c 45 20 22 74 31 5f 6e 6f 64 65 22 28 6e ABLE .t1_node.(n +| 3888: 6f 64 65 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 odeno INTEGER PR +| 3904: 49 4d 41 52 59 20 4b 45 59 2c 64 61 74 61 29 5c IMARY KEY,data). +| 3920: 02 07 17 1d 1d 01 81 0b 74 61 62 6c 65 74 31 5f ........tablet1_ +| 3936: 72 6f 77 69 64 74 31 5f 72 6f 77 69 64 02 43 52 rowidt1_rowid.CR +| 3952: 45 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 72 EATE TABLE .t1_r +| 3968: 6f 77 69 64 22 28 72 6f 77 69 64 20 49 4e 54 45 owid.(rowid INTE +| 3984: 47 45 72 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GEr PRIMARY KEY, +| 4000: 6e 6f 64 65 6e 6f 2c 61 30 2c 61 31 29 51 01 07 nodeno,a0,a1)Q.. +| 4016: 17 11 11 08 81 0f 74 61 62 6c 65 74 31 74 31 43 ......tablet1t1C +| 4032: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 4048: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 72 74 72 BLE t1 USING rtr +| 4064: 65 65 28 69 64 2c 78 30 2c 78 31 2c 79 30 2c 79 ee(id,x0,x1,y0,y +| 4080: 31 2c 2b 6c 61 62 65 6c 2c 2b 6f 74 68 65 72 29 1,+label,+other) +| page 2 offset 4096 +| 0: 0d 00 00 00 0e 0e f7 00 0f e8 0f 00 fb 70 f9 e0 .............p.. +| 16: f9 10 f8 10 f7 00 f5 e0 f4 f0 f3 90 f2 90 f1 80 ................ +| 32: f0 60 ef 00 00 00 00 00 00 00 00 00 00 00 00 00 .`.............. +| 3824: 00 00 00 00 00 00 00 0d 0e 05 00 09 1d 00 74 6f ..............to +| 3840: 70 20 68 61 6c 66 10 0d 05 00 09 23 00 62 6f 74 p half.....#.bot +| 3856: 74 6f 6d 20 68 61 6c 66 0f 0c 05 00 09 21 00 72 tom half.....!.r +| 3872: 69 67 68 74 20 68 61 6c 66 0e 0b 05 00 09 1f 00 ight half....... +| 3888: 6c 65 66 74 20 68 61 6c 66 14 0a 05 00 09 2b 00 left half.....+. +| 3904: 00 03 98 20 49 98 2f 6c 62 05 74 68 69 6e 67 0d ... I./lb.thing. +| 3920: 09 05 00 09 1d 00 74 6f 70 20 65 64 67 65 10 08 ......top edge.. +| 3936: 05 00 09 23 00 62 6f 74 74 6f 6d 20 65 64 67 65 ...#.bottom edge +| 3952: 0f 07 05 00 09 21 00 72 69 67 68 74 20 65 64 67 .....!.right edg +| 3968: 65 0e 06 05 00 09 1f 00 6c 65 66 74 20 65 64 67 e.......left edg +| 3984: 65 0b 05 05 00 09 19 00 63 65 6e 74 65 72 17 04 e.......center.. +| 4000: 05 00 09 31 00 75 70 70 65 72 2d 72 69 67 68 74 ...1.upper-right +| 4016: 20 63 6f 72 6e 65 72 17 03 05 00 09 31 00 6c 6f corner.....1.lo +| 4032: 77 65 72 2d 72 69 67 68 74 20 63 6f 72 6e 65 72 wer-right corner +| 4048: 16 02 05 00 09 2f 00 75 70 70 65 72 2d 6c 65 66 ...../.upper-lef +| 4064: 74 20 63 6f 72 6e 65 72 16 01 05 00 09 2f 00 6c t corner...../.l +| 4080: 6f 77 65 72 2d 6c 65 66 74 20 63 6f 72 6e 65 72 ower-left corner +| page 3 offset 8192 +| 0: 0d 00 00 00 01 0b 2d 00 0b 2d 00 00 00 00 00 00 ......-..-...... +| 2848: 00 00 00 00 00 00 00 00 00 00 00 00 00 89 50 01 ..............P. +| 2864: 04 00 93 24 00 00 00 0e 00 00 00 00 00 00 00 01 ...$............ +| 2880: 00 00 00 04 01 20 00 00 00 00 00 04 12 00 00 00 ..... .......... +| 2896: 00 00 00 00 00 00 00 23 00 00 00 00 41 20 00 00 .......#....A .. +| 2912: 42 b4 00 00 42 c8 00 00 00 00 00 00 00 00 00 03 B...B........... +| 2928: 42 b4 00 00 42 c8 00 00 00 00 00 00 41 20 00 00 B...B.......A .. +| 2944: 00 00 00 00 00 00 00 04 42 b4 00 00 42 c8 00 00 ........B...B... +| 2960: 42 b4 00 00 42 c8 00 00 00 00 00 00 00 00 00 05 B...B........... +| 2976: 42 20 00 00 42 70 00 00 42 20 00 00 42 70 00 00 B ..Bp..B ..Bp.. +| 2992: 00 00 00 00 00 00 00 06 00 00 00 00 40 a0 00 00 ............@... +| 3008: 00 00 00 04 2c 80 00 00 00 00 00 00 00 00 00 74 ....,..........t +| 3024: 2b e0 00 04 2c 80 00 04 2c 80 00 00 00 00 00 00 +...,...,....... +| 3040: 00 00 00 80 00 00 00 04 2c 80 00 00 00 00 00 04 ........,....... +| 3056: 0a 00 00 00 00 00 b0 80 00 00 04 2c 80 00 04 2b ...........,...+ +| 3072: e0 00 04 2c 80 00 00 00 00 00 00 00 00 00 a0 00 ...,............ +| 3088: 00 00 04 2c 80 00 00 00 00 00 04 2c 80 00 00 00 ...,.......,.... +| 3104: 00 00 00 00 00 00 b0 00 00 00 04 24 80 00 00 00 ...........$.... +| 3120: 00 00 04 2c 80 00 00 00 00 00 00 00 50 00 91 f0 ...,........P... +| 3136: 06 c6 56 67 42 06 86 16 c6 61 40 a0 50 00 92 b0 ..VgB....a@.P... +| 3152: 07 46 86 52 07 76 86 f6 c6 52 07 46 86 96 e6 70 .F.R.v...R.F...p +| 3168: d0 90 50 00 91 d0 07 46 f7 02 06 56 46 76 51 00 ..P....F...VFvQ. +| 3184: 80 50 00 92 30 06 26 f7 47 46 f6 d2 06 56 46 76 .P..0.&.GF...VFv +| 3200: 50 f0 70 50 00 92 10 07 26 96 76 87 42 06 56 46 P.pP....&.v.B.VF +| 3216: 76 50 e0 60 50 00 91 f0 06 c6 56 67 42 06 56 46 vP.`P.....VgB.VF +| 3232: 76 50 b0 50 50 00 91 90 06 36 56 e7 46 57 21 70 vP.PP....6V.FW!p +| 3248: 40 50 00 93 10 07 57 07 06 57 22 d7 26 96 76 87 @P....W..W..&.v. +| 3264: 42 06 36 f7 26 e6 57 21 70 30 50 00 93 10 06 c6 B.6.&.W!p0P..... +| 3280: f7 76 57 22 d7 26 96 76 87 42 06 36 f7 26 e6 57 .vW..&.v.B.6.&.W +| 3296: 21 60 20 50 00 92 f0 07 57 07 06 57 22 d6 c6 56 !` P....W..W...V +| 3312: 60 00 00 c4 24 c0 00 04 2c 80 00 00 00 00 00 04 `...$...,....... +| 3328: 2c 80 00 00 00 00 00 00 00 00 00 d0 00 00 00 04 ,............... +| 3344: 2c 80 00 00 00 00 00 04 24 80 00 00 00 00 00 00 ,.......$....... +| 3360: 00 00 00 e0 00 00 00 04 2c 80 00 04 24 c0 00 04 ........,...$... +| 3376: 2c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,............... +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| end c4.db + }] + catchsql { + UPDATE t1 SET label='x'; + } +} {1 {rtree constraint failed: t1.(y0<=y1)}} +do_test rtreefuzz001-310 { + catchsql { + SELECT rtreecheck('t1'); + } +} {/1 .*corrupt.*/} + +do_test rtreefuzz001-400 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 16384 pagesize 4096 filename c7.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 04 .....@ ........ +| 32: 00 00 00 00 01 00 00 00 00 00 00 04 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 04 0e 9c 00 0f ad 0f 4f ...............O +| 112: 0e fc 0e 9c 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3728: 00 00 00 00 00 00 00 00 00 00 00 00 5e 04 07 17 ............^... +| 3744: 1f 1f 01 81 0b 74 61 62 6c 65 74 31 5f 70 61 72 .....tablet1_par +| 3760: 65 6e 74 74 31 5f 70 61 72 65 6e 74 04 43 52 45 entt1_parent.CRE +| 3776: 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 70 61 ATE TABLE .t1_pa +| 3792: 72 65 6e 74 22 28 6e 6f 64 65 6e 6f 20 49 4e 54 rent.(nodeno INT +| 3808: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3824: 2c 70 61 72 65 6e 74 6e 6f 64 65 29 51 03 06 17 ,parentnode)Q... +| 3840: 1b 1b 01 7b 74 61 62 6c 65 74 31 5f 6e 6f 64 65 ....tablet1_node +| 3856: 74 31 5f 6e 6f 64 65 03 43 52 45 41 54 45 20 54 t1_node.CREATE T +| 3872: 41 42 4c 45 20 22 74 31 5f 6e 6f 64 65 22 28 6e ABLE .t1_node.(n +| 3888: 6f 64 65 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 odeno INTEGER PR +| 3904: 49 4d 41 52 59 20 4b 45 59 2c 64 61 74 61 29 5c IMARY KEY,data). +| 3920: 02 07 17 1d 1d 01 81 0b 74 61 62 6c 65 74 31 5f ........tablet1_ +| 3936: 72 6f 77 69 64 74 31 5f 72 6f 77 69 64 02 43 52 rowidt1_rowid.CR +| 3952: 45 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 72 EATE TABLE .t1_r +| 3968: 6f 77 69 64 22 28 72 6f 77 69 64 20 49 4e 54 45 owid.(rowid INTE +| 3984: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY, +| 4000: 6e 6f 64 65 6e 6f 2c 61 30 2c 61 31 29 51 01 07 nodeno,a0,a1)Q.. +| 4016: 17 11 11 08 81 0f 74 61 62 6c 65 74 31 74 31 43 ......tablet1t1C +| 4032: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 4048: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 72 74 72 BLE t1 USING rtr +| 4064: 65 65 28 69 64 2c 78 30 2c 78 31 2c 79 30 2c 79 ee(id,x0,x1,y0,y +| 4080: 31 2c 2b 6c 61 62 65 6c 2c 2b 6f 74 68 65 72 29 1,+label,+other) +| page 2 offset 4096 +| 0: 0d 00 00 00 0e 0e f7 00 0f e8 0f d0 0f b7 0f 9e ................ +| 16: 0f 91 0f 81 0f 70 0f 5e 0f 4f 0f 39 0f 29 0f 18 .....p.^.O.9.).. +| 32: 0f 06 0e f7 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3824: 00 00 00 00 00 00 00 0d 0e 05 00 09 1d 00 74 6f ..............to +| 3840: 70 20 68 61 6c 66 10 0d 05 00 09 23 00 62 6f 74 p half.....#.bot +| 3856: 74 6f 6d 20 68 61 6c 66 0f 0c 05 00 09 21 00 72 tom half.....!.r +| 3872: 69 67 68 74 20 68 61 6c 66 0e 0b 05 00 09 1f 00 ight half....... +| 3888: 6c 65 66 74 20 68 61 6c 66 14 0a 05 00 09 2b 00 left half.....+. +| 3904: 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 0d the whole thing. +| 3920: 09 05 00 09 1d 00 74 6f 70 20 65 64 67 65 10 08 ......top edge.. +| 3936: 05 00 09 23 00 62 6f 74 74 6f 6d 20 65 64 67 65 ...#.bottom edge +| 3952: 0f 07 05 00 09 21 00 72 69 67 68 74 20 65 64 67 .....!.right edg +| 3968: 65 0e 06 05 00 09 1f 00 6c 65 66 74 20 65 64 67 e.......left edg +| 3984: 65 0b 05 05 00 09 19 00 23 65 6e 74 65 72 17 04 e.......#enter.. +| 4000: 05 00 09 31 00 75 70 70 65 72 2d 72 69 67 68 74 ...1.upper-right +| 4016: 20 63 6f 72 6e 65 72 17 03 05 00 09 31 00 6c 6f corner.....1.lo +| 4032: 77 65 72 2d 72 69 67 68 74 20 63 6f 72 6e 65 72 wer-right corner +| 4048: 16 02 05 00 09 2f 00 75 70 70 65 72 2d 6c 65 66 ...../.upper-lef +| 4064: 74 20 63 6f 72 6e 65 72 16 01 05 00 09 2f 00 6c t corner...../.l +| 4080: 6f 77 65 72 2d 6c 65 66 74 20 63 6f 72 6e 65 72 ower-left corner +| page 3 offset 8192 +| 0: 0d 00 00 00 02 0b 2d 00 0b 2d 00 00 00 00 00 00 ......-..-...... +| 2848: 00 00 00 00 00 00 00 00 00 00 00 00 00 89 50 01 ..............P. +| 2864: 04 00 93 24 00 00 00 00 00 00 00 00 08 00 00 00 ...$............ +| 2880: 00 42 c8 00 00 00 00 00 00 40 a0 00 00 00 00 00 .B.......@...... +| 2896: 00 00 00 00 42 c8 00 00 00 00 00 00 00 00 00 07 ....B........... +| 2912: 42 be 00 00 42 c8 00 00 00 00 00 00 42 c8 00 00 B...B.......B... +| 2928: 00 00 00 00 00 00 00 08 00 00 00 00 42 c8 00 00 ............B... +| 2944: 00 00 00 00 40 a0 00 00 00 00 00 00 00 00 00 09 ....@........... +| 2960: 00 00 00 00 42 c8 00 00 42 be 00 00 42 c8 00 00 ....B...B...B... +| 2976: 00 00 00 00 00 00 00 0a 00 00 00 00 42 c8 00 00 ............B... +| 2992: 00 00 00 00 42 c8 00 00 00 00 00 00 00 00 00 0b ....B........... +| 3008: 00 00 00 00 42 48 00 00 00 00 00 04 2c 80 00 00 ....BH......,... +| 3024: 00 00 00 00 00 00 00 c4 00 00 00 00 00 42 c8 00 .............B.. +| 3040: 00 00 00 00 00 00 00 00 07 42 be 00 00 42 c8 00 .........B...B.. +| 3056: 00 00 00 00 00 42 c8 00 00 00 00 00 00 00 00 00 .....B.......... +| 3072: 08 00 00 00 00 42 c8 00 00 00 00 00 00 40 a0 00 .....B.......@.. +| 3088: 00 00 00 00 00 00 00 00 09 00 00 00 00 42 c8 00 .............B.. +| 3104: 00 42 be 00 00 42 c8 00 00 00 00 00 00 00 00 00 .B...B.......... +| 3120: 0a 00 00 00 00 42 c8 00 00 00 00 00 00 42 c8 00 .....B.......B.. +| 3136: 00 00 00 00 00 00 00 00 0b 00 00 00 00 42 48 00 .............BH. +| 3152: 00 00 00 00 04 2c 80 00 00 00 00 00 00 00 00 00 .....,.......... +| 3168: c4 24 c0 00 04 2c 80 00 00 00 00 00 04 2c 80 00 .$...,.......,.. +| 3184: 00 00 00 00 00 00 00 00 d0 00 00 00 04 2c 80 00 .............,.. +| 3200: 00 00 00 00 04 24 80 00 00 00 00 00 00 00 00 00 .....$.......... +| 3216: e0 00 00 00 04 2c 80 00 04 24 c0 00 04 2c 00 00 .....,...$...,.. +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 0e 00 00 00 ................ +| 16: 00 42 c8 00 00 42 4c 00 00 42 c8 00 00 00 00 00 .B...BL..B...... +| 32: 00 00 00 0a 00 00 00 00 42 c8 00 00 00 00 00 00 ........B....... +| 48: 42 c8 00 00 00 00 00 00 00 00 00 0b 00 00 00 00 B............... +| 64: 42 48 00 00 00 00 00 04 2c 80 00 00 00 00 00 00 BH......,....... +| 80: 00 00 00 c4 24 c0 00 04 2c 80 00 00 00 00 00 04 ....$...,....... +| 96: 2c 80 00 00 00 00 00 00 00 00 00 d0 00 00 00 04 ,............... +| 112: 2c 80 00 00 00 00 00 04 24 80 00 00 00 00 00 00 ,.......$....... +| 128: 00 00 00 e0 00 00 00 04 2c 80 00 04 24 c0 00 04 ........,...$... +| 144: 2c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,............... +| end c7.db + }] + catchsql { + WITH RECURSIVE + c1(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM c1 WHERE x<8), + c2(y) AS (VALUES(0) UNION ALL SELECT y+1 FROM c2 WHERE y<5) + INSERT INTO t1(id, x0,x1,y0,y1,label) + SELECT 1000+x+y*100, x, x+1, y, y+1, printf('box-%d,%d',x,y) FROM c1, c2; + } +} {1 {database disk image is malformed}} + +finish_test diff --git a/sqlite/ext/session/changeset.c b/sqlite/ext/session/changeset.c index edb43ff8..72f2da41 100644 --- a/sqlite/ext/session/changeset.c +++ b/sqlite/ext/session/changeset.c @@ -42,7 +42,7 @@ static void usage(const char *argv0){ */ static void readFile(const char *zFilename, int *pSz, void **ppBuf){ FILE *f; - int sz; + sqlite3_int64 sz; void *pBuf; f = fopen(zFilename, "rb"); if( f==0 ){ @@ -50,9 +50,9 @@ static void readFile(const char *zFilename, int *pSz, void **ppBuf){ exit(1); } fseek(f, 0, SEEK_END); - sz = (int)ftell(f); + sz = ftell(f); rewind(f); - pBuf = sqlite3_malloc( sz ? sz : 1 ); + pBuf = sqlite3_malloc64( sz ? sz : 1 ); if( pBuf==0 ){ fprintf(stderr, "cannot allocate %d to hold content of \"%s\"\n", sz, zFilename); diff --git a/sqlite/ext/session/changesetfuzz.c b/sqlite/ext/session/changesetfuzz.c index fd887337..8cbca804 100644 --- a/sqlite/ext/session/changesetfuzz.c +++ b/sqlite/ext/session/changesetfuzz.c @@ -141,7 +141,7 @@ static void usage(const char *argv0){ */ static void fuzzReadFile(const char *zFilename, int *pSz, void **ppBuf){ FILE *f; - int sz; + sqlite3_int64 sz; void *pBuf; f = fopen(zFilename, "rb"); if( f==0 ){ @@ -149,9 +149,9 @@ static void fuzzReadFile(const char *zFilename, int *pSz, void **ppBuf){ exit(1); } fseek(f, 0, SEEK_END); - sz = (int)ftell(f); + sz = ftell(f); rewind(f); - pBuf = sqlite3_malloc( sz ? sz : 1 ); + pBuf = sqlite3_malloc64( sz ? sz : 1 ); if( pBuf==0 ){ fprintf(stderr, "cannot allocate %d to hold content of \"%s\"\n", sz, zFilename); @@ -340,8 +340,8 @@ struct FuzzChange { /* ** Allocate and return nByte bytes of zeroed memory. */ -static void *fuzzMalloc(int nByte){ - void *pRet = sqlite3_malloc(nByte); +static void *fuzzMalloc(sqlite3_int64 nByte){ + void *pRet = sqlite3_malloc64(nByte); if( pRet ){ memset(pRet, 0, nByte); } @@ -631,7 +631,7 @@ static int fuzzParseChangeset( /* If the table-header was successfully parsed, add the new change-group ** to the array and parse the associated changes. */ if( rc==SQLITE_OK ){ - FuzzChangesetGroup **apNew = (FuzzChangesetGroup**)sqlite3_realloc( + FuzzChangesetGroup **apNew = (FuzzChangesetGroup**)sqlite3_realloc64( pParse->apGroup, sizeof(FuzzChangesetGroup*)*(pParse->nGroup+1) ); if( apNew==0 ){ @@ -1214,7 +1214,7 @@ int main(int argc, char **argv){ fuzzPrintGroup(&changeset, changeset.apGroup[i]); } }else{ - pBuf = (u8*)fuzzMalloc(nChangeset*2 + 1024); + pBuf = (u8*)fuzzMalloc((sqlite3_int64)nChangeset*2 + 1024); if( pBuf==0 ){ rc = SQLITE_NOMEM; }else{ @@ -1237,4 +1237,3 @@ int main(int argc, char **argv){ return rc; } - diff --git a/sqlite/ext/session/session_speed_test.c b/sqlite/ext/session/session_speed_test.c index 14b97ea0..405001c6 100644 --- a/sqlite/ext/session/session_speed_test.c +++ b/sqlite/ext/session/session_speed_test.c @@ -356,5 +356,3 @@ int main(int argc, char **argv){ return 0; } - - diff --git a/sqlite/ext/session/sessionwor.test b/sqlite/ext/session/sessionwor.test index 2b2f8ca7..0f0b429d 100644 --- a/sqlite/ext/session/sessionwor.test +++ b/sqlite/ext/session/sessionwor.test @@ -30,27 +30,71 @@ proc test_reset {} { sqlite3 db2 test.db2 } - -do_execsql_test 1.0 { - CREATE TABLE t1(a PRIMARY KEY, b) WITHOUT ROWID; -} - -do_iterator_test 1.1 t1 { - INSERT INTO t1 VALUES('one', 'two'); +foreach {tn wo} { + 1 "" + 2 "WITHOUT ROWID" } { - {INSERT t1 0 X. {} {t one t two}} -} + reset_db -do_iterator_test 1.2 t1 { - UPDATE t1 SET b='three' -} { - {UPDATE t1 0 X. {t one t two} {{} {} t three}} + do_execsql_test 1.$tn.0 "CREATE TABLE t1(a PRIMARY KEY, b) $wo ;" + + do_iterator_test 1.$tn.1 t1 { + INSERT INTO t1 VALUES('one', 'two'); + } { + {INSERT t1 0 X. {} {t one t two}} + } + + do_iterator_test 1.$tn.2 t1 { + UPDATE t1 SET b='three' + } { + {UPDATE t1 0 X. {t one t two} {{} {} t three}} + } + + do_iterator_test 1.$tn.3 t1 { + REPLACE INTO t1 VALUES('one', 'four'); + } { + {UPDATE t1 0 X. {t one t three} {{} {} t four}} + } + + do_iterator_test 1.$tn.4 t1 { + DELETE FROM t1; + } { + {DELETE t1 0 X. {t one t four} {}} + } } -do_iterator_test 1.3 t1 { - DELETE FROM t1; +foreach {tn wo} { + 1 "" + 2 "WITHOUT ROWID" } { - {DELETE t1 0 X. {t one t three} {}} + reset_db + + do_execsql_test 2.$tn.0 "CREATE TABLE t1(a INTEGER PRIMARY KEY, b) $wo ;" + + do_iterator_test 1.1 t1 { + INSERT INTO t1 VALUES(1, 'two'); + } { + {INSERT t1 0 X. {} {i 1 t two}} + } + + do_iterator_test 2.$tn.2 t1 { + UPDATE t1 SET b='three' + } { + {UPDATE t1 0 X. {i 1 t two} {{} {} t three}} + } + + do_iterator_test 2.$tn.3 t1 { + REPLACE INTO t1 VALUES(1, 'four'); + } { + {UPDATE t1 0 X. {i 1 t three} {{} {} t four}} + } + + do_iterator_test 2.$tn.4 t1 { + DELETE FROM t1; + } { + {DELETE t1 0 X. {i 1 t four} {}} + } } finish_test + diff --git a/sqlite/ext/session/sqlite3session.c b/sqlite/ext/session/sqlite3session.c index df4323f3..6f722bab 100644 --- a/sqlite/ext/session/sqlite3session.c +++ b/sqlite/ext/session/sqlite3session.c @@ -363,7 +363,7 @@ static void sessionPutI64(u8 *aBuf, sqlite3_int64 i){ static int sessionSerializeValue( u8 *aBuf, /* If non-NULL, write serialized value here */ sqlite3_value *pValue, /* Value to serialize */ - int *pnWrite /* IN/OUT: Increment by bytes written */ + sqlite3_int64 *pnWrite /* IN/OUT: Increment by bytes written */ ){ int nByte; /* Size of serialized value in bytes */ @@ -904,7 +904,7 @@ static int sessionGrowHash(int bPatchset, SessionTable *pTab){ SessionChange **apNew; int nNew = (pTab->nChange ? pTab->nChange : 128) * 2; - apNew = (SessionChange **)sqlite3_malloc(sizeof(SessionChange *) * nNew); + apNew = (SessionChange **)sqlite3_malloc64(sizeof(SessionChange *) * nNew); if( apNew==0 ){ if( pTab->nChange==0 ){ return SQLITE_ERROR; @@ -970,7 +970,7 @@ static int sessionTableInfo( char *zPragma; sqlite3_stmt *pStmt; int rc; - int nByte; + sqlite3_int64 nByte; int nDbCol = 0; int nThis; int i; @@ -1013,7 +1013,7 @@ static int sessionTableInfo( if( rc==SQLITE_OK ){ nByte += nDbCol * (sizeof(const char *) + sizeof(u8) + 1); - pAlloc = sqlite3_malloc(nByte); + pAlloc = sqlite3_malloc64(nByte); if( pAlloc==0 ){ rc = SQLITE_NOMEM; } @@ -1154,7 +1154,7 @@ static void sessionPreupdateOneChange( int iHash; int bNull = 0; int rc = SQLITE_OK; - SessionStat1Ctx stat1 = {0}; + SessionStat1Ctx stat1 = {{0,0,0,0,0},0}; if( pSession->rc ) return; @@ -1211,7 +1211,7 @@ static void sessionPreupdateOneChange( ** this is an SQLITE_UPDATE or SQLITE_DELETE), or just the PK ** values (if this is an INSERT). */ SessionChange *pChange; /* New change object */ - int nByte; /* Number of bytes to allocate */ + sqlite3_int64 nByte; /* Number of bytes to allocate */ int i; /* Used to iterate through columns */ assert( rc==SQLITE_OK ); @@ -1236,7 +1236,7 @@ static void sessionPreupdateOneChange( } /* Allocate the change object */ - pChange = (SessionChange *)sqlite3_malloc(nByte); + pChange = (SessionChange *)sqlite3_malloc64(nByte); if( !pChange ){ rc = SQLITE_NOMEM; goto error_out; @@ -1680,7 +1680,7 @@ int sqlite3session_create( *ppSession = 0; /* Allocate and populate the new session object. */ - pNew = (sqlite3_session *)sqlite3_malloc(sizeof(sqlite3_session) + nDb + 1); + pNew = (sqlite3_session *)sqlite3_malloc64(sizeof(sqlite3_session) + nDb + 1); if( !pNew ) return SQLITE_NOMEM; memset(pNew, 0, sizeof(sqlite3_session)); pNew->db = db; @@ -1799,7 +1799,7 @@ int sqlite3session_attach( if( !pTab ){ /* Allocate new SessionTable object. */ - pTab = (SessionTable *)sqlite3_malloc(sizeof(SessionTable) + nName + 1); + pTab = (SessionTable *)sqlite3_malloc64(sizeof(SessionTable) + nName + 1); if( !pTab ){ rc = SQLITE_NOMEM; }else{ @@ -1859,7 +1859,7 @@ static int sessionBufferGrow(SessionBuffer *p, int nByte, int *pRc){ static void sessionAppendValue(SessionBuffer *p, sqlite3_value *pVal, int *pRc){ int rc = *pRc; if( rc==SQLITE_OK ){ - int nByte = 0; + sqlite3_int64 nByte = 0; rc = sessionSerializeValue(0, pVal, &nByte); sessionBufferGrow(p, nByte, &rc); if( rc==SQLITE_OK ){ @@ -2735,7 +2735,7 @@ static int sessionValueSetStr( ** argument to sqlite3ValueSetStr() and have the copy created ** automatically. But doing so makes it difficult to detect any OOM ** error. Hence the code to create the copy externally. */ - u8 *aCopy = sqlite3_malloc(nData+1); + u8 *aCopy = sqlite3_malloc64((sqlite3_int64)nData+1); if( aCopy==0 ) return SQLITE_NOMEM; memcpy(aCopy, aData, nData); sqlite3ValueSetStr(pVal, nData, (char*)aCopy, enc, sqlite3_free); @@ -3348,7 +3348,7 @@ static int sessionChangesetInvert( int iCol; if( 0==apVal ){ - apVal = (sqlite3_value **)sqlite3_malloc(sizeof(apVal[0])*nCol*2); + apVal = (sqlite3_value **)sqlite3_malloc64(sizeof(apVal[0])*nCol*2); if( 0==apVal ){ rc = SQLITE_NOMEM; goto finished_invert; @@ -4621,7 +4621,7 @@ static int sessionChangeMerge( int rc = SQLITE_OK; if( !pExist ){ - pNew = (SessionChange *)sqlite3_malloc(sizeof(SessionChange) + nRec); + pNew = (SessionChange *)sqlite3_malloc64(sizeof(SessionChange) + nRec); if( !pNew ){ return SQLITE_NOMEM; } @@ -4654,8 +4654,8 @@ static int sessionChangeMerge( if( pExist->op==SQLITE_DELETE && pExist->bIndirect ){ *ppNew = pExist; }else{ - int nByte = nRec + pExist->nRecord + sizeof(SessionChange); - pNew = (SessionChange*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = nRec + pExist->nRecord + sizeof(SessionChange); + pNew = (SessionChange*)sqlite3_malloc64(nByte); if( pNew==0 ){ rc = SQLITE_NOMEM; }else{ @@ -4715,14 +4715,14 @@ static int sessionChangeMerge( assert( pNew==0 ); }else{ u8 *aExist = pExist->aRecord; - int nByte; + sqlite3_int64 nByte; u8 *aCsr; /* Allocate a new SessionChange object. Ensure that the aRecord[] ** buffer of the new object is large enough to hold any record that ** may be generated by combining the input records. */ nByte = sizeof(SessionChange) + pExist->nRecord + nRec; - pNew = (SessionChange *)sqlite3_malloc(nByte); + pNew = (SessionChange *)sqlite3_malloc64(nByte); if( !pNew ){ sqlite3_free(pExist); return SQLITE_NOMEM; @@ -4828,7 +4828,7 @@ static int sessionChangesetToHash( if( !pTab ){ SessionTable **ppTab; - pTab = sqlite3_malloc(sizeof(SessionTable) + nCol + nNew+1); + pTab = sqlite3_malloc64(sizeof(SessionTable) + nCol + nNew+1); if( !pTab ){ rc = SQLITE_NOMEM; break; diff --git a/sqlite/ext/session/sqlite3session.h b/sqlite/ext/session/sqlite3session.h index 3d1df429..e9c29890 100644 --- a/sqlite/ext/session/sqlite3session.h +++ b/sqlite/ext/session/sqlite3session.h @@ -548,7 +548,7 @@ int sqlite3changeset_next(sqlite3_changeset_iter *pIter); ** sqlite3changeset_next() is called on the iterator or until the ** conflict-handler function returns. If pnCol is not NULL, then *pnCol is ** set to the number of columns in the table affected by the change. If -** pbIncorrect is not NULL, then *pbIndirect is set to true (1) if the change +** pbIndirect is not NULL, then *pbIndirect is set to true (1) if the change ** is an indirect change, or false (0) otherwise. See the documentation for ** [sqlite3session_indirect()] for a description of direct and indirect ** changes. Finally, if pOp is not NULL, then *pOp is set to one of diff --git a/sqlite/main.mk b/sqlite/main.mk index d18313bd..c4e8b78e 100644 --- a/sqlite/main.mk +++ b/sqlite/main.mk @@ -369,6 +369,7 @@ TESTSRC += \ $(TOP)/ext/misc/nextchar.c \ $(TOP)/ext/misc/normalize.c \ $(TOP)/ext/misc/percentile.c \ + $(TOP)/ext/misc/prefixes.c \ $(TOP)/ext/misc/regexp.c \ $(TOP)/ext/misc/remember.c \ $(TOP)/ext/misc/series.c \ @@ -509,7 +510,8 @@ FUZZDATA = \ $(TOP)/test/fuzzdata4.db \ $(TOP)/test/fuzzdata5.db \ $(TOP)/test/fuzzdata6.db \ - $(TOP)/test/fuzzdata7.db + $(TOP)/test/fuzzdata7.db \ + $(TOP)/test/fuzzdata8.db # Standard options to testfixture # @@ -530,6 +532,11 @@ FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 FUZZCHECK_OPT += -DSQLITE_MAX_MEMORY=50000000 FUZZCHECK_OPT += -DSQLITE_PRINTF_PRECISION_LIMIT=1000 +FUZZCHECK_OPT += -DSQLITE_ENABLE_DESERIALIZE +FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS4 +FUZZCHECK_OPT += -DSQLITE_ENABLE_RTREE +FUZZCHECK_OPT += -DSQLITE_ENABLE_GEOPOLY +FUZZCHECK_OPT += -DSQLITE_ENABLE_DBSTAT_VTAB DBFUZZ_OPT = KV_OPT = -DSQLITE_THREADSAFE=0 -DSQLITE_DIRECT_OVERFLOW_READ ST_OPT = -DSQLITE_THREADSAFE=0 @@ -574,6 +581,20 @@ dbfuzz$(EXE): $(TOP)/test/dbfuzz.c sqlite3.c sqlite3.h $(DBFUZZ_OPT) $(TOP)/test/dbfuzz.c sqlite3.c \ $(TLIBS) $(THREADLIB) +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_ENABLE_FTS5 + +dbfuzz2$(EXE): $(TOP)/test/dbfuzz2.c sqlite3.c sqlite3.h + $(TCCX) -I. -g -O0 -DSTANDALONE -o dbfuzz2$(EXE) \ + $(DBFUZZ2_OPTS) $(TOP)/test/dbfuzz2.c sqlite3.c $(TLIBS) $(THREADLIB) + fuzzcheck$(EXE): $(TOP)/test/fuzzcheck.c sqlite3.c sqlite3.h $(TOP)/test/ossfuzz.c $(TCCX) -o fuzzcheck$(EXE) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ -DSQLITE_ENABLE_MEMSYS5 $(FUZZCHECK_OPT) -DSQLITE_OSS_FUZZ \ @@ -719,6 +740,7 @@ SHELL_SRC = \ $(TOP)/ext/expert/sqlite3expert.c \ $(TOP)/ext/expert/sqlite3expert.h \ $(TOP)/ext/misc/zipfile.c \ + $(TOP)/ext/misc/memtrace.c \ $(TOP)/src/test_windirent.c shell.c: $(SHELL_SRC) $(TOP)/tool/mkshellc.tcl @@ -976,6 +998,9 @@ $(TEST_EXTENSION): $(TOP)/src/test_loadext.c extensiontest: testfixture$(EXE) $(TEST_EXTENSION) ./testfixture$(EXE) $(TOP)/test/loadext.test +dbtotxt$(EXE): $(TOP)/tool/dbtotxt.c + $(TCC) -o dbtotxt$(EXE) $(TOP)/tool/dbtotxt.c + showdb$(EXE): $(TOP)/tool/showdb.c sqlite3.o $(TCC) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION -o showdb$(EXE) \ $(TOP)/tool/showdb.c sqlite3.o $(THREADLIB) @@ -995,6 +1020,10 @@ showwal$(EXE): $(TOP)/tool/showwal.c sqlite3.o showshm$(EXE): $(TOP)/tool/showshm.c $(TCC) -o showshm$(EXE) $(TOP)/tool/showshm.c +index_usage$(EXE): $(TOP)/tool/index_usage.c sqlite3.o + $(TCC) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_DEPRECATED $(SHELL_OPTS) -o index_usage$(EXE) \ + $(TOP)/tool/index_usage.c sqlite3.o $(THREADLIB) + 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) diff --git a/sqlite/manifest b/sqlite/manifest index bb8f3728..54a6ebdd 100644 --- a/sqlite/manifest +++ b/sqlite/manifest @@ -1,12 +1,12 @@ -C Version\s3.26.0 -D 2018-12-01T12:34:55.966 +C Version\s3.27.2 +D 2019-02-25T16:06:06.705 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea -F Makefile.in a050c8670ea0d7b37b2192306cbb50d392acd9902b84e9b56f3444d006f97a6c +F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 -F Makefile.msc 0d6831ff7951b302e888d86d4c469e2ec3c22f59eba4118b8c38d5a51d9e2d4f +F Makefile.msc 5df60c70edb157feb2148a14c687551969599bd065875a0b959b6b139721ca72 F README.md 377233394b905d3b2e2b33741289e093bc93f2e7adbe00923b2c5958c9a9edee -F VERSION 654da1d4053fb09ffc33a3910e6d427182a7dcdc67e934fa83de2849ac83fccb +F VERSION a45c4d2eb2f9c1432c4e49d9306ccb0cd3f88dccddfa52ea1fe7460ce005e58a F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 @@ -14,7 +14,7 @@ F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 F autoconf/Makefile.am e14b629addaa1ce372b72043f28f40de2e32b7e211b6e0fc18dbb87989197e40 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.msc 9e73d9abaadb7a4951ddd0e947c5c791770f23bb1e04bfa50b43c01bee0575f2 +F autoconf/Makefile.msc ee8ab2b6b5d712f68acc4c186e3fad7b831b87a2b118e0a123043ea8a2c8b016 F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 F autoconf/README.txt 4f04b0819303aabaa35fff5f7b257fb0c1ef95f1 F autoconf/configure.ac 308de24343e76ecfbe9a67f8fcd4c5216b790d230c5d9ce10210b7d5965d6192 @@ -33,7 +33,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55 -F configure 5811ffcd4866902d1706dcf8e0527f89165ec52859659942c9649bb1d3e4cc7b x +F configure 7fd4706775d3c31e928d3e94bcfca5150a60d5abfc6a36a20fa43ad66dc4d467 x F configure.ac 3552d3aecade98a9d4b64bceb48ffb7726cbc85902efde956812942f060fbd0a F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd @@ -46,7 +46,7 @@ F ext/async/sqlite3async.c 0f3070cc3f5ede78f2b9361fb3b629ce200d7d74 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/expert1.test 358e416877a5693fb99d5514f5d88452b5239dc2196b74e0e926718502faef6d F ext/expert/sqlite3expert.c 3da865f2286433588260f41e796422c611bceaca3a0bbf9139a619cf7d062c19 F ext/expert/sqlite3expert.h af6354f8ee5c9e025024e63fec3bd640a802afcc3099a44d804752cf0791d811 F ext/expert/test_expert.c d56c194b769bdc90cf829a14c9ecbc1edca9c850b837a4d0b13be14095c32a72 @@ -80,55 +80,55 @@ 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 65b8489e35da23b127992c6dd6cfd382a486f8c87bf26dfa72876efe46e551bb +F ext/fts3/fts3.c 5da1329ccf66b6d597dfb16b1f81aa204133c1ec96117d82a59c20126f483b17 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h 3378157f383540857a466420b8279626204434c3eb0dc948ad9bcd3991fc41f5 -F ext/fts3/fts3_aux.c e9b465f8469acc2cd700a90c0242912a3202e4e4e15df72d7db7f1e3a2222c85 -F ext/fts3/fts3_expr.c 3b1dbceddd8622599f3cc2626897667fe40487aaa1676707d6c37ec5a8422fc1 -F ext/fts3/fts3_hash.c 29b986e43f4e9dd40110eafa377dc0d63c422c60 +F ext/fts3/fts3Int.h 74384e28b778a057f1467529715668b98f3f12f52eeb564fd6ae1e894125c00c +F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 +F ext/fts3/fts3_expr.c b132af223e90e35b9f9efa9fe63d6ae737d34153a3b6066736086df8abc78a1f +F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf -F ext/fts3/fts3_icu.c deb46f7020d87ea7a14a433fb7a7f4bef42a9652 +F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 -F ext/fts3/fts3_snippet.c 68ae118b0f834ea53d2b89e4087fc0f0b8c4ee4e -F ext/fts3/fts3_term.c 9b8065cc70ad514fcc25a7b099ddab8b5333f724dedd57184b7e79238e2b2a39 -F ext/fts3/fts3_test.c 79f2a7fbb3f672fa032e5a432ca274ea3ee93c34 -F ext/fts3/fts3_tokenize_vtab.c a47c2a33de6db00816704315ac0a9afdfa1c71fa5b99f79171c0f7b30861f784 +F ext/fts3/fts3_snippet.c ac1f8945375d07076b7178de1fe549982e6ae6f050095e7f7e400ec4448f31df +F ext/fts3/fts3_term.c 12f7b2318f1254e6cc46dd306e5f2ac5b00b06d6761f5cae09fee5e1817cc32a +F ext/fts3/fts3_test.c b6e9f3fd7155cb388c6bc203fb24817a721fb61d9ce28810c73fcfda8c16fda6 +F ext/fts3/fts3_tokenize_vtab.c 969c132816b6f46ee2c7efafd2547a9bfd50b0aac3f8cef3f2dca2cbd90639c7 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 a85bc4885fde7f1b44c9de013b62f7cd3332dc59e208053d878729b1d04745bc +F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d +F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f +F ext/fts3/fts3_write.c 45cbe0b06221f5debefe37f8f9882cf0401592668cb76624a64c0f3f185115de F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 F ext/fts3/tool/fts3view.c 202801a2056995b763864d60c2dee744d46f1677 F ext/fts3/unicode/CaseFolding.txt 8c678ca52ecc95e16bc7afc2dbf6fc9ffa05db8c F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7 -F ext/fts3/unicode/mkunicode.tcl 0069320b64db6ee269c5e95f1f150d070fbf0a863fc7b3549d7e52bd068fb118 -F ext/fts3/unicode/parseunicode.tcl 024ae0bdd96309d7b8fc479148191e9b3001dc74017a3f65f9a27de3b3ff968b +F ext/fts3/unicode/mkunicode.tcl 49499f7964504438e2b04cca0627827945bb2499154e2d3ec216b22d20b969ae +F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 -F ext/fts5/fts5.h 5edc74ca603d71284d475886e6e91b5c5cf2e8e93e9ba3a36ba2f2440ee97948 -F ext/fts5/fts5Int.h 39f12034b598df4e0f59bbe6cf03af03a905a534b04f182d155641a04e1eb797 -F ext/fts5/fts5_aux.c ca666a3bbe07c5a3bbe9fffaea19c935a1efaf337333e28bad7bdd1971ffd093 -F ext/fts5/fts5_buffer.c 1dd1ec0446b3acfc2d7d407eb894762a461613e2695273f48e449bfd13e973ff -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 baf3ad4451d32d35c2bd692ee4a81235ca7f26bd6f7613f7f73505474c33bbf2 -F ext/fts5/fts5_main.c 287a1a56580df304d7fa2fc1890f85b9cb6ac6b9e7c8af7dfa2151528db4b059 -F ext/fts5/fts5_storage.c 4bec8a1b3905978b22a67bca5f4a3cfdb94af234cf51efb36f4f2d733d278634 +F ext/fts5/fts5.h fed314270c1a61de3a0e373b11c2f8228b1c76ce59447dd96d0b6fae7d66399b +F ext/fts5/fts5Int.h 0b002fc71ea705d2c4ec66a63ecd38a2c11127e5b52239b5d71d1dd28309fc19 +F ext/fts5/fts5_aux.c afe8c2394cf6de2a48f278442f4f4342365bf99a5983709ef8e6955c2cf4daf9 +F ext/fts5/fts5_buffer.c 2e750cd4c0d456d4e1a8dcc649382708422b535dc32b375fd3d3306fb9727046 +F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 +F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 +F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 +F ext/fts5/fts5_index.c ffff7e8d41594256cacf7b32072f8bc06478a86026196a7eb084450065df8d92 +F ext/fts5/fts5_main.c 95d63bbe6075955961e56878c3a8705dc475c2b17f5c767f7b8af14093ae614b +F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 -F ext/fts5/fts5_test_mi.c 65864ba1e5c34a61d409c4c587e0bbe0466eb4f8f478d85dc42a92caad1338e6 -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 fbe38044889b2d2d99babeeef239c620fb0332bb928a84506ac748d81500b354 +F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee +F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3036f01258e7 +F ext/fts5/fts5_tokenize.c 4d904c237707de8fbb8ab98d24d5c55d47204a3f1f35895d8a53a5327079b32c +F ext/fts5/fts5_unicode2.c d8a1528c9a19f79b843c486e5e64bff17d667791ae7f658e11131ebac4b33c59 +F ext/fts5/fts5_varint.c e64d2113f6e1bfee0032972cffc1207b77af63319746951bf1d09885d1dadf80 +F ext/fts5/fts5_vocab.c 906dff069840347e68f654b12ca60a53a27cd1780daf155fbe7dd331f27c2329 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 840081efaee97f5ec570146bbdd79cfdfaea0ab303de3d5037b6d6c78b42ccdd +F ext/fts5/test/fts5aa.test 1706f816308e5855fe493be85aa0fd28eea78fb163ab1d60a20bca4f0ebcf68d F ext/fts5/test/fts5ab.test 9205c839332c908aaad2b01ab8670ece8b161e8f2ec8a9fabf18ca9385880bb7 F ext/fts5/test/fts5ac.test a7aa7e1fefc6e1918aa4d3111d5c44a09177168e962c5fd2cca9620de8a7ed6d F ext/fts5/test/fts5ad.test e8cf959dfcd57c8e46d6f5f25665686f3b6627130a9a981371dafdf6482790de @@ -136,9 +136,9 @@ F ext/fts5/test/fts5ae.test 1142d16d9cc193894dc13cc8f9c7a8a21411ac61b5567a878514 F ext/fts5/test/fts5af.test 724247405b13f8f06cc6ce464dc4f152dc5dd4e86b12c2099685d8f19747bf7b F ext/fts5/test/fts5ag.test 7816f25a0707578f08145ab539fc0ca025f8951e788b28a6a18a06b2099469dd F ext/fts5/test/fts5ah.test 27b5a33bfd0363ca8a4dc659e6e2a5df3dea1c3c5b04bc51ca6aeb1277bd9b21 -F ext/fts5/test/fts5ai.test d837c42249c0d8ad1a2912270e22cf2f303790a611f85c0be3a58e42a3696e3d +F ext/fts5/test/fts5ai.test bc97e4758cc93e06bf851d61c98fdf4e8b8f8315ee28a84fb15f916360856414 F ext/fts5/test/fts5aj.test 745020852d85f5dd49d11cb7ad11d3cc6dafc4fe6d6d24bc0875ac8f43ee4149 -F ext/fts5/test/fts5ak.test 0d41cbf04e70249c84670e1782aa8972e4f67d91c9bc6205d0ba7c34e159481b +F ext/fts5/test/fts5ak.test fc3595f8e6873bb86d70c9bd4b67d0413ce577bd4793c39a2b60a7b8825b60a6 F ext/fts5/test/fts5al.test 00c4c1c6a1366b73aa48ce2068c634520867c3cf7f5d1676ebbb775ee1f35734 F ext/fts5/test/fts5alter.test 5565f7e4605512b69171ac18ca84398603f9f6456dbe377beeca97e83cc242cd F ext/fts5/test/fts5auto.test 78989e6527ce69c9eddbef7392fea5c10b0010cd2b2ae68eec7bc869c471e691 @@ -147,6 +147,7 @@ F ext/fts5/test/fts5auxdata.test eacc97ff04892f1a5f3d4df5a73f8bcbc3955ea1d12c9f2 F ext/fts5/test/fts5bigpl.test 6466c89b38439f0aba26ac09e232a6b963f29b1cbe1304f6a664fe1e7a8f5fd3 F ext/fts5/test/fts5bigtok.test 541119e616c637caea925a8c028c37c2c29e94383e00aa2f9198d530724b6e36 F ext/fts5/test/fts5cat.test daba0b80659460b0cb60bd1f40b402478a761fe7ea414c3c94c2be25568cc33a +F ext/fts5/test/fts5circref.test f880dfd0d99f6fb73b88ccacb0927d18e833672fd906cc47d6b4e529419eaa62 F ext/fts5/test/fts5colset.test a30473451321bbf0b6218af62e96b4ae5fa99931cfdb210b5ecc804623b30f75 F ext/fts5/test/fts5columnsize.test 45459ce4dd9fd853b6044cdc9674921bff89e3d840f348ca8c1630f9edbf5482 F ext/fts5/test/fts5config.test 60094712debc59286c59aef0e6cf511c37d866802776a825ce437d26afe0817f @@ -155,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 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/fts5corrupt3.test 4c506a138797d23049bf08552b4571f5beb5138ab7b3329b9210fe5aac8796d2 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -180,6 +181,7 @@ F ext/fts5/test/fts5full.test 49b565da02918c06e58f51f0b953b0302b96f155aa68baba24 F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e F ext/fts5/test/fts5hash.test a4cf51acad99bfc43c16fb74f9d22495dc221ae0701fc5e908ca963a9b26a02b F ext/fts5/test/fts5integrity.test 4317561cd25eca7df16aa1f7d1a700ee958059fa639785f94aba0a84df9ab17b +F ext/fts5/test/fts5interrupt.test 09613247b273a99889808ef852898177e671406fe71fdde7ea00e78ea283d227 F ext/fts5/test/fts5lastrowid.test be98fe3e03235296585b72daad7aed5717ba0062bae5e5c18dd6e04e194c6b28 F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad F ext/fts5/test/fts5matchinfo.test 79129ff6c9a2d86943b287a5a8caa7ee639f6dcf004d8975d15c279374e82e35 @@ -206,16 +208,17 @@ F ext/fts5/test/fts5synonym.test 1651815b8008de170e8e600dcacc17521d765482ea8f074 F ext/fts5/test/fts5synonym2.test b54cce5c34ec08ed616f646635538ae82e34a0e28f947ec60b6fadbc4b3fb17a F ext/fts5/test/fts5tok1.test ce6551e41ff56f30b69963577324624733bed0d1753589f06120d664d9cd45c9 F ext/fts5/test/fts5tok2.test dcacb32d4a2a3f0dd3215d4a3987f78ae4be21a2 -F ext/fts5/test/fts5tokenizer.test 6aeb5e8061ffc0ff9a5299f27beaee3b2b4b8b336d4f107262bca338bea8f8e9 +F ext/fts5/test/fts5tokenizer.test ac3c9112b263a639fb0508ae73a3ee886bf4866d2153771a8e8a20c721305a43 +F ext/fts5/test/fts5umlaut.test a42fe2fe6387c40c49ab27ccbd070e1ae38e07f38d05926482cc0bccac9ad602 F ext/fts5/test/fts5unicode.test 17056f4efe6b0a5d4f41fdf7a7dc9af2873004562eaa899d40633b93dc95f5a9 F ext/fts5/test/fts5unicode2.test 9b3df486de05fb4bde4aa7ee8de2e6dae1df6eb90e3f2e242c9383b95d314e3e -F ext/fts5/test/fts5unicode3.test c3caecbe8264629ffe653b43ca5790b9793eba4422f92203e5247558e5a534e7 +F ext/fts5/test/fts5unicode3.test 590c72e18195bda2446133f9d82d04a4e89d094bba58c75ae10f4afc6faa0744 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/fts5update.test b8affd796e45c94a4d19ad5c26606ea06065a0f162a9562d9f005b5a80ccf0bc F ext/fts5/test/fts5version.test c8f2cc105f0abf0224965f93e584633dee3e06c91478bc67e468f7cfdf97fd6a -F ext/fts5/test/fts5vocab.test 2de834ee6405130d3373817ced8fefbfee392b63d932e471740e09829f1e4510 -F ext/fts5/test/fts5vocab2.test d6039b20118e886113fc63614d9ad39a466fc2af34184f3e915b9f92b7ebfa10 +F ext/fts5/test/fts5vocab.test 648fb2fe86b55e08295e34504704718d92fba3e2cf3e1f5d72fa3682df4cd0f0 +F ext/fts5/test/fts5vocab2.test e0fdc3a3095f6eda68ac9bf9a443ff929a124d46f00af19933604085712e9d47 F ext/fts5/tool/fts5speed.tcl b0056f91a55b2d1a3684ec05729de92b042e2f85 F ext/fts5/tool/fts5txt2db.tcl 526a9979c963f1c54fd50976a05a502e533a4c59 F ext/fts5/tool/loadfts5.tcl 95b03429ee6b138645703c6ca192c3ac96eaf093 @@ -270,29 +273,31 @@ 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 c0a6a807a553eaa220bf69fca0353cd1587a3bfb3d2224fa425e3e6efcacc98a +F ext/misc/amatch.c cc9835931fbe46f9c6b8dbb51779c16f169bee50ae372a20532ff5154ebaf5b1 F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a22525eddb F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb1967af7 F ext/misc/btreeinfo.c 4f0ebf278f46e68e6306c667917766cebc5550fd35d5de17847988e22892d4d2 F ext/misc/carray.c ed96c218ea940b85c9a274c4d9c59fe9491c299147a38a8bba537687bd6c6005 -F ext/misc/closure.c 9f8fa11aa6c6e2f6d7296ffa88f103df4b46abd9602bcab3ea2f8fc24f334f63 +F ext/misc/closure.c 037d055c5a4880d41607a3ea44037f655b5e8ac1bdce305ec497903fd2646960 F ext/misc/completion.c cec672d40604075bb341a7f11ac48393efdcd90a979269b8fe7977ea62d0547f F ext/misc/compress.c dd4f8a6d0baccff3c694757db5b430f3bbd821d8686d1fc24df55cf9f035b189 -F ext/misc/csv.c 88333dc9f7dcf6a8148406f10ae04261e24e3b4c721550ae33e9e71f1265c1f1 -F ext/misc/dbdump.c 12389a10c410fadf1e68eeb382def92d5a7fa9ce7cce4fb86a736fa2bac1000a -F ext/misc/eval.c 6ea9b22a5fa0dd973b67ca4e53555be177bc0b7b263aadf1024429457c82c0e3 +F ext/misc/csv.c 7f047aeb68f5802e7ce6639292095d622a488bb43526ed04810e0649faa71ceb +F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287c336 +F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f -F ext/misc/fileio.c e3153b04433897a18a3d17185845f286892e96fdf87f4301290d09c36ae1759f -F ext/misc/fuzzer.c 7c64b8197bb77b7d64eff7cac7848870235d4c25 +F ext/misc/fileio.c 592d6531d8413d81b25f5a47a45d7e310e455d33e03a64c6ae85724c6524a5d5 +F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c -F ext/misc/json1.c 3f017d2659e531d021d015ec5d69ea0b1c71f2e15bf9768b1e149fcdf6c3e0b1 -F ext/misc/memstat.c 941928c6104d8ed569a6c47caa756dc78b8091f7a15f87d3004f3b1e576b10da +F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 +F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d +F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 -F ext/misc/mmapwarm.c 70b618f2d0bde43fae288ad0b7498a629f2b6f61b50a27e06fae3cd23c83af29 -F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 +F ext/misc/mmapwarm.c 8c5fe90d807a23e44a8b93e96e8b812b19b300d5fd8c1d40a4fd1d8224e33f46 +F ext/misc/nextchar.c 279f80fe8ef5ba413242e2704e246503ac601f005eefb180d19e6c920338a0ba F ext/misc/normalize.c b4290464f542bae7a97b43f15bd197949b833ffd668b7c313631bd5d4610212c -F ext/misc/percentile.c 92699c8cd7d517ff610e6037e56506f8904dae2e -F ext/misc/regexp.c a68d25c659bd2d893cd1215667bbf75ecb9dc7d4 +F ext/misc/percentile.c a6a1594c104da2d0ceab38fe609eb2f65529272377827f6f8a2b5c9fa6119e7e +F ext/misc/prefixes.c 7be86d17525cfae6ed462fc3c519efc44488ac329890f77491c8f82871f57e17 +F ext/misc/regexp.c 79345bf03496155a640ee0300d3307296761cebb5e115b4e342cc2fb5861ec10 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 540a169cb0d74f15522a8930b0cccdcb37a4fd071d219a5a083a319fc6e8db77 F ext/misc/scrub.c db9fff56fed322ca587d73727c6021b11ae79ce3f31b389e1d82891d144f22ad @@ -305,13 +310,13 @@ F ext/misc/sqlar.c 57d5bc45cd5492208e451f697404be88f8612527d64c9d42f96b325b64983 F ext/misc/stmt.c 8a8dc4675042e4551e4afe99b8d0cc7a4a2fc1a8dacc0a9ce1b1bbff145da93d F ext/misc/templatevtab.c 8a16a91a5ceaccfcbd6aaaa56d46828806e460dd194965b3f77bf38f14b942c4 F ext/misc/totype.c 4a167594e791abeed95e0a8db028822b5e8fe512 -F ext/misc/unionvtab.c acf947858054850db2d4a611bfeae072cdc6d9f517b46a993fe1f2f1ea20031e -F ext/misc/vfslog.c fe40fab5c077a40477f7e5eba994309ecac6cc95 +F ext/misc/unionvtab.c 34ee634d09670909563dbde59c5bfb2ac048b27051f65f1aeac918b061d646d8 +F ext/misc/vfslog.c 3b25c2f56ba60788db247287be6ab024b53c4afffd412b4876db563389be0d35 F ext/misc/vfsstat.c bf10ef0bc51e1ad6756629e1edb142f7a8db1178 F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 -F ext/misc/zipfile.c 1d731db326c40e11fc608f38132acff31619946c000e85ab8efe75bbedc2a441 +F ext/misc/zipfile.c c1ca8f52330b4564207036b978edac8141c737bf612659bf6f7bee3ddd563a03 F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 @@ -329,7 +334,7 @@ F ext/rbu/rbu9.test 0e4d985e25620d61920597e8ea69c871c9e8c1f5a0be2ae9fa70bb641d74 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/rbu_common.tcl 4b3d033b3e3844292ae3a1aefc0e524e64b0db5a0e4310657919e4504ac3073f F ext/rbu/rbucollate.test cac528a9a46318cba42e61258bb42660bbbf4fdb9a8c863de5a54ad0c658d197 F ext/rbu/rbucrash.test 000981a1fe8a6e4d9a684232f6a129e66a3ef595f5ed74655e2f9c68ffa613b4 F ext/rbu/rbucrash2.test efa143cc94228eb0266d3f1abfbee60a5838a84cef7cc3fcb8c145b74d96fd41 @@ -347,10 +352,11 @@ F ext/rbu/rbusave.test f4190a1a86fccf84f723af5c93813365ae33feda35845ba107b59683d 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/rbu/rbuvacuum2.test b8e5b51dc8b2c0153373d024c0936be3f66f9234acbd6d0baab0869d56b14e6b +F ext/rbu/rbuvacuum3.test 8addd82e4b83b4c93fa47428eae4fd0dbf410f8512c186f38e348feb49ba03dc +F ext/rbu/sqlite3rbu.c d643661c7c85e79f4d0bc56c73f6f2dd55c35732dd41f378b0fd3b182a33242d +F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812 +F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 F ext/repair/checkfreelist.c 0dbae18c1b552f58d64f8969e4fb1e7f11930c60a8c2a9a8d50b7f15bdfd54bd F ext/repair/checkindex.c 7d28c01a2e012ac64257d230fc452b2cafb78311a91a343633d01d95220f66f3 @@ -361,15 +367,15 @@ F ext/repair/test/checkfreelist01.test 3e8aa6aeb4007680c94a8d07b41c339aa635cc782 F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c335096108c12c01bddbadcec F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/geopoly.c d56ff997f2646b03be742eb85e8206f779d777f3a282fe0da576780ca0e11f20 -F ext/rtree/rtree.c 7125183bf6c37b8b8ee1a04d2b0fe258531fd31650fdd050ed041817f1943d17 +F ext/rtree/geopoly.c 061432bddc38c4c10c7e4ce940d581c886d65bb5814b4b65b46ad046aa85eaa2 +F ext/rtree/rtree.c 57729cc19f3832e5f9051556af44ed264b5bd54b01543cd7e50d5143817b964c F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 -F ext/rtree/rtree1.test 309afc04d4287542b2cd74f933296832cc681c7b014d9405cb329b62053a5349 +F ext/rtree/rtree1.test 7573134f1b4f59df36c1b0a6de51268fd3b9c714d91f3811482263e734e416ea F ext/rtree/rtree2.test 5f25b01acd03470067a2d52783b2eb0a50bf836803d4342d20ca39e541220fe2 F ext/rtree/rtree3.test 4ee5d7df86040efe3d8d84f141f2962a7745452200a7cba1db06f86d97050499 F ext/rtree/rtree4.test 304de65d484540111b896827e4261815e5dca4ce28eeecd58be648cd73452c4b F ext/rtree/rtree5.test 49c9041d713d54560b315c2c7ef7207ee287eba1b20f8266968a06f2e55d3142 -F ext/rtree/rtree6.test 593e0d36510d5ac1d1fb39b018274ff17604fe8fdca8cf1f8e16559cea1477f4 +F ext/rtree/rtree6.test 1252a0439da01d2f1f5cbbdeeb80455a2d68b9bae2a9787937b167a5e3957828 F ext/rtree/rtree7.test c8fb2e555b128dd0f0bdb520c61380014f497f8a23c40f2e820acc9f9e4fdce5 F ext/rtree/rtree8.test 2d99006a1386663978c9e1df167554671e4f711c419175b39f332719deb1ce0e F ext/rtree/rtree9.test c646f12c8c1c68ef015c6c043d86a0c42488e2e68ed1bb1b0771a7ca246cbabf @@ -384,14 +390,16 @@ F ext/rtree/rtreeH.test aa08cc4fa8005b4c67446c7110205055b4d6da90e760e6f44b82dfa4 F ext/rtree/rtree_perf.tcl 6c18c1f23cd48e0f948930c98dfdd37dfccb5195 F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b587936f5f6bceed F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 +F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d +F ext/rtree/rtreefuzz001.test 836d87653851ae8e7b506d8bd3d62329548adc48ff9bc0a9051efd576710be7b 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 e9c2564083bcd30ec51b07f881bffbf0e12b50a3f6fced0c222c5c1d2f94ac66 -F ext/session/changeset.c 4ccbaa4531944c24584bf6a61ba3a39c62b6267a -F ext/session/changesetfuzz.c 255826ee367781ec4c29a36c7c63e9ee6387dc03a8346cf240feb8d597958b0e +F ext/session/changeset.c d046906a0c9a37862fcd5dbfda5eb08dea361b9abdd959b34358a63fa246164f +F ext/session/changesetfuzz.c 01023c41cfb02e191d144ea8bfdc46443393b62d13873f5fa044fc9886e60142 F ext/session/changesetfuzz1.test 2e1b90d888fbf0eea5e1bd2f1e527a48cc85f8e0ff75df1ec4e320b21f580b3a F ext/session/session1.test 0b2f88995832ea040ae8e83a1ad4afa99c00b85c779d213da73a95ea4113233e F ext/session/session2.test 284de45abae4cc1082bc52012ee81521d5ac58e0 @@ -410,7 +418,7 @@ F ext/session/sessionF.test d37ed800881e742c208df443537bf29aa49fd56eac520d0f0c6d 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/session_speed_test.c dcf0ef58d76b70c8fbd9eab3be77cf9deb8bc1638fed8be518b62d6cbdef88b3 F ext/session/sessionat.test efe88965e74ff1bc2af9c310b28358c02d420c1fb2705cc7a28f0c1cc142c3ec F ext/session/sessiondiff.test ad13dd65664bae26744e1f18eb3cbd5588349b7e9118851d8f9364248d67bcec F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 @@ -418,9 +426,9 @@ F ext/session/sessionfault2.test dd593f80b6b4786f7adfe83c5939620bc505559770cc181 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/sessionwor.test 67b5ab91d4f93ce65ff1f58240ac5ddf73f8670facc1ffa49cef56293d52818d +F ext/session/sqlite3session.c 4c79daf65e89c78dd62fd97a1b2eac3e53be700b29914101453a0d951f7ba9c8 +F ext/session/sqlite3session.h 54d6356f5769d3695e5f63d719c6ee27671b2614973a2b675a3ff4d30d574233 F ext/session/test_session.c 98797aba475a799376c9a42214f2d1debf2d0c3cb657d9c8bbf4f70bf3fb4aec F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04 @@ -428,7 +436,7 @@ F ext/userauth/userauth.c f81aa5a3ecacf406f170c62a144405858f6f6de51dbdc0920134e6 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk eeaa279fa6acdcfa6555058548075569a06f891fd67f5901b1e7700d18052fda +F main.mk 3930eb2fcbebe49ab7408f6fef3baa8c4bf3c84540f9f29dfe849bf561ff6e51 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -440,44 +448,44 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c f886160da189e4e99093cd5a2aca625652cc9b027d5100b87f81c175d1056387 -F src/analyze.c 3dc6b98cf007b005af89df165c966baaa48e8124f38c87b4d2b276fe7f0b9eb9 -F src/attach.c 92b51739a885da8bd84bc9a05485f1e48148bce5c15432f059b45af98fff75cd +F src/alter.c cb691d6cd330312b7951c9d3bc0bc29804bbe80beac1cdd137d824b119b6f28a +F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644 +F src/attach.c 3f9b0f6c79500cc40f4e543bc130a0b4ee13f52b45cbb6735608776cbdb79f0e F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c ba7c7eef4461790f37c309936bfc5d0d6ba9b194b02d3c8ff1fd53b420ea6d3b -F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 -F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 -F src/build.c 127d33ad57b455a9339e9fabff41284c8b030cc6247ca7a2a6c0ad7abfc1ce85 -F src/callback.c 789bd33d188146f66c0dd8306472a72d1c05f71924b24a91caf6bd45cf9aba73 +F src/btree.c 84b7c5c3829b60823e15e7a8407462b69be3818f96518fef28f97ac0fbbca72b +F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 +F src/btreeInt.h cd82f0f08886078bf99b29e1a7045960b1ca5d9d5829c38607e1299c508eaf00 +F src/build.c 906ca6663b9dcd413e72ae9c44dd51e596d8336b04d52e678a7501e71c20cab2 +F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 -F src/dbstat.c 3c8bd4e77f0244fd2bd7cc90acf116ad2f8e82d70e536637f35ac2bc99b726f9 -F src/delete.c f7938125847e8ef485448db5fbad29acb2991381a02887dd854c1617315ab9fb -F src/expr.c 9aacc0b72348ba90010b672dcbbbe2fa56e1182043bc917a3a147b2bc57a5497 +F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 +F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf +F src/expr.c f2d0ecf68213770be4fad83128ce02e67667deebaa0a44061313f7e4f2a4ae28 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c 972a4ba14296bef2303a0abbad1e3d82bc3c61f9e6ce4e8e9528bdee68748812 -F src/func.c 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f -F src/global.c 8291eee0782b83124de14ec0389ec9fd6ae1873358a6b0d9469fe17a46ad803b -F src/hash.c 931ec82d7e070654a8facb42549bbb3a25720171d73ba94c3d3160580d01ef1f +F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765 +F src/func.c 0341881d22903aac5ba7f352b188806d6436e1d6ae4235ff01e44d56879dfe63 +F src/global.c 0dea3065ea72a65ae941559b6686aad6516d4913e76fa4f79a95ff7787f624ec +F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 6b81aae27b196925d8ff78824f4bbd435d6a40cd38dc324685e21735bb402109 -F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e -F src/loadext.c 9050dd153b5583804184be9c9dee9ebb554178d6db1f8ac280899e8aad9060e6 -F src/main.c 4cfb3913cc9e65d3ac649b1785ac753fc225d29425d5437e012f7eac0cefe0eb +F src/insert.c 7b71ba94e3283b497c076068fdeea760ce93b9db7d6784bdf5404fc842b721e5 +F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa +F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 +F src/main.c 27d7265625ea6eaccdfe7c53ef41adc179c9357a077702a860c1a3b0a037a16f F src/malloc.c 07295435093ce354c6d9063ac05a2eeae28bd251d2e63c48b3d67c12c76f7e18 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c cb4013d56fa71c79c498717cbc47b27dd1c7653fd866584b2071ae04114eec46 +F src/memdb.c 02a5fcec19b9d40dd449ca802dc1b2e8f93f255fbf2a886277a3c3800d8d35db F src/memjournal.c 6f3d36a0a8f72f48f6c3c722f04301ac64f2515435fa42924293e46fc7994661 F src/msvc.h 4942752b6a253116baaa8de75256c51a459a5e81 F src/mutex.c bae36f8af32c22ad80bbf0ccebec63c252b6a2b86e4d3e42672ff287ebf4a604 @@ -493,30 +501,30 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c f6e91b8fd82af7afbfd073c4974ad6cdb8e62d9f65ceddb45167835a0567fdc0 F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 75e0f3cfa3962c714f519f8a3d1e67ecca1c91de0e010a036b988e40ce9e4c73 +F src/pager.c 857dde3e525f665cfab23b6765bf04ca6638c0759ae7da6d63acfb463e230aa6 F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 6840fe7c0b5eb4dd25ee5d075213bc8255ed4c0678d71bfb6744d0520d91c179 +F src/parse.y 741a270b7f2f85bc5d026d06fb5a9ccba5335304ff2831e1cb44b36cd0da6006 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/pcache1.c a72804486dfa8e4b6bc30d666c97ecf1155f91a4351fc6e48ea4097e4eb304fb +F src/pragma.c af67dedaad8bafe9a5f9adcec32a0da6dd118617dd8220ad1d118f5a6bf83a02 +F src/pragma.h a776bb9c915207e9d1117b5754743ddf1bf6a39cc092a4a44e74e6cb5fab1177 +F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 +F src/printf.c cbf27c320091a83279d1738f68a27a9fe01698c607ce80516ab6bdb5a9c36a1a F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 4cfc44def0f0690ceaab8f6481f5d76284d7f9509aab6e218a679b4836a54614 +F src/resolve.c dd7550ed05486c49c2b467b46ef37c78cdf6bf9df3b15134816d081691fd42d1 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 61e867a906f140b73baf4ce7a201ad6dcba30820969f5618ee40e9a0d32c6f5f -F src/shell.c.in 482e23a370cbe5b0d4c73a0f0f5fce34f7caa08a14a8d75e12f0225c4e14915c -F src/sqlite.h.in cce9feede1c1c03923c091b4bbbd081dd77aaf92024cc2cdbf65f712c2f668c3 +F src/select.c c998f694759e37799929e28df8a2649747f8774d4fc233529ab6bda689388e15 +F src/shell.c.in f2c1adbee3f6f36686b4a38d2168ebfc25298b4ad1e6d95199fc4e95b539251d +F src/sqlite.h.in 8859e0b45b48d4186fbc466885e508f8272420a349099acdebcdb8d410d54824 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h 1161f7579cdd6217737a66517ef27f4016426603eff492e9b31f45a7d7d4c61f +F src/sqliteInt.h ea0b5769140ca4bed03aeca8e7abb5c7a3eef4ffac723c8db3cfde88c390f807 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 -F src/tclsqlite.c e72862a271348d779672b45a730c33fd0c535e630ff927e8ce4a0c908d1d28c6 -F src/test1.c 5390e5afb31fed61f72d0be0cb1b322d198a6e03fc13ff245ae76d17b4dcf2e9 +F src/tclsqlite.c 6b19e7562195aaf881f3e35e2472dc01ae3cb156961db5126c3d616744729b7e +F src/test1.c 353b066e7ec761c4c715c1c20b888e0e7a0b0c0eda7f68c110e032d63713cade F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 18ec393bb4d0ad1de729f0b94da7267270f3d8e6 @@ -541,7 +549,7 @@ F src/test_hexio.c 1d4469ca61ab202a1fcec6543f584d2407205e8d F src/test_init.c 4413c211a94b62157ca4c145b3f27c497f03c664 F src/test_intarray.c 39b4181662a0f33a427748d87218e7578d913e683dc27eab7098bb41617cac71 F src/test_intarray.h d57ae92f420cda25e22790dac474d60961bd0c500cbaa3338a05152d4a669ef7 -F src/test_journal.c 619f2aa10e0d7a5f87c0f06825bc61dfce1c6b9c7f3ad990fb13de6c3b8874a3 +F src/test_journal.c a0b9709b2f12b1ec819eea8a1176f283bca6d688a6d4a502bd6fd79786f4e287 F src/test_loadext.c 337056bae59f80b9eb00ba82088b39d0f4fe6dfd F src/test_malloc.c dec0aa821b230773aeb3dd11d652c1193f7cedb18a20b25659bc672288115242 F src/test_md5.c 7268e1e8c399d4a5e181b64ac20e1e6f3bc4dd9fc87abac02db145a3d951fa8c @@ -562,40 +570,40 @@ F src/test_syscall.c 1073306ba2e9bfc886771871a13d3de281ed3939 F src/test_tclsh.c 06317648b0d85a85fd823f7973b55535c59a3156c1ef59394fe511f932cfa78d F src/test_tclvar.c 33ff42149494a39c5fbb0df3d25d6fafb2f668888e41c0688d07273dcb268dfc F src/test_thread.c 911d15fb14e19c0c542bdc8aabf981c2f10a4858 -F src/test_vfs.c 112f1f9271c33c211812e0e681830a84262dac065da58579ff49f9cefec97d4f +F src/test_vfs.c c6c6a58f66b26876c7b5769fb323a58b2c7120299b5084e7212c4116f902cbaa F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698 F src/test_windirent.c a895e2c068a06644eef91a7f0a32182445a893b9a0f33d0cdb4283dca2486ac1 F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a90484215 F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c 9e781e1ca80eefe7b5d6a9e2cd5c678c847da55fd6f093781fad7950934d4c83 -F src/treeview.c 7b12ac059de54c939b6eb0dbffc9410c29c80d2470cee5cbe07d5ff9ea2d9253 -F src/trigger.c d3d78568f37fb2e6cdcc2d1e7b60156f15b0b600adec55b83c5d42f6cad250bd -F src/update.c 1816d56c1bca1ba4e0ef98cac2f49be62858e9df1dc08844c7067eb41cc44274 +F src/tokenize.c 0a065eaa31f494ba31ac21d4a5d24a5a7865a7d849459f8c6266df1ac6b9aedf +F src/treeview.c c6ff90da4cc1813ff2d9bb11f17d4d927db62c47e552faa1835edc47269d753d +F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 +F src/update.c 0b973357d88092140531e07ff641139c26fb4380b0b9f5ed98c5f7691b4604d1 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 -F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157 -F src/vacuum.c 836cadc922de866c849e23a75f93d344cdc143d388339305d09a3fed27e8798d -F src/vdbe.c 005e691ea4c7d51e6c1a69d9389aeb34700884c85f51681817ddea3fdc2fc39b -F src/vdbe.h 5081dcc497777efe5e9ebe7330d283a044a005e4bdda2e2e984f03bf89a0d907 -F src/vdbeInt.h 437e6c6af679fdf157867eb83a8adc6cf5145d6774453c2214cfd0bd01d92980 -F src/vdbeapi.c ecccfce6f614c33a95952efeec969d163e8349eac314ee2b7b163eda921b5eb0 -F src/vdbeaux.c f547901b1aa9e2d81c63f06893f633648e434180666a827aacb547d7d6c8a601 +F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432 +F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca +F src/vdbe.c 2c61090f2328ad125c8e55b4dab0712a78cfdfac893152fae34bed7e015b7cd7 +F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 +F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f +F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 +F src/vdbeaux.c 4fa28b32452f6197dba7c8780dde11576b9a6d8ce6f35adbb69efc3e7d37fa0c F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 -F src/vdbemem.c 7b3305bc4a5139f4536ac9b5f61da0f915e49d2e3fdfa87dfdfa9d7aba8bc1e9 +F src/vdbemem.c 3173f0275cf8643a03ed02084ee56b97fc1a17a2edb5907facec504f59c3172d F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392 -F src/vtab.c 70188a745dc4e57d26e942681ff4b2912b7c8249ad5de3f60f0677b4337bcfaa +F src/vtab.c 2462b7d6fd72b0b916477f5ef210ee49ab58cec195483ebdac0c8c5e3ec42cab F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a -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 src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 +F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799 +F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 +F src/wherecode.c 061848646cc46a137d9038e47e666a955b3b2a1b458365eeed76b004c0053f3b +F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 +F src/window.c df2456386e0b1553a8d1fcf3a0ddc4c058fe2c650ea8c74b6bf8862082ddafc9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -609,12 +617,13 @@ F test/alter3.test 4d79934d812eaeacc6f22781a080f8cfe012fdc3 F test/alter4.test 7e93a21fe131e1dfeb317e90056856f96b10381fc7fe3a05e765569a23400433 F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959 F test/alterauth2.test c0a1ddf5b93d93cb0d15ba7acaf0c5c6fb515bbe861ede75b2d3fabad33b6499 -F test/altercol.test 313ed080ed61691c52cd87053129889f71582d6d0efebdd5f3edad2a98c66874 +F test/altercol.test 54374d2ba18af25bb24e23acf18a60270d4ec120b7ec0558078b59d5aa1a31ad F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3eab2f44b F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b -F test/altertab.test 17e46baa6b2234048c91891a303141afceca4da95a36ee1a0a9fec6ccef1f4da -F test/altertab2.test 0d64de5632ca5de13b023839cfe5b8952d029e4622befcea1433adaa93883220 +F test/altertab.test 6e13f13d8c30708f16187908c31dadb1bfff9e3cb2a07a7392a7a5e076f58f4a +F test/altertab2.test 7bedde2e6e71fdecd7a2af64b696cd0b3d3a344f5cf1db6785d9e3b5665193cf +F test/altertab3.test 9dd97ab8161eb6afc0e30e7c61a38336687fbd09e6ddc4c9f1e450cc0b12160b F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -650,7 +659,7 @@ F test/auth2.test 9eb7fce9f34bf1f50d3f366fb3e606be5a2000a1 F test/auth3.test db21405b95257c24d29273b6b31d0efc59e1d337e3d5804ba2d1fd4897b1ae49 F test/autoanalyze1.test b9cc3f32a990fa56669b668d237c6d53e983554ae80c0604992e18869a0b2dec F test/autoinc.test 381f494fefa90acd999933829e2934efb6b40906db9d6a39e822e3f7b4c8bf61 -F test/autoindex1.test a09958fa756129af10b6582bcbf3cbdf11e305e027b393f393caef801159dee0 +F test/autoindex1.test 96185415f5faacd5b8d7a7f505efddd5abb1f111d58338e9c0b1dc40b87cd3cc F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df F test/autoindex3.test 2dd997d6590438b53e4f715f9278aa91c9299cf3f81246a0915269c35beb790e F test/autoindex4.test 49d3cd791a9baa16fb461d7ea3de80d019a819cf @@ -670,7 +679,7 @@ F test/badutf2.test f5bc7f2d280670ecd79b9cf4f0f1760c607fe51f F test/bc_common.tcl b5e42d80305be95697e6370e015af571e5333a1c F test/bestindex1.test 852170bddbb21daa121fabcc274640ff83d7d8705912e8b5fe7ed2c5a9a9224a F test/bestindex2.test 9a0ccd320b6525eec3a706aae6cdab7e1b7b5abca75027e39f39f755e76e5928 -F test/bestindex3.test 001788a114ad96d81d5154fe77c7f1e26e84b3a2b5635ca29e4f96f6decc534e +F test/bestindex3.test 7622e792ff2da16d262d3cea6ad914591ac4806d57ed128e6c940b7920b47b84 F test/bestindex4.test 038e3d0789332f3f1d61474f9bbc9c6d08c6bd1783a978f31f38ad82688de601 F test/bestindex5.test 67c1166131bb59f9e47c00118f7d432ca5491e6cae6ca3f87ca9db20103a78f9 F test/bestindex6.test d856a9bb63d927493575823eed44053bc36251e241aa364e54d0f2a2d302e1d4 @@ -693,7 +702,7 @@ F test/boundary3.test 56ef82096b4329aca2be74fa1e2b0f762ea0eb45 F test/boundary4.tcl 0bb4b1a94f4fc5ae59b79b9a2b7a140c405e2983 F test/boundary4.test 89e02fa66397b8a325d5eb102b5806f961f8ec4b F test/btree01.test e08b3613540145b353f20c81cb18ead54ff12e0f -F test/btree02.test a0f33669ba76632247c14718af32db939fa6de5cd13890798ad3f2a362cf7fe4 +F test/btree02.test 7555a5440453d900410160a52554fe6478af4faf53098f7235f1f443d5a1d6cc F test/btreefault.test c2bcb542685eea44621275cfedbd8a13f65201e3 F test/busy.test 510dc6daaad18bcbbc085bcc6217d6dc418def5e73f72ce1475eea0cb7834727 F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de @@ -724,7 +733,7 @@ F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151ecac0b95 F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test fb28b3687e03625425bc216edf8b186ce974aa71008e2aa1f426a7dcb75a601d -F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db +F test/conflict.test c7cc007e2af151516ddf38f7412fe10d473a694f55e3df437e2c7b31c2590e8d F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9 F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4 @@ -748,7 +757,8 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5ef338c560ca4dfb7360828da16f1829be4deba3b378cafdc7a1cdaf027eb5c4 -F test/cost.test b37db8a10d467a69e71a9f3d40bbb266c2f587742b37c6912f6e3f7185a0e216 +F test/corruptL.test 0f64242b83db6d0bd5b6e38c205bf7c2a3bc6c9f80351f49c4dee1639aca60d8 +F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c F test/countofview.test e3d4cd6900e4e4f074968ab24b8b87d3671cd624961bef40fd3a6b8f574343cf F test/coveridxscan.test 5ec98719a2e2914e8908dc75f7247d9b54a26df04625f846ac7900d5483f7296 @@ -764,7 +774,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 4a92840619ef435b905e6d3f35cd0644df23225d7b7967d7940b40f06d6a90a6 +F test/csv01.test c9c3af0d58c34e9ac970c5875a77939edb958762c8aafb95409e19a3f088b6cd F test/ctime.test 78749e6c9a5f0010d67985be80788f841e3cd2da18114e2ed6010399a7d807f3 F test/cursorhint.test 7bc346788390475e77a345da2b92270d04d35856 F test/cursorhint2.test 6f3aa9cb19e7418967a10ec6905209bcbb5968054da855fc36c8beee9ae9c42f @@ -772,8 +782,9 @@ F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68 F test/date.test 9b73bbeb1b82d9c1f44dec5cf563bf7da58d2373 F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b10 F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e +F test/dbfuzz001.test 29b6c6b39a701b6b5b08035c637674b76e1ecea515b1a184b29e3bd0f2d02dad F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c 652f85bac1770e927da139db513234a3eba308f72ac2f8b32f0093d7d19def70 +F test/dbfuzz2.c 5d5eb817dc8195e0228227510ee6a4b49f46e679fc2d5be96841cce819bf42f7 F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -805,7 +816,7 @@ F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5e F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e F test/e_reindex.test 2b0e29344497d9a8a999453a003cb476b6b1d2eef2d6c120f83c2d3a429f3164 F test/e_resolve.test a61751c368b109db73df0f20fc75fb47e166b1d8 -F test/e_select.test c5a669b4d63217aa10094ba737ba3ddd07bd439d4bc7a5b798f6ea32511cbe7c +F test/e_select.test f9474205669a7736ef725b29cc7ae9e8601919a3d0ffc0ab30745a028f2a4b61 F test/e_select2.test aceb80ab927d46fba5ce7586ebabf23e2bb0604f F test/e_totalchanges.test b12ee5809d3e63aeb83238dd501a7bca7fd72c10 F test/e_update.test f46c2554d915c9197548681e8d8c33a267e84528 @@ -820,7 +831,7 @@ F test/enc.test e54531cd6bf941ee6760be041dff19a104c7acea F test/enc2.test 83437a79ba1545a55fb549309175c683fb334473 F test/enc3.test 6807f7a7740a00361ca8d0ccd66bc60c8dc5f2b6 F test/enc4.test c8f1ce3618508fd0909945beb8b8831feef2c020 -F test/eqp.test fc00ad1a7f5b90bf1bbccbf877ae9abef8bf5c7896174830d438c8f91a6ead88 +F test/eqp.test 84879b63e3110552bf8ce648a3507dc3ceb72109ecec83c2aef0db37a27f6382 F test/errmsg.test eae9f091eb39ce7e20305de45d8e5d115b68fa856fba4ea6757b6ca3705ff7f9 F test/eval.test a64c9105d6ff163df7cf09d6ac29cdad5922078c F test/exclusive.test 1206b87e192497d78c7f35552e86a9d05421498da300fb1cce5ca5351ccde3c3 @@ -830,7 +841,7 @@ F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac F test/expr.test 7cb55e80aeb41d65fec968c08212505123063fea60bdc355d764d747670e9eea F test/extension01.test 00d13cec817f331a687a243e0e5a2d87b0e358c9 F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 -F test/fallocate.test 07416bd593a116d5893cb244f45a94d5c6fe030561df3bd972e6135f8106e509 +F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717 F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 @@ -840,7 +851,7 @@ F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d F test/fkey5.test 24dd28eb3d9f1b5a174f47e9899ace5facb08373a4223593c8c631e6cf9f7d5a F test/fkey6.test d078a1e323a740062bed38df32b8a736fd320dc0 F test/fkey7.test 24076d43d3449f12f25503909ca4bfb5fc5fefd5af1f930723a496343eb28454 -F test/fkey8.test e5372e32cdb4481f121ec3550703eeb7b4e0762c +F test/fkey8.test 863c6d84f0d289fd2c1a1c293abb9803f77efd35211d9012c0986c8f6ccf5d5a F test/fkey_malloc.test 594a7ea1fbab553c036c70813cd8bd9407d63749 F test/fordelete.test eb93a2f34137bb87bdab88fcab06c0bd92719aff F test/format4.test 1f0cac8ff3895e9359ed87e41aaabee982a812eb @@ -880,8 +891,8 @@ F test/fts2q.test b2fbbe038b7a31a52a6079b215e71226d8c6a682 F test/fts2r.test b154c30b63061d8725e320fba1a39e2201cadd5e F test/fts2token.test d8070b241a15ff13592a9ae4a8b7c171af6f445a F test/fts3.test 672a040ea57036fb4b6fdc09027c18d7d24ab654 -F test/fts3_common.tcl 99cf6659b87c0f74f55963c2aea03b3a7d66ceb0 -F test/fts3aa.test f267fcd6aca30fc70b81e5d82b68b34b38f581896020b57ed49e9777c7ebd85f +F test/fts3_common.tcl dffad248f9ce090800e272017d2898005c28ee6314fc1dd5550643a02666907a +F test/fts3aa.test 814d60a1ba30b4a71d8f9306a6564bc7b636dd6efacd2ad80306f9b23ef3ebee F test/fts3ab.test 7f6cf260ae80dda064023df8e8e503e9a412b91f F test/fts3ac.test 636ed7486043055d4f126a0e385f2d5a82ebbf63 F test/fts3ad.test e40570cb6f74f059129ad48bcef3d7cbc20dda49 @@ -899,7 +910,7 @@ F test/fts3ao.test 266989148fec6d9f1bb6c5382f7aa3dcea0e9cd444576e28dd2b9287ac7dd F test/fts3atoken.test 4b4c16fdcfc972f2cdbba212375a060a86ccf5f1 F test/fts3auto.test 19097050a3ca7ab7a43b2be967cb3dfd8ddf841dfdc4eac88deb172ad2f209f2 F test/fts3aux1.test 7a170e172afdbceb67f5baa05941fd4fbf56af42f61daa3d140f4b4bf4cb68f6 -F test/fts3aux2.test 7ae2b2c13aefdf4169279a27a5f51780ce57f6ba +F test/fts3aux2.test 2459e7fa3e22734aed237d1e2ae192f5541c4d8b218956ad2d90754977bf907f F test/fts3b.test c15c4a9d04e210d0be67e54ce6a87b927168fbf9c1e3faec8c1a732c366fd491 F test/fts3c.test fc723a9cf10b397fdfc2b32e73c53c8b1ec02958 F test/fts3comp1.test a0f5b16a2df44dd0b15751787130af2183167c0c @@ -907,7 +918,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test a27259f4f25d60b4eca481d050b3cfee97eddb0d937d38f231408c5239066e11 +F test/fts3corrupt4.test ff7313656c4ad446e61c41e5cb81336441eaaafe6f4fd6938f1c3ac0c985045e F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -919,10 +930,11 @@ F test/fts3expr.test ebae205a7a89446c32583bcd492dcb817b9f6b31819bb4dde2583bb99c7 F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a F test/fts3expr3.test c4d4a7d6327418428c96e0a3a1137c251b8dfbf8 F test/fts3expr4.test cac5dd815fe6b5921741abdccdde3b7f50b86394de91e13308ee7986859c4a9f -F test/fts3expr5.test f9abfffbf5e53d48a33e12a1e8f8ba2c551c9b49 -F test/fts3fault.test 9fb7d6266a38806de841f7244bac1b0fe3a1477184bbb10b172d19d2ca6ad692 +F test/fts3expr5.test 1368738e3298a7ce0dee3a44d6ebb8f468b2a76f3d1dd18d4ea6d8bc2eeccc1b +F test/fts3fault.test 798e45af84be7978ca33d5bdc94246eb44724db24174b5d8e9b1ac46c57fb08d F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0 F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641 +F test/fts3fuzz001.test e3c7b0ce9b04cc02281dcc96812a277f02df03cd7dc082055d87e11eb18aaf56 F test/fts3join.test 949b4f5ae3ae9cc2423cb865d711e32476bdb205ab2be923fdf48246e4a44166 F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 F test/fts3matchinfo.test aa66cc50615578b30f6df9984819ae5b702511cf8a94251ec7c594096a703a4a @@ -935,7 +947,7 @@ F test/fts3query.test ca033ff2ebcc22c69d89032fb0bc1850997d31e7e60ecd26440796ba16 F test/fts3rank.test cd99bc83a3c923c8d52afd90d86979cf05fc41849f892faeac3988055ef37b99 F test/fts3rnd.test 1320d8826a845e38a96e769562bf83d7a92a15d0 F test/fts3shared.test 57e26a801f21027b7530da77db54286a6fe4997e -F test/fts3snippet.test 8cf586fe4b6878192602a81a665448aacbbad80ade0867bb5299d40e73584311 +F test/fts3snippet.test dace744104d1a44dc12dc9dd10b8d7542342df503d96942b7c4a55034e761789 F test/fts3sort.test ed34c716a11cc2009a35210e84ad5f9c102362ca F test/fts3tok1.test a663f4cac22a9505400bc22aacb818d7055240409c28729669ea7d4cc2120d15 F test/fts3tok_err.test 52273cd193b9036282f7bacb43da78c6be87418d @@ -956,6 +968,7 @@ F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b F test/fts4noti.test 5553d7bb2e20bf4a06b23e849352efc022ce6309 F test/fts4onepass.test d69ddc4ee3415e40b0c5d1d0408488a87614d4f63ba9c44f3e52db541d6b7cc7 F test/fts4opt.test 0fd0cc84000743ff2a883b9b84b4a5be07249f0ba790c8848a757164cdd46b2a +F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f757380429 F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e6b3a7c95 F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d F test/func.test 09dda479bcfc568f99f3070413e9672a8eeedc1be9c5d819bf55d4788c2583b7 @@ -968,16 +981,18 @@ F test/fuzz-oss1.test e58330d01cbbd8215ee636b17a03fe220b37dbfa F test/fuzz.test 96083052bf5765e4518c1ba686ce2bab785670d1 F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1 F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c31 +F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c fda41c0e4e667fae96b002410bb19cece7a33314264ed6bbc6d012909ee9fd58 +F test/fuzzcheck.c 7ab35ca464fa0fa9c8340b71f08a16c50c14b961264c172cc3d1a67289b2800d 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/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 +F test/fuzzdata8.db 3f7c67741ba91c13955609700a44608d2dfe4f037e508f77d236ea9abb431a02 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -991,7 +1006,7 @@ F test/hook2.test b9ff3b8c6519fb67f33192f1afe86e7782ee4ac8 F test/icu.test 41aa8847745a879b897a7febea0f8f9efc8e67fe8bf680589b6e07c7b0a1569a F test/ieee754.test 806fc0ce7f305f57e3331eaceeddcfec9339e607 F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 -F test/in.test 2fa2dfba1afe30eb830f327e7131dfadaa7a701d677de0eb65f9303d99e18fe0 +F test/in.test 63933d7b71eed01a49df55541a73a75398302b50a05b5333f90481460a32ff49 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 F test/in4.test d2b38cba404bc4320f4fe1b595b3d163f212c068 @@ -1013,20 +1028,21 @@ F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407 F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0 F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 -F test/index6.test d07ea75b8c21f125c6f325522e8df8c05c91e9251ec923a31d0582b2ba4a617d +F test/index6.test 6b3e6cd4bef343ed4541e74c55936ed112962a6552c085242612b598e12910a4 F test/index7.test 72b59b8ddc5c13f4962886b4011eb9975014317d17ef36c6297921362fb7dd98 F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e F test/indexexpr1.test 635261197bcdc19b9b2c59bbfa7227d525c00e9587faddb2d293c44d287ce60e -F test/indexexpr2.test fc994dcd4b3da932d4add8e65ed7ca08166d541e00a46874cfacd98dfb93a31b +F test/indexexpr2.test 38020c247ee77ba19322fadde99db84bdf2aef34f714866786563c3834bb2dce F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 -F test/insert.test 5604b1ff5675cc84c34a5b315792b958f48c32edccc0dafcc81d3b776270b70a +F test/insert.test 9773604f8e1a2595f51488a5643c359d8a11dc55a11cb185910d93387d378458 F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 F test/insert3.test 1b7db95a03ad9c5013fdf7d6722b6cd66ee55e30 F test/insert4.test 46bead5f39e181850ee56adcf49d3a3157c460c52249211714612ac89fe34835 F test/insert5.test 394f96728d1258f406fe5f5aeb0aaf29487c39a6 +F test/insertfault.test ac63d14ea3b49c573673a572f4014b9117383a03e497c58f308b5c776e4a7f74 F test/instr.test 9a8802f28437d8ade53fedfc47b2ca599b4e48ba F test/instrfault.test 0f870b218ea17cd477bb19ed330eecdb460dd53a F test/intarray.test 8319986182af37c8eb4879c6bfe9cf0074e9d43b193a4c728a0efa3417c53fb7 @@ -1041,11 +1057,11 @@ F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b F test/istrue.test 62372ad3ddcc5d0eb8ff9097dcb0aad8961bf1b9cb45ba634f6e284695126f9a -F test/join.test 2ad9d7fe10e0cc06bc7803c22e5533be11cdadbc592f5f95d789a873b57a5a66 +F test/join.test d53a3662762eff50b65da8775201e609878a27dd0885a1ae7bcde9bb46cecbc5 F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 -F test/join5.test 5a2da0c3ea852a7063d3e72fc7d5a04a6de5ef6e6d85092582f69033f7459adc +F test/join5.test f8b5ffdf3c1513486b52ad4e49225507ecee5005f210eb18688f791d25370972 F test/join6.test cfe6503791ceb0cbb509966740286ec423cbf10b F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497 F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4 @@ -1053,7 +1069,7 @@ F test/journal3.test c9c29883f5bf535ae82ae21c472df6263806a22e467b6db7cd0d6d54530 F test/jrnlmode.test a6693f2bed4541a21e703aaa37bb3e10de154130645952933b82b2dec0a8b539 F test/jrnlmode2.test 8759a1d4657c064637f8b079592651530db738419e1d649c6df7048cd724363d F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa -F test/json101.test b40a9f5395d8e669b0bc3eb550ad2ae9e5ada01fbce23c446c2a30a305a6d575 +F test/json101.test 8f8977b00ba02f9a26c1d1f52f29f540f6d5eb162cbd5eb78bb805366d4ab26d F test/json102.test eeb54efa221e50b74a2d6fb9259963b48d7414dca3ce2fdfdeed45cb28487bc1 F test/json103.test aff6b7a4c17d5a20b487a7bc1a274bfdc63b829413bdfb83bedac42ec7f67e3b F test/json104.test 877d5845f6303899b7889ea5dd1bea99076e3100574d5c536082245c5805dcaa @@ -1076,7 +1092,7 @@ F test/lock4.test 27143363eda1622f03c133efc8db808fc331afd973486cb571ea71cd717d37 F test/lock5.test c6c5e0ebcb21c61a572870cc86c0cb9f14cede38 F test/lock6.test ad5b387a3a8096afd3c68a55b9535056431b0cf5 F test/lock7.test 49f1eaff1cdc491cc5dee3669f3c671d9f172431 -F test/lock_common.tcl 7ffb45accf6ee91c736df9bafe0806a44358f035 +F test/lock_common.tcl 2f3f7f2e9637f93ccf609df48ef5b27a50278b6b1cd752b445d52262e5841413 F test/lookaside.test 5a828e7256f1ee4da8e1bdaa03373a3ccdb0f1ff98dfa82e9b76cb41a45b1083 F test/main.test 6bbb3999fd461eb8fb335cbab97409a3d7f91bbb8da60635e8be3e4a04a77772 F test/make-where7.tcl 05c16b5d4f5d6512881dfec560cb793915932ef9 @@ -1107,7 +1123,7 @@ F test/malloctraceviewer.tcl b7a54595270c1d201abf1c3f3d461f27eaf24cdef623ad08a0f F test/manydb.test 28385ae2087967aa05c38624cec7d96ec74feb3e F test/mem5.test c6460fba403c5703141348cd90de1c294188c68f F test/memdb.test c1f2a343ad14398d5d6debda6ea33e80d0dafcc7 -F test/memdb1.test 61aa1dbdeea6320791d2ff42a9a6149d5716be674bf06ee0ffa0aad1bf3eb5f8 +F test/memdb1.test 0632e6ea56c48e3c6e9b0c73e120310bad8f93762543f809e267888f5a37943f F test/memleak.test 10b9c6c57e19fc68c32941495e9ba1c50123f6e2 F test/memsubsys1.test 9e7555a22173b8f1c96c281ce289b338fcba2abe8b157f8798ca195bbf1d347e F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08 @@ -1115,13 +1131,13 @@ F test/minmax.test 6751e87b409fe11b02e70a306d846fa544e25a41 F test/minmax2.test dae92964ac87c1d2ef978c582e81a95e11c00f1cbef68980bfb2abaf10315063 F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354 F test/minmax4.test 936941484ebdceb8adec7c86b6cd9b6e5e897c1f -F test/misc1.test c8cfd1c3f842b3341fda9d81a96236d5c76ca89973aeff3fe50bac6fefcfc421 +F test/misc1.test 7ce84b25df9872e7d7878613a96815d2ba5bc974ac4e15a50118dde8f3917599 F test/misc2.test 00d7de54eda90e237fc9a38b9e5ccc769ebf6d4d F test/misc3.test cf3dda47d5dda3e53fc5804a100d3c82be736c9d F test/misc4.test 10cd6addb2fa9093df4751a1b92b50440175dd5468a6ec84d0386e78f087db0e F test/misc5.test c4aeaa0fa28faa08f2485309c38db4719e6cd1364215d5687a5b96d340a3fa58 F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91 -F test/misc7.test 10d639a5e0fdf1bd51ad42be705393a38780ad71b6957110035a4e6c1e5e7f40 +F test/misc7.test 4f21954012e4eb0a923c54a311f38c81bf6798ccdd7b51584db46d4007f63daa F test/misc8.test 8fb0f31d7a8aed484d759773ab8ad12ec746a477f4a67394a4af0e677494c3ca F test/misuse.test 9e7f78402005e833af71dcab32d048003869eca5abcaccc985d4f8dc1d86bcc7 F test/mjournal.test 28a08d5cb5fb5b5702a46e19176e45e964e0800d1f894677169e79f34030e152 @@ -1140,7 +1156,7 @@ F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 F test/nan.test 437d40e6d0778b050d7750726c0cbd2c9936b81962926e8f8c48ca698f00f4d1 F test/nockpt.test 8c43b25af63b0bd620cf1b003529e37b6f1dc53bd22690e96a1bd73f78dde53a F test/nolock.test f196cf8b8fbea4e2ca345140a2b3f3b0da45c76e -F test/normalize.test 6a80564d2000702b5919ed2c1069fef0f95762142bc96a71b4c124a845165713 +F test/normalize.test 422027884ffb67ebba32bb78487c67cf67643496d19c077b07044bdba071a3f6 F test/notify1.test 669b2b743618efdc18ca4b02f45423d5d2304abf F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 @@ -1163,7 +1179,7 @@ F test/orderby7.test 3d1383d52ade5b9eb3a173b3147fdd296f0202da F test/orderby8.test 23ef1a5d72bd3adcc2f65561c654295d1b8047bd F test/orderby9.test 87fb9548debcc2cd141c5299002dd94672fa76a3 F test/oserror.test e7b3416be4b9d5dd2fe0b42dd394daaddbb6c83eeec1f0e47b120b53e0ad3ace -F test/ossfuzz.c 273eaea2d65b70d77ea4f01404114b9e0244488943f768dc39458c72bd722e0e +F test/ossfuzz.c 18af635fa73d12a109b305faca727a734c1fa28a421b161d9d15c5a84a4998a2 F test/ossshell.c f125c5bd16e537a2549aa579b328dd1c59905e7ab1338dfc210e755bb7b69f17 F test/ovfl.test 199c482696defceacee8c8e0e0ef36da62726b2f F test/pager1.test 1e9ee778bdeaf4f7f09997d029cdaca6a42dfc2092edafe4f5e590acbf1eab13 @@ -1179,7 +1195,7 @@ F test/parser1.test 6ccdf5e459a5dc4673d3273dc311a7e9742ca952dd0551a6a6320d27035c F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff -F test/permutations.test cf0b4e498db1d0143c19641d4420df7cc27fab2c95ed0abd2c7c5753beab25b8 +F test/permutations.test 52d2c37fe8cc07ec7362024c214b04bb69432995b3a984a3fbabc60fa6ada3ee F test/pg_common.tcl 301ac19c1a52fd55166d26db929b3b89165c634d52b5f8ad76ea8cb06960db30 F test/pragma.test c267bf02742c823a191960895b3d52933cebd7beee26757d1ed694f213fcd867 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f @@ -1187,6 +1203,7 @@ F test/pragma3.test 8300aa9c63cff1027006ca34bf413a148abbd6dcd471fa9a1ded322fe18c F test/pragma4.test 52d8186f9e8d09b87189432cdd401dfa66d0b32445e837fa19046c8ae7621b0e F test/pragma5.test 824ce6ced5d6b7ec71abe37fc6005ff836fe39d638273dc5192b39864b9ee983 F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 +F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9 F test/printf.test a3e559bc9d922e7fe44e9d05c6965fee34fe3bc28300a4248c6a063425246ffd F test/printf2.test 30b5dd0b4b992dc5626496846ecce17ff592cacbcb11c3e589f3ac4d7e129dae F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb @@ -1205,8 +1222,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 b290d538ffcb2ff711f09eadc7396c1a42580f3fb078605471dc8875ca0b4d1e x -F test/resetdb.test 373a9eb8fcbd58bf87affec6a88c6353038f98a5d25be5ab75a0b9636c462a36 +F test/releasetest.tcl 7712811e0f4e2f198ec786cb2e1352b3793d7395f48a3cceef0572d8823eb75e x +F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6 @@ -1217,7 +1234,7 @@ F test/rowid.test 5b7509f384f4f6fae1af3c8c104c8ca299fea18d F test/rowvalue.test b8680f07d19c8c5223b808bba998faffcec6d505f5689ff6070280119173bb51 F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 -F test/rowvalue4.test 2b20468da3775aba971caf3158e9696a4d99c69a7623fb495f332a596daebbee +F test/rowvalue4.test 02e35f7762371c2f57ebd856aa056eac56cb27ef7715a0bb31eac1895a745356 F test/rowvalue5.test c81c7d8cf36711ab37675ad7376084ae2a359cb6 F test/rowvalue6.test d19b54feb604d5601f8614b15e214e0774c01087 F test/rowvalue7.test 5d06ff19d9e6969e574a2e662a531dd0c67801a8 @@ -1243,7 +1260,7 @@ F test/schema6.test e4bd1f23d368695eb9e7b51ef6e02ca0642ea2ab4a52579959826b5e7dce F test/schemafault.test 1936bceca55ac82c5efbcc9fc91a1933e45c8d1e1d106b9a7e56c972a5a2a51e F test/securedel.test 2f70b2449186a1921bd01ec9da407fbfa98c3a7a5521854c300c194b2ff09384 F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 -F test/select1.test 2e760bab8f3658b3b97debcf52860d0d2e20aa6cbe8b40e678ddb99871a15491 +F test/select1.test 7d41f354998524070317207d4e2b68e725e4cf14a57835fc746d4bea686a8714 F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 F test/select3.test 2ce595f8fb8e2ac10071d3b4e424cadd4634a054 F test/select4.test 5389d9895968d1196c457d59b3ee6515d771d328 @@ -1275,14 +1292,15 @@ F test/sharedA.test 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69 F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 -F test/shell1.test d2bf5daeb6f449f0169c9ef3094db17a16a02199c5dcf1a635a3e79b07eb0edd +F test/shell1.test 0378c4e9e800da6fbb3c86c0c8f2cf5efc9e4155b4b6447d27dc71de648fc0a1 F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 -F test/shell4.test 89ad573879a745974ff2df20ff97c5d6ffffbd5d +F test/shell4.test 1c6aef11daaa2d6830acaba3ac9cbec93fbc1c3d5530743a637f39b3987d08ce F test/shell5.test 23939a4c51f0421330ea61dbd3c74f9c215f5f8d3d1a94846da6ffc777a35458 F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae97f F test/shell8.test 96be02ea0c21f05b24c1883d7b711a1fa8525a68ab7b636aacf6057876941013 +F test/shmlock.test 3dbf017d34ab0c60abe6a44e447d3552154bd0c87b41eaf5ceacd408dd13fda5 F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 F test/shrink.test 1b4330b1fd9e818c04726d45cb28db73087535ce @@ -1296,7 +1314,7 @@ F test/snapshot.test a504f2e7009f512ef66c719f0ea1c55a556bdaf1e1312c80a04d46fc1a3 F test/snapshot2.test 8d6ff5dd9cc503f6e12d408a30409c3f9c653507b24408d9cd7195931c89bc54 F test/snapshot3.test 8744313270c55f6e18574283553d3c5c5fe4c5970585663613a0e75c151e599b F test/snapshot4.test d4e9347ef2fcabc491fc893506c7bbaf334da3be111d6eb4f3a97cc623b78322 -F test/snapshot_fault.test 508ae6f211d4991e9ff3b5080aeb0a179bf6755138aabeac4bca8083044d895a +F test/snapshot_fault.test f6c5ef7cb93bf92fbb4e864ecc5c87df7d3a250064838822db5b4d3a5563ede4 F test/snapshot_up.test a0a29c4cf33475fcef07c3f8e64af795e24ab91b4cc68295863402a393cdd41c F test/soak.test 18944cf21b94a7fe0df02016a6ee1e9632bc4e8d095a0cb49d95e15d5cca2d5c F test/softheap1.test 843cd84db9891b2d01b9ab64cef3e9020f98d087 @@ -1343,7 +1361,7 @@ F test/sync.test 89539f4973c010eda5638407e71ca7fddbcd8e0594f4c9980229f804d433309 F test/sync2.test 8f9f7d4f6d5be8ca8941a8dadcc4299e558cb6a1ff653a9469146c7a76ef2039 F test/syscall.test a39d9a36f852ae6e4800f861bc2f2e83f68bbc2112d9399931ecfadeabd2d69d F test/sysfault.test c9f2b0d8d677558f74de750c75e12a5454719d04 -F test/tabfunc01.test 54300134f76db817685194d2f0e63e3fbf7380b45e0d426e00a9aee752497cfb +F test/tabfunc01.test 20e98ffe55f35d8d33fd834ca8bf9d4b637e560af8fcd00464b4154d90a4db45 F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 @@ -1355,7 +1373,7 @@ F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 F test/temptable2.test d2940417496e2b9548e01d09990763fbe88c316504033256d51493e1f1a5ce6a F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc -F test/tester.tcl fa5656391e3b477508abe12b3b81f019b2e71397399ab38a2f32d8d7f3bf8e56 +F test/tester.tcl 499a5086815aa416d971ff438d7425c64f41ed3233251db4836d270f9a6671e8 F test/thread001.test b61a29dd87cf669f5f6ac96124a7c97d71b0c80d9012746072055877055cf9ef F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 @@ -1530,10 +1548,10 @@ F test/trigger8.test 30cb0530bd7c4728055420e3f739aa00412eafa4 F test/trigger9.test 2226ec795a33b0460ab5cf8891e9054cc7edef41 F test/triggerA.test 837be862d8721f903dba3f3ceff05b32e0bee5214cf6ea3da5fadf12d3650e9d F test/triggerB.test 56780c031b454abac2340dbb3b71ac5c56c3d7fe -F test/triggerC.test 302d8995f5ffe63bbc15053abb3ef7a39cf5a092 +F test/triggerC.test c7fbc3eb241b5a7ba4b0815f76c3708483e91890f9573add12a610c45b2a6022 F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650 F test/triggerE.test ede2e4bce4ba802337bd69d39447fa04a938e06d84a8bfc53c76850fc36ed86d -F test/triggerF.test 6a8c22bd058cf467f0c7d112afe87f7a8c579c0c4681b914b8f19020f48528a4 +F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad F test/triggerG.test d5caeef6144ede2426dd13211fd72248241ff2ebc68e12a4c0bf30f5faa21499 F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a @@ -1543,14 +1561,14 @@ 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 5ae0f0b4f302a4c6bb310b64386f9ac6a4c1c271c08f31cc7c5d92722e2b2729 +F test/unionvtab.test e1704ab1b4c1bb3ffc9da4681f8e85a0b909fd80b937984fc94b27415ac8e5a4 F test/unionvtabfault.test e8759f3d14fb938ce9657e2342db34aeac0fb9bc1692b0d1ebb0069630151d06 F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 F test/unordered.test ffeea7747d5ba962a8009a20b7e53d68cbae05b063604c68702c5998eb50c981 F test/update.test 1148de8d913e9817717990603aadeca07aab9ddbb10a30f167cbfd8d3a3ccb60 -F test/update2.test 5e67667e1c54017d964e626db765cf8bedcf87483c184f4c575bdb8c1dd2313e +F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 F test/upsert1.test 994bde41800bb77dbe32fcd2e1f6c4b49cc9f2c6cd345731c774dff02b51c110 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c @@ -1560,6 +1578,7 @@ F test/uri.test 3481026f00ade6dfe8adb7acb6e1e47b04369568 F test/uri2.test 9d3ba7a53ee167572d53a298ee4a5d38ec4a8fb7 F test/userauth01.test e740a2697a7b40d7c5003a7d7edaee16acd349a9 F test/utf16align.test 54cd35a27c005a9b6e7815d887718780b6a462ae +F test/vacuum-into.test 41d84c0603f3e8f3540321e5974d69008c562238c30924a9390c211a8c0a415e F test/vacuum.test ce91c39f7f91a4273bf620efad21086b5aa6ef1d F test/vacuum2.test aa048abee196c16c9ba308465494009057b79f9b F test/vacuum3.test 77ecdd54592b45a0bcb133339f99f1ae0ae94d0d @@ -1590,7 +1609,8 @@ F test/vtabJ.test d7b73675708cf63cfcb9d443bb451fc01a028347275b7311e51f9fdf3ca675 F test/vtab_alter.test 736e66fb5ec7b4fee58229aa3ada2f27ec58bc58c00edae4836890c3784c6783 F test/vtab_err.test dcc8b7b9cb67522b3fe7a272c73856829dae4ab7fdb30399aea1b6981bda2b65 F test/vtab_shared.test 5253bff2355a9a3f014c15337da7e177ab0ef8ad -F test/wal.test 613efec03e517e1775d86b993a54877d2e29a477 +F test/vtabdrop.test 65d4cf6722972e5499bdaf0c0d70ee3b8133944a4e4bc31862563f32a7edca12 +F test/wal.test cdf0ca6cc0447520d19ef1c83287824ebeb3e82d75af856511ba96841a79fc9b F test/wal2.test 155b9efa999bdb38ce1cd729b9a4fcdbffd6b88be27f039bad1d2929d287d918 F test/wal3.test 2a93004bc0fb2b5c29888964024695bade278ab2 F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c @@ -1610,6 +1630,7 @@ F test/walcrash2.test a0edab4e5390f03b99a790de89aad15d6ec70b36 F test/walcrash3.test e426aa58122d20f2b9fbe9a507f9eb8cab85b8af F test/walcrash4.test e7b6e7639a950a0cca8e210e248c8dad4d63bf20 F test/walfault.test 09b8ad7e52d2f54bce50e31aa7ea51412bb9f70ac13c74e669ddcd8b48b0d98d +F test/walfault2.test e039ac66c78d5561683cacde04097213cdad3b58e2b3f3fe1112862217bfd915 F test/walhook.test ed00a40ba7255da22d6b66433ab61fab16a63483 F test/walmode.test cd6e7cff618eaaa5910ce57c3657aa50110397f86213886a2400afb9bfec7b7b F test/walnoshm.test 84ca10c544632a756467336b7c3b864d493ee496 @@ -1623,15 +1644,16 @@ F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cf F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 -F test/where.test 8215d220633f08da331781cf9ede7fb7aed50eb113473c10acd39a643fd258ba +F test/walvfs.test c0faffda13d045a96dfc541347886bb1a3d6f3205857fc98e683edfab766ea88 +F test/where.test 93738e224cd5e7819565a9f272c19fd0ee5893d9cd7f5238ce026bae09b8d710 F test/where2.test 478d2170637b9211f593120648858593bf2445a1 F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8 F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2 F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b -F test/where7.test e579da972eb3372edc9de850efc221848c763f9e4feafc8426d84a4453b92b23 +F test/where7.test 75722434c486ac9e74718caa6cce234f45ba34c0b6c0f9555b29eb8bb5f6ade1 F test/where8.test 461ca40265ed996a6305da99bb024b0e41602bb586acf544c08f95922358e49f -F test/where9.test ad2ddb339d10d324763c3da60502b8631f15a2397b869192fbd4e82f40e167d3 +F test/where9.test 4fb43ad451758d9535693e110d4398fb6a6e3e153dc57bba5e61f884566c725f F test/whereA.test 6c6a420ca7d313242f9b1bd471dc80e4d0f8323700ba9c78df0bb843d4daa3b4 F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5 F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6 @@ -1640,7 +1662,7 @@ F test/whereE.test b3a055eef928c992b0a33198a7b8dc10eea5ad2f F test/whereF.test 3d9412b1199d3e2bed34fcb76b4c48d0bf4df95d27e3f8dd27b6f8b4716d0d89 F test/whereG.test 0158783235a6dd82fc0e37652b8522b186b9510594ac0a4bff0c4101b4396a52 F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2 -F test/whereI.test b7769ee8dbefd987fb266715fee887f05f9ff180016b06fca7fa402df739193b +F test/whereI.test a2874062140ed4aba9ffae76e6190a3df6fc73d1373fdfa8fd632945082a5364 F test/whereJ.test 88287550f6ee604422403b053455b1ad894eeaa5c35d348532dfa1439286cb9a F test/whereK.test f8e3cf26a8513ecc7f514f54df9f0572c046c42b F test/whereL.test 0a19fc44cd1122040f56c934f1b14d0ca85bde28f270268a428dd9796ea0634c @@ -1653,7 +1675,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 02e481ac48c445b43bab7b3cf1e4115165b5127a1aa29e14f5372922c836f1a4 +F test/window1.test d141eba02ee4d7441dcb45148d776aded21992e8de6ddbbe2aae8151e5fad45e F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143 F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e F test/window3.tcl 577a3b1ff913208e5248c04dab9df17fd760ce159a752789e26d0cb4a5f91823 @@ -1663,9 +1685,9 @@ F test/window4.test c5d6bf3403e4ade2f19df2afe4c16f29fb817c392c6c1c8017edb7165c19 F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652821e F test/window6.test 5eae4ae7a590ccf1e605880969ca0bad3955616ac91cad3031baea38748badb3 F test/windowfault.test 12ceb6bbb355d13e8fcd88c5731a57256dfdf77b9a7ae20842a76fcd4623df5b -F test/with1.test 2465d98ffce80d00553ac7135697c18b0369275b6ecc750daa2af320b8c812ca +F test/with1.test a07b5aad7f77acdf13e52e8814ea94606fcc72e9ea4c99baf293e9d7c63940be F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab -F test/with3.test 5e8ce2c585170bbbc0544e2a01a4941fa0be173ba5265e5c92eb588cd99a232d +F test/with3.test 8d26920c88283e0a473ceebd3451554922108ce7b2a6a1157c47eb0a7011212c F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 F test/without_rowid1.test 533add9100255e4cc430d371b3ecfb79f11f956b86c3a1b9d34413bf8e482d8f @@ -1676,7 +1698,7 @@ F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a F test/without_rowid6.test 1f99644e6508447fb050f73697350c7ceca3392e F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912adec66 F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc -F test/zeroblob.test 3857870fe681b8185654414a9bccfde80b62a0fa +F test/zeroblob.test 07a5b11ab591d1f26c626945fb7f228f68b993533b2ada77273edf6ee29db174 F test/zerodamage.test 9c41628db7e8d9e8a0181e59ea5f189df311a9f6ce99cc376dc461f66db6f8dc F test/zipfile.test b3b558639f7a103e095713ad0f57fec1fce1b7d60c8054df5789b98f7547a395 F test/zipfile2.test 9903388a602a3834189857a985106ff95c3bba6a3969e0134127df991889db5d @@ -1690,6 +1712,8 @@ F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 F tool/cg_anno.tcl f95b0006c52cf7f0496b506343415b6ee3cdcdd3 x F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2 F tool/dbhash.c a06228aa21ebc4e6ea8daa486601d938499238a5 +F tool/dbtotxt.c 04e25f26be7c7743cdfb4111a8483de0b111925d6afeeb7559ade0ceb73f7f52 +F tool/dbtotxt.md c9a57af8739957ef36d2cfad5c4b1443ff3688ed33e4901ee200c8b651f43f3c F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 F tool/fast_vacuum.c 5ba0d6f5963a0a63bdc42840f678bad75b2ebce1 F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439 @@ -1697,9 +1721,10 @@ F tool/fuzzershell.c e1d90a03ca790d7c331c2aae08ca46ff435f1ae1faa6cb9cc48f4687c18 F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a5a4f F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce +F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f -F tool/lemon.c 60d1e1eb0f7ebae709f68f1472d77fbf291c5345cd98ff417219da7e74fd09e9 -F tool/lempar.c 452f12d40229847634a160e5666b6c4ec4392fd81941c3443861b48d497054cc +F tool/lemon.c 900a15b9efba9890d10e7959914db94c4ad5162912127f061c4328add122d6fb +F tool/lempar.c 61af95b8fac2bfd59c09d55330e78f3f5e352d7aa80bf37404b96ef795be3fdc F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca @@ -1712,7 +1737,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 a1334e70a08fdf5de32cd0093613212bb11ac8f880487540987175c536ac335f +F tool/mkpragmatab.tcl 49039adedafbc430d2959400da2e0e8f20ef8dcf6898e447c946e7d50ef5906b F tool/mkshellc.tcl 1f45770aea226ac093a9c72f718efbb88a2a2833409ec2e1c4cecae4202626f5 F tool/mksourceid.c d458f9004c837bee87a6382228ac20d3eae3c49ea3b0a5aace936f8b60748d3b F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1779,11 +1804,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 23684cb841ac2cb0d69e5470253bd96feb733762a7553b952a08470834fe85fa -R dcc394af10af6094607f56a6086fb748 +P a21ffcd8176672e791c11e7d3869878b0655e9f7fb3646378421fb7480d4d8c6 +R a79d07126ad692dd98c735ebc3ce8975 T +bgcolor * #d0c0ff T +sym-release * -T +sym-version-3.26.0 * +T +sym-version-3.27.2 * U drh -Z 560a5decbb241d53eb97e72267b6e6e8 +Z 1721b9485efb0ba623f21704b685d9c7 # Remove this line to create a well-formed manifest. diff --git a/sqlite/manifest.uuid b/sqlite/manifest.uuid index 166b1b3d..c42113e3 100644 --- a/sqlite/manifest.uuid +++ b/sqlite/manifest.uuid @@ -1 +1 @@ -bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238b4f9 +bd49a8271d650fa89e446b42e513b595a717b9212c91dd384aab871fc1d0f6d7 diff --git a/sqlite/src/alter.c b/sqlite/src/alter.c index 1280e905..e1863385 100644 --- a/sqlite/src/alter.c +++ b/sqlite/src/alter.c @@ -28,9 +28,16 @@ ** ** Or, if zName is not a system table, zero is returned. */ -static int isSystemTable(Parse *pParse, const char *zName){ - if( 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){ - sqlite3ErrorMsg(pParse, "table %s may not be altered", zName); +static int isAlterableTable(Parse *pParse, Table *pTab){ + if( 0==sqlite3StrNICmp(pTab->zName, "sqlite_", 7) +#ifndef SQLITE_OMIT_VIRTUALTABLE + || ( (pTab->tabFlags & TF_Shadow) + && (pParse->db->flags & SQLITE_Defensive) + && pParse->db->nVdbeExec==0 + ) +#endif + ){ + sqlite3ErrorMsg(pParse, "table %s may not be altered", pTab->zName); return 1; } return 0; @@ -126,7 +133,7 @@ void sqlite3AlterRenameTable( /* Make sure it is not a system table being altered, or a reserved name ** that the table is being renamed to. */ - if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ){ + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ){ goto exit_rename_table; } if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ goto @@ -424,7 +431,7 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ sqlite3ErrorMsg(pParse, "Cannot add a column to a view"); goto exit_begin_add_column; } - if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ){ + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ){ goto exit_begin_add_column; } @@ -526,7 +533,7 @@ void sqlite3AlterRenameColumn( if( !pTab ) goto exit_rename_column; /* Cannot alter a system table */ - if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ) goto exit_rename_column; + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ) goto exit_rename_column; if( SQLITE_OK!=isRealTable(pParse, pTab) ) goto exit_rename_column; /* Which schema holds the table to be altered */ @@ -780,14 +787,31 @@ static void renameTokenFind(Parse *pParse, struct RenameCtx *pCtx, void *pPtr){ } } +/* +** Iterate through the Select objects that are part of WITH clauses attached +** to select statement pSelect. +*/ +static void renameWalkWith(Walker *pWalker, Select *pSelect){ + if( pSelect->pWith ){ + int i; + for(i=0; ipWith->nCte; i++){ + Select *p = pSelect->pWith->a[i].pSelect; + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pWalker->pParse; + sqlite3SelectPrep(sNC.pParse, p, &sNC); + sqlite3WalkSelect(pWalker, p); + } + } +} + /* ** This is a Walker select callback. It does nothing. It is only required ** because without a dummy callback, sqlite3WalkExpr() and similar do not ** descend into sub-select statements. */ static int renameColumnSelectCb(Walker *pWalker, Select *p){ - UNUSED_PARAMETER(pWalker); - UNUSED_PARAMETER(p); + renameWalkWith(pWalker, p); return WRC_Continue; } @@ -937,7 +961,6 @@ static int renameParseSql( rc = sqlite3RunParser(p, zSql, &zErr); assert( p->zErrMsg==0 ); assert( rc!=SQLITE_OK || zErr==0 ); - assert( (0!=p->pNewTable) + (0!=p->pNewIndex) + (0!=p->pNewTrigger)<2 ); p->zErrMsg = zErr; if( db->mallocFailed ) rc = SQLITE_NOMEM; if( rc==SQLITE_OK @@ -1120,6 +1143,7 @@ static int renameResolveTrigger(Parse *pParse, const char *zDb){ } sNC.ncFlags = 0; } + sNC.pSrcList = 0; } } } @@ -1157,11 +1181,15 @@ static void renameWalkTrigger(Walker *pWalker, Trigger *pTrigger){ */ static void renameParseCleanup(Parse *pParse){ sqlite3 *db = pParse->db; + Index *pIdx; if( pParse->pVdbe ){ sqlite3VdbeFinalize(pParse->pVdbe); } sqlite3DeleteTable(db, pParse->pNewTable); - if( pParse->pNewIndex ) sqlite3FreeIndex(db, pParse->pNewIndex); + while( (pIdx = pParse->pNewIndex)!=0 ){ + pParse->pNewIndex = pIdx->pNext; + sqlite3FreeIndex(db, pIdx); + } sqlite3DeleteTrigger(db, pParse->pNewTrigger); sqlite3DbFree(db, pParse->zErrMsg); renameTokenFree(db, pParse->pRename); @@ -1272,6 +1300,9 @@ static void renameColumnFunc( for(pIdx=sParse.pNewTable->pIndex; pIdx; pIdx=pIdx->pNext){ sqlite3WalkExprList(&sWalker, pIdx->aColExpr); } + for(pIdx=sParse.pNewIndex; pIdx; pIdx=pIdx->pNext){ + sqlite3WalkExprList(&sWalker, pIdx->aColExpr); + } } for(pFKey=sParse.pNewTable->pFKey; pFKey; pFKey=pFKey->pNextFrom){ @@ -1358,12 +1389,17 @@ static int renameTableSelectCb(Walker *pWalker, Select *pSelect){ int i; RenameCtx *p = pWalker->u.pRename; SrcList *pSrc = pSelect->pSrc; + if( pSrc==0 ){ + assert( pWalker->pParse->db->mallocFailed ); + return WRC_Abort; + } for(i=0; inSrc; i++){ struct SrcList_item *pItem = &pSrc->a[i]; if( pItem->pTab==p->pTab ){ renameTokenFind(pWalker->pParse, p, pItem->zName); } } + renameWalkWith(pWalker, pSelect); return WRC_Continue; } diff --git a/sqlite/src/analyze.c b/sqlite/src/analyze.c index 5075b578..e6b27aaa 100644 --- a/sqlite/src/analyze.c +++ b/sqlite/src/analyze.c @@ -1156,7 +1156,7 @@ static void analyzeOneTable( addrNextRow = sqlite3VdbeCurrentAddr(v); if( nColTest>0 ){ - int endDistinctTest = sqlite3VdbeMakeLabel(v); + int endDistinctTest = sqlite3VdbeMakeLabel(pParse); int *aGotoChng; /* Array of jump instruction addresses */ aGotoChng = sqlite3DbMallocRawNN(db, sizeof(int)*nColTest); if( aGotoChng==0 ) continue; diff --git a/sqlite/src/attach.c b/sqlite/src/attach.c index 0b87d24c..224d120b 100644 --- a/sqlite/src/attach.c +++ b/sqlite/src/attach.c @@ -155,8 +155,8 @@ static void attachFunc( assert( pVfs ); flags |= SQLITE_OPEN_MAIN_DB; rc = sqlite3BtreeOpen(pVfs, zPath, db, &pNew->pBt, 0, flags); - sqlite3_free( zPath ); db->nDb++; + pNew->zDbSName = sqlite3DbStrDup(db, zName); } db->noSharedCache = 0; if( rc==SQLITE_CONSTRAINT ){ @@ -184,7 +184,6 @@ static void attachFunc( sqlite3BtreeLeave(pNew->pBt); } pNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; - if( !REOPEN_AS_MEMDB(db) ) pNew->zDbSName = sqlite3DbStrDup(db, zName); if( rc==SQLITE_OK && pNew->zDbSName==0 ){ rc = SQLITE_NOMEM_BKPT; } @@ -212,15 +211,19 @@ static void attachFunc( break; case SQLITE_NULL: - /* No key specified. Use the key from the main database */ - sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); - if( nKey || sqlite3BtreeGetOptimalReserve(db->aDb[0].pBt)>0 ){ - rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); + /* No key specified. Use the key from URI filename, or if none, + ** use the key from the main database. */ + if( sqlite3CodecQueryParameters(db, zName, zPath)==0 ){ + sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); + if( nKey || sqlite3BtreeGetOptimalReserve(db->aDb[0].pBt)>0 ){ + rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); + } } break; } } #endif + sqlite3_free( zPath ); /* If the file was opened successfully, read the schema for the new database. ** If this fails, or if opening the file failed, then close the file and diff --git a/sqlite/src/btree.c b/sqlite/src/btree.c index 137500ee..3b7ef906 100644 --- a/sqlite/src/btree.c +++ b/sqlite/src/btree.c @@ -660,13 +660,19 @@ static int saveCursorKey(BtCursor *pCur){ /* Only the rowid is required for a table btree */ pCur->nKey = sqlite3BtreeIntegerKey(pCur); }else{ - /* For an index btree, save the complete key content */ + /* For an index btree, save the complete key content. It is possible + ** that the current key is corrupt. In that case, it is possible that + ** the sqlite3VdbeRecordUnpack() function may overread the buffer by + ** up to the size of 1 varint plus 1 8-byte value when the cursor + ** position is restored. Hence the 17 bytes of padding allocated + ** below. */ void *pKey; pCur->nKey = sqlite3BtreePayloadSize(pCur); - pKey = sqlite3Malloc( pCur->nKey ); + pKey = sqlite3Malloc( pCur->nKey + 9 + 8 ); if( pKey ){ rc = sqlite3BtreePayload(pCur, 0, (int)pCur->nKey, pKey); if( rc==SQLITE_OK ){ + memset(((u8*)pKey)+pCur->nKey, 0, 9+8); pCur->pKey = pKey; }else{ sqlite3_free(pKey); @@ -798,11 +804,12 @@ static int btreeMoveto( UnpackedRecord *pIdxKey; /* Unpacked index key */ if( pKey ){ + KeyInfo *pKeyInfo = pCur->pKeyInfo; assert( nKey==(i64)(int)nKey ); - pIdxKey = sqlite3VdbeAllocUnpackedRecord(pCur->pKeyInfo); + pIdxKey = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); if( pIdxKey==0 ) return SQLITE_NOMEM_BKPT; - sqlite3VdbeRecordUnpack(pCur->pKeyInfo, (int)nKey, pKey, pIdxKey); - if( pIdxKey->nField==0 ){ + sqlite3VdbeRecordUnpack(pKeyInfo, (int)nKey, pKey, pIdxKey); + if( pIdxKey->nField==0 || pIdxKey->nField>pKeyInfo->nAllField ){ rc = SQLITE_CORRUPT_BKPT; goto moveto_done; } @@ -838,7 +845,7 @@ static int btreeRestoreCursorPosition(BtCursor *pCur){ sqlite3_free(pCur->pKey); pCur->pKey = 0; assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_INVALID ); - pCur->skipNext |= skipNext; + if( skipNext ) pCur->skipNext = skipNext; if( pCur->skipNext && pCur->eState==CURSOR_VALID ){ pCur->eState = CURSOR_SKIPNEXT; } @@ -908,7 +915,6 @@ int sqlite3BtreeCursorRestore(BtCursor *pCur, int *pDifferentRow){ if( pCur->eState!=CURSOR_VALID ){ *pDifferentRow = 1; }else{ - assert( pCur->skipNext==0 ); *pDifferentRow = 0; } return SQLITE_OK; @@ -992,6 +998,13 @@ static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){ *pRC = rc; return; } + if( ((char*)sqlite3PagerGetExtra(pDbPage))[0]!=0 ){ + /* The first byte of the extra data is the MemPage.isInit byte. + ** If that byte is set, it means this page is also being used + ** as a btree page. */ + *pRC = SQLITE_CORRUPT_BKPT; + goto ptrmap_exit; + } offset = PTRMAP_PTROFFSET(iPtrmap, key); if( offset<0 ){ *pRC = SQLITE_CORRUPT_BKPT; @@ -1054,7 +1067,7 @@ static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){ #else /* if defined SQLITE_OMIT_AUTOVACUUM */ #define ptrmapPut(w,x,y,z,rc) #define ptrmapGet(w,x,y,z) SQLITE_OK - #define ptrmapPutOvflPtr(x, y, rc) + #define ptrmapPutOvflPtr(x, y, z, rc) #endif /* @@ -1347,17 +1360,24 @@ static u16 cellSize(MemPage *pPage, int iCell){ #ifndef SQLITE_OMIT_AUTOVACUUM /* -** If the cell pCell, part of page pPage contains a pointer -** to an overflow page, insert an entry into the pointer-map -** for the overflow page. +** The cell pCell is currently part of page pSrc but will ultimately be part +** of pPage. (pSrc and pPager are often the same.) If pCell contains a +** pointer to an overflow page, insert an entry into the pointer-map for +** the overflow page that will be valid after pCell has been moved to pPage. */ -static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){ +static void ptrmapPutOvflPtr(MemPage *pPage, MemPage *pSrc, u8 *pCell,int *pRC){ CellInfo info; if( *pRC ) return; assert( pCell!=0 ); pPage->xParseCell(pPage, pCell, &info); if( info.nLocalaDataEnd, pCell, pCell+info.nLocal) ){ + testcase( pSrc!=pPage ); + *pRC = SQLITE_CORRUPT_BKPT; + return; + } + ovfl = get4byte(&pCell[info.nSize-4]); ptrmapPut(pPage->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, pRC); } } @@ -1412,19 +1432,14 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ ** reconstruct the entire page. */ if( (int)data[hdr+7]<=nMaxFrag ){ int iFree = get2byte(&data[hdr+1]); + + /* If the initial freeblock offset were out of bounds, that would + ** have been detected by btreeInitPage() when it was computing the + ** number of free bytes on the page. */ + assert( iFree<=usableSize-4 ); if( iFree ){ int iFree2 = get2byte(&data[iFree]); - - /* pageFindSlot() has already verified that free blocks are sorted - ** in order of offset within the page, and that no block extends - ** past the end of the page. Provided the two free slots do not - ** overlap, this guarantees that the memmove() calls below will not - ** overwrite the usableSize byte buffer, even if the database page - ** is corrupt. */ - assert( iFree2==0 || iFree2>iFree ); - assert( iFree+get2byte(&data[iFree+2]) <= usableSize ); - assert( iFree2==0 || iFree2+get2byte(&data[iFree2+2]) <= usableSize ); - + if( iFree2>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage); if( 0==iFree2 || (data[iFree2]==0 && data[iFree2+1]==0) ){ u8 *pEnd = &data[cellOffset + nCell*2]; u8 *pAddr; @@ -1435,9 +1450,9 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ return SQLITE_CORRUPT_PAGE(pPage); } if( iFree2 ){ - assert( iFree+sz<=iFree2 ); /* Verified by pageFindSlot() */ + if( iFree+sz>iFree2 ) return SQLITE_CORRUPT_PAGE(pPage); sz2 = get2byte(&data[iFree2+2]); - assert( iFree+sz+sz2+iFree2-(iFree+sz) <= usableSize ); + if( iFree2+sz2 > usableSize ) return SQLITE_CORRUPT_PAGE(pPage); memmove(&data[iFree+sz+sz2], &data[iFree+sz], iFree2-(iFree+sz)); sz += sz2; } @@ -2992,9 +3007,9 @@ static int newDatabase(BtShared*); static int lockBtree(BtShared *pBt){ int rc; /* Result code from subfunctions */ MemPage *pPage1; /* Page 1 of the database file */ - int nPage; /* Number of pages in the database */ - int nPageFile = 0; /* Number of pages in the database file */ - int nPageHeader; /* Number of pages in the database according to hdr */ + u32 nPage; /* Number of pages in the database */ + u32 nPageFile = 0; /* Number of pages in the database file */ + u32 nPageHeader; /* Number of pages in the database according to hdr */ assert( sqlite3_mutex_held(pBt->mutex) ); assert( pBt->pPage1==0 ); @@ -3007,7 +3022,7 @@ static int lockBtree(BtShared *pBt){ ** a valid database file. */ nPage = nPageHeader = get4byte(28+(u8*)pPage1->aData); - sqlite3PagerPagecount(pBt->pPager, &nPageFile); + sqlite3PagerPagecount(pBt->pPager, (int*)&nPageFile); if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){ nPage = nPageFile; } @@ -3088,6 +3103,7 @@ static int lockBtree(BtShared *pBt){ ){ goto page1_init_failed; } + pBt->btsFlags |= BTS_PAGESIZE_FIXED; assert( (pageSize & 7)==0 ); /* EVIDENCE-OF: R-59310-51205 The "reserved space" size in the 1-byte ** integer at offset 20 is the number of bytes of space at the end of @@ -3478,7 +3494,7 @@ static int setChildPtrmaps(MemPage *pPage){ for(i=0; ileaf ){ Pgno childPgno = get4byte(pCell); @@ -4404,6 +4420,7 @@ int sqlite3BtreeCloseCursor(BtCursor *pCur){ sqlite3_free(pCur->aOverflow); sqlite3_free(pCur->pKey); sqlite3BtreeLeave(pBtree); + pCur->pBtree = 0; } return SQLITE_OK; } @@ -4502,6 +4519,25 @@ u32 sqlite3BtreePayloadSize(BtCursor *pCur){ return pCur->info.nPayload; } +/* +** Return an upper bound on the size of any record for the table +** that the cursor is pointing into. +** +** This is an optimization. Everything will still work if this +** routine always returns 2147483647 (which is the largest record +** that SQLite can handle) or more. But returning a smaller value might +** prevent large memory allocations when trying to interpret a +** corrupt datrabase. +** +** The current implementation merely returns the size of the underlying +** database file. +*/ +sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + return pCur->pBt->pageSize * (sqlite3_int64)pCur->pBt->nPage; +} + /* ** Given the page number of an overflow page in the database (parameter ** ovfl), this function finds the page number of the next page in the @@ -5316,7 +5352,7 @@ int sqlite3BtreeMovetoUnpacked( ** try to get there using sqlite3BtreeNext() rather than a full ** binary search. This is an optimization only. The correct answer ** is still obtained without this case, only a little more slowely */ - if( pCur->info.nKey+1==intKey && !pCur->skipNext ){ + if( pCur->info.nKey+1==intKey ){ *pRes = 0; rc = sqlite3BtreeNext(pCur, 0); if( rc==SQLITE_OK ){ @@ -5458,7 +5494,7 @@ int sqlite3BtreeMovetoUnpacked( testcase( nCell==0 ); /* Invalid key size: 0x80 0x80 0x00 */ testcase( nCell==1 ); /* Invalid key size: 0x80 0x80 0x01 */ testcase( nCell==2 ); /* Minimum legal index key size */ - if( nCell<2 ){ + if( nCell<2 || nCell/pCur->pBt->usableSize>pCur->pBt->nPage ){ rc = SQLITE_CORRUPT_PAGE(pPage); goto moveto_finish; } @@ -5590,7 +5626,6 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ MemPage *pPage; assert( cursorOwnsBtShared(pCur) ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); if( pCur->eState!=CURSOR_VALID ){ assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); rc = restoreCursorPosition(pCur); @@ -5600,14 +5635,9 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ if( CURSOR_INVALID==pCur->eState ){ return SQLITE_DONE; } - if( pCur->skipNext ){ - assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_SKIPNEXT ); + if( pCur->eState==CURSOR_SKIPNEXT ){ pCur->eState = CURSOR_VALID; - if( pCur->skipNext>0 ){ - pCur->skipNext = 0; - return SQLITE_OK; - } - pCur->skipNext = 0; + if( pCur->skipNext>0 ) return SQLITE_OK; } } @@ -5662,7 +5692,6 @@ int sqlite3BtreeNext(BtCursor *pCur, int flags){ UNUSED_PARAMETER( flags ); /* Used in COMDB2 but not native SQLite */ assert( cursorOwnsBtShared(pCur) ); assert( flags==0 || flags==1 ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); pCur->info.nSize = 0; pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); if( pCur->eState!=CURSOR_VALID ) return btreeNext(pCur); @@ -5703,7 +5732,6 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ MemPage *pPage; assert( cursorOwnsBtShared(pCur) ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); assert( (pCur->curFlags & (BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey))==0 ); assert( pCur->info.nSize==0 ); if( pCur->eState!=CURSOR_VALID ){ @@ -5714,14 +5742,9 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ if( CURSOR_INVALID==pCur->eState ){ return SQLITE_DONE; } - if( pCur->skipNext ){ - assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_SKIPNEXT ); + if( CURSOR_SKIPNEXT==pCur->eState ){ pCur->eState = CURSOR_VALID; - if( pCur->skipNext<0 ){ - pCur->skipNext = 0; - return SQLITE_OK; - } - pCur->skipNext = 0; + if( pCur->skipNext<0 ) return SQLITE_OK; } } @@ -5756,7 +5779,6 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ int sqlite3BtreePrevious(BtCursor *pCur, int flags){ assert( cursorOwnsBtShared(pCur) ); assert( flags==0 || flags==1 ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); UNUSED_PARAMETER( flags ); /* Used in COMDB2 but not native SQLite */ pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey); pCur->info.nSize = 0; @@ -6092,7 +6114,7 @@ static int allocateBtreePage( TRACE(("ALLOCATE: %d from end of file\n", *pPgno)); } - assert( *pPgno!=PENDING_BYTE_PAGE(pBt) ); + assert( CORRUPT_DB || *pPgno!=PENDING_BYTE_PAGE(pBt) ); end_allocate_page: releasePage(pTrunk); @@ -6647,9 +6669,16 @@ static void insertCell( assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB ); assert( idx+sz <= (int)pPage->pBt->usableSize ); pPage->nFree -= (u16)(2 + sz); - memcpy(&data[idx], pCell, sz); if( iChild ){ + /* In a corrupt database where an entry in the cell index section of + ** a btree page has a value of 3 or less, the pCell value might point + ** as many as 4 bytes in front of the start of the aData buffer for + ** the source page. Make sure this does not cause problems by not + ** reading the first 4 bytes */ + memcpy(&data[idx+4], pCell+4, sz-4); put4byte(&data[idx], iChild); + }else{ + memcpy(&data[idx], pCell, sz); } pIns = pPage->aCellIdx + i*2; memmove(pIns+2, pIns, 2*(pPage->nCell - i)); @@ -6663,15 +6692,89 @@ static void insertCell( /* The cell may contain a pointer to an overflow page. If so, write ** the entry for the overflow page into the pointer map. */ - ptrmapPutOvflPtr(pPage, pCell, pRC); + ptrmapPutOvflPtr(pPage, pPage, pCell, pRC); } #endif } } +/* +** The following parameters determine how many adjacent pages get involved +** in a balancing operation. NN is the number of neighbors on either side +** of the page that participate in the balancing operation. NB is the +** total number of pages that participate, including the target page and +** NN neighbors on either side. +** +** The minimum value of NN is 1 (of course). Increasing NN above 1 +** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance +** in exchange for a larger degradation in INSERT and UPDATE performance. +** The value of NN appears to give the best results overall. +** +** (Later:) The description above makes it seem as if these values are +** tunable - as if you could change them and recompile and it would all work. +** But that is unlikely. NB has been 3 since the inception of SQLite and +** we have never tested any other value. +*/ +#define NN 1 /* Number of neighbors on either side of pPage */ +#define NB 3 /* (NN*2+1): Total pages involved in the balance */ + /* ** A CellArray object contains a cache of pointers and sizes for a ** consecutive sequence of cells that might be held on multiple pages. +** +** The cells in this array are the divider cell or cells from the pParent +** page plus up to three child pages. There are a total of nCell cells. +** +** pRef is a pointer to one of the pages that contributes cells. This is +** used to access information such as MemPage.intKey and MemPage.pBt->pageSize +** which should be common to all pages that contribute cells to this array. +** +** apCell[] and szCell[] hold, respectively, pointers to the start of each +** cell and the size of each cell. Some of the apCell[] pointers might refer +** to overflow cells. In other words, some apCel[] pointers might not point +** to content area of the pages. +** +** A szCell[] of zero means the size of that cell has not yet been computed. +** +** The cells come from as many as four different pages: +** +** ----------- +** | Parent | +** ----------- +** / | \ +** / | \ +** --------- --------- --------- +** |Child-1| |Child-2| |Child-3| +** --------- --------- --------- +** +** The order of cells is in the array is for an index btree is: +** +** 1. All cells from Child-1 in order +** 2. The first divider cell from Parent +** 3. All cells from Child-2 in order +** 4. The second divider cell from Parent +** 5. All cells from Child-3 in order +** +** For a table-btree (with rowids) the items 2 and 4 are empty because +** content exists only in leaves and there are no divider cells. +** +** For an index btree, the apEnd[] array holds pointer to the end of page +** for Child-1, the Parent, Child-2, the Parent (again), and Child-3, +** respectively. The ixNx[] array holds the number of cells contained in +** each of these 5 stages, and all stages to the left. Hence: +** +** ixNx[0] = Number of cells in Child-1. +** ixNx[1] = Number of cells in Child-1 plus 1 for first divider. +** ixNx[2] = Number of cells in Child-1 and Child-2 + 1 for 1st divider. +** ixNx[3] = Number of cells in Child-1 and Child-2 + both divider cells +** ixNx[4] = Total number of cells. +** +** For a table-btree, the concept is similar, except only apEnd[0]..apEnd[2] +** are used and they point to the leaf pages only, and the ixNx value are: +** +** ixNx[0] = Number of cells in Child-1. +** ixNx[1] = Number of cells in Child-1 and Child-2 + 1 for 1st divider. +** ixNx[2] = Number of cells in Child-1 and Child-2 + both divider cells */ typedef struct CellArray CellArray; struct CellArray { @@ -6679,6 +6782,8 @@ struct CellArray { MemPage *pRef; /* Reference page */ u8 **apCell; /* All cells begin balanced */ u16 *szCell; /* Local size of all cells in apCell[] */ + u8 *apEnd[NB*2]; /* MemPage.aDataEnd values */ + int ixNx[NB*2]; /* Index of at which we move to the next apEnd[] */ }; /* @@ -6729,36 +6834,59 @@ static u16 cachedCellSize(CellArray *p, int N){ ** responsibility of the caller to set it correctly. */ static int rebuildPage( - MemPage *pPg, /* Edit this page */ + CellArray *pCArray, /* Content to be added to page pPg */ + int iFirst, /* First cell in pCArray to use */ int nCell, /* Final number of cells on page */ - u8 **apCell, /* Array of cells */ - u16 *szCell /* Array of cell sizes */ + MemPage *pPg /* The page to be reconstructed */ ){ const int hdr = pPg->hdrOffset; /* Offset of header on pPg */ u8 * const aData = pPg->aData; /* Pointer to data for pPg */ const int usableSize = pPg->pBt->usableSize; u8 * const pEnd = &aData[usableSize]; - int i; + int i = iFirst; /* Which cell to copy from pCArray*/ + u32 j; /* Start of cell content area */ + int iEnd = i+nCell; /* Loop terminator */ u8 *pCellptr = pPg->aCellIdx; u8 *pTmp = sqlite3PagerTempSpace(pPg->pBt->pPager); u8 *pData; + int k; /* Current slot in pCArray->apEnd[] */ + u8 *pSrcEnd; /* Current pCArray->apEnd[k] value */ + + assert( i(u32)usableSize) ){ j = 0; } + memcpy(&pTmp[j], &aData[j], usableSize - j); - i = get2byte(&aData[hdr+5]); - memcpy(&pTmp[i], &aData[i], usableSize - i); + for(k=0; pCArray->ixNx[k]<=i && ALWAYS(kapEnd[k]; pData = pEnd; - for(i=0; iapCell[i]; + u16 sz = pCArray->szCell[i]; + assert( sz>0 ); if( SQLITE_WITHIN(pCell,aData,pEnd) ){ + if( ((uptr)(pCell+sz))>(uptr)pEnd ) return SQLITE_CORRUPT_BKPT; pCell = &pTmp[pCell - aData]; + }else if( (uptr)(pCell+sz)>(uptr)pSrcEnd + && (uptr)(pCell)<(uptr)pSrcEnd + ){ + return SQLITE_CORRUPT_BKPT; } - pData -= szCell[i]; + + pData -= sz; put2byte(pCellptr, (pData - aData)); pCellptr += 2; if( pData < pCellptr ) return SQLITE_CORRUPT_BKPT; - memcpy(pData, pCell, szCell[i]); - assert( szCell[i]==pPg->xCellSize(pPg, pCell) || CORRUPT_DB ); - testcase( szCell[i]!=pPg->xCellSize(pPg,pCell) ); + memcpy(pData, pCell, sz); + assert( sz==pPg->xCellSize(pPg, pCell) || CORRUPT_DB ); + testcase( sz!=pPg->xCellSize(pPg,pCell) ); + i++; + if( i>=iEnd ) break; + if( pCArray->ixNx[k]<=i ){ + k++; + pSrcEnd = pCArray->apEnd[k]; + } } /* The pPg->nFree field is now set incorrectly. The caller will fix it. */ @@ -6773,12 +6901,11 @@ static int rebuildPage( } /* -** Array apCell[] contains nCell pointers to b-tree cells. Array szCell -** contains the size in bytes of each such cell. This function attempts to -** add the cells stored in the array to page pPg. If it cannot (because -** the page needs to be defragmented before the cells will fit), non-zero -** is returned. Otherwise, if the cells are added successfully, zero is -** returned. +** The pCArray objects contains pointers to b-tree cells and the cell sizes. +** This function attempts to add the cells stored in the array to page pPg. +** If it cannot (because the page needs to be defragmented before the cells +** will fit), non-zero is returned. Otherwise, if the cells are added +** successfully, zero is returned. ** ** Argument pCellptr points to the first entry in the cell-pointer array ** (part of page pPg) to populate. After cell apCell[0] is written to the @@ -6800,18 +6927,23 @@ static int rebuildPage( static int pageInsertArray( MemPage *pPg, /* Page to add cells to */ u8 *pBegin, /* End of cell-pointer array */ - u8 **ppData, /* IN/OUT: Page content -area pointer */ + u8 **ppData, /* IN/OUT: Page content-area pointer */ u8 *pCellptr, /* Pointer to cell-pointer area */ int iFirst, /* Index of first cell to add */ int nCell, /* Number of cells to add to pPg */ CellArray *pCArray /* Array of cells */ ){ - int i; - u8 *aData = pPg->aData; - u8 *pData = *ppData; - int iEnd = iFirst + nCell; + int i = iFirst; /* Loop counter - cell index to insert */ + u8 *aData = pPg->aData; /* Complete page */ + u8 *pData = *ppData; /* Content area. A subset of aData[] */ + int iEnd = iFirst + nCell; /* End of loop. One past last cell to ins */ + int k; /* Current slot in pCArray->apEnd[] */ + u8 *pEnd; /* Maximum extent of cell data */ assert( CORRUPT_DB || pPg->hdrOffset==0 ); /* Never called on page 1 */ - for(i=iFirst; iixNx[k]<=i && ALWAYS(kapEnd[k]; + while( 1 /*Exit by break*/ ){ int sz, rc; u8 *pSlot; sz = cachedCellSize(pCArray, i); @@ -6826,20 +6958,33 @@ static int pageInsertArray( assert( (pSlot+sz)<=pCArray->apCell[i] || pSlot>=(pCArray->apCell[i]+sz) || CORRUPT_DB ); + if( (uptr)(pCArray->apCell[i]+sz)>(uptr)pEnd + && (uptr)(pCArray->apCell[i])<(uptr)pEnd + ){ + assert( CORRUPT_DB ); + (void)SQLITE_CORRUPT_BKPT; + return 1; + } memmove(pSlot, pCArray->apCell[i], sz); put2byte(pCellptr, (pSlot - aData)); pCellptr += 2; + i++; + if( i>=iEnd ) break; + if( pCArray->ixNx[k]<=i ){ + k++; + pEnd = pCArray->apEnd[k]; + } } *ppData = pData; return 0; } /* -** Array apCell[] contains nCell pointers to b-tree cells. Array szCell -** contains the size in bytes of each such cell. This function adds the -** space associated with each cell in the array that is currently stored -** within the body of pPg to the pPg free-list. The cell-pointers and other -** fields of the page are not updated. +** The pCArray object contains pointers to b-tree cells and their sizes. +** +** This function adds the space associated with each cell in the array +** that is currently stored within the body of pPg to the pPg free-list. +** The cell-pointers and other fields of the page are not updated. ** ** This function returns the total number of cells added to the free-list. */ @@ -6889,9 +7034,9 @@ static int pageFreeArray( } /* -** apCell[] and szCell[] contains pointers to and sizes of all cells in the -** pages being balanced. The current page, pPg, has pPg->nCell cells starting -** with apCell[iOld]. After balancing, this page should hold nNew cells +** pCArray contains pointers to and sizes of all cells in the page being +** balanced. The current page, pPg, has pPg->nCell cells starting with +** pCArray->apCell[iOld]. After balancing, this page should hold nNew cells ** starting at apCell[iNew]. ** ** This routine makes the necessary adjustments to pPg so that it contains @@ -6923,13 +7068,17 @@ static int editPage( #endif /* Remove cells from the start and end of the page */ + assert( nCell>=0 ); if( iOldnCell ) return SQLITE_CORRUPT_BKPT; memmove(pPg->aCellIdx, &pPg->aCellIdx[nShift*2], nCell*2); nCell -= nShift; } if( iNewEnd < iOldEnd ){ - nCell -= pageFreeArray(pPg, iNewEnd, iOldEnd - iNewEnd, pCArray); + int nTail = pageFreeArray(pPg, iNewEnd, iOldEnd - iNewEnd, pCArray); + assert( nCell>=nTail ); + nCell -= nTail; } pData = &aData[get2byteNotZero(&aData[hdr+5])]; @@ -6939,6 +7088,7 @@ static int editPage( if( iNew=0 ); pCellptr = pPg->aCellIdx; memmove(&pCellptr[nAdd*2], pCellptr, nCell*2); if( pageInsertArray( @@ -6953,6 +7103,7 @@ static int editPage( int iCell = (iOld + pPg->aiOvfl[i]) - iNew; if( iCell>=0 && iCellaCellIdx[iCell * 2]; + assert( nCell>=iCell ); memmove(&pCellptr[2], pCellptr, (nCell - iCell) * 2); nCell++; if( pageInsertArray( @@ -6963,6 +7114,7 @@ static int editPage( } /* Append cells to the end of the page */ + assert( nCell>=0 ); pCellptr = &pPg->aCellIdx[nCell*2]; if( pageInsertArray( pPg, pBegin, &pData, pCellptr, @@ -6991,24 +7143,9 @@ static int editPage( editpage_fail: /* Unable to edit this page. Rebuild it from scratch instead. */ populateCellCache(pCArray, iNew, nNew); - return rebuildPage(pPg, nNew, &pCArray->apCell[iNew], &pCArray->szCell[iNew]); + return rebuildPage(pCArray, iNew, nNew, pPg); } -/* -** The following parameters determine how many adjacent pages get involved -** in a balancing operation. NN is the number of neighbors on either side -** of the page that participate in the balancing operation. NB is the -** total number of pages that participate, including the target page and -** NN neighbors on either side. -** -** The minimum value of NN is 1 (of course). Increasing NN above 1 -** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance -** in exchange for a larger degradation in INSERT and UPDATE performance. -** The value of NN appears to give the best results overall. -*/ -#define NN 1 /* Number of neighbors on either side of pPage */ -#define NB (NN*2+1) /* Total pages involved in the balance */ - #ifndef SQLITE_OMIT_QUICKBALANCE /* @@ -7044,8 +7181,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ assert( sqlite3PagerIswriteable(pParent->pDbPage) ); assert( pPage->nOverflow==1 ); - /* This error condition is now caught prior to reaching this function */ - if( NEVER(pPage->nCell==0) ) return SQLITE_CORRUPT_BKPT; + if( pPage->nCell==0 ) return SQLITE_CORRUPT_BKPT; /* dbfuzz001.test */ /* Allocate a new page. This page will become the right-sibling of ** pPage. Make the parent page writable, so that the new divider cell @@ -7059,12 +7195,22 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ u8 *pCell = pPage->apOvfl[0]; u16 szCell = pPage->xCellSize(pPage, pCell); u8 *pStop; + CellArray b; assert( sqlite3PagerIswriteable(pNew->pDbPage) ); - assert( pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) ); + assert( CORRUPT_DB || pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) ); zeroPage(pNew, PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF); - rc = rebuildPage(pNew, 1, &pCell, &szCell); - if( NEVER(rc) ) return rc; + b.nCell = 1; + b.pRef = pPage; + b.apCell = &pCell; + b.szCell = &szCell; + b.apEnd[0] = pPage->aDataEnd; + b.ixNx[0] = 2; + rc = rebuildPage(&b, 0, 1, pNew); + if( NEVER(rc) ){ + releasePage(pNew); + return rc; + } pNew->nFree = pBt->usableSize - pNew->cellOffset - 2 - szCell; /* If this is an auto-vacuum database, update the pointer map @@ -7079,7 +7225,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ if( ISAUTOVACUUM ){ ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno, &rc); if( szCell>pNew->minLocal ){ - ptrmapPutOvflPtr(pNew, pCell, &rc); + ptrmapPutOvflPtr(pNew, pNew, pCell, &rc); } } @@ -7302,10 +7448,6 @@ static int balance_nonroot( assert( sqlite3_mutex_held(pBt->mutex) ); assert( sqlite3PagerIswriteable(pParent->pDbPage) ); -#if 0 - TRACE(("BALANCE: begin page %d child of %d\n", pPage->pgno, pParent->pgno)); -#endif - /* At this point pParent may have at most one overflow cell. And if ** this overflow cell is present, it must be the cell with ** index iParentIdx. This scenario comes about when this function @@ -7546,8 +7688,15 @@ static int balance_nonroot( ** */ usableSpace = pBt->usableSize - 12 + leafCorrection; - for(i=0; iaDataEnd; + b.ixNx[k] = cntOld[i]; + if( !leafData ){ + k++; + b.apEnd[k] = pParent->aDataEnd; + b.ixNx[k] = cntOld[i]+1; + } szNew[i] = usableSpace - p->nFree; for(j=0; jnOverflow; j++){ szNew[i] += 2 + p->xCellSize(p, p->apOvfl[j]); @@ -7771,7 +7920,8 @@ static int balance_nonroot( ** populated, not here. */ if( ISAUTOVACUUM ){ - MemPage *pNew = apNew[0]; + MemPage *pOld; + MemPage *pNew = pOld = apNew[0]; u8 *aOld = pNew->aData; int cntOldNext = pNew->nCell + pNew->nOverflow; int usableSize = pBt->usableSize; @@ -7781,7 +7931,7 @@ static int balance_nonroot( for(i=0; inCell + pOld->nOverflow + !leafData; aOld = pOld->aData; } @@ -7804,7 +7954,7 @@ static int balance_nonroot( ptrmapPut(pBt, get4byte(pCell), PTRMAP_BTREE, pNew->pgno, &rc); } if( cachedCellSize(&b,i)>pNew->minLocal ){ - ptrmapPutOvflPtr(pNew, pCell, &rc); + ptrmapPutOvflPtr(pNew, pOld, pCell, &rc); } if( rc ) goto balance_cleanup; } @@ -8228,7 +8378,11 @@ static int btreeOverwriteContent( if( memcmp(pDest, ((u8*)pX->pData) + iOffset, iAmt)!=0 ){ int rc = sqlite3PagerWrite(pPage->pDbPage); if( rc ) return rc; - memcpy(pDest, ((u8*)pX->pData) + iOffset, iAmt); + /* In a corrupt database, it is possible for the source and destination + ** buffers to overlap. This is harmless since the database is already + ** corrupt but it does cause valgrind and ASAN warnings. So use + ** memmove(). */ + memmove(pDest, ((u8*)pX->pData) + iOffset, iAmt); } } return SQLITE_OK; @@ -8623,6 +8777,7 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ if( bPreserve ){ if( !pPage->leaf || (pPage->nFree+cellSizePtr(pPage,pCell)+2)>(int)(pBt->usableSize*2/3) + || pPage->nCell==1 /* See dbfuzz001.test for a test case */ ){ /* A b-tree rebalance will be required after deleting this entry. ** Save the cursor key. */ @@ -9401,18 +9556,18 @@ static void checkList( } pOvflData = (unsigned char *)sqlite3PagerGetData(pOvflPage); if( isFreeList ){ - int n = get4byte(&pOvflData[4]); + u32 n = (u32)get4byte(&pOvflData[4]); #ifndef SQLITE_OMIT_AUTOVACUUM if( pCheck->pBt->autoVacuum ){ checkPtrmap(pCheck, iPage, PTRMAP_FREEPAGE, 0); } #endif - if( n>(int)pCheck->pBt->usableSize/4-2 ){ + if( n>pCheck->pBt->usableSize/4-2 ){ checkAppendMsg(pCheck, "freelist leaf count too big on page %d", iPage); N--; }else{ - for(i=0; ipBt->autoVacuum ){ @@ -9789,7 +9944,7 @@ char *sqlite3BtreeIntegrityCheck( Pgno i; IntegrityCk sCheck; BtShared *pBt = p->pBt; - int savedDbFlags = pBt->db->flags; + u64 savedDbFlags = pBt->db->flags; char zErr[100]; VVA_ONLY( int nRef ); @@ -9856,7 +10011,7 @@ char *sqlite3BtreeIntegrityCheck( } #endif testcase( pBt->db->flags & SQLITE_CellSizeCk ); - pBt->db->flags &= ~SQLITE_CellSizeCk; + pBt->db->flags &= ~(u64)SQLITE_CellSizeCk; for(i=0; (int)ipBt->mutex. ** ** skipNext meaning: -** eState==SKIPNEXT && skipNext>0: Next sqlite3BtreeNext() is no-op. -** eState==SKIPNEXT && skipNext<0: Next sqlite3BtreePrevious() is no-op. -** eState==FAULT: Cursor fault with skipNext as error code. +** The meaning of skipNext depends on the value of eState: +** +** eState Meaning of skipNext +** VALID skipNext is meaningless and is ignored +** INVALID skipNext is meaningless and is ignored +** SKIPNEXT sqlite3BtreeNext() is a no-op if skipNext>0 and +** sqlite3BtreePrevious() is no-op if skipNext<0. +** REQUIRESEEK restoreCursorPosition() restores the cursor to +** eState=SKIPNEXT if skipNext!=0 +** FAULT skipNext holds the cursor fault error code. */ struct BtCursor { u8 eState; /* One of the CURSOR_XXX constants (see below) */ diff --git a/sqlite/src/build.c b/sqlite/src/build.c index e0fed8a8..3daa677c 100644 --- a/sqlite/src/build.c +++ b/sqlite/src/build.c @@ -227,7 +227,7 @@ void sqlite3FinishCoding(Parse *pParse){ if( v && pParse->nErr==0 && !db->mallocFailed ){ /* A minimum of one cursor is required if autoincrement is used * See ticket [a696379c1f08866] */ - if( pParse->pAinc!=0 && pParse->nTab==0 ) pParse->nTab = 1; + assert( pParse->pAinc==0 || pParse->nTab>0 ); sqlite3VdbeMakeReady(v, pParse); pParse->rc = SQLITE_DONE; }else{ @@ -354,26 +354,32 @@ Table *sqlite3LocateTable( p = sqlite3FindTable(db, zName, zDbase); if( p==0 ){ - const char *zMsg = flags & LOCATE_VIEW ? "no such view" : "no such table"; #ifndef SQLITE_OMIT_VIRTUALTABLE /* 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( pParse->disableVtab==0 ){ + 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 ){ - if( zDbase ){ - sqlite3ErrorMsg(pParse, "%s: %s.%s", zMsg, zDbase, zName); - }else{ - sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName); - } - pParse->checkSchema = 1; + if( flags & LOCATE_NOERR ) return 0; + pParse->checkSchema = 1; + }else if( IsVirtual(p) && pParse->disableVtab ){ + p = 0; + } + + if( p==0 ){ + const char *zMsg = flags & LOCATE_VIEW ? "no such view" : "no such table"; + if( zDbase ){ + sqlite3ErrorMsg(pParse, "%s: %s.%s", zMsg, zDbase, zName); + }else{ + sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName); } } @@ -636,12 +642,6 @@ 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); @@ -2638,6 +2638,7 @@ void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, int isView){ */ if( IsVirtual(pTab) ){ sqlite3VdbeAddOp4(v, OP_VDestroy, iDb, 0, 0, pTab->zName, 0); + sqlite3MayAbort(pParse); } sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0); sqlite3ChangeCookie(pParse, iDb); @@ -3466,6 +3467,11 @@ void sqlite3CreateIndex( } } if( idxType==SQLITE_IDXTYPE_PRIMARYKEY ) pIdx->idxType = idxType; + if( IN_RENAME_OBJECT ){ + pIndex->pNext = pParse->pNewIndex; + pParse->pNewIndex = pIndex; + pIndex = 0; + } goto exit_create_index; } } @@ -3481,6 +3487,14 @@ void sqlite3CreateIndex( Index *p; assert( !IN_SPECIAL_PARSE ); assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) ); + if( pTblName!=0 ){ + pIndex->tnum = db->init.newTnum; + if( sqlite3IndexHasDuplicateRootPage(pIndex) ){ + sqlite3ErrorMsg(pParse, "invalid rootpage"); + pParse->rc = SQLITE_CORRUPT_BKPT; + goto exit_create_index; + } + } p = sqlite3HashInsert(&pIndex->pSchema->idxHash, pIndex->zName, pIndex); if( p ){ @@ -3489,9 +3503,6 @@ void sqlite3CreateIndex( goto exit_create_index; } db->mDbFlags |= DBFLAG_SchemaChange; - if( pTblName!=0 ){ - pIndex->tnum = db->init.newTnum; - } } /* If this is the initial CREATE INDEX statement (or CREATE TABLE if the @@ -3817,6 +3828,18 @@ int sqlite3IdListIndex(IdList *pList, const char *zName){ return -1; } +/* +** Maximum size of a SrcList object. +** The SrcList object is used to represent the FROM clause of a +** SELECT statement, and the query planner cannot deal with more +** than 64 tables in a join. So any value larger than 64 here +** is sufficient for most uses. Smaller values, like say 10, are +** appropriate for small and memory-limited applications. +*/ +#ifndef SQLITE_MAX_SRCLIST +# define SQLITE_MAX_SRCLIST 200 +#endif + /* ** Expand the space allocated for the given SrcList object by ** creating nExtra new slots beginning at iStart. iStart is zero based. @@ -3833,11 +3856,12 @@ int sqlite3IdListIndex(IdList *pList, const char *zName){ ** the iStart value would be 0. The result then would ** be: nil, nil, nil, A, B. ** -** If a memory allocation fails the SrcList is unchanged. The -** db->mallocFailed flag will be set to true. +** If a memory allocation fails or the SrcList becomes too large, leave +** the original SrcList unchanged, return NULL, and leave an error message +** in pParse. */ SrcList *sqlite3SrcListEnlarge( - sqlite3 *db, /* Database connection to notify of OOM errors */ + Parse *pParse, /* Parsing context into which errors are reported */ SrcList *pSrc, /* The SrcList to be enlarged */ int nExtra, /* Number of new slots to add to pSrc->a[] */ int iStart /* Index in pSrc->a[] of first new slot */ @@ -3854,16 +3878,22 @@ SrcList *sqlite3SrcListEnlarge( if( (u32)pSrc->nSrc+nExtra>pSrc->nAlloc ){ SrcList *pNew; int nAlloc = pSrc->nSrc*2+nExtra; - int nGot; + sqlite3 *db = pParse->db; + + if( pSrc->nSrc+nExtra>=SQLITE_MAX_SRCLIST ){ + sqlite3ErrorMsg(pParse, "too many FROM clause terms, max: %d", + SQLITE_MAX_SRCLIST); + return 0; + } + if( nAlloc>SQLITE_MAX_SRCLIST ) nAlloc = SQLITE_MAX_SRCLIST; pNew = sqlite3DbRealloc(db, pSrc, sizeof(*pSrc) + (nAlloc-1)*sizeof(pSrc->a[0]) ); if( pNew==0 ){ assert( db->mallocFailed ); - return pSrc; + return 0; } pSrc = pNew; - nGot = (sqlite3DbMallocSize(db, pNew) - sizeof(*pSrc))/sizeof(pSrc->a[0])+1; - pSrc->nAlloc = nGot; + pSrc->nAlloc = nAlloc; } /* Move existing slots that come after the newly inserted slots @@ -3888,7 +3918,8 @@ SrcList *sqlite3SrcListEnlarge( ** Append a new table name to the given SrcList. Create a new SrcList if ** need be. A new entry is created in the SrcList even if pTable is NULL. ** -** A SrcList is returned, or NULL if there is an OOM error. The returned +** A SrcList is returned, or NULL if there is an OOM error or if the +** SrcList grows to large. The returned ** SrcList might be the same as the SrcList that was input or it might be ** a new one. If an OOM error does occurs, then the prior value of pList ** that is input to this routine is automatically freed. @@ -3919,27 +3950,32 @@ SrcList *sqlite3SrcListEnlarge( ** before being added to the SrcList. */ SrcList *sqlite3SrcListAppend( - sqlite3 *db, /* Connection to notify of malloc failures */ + Parse *pParse, /* Parsing context, in which errors are reported */ SrcList *pList, /* Append to this SrcList. NULL creates a new SrcList */ Token *pTable, /* Table to append */ Token *pDatabase /* Database of the table */ ){ struct SrcList_item *pItem; + sqlite3 *db; assert( pDatabase==0 || pTable!=0 ); /* Cannot have C without B */ - assert( db!=0 ); + assert( pParse!=0 ); + assert( pParse->db!=0 ); + db = pParse->db; if( pList==0 ){ - pList = sqlite3DbMallocRawNN(db, sizeof(SrcList) ); + pList = sqlite3DbMallocRawNN(pParse->db, sizeof(SrcList) ); if( pList==0 ) return 0; pList->nAlloc = 1; pList->nSrc = 1; memset(&pList->a[0], 0, sizeof(pList->a[0])); pList->a[0].iCursor = -1; }else{ - pList = sqlite3SrcListEnlarge(db, pList, 1, pList->nSrc); - } - if( db->mallocFailed ){ - sqlite3SrcListDelete(db, pList); - return 0; + SrcList *pNew = sqlite3SrcListEnlarge(pParse, pList, 1, pList->nSrc); + if( pNew==0 ){ + sqlite3SrcListDelete(db, pList); + return 0; + }else{ + pList = pNew; + } } pItem = &pList->a[pList->nSrc-1]; if( pDatabase && pDatabase->z==0 ){ @@ -4028,7 +4064,7 @@ SrcList *sqlite3SrcListAppendFromTerm( ); goto append_from_error; } - p = sqlite3SrcListAppend(db, p, pTable, pDatabase); + p = sqlite3SrcListAppend(pParse, p, pTable, pDatabase); if( p==0 ){ goto append_from_error; } @@ -4417,13 +4453,15 @@ static int collationMatch(const char *zColl, Index *pIndex){ */ #ifndef SQLITE_OMIT_REINDEX static void reindexTable(Parse *pParse, Table *pTab, char const *zColl){ - Index *pIndex; /* An index associated with pTab */ - - for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ - if( zColl==0 || collationMatch(zColl, pIndex) ){ - int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - sqlite3BeginWriteOperation(pParse, 0, iDb); - sqlite3RefillIndex(pParse, pIndex, -1); + if( !IsVirtual(pTab) ){ + Index *pIndex; /* An index associated with pTab */ + + for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ + if( zColl==0 || collationMatch(zColl, pIndex) ){ + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3RefillIndex(pParse, pIndex, -1); + } } } } diff --git a/sqlite/src/callback.c b/sqlite/src/callback.c index faf6d520..ad53bd4d 100644 --- a/sqlite/src/callback.c +++ b/sqlite/src/callback.c @@ -283,7 +283,7 @@ static int matchQuality( ** Search a FuncDefHash for a function with the given name. Return ** a pointer to the matching FuncDef if found, or 0 if there is no match. */ -static FuncDef *functionSearch( +FuncDef *sqlite3FunctionSearch( int h, /* Hash of the name */ const char *zFunc /* Name of function */ ){ @@ -295,21 +295,6 @@ 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. @@ -325,7 +310,7 @@ void sqlite3InsertBuiltinFuncs( int nName = sqlite3Strlen30(zName); int h = SQLITE_FUNC_HASH(zName[0], nName); assert( zName[0]>='a' && zName[0]<='z' ); - pOther = functionSearch(h, zName); + pOther = sqlite3FunctionSearch(h, zName); if( pOther ){ assert( pOther!=&aDef[i] && pOther->pNext!=&aDef[i] ); aDef[i].pNext = pOther->pNext; @@ -403,7 +388,7 @@ FuncDef *sqlite3FindFunction( if( !createFlag && (pBest==0 || (db->mDbFlags & DBFLAG_PreferBuiltin)!=0) ){ bestScore = 0; h = SQLITE_FUNC_HASH(sqlite3UpperToLower[(u8)zName[0]], nName); - p = functionSearch(h, zName); + p = sqlite3FunctionSearch(h, zName); while( p ){ int score = matchQuality(p, nArg, enc); if( score>bestScore ){ diff --git a/sqlite/src/dbstat.c b/sqlite/src/dbstat.c index a6e521be..9b72fb14 100644 --- a/sqlite/src/dbstat.c +++ b/sqlite/src/dbstat.c @@ -531,6 +531,10 @@ static int statNext(sqlite3_vtab_cursor *pCursor){ goto statNextRestart; /* Tail recursion */ } pCsr->iPage++; + if( pCsr->iPage>=ArraySize(pCsr->aPage) ){ + statResetCsr(pCsr); + return SQLITE_CORRUPT_BKPT; + } assert( p==&pCsr->aPage[pCsr->iPage-1] ); if( p->iCell==p->nCell ){ @@ -602,7 +606,6 @@ static int statFilter( StatTable *pTab = (StatTable*)(pCursor->pVtab); char *zSql; int rc = SQLITE_OK; - char *zMaster; if( idxNum==1 ){ const char *zDbase = (const char*)sqlite3_value_text(argv[0]); @@ -618,13 +621,12 @@ static int statFilter( statResetCsr(pCsr); sqlite3_finalize(pCsr->pStmt); pCsr->pStmt = 0; - zMaster = pCsr->iDb==1 ? "sqlite_temp_master" : "sqlite_master"; zSql = sqlite3_mprintf( "SELECT 'sqlite_master' AS name, 1 AS rootpage, 'table' AS type" " UNION ALL " "SELECT name, rootpage, type" - " FROM \"%w\".%s WHERE rootpage!=0" - " ORDER BY name", pTab->db->aDb[pCsr->iDb].zDbSName, zMaster); + " FROM \"%w\".sqlite_master WHERE rootpage!=0" + " ORDER BY name", pTab->db->aDb[pCsr->iDb].zDbSName); if( zSql==0 ){ return SQLITE_NOMEM_BKPT; }else{ diff --git a/sqlite/src/delete.c b/sqlite/src/delete.c index 4ba8e425..e3a0abc2 100644 --- a/sqlite/src/delete.c +++ b/sqlite/src/delete.c @@ -117,7 +117,7 @@ void sqlite3MaterializeView( sqlite3 *db = pParse->db; int iDb = sqlite3SchemaToIndex(db, pView->pSchema); pWhere = sqlite3ExprDup(db, pWhere, 0); - pFrom = sqlite3SrcListAppend(db, 0, 0, 0); + pFrom = sqlite3SrcListAppend(pParse, 0, 0, 0); if( pFrom ){ assert( pFrom->nSrc==1 ); pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName); @@ -517,7 +517,7 @@ void sqlite3DeleteFrom( /* If this DELETE cannot use the ONEPASS strategy, this is the ** end of the WHERE loop */ if( eOnePass!=ONEPASS_OFF ){ - addrBypass = sqlite3VdbeMakeLabel(v); + addrBypass = sqlite3VdbeMakeLabel(pParse); }else{ sqlite3WhereEnd(pWInfo); } @@ -706,7 +706,7 @@ void sqlite3GenerateRowDelete( /* Seek cursor iCur to the row to delete. If this row no longer exists ** (this can happen if a trigger program has already deleted it), do ** not attempt to delete it or fire any DELETE triggers. */ - iLabel = sqlite3VdbeMakeLabel(v); + iLabel = sqlite3VdbeMakeLabel(pParse); opSeek = HasRowid(pTab) ? OP_NotExists : OP_NotFound; if( eMode==ONEPASS_OFF ){ sqlite3VdbeAddOp4Int(v, opSeek, iDataCur, iLabel, iPk, nPk); @@ -912,7 +912,7 @@ int sqlite3GenerateIndexKey( if( piPartIdxLabel ){ if( pIdx->pPartIdxWhere ){ - *piPartIdxLabel = sqlite3VdbeMakeLabel(v); + *piPartIdxLabel = sqlite3VdbeMakeLabel(pParse); pParse->iSelfTab = iDataCur + 1; sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, SQLITE_JUMPIFNULL); diff --git a/sqlite/src/expr.c b/sqlite/src/expr.c index d4eb9de6..e39b6408 100644 --- a/sqlite/src/expr.c +++ b/sqlite/src/expr.c @@ -141,8 +141,8 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ while( p ){ int op = p->op; if( p->flags & EP_Generic ) break; - if( (op==TK_AGG_COLUMN || op==TK_COLUMN - || op==TK_REGISTER || op==TK_TRIGGER) + if( op==TK_REGISTER ) op = p->op2; + if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_TRIGGER) && p->y.pTab!=0 ){ /* op==TK_REGISTER && p->y.pTab!=0 happens when pExpr was originally @@ -158,7 +158,7 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ p = p->pLeft; continue; } - if( op==TK_COLLATE || (op==TK_REGISTER && p->op2==TK_COLLATE) ){ + if( op==TK_COLLATE ){ pColl = sqlite3GetCollSeq(pParse, ENC(db), 0, p->u.zToken); break; } @@ -465,6 +465,7 @@ Expr *sqlite3ExprForVectorField( }else{ if( pVector->op==TK_VECTOR ) pVector = pVector->x.pList->a[iField].pExpr; pRet = sqlite3ExprDup(pParse->db, pVector, 0); + sqlite3RenameTokenRemap(pParse, pRet, pVector); } return pRet; } @@ -481,7 +482,7 @@ static int exprCodeSubselect(Parse *pParse, Expr *pExpr){ int reg = 0; #ifndef SQLITE_OMIT_SUBQUERY if( pExpr->op==TK_SELECT ){ - reg = sqlite3CodeSubselect(pParse, pExpr, 0, 0); + reg = sqlite3CodeSubselect(pParse, pExpr); } #endif return reg; @@ -553,7 +554,7 @@ static void codeVectorCompare( int regLeft = 0; int regRight = 0; u8 opx = op; - int addrDone = sqlite3VdbeMakeLabel(v); + int addrDone = sqlite3VdbeMakeLabel(pParse); if( nLeft!=sqlite3ExprVectorSize(pRight) ){ sqlite3ErrorMsg(pParse, "row value misused"); @@ -780,8 +781,7 @@ Expr *sqlite3ExprAlloc( if( pToken->n ) memcpy(pNew->u.zToken, pToken->z, pToken->n); pNew->u.zToken[pToken->n] = 0; if( dequote && sqlite3Isquote(pNew->u.zToken[0]) ){ - if( pNew->u.zToken[0]=='"' ) pNew->flags |= EP_DblQuoted; - sqlite3Dequote(pNew->u.zToken); + sqlite3DequoteExpr(pNew); } } } @@ -850,7 +850,7 @@ Expr *sqlite3PExpr( Expr *pRight /* Right operand */ ){ Expr *p; - if( op==TK_AND && pParse->nErr==0 ){ + if( op==TK_AND && pParse->nErr==0 && !IN_RENAME_OBJECT ){ /* Take advantage of short-circuit false optimization for AND */ p = sqlite3ExprAnd(pParse->db, pLeft, pRight); }else{ @@ -1099,6 +1099,16 @@ static int exprStructSize(Expr *p){ return EXPR_FULLSIZE; } +/* +** Copy the complete content of an Expr node, taking care not to read +** past the end of the structure for a reduced-size version of the source +** Expr. +*/ +static void exprNodeCopy(Expr *pDest, Expr *pSrc){ + memset(pDest, 0, sizeof(Expr)); + memcpy(pDest, pSrc, exprStructSize(pSrc)); +} + /* ** The dupedExpr*Size() routines each return the number of bytes required ** to store a copy of an expression or expression tree. They differ in @@ -1330,6 +1340,36 @@ static With *withDup(sqlite3 *db, With *p){ # define withDup(x,y) 0 #endif +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** The gatherSelectWindows() procedure and its helper routine +** gatherSelectWindowsCallback() are used to scan all the expressions +** an a newly duplicated SELECT statement and gather all of the Window +** objects found there, assembling them onto the linked list at Select->pWin. +*/ +static int gatherSelectWindowsCallback(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_FUNCTION && pExpr->y.pWin!=0 ){ + assert( ExprHasProperty(pExpr, EP_WinFunc) ); + pExpr->y.pWin->pNextWin = pWalker->u.pSelect->pWin; + pWalker->u.pSelect->pWin = pExpr->y.pWin; + } + return WRC_Continue; +} +static int gatherSelectWindowsSelectCallback(Walker *pWalker, Select *p){ + return p==pWalker->u.pSelect ? WRC_Continue : WRC_Prune; +} +static void gatherSelectWindows(Select *p){ + Walker w; + w.xExprCallback = gatherSelectWindowsCallback; + w.xSelectCallback = gatherSelectWindowsSelectCallback; + w.xSelectCallback2 = 0; + w.pParse = 0; + w.u.pSelect = p; + sqlite3WalkSelect(&w, p); +} +#endif + + /* ** The following group of routines make deep copies of expressions, ** expression lists, ID lists, and select statements. The copies can @@ -1497,6 +1537,7 @@ Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){ #ifndef SQLITE_OMIT_WINDOWFUNC pNew->pWin = 0; pNew->pWinDefn = sqlite3WindowListDup(db, p->pWinDefn); + if( p->pWin ) gatherSelectWindows(pNew); #endif pNew->selId = p->selId; *pp = pNew; @@ -1629,6 +1670,9 @@ ExprList *sqlite3ExprListAppendVector( } vector_append_error: + if( IN_RENAME_OBJECT ){ + sqlite3RenameExprUnmap(pParse, pExpr); + } sqlite3ExprDelete(db, pExpr); sqlite3IdListDelete(db, pColumns); return pList; @@ -1772,8 +1816,9 @@ int sqlite3SelectWalkFail(Walker *pWalker, Select *NotUsed){ */ int sqlite3ExprIdToTrueFalse(Expr *pExpr){ assert( pExpr->op==TK_ID || pExpr->op==TK_STRING ); - if( sqlite3StrICmp(pExpr->u.zToken, "true")==0 - || sqlite3StrICmp(pExpr->u.zToken, "false")==0 + if( !ExprHasProperty(pExpr, EP_Quoted) + && (sqlite3StrICmp(pExpr->u.zToken, "true")==0 + || sqlite3StrICmp(pExpr->u.zToken, "false")==0) ){ pExpr->op = TK_TRUEFALSE; return 1; @@ -2082,7 +2127,9 @@ int sqlite3ExprIsInteger(Expr *p, int *pValue){ */ int sqlite3ExprCanBeNull(const Expr *p){ u8 op; - while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; } + while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ + p = p->pLeft; + } op = p->op; if( op==TK_REGISTER ) op = p->op2; switch( op ){ @@ -2149,14 +2196,6 @@ 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 @@ -2326,7 +2365,8 @@ int sqlite3FindInIndex( Expr *pX, /* The right-hand side (RHS) of the IN operator */ u32 inFlags, /* IN_INDEX_LOOP, _MEMBERSHIP, and/or _NOOP_OK */ int *prRhsHasNull, /* Register holding NULL status. See notes */ - int *aiMap /* Mapping from Index fields to RHS fields */ + int *aiMap, /* Mapping from Index fields to RHS fields */ + int *piTab /* OUT: index to use */ ){ Select *p; /* SELECT to the right of IN operator */ int eType = 0; /* Type of RHS table. IN_INDEX_* */ @@ -2421,6 +2461,7 @@ int sqlite3FindInIndex( Bitmask colUsed; /* Columns of the index used */ Bitmask mCol; /* Mask for the current column */ if( pIdx->nColumnpPartIdxWhere!=0 ) continue; /* Maximum nColumn is BMS-2, not BMS-1, so that we can compute ** BITMASK(nExpr) without overflowing */ testcase( pIdx->nColumn==BMS-2 ); @@ -2511,16 +2552,15 @@ int sqlite3FindInIndex( eType = IN_INDEX_EPH; if( inFlags & IN_INDEX_LOOP ){ pParse->nQueryLoop = 0; - if( pX->pLeft->iColumn<0 && !ExprHasProperty(pX, EP_xIsSelect) ){ - eType = IN_INDEX_ROWID; - } }else if( prRhsHasNull ){ *prRhsHasNull = rMayHaveNull = ++pParse->nMem; } - sqlite3CodeSubselect(pParse, pX, rMayHaveNull, eType==IN_INDEX_ROWID); + assert( pX->op==TK_IN ); + sqlite3CodeRhsOfIN(pParse, pX, iTab); + if( rMayHaveNull ){ + sqlite3SetHasNullFlag(v, iTab, rMayHaveNull); + } pParse->nQueryLoop = savedNQueryLoop; - }else{ - pX->iTable = iTab; } if( aiMap && eType!=IN_INDEX_INDEX_ASC && eType!=IN_INDEX_INDEX_DESC ){ @@ -2528,6 +2568,7 @@ int sqlite3FindInIndex( n = sqlite3ExprVectorSize(pX->pLeft); for(i=0; i IN (?, ?, ?)", where is a reference -** to some integer key column of a table B-Tree. In this case, use an -** intkey B-Tree to store the set of IN(...) values instead of the usual -** (slower) variable length keys B-Tree. -** -** If rMayHaveNull is non-zero, that means that the operation is an IN -** (not a SELECT or EXISTS) and that the RHS might contains NULLs. -** All this routine does is initialize the register given by rMayHaveNull -** to NULL. Calling routines will take care of changing this register -** value to non-NULL if the RHS is NULL-free. -** -** For a SELECT or EXISTS operator, return the register that holds the -** result. For a multi-column SELECT, the result is stored in a contiguous -** array of registers and the return value is the register of the left-most -** result column. Return 0 for IN operators or if an error occurs. +** The pExpr parameter is the IN operator. The cursor number for the +** constructed ephermeral table is returned. The first time the ephemeral +** table is computed, the cursor number is also stored in pExpr->iTable, +** however the cursor number returned might not be the same, as it might +** have been duplicated using OP_OpenDup. +** +** If the LHS expression ("x" in the examples) is a column value, or +** the SELECT statement returns a column value, then the affinity of that +** column is used to build the index keys. If both 'x' and the +** SELECT... statement are columns, then numeric affinity is used +** if either column has NUMERIC or INTEGER affinity. If neither +** 'x' nor the SELECT... statement are columns, then numeric affinity +** is used. */ -#ifndef SQLITE_OMIT_SUBQUERY -int sqlite3CodeSubselect( +void sqlite3CodeRhsOfIN( Parse *pParse, /* Parsing context */ - Expr *pExpr, /* The IN, SELECT, or EXISTS operator */ - int rHasNullFlag, /* Register that records whether NULLs exist in RHS */ - int isRowid /* If true, LHS of IN operator is a rowid */ + Expr *pExpr, /* The IN operator */ + int iTab /* Use this cursor number */ ){ - int jmpIfDynamic = -1; /* One-time test address */ - int rReg = 0; /* Register storing resulting */ - Vdbe *v = sqlite3GetVdbe(pParse); - if( NEVER(v==0) ) return 0; + int addrOnce = 0; /* Address of the OP_Once instruction at top */ + int addr; /* Address of OP_OpenEphemeral instruction */ + Expr *pLeft; /* the LHS of the IN operator */ + KeyInfo *pKeyInfo = 0; /* Key information */ + int nVal; /* Size of vector pLeft */ + Vdbe *v; /* The prepared statement under construction */ + + v = pParse->pVdbe; + assert( v!=0 ); - /* The evaluation of the IN/EXISTS/SELECT must be repeated every time it + /* The evaluation of the IN must be repeated every time it ** is encountered if any of the following is true: ** ** * The right-hand side is a correlated subquery ** * The right-hand side is an expression list containing variables ** * We are inside a trigger ** - ** If all of the above are false, then we can run this code just once - ** save the results, and reuse the same result on subsequent invocations. + ** If all of the above are false, then we can compute the RHS just once + ** and reuse it many names. */ - if( !ExprHasProperty(pExpr, EP_VarSelect) ){ - jmpIfDynamic = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); - } + if( !ExprHasProperty(pExpr, EP_VarSelect) && pParse->iSelfTab==0 ){ + /* Reuse of the RHS is allowed */ + /* If this routine has already been coded, but the previous code + ** might not have been invoked yet, so invoke it now as a subroutine. + */ + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + ExplainQueryPlan((pParse, 0, "REUSE LIST SUBQUERY %d", + pExpr->x.pSelect->selId)); + } + sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr); + sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable); + sqlite3VdbeJumpHere(v, addrOnce); + return; + } - switch( pExpr->op ){ - case TK_IN: { - int addr; /* Address of OP_OpenEphemeral instruction */ - Expr *pLeft = pExpr->pLeft; /* the LHS of the IN operator */ - KeyInfo *pKeyInfo = 0; /* Key information */ - int nVal; /* Size of vector pLeft */ - - nVal = sqlite3ExprVectorSize(pLeft); - assert( !isRowid || nVal==1 ); - - /* Whether this is an 'x IN(SELECT...)' or an 'x IN()' - ** expression it is handled the same way. An ephemeral table is - ** filled with index keys representing the results from the - ** SELECT or the . - ** - ** If the 'x' expression is a column value, or the SELECT... - ** statement returns a column value, then the affinity of that - ** column is used to build the index keys. If both 'x' and the - ** SELECT... statement are columns, then numeric affinity is used - ** if either column has NUMERIC or INTEGER affinity. If neither - ** 'x' nor the SELECT... statement are columns, then numeric affinity - ** is used. - */ - pExpr->iTable = pParse->nTab++; - addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, - pExpr->iTable, (isRowid?0:nVal)); - pKeyInfo = isRowid ? 0 : sqlite3KeyInfoAlloc(pParse->db, nVal, 1); + /* Begin coding the subroutine */ + ExprSetProperty(pExpr, EP_Subrtn); + pExpr->y.sub.regReturn = ++pParse->nMem; + pExpr->y.sub.iAddr = + sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1; + VdbeComment((v, "return address")); - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ - /* Case 1: expr IN (SELECT ...) - ** - ** Generate code to write the results of the select into the temporary - ** table allocated and opened above. - */ - Select *pSelect = pExpr->x.pSelect; - ExprList *pEList = pSelect->pEList; - - ExplainQueryPlan((pParse, 1, "%sLIST SUBQUERY", - jmpIfDynamic>=0?"":"CORRELATED " - )); - assert( !isRowid ); - /* If the LHS and RHS of the IN operator do not match, that - ** error will have been caught long before we reach this point. */ - if( ALWAYS(pEList->nExpr==nVal) ){ - SelectDest dest; - int i; - sqlite3SelectDestInit(&dest, SRT_Set, pExpr->iTable); - dest.zAffSdst = exprINAffinity(pParse, pExpr); - pSelect->iLimit = 0; - testcase( pSelect->selFlags & SF_Distinct ); - testcase( pKeyInfo==0 ); /* Caused by OOM in sqlite3KeyInfoAlloc() */ - if( sqlite3Select(pParse, pSelect, &dest) ){ - sqlite3DbFree(pParse->db, dest.zAffSdst); - sqlite3KeyInfoUnref(pKeyInfo); - return 0; - } - sqlite3DbFree(pParse->db, dest.zAffSdst); - assert( pKeyInfo!=0 ); /* OOM will cause exit after sqlite3Select() */ - assert( pEList!=0 ); - assert( pEList->nExpr>0 ); - assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); - for(i=0; iaColl[i] = sqlite3BinaryCompareCollSeq( - pParse, p, pEList->a[i].pExpr - ); - } - } - }else if( ALWAYS(pExpr->x.pList!=0) ){ - /* Case 2: expr IN (exprlist) - ** - ** For each expression, build an index key from the evaluation and - ** store it in the temporary table. If is a column, then use - ** that columns affinity when building index keys. If is not - ** a column, use numeric affinity. - */ - char affinity; /* Affinity of the LHS of the IN */ - int i; - ExprList *pList = pExpr->x.pList; - struct ExprList_item *pItem; - int r1, r2, r3; - affinity = sqlite3ExprAffinity(pLeft); - if( !affinity ){ - affinity = SQLITE_AFF_BLOB; - } - if( pKeyInfo ){ - assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); - pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); - } + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } - /* Loop through each expression in . */ - r1 = sqlite3GetTempReg(pParse); - r2 = sqlite3GetTempReg(pParse); - if( isRowid ) sqlite3VdbeAddOp4(v, OP_Blob, 0, r2, 0, "", P4_STATIC); - for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ - Expr *pE2 = pItem->pExpr; - int iValToIns; - - /* If the expression is not constant then we will need to - ** disable the test that was generated above that makes sure - ** this code only executes once. Because for a non-constant - ** expression we need to rerun this code each time. - */ - if( jmpIfDynamic>=0 && !sqlite3ExprIsConstant(pE2) ){ - sqlite3VdbeChangeToNoop(v, jmpIfDynamic); - jmpIfDynamic = -1; - } + /* Check to see if this is a vector IN operator */ + pLeft = pExpr->pLeft; + nVal = sqlite3ExprVectorSize(pLeft); - /* Evaluate the expression and insert it into the temp table */ - if( isRowid && sqlite3ExprIsInteger(pE2, &iValToIns) ){ - sqlite3VdbeAddOp3(v, OP_InsertInt, pExpr->iTable, r2, iValToIns); - }else{ - r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); - if( isRowid ){ - sqlite3VdbeAddOp2(v, OP_MustBeInt, r3, - sqlite3VdbeCurrentAddr(v)+2); - VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_Insert, pExpr->iTable, r2, r3); - }else{ - sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); - sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pExpr->iTable, r2, r3, 1); - } - } - } - sqlite3ReleaseTempReg(pParse, r1); - sqlite3ReleaseTempReg(pParse, r2); + /* Construct the ephemeral table that will contain the content of + ** RHS of the IN operator. + */ + pExpr->iTable = iTab; + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, nVal); +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + VdbeComment((v, "Result of SELECT %u", pExpr->x.pSelect->selId)); + }else{ + VdbeComment((v, "RHS of IN operator")); + } +#endif + pKeyInfo = sqlite3KeyInfoAlloc(pParse->db, nVal, 1); + + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + /* Case 1: expr IN (SELECT ...) + ** + ** Generate code to write the results of the select into the temporary + ** table allocated and opened above. + */ + Select *pSelect = pExpr->x.pSelect; + ExprList *pEList = pSelect->pEList; + + ExplainQueryPlan((pParse, 1, "%sLIST SUBQUERY %d", + addrOnce?"":"CORRELATED ", pSelect->selId + )); + /* If the LHS and RHS of the IN operator do not match, that + ** error will have been caught long before we reach this point. */ + if( ALWAYS(pEList->nExpr==nVal) ){ + SelectDest dest; + int i; + sqlite3SelectDestInit(&dest, SRT_Set, iTab); + dest.zAffSdst = exprINAffinity(pParse, pExpr); + pSelect->iLimit = 0; + testcase( pSelect->selFlags & SF_Distinct ); + testcase( pKeyInfo==0 ); /* Caused by OOM in sqlite3KeyInfoAlloc() */ + if( sqlite3Select(pParse, pSelect, &dest) ){ + sqlite3DbFree(pParse->db, dest.zAffSdst); + sqlite3KeyInfoUnref(pKeyInfo); + return; } - if( pKeyInfo ){ - sqlite3VdbeChangeP4(v, addr, (void *)pKeyInfo, P4_KEYINFO); + sqlite3DbFree(pParse->db, dest.zAffSdst); + assert( pKeyInfo!=0 ); /* OOM will cause exit after sqlite3Select() */ + assert( pEList!=0 ); + assert( pEList->nExpr>0 ); + assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); + for(i=0; iaColl[i] = sqlite3BinaryCompareCollSeq( + pParse, p, pEList->a[i].pExpr + ); } - break; + } + }else if( ALWAYS(pExpr->x.pList!=0) ){ + /* Case 2: expr IN (exprlist) + ** + ** For each expression, build an index key from the evaluation and + ** store it in the temporary table. If is a column, then use + ** that columns affinity when building index keys. If is not + ** a column, use numeric affinity. + */ + char affinity; /* Affinity of the LHS of the IN */ + int i; + ExprList *pList = pExpr->x.pList; + struct ExprList_item *pItem; + int r1, r2, r3; + affinity = sqlite3ExprAffinity(pLeft); + if( !affinity ){ + affinity = SQLITE_AFF_BLOB; + } + if( pKeyInfo ){ + assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); + pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); } - case TK_EXISTS: - case TK_SELECT: - default: { - /* Case 3: (SELECT ... FROM ...) - ** or: EXISTS(SELECT ... FROM ...) - ** - ** For a SELECT, generate code to put the values for all columns of - ** the first row into an array of registers and return the index of - ** the first register. - ** - ** If this is an EXISTS, write an integer 0 (not exists) or 1 (exists) - ** into a register and return that register number. - ** - ** In both cases, the query is augmented with "LIMIT 1". Any - ** preexisting limit is discarded in place of the new LIMIT 1. + /* Loop through each expression in . */ + r1 = sqlite3GetTempReg(pParse); + r2 = sqlite3GetTempReg(pParse); + for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ + Expr *pE2 = pItem->pExpr; + + /* If the expression is not constant then we will need to + ** disable the test that was generated above that makes sure + ** this code only executes once. Because for a non-constant + ** expression we need to rerun this code each time. */ - Select *pSel; /* SELECT statement to encode */ - SelectDest dest; /* How to deal with SELECT result */ - int nReg; /* Registers to allocate */ - Expr *pLimit; /* New limit expression */ - - testcase( pExpr->op==TK_EXISTS ); - testcase( pExpr->op==TK_SELECT ); - assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT ); - assert( ExprHasProperty(pExpr, EP_xIsSelect) ); - - pSel = pExpr->x.pSelect; - ExplainQueryPlan((pParse, 1, "%sSCALAR SUBQUERY", - jmpIfDynamic>=0?"":"CORRELATED ")); - nReg = pExpr->op==TK_SELECT ? pSel->pEList->nExpr : 1; - sqlite3SelectDestInit(&dest, 0, pParse->nMem+1); - pParse->nMem += nReg; - if( pExpr->op==TK_SELECT ){ - dest.eDest = SRT_Mem; - dest.iSdst = dest.iSDParm; - dest.nSdst = nReg; - sqlite3VdbeAddOp3(v, OP_Null, 0, dest.iSDParm, dest.iSDParm+nReg-1); - VdbeComment((v, "Init subquery result")); - }else{ - dest.eDest = SRT_Exists; - sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm); - VdbeComment((v, "Init EXISTS result")); + if( addrOnce && !sqlite3ExprIsConstant(pE2) ){ + sqlite3VdbeChangeToNoop(v, addrOnce); + addrOnce = 0; } - pLimit = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[1], 0); - if( pSel->pLimit ){ - sqlite3ExprDelete(pParse->db, pSel->pLimit->pLeft); - pSel->pLimit->pLeft = pLimit; - }else{ - pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0); - } - pSel->iLimit = 0; - if( sqlite3Select(pParse, pSel, &dest) ){ - return 0; - } - rReg = dest.iSDParm; - ExprSetVVAProperty(pExpr, EP_NoReduce); - break; + + /* Evaluate the expression and insert it into the temp table */ + r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); + sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r3, 1); } + sqlite3ReleaseTempReg(pParse, r1); + sqlite3ReleaseTempReg(pParse, r2); + } + if( pKeyInfo ){ + sqlite3VdbeChangeP4(v, addr, (void *)pKeyInfo, P4_KEYINFO); } + if( addrOnce ){ + sqlite3VdbeJumpHere(v, addrOnce); + /* Subroutine return */ + sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); + sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); + } +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +/* +** Generate code for scalar subqueries used as a subquery expression +** or EXISTS operator: +** +** (SELECT a FROM b) -- subquery +** EXISTS (SELECT a FROM b) -- EXISTS subquery +** +** The pExpr parameter is the SELECT or EXISTS operator to be coded. +** +** The register that holds the result. For a multi-column SELECT, +** the result is stored in a contiguous array of registers and the +** return value is the register of the left-most result column. +** Return 0 if an error occurs. +*/ +#ifndef SQLITE_OMIT_SUBQUERY +int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ + int addrOnce = 0; /* Address of OP_Once at top of subroutine */ + int rReg = 0; /* Register storing resulting */ + Select *pSel; /* SELECT statement to encode */ + SelectDest dest; /* How to deal with SELECT result */ + int nReg; /* Registers to allocate */ + Expr *pLimit; /* New limit expression */ + + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); + testcase( pExpr->op==TK_EXISTS ); + testcase( pExpr->op==TK_SELECT ); + assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT ); + assert( ExprHasProperty(pExpr, EP_xIsSelect) ); + pSel = pExpr->x.pSelect; + + /* The evaluation of the EXISTS/SELECT must be repeated every time it + ** is encountered if any of the following is true: + ** + ** * The right-hand side is a correlated subquery + ** * The right-hand side is an expression list containing variables + ** * We are inside a trigger + ** + ** If all of the above are false, then we can run this code just once + ** save the results, and reuse the same result on subsequent invocations. + */ + if( !ExprHasProperty(pExpr, EP_VarSelect) ){ + /* If this routine has already been coded, then invoke it as a + ** subroutine. */ + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + ExplainQueryPlan((pParse, 0, "REUSE SUBQUERY %d", pSel->selId)); + sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr); + return pExpr->iTable; + } - if( rHasNullFlag ){ - sqlite3SetHasNullFlag(v, pExpr->iTable, rHasNullFlag); + /* Begin coding the subroutine */ + ExprSetProperty(pExpr, EP_Subrtn); + pExpr->y.sub.regReturn = ++pParse->nMem; + pExpr->y.sub.iAddr = + sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1; + VdbeComment((v, "return address")); + + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } + + /* For a SELECT, generate code to put the values for all columns of + ** the first row into an array of registers and return the index of + ** the first register. + ** + ** If this is an EXISTS, write an integer 0 (not exists) or 1 (exists) + ** into a register and return that register number. + ** + ** In both cases, the query is augmented with "LIMIT 1". Any + ** preexisting limit is discarded in place of the new LIMIT 1. + */ + ExplainQueryPlan((pParse, 1, "%sSCALAR SUBQUERY %d", + addrOnce?"":"CORRELATED ", pSel->selId)); + nReg = pExpr->op==TK_SELECT ? pSel->pEList->nExpr : 1; + sqlite3SelectDestInit(&dest, 0, pParse->nMem+1); + pParse->nMem += nReg; + if( pExpr->op==TK_SELECT ){ + dest.eDest = SRT_Mem; + dest.iSdst = dest.iSDParm; + dest.nSdst = nReg; + sqlite3VdbeAddOp3(v, OP_Null, 0, dest.iSDParm, dest.iSDParm+nReg-1); + VdbeComment((v, "Init subquery result")); + }else{ + dest.eDest = SRT_Exists; + sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm); + VdbeComment((v, "Init EXISTS result")); + } + pLimit = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[1], 0); + if( pSel->pLimit ){ + sqlite3ExprDelete(pParse->db, pSel->pLimit->pLeft); + pSel->pLimit->pLeft = pLimit; + }else{ + pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0); + } + pSel->iLimit = 0; + if( sqlite3Select(pParse, pSel, &dest) ){ + return 0; + } + pExpr->iTable = rReg = dest.iSDParm; + ExprSetVVAProperty(pExpr, EP_NoReduce); + if( addrOnce ){ + sqlite3VdbeJumpHere(v, addrOnce); - if( jmpIfDynamic>=0 ){ - sqlite3VdbeJumpHere(v, jmpIfDynamic); + /* Subroutine return */ + sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); + sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); } return rReg; @@ -2931,6 +3015,7 @@ static void sqlite3ExprCodeIN( int addrTruthOp; /* Address of opcode that determines the IN is true */ int destNotNull; /* Jump here if a comparison is not true in step 6 */ int addrTop; /* Top of the step-6 loop */ + int iTab = 0; /* Index to use */ pLeft = pExpr->pLeft; if( sqlite3ExprCheckIN(pParse, pExpr) ) return; @@ -2942,7 +3027,7 @@ static void sqlite3ExprCodeIN( if( pParse->db->mallocFailed ) goto sqlite3ExprCodeIN_oom_error; /* Attempt to compute the RHS. After this step, if anything other than - ** IN_INDEX_NOOP is returned, the table opened ith cursor pExpr->iTable + ** IN_INDEX_NOOP is returned, the table opened with cursor iTab ** contains the values that make up the RHS. If IN_INDEX_NOOP is returned, ** the RHS has not yet been coded. */ v = pParse->pVdbe; @@ -2950,7 +3035,8 @@ static void sqlite3ExprCodeIN( VdbeNoopComment((v, "begin IN expr")); eType = sqlite3FindInIndex(pParse, pExpr, IN_INDEX_MEMBERSHIP | IN_INDEX_NOOP_OK, - destIfFalse==destIfNull ? 0 : &rRhsHasNull, aiMap); + destIfFalse==destIfNull ? 0 : &rRhsHasNull, + aiMap, &iTab); assert( pParse->nErr || nVector==1 || eType==IN_INDEX_EPH || eType==IN_INDEX_INDEX_ASC || eType==IN_INDEX_INDEX_DESC @@ -2996,7 +3082,7 @@ static void sqlite3ExprCodeIN( if( eType==IN_INDEX_NOOP ){ ExprList *pList = pExpr->x.pList; CollSeq *pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft); - int labelOk = sqlite3VdbeMakeLabel(v); + int labelOk = sqlite3VdbeMakeLabel(pParse); int r2, regToFree; int regCkNull = 0; int ii; @@ -3040,7 +3126,7 @@ static void sqlite3ExprCodeIN( if( destIfNull==destIfFalse ){ destStep2 = destIfFalse; }else{ - destStep2 = destStep6 = sqlite3VdbeMakeLabel(v); + destStep2 = destStep6 = sqlite3VdbeMakeLabel(pParse); } for(i=0; ipLeft, i); @@ -3058,19 +3144,19 @@ static void sqlite3ExprCodeIN( /* In this case, the RHS is the ROWID of table b-tree and so we also ** know that the RHS is non-NULL. Hence, we combine steps 3 and 4 ** into a single opcode. */ - sqlite3VdbeAddOp3(v, OP_SeekRowid, pExpr->iTable, destIfFalse, rLhs); + sqlite3VdbeAddOp3(v, OP_SeekRowid, iTab, destIfFalse, rLhs); VdbeCoverage(v); addrTruthOp = sqlite3VdbeAddOp0(v, OP_Goto); /* Return True */ }else{ sqlite3VdbeAddOp4(v, OP_Affinity, rLhs, nVector, 0, zAff, nVector); if( destIfFalse==destIfNull ){ /* Combine Step 3 and Step 5 into a single opcode */ - sqlite3VdbeAddOp4Int(v, OP_NotFound, pExpr->iTable, destIfFalse, + sqlite3VdbeAddOp4Int(v, OP_NotFound, iTab, destIfFalse, rLhs, nVector); VdbeCoverage(v); goto sqlite3ExprCodeIN_finished; } /* Ordinary Step 3, for the case where FALSE and NULL are distinct */ - addrTruthOp = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, + addrTruthOp = sqlite3VdbeAddOp4Int(v, OP_Found, iTab, 0, rLhs, nVector); VdbeCoverage(v); } @@ -3095,10 +3181,10 @@ static void sqlite3ExprCodeIN( ** of the RHS. */ if( destStep6 ) sqlite3VdbeResolveLabel(v, destStep6); - addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, pExpr->iTable, destIfFalse); + addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, destIfFalse); VdbeCoverage(v); if( nVector>1 ){ - destNotNull = sqlite3VdbeMakeLabel(v); + destNotNull = sqlite3VdbeMakeLabel(pParse); }else{ /* For nVector==1, combine steps 6 and 7 by immediately returning ** FALSE if the first comparison is not NULL */ @@ -3110,7 +3196,7 @@ static void sqlite3ExprCodeIN( int r3 = sqlite3GetTempReg(pParse); p = sqlite3VectorFieldSubexpr(pLeft, i); pColl = sqlite3ExprCollSeq(pParse, p); - sqlite3VdbeAddOp3(v, OP_Column, pExpr->iTable, i, r3); + sqlite3VdbeAddOp3(v, OP_Column, iTab, i, r3); sqlite3VdbeAddOp4(v, OP_Ne, rLhs+i, destNotNull, r3, (void*)pColl, P4_COLLSEQ); VdbeCoverage(v); @@ -3119,7 +3205,7 @@ static void sqlite3ExprCodeIN( sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfNull); if( nVector>1 ){ sqlite3VdbeResolveLabel(v, destNotNull); - sqlite3VdbeAddOp2(v, OP_Next, pExpr->iTable, addrTop+1); + sqlite3VdbeAddOp2(v, OP_Next, iTab, addrTop+1); VdbeCoverage(v); /* Step 7: If we reach this point, we know that the result must @@ -3318,7 +3404,7 @@ static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){ #if SQLITE_OMIT_SUBQUERY iResult = 0; #else - iResult = sqlite3CodeSubselect(pParse, p, 0, 0); + iResult = sqlite3CodeSubselect(pParse, p); #endif }else{ int i; @@ -3663,7 +3749,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ ** arguments past the first non-NULL argument. */ if( pDef->funcFlags & SQLITE_FUNC_COALESCE ){ - int endCoalesce = sqlite3VdbeMakeLabel(v); + int endCoalesce = sqlite3VdbeMakeLabel(pParse); assert( nFarg>=2 ); sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); for(i=1; ix.pSelect->pEList->nExpr)!=1 ){ sqlite3SubselectError(pParse, nCol, 1); }else{ - return sqlite3CodeSubselect(pParse, pExpr, 0, 0); + return sqlite3CodeSubselect(pParse, pExpr); } break; } case TK_SELECT_COLUMN: { int n; if( pExpr->pLeft->iTable==0 ){ - pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft, 0, 0); + pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft); } assert( pExpr->iTable==0 || pExpr->pLeft->op==TK_SELECT ); if( pExpr->iTable @@ -3811,8 +3897,8 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ return pExpr->pLeft->iTable + pExpr->iColumn; } case TK_IN: { - int destIfFalse = sqlite3VdbeMakeLabel(v); - int destIfNull = sqlite3VdbeMakeLabel(v); + int destIfFalse = sqlite3VdbeMakeLabel(pParse); + int destIfNull = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeAddOp2(v, OP_Null, 0, target); sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); sqlite3VdbeAddOp2(v, OP_Integer, 1, target); @@ -3952,9 +4038,9 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ pEList = pExpr->x.pList; aListelem = pEList->a; nExpr = pEList->nExpr; - endLabel = sqlite3VdbeMakeLabel(v); + endLabel = sqlite3VdbeMakeLabel(pParse); if( (pX = pExpr->pLeft)!=0 ){ - tempX = *pX; + exprNodeCopy(&tempX, pX); testcase( pX->op==TK_COLUMN ); exprToRegister(&tempX, exprCodeVector(pParse, &tempX, ®Free1)); testcase( regFree1==0 ); @@ -3975,7 +4061,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ }else{ pTest = aListelem[i].pExpr; } - nextCase = sqlite3VdbeMakeLabel(v); + nextCase = sqlite3VdbeMakeLabel(pParse); testcase( pTest->op==TK_COLUMN ); sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL); testcase( aListelem[i+1].pExpr->op==TK_COLUMN ); @@ -4275,13 +4361,12 @@ static void exprCodeBetween( Expr exprX; /* The x subexpression */ int regFree1 = 0; /* Temporary use register */ - memset(&compLeft, 0, sizeof(Expr)); memset(&compRight, 0, sizeof(Expr)); memset(&exprAnd, 0, sizeof(Expr)); assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); - exprX = *pExpr->pLeft; + exprNodeCopy(&exprX, pExpr->pLeft); exprAnd.op = TK_AND; exprAnd.pLeft = &compLeft; exprAnd.pRight = &compRight; @@ -4344,7 +4429,7 @@ void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ op = pExpr->op; switch( op ){ case TK_AND: { - int d2 = sqlite3VdbeMakeLabel(v); + int d2 = sqlite3VdbeMakeLabel(pParse); testcase( jumpIfNull==0 ); sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2,jumpIfNull^SQLITE_JUMPIFNULL); sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); @@ -4430,7 +4515,7 @@ void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ } #ifndef SQLITE_OMIT_SUBQUERY case TK_IN: { - int destIfFalse = sqlite3VdbeMakeLabel(v); + int destIfFalse = sqlite3VdbeMakeLabel(pParse); int destIfNull = jumpIfNull ? dest : destIfFalse; sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); sqlite3VdbeGoto(v, dest); @@ -4517,7 +4602,7 @@ void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ break; } case TK_OR: { - int d2 = sqlite3VdbeMakeLabel(v); + int d2 = sqlite3VdbeMakeLabel(pParse); testcase( jumpIfNull==0 ); sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, jumpIfNull^SQLITE_JUMPIFNULL); sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); @@ -4601,7 +4686,7 @@ void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ if( jumpIfNull ){ sqlite3ExprCodeIN(pParse, pExpr, dest, dest); }else{ - int destIfNull = sqlite3VdbeMakeLabel(v); + int destIfNull = sqlite3VdbeMakeLabel(pParse); sqlite3ExprCodeIN(pParse, pExpr, dest, destIfNull); sqlite3VdbeResolveLabel(v, destIfNull); } @@ -4722,7 +4807,7 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ } return 2; } - if( pA->op!=pB->op ){ + if( pA->op!=pB->op || pA->op==TK_RAISE ){ if( pA->op==TK_COLLATE && sqlite3ExprCompare(pParse, pA->pLeft,pB,iTab)<2 ){ return 1; } @@ -4748,21 +4833,25 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ if( sqlite3WindowCompare(pParse,pA->y.pWin,pB->y.pWin)!=0 ) return 2; } #endif + }else if( pA->op==TK_NULL ){ + return 0; }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 ){ + }else if( ALWAYS(pB->u.zToken!=0) && strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ return 2; } } if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2; - if( ALWAYS((combinedFlags & EP_TokenOnly)==0) ){ + if( (combinedFlags & EP_TokenOnly)==0 ){ if( combinedFlags & EP_xIsSelect ) return 2; if( (combinedFlags & EP_FixedCol)==0 && sqlite3ExprCompare(pParse, pA->pLeft, pB->pLeft, iTab) ) return 2; if( sqlite3ExprCompare(pParse, pA->pRight, pB->pRight, iTab) ) return 2; if( sqlite3ExprListCompare(pA->x.pList, pB->x.pList, iTab) ) return 2; - assert( (combinedFlags & EP_Reduced)==0 ); - if( pA->op!=TK_STRING && pA->op!=TK_TRUEFALSE ){ + if( pA->op!=TK_STRING + && pA->op!=TK_TRUEFALSE + && (combinedFlags & EP_Reduced)==0 + ){ if( pA->iColumn!=pB->iColumn ) return 2; if( pA->iTable!=pB->iTable && (pA->iTable!=iTab || NEVER(pB->iTable>=0)) ) return 2; @@ -4871,6 +4960,7 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ case TK_ISNOT: case TK_NOT: case TK_ISNULL: + case TK_NOTNULL: case TK_IS: case TK_OR: case TK_CASE: @@ -4879,6 +4969,7 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_ISNOT ); testcase( pExpr->op==TK_NOT ); testcase( pExpr->op==TK_ISNULL ); + testcase( pExpr->op==TK_NOTNULL ); testcase( pExpr->op==TK_IS ); testcase( pExpr->op==TK_OR ); testcase( pExpr->op==TK_CASE ); @@ -5252,6 +5343,7 @@ void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ w.xSelectCallback2 = analyzeAggregatesInSelectEnd; w.walkerDepth = 0; w.u.pNC = pNC; + w.pParse = 0; assert( pNC->pSrcList!=0 ); sqlite3WalkExpr(&w, pExpr); } diff --git a/sqlite/src/fkey.c b/sqlite/src/fkey.c index 6777d71e..9633c414 100644 --- a/sqlite/src/fkey.c +++ b/sqlite/src/fkey.c @@ -329,7 +329,7 @@ static void fkLookupParent( int i; /* Iterator variable */ Vdbe *v = sqlite3GetVdbe(pParse); /* Vdbe to add code to */ int iCur = pParse->nTab - 1; /* Cursor number to use */ - int iOk = sqlite3VdbeMakeLabel(v); /* jump here if parent key found */ + int iOk = sqlite3VdbeMakeLabel(pParse); /* jump here if parent key found */ sqlite3VdbeVerifyAbortable(v, (!pFKey->isDeferred @@ -602,8 +602,11 @@ static void fkScanChildren( ** NOT( $current_a==a AND $current_b==b AND ... ) ** ** The first form is used for rowid tables. The second form is used - ** for WITHOUT ROWID tables. In the second form, the primary key is - ** (a,b,...) + ** for WITHOUT ROWID tables. In the second form, the *parent* key is + ** (a,b,...). Either the parent or primary key could be used to + ** uniquely identify the current row, but the parent key is more convenient + ** as the required values have already been loaded into registers + ** by the caller. */ if( pTab==pFKey->pFrom && nIncr>0 ){ Expr *pNe; /* Expression (pLeft != pRight) */ @@ -615,14 +618,13 @@ static void fkScanChildren( pNe = sqlite3PExpr(pParse, TK_NE, pLeft, pRight); }else{ Expr *pEq, *pAll = 0; - Index *pPk = sqlite3PrimaryKeyIndex(pTab); assert( pIdx!=0 ); - for(i=0; inKeyCol; i++){ + for(i=0; inKeyCol; i++){ i16 iCol = pIdx->aiColumn[i]; assert( iCol>=0 ); pLeft = exprTableRegister(pParse, pTab, regData, iCol); - pRight = exprTableColumn(db, pTab, pSrc->a[0].iCursor, iCol); - pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight); + pRight = sqlite3Expr(db, TK_ID, pTab->aCol[iCol].zName); + pEq = sqlite3PExpr(pParse, TK_IS, pLeft, pRight); pAll = sqlite3ExprAnd(db, pAll, pEq); } pNe = sqlite3PExpr(pParse, TK_NOT, pAll, 0); @@ -727,7 +729,7 @@ void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTab){ if( p->isDeferred || (db->flags & SQLITE_DeferFKs) ) break; } if( !p ) return; - iSkip = sqlite3VdbeMakeLabel(v); + iSkip = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeAddOp2(v, OP_FkIfZero, 1, iSkip); VdbeCoverage(v); } @@ -1012,7 +1014,7 @@ void sqlite3FkCheck( /* Create a SrcList structure containing the child table. We need the ** child table as a SrcList for sqlite3WhereBegin() */ - pSrc = sqlite3SrcListAppend(db, 0, 0, 0); + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( pSrc ){ struct SrcList_item *pItem = pSrc->a; pItem->pTab = pFKey->pFrom; @@ -1289,7 +1291,7 @@ static Trigger *fkActionTrigger( } pSelect = sqlite3SelectNew(pParse, sqlite3ExprListAppend(pParse, 0, pRaise), - sqlite3SrcListAppend(db, 0, &tFrom, 0), + sqlite3SrcListAppend(pParse, 0, &tFrom, 0), pWhere, 0, 0, 0, 0, 0 ); diff --git a/sqlite/src/func.c b/sqlite/src/func.c index 0504a8f0..8b1d4416 100644 --- a/sqlite/src/func.c +++ b/sqlite/src/func.c @@ -201,6 +201,7 @@ static void instrFunc( int typeHaystack, typeNeedle; int N = 1; int isText; + unsigned char firstChar; UNUSED_PARAMETER(argc); typeHaystack = sqlite3_value_type(argv[0]); @@ -219,7 +220,10 @@ static void instrFunc( isText = 1; } if( zNeedle==0 || (nHaystack && zHaystack==0) ) return; - while( nNeedle<=nHaystack && memcmp(zHaystack, zNeedle, nNeedle)!=0 ){ + firstChar = zNeedle[0]; + while( nNeedle<=nHaystack + && (zHaystack[0]!=firstChar || memcmp(zHaystack, zNeedle, nNeedle)!=0) + ){ N++; do{ nHaystack--; @@ -510,11 +514,11 @@ static void randomBlob( int argc, sqlite3_value **argv ){ - int n; + sqlite3_int64 n; unsigned char *p; assert( argc==1 ); UNUSED_PARAMETER(argc); - n = sqlite3_value_int(argv[0]); + n = sqlite3_value_int64(argv[0]); if( n<1 ){ n = 1; } diff --git a/sqlite/src/global.c b/sqlite/src/global.c index f1a39124..a78ea65a 100644 --- a/sqlite/src/global.c +++ b/sqlite/src/global.c @@ -189,6 +189,13 @@ const unsigned char sqlite3CtypeMap[256] = { #endif +/* The default maximum size of an in-memory database created using +** sqlite3_deserialize() +*/ +#ifndef SQLITE_MEMDB_DEFAULT_MAXSIZE +# define SQLITE_MEMDB_DEFAULT_MAXSIZE 1073741824 +#endif + /* ** The following singleton contains the global configuration for ** the SQLite library. @@ -236,13 +243,16 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = { 0, /* xVdbeBranch */ 0, /* pVbeBranchArg */ #endif +#ifdef SQLITE_ENABLE_DESERIALIZE + SQLITE_MEMDB_DEFAULT_MAXSIZE, /* mxMemdbSize */ +#endif #ifndef SQLITE_UNTESTABLE 0, /* xTestCallback */ #endif 0, /* bLocaltimeFault */ 0, /* bInternalFunctions */ 0x7ffffffe, /* iOnceResetThreshold */ - SQLITE_DEFAULT_SORTERREF_SIZE /* szSorterRef */ + SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ }; /* diff --git a/sqlite/src/hash.c b/sqlite/src/hash.c index fba9dc9f..79bb85ac 100644 --- a/sqlite/src/hash.c +++ b/sqlite/src/hash.c @@ -64,20 +64,6 @@ 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. @@ -267,14 +219,6 @@ 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/sqlite/src/insert.c b/sqlite/src/insert.c index 7a941390..8d069b00 100644 --- a/sqlite/src/insert.c +++ b/sqlite/src/insert.c @@ -319,6 +319,7 @@ void sqlite3AutoincrementBegin(Parse *pParse){ aOp[7].p2 = memId+2; aOp[7].p1 = memId; aOp[10].p2 = memId; + if( pParse->nTab==0 ) pParse->nTab = 1; } } @@ -825,6 +826,11 @@ void sqlite3Insert( } #ifndef SQLITE_OMIT_UPSERT if( pUpsert ){ + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "UPSERT not implemented for virtual table \"%s\"", + pTab->zName); + goto insert_cleanup; + } pTabList->a[0].iCursor = iDataCur; pUpsert->pUpsertSrc = pTabList; pUpsert->regData = regData; @@ -865,7 +871,7 @@ void sqlite3Insert( /* Run the BEFORE and INSTEAD OF triggers, if there are any */ - endOfLoop = sqlite3VdbeMakeLabel(v); + endOfLoop = sqlite3VdbeMakeLabel(pParse); if( tmask & TRIGGER_BEFORE ){ int regCols = sqlite3GetTempRange(pParse, pTab->nCol+1); @@ -947,16 +953,12 @@ void sqlite3Insert( }else if( pSelect ){ sqlite3VdbeAddOp2(v, OP_Copy, regFromSelect+ipkColumn, regRowid); }else{ - VdbeOp *pOp; - sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid); - pOp = sqlite3VdbeGetOp(v, -1); - assert( pOp!=0 ); - if( pOp->opcode==OP_Null && !IsVirtual(pTab) ){ + Expr *pIpk = pList->a[ipkColumn].pExpr; + if( pIpk->op==TK_NULL && !IsVirtual(pTab) ){ + sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); appendFlag = 1; - pOp->opcode = OP_NewRowid; - pOp->p1 = iDataCur; - pOp->p2 = regRowid; - pOp->p3 = regAutoinc; + }else{ + sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid); } } /* If the PRIMARY KEY expression is NULL, then use OP_NewRowid @@ -1351,7 +1353,20 @@ void sqlite3GenerateConstraintChecks( } assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail || onError==OE_Ignore || onError==OE_Replace ); + addr1 = 0; switch( onError ){ + case OE_Replace: { + assert( onError==OE_Replace ); + addr1 = sqlite3VdbeMakeLabel(pParse); + sqlite3VdbeAddOp2(v, OP_NotNull, regNewData+1+i, addr1); + VdbeCoverage(v); + sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); + sqlite3VdbeAddOp2(v, OP_NotNull, regNewData+1+i, addr1); + VdbeCoverage(v); + onError = OE_Abort; + /* Fall through into the OE_Abort case to generate code that runs + ** if both the input and the default value are NULL */ + } case OE_Abort: sqlite3MayAbort(pParse); /* Fall through */ @@ -1364,21 +1379,15 @@ void sqlite3GenerateConstraintChecks( sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC); sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); VdbeCoverage(v); + if( addr1 ) sqlite3VdbeResolveLabel(v, addr1); break; } - case OE_Ignore: { + default: { + assert( onError==OE_Ignore ); sqlite3VdbeAddOp2(v, OP_IsNull, regNewData+1+i, ignoreDest); VdbeCoverage(v); break; } - default: { - assert( onError==OE_Replace ); - addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regNewData+1+i); - VdbeCoverage(v); - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); - sqlite3VdbeJumpHere(v, addr1); - break; - } } } @@ -1399,7 +1408,7 @@ void sqlite3GenerateConstraintChecks( ** updated so there is no point it verifying the check constraint */ continue; } - allOk = sqlite3VdbeMakeLabel(v); + allOk = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeVerifyAbortable(v, onError); sqlite3ExprIfTrue(pParse, pExpr, allOk, SQLITE_JUMPIFNULL); if( onError==OE_Ignore ){ @@ -1466,7 +1475,7 @@ void sqlite3GenerateConstraintChecks( ** exist in the table. */ if( pkChng && pPk==0 ){ - int addrRowidOk = sqlite3VdbeMakeLabel(v); + int addrRowidOk = sqlite3VdbeMakeLabel(pParse); /* Figure out what action to take in case of a rowid collision */ onError = pTab->keyConf; @@ -1616,7 +1625,7 @@ void sqlite3GenerateConstraintChecks( VdbeComment((v, "Skip upsert subroutine")); sqlite3VdbeJumpHere(v, upsertJump); }else{ - addrUniqueOk = sqlite3VdbeMakeLabel(v); + addrUniqueOk = sqlite3VdbeMakeLabel(pParse); } if( bAffinityDone==0 && (pUpIdx==0 || pUpIdx==pIdx) ){ sqlite3TableAffinity(v, pTab, regNewData+1); @@ -1699,7 +1708,11 @@ void sqlite3GenerateConstraintChecks( ** (3) There are no secondary indexes on the table ** (4) No delete triggers need to be fired if there is a conflict ** (5) No FK constraint counters need to be updated if a conflict occurs. - */ + ** + ** This is not possible for ENABLE_PREUPDATE_HOOK builds, as the row + ** must be explicitly deleted in order to ensure any pre-update hook + ** is invoked. */ +#ifndef SQLITE_ENABLE_PREUPDATE_HOOK if( (ix==0 && pIdx->pNext==0) /* Condition 3 */ && pPk==pIdx /* Condition 2 */ && onError==OE_Replace /* Condition 1 */ @@ -1711,6 +1724,7 @@ void sqlite3GenerateConstraintChecks( sqlite3VdbeResolveLabel(v, addrUniqueOk); continue; } +#endif /* ifndef SQLITE_ENABLE_PREUPDATE_HOOK */ /* Check to see if the new index entry will be unique */ sqlite3VdbeVerifyAbortable(v, onError); @@ -1824,7 +1838,7 @@ void sqlite3GenerateConstraintChecks( /* If the IPK constraint is a REPLACE, run it last */ if( ipkTop ){ - sqlite3VdbeGoto(v, ipkTop+1); + sqlite3VdbeGoto(v, ipkTop); VdbeComment((v, "Do IPK REPLACE")); sqlite3VdbeJumpHere(v, ipkBottom); } @@ -1905,10 +1919,13 @@ void sqlite3CompleteInsertion( pik_flags |= (update_flags & OPFLAG_SAVEPOSITION); #ifdef SQLITE_ENABLE_PREUPDATE_HOOK if( update_flags==0 ){ - sqlite3VdbeAddOp4(v, OP_InsertInt, - iIdxCur+i, aRegIdx[i], 0, (char*)pTab, P4_TABLE + int r = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_Integer, 0, r); + sqlite3VdbeAddOp4(v, OP_Insert, + iIdxCur+i, aRegIdx[i], r, (char*)pTab, P4_TABLE ); sqlite3VdbeChangeP5(v, OPFLAG_ISNOOP); + sqlite3ReleaseTempReg(pParse, r); } #endif } @@ -2194,7 +2211,8 @@ static int xferOptimization( if( pSrc==0 ){ return 0; /* FROM clause does not contain a real table */ } - if( pSrc==pDest ){ + if( pSrc->tnum==pDest->tnum && pSrc->pSchema==pDest->pSchema ){ + testcase( pSrc!=pDest ); /* Possible due to bad sqlite_master.rootpage */ return 0; /* tab1 and tab2 may not be the same table */ } if( HasRowid(pDest)!=HasRowid(pSrc) ){ diff --git a/sqlite/src/legacy.c b/sqlite/src/legacy.c index 40959a85..867587e5 100644 --- a/sqlite/src/legacy.c +++ b/sqlite/src/legacy.c @@ -46,7 +46,7 @@ int sqlite3_exec( sqlite3_mutex_enter(db->mutex); sqlite3Error(db, SQLITE_OK); while( rc==SQLITE_OK && zSql[0] ){ - int nCol; + int nCol = 0; char **azVals = 0; pStmt = 0; @@ -60,9 +60,7 @@ int sqlite3_exec( zSql = zLeftover; continue; } - callbackIsInit = 0; - nCol = sqlite3_column_count(pStmt); while( 1 ){ int i; @@ -73,6 +71,7 @@ int sqlite3_exec( (SQLITE_DONE==rc && !callbackIsInit && db->flags&SQLITE_NullCallback)) ){ if( !callbackIsInit ){ + nCol = sqlite3_column_count(pStmt); azCols = sqlite3DbMallocRaw(db, (2*nCol+1)*sizeof(const char*)); if( azCols==0 ){ goto exec_out; diff --git a/sqlite/src/loadext.c b/sqlite/src/loadext.c index 966d2dda..214390ed 100644 --- a/sqlite/src/loadext.c +++ b/sqlite/src/loadext.c @@ -650,7 +650,7 @@ int sqlite3_enable_load_extension(sqlite3 *db, int onoff){ if( onoff ){ db->flags |= SQLITE_LoadExtension|SQLITE_LoadExtFunc; }else{ - db->flags &= ~(SQLITE_LoadExtension|SQLITE_LoadExtFunc); + db->flags &= ~(u64)(SQLITE_LoadExtension|SQLITE_LoadExtFunc); } sqlite3_mutex_leave(db->mutex); return SQLITE_OK; diff --git a/sqlite/src/main.c b/sqlite/src/main.c index 46c83463..41e02454 100644 --- a/sqlite/src/main.c +++ b/sqlite/src/main.c @@ -653,6 +653,13 @@ int sqlite3_config(int op, ...){ } #endif /* SQLITE_ENABLE_SORTER_REFERENCES */ +#ifdef SQLITE_ENABLE_DESERIALIZE + case SQLITE_CONFIG_MEMDB_MAXSIZE: { + sqlite3GlobalConfig.mxMemdbSize = va_arg(ap, sqlite3_int64); + break; + } +#endif /* SQLITE_ENABLE_DESERIALIZE */ + default: { rc = SQLITE_ERROR; break; @@ -843,11 +850,11 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){ if( aFlagOp[i].op==op ){ int onoff = va_arg(ap, int); int *pRes = va_arg(ap, int*); - u32 oldFlags = db->flags; + u64 oldFlags = db->flags; if( onoff>0 ){ db->flags |= aFlagOp[i].mask; }else if( onoff==0 ){ - db->flags &= ~aFlagOp[i].mask; + db->flags &= ~(u64)aFlagOp[i].mask; } if( oldFlags!=db->flags ){ sqlite3ExpirePreparedStatements(db, 0); @@ -1310,7 +1317,7 @@ void sqlite3RollbackAll(sqlite3 *db, int tripCode){ /* Any deferred constraint violations have now been resolved. */ db->nDeferredCons = 0; db->nDeferredImmCons = 0; - db->flags &= ~SQLITE_DeferFKs; + db->flags &= ~(u64)SQLITE_DeferFKs; /* If one has been configured, invoke the rollback-hook callback */ if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){ @@ -2052,6 +2059,8 @@ void *sqlite3_profile( pOld = db->pProfileArg; db->xProfile = xProfile; db->pProfileArg = pArg; + db->mTrace &= SQLITE_TRACE_NONLEGACY_MASK; + if( db->xProfile ) db->mTrace |= SQLITE_TRACE_XPROFILE; sqlite3_mutex_leave(db->mutex); return pOld; } @@ -2403,7 +2412,7 @@ const char *sqlite3_errmsg(sqlite3 *db){ z = sqlite3ErrStr(SQLITE_NOMEM_BKPT); }else{ testcase( db->pErr==0 ); - z = (char*)sqlite3_value_text(db->pErr); + z = db->errCode ? (char*)sqlite3_value_text(db->pErr) : 0; assert( !db->mallocFailed ); if( z==0 ){ z = sqlite3ErrStr(db->errCode); @@ -2933,6 +2942,40 @@ int sqlite3ParseUri( return rc; } +#if defined(SQLITE_HAS_CODEC) +/* +** Process URI filename query parameters relevant to the SQLite Encryption +** Extension. Return true if any of the relevant query parameters are +** seen and return false if not. +*/ +int sqlite3CodecQueryParameters( + sqlite3 *db, /* Database connection */ + const char *zDb, /* Which schema is being created/attached */ + const char *zUri /* URI filename */ +){ + const char *zKey; + if( (zKey = sqlite3_uri_parameter(zUri, "hexkey"))!=0 && zKey[0] ){ + u8 iByte; + int i; + char zDecoded[40]; + for(i=0, iByte=0; imFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || p->nMmap>0 ){ return SQLITE_FULL; } + if( newSz>p->szMax ){ + return SQLITE_FULL; + } + newSz *= 2; + if( newSz>p->szMax ) newSz = p->szMax; pNew = sqlite3_realloc64(p->aData, newSz); if( pNew==0 ) return SQLITE_NOMEM; p->aData = pNew; - p->szMax = newSz; + p->szAlloc = newSz; return SQLITE_OK; } @@ -177,10 +183,11 @@ static int memdbWrite( sqlite_int64 iOfst ){ MemFile *p = (MemFile *)pFile; + if( NEVER(p->mFlags & SQLITE_DESERIALIZE_READONLY) ) return SQLITE_READONLY; if( iOfst+iAmt>p->sz ){ int rc; - if( iOfst+iAmt>p->szMax - && (rc = memdbEnlarge(p, (iOfst+iAmt)*2))!=SQLITE_OK + if( iOfst+iAmt>p->szAlloc + && (rc = memdbEnlarge(p, iOfst+iAmt))!=SQLITE_OK ){ return rc; } @@ -226,6 +233,11 @@ static int memdbFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ */ static int memdbLock(sqlite3_file *pFile, int eLock){ MemFile *p = (MemFile *)pFile; + if( eLock>SQLITE_LOCK_SHARED + && (p->mFlags & SQLITE_DESERIALIZE_READONLY)!=0 + ){ + return SQLITE_READONLY; + } p->eLock = eLock; return SQLITE_OK; } @@ -250,6 +262,19 @@ static int memdbFileControl(sqlite3_file *pFile, int op, void *pArg){ *(char**)pArg = sqlite3_mprintf("memdb(%p,%lld)", p->aData, p->sz); rc = SQLITE_OK; } + if( op==SQLITE_FCNTL_SIZE_LIMIT ){ + sqlite3_int64 iLimit = *(sqlite3_int64*)pArg; + if( iLimitsz ){ + if( iLimit<0 ){ + iLimit = p->szMax; + }else{ + iLimit = p->sz; + } + } + p->szMax = iLimit; + *(sqlite3_int64*)pArg = iLimit; + rc = SQLITE_OK; + } return rc; } @@ -280,8 +305,12 @@ static int memdbFetch( void **pp ){ MemFile *p = (MemFile *)pFile; - p->nMmap++; - *pp = (void*)(p->aData + iOfst); + if( iOfst+iAmt>p->sz ){ + *pp = 0; + }else{ + p->nMmap++; + *pp = (void*)(p->aData + iOfst); + } return SQLITE_OK; } @@ -311,6 +340,7 @@ static int memdbOpen( assert( pOutFlags!=0 ); /* True because flags==SQLITE_OPEN_MAIN_DB */ *pOutFlags = flags | SQLITE_OPEN_MEMORY; p->base.pMethods = &memdb_io_methods; + p->szMax = sqlite3GlobalConfig.mxMemdbSize; return SQLITE_OK; } @@ -560,7 +590,11 @@ int sqlite3_deserialize( }else{ p->aData = pData; p->sz = szDb; + p->szAlloc = szBuf; p->szMax = szBuf; + if( p->szMaxszMax = sqlite3GlobalConfig.mxMemdbSize; + } p->mFlags = mFlags; rc = SQLITE_OK; } diff --git a/sqlite/src/pager.c b/sqlite/src/pager.c index e252a4b7..e2a12fbf 100644 --- a/sqlite/src/pager.c +++ b/sqlite/src/pager.c @@ -3839,7 +3839,10 @@ int sqlite3PagerMaxPageCount(Pager *pPager, int mxPage){ pPager->mxPgno = mxPage; } assert( pPager->eState!=PAGER_OPEN ); /* Called only by OP_MaxPgcnt */ - assert( pPager->mxPgno>=pPager->dbSize ); /* OP_MaxPgcnt enforces this */ + /* assert( pPager->mxPgno>=pPager->dbSize ); */ + /* OP_MaxPgcnt ensures that the parameter passed to this function is not + ** less than the total number of valid pages in the database. But this + ** may be less than Pager.dbSize, and so the assert() above is not valid */ return pPager->mxPgno; } diff --git a/sqlite/src/parse.y b/sqlite/src/parse.y index b150c73e..1b89e69f 100644 --- a/sqlite/src/parse.y +++ b/sqlite/src/parse.y @@ -664,6 +664,12 @@ seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z) pNew->zName = pOld->zName; pNew->zDatabase = pOld->zDatabase; pNew->pSelect = pOld->pSelect; + if( pOld->fg.isTabFunc ){ + pNew->u1.pFuncArg = pOld->u1.pFuncArg; + pOld->u1.pFuncArg = 0; + pOld->fg.isTabFunc = 0; + pNew->fg.isTabFunc = 1; + } pOld->zName = pOld->zDatabase = 0; pOld->pSelect = 0; } @@ -684,26 +690,26 @@ dbnm(A) ::= DOT nm(X). {A = X;} %type fullname {SrcList*} %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);} fullname(A) ::= nm(X). { - A = sqlite3SrcListAppend(pParse->db,0,&X,0); + A = sqlite3SrcListAppend(pParse,0,&X,0); if( IN_RENAME_OBJECT && A ) sqlite3RenameTokenMap(pParse, A->a[0].zName, &X); } fullname(A) ::= nm(X) DOT nm(Y). { - A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); + A = sqlite3SrcListAppend(pParse,0,&X,&Y); if( IN_RENAME_OBJECT && A ) sqlite3RenameTokenMap(pParse, A->a[0].zName, &Y); } %type xfullname {SrcList*} %destructor xfullname {sqlite3SrcListDelete(pParse->db, $$);} xfullname(A) ::= nm(X). - {A = sqlite3SrcListAppend(pParse->db,0,&X,0); /*A-overwrites-X*/} + {A = sqlite3SrcListAppend(pParse,0,&X,0); /*A-overwrites-X*/} xfullname(A) ::= nm(X) DOT nm(Y). - {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/} + {A = sqlite3SrcListAppend(pParse,0,&X,&Y); /*A-overwrites-X*/} xfullname(A) ::= nm(X) DOT nm(Y) AS nm(Z). { - A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/ + A = sqlite3SrcListAppend(pParse,0,&X,&Y); /*A-overwrites-X*/ if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z); } xfullname(A) ::= nm(X) AS nm(Z). { - A = sqlite3SrcListAppend(pParse->db,0,&X,0); /*A-overwrites-X*/ + A = sqlite3SrcListAppend(pParse,0,&X,0); /*A-overwrites-X*/ if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z); } @@ -820,6 +826,10 @@ limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). cmd ::= with DELETE FROM xfullname(X) indexed_opt(I) where_opt(W) orderby_opt(O) limit_opt(L). { sqlite3SrcListIndexedBy(pParse, X, &I); +#ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT + sqlite3ExprListDelete(pParse->db, O); O = 0; + sqlite3ExprDelete(pParse->db, L); L = 0; +#endif sqlite3DeleteFrom(pParse,X,W,O,L); } %endif @@ -949,8 +959,7 @@ idlist(A) ::= nm(Y). memcpy(p->u.zToken, t.z, t.n); p->u.zToken[t.n] = 0; if( sqlite3Isquote(p->u.zToken[0]) ){ - if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted; - sqlite3Dequote(p->u.zToken); + sqlite3DequoteExpr(p); } #if SQLITE_MAX_EXPR_DEPTH>0 p->nHeight = 1; @@ -1161,8 +1170,10 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { ** simplify to constants 0 (false) and 1 (true), respectively, ** regardless of the value of expr1. */ - sqlite3ExprDelete(pParse->db, A); - A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1); + if( IN_RENAME_OBJECT==0 ){ + sqlite3ExprDelete(pParse->db, A); + A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1); + } }else if( Y->nExpr==1 ){ /* Expressions of the form: ** @@ -1211,7 +1222,7 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); } expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) paren_exprlist(E). [IN] { - SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); + SrcList *pSrc = sqlite3SrcListAppend(pParse, 0,&Y,&Z); Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0); if( E ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E); A = sqlite3PExpr(pParse, TK_IN, A, 0); @@ -1282,7 +1293,7 @@ paren_exprlist(A) ::= LP exprlist(X) RP. {A = X;} cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) ON nm(Y) LP sortlist(Z) RP where_opt(W). { sqlite3CreateIndex(pParse, &X, &D, - sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, + sqlite3SrcListAppend(pParse,0,&Y,0), Z, U, &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF); if( IN_RENAME_OBJECT && pParse->pNewIndex ){ sqlite3RenameTokenMap(pParse, pParse->pNewIndex->zName, &Y); @@ -1361,8 +1372,12 @@ cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} // %ifndef SQLITE_OMIT_VACUUM %ifndef SQLITE_OMIT_ATTACH -cmd ::= VACUUM. {sqlite3Vacuum(pParse,0);} -cmd ::= VACUUM nm(X). {sqlite3Vacuum(pParse,&X);} +%type vinto {Expr*} +%destructor vinto {sqlite3ExprDelete(pParse->db, $$);} +cmd ::= VACUUM vinto(Y). {sqlite3Vacuum(pParse,0,Y);} +cmd ::= VACUUM nm(X) vinto(Y). {sqlite3Vacuum(pParse,&X,Y);} +vinto(A) ::= INTO expr(X). {A = X;} +vinto(A) ::= . {A = 0;} %endif SQLITE_OMIT_ATTACH %endif SQLITE_OMIT_VACUUM diff --git a/sqlite/src/pcache1.c b/sqlite/src/pcache1.c index 2880c2c5..5f502d57 100644 --- a/sqlite/src/pcache1.c +++ b/sqlite/src/pcache1.c @@ -92,16 +92,27 @@ typedef struct PGroup PGroup; ** structure. Unless SQLITE_PCACHE_SEPARATE_HEADER is defined, a buffer of ** PgHdr1.pCache->szPage bytes is allocated directly before this structure ** in memory. +** +** Note: Variables isBulkLocal and isAnchor were once type "u8". That works, +** but causes a 2-byte gap in the structure for most architectures (since +** pointers must be either 4 or 8-byte aligned). As this structure is located +** in memory directly after the associated page data, if the database is +** corrupt, code at the b-tree layer may overread the page buffer and +** read part of this structure before the corruption is detected. This +** can cause a valgrind error if the unitialized gap is accessed. Using u16 +** ensures there is no such gap, and therefore no bytes of unitialized memory +** in the structure. */ struct PgHdr1 { sqlite3_pcache_page page; /* Base class. Must be first. pBuf & pExtra */ unsigned int iKey; /* Key value (page number) */ - u8 isBulkLocal; /* This page from bulk local storage */ - u8 isAnchor; /* This is the PGroup.lru element */ + u16 isBulkLocal; /* This page from bulk local storage */ + u16 isAnchor; /* This is the PGroup.lru element */ PgHdr1 *pNext; /* Next in hash table chain */ PCache1 *pCache; /* Cache that currently owns this page */ PgHdr1 *pLruNext; /* Next in LRU list of unpinned pages */ PgHdr1 *pLruPrev; /* Previous in LRU list of unpinned pages */ + /* NB: pLruPrev is only valid if pLruNext!=0 */ }; /* @@ -167,6 +178,7 @@ struct PCache1 { unsigned int nMax; /* Configured "cache_size" value */ unsigned int n90pct; /* nMax*9/10 */ unsigned int iMaxKey; /* Largest key seen since xTruncate() */ + unsigned int nPurgeableDummy; /* pnPurgeable points here when not used*/ /* Hash table of all pages. The following variables may only be accessed ** when the accessor is holding the PGroup mutex. @@ -301,6 +313,7 @@ static int pcache1InitBulk(PCache1 *pCache){ pX->isBulkLocal = 1; pX->isAnchor = 0; pX->pNext = pCache->pFree; + pX->pLruPrev = 0; /* Initializing this saves a valgrind error */ pCache->pFree = pX; zBulk += pCache->szAlloc; }while( --nBulk ); @@ -476,6 +489,9 @@ static void pcache1FreePage(PgHdr1 *p){ ** exists, this function falls back to sqlite3Malloc(). */ void *sqlite3PageMalloc(int sz){ + /* During rebalance operations on a corrupt database file, it is sometimes + ** (rarely) possible to overread the temporary page buffer by a few bytes. + ** Enlarge the allocation slightly so that this does not cause problems. */ return pcache1Alloc(sz); } @@ -570,7 +586,8 @@ static PgHdr1 *pcache1PinPage(PgHdr1 *pPage){ pPage->pLruPrev->pLruNext = pPage->pLruNext; pPage->pLruNext->pLruPrev = pPage->pLruPrev; pPage->pLruNext = 0; - pPage->pLruPrev = 0; + /* pPage->pLruPrev = 0; + ** No need to clear pLruPrev as it is never accessed if pLruNext is 0 */ assert( pPage->isAnchor==0 ); assert( pPage->pCache->pGroup->lru.isAnchor==1 ); pPage->pCache->nRecyclable--; @@ -780,8 +797,7 @@ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; pCache->pnPurgeable = &pGroup->nPurgeable; }else{ - static unsigned int dummyCurrentPage; - pCache->pnPurgeable = &dummyCurrentPage; + pCache->pnPurgeable = &pCache->nPurgeableDummy; } pcache1LeaveMutex(pGroup); if( pCache->nHash==0 ){ @@ -908,8 +924,9 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( pPage->iKey = iKey; pPage->pNext = pCache->apHash[h]; pPage->pCache = pCache; - pPage->pLruPrev = 0; pPage->pLruNext = 0; + /* pPage->pLruPrev = 0; + ** No need to clear pLruPrev since it is not accessed when pLruNext==0 */ *(void **)pPage->page.pExtra = 0; pCache->apHash[h] = pPage; if( iKey>pCache->iMaxKey ){ @@ -1069,7 +1086,7 @@ static void pcache1Unpin( /* It is an error to call this function if the page is already ** part of the PGroup LRU list. */ - assert( pPage->pLruPrev==0 && pPage->pLruNext==0 ); + assert( pPage->pLruNext==0 ); assert( PAGE_IS_PINNED(pPage) ); if( reuseUnlikely || pGroup->nPurgeable>pGroup->nMaxPage ){ diff --git a/sqlite/src/pragma.c b/sqlite/src/pragma.c index ada652cf..1dcd2140 100644 --- a/sqlite/src/pragma.c +++ b/sqlite/src/pragma.c @@ -816,7 +816,7 @@ void sqlite3Pragma( if( sqlite3GetBoolean(zRight, size!=0) ){ db->flags |= SQLITE_CacheSpill; }else{ - db->flags &= ~SQLITE_CacheSpill; + db->flags &= ~(u64)SQLITE_CacheSpill; } setAllPagerFlags(db); } @@ -1376,7 +1376,7 @@ void sqlite3Pragma( x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols); assert( x==0 ); } - addrOk = sqlite3VdbeMakeLabel(v); + addrOk = sqlite3VdbeMakeLabel(pParse); /* Generate code to read the child key values into registers ** regRow..regRow+n. If any of the child key values are NULL, this @@ -1421,19 +1421,6 @@ void sqlite3Pragma( #endif /* !defined(SQLITE_OMIT_TRIGGER) */ #endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ -#ifndef NDEBUG - case PragTyp_PARSER_TRACE: { - if( zRight ){ - if( sqlite3GetBoolean(zRight, 0) ){ - sqlite3ParserTrace(stdout, "parser: "); - }else{ - sqlite3ParserTrace(0, 0); - } - } - } - break; -#endif - /* Reinstall the LIKE and GLOB functions. The variant of LIKE ** used will be case sensitive or not depending on the RHS. */ @@ -1596,8 +1583,8 @@ void sqlite3Pragma( if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){ ExprList *pCheck = sqlite3ExprListDup(db, pTab->pCheck, 0); if( db->mallocFailed==0 ){ - int addrCkFault = sqlite3VdbeMakeLabel(v); - int addrCkOk = sqlite3VdbeMakeLabel(v); + int addrCkFault = sqlite3VdbeMakeLabel(pParse); + int addrCkOk = sqlite3VdbeMakeLabel(pParse); char *zErr; int k; pParse->iSelfTab = iDataCur + 1; @@ -1620,7 +1607,7 @@ void sqlite3Pragma( /* Validate index entries for the current row */ for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ int jmp2, jmp3, jmp4, jmp5; - int ckUniq = sqlite3VdbeMakeLabel(v); + int ckUniq = sqlite3VdbeMakeLabel(pParse); if( pPk==pIdx ) continue; r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 0, &jmp3, pPrior, r1); @@ -1641,7 +1628,7 @@ void sqlite3Pragma( ** current key. The entry is unique if (1) any column is NULL ** or (2) the next entry has a different key */ if( IsUniqueIndex(pIdx) ){ - int uniqOk = sqlite3VdbeMakeLabel(v); + int uniqOk = sqlite3VdbeMakeLabel(pParse); int jmp6; int kk; for(kk=0; kknKeyCol; kk++){ diff --git a/sqlite/src/pragma.h b/sqlite/src/pragma.h index b1d4155e..c156e3a4 100644 --- a/sqlite/src/pragma.h +++ b/sqlite/src/pragma.h @@ -49,8 +49,7 @@ #define PragTyp_HEXKEY 41 #define PragTyp_KEY 42 #define PragTyp_LOCK_STATUS 43 -#define PragTyp_PARSER_TRACE 44 -#define PragTyp_STATS 45 +#define PragTyp_STATS 44 /* Property flags associated with various pragma. */ #define PragFlg_NeedSchema 0x01 /* Force schema load before running */ @@ -461,12 +460,14 @@ static const PragmaName aPragmaName[] = { /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif -#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_PARSER_TRACE) +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if defined(SQLITE_DEBUG) {/* zName: */ "parser_trace", - /* ePragTyp: */ PragTyp_PARSER_TRACE, - /* ePragFlg: */ 0, + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, - /* iArg: */ 0 }, + /* iArg: */ SQLITE_ParserTrace }, +#endif #endif #if defined(SQLITE_INTROSPECTION_PRAGMAS) {/* zName: */ "pragma_list", diff --git a/sqlite/src/prepare.c b/sqlite/src/prepare.c index 4d33f0b1..3f1a79b1 100644 --- a/sqlite/src/prepare.c +++ b/sqlite/src/prepare.c @@ -44,6 +44,19 @@ static void corruptSchema( } } +/* +** Check to see if any sibling index (another index on the same table) +** of pIndex has the same root page number, and if it does, return true. +** This would indicate a corrupt schema. +*/ +int sqlite3IndexHasDuplicateRootPage(Index *pIndex){ + Index *p; + for(p=pIndex->pTable->pIndex; p; p=p->pNext){ + if( p->tnum==pIndex->tnum && p!=pIndex ) return 1; + } + return 0; +} + /* ** This is the callback routine for the code that initializes the ** database. See sqlite3Init() below for additional information. @@ -65,6 +78,7 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ UNUSED_PARAMETER2(NotUsed, argc); assert( sqlite3_mutex_held(db->mutex) ); DbClearProperty(db, iDb, DB_Empty); + pData->nInitRow++; if( db->mallocFailed ){ corruptSchema(pData, argv[0], 0); return 1; @@ -118,15 +132,12 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ */ Index *pIndex; pIndex = sqlite3FindIndex(db, argv[0], db->aDb[iDb].zDbSName); - if( pIndex==0 ){ - /* This can occur if there exists an index on a TEMP table which - ** has the same name as another index on a permanent index. Since - ** the permanent table is hidden by the TEMP table, we can also - ** safely ignore the index on the permanent table. - */ - /* Do Nothing */; - }else if( sqlite3GetInt32(argv[1], &pIndex->tnum)==0 ){ - corruptSchema(pData, argv[0], "invalid rootpage"); + if( pIndex==0 + || sqlite3GetInt32(argv[1],&pIndex->tnum)==0 + || pIndex->tnum<2 + || sqlite3IndexHasDuplicateRootPage(pIndex) + ){ + corruptSchema(pData, argv[0], pIndex?"invalid rootpage":"orphan index"); } } return 0; @@ -176,6 +187,7 @@ int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFlags){ initData.rc = SQLITE_OK; initData.pzErrMsg = pzErrMsg; initData.mInitFlags = mFlags; + initData.nInitRow = 0; sqlite3InitCallback(&initData, 3, (char **)azArg, 0); if( initData.rc ){ rc = initData.rc; @@ -293,7 +305,7 @@ int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFlags){ ** indices that the user might have created. */ if( iDb==0 && meta[BTREE_FILE_FORMAT-1]>=4 ){ - db->flags &= ~SQLITE_LegacyFileFmt; + db->flags &= ~(u64)SQLITE_LegacyFileFmt; } /* Read the schema information out of the schema tables @@ -545,6 +557,7 @@ static int sqlite3Prepare( sParse.disableLookaside++; db->lookaside.bDisable++; } + sParse.disableVtab = (prepFlags & SQLITE_PREPARE_NO_VTAB)!=0; /* Check to verify that it is possible to get a read lock on all ** database schemas. The inability to get a read lock indicates that @@ -709,293 +722,6 @@ 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/sqlite/src/printf.c b/sqlite/src/printf.c index 7bce83f3..f11fb666 100644 --- a/sqlite/src/printf.c +++ b/sqlite/src/printf.c @@ -155,6 +155,27 @@ static char *getTextArg(PrintfArguments *p){ return (char*)sqlite3_value_text(p->apArg[p->nUsed++]); } +/* +** Allocate memory for a temporary buffer needed for printf rendering. +** +** If the requested size of the temp buffer is larger than the size +** of the output buffer in pAccum, then cause an SQLITE_TOOBIG error. +** Do the size check before the memory allocation to prevent rogue +** SQL from requesting large allocations using the precision or width +** field of the printf() function. +*/ +static char *printfTempBuf(sqlite3_str *pAccum, sqlite3_int64 n){ + char *z; + if( n>pAccum->nAlloc && n>pAccum->mxAlloc ){ + setStrAccumError(pAccum, SQLITE_TOOBIG); + return 0; + } + z = sqlite3DbMallocRaw(pAccum->db, n); + if( z==0 ){ + setStrAccumError(pAccum, SQLITE_NOMEM); + } + return z; +} /* ** On machines with a small stack size, you can redefine the @@ -237,6 +258,9 @@ void sqlite3_str_vappendf( flag_leftjustify = flag_prefix = cThousand = flag_alternateform = flag_altform2 = flag_zeropad = 0; done = 0; + width = 0; + flag_long = 0; + precision = -1; do{ switch( c ){ case '-': flag_leftjustify = 1; break; @@ -247,80 +271,93 @@ void sqlite3_str_vappendf( case '0': flag_zeropad = 1; break; case ',': cThousand = ','; break; default: done = 1; break; - } - }while( !done && (c=(*++fmt))!=0 ); - /* Get the field width */ - if( c=='*' ){ - if( bArgList ){ - width = (int)getIntArg(pArgList); - }else{ - width = va_arg(ap,int); - } - if( width<0 ){ - flag_leftjustify = 1; - width = width >= -2147483647 ? -width : 0; - } - c = *++fmt; - }else{ - unsigned wx = 0; - while( c>='0' && c<='9' ){ - wx = wx*10 + c - '0'; - c = *++fmt; - } - testcase( wx>0x7fffffff ); - width = wx & 0x7fffffff; - } - assert( width>=0 ); + case 'l': { + flag_long = 1; + c = *++fmt; + if( c=='l' ){ + c = *++fmt; + flag_long = 2; + } + done = 1; + break; + } + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': { + unsigned wx = c - '0'; + while( (c = *++fmt)>='0' && c<='9' ){ + wx = wx*10 + c - '0'; + } + testcase( wx>0x7fffffff ); + width = wx & 0x7fffffff; #ifdef SQLITE_PRINTF_PRECISION_LIMIT - if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ - width = SQLITE_PRINTF_PRECISION_LIMIT; - } + if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + width = SQLITE_PRINTF_PRECISION_LIMIT; + } #endif - - /* Get the precision */ - if( c=='.' ){ - c = *++fmt; - if( c=='*' ){ - if( bArgList ){ - precision = (int)getIntArg(pArgList); - }else{ - precision = va_arg(ap,int); + if( c!='.' && c!='l' ){ + done = 1; + }else{ + fmt--; + } + break; } - c = *++fmt; - if( precision<0 ){ - precision = precision >= -2147483647 ? -precision : -1; + case '*': { + if( bArgList ){ + width = (int)getIntArg(pArgList); + }else{ + width = va_arg(ap,int); + } + if( width<0 ){ + flag_leftjustify = 1; + width = width >= -2147483647 ? -width : 0; + } +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + width = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( (c = fmt[1])!='.' && c!='l' ){ + c = *++fmt; + done = 1; + } + break; } - }else{ - unsigned px = 0; - while( c>='0' && c<='9' ){ - px = px*10 + c - '0'; + case '.': { c = *++fmt; - } - testcase( px>0x7fffffff ); - precision = px & 0x7fffffff; - } - }else{ - precision = -1; - } - assert( precision>=(-1) ); + if( c=='*' ){ + if( bArgList ){ + precision = (int)getIntArg(pArgList); + }else{ + precision = va_arg(ap,int); + } + if( precision<0 ){ + precision = precision >= -2147483647 ? -precision : -1; + } + c = *++fmt; + }else{ + unsigned px = 0; + while( c>='0' && c<='9' ){ + px = px*10 + c - '0'; + c = *++fmt; + } + testcase( px>0x7fffffff ); + precision = px & 0x7fffffff; + } #ifdef SQLITE_PRINTF_PRECISION_LIMIT - if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){ - precision = SQLITE_PRINTF_PRECISION_LIMIT; - } + if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){ + precision = SQLITE_PRINTF_PRECISION_LIMIT; + } #endif - - - /* Get the conversion type modifier */ - if( c=='l' ){ - flag_long = 1; - c = *++fmt; - if( c=='l' ){ - flag_long = 2; - c = *++fmt; + if( c=='l' ){ + --fmt; + }else{ + done = 1; + } + break; + } } - }else{ - flag_long = 0; - } + }while( !done && (c=(*++fmt))!=0 ); + /* Fetch the info entry for the field */ infop = &fmtinfo[0]; xtype = etINVALID; @@ -405,12 +442,11 @@ void sqlite3_str_vappendf( nOut = etBUFSIZE; zOut = buf; }else{ - u64 n = (u64)precision + 10 + precision/3; - zOut = zExtra = sqlite3Malloc( n ); - if( zOut==0 ){ - setStrAccumError(pAccum, SQLITE_NOMEM); - return; - } + u64 n; + n = (u64)precision + 10; + if( cThousand ) n += precision/3; + zOut = zExtra = printfTempBuf(pAccum, n); + if( zOut==0 ) return; nOut = (int)n; } bufpt = &zOut[nOut-1]; @@ -529,12 +565,12 @@ void sqlite3_str_vappendf( }else{ e2 = exp; } - if( MAX(e2,0)+(i64)precision+(i64)width > etBUFSIZE - 15 ){ - bufpt = zExtra - = sqlite3Malloc( MAX(e2,0)+(i64)precision+(i64)width+15 ); - if( bufpt==0 ){ - setStrAccumError(pAccum, SQLITE_NOMEM); - return; + { + i64 szBufNeeded; /* Size of a temporary buffer needed */ + szBufNeeded = MAX(e2,0)+(i64)precision+(i64)width+15; + if( szBufNeeded > etBUFSIZE ){ + bufpt = zExtra = printfTempBuf(pAccum, szBufNeeded); + if( bufpt==0 ) return; } } zOut = bufpt; @@ -758,11 +794,8 @@ void sqlite3_str_vappendf( needQuote = !isnull && xtype==etSQLESCAPE2; n += i + 3; if( n>etBUFSIZE ){ - bufpt = zExtra = sqlite3Malloc( n ); - if( bufpt==0 ){ - setStrAccumError(pAccum, SQLITE_NOMEM); - return; - } + bufpt = zExtra = printfTempBuf(pAccum, n); + if( bufpt==0 ) return; }else{ bufpt = buf; } diff --git a/sqlite/src/resolve.c b/sqlite/src/resolve.c index 0c7dfc0b..fd9ab84f 100644 --- a/sqlite/src/resolve.c +++ b/sqlite/src/resolve.c @@ -80,7 +80,6 @@ static void resolveAlias( if( pExpr->op==TK_COLLATE ){ pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken); } - ExprSetProperty(pDup, EP_Alias); /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This ** prevents ExprDelete() from deleting the Expr structure itself, @@ -474,6 +473,25 @@ static int lookupName( if( cnt==0 && zTab==0 ){ assert( pExpr->op==TK_ID ); if( ExprHasProperty(pExpr,EP_DblQuoted) ){ + /* If a double-quoted identifier does not match any known column name, + ** then treat it as a string. + ** + ** This hack was added in the early days of SQLite in a misguided attempt + ** to be compatible with MySQL 3.x, which used double-quotes for strings. + ** I now sorely regret putting in this hack. The effect of this hack is + ** that misspelled identifier names are silently converted into strings + ** rather than causing an error, to the frustration of countless + ** programmers. To all those frustrated programmers, my apologies. + ** + ** Someday, I hope to get rid of this hack. Unfortunately there is + ** a huge amount of legacy SQL that uses it. So for now, we just + ** issue a warning. + */ + sqlite3_log(SQLITE_WARNING, + "double-quoted string literal: \"%w\"", zCol); +#ifdef SQLITE_ENABLE_NORMALIZE + sqlite3VdbeAddDblquoteStr(db, pParse->pVdbe, zCol); +#endif pExpr->op = TK_STRING; pExpr->y.pTab = 0; return WRC_Prune; @@ -840,10 +858,10 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ #ifndef SQLITE_OMIT_WINDOWFUNC if( pExpr->y.pWin ){ Select *pSel = pNC->pWinSelect; + sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->y.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->y.pWin) ){ @@ -1120,32 +1138,53 @@ static int resolveCompoundOrderBy( }else{ iCol = resolveAsName(pParse, pEList, pE); if( iCol==0 ){ - pDup = sqlite3ExprDup(db, pE, 0); + /* Now test if expression pE matches one of the values returned + ** by pSelect. In the usual case this is done by duplicating the + ** expression, resolving any symbols in it, and then comparing + ** it against each expression returned by the SELECT statement. + ** Once the comparisons are finished, the duplicate expression + ** is deleted. + ** + ** Or, if this is running as part of an ALTER TABLE operation, + ** resolve the symbols in the actual expression, not a duplicate. + ** And, if one of the comparisons is successful, leave the expression + ** as is instead of transforming it to an integer as in the usual + ** case. This allows the code in alter.c to modify column + ** refererences within the ORDER BY expression as required. */ + if( IN_RENAME_OBJECT ){ + pDup = pE; + }else{ + pDup = sqlite3ExprDup(db, pE, 0); + } if( !db->mallocFailed ){ assert(pDup); iCol = resolveOrderByTermToExprList(pParse, pSelect, pDup); } - sqlite3ExprDelete(db, pDup); + if( !IN_RENAME_OBJECT ){ + sqlite3ExprDelete(db, pDup); + } } } if( iCol>0 ){ /* Convert the ORDER BY term into an integer column number iCol, ** taking care to preserve the COLLATE clause if it exists */ - Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); - if( pNew==0 ) return 1; - pNew->flags |= EP_IntValue; - pNew->u.iValue = iCol; - if( pItem->pExpr==pE ){ - pItem->pExpr = pNew; - }else{ - Expr *pParent = pItem->pExpr; - assert( pParent->op==TK_COLLATE ); - while( pParent->pLeft->op==TK_COLLATE ) pParent = pParent->pLeft; - assert( pParent->pLeft==pE ); - pParent->pLeft = pNew; + if( !IN_RENAME_OBJECT ){ + Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); + if( pNew==0 ) return 1; + pNew->flags |= EP_IntValue; + pNew->u.iValue = iCol; + if( pItem->pExpr==pE ){ + pItem->pExpr = pNew; + }else{ + Expr *pParent = pItem->pExpr; + assert( pParent->op==TK_COLLATE ); + while( pParent->pLeft->op==TK_COLLATE ) pParent = pParent->pLeft; + assert( pParent->pLeft==pE ); + pParent->pLeft = pNew; + } + sqlite3ExprDelete(db, pE); + pItem->u.x.iOrderByCol = (u16)iCol; } - sqlite3ExprDelete(db, pE); - pItem->u.x.iOrderByCol = (u16)iCol; pItem->done = 1; }else{ moreToDo = 1; @@ -1204,6 +1243,38 @@ int sqlite3ResolveOrderGroupBy( return 0; } +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** Walker callback for resolveRemoveWindows(). +*/ +static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + Window **pp; + for(pp=&pWalker->u.pSelect->pWin; *pp; pp=&(*pp)->pNextWin){ + if( *pp==pExpr->y.pWin ){ + *pp = (*pp)->pNextWin; + break; + } + } + } + return WRC_Continue; +} + +/* +** Remove any Window objects owned by the expression pExpr from the +** Select.pWin list of Select object pSelect. +*/ +static void resolveRemoveWindows(Select *pSelect, Expr *pExpr){ + Walker sWalker; + memset(&sWalker, 0, sizeof(Walker)); + sWalker.xExprCallback = resolveRemoveWindowsCb; + sWalker.u.pSelect = pSelect; + sqlite3WalkExpr(&sWalker, pExpr); +} +#else +# define resolveRemoveWindows(x,y) +#endif + /* ** pOrderBy is an ORDER BY or GROUP BY clause in SELECT statement pSelect. ** The Name context of the SELECT statement is pNC. zType is either @@ -1270,19 +1341,10 @@ 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( 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->y.pWin ){ - *pp = (*pp)->pNextWin; - } - } - } -#endif + /* Since this expresion is being changed into a reference + ** to an identical expression in the result set, remove all Window + ** objects belonging to the expression from the Select.pWin list. */ + resolveRemoveWindows(pSelect, pE); pItem->u.x.iOrderByCol = j+1; } } @@ -1494,6 +1556,17 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ } } + if( IN_RENAME_OBJECT ){ + Window *pWin; + for(pWin=p->pWinDefn; pWin; pWin=pWin->pNextWin){ + if( sqlite3ResolveExprListNames(&sNC, pWin->pOrderBy) + || sqlite3ResolveExprListNames(&sNC, pWin->pPartition) + ){ + return WRC_Abort; + } + } + } + /* If this is part of a compound SELECT, check that it has the right ** number of expressions in the select list. */ if( p->pNext && p->pEList->nExpr!=p->pNext->pEList->nExpr ){ @@ -1644,36 +1717,45 @@ void sqlite3ResolveSelectNames( } /* -** Resolve names in expressions that can only reference a single table: +** Resolve names in expressions that can only reference a single table +** or which cannot reference any tables at all. Examples: ** -** * CHECK constraints -** * WHERE clauses on partial indices +** (1) CHECK constraints +** (2) WHERE clauses on partial indices +** (3) Expressions in indexes on expressions +** (4) Expression arguments to VACUUM INTO. ** -** The Expr.iTable value for Expr.op==TK_COLUMN nodes of the expression -** is set to -1 and the Expr.iColumn value is set to the column number. +** In all cases except (4), the Expr.iTable value for Expr.op==TK_COLUMN +** nodes of the expression is set to -1 and the Expr.iColumn value is +** set to the column number. In case (4), TK_COLUMN nodes cause an error. ** ** Any errors cause an error message to be set in pParse. */ -void sqlite3ResolveSelfReference( +int sqlite3ResolveSelfReference( Parse *pParse, /* Parsing context */ - Table *pTab, /* The table being referenced */ - int type, /* NC_IsCheck or NC_PartIdx or NC_IdxExpr */ + Table *pTab, /* The table being referenced, or NULL */ + int type, /* NC_IsCheck or NC_PartIdx or NC_IdxExpr, or 0 */ Expr *pExpr, /* Expression to resolve. May be NULL. */ ExprList *pList /* Expression list to resolve. May be NULL. */ ){ SrcList sSrc; /* Fake SrcList for pParse->pNewTable */ NameContext sNC; /* Name context for pParse->pNewTable */ + int rc; - assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr ); + assert( type==0 || pTab!=0 ); + assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr || pTab==0 ); memset(&sNC, 0, sizeof(sNC)); memset(&sSrc, 0, sizeof(sSrc)); - sSrc.nSrc = 1; - sSrc.a[0].zName = pTab->zName; - sSrc.a[0].pTab = pTab; - sSrc.a[0].iCursor = -1; + if( pTab ){ + sSrc.nSrc = 1; + sSrc.a[0].zName = pTab->zName; + sSrc.a[0].pTab = pTab; + sSrc.a[0].iCursor = -1; + } sNC.pParse = pParse; sNC.pSrcList = &sSrc; sNC.ncFlags = type; - if( sqlite3ResolveExprNames(&sNC, pExpr) ) return; - if( pList ) sqlite3ResolveExprListNames(&sNC, pList); + if( (rc = sqlite3ResolveExprNames(&sNC, pExpr))!=SQLITE_OK ) return rc; + if( pList ) rc = sqlite3ResolveExprListNames(&sNC, pList); + return rc; } diff --git a/sqlite/src/select.c b/sqlite/src/select.c index c60ff270..f30cea50 100644 --- a/sqlite/src/select.c +++ b/sqlite/src/select.c @@ -631,7 +631,7 @@ static void pushOntoSorter( } assert( pSelect->iOffset==0 || pSelect->iLimit!=0 ); iLimit = pSelect->iOffset ? pSelect->iOffset+1 : pSelect->iLimit; - pSort->labelDone = sqlite3VdbeMakeLabel(v); + pSort->labelDone = sqlite3VdbeMakeLabel(pParse); sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, regOrigData, SQLITE_ECEL_DUP | (regOrigData? SQLITE_ECEL_REF : 0)); if( bSeq ){ @@ -670,7 +670,7 @@ static void pushOntoSorter( pKI->nAllField-pKI->nKeyField-1); addrJmp = sqlite3VdbeCurrentAddr(v); sqlite3VdbeAddOp3(v, OP_Jump, addrJmp+1, 0, addrJmp+1); VdbeCoverage(v); - pSort->labelBkOut = sqlite3VdbeMakeLabel(v); + pSort->labelBkOut = sqlite3VdbeMakeLabel(pParse); pSort->regReturn = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut); sqlite3VdbeAddOp1(v, OP_ResetSorter, pSort->iECursor); @@ -1417,7 +1417,7 @@ static void generateSortTail( ){ Vdbe *v = pParse->pVdbe; /* The prepared statement */ int addrBreak = pSort->labelDone; /* Jump here to exit loop */ - int addrContinue = sqlite3VdbeMakeLabel(v); /* Jump here for next cycle */ + int addrContinue = sqlite3VdbeMakeLabel(pParse);/* Jump here for next cycle */ int addr; /* Top of output loop. Jump for Next. */ int addrOnce = 0; int iTab; @@ -1457,7 +1457,12 @@ static void generateSortTail( regRow = pDest->iSdst; }else{ regRowid = sqlite3GetTempReg(pParse); - regRow = sqlite3GetTempRange(pParse, nColumn); + if( eDest==SRT_EphemTab || eDest==SRT_Table ){ + regRow = sqlite3GetTempReg(pParse); + nColumn = 0; + }else{ + regRow = sqlite3GetTempRange(pParse, nColumn); + } } nKey = pOrderBy->nExpr - pSort->nOBSat; if( pSort->sortFlags & SORTFLAG_UseSorter ){ @@ -1537,6 +1542,7 @@ static void generateSortTail( switch( eDest ){ case SRT_Table: case SRT_EphemTab: { + sqlite3VdbeAddOp3(v, OP_Column, iSortTab, nKey+bSeq, regRow); sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, regRowid); sqlite3VdbeAddOp3(v, OP_Insert, iParm, regRow, regRowid); sqlite3VdbeChangeP5(v, OPFLAG_APPEND); @@ -2077,15 +2083,15 @@ void sqlite3SelectAddColumnTypeAndCollation( Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){ Table *pTab; sqlite3 *db = pParse->db; - int savedFlags; + u64 savedFlags; savedFlags = db->flags; - db->flags &= ~SQLITE_FullColNames; + db->flags &= ~(u64)SQLITE_FullColNames; db->flags |= SQLITE_ShortColNames; sqlite3SelectPrep(pParse, pSelect, 0); + db->flags = savedFlags; if( pParse->nErr ) return 0; while( pSelect->pPrior ) pSelect = pSelect->pPrior; - db->flags = savedFlags; pTab = sqlite3DbMallocZero(db, sizeof(Table) ); if( pTab==0 ){ return 0; @@ -2329,7 +2335,7 @@ static void generateWithRecursiveQuery( if( sqlite3AuthCheck(pParse, SQLITE_RECURSIVE, 0, 0, 0) ) return; /* Process the LIMIT and OFFSET clauses, if they exist */ - addrBreak = sqlite3VdbeMakeLabel(v); + addrBreak = sqlite3VdbeMakeLabel(pParse); p->nSelectRow = 320; /* 4 billion rows */ computeLimitRegisters(pParse, p, addrBreak); pLimit = p->pLimit; @@ -2399,7 +2405,7 @@ static void generateWithRecursiveQuery( sqlite3VdbeAddOp1(v, OP_Delete, iQueue); /* Output the single row in Current */ - addrCont = sqlite3VdbeMakeLabel(v); + addrCont = sqlite3VdbeMakeLabel(pParse); codeOffset(v, regOffset, addrCont); selectInnerLoop(pParse, p, iCurrent, 0, 0, pDest, addrCont, addrBreak); @@ -2707,8 +2713,8 @@ static int multiSelect( if( dest.eDest!=priorOp ){ int iCont, iBreak, iStart; assert( p->pEList ); - iBreak = sqlite3VdbeMakeLabel(v); - iCont = sqlite3VdbeMakeLabel(v); + iBreak = sqlite3VdbeMakeLabel(pParse); + iCont = sqlite3VdbeMakeLabel(pParse); computeLimitRegisters(pParse, p, iBreak); sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v); iStart = sqlite3VdbeCurrentAddr(v); @@ -2776,8 +2782,8 @@ static int multiSelect( ** tables. */ assert( p->pEList ); - iBreak = sqlite3VdbeMakeLabel(v); - iCont = sqlite3VdbeMakeLabel(v); + iBreak = sqlite3VdbeMakeLabel(pParse); + iCont = sqlite3VdbeMakeLabel(pParse); computeLimitRegisters(pParse, p, iBreak); sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v); r1 = sqlite3GetTempReg(pParse); @@ -2907,7 +2913,7 @@ static int generateOutputSubroutine( int addr; addr = sqlite3VdbeCurrentAddr(v); - iContinue = sqlite3VdbeMakeLabel(v); + iContinue = sqlite3VdbeMakeLabel(pParse); /* Suppress duplicates for UNION, EXCEPT, and INTERSECT */ @@ -3144,8 +3150,8 @@ static int multiSelectOrderBy( db = pParse->db; v = pParse->pVdbe; assert( v!=0 ); /* Already thrown the error if VDBE alloc failed */ - labelEnd = sqlite3VdbeMakeLabel(v); - labelCmpr = sqlite3VdbeMakeLabel(v); + labelEnd = sqlite3VdbeMakeLabel(pParse); + labelCmpr = sqlite3VdbeMakeLabel(pParse); /* Patch up the ORDER BY clause @@ -3461,6 +3467,7 @@ static Expr *substExpr( ifNullRow.iTable = pSubst->iNewTable; pCopy = &ifNullRow; } + testcase( ExprHasProperty(pCopy, EP_Subquery) ); pNew = sqlite3ExprDup(db, pCopy, 0); if( pNew && pSubst->isLeftJoin ){ ExprSetProperty(pNew, EP_CanBeNull); @@ -3953,11 +3960,9 @@ static int flattenSubquery( jointype = pSubitem->fg.jointype; }else{ assert( pParent!=p ); /* 2nd and subsequent times through the loop */ - pSrc = pParent->pSrc = sqlite3SrcListAppend(db, 0, 0, 0); - if( pSrc==0 ){ - assert( db->mallocFailed ); - break; - } + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); + if( pSrc==0 ) break; + pParent->pSrc = pSrc; } /* The subquery uses a single slot of the FROM clause of the outer @@ -3976,10 +3981,9 @@ static int flattenSubquery( ** for the two elements in the FROM clause of the subquery. */ if( nSubSrc>1 ){ - pParent->pSrc = pSrc = sqlite3SrcListEnlarge(db, pSrc, nSubSrc-1,iFrom+1); - if( db->mallocFailed ){ - break; - } + pSrc = sqlite3SrcListEnlarge(pParse, pSrc, nSubSrc-1,iFrom+1); + if( pSrc==0 ) break; + pParent->pSrc = pSrc; } /* Transfer the FROM clause terms from the subquery into the @@ -4025,7 +4029,8 @@ static int flattenSubquery( pParent->pOrderBy = pOrderBy; pSub->pOrderBy = 0; } - pWhere = sqlite3ExprDup(db, pSub->pWhere, 0); + pWhere = pSub->pWhere; + pSub->pWhere = 0; if( isLeftJoin>0 ){ setJoinExpr(pWhere, iNewParent); } @@ -5328,7 +5333,7 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ regAgg = 0; } if( pF->iDistinct>=0 ){ - addrNext = sqlite3VdbeMakeLabel(v); + addrNext = sqlite3VdbeMakeLabel(pParse); testcase( nArg==0 ); /* Error condition */ testcase( nArg>1 ); /* Also an error */ codeDistinct(pParse, pF->iDistinct, addrNext, 1, regAgg); @@ -5464,14 +5469,19 @@ static struct SrcList_item *isSelfJoinView( ){ struct SrcList_item *pItem; for(pItem = pTabList->a; pItempSelect==0 ) continue; if( pItem->fg.viaCoroutine ) continue; if( pItem->zName==0 ) continue; if( sqlite3_stricmp(pItem->zDatabase, pThis->zDatabase)!=0 ) continue; if( sqlite3_stricmp(pItem->zName, pThis->zName)!=0 ) continue; - if( sqlite3ExprCompare(0, - pThis->pSelect->pWhere, pItem->pSelect->pWhere, -1) - ){ + pS1 = pItem->pSelect; + if( pThis->pSelect->selId!=pS1->selId ){ + /* The query flattener left two different CTE tables with identical + ** names in the same FROM clause. */ + continue; + } + if( sqlite3ExprCompare(0, pThis->pSelect->pWhere, pS1->pWhere, -1) ){ /* The view was modified by some other optimization such as ** pushDownWhereTerms() */ continue; @@ -5733,6 +5743,7 @@ int sqlite3Select( } if( flattenSubquery(pParse, p, i, isAgg) ){ + if( pParse->nErr ) goto select_end; /* This subquery can be absorbed into its parent. */ i = -1; } @@ -5828,22 +5839,12 @@ int sqlite3Select( pSub = pItem->pSelect; if( pSub==0 ) continue; - /* Sometimes the code for a subquery will be generated more than - ** once, if the subquery is part of the WHERE clause in a LEFT JOIN, - ** for example. In that case, do not regenerate the code to manifest - ** a view or the co-routine to implement a view. The first instance - ** is sufficient, though the subroutine to manifest the view does need - ** to be invoked again. */ - if( pItem->addrFillSub ){ - if( pItem->fg.viaCoroutine==0 ){ - /* The subroutine that manifests the view might be a one-time routine, - ** or it might need to be rerun on each iteration because it - ** encodes a correlated subquery. */ - testcase( sqlite3VdbeGetOp(v, pItem->addrFillSub)->opcode==OP_Once ); - sqlite3VdbeAddOp2(v, OP_Gosub, pItem->regReturn, pItem->addrFillSub); - } - continue; - } + /* The code for a subquery should only be generated once, though it is + ** technically harmless for it to be generated multiple times. The + ** following assert() will detect if something changes to cause + ** the same subquery to be coded multiple times, as a signal to the + ** developers to try to optimize the situation. */ + assert( pItem->addrFillSub==0 ); /* Increment Parse.nHeight by the height of the largest expression ** tree referred to by this, the parent select. The child select @@ -6031,7 +6032,7 @@ int sqlite3Select( /* Set the limiter. */ - iEnd = sqlite3VdbeMakeLabel(v); + iEnd = sqlite3VdbeMakeLabel(pParse); if( (p->selFlags & SF_FixedLimit)==0 ){ p->nSelectRow = 320; /* 4 billion rows */ } @@ -6098,9 +6099,9 @@ int sqlite3Select( assert( p->pEList==pEList ); #ifndef SQLITE_OMIT_WINDOWFUNC if( pWin ){ - int addrGosub = sqlite3VdbeMakeLabel(v); - int iCont = sqlite3VdbeMakeLabel(v); - int iBreak = sqlite3VdbeMakeLabel(v); + int addrGosub = sqlite3VdbeMakeLabel(pParse); + int iCont = sqlite3VdbeMakeLabel(pParse); + int iBreak = sqlite3VdbeMakeLabel(pParse); int regGosub = ++pParse->nMem; sqlite3WindowCodeStep(pParse, p, pWInfo, regGosub, addrGosub); @@ -6175,7 +6176,7 @@ int sqlite3Select( } /* Create a label to jump to when we want to abort the query */ - addrEnd = sqlite3VdbeMakeLabel(v); + addrEnd = sqlite3VdbeMakeLabel(pParse); /* Convert TK_COLUMN nodes into TK_AGG_COLUMN and make entries in ** sAggInfo for all TK_AGG_FUNCTION nodes in expressions of the @@ -6264,9 +6265,9 @@ int sqlite3Select( iUseFlag = ++pParse->nMem; iAbortFlag = ++pParse->nMem; regOutputRow = ++pParse->nMem; - addrOutputRow = sqlite3VdbeMakeLabel(v); + addrOutputRow = sqlite3VdbeMakeLabel(pParse); regReset = ++pParse->nMem; - addrReset = sqlite3VdbeMakeLabel(v); + addrReset = sqlite3VdbeMakeLabel(pParse); iAMem = pParse->nMem + 1; pParse->nMem += pGroupBy->nExpr; iBMem = pParse->nMem + 1; diff --git a/sqlite/src/shell.c.in b/sqlite/src/shell.c.in index ad5a1498..c7d94dbe 100644 --- a/sqlite/src/shell.c.in +++ b/sqlite/src/shell.c.in @@ -138,6 +138,9 @@ typedef unsigned char u8; # ifndef unlink # define unlink _unlink # endif +# ifndef strdup +# define strdup _strdup +# endif # undef popen # define popen _popen # undef pclose @@ -937,6 +940,7 @@ INCLUDE ../ext/misc/shathree.c INCLUDE ../ext/misc/fileio.c INCLUDE ../ext/misc/completion.c INCLUDE ../ext/misc/appendvfs.c +INCLUDE ../ext/misc/memtrace.c #ifdef SQLITE_HAVE_ZLIB INCLUDE ../ext/misc/zipfile.c INCLUDE ../ext/misc/sqlar.c @@ -1002,14 +1006,18 @@ struct ShellState { u8 autoExplain; /* Automatically turn on .explain mode */ u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */ u8 autoEQPtest; /* autoEQP is in test mode */ + u8 autoEQPtrace; /* autoEQP is in trace mode */ u8 statsOn; /* True to display memory stats before each finalize */ u8 scanstatsOn; /* True to display scan stats before each finalize */ u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */ u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */ u8 nEqpLevel; /* Depth of the EQP output graph */ + u8 eTraceType; /* SHELL_TRACE_* value for type of trace */ unsigned mEqpLines; /* Mask of veritical lines in the EQP output graph */ int outCount; /* Revert to stdout when reaching zero */ int cnt; /* Number of records displayed so far */ + int lineno; /* Line number of last line read from in */ + FILE *in; /* Read commands from this stream */ FILE *out; /* Write results here */ FILE *traceOut; /* Output for sqlite3_trace() */ int nErr; /* Number of errors seen */ @@ -1020,7 +1028,11 @@ struct ShellState { int writableSchema; /* True if PRAGMA writable_schema=ON */ int showHeader; /* True to show column names in List or Column mode */ int nCheck; /* Number of ".check" commands run */ + unsigned nProgress; /* Number of progress callbacks encountered */ + unsigned mxProgress; /* Maximum progress callbacks before failing */ + unsigned flgProgress; /* Flags for the progress callback */ unsigned shellFlgs; /* Various flags */ + sqlite3_int64 szMax; /* --maxsize argument to .open */ char *zDestTable; /* Name of destination table when MODE_Insert */ char *zTempFile; /* Temporary file that might need deleting */ char zTestcase[30]; /* Name of current test case */ @@ -1065,6 +1077,20 @@ struct ShellState { #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() */ +#define SHELL_OPEN_HEXDB 6 /* Use "dbtotxt" output as data source */ + +/* Allowed values for ShellState.eTraceType +*/ +#define SHELL_TRACE_PLAIN 0 /* Show input SQL text */ +#define SHELL_TRACE_EXPANDED 1 /* Show expanded SQL text */ +#define SHELL_TRACE_NORMALIZED 2 /* Show normalized SQL text */ + +/* Bits in the ShellState.flgProgress variable */ +#define SHELL_PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */ +#define SHELL_PROGRESS_RESET 0x02 /* Reset the count when the progres + ** callback limit is reached, and for each + ** top-level SQL statement */ +#define SHELL_PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */ /* ** These are the allowed shellFlgs values @@ -1766,6 +1792,26 @@ static void eqp_render(ShellState *p){ } } +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK +/* +** Progress handler callback. +*/ +static int progress_handler(void *pClientData) { + ShellState *p = (ShellState*)pClientData; + p->nProgress++; + if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){ + raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress); + if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; + if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0; + return 1; + } + if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){ + raw_printf(p->out, "Progress %u\n", p->nProgress); + } + return 0; +} +#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ + /* ** This is the callback routine that the shell ** invokes for each row of a query result. @@ -3370,6 +3416,7 @@ static const char *(azHelp[]) = { #endif ".backup ?DB? FILE Backup DB (default \"main\") to FILE", " --append Use the appendvfs", + " --async Write to FILE without a journal and without fsync()", ".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", @@ -3385,7 +3432,13 @@ static const char *(azHelp[]) = { " --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", + ".eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN", + " Other Modes:", +#ifdef SQLITE_DEBUG + " test Show raw EXPLAIN QUERY PLAN output", + " trace Like \"full\" but also enable \"PRAGMA vdbe_trace\"", +#endif + " trigger Like \"full\" but also show trigger bytecode", ".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", @@ -3436,6 +3489,8 @@ static const char *(azHelp[]) = { " --append Use appendvfs to append database to the end of FILE", #ifdef SQLITE_ENABLE_DESERIALIZE " --deserialize Load into memory useing sqlite3_deserialize()", + " --hexdb Load the output of \"dbtotxt\" as an in-memory database", + " --maxsize N Maximum size for --hexdb or --deserialized database", #endif " --new Initialize FILE to an empty database", " --readonly Open FILE readonly", @@ -3443,6 +3498,13 @@ static const char *(azHelp[]) = { ".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", +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + ".progress N Invoke progress handler after every N opcodes", + " --limit N Interrupt after N progress callbacks", + " --once Do no more than one progress interrupt", + " --quiet|-q No output except at interrupts", + " --reset Reset the count for each input and interrupt", +#endif ".prompt MAIN CONTINUE Replace the standard prompts", ".quit Exit this program", ".read FILE Read input from FILE", @@ -3492,7 +3554,22 @@ static const char *(azHelp[]) = { ".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", +#ifndef SQLITE_OMIT_TRACE + ".trace ?OPTIONS? Output each SQL statement as it is run", + " FILE Send output to FILE", + " stdout Send output to stdout", + " stderr Send output to stderr", + " off Disable tracing", + " --expanded Expand query parameters", +#ifdef SQLITE_ENABLE_NORMALIZE + " --normalized Normal the SQL statements", +#endif + " --plain Show SQL as it is input", + " --stmt Trace statement execution (SQLITE_TRACE_STMT)", + " --profile Profile statements (SQLITE_TRACE_PROFILE)", + " --row Trace each row (SQLITE_TRACE_ROW)", + " --close Trace connection close (SQLITE_TRACE_CLOSE)", +#endif /* SQLITE_OMIT_TRACE */ ".vfsinfo ?AUX? Information about the top-level VFS", ".vfslist List all available VFSes", ".vfsname ?AUX? Print the name of the VFS stack", @@ -3570,7 +3647,7 @@ static int showHelp(FILE *out, const char *zPattern){ } /* Forward reference */ -static int process_input(ShellState *p, FILE *in); +static int process_input(ShellState *p); /* ** Read the content of file zName into memory obtained from sqlite3_malloc64() @@ -3700,6 +3777,94 @@ int deduceDatabaseType(const char *zName, int dfltZip){ return rc; } +#ifdef SQLITE_ENABLE_DESERIALIZE +/* +** Reconstruct an in-memory database using the output from the "dbtotxt" +** program. Read content from the file in p->zDbFilename. If p->zDbFilename +** is 0, then read from standard input. +*/ +static unsigned char *readHexDb(ShellState *p, int *pnData){ + unsigned char *a = 0; + int nLine; + int n = 0; + int pgsz = 0; + int iOffset = 0; + int j, k; + int rc; + FILE *in; + unsigned char x[16]; + char zLine[1000]; + if( p->zDbFilename ){ + in = fopen(p->zDbFilename, "r"); + if( in==0 ){ + utf8_printf(stderr, "cannot open \"%s\" for reading\n", p->zDbFilename); + return 0; + } + nLine = 0; + }else{ + in = p->in; + nLine = p->lineno; + } + *pnData = 0; + nLine++; + if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error; + rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz); + if( rc!=2 ) goto readHexDb_error; + if( n<=0 ) goto readHexDb_error; + a = sqlite3_malloc( n ); + if( a==0 ){ + utf8_printf(stderr, "Out of memory!\n"); + goto readHexDb_error; + } + memset(a, 0, n); + if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){ + utf8_printf(stderr, "invalid pagesize\n"); + goto readHexDb_error; + } + for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){ + rc = sscanf(zLine, "| page %d offset %d", &j, &k); + if( rc==2 ){ + iOffset = k; + continue; + } + if( strncmp(zLine, "| end ", 6)==0 ){ + break; + } + rc = sscanf(zLine,"| %d: %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx" + " %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx", + &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7], + &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]); + if( rc==17 ){ + k = iOffset+j; + if( k+16<=n ){ + memcpy(a+k, x, 16); + } + } + } + *pnData = n; + if( in!=p->in ){ + fclose(in); + }else{ + p->lineno = nLine; + } + return a; + +readHexDb_error: + if( in!=stdin ){ + fclose(in); + }else{ + while( fgets(zLine, sizeof(zLine), p->in)!=0 ){ + nLine++; + if(strncmp(zLine, "| end ", 6)==0 ) break; + } + p->lineno = nLine; + } + sqlite3_free(a); + utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine); + return 0; +} +#endif /* SQLITE_ENABLE_DESERIALIZE */ + /* Flags for open_db(). ** ** The default behavior of open_db() is to exit(1) if the database fails to @@ -3733,6 +3898,7 @@ static void open_db(ShellState *p, int openFlags){ SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, "apndvfs"); break; } + case SHELL_OPEN_HEXDB: case SHELL_OPEN_DESERIALIZE: { sqlite3_open(0, &p->db); break; @@ -3755,7 +3921,10 @@ static void open_db(ShellState *p, int openFlags){ if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n", p->zDbFilename, sqlite3_errmsg(p->db)); - if( openFlags & OPEN_DB_KEEPALIVE ) return; + if( openFlags & OPEN_DB_KEEPALIVE ){ + sqlite3_open(":memory:", &p->db); + return; + } exit(1); } #ifndef SQLITE_OMIT_LOAD_EXTENSION @@ -3787,15 +3956,29 @@ static void open_db(ShellState *p, int openFlags){ sqlite3_free(zSql); } #ifdef SQLITE_ENABLE_DESERIALIZE - else if( p->openMode==SHELL_OPEN_DESERIALIZE ){ + else + if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){ + int rc; int nData = 0; - unsigned char *aData = (unsigned char*)readFile(p->zDbFilename, &nData); - int rc = sqlite3_deserialize(p->db, "main", aData, nData, nData, + unsigned char *aData; + if( p->openMode==SHELL_OPEN_DESERIALIZE ){ + aData = (unsigned char*)readFile(p->zDbFilename, &nData); + }else{ + aData = readHexDb(p, &nData); + if( aData==0 ){ + utf8_printf(stderr, "Error in hexdb input\n"); + return; + } + } + 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); } + if( p->szMax>0 ){ + sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax); + } } #endif } @@ -3999,24 +4182,60 @@ static FILE *output_file_open(const char *zFile, int bTextMode){ return f; } -#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT) +#ifndef SQLITE_OMIT_TRACE /* ** A routine for handling output from sqlite3_trace(). */ static int sql_trace_callback( - unsigned mType, - void *pArg, - void *pP, - void *pX + unsigned mType, /* The trace type */ + void *pArg, /* The ShellState pointer */ + void *pP, /* Usually a pointer to sqlite_stmt */ + void *pX /* Auxiliary output */ ){ - FILE *f = (FILE*)pArg; - UNUSED_PARAMETER(mType); - UNUSED_PARAMETER(pP); - if( f ){ - const char *z = (const char*)pX; - int i = strlen30(z); - while( i>0 && z[i-1]==';' ){ i--; } - utf8_printf(f, "%.*s;\n", i, z); + ShellState *p = (ShellState*)pArg; + sqlite3_stmt *pStmt; + const char *zSql; + int nSql; + if( p->traceOut==0 ) return 0; + if( mType==SQLITE_TRACE_CLOSE ){ + utf8_printf(p->traceOut, "-- closing database connection\n"); + return 0; + } + if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){ + zSql = (const char*)pX; + }else{ + pStmt = (sqlite3_stmt*)pP; + switch( p->eTraceType ){ + case SHELL_TRACE_EXPANDED: { + zSql = sqlite3_expanded_sql(pStmt); + break; + } +#ifdef SQLITE_ENABLE_NORMALIZE + case SHELL_TRACE_NORMALIZED: { + zSql = sqlite3_normalized_sql(pStmt); + break; + } +#endif + default: { + zSql = sqlite3_sql(pStmt); + break; + } + } + } + if( zSql==0 ) return 0; + nSql = strlen30(zSql); + while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; } + switch( mType ){ + case SQLITE_TRACE_ROW: + case SQLITE_TRACE_STMT: { + utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql); + break; + } + case SQLITE_TRACE_PROFILE: { + sqlite3_int64 nNanosec = *(sqlite3_int64*)pX; + utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec); + break; + } } return 0; } @@ -5583,7 +5802,7 @@ static int arCreateOrUpdateCommand( } end_ar_transaction: if( rc!=SQLITE_OK ){ - arExecSql(pAr, "ROLLBACK TO ar; RELEASE ar;"); + sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); }else{ rc = arExecSql(pAr, "RELEASE ar;"); if( pAr->bZip && pAr->zFile ){ @@ -5782,6 +6001,7 @@ static int do_meta_command(char *zLine, ShellState *p){ sqlite3 *pDest; sqlite3_backup *pBackup; int j; + int bAsync = 0; const char *zVfs = 0; for(j=1; jdb, zDb); if( pBackup==0 ){ @@ -6081,18 +6308,30 @@ static int do_meta_command(char *zLine, ShellState *p){ if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){ if( nArg==2 ){ p->autoEQPtest = 0; + if( p->autoEQPtrace ){ + if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0); + p->autoEQPtrace = 0; + } if( strcmp(azArg[1],"full")==0 ){ p->autoEQP = AUTOEQP_full; }else if( strcmp(azArg[1],"trigger")==0 ){ p->autoEQP = AUTOEQP_trigger; +#ifdef SQLITE_DEBUG }else if( strcmp(azArg[1],"test")==0 ){ p->autoEQP = AUTOEQP_on; p->autoEQPtest = 1; + }else if( strcmp(azArg[1],"trace")==0 ){ + p->autoEQP = AUTOEQP_full; + p->autoEQPtrace = 1; + open_db(p, 0); + sqlite3_exec(p->db, "SELECT name FROM sqlite_master LIMIT 1", 0, 0, 0); + sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0); +#endif }else{ p->autoEQP = (u8)booleanValue(azArg[1]); } }else{ - raw_printf(stderr, "Usage: .eqp off|on|trigger|full\n"); + raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n"); rc = 1; } }else @@ -6666,6 +6905,7 @@ static int do_meta_command(char *zLine, ShellState *p){ sqlite3_free(p->zFreeOnClose); p->zFreeOnClose = 0; p->openMode = SHELL_OPEN_UNSPEC; + p->szMax = 0; /* Check for command-line arguments */ for(iName=1; iNameopenMode = SHELL_OPEN_DESERIALIZE; -#endif + }else if( optionMatch(z, "hexdb") ){ + p->openMode = SHELL_OPEN_HEXDB; + }else if( optionMatch(z, "maxsize") && iName+1szMax = integerValue(azArg[++iName]); +#endif /* SQLITE_ENABLE_DESERIALIZE */ }else if( z[0]=='-' ){ utf8_printf(stderr, "unknown option: %s\n", z); rc = 1; @@ -6691,7 +6935,7 @@ static int do_meta_command(char *zLine, ShellState *p){ } /* If a filename is specified, try to open it first */ zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0; - if( zNewFilename ){ + if( zNewFilename || p->openMode==SHELL_OPEN_HEXDB ){ if( newFlag ) shellDeleteFile(zNewFilename); p->zDbFilename = zNewFilename; open_db(p, OPEN_DB_KEEPALIVE); @@ -6793,6 +7037,52 @@ static int do_meta_command(char *zLine, ShellState *p){ raw_printf(p->out, "\n"); }else +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){ + int i; + int nn = 0; + p->flgProgress = 0; + p->mxProgress = 0; + p->nProgress = 0; + for(i=1; iflgProgress |= SHELL_PROGRESS_QUIET; + continue; + } + if( strcmp(z,"reset")==0 ){ + p->flgProgress |= SHELL_PROGRESS_RESET; + continue; + } + if( strcmp(z,"once")==0 ){ + p->flgProgress |= SHELL_PROGRESS_ONCE; + continue; + } + if( strcmp(z,"limit")==0 ){ + if( i+1>=nArg ){ + utf8_printf(stderr, "Error: missing argument on --limit\n"); + rc = 1; + goto meta_command_exit; + }else{ + p->mxProgress = (int)integerValue(azArg[++i]); + } + continue; + } + utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]); + rc = 1; + goto meta_command_exit; + }else{ + nn = (int)integerValue(z); + } + } + open_db(p, 0); + sqlite3_progress_handler(p->db, nn, progress_handler, p); + }else +#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ + if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){ if( nArg >= 2) { strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); @@ -6807,20 +7097,23 @@ static int do_meta_command(char *zLine, ShellState *p){ }else if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){ - FILE *alt; + FILE *inSaved = p->in; + int savedLineno = p->lineno; if( nArg!=2 ){ raw_printf(stderr, "Usage: .read FILE\n"); rc = 1; goto meta_command_exit; } - alt = fopen(azArg[1], "rb"); - if( alt==0 ){ + p->in = fopen(azArg[1], "rb"); + if( p->in==0 ){ utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); rc = 1; }else{ - rc = process_input(p, alt); - fclose(alt); + rc = process_input(p); + fclose(p->in); } + p->in = inSaved; + p->lineno = savedLineno; }else if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){ @@ -7838,23 +8131,55 @@ static int do_meta_command(char *zLine, ShellState *p){ } }else +#ifndef SQLITE_OMIT_TRACE if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){ + int mType = 0; + int jj; open_db(p, 0); - if( nArg!=2 ){ - raw_printf(stderr, "Usage: .trace FILE|off\n"); - rc = 1; - goto meta_command_exit; + for(jj=1; jjeTraceType = SHELL_TRACE_EXPANDED; + } +#ifdef SQLITE_ENABLE_NORMALIZE + else if( optionMatch(z, "normalized") ){ + p->eTraceType = SHELL_TRACE_NORMALIZED; + } +#endif + else if( optionMatch(z, "plain") ){ + p->eTraceType = SHELL_TRACE_PLAIN; + } + else if( optionMatch(z, "profile") ){ + mType |= SQLITE_TRACE_PROFILE; + } + else if( optionMatch(z, "row") ){ + mType |= SQLITE_TRACE_ROW; + } + else if( optionMatch(z, "stmt") ){ + mType |= SQLITE_TRACE_STMT; + } + else if( optionMatch(z, "close") ){ + mType |= SQLITE_TRACE_CLOSE; + } + else { + raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z); + rc = 1; + goto meta_command_exit; + } + }else{ + output_file_close(p->traceOut); + p->traceOut = output_file_open(azArg[1], 0); + } } - output_file_close(p->traceOut); - p->traceOut = output_file_open(azArg[1], 0); -#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT) if( p->traceOut==0 ){ sqlite3_trace_v2(p->db, 0, 0, 0); }else{ - sqlite3_trace_v2(p->db, SQLITE_TRACE_STMT, sql_trace_callback,p->traceOut); + if( mType==0 ) mType = SQLITE_TRACE_STMT; + sqlite3_trace_v2(p->db, mType, sql_trace_callback, p); } -#endif }else +#endif /* !defined(SQLITE_OMIT_TRACE) */ #if SQLITE_USER_AUTHENTICATION if( c=='u' && strncmp(azArg[0], "user", n)==0 ){ @@ -8093,6 +8418,7 @@ static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ open_db(p, 0); if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql); + if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; BEGIN_TIMER; rc = shell_exec(p, zSql, &zErrMsg); END_TIMER; @@ -8129,7 +8455,7 @@ static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ ** ** Return the number of errors. */ -static int process_input(ShellState *p, FILE *in){ +static int process_input(ShellState *p){ char *zLine = 0; /* A single input line */ char *zSql = 0; /* Accumulated SQL text */ int nLine; /* Length of current line */ @@ -8138,22 +8464,22 @@ static int process_input(ShellState *p, FILE *in){ int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */ int rc; /* Error code */ int errCnt = 0; /* Number of errors seen */ - int lineno = 0; /* Current line number */ int startline = 0; /* Line number for start of current input */ - while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){ + p->lineno = 0; + while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){ fflush(p->out); - zLine = one_input_line(in, zLine, nSql>0); + zLine = one_input_line(p->in, zLine, nSql>0); if( zLine==0 ){ /* End of input */ - if( in==0 && stdin_is_interactive ) printf("\n"); + if( p->in==0 && stdin_is_interactive ) printf("\n"); break; } if( seenInterrupt ){ - if( in!=0 ) break; + if( p->in!=0 ) break; seenInterrupt = 0; } - lineno++; + p->lineno++; if( nSql==0 && _all_whitespace(zLine) ){ if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); continue; @@ -8185,7 +8511,7 @@ static int process_input(ShellState *p, FILE *in){ for(i=0; zLine[i] && IsSpace(zLine[i]); i++){} assert( nAlloc>0 && zSql!=0 ); memcpy(zSql, zLine+i, nLine+1-i); - startline = lineno; + startline = p->lineno; nSql = nLine-i; }else{ zSql[nSql++] = '\n'; @@ -8194,7 +8520,7 @@ static int process_input(ShellState *p, FILE *in){ } if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) && sqlite3_complete(zSql) ){ - errCnt += runOneSqlLine(p, zSql, in, startline); + errCnt += runOneSqlLine(p, zSql, p->in, startline); nSql = 0; if( p->outCount ){ output_reset(p); @@ -8208,7 +8534,7 @@ static int process_input(ShellState *p, FILE *in){ } } if( nSql && !_all_whitespace(zSql) ){ - errCnt += runOneSqlLine(p, zSql, in, startline); + errCnt += runOneSqlLine(p, zSql, p->in, startline); } free(zSql); free(zLine); @@ -8297,7 +8623,8 @@ static void process_sqliterc( char *home_dir = NULL; const char *sqliterc = sqliterc_override; char *zBuf = 0; - FILE *in = NULL; + FILE *inSaved = p->in; + int savedLineno = p->lineno; if (sqliterc == NULL) { home_dir = find_home_dir(0); @@ -8309,14 +8636,16 @@ static void process_sqliterc( zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir); sqliterc = zBuf; } - in = fopen(sqliterc,"rb"); - if( in ){ + p->in = fopen(sqliterc,"rb"); + if( p->in ){ if( stdin_is_interactive ){ utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc); } - process_input(p,in); - fclose(in); + process_input(p); + fclose(p->in); } + p->in = inSaved; + p->lineno = savedLineno; sqlite3_free(zBuf); } @@ -8334,6 +8663,9 @@ static const char zOptions[] = " -column set output mode to 'column'\n" " -cmd COMMAND run \"COMMAND\" before reading stdin\n" " -csv set output mode to 'csv'\n" +#if defined(SQLITE_ENABLE_DESERIALIZE) + " -deserialize open the database using sqlite3_deserialize()\n" +#endif " -echo print commands before execution\n" " -init FILENAME read/process named file\n" " -[no]header turn headers on or off\n" @@ -8346,6 +8678,10 @@ static const char zOptions[] = " -line set output mode to 'line'\n" " -list set output mode to 'list'\n" " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n" +#if defined(SQLITE_ENABLE_DESERIALIZE) + " -maxsize N maximum size for a --deserialize database\n" +#endif + " -memtrace trace all memory allocations and deallocations\n" " -mmap N default mmap size set to N\n" #ifdef SQLITE_ENABLE_MULTIPLEX " -multiplex enable the multiplexor VFS\n" @@ -8656,6 +8992,8 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ #ifdef SQLITE_ENABLE_DESERIALIZE }else if( strcmp(z,"-deserialize")==0 ){ data.openMode = SHELL_OPEN_DESERIALIZE; + }else if( strcmp(z,"-maxsize")==0 && i+1[[SQLITE_FCNTL_SIZE_LIMIT]] +** The [SQLITE_FCNTL_SIZE_LIMIT] opcode is used by in-memory VFS that +** implements [sqlite3_deserialize()] to set an upper bound on the size +** of the in-memory database. The argument is a pointer to a [sqlite3_int64]. +** If the integer pointed to is negative, then it is filled in with the +** current limit. Otherwise the limit is set to the larger of the value +** of the integer pointed to and the current database size. The integer +** pointed to is set to the new limit. +** **
  • [[SQLITE_FCNTL_CHUNK_SIZE]] ** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS ** extends and truncates the database file in chunks of a size specified @@ -1131,6 +1140,7 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 #define SQLITE_FCNTL_LOCK_TIMEOUT 34 #define SQLITE_FCNTL_DATA_VERSION 35 +#define SQLITE_FCNTL_SIZE_LIMIT 36 /* deprecated names */ #define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE @@ -1972,6 +1982,17 @@ struct sqlite3_mem_methods { ** negative value for this option restores the default behaviour. ** This option is only available if SQLite is compiled with the ** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option. +** +** [[SQLITE_CONFIG_MEMDB_MAXSIZE]] +**
    SQLITE_CONFIG_MEMDB_MAXSIZE +**
    The SQLITE_CONFIG_MEMDB_MAXSIZE option accepts a single parameter +** [sqlite3_int64] parameter which is the default maximum size for an in-memory +** database created using [sqlite3_deserialize()]. This default maximum +** size can be adjusted up or down for individual databases using the +** [SQLITE_FCNTL_SIZE_LIMIT] [sqlite3_file_control|file-control]. If this +** configuration setting is never used, then the default maximum is determined +** by the [SQLITE_MEMDB_DEFAULT_MAXSIZE] compile-time option. If that +** compile-time option is not set, then the default maximum is 1073741824. ** */ #define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ @@ -2002,6 +2023,7 @@ struct sqlite3_mem_methods { #define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */ #define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */ #define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */ +#define SQLITE_CONFIG_MEMDB_MAXSIZE 29 /* sqlite3_int64 */ /* ** CAPI3REF: Database Connection Configuration Options @@ -2347,7 +2369,7 @@ int sqlite3_changes(sqlite3*); ** not. ^Changes to a view that are intercepted by INSTEAD OF triggers ** are not counted. ** -** This the [sqlite3_total_changes(D)] interface only reports the number +** The [sqlite3_total_changes(D)] interface only reports the number ** of rows that changed due to SQL statement run against database ** connection D. Any changes by other database connections are ignored. ** To detect changes against a database file from other database @@ -2991,9 +3013,9 @@ int sqlite3_set_authorizer( ** time is in units of nanoseconds, however the current implementation ** is only capable of millisecond resolution so the six least significant ** digits in the time are meaningless. Future versions of SQLite -** might provide greater resolution on the profiler callback. The -** sqlite3_profile() function is considered experimental and is -** subject to change in future versions of SQLite. +** might provide greater resolution on the profiler callback. Invoking +** either [sqlite3_trace()] or [sqlite3_trace_v2()] will cancel the +** profile callback. */ SQLITE_DEPRECATED void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); @@ -3407,6 +3429,8 @@ int sqlite3_open_v2( ** is not a database file pathname pointer that SQLite passed into the xOpen ** VFS method, then the behavior of this routine is undefined and probably ** undesirable. +** +** See the [URI filename] documentation for additional information. */ const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); @@ -3629,18 +3653,23 @@ int sqlite3_limit(sqlite3*, int id, int newVal); ** 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. +** [[SQLITE_PREPARE_NORMALIZE]]
    SQLITE_PREPARE_NORMALIZE
    +**
    The SQLITE_PREPARE_NORMALIZE flag is a no-op. This flag used +** to be required for any prepared statement that wanted to use the +** [sqlite3_normalized_sql()] interface. However, the +** [sqlite3_normalized_sql()] interface is now available to all +** prepared statements, regardless of whether or not they use this +** flag. +** +** [[SQLITE_PREPARE_NO_VTAB]]
    SQLITE_PREPARE_NO_VTAB
    +**
    The SQLITE_PREPARE_NO_VTAB flag causes the SQL compiler +** to return an error (error code SQLITE_ERROR) if the statement uses +** any virtual tables. ** */ #define SQLITE_PREPARE_PERSISTENT 0x01 #define SQLITE_PREPARE_NORMALIZE 0x02 +#define SQLITE_PREPARE_NO_VTAB 0x04 /* ** CAPI3REF: Compiling An SQL Statement diff --git a/sqlite/src/sqliteInt.h b/sqlite/src/sqliteInt.h index 051aa403..4940511d 100644 --- a/sqlite/src/sqliteInt.h +++ b/sqlite/src/sqliteInt.h @@ -1356,10 +1356,13 @@ void sqlite3CryptFunc(sqlite3_context*,int,sqlite3_value**); /* This is an extra SQLITE_TRACE macro that indicates "legacy" tracing ** in the style of sqlite3_trace() */ -#define SQLITE_TRACE_LEGACY 0x80 +#define SQLITE_TRACE_LEGACY 0x40 /* Use the legacy xTrace */ +#define SQLITE_TRACE_XPROFILE 0x80 /* Use the legacy xProfile */ #else -#define SQLITE_TRACE_LEGACY 0 +#define SQLITE_TRACE_LEGACY 0 +#define SQLITE_TRACE_XPROFILE 0 #endif /* SQLITE_OMIT_DEPRECATED */ +#define SQLITE_TRACE_NONLEGACY_MASK 0x0f /* Normal flags */ /* @@ -1418,8 +1421,10 @@ struct sqlite3 { void **aExtension; /* Array of shared library handles */ int (*xTrace)(u32,void*,void*,void*); /* Trace function */ void *pTraceArg; /* Argument to the trace function */ +#ifndef SQLITE_OMIT_DEPRECATED void (*xProfile)(void*,const char*,u64); /* Profiling function */ void *pProfileArg; /* Argument to profile function */ +#endif void *pCommitArg; /* Argument to xCommitCallback() */ int (*xCommitCallback)(void*); /* Invoked at every commit. */ void *pRollbackArg; /* Argument to xRollbackCallback() */ @@ -1550,6 +1555,7 @@ struct sqlite3 { #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 */ +#define SQLITE_ParserTrace HI(0x0020) /* PRAGMA parser_trace=ON */ #endif /* @@ -1952,9 +1958,6 @@ 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 */ @@ -2241,7 +2244,7 @@ struct Index { u16 nKeyCol; /* Number of columns forming the key */ u16 nColumn; /* Number of columns stored in the index */ u8 onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ - unsigned idxType:2; /* 1==UNIQUE, 2==PRIMARY KEY, 0==CREATE INDEX */ + unsigned idxType:2; /* 0:Normal 1:UNIQUE, 2:PRIMARY KEY, 3:IPK */ unsigned bUnordered:1; /* Use this index for == or IN queries only */ unsigned uniqNotNull:1; /* True if UNIQUE and NOT NULL for all columns */ unsigned isResized:1; /* True if resizeIndexObject() has been called */ @@ -2266,6 +2269,7 @@ struct Index { #define SQLITE_IDXTYPE_APPDEF 0 /* Created using CREATE INDEX */ #define SQLITE_IDXTYPE_UNIQUE 1 /* Implements a UNIQUE constraint */ #define SQLITE_IDXTYPE_PRIMARYKEY 2 /* Is the PRIMARY KEY for the table */ +#define SQLITE_IDXTYPE_IPK 3 /* INTEGER PRIMARY KEY index */ /* Return true if index X is a PRIMARY KEY index */ #define IsPrimaryKeyIndex(X) ((X)->idxType==SQLITE_IDXTYPE_PRIMARYKEY) @@ -2483,6 +2487,10 @@ struct Expr { 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 */ + struct { /* TK_IN, TK_SELECT, and TK_EXISTS */ + int iAddr; /* Subroutine entry address */ + int regReturn; /* Register used to hold return address */ + } sub; } y; }; @@ -2514,6 +2522,8 @@ struct Expr { #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 */ +#define EP_Subrtn 0x2000000 /* Uses Expr.y.sub. TK_IN, _SELECT, or _EXISTS */ +#define EP_Quoted 0x4000000 /* TK_ID was originally quoted */ /* ** The EP_Propagate mask is a set of properties that automatically propagate @@ -3057,16 +3067,17 @@ struct Parse { u8 hasCompound; /* Need to invoke convertCompoundSelectToSubquery() */ u8 okConstFactor; /* OK to factor out constants */ u8 disableLookaside; /* Number of times lookaside has been disabled */ + u8 disableVtab; /* Disable all virtual tables for this parse */ int nRangeReg; /* Size of the temporary register block */ int iRangeReg; /* First register in temporary register block */ int nErr; /* Number of errors seen */ int nTab; /* Number of previously allocated VDBE cursors */ int nMem; /* Number of memory cells used so far */ - int nOpAlloc; /* Number of slots allocated for Vdbe.aOp[] */ int szOpAlloc; /* Bytes of memory space allocated for Vdbe.aOp[] */ int iSelfTab; /* Table associated with an index on expr, or negative ** of the base register during check-constraint eval */ - int nLabel; /* Number of labels used */ + int nLabel; /* The *negative* of the number of labels used */ + int nLabelAlloc; /* Number of slots in aLabel */ int *aLabel; /* Space to hold the labels */ ExprList *pConstExpr;/* Constant expressions */ Token constraintName;/* Name of the constraint currently being parsed */ @@ -3126,7 +3137,9 @@ struct Parse { Vdbe *pReprepare; /* VM being reprepared (sqlite3Reprepare()) */ const char *zTail; /* All SQL text past the last semicolon parsed */ Table *pNewTable; /* A table being constructed by CREATE TABLE */ - Index *pNewIndex; /* An index being constructed by CREATE INDEX */ + Index *pNewIndex; /* An index being constructed by CREATE INDEX. + ** Also used to hold redundant UNIQUE constraints + ** during a RENAME COLUMN */ Trigger *pNewTrigger; /* Trigger under construct by a CREATE TRIGGER */ const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */ #ifndef SQLITE_OMIT_VIRTUALTABLE @@ -3354,6 +3367,7 @@ typedef struct { int iDb; /* 0 for main database. 1 for TEMP, 2.. for ATTACHed */ int rc; /* Result code stored here */ u32 mInitFlags; /* Flags controlling error messages */ + u32 nInitRow; /* Number of rows processed */ } InitData; /* @@ -3414,6 +3428,9 @@ struct Sqlite3Config { void (*xVdbeBranch)(void*,unsigned iSrcLine,u8 eThis,u8 eMx); /* Callback */ void *pVdbeBranchArg; /* 1st argument */ #endif +#ifdef SQLITE_ENABLE_DESERIALIZE + sqlite3_int64 mxMemdbSize; /* Default max memdb size */ +#endif #ifndef SQLITE_UNTESTABLE int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ #endif @@ -3802,6 +3819,7 @@ char *sqlite3VMPrintf(sqlite3*,const char*, va_list); void sqlite3SetString(char **, sqlite3*, const char*); void sqlite3ErrorMsg(Parse*, const char*, ...); void sqlite3Dequote(char*); +void sqlite3DequoteExpr(Expr*); void sqlite3TokenInit(Token*,char*); int sqlite3KeywordCode(const unsigned char*, int); int sqlite3RunParser(Parse*, const char*, char **); @@ -3830,6 +3848,7 @@ void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int); void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*); void sqlite3ExprListDelete(sqlite3*, ExprList*); u32 sqlite3ExprListFlags(const ExprList*); +int sqlite3IndexHasDuplicateRootPage(Index*); int sqlite3Init(sqlite3*, char**); int sqlite3InitCallback(void*, int, char**, char**); int sqlite3InitOne(sqlite3*, int, char**, u32); @@ -3863,6 +3882,11 @@ void sqlite3AddCollateType(Parse*, Token*); void sqlite3EndTable(Parse*,Token*,Token*,u8,Select*); int sqlite3ParseUri(const char*,const char*,unsigned int*, sqlite3_vfs**,char**,char **); +#ifdef SQLITE_HAS_CODEC + int sqlite3CodecQueryParameters(sqlite3*,const char*,const char*); +#else +# define sqlite3CodecQueryParameters(A,B,C) 0 +#endif Btree *sqlite3DbNameToBtree(sqlite3*,const char*); #ifdef SQLITE_UNTESTABLE @@ -3915,8 +3939,8 @@ void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int, Upsert*); void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*); IdList *sqlite3IdListAppend(Parse*, IdList*, Token*); int sqlite3IdListIndex(IdList*,const char*); -SrcList *sqlite3SrcListEnlarge(sqlite3*, SrcList*, int, int); -SrcList *sqlite3SrcListAppend(sqlite3*, SrcList*, Token*, Token*); +SrcList *sqlite3SrcListEnlarge(Parse*, SrcList*, int, int); +SrcList *sqlite3SrcListAppend(Parse*, SrcList*, Token*, Token*); SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*, Token*, Select*, Expr*, IdList*); void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *); @@ -3983,8 +4007,8 @@ Table *sqlite3LocateTableItem(Parse*,u32 flags,struct SrcList_item *); Index *sqlite3FindIndex(sqlite3*,const char*, const char*); void sqlite3UnlinkAndDeleteTable(sqlite3*,int,const char*); void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*); -void sqlite3Vacuum(Parse*,Token*); -int sqlite3RunVacuum(char**, sqlite3*, int); +void sqlite3Vacuum(Parse*,Token*,Expr*); +int sqlite3RunVacuum(char**, sqlite3*, int, sqlite3_value*); char *sqlite3NameFromToken(sqlite3*, Token*); int sqlite3ExprCompare(Parse*,Expr*, Expr*, int); int sqlite3ExprCompareSkip(Expr*, Expr*, int); @@ -4022,9 +4046,6 @@ 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); @@ -4051,9 +4072,7 @@ 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 +FuncDef *sqlite3FunctionSearch(int,const char*); void sqlite3InsertBuiltinFuncs(FuncDef*,int); FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,u8,u8); void sqlite3RegisterBuiltinFunctions(void); @@ -4258,19 +4277,17 @@ 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); +void sqlite3CodeRhsOfIN(Parse*, Expr*, int); +int sqlite3CodeSubselect(Parse*, Expr*); void sqlite3SelectPrep(Parse*, Select*, NameContext*); void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p); int sqlite3MatchSpanName(const char*, const char*, const char*, const char*); int sqlite3ResolveExprNames(NameContext*, Expr*); int sqlite3ResolveExprListNames(NameContext*, ExprList*); void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*); -void sqlite3ResolveSelfReference(Parse*,Table*,int,Expr*,ExprList*); +int sqlite3ResolveSelfReference(Parse*,Table*,int,Expr*,ExprList*); int sqlite3ResolveOrderGroupBy(Parse*, Select*, ExprList*, const char*); void sqlite3ColumnDefault(Vdbe *, Table *, int, int); void sqlite3AlterFinishAddColumn(Parse *, Token *); @@ -4419,7 +4436,7 @@ 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); +char *sqlite3Normalize(Vdbe*, const char*); #endif int sqlite3Reprepare(Vdbe*); void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*); @@ -4515,7 +4532,7 @@ const char *sqlite3JournalModename(int); #define IN_INDEX_NOOP_OK 0x0001 /* OK to return IN_INDEX_NOOP */ #define IN_INDEX_MEMBERSHIP 0x0002 /* IN operator used for membership test */ #define IN_INDEX_LOOP 0x0004 /* IN operator used as a loop */ -int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*); +int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*, int*); int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int); int sqlite3JournalSize(sqlite3_vfs *); diff --git a/sqlite/src/tclsqlite.c b/sqlite/src/tclsqlite.c index 3982ead7..eb3bedf9 100644 --- a/sqlite/src/tclsqlite.c +++ b/sqlite/src/tclsqlite.c @@ -2418,7 +2418,7 @@ static int SQLITE_TCLAPI DbObjCmd( } /* - ** $db deserialize ?DATABASE? VALUE + ** $db deserialize ?-maxsize N? ?-readonly BOOL? ?DATABASE? VALUE ** ** Reopen DATABASE (default "main") using the content in $VALUE */ @@ -2428,38 +2428,65 @@ static int SQLITE_TCLAPI DbObjCmd( (char*)0); rc = TCL_ERROR; #else - const char *zSchema; - Tcl_Obj *pValue; + const char *zSchema = 0; + Tcl_Obj *pValue = 0; unsigned char *pBA; unsigned char *pData; int len, xrc; - - if( objc==3 ){ - zSchema = 0; - pValue = objv[2]; - }else if( objc==4 ){ - zSchema = Tcl_GetString(objv[2]); - pValue = objv[3]; - }else{ + sqlite3_int64 mxSize = 0; + int i; + int isReadonly = 0; + + + if( objc<3 ){ Tcl_WrongNumArgs(interp, 2, objv, "?DATABASE? VALUE"); rc = TCL_ERROR; break; } + for(i=2; i0 ){ Tcl_AppendResult(interp, "out of memory", (char*)0); rc = TCL_ERROR; }else{ + int flags; if( len>0 ) memcpy(pData, pBA, len); - xrc = sqlite3_deserialize(pDb->db, zSchema, pData, len, len, - SQLITE_DESERIALIZE_FREEONCLOSE | - SQLITE_DESERIALIZE_RESIZEABLE); + if( isReadonly ){ + flags = SQLITE_DESERIALIZE_FREEONCLOSE | SQLITE_DESERIALIZE_READONLY; + }else{ + flags = SQLITE_DESERIALIZE_FREEONCLOSE | SQLITE_DESERIALIZE_RESIZEABLE; + } + xrc = sqlite3_deserialize(pDb->db, zSchema, pData, len, len, flags); if( xrc ){ Tcl_AppendResult(interp, "unable to set MEMDB content", (char*)0); rc = TCL_ERROR; } + if( mxSize>0 ){ + sqlite3_file_control(pDb->db, zSchema,SQLITE_FCNTL_SIZE_LIMIT,&mxSize); + } } +deserialize_error: #endif break; } diff --git a/sqlite/src/test1.c b/sqlite/src/test1.c index e2048cb3..d8a0c864 100644 --- a/sqlite/src/test1.c +++ b/sqlite/src/test1.c @@ -7141,6 +7141,9 @@ static int SQLITE_TCLAPI tclLoadStaticExtensionCmd( extern int sqlite3_ieee_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_nextchar_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_percentile_init(sqlite3*,char**,const sqlite3_api_routines*); +#ifndef SQLITE_OMIT_VIRTUALTABLE + extern int sqlite3_prefixes_init(sqlite3*,char**,const sqlite3_api_routines*); +#endif extern int sqlite3_regexp_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_remember_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_series_init(sqlite3*,char**,const sqlite3_api_routines*); @@ -7166,6 +7169,9 @@ static int SQLITE_TCLAPI tclLoadStaticExtensionCmd( { "ieee754", sqlite3_ieee_init }, { "nextchar", sqlite3_nextchar_init }, { "percentile", sqlite3_percentile_init }, +#ifndef SQLITE_OMIT_VIRTUALTABLE + { "prefixes", sqlite3_prefixes_init }, +#endif { "regexp", sqlite3_regexp_init }, { "remember", sqlite3_remember_init }, { "series", sqlite3_series_init }, @@ -7641,6 +7647,79 @@ static int SQLITE_TCLAPI test_mmap_warm( } } +/* +** Usage: decode_hexdb TEXT +** +** Example: db deserialize [decode_hexdb $output_of_dbtotxt] +** +** This routine returns a byte-array for an SQLite database file that +** is constructed from a text input which is the output of the "dbtotxt" +** utility. +*/ +static int SQLITE_TCLAPI test_decode_hexdb( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + const char *zIn = 0; + unsigned char *a = 0; + int n = 0; + int lineno = 0; + int i, iNext; + int iOffset = 0; + int j, k; + int rc; + unsigned char x[16]; + if( objc!=2 ){ + Tcl_WrongNumArgs(interp, 1, objv, "HEXDB"); + return TCL_ERROR; + } + zIn = Tcl_GetString(objv[1]); + for(i=0; zIn[i]; i=iNext){ + lineno++; + for(iNext=i; zIn[iNext] && zIn[iNext]!='\n'; iNext++){} + if( zIn[iNext]=='\n' ) iNext++; + while( zIn[i]==' ' || zIn[i]=='\t' ){ i++; } + if( a==0 ){ + int pgsz; + rc = sscanf(zIn+i, "| size %d pagesize %d", &n, &pgsz); + if( rc!=2 ) continue; + if( n<512 ){ + Tcl_AppendResult(interp, "bad 'size' field", (void*)0); + return TCL_ERROR; + } + a = malloc( n ); + if( a==0 ){ + Tcl_AppendResult(interp, "out of memory", (void*)0); + return TCL_ERROR; + } + memset(a, 0, n); + continue; + } + rc = sscanf(zIn+i, "| page %d offset %d", &j, &k); + if( rc==2 ){ + iOffset = k; + continue; + } + rc = sscanf(zIn+i,"| %d: %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx" + " %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx", + &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7], + &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]); + if( rc==17 ){ + k = iOffset+j; + if( k+16<=n ){ + memcpy(a+k, x, 16); + } + continue; + } + } + Tcl_SetObjResult(interp, Tcl_NewByteArrayObj(a, n)); + free(a); + return TCL_OK; +} + + /* ** Register commands with the TCL interpreter. */ @@ -7920,6 +7999,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ { "atomic_batch_write", test_atomic_batch_write, 0 }, { "sqlite3_mmap_warm", test_mmap_warm, 0 }, { "sqlite3_config_sorterref", test_config_sorterref, 0 }, + { "decode_hexdb", test_decode_hexdb, 0 }, }; static int bitmask_size = sizeof(Bitmask)*8; static int longdouble_size = sizeof(LONGDOUBLE_TYPE); diff --git a/sqlite/src/test_journal.c b/sqlite/src/test_journal.c index 8a449e88..6a040ea0 100644 --- a/sqlite/src/test_journal.c +++ b/sqlite/src/test_journal.c @@ -560,7 +560,7 @@ static int jtWrite( /* The following assert() statements may fail if this layer is used ** with a connection in "PRAGMA synchronous=off" mode. If they ** fail with sync=normal or sync=full, this may indicate problem. */ - assert( pgno<=p->nPage || p->nSync>0 ); + assert( p->nPage==0 || pgno<=p->nPage || p->nSync>0 ); assert( pgno>p->nPage || sqlite3BitvecTest(p->pWritable, pgno) ); } } diff --git a/sqlite/src/test_vfs.c b/sqlite/src/test_vfs.c index 4a98ac21..bf9fa6b5 100644 --- a/sqlite/src/test_vfs.c +++ b/sqlite/src/test_vfs.c @@ -228,11 +228,13 @@ static int tvfsResultCode(Testvfs *p, int *pRc){ int eCode; const char *zCode; } aCode[] = { - { SQLITE_OK, "SQLITE_OK" }, - { SQLITE_ERROR, "SQLITE_ERROR" }, - { SQLITE_IOERR, "SQLITE_IOERR" }, - { SQLITE_LOCKED, "SQLITE_LOCKED" }, - { SQLITE_BUSY, "SQLITE_BUSY" }, + { SQLITE_OK, "SQLITE_OK" }, + { SQLITE_ERROR, "SQLITE_ERROR" }, + { SQLITE_IOERR, "SQLITE_IOERR" }, + { SQLITE_LOCKED, "SQLITE_LOCKED" }, + { SQLITE_BUSY, "SQLITE_BUSY" }, + { SQLITE_READONLY, "SQLITE_READONLY" }, + { SQLITE_READONLY_CANTINIT, "SQLITE_READONLY_CANTINIT" }, }; const char *z; @@ -865,7 +867,7 @@ static int tvfsShmOpen(sqlite3_file *pFile){ pFd->pNext = pBuffer->pFile; pBuffer->pFile = pFd; pFd->pShm = pBuffer; - return SQLITE_OK; + return rc; } static void tvfsAllocPage(TestvfsBuffer *p, int iPage, int pgsz){ @@ -918,7 +920,9 @@ static int tvfsShmMap( if( rc==SQLITE_OK && isWrite && !pFd->pShm->aPage[iPage] ){ tvfsAllocPage(pFd->pShm, iPage, pgsz); } - *pp = (void volatile *)pFd->pShm->aPage[iPage]; + if( rc==SQLITE_OK || rc==SQLITE_READONLY ){ + *pp = (void volatile *)pFd->pShm->aPage[iPage]; + } return rc; } @@ -1563,8 +1567,115 @@ static int SQLITE_TCLAPI testvfs_cmd( return TCL_ERROR; } +extern int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb); +extern const char *sqlite3ErrName(int); + +/* +** tclcmd: vfs_shmlock DB DBNAME (shared|exclusive) (lock|unlock) OFFSET N +*/ +static int SQLITE_TCLAPI test_vfs_shmlock( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + const char *azArg1[] = {"shared", "exclusive", 0}; + const char *azArg2[] = {"lock", "unlock", 0}; + sqlite3 *db = 0; + int rc = SQLITE_OK; + const char *zDbname = 0; + int iArg1 = 0; + int iArg2 = 0; + int iOffset = 0; + int n = 0; + sqlite3_file *pFd; + + if( objc!=7 ){ + Tcl_WrongNumArgs(interp, 1, objv, + "DB DBNAME (shared|exclusive) (lock|unlock) OFFSET N" + ); + return TCL_ERROR; + } + + zDbname = Tcl_GetString(objv[2]); + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) + || Tcl_GetIndexFromObj(interp, objv[3], azArg1, "ARG", 0, &iArg1) + || Tcl_GetIndexFromObj(interp, objv[4], azArg2, "ARG", 0, &iArg2) + || Tcl_GetIntFromObj(interp, objv[5], &iOffset) + || Tcl_GetIntFromObj(interp, objv[6], &n) + ){ + return TCL_ERROR; + } + + sqlite3_file_control(db, zDbname, SQLITE_FCNTL_FILE_POINTER, (void*)&pFd); + if( pFd==0 ){ + return TCL_ERROR; + } + rc = pFd->pMethods->xShmLock(pFd, iOffset, n, + (iArg1==0 ? SQLITE_SHM_SHARED : SQLITE_SHM_EXCLUSIVE) + | (iArg2==0 ? SQLITE_SHM_LOCK : SQLITE_SHM_UNLOCK) + ); + Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1)); + return TCL_OK; +} + +static int SQLITE_TCLAPI test_vfs_set_readmark( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + sqlite3 *db = 0; + int rc = SQLITE_OK; + const char *zDbname = 0; + int iSlot = 0; + int iVal = -1; + sqlite3_file *pFd; + void volatile *pShm = 0; + u32 *aShm; + int iOff; + + if( objc!=4 && objc!=5 ){ + Tcl_WrongNumArgs(interp, 1, objv, "DB DBNAME SLOT ?VALUE?"); + return TCL_ERROR; + } + + zDbname = Tcl_GetString(objv[2]); + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) + || Tcl_GetIntFromObj(interp, objv[3], &iSlot) + || (objc==5 && Tcl_GetIntFromObj(interp, objv[4], &iVal)) + ){ + return TCL_ERROR; + } + + sqlite3_file_control(db, zDbname, SQLITE_FCNTL_FILE_POINTER, (void*)&pFd); + if( pFd==0 ){ + return TCL_ERROR; + } + rc = pFd->pMethods->xShmMap(pFd, 0, 32*1024, 0, &pShm); + if( rc!=SQLITE_OK ){ + Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1)); + return TCL_ERROR; + } + if( pShm==0 ){ + Tcl_AppendResult(interp, "*-shm is not yet mapped", 0); + return TCL_ERROR; + } + aShm = (u32*)pShm; + iOff = 12*2+1+iSlot; + + if( objc==5 ){ + aShm[iOff] = iVal; + } + Tcl_SetObjResult(interp, Tcl_NewIntObj(aShm[iOff])); + + return TCL_OK; +} + int Sqlitetestvfs_Init(Tcl_Interp *interp){ Tcl_CreateObjCommand(interp, "testvfs", testvfs_cmd, 0, 0); + Tcl_CreateObjCommand(interp, "vfs_shmlock", test_vfs_shmlock, 0, 0); + Tcl_CreateObjCommand(interp, "vfs_set_readmark", test_vfs_set_readmark, 0, 0); return TCL_OK; } diff --git a/sqlite/src/tokenize.c b/sqlite/src/tokenize.c index 05ca86e7..2d7b23d4 100644 --- a/sqlite/src/tokenize.c +++ b/sqlite/src/tokenize.c @@ -545,73 +545,6 @@ 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 @@ -639,7 +572,14 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ pParse->rc = SQLITE_OK; pParse->zTail = zSql; assert( pzErrMsg!=0 ); - /* sqlite3ParserTrace(stdout, "parser: "); */ +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_ParserTrace ){ + printf("parser: [[[%s]]]\n", zSql); + sqlite3ParserTrace(stdout, "parser: "); + }else{ + sqlite3ParserTrace(0, 0); + } +#endif #ifdef sqlite3Parser_ENGINEALWAYSONSTACK pEngine = &sEngine; sqlite3ParserInit(pEngine, pParse); @@ -781,3 +721,138 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ assert( nErr==0 || pParse->rc!=SQLITE_OK ); return nErr; } + + +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Insert a single space character into pStr if the current string +** ends with an identifier +*/ +static void addSpaceSeparator(sqlite3_str *pStr){ + if( pStr->nChar && sqlite3IsIdChar(pStr->zText[pStr->nChar-1]) ){ + sqlite3_str_append(pStr, " ", 1); + } +} + +/* +** Compute a normalization of the SQL given by zSql[0..nSql-1]. Return +** the normalization in space obtained from sqlite3DbMalloc(). Or return +** NULL if anything goes wrong or if zSql is NULL. +*/ +char *sqlite3Normalize( + Vdbe *pVdbe, /* VM being reprepared */ + const char *zSql /* The original SQL string */ +){ + sqlite3 *db; /* The database connection */ + int i; /* Next unread byte of zSql[] */ + int n; /* length of current token */ + int tokenType; /* type of current token */ + int prevType = 0; /* Previous non-whitespace token */ + int nParen; /* Number of nested levels of parentheses */ + int iStartIN; /* Start of RHS of IN operator in z[] */ + int nParenAtIN; /* Value of nParent at start of RHS of IN operator */ + int j; /* Bytes of normalized SQL generated so far */ + sqlite3_str *pStr; /* The normalized SQL string under construction */ + + db = sqlite3VdbeDb(pVdbe); + tokenType = -1; + nParen = iStartIN = nParenAtIN = 0; + pStr = sqlite3_str_new(db); + assert( pStr!=0 ); /* sqlite3_str_new() never returns NULL */ + for(i=0; zSql[i] && pStr->accError==0; i+=n){ + if( tokenType!=TK_SPACE ){ + prevType = tokenType; + } + n = sqlite3GetToken((unsigned char*)zSql+i, &tokenType); + if( NEVER(n<=0) ) break; + switch( tokenType ){ + case TK_SPACE: { + break; + } + case TK_NULL: { + if( prevType==TK_IS || prevType==TK_NOT ){ + sqlite3_str_append(pStr, " NULL", 5); + break; + } + /* Fall through */ + } + case TK_STRING: + case TK_INTEGER: + case TK_FLOAT: + case TK_VARIABLE: + case TK_BLOB: { + sqlite3_str_append(pStr, "?", 1); + break; + } + case TK_LP: { + nParen++; + if( prevType==TK_IN ){ + iStartIN = pStr->nChar; + nParenAtIN = nParen; + } + sqlite3_str_append(pStr, "(", 1); + break; + } + case TK_RP: { + if( iStartIN>0 && nParen==nParenAtIN ){ + assert( pStr->nChar>=iStartIN ); + pStr->nChar = iStartIN+1; + sqlite3_str_append(pStr, "?,?,?", 5); + iStartIN = 0; + } + nParen--; + sqlite3_str_append(pStr, ")", 1); + break; + } + case TK_ID: { + iStartIN = 0; + j = pStr->nChar; + if( sqlite3Isquote(zSql[i]) ){ + char *zId = sqlite3DbStrNDup(db, zSql+i, n); + int nId; + int eType = 0; + if( zId==0 ) break; + sqlite3Dequote(zId); + if( zSql[i]=='"' && sqlite3VdbeUsesDoubleQuotedString(pVdbe, zId) ){ + sqlite3_str_append(pStr, "?", 1); + sqlite3DbFree(db, zId); + break; + } + nId = sqlite3Strlen30(zId); + if( sqlite3GetToken((u8*)zId, &eType)==nId && eType==TK_ID ){ + addSpaceSeparator(pStr); + sqlite3_str_append(pStr, zId, nId); + }else{ + sqlite3_str_appendf(pStr, "\"%w\"", zId); + } + sqlite3DbFree(db, zId); + }else{ + addSpaceSeparator(pStr); + sqlite3_str_append(pStr, zSql+i, n); + } + while( jnChar ){ + pStr->zText[j] = sqlite3Tolower(pStr->zText[j]); + j++; + } + break; + } + case TK_SELECT: { + iStartIN = 0; + /* fall through */ + } + default: { + if( sqlite3IsIdChar(zSql[i]) ) addSpaceSeparator(pStr); + j = pStr->nChar; + sqlite3_str_append(pStr, zSql+i, n); + while( jnChar ){ + pStr->zText[j] = sqlite3Toupper(pStr->zText[j]); + j++; + } + break; + } + } + } + if( tokenType!=TK_SEMI ) sqlite3_str_append(pStr, ";", 1); + return sqlite3_str_finish(pStr); +} +#endif /* SQLITE_ENABLE_NORMALIZE */ diff --git a/sqlite/src/treeview.c b/sqlite/src/treeview.c index 16fe5c26..743c3b12 100644 --- a/sqlite/src/treeview.c +++ b/sqlite/src/treeview.c @@ -138,7 +138,8 @@ void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ sqlite3_str_appendf(&x, " %s", pItem->zName); } if( pItem->pTab ){ - sqlite3_str_appendf(&x, " tabname=%Q", pItem->pTab->zName); + sqlite3_str_appendf(&x, " tab=%Q nCol=%d ptr=%p", + pItem->pTab->zName, pItem->pTab->nCol, pItem->pTab); } if( pItem->zAlias ){ sqlite3_str_appendf(&x, " (AS %s)", pItem->zAlias); diff --git a/sqlite/src/trigger.c b/sqlite/src/trigger.c index dd6224da..c37f76da 100644 --- a/sqlite/src/trigger.c +++ b/sqlite/src/trigger.c @@ -731,7 +731,7 @@ static SrcList *targetSrcList( int iDb; /* Index of the database to use */ SrcList *pSrc; /* SrcList to be returned */ - pSrc = sqlite3SrcListAppend(db, 0, 0, 0); + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( pSrc ){ assert( pSrc->nSrc>0 ); pSrc->a[pSrc->nSrc-1].zName = sqlite3DbStrDup(db, pStep->zTarget); @@ -916,6 +916,7 @@ static TriggerPrg *codeRowTrigger( pSubParse->zAuthContext = pTrigger->zName; pSubParse->eTriggerOp = pTrigger->op; pSubParse->nQueryLoop = pParse->nQueryLoop; + pSubParse->disableVtab = pParse->disableVtab; v = sqlite3GetVdbe(pSubParse); if( v ){ @@ -943,7 +944,7 @@ static TriggerPrg *codeRowTrigger( if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen) && db->mallocFailed==0 ){ - iEndTrigger = sqlite3VdbeMakeLabel(v); + iEndTrigger = sqlite3VdbeMakeLabel(pSubParse); sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL); } sqlite3ExprDelete(db, pWhen); diff --git a/sqlite/src/update.c b/sqlite/src/update.c index 70f4f676..132837d4 100644 --- a/sqlite/src/update.c +++ b/sqlite/src/update.c @@ -354,6 +354,7 @@ void sqlite3Update( ** being updated. Fill in aRegIdx[] with a register number that will hold ** the key for accessing each index. */ + if( onError==OE_Replace ) bReplace = 1; for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ int reg; if( chngKey || hasFK>1 || pIdx==pPk @@ -367,9 +368,7 @@ void sqlite3Update( if( indexColumnIsBeingUpdated(pIdx, i, aXRef, chngRowid) ){ reg = ++pParse->nMem; pParse->nMem += pIdx->nColumn; - if( (onError==OE_Replace) - || (onError==OE_Default && pIdx->onError==OE_Replace) - ){ + if( onError==OE_Default && pIdx->onError==OE_Replace ){ bReplace = 1; } break; @@ -441,7 +440,7 @@ void sqlite3Update( #endif /* Jump to labelBreak to abandon further processing of this UPDATE */ - labelContinue = labelBreak = sqlite3VdbeMakeLabel(v); + labelContinue = labelBreak = sqlite3VdbeMakeLabel(pParse); /* Not an UPSERT. Normal processing. Begin by ** initialize the count of updated rows */ @@ -576,13 +575,13 @@ void sqlite3Update( VdbeCoverage(v); } if( eOnePass!=ONEPASS_SINGLE ){ - labelContinue = sqlite3VdbeMakeLabel(v); + labelContinue = sqlite3VdbeMakeLabel(pParse); } sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak); VdbeCoverageIf(v, pPk==0); VdbeCoverageIf(v, pPk!=0); }else if( pPk ){ - labelContinue = sqlite3VdbeMakeLabel(v); + labelContinue = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v); addrTop = sqlite3VdbeAddOp2(v, OP_RowData, iEph, regKey); sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0); diff --git a/sqlite/src/util.c b/sqlite/src/util.c index 54f9b938..8432d897 100644 --- a/sqlite/src/util.c +++ b/sqlite/src/util.c @@ -238,7 +238,7 @@ void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ ** dequoted string, exclusive of the zero terminator, if dequoting does ** occur. ** -** 2002-Feb-14: This routine is extended to remove MS-Access style +** 2002-02-14: This routine is extended to remove MS-Access style ** brackets from around identifiers. For example: "[a-b-c]" becomes ** "a-b-c". */ @@ -264,6 +264,11 @@ void sqlite3Dequote(char *z){ } z[j] = 0; } +void sqlite3DequoteExpr(Expr *p){ + assert( sqlite3Isquote(p->u.zToken[0]) ); + p->flags |= p->u.zToken[0]=='"' ? EP_Quoted|EP_DblQuoted : EP_Quoted; + sqlite3Dequote(p->u.zToken); +} /* ** Generate a Token object from a string diff --git a/sqlite/src/vacuum.c b/sqlite/src/vacuum.c index 5fb04891..8042f107 100644 --- a/sqlite/src/vacuum.c +++ b/sqlite/src/vacuum.c @@ -102,16 +102,16 @@ static int execSqlF(sqlite3 *db, char **pzErrMsg, const char *zSql, ...){ ** transient would cause the database file to appear to be deleted ** following reboot. */ -void sqlite3Vacuum(Parse *pParse, Token *pNm){ +void sqlite3Vacuum(Parse *pParse, Token *pNm, Expr *pInto){ Vdbe *v = sqlite3GetVdbe(pParse); int iDb = 0; - if( v==0 ) return; + if( v==0 ) goto build_vacuum_end; if( pNm ){ #ifndef SQLITE_BUG_COMPATIBLE_20160819 /* Default behavior: Report an error if the argument to VACUUM is ** not recognized */ iDb = sqlite3TwoPartName(pParse, pNm, pNm, &pNm); - if( iDb<0 ) return; + if( iDb<0 ) goto build_vacuum_end; #else /* When SQLITE_BUG_COMPATIBLE_20160819 is defined, unrecognized arguments ** to VACUUM are silently ignored. This is a back-out of a bug fix that @@ -123,21 +123,33 @@ void sqlite3Vacuum(Parse *pParse, Token *pNm){ #endif } if( iDb!=1 ){ - sqlite3VdbeAddOp1(v, OP_Vacuum, iDb); + int iIntoReg = 0; + if( pInto && sqlite3ResolveSelfReference(pParse,0,0,pInto,0)==0 ){ + iIntoReg = ++pParse->nMem; + sqlite3ExprCode(pParse, pInto, iIntoReg); + } + sqlite3VdbeAddOp2(v, OP_Vacuum, iDb, iIntoReg); sqlite3VdbeUsesBtree(v, iDb); } +build_vacuum_end: + sqlite3ExprDelete(pParse->db, pInto); return; } /* ** This routine implements the OP_Vacuum opcode of the VDBE. */ -int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ +int sqlite3RunVacuum( + char **pzErrMsg, /* Write error message here */ + sqlite3 *db, /* Database connection */ + int iDb, /* Which attached DB to vacuum */ + sqlite3_value *pOut /* Write results here, if not NULL */ +){ int rc = SQLITE_OK; /* Return code from service routines */ Btree *pMain; /* The database being vacuumed */ Btree *pTemp; /* The temporary database we vacuum into */ - u16 saved_mDbFlags; /* Saved value of db->mDbFlags */ - u32 saved_flags; /* Saved value of db->flags */ + u32 saved_mDbFlags; /* Saved value of db->mDbFlags */ + u64 saved_flags; /* Saved value of db->flags */ int saved_nChange; /* Saved value of db->nChange */ int saved_nTotalChange; /* Saved value of db->nTotalChange */ u8 saved_mTrace; /* Saved trace settings */ @@ -146,6 +158,7 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ int nRes; /* Bytes of reserved space at the end of each page */ int nDb; /* Number of attached databases */ const char *zDbMain; /* Schema name of database to vacuum */ + const char *zOut; /* Name of output file */ if( !db->autoCommit ){ sqlite3SetString(pzErrMsg, db, "cannot VACUUM from within a transaction"); @@ -155,6 +168,15 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ sqlite3SetString(pzErrMsg, db,"cannot VACUUM - SQL statements in progress"); return SQLITE_ERROR; } + if( pOut ){ + if( sqlite3_value_type(pOut)!=SQLITE_TEXT ){ + sqlite3SetString(pzErrMsg, db, "non-text filename"); + return SQLITE_ERROR; + } + zOut = (const char*)sqlite3_value_text(pOut); + }else{ + zOut = ""; + } /* Save the current value of the database flags so that it can be ** restored before returning. Then set the writable-schema flag, and @@ -166,7 +188,7 @@ 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 + db->flags &= ~(u64)(SQLITE_ForeignKeys | SQLITE_ReverseOrder | SQLITE_Defensive | SQLITE_CountRows); db->mTrace = 0; @@ -189,19 +211,21 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ ** to write the journal header file. */ nDb = db->nDb; - rc = execSql(db, pzErrMsg, "ATTACH''AS vacuum_db"); + rc = execSqlF(db, pzErrMsg, "ATTACH %Q AS vacuum_db", zOut); if( rc!=SQLITE_OK ) goto end_of_vacuum; assert( (db->nDb-1)==nDb ); pDb = &db->aDb[nDb]; assert( strcmp(pDb->zDbSName,"vacuum_db")==0 ); pTemp = pDb->pBt; - - /* The call to execSql() to attach the temp database has left the file - ** locked (as there was more than one active statement when the transaction - ** to read the schema was concluded. Unlock it here so that this doesn't - ** cause problems for the call to BtreeSetPageSize() below. */ - sqlite3BtreeCommit(pTemp); - + if( pOut ){ + sqlite3_file *id = sqlite3PagerFile(sqlite3BtreePager(pTemp)); + i64 sz = 0; + if( id->pMethods!=0 && (sqlite3OsFileSize(id, &sz)!=SQLITE_OK || sz>0) ){ + rc = SQLITE_ERROR; + sqlite3SetString(pzErrMsg, db, "output file already exists"); + goto end_of_vacuum; + } + } nRes = sqlite3BtreeGetOptimalReserve(pMain); /* A VACUUM cannot change the pagesize of an encrypted database. */ @@ -225,7 +249,7 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ */ rc = execSql(db, pzErrMsg, "BEGIN"); if( rc!=SQLITE_OK ) goto end_of_vacuum; - rc = sqlite3BtreeBeginTrans(pMain, 2, 0); + rc = sqlite3BtreeBeginTrans(pMain, pOut==0 ? 2 : 0, 0); if( rc!=SQLITE_OK ) goto end_of_vacuum; /* Do not attempt to change the page size for a WAL database */ @@ -320,7 +344,7 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ }; assert( 1==sqlite3BtreeIsInTrans(pTemp) ); - assert( 1==sqlite3BtreeIsInTrans(pMain) ); + assert( pOut!=0 || 1==sqlite3BtreeIsInTrans(pMain) ); /* Copy Btree meta values */ for(i=0; iflags */ diff --git a/sqlite/src/vdbe.c b/sqlite/src/vdbe.c index 14f3e1bd..9f37624b 100644 --- a/sqlite/src/vdbe.c +++ b/sqlite/src/vdbe.c @@ -240,6 +240,11 @@ static VdbeCursor *allocateCursor( assert( iCur>=0 && iCurnCursor ); if( p->apCsr[iCur] ){ /*OPTIMIZATION-IF-FALSE*/ + /* Before calling sqlite3VdbeFreeCursor(), ensure the isEphemeral flag + ** is clear. Otherwise, if this is an ephemeral cursor created by + ** OP_OpenDup, the cursor will not be closed and will still be part + ** of a BtShared.pCursor list. */ + p->apCsr[iCur]->isEphemeral = 0; sqlite3VdbeFreeCursor(p, p->apCsr[iCur]); p->apCsr[iCur] = 0; } @@ -380,6 +385,7 @@ void sqlite3ValueApplyAffinity( static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){ assert( (pMem->flags & (MEM_Int|MEM_Real))==0 ); assert( (pMem->flags & (MEM_Str|MEM_Blob))!=0 ); + ExpandBlob(pMem); if( sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc)==0 ){ return 0; } @@ -1578,8 +1584,8 @@ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ break; } default: { - iA = (i64)rA; - iB = (i64)rB; + iA = sqlite3VdbeIntValue(pIn1); + iB = sqlite3VdbeIntValue(pIn2); if( iA==0 ) goto arithmetic_result_is_null; if( iA==-1 ) iA = 1; rB = (double)(iB % iA); @@ -1925,7 +1931,8 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ */ assert( pOp->opcode==OP_Eq || pOp->opcode==OP_Ne ); assert( (flags1 & MEM_Cleared)==0 ); - assert( (pOp->p5 & SQLITE_JUMPIFNULL)==0 ); + assert( (pOp->p5 & SQLITE_JUMPIFNULL)==0 || CORRUPT_DB ); + testcase( (pOp->p5 & SQLITE_JUMPIFNULL)!=0 ); if( (flags1&flags3&MEM_Null)!=0 && (flags3&MEM_Cleared)==0 ){ @@ -3609,7 +3616,8 @@ case OP_OpenDup: { pCx->isEphemeral = 1; pCx->pKeyInfo = pOrig->pKeyInfo; pCx->isTable = pOrig->isTable; - rc = sqlite3BtreeCursor(pOrig->pBtx, MASTER_ROOT, BTREE_WRCSR, + pCx->pgnoRoot = pOrig->pgnoRoot; + rc = sqlite3BtreeCursor(pOrig->pBtx, pCx->pgnoRoot, BTREE_WRCSR, pCx->pKeyInfo, pCx->uc.pCursor); /* The sqlite3BtreeCursor() routine can only fail for the first cursor ** opened for a database. Since there is already an open cursor when this @@ -3627,6 +3635,9 @@ case OP_OpenDup: { ** the main database is read-only. The ephemeral ** table is deleted automatically when the cursor is closed. ** +** If the cursor P1 is already opened on an ephemeral table, the table +** is cleared (all content is erased). +** ** P2 is the number of columns in the ephemeral table. ** The cursor points to a BTree table if P4==0 and to a BTree index ** if P4 is not 0. If P4 is not NULL, it points to a KeyInfo structure @@ -3658,41 +3669,50 @@ case OP_OpenEphemeral: { SQLITE_OPEN_TRANSIENT_DB; assert( pOp->p1>=0 ); assert( pOp->p2>=0 ); - pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE); - if( pCx==0 ) goto no_mem; - pCx->nullRow = 1; - pCx->isEphemeral = 1; - rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx, - BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags); - if( rc==SQLITE_OK ){ - rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1, 0); - } - if( rc==SQLITE_OK ){ - /* If a transient index is required, create it by calling - ** sqlite3BtreeCreateTable() with the BTREE_BLOBKEY flag before - ** opening it. If a transient table is required, just use the - ** automatically created table with root-page 1 (an BLOB_INTKEY table). - */ - if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ - int pgno; - assert( pOp->p4type==P4_KEYINFO ); - rc = sqlite3BtreeCreateTable(pCx->pBtx, &pgno, BTREE_BLOBKEY | pOp->p5); - if( rc==SQLITE_OK ){ - assert( pgno==MASTER_ROOT+1 ); - assert( pKeyInfo->db==db ); - assert( pKeyInfo->enc==ENC(db) ); - rc = sqlite3BtreeCursor(pCx->pBtx, pgno, BTREE_WRCSR, - pKeyInfo, pCx->uc.pCursor); + pCx = p->apCsr[pOp->p1]; + if( pCx ){ + /* If the ephermeral table is already open, erase all existing content + ** so that the table is empty again, rather than creating a new table. */ + rc = sqlite3BtreeClearTable(pCx->pBtx, pCx->pgnoRoot, 0); + }else{ + pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE); + if( pCx==0 ) goto no_mem; + pCx->nullRow = 1; + pCx->isEphemeral = 1; + rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx, + BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, + vfsFlags); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1, 0); + } + if( rc==SQLITE_OK ){ + /* If a transient index is required, create it by calling + ** sqlite3BtreeCreateTable() with the BTREE_BLOBKEY flag before + ** opening it. If a transient table is required, just use the + ** automatically created table with root-page 1 (an BLOB_INTKEY table). + */ + if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ + assert( pOp->p4type==P4_KEYINFO ); + rc = sqlite3BtreeCreateTable(pCx->pBtx, (int*)&pCx->pgnoRoot, + BTREE_BLOBKEY | pOp->p5); + if( rc==SQLITE_OK ){ + assert( pCx->pgnoRoot==MASTER_ROOT+1 ); + assert( pKeyInfo->db==db ); + assert( pKeyInfo->enc==ENC(db) ); + rc = sqlite3BtreeCursor(pCx->pBtx, pCx->pgnoRoot, BTREE_WRCSR, + pKeyInfo, pCx->uc.pCursor); + } + pCx->isTable = 0; + }else{ + pCx->pgnoRoot = MASTER_ROOT; + rc = sqlite3BtreeCursor(pCx->pBtx, MASTER_ROOT, BTREE_WRCSR, + 0, pCx->uc.pCursor); + pCx->isTable = 1; } - pCx->isTable = 0; - }else{ - rc = sqlite3BtreeCursor(pCx->pBtx, MASTER_ROOT, BTREE_WRCSR, - 0, pCx->uc.pCursor); - pCx->isTable = 1; } + pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); } if( rc ) goto abort_due_to_error; - pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); break; } @@ -4342,7 +4362,7 @@ case OP_NotExists: /* jump, in3 */ pC = p->apCsr[pOp->p1]; assert( pC!=0 ); #ifdef SQLITE_DEBUG - pC->seekOp = OP_SeekRowid; + if( pOp->opcode==OP_SeekRowid ) pC->seekOp = OP_SeekRowid; #endif assert( pC->isTable ); assert( pC->eCurType==CURTYPE_BTREE ); @@ -4560,14 +4580,7 @@ case OP_NewRowid: { /* out2 */ ** This instruction only works on tables. The equivalent instruction ** for indices is OP_IdxInsert. */ -/* Opcode: InsertInt P1 P2 P3 P4 P5 -** Synopsis: intkey=P3 data=r[P2] -** -** This works exactly like OP_Insert except that the key is the -** integer value P3, not the value of the integer stored in register P3. -*/ -case OP_Insert: -case OP_InsertInt: { +case OP_Insert: { Mem *pData; /* MEM cell holding data for the record to be inserted */ Mem *pKey; /* MEM cell holding key for the record */ VdbeCursor *pC; /* Cursor to table into which insert is written */ @@ -4588,16 +4601,11 @@ case OP_InsertInt: { REGISTER_TRACE(pOp->p2, pData); sqlite3VdbeIncrWriteCounter(p, pC); - if( pOp->opcode==OP_Insert ){ - pKey = &aMem[pOp->p3]; - assert( pKey->flags & MEM_Int ); - assert( memIsValid(pKey) ); - REGISTER_TRACE(pOp->p3, pKey); - x.nKey = pKey->u.i; - }else{ - assert( pOp->opcode==OP_InsertInt ); - x.nKey = pOp->p3; - } + pKey = &aMem[pOp->p3]; + assert( pKey->flags & MEM_Int ); + assert( memIsValid(pKey) ); + REGISTER_TRACE(pOp->p3, pKey); + x.nKey = pKey->u.i; if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ assert( pC->iDb>=0 ); @@ -5250,7 +5258,7 @@ case OP_Next: /* jump */ assert( pOp->opcode!=OP_Next || pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found - || pC->seekOp==OP_NullRow); + || pC->seekOp==OP_NullRow|| pC->seekOp==OP_SeekRowid); assert( pOp->opcode!=OP_Prev || pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE || pC->seekOp==OP_Last @@ -5780,9 +5788,16 @@ case OP_ParseSchema: { assert( db->init.busy==0 ); db->init.busy = 1; initData.rc = SQLITE_OK; + initData.nInitRow = 0; assert( !db->mallocFailed ); rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0); if( rc==SQLITE_OK ) rc = initData.rc; + if( rc==SQLITE_OK && initData.nInitRow==0 ){ + /* The OP_ParseSchema opcode with a non-NULL P4 argument should parse + ** at least one SQL statement. Any less than that indicates that + ** the sqlite_master table is corrupt. */ + rc = SQLITE_CORRUPT_BKPT; + } sqlite3DbFreeNN(db, zSql); db->init.busy = 0; } @@ -6145,6 +6160,17 @@ case OP_Program: { /* jump */ p->nOp = pProgram->nOp; #ifdef SQLITE_ENABLE_STMT_SCANSTATUS p->anExec = 0; +#endif +#ifdef SQLITE_DEBUG + /* Verify that second and subsequent executions of the same trigger do not + ** try to reuse register values from the first use. */ + { + int i; + for(i=0; inMem; i++){ + aMem[i].pScopyFrom = 0; /* Prevent false-positive AboutToChange() errs */ + aMem[i].flags |= MEM_Undefined; /* Cause a fault if this reg is reused */ + } + } #endif pOp = &aOp[-1]; @@ -6684,14 +6710,19 @@ case OP_JournalMode: { /* out2 */ #endif /* SQLITE_OMIT_PRAGMA */ #if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH) -/* Opcode: Vacuum P1 * * * * +/* Opcode: Vacuum P1 P2 * * * ** ** Vacuum the entire database P1. P1 is 0 for "main", and 2 or more ** for an attached database. The "temp" database may not be vacuumed. +** +** If P2 is not zero, then it is a register holding a string which is +** the file into which the result of vacuum should be written. When +** P2 is zero, the vacuum overwrites the original database. */ case OP_Vacuum: { assert( p->readOnly==0 ); - rc = sqlite3RunVacuum(&p->zErrMsg, db, pOp->p1); + rc = sqlite3RunVacuum(&p->zErrMsg, db, pOp->p1, + pOp->p2 ? &aMem[pOp->p2] : 0); if( rc ) goto abort_due_to_error; break; } @@ -6843,6 +6874,7 @@ case OP_VDestroy: { db->nVDestroy++; rc = sqlite3VtabCallDestroy(db, pOp->p1, pOp->p4.z); db->nVDestroy--; + assert( p->errorAction==OE_Abort && p->usesStmtJournal ); if( rc ) goto abort_due_to_error; break; } @@ -7086,7 +7118,7 @@ case OP_VRename: { rc = sqlite3VdbeChangeEncoding(pName, SQLITE_UTF8); if( rc ) goto abort_due_to_error; rc = pVtab->pModule->xRename(pVtab, pName->z); - if( isLegacy==0 ) db->flags &= ~SQLITE_LegacyAlter; + if( isLegacy==0 ) db->flags &= ~(u64)SQLITE_LegacyAlter; sqlite3VtabImportErrmsg(p, pVtab); p->expired = 0; if( rc ) goto abort_due_to_error; diff --git a/sqlite/src/vdbe.h b/sqlite/src/vdbe.h index d42acc0c..041a91c5 100644 --- a/sqlite/src/vdbe.h +++ b/sqlite/src/vdbe.h @@ -156,12 +156,11 @@ typedef struct VdbeOpList VdbeOpList; #endif /* -** The following macro converts a relative address in the p2 field -** of a VdbeOp structure into a negative number so that -** sqlite3VdbeAddOpList() knows that the address is relative. Calling -** the macro again restores the address. +** The following macro converts a label returned by sqlite3VdbeMakeLabel() +** into an index into the Parse.aLabel[] array that contains the resolved +** address of that label. */ -#define ADDR(X) (-1-(X)) +#define ADDR(X) (~(X)) /* ** The makefile scans the vdbe.c source file and creates the "opcodes.h" @@ -215,6 +214,12 @@ VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp,int iLineno); # define ExplainQueryPlan(P) # define ExplainQueryPlanPop(P) # define ExplainQueryPlanParent(P) 0 +# define sqlite3ExplainBreakpoint(A,B) /*no-op*/ +#endif +#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_EXPLAIN) + void sqlite3ExplainBreakpoint(const char*,const char*); +#else +# define sqlite3ExplainBreakpoint(A,B) /*no-op*/ #endif void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*); void sqlite3VdbeChangeOpcode(Vdbe*, u32 addr, u8); @@ -230,7 +235,7 @@ void sqlite3VdbeAppendP4(Vdbe*, void *pP4, int p4type); void sqlite3VdbeSetP4KeyInfo(Parse*, Index*); void sqlite3VdbeUsesBtree(Vdbe*, int); VdbeOp *sqlite3VdbeGetOp(Vdbe*, int); -int sqlite3VdbeMakeLabel(Vdbe*); +int sqlite3VdbeMakeLabel(Parse*); void sqlite3VdbeRunOnlyOnce(Vdbe*); void sqlite3VdbeReusable(Vdbe*); void sqlite3VdbeDelete(Vdbe*); @@ -251,6 +256,10 @@ void sqlite3VdbeCountChanges(Vdbe*); sqlite3 *sqlite3VdbeDb(Vdbe*); u8 sqlite3VdbePrepareFlags(Vdbe*); void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, u8); +#ifdef SQLITE_ENABLE_NORMALIZE +void sqlite3VdbeAddDblquoteStr(sqlite3*,Vdbe*,const char*); +int sqlite3VdbeUsesDoubleQuotedString(Vdbe*,const char*); +#endif void sqlite3VdbeSwap(Vdbe*,Vdbe*); VdbeOp *sqlite3VdbeTakeOpArray(Vdbe*, int*, int*); sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe*, int, u8); diff --git a/sqlite/src/vdbeInt.h b/sqlite/src/vdbeInt.h index 5c719923..acc7f5a6 100644 --- a/sqlite/src/vdbeInt.h +++ b/sqlite/src/vdbeInt.h @@ -335,6 +335,9 @@ struct sqlite3_context { */ typedef unsigned bft; /* Bit Field Type */ +/* The ScanStatus object holds a single value for the +** sqlite3_stmt_scanstatus() interface. +*/ typedef struct ScanStatus ScanStatus; struct ScanStatus { int addrExplain; /* OP_Explain for loop */ @@ -345,6 +348,19 @@ struct ScanStatus { char *zName; /* Name of table or index */ }; +/* The DblquoteStr object holds the text of a double-quoted +** string for a prepared statement. A linked list of these objects +** is constructed during statement parsing and is held on Vdbe.pDblStr. +** When computing a normalized SQL statement for an SQL statement, that +** list is consulted for each double-quoted identifier to see if the +** identifier should really be a string literal. +*/ +typedef struct DblquoteStr DblquoteStr; +struct DblquoteStr { + DblquoteStr *pNextStr; /* Next string literal in the list */ + char z[8]; /* Dequoted value for the string */ +}; + /* ** An instance of the virtual machine. This structure contains the complete ** state of the virtual machine. @@ -364,28 +380,29 @@ struct Vdbe { int pc; /* The program counter */ int rc; /* Value to return */ int nChange; /* Number of db changes made since last reset */ - int iStatement; /* Statement number (or 0 if has not opened stmt) */ + int iStatement; /* Statement number (or 0 if has no opened stmt) */ i64 iCurrentTime; /* Value of julianday('now') for this statement */ i64 nFkConstraint; /* Number of imm. FK constraints this VM */ i64 nStmtDefCons; /* Number of def. constraints when stmt started */ i64 nStmtDefImmCons; /* Number of def. imm constraints when stmt started */ + Mem *aMem; /* The memory locations */ + Mem **apArg; /* Arguments to currently executing user function */ + VdbeCursor **apCsr; /* One element of this array for each open cursor */ + Mem *aVar; /* Values for the OP_Variable opcode. */ /* When allocating a new Vdbe object, all of the fields below should be ** initialized to zero or NULL */ Op *aOp; /* Space to hold the virtual machine's program */ - Mem *aMem; /* The memory locations */ - Mem **apArg; /* Arguments to currently executing user function */ + int nOp; /* Number of instructions in the program */ + int nOpAlloc; /* Slots allocated for aOp[] */ Mem *aColName; /* Column names to return */ Mem *pResultSet; /* Pointer to an array of results */ char *zErrMsg; /* Error message written here */ - VdbeCursor **apCsr; /* One element of this array for each open cursor */ - Mem *aVar; /* Values for the OP_Variable opcode. */ VList *pVList; /* Name of variables */ #ifndef SQLITE_OMIT_TRACE i64 startTime; /* Time when query started - used for profiling */ #endif - int nOp; /* Number of instructions in the program */ #ifdef SQLITE_DEBUG int rcApp; /* errcode set by sqlite3_result_error_code() */ u32 nWrite; /* Number of write operations that have occurred */ @@ -408,6 +425,7 @@ struct Vdbe { char *zSql; /* Text of the SQL statement that generated this */ #ifdef SQLITE_ENABLE_NORMALIZE char *zNormSql; /* Normalization of the associated SQL statement */ + DblquoteStr *pDblStr; /* List of double-quoted string literals */ #endif void *pFree; /* Free this when deleting the vdbe */ VdbeFrame *pFrame; /* Parent frame */ diff --git a/sqlite/src/vdbeapi.c b/sqlite/src/vdbeapi.c index 59327bed..23b19273 100644 --- a/sqlite/src/vdbeapi.c +++ b/sqlite/src/vdbeapi.c @@ -62,14 +62,16 @@ static SQLITE_NOINLINE void invokeProfileCallback(sqlite3 *db, Vdbe *p){ sqlite3_int64 iNow; sqlite3_int64 iElapse; assert( p->startTime>0 ); - assert( db->xProfile!=0 || (db->mTrace & SQLITE_TRACE_PROFILE)!=0 ); + assert( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 ); assert( db->init.busy==0 ); assert( p->zSql!=0 ); sqlite3OsCurrentTimeInt64(db->pVfs, &iNow); iElapse = (iNow - p->startTime)*1000000; +#ifndef SQLITE_OMIT_DEPRECATED if( db->xProfile ){ db->xProfile(db->pProfileArg, p->zSql, iElapse); } +#endif if( db->mTrace & SQLITE_TRACE_PROFILE ){ db->xTrace(SQLITE_TRACE_PROFILE, db->pTraceArg, p, (void*)&iElapse); } @@ -583,7 +585,7 @@ static int sqlite3Step(Vdbe *p){ return SQLITE_NOMEM_BKPT; } - if( p->pc<=0 && p->expired ){ + if( p->pc<0 && p->expired ){ p->rc = SQLITE_SCHEMA; rc = SQLITE_ERROR; goto end_of_step; @@ -602,7 +604,7 @@ static int sqlite3Step(Vdbe *p){ ); #ifndef SQLITE_OMIT_TRACE - if( (db->xProfile || (db->mTrace & SQLITE_TRACE_PROFILE)!=0) + if( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 && !db->init.busy && p->zSql ){ sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime); }else{ @@ -629,16 +631,18 @@ static int sqlite3Step(Vdbe *p){ db->nVdbeExec--; } + if( rc!=SQLITE_ROW ){ #ifndef SQLITE_OMIT_TRACE - /* If the statement completed successfully, invoke the profile callback */ - if( rc!=SQLITE_ROW ) checkProfileCallback(db, p); + /* If the statement completed successfully, invoke the profile callback */ + checkProfileCallback(db, p); #endif - if( rc==SQLITE_DONE && db->autoCommit ){ - assert( p->rc==SQLITE_OK ); - p->rc = doWalCallbacks(db); - if( p->rc!=SQLITE_OK ){ - rc = SQLITE_ERROR; + if( rc==SQLITE_DONE && db->autoCommit ){ + assert( p->rc==SQLITE_OK ); + p->rc = doWalCallbacks(db); + if( p->rc!=SQLITE_OK ){ + rc = SQLITE_ERROR; + } } } @@ -658,9 +662,9 @@ static int sqlite3Step(Vdbe *p){ || (rc&0xff)==SQLITE_BUSY || rc==SQLITE_MISUSE ); assert( (p->rc!=SQLITE_ROW && p->rc!=SQLITE_DONE) || p->rc==p->rcApp ); - if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 - && rc!=SQLITE_ROW - && rc!=SQLITE_DONE + if( rc!=SQLITE_ROW + && rc!=SQLITE_DONE + && (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ){ /* If this statement was prepared using saved SQL and an ** error has occurred, then return the error code in p->rc to the @@ -1282,7 +1286,7 @@ static int vdbeUnbind(Vdbe *p, int i){ pVar = &p->aVar[i]; sqlite3VdbeMemRelease(pVar); pVar->flags = MEM_Null; - sqlite3Error(p->db, SQLITE_OK); + p->db->errCode = SQLITE_OK; /* If the bit corresponding to this variable in Vdbe.expmask is set, then ** binding a new value to this variable invalidates the current query plan. @@ -1708,7 +1712,13 @@ char *sqlite3_expanded_sql(sqlite3_stmt *pStmt){ */ const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt){ Vdbe *p = (Vdbe *)pStmt; - return p ? p->zNormSql : 0; + if( p==0 ) return 0; + if( p->zNormSql==0 && ALWAYS(p->zSql!=0) ){ + sqlite3_mutex_enter(p->db->mutex); + p->zNormSql = sqlite3Normalize(p, p->zSql); + sqlite3_mutex_leave(p->db->mutex); + } + return p->zNormSql; } #endif /* SQLITE_ENABLE_NORMALIZE */ diff --git a/sqlite/src/vdbeaux.c b/sqlite/src/vdbeaux.c index f1496a3a..aba75500 100644 --- a/sqlite/src/vdbeaux.c +++ b/sqlite/src/vdbeaux.c @@ -36,7 +36,7 @@ Vdbe *sqlite3VdbeCreate(Parse *pParse){ pParse->pVdbe = p; assert( pParse->aLabel==0 ); assert( pParse->nLabel==0 ); - assert( pParse->nOpAlloc==0 ); + assert( p->nOpAlloc==0 ); assert( pParse->szOpAlloc==0 ); sqlite3VdbeAddOp2(p, OP_Init, 0, 1); return p; @@ -64,14 +64,44 @@ 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 ); +/* +** Add a new element to the Vdbe->pDblStr list. +*/ +void sqlite3VdbeAddDblquoteStr(sqlite3 *db, Vdbe *p, const char *z){ + if( p ){ + int n = sqlite3Strlen30(z); + DblquoteStr *pStr = sqlite3DbMallocRawNN(db, + sizeof(*pStr)+n+1-sizeof(pStr->z)); + if( pStr ){ + pStr->pNextStr = p->pDblStr; + p->pDblStr = pStr; + memcpy(pStr->z, z, n+1); + } } +} #endif + +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** zId of length nId is a double-quoted identifier. Check to see if +** that identifier is really used as a string literal. +*/ +int sqlite3VdbeUsesDoubleQuotedString( + Vdbe *pVdbe, /* The prepared statement */ + const char *zId /* The double-quoted identifier, already dequoted */ +){ + DblquoteStr *pStr; + assert( zId!=0 ); + if( pVdbe->pDblStr==0 ) return 0; + for(pStr=pVdbe->pDblStr; pStr; pStr=pStr->pNextStr){ + if( strcmp(zId, pStr->z)==0 ) return 1; + } + return 0; } +#endif /* ** Swap all content between two VDBE structures. @@ -92,7 +122,7 @@ void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ zTmp = pA->zSql; pA->zSql = pB->zSql; pB->zSql = zTmp; -#ifdef SQLITE_ENABLE_NORMALIZE +#if 0 zTmp = pA->zNormSql; pA->zNormSql = pB->zNormSql; pB->zNormSql = zTmp; @@ -109,7 +139,7 @@ void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ ** to 1024/sizeof(Op). ** ** If an out-of-memory error occurs while resizing the array, return -** SQLITE_NOMEM. In this case Vdbe.aOp and Parse.nOpAlloc remain +** SQLITE_NOMEM. In this case Vdbe.aOp and Vdbe.nOpAlloc remain ** unchanged (this is so that any opcodes already allocated can be ** correctly deallocated along with the rest of the Vdbe). */ @@ -125,9 +155,9 @@ static int growOpArray(Vdbe *v, int nOp){ ** operation (without SQLITE_TEST_REALLOC_STRESS) is to double the current ** size of the op array or add 1KB of space, whichever is smaller. */ #ifdef SQLITE_TEST_REALLOC_STRESS - int nNew = (p->nOpAlloc>=512 ? p->nOpAlloc*2 : p->nOpAlloc+nOp); + int nNew = (v->nOpAlloc>=512 ? v->nOpAlloc*2 : v->nOpAlloc+nOp); #else - int nNew = (p->nOpAlloc ? p->nOpAlloc*2 : (int)(1024/sizeof(Op))); + int nNew = (v->nOpAlloc ? v->nOpAlloc*2 : (int)(1024/sizeof(Op))); UNUSED_PARAMETER(nOp); #endif @@ -138,11 +168,11 @@ static int growOpArray(Vdbe *v, int nOp){ } assert( nOp<=(1024/sizeof(Op)) ); - assert( nNew>=(p->nOpAlloc+nOp) ); + assert( nNew>=(v->nOpAlloc+nOp) ); pNew = sqlite3DbRealloc(p->db, v->aOp, nNew*sizeof(Op)); if( pNew ){ p->szOpAlloc = sqlite3DbMallocSize(p->db, pNew); - p->nOpAlloc = p->szOpAlloc/sizeof(Op); + v->nOpAlloc = p->szOpAlloc/sizeof(Op); v->aOp = pNew; } return (pNew ? SQLITE_OK : SQLITE_NOMEM_BKPT); @@ -176,9 +206,9 @@ static void test_addop_breakpoint(void){ ** operand. */ static SQLITE_NOINLINE int growOp3(Vdbe *p, int op, int p1, int p2, int p3){ - assert( p->pParse->nOpAlloc<=p->nOp ); + assert( p->nOpAlloc<=p->nOp ); if( growOpArray(p, 1) ) return 1; - assert( p->pParse->nOpAlloc>p->nOp ); + assert( p->nOpAlloc>p->nOp ); return sqlite3VdbeAddOp3(p, op, p1, p2, p3); } int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ @@ -188,7 +218,7 @@ int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ i = p->nOp; assert( p->magic==VDBE_MAGIC_INIT ); assert( op>=0 && op<0xff ); - if( p->pParse->nOpAlloc<=i ){ + if( p->nOpAlloc<=i ){ return growOp3(p, op, p1, p2, p3); } p->nOp++; @@ -320,13 +350,29 @@ int sqlite3VdbeExplainParent(Parse *pParse){ } /* -** Add a new OP_Explain opcode. +** Set a debugger breakpoint on the following routine in order to +** monitor the EXPLAIN QUERY PLAN code generation. +*/ +#if defined(SQLITE_DEBUG) +void sqlite3ExplainBreakpoint(const char *z1, const char *z2){ + (void)z1; + (void)z2; +} +#endif + +/* +** Add a new OP_ opcode. ** ** If the bPush flag is true, then make this opcode the parent for ** subsequent Explains until sqlite3VdbeExplainPop() is called. */ void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){ - if( pParse->explain==2 ){ +#ifndef SQLITE_DEBUG + /* Always include the OP_Explain opcodes if SQLITE_DEBUG is defined. + ** But omit them (for performance) during production builds */ + if( pParse->explain==2 ) +#endif + { char *zMsg; Vdbe *v; va_list ap; @@ -338,7 +384,10 @@ void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){ iThis = v->nOp; sqlite3VdbeAddOp4(v, OP_Explain, iThis, pParse->addrExplain, 0, zMsg, P4_DYNAMIC); - if( bPush) pParse->addrExplain = iThis; + sqlite3ExplainBreakpoint(bPush?"PUSH":"", sqlite3VdbeGetOp(v,-1)->p4.z); + if( bPush){ + pParse->addrExplain = iThis; + } } } @@ -346,6 +395,7 @@ void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){ ** Pop the EXPLAIN QUERY PLAN stack one level. */ void sqlite3VdbeExplainPop(Parse *pParse){ + sqlite3ExplainBreakpoint("POP", 0); pParse->addrExplain = sqlite3VdbeExplainParent(pParse); } #endif /* SQLITE_OMIT_EXPLAIN */ @@ -410,21 +460,22 @@ void sqlite3VdbeEndCoroutine(Vdbe *v, int regYield){ ** The VDBE knows that a P2 value is a label because labels are ** always negative and P2 values are suppose to be non-negative. ** Hence, a negative P2 value is a label that has yet to be resolved. +** (Later:) This is only true for opcodes that have the OPFLG_JUMP +** property. +** +** Variable usage notes: ** -** Zero is returned if a malloc() fails. +** Parse.aLabel[x] Stores the address that the x-th label resolves +** into. For testing (SQLITE_DEBUG), unresolved +** labels stores -1, but that is not required. +** Parse.nLabelAlloc Number of slots allocated to Parse.aLabel[] +** Parse.nLabel The *negative* of the number of labels that have +** been issued. The negative is stored because +** that gives a performance improvement over storing +** the equivalent positive value. */ -int sqlite3VdbeMakeLabel(Vdbe *v){ - Parse *p = v->pParse; - int i = p->nLabel++; - assert( v->magic==VDBE_MAGIC_INIT ); - if( (i & (i-1))==0 ){ - p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, - (i*2+1)*sizeof(p->aLabel[0])); - } - if( p->aLabel ){ - p->aLabel[i] = -1; - } - return ADDR(i); +int sqlite3VdbeMakeLabel(Parse *pParse){ + return --pParse->nLabel; } /* @@ -432,18 +483,35 @@ int sqlite3VdbeMakeLabel(Vdbe *v){ ** be inserted. The parameter "x" must have been obtained from ** a prior call to sqlite3VdbeMakeLabel(). */ +static SQLITE_NOINLINE void resizeResolveLabel(Parse *p, Vdbe *v, int j){ + int nNewSize = 10 - p->nLabel; + p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, + nNewSize*sizeof(p->aLabel[0])); + if( p->aLabel==0 ){ + p->nLabelAlloc = 0; + }else{ +#ifdef SQLITE_DEBUG + int i; + for(i=p->nLabelAlloc; iaLabel[i] = -1; +#endif + p->nLabelAlloc = nNewSize; + p->aLabel[j] = v->nOp; + } +} void sqlite3VdbeResolveLabel(Vdbe *v, int x){ Parse *p = v->pParse; int j = ADDR(x); assert( v->magic==VDBE_MAGIC_INIT ); - assert( jnLabel ); + assert( j<-p->nLabel ); assert( j>=0 ); - if( p->aLabel ){ #ifdef SQLITE_DEBUG - if( p->db->flags & SQLITE_VdbeAddopTrace ){ - printf("RESOLVE LABEL %d to %d\n", x, v->nOp); - } + if( p->db->flags & SQLITE_VdbeAddopTrace ){ + printf("RESOLVE LABEL %d to %d\n", x, v->nOp); + } #endif + if( p->nLabelAlloc + p->nLabel < 0 ){ + resizeResolveLabel(p,v,j); + }else{ assert( p->aLabel[j]==(-1) ); /* Labels may only be resolved once */ p->aLabel[j] = v->nOp; } @@ -568,8 +636,9 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ while( (pOp = opIterNext(&sIter))!=0 ){ int opcode = pOp->opcode; if( opcode==OP_Destroy || opcode==OP_VUpdate || opcode==OP_VRename + || opcode==OP_VDestroy || ((opcode==OP_Halt || opcode==OP_HaltIfNull) - && ((pOp->p1&0xff)==SQLITE_CONSTRAINT && pOp->p2==OE_Abort)) + && ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort)) ){ hasAbort = 1; break; @@ -718,7 +787,7 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ ** non-jump opcodes less than SQLITE_MX_JUMP_CODE are guaranteed to ** have non-negative values for P2. */ assert( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)!=0 ); - assert( ADDR(pOp->p2)nLabel ); + assert( ADDR(pOp->p2)<-pParse->nLabel ); pOp->p2 = aLabel[ADDR(pOp->p2)]; } break; @@ -757,7 +826,7 @@ int sqlite3VdbeCurrentAddr(Vdbe *p){ */ #if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) void sqlite3VdbeVerifyNoMallocRequired(Vdbe *p, int N){ - assert( p->nOp + N <= p->pParse->nOpAlloc ); + assert( p->nOp + N <= p->nOpAlloc ); } #endif @@ -829,7 +898,7 @@ VdbeOp *sqlite3VdbeAddOpList( VdbeOp *pOut, *pFirst; assert( nOp>0 ); assert( p->magic==VDBE_MAGIC_INIT ); - if( p->nOp + nOp > p->pParse->nOpAlloc && growOpArray(p, nOp) ){ + if( p->nOp + nOp > p->nOpAlloc && growOpArray(p, nOp) ){ return 0; } pFirst = pOut = &p->aOp[p->nOp]; @@ -2151,19 +2220,27 @@ void sqlite3VdbeMakeReady( ** the leftover memory at the end of the opcode array. This can significantly ** reduce the amount of memory held by a prepared statement. */ - do { - x.nNeeded = 0; - p->aMem = allocSpace(&x, p->aMem, nMem*sizeof(Mem)); - p->aVar = allocSpace(&x, p->aVar, nVar*sizeof(Mem)); - p->apArg = allocSpace(&x, p->apArg, nArg*sizeof(Mem*)); - p->apCsr = allocSpace(&x, p->apCsr, nCursor*sizeof(VdbeCursor*)); + x.nNeeded = 0; + p->aMem = allocSpace(&x, 0, nMem*sizeof(Mem)); + p->aVar = allocSpace(&x, 0, nVar*sizeof(Mem)); + p->apArg = allocSpace(&x, 0, nArg*sizeof(Mem*)); + p->apCsr = allocSpace(&x, 0, nCursor*sizeof(VdbeCursor*)); #ifdef SQLITE_ENABLE_STMT_SCANSTATUS - p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64)); + p->anExec = allocSpace(&x, 0, p->nOp*sizeof(i64)); #endif - if( x.nNeeded==0 ) break; + if( x.nNeeded ){ x.pSpace = p->pFree = sqlite3DbMallocRawNN(db, x.nNeeded); x.nFree = x.nNeeded; - }while( !db->mallocFailed ); + if( !db->mallocFailed ){ + p->aMem = allocSpace(&x, p->aMem, nMem*sizeof(Mem)); + p->aVar = allocSpace(&x, p->aVar, nVar*sizeof(Mem)); + p->apArg = allocSpace(&x, p->apArg, nArg*sizeof(Mem*)); + p->apCsr = allocSpace(&x, p->apCsr, nCursor*sizeof(VdbeCursor*)); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64)); +#endif + } + } p->pVList = pParse->pVList; pParse->pVList = 0; @@ -2855,7 +2932,7 @@ int sqlite3VdbeHalt(Vdbe *p){ }else{ db->nDeferredCons = 0; db->nDeferredImmCons = 0; - db->flags &= ~SQLITE_DeferFKs; + db->flags &= ~(u64)SQLITE_DeferFKs; sqlite3CommitInternalChanges(db); } }else{ @@ -3170,6 +3247,13 @@ void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ sqlite3DbFree(db, p->zSql); #ifdef SQLITE_ENABLE_NORMALIZE sqlite3DbFree(db, p->zNormSql); + { + DblquoteStr *pThis, *pNext; + for(pThis=p->pDblStr; pThis; pThis=pNext){ + pNext = pThis->pNextStr; + sqlite3DbFree(db, pThis); + } + } #endif #ifdef SQLITE_ENABLE_STMT_SCANSTATUS { @@ -3710,7 +3794,7 @@ void sqlite3VdbeRecordUnpack( UnpackedRecord *p /* Populate this structure before returning. */ ){ const unsigned char *aKey = (const unsigned char *)pKey; - int d; + u32 d; u32 idx; /* Offset in aKey[] to read from */ u16 u; /* Unsigned loop counter */ u32 szHdr; @@ -3721,7 +3805,7 @@ void sqlite3VdbeRecordUnpack( idx = getVarint32(aKey, szHdr); d = szHdr; u = 0; - while( idx=p->nField ) break; } + if( d>(u32)nKey && u ){ + assert( CORRUPT_DB ); + /* In a corrupt record entry, the last pMem might have been set up using + ** uninitialized memory. Overwrite its value with NULL, to prevent + ** warnings from MSAN. */ + sqlite3VdbeMemSetNull(pMem-1); + } assert( u<=pKeyInfo->nKeyField + 1 ); p->nField = u; } @@ -3799,8 +3890,8 @@ static int vdbeRecordCompareDebug( ** Use that approximation to avoid the more expensive call to ** sqlite3VdbeSerialTypeLen() in the common case. */ - if( d1+serial_type1+2>(u32)nKey1 - && d1+sqlite3VdbeSerialTypeLen(serial_type1)>(u32)nKey1 + if( d1+(u64)serial_type1+2>(u64)nKey1 + && d1+(u64)sqlite3VdbeSerialTypeLen(serial_type1)>(u64)nKey1 ){ break; } @@ -3811,7 +3902,8 @@ static int vdbeRecordCompareDebug( /* Do the comparison */ - rc = sqlite3MemCompare(&mem1, &pPKey2->aMem[i], pKeyInfo->aColl[i]); + rc = sqlite3MemCompare(&mem1, &pPKey2->aMem[i], + pKeyInfo->nAllField>i ? pKeyInfo->aColl[i] : 0); if( rc!=0 ){ assert( mem1.szMalloc==0 ); /* See comment below */ if( pKeyInfo->aSortOrder[i] ){ @@ -4167,12 +4259,12 @@ int sqlite3VdbeRecordCompareWithSkip( }else{ idx1 = getVarint32(aKey1, szHdr1); d1 = szHdr1; - if( d1>(unsigned)nKey1 ){ - pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; - return 0; /* Corruption */ - } i = 0; } + if( d1>(unsigned)nKey1 ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + } VVA_ONLY( mem1.szMalloc = 0; ) /* Only needed by assert() statements */ assert( pPKey2->pKeyInfo->nAllField>=pPKey2->nField @@ -4242,10 +4334,12 @@ int sqlite3VdbeRecordCompareWithSkip( mem1.n = (serial_type - 12) / 2; testcase( (d1+mem1.n)==(unsigned)nKey1 ); testcase( (d1+mem1.n+1)==(unsigned)nKey1 ); - if( (d1+mem1.n) > (unsigned)nKey1 ){ + if( (d1+mem1.n) > (unsigned)nKey1 + || (pKeyInfo = pPKey2->pKeyInfo)->nAllField<=i + ){ pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; return 0; /* Corruption */ - }else if( (pKeyInfo = pPKey2->pKeyInfo)->aColl[i] ){ + }else if( pKeyInfo->aColl[i] ){ mem1.enc = pKeyInfo->enc; mem1.db = pKeyInfo->db; mem1.flags = MEM_Str; diff --git a/sqlite/src/vdbemem.c b/sqlite/src/vdbemem.c index db8feddf..5aa0ec6c 100644 --- a/sqlite/src/vdbemem.c +++ b/sqlite/src/vdbemem.c @@ -243,7 +243,7 @@ SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){ ** if unable to complete the resizing. */ int sqlite3VdbeMemClearAndResize(Mem *pMem, int szNew){ - assert( szNew>0 ); + assert( CORRUPT_DB || szNew>0 ); assert( (pMem->flags & MEM_Dyn)==0 || pMem->szMalloc==0 ); if( pMem->szMallocflags = MEM_Null; + if( sqlite3BtreeMaxRecordSize(pCur)z); if( rc==SQLITE_OK ){ @@ -1530,9 +1533,11 @@ static int valueFromExpr( } #endif else if( op==TK_TRUEFALSE ){ - pVal = valueNew(db, pCtx); - pVal->flags = MEM_Int; - pVal->u.i = pExpr->u.zToken[4]==0; + pVal = valueNew(db, pCtx); + if( pVal ){ + pVal->flags = MEM_Int; + pVal->u.i = pExpr->u.zToken[4]==0; + } } *ppVal = pVal; diff --git a/sqlite/src/vtab.c b/sqlite/src/vtab.c index 1b8d2832..8814b5f4 100644 --- a/sqlite/src/vtab.c +++ b/sqlite/src/vtab.c @@ -1001,6 +1001,7 @@ int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ const sqlite3_module *pMod = pVTab->pMod->pModule; if( pVTab->pVtab && pMod->iVersion>=2 ){ int (*xMethod)(sqlite3_vtab *, int); + sqlite3VtabLock(pVTab); switch( op ){ case SAVEPOINT_BEGIN: xMethod = pMod->xSavepoint; @@ -1016,6 +1017,7 @@ int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ if( xMethod && pVTab->iSavepoint>iSavepoint ){ rc = xMethod(pVTab->pVtab, iSavepoint); } + sqlite3VtabUnlock(pVTab); } } } diff --git a/sqlite/src/walker.c b/sqlite/src/walker.c index c31d94f0..eff35852 100644 --- a/sqlite/src/walker.c +++ b/sqlite/src/walker.c @@ -17,6 +17,22 @@ #include +#if !defined(SQLITE_OMIT_WINDOWFUNC) +/* +** Walk all expressions linked into the list of Window objects passed +** as the second argument. +*/ +static int walkWindowList(Walker *pWalker, Window *pList){ + Window *pWin; + for(pWin=pList; pWin; pWin=pWin->pNextWin){ + if( sqlite3WalkExprList(pWalker, pWin->pOrderBy) ) return WRC_Abort; + if( sqlite3WalkExprList(pWalker, pWin->pPartition) ) return WRC_Abort; + if( sqlite3WalkExpr(pWalker, pWin->pFilter) ) return WRC_Abort; + } + return WRC_Continue; +} +#endif + /* ** Walk an expression tree. Invoke the callback once for each node ** of the expression, while descending. (In other words, the callback @@ -56,10 +72,7 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ } #ifndef SQLITE_OMIT_WINDOWFUNC 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; + if( walkWindowList(pWalker, pExpr->y.pWin) ) return WRC_Abort; } #endif } @@ -99,6 +112,16 @@ int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){ if( sqlite3WalkExpr(pWalker, p->pHaving) ) return WRC_Abort; if( sqlite3WalkExprList(pWalker, p->pOrderBy) ) return WRC_Abort; if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort; +#if !defined(SQLITE_OMIT_WINDOWFUNC) && !defined(SQLITE_OMIT_ALTERTABLE) + { + Parse *pParse = pWalker->pParse; + if( pParse && IN_RENAME_OBJECT ){ + int rc = walkWindowList(pWalker, p->pWinDefn); + assert( rc==WRC_Continue ); + return rc; + } + } +#endif return WRC_Continue; } diff --git a/sqlite/src/where.c b/sqlite/src/where.c index 8e016604..a09f7624 100644 --- a/sqlite/src/where.c +++ b/sqlite/src/where.c @@ -310,6 +310,17 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ return 0; } +/* +** This is whereScanInit() for the case of an index on an expression. +** It is factored out into a separate tail-recursion subroutine so that +** the normal whereScanInit() routine, which is a high-runner, does not +** need to push registers onto the stack as part of its prologue. +*/ +static SQLITE_NOINLINE WhereTerm *whereScanInitIndexExpr(WhereScan *pScan){ + pScan->idxaff = sqlite3ExprAffinity(pScan->pIdxExpr); + return whereScanNext(pScan); +} + /* ** Initialize a WHERE clause scanner object. Return a pointer to the ** first match. Return NULL if there are no matches. @@ -342,12 +353,19 @@ static WhereTerm *whereScanInit( pScan->pIdxExpr = 0; pScan->idxaff = 0; pScan->zCollName = 0; + pScan->opMask = opMask; + pScan->k = 0; + pScan->aiCur[0] = iCur; + pScan->nEquiv = 1; + pScan->iEquiv = 1; if( pIdx ){ int j = iColumn; iColumn = pIdx->aiColumn[j]; if( iColumn==XN_EXPR ){ pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; pScan->zCollName = pIdx->azColl[j]; + pScan->aiColumn[0] = XN_EXPR; + return whereScanInitIndexExpr(pScan); }else if( iColumn==pIdx->pTable->iPKey ){ iColumn = XN_ROWID; }else if( iColumn>=0 ){ @@ -357,12 +375,7 @@ static WhereTerm *whereScanInit( }else if( iColumn==XN_EXPR ){ return 0; } - pScan->opMask = opMask; - pScan->k = 0; - pScan->aiCur[0] = iCur; pScan->aiColumn[0] = iColumn; - pScan->nEquiv = 1; - pScan->iEquiv = 1; return whereScanNext(pScan); } @@ -837,7 +850,7 @@ static void constructAutomaticIndex( addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); VdbeCoverage(v); } if( pPartial ){ - iContinue = sqlite3VdbeMakeLabel(v); + iContinue = sqlite3VdbeMakeLabel(pParse); sqlite3ExprIfFalse(pParse, pPartial, iContinue, SQLITE_JUMPIFNULL); pLoop->wsFlags |= WHERE_PARTIALIDX; } @@ -854,6 +867,7 @@ 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); } @@ -2209,7 +2223,7 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ rc = whereLoopXfer(db, p, pTemplate); if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ Index *pIndex = p->u.btree.pIndex; - if( pIndex && pIndex->tnum==0 ){ + if( pIndex && pIndex->idxType==SQLITE_IDXTYPE_IPK ){ p->u.btree.pIndex = 0; } } @@ -2376,8 +2390,8 @@ static int whereRangeVectorLen( ** terms only. If it is modified, this value is restored before this ** function returns. ** -** If pProbe->tnum==0, that means pIndex is a fake index used for the -** INTEGER PRIMARY KEY. +** If pProbe->idxType==SQLITE_IDXTYPE_IPK, that means pIndex is +** a fake index used for the INTEGER PRIMARY KEY. */ static int whereLoopAddBtreeIndex( WhereLoopBuilder *pBuilder, /* The WhereLoop factory */ @@ -2877,6 +2891,7 @@ static int whereLoopAddBtree( sPk.onError = OE_Replace; sPk.pTable = pTab; sPk.szIdxRow = pTab->szTabRow; + sPk.idxType = SQLITE_IDXTYPE_IPK; aiRowEstPk[0] = pTab->nRowLogEst; aiRowEstPk[1] = 0; pFirst = pSrc->pTab->pIndex; @@ -2967,7 +2982,7 @@ static int whereLoopAddBtree( b = indexMightHelpWithOrderBy(pBuilder, pProbe, pSrc->iCursor); /* The ONEPASS_DESIRED flags never occurs together with ORDER BY */ assert( (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || b==0 ); - if( pProbe->tnum<=0 ){ + if( pProbe->idxType==SQLITE_IDXTYPE_IPK ){ /* Integer primary key index */ pNew->wsFlags = WHERE_IPK; @@ -4643,7 +4658,7 @@ WhereInfo *sqlite3WhereBegin( pWInfo->pResultSet = pResultSet; pWInfo->aiCurOnePass[0] = pWInfo->aiCurOnePass[1] = -1; pWInfo->nLevel = nTabList; - pWInfo->iBreak = pWInfo->iContinue = sqlite3VdbeMakeLabel(v); + pWInfo->iBreak = pWInfo->iContinue = sqlite3VdbeMakeLabel(pParse); pWInfo->wctrlFlags = wctrlFlags; pWInfo->iLimit = iAuxArg; pWInfo->savedNQueryLoop = pParse->nQueryLoop; @@ -4917,9 +4932,10 @@ WhereInfo *sqlite3WhereBegin( if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 ){ int wsFlags = pWInfo->a[0].pWLoop->wsFlags; int bOnerow = (wsFlags & WHERE_ONEROW)!=0; + assert( !(wsFlags & WHERE_VIRTUALTABLE) || IsVirtual(pTabList->a[0].pTab) ); if( bOnerow || ( 0!=(wctrlFlags & WHERE_ONEPASS_MULTIROW) - && 0==(wsFlags & WHERE_VIRTUALTABLE) + && !IsVirtual(pTabList->a[0].pTab) && (0==(wsFlags & WHERE_MULTI_OR) || (wctrlFlags & WHERE_DUPLICATES_OK)) )){ pWInfo->eOnePass = bOnerow ? ONEPASS_SINGLE : ONEPASS_MULTI; @@ -5074,7 +5090,7 @@ WhereInfo *sqlite3WhereBegin( pParse, pTabList, pLevel, wctrlFlags ); pLevel->addrBody = sqlite3VdbeCurrentAddr(v); - notReady = sqlite3WhereCodeOneLoopStart(pWInfo, ii, notReady); + notReady = sqlite3WhereCodeOneLoopStart(pParse,v,pWInfo,ii,pLevel,notReady); pWInfo->iContinue = pLevel->addrCont; if( (wsFlags&WHERE_MULTI_OR)==0 && (wctrlFlags&WHERE_OR_SUBCLAUSE)==0 ){ sqlite3WhereAddScanStatus(v, pTabList, pLevel, addrExplain); @@ -5259,6 +5275,29 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ continue; } +#ifdef SQLITE_ENABLE_EARLY_CURSOR_CLOSE + /* Close all of the cursors that were opened by sqlite3WhereBegin. + ** Except, do not close cursors that will be reused by the OR optimization + ** (WHERE_OR_SUBCLAUSE). And do not close the OP_OpenWrite cursors + ** created for the ONEPASS optimization. + */ + if( (pTab->tabFlags & TF_Ephemeral)==0 + && pTab->pSelect==0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + ){ + int ws = pLoop->wsFlags; + if( pWInfo->eOnePass==ONEPASS_OFF && (ws & WHERE_IDX_ONLY)==0 ){ + sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor); + } + if( (ws & WHERE_INDEXED)!=0 + && (ws & (WHERE_IPK|WHERE_AUTO_INDEX))==0 + && pLevel->iIdxCur!=pWInfo->aiCurOnePass[1] + ){ + sqlite3VdbeAddOp1(v, OP_Close, pLevel->iIdxCur); + } + } +#endif + /* If this scan uses an index, make VDBE code substitutions to read data ** from the index instead of from the table where possible. In some cases ** this optimization prevents the table from ever being read, which can diff --git a/sqlite/src/whereInt.h b/sqlite/src/whereInt.h index 209ac42e..07876f43 100644 --- a/sqlite/src/whereInt.h +++ b/sqlite/src/whereInt.h @@ -507,8 +507,11 @@ void sqlite3WhereAddScanStatus( # define sqlite3WhereAddScanStatus(a, b, c, d) ((void)d) #endif Bitmask sqlite3WhereCodeOneLoopStart( + Parse *pParse, /* Parsing context */ + Vdbe *v, /* Prepared statement under construction */ WhereInfo *pWInfo, /* Complete information about the WHERE clause */ int iLevel, /* Which level of pWInfo->a[] should be coded */ + WhereLevel *pLevel, /* The current level pointer */ Bitmask notReady /* Which tables are currently available */ ); diff --git a/sqlite/src/wherecode.c b/sqlite/src/wherecode.c index e371cb85..79189386 100644 --- a/sqlite/src/wherecode.c +++ b/sqlite/src/wherecode.c @@ -213,6 +213,7 @@ int sqlite3WhereExplainOneScan( } #endif zMsg = sqlite3StrAccumFinish(&str); + sqlite3ExplainBreakpoint("",zMsg); ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v), pParse->addrExplain, 0, zMsg,P4_DYNAMIC); } @@ -538,16 +539,17 @@ static int codeEqualityTerm( if( pLoop->aLTerm[i]->pExpr==pX ) nEq++; } + iTab = 0; if( (pX->flags & EP_xIsSelect)==0 || pX->x.pSelect->pEList->nExpr==1 ){ - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0); + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); }else{ sqlite3 *db = pParse->db; pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); if( !db->mallocFailed ){ aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap); - pTerm->pExpr->iTable = pX->iTable; + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab); + pTerm->pExpr->iTable = iTab; } sqlite3ExprDelete(db, pX); pX = pTerm->pExpr; @@ -557,7 +559,6 @@ static int codeEqualityTerm( testcase( bRev ); bRev = !bRev; } - iTab = pX->iTable; sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iTab, 0); VdbeCoverageIf(v, bRev); VdbeCoverageIf(v, !bRev); @@ -565,7 +566,7 @@ static int codeEqualityTerm( pLoop->wsFlags |= WHERE_IN_ABLE; if( pLevel->u.in.nIn==0 ){ - pLevel->addrNxt = sqlite3VdbeMakeLabel(v); + pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse); } i = pLevel->u.in.nIn; @@ -581,7 +582,6 @@ static int codeEqualityTerm( if( pLoop->aLTerm[i]->pExpr==pX ){ int iOut = iReg + i - iEq; if( eType==IN_INDEX_ROWID ){ - testcase( nEq>1 ); /* Happens with a UNIQUE index on ROWID */ pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iOut); }else{ int iCol = aiMap ? aiMap[iMap++] : 0; @@ -1076,7 +1076,9 @@ static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){ #ifndef SQLITE_OMIT_SUBQUERY if( (p->flags & EP_xIsSelect) ){ Vdbe *v = pParse->pVdbe; - int iSelect = sqlite3CodeSubselect(pParse, p, 0, 0); + int iSelect; + assert( p->op==TK_SELECT ); + iSelect = sqlite3CodeSubselect(pParse, p); sqlite3VdbeAddOp3(v, OP_Copy, iSelect, iReg, nReg-1); }else #endif @@ -1162,22 +1164,21 @@ static void whereIndexExprTrans( ** implementation described by pWInfo. */ Bitmask sqlite3WhereCodeOneLoopStart( + Parse *pParse, /* Parsing context */ + Vdbe *v, /* Prepared statement under construction */ WhereInfo *pWInfo, /* Complete information about the WHERE clause */ int iLevel, /* Which level of pWInfo->a[] should be coded */ + WhereLevel *pLevel, /* The current level pointer */ Bitmask notReady /* Which tables are currently available */ ){ int j, k; /* Loop counters */ int iCur; /* The VDBE cursor for the table */ int addrNxt; /* Where to jump to continue with the next IN case */ - int omitTable; /* True if we use the index only */ int bRev; /* True if we need to scan in reverse order */ - WhereLevel *pLevel; /* The where level to be coded */ WhereLoop *pLoop; /* The WhereLoop object being coded */ WhereClause *pWC; /* Decomposition of the entire WHERE clause */ WhereTerm *pTerm; /* A WHERE clause term */ - Parse *pParse; /* Parsing context */ sqlite3 *db; /* Database connection */ - Vdbe *v; /* The prepared stmt under constructions */ struct SrcList_item *pTabItem; /* FROM clause term being coded */ int addrBrk; /* Jump here to break out of the loop */ int addrHalt; /* addrBrk for the outermost loop */ @@ -1187,18 +1188,13 @@ Bitmask sqlite3WhereCodeOneLoopStart( Index *pIdx = 0; /* Index used by loop (if any) */ int iLoop; /* Iteration of constraint generator loop */ - pParse = pWInfo->pParse; - v = pParse->pVdbe; pWC = &pWInfo->sWC; db = pParse->db; - pLevel = &pWInfo->a[iLevel]; pLoop = pLevel->pWLoop; pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; iCur = pTabItem->iCursor; pLevel->notReady = notReady & ~sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); bRev = (pWInfo->revMask>>iLevel)&1; - omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 - && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0; VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName)); /* Create labels for the "break" and "continue" instructions @@ -1211,8 +1207,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( ** there are no IN operators in the constraints, the "addrNxt" label ** is the same as "addrBrk". */ - addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(v); - addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(v); + addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse); + addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(pParse); /* If this is the right table of a LEFT OUTER JOIN, allocate and ** initialize a memory cell that records if this table matches any @@ -1339,7 +1335,6 @@ Bitmask sqlite3WhereCodeOneLoopStart( pTerm = pLoop->aLTerm[0]; assert( pTerm!=0 ); assert( pTerm->pExpr!=0 ); - assert( omitTable==0 ); testcase( pTerm->wtFlags & TERM_VIRTUAL ); iReleaseReg = ++pParse->nMem; iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, 0, bRev, iReleaseReg); @@ -1348,6 +1343,9 @@ Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg); VdbeCoverage(v); pLevel->op = OP_Noop; + if( (pTerm->prereqAll & pLevel->notReady)==0 ){ + pTerm->wtFlags |= TERM_CODED; + } }else if( (pLoop->wsFlags & WHERE_IPK)!=0 && (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0 ){ @@ -1358,7 +1356,6 @@ Bitmask sqlite3WhereCodeOneLoopStart( int memEndValue = 0; WhereTerm *pStart, *pEnd; - assert( omitTable==0 ); j = 0; pStart = pEnd = 0; if( pLoop->wsFlags & WHERE_BTM_LIMIT ) pStart = pLoop->aLTerm[j++]; @@ -1522,6 +1519,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( char *zEndAff = 0; /* Affinity for end of range constraint */ u8 bSeekPastNull = 0; /* True to seek past initial nulls */ u8 bStopAtNull = 0; /* Add condition to terminate at NULLs */ + int omitTable; /* True if we use the index only */ + pIdx = pLoop->u.btree.pIndex; iIdxCur = pLevel->iIdxCur; @@ -1723,6 +1722,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( } /* Seek the table cursor, if required */ + omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0; if( omitTable ){ /* pIdx is a covering index. No need to access the main table. */ }else if( HasRowid(pIdx->pTable) ){ @@ -1757,8 +1758,13 @@ Bitmask sqlite3WhereCodeOneLoopStart( ** the cursor. In this case it is important to do the full evaluation, ** as the result of the expression may not be NULL, even if all table ** column values are. https://www.sqlite.org/src/info/7fa8049685b50b5a + ** + ** Also, do not do this when processing one index an a multi-index + ** OR clause, since the transformation will become invalid once we + ** move forward to the next index. + ** https://sqlite.org/src/info/4e8e4857d32d401f */ - if( pLevel->iLeftJoin==0 ){ + if( pLevel->iLeftJoin==0 && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo); } @@ -1833,7 +1839,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( int regReturn = ++pParse->nMem; /* Register used with OP_Gosub */ int regRowset = 0; /* Register for RowSet object */ int regRowid = 0; /* Register holding rowid */ - int iLoopBody = sqlite3VdbeMakeLabel(v); /* Start of loop body */ + int iLoopBody = sqlite3VdbeMakeLabel(pParse);/* Start of loop body */ int iRetInit; /* Address of regReturn init */ int untestedTerms = 0; /* Some terms not completely tested */ int ii; /* Loop counter */ @@ -1949,6 +1955,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( pOrExpr = pAndExpr; } /* Loop through table entries that match term pOrTerm. */ + ExplainQueryPlan((pParse, 1, "INDEX %d", ii+1)); WHERETRACE(0xffff, ("Subplan for OR-clause:\n")); pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0, wctrlFlags, iCovCur); @@ -2052,6 +2059,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( /* Finish the loop through table entries that match term pOrTerm. */ sqlite3WhereEnd(pSubWInfo); + ExplainQueryPlanPop(pParse); } } } diff --git a/sqlite/src/whereexpr.c b/sqlite/src/whereexpr.c index dbb7f0d0..db0a38d6 100644 --- a/sqlite/src/whereexpr.c +++ b/sqlite/src/whereexpr.c @@ -777,6 +777,7 @@ static void exprAnalyzeOrTerm( ** and column is found but leave okToChngToIN false if not found. */ for(j=0; j<2 && !okToChngToIN; j++){ + Expr *pLeft = 0; pOrTerm = pOrWc->a; for(i=pOrWc->nTerm-1; i>=0; i--, pOrTerm++){ assert( pOrTerm->eOperator & WO_EQ ); @@ -800,6 +801,7 @@ static void exprAnalyzeOrTerm( } iColumn = pOrTerm->u.leftColumn; iCursor = pOrTerm->leftCursor; + pLeft = pOrTerm->pExpr->pLeft; break; } if( i<0 ){ @@ -819,7 +821,9 @@ static void exprAnalyzeOrTerm( assert( pOrTerm->eOperator & WO_EQ ); if( pOrTerm->leftCursor!=iCursor ){ pOrTerm->wtFlags &= ~TERM_OR_OK; - }else if( pOrTerm->u.leftColumn!=iColumn ){ + }else if( pOrTerm->u.leftColumn!=iColumn || (iColumn==XN_EXPR + && sqlite3ExprCompare(pParse, pOrTerm->pExpr->pLeft, pLeft, -1) + )){ okToChngToIN = 0; }else{ int affLeft, affRight; diff --git a/sqlite/src/window.c b/sqlite/src/window.c index f5deae9a..b0d28c49 100644 --- a/sqlite/src/window.c +++ b/sqlite/src/window.c @@ -823,8 +823,7 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ pSub = sqlite3SelectNew( pParse, pSublist, pSrc, pWhere, pGroupBy, pHaving, pSort, 0, 0 ); - p->pSrc = sqlite3SrcListAppend(db, 0, 0, 0); - assert( p->pSrc || db->mallocFailed ); + p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( p->pSrc ){ p->pSrc->a[0].pSelect = pSub; sqlite3SrcListAssignCursors(pParse, p->pSrc); @@ -881,6 +880,7 @@ void sqlite3WindowListDelete(sqlite3 *db, Window *p){ */ static Expr *sqlite3WindowOffsetExpr(Parse *pParse, Expr *pExpr){ if( 0==sqlite3ExprIsConstant(pExpr) ){ + if( IN_RENAME_OBJECT ) sqlite3RenameExprUnmap(pParse, pExpr); sqlite3ExprDelete(pParse->db, pExpr); pExpr = sqlite3ExprAlloc(pParse->db, TK_NULL, 0, 0); } @@ -1075,6 +1075,7 @@ static void windowCheckIntValue(Parse *pParse, int reg, int eCond){ VdbeCoverageNeverNullIf(v, eCond==0); VdbeCoverageNeverNullIf(v, eCond==1); VdbeCoverageNeverNullIf(v, eCond==2); + sqlite3MayAbort(pParse); sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_ERROR, OE_Abort); sqlite3VdbeAppendP4(v, (void*)azErr[eCond], P4_STATIC); sqlite3ReleaseTempReg(pParse, regZero); @@ -1330,7 +1331,7 @@ static void windowReturnOneRow( || pFunc->zName==first_valueName ){ int csr = pWin->csrApp; - int lbl = sqlite3VdbeMakeLabel(v); + int lbl = sqlite3VdbeMakeLabel(pParse); int tmpReg = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); @@ -1353,7 +1354,7 @@ static void windowReturnOneRow( int nArg = pWin->pOwner->x.pList->nExpr; int iEph = pMWin->iEphCsr; int csr = pWin->csrApp; - int lbl = sqlite3VdbeMakeLabel(v); + int lbl = sqlite3VdbeMakeLabel(pParse); int tmpReg = sqlite3GetTempReg(pParse); if( nArg<3 ){ @@ -1614,8 +1615,8 @@ static void windowCodeRowExprStep( /* Allocate register and label for the "flush_partition" sub-routine. */ regFlushPart = ++pParse->nMem; - lblFlushPart = sqlite3VdbeMakeLabel(v); - lblFlushDone = sqlite3VdbeMakeLabel(v); + lblFlushPart = sqlite3VdbeMakeLabel(pParse); + lblFlushDone = sqlite3VdbeMakeLabel(pParse); regStart = ++pParse->nMem; regEnd = ++pParse->nMem; @@ -1725,7 +1726,7 @@ static void windowCodeRowExprStep( || pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_FOLLOWING ){ - int lblSkipInverse = sqlite3VdbeMakeLabel(v);; + int lblSkipInverse = sqlite3VdbeMakeLabel(pParse);; if( pMWin->eStart==TK_PRECEDING ){ sqlite3VdbeAddOp3(v, OP_IfPos, regStart, lblSkipInverse, 1); VdbeCoverage(v); @@ -1890,13 +1891,13 @@ static void windowCodeCacheStep( || (pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_UNBOUNDED) ); - lblEmpty = sqlite3VdbeMakeLabel(v); + lblEmpty = sqlite3VdbeMakeLabel(pParse); regNewPeer = pParse->nMem+1; pParse->nMem += nPeer; /* Allocate register and label for the "flush_partition" sub-routine. */ regFlushPart = ++pParse->nMem; - lblFlushPart = sqlite3VdbeMakeLabel(v); + lblFlushPart = sqlite3VdbeMakeLabel(pParse); csrLead = pParse->nTab++; regCtr = ++pParse->nMem; @@ -2133,6 +2134,7 @@ Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ if( pNew ){ pNew->zName = sqlite3DbStrDup(db, p->zName); pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0); + pNew->pFunc = p->pFunc; pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0); pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0); pNew->eType = p->eType; diff --git a/sqlite/test/altercol.test b/sqlite/test/altercol.test index 6810aabf..d71a9b06 100644 --- a/sqlite/test/altercol.test +++ b/sqlite/test/altercol.test @@ -778,6 +778,32 @@ do_execsql_test 19.1 { {CREATE VIEW v2(e) AS SELECT coalesce(t2.c,t1.f) FROM t1, t2 WHERE t1.b=t2.d} } +# 2019-01-08: https://www.sqlite.org/src/tktview/bc8d94f0fbd633fd9a051e3 +# +# ALTER TABLE RENAME COLUMN does not work for tables that have redundant +# UNIQUE constraints. +# +sqlite3 db :memory: +do_execsql_test 20.100 { + CREATE TABLE t1(aaa,b,c,UNIQUE(aaA),PRIMARY KEY(aAa),UNIQUE(aAA)); + ALTER TABLE t1 RENAME aaa TO bbb; + SELECT sql FROM sqlite_master WHERE name='t1'; +} {{CREATE TABLE t1(bbb,b,c,UNIQUE(bbb),PRIMARY KEY(bbb),UNIQUE(bbb))}} +do_execsql_test 20.105 { + DROP TABLE t1; + CREATE TABLE t1(aaa,b,c,UNIQUE(aaA),PRIMARY KEY(aAa),UNIQUE(aAA))WITHOUT ROWID; + ALTER TABLE t1 RENAME aaa TO bbb; + SELECT sql FROM sqlite_master WHERE name='t1'; +} {{CREATE TABLE t1(bbb,b,c,UNIQUE(bbb),PRIMARY KEY(bbb),UNIQUE(bbb))WITHOUT ROWID}} +do_execsql_test 20.110 { + DROP TABLE t1; + CREATE TABLE t1(aa UNIQUE,bb UNIQUE,cc UNIQUE,UNIQUE(aA),PRIMARY KEY(bB),UNIQUE(cC)); + ALTER TABLE t1 RENAME aa TO xx; + ALTER TABLE t1 RENAME bb TO yy; + ALTER TABLE t1 RENAME cc TO zz; + SELECT sql FROM sqlite_master WHERE name='t1'; +} {{CREATE TABLE t1(xx UNIQUE,yy UNIQUE,zz UNIQUE,UNIQUE(xx),PRIMARY KEY(yy),UNIQUE(zz))}} + finish_test diff --git a/sqlite/test/altertab.test b/sqlite/test/altertab.test index a3642070..4a12f0d8 100644 --- a/sqlite/test/altertab.test +++ b/sqlite/test/altertab.test @@ -505,5 +505,58 @@ do_execsql_test 15.5 { SELECT sql FROM sqlite_master WHERE name = 'y'; } {{CREATE VIEW y AS SELECT f2 AS f1 FROM x}} +#------------------------------------------------------------------------- +# Test that it is not possible to rename a shadow table in DEFENSIVE mode. +# +ifcapable fts3 { + proc vtab_command {method args} { + switch -- $method { + xConnect { + if {[info exists ::vtab_connect_sql]} { + execsql $::vtab_connect_sql + } + return "CREATE TABLE t1(a, b, c)" + } + + xBestIndex { + set clist [lindex $args 0] + if {[llength $clist]!=1} { error "unexpected constraint list" } + catch { array unset C } + array set C [lindex $clist 0] + if {$C(usable)} { + return "omit 0 cost 0 rows 1 idxnum 555 idxstr eq!" + } else { + return "cost 1000000 rows 0 idxnum 0 idxstr scan..." + } + } + } + + return {} + } + + register_tcl_module db + + sqlite3_db_config db DEFENSIVE 1 + + do_execsql_test 16.0 { + CREATE VIRTUAL TABLE y1 USING fts3; + } + + do_catchsql_test 16.1 { + INSERT INTO y1_segments VALUES(1, X'1234567890'); + } {1 {table y1_segments may not be modified}} + + do_catchsql_test 16.2 { + ALTER TABLE y1_segments RENAME TO abc; + } {1 {table y1_segments may not be altered}} + + do_execsql_test 16.3 { + ALTER TABLE y1 RENAME TO z1; + } + + do_execsql_test 16.4 { + SELECT * FROM z1_segments; + } +} finish_test diff --git a/sqlite/test/altertab2.test b/sqlite/test/altertab2.test index 2e4212c3..be55de9e 100644 --- a/sqlite/test/altertab2.test +++ b/sqlite/test/altertab2.test @@ -12,7 +12,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl -set testprefix altertab +set testprefix altertab2 # If SQLITE_OMIT_ALTERTABLE is defined, omit this file. ifcapable !altertable { @@ -85,5 +85,266 @@ do_execsql_test 2.3 { {CREATE TABLE c3(x, FOREIGN KEY (x) REFERENCES "p3"(a))} } +#------------------------------------------------------------------------- +# Table name in WITH clauses that are part of views or triggers. +# +foreach {tn schema} { + 1 { + CREATE TABLE log_entry(col1, y); + CREATE INDEX i1 ON log_entry(col1); + } + + 2 { + CREATE TABLE t1(a, b, c); + CREATE TABLE t2(x); + CREATE TABLE log_entry(col1); + CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN + INSERT INTO t2 SELECT col1 FROM log_entry; + END; + } + + 3 { + CREATE TABLE t1(a, b, c); + CREATE TABLE t2(x); + CREATE TABLE log_entry(col1); + CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN + INSERT INTO t2 + WITH xyz(x) AS (SELECT col1 FROM log_entry) + SELECT x FROM xyz; + END; + } + + 4 { + CREATE TABLE log_entry(col1); + CREATE VIEW ttt AS + WITH xyz(x) AS (SELECT col1 FROM log_entry) + SELECT x FROM xyz; + } +} { + reset_db + do_execsql_test 3.$tn.1 $schema + set expect [db eval "SELECT sql FROM sqlite_master"] + set expect [string map {log_entry {"newname"}} $expect] + + do_execsql_test 3.$tn.2 { + ALTER TABLE log_entry RENAME TO newname; + SELECT sql FROM sqlite_master; + } $expect + + reset_db + do_execsql_test 3.$tn.3 $schema + set expect [db eval "SELECT sql FROM sqlite_master"] + set expect [string map {col1 newname} $expect] + + do_execsql_test 3.$tn.4 { + ALTER TABLE log_entry RENAME col1 TO newname; + SELECT sql FROM sqlite_master; + } $expect +} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 4.0 { + CREATE TABLE t1(a,b,c,d,e,f); + CREATE TRIGGER r1 AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN + UPDATE t1 SET (c,d)=(a,b); + END; +} + +do_execsql_test 4.1 { + ALTER TABLE t1 RENAME TO t1x; + SELECT sql FROM sqlite_master WHERE type = 'trigger'; +} { +{CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN new.a NOT NULL BEGIN + UPDATE "t1x" SET (c,d)=(a,b); + END} +} + +do_execsql_test 4.2 { + ALTER TABLE t1x RENAME a TO aaa; + SELECT sql FROM sqlite_master WHERE type = 'trigger'; +} { +{CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN new.aaa NOT NULL BEGIN + UPDATE "t1x" SET (c,d)=(aaa,b); + END} +} + +do_execsql_test 4.3 { + ALTER TABLE t1x RENAME d TO ddd; + SELECT sql FROM sqlite_master WHERE type = 'trigger'; +} { +{CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN new.aaa NOT NULL BEGIN + UPDATE "t1x" SET (c,ddd)=(aaa,b); + END} +} + +#------------------------------------------------------------------------- +do_execsql_test 5.0 { + CREATE TABLE t2(a); + CREATE TRIGGER r2 AFTER INSERT ON t2 WHEN new.a NOT NULL BEGIN + SELECT a, sum(a) OVER w1 FROM t2 + WINDOW w1 AS ( + PARTITION BY a ORDER BY a + ROWS BETWEEN 2 PRECEDING AND 3 FOLLOWING + ), + w2 AS ( + PARTITION BY a + ORDER BY rowid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING + ); + END; +} {} + +do_execsql_test 5.0.1 { + INSERT INTO t2 VALUES(1); +} {} + +do_execsql_test 5.1 { + ALTER TABLE t2 RENAME TO t2x; + SELECT sql FROM sqlite_master WHERE name = 'r2'; +} { + {CREATE TRIGGER r2 AFTER INSERT ON "t2x" WHEN new.a NOT NULL BEGIN + SELECT a, sum(a) OVER w1 FROM "t2x" + WINDOW w1 AS ( + PARTITION BY a ORDER BY a + ROWS BETWEEN 2 PRECEDING AND 3 FOLLOWING + ), + w2 AS ( + PARTITION BY a + ORDER BY rowid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING + ); + END} +} + +do_execsql_test 5.2 { + ALTER TABLE t2x RENAME a TO aaaa; + SELECT sql FROM sqlite_master WHERE name = 'r2'; +} { + {CREATE TRIGGER r2 AFTER INSERT ON "t2x" WHEN new.aaaa NOT NULL BEGIN + SELECT aaaa, sum(aaaa) OVER w1 FROM "t2x" + WINDOW w1 AS ( + PARTITION BY aaaa ORDER BY aaaa + ROWS BETWEEN 2 PRECEDING AND 3 FOLLOWING + ), + w2 AS ( + PARTITION BY aaaa + ORDER BY rowid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING + ); + END} +} + +do_execsql_test 5.3 { + INSERT INTO t2x VALUES(1); +} {} + +#------------------------------------------------------------------------- + +do_execsql_test 6.0 { + CREATE TABLE t3(a,b,c,d); + CREATE TRIGGER r3 AFTER INSERT ON t3 WHEN new.a NOT NULL BEGIN + SELECT a,b,c FROM t3 EXCEPT SELECT a,b,c FROM t3 ORDER BY a; + SELECT rowid, * FROM t3; + END; +} {} + +do_execsql_test 6.1 { + ALTER TABLE t3 RENAME TO t3x; + SELECT sql FROM sqlite_master WHERE name = 'r3'; +} { + {CREATE TRIGGER r3 AFTER INSERT ON "t3x" WHEN new.a NOT NULL BEGIN + SELECT a,b,c FROM "t3x" EXCEPT SELECT a,b,c FROM "t3x" ORDER BY a; + SELECT rowid, * FROM "t3x"; + END} +} + +do_execsql_test 6.2 { + ALTER TABLE t3x RENAME a TO abcd; + SELECT sql FROM sqlite_master WHERE name = 'r3'; +} { + {CREATE TRIGGER r3 AFTER INSERT ON "t3x" WHEN new.abcd NOT NULL BEGIN + SELECT abcd,b,c FROM "t3x" EXCEPT SELECT abcd,b,c FROM "t3x" ORDER BY abcd; + SELECT rowid, * FROM "t3x"; + END} +} + +#------------------------------------------------------------------------- +reset_db + +do_execsql_test 7.0 { + CREATE TABLE t1(a,b,c,d,e,f); + INSERT INTO t1 VALUES(1,2,3,4,5,6); + CREATE TABLE t2(x,y,z); +} + +do_execsql_test 7.1 { + SELECT a,b,c FROM t1 UNION SELECT d,e,f FROM t1 ORDER BY b,c; +} {1 2 3 4 5 6} + +do_execsql_test 7.2 { + CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN + INSERT INTO t2 + SELECT a,b,c FROM t1 UNION SELECT d,e,f FROM t1 ORDER BY b,c; + END; + INSERT INTO t1 VALUES(2,3,4,5,6,7); + SELECT * FROM t2; +} {1 2 3 2 3 4 4 5 6 5 6 7} + +do_execsql_test 7.3 { + ALTER TABLE t1 RENAME TO xyzzy; + SELECT sql FROM sqlite_master WHERE name='r1' +} { + {CREATE TRIGGER r1 AFTER INSERT ON "xyzzy" BEGIN + INSERT INTO t2 + SELECT a,b,c FROM "xyzzy" UNION SELECT d,e,f FROM "xyzzy" ORDER BY b,c; + END} +} + +do_execsql_test 7.3 { + ALTER TABLE xyzzy RENAME c TO ccc; + SELECT sql FROM sqlite_master WHERE name='r1' +} { + {CREATE TRIGGER r1 AFTER INSERT ON "xyzzy" BEGIN + INSERT INTO t2 + SELECT a,b,ccc FROM "xyzzy" UNION SELECT d,e,f FROM "xyzzy" ORDER BY b,ccc; + END} +} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 8.0 { + CREATE TABLE t1(a, b, c); + CREATE TABLE t2(a, b, c); + CREATE TABLE t3(d, e, f); + CREATE VIEW v1 AS SELECT * FROM t1; + CREATE TRIGGER tr AFTER INSERT ON t3 BEGIN + UPDATE t2 SET a = new.d; + SELECT a, b, c FROM v1; + END; +} + +do_execsql_test 8.1 { + INSERT INTO t3 VALUES(1, 2, 3); +} + +# The following ALTER TABLE fails as if column "t1.a" is renamed the "a" +# in the "SELECT a, b, c FROM v1" within the trigger can no longer be +# resolved. But at one point there was a bug allowing the ALTER TABLE +# succeed. Which meant the subsequent INSERT statement would fail. +do_catchsql_test 8.2 { + ALTER TABLE t1 RENAME a TO aaa; +} {1 {error in trigger tr after rename: no such column: a}} +do_execsql_test 8.3 { + INSERT INTO t3 VALUES(4, 5, 6); +} + +do_execsql_test 8.1 { + CREATE TABLE t4(a, b); + CREATE VIEW v4 AS SELECT * FROM t4 WHERE (a=1 AND 0) OR b=2; +} +do_execsql_test 8.2 { + ALTER TABLE t4 RENAME a TO c; + SELECT sql FROM sqlite_master WHERE name = 'v4' +} {{CREATE VIEW v4 AS SELECT * FROM t4 WHERE (c=1 AND 0) OR b=2}} finish_test + + diff --git a/sqlite/test/altertab3.test b/sqlite/test/altertab3.test new file mode 100644 index 00000000..28c05877 --- /dev/null +++ b/sqlite/test/altertab3.test @@ -0,0 +1,86 @@ +# 2019 January 23 +# +# 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 +set testprefix altertab3 + +# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. +ifcapable !altertable { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE TABLE t1(a, b); + CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN + SELECT sum(b) OVER w FROM t1 WINDOW w AS (ORDER BY a); + END; +} + +do_execsql_test 1.1 { + ALTER TABLE t1 RENAME a TO aaa; +} + +do_execsql_test 1.2 { + SELECT sql FROM sqlite_master WHERE name='tr1' +} {{CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN + SELECT sum(b) OVER w FROM t1 WINDOW w AS (ORDER BY aaa); + END}} + +do_execsql_test 1.3 { + INSERT INTO t1 VALUES(1, 2); +} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 2.0 { + CREATE TABLE t1(a,b,c); + CREATE TABLE t2(a,b,c); + CREATE TRIGGER r1 AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN + SELECT a,b, a name FROM t1 + INTERSECT + SELECT a,b,c FROM t1 WHERE b>='d' ORDER BY name; + SELECT new.c; + END; +} + +do_execsql_test 2.1 { + ALTER TABLE t1 RENAME TO t1x; + SELECT sql FROM sqlite_master WHERE name = 'r1'; +} {{CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN new.a NOT NULL BEGIN + SELECT a,b, a name FROM "t1x" + INTERSECT + SELECT a,b,c FROM "t1x" WHERE b>='d' ORDER BY name; + SELECT new.c; + END}} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 3.0 { + CREATE TABLE t1(a, b, c, d); + CREATE VIEW v1 AS SELECT * FROM t1 WHERE a=1 OR (b IN ()); +} + +do_execsql_test 3.1 { + ALTER TABLE t1 RENAME b TO bbb; +} + +do_execsql_test 3.2 { + SELECT sql FROM sqlite_master WHERE name = 'v1' +} {{CREATE VIEW v1 AS SELECT * FROM t1 WHERE a=1 OR (bbb IN ())}} + + + +finish_test + + diff --git a/sqlite/test/autoindex1.test b/sqlite/test/autoindex1.test index 1978b8df..b08f8cfe 100644 --- a/sqlite/test/autoindex1.test +++ b/sqlite/test/autoindex1.test @@ -184,7 +184,7 @@ do_eqp_test autoindex1-500.1 { } { QUERY PLAN |--SEARCH TABLE t501 USING INTEGER PRIMARY KEY (rowid=?) - `--LIST SUBQUERY + `--LIST SUBQUERY xxxxxx `--SCAN TABLE t502 } do_eqp_test autoindex1-501 { @@ -193,7 +193,7 @@ do_eqp_test autoindex1-501 { } { QUERY PLAN |--SCAN TABLE t501 - `--CORRELATED LIST SUBQUERY + `--CORRELATED LIST SUBQUERY xxxxxx `--SEARCH TABLE t502 USING AUTOMATIC COVERING INDEX (y=?) } do_eqp_test autoindex1-502 { @@ -203,7 +203,7 @@ do_eqp_test autoindex1-502 { } { QUERY PLAN |--SEARCH TABLE t501 USING INTEGER PRIMARY KEY (rowid=?) - `--CORRELATED LIST SUBQUERY + `--CORRELATED LIST SUBQUERY xxxxxx `--SCAN TABLE t502 } @@ -280,7 +280,7 @@ do_eqp_test autoindex1-600a { |--MATERIALIZE xxxxxx | |--SCAN TABLE sheep AS s | |--SEARCH TABLE flock_owner AS prev USING INDEX sqlite_autoindex_flock_owner_1 (flock_no=? AND owner_change_date? AND owner_change_date? AND x? AND x...|......... +| 1088: 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 13 ................ +| page 26 offset 102400 +| 2512: 00 00 00 00 00 00 00 0a 00 00 00 00 00 00 00 00 ................ +| page 27 offset 106496 +| 0: 00 00 00 00 00 00 00 12 00 00 00 07 00 00 00 1d ................ +| 16: 00 00 00 09 00 00 00 1f 00 00 00 0b 00 00 00 21 ...............! +| 32: 00 00 00 0d 00 00 00 25 00 00 00 0f 00 00 00 19 .......%........ +| 48: 00 00 00 11 00 00 00 29 00 00 00 13 00 00 00 2b .......).......+ +| 64: 00 00 00 15 00 00 00 2d 00 00 00 2e 00 00 00 17 .......-........ +| page 28 offset 110592 +| 2512: 00 00 00 00 00 00 00 1e 00 00 00 00 00 00 00 00 ................ +| page 30 offset 118784 +| 2512: 00 00 00 00 00 00 00 32 00 00 00 00 00 00 00 00 .......2........ +| page 32 offset 126976 +| 2512: 00 00 00 00 00 00 00 46 00 00 00 00 00 00 00 00 .......F........ +| page 34 offset 135168 +| 2512: 00 00 00 00 00 00 00 5a 00 00 00 00 00 00 00 00 .......Z........ +| page 35 offset 139264 +| 0: 0a 08 44 00 05 02 77 00 0e 11 0a 33 06 55 02 77 ..D...w....3.U.w +| 16: 04 66 00 88 00 88 00 88 00 00 00 00 00 00 00 00 .f.............. +| 128: 00 00 00 00 00 00 00 00 04 66 01 ef 00 00 00 00 .........f...... +| 624: 00 00 00 00 00 00 00 97 3d 04 ae 7c 01 00 00 00 ........=..|.... +| 1120: 00 00 00 00 00 20 97 3d 04 ae 7c 01 00 00 00 00 ..... .=..|..... +| 1616: 00 00 00 00 22 97 3d 04 ae 7c 01 00 00 00 00 00 ......=..|...... +| 2112: 00 00 00 1e 0c 22 01 ef 00 00 00 00 00 00 00 00 ................ +| 2608: 00 00 00 97 3d 04 ae 7c 01 00 00 00 00 00 00 00 ....=..|........ +| 3104: 00 1c 00 00 01 ef 00 00 00 00 00 00 00 00 00 00 ................ +| 3600: 00 97 3d 04 ae 7c 01 00 00 00 00 00 00 00 00 00 ..=..|.......... +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1a ................ +| page 36 offset 143360 +| 0: 0a 08 44 00 04 02 77 00 06 55 02 77 04 66 0e 11 ..D...w..U.w.f.. +| 16: 00 88 00 88 00 88 0e 11 00 00 00 00 00 00 00 00 ................ +| 128: 00 00 00 00 00 00 00 00 04 76 01 ef 00 00 00 00 .........v...... +| 624: 00 00 00 00 00 00 00 97 3e 04 ae 7c 02 00 00 00 ........>..|.... +| 1120: 00 00 00 00 00 2a 97 3e 04 ae 7c 02 00 00 00 00 .....*.>..|..... +| 1616: 00 00 00 00 2c 97 3e 04 ae 7c 02 00 00 00 00 00 ....,.>..|...... +| 2112: 00 00 00 28 00 00 05 cd 00 00 00 00 00 00 00 00 ...(............ +| 3600: 00 97 3e 04 ae 7c 02 00 00 00 00 00 00 00 00 00 ..>..|.......... +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f .............../ +| page 38 offset 151552 +| 2512: 00 00 00 00 00 00 00 6e 00 00 00 00 00 00 00 00 .......n........ +| page 40 offset 159744 +| 2512: 00 00 00 00 00 00 00 00 82 00 00 00 00 00 00 00 ................ +| page 42 offset 167936 +| 2512: 00 00 00 00 00 00 00 00 96 00 00 00 00 00 00 00 ................ +| page 44 offset 176128 +| 2512: 00 00 00 00 00 00 00 00 aa 00 00 00 00 00 00 00 ................ +| page 47 offset 188416 +| 2512: 00 00 00 00 00 00 00 00 be 00 00 00 00 00 00 00 ................ +| end crash-9ae5502296c949.db +}]} {} + +do_catchsql_test 5.1 { + INSERT INTO t1(b) VALUES(zeroblob(40000)); +} {1 {database disk image is malformed}} + +do_catchsql_test 5.2 { + DROP INDEX t1x2; +} {0 {}} + +do_catchsql_test 5.3 { + INSERT INTO t1(b) VALUES(zeroblob(40000)); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 6.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 20480 pagesize 4096 filename crash-d260f001fa015c.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 05 .....@ ........ +| 32: 00 00 00 00 00 ff ff f0 00 00 00 02 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 64 00 00 00 01 00 00 00 00 .......d........ +| 96: 00 00 00 00 0d 0f f8 00 04 0e ce 00 0f 4c 0f d3 .............L.. +| 112: 0e fa 0e ce 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3776: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2a 04 ..............*. +| 3792: 06 17 13 11 01 3f 69 6e 64 65 78 74 31 62 74 31 .....?indext1bt1 +| 3808: 05 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 .CREATE INDEX t1 +| 3824: 62 20 4f 4e 20 74 31 28 62 29 50 03 06 17 2b 2b b ON t1(b)P...++ +| 3840: 01 59 74 61 62 6c 65 73 71 6c 69 74 65 5f 73 65 .Ytablesqlite_se +| 3856: 71 75 65 6e 63 65 73 71 6c 69 74 65 5f 73 65 71 quencesqlite_seq +| 3872: 75 65 6e 63 65 04 43 52 45 41 54 45 20 54 41 42 uence.CREATE TAB +| 3888: 4c 45 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e LE sqlite_sequen +| 3904: 63 65 28 6e 61 6d 65 2c 73 65 71 29 81 04 01 07 ce(name,seq).... +| 3920: 17 11 11 01 81 73 74 61 c2 6c 65 74 31 74 31 02 .....sta.let1t1. +| 3936: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 CREATE TABLE t1( +| 3952: 61 20 52 45 41 4c 20 4e 4f 54 20 4e 55 4c 4c 20 a REAL NOT NULL +| 3968: 44 45 46 41 55 4c 54 28 32 35 2b 33 32 29 2c 62 DEFAULT(25+32),b +| 3984: 20 46 4c 4f 41 54 2c 63 20 44 4f 55 42 4c 45 20 FLOAT,c DOUBLE +| 4000: 55 4e 49 51 55 45 2c 0a 64 20 43 4c 4f 42 2c 65 UNIQUE,.d CLOB,e +| 4016: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 4032: 20 4b 45 59 20 41 55 54 4f 49 4e 43 52 45 4d 45 KEY AUTOINCREME +| 4048: 4e 54 29 23 02 06 17 37 11 01 00 69 6e 64 65 78 NT)#...7...index +| 4064: 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 sqlite_autoindex +| 4080: 5f 74 31 5f 31 74 31 05 00 00 00 08 00 00 00 00 _t1_1t1......... +| page 2 offset 4096 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| end crash-d260f001fa015c.db +}]} {} + +do_catchsql_test 6.1 { + BEGIN; + INSERT INTO t1(b) VALUES(1); + INSERT INTO t1(b) VALUES(2); + COMMIT; +} {1 {malformed database schema (t1b) - invalid rootpage}} + +#------------------------------------------------------------------------- +reset_db +do_test 7.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 20480 pagesize 4096 filename crash-8391315d75edff.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 05 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 05 0e 55 00 0f 74 0f 3c ..........U..t.< +| 112: 0e f9 0e d1 0e 55 00 00 00 00 00 00 00 00 00 00 .....U.......... +| 3664: 00 00 00 00 00 7a 05 07 15 11 11 08 81 63 76 69 .....z.......cvi +| 3680: 65 77 76 31 76 31 43 52 45 41 54 45 20 56 49 45 ewv1v1CREATE VIE +| 3696: 57 20 76 31 28 78 2c 69 29 20 41 53 0a 53 45 4c W v1(x,i) AS.SEL +| 3712: 45 43 54 20 74 31 2e 62 2c 74 32 2e 62 20 46 52 ECT t1.b,t2.b FR +| 3728: 4f 4d 20 74 31 2c 74 32 20 57 48 45 52 45 20 74 OM t1,t2 WHERE t +| 3744: 31 2e 61 3d 74 32 2e 61 20 47 52 4f 55 50 20 42 1.a=t2.a GROUP B +| 3760: 59 20 31 20 48 41 56 49 4e 47 20 74 32 2e 63 20 Y 1 HAVING t2.c +| 3776: 4e 4f 54 20 4e 55 4c 4c 0a 4c 49 4d 49 54 20 31 NOT NULL.LIMIT 1 +| 3792: 30 26 04 06 17 11 11 01 39 74 61 62 6c 65 74 32 0&......9tablet2 +| 3808: 74 32 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 t2.CREATE TABLE +| 3824: 74 32 28 61 2c 62 2c 63 29 41 03 06 17 15 11 01 t2(a,b,c)A...... +| 3840: 6b 69 6e 64 65 78 74 31 78 31 74 31 03 43 52 45 kindext1x1t1.CRE +| 3856: 41 54 45 20 49 4e 44 45 58 20 74 31 78 31 20 4f ATE INDEX t1x1 O +| 3872: 4e 20 74 31 28 64 29 20 57 48 45 52 45 20 65 65 N t1(d) WHERE ee +| 3888: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 36 02 06 17 IS NOT NULL6... +| 3904: 17 11 01 53 69 6e 64 65 78 74 31 61 62 63 74 31 ...Sindext1abct1 +| 3920: 03 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 .CREATE INDEX t1 +| 3936: 61 62 63 20 4f 4e 20 74 31 28 61 2c 62 2c 63 2b abc ON t1(a,b,c+ +| 3952: 64 2b 65 29 81 09 01 07 17 11 11 01 81 7d 74 61 d+e)..........ta +| 3968: 62 6c 65 74 31 74 31 02 43 52 45 41 54 45 20 54 blet1t1.CREATE T +| 3984: 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 2c ABLE t1(a,b,c,d, +| 4000: 65 2c 66 2c 67 2c 68 2c 6a 2c 6a 6a 2c 6a 6a 6a e,f,g,h,j,jj,jjj +| 4016: 2c 6b 2c 61 61 2c 62 69 8c 63 63 2c 64 64 2c 65 ,k,aa,bi.cc,dd,e +| 4032: 65 20 44 45 46 41 55 4c 54 20 33 2e 31 34 2c 0a e DEFAULT 3.14,. +| 4048: 66 66 20 44 45 46 41 55 4c 54 28 27 68 69 63 63 ff DEFAULT('hicc +| 4064: 75 70 27 29 2c 67 67 20 4e 4f 54 20 4e 55 4c 4c up'),gg NOT NULL +| 4080: 20 44 45 46 41 55 4c 54 28 66 61 6c 73 65 29 29 DEFAULT(false)) +| page 2 offset 4096 +| 0: 0d 00 00 00 0a 0e 7b 00 0f dc 0f b6 0f 8f 0f 68 ...............h +| 16: 0f 41 0f 1a 0e f3 0e cb 0e a3 0e 22 00 00 00 00 .A.............. +| 3696: 00 00 00 00 00 00 00 00 00 00 00 26 0a 14 01 01 ...........&.... +| 3712: 02 08 00 00 00 00 00 00 00 00 00 00 00 00 07 19 ................ +| 3728: 08 09 5a 00 b4 40 09 1e b8 51 eb 95 1f 68 69 63 ..Z..@...Q...hic +| 3744: 63 75 70 26 09 14 01 01 02 08 00 00 00 00 00 00 cup&............ +| 3760: 00 00 00 00 00 00 07 19 08 08 50 00 a0 40 09 1e ..........P..@.. +| 3776: b8 51 eb 85 1f 68 69 63 63 74 70 26 08 14 01 01 .Q...hicctp&.... +| 3792: 03 08 00 00 00 00 00 00 00 00 00 00 00 00 07 19 ................ +| 3808: 08 07 46 00 8c 40 09 1e b8 51 eb 85 1f 68 69 63 ..F..@...Q...hic +| 3824: 63 75 70 25 07 14 01 01 01 08 00 00 00 00 00 00 cup%............ +| 3840: 00 00 00 00 00 10 07 19 08 06 3c 78 40 09 1e b8 ..........? AND b? AND b? AND b? AND b....!..... + | page 5 offset 2048 + | 0: 0a 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 ................ + | page 7 offset 3072 + | 0: 0d 00 00 00 08 01 c2 00 01 fb 01 f6 01 f1 01 ec ................ + | 16: 01 e0 01 d4 01 cb 01 c2 00 00 00 00 00 00 00 00 ................ + | 96: 00 00 00 00 13 00 00 00 00 00 00 00 00 00 00 00 ................ + | 224: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 ................ + | 288: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 ................ + | 448: 00 00 07 08 02 17 65 69 67 68 74 07 07 02 17 65 ......eight....e + | 464: 69 67 68 74 0a 06 02 07 40 18 00 00 00 00 00 00 ight....@....... + | 480: 0a 05 02 07 40 18 00 00 00 00 00 00 03 04 02 01 ....@........... + | 496: 04 03 03 02 01 04 03 02 02 01 02 03 01 02 01 02 ................ + | page 8 offset 3584 + | 0: 0d 00 21 00 01 00 16 00 00 16 00 16 00 16 00 16 ..!............. + | 16: 00 16 00 16 00 00 09 06 05 01 01 01 01 04 04 03 ................ + | 32: 03 00 00 00 5f 01 09 09 02 02 00 00 00 56 17 17 ...._........V.. + | 48: 17 73 65 76 65 6e 65 69 67 68 74 65 69 67 68 74 .seveneighteight + | 64: 73 65 76 65 6e 00 00 00 3b 07 07 07 40 14 00 00 seven...;...@... + | 80: 00 00 00 00 40 18 00 00 00 00 00 00 40 18 00 00 ....@.......@... + | 96: 00 00 00 00 40 14 00 00 00 00 00 00 00 00 00 14 ....@........... + | 112: 01 01 01 03 04 04 03 00 00 00 09 01 01 09 02 02 ................ + | 352: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1a ................ + | page 9 offset 4096 + | 0: 0d 00 00 00 1b 00 47 00 01 d9 01 be 01 af 01 a0 ......G......... + | 16: 01 91 01 82 01 73 01 64 01 55 01 46 01 37 01 28 .....s.d.U.F.7.( + | 32: 01 19 01 0a 00 fb 00 ec 00 dd 00 ce 00 bf 00 b0 ................ + | 48: 00 a1 00 92 00 83 00 74 00 65 00 56 00 47 00 00 .......t.e.V.G.. + | 64: 00 00 00 00 00 00 00 0d 21 00 00 48 01 54 00 01 ........!..H.T.. + | 80: f7 01 ec 01 c5 01 0d 20 00 00 48 01 54 00 01 f7 ....... ..H.T... + | 96: 01 ec 01 c5 01 0d 1f 00 00 48 01 54 00 01 f7 01 .........H.T.... + | 112: ec 01 c5 01 0d 1e 00 00 48 01 54 00 01 f7 01 ec ........H.T..... + | 128: 01 c5 01 0d 1d 00 00 48 01 54 00 01 f7 01 ec 01 .......H.T...... + | 144: c5 01 0d 1c 00 00 48 01 54 00 01 f7 01 ec 01 c5 ......H.T....... + | 160: 01 0d 1b 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 .....H.T........ + | 176: 0d 1a 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d ....H.T......... + | 192: 19 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d 18 ...H.T.......... + | 208: 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d 17 00 ..H.T........... + | 224: 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d 16 00 00 .H.T............ + | 240: 48 01 54 00 01 f7 01 ec 01 c5 01 0d 15 00 00 48 H.T............H + | 256: 01 54 00 01 f7 01 ec 01 c5 01 0d 14 00 00 48 01 .T............H. + | 272: 54 00 01 f7 01 ec 01 c5 01 0d 13 00 00 48 01 54 T............H.T + | 288: 00 01 f7 01 ec 01 c5 01 0d 12 00 00 48 01 54 00 ............H.T. + | 304: 01 f7 01 ec 01 c5 01 0d 11 00 00 48 01 54 00 01 ...........H.T.. + | 320: f7 01 ec 01 c5 01 0d 10 00 00 48 01 54 00 01 f7 ..........H.T... + | 336: 01 ec 01 c5 01 0d 0f 00 00 48 01 54 00 01 f7 01 .........H.T.... + | 352: ec 01 c5 01 0d 0e 00 00 48 01 54 00 01 f7 01 ec ........H.T..... + | 368: 01 c5 01 0d 0d 00 00 48 01 54 00 01 f7 01 ec 01 .......H.T...... + | 384: c5 01 0d 0c 00 00 48 01 54 00 01 f7 01 ec 01 c5 ......H.T....... + | 400: 01 0d 0b 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 .....H.T........ + | 416: 0d 0a 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d ....H.T......... + | 432: 09 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 19 08 ...H.T.......... + | 448: 05 17 17 17 17 65 69 67 68 74 65 69 67 68 74 73 .....eighteights + | 464: 65 76 65 6e 73 65 76 65 6e 25 07 05 07 07 07 07 evenseven%...... + | 480: 40 18 00 00 00 00 00 00 40 18 00 00 00 00 00 00 @.......@....... + | 496: 40 14 00 00 00 00 00 00 40 14 00 00 00 00 00 00 @.......@....... + | page 10 offset 4608 + | 0: 0d 00 00 00 1d 00 4d 00 01 f1 01 e2 01 d3 01 c4 ......M......... + | 16: 01 b5 01 a6 01 97 01 88 01 79 01 6a 01 5b 01 4c .........y.j.[.L + | 32: 01 3d 01 2e 01 1f 01 10 01 01 00 f2 00 e3 00 d4 .=.............. + | 48: 00 c5 00 b6 00 a7 00 98 00 89 00 7a 00 6b 00 5c ...........z.k.\ + | 64: 00 4d 00 00 00 00 00 00 00 00 00 00 00 0d 3e 00 .M............>. + | 80: 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d 3d 00 00 .H.T.........=.. + | 96: 48 01 54 00 01 f7 01 ec 01 c5 01 0d 3c 00 00 48 H.T.........<..H + | 112: 01 54 00 01 f7 01 ec 01 c5 01 0d 3b 00 00 48 01 .T.........;..H. + | 128: 54 00 01 f7 01 ec 01 c5 01 0d 3a 00 00 48 01 54 T.........:..H.T + | 144: 00 01 f7 01 ec 01 c5 01 0d 39 00 00 48 01 54 00 .........9..H.T. + | 160: 01 f7 01 ec 01 c5 01 0d 38 00 00 48 01 54 00 01 ........8..H.T.. + | 176: f7 01 ec 01 c5 01 0d 37 00 00 48 01 54 00 01 f7 .......7..H.T... + | 192: 01 ec 01 c5 01 0d 36 00 00 48 01 54 00 01 f7 01 ......6..H.T.... + | 208: ec 01 c5 01 0d 35 00 00 48 01 54 00 01 f7 01 ec .....5..H.T..... + | 224: 01 c5 01 0d 34 00 00 48 01 54 00 01 f7 01 ec 01 ....4..H.T...... + | 240: c5 01 0d 33 00 00 48 01 54 00 01 f7 01 ec 01 c5 ...3..H.T....... + | 256: 01 0d 32 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 ..2..H.T........ + | 272: 0d 31 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d .1..H.T......... + | 288: 30 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d 2f 0..H.T........./ + | 304: 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d 2e 00 ..H.T........... + | 320: 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d 2d 00 00 .H.T.........-.. + | 336: 48 01 54 00 01 f7 01 ec 01 c5 01 0d 2c 00 00 48 H.T.........,..H + | 352: 01 54 00 01 f7 01 ec 01 c5 01 0d 2b 00 00 48 01 .T.........+..H. + | 368: 54 00 01 f7 01 ec 01 c5 01 0d 2a 00 00 48 01 54 T.........*..H.T + | 384: 00 01 f7 01 ec 01 c5 01 0d 29 00 00 48 01 54 00 .........)..H.T. + | 400: 01 f7 01 ec 01 c5 01 0d 28 00 00 48 01 54 00 01 ........(..H.T.. + | 416: f7 01 ec 01 c5 01 0d 27 00 00 48 01 54 00 01 f7 .......'..H.T... + | 432: 01 ec 01 c5 01 0d 26 00 00 48 01 54 00 01 f7 01 ......&..H.T.... + | 448: ec 01 c5 01 0d 25 00 00 48 01 54 00 01 f7 01 ec .....%..H.T..... + | 464: 01 c5 01 0d 24 00 00 48 01 54 00 01 f7 01 ec 01 ....$..H.T...... + | 480: c5 01 0d 23 00 00 48 01 54 00 01 f7 01 ec 01 c5 ...#..H.T....... + | 496: 01 0d 22 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 .."..H.T........ + | page 11 offset 5120 + | 0: 0d 00 00 00 0a 01 6a 00 01 f1 01 e2 01 d3 01 c4 ......j......... + | 16: 01 b5 01 a6 01 97 01 88 01 79 01 6a 00 00 00 00 .........y.j.... + | 352: 00 00 00 00 00 00 00 00 00 00 0d 48 00 00 48 01 ...........H..H. + | 368: 54 00 01 f7 01 ec 01 c5 01 0d 47 00 00 48 01 54 T.........G..H.T + | 384: 00 01 f7 01 ec 01 c5 01 0d 46 00 00 48 01 54 00 .........F..H.T. + | 400: 01 f7 01 ec 01 c5 01 0d 45 00 00 48 01 54 00 01 ........E..H.T.. + | 416: f7 01 ec 01 c5 01 0d 44 00 00 48 01 54 00 01 f7 .......D..H.T... + | 432: 01 ec 01 c5 01 0d 43 00 00 48 01 54 00 01 f7 01 ......C..H.T.... + | 448: ec 01 c5 01 0d 42 00 00 48 01 54 00 01 f7 01 ec .....B..H.T..... + | 464: 01 c5 01 0d 41 00 00 48 01 54 00 01 f7 01 ec 01 ....A..H.T...... + | 480: c5 01 0d 40 00 00 48 01 54 00 01 f7 01 ec 01 c5 ...@..H.T....... + | 496: 01 0d 3f 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 ..?..H.T........ + | end c4.db + }] +} {} + +ifcapable !oversize_cell_check { + # Non SQLITE_ENABLE_OVERSIZE_CELL_CHECK builds: + do_test dbfuzz001-101a { + db eval {PRAGMA writable_schema=on; PRAGMA integrity_check} + } {/Fragmentation of 384 bytes reported as 0 on page 8/} +} else { + # SQLITE_ENABLE_OVERSIZE_CELL_CHECK builds: + do_catchsql_test dbfuzz001-101b { + PRAGMA writable_schema=on; + PRAGMA integrity_check; + } {1 {database disk image is malformed}} +} + +# The DELETE query below deletes the very last cell from page 8. +# Prior to a certain fix to sqlite3BtreeDelete() and because of the +# corruption to the freeblock list on page 8, this would fail to +# cause a rebalance operation, which would leave the btree in a weird +# state that would lead to segfaults and or assertion faults. +# +set res {0 {}} +ifcapable oversize_cell_check { set res {1 {database disk image is malformed}} } +do_catchsql_test dbfuzz001-110 { + DELETE FROM t3 WHERE x IS NOT NULL AND +rowid=6; +} $res + +# This is a dbfuzz2-generate test case that can cause a page with +# pPage->nCell==0 to enter the balancer. +# +do_test dbfuzz001-200 { + db deserialize [decode_hexdb { + | size 3076 pagesize 512 filename c03.db + | page 1 offset 0 + | 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. + | 16: 02 00 01 01 00 40 20 20 00 00 00 0c 00 00 00 07 .....@ ........ + | 32: 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 04 ................ + | 48: 00 00 00 00 00 00 00 03 e8 00 00 01 00 00 00 00 ................ + | 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0c ................ + | 96: 00 2e 2c 50 0d 00 00 00 06 01 06 00 01 da 01 b0 ..,P............ + | 112: 01 56 01 86 01 2a 01 06 00 00 00 00 00 00 00 00 .V...*.......... + | 128: 00 00 00 00 00 00 00 00 ef 00 00 00 00 00 00 00 ................ + | 192: 00 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + | 224: 00 00 00 00 00 00 00 00 00 00 00 00 00 ff e9 00 ................ + | 256: 00 00 00 00 00 00 22 07 06 17 11 11 01 31 74 61 ......"......1ta + | 272: 62 6c 65 74 34 74 34 07 43 52 45 41 54 45 20 54 blet4t4.CREATE T + | 288: 41 42 4c 45 20 74 34 28 78 29 2a 06 06 17 13 11 ABLE t4(x)*..... + | 304: 01 3f 69 6e 64 65 78 74 33 78 74 33 06 43 52 45 .?indext3xt3.CRE + | 320: 41 54 45 20 49 4e 44 45 58 20 74 33 64 20 4f 4e ATE INDEX t3d ON + | 336: 20 74 33 28 78 29 2e 04 06 17 15 11 01 45 69 6e t3(x).......Ein + | 352: 64 65 78 74 32 63 64 74 32 05 43 52 45 41 54 45 dext2cdt2.CREATE + | 368: 20 49 4e 44 45 58 20 74 32 63 64 20 4f 4e 20 74 INDEX t2cd ON t + | 384: 32 28 63 2c 64 29 28 05 06 17 11 11 01 3d 74 61 2(c,d)(......=ta + | 400: 62 6c 65 74 33 74 33 04 43 52 45 41 54 45 20 54 blet3t3.CREATE T + | 416: 41 42 4c 45 20 74 33 28 63 2c 78 2c 65 2c 66 29 ABLE t3(c,x,e,f) + | 432: 28 02 06 17 11 11 01 3d 74 61 62 6c 65 74 32 74 (......=tablet2t + | 448: 32 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 2.CREATE TABLE t + | 464: 32 28 63 2c 64 2c 65 2c 66 29 24 01 06 17 11 11 2(c,d,e,f)$..... + | 480: 01 35 74 61 62 6c 65 74 31 74 31 02 43 52 45 41 .5tablet1t1.CREA + | 496: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 29 TE TABLE t1(a,b) + | page 2 offset 512 + | 0: 0d 00 00 00 04 01 cf 00 01 fa 01 f3 01 de 01 cf ................ + | 176: 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + | 256: 00 00 14 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + | 368: 00 00 00 00 00 00 00 00 00 00 00 00 1e 00 00 00 ................ + | 416: 00 00 00 1b 00 00 00 00 04 00 00 00 00 00 00 00 ................ + | 448: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0d ................ + | 464: 04 03 17 17 73 65 76 65 6e 65 69 67 68 74 13 03 ....seveneight.. + | 480: 03 07 07 40 14 00 00 00 00 00 00 40 18 00 00 00 ...@.......@.... + | 496: 00 00 00 05 02 03 01 01 03 04 04 01 03 09 01 02 ................ + | page 3 offset 1024 + | 0: 0d 00 00 00 08 01 54 00 01 f7 01 ec 01 c5 01 aa ......T......... + | 16: 01 a1 01 96 01 6f 01 54 00 00 00 00 00 00 00 00 .....o.T........ + | 32: 00 00 00 00 00 00 00 03 e8 00 00 00 00 00 00 00 ................ + | 336: 00 00 00 00 19 08 05 16 17 17 17 65 69 67 68 74 ...........eight + | 352: 65 69 67 68 74 73 65 76 65 6e 73 65 76 ff ff ff eightsevensev... + | 368: 0e 05 07 07 07 07 40 18 00 00 00 00 00 00 40 18 ......@.......@. + | 384: 00 00 00 00 00 00 40 14 00 00 00 00 00 00 40 14 ......@.......@. + | 400: 00 00 00 00 00 00 09 06 05 01 01 01 01 04 04 03 ................ + | 416: 03 07 05 05 01 01 09 09 02 02 19 04 05 17 17 17 ................ + | 432: 17 73 65 6f 65 6e 65 69 67 68 74 65 69 67 68 74 .seoeneighteight + | 448: 73 65 76 65 6e 25 03 05 07 07 07 07 40 14 00 00 seven%......@... + | 464: 00 00 00 00 40 18 00 00 00 00 00 00 40 18 00 00 ....@.......@... + | 480: 00 00 00 00 40 14 00 00 00 00 00 00 09 02 05 01 ....@........... + | 496: 01 01 01 03 04 04 03 07 01 05 09 01 01 09 02 02 ................ + | page 4 offset 1536 + | 0: 0d 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 ................ + | 160: 00 00 00 ea 00 00 00 00 00 00 00 00 00 00 00 00 ................ + | 336: 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 00 ............ ... + | page 5 offset 2048 + | 0: 0a 00 00 00 08 01 96 00 01 fa 01 c4 01 f2 01 bc ................ + | 16: 01 dc 01 a6 01 96 01 cc 00 00 00 00 00 00 00 00 ................ + | 48: 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 ................ + | 288: 00 00 00 00 00 00 00 00 00 64 00 00 00 2b 00 00 .........d...+.. + | 400: 00 00 00 00 00 00 0f 04 17 17 01 65 69 67 68 74 ...........eight + | 416: 65 69 6f 68 74 08 15 04 07 07 01 40 18 00 00 00 eioht......@.... + | 432: 00 00 00 40 18 00 00 00 00 00 00 07 07 04 01 01 ...@............ + | 448: 01 04 04 06 07 04 01 01 01 02 02 05 0f 04 17 17 ................ + | 464: 01 73 65 76 65 6e 65 69 67 68 74 04 15 04 07 07 .seveneight..... + | 480: 01 40 14 00 00 00 00 00 00 40 18 00 00 00 00 00 .@.......@...... + | 496: 00 03 07 04 01 01 01 03 04 02 05 04 09 01 09 02 ................ + | page 6 offset 2560 + | 0: 0a 00 00 00 00 02 00 00 00 00 00 00 00 0d 00 00 ................ + | 16: 00 08 01 c2 00 01 fb 01 f6 01 f1 01 ec 01 e0 01 ................ + | 32: d4 01 cb 01 c2 00 00 00 00 00 00 00 00 00 00 00 ................ + | 160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 ................ + | 448: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 07 ................ + | 464: 08 02 17 65 69 67 68 74 07 07 02 17 65 69 67 68 ...eight....eigh + | 480: 74 0a 06 02 07 40 18 00 00 00 00 00 00 0a 05 02 t....@.......... + | 496: 07 40 18 00 04 02 01 04 03 03 02 01 04 03 02 02 .@.............. + | end x/c03.db + }] + catchsql {INSERT INTO t3 SELECT * FROM t2;} +} {1 {database disk image is malformed}} + + +do_test dbfuzz001-310 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 3584 pagesize 512 filename x/c02.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 02 00 01 01 00 40 20 20 00 00 00 0c 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 04 00 00 00 01 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0c ................ +| 96: 00 2e 2c 50 0d 00 00 00 06 01 06 00 01 da 01 b0 ..,P............ +| 112: 01 56 01 86 01 2a 01 06 00 00 00 00 00 00 00 00 .V...*.......... +| 256: 00 00 00 00 00 00 22 07 06 17 11 11 01 31 74 61 ......"......1ta +| 272: 62 6c 65 74 34 74 34 07 43 52 45 41 54 45 20 54 blet4t4.CREATE T +| 288: 41 42 4c 45 20 74 34 28 78 29 2a 06 06 17 13 11 ABLE t4(x)*..... +| 304: 01 3f 69 6e 64 65 78 74 33 78 74 33 05 43 52 45 .?indext3xt3.CRE +| 320: 41 54 45 20 49 4e 44 45 58 20 74 33 78 20 4f 4e ATE INDEX t3x ON +| 336: 20 74 33 28 78 29 2e 04 06 17 15 11 01 45 69 6e t3(x).......Ein +| 352: 64 65 78 74 32 63 64 74 32 05 43 52 45 41 54 45 dext2cdt2.CREATE +| 368: 20 49 4e 44 45 58 20 74 32 63 64 20 4f 4e 20 74 INDEX t2cd ON t +| 384: 32 28 63 2c 64 29 28 05 06 17 11 11 01 3d 74 61 2(c,d)(......=ta +| 400: 62 6c 65 74 33 74 33 07 43 52 45 41 54 45 20 54 blet3t3.CREATE T +| 416: 41 42 4c 45 20 74 33 28 63 2c 78 2c 65 2c 66 29 ABLE t3(c,x,e,f) +| 432: 28 02 06 17 11 11 01 3d 74 61 74 65 6c 03 62 74 (......=tatel.bt +| 448: 32 32 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 22CREATE TABLE t +| 464: 32 28 63 2c 64 2c 65 2c 66 29 24 01 06 17 11 11 2(c,d,e,f)$..... +| 480: 01 35 74 61 62 6c 65 74 31 74 31 02 43 52 45 41 .5tablet1t1.CREA +| 496: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 29 TE TABLE t1(a,b) +| page 2 offset 512 +| 0: 0d 00 00 00 04 01 cf 00 01 fa 01 f3 01 de 01 cf ................ +| 160: 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 .. ............. +| 448: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0d ................ +| 464: 04 03 17 17 73 65 76 65 6e 65 69 67 68 74 13 03 ....seveneight.. +| 480: 03 07 07 40 14 00 00 00 00 00 00 40 18 00 00 00 ...@.......@.... +| 496: 00 00 00 05 02 03 01 01 03 04 04 01 03 09 01 02 ................ +| page 3 offset 1024 +| 0: 0d 00 00 00 08 01 54 00 01 f7 01 ec 01 c5 01 aa ......T......... +| 16: 01 a1 01 96 01 6f 01 54 00 00 00 00 00 00 00 00 .....o.T........ +| 112: 00 00 dd 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 336: 00 00 00 00 19 08 05 17 17 17 17 65 69 67 68 74 ...........eight +| 352: 65 69 67 68 74 73 65 76 65 6e 73 65 76 65 6e 25 eightsevenseven% +| 368: 07 05 07 07 07 07 40 18 00 00 00 00 00 00 40 18 ......@.......@. +| 384: 00 00 00 00 00 00 40 14 00 00 00 00 00 00 40 14 ......@.......@. +| 400: 00 00 00 00 00 00 09 06 05 01 01 01 01 04 04 03 ................ +| 416: 03 07 05 05 01 01 09 09 02 02 19 04 05 17 17 17 ................ +| 432: 17 73 65 76 65 6e 65 69 67 68 74 65 69 67 68 74 .seveneighteight +| 448: 73 65 76 65 6e 25 03 05 07 07 07 07 40 14 00 00 seven%......@... +| 464: 00 00 00 00 40 18 00 00 00 00 00 00 40 18 00 00 ....@.......@... +| 480: 00 00 00 00 40 14 00 00 00 00 00 00 09 02 05 01 ....@........... +| 496: 01 01 01 03 04 04 03 07 01 05 09 01 01 09 02 02 ................ +| page 4 offset 1536 +| 0: 0d 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 ................ +| 192: 00 00 00 00 00 00 7f 00 00 00 00 00 00 00 00 00 ................ +| 208: 00 e5 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 2048 +| 0: 0a 00 00 00 08 01 96 00 01 fa 01 c4 01 f2 01 bc ................ +| 16: 01 dc 01 a6 01 96 01 cc 00 00 00 00 00 00 00 00 ................ +| 240: 00 00 00 00 00 00 00 00 00 00 00 00 00 0e 00 00 ................ +| 400: 00 00 00 00 00 00 0f 04 17 07 01 65 69 67 68 74 ...........eight +| 416: 65 69 67 68 74 08 15 04 07 07 01 40 18 00 00 00 eight......@.... +| 432: 00 00 00 40 18 00 00 00 00 00 00 07 07 04 01 01 ...@............ +| 448: 01 04 04 06 07 04 01 01 01 02 02 05 0f 04 17 17 ................ +| 464: 01 73 65 76 65 6e 65 69 67 68 74 04 15 04 07 07 .seveneight..... +| 480: 01 40 14 00 00 00 00 00 00 40 18 00 00 00 00 00 .@.......@...... +| 496: 00 03 07 04 01 01 01 03 04 02 05 04 09 01 09 02 ................ +| page 6 offset 2560 +| 0: 0a 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 ................ +| 464: 00 00 00 00 00 00 00 00 00 00 7f 00 00 00 00 00 ................ +| page 7 offset 3072 +| 0: 0d 00 00 00 08 01 c2 00 01 fb 01 f6 01 f1 01 ec ................ +| 16: 01 e0 01 d4 01 cb 01 c2 00 00 00 00 00 00 00 00 ................ +| 448: 00 00 07 08 02 17 65 69 67 68 74 07 07 02 17 65 ......eight....e +| 464: 69 67 68 74 0a 06 02 07 40 18 00 00 00 00 00 00 ight....@....... +| 480: 0a 05 02 07 40 18 00 00 00 00 00 00 03 04 02 01 ....@........... +| 496: 04 03 03 02 01 04 03 02 02 01 02 03 01 02 01 02 ................ +| end x/c02.db + }] +} {} + +do_catchsql_test dbfuzz001-320 { + PRAGMA integrity_check; +} {1 {database disk image is malformed}} + +do_catchsql_test dbfuzz001-330 { + DELETE FROM t3 WHERE x IN (SELECT x FROM t4); +} {1 {database disk image is malformed}} + +finish_test diff --git a/sqlite/test/dbfuzz2.c b/sqlite/test/dbfuzz2.c index 0833f038..1649d42d 100644 --- a/sqlite/test/dbfuzz2.c +++ b/sqlite/test/dbfuzz2.c @@ -43,6 +43,8 @@ #include #include #include +#include +#include #include "sqlite3.h" /* @@ -64,6 +66,95 @@ static const char *azSql[] = { /* Output verbosity level. 0 means complete silence */ int eVerbosity = 0; +/* True to activate PRAGMA vdbe_debug=on */ +static int bVdbeDebug = 0; + +/* Maximum size of the in-memory database file */ +static sqlite3_int64 szMax = 104857600; + +/***** Copy/paste from ext/misc/memtrace.c ***************************/ +/* The original memory allocation routines */ +static sqlite3_mem_methods memtraceBase; +static FILE *memtraceOut; + +/* Methods that trace memory allocations */ +static void *memtraceMalloc(int n){ + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n", + memtraceBase.xRoundup(n)); + } + return memtraceBase.xMalloc(n); +} +static void memtraceFree(void *p){ + if( p==0 ) return; + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p)); + } + memtraceBase.xFree(p); +} +static void *memtraceRealloc(void *p, int n){ + if( p==0 ) return memtraceMalloc(n); + if( n==0 ){ + memtraceFree(p); + return 0; + } + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n", + memtraceBase.xSize(p), memtraceBase.xRoundup(n)); + } + return memtraceBase.xRealloc(p, n); +} +static int memtraceSize(void *p){ + return memtraceBase.xSize(p); +} +static int memtraceRoundup(int n){ + return memtraceBase.xRoundup(n); +} +static int memtraceInit(void *p){ + return memtraceBase.xInit(p); +} +static void memtraceShutdown(void *p){ + memtraceBase.xShutdown(p); +} + +/* The substitute memory allocator */ +static sqlite3_mem_methods ersaztMethods = { + memtraceMalloc, + memtraceFree, + memtraceRealloc, + memtraceSize, + memtraceRoundup, + memtraceInit, + memtraceShutdown +}; + +/* Begin tracing memory allocations to out. */ +int sqlite3MemTraceActivate(FILE *out){ + int rc = SQLITE_OK; + if( memtraceBase.xMalloc==0 ){ + rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase); + if( rc==SQLITE_OK ){ + rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods); + } + } + memtraceOut = out; + return rc; +} + +/* Deactivate memory tracing */ +int sqlite3MemTraceDeactivate(void){ + int rc = SQLITE_OK; + if( memtraceBase.xMalloc!=0 ){ + rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase); + if( rc==SQLITE_OK ){ + memset(&memtraceBase, 0, sizeof(memtraceBase)); + } + } + memtraceOut = 0; + return rc; +} +/***** End copy/paste from ext/misc/memtrace.c ***************************/ + /* libFuzzer invokes this routine with fuzzed database files (in aData). ** This routine run SQLite against the malformed database to see if it ** can provoke a failure or malfunction. @@ -73,11 +164,14 @@ int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){ sqlite3 *db; int rc; int i; + sqlite3_int64 x; + char *zErr = 0; if( eVerbosity>=1 ){ printf("************** nByte=%d ***************\n", (int)nByte); fflush(stdout); } + if( sqlite3_initialize() ) return 0; rc = sqlite3_open(0, &db); if( rc ) return 1; a = sqlite3_malloc64(nByte+1); @@ -86,12 +180,22 @@ int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){ sqlite3_deserialize(db, "main", a, nByte, nByte, SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE); + x = szMax; + sqlite3_file_control(db, "main", SQLITE_FCNTL_SIZE_LIMIT, &x); + if( bVdbeDebug ){ + sqlite3_exec(db, "PRAGMA vdbe_debug=ON", 0, 0, 0); + } for(i=0; i=1 ){ printf("%s\n", azSql[i]); fflush(stdout); } - sqlite3_exec(db, azSql[i], 0, 0, 0); + zErr = 0; + rc = sqlite3_exec(db, azSql[i], 0, 0, &zErr); + if( rc && eVerbosity>=1 ){ + printf("-- rc=%d zErr=%s\n", rc, zErr); + } + sqlite3_free(zErr); } rc = sqlite3_close(db); if( rc!=SQLITE_OK ){ @@ -108,31 +212,142 @@ int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){ return 0; } +/* +** Return the number of "v" characters in a string. Return 0 if there +** are any characters in the string other than "v". +*/ +static int numberOfVChar(const char *z){ + int N = 0; + while( z[0] && z[0]=='v' ){ + z++; + N++; + } + return z[0]==0 ? N : 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 i, j, n; 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; i0 ){ + eVerbosity += n; + continue; + } + if( strcmp(z,"vdbe-debug")==0 ){ + bVdbeDebug = 1; + continue; + } + if( strcmp(z,"memtrace")==0 ){ + sqlite3MemTraceActivate(stdout); + continue; + } + if( strcmp(z,"mem")==0 ){ + bVdbeDebug = 1; + continue; + } + if( strcmp(z,"max-db-size")==0 ){ + if( i+1==argc ){ + fprintf(stderr, "missing argument to %s\n", argv[i]); + exit(1); + } + szMax = strtol(argv[++i], 0, 0); + continue; + } + if( strcmp(z,"max-stack")==0 + || strcmp(z,"max-data")==0 + || strcmp(z,"max-as")==0 + ){ + struct rlimit x,y; + int resource = RLIMIT_STACK; + char *zType = "RLIMIT_STACK"; + if( i+1==argc ){ + fprintf(stderr, "missing argument to %s\n", argv[i]); + exit(1); + } + if( z[4]=='d' ){ + resource = RLIMIT_DATA; + zType = "RLIMIT_DATA"; + } + if( z[4]=='a' ){ + resource = RLIMIT_AS; + zType = "RLIMIT_AS"; + } + memset(&x,0,sizeof(x)); + getrlimit(resource, &x); + y.rlim_cur = atoi(argv[++i]); + y.rlim_max = x.rlim_cur; + setrlimit(resource, &y); + memset(&y,0,sizeof(y)); + getrlimit(resource, &y); + printf("%s changed from %d to %d\n", + zType, (int)x.rlim_cur, (int)y.rlim_cur); continue; } } - newArgv[j++] = argv[i]; + argv[j++] = argv[i]; } - newArgv[j] = 0; - *pArgv = newArgv; + argv[j] = 0; *pArgc = j; return 0; } + +#ifdef STANDALONE +/* +** Read an entire file into memory. Space to hold the file comes +** from malloc(). +*/ +static unsigned char *readFile(const char *zName, int *pnByte){ + FILE *in = fopen(zName, "rb"); + long nIn; + size_t nRead; + unsigned char *pBuf; + if( in==0 ) return 0; + fseek(in, 0, SEEK_END); + nIn = ftell(in); + rewind(in); + pBuf = malloc( nIn+1 ); + if( pBuf==0 ){ fclose(in); return 0; } + nRead = fread(pBuf, nIn, 1, in); + fclose(in); + if( nRead!=1 ){ + free(pBuf); + return 0; + } + pBuf[nIn] = 0; + if( pnByte ) *pnByte = nIn; + return pBuf; +} +#endif /* STANDALONE */ + +#ifdef STANDALONE +int main(int argc, char **argv){ + int i; + LLVMFuzzerInitialize(&argc, &argv); + for(i=1; i0 ){ + struct rusage x; + printf("SQLite %s\n", sqlite3_sourceid()); + memset(&x, 0, sizeof(x)); + if( getrusage(RUSAGE_SELF, &x)==0 ){ + printf("Maximum RSS = %ld KB\n", x.ru_maxrss); + } + } + return 0; +} +#endif /*STANDALONE*/ diff --git a/sqlite/test/e_select.test b/sqlite/test/e_select.test index 5916e948..c2fdc9ad 100644 --- a/sqlite/test/e_select.test +++ b/sqlite/test/e_select.test @@ -167,7 +167,7 @@ do_select_tests e_select-0.2 { 0102.1 "SELECT count(*), max(a) FROM t1 GROUP BY b HAVING count(*)=1" { 1 a 1 c 1 b } - 0102.2 "SELECT count(*), max(a) FROM t1 GROUP BY b HAVING count(*)=2" { } + 0102.2 "SELECT count(*), max(a) FROM t1 GROUP BY b HAVING count(*)=2" {} 1101.1 "SELECT DISTINCT count(*), max(a) FROM t1 GROUP BY b" {1 a 1 c 1 b} 1102.1 "SELECT DISTINCT count(*), max(a) FROM t1 @@ -175,8 +175,7 @@ do_select_tests e_select-0.2 { 1 a 1 c 1 b } 1102.2 "SELECT DISTINCT count(*), max(a) FROM t1 - GROUP BY b HAVING count(*)=2" { - } + GROUP BY b HAVING count(*)=2" {} 2101.1 "SELECT ALL count(*), max(a) FROM t1 GROUP BY b" {1 a 1 c 1 b} 2102.1 "SELECT ALL count(*), max(a) FROM t1 @@ -184,8 +183,7 @@ do_select_tests e_select-0.2 { 1 a 1 c 1 b } 2102.2 "SELECT ALL count(*), max(a) FROM t1 - GROUP BY b HAVING count(*)=2" { - } + GROUP BY b HAVING count(*)=2" {} 0011.1 "SELECT 1, 2, 3 WHERE 1 GROUP BY 2" {1 2 3} 0012.1 "SELECT 1, 2, 3 WHERE 0 GROUP BY 2 HAVING count(*)=1" {} @@ -204,7 +202,7 @@ do_select_tests e_select-0.2 { 0112.1 "SELECT count(*), max(a) FROM t1 WHERE a='c' GROUP BY b HAVING count(*)=1" {1 c} 0112.2 "SELECT count(*), max(a) FROM t1 - WHERE 0 GROUP BY b HAVING count(*)=2" { } + WHERE 0 GROUP BY b HAVING count(*)=2" {} 1111.1 "SELECT DISTINCT count(*), max(a) FROM t1 WHERE a<'c' GROUP BY b" {1 a 1 b} 1112.1 "SELECT DISTINCT count(*), max(a) FROM t1 WHERE a>'a' @@ -212,8 +210,7 @@ do_select_tests e_select-0.2 { 1 c 1 b } 1112.2 "SELECT DISTINCT count(*), max(a) FROM t1 WHERE 0 - GROUP BY b HAVING count(*)=2" { - } + GROUP BY b HAVING count(*)=2" {} 2111.1 "SELECT ALL count(*), max(a) FROM t1 WHERE b>'one' GROUP BY b" {1 c 1 b} @@ -222,7 +219,7 @@ do_select_tests e_select-0.2 { 1 a 1 c } 2112.2 "SELECT ALL count(*), max(a) FROM t1 - WHERE 0 GROUP BY b HAVING count(*)=2" { } + WHERE 0 GROUP BY b HAVING count(*)=2" {} } diff --git a/sqlite/test/eqp.test b/sqlite/test/eqp.test index 3de746e3..f931f8f3 100644 --- a/sqlite/test/eqp.test +++ b/sqlite/test/eqp.test @@ -45,8 +45,10 @@ do_eqp_test 1.2 { } { QUERY PLAN |--MULTI-INDEX OR - | |--SEARCH TABLE t1 USING INDEX i1 (a=?) - | `--SEARCH TABLE t1 USING INDEX i2 (b=?) + | |--INDEX 1 + | | `--SEARCH TABLE t1 USING INDEX i1 (a=?) + | `--INDEX 2 + | `--SEARCH TABLE t1 USING INDEX i2 (b=?) `--SCAN TABLE t2 } do_eqp_test 1.3 { @@ -55,8 +57,10 @@ do_eqp_test 1.3 { QUERY PLAN |--SCAN TABLE t2 `--MULTI-INDEX OR - |--SEARCH TABLE t1 USING INDEX i1 (a=?) - `--SEARCH TABLE t1 USING INDEX i2 (b=?) + |--INDEX 1 + | `--SEARCH TABLE t1 USING INDEX i1 (a=?) + `--INDEX 2 + `--SEARCH TABLE t1 USING INDEX i2 (b=?) } do_eqp_test 1.3 { SELECT a FROM t1 ORDER BY a @@ -225,7 +229,7 @@ do_eqp_test 3.1.1 { } { QUERY PLAN |--SCAN TABLE t1 - `--SCALAR SUBQUERY + `--SCALAR SUBQUERY xxxxxx `--SCAN TABLE t1 AS sub } do_eqp_test 3.1.2 { @@ -233,7 +237,7 @@ do_eqp_test 3.1.2 { } { QUERY PLAN |--SCAN TABLE t1 - `--SCALAR SUBQUERY + `--SCALAR SUBQUERY xxxxxx `--SCAN TABLE t1 AS sub } do_eqp_test 3.1.3 { @@ -241,7 +245,7 @@ do_eqp_test 3.1.3 { } { QUERY PLAN |--SCAN TABLE t1 - `--SCALAR SUBQUERY + `--SCALAR SUBQUERY xxxxxx |--SCAN TABLE t1 AS sub `--USE TEMP B-TREE FOR ORDER BY } @@ -250,7 +254,7 @@ do_eqp_test 3.1.4 { } { QUERY PLAN |--SCAN TABLE t1 - `--SCALAR SUBQUERY + `--SCALAR SUBQUERY xxxxxx `--SCAN TABLE t2 USING COVERING INDEX t2i1 } @@ -286,7 +290,7 @@ det 3.3.1 { } { QUERY PLAN |--SCAN TABLE t1 - `--LIST SUBQUERY + `--LIST SUBQUERY xxxxxx `--SCAN TABLE t2 } det 3.3.2 { @@ -294,7 +298,7 @@ det 3.3.2 { } { QUERY PLAN |--SCAN TABLE t1 - `--CORRELATED LIST SUBQUERY + `--CORRELATED LIST SUBQUERY xxxxxx `--SCAN TABLE t2 } det 3.3.3 { @@ -302,7 +306,7 @@ det 3.3.3 { } { QUERY PLAN |--SCAN TABLE t1 - `--CORRELATED SCALAR SUBQUERY + `--CORRELATED SCALAR SUBQUERY xxxxxx `--SCAN TABLE t2 } @@ -813,7 +817,7 @@ do_eqp_test 9.1 { |--MATERIALIZE xxxxxx | |--SCAN TABLE forumpost AS x USING INDEX forumthread | |--USING ROWID SEARCH ON TABLE private FOR IN-OPERATOR - | |--CORRELATED SCALAR SUBQUERY + | |--CORRELATED SCALAR SUBQUERY xxxxxx | | |--SEARCH TABLE forumpost USING COVERING INDEX forumthread (froot=?) | | `--USING ROWID SEARCH ON TABLE private FOR IN-OPERATOR | `--USE TEMP B-TREE FOR ORDER BY diff --git a/sqlite/test/fallocate.test b/sqlite/test/fallocate.test index 0c971c08..3e154482 100644 --- a/sqlite/test/fallocate.test +++ b/sqlite/test/fallocate.test @@ -70,6 +70,15 @@ do_test fallocate-1.7 { } {1024} do_test fallocate-1.8 { execsql { COMMIT } } {} +do_test fallocate-1.8 { + set nPg [db one {PRAGMA page_count}] + set nFile [expr [file size test.db] / 1024] + list [expr $nPg<100] [expr $nFile>100] +} {1 1} + +do_execsql_test fallocate-1.9 { + PRAGMA max_page_count = 100; +} {100} #------------------------------------------------------------------------- # The following tests - fallocate-2.* - test that things work in WAL diff --git a/sqlite/test/fkey8.test b/sqlite/test/fkey8.test index 4269c20a..f38e835a 100644 --- a/sqlite/test/fkey8.test +++ b/sqlite/test/fkey8.test @@ -164,4 +164,38 @@ do_catchsql_test 2.3.1 { DELETE FROM p3 WHERE a=1 } {1 {FOREIGN KEY constraint failed}} + +do_execsql_test 3.0 { + PRAGMA foreign_keys=ON; + CREATE TABLE t2( + a PRIMARY KEY, b, c, d, e, + FOREIGN KEY(b, c) REFERENCES t2(d, e) + ) WITHOUT ROWID; + CREATE UNIQUE INDEX idx ON t2(d, e); + + INSERT INTO t2 VALUES(1, 'one', 'one', 'one', 'one'); -- row is parent of self + INSERT INTO t2 VALUES(2, 'one', 'one', 'one', NULL); -- parent is row 1 +} + +do_catchsql_test 3.1 { + DELETE FROM t2 WHERE a=1; +} {1 {FOREIGN KEY constraint failed}} + +do_execsql_test 4.0 { + CREATE TABLE t1 ( + c1 PRIMARY KEY, + c2 NUMERIC, + FOREIGN KEY(c1) REFERENCES t1(c2) + ) WITHOUT ROWID ; + CREATE INDEX t1c1 ON t1(c1); + CREATE UNIQUE INDEX t1c1unique ON t1(c2); +} +do_catchsql_test 4.1 { + INSERT OR REPLACE INTO t1 VALUES(10000, 20000); +} {1 {FOREIGN KEY constraint failed}} +do_execsql_test 4.2 { + INSERT OR REPLACE INTO t1 VALUES(20000, 20000); +} + finish_test + diff --git a/sqlite/test/fts3_common.tcl b/sqlite/test/fts3_common.tcl index 2ed1f70b..fcd3ca3e 100644 --- a/sqlite/test/fts3_common.tcl +++ b/sqlite/test/fts3_common.tcl @@ -44,6 +44,10 @@ # # +ifcapable fts3 { + sqlite3_fts3_may_be_corrupt 0 +} + #------------------------------------------------------------------------- # USAGE: fts3_build_db_1 SWITCHES N # diff --git a/sqlite/test/fts3aa.test b/sqlite/test/fts3aa.test index d5f96d81..cb1bde74 100644 --- a/sqlite/test/fts3aa.test +++ b/sqlite/test/fts3aa.test @@ -250,5 +250,16 @@ do_execsql_test 9.2 { CREATE VIRTUAL TABLE t10 USING fts3(<, b, c); } +do_execsql_test 10.0 { + CREATE VIRTUAL TABLE z1 USING fts3; + INSERT INTO z1 VALUES('one two three'),('four one five'),('six two five'); + CREATE TRIGGER z1r1 AFTER DELETE ON z1_content BEGIN + DELETE FROM z1; + END; +} +do_catchsql_test 10.1 { + DELETE FROM z1; +} {1 {SQL logic error}} + expand_all_sql db finish_test diff --git a/sqlite/test/fts3aux2.test b/sqlite/test/fts3aux2.test index e108fc4b..95540225 100644 --- a/sqlite/test/fts3aux2.test +++ b/sqlite/test/fts3aux2.test @@ -141,4 +141,28 @@ do_execsql_test 1.4.6 { five * 1 1 2 five 0 1 1 2 } +#------------------------------------------------------------------------- +do_execsql_test 2.0 { + CREATE VIRTUAL TABLE ft USING fts3(); + INSERT INTO ft VALUES('a_234567890123456789'); + INSERT INTO ft VALUES('b_234567890123456789'); + INSERT INTO ft VALUES('c_234567890123456789'); + CREATE VIRTUAL TABLE t2 USING fts4aux(ft); +} + +do_execsql_test 2.1 { + SELECT term FROM t2 WHERE term=X'625f323334353637383930313233343536373839'; +} + +do_execsql_test 2.2 { + SELECT term FROM t2 WHERE term0 665..ad..... +| 3440: 08 69 70 69 73 63 69 6e 67 03 01 08 00 01 05 6c .ipiscing......l +| 3456: 69 71 75 61 03 02 0c 00 05 02 69 70 03 04 04 00 iqua......ip.... +| 3472: 01 03 6d 65 74 03 01 06 00 01 03 6e 69 6d 03 08 ..met......nim.. +| 3488: 09 00 01 03 75 74 65 03 05 03 00 00 06 63 69 6c ....ute......cil +| 3504: 6c 75 6d 03 06 02 00 01 06 6f 6d 6d 6f 64 6f 03 lum......ommodo. +| 3520: 04 07 00 02 09 6e 73 65 63 74 65 74 75 72 03 01 .....nsectetur.. +| 3536: 07 00 05 04 71 75 61 74 03 04 08 00 01 04 75 6c ....quat......ul +| 3552: 70 61 03 08 04 00 02 07 70 69 64 61 74 61 74 03 pa......pidatat. +| 3568: 07 05 00 00 08 64 65 73 65 72 75 6e 74 03 08 07 .....deserunt... +| 3584: 00 01 01 6f 03 02 03 00 02 03 6c 6f 72 06 01 04 ...o......lor... +| 3600: 00 04 05 00 05 01 65 06 02 0a 00 04 03 00 01 03 ......e......... +| 3616: 75 69 73 03 05 02 00 00 02 65 61 03 04 06 00 01 uis......ea..... +| 3632: 06 69 75 73 6d 6f 64 03 02 04 00 01 03 6c 69 74 .iusmod......lit +| 3648: 03 01 09 00 01 03 6e 69 6d 03 03 03 00 01 03 73 ......nim......s +| 3664: 73 65 03 05 0b 00 02 01 74 03 08 0b 00 01 01 74 se......t......t +| 3680: 03 02 09 00 01 01 75 03 06 04 00 01 01 78 03 04 ......u......x.. +| 3696: 05 00 02 07 63 65 70 74 65 75 72 03 07 02 00 02 ....cepteur..... +| 3712: 0a 65 72 63 69 74 61 74 69 6f 6e 03 03 09 00 00 .ercitation..... +| 3728: 06 66 75 67 69 61 74 03 06 05 00 00 02 69 64 03 .fugiat......id. +| 3744: 08 0a 00 01 01 6e 07 05 06 04 00 03 03 00 02 08 .....n.......... +| 3760: 63 69 64 69 64 75 6e 74 03 02 06 00 01 04 70 73 cididunt......ps +| 3776: 75 6d 03 01 03 00 01 04 72 75 72 65 03 05 04 00 um......rure.... +| 3792: 00 06 6c 61 62 6f 72 65 03 02 08 00 05 02 69 73 ..labore......is +| 3808: 03 03 0b 00 05 02 75 6d 03 08 0c 00 01 04 6f 72 ......um......or +| 3824: 65 6d 03 01 02 00 00 05 6d 61 67 6e 61 03 02 0b em......magna... +| 3840: 00 01 04 69 6e 69 6d 03 03 05 00 01 05 6f 6c 6c ...inim......oll +| 3856: 69 74 03 08 08 00 00 04 6e 69 73 69 03 04 02 00 it......nisi.... +| 3872: 01 02 6f 6e 03 07 06 00 02 05 73 74 72 75 64 03 ..on......strud. +| 3888: 03 08 00 01 04 75 6c 6c 61 03 06 06 00 00 08 6f .....ulla......o +| 3904: 63 63 61 65 63 61 74 03 07 04 00 01 06 66 66 69 ccaecat......ffi +| 3920: 63 69 61 03 08 06 00 00 08 70 61 72 69 61 74 75 cia......pariatu +| 3936: 72 03 06 07 00 01 07 72 6f 69 64 65 6e 74 03 07 r......roident.. +| 3952: 07 00 00 03 71 75 69 03 08 05 00 03 01 73 03 03 ....qui......s.. +| 3968: 07 00 00 0d 72 65 70 72 65 68 65 6e 64 65 72 69 ....reprehenderi +| 3984: 74 03 05 07 00 00 03 73 65 64 03 02 02 00 01 03 t......sed...... +| 4000: 69 6e 74 03 07 03 00 02 01 74 03 01 05 00 01 03 int......t...... +| 4016: 75 6e 74 03 08 02 00 00 06 74 65 6d 70 6f 72 03 unt......tempor. +| 4032: 02 05 00 00 07 75 6c 6c 61 6d 63 6f 03 03 0a 00 .....ullamco.... +| 4048: 01 01 74 09 02 07 00 01 02 00 01 03 00 00 05 76 ..t............v +| 4064: 65 6c 69 74 03 05 0a 00 02 04 6e 69 61 6d 03 03 elit......niam.. +| 4080: 06 00 01 08 6f 6c 75 70 74 61 74 65 03 05 09 00 ....oluptate.... +| page 5 offset 16384 +| 0: 0a 00 00 00 03 0f eb 00 0f fb 0f f3 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 07 04 02 08 01 ................ +| 4080: 08 00 03 07 04 02 08 01 04 00 02 04 04 08 08 09 ................ +| page 6 offset 20480 +| 0: 0d 00 00 00 08 0f d0 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0b 04 07 03 00 0e 06 04 06 03 00 ................ +| 4064: 0e 06 04 05 03 00 0e 0a 04 04 03 00 0e 07 04 03 ................ +| 4080: 03 00 0e 0a 04 02 03 00 0e 0b 04 01 03 00 0e 08 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 01 0f f7 00 0f f7 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 07 00 03 00 14 08 45 b5 03 .............E.. +| page 8 offset 28672 +| 0: 6f ee cd e1 f1 ee 1a ca be ed ee ec de ac f1 cb o............... +| 16: f1 ee 1a ce de ee f1 ee 0a cc de ed ae 90 87 88 ................ +| 32: ec 5e dc ec fc 11 72 32 75 0a da be ec ed eb de .^....r2u....... +| 48: ce c1 aa e0 ae ec 1f c1 ee 99 c2 aa e0 a9 ad 15 ................ +| 64: 0e ec ab ef 1e e0 48 ad 15 04 24 80 00 00 00 00 ......H...$..... +| 80: 00 00 00 00 e0 00 00 00 04 2c 80 00 10 42 4e c1 .........,...BN. +| 96: 20 4b 45 59 2c 6e 6f 64 65 6e 6f 2c 61 30 29 46 KEY,nodeno,a0)F +| 112: 02 06 17 11 11 08 7b 74 61 62 6c 65 74 31 74 31 .......tablet1t1 +| 128: 43 52 45 41 54 e1 ec eb ea eb eb ac ee ce be de CREAT........... +| 144: ee f1 ee 1a ca ba de 47 80 30 00 14 90 47 70 30 .......G.0...Gp0 +| 160: 00 11 60 47 60 30 00 15 f0 47 50 30 00 10 f0 47 ..`G`0...GP0...G +| 176: 40 30 00 11 f0 47 45 20 30 00 11 d0 45 10 30 00 @0...GE 0...E.0. +| 192: 12 10 45 00 30 00 14 e0 44 f0 30 00 11 e0 44 e0 ..E.0...D.0...D. +| 208: 30 00 12 a0 44 d0 30 00 15 e0 44 c0 30 00 10 40 0...D.0...D.0..@ +| 224: 44 b0 30 00 15 10 44 a0 30 00 14 c0 44 90 30 00 D.0...D.0...D.0. +| 240: 16 20 44 80 30 00 52 45 41 54 45 20 54 41 42 4c . D.0.REATE TABL +| 256: 45 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 E 't1_content'(i +| 272: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 288: 59 20 4b 45 59 2c 20 63 30 29 69 03 07 17 19 19 Y KEY, c0)i..... +| 304: 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 ..-tablet1_idxt1 +| 320: 5f 69 64 78 03 43 52 45 41 54 45 20 54 41 42 4c _idx.CREATE TABL +| 336: 45 20 27 70 31 5f 69 64 78 03 6e 69 6d 03 03 03 E 'p1_idx.nim... +| 352: 00 01 03 73 73 65 03 05 0b 00 02 01 74 03 08 0b ...sse......t... +| 368: 00 01 01 74 03 02 09 00 01 01 75 03 06 04 00 01 ...t......u..... +| 384: 01 78 03 04 05 00 02 07 63 65 70 74 65 75 72 03 .x......cepteur. +| 400: 07 02 00 02 0a 65 72 63 69 74 61 74 69 6f 6e 03 .....ercitation. +| 416: 03 09 00 00 06 66 75 67 69 61 74 03 06 05 00 00 .....fugiat..... +| 432: 02 69 64 03 08 0a 00 01 01 6e 07 05 06 04 00 03 .id......n...... +| 448: 03 00 02 08 63 69 64 69 64 75 6e 74 03 02 06 00 ....cididunt.... +| 464: 01 04 70 73 75 6d 03 01 03 00 01 04 72 75 72 65 ..psum......rure +| 480: 03 05 04 00 00 06 6c 61 62 6f 72 65 03 02 08 00 ......labore.... +| 496: 05 02 69 73 03 03 0b 00 05 02 75 6d 03 08 0c 00 ..is......um.... +| 512: 01 04 6f 72 65 6d 03 01 02 00 00 05 6d 61 67 6e ..orem......magn +| 528: 61 03 02 0b 00 01 04 69 6e 69 6d 03 03 05 00 01 a......inim..... +| 544: 05 6f 6c 6c 69 74 03 08 08 00 00 04 6e 69 73 69 .ollit......nisi +| 560: 03 04 02 00 01 02 6f 6e 03 07 06 00 02 05 73 74 ......on......st +| 576: 72 75 64 03 03 08 00 01 04 75 6c 6c 61 03 06 06 rud......ulla... +| 592: 00 00 08 6f 63 63 61 65 63 61 74 03 07 04 00 01 ...occaecat..... +| 608: 06 66 66 69 63 69 61 03 08 06 00 00 08 70 61 72 .fficia......par +| 624: 69 61 74 75 72 03 06 07 00 01 07 72 6f ed ce de iatur......ro... +| 640: 69 64 65 6e 74 03 07 07 00 00 03 71 75 69 03 08 ident......qui.. +| 656: 05 00 03 01 73 03 03 07 00 00 0d 72 65 70 72 65 ....s......repre +| 672: 68 65 6e 64 65 72 69 74 03 05 07 00 00 03 73 65 henderit......se +| 688: 64 03 02 02 00 01 03 69 6e 74 03 07 03 00 02 01 d......int...... +| 704: 74 03 01 05 00 01 03 75 6e 74 03 08 02 00 00 06 t......unt...... +| 720: 74 65 6d 70 6f 72 03 02 05 00 00 07 75 6c 6c 61 tempor......ulla +| 736: 6d 63 6f 03 03 0a 00 01 01 74 09 02 07 00 01 02 mco......t...... +| 752: 00 01 03 00 00 05 76 65 6c 69 74 03 05 0a 00 02 ......velit..... +| 768: 04 6e 69 61 6d 03 03 06 00 01 08 6f 6c 75 70 74 .niam......olupt +| 784: 61 74 65 03 05 09 00 0a 00 00 00 03 0f eb 00 0f ate............. +| 800: fb 0f f3 0f eb 00 00 00 00 00 00 00 00 00 00 00 ................ +| end crash-04bb6e7c811ce9.db +}]} {} + +do_catchsql_test 7.1 { + SELECT matchinfo(t1,'y') FROM t1 WHERE t1 MATCH 'e*'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 8.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-7948058d822acb.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e ef 00 07 0d 4d 00 0f bd 0f 5f ..........M...._ +| 112: 0e f7 0e 06 0e bc 0d a4 0d 4d 00 00 00 00 00 00 .........M...... +| 3392: 00 00 00 00 00 00 00 00 00 00 00 00 00 55 07 07 .............U.. +| 3408: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 73 74 ......tablet1_st +| 3424: 61 74 74 31 5f 73 74 61 74 07 43 52 45 41 54 45 att1_stat.CREATE +| 3440: 20 54 41 42 4c 45 20 27 74 31 5f 73 74 61 74 27 TABLE 't1_stat' +| 3456: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3472: 41 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 20 42 ARY KEY, value B +| 3488: 4c 4f 42 29 60 06 07 17 21 21 01 81 0b 74 61 62 LOB)`...!!...tab +| 3504: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3520: 6f 63 73 69 7a 65 06 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3536: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3552: 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 (docid INTEGER P +| 3568: 52 49 4d 41 52 59 20 4b 45 59 2c 20 73 69 7a 65 RIMARY KEY, size +| 3584: 20 42 4c 4f 42 29 81 33 04 07 17 1f 1f 01 82 35 BLOB).3.......5 +| 3600: 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 74 31 tablet1_segdirt1 +| 3616: 5f 73 65 67 64 69 72 04 43 52 45 41 54 45 20 54 _segdir.CREATE T +| 3632: 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 72 27 ABLE 't1_segdir' +| 3648: 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 2c 69 (level INTEGER,i +| 3664: 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 72 74 dx INTEGER,start +| 3680: 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 6c _block INTEGER,l +| 3696: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 eaves_end_block +| 3712: 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c 6f 63 INTEGER,end_bloc +| 3728: 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 20 42 k INTEGER,root B +| 3744: 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 LOB,PRIMARY KEY( +| 3760: 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 05 06 17 level, idx))1... +| 3776: 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 65 5f E...indexsqlite_ +| 3792: 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 65 67 autoindex_t1_seg +| 3808: 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 05 00 dir_1t1_segdir.. +| 3824: 00 00 08 00 00 00 00 66 03 07 17 23 23 01 81 13 .......f...##... +| 3840: 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e 74 73 tablet1_segments +| 3856: 74 31 5f 73 65 67 6d 65 6e 74 73 03 43 52 45 41 t1_segments.CREA +| 3872: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 TE TABLE 't1_seg +| 3888: 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 20 49 ments'(blockid I +| 3904: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K +| 3920: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 5c EY, block BLOB). +| 3936: 02 07 17 21 21 01 81 03 74 61 62 6c 65 74 31 5f ...!!...tablet1_ +| 3952: 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 65 6e contentt1_conten +| 3968: 74 02 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 t.CREATE TABLE ' +| 3984: 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 63 69 t1_content'(doci +| 4000: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 4016: 59 20 4b 45 59 2c 20 27 63 30 61 27 29 41 01 06 Y KEY, 'c0a')A.. +| 4032: 17 11 11 08 71 74 61 62 6c 65 74 31 74 31 43 52 ....qtablet1t1CR +| 4048: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4064: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34 LE t1 USING fts4 +| 4080: 28 61 2c 70 72 65 66 69 78 3d 27 31 2c 32 27 29 (a,prefix='1,2') +| page 2 offset 4096 +| 0: 0d 00 00 00 08 0e 1f 00 0f c4 0f 7c 0f 34 0f 07 ...........|.4.. +| 16: 0e c3 0e 97 0e 63 0e 1f 00 00 00 00 00 00 00 00 .....c.......... +| 3600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 42 ...............B +| 3616: 08 04 00 81 09 73 75 6e 74 20 69 6e 20 63 75 6c .....sunt in cul +| 3632: 70 61 20 71 75 69 20 6f 66 66 69 63 69 61 20 64 pa qui officia d +| 3648: 65 73 65 72 75 6e 74 20 6d 6f 6c 6c 69 74 20 61 eserunt mollit a +| 3664: 6e 69 6d 20 69 64 20 65 73 74 20 6c 61 62 6f 72 nim id est labor +| 3680: 75 6d 2e 32 07 03 00 6b 45 78 63 65 70 74 65 75 um.2...kExcepteu +| 3696: 72 20 73 69 6e 74 20 6f 63 63 61 65 63 67 42 06 r sint occaecgB. +| 3712: 37 57 06 96 46 17 46 17 42 06 e6 f6 e2 07 07 26 7W..F.F.B......& +| 3728: f6 96 46 56 e7 42 c2 a0 60 30 05 b6 36 96 c6 c7 ..FV.B..`0..6... +| 3744: 56 d2 06 46 f6 c6 f7 26 52 06 57 52 06 67 56 7c V..F...&R.WR.gV| +| 3760: 65 3f 04 20 6e 75 6c 6c 61 20 70 61 72 69 61 74 e?. nulla pariat +| 3776: 75 72 2e 42 05 04 00 81 09 44 75 69 73 20 61 75 ur.B.....Duis au +| 3792: 74 65 20 69 72 75 72 65 20 64 6f 6c 6f 72 20 69 te irure dolor i +| 3808: 6e 20 72 65 70 72 65 68 65 6e 64 65 72 69 74 20 n reprehenderit +| 3824: 69 6e 20 76 6f 6c 75 70 74 61 74 65 20 76 65 6c in voluptate vel +| 3840: 69 74 20 65 73 73 65 2b 04 03 00 5d 6e 69 73 69 it esse+...]nisi +| 3856: 20 75 74 20 61 7c 69 71 75 69 70 20 65 78 20 65 ut a|iquip ex e +| 3872: 61 20 63 6f 6d 6d 6f 64 6f 20 63 6f 6e 73 65 71 a commodo conseq +| 3888: 75 61 74 2e 46 03 04 00 81 11 55 74 20 65 6e 69 uat.F.....Ut eni +| 3904: 6d 20 61 64 20 6d 69 6e 69 6d 20 76 65 6e 69 61 m ad minim venia +| 3920: 6d 2c 20 71 75 69 73 20 6e 6f 73 74 72 75 64 20 m, quis nostrud +| 3936: 65 78 65 72 63 69 74 61 74 69 6f 6e 20 75 6c 6c exercitation ull +| 3952: 61 6d 63 6f 20 6c 61 62 6f 72 69 73 46 02 04 00 amco laborisF... +| 3968: 81 11 73 65 64 20 64 6f 20 65 69 75 73 6d 6f 64 ..sed do eiusmod +| 3984: 20 74 65 6d 70 6f 72 20 69 6e 63 69 64 69 64 75 tempor incididu +| 4000: 6e 74 20 75 74 20 6c 61 62 6f 72 65 20 65 74 20 nt ut labore et +| 4016: 64 6f 6c 6f 72 65 20 6d 61 67 6e 61 20 61 6c 69 dolore magna ali +| 4032: 71 75 61 2e 3a 01 03 00 7b 4c 6f 72 65 6d 20 69 qua.:....Lorem i +| 4048: 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 psum dolor sit a +| 4064: 6d 65 74 2c 20 63 6f 6e 73 65 63 74 65 74 75 72 met, consectetur +| 4080: 20 61 64 69 70 69 73 63 69 6e 67 20 65 6c 69 74 adipiscing elit +| page 3 offset 8192 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0a a6 00 0d 57 0c 4a 0a a6 00 00 .........W.J.... +| 2720: 00 00 00 00 00 00 83 21 03 08 02 08 08 08 17 86 .......!........ +| 2736: 30 08 00 30 20 34 30 32 00 02 61 64 06 01 08 00 0..0 402..ad.... +| 2752: 02 04 00 01 01 6c 06 02 0c 00 02 04 00 01 01 6d .....l.........m +| 2768: 03 01 06 00 01 01 6e 03 08 00 00 91 01 75 03 05 ......n......u.. +| 2784: 03 00 00 02 63 69 03 06 02 00 01 01 6f 07 01 07 ....ci......o... +| 2800: 00 03 07 03 00 01 01 75 06 07 05 00 01 04 00 00 .......u........ +| 2816: 02 64 65 03 08 07 00 01 01 6f 0d 01 04 00 01 03 .de......o...... +| 2832: 09 00 03 05 00 01 03 00 01 01 75 03 05 02 00 00 ..........u..... +| 2848: 02 65 61 03 04 06 00 01 01 69 03 02 04 00 01 01 .ea......i...... +| 2864: 6c 03 01 09 00 01 01 6e 30 03 03 00 01 01 73 06 l......n0.....s. +| 2880: 05 0b 00 03 0b 00 01 01 74 03 02 09 00 01 01 75 ........t......u +| 2896: 03 06 04 00 01 01 78 09 03 09 00 01 05 00 03 02 ......x......... +| 2912: 00 00 02 66 75 03 06 05 00 00 02 69 64 03 08 0a ...fu......id... +| 2928: 00 01 01 6e 0a 02 06 00 03 06 04 00 03 03 00 01 ...n............ +| 2944: 01 70 03 01 03 00 01 01 72 03 05 04 00 00 02 6c .p......r......l +| 2960: 61 09 02 08 00 01 0b 00 05 0c 00 01 01 6f 03 01 a............o.. +| 2976: 02 00 00 02 6d 61 03 02 0b 00 01 01 69 03 03 05 ....ma......i... +| 2992: 00 01 01 6f 03 08 08 00 00 02 6e 69 03 04 02 00 ...o......ni.... +| 3008: 01 01 6f 06 03 08 00 04 06 00 01 01 75 03 06 06 ..o.........u... +| 3024: 00 00 02 6f 63 03 07 04 00 01 01 66 03 08 06 00 ...oc......f.... +| 3040: 00 02 70 61 03 06 07 00 01 01 72 03 07 07 00 00 ..pa......r..... +| 3056: 02 71 75 06 03 07 00 05 05 00 00 02 72 65 03 05 .qu.........re.. +| 3072: 07 00 00 02 73 65 03 02 02 00 01 01 69 06 01 05 ....se......i... +| 3088: 00 06 03 00 01 01 75 03 08 02 00 00 02 74 65 03 ......u......te. +| 3104: 02 05 00 00 02 75 6c 03 03 0a 00 01 01 74 09 02 .....ul......t.. +| 3120: 07 00 01 02 00 01 03 00 00 02 76 65 06 03 06 00 ..........ve.... +| 3136: 02 0a 00 01 01 6f 03 05 09 00 82 0a 02 08 02 08 .....o.......... +| 3152: 08 08 17 84 02 04 00 30 20 32 35 31 00 01 61 13 .......0 251..a. +| 3168: 01 06 04 00 01 0c 00 01 04 00 01 04 00 01 03 00 ................ +| 3184: 03 09 00 00 01 63 10 01 07 00 03 07 03 00 02 02 .....c.......... +| 3200: 00 01 05 00 01 04 00 00 01 64 11 01 04 00 01 03 .........d...... +| 3216: 09 00 03 02 05 00 01 03 00 02 07 00 00 01 65 1b ..............e. +| 3232: 01 09 00 01 04 07 00 01 03 00 80 00 15 03 00 01 ................ +| 3248: 0b 00 01 04 00 01 02 00 01 0b 00 00 01 66 03 06 .............f.. +| 3264: 05 00 00 01 69 0f 01 03 00 01 06 00 03 04 04 04 ....i........... +| 3280: 00 03 03 09 00 00 01 6c 0c 01 02 00 01 08 00 01 .......l........ +| 3296: 0b 00 05 0c 00 00 01 6d 09 02 0b 00 01 05 00 05 .......m........ +| 3312: 08 00 00 01 6e 0c 03 08 00 01 02 00 02 06 00 01 ....n........... +| 3328: 06 00 00 01 6f 06 07 04 00 01 06 00 00 01 70 06 ....o.........p. +| 3344: 06 07 00 01 07 00 00 01 71 06 03 07 00 05 05 00 ........q....... +| 3360: 00 01 72 03 05 07 00 00 01 73 0c 01 05 00 01 02 ..r......s...... +| 3376: 00 05 03 00 01 02 00 00 01 74 03 02 05 00 00 01 .........t...... +| 3392: 75 0a 02 07 00 01 02 0a 00 01 03 00 00 01 76 07 u.............v. +| 3408: 03 06 00 02 09 03 00 85 26 01 08 08 08 08 08 17 ........&....... +| 3424: 8a 3e 30 20 36 36 35 00 02 61 64 03 03 04 00 02 .>0 665..ad..... +| 3440: 08 69 70 69 73 63 69 6e 67 03 01 08 00 01 05 6c .ipiscing......l +| 3456: 69 71 75 61 03 02 0c 00 05 02 69 70 03 04 04 00 iqua......ip.... +| 3472: 01 03 6d 65 74 03 01 06 00 01 03 6e 69 6d 03 08 ..met......nim.. +| 3488: 09 00 01 03 75 74 65 03 05 03 00 00 06 63 69 6c ....ute......cil +| 3504: 6c 75 6d 03 06 02 00 01 06 6f 6d 6d 6f 64 6f 03 lum......ommodo. +| 3520: 04 07 00 02 09 6e 73 65 63 74 65 74 75 72 03 01 .....nsectetur.. +| 3536: 07 00 05 04 71 75 61 74 03 04 08 00 01 04 75 6c ....quat......ul +| 3552: 70 61 03 08 04 00 02 07 70 69 64 61 74 61 74 03 pa......pidatat. +| 3568: 07 05 00 00 08 64 65 73 65 72 75 6e 74 03 08 07 .....deserunt... +| 3584: 00 01 01 6f 03 02 03 00 02 03 6c 6f 72 06 01 04 ...o......lor... +| 3600: 00 40 05 00 05 01 65 06 02 0a 00 04 03 00 01 03 .@....e......... +| 3616: 75 69 73 03 05 02 00 00 02 65 61 03 04 06 00 01 uis......ea..... +| 3632: 06 69 75 73 6d 6f 64 03 02 04 00 01 03 6c 69 74 .iusmod......lit +| 3648: 03 01 09 00 01 03 6e 69 6d 03 03 03 00 01 03 73 ......nim......s +| 3664: 73 65 03 05 0b 00 02 01 74 03 08 0b 00 01 01 74 se......t......t +| 3680: 03 02 09 00 01 01 75 03 06 04 00 01 01 78 03 04 ......u......x.. +| 3696: 05 00 02 07 63 65 70 74 65 75 72 03 07 02 00 02 ....cepteur..... +| 3712: 0a 65 72 63 69 74 61 74 69 6f 6e 03 03 09 00 00 .ercitation..... +| 3728: 06 66 75 67 69 61 74 03 06 05 00 00 02 69 64 03 .fugiat......id. +| 3744: 08 0a 00 01 01 6e 07 05 06 04 00 03 03 00 02 08 .....n.......... +| 3760: 63 69 64 69 64 75 6e 74 03 02 06 00 01 04 70 73 cididunt......ps +| 3776: 75 6d 03 01 03 00 01 04 72 75 72 65 03 05 04 00 um......rure.... +| 3792: 00 06 6c 61 62 6f 72 65 03 02 08 00 05 02 69 73 ..labore......is +| 3808: 03 03 0b 00 05 02 75 6d 03 08 0c 00 01 04 6f 72 ......um......or +| 3824: 65 6d 03 01 02 00 00 05 6d 61 67 6e 61 03 02 0b em......magna... +| 3840: 00 01 04 69 6e 69 6d 03 03 05 00 01 05 6f 6c 6c ...inim......oll +| 3856: 69 74 03 08 08 00 00 04 6e 69 73 69 03 04 02 00 it......nisi.... +| 3872: 01 02 6f 6e 03 07 06 00 02 05 73 74 72 75 64 03 ..on......strud. +| 3888: 03 08 00 01 04 75 6c 6c 61 03 06 06 00 00 08 6f .....ulla......o +| 3904: 63 63 61 65 63 61 74 03 07 04 00 01 06 66 66 69 ccaecat......ffi +| 3920: 63 69 61 03 08 06 00 00 08 70 61 72 69 61 74 75 cia......pariatu +| 3936: 72 03 06 07 00 01 07 72 6f 69 64 65 6e 74 03 07 r......roident.. +| 3952: 07 00 00 03 71 75 69 03 08 05 00 03 01 73 03 03 ....qui......s.. +| 3968: 07 00 00 0d 72 65 70 72 65 68 65 6e 64 65 72 69 ....reprehenderi +| 3984: 74 03 05 07 00 00 03 73 65 64 03 02 02 00 01 03 t......sed...... +| 4000: 69 6e 74 03 07 03 00 02 01 74 03 01 05 00 01 03 int......t...... +| 4016: 75 6e 74 03 08 02 00 00 06 74 65 6d 70 6f 72 03 unt......tempor. +| 4032: 02 05 00 00 07 75 6c 6c 61 6d 63 6f 03 03 0a 00 .....ullamco.... +| 4048: 01 01 74 09 02 07 00 01 02 00 01 03 00 00 05 76 ..t............v +| 4064: 65 6c 69 74 03 05 0a 00 02 04 6e 69 61 6d 03 03 elit......niam.. +| 4080: 06 00 01 08 6f 6c 75 70 74 61 74 65 03 05 09 00 ....oluptate.... +| page 5 offset 16384 +| 0: 0a 00 00 00 03 0f eb 00 0f fb 0f f3 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 07 04 02 08 01 ................ +| 4080: 08 00 03 07 04 02 08 01 04 00 02 04 04 08 08 09 ................ +| page 6 offset 20480 +| 0: 0d 00 00 00 08 0f d0 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0b 04 07 03 00 0e 06 04 06 03 00 ................ +| 4064: 0e 06 04 05 03 00 0e 0a 04 04 03 00 0e 07 04 03 ................ +| 4080: 03 00 0e 0a 04 02 03 00 0e 0b 04 01 03 00 0e 08 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 01 0f f7 00 0f f7 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 07 00 03 00 14 08 45 b5 03 .............E.. +| end crash-7948058d822acb.db +}]} {} + +do_catchsql_test 8.1 { + SELECT matchinfo(t1,'x') FROM t1 WHERE t1 MATCH 'e*'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 9.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-e1c6cbfdf643e9.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 0d a4 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 ock INTEGER,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 20 44 45 42 4.0 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 35 58 54 45 4e 53 49 4f IT LOAD 5XTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 1f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 44 4e 41 42 4c 45 20 46 54 53 35 58 .#..DNABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 01 00 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 0a 12 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-e1c6cbfdf643e9.db +}]} {} + +do_execsql_test 9.1 { + SELECT count(*) FROM t1 WHERE t1 MATCH '"json1 enable"'; +} {1} + +#------------------------------------------------------------------------- +reset_db +do_test 10.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-c3a971f0061039.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 0d a4 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 ock INTEGER,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 30 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY0KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 20 44 45 42 4.0 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 1f MEMSYS5 ENABLE. +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 43 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXCINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 09 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 46 20 47 45 ....)..ENABLF GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 09 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 02 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 10 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 02 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-c3a971f0061039.db +}]} {} + +do_catchsql_test 10.1 { + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) + INSERT OR IGNORE INTO t1(a,c) SELECT x,null FROM c + UNION ALL SELECT 180-x,printf('[%,d]',x*-5844627) FROM c; +} {0 {}} + +do_catchsql_test 10.3 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 11.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-843cb8447eaf14.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 0d a4 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 ock INTEGER,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d4 ...t.[.@.$...... +| 48: dd bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 35 99 0c 78 0c 57 0c 3e 0c 24 0c 0a ....5..x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 20 44 45 42 4.0 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 01 00 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 a2 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 01 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-843cb8447eaf14.db +}]} {} + +do_catchsql_test 11.1 { + SELECT rowid, quote(matchinfo(t1,'pcxybs')) FROM t1 WHERE t1 MATCH 'e*' +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 12.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c81b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 01 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 01 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ..08...........! +| 112: 0e b9 0d c8 0e 7e 0d a4 0d a4 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 62 2c 72 6f 6f 74 ock INTEGEb,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 20 44 45 42 4.0 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 46 4e 41 ABLE GEOPOLY FNA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 0f 25 READSAFE=0.$...% +| 3088: 19 58 54 48 52 45 41 44 53 41 46 45 3d 30 42 49 .XTHREADSAFE=0BI +| 3104: 4e 41 52 59 18 23 05 00 0f 25 19 58 54 48 52 45 NARY.#...%.XTHRE +| 3120: 41 44 53 41 46 45 3d 30 4e 4f 43 41 53 45 17 22 ADSAFE=0NOCASE.. +| 3136: 05 00 0f 25 17 58 54 48 52 45 41 44 53 41 46 45 ...%.XTHREADSAFE +| 3152: 3d 30 52 54 52 49 4d 1f 21 05 00 0f 33 19 58 4f =0RTRIM.!...3.XO +| 3168: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3184: 4f 4e 42 49 4e 41 52 59 1f 20 05 00 0f 33 19 58 ONBINARY. ...3.X +| 3200: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3216: 49 4f 4e 4e 4f 43 41 53 45 1e 1f 05 00 0f 33 17 IONNOCASE.....3. +| 3232: 58 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e XOMIT LOAD EXTEN +| 3248: 53 49 4f 4e 52 54 52 49 4d 1f 1e 05 00 0f 33 19 SIONRTRIM.....3. +| 3264: 58 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 XMAX MEMORY=5000 +| 3280: 30 30 30 30 42 49 4e 41 52 59 1f 1d 05 00 0f 33 0000BINARY.....3 +| 3296: 19 58 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 .XMAX MEMORY=500 +| 3312: 30 30 30 30 30 4e 4f 43 41 53 45 1e 1c 05 00 0f 00000NOCASE..... +| 3328: 33 17 58 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 3.XMAX MEMORY=50 +| 3344: 30 30 30 30 30 30 52 54 52 49 4d 18 1b 05 00 0f 000000RTRIM..... +| 3360: 25 19 58 45 4e 41 42 4c 45 20 52 54 52 45 45 42 %.XENABLE RTREEB +| 3376: 49 4e 41 52 59 18 1a 05 00 0f 25 19 58 45 4e 41 INARY.....%.XENA +| 3392: 42 4c 45 20 52 54 52 45 45 4e 4f 43 41 53 45 17 BLE RTREENOCASE. +| 3408: 19 05 00 0f 25 17 58 45 4e 41 42 4c 45 20 52 54 ....%.XENABLE RT +| 3424: 52 45 45 52 54 52 49 4d 1a 18 05 00 0f 29 19 58 REERTRIM.....).X +| 3440: 45 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 42 49 ENABLE MEMSYS5BI +| 3456: 4e 41 52 59 1a 17 05 00 0f 29 19 58 45 4e 41 42 NARY.....).XENAB +| 3472: 4c 45 20 4d 45 4d 53 59 53 35 4e 4f 43 41 53 45 LE MEMSYS5NOCASE +| 3488: 19 16 05 00 0f 29 17 58 45 4e 41 42 4c 45 20 4d .....).XENABLE M +| 3504: 45 4d 53 59 53 35 52 54 52 49 4d 18 15 05 00 0f EMSYS5RTRIM..... +| 3520: 25 19 58 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 42 %.XENABLE JSON1B +| 3536: 49 4e 41 52 59 18 14 05 00 0f 25 19 58 45 4e 41 INARY.....%.XENA +| 3552: 42 4c 45 20 4a 53 4f 4e 31 4e 4f 43 41 53 45 17 BLE JSON1NOCASE. +| 3568: 13 05 00 0f 25 17 58 45 4e 41 42 4c 45 20 4a 53 ....%.XENABLE JS +| 3584: 4f 4e 31 52 54 52 49 4d 1a 12 05 00 0f 29 19 58 ON1RTRIM.....).X +| 3600: 45 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 42 49 ENABLE GEOPOLYBI +| 3616: 4e 41 52 59 1a 11 05 00 0f 29 19 58 45 4e 41 1e NARY.....).XENA. +| 3632: 4c 45 20 47 45 4f 50 4f 4c 59 4e 4f 43 41 53 45 LE GEOPOLYNOCASE +| 3648: 19 10 05 00 0f 29 17 58 45 4e 41 42 4c 45 20 47 .....).XENABLE G +| 3664: 45 4f 50 4f 4c 59 52 54 52 49 4d 17 0f 05 00 0f EOPOLYRTRIM..... +| 3680: 23 19 58 45 4e 41 42 4c 45 20 46 54 53 35 42 49 #.XENABLE FTS5BI +| 3696: 4e 41 52 59 17 0e 05 00 0f 23 19 58 55 4e 41 42 NARY.....#.XUNAB +| 3712: 4c 45 20 46 54 53 35 4e 4f 43 41 53 45 16 0d 05 LE FTS5NOCASE... +| 3728: 00 0f 23 17 58 45 4e 41 42 4c 45 20 46 54 53 35 ..#.XENABLE FTS5 +| 3744: 52 54 52 49 4d 17 0c 05 00 0f 23 19 58 45 4e 41 RTRIM.....#.XENA +| 3760: 42 4c 45 20 46 54 53 34 42 49 4e 41 52 59 17 0b BLE FTS4BINARY.. +| 3776: 05 00 0f 23 19 58 45 4e 41 42 4c 45 20 46 54 53 ...#.XENABLE FTS +| 3792: 35 4e 4f 43 40 53 45 16 0a 05 00 0f 23 17 58 45 5NOC@SE.....#.XE +| 3808: 4e 41 42 4c 45 20 46 54 53 34 52 54 52 49 4d 1e NABLE FTS4RTRIM. +| 3824: 09 05 00 0f 31 19 58 45 4e 41 42 4c 35 20 44 42 ....1.XENABL5 DB +| 3840: 53 54 41 54 20 56 54 41 42 42 49 4e 41 52 59 1e STAT VTABBINARY. +| 3856: 08 05 00 0f 31 19 58 45 4e 41 42 4c 45 20 44 42 ....1.XENABLE DB +| 3872: 53 54 41 54 20 56 54 41 42 4e 4f 43 41 53 45 1d STAT VTABNOCASE. +| 3888: 07 05 00 0f 31 17 58 45 4e 41 42 4c 45 20 44 42 ....1.XENABLE DB +| 3904: 53 54 41 54 20 56 54 41 42 52 54 52 49 4d 11 06 STAT VTABRTRIM.. +| 3920: 05 00 0f 17 19 58 44 45 42 55 47 42 49 4e 41 52 .....XDEBUGBINAR +| 3936: 59 11 05 05 00 0f 17 19 58 44 45 42 55 47 4e 4f Y.......XDEBUGNO +| 3952: 43 41 53 45 10 04 05 00 0f 17 17 58 44 45 42 55 CASE.......XDEBU +| 3968: 47 52 54 52 49 4d 27 03 05 00 0f 43 19 58 43 4f GRTRIM'....C.XCO +| 3984: 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 MPILER=gcc-5.4.0 +| 4000: 20 32 30 31 36 30 36 30 39 42 49 4e 41 52 59 27 20160609BINARY' +| 4016: 02 05 00 0f 43 19 58 43 4f 4d 50 49 4c 45 52 3d ....C.XCOMPILER= +| 4032: 67 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 gcc-5.4.0 201606 +| 4048: 30 39 4e 4f 43 41 53 45 26 01 05 00 0f 43 17 58 09NOCASE&....C.X +| 4064: 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 COMPILER=gcc-5.4 +| 4080: 2e 30 20 32 30 31 36 30 36 30 39 52 54 52 49 4d .0 20160609RTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 03 07 bb 00 0c ad 0b a0 07 bb 00 00 ................ +| 1968: 00 00 00 00 00 00 00 00 00 00 00 87 62 03 08 08 ............b... +| 1984: 01 08 08 17 8f 34 02 30 20 39 38 30 00 01 30 1e .....4.0 980..0. +| 2000: 01 01 01 06 00 01 01 01 06 00 01 01 01 06 00 1f ................ +| 2016: 01 01 03 00 01 01 01 03 00 01 01 01 03 00 00 08 ................ +| 2032: 32 30 31 36 30 36 30 39 0f 01 01 01 07 00 01 01 20160609........ +| 2048: 01 07 00 01 01 01 07 00 00 01 34 0f 01 01 01 05 ..........4..... +| 2064: 00 01 01 01 05 00 01 01 01 05 00 00 01 35 0f 01 .............5.. +| 2080: 01 01 04 00 01 01 01 04 00 01 01 01 04 00 01 07 ................ +| 2096: 30 30 30 30 30 30 30 0f 1c 01 01 04 00 01 01 01 0000000......... +| 2112: 04 00 01 01 01 04 00 00 06 62 69 6e 61 72 79 3c .........binary< +| 2128: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 2144: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 2160: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 2176: 02 00 03 01 02 02 00 03 01 02 02 00 00 08 63 6f ..............co +| 2192: 6d 70 69 6c 65 72 0f 01 01 01 02 00 01 01 01 02 mpiler.......... +| 2208: 00 01 01 01 02 00 00 06 64 62 73 74 61 74 0f 07 ........dbstat.. +| 2224: 01 01 03 00 01 01 01 03 00 01 01 01 03 00 01 04 ................ +| 2240: 65 62 75 67 0f 04 01 01 02 00 01 01 01 02 00 01 ebug............ +| 2256: 01 01 02 00 00 03 65 6e 61 05 11 01 01 02 00 03 ......ena....... +| 2272: 03 62 6c 35 05 09 01 01 02 00 05 01 65 5a 07 01 .bl5........eZ.. +| 2288: 01 02 00 01 01 01 02 00 02 01 01 02 00 01 01 01 ................ +| 2304: 02 00 01 01 01 02 00 01 01 01 02 00 02 01 01 02 ................ +| 2320: 00 01 01 01 02 00 02 01 01 02 00 01 01 01 02 00 ................ +| 2336: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 2352: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 2368: 01 02 00 01 01 01 02 00 01 08 78 74 65 6e 73 69 ..........xtensi +| 2384: 6f 6e 0f 1f 01 01 04 00 01 01 01 04 00 01 01 01 on.............. +| 2400: 04 00 00 04 66 74 73 34 0a 0a 01 01 03 00 02 01 ....fts4........ +| 2416: 01 03 00 03 01 35 14 0b 01 01 03 00 02 01 01 03 .....5.......... +| 2432: 00 01 01 01 03 00 01 01 01 03 00 00 03 67 63 63 .............gcc +| 2448: 0f 01 01 01 03 00 01 01 01 03 00 01 01 01 03 00 ................ +| 2464: 01 06 65 6f 70 6f 6c 79 0f 10 01 01 03 00 01 01 ..eopoly........ +| 2480: 01 04 00 01 01 01 03 00 00 05 6a 73 6f 6e 31 0f ..........json1. +| 2496: 13 01 01 03 00 01 01 01 03 00 01 01 01 03 00 00 ................ +| 2512: 02 6c 65 05 11 01 01 03 00 01 03 6f 61 64 0f 1f .le........oad.. +| 2528: 01 01 03 00 01 01 01 03 00 01 01 01 03 00 00 03 ................ +| 2544: 6d 61 78 0f 1c 01 01 02 00 01 01 01 02 00 01 01 max............. +| 2560: 01 02 00 01 05 65 6d 6f 72 79 0f 1c 01 01 03 00 .....emory...... +| 2576: 01 01 01 03 00 01 01 01 03 00 03 04 73 79 73 35 ............sys5 +| 2592: 0f 16 01 01 03 00 01 01 01 03 00 01 01 01 03 00 ................ +| 2608: 00 03 6e 6f 63 05 0b 01 02 02 00 03 03 61 73 65 ..noc........ase +| 2624: 37 02 01 02 02 00 03 01 02 02 00 03 01 02 02 00 7............... +| 2640: 06 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 2656: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 2672: 02 02 00 03 01 02 02 00 00 04 6f 6d 69 74 0f 1f ..........omit.. +| 2688: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 00 05 ................ +| 2704: 72 74 72 65 65 0f 19 01 01 03 00 01 01 01 03 00 rtree........... +| 2720: 01 01 01 03 00 03 02 69 6d 3c 01 01 02 02 00 03 .......im<...... +| 2736: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 2752: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 2768: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 2784: 00 03 01 02 02 00 00 02 73 65 05 0b 01 02 03 00 ........se...... +| 2800: 00 0a 74 68 72 65 61 64 73 61 66 65 0f 22 01 01 ..threadsafe.... +| 2816: 02 00 01 01 01 02 00 01 01 01 02 00 00 06 75 6e ..............un +| 2832: 61 62 6c 65 05 0e 01 01 02 00 00 04 76 74 61 62 able........vtab +| 2848: 0f 07 01 01 04 00 01 01 01 04 00 01 01 01 04 00 ................ +| 2864: 00 01 78 6c 01 02 00 01 02 00 01 02 00 01 02 00 ..xl............ +| 2880: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 2896: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 2912: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 2928: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 2944: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 2960: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 11 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 00 f6 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 01 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 10 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 02 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 03 0f ee 00 0f fb 0f f5 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 06 04 ................ +| 4080: 08 01 01 02 03 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0c f4 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end c81b.db +}]} {} + +do_catchsql_test 12.1 { + SELECT rowid, quote(matchinfo(t1,'pcxybspcxybs')) + FROM t1 WHERE t1 MATCH 'e*e*' +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 13.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-c666cfde112dee.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 07 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 0d a4 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 62 2c 72 6f 6f 74 ock INTEGEb,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 23 00 20 32 30 31 36 30 36 30 39 20 44 45 42 4#. 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 53 49 4d 18 1b 05 00 25 00000XRTSIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 52 4c 45 20 4a 53 4f ...%..ENARLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 1e 4c NARY....)..ENA.L +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 59 e5 58 .#..ENABLE FTY.X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 ..#..ENABLE FTS5 +| 3792: 58 4e 4f 43 40 53 45 16 0a 05 00 23 0f 17 45 4e XNOC@SE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2f 30 20 32 30 31 36 30 36 30 cc-5.4/0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 41 00 04 6c 6f 61 64 03 25 1c 00 n1.%.A..load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 02 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 f2 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 57 02 00 .............W.. +| 3504: 01 02 00 01 01 00 01 02 00 01 02 00 01 02 10 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 64 6e 73 69 6f .........xtdnsio +| 3552: 6e 09 1f 04 00 01 04 00 01 03 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 57 63 63 09 01 03 ..........Wcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 02 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-c666cfde112dee.db +}]} {} + +do_catchsql_test 13.1 { + SELECT quote(matchinfo(t1,'pcxybs'))==0 FROM t1 WHERE b MATCH 'e*'; +} {0 {0 0}} + +#------------------------------------------------------------------------- +reset_db +do_test 14.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-f7b636a855e1d2.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e ef 00 07 0d 4d 00 0f bd 0f 5f ..........M...._ +| 112: 0e f7 0e 06 0e bc 0d a4 0d 4d 00 00 00 00 00 00 .........M...... +| 3392: 00 00 00 00 00 00 00 00 00 00 00 00 00 55 07 07 .............U.. +| 3408: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 73 74 ......tablet1_st +| 3424: 61 74 74 31 5f 73 74 61 74 07 43 52 45 41 54 45 att1_stat.CREATE +| 3440: 20 54 41 42 4c 45 20 27 74 31 5f 73 74 61 74 27 TABLE 't1_stat' +| 3456: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3472: 41 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 20 42 ARY KEY, value B +| 3488: 4c 4f 42 29 60 06 07 17 21 21 01 81 0b 74 61 62 LOB)`...!!...tab +| 3504: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3520: 6f 63 73 69 7a 65 06 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3536: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3552: 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 (docid INTEGER P +| 3568: 52 49 4d 41 52 59 20 4b 45 59 2c 20 73 69 7a 65 RIMARY KEY, size +| 3584: 20 42 4c 4f 42 29 81 33 04 07 17 1f 1f 01 82 35 BLOB).3.......5 +| 3600: 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 74 31 tablet1_segdirt1 +| 3616: 5f 73 65 67 64 69 25 04 43 52 45 41 54 45 20 54 _segdi%.CREATE T +| 3632: 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 72 27 ABLE 't1_segdir' +| 3648: 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 2c 69 (level INTEGER,i +| 3664: 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 72 74 dx INTEGER,start +| 3680: 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 6c _block INTEGER,l +| 3696: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 eaves_end_block +| 3712: 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c 6f 63 INTEGER,end_bloc +| 3728: 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 20 42 k INTEGER,root B +| 3744: 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 LOB,PRIMARY KEY( +| 3760: 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 05 06 17 level, idx))1... +| 3776: 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 65 5f E...indexsqlite_ +| 3792: 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 65 67 autoindex_t1_seg +| 3808: 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 05 00 dir_1t1_segdir.. +| 3824: 00 00 08 00 00 00 00 66 03 07 17 23 23 01 81 13 .......f...##... +| 3840: 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e 74 73 tablet1_segments +| 3856: 74 31 5f 73 65 67 6d 65 6e 74 73 03 43 52 45 41 t1_segments.CREA +| 3872: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 TE TABLE 't1_seg +| 3888: 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 20 49 ments'(blockid I +| 3904: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K +| 3920: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 5c EY, block BLOB). +| 3936: 02 07 17 21 21 01 81 03 74 61 62 6c 65 74 31 5f ...!!...tablet1_ +| 3952: 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 65 6e contentt1_conten +| 3968: 74 02 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 t.CREATE TABLE ' +| 3984: 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 63 69 t1_content'(doci +| 4000: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 4016: 59 20 4b 45 59 2c 20 27 63 30 61 27 29 41 01 06 Y KEY, 'c0a')A.. +| 4032: 17 11 11 08 71 74 61 62 6c 65 74 31 74 31 43 52 ....qtablet1t1CR +| 4048: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4064: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34 LE t1 USING fts4 +| 4080: 28 61 2c 70 72 65 66 69 78 3d 27 31 2c 32 27 29 (a,prefix='1,2') +| page 2 offset 4096 +| 0: 0d 00 00 00 08 0e 1f 00 0f c4 0f 7c 0f 34 0f 07 ...........|.4.. +| 16: 0e c3 0e 97 0e 63 0e 1f 00 00 00 00 00 00 00 00 .....c.......... +| 3600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 42 ...............B +| 3616: 08 04 00 81 09 73 75 6e 74 20 69 6e 20 63 75 6c .....sunt in cul +| 3632: 70 61 20 71 75 69 20 6f 66 66 69 63 69 61 20 64 pa qui officia d +| 3648: 65 73 65 72 75 6e 74 20 6d 6f 6c 6c 69 74 20 61 eserunt mollit a +| 3664: 6e 69 6d 20 69 64 20 65 73 74 20 6c 61 62 6f 72 nim id est labor +| 3680: 75 6d 2e 32 07 03 01 6b 45 78 63 65 70 74 65 75 um.2...kExcepteu +| 3696: 72 20 73 69 6e 74 20 6f 63 63 61 65 63 61 74 20 r sint occaecat +| 3712: 63 75 70 69 64 61 74 61 74 20 6e 6f 6e 20 70 72 cupidatat non pr +| 3728: 6f 69 64 65 6e 74 2c 2a 06 03 00 5b 63 69 6c 6c oident,*...[cill +| 3744: 75 6d 20 64 6f 6c 6f 72 65 20 65 75 20 66 75 67 um dolore eu fug +| 3760: 69 61 74 20 6e 75 6c 6c 61 20 70 61 72 69 61 74 iat nulla pariat +| 3776: 75 72 2e 43 05 04 00 81 09 44 75 69 73 20 61 75 ur.C.....Duis au +| 3792: 74 65 20 69 72 75 72 65 20 64 6f 6c 6f 72 20 69 te irure dolor i +| 3808: 6e 20 72 65 70 72 65 68 65 6e 64 65 72 69 74 20 n reprehenderit +| 3824: 69 6e 20 76 6f 6c 75 70 74 61 74 65 20 76 65 6c in voluptate vel +| 3840: 69 74 20 65 73 73 65 2b 14 03 00 5d 6e 69 73 69 it esse+...]nisi +| 3856: 20 75 74 20 61 6c 69 71 75 69 70 20 65 78 20 65 ut aliquip ex e +| 3872: 61 20 63 6f 6d 6d 6f 64 6f 20 63 6f 6e 73 65 71 a commodo conseq +| 3888: 75 61 74 2e 46 03 04 00 81 11 55 74 20 65 6e 69 uat.F.....Ut eni +| 3904: 6d 20 61 64 20 6d 69 6e 69 6d 20 76 65 6e 69 61 m ad minim venia +| 3920: 6d 2c 20 71 75 69 73 20 6e 6f 73 74 72 75 64 20 m, quis nostrud +| 3936: 65 78 65 72 63 69 74 61 74 69 6f 6e 20 75 6c 6c exercitation ull +| 3952: 61 6d 63 6f 20 6c 61 62 6f 72 69 73 46 02 04 00 amco laborisF... +| 3968: 81 11 73 65 64 20 64 6f 20 65 69 75 73 6d 6f 64 ..sed do eiusmod +| 3984: 20 74 65 6d 70 6f 72 20 69 6e 63 69 64 69 64 75 tempor incididu +| 4000: 6e 74 20 75 74 20 6c 61 62 6f 72 65 20 65 74 20 nt ut labore et +| 4016: 64 6f 6c 6f 72 65 20 6d 61 67 6e 61 20 61 6c 69 dolore magna ali +| 4032: 71 75 61 2e 3a 01 03 00 7b 4c 6f 72 65 6d 20 69 qua.:....Lorem i +| 4048: 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 psum dolor sit a +| 4064: 6d 65 74 2c 20 63 6f 6e 73 65 63 74 65 74 75 72 met, consectetur +| 4080: 20 61 64 69 70 69 73 63 69 6e 67 20 65 6c 69 74 adipiscing elit +| page 3 offset 8192 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0a a6 00 0d 57 0c 4a 0a a6 00 00 .........W.J.... +| 2720: 00 00 00 00 00 00 83 21 03 08 02 08 08 08 17 86 .......!........ +| 2736: 30 08 00 30 20 34 30 32 00 02 61 64 06 01 08 00 0..0 402..ad.... +| 2752: 02 04 00 01 01 6c 06 02 0c 00 02 04 00 01 01 6d .....l.........m +| 2768: 03 01 06 00 01 01 6e 03 08 09 00 01 01 75 03 05 ......n......u.. +| 2784: 03 00 00 02 63 69 03 06 01 00 01 01 6f 07 01 07 ....ci......o... +| 2800: 00 03 07 03 00 01 01 75 06 07 05 00 01 04 00 00 .......u........ +| 2816: 02 64 65 03 08 07 00 01 01 6f 0d 01 04 00 01 03 .de......o...... +| 2832: 09 00 03 05 00 01 03 00 01 01 75 03 05 02 00 00 ..........u..... +| 2848: 02 65 61 03 04 06 00 01 01 69 03 02 04 00 01 01 .ea......i...... +| 2864: 6c 03 01 09 00 01 01 6e 03 03 03 00 01 01 73 06 l......n......s. +| 2880: 05 0b 00 03 0b 00 01 01 74 03 02 09 00 01 01 75 ........t......u +| 2896: 03 06 04 00 01 01 78 09 03 09 00 01 05 00 03 02 ......x......... +| 2912: 00 00 02 66 75 03 06 05 00 00 02 69 64 03 08 0a ...fu......id... +| 2928: 00 01 01 6e 0a 02 06 00 03 06 04 00 03 03 00 01 ...n............ +| 2944: 01 70 03 01 13 00 01 01 72 03 05 04 00 00 02 6c .p......r......l +| 2960: 61 09 02 08 00 01 0b 00 05 0c 00 01 01 6f 03 01 a............o.. +| 2976: 02 00 00 02 6d 61 03 02 0b 00 01 01 69 03 04 05 ....ma......i... +| 2992: 00 01 01 6f 03 08 08 00 00 02 6e 69 03 04 02 00 ...o......ni.... +| 3008: 01 01 6f 06 03 08 00 04 06 00 01 01 75 03 06 06 ..o.........u... +| 3024: 00 00 02 6f 63 03 07 04 00 01 01 66 03 08 06 00 ...oc......f.... +| 3040: 00 02 70 61 03 06 07 00 01 01 72 03 07 07 00 00 ..pa......r..... +| 3056: 02 71 75 06 03 07 00 05 05 00 00 02 72 65 03 05 .qu.........re.. +| 3072: 07 00 00 02 73 65 03 02 02 00 01 01 69 06 01 05 ....se......i... +| 3088: 00 06 03 00 01 01 75 03 08 02 00 00 02 74 65 03 ......u......te. +| 3104: 03 05 00 00 02 75 6c 03 03 0a 00 01 01 74 09 02 .....ul......t.. +| 3120: 07 00 01 02 00 01 03 00 00 02 76 65 06 03 06 00 ..........ve.... +| 3136: 02 0a 00 01 01 6f 03 05 09 00 82 0a 02 08 02 08 .....o.......... +| 3152: 08 08 17 84 02 04 00 30 20 32 35 31 00 01 61 13 .......0 251..a. +| 3168: 01 06 04 00 01 0c 00 01 04 00 01 04 00 01 03 00 ................ +| 3184: 03 09 00 00 01 63 10 01 07 00 03 07 03 00 02 02 .....c.......... +| 3200: 00 01 05 00 01 04 00 00 01 64 11 01 04 00 01 03 .........d...... +| 3216: 09 00 03 02 05 00 01 03 00 02 07 00 00 01 65 1b ..............e. +| 3232: 01 09 00 01 04 07 00 01 03 08 00 01 05 03 00 01 ................ +| 3248: 0b 00 01 04 00 01 02 00 01 0b 00 00 01 66 03 06 .............f.. +| 3264: 05 00 00 01 69 0f 01 03 00 01 06 00 03 04 04 04 ....i........... +| 3280: 00 03 03 09 00 00 01 6c 0c 01 02 00 01 08 00 01 .......l........ +| 3296: 0b 00 05 0c 00 00 01 6d 09 02 0b 00 01 05 00 05 .......m........ +| 3312: 08 00 00 01 6e 0c 03 08 00 01 02 00 02 06 00 01 ....n........... +| 3328: 06 00 00 01 6f 06 07 04 00 01 06 00 00 01 70 06 ....o.........p. +| 3344: 06 07 00 01 07 00 00 01 71 06 03 07 00 05 05 00 ........q....... +| 3360: 00 01 72 03 05 08 00 00 01 73 0c 01 05 00 01 02 ..r......s...... +| 3376: 00 05 03 00 01 02 00 00 01 74 03 02 05 00 00 01 .........t...... +| 3392: 75 0a 02 07 00 01 02 0a 00 01 03 00 00 01 76 07 u.............v. +| 3408: 03 06 00 02 09 03 00 85 26 01 08 08 08 08 08 17 ........&....... +| 3424: 8a 3e 30 20 36 36 35 00 02 61 64 03 03 04 00 02 .>0 665..ad..... +| 3440: 08 69 70 69 73 63 69 6e 67 03 01 08 00 01 05 6c .ipiscing......l +| 3456: 69 71 75 61 03 02 0c 00 05 02 69 70 03 04 04 00 iqua......ip.... +| 3472: 01 03 6d 65 74 03 01 06 00 01 03 6e 69 6d 03 08 ..met......nim.. +| 3488: 09 00 01 03 75 74 65 03 05 03 00 00 06 63 69 6c ....ute......cil +| 3504: 6c 75 6d 03 06 02 00 01 06 6f 6d 6d 6f 64 6f 03 lum......ommodo. +| 3520: 04 07 00 02 09 6e 73 65 63 74 65 74 75 72 03 01 .....nsectetur.. +| 3536: 07 00 05 04 71 75 61 74 03 04 08 00 01 04 75 6c ....quat......ul +| 3552: 70 61 03 08 04 00 02 07 70 69 64 61 74 61 74 03 pa......pidatat. +| 3568: 07 05 00 00 08 64 65 73 65 72 75 6e 74 03 08 07 .....deserunt... +| 3584: 00 01 01 6f 03 02 03 00 02 03 6c 6f 72 06 01 04 ...o......lor... +| 3600: 00 04 05 00 05 01 65 06 02 0a 00 04 03 00 01 03 ......e......... +| 3616: 75 69 73 03 05 02 00 00 02 65 61 03 04 06 00 01 uis......ea..... +| 3632: 06 69 75 73 6d 6f 64 03 02 04 00 01 03 6c 69 74 .iusmod......lit +| 3648: 03 01 09 00 01 03 6e 69 6d 03 03 03 00 01 03 73 ......nim......s +| 3664: 73 65 03 05 0b 00 02 01 73 03 08 0b 00 01 01 74 se......s......t +| 3680: 03 02 09 00 01 01 75 03 06 04 00 01 01 78 03 04 ......u......x.. +| 3696: 05 00 02 07 63 65 70 74 65 75 72 03 07 02 00 02 ....cepteur..... +| 3712: 0a 65 72 63 69 74 61 74 69 6f 6e 03 03 09 00 00 .ercitation..... +| 3728: 06 66 75 67 69 61 74 03 06 05 00 00 02 69 64 03 .fugiat......id. +| 3744: 08 0a 00 01 01 6e 07 05 06 04 00 03 03 00 02 08 .....n.......... +| 3760: 63 69 64 69 64 75 6e 74 03 02 06 00 01 04 70 73 cididunt......ps +| 3776: 75 6d 03 01 03 00 01 04 72 75 72 65 03 05 04 00 um......rure.... +| 3792: 00 06 6c 61 62 6f 72 65 03 02 08 00 05 02 69 73 ..labore......is +| 3808: 03 03 0b 00 05 02 75 6d 03 08 0c 00 01 04 6f 72 ......um......or +| 3824: 65 6d 03 01 02 00 00 05 6d 61 67 6e 61 03 02 0b em......magna... +| 3840: 00 01 04 69 6e 69 6d 03 03 05 00 01 05 6f 6c 6c ...inim......oll +| 3856: 69 74 03 08 08 00 00 04 6e 69 73 69 03 04 02 00 it......nisi.... +| 3872: 01 02 6f 6e 03 07 06 00 02 05 73 74 72 75 64 03 ..on......strud. +| 3888: 03 08 00 01 04 75 6c 6c 61 03 06 06 00 00 08 6f .....ulla......o +| 3904: 63 63 61 65 63 61 74 03 07 04 00 01 06 66 66 69 ccaecat......ffi +| 3920: 63 69 61 03 08 06 00 00 08 70 61 72 69 61 74 75 cia......pariatu +| 3936: 72 03 06 07 00 01 07 72 6f 69 64 65 6e 74 03 07 r......roident.. +| 3952: 07 00 00 03 71 75 69 03 08 05 00 03 01 73 03 03 ....qui......s.. +| 3968: 07 00 00 0d 72 65 70 72 65 68 65 6e 64 65 72 69 ....reprehenderi +| 3984: 74 03 05 07 00 00 03 73 65 64 03 02 02 00 01 03 t......sed...... +| 4000: 69 6e 74 03 07 03 00 02 01 74 03 01 05 00 01 03 int......t...... +| 4016: 75 6e 74 03 08 02 00 00 06 74 65 6d 70 6f 72 03 unt......tempor. +| 4032: 02 05 00 00 07 75 6c 6c 61 6d 63 6f 03 03 0a 00 .....ullamco.... +| 4048: 01 01 74 09 02 07 00 01 02 00 01 03 00 00 05 76 ..t............v +| 4064: 65 6c 69 74 03 05 0a 00 02 04 6e 69 61 6d 03 03 elit......niam.. +| 4080: 06 00 01 08 6f 6c 75 70 74 61 74 65 03 05 09 00 ....oluptate.... +| page 5 offset 16384 +| 0: 0a 00 00 00 03 0f eb 00 0f fb 0f f3 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 07 04 02 08 01 ................ +| 4080: 08 00 03 07 04 02 08 01 04 00 02 04 04 08 08 09 ................ +| page 6 offset 20480 +| 0: 0d 00 00 00 08 0f d0 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0b 04 07 03 00 0e 06 04 06 03 00 ................ +| 4064: 0e 06 04 05 03 00 0e 0a 04 04 03 00 0e 07 04 03 ................ +| 4080: 03 00 0e 0a 04 02 03 00 0e 0b 04 01 03 00 0e 08 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 01 0f f7 00 0f f7 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 07 00 03 00 14 08 45 b5 03 .............E.. +| end crash-f7b636a855e1d2.db +}]} {} + +do_execsql_test 14.1 { + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<10) + INSERT INTO t1(a) SELECT randomblob(3000) FROM c; +} + +do_catchsql_test 14.2 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 15.0 { + CREATE VIRTUAL TABLE t1 USING fts3(a, content=""); + INSERT INTO t1_segdir VALUES(0,0,0,0,'0 665',X'000261640303040002086970697363696e670301080001056c6971756103020c00050269700304040001036d65740301060001036e6a6d03080900010375746503050300000663696c6c756d0306020001066f6d6d6f646f0304070002096e736563746574757203010700050471756174030408000104756c7061030804000207706964617461740307050000086465736572756e740308070001016f0302030002036c6f720601040004050005016506020a00040300010375697303050200000265610304060001066975736d6f640302040001036c69740301090001036e696d13030300010373736503050b0002017403080b0001017403020900010175030604000101780304050002076365707465757203070100020a65726369746174696f6e030309000006667567696174030605000002696403080a0001016e070506040003030002086369646964756e740302060001047073756d030103000104727572650305040000066c61626f7265030208000502697303030b000502756d03080c0001046f72656d0301020000056d61676e6103020b000104696e696d0303050001056f6c6c69740308080000046e6973690304020001026f6e0307060002057374727564030308000104756c6c610306060000086f636361656361740307040001066666696369610308060000087061726961747572030607000107726f6964656e740307070000037175690308050003017303030700000d726570726568656e6465726974030507000003736564030202000103696e7403070300020174030105000103756e7403080200000674656d706f72030205000007756c6c616d636f03030a0001017409020700010200010300000576656c697403050a0002046e69616d0303060001086f6c75707461746503050900'); +} + +do_execsql_test 15.1 { + SELECT quote(matchinfo(t1, t1 ))==0 FROM t1 WHERE t1 MATCH 'e*'; +} {0 0 0 0 0 0} + +#------------------------------------------------------------------------- +reset_db +do_test 16.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-de7e8cb026385a.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e ef 00 07 0d 4d 00 0f bd 0f 5f ..........M...._ +| 112: 0e f7 0e 06 0e bc 0d a4 0d 4d 00 00 00 00 00 00 .........M...... +| 3392: 00 00 00 00 00 00 00 00 00 00 00 00 00 55 07 07 .............U.. +| 3408: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 73 74 ......tablet1_st +| 3424: 61 74 74 31 5f 73 74 61 74 07 43 52 45 41 54 45 att1_stat.CREATE +| 3440: 20 54 41 42 4c 45 20 27 74 31 5f 73 74 61 74 27 TABLE 't1_stat' +| 3456: 28 69 64 20 49 af 54 45 47 45 52 20 50 52 49 4d (id I.TEGER PRIM +| 3472: 41 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 20 42 ARY KEY, value B +| 3488: 4c 4f 42 29 60 06 07 17 21 21 01 81 0b 74 61 62 LOB)`...!!...tab +| 3504: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3520: 6f 63 73 69 7a 65 06 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3536: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3552: 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 (docid INTEGER P +| 3568: 52 49 4d 41 52 59 20 4b 45 59 2c 20 73 69 7a 65 RIMARY KEY, size +| 3584: 20 42 4c 4f 42 29 81 33 04 07 17 1f 1f 01 82 35 BLOB).3.......5 +| 3600: 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 74 31 tablet1_segdirt1 +| 3616: 5f 73 65 67 64 69 72 04 43 52 45 41 54 45 20 54 _segdir.CREATE T +| 3632: 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 72 27 ABLE 't1_segdir' +| 3648: 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 2c 69 (level INTEGER,i +| 3664: 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 72 74 dx INTEGER,start +| 3680: 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 6c _block INTEGER,l +| 3696: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 eaves_end_block +| 3712: 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c 6f 63 INTEGER,end_bloc +| 3728: 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 20 42 k INTEGER,root B +| 3744: 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 LOB,PRIMARY KEY( +| 3760: 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 05 06 17 level, idx))1... +| 3776: 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 65 5f E...indexsqlite_ +| 3792: 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 65 67 autoindex_t1_seg +| 3808: 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 05 00 dir_1t1_segdir.. +| 3824: 00 00 08 00 00 00 00 66 03 07 17 23 23 01 81 13 .......f...##... +| 3840: 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e 74 73 tablet1_segments +| 3856: 74 31 5f 73 65 67 6d 65 6e 74 73 03 43 52 45 41 t1_segments.CREA +| 3872: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 TE TABLE 't1_seg +| 3888: 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 20 49 ments'(blockid I +| 3904: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K +| 3920: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 5c EY, block BLOB). +| 3936: 02 07 17 21 21 01 81 03 74 61 62 6c 65 74 31 5f ...!!...tablet1_ +| 3952: 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 65 6e contentt1_conten +| 3968: 74 02 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 t.CREATE TABLE ' +| 3984: 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 63 69 t1_content'(doci +| 4000: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 4016: 59 20 4b 45 59 2c 20 27 63 30 61 27 29 41 01 06 Y KEY, 'c0a')A.. +| 4032: 17 11 11 08 71 74 61 62 6c 65 74 31 74 31 43 52 ....qtablet1t1CR +| 4048: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4064: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34 LE t1 USING fts4 +| 4080: 28 61 2c 70 72 65 66 69 78 3d 27 31 2c 32 27 29 (a,prefix='1,2') +| page 2 offset 4096 +| 0: 0d 00 00 00 08 0e 1f 00 0f c4 0f 7c 0f 34 0f 07 ...........|.4.. +| 16: 0e c3 0e 97 0e 63 0e 1f 00 00 00 00 00 00 00 00 .....c.......... +| 3600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 42 ...............B +| 3616: 08 04 00 81 09 73 75 6e 74 20 69 6e 20 63 75 6c .....sunt in cul +| 3632: 70 61 20 71 75 69 20 6f 66 66 69 63 69 61 20 64 pa qui officia d +| 3648: 65 73 65 72 75 6e 74 20 6d 6f 6c 6c 69 74 20 61 eserunt mollit a +| 3664: 6e 69 6d 20 69 64 20 65 73 74 20 6c 61 62 6f 72 nim id est labor +| 3680: 75 6d 2e 32 07 03 00 6b 45 78 63 65 70 74 65 75 um.2...kExcepteu +| 3696: 72 20 73 69 6e 74 20 6f 63 63 61 65 63 61 74 20 r sint occaecat +| 3712: 63 75 70 69 64 61 74 61 74 20 6e 6f 6e 20 70 72 cupidatat non pr +| 3728: 6f 69 64 65 6e 74 2c 2a 06 03 00 5b 63 69 6c 6c oident,*...[cill +| 3744: 75 6d 20 64 6f 6c 6f 72 65 20 65 75 20 66 75 67 um dolore eu fug +| 3760: 69 61 74 20 6e 75 6c 6c 61 20 70 61 72 69 61 74 iat nulla pariat +| 3776: 75 72 2e 42 05 04 00 81 09 44 75 69 73 20 61 75 ur.B.....Duis au +| 3792: 74 65 20 69 72 75 72 65 21 64 6f 6c 6f 72 20 69 te irure!dolor i +| 3808: 6e 20 72 65 70 72 65 68 65 6e 64 65 72 69 74 20 n reprehenderit +| 3824: 69 6e 20 76 6f 6c 75 70 74 61 74 65 20 76 65 6c in voluptate vel +| 3840: 69 74 20 65 73 74 65 2b 04 03 00 5d 6e 69 73 69 it este+...]nisi +| 3856: 20 75 74 20 61 6c 69 71 75 69 70 20 65 78 20 65 ut aliquip ex e +| 3872: 61 20 63 6f 6d 6d 6f 64 6f 20 63 6f 6e 73 65 71 a commodo conseq +| 3888: 75 61 74 2e 46 03 04 00 81 11 55 74 20 65 6e 69 uat.F.....Ut eni +| 3904: 6d 20 61 64 20 6d 69 6e 69 6d 20 76 65 6e 69 61 m ad minim venia +| 3920: 6d 2c 20 71 75 69 73 20 6e 6f 73 74 72 75 64 20 m, quis nostrud +| 3936: 65 78 65 72 63 69 74 61 74 69 6f 6e 20 75 6c 6c exercitation ull +| 3952: 61 6d 63 6f 20 6c 61 62 6f 72 69 73 46 02 04 00 amco laborisF... +| 3968: 81 11 73 65 64 20 64 6f 20 65 69 75 73 6d 6f 64 ..sed do eiusmod +| 3984: 20 74 65 6d 70 6f 72 20 69 6e 63 69 64 69 64 75 tempor incididu +| 4000: 6e 74 20 75 74 20 6c 61 62 6f 72 65 20 65 74 20 nt ut labore et +| 4016: 64 6f 6c 6f 72 65 20 6d 61 67 6e 61 20 51 6c 69 dolore magna Qli +| 4032: 71 75 61 2e 3a 01 03 00 7b 4c 6f 72 65 6d 20 69 qua.:....Lorem i +| 4048: 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 e5 61 psum dolor sit.a +| 4064: 6d 65 74 2c 20 63 6f 6e 73 65 63 74 65 74 75 72 met, consectetur +| 4080: 20 61 64 69 70 69 73 63 69 6e 67 20 65 6c 69 74 adipiscing elit +| page 3 offset 8192 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0a a6 00 0d 57 0c 4a 0a a6 00 00 .........W.J.... +| 2720: 00 00 00 00 00 00 83 21 03 08 02 08 08 08 17 86 .......!........ +| 2736: 30 08 00 30 20 34 30 32 00 02 61 64 06 01 08 00 0..0 402..ad.... +| 2752: 02 04 00 01 01 6c 06 02 0c 00 02 04 00 01 01 6d .....l.........m +| 2768: 03 01 06 00 01 01 6e 03 08 09 00 01 01 75 03 05 ......n......u.. +| 2784: 03 00 00 02 63 69 03 06 02 00 01 01 6f 07 01 07 ....ci......o... +| 2800: 00 03 07 03 00 01 01 75 06 07 05 00 01 04 00 00 .......u........ +| 2816: 02 64 65 03 08 07 00 01 01 6f 0d 01 04 00 01 03 .de......o...... +| 2832: 09 00 03 05 00 01 03 00 01 01 75 03 05 02 00 00 ..........u..... +| 2848: 02 65 61 03 04 06 00 01 01 69 03 02 04 00 01 01 .ea......i...... +| 2864: 6c 03 01 09 00 01 01 6e 03 03 03 00 01 01 73 06 l......n......s. +| 2880: 05 0b 00 03 0b 00 01 01 74 03 02 09 00 01 01 75 ........t......u +| 2896: 03 06 04 00 01 01 78 09 03 09 00 01 05 00 03 02 ......x......... +| 2912: 00 00 02 66 75 03 06 05 00 00 02 69 64 03 08 0a ...fu......id... +| 2928: 00 01 01 6e 0a 02 06 00 03 06 04 00 03 03 00 01 ...n............ +| 2944: 01 70 03 01 03 00 01 01 72 03 05 04 00 00 02 6c .p......r......l +| 2960: 61 09 02 08 00 01 0b 00 05 0c 00 01 01 6f 03 01 a............o.. +| 2976: 02 00 00 02 6d 61 03 02 0b 00 01 01 69 03 03 05 ....ma......i... +| 2992: 00 01 01 6f 03 08 08 00 00 02 6e 69 03 04 02 00 ...o......ni.... +| 3008: 01 01 6f 06 03 08 00 04 06 00 01 01 75 03 06 06 ..o.........u... +| 3024: 00 00 02 6f 63 03 07 04 00 01 01 66 03 08 06 00 ...oc......f.... +| 3040: 00 02 70 61 03 06 07 00 01 01 72 03 07 07 00 00 ..pa......r..... +| 3056: 02 71 75 06 03 07 00 05 05 00 00 02 72 65 03 05 .qu.........re.. +| 3072: 07 00 00 02 73 65 03 02 02 00 01 01 69 06 01 05 ....se......i... +| 3088: 00 06 03 00 01 01 75 03 08 02 00 00 02 74 65 03 ......u......te. +| 3104: 02 05 00 00 02 75 6c 03 03 0a 00 01 01 74 09 02 .....ul......t.. +| 3120: 07 00 01 02 00 01 03 00 00 02 76 65 06 03 06 00 ..........ve.... +| 3136: 02 0a 00 01 01 6f 03 05 09 00 82 0a 02 08 12 08 .....o.......... +| 3152: 08 08 17 84 02 04 00 30 20 32 35 31 00 01 61 23 .......0 251..a# +| 3168: 01 06 04 00 01 0c 00 01 04 00 01 04 00 01 03 00 ................ +| 3184: 03 09 00 00 01 63 10 01 07 00 03 07 03 00 02 02 .....c.......... +| 3200: 00 01 05 00 01 04 00 00 01 64 11 01 04 00 01 03 .........d...... +| 3216: 09 00 03 02 05 00 01 13 00 02 07 00 00 01 65 1b ..............e. +| 3232: 01 09 00 01 04 07 00 01 03 08 00 01 05 03 00 01 ................ +| 3248: 0b 00 01 04 00 01 02 00 01 0b 00 00 01 66 03 06 .............f.. +| 3264: 05 00 00 01 69 0f 01 03 00 01 06 00 03 04 04 04 ....i........... +| 3280: 00 03 03 09 00 00 01 6c 0c 01 02 00 01 08 00 01 .......l........ +| 3296: 0b 00 05 0c 00 10 01 6d 09 02 0b 00 01 05 00 05 .......m........ +| 3312: 08 00 00 01 6e 0c 03 08 00 01 02 00 02 06 00 01 ....n........... +| 3328: 06 00 00 01 6f 06 07 04 00 01 06 00 00 01 70 06 ....o.........p. +| 3344: 06 07 00 01 07 00 00 01 71 06 03 07 00 05 05 00 ........q....... +| 3360: 00 01 72 03 05 07 00 00 01 73 0c 01 05 00 01 02 ..r......s...... +| 3376: 00 05 03 00 01 02 00 00 01 74 03 02 05 00 00 01 .........t...... +| 3392: 75 0a 02 07 00 01 02 0a 00 01 03 00 00 01 76 07 u.............v. +| 3408: 03 06 00 02 09 03 00 85 26 01 08 08 08 08 08 17 ........&....... +| 3424: 8a 3e 30 20 36 36 35 00 02 61 64 03 03 04 00 02 .>0 665..ad..... +| 3440: 08 69 70 69 73 63 69 6e 67 03 01 08 00 01 05 6c .ipiscing......l +| 3456: 69 71 75 61 03 02 0c 00 05 02 69 70 03 04 04 00 iqua......ip.... +| 3472: 01 03 6d 65 74 03 01 06 00 01 03 6e 69 6d 03 08 ..met......nim.. +| 3488: 09 00 01 03 75 74 65 03 05 03 00 00 06 63 69 6c ....ute......cil +| 3504: 6c 75 6d 03 06 02 00 01 06 6f 6d 6d 6f 64 6f 03 lum......ommodo. +| 3520: 04 07 00 02 09 6e 73 65 63 74 65 74 75 72 03 01 .....nsectetur.. +| 3536: 07 00 05 04 71 75 61 74 03 04 08 00 01 04 75 6c ....quat......ul +| 3552: 70 61 03 08 04 00 02 07 70 69 64 61 74 61 74 03 pa......pidatat. +| 3568: 07 05 00 00 08 64 65 73 65 72 75 6e 74 03 08 07 .....deserunt... +| 3584: 00 01 01 6f 03 02 03 00 02 03 6c 6f 72 06 01 04 ...o......lor... +| 3600: 00 04 05 00 05 01 65 06 02 0a 00 04 03 00 01 03 ......e......... +| 3616: 75 69 73 03 05 02 00 00 02 65 61 03 04 06 00 01 uis......ea..... +| 3632: 06 69 75 73 6d 6f 64 03 02 04 00 01 03 6c 69 74 .iusmod......lit +| 3648: 03 01 09 00 01 03 6e 69 6d 03 03 03 00 01 03 73 ......nim......s +| 3664: 73 65 03 05 0b 00 02 01 74 03 08 0b 00 01 01 74 se......t......t +| 3680: 03 02 09 00 01 01 75 03 06 04 00 01 01 78 03 04 ......u......x.. +| 3696: 05 00 02 07 63 65 70 74 65 75 72 03 07 02 00 02 ....cepteur..... +| 3712: 0a 65 72 63 69 74 61 74 69 6f 6e 03 03 09 00 00 .ercitation..... +| 3728: 06 66 75 67 69 61 74 03 06 05 00 00 02 69 64 03 .fugiat......id. +| 3744: 08 0a 00 01 01 6e 07 05 06 04 00 03 03 00 02 08 .....n.......... +| 3760: 63 69 64 69 64 75 7e 74 03 02 06 00 01 04 70 73 cididu~t......ps +| 3776: 75 6d 03 01 03 00 01 03 72 75 72 65 03 05 04 00 um......rure.... +| 3792: 00 06 6c 61 62 6f 72 65 03 02 08 00 05 02 69 73 ..labore......is +| 3808: 03 03 0b 00 05 02 75 6d 03 08 0c 00 01 04 6f 72 ......um......or +| 3824: 65 6d 03 01 02 00 00 05 6d 61 67 6e 61 03 02 0b em......magna... +| 3840: 00 01 04 69 6e 69 6d 03 03 05 00 01 05 6f 6c 6c ...inim......oll +| 3856: 69 74 03 08 08 00 00 04 6e 69 73 69 03 04 02 00 it......nisi.... +| 3872: 01 02 6f 6e 03 07 06 00 02 05 73 74 72 75 64 03 ..on......strud. +| 3888: 03 08 00 01 04 75 6c 6c 61 03 06 06 00 00 08 6f .....ulla......o +| 3904: 63 63 61 65 63 61 74 03 07 04 00 01 06 66 66 69 ccaecat......ffi +| 3920: 63 69 61 03 08 06 00 00 08 70 61 72 69 61 74 75 cia......pariatu +| 3936: 72 03 06 07 00 01 07 72 6f 69 64 65 6e 74 03 07 r......roident.. +| 3952: 07 00 00 03 71 75 69 03 08 05 00 03 01 73 03 03 ....qui......s.. +| 3968: 07 00 00 0d 72 65 70 72 65 68 65 6e 64 65 72 69 ....reprehenderi +| 3984: 74 03 05 07 00 00 03 73 65 64 03 02 02 00 01 03 t......sed...... +| 4000: 69 6e 74 03 07 03 00 02 01 74 03 01 05 00 01 03 int......t...... +| 4016: 75 6e 74 03 08 02 00 00 06 74 65 6d 70 6f 72 03 unt......tempor. +| 4032: 02 05 00 00 07 75 6c 6c 61 6d 63 6f 03 03 0a 00 .....ullamco.... +| 4048: 01 01 74 09 02 07 00 01 02 00 01 03 00 00 05 76 ..t............v +| 4064: 65 6c 69 74 03 05 0a 00 02 04 6e 69 61 6d 03 03 elit......niam.. +| 4080: 06 00 01 08 6f 6c 75 70 74 61 74 65 03 05 09 00 ....oluptate.... +| page 5 offset 16384 +| 0: 0a 00 00 00 03 0f eb 00 0f fb 0f f3 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 07 04 02 08 01 ................ +| 4080: 08 00 03 07 04 02 08 03 a4 00 02 04 04 08 08 09 ................ +| page 6 offset 20480 +| 0: 0d 00 00 00 08 0f d0 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0b 04 07 03 00 0e 06 04 06 03 00 ................ +| 4064: 0e 06 04 05 03 00 0e 0a 04 04 03 00 0e 07 04 03 ................ +| 4080: 03 00 0e 0a 04 02 03 00 0e 0b 04 01 03 00 0e 08 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 01 0f f7 00 0f f7 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 07 00 03 00 14 08 45 b5 03 .............E.. +| end crash-de7e8cb026385a.db +}]} {} + +do_catchsql_test 16.1 { + INSERT INTO t1(t1) VALUES('optimize'); +} {0 {}} + +#------------------------------------------------------------------------- +reset_db +do_test 17.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 28672 pagesize 4096 filename crash-f15972acf5bc1c.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 0d a4 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 ock INTEGER,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 03 28 0d 4f 0d 35 0d 1b 0c fb .......(.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 72 7f 00 .........?%..r.. +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 20 44 45 42 4.0 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 43 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAC EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 14 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0e 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 4d 03 25 15 00 00 04 .%....sysM.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 0e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 01 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 10 d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-f15972acf5bc1c.db +}]} {} + +breakpoint +do_execsql_test 17.1 { + BEGIN; + INSERT INTO t1(t1) SELECT x FROM t2; + UPDATE t1 SET b=quote(zeroblob(200)) WHERE a MATCH 'thread*'; +} + +do_catchsql_test 17.2 { + DROP TABLE IF EXISTS t1; +} {1 {SQL logic error}} + +do_execsql_test 17.3 { + INSERT INTO t1(t1) VALUES('optimize'); +} + +do_catchsql_test 17.4 { + DROP TABLE IF EXISTS t1; +} {1 {SQL logic error}} + +#------------------------------------------------------------------------- +reset_db +do_test 18.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-4ce32d0608aff1.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 07 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 0d a4 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 62 2c 72 6f 6f 74 ock INTEGEb,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 23 00 20 32 30 31 36 30 36 30 39 20 44 45 42 4#. 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 53 49 4d 18 1b 05 00 25 00000XRTSIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 52 4c 45 20 4a 53 4f ...%..ENARLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 1e 4c NARY....)..ENA.L +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 55 ....)..ENABLE GU +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 59 e5 58 .#..ENABLE FTY.X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 ..#..ENABLE FTS5 +| 3792: 58 4e 4f 43 40 53 45 16 0a 05 00 23 0f 17 45 4e XNOC@SE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 25 75 2e 34 2f 30 20 32 30 31 36 30 36 30 cc%u.4/0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 41 00 04 6c 6f 61 64 03 25 1c 00 n1.%.A..load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 56 65 03 %....threadsaVe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 02 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 f2 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 57 02 00 .............W.. +| 3504: 01 02 00 01 01 00 01 02 00 11 02 00 01 02 10 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 64 6e 73 69 6f .........xtdnsio +| 3552: 6e 09 1f 04 00 01 04 00 01 03 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 57 63 63 09 01 03 ..........Wcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 02 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4064: 00 00 00 00 00 0d 05 02 23 61 75 74 6f 6d 65 72 ........#automer +| 4080: 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 3d 31 30 ge=5...#merge=10 +| page 8 offset 28672 +| 0: 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 69 74 79 0,8...+integrity +| 16: 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 75 69 6c -check....rebuil +| 32: 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 00 00 00 d....optimize... +| end crash-4ce32d0608aff1.db +}]} {} + +do_catchsql_test 18.1 { + SELECT quote(matchinfo(t1,'pcxybs'))==0 FROM t1 WHERE b MATCH 'e*'; +} {0 0} + +#------------------------------------------------------------------------- +reset_db +do_test 19.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-526ea445f41c02.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 00 00 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 ock INTEGER,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 41 43 52 ...._tablet1tACR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2f .COMPILER=gcc-5/ +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 20 44 45 42 4.0 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4f 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c OARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4d f5 20 46 54 53 34 ..#..ENABM. FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 52 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ARLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 04 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 13 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 12 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 81 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 01 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-526ea445f41c02.db +}]} {} + +do_catchsql_test 19.1 { + SELECT rowid,a,c,snippet(t1,85101090932165,-1,10) FROM t1 WHERE a MATCH 'rtree'; +} {1 {database disk image is malformed}} + finish_test + diff --git a/sqlite/test/fts3expr5.test b/sqlite/test/fts3expr5.test index 1e098510..8673abb7 100644 --- a/sqlite/test/fts3expr5.test +++ b/sqlite/test/fts3expr5.test @@ -22,6 +22,10 @@ ifcapable !fts3 { return } +proc test_fts3expr {expr} { + db one {SELECT fts3_exprtest('simple', $expr, 'a', 'b', 'c')} +} + #------------------------------------------------------------------------- # Various forms of empty phrase expressions. # @@ -45,4 +49,19 @@ do_execsql_test 1.5 { SELECT rowid FROM t0 WHERE x MATCH '""""'; } {} +#------------------------------------------------------------------------- +# Various forms of empty phrase expressions. +# +set sqlite_fts3_enable_parentheses 1 +do_test 2.0 { + test_fts3expr {(a:123)(b:234)()(c:456)} +} {AND {AND {PHRASE 0 0 123} {PHRASE 1 0 234}} {PHRASE 2 0 456}} +do_test 2.1 { + test_fts3expr {(a:123)(b:234)(c:456)} +} {AND {AND {PHRASE 0 0 123} {PHRASE 1 0 234}} {PHRASE 2 0 456}} +do_test 2.2 { + list [catch { test_fts3expr {"123" AND ( )} } msg] $msg +} {1 {Error parsing expression}} + finish_test + diff --git a/sqlite/test/fts3fault.test b/sqlite/test/fts3fault.test index 996a108d..707e884f 100644 --- a/sqlite/test/fts3fault.test +++ b/sqlite/test/fts3fault.test @@ -240,4 +240,20 @@ do_faultsim_test 10.1 -prep { faultsim_test_result {0 {}} } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 11.0 { + CREATE VIRTUAL TABLE t1 USING fts3(a, b); +} +faultsim_save_and_close + +do_faultsim_test 11 -faults oom* -prep { + faultsim_restore_and_reopen +} -body { + execsql { DROP TABLE t1 } +} -test { + faultsim_test_result {0 {}} +} + + finish_test diff --git a/sqlite/test/fts3fuzz001.test b/sqlite/test/fts3fuzz001.test new file mode 100644 index 00000000..41b22d33 --- /dev/null +++ b/sqlite/test/fts3fuzz001.test @@ -0,0 +1,114 @@ +# 2012-12-21 +# +# 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. +# +#*********************************************************************** +# +# Test cases for corrupt database files. + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +ifcapable !deserialize||!fts3 { + finish_test + return +} +database_may_be_corrupt + +do_test fts3fuzz001-100 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename c6.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e f9 00 06 0d ec 00 0f cd 0f 69 ...............i +| 112: 0f 01 0e 10 0e c6 0d ec 00 00 00 00 00 00 00 00 ................ +| 3552: 00 00 00 00 00 00 00 00 00 00 00 00 22 06 06 17 ............"... +| 3568: 11 11 01 31 74 61 62 6c 65 74 32 74 32 06 43 52 ...1tablet2t2.CR +| 3584: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 EATE TABLE t2(x) +| 3600: 81 33 04 07 17 1f 1f 01 82 35 74 61 62 6c 65 74 .3.......5tablet +| 3616: 31 5f 73 65 67 64 69 72 74 31 5f 73 65 67 64 69 1_segdirt1_segdi +| 3632: 72 04 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 r.CREATE TABLE ' +| 3648: 74 31 5f 73 65 67 64 69 72 27 28 6c 65 76 65 6c t1_segdir'(level +| 3664: 20 49 4e 54 45 47 45 52 2c 69 64 78 20 49 4e 54 INTEGER,idx INT +| 3680: 45 47 45 52 2c 73 74 61 72 74 5f 62 6c 6f 63 6b EGER,start_block +| 3696: 20 49 4e 54 45 47 45 52 2c 6c 65 61 76 65 73 5f INTEGER,leaves_ +| 3712: 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 end_block INTEGE +| 3728: 52 2c 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 45 R,end_block INTE +| 3744: 47 45 52 2c 72 6f 6f 74 20 42 4c 4f 42 2c 50 52 GER,root BLOB,PR +| 3760: 49 4d 41 52 59 20 4b 45 59 28 6c 65 76 65 6c 2c IMARY KEY(level, +| 3776: 20 69 64 78 29 29 31 05 06 17 45 1f 01 00 69 6e idx))1...E...in +| 3792: 64 65 78 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e dexsqlite_autoin +| 3808: 64 65 78 5f 74 15 f7 36 56 76 46 97 25 f3 17 43 dex_t..6VvF.%..C +| 3824: 15 5f 73 65 67 64 69 72 05 00 00 00 08 00 00 00 ._segdir........ +| 3840: 00 66 03 07 17 23 23 01 81 13 74 61 62 6c 65 74 .f...##...tablet +| 3856: 31 5f 73 65 67 6d 65 6e 74 73 74 31 5f 73 65 67 1_segmentst1_seg +| 3872: 6d 65 6e 74 73 03 43 52 45 41 54 45 20 54 41 42 ments.CREATE TAB +| 3888: 4c 45 20 27 74 31 5f 73 65 67 6d 65 6e 74 73 27 LE 't1_segments' +| 3904: 28 62 6c 6f 63 6b 69 64 20 49 4e 54 45 47 45 52 (blockid INTEGER +| 3920: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c PRIMARY KEY, bl +| 3936: 6f 63 6b 20 42 4c 4f 42 29 62 02 07 17 21 21 01 ock BLOB)b...!!. +| 3952: 81 0f 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 6e ..tablet1_conten +| 3968: 74 74 31 5f 63 6f 6e 74 65 6e 74 02 43 52 45 41 tt1_content.CREA +| 3984: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 4000: 74 65 6e 74 27 28 64 6f 63 69 64 20 49 4e 54 45 tent'(docid INTE +| 4016: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY, +| 4032: 20 27 63 30 63 6f 6e 74 65 6e 74 27 29 31 01 06 'c0content')1.. +| 4048: 17 11 11 08 51 74 61 62 6c 65 74 31 74 31 43 52 ....Qtablet1t1CR +| 4064: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4080: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f ec 0f e0 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 3 offset 8192 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 01 0f d6 00 0f 00 00 00 00 00 00 00 ................ +| 4048: 00 00 00 00 00 00 28 01 07 08 08 08 08 15 46 30 ......(.......F0 +| 4064: 20 32 39 00 05 61 62 61 63 6b 03 01 02 00 03 02 29..aback...... +| 4080: 66 74 03 02 02 00 03 04 6e 64 6f 6e 03 03 02 00 ft......ndon.... +| page 5 offset 16384 +| 0: 0a 00 00 00 01 0f fb 00 0f fb 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 04 04 08 08 09 ................ +| page 6 offset 20480 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 3d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity=check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end c6.db + }] + catchsql { + PRAGMA writable_schema=on; -- disable schema corruption detection + INSERT INTO t1(t1) SELECT x FROM t2; + } +} {1 {database disk image is malformed}} +do_test fts3fuzz001-110 { + catchsql { + INSERT INTO t1(t1) VALUES('integrity-check'); + } +} {1 {database disk image is malformed}} +do_test fts3fuzz001-120 { + catchsql { + INSERT INTO t1(t1) VALUES('optimize'); + } +} {1 {database disk image is malformed}} +do_test fts3fuzz001-121 { + catchsql { + INSERT INTO t1(t1) VALUES('integrity-check'); + } +} {1 {database disk image is malformed}} + + +finish_test diff --git a/sqlite/test/fts3snippet.test b/sqlite/test/fts3snippet.test index 4a0b7873..ebcdb8cf 100644 --- a/sqlite/test/fts3snippet.test +++ b/sqlite/test/fts3snippet.test @@ -555,6 +555,11 @@ do_test 4.2 { }] } {64} +do_test 4.3 { + llength [db one { + SELECT snippet(t4, '', '', '', 0, 150) FROM t4 WHERE t4 MATCH 'E' + }] +} {64} diff --git a/sqlite/test/fts4umlaut.test b/sqlite/test/fts4umlaut.test new file mode 100644 index 00000000..a5a652fb --- /dev/null +++ b/sqlite/test/fts4umlaut.test @@ -0,0 +1,64 @@ +# 2018 December 3 +# +# 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 implements regression tests for SQLite library. The +# focus of this script is testing the FTS5 module. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix fts4umlaut + +ifcapable !fts3 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE t1 USING fts4(x, tokenize=unicode61); + CREATE VIRTUAL TABLE t2 USING fts4( + x, + tokenize=unicode61 "remove_diacritics=2" + ); +} + +foreach {tn q res1 res2} { + 1 "Hà Nội" 0 1 + 2 "Hà Noi" 1 1 + 3 "Ha Noi" 1 1 + 4 "Ha N\u1ed9i" 0 1 + 5 "Ha N\u006fi" 1 1 + 6 "Ha N\u006f\u0302i" 1 1 + 7 "Ha N\u006f\u0323\u0302i" 1 1 +} { + do_execsql_test 1.$tn.1 { + DELETE FROM t1; + INSERT INTO t1(rowid, x) VALUES (1, 'Ha Noi'); + SELECT count(*) FROM t1 WHERE t1 MATCH $q + } $res1 + do_execsql_test 1.$tn.2 { + DELETE FROM t1; + INSERT INTO t1(rowid, x) VALUES (1, $q); + SELECT count(*) FROM t1 WHERE t1 MATCH 'Ha Noi' + } $res1 + + do_execsql_test 1.$tn.3 { + DELETE FROM t2; + INSERT INTO t2(rowid, x) VALUES (1, 'Ha Noi'); + SELECT count(*) FROM t2 WHERE t2 MATCH $q + } $res2 + do_execsql_test 1.$tn.4 { + DELETE FROM t2; + INSERT INTO t2(rowid, x) VALUES (1, $q); + SELECT count(*) FROM t2 WHERE t2 MATCH 'Ha Noi' + } $res2 +} + +finish_test diff --git a/sqlite/test/fuzz4.test b/sqlite/test/fuzz4.test new file mode 100644 index 00000000..821cd165 --- /dev/null +++ b/sqlite/test/fuzz4.test @@ -0,0 +1,82 @@ +# 2018-12-12 +# +# 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. +# +#*********************************************************************** +# +# Test cases found by Matthew Denton's fuzzer at Chrome. +# + + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +do_execsql_test fuzz4-100 { + CREATE TABLE Table0 (Col0 NOT NULL DEFAULT (CURRENT_TIME IS 1 > 1)); + INSERT OR REPLACE INTO Table0 DEFAULT VALUES ; + SELECT * FROM Table0; +} {0} + +do_execsql_test fuzz4-110 { + CREATE TABLE Table1( + Col0 TEXT DEFAULT (CASE WHEN 1 IS 3530822107858468864 + THEN 1 ELSE quote(1) IS 3530822107858468864 END) + ); + INSERT INTO Table1 DEFAULT VALUES; + SELECT * FROM Table1; +} {0} + +do_execsql_test fuzz4-200 { + CREATE TABLE Table2a( + Col0 NOT NULL DEFAULT (CURRENT_TIME IS 1 IS NOT 1 > 1) + ); + INSERT OR REPLACE INTO Table2a DEFAULT VALUES; + SELECT * FROM Table2a; +} {0} + +do_execsql_test fuzz4-210 { + CREATE TABLE Table2b (Col0 NOT NULL DEFAULT (CURRENT_TIME IS NOT FALSE)) ; + INSERT OR REPLACE INTO Table2b DEFAULT VALUES ; + SELECT * FROM Table2b; +} {1} + +do_execsql_test fuzz4-300 { + CREATE TABLE Table3 (Col0 DEFAULT (CURRENT_TIMESTAMP BETWEEN 1 AND 1)); + INSERT INTO Table3 DEFAULT VALUES; + SELECT * FROM Table3; +} {0} + +do_execsql_test fuzz4-400 { + CREATE TABLE Table4 (Col0 DEFAULT (1 BETWEEN CURRENT_TIMESTAMP AND 1)); + INSERT INTO Table4 DEFAULT VALUES; + SELECT * FROM Table4; +} {0} + +do_execsql_test fuzz4-500 { + CREATE TABLE Table5 (Col0 DEFAULT (1 BETWEEN 1 AND CURRENT_TIMESTAMP)); + INSERT INTO Table5 DEFAULT VALUES; + SELECT * FROM Table5; +} {1} + +do_execsql_test fuzz4-600 { + CREATE TEMPORARY TABLE Table6( + Col0 DEFAULT (CASE x'5d' WHEN 1 THEN + CASE CURRENT_TIMESTAMP WHEN 1 THEN 1 ELSE 1 END + ELSE CASE WHEN 1 THEN FALSE END END ) + ); + INSERT INTO temp.Table6 DEFAULT VALUES ; + SELECT * FROM Table6; +} {0} +do_execsql_test fuzz4-610 { + WITH TableX AS (SELECT DISTINCT * ORDER BY 1 , 1 COLLATE RTRIM) + DELETE FROM Table6 WHERE Col0 || +8388608 ; + SELECT * FROM Table6; +} {} + + +finish_test diff --git a/sqlite/test/fuzzcheck.c b/sqlite/test/fuzzcheck.c index 005f59b3..80397ba4 100644 --- a/sqlite/test/fuzzcheck.c +++ b/sqlite/test/fuzzcheck.c @@ -69,6 +69,7 @@ #include #include #include +#include #include "sqlite3.h" #define ISSPACE(X) isspace((unsigned char)(X)) #define ISDIGIT(X) isdigit((unsigned char)(X)) @@ -400,7 +401,6 @@ static void blobListFree(Blob *p){ } } - /* Return the current wall-clock time */ static sqlite3_int64 timeOfDay(void){ static sqlite3_vfs *clockVfs = 0; @@ -419,6 +419,469 @@ static sqlite3_int64 timeOfDay(void){ return t; } +/*************************************************************************** +** Code to process combined database+SQL scripts generated by the +** dbsqlfuzz fuzzer. +*/ + +/* An instance of the following object is passed by pointer as the +** client data to various callbacks. +*/ +typedef struct FuzzCtx { + sqlite3 *db; /* The database connection */ + sqlite3_int64 iCutoffTime; /* Stop processing at this time. */ + sqlite3_int64 iLastCb; /* Time recorded for previous progress callback */ + sqlite3_int64 mxInterval; /* Longest interval between two progress calls */ + unsigned nCb; /* Number of progress callbacks */ + unsigned mxCb; /* Maximum number of progress callbacks allowed */ + unsigned execCnt; /* Number of calls to the sqlite3_exec callback */ + int timeoutHit; /* True when reaching a timeout */ +} FuzzCtx; + +/* Verbosity level for the dbsqlfuzz test runner */ +static int eVerbosity = 0; + +/* True to activate PRAGMA vdbe_debug=on */ +static int bVdbeDebug = 0; + +/* Timeout for each fuzzing attempt, in milliseconds */ +static int giTimeout = 10000; /* Defaults to 10 seconds */ + +/* Maximum number of progress handler callbacks */ +static unsigned int mxProgressCb = 2000; + +/* Maximum string length in SQLite */ +static int lengthLimit = 1000000; + +/* Maximum byte-code program length in SQLite */ +static int vdbeOpLimit = 25000; + +/* Maximum size of the in-memory database */ +static sqlite3_int64 maxDbSize = 104857600; + +/* +** Translate a single byte of Hex into an integer. +** This routine only works if h really is a valid hexadecimal +** character: 0..9a..fA..F +*/ +static unsigned char hexToInt(unsigned int h){ +#ifdef SQLITE_EBCDIC + h += 9*(1&~(h>>4)); /* EBCDIC */ +#else + h += 9*(1&(h>>6)); /* ASCII */ +#endif + return h & 0xf; +} + +/* +** The first character of buffer zIn[0..nIn-1] is a '['. This routine +** checked to see if the buffer holds "[NNNN]" or "[+NNNN]" and if it +** does it makes corresponding changes to the *pK value and *pI value +** and returns true. If the input buffer does not match the patterns, +** no changes are made to either *pK or *pI and this routine returns false. +*/ +static int isOffset( + const unsigned char *zIn, /* Text input */ + int nIn, /* Bytes of input */ + unsigned int *pK, /* half-byte cursor to adjust */ + unsigned int *pI /* Input index to adjust */ +){ + int i; + unsigned int k = 0; + unsigned char c; + for(i=1; i=nAlloc ){ + sqlite3_uint64 newSize; + if( nAlloc==MX_FILE_SZ || j>=MX_FILE_SZ ){ + if( eVerbosity ){ + fprintf(stderr, "Input database too big: max %d bytes\n", + MX_FILE_SZ); + } + sqlite3_free(a); + return -1; + } + newSize = nAlloc*2; + if( newSize<=j ){ + newSize = (j+4096)&~4095; + } + if( newSize>MX_FILE_SZ ){ + if( j>=MX_FILE_SZ ){ + sqlite3_free(a); + return -1; + } + newSize = MX_FILE_SZ; + } + a = sqlite3_realloc64( a, newSize ); + if( a==0 ){ + fprintf(stderr, "Out of memory!\n"); + exit(1); + } + assert( newSize > nAlloc ); + memset(a+nAlloc, 0, newSize - nAlloc); + nAlloc = newSize; + } + if( j>=(unsigned)mx ){ + mx = (j + 4095)&~4095; + if( mx>MX_FILE_SZ ) mx = MX_FILE_SZ; + } + assert( j=p->iCutoffTime; + sqlite3_int64 iDiff = iNow - p->iLastCb; + if( iDiff > p->mxInterval ) p->mxInterval = iDiff; + p->nCb++; + if( rc==0 && p->mxCb>0 && p->mxCb<=p->nCb ) rc = 1; + if( rc && !p->timeoutHit && eVerbosity>=2 ){ + printf("Timeout on progress callback %d\n", p->nCb); + fflush(stdout); + p->timeoutHit = 1; + } + return rc; +} + +/* +** Disallow debugging pragmas such as "PRAGMA vdbe_debug" and +** "PRAGMA parser_trace" since they can dramatically increase the +** amount of output without actually testing anything useful. +** +** Also block ATTACH and DETACH +*/ +static int block_troublesome_sql( + void *Notused, + int eCode, + const char *zArg1, + const char *zArg2, + const char *zArg3, + const char *zArg4 +){ + (void)Notused; + (void)zArg2; + (void)zArg3; + (void)zArg4; + if( eCode==SQLITE_PRAGMA ){ + if( sqlite3_strnicmp("vdbe_", zArg1, 5)==0 + || sqlite3_stricmp("parser_trace", zArg1)==0 + || sqlite3_stricmp("temp_store_directory", zArg1)==0 + ){ + return SQLITE_DENY; + } + }else if( (eCode==SQLITE_ATTACH || eCode==SQLITE_DETACH) + && zArg1 && zArg1[0] ){ + return SQLITE_DENY; + } + return SQLITE_OK; +} + +/* +** Run the SQL text +*/ +static int runDbSql(sqlite3 *db, const char *zSql){ + int rc; + sqlite3_stmt *pStmt; + while( isspace(zSql[0]&0x7f) ) zSql++; + if( zSql[0]==0 ) return SQLITE_OK; + if( eVerbosity>=4 ){ + printf("RUNNING-SQL: [%s]\n", zSql); + fflush(stdout); + } + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc==SQLITE_OK ){ + while( (rc = sqlite3_step(pStmt))==SQLITE_ROW ){ + if( eVerbosity>=5 ){ + int j; + for(j=0; j=5 ) */ + } /* End while( SQLITE_ROW */ + if( rc!=SQLITE_DONE && eVerbosity>=4 ){ + printf("SQL-ERROR: (%d) %s\n", rc, sqlite3_errmsg(db)); + fflush(stdout); + } + }else if( eVerbosity>=4 ){ + printf("SQL-ERROR (%d): %s\n", rc, sqlite3_errmsg(db)); + fflush(stdout); + } /* End if( SQLITE_OK ) */ + return sqlite3_finalize(pStmt); +} + +/* Invoke this routine to run a single test case */ +int runCombinedDbSqlInput(const uint8_t *aData, size_t nByte){ + int rc; /* SQLite API return value */ + int iSql; /* Index in aData[] of start of SQL */ + unsigned char *aDb = 0; /* Decoded database content */ + int nDb = 0; /* Size of the decoded database */ + int i; /* Loop counter */ + int j; /* Start of current SQL statement */ + char *zSql = 0; /* SQL text to run */ + int nSql; /* Bytes of SQL text */ + FuzzCtx cx; /* Fuzzing context */ + + if( nByte<10 ) return 0; + if( sqlite3_initialize() ) return 0; + if( sqlite3_memory_used()!=0 ){ + int nAlloc = 0; + int nNotUsed = 0; + sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &nAlloc, &nNotUsed, 0); + fprintf(stderr,"Memory leak in mutator: %lld bytes in %d allocations\n", + sqlite3_memory_used(), nAlloc); + exit(1); + } + memset(&cx, 0, sizeof(cx)); + iSql = decodeDatabase((unsigned char*)aData, (int)nByte, &aDb, &nDb); + if( iSql<0 ) return 0; + nSql = (int)(nByte - iSql); + if( eVerbosity>=3 ){ + printf( + "****** %d-byte input, %d-byte database, %d-byte script " + "******\n", (int)nByte, nDb, nSql); + fflush(stdout); + } + rc = sqlite3_open(0, &cx.db); + if( rc ) return 1; + if( bVdbeDebug ){ + sqlite3_exec(cx.db, "PRAGMA vdbe_debug=ON", 0, 0, 0); + } + + /* Invoke the progress handler frequently to check to see if we + ** are taking too long. The progress handler will return true + ** (which will block further processing) if more than giTimeout seconds have + ** elapsed since the start of the test. + */ + cx.iLastCb = timeOfDay(); + cx.iCutoffTime = cx.iLastCb + giTimeout; /* Now + giTimeout seconds */ + cx.mxCb = mxProgressCb; +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + sqlite3_progress_handler(cx.db, 10, progress_handler, (void*)&cx); +#endif + + /* Set a limit on the maximum size of a prepared statement, and the + ** maximum length of a string or blob */ + if( vdbeOpLimit>0 ){ + sqlite3_limit(cx.db, SQLITE_LIMIT_VDBE_OP, vdbeOpLimit); + } + if( lengthLimit>0 ){ + sqlite3_limit(cx.db, SQLITE_LIMIT_LENGTH, lengthLimit); + } + + if( nDb>=20 && aDb[18]==2 && aDb[19]==2 ){ + aDb[18] = aDb[19] = 1; + } + rc = sqlite3_deserialize(cx.db, "main", aDb, nDb, nDb, + SQLITE_DESERIALIZE_RESIZEABLE | + SQLITE_DESERIALIZE_FREEONCLOSE); + if( rc ){ + fprintf(stderr, "sqlite3_deserialize() failed with %d\n", rc); + goto testrun_finished; + } + if( maxDbSize>0 ){ + sqlite3_int64 x = maxDbSize; + sqlite3_file_control(cx.db, "main", SQLITE_FCNTL_SIZE_LIMIT, &x); + } + + /* For high debugging levels, turn on debug mode */ + if( eVerbosity>=5 ){ + sqlite3_exec(cx.db, "PRAGMA vdbe_debug=ON;", 0, 0, 0); + } + + /* Block debug pragmas and ATTACH/DETACH. But wait until after + ** deserialize to do this because deserialize depends on ATTACH */ + sqlite3_set_authorizer(cx.db, block_troublesome_sql, 0); + + /* Consistent PRNG seed */ + sqlite3_randomness(0,0); + + zSql = sqlite3_malloc( nSql + 1 ); + if( zSql==0 ){ + fprintf(stderr, "Out of memory!\n"); + }else{ + memcpy(zSql, aData+iSql, nSql); + zSql[nSql] = 0; + for(i=j=0; zSql[i]; i++){ + if( zSql[i]==';' ){ + char cSaved = zSql[i+1]; + zSql[i+1] = 0; + if( sqlite3_complete(zSql+j) ){ + rc = runDbSql(cx.db, zSql+j); + j = i+1; + } + zSql[i+1] = cSaved; + if( rc==SQLITE_INTERRUPT || progress_handler(&cx) ){ + goto testrun_finished; + } + } + } + if( j=2 ){ + fprintf(stdout, "Peak memory usages: %f MB\n", + sqlite3_memory_highwater(1) / 1000000.0); + } + 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; +} + +/* +** END of the dbsqlfuzz code +***************************************************************************/ + +/* Look at a SQL text and try to determine if it begins with a database +** description, such as would be found in a dbsqlfuzz test case. Return +** true if this does appear to be a dbsqlfuzz test case and false otherwise. +*/ +static int isDbSql(unsigned char *a, int n){ + unsigned char buf[12]; + int i; + if( n>4 && memcmp(a,"\n--\n",4)==0 ) return 1; + while( n>0 && isspace(a[0]) ){ a++; n--; } + for(i=0; n>0 && i<8; n--, a++){ + if( isxdigit(a[0]) ) buf[i++] = a[0]; + } + if( i==8 && memcmp(buf,"53514c69",8)==0 ) return 1; + return 0; +} + +/* Implementation of the isdbsql(TEXT) SQL function. +*/ +static void isDbSqlFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int n = sqlite3_value_bytes(argv[0]); + unsigned char *a = (unsigned char*)sqlite3_value_blob(argv[0]); + sqlite3_result_int(context, a!=0 && n>0 && isDbSql(a,n)); +} + /* Methods for the VHandle object */ static int inmemClose(sqlite3_file *pFile){ @@ -447,7 +910,7 @@ static int inmemRead( if( iOfst+iAmt>pVFile->sz ){ memset(pData, 0, iAmt); iAmt = (int)(pVFile->sz - iOfst); - memcpy(pData, pVFile->a, iAmt); + memcpy(pData, pVFile->a + iOfst, iAmt); return SQLITE_IOERR_SHORT_READ; } memcpy(pData, pVFile->a + iOfst, iAmt); @@ -717,23 +1180,28 @@ static void runSql(sqlite3 *db, const char *zSql, unsigned runFlags){ ** (2) Put all entries in order ** (3) Vacuum */ -static void rebuild_database(sqlite3 *db){ +static void rebuild_database(sqlite3 *db, int dbSqlOnly){ int rc; - rc = sqlite3_exec(db, + char *zSql; + zSql = sqlite3_mprintf( "BEGIN;\n" "CREATE TEMP TABLE dbx AS SELECT DISTINCT dbcontent FROM db;\n" "DELETE FROM db;\n" "INSERT INTO db(dbid, dbcontent) " " SELECT NULL, dbcontent FROM dbx ORDER BY 2;\n" "DROP TABLE dbx;\n" - "CREATE TEMP TABLE sx AS SELECT DISTINCT sqltext FROM xsql;\n" + "CREATE TEMP TABLE sx AS SELECT DISTINCT sqltext FROM xsql %s;\n" "DELETE FROM xsql;\n" "INSERT INTO xsql(sqlid,sqltext) " " SELECT NULL, sqltext FROM sx ORDER BY 2;\n" "DROP TABLE sx;\n" "COMMIT;\n" "PRAGMA page_size=1024;\n" - "VACUUM;\n", 0, 0, 0); + "VACUUM;\n", + dbSqlOnly ? " WHERE isdbsql(sqltext)" : "" + ); + rc = sqlite3_exec(db, zSql, 0, 0, 0); + sqlite3_free(zSql); if( rc ) fatalError("cannot rebuild: %s", sqlite3_errmsg(db)); } @@ -795,6 +1263,19 @@ static int integerValue(const char *zArg){ return (int)(isNeg? -v : v); } +/* +** Return the number of "v" characters in a string. Return 0 if there +** are any characters in the string other than "v". +*/ +static int numberOfVChar(const char *z){ + int N = 0; + while( z[0] && z[0]=='v' ){ + z++; + N++; + } + return z[0]==0 ? N : 0; +} + /* ** Print sketchy documentation for this utility program */ @@ -814,6 +1295,7 @@ static void showHelp(void){ " --limit-vdbe Panic if any test runs for more than 100,000 cycles\n" " --load-sql ARGS... Load SQL scripts fron files into SOURCE-DB\n" " --load-db ARGS... Load template databases from files into SOURCE_DB\n" +" --load-dbsql ARGS.. Load dbsqlfuzz outputs into the xsql table\n" " -m TEXT Add a description to the database\n" " --native-vfs Use the native VFS for initially empty database files\n" " --native-malloc Turn off MEMSYS3/5 and Lookaside\n" @@ -840,6 +1322,7 @@ int main(int argc, char **argv){ Blob *pSql; /* For looping over SQL scripts */ Blob *pDb; /* For looping over template databases */ int i; /* Loop index for the argv[] loop */ + int dbSqlOnly = 0; /* Only use scripts that are dbsqlfuzz */ int onlySqlid = -1; /* --sqlid */ int onlyDbid = -1; /* --dbid */ int nativeFlag = 0; /* --native-vfs */ @@ -868,6 +1351,7 @@ int main(int argc, char **argv){ int nativeMalloc = 0; /* Turn off MEMSYS3/5 and lookaside if true */ sqlite3_vfs *pDfltVfs; /* The default VFS */ int openFlags4Data; /* Flags for sqlite3_open_v2() */ + int nV; /* How much to increase verbosity with -vvvv */ sqlite3_initialize(); iBegin = timeOfDay(); @@ -895,7 +1379,7 @@ int main(int argc, char **argv){ if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); zExpDb = argv[++i]; }else - if( strcmp(z,"export-sql")==0 ){ + if( strcmp(z,"export-sql")==0 || strcmp(z,"export-dbsql")==0 ){ if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); zExpSql = argv[++i]; }else @@ -930,6 +1414,13 @@ int main(int argc, char **argv){ openFlags4Data = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; break; }else + if( strcmp(z,"load-dbsql")==0 ){ + zInsSql = "INSERT INTO xsql(sqltext)VALUES(CAST(readfile(?1) AS text))"; + iFirstInsArg = i+1; + openFlags4Data = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; + dbSqlOnly = 1; + break; + }else if( strcmp(z,"m")==0 ){ if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); zMsg = argv[++i]; @@ -951,6 +1442,7 @@ int main(int argc, char **argv){ if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){ quietFlag = 1; verboseFlag = 0; + eVerbosity = 0; }else if( strcmp(z,"rebuild")==0 ){ rebuildFlag = 1; @@ -973,11 +1465,27 @@ int main(int argc, char **argv){ fatalError("timeout is not available on non-unix systems"); #endif }else - if( strcmp(z,"verbose")==0 || strcmp(z,"v")==0 ){ + if( strcmp(z,"verbose")==0 ){ quietFlag = 0; verboseFlag++; + eVerbosity++; if( verboseFlag>1 ) runFlags |= SQL_TRACE; }else + if( (nV = numberOfVChar(z))>=1 ){ + quietFlag = 0; + verboseFlag += nV; + eVerbosity += nV; + if( verboseFlag>1 ) runFlags |= SQL_TRACE; + }else + if( strcmp(z,"version")==0 ){ + int ii; + const char *zz; + printf("SQLite %s %s\n", sqlite3_libversion(), sqlite3_sourceid()); + for(ii=0; (zz = sqlite3_compileoption_get(ii))!=0; ii++){ + printf("%s\n", zz); + } + return 0; + }else { fatalError("unknown option: %s", argv[i]); } @@ -1094,6 +1602,8 @@ int main(int argc, char **argv){ if( zInsSql ){ sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0, readfileFunc, 0, 0); + sqlite3_create_function(db, "isdbsql", 1, SQLITE_UTF8, 0, + isDbSqlFunc, 0, 0); rc = sqlite3_prepare_v2(db, zInsSql, -1, &pStmt, 0); if( rc ) fatalError("cannot prepare statement [%s]: %s", zInsSql, sqlite3_errmsg(db)); @@ -1109,7 +1619,7 @@ int main(int argc, char **argv){ rc = sqlite3_exec(db, "COMMIT", 0, 0, 0); if( rc ) fatalError("cannot commit the transaction: %s", sqlite3_errmsg(db)); - rebuild_database(db); + rebuild_database(db, dbSqlOnly); sqlite3_close(db); return 0; } @@ -1196,7 +1706,7 @@ int main(int argc, char **argv){ printf("%s: rebuilding... ", zDbName); fflush(stdout); } - rebuild_database(db); + rebuild_database(db, 0); if( !quietFlag ) printf("done\n"); } @@ -1230,6 +1740,26 @@ int main(int argc, char **argv){ */ if( !verboseFlag && !quietFlag ) printf("%s:", zDbName); for(pSql=g.pFirstSql; pSql; pSql=pSql->pNext){ + if( isDbSql(pSql->a, pSql->sz) ){ + sqlite3_snprintf(sizeof(g.zTestName), g.zTestName, "sqlid=%d",pSql->id); + if( verboseFlag ){ + printf("%s\n", g.zTestName); + fflush(stdout); + }else if( !quietFlag ){ + static int prevAmt = -1; + int idx = pSql->seq; + int amt = idx*10/(g.nSql); + if( amt!=prevAmt ){ + printf(" %d%%", amt*10); + fflush(stdout); + prevAmt = amt; + } + } + runCombinedDbSqlInput(pSql->a, pSql->sz); + nTest++; + g.zTestName[0] = 0; + continue; + } for(pDb=g.pFirstDb; pDb; pDb=pDb->pNext){ int openFlags; const char *zVfs = "inmem"; diff --git a/sqlite/test/fuzzdata7.db b/sqlite/test/fuzzdata7.db index 69469f9fcd82b97ffa85c1573763db763fb623ff..f994daa2d09cce93dd59d63244501f6dad9c66bf 100644 GIT binary patch delta 445204 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 + +The dbtotxt utility program reads an SQLite database file and writes its +raw binary content to screen as a hex dump for testing and debugging +purposes. + +The hex-dump output is formatted in such a way as to be easily readable +both by humans and by software. The dbtotxt utility has long been a part +of the TH3 test suite. The output of dbtotxt can be embedded in TH3 test +scripts and used to generate very specific database files, perhaps with +deliberately introduced corruption. The cov1/corrupt*.test modules in +TH3 make extensive use of dbtotxt. + +More recently (2018-12-13) the dbtotxt utility has been added to the SQLite +core and the command-line shell (CLI) has been augmented to be able to read +dbtotxt output. The CLI dot-command is: + +> .open --hexdb ?OPTIONAL-FILENAME? + +If the OPTIONAL-FILENAME is included, then content is read from that file. +If OPTIONAL-FILENAME is omitted, then the text is taken from the input stream, +terminated by the "| end" line of the dbtotxt text. This allows small test +databases to be embedded directly in scripts. Consider this example: + +> + .open --hexdb + | size 8192 pagesize 4096 filename x9.db + | page 1 offset 0 + | 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. + | 16: 10 00 01 01 00 40 20 20 00 00 00 04 00 00 00 02 .....@ ........ + | 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 04 ................ + | 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ + | 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 ................ + | 96: 00 2e 30 38 0d 00 00 00 01 0f c0 00 0f c0 00 00 ..08............ + | 4032: 3e 01 06 17 11 11 01 69 74 61 62 6c 65 74 31 74 >......itablet1t + | 4048: 31 02 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 1.CREATE TABLE t + | 4064: 31 28 78 2c 79 20 44 45 46 41 55 4c 54 20 78 27 1(x,y DEFAULT x' + | 4080: 66 66 27 2c 7a 20 44 45 46 41 55 4c 54 20 30 29 ff',z DEFAULT 0) + | page 2 offset 4096 + | 0: 0d 08 14 00 04 00 10 00 0e 05 0a 0f 04 15 00 10 ................ + | 16: 88 02 03 05 90 04 0e 08 00 00 00 00 00 00 00 00 ................ + | 1040: 00 00 00 00 ff 87 7c 02 05 8f 78 0e 08 00 00 00 ......|...x..... + | 2064: 00 00 00 ff 0c 0a 01 fb 00 00 00 00 00 00 00 00 ................ + | 2560: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 83 ................ + | 2576: 78 01 05 87 70 0e 08 00 00 00 00 00 00 00 00 00 x...p........... + | 3072: 00 00 00 00 00 00 00 00 00 ff 00 00 01 fb 00 00 ................ + | 3584: 00 00 00 00 00 83 78 00 05 87 70 0e 08 00 00 00 ......x...p..... + | 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ................ + | end x9.db + SELECT rowid FROM t1; + PRAGMA integrity_check; + +You can run this script to see that the database file is correctly decoded +and loaded. Furthermore, you can make subtle corruptions to the input +database simply by editing the hexadecimal description, then rerun the +script to verify that SQLite correctly handles the corruption. diff --git a/sqlite/tool/index_usage.c b/sqlite/tool/index_usage.c new file mode 100644 index 00000000..451fa65c --- /dev/null +++ b/sqlite/tool/index_usage.c @@ -0,0 +1,233 @@ +/* +** 2018-12-04 +** +** 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 implements a utility program used to help determine which +** indexes in a database schema are used and unused, and how often specific +** indexes are used. +*/ +#include "sqlite3.h" +#include +#include +#include +#include + +static void usage(const char *argv0){ + printf("Usage: %s [OPTIONS] DATABASE LOG\n\n", argv0); + printf( + "DATABASE is an SQLite database against which various statements\n" + "have been run. The SQL text is stored in LOG. LOG is an SQLite\n" + "database with this schema:\n" + "\n" + " CREATE TABLE sqllog(sql TEXT);\n" + "\n" + "This utility program analyzes statements contained in LOG and prints\n" + "a report showing how many times each index in DATABASE is used by the\n" + "statements in LOG.\n" + "\n" + "DATABASE only needs to contain the schema used by the statements in\n" + "LOG. The content can be removed from DATABASE.\n" + ); + printf( + "\nOPTIONS:\n\n" + " --progress N Show a progress message after every N input rows\n" + " -q Omit error message when parsing log entries\n" + " --using NAME Print SQL statements that use index NAME\n" + ); + printf("\nAnalysis will be done by SQLite version %s dated %.20s\n" + "checkin number %.40s. Different versions\n" + "of SQLite might use different indexes.\n", + sqlite3_libversion(), sqlite3_sourceid(), sqlite3_sourceid()+21); + exit(1); +} + +int main(int argc, char **argv){ + sqlite3 *db = 0; /* The main database */ + sqlite3_stmt *pStmt = 0; /* a query */ + char *zSql; + int nErr = 0; + int rc; + int bQuiet = 0; + int i, j; + const char *zUsing = 0; + sqlite3_stmt *pIncrCnt = 0; + int nRow = 0; + int iProgress = 0; + + for(i=j=1; i0 && (nRow%iProgress)==0 ){ + printf("%d...\n", nRow); + fflush(stdout); + } + while( sqlite3_step(pS2)==SQLITE_ROW ){ + const char *zExplain = (const char*)sqlite3_column_text(pS2,3); + const char *z1, *z2; + int n; + /* printf("EXPLAIN: %s\n", zExplain); */ + z1 = strstr(zExplain, " USING INDEX "); + if( z1==0 ) continue; + z1 += 13; + for(z2=z1+1; z2[0] && z2[1]!='('; z2++){} + n = z2 - z1; + if( zUsing && sqlite3_strnicmp(zUsing, z1, n)==0 ){ + printf("Using %s:\n%s\n", zUsing, zLog); + fflush(stdout); + } + sqlite3_bind_text(pIncrCnt,1,z1,n,SQLITE_STATIC); + sqlite3_step(pIncrCnt); + sqlite3_reset(pIncrCnt); + } + } + sqlite3_finalize(pS2); + } + sqlite3_finalize(pStmt); + + /* Generate the report */ + rc = sqlite3_prepare_v2(db, + "SELECT tbl, idx, cnt, " + " (SELECT group_concat(name,',') FROM pragma_index_info(idx))" + " FROM temp.idxu, main.sqlite_master" + " WHERE temp.idxu.tbl=main.sqlite_master.tbl_name" + " AND temp.idxu.idx=main.sqlite_master.name" + " ORDER BY cnt DESC, tbl, idx", + -1, &pStmt, 0); + if( rc ){ + printf("Cannot query the result table - %s\n", + sqlite3_errmsg(db)); + goto errorOut; + } + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + printf("%10d %s on %s(%s)\n", + sqlite3_column_int(pStmt, 2), + sqlite3_column_text(pStmt, 1), + sqlite3_column_text(pStmt, 0), + sqlite3_column_text(pStmt, 3)); + } + sqlite3_finalize(pStmt); + pStmt = 0; + +errorOut: + sqlite3_finalize(pIncrCnt); + sqlite3_finalize(pStmt); + sqlite3_close(db); + return nErr; +} diff --git a/sqlite/tool/lemon.c b/sqlite/tool/lemon.c index 1fca8b97..7ef99fd5 100644 --- a/sqlite/tool/lemon.c +++ b/sqlite/tool/lemon.c @@ -4590,13 +4590,20 @@ void ReportTable( tplt_print(out,lemp,lemp->overflow,&lineno); tplt_xfer(lemp->name,in,out,&lineno); - /* Generate the table of rule information + /* Generate the tables of rule information. yyRuleInfoLhs[] and + ** yyRuleInfoNRhs[]. ** ** Note: This code depends on the fact that rules are number ** sequentually beginning with 0. */ for(i=0, rp=lemp->rule; rp; rp=rp->next, i++){ - fprintf(out," { %4d, %4d }, /* (%d) ",rp->lhs->index,-rp->nrhs,i); + fprintf(out," %4d, /* (%d) ", rp->lhs->index, i); + rule_print(out, rp); + fprintf(out," */\n"); lineno++; + } + tplt_xfer(lemp->name,in,out,&lineno); + for(i=0, rp=lemp->rule; rp; rp=rp->next, i++){ + fprintf(out," %3d, /* (%d) ", -rp->nrhs, i); rule_print(out, rp); fprintf(out," */\n"); lineno++; } @@ -4667,6 +4674,7 @@ void ReportTable( /* Append any addition code the user desires */ tplt_print(out,lemp,lemp->extracode,&lineno); + acttab_free(pActtab); fclose(in); fclose(out); return; diff --git a/sqlite/tool/lempar.c b/sqlite/tool/lempar.c index 325b0e54..94c0a316 100644 --- a/sqlite/tool/lempar.c +++ b/sqlite/tool/lempar.c @@ -686,13 +686,15 @@ static void yy_shift( yyTraceShift(yypParser, yyNewState, "Shift"); } -/* The following table contains information about every rule that -** is used during the reduce. -*/ -static const struct { - YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ - signed char nrhs; /* Negative of the number of RHS symbols in the rule */ -} yyRuleInfo[] = { +/* For rule J, yyRuleInfoLhs[J] contains the symbol on the left-hand side +** of that rule */ +static const YYCODETYPE yyRuleInfoLhs[] = { +%% +}; + +/* For rule J, yyRuleInfoNRhs[J] contains the negative of the number +** of symbols on the right-hand side of that rule. */ +static const signed char yyRuleInfoNRhs[] = { %% }; @@ -725,7 +727,7 @@ static YYACTIONTYPE yy_reduce( yymsp = yypParser->yytos; #ifndef NDEBUG if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ - yysize = yyRuleInfo[yyruleno].nrhs; + yysize = yyRuleInfoNRhs[yyruleno]; if( yysize ){ fprintf(yyTraceFILE, "%sReduce %d [%s], go to state %d.\n", yyTracePrompt, @@ -740,7 +742,7 @@ static YYACTIONTYPE yy_reduce( /* Check that the stack is large enough to grow by a single entry ** if the RHS of the rule is empty. This ensures that there is room ** enough on the stack to push the LHS value */ - if( yyRuleInfo[yyruleno].nrhs==0 ){ + if( yyRuleInfoNRhs[yyruleno]==0 ){ #ifdef YYTRACKMAXSTACKDEPTH if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ yypParser->yyhwm++; @@ -782,9 +784,9 @@ static YYACTIONTYPE yy_reduce( %% /********** End reduce actions ************************************************/ }; - assert( yyruleno Date: Mon, 4 Mar 2019 18:09:51 -0500 Subject: [PATCH 2/3] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 68b82c75..7e3aefd4 100755 --- a/README.md +++ b/README.md @@ -8,11 +8,11 @@ If you need a specific version of SQLite, or specific SQLite compilation options -**December 5, 2018: Update SQLite to 3.26.0** ([changelog](https://github.com/swiftlyfalling/SQLiteLib/commits/master)). +**March 4, 2019: Update SQLite to 3.27.2** ([changelog](https://github.com/swiftlyfalling/SQLiteLib/commits/master)). **Requirements**: iOS 8.0+ / OSX 10.9+, Xcode 7.3+ -**SQLite Included:** **[3.26.0](https://www.sqlite.org/releaselog/3_26_0.html)** +**SQLite Included:** **[3.27.2](https://www.sqlite.org/releaselog/3_27_2.html)** From bac22609d68e2ee59b756a46cc1fc2ab6ffd7b81 Mon Sep 17 00:00:00 2001 From: swiftlyfalling Date: Mon, 4 Mar 2019 18:12:22 -0500 Subject: [PATCH 3/3] Travis: Add Xcode 10.1 builds --- .travis.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/.travis.yml b/.travis.yml index 7f4c3515..5c871941 100644 --- a/.travis.yml +++ b/.travis.yml @@ -125,6 +125,40 @@ matrix: env: - SDK="iphoneos" + ################################### + ### Xcode 10.1 on macOS 10.13 + + - os: osx + osx_image: xcode10.1 + gemfile: .ci/Gemfile.travis + env: + - DESTINATION="platform=macOS" + - os: osx + osx_image: xcode10.1 + gemfile: .ci/Gemfile.travis + env: + - DESTINATION="generic/platform=iOS" + - os: osx + osx_image: xcode10.1 + gemfile: .ci/Gemfile.travis + env: + - DESTINATION="generic/platform=watchOS" + - os: osx + osx_image: xcode10.1 + gemfile: .ci/Gemfile.travis + env: + - DESTINATION="generic/platform=tvOS" + - os: osx + osx_image: xcode10.1 + gemfile: .ci/Gemfile.travis + env: + - DESTINATION="platform=iOS Simulator,name=iPhone 8,OS=12.1" + - os: osx + osx_image: xcode10.1 + gemfile: .ci/Gemfile.travis + env: + - SDK="iphoneos" + script: - cd .ci - make test_build

    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�@+=9WgR>IW^h;6C9!s3r`8BR2jPJu8|oJ1 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�ydkNPkFXUi1Vr+0))j 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 z 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 CgHWCT literal 0 HcmV?d00001 diff --git a/sqlite/test/in.test b/sqlite/test/in.test index 478c0087..246cd76e 100644 --- a/sqlite/test/in.test +++ b/sqlite/test/in.test @@ -651,4 +651,68 @@ do_execsql_test in-14.1 { SELECT * FROM c1 WHERE a IN (SELECT a FROM c1) ORDER BY 1 } {1 2 3 4} +# 2019-02-20 Ticket https://www.sqlite.org/src/tktview/df46dfb631f75694fbb97033b69 +# +do_execsql_test in-15.0 { + DROP TABLE IF EXISTS t1; + CREATE TABLE IF NOT EXISTS t1(id INTEGER PRIMARY KEY); + INSERT INTO t1 VALUES(1); + SELECT a.id FROM t1 AS a JOIN t1 AS b ON a.id=b.id WHERE a.id IN (1,2,3); +} {1} +do_execsql_test in-15.1 { + DROP TABLE IF EXISTS t2; + CREATE TABLE t2(a INTEGER PRIMARY KEY,b); + INSERT INTO t2 VALUES(1,11); + INSERT INTO t2 VALUES(2,22); + INSERT INTO t2 VALUES(3,33); + SELECT b, a IN (3,4,5) FROM t2 ORDER BY b; +} {11 0 22 0 33 1} +do_execsql_test in-15.2 { + DROP TABLE IF EXISTS t3; + CREATE TABLE t3(x INTEGER PRIMARY KEY); + INSERT INTO t3 VALUES(8); + SELECT CASE WHEN x NOT IN (5,6,7) THEN 'yes' ELSE 'no' END FROM t3; + SELECT CASE WHEN x NOT IN (NULL,6,7) THEN 'yes' ELSE 'no' END FROM t3; +} {yes no} +do_execsql_test in-15.3 { + SELECT CASE WHEN x NOT IN (5,6,7) OR x=0 THEN 'yes' ELSE 'no' END FROM t3; + SELECT CASE WHEN x NOT IN (NULL,6,7) OR x=0 THEN 'yes' ELSE 'no' END FROM t3; +} {yes no} +do_execsql_test in-15.4 { + DROP TABLE IF EXISTS t4; + CREATE TABLE t4(a INTEGER PRIMARY KEY, b INT); + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20) + INSERT INTO t4(a,b) SELECT x, x+100 FROM c; + SELECT b FROM t4 WHERE a IN (3,null,8) ORDER BY +b; +} {103 108} +do_execsql_test in-15.5 { + SELECT b FROM t4 WHERE a NOT IN (3,null,8); +} {} +do_execsql_test in-15.6 { + DROP TABLE IF EXISTS t5; + DROP TABLE IF EXISTS t6; + CREATE TABLE t5(id INTEGER PRIMARY KEY, name TEXT); + CREATE TABLE t6(id INTEGER PRIMARY KEY, name TEXT, t5_id INT); + INSERT INTO t5 VALUES(1,'Alice'),(2,'Emma'); + INSERT INTO t6 VALUES(1,'Bob',1),(2,'Cindy',1),(3,'Dave',2); + SELECT a.* + FROM t5 AS 'a' JOIN t5 AS 'b' ON b.id=a.id + WHERE b.id IN ( + SELECT t6.t5_id + FROM t6 + WHERE name='Bob' + AND t6.t5_id IS NOT NULL + AND t6.id IN ( + SELECT id + FROM (SELECT t6.id, count(*) AS x + FROM t6 + WHERE name='Bob' + ) AS 't' + WHERE x=1 + ) + AND t6.id IN (1,id) + ); +} {1 Alice} + + finish_test diff --git a/sqlite/test/index6.test b/sqlite/test/index6.test index 4ddce453..29b73f72 100644 --- a/sqlite/test/index6.test +++ b/sqlite/test/index6.test @@ -389,6 +389,25 @@ do_execsql_test index6-11.1 { do_execsql_test index6-11.2 { EXPLAIN QUERY PLAN SELECT a FROM t11 WHERE b<>99 AND c<>98; } {/USING INDEX t11x/} - +# 2018-12-08 +# Ticket https://www.sqlite.org/src/info/1d958d90596593a7 +# NOT IN operator fails when using a partial index. +# +do_execsql_test index6-12.1 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(a,b); + INSERT INTO t1 VALUES(1,1); + INSERT INTO t1 VALUES(2,2); + CREATE TABLE t2(x); + INSERT INTO t2 VALUES(1); + INSERT INTO t2 VALUES(2); + SELECT 'one', * FROM t2 WHERE x NOT IN (SELECT a FROM t1); + CREATE INDEX t1a ON t1(a) WHERE b=1; + SELECT 'two', * FROM t2 WHERE x NOT IN (SELECT a FROM t1); +} {} +do_execsql_test index6-12.2 { + SELECT x FROM t2 WHERE x IN (SELECT a FROM t1) ORDER BY +x; +} {1 2} finish_test diff --git a/sqlite/test/indexexpr2.test b/sqlite/test/indexexpr2.test index 79a6456e..8d6e5914 100644 --- a/sqlite/test/indexexpr2.test +++ b/sqlite/test/indexexpr2.test @@ -231,5 +231,52 @@ ifcapable vtab { } {t2 t2abc t2cd t2def} } +#------------------------------------------------------------------------- +# Test that ticket [d96eba87] has been fixed. +# +do_execsql_test 5.0 { + CREATE TABLE t5(a INTEGER, b INTEGER); + INSERT INTO t5 VALUES(2, 4), (3, 9); +} +do_execsql_test 5.1 { + SELECT * FROM t5 WHERE abs(a)=2 or abs(b)=9; +} {2 4 3 9} +do_execsql_test 5.2 { + CREATE INDEX t5a ON t5( abs(a) ); + CREATE INDEX t5b ON t5( abs(b) ); +} +do_execsql_test 5.4 { + SELECT * FROM t5 WHERE abs(a)=2 or abs(b)=9; +} {2 4 3 9} + +#------------------------------------------------------------------------- +do_execsql_test 6.0 { + CREATE TABLE x1(a INTEGER PRIMARY KEY, b); + INSERT INTO x1 VALUES + (1, 123), (2, '123'), (3, '123abc'), (4, 123.0), (5, 1234); +} + +do_execsql_test 6.1.1 { + SELECT a, b FROM x1 WHERE CAST(b AS INTEGER) = 123; +} {1 123 2 123 3 123abc 4 123.0} +do_execsql_test 6.1.2 { + CREATE INDEX x1i ON x1( CAST(b AS INTEGER) ); + SELECT a, b FROM x1 WHERE CAST(b AS INTEGER) = 123; +} {1 123 2 123 3 123abc 4 123.0} +do_eqp_test 6.1.3 { + SELECT a, b FROM x1 WHERE CAST(b AS INTEGER) = 123; +} {SEARCH TABLE x1 USING INDEX x1i (=?)} + +do_execsql_test 6.2.1 { + SELECT a, b FROM x1 WHERE CAST(b AS TEXT) = 123; +} {1 123 2 123} +do_execsql_test 6.2.2 { + CREATE INDEX x1i2 ON x1( CAST(b AS TEXT) ); + SELECT a, b FROM x1 WHERE CAST(b AS TEXT) = 123; +} {1 123 2 123} +do_eqp_test 6.2.3 { + SELECT a, b FROM x1 WHERE CAST(b AS TEXT) = 123; +} {SEARCH TABLE x1 USING INDEX x1i2 (=?)} + finish_test diff --git a/sqlite/test/insert.test b/sqlite/test/insert.test index 1337105e..01c7016d 100644 --- a/sqlite/test/insert.test +++ b/sqlite/test/insert.test @@ -449,6 +449,15 @@ do_execsql_test insert-13.1 { SELECT * FROM t13 ORDER BY +b; } {2 0 6 2 1 5} +# 2019-01-17. From the chromium fuzzer. +# +do_execsql_test insert-14.1 { + DROP TABLE IF EXISTS t14; + CREATE TABLE t14(x INTEGER PRIMARY KEY); + INSERT INTO t14 VALUES(CASE WHEN 1 THEN null END); + SELECT x FROM t14; +} {1} + integrity_check insert-99.0 finish_test diff --git a/sqlite/test/insertfault.test b/sqlite/test/insertfault.test new file mode 100644 index 00000000..53849a1d --- /dev/null +++ b/sqlite/test/insertfault.test @@ -0,0 +1,36 @@ +# 2019-01-26 +# +# 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. +# +#*********************************************************************** +# +# Test cases for INSERT + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix insertfault + +do_execsql_test 1.0 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, d DEFAULT true); + INSERT INTO t1 DEFAULT VALUES; + SELECT * FROM t1; +} {1 {} {} 1} +faultsim_save_and_close + +breakpoint +do_faultsim_test 1 -faults oom* -prep { + faultsim_restore_and_reopen + db eval { SELECT * FROM sqlite_master } +} -body { + execsql { SELECT * FROM t1 } +} -test { + faultsim_test_result {0 {1 {} {} 1}} +} + + +finish_test diff --git a/sqlite/test/join.test b/sqlite/test/join.test index 8c6f463b..f613df85 100644 --- a/sqlite/test/join.test +++ b/sqlite/test/join.test @@ -671,20 +671,26 @@ jointest join-12.5 65 {1 {at most 64 tables in a join}} jointest join-12.6 66 {1 {at most 64 tables in a join}} jointest join-12.7 127 {1 {at most 64 tables in a join}} jointest join-12.8 128 {1 {at most 64 tables in a join}} -jointest join-12.9 1000 {1 {at most 64 tables in a join}} - -# If SQLite is built with SQLITE_MEMDEBUG, then the huge number of realloc() -# calls made by the following test cases are too time consuming to run. -# Without SQLITE_MEMDEBUG, realloc() is fast enough that these are not -# a problem. -ifcapable pragma&&compileoption_diags { - if {[lsearch [db eval {PRAGMA compile_options}] MEMDEBUG]<0} { - jointest join-12.10 65534 {1 {at most 64 tables in a join}} - jointest join-12.11 65535 {1 {too many references to "t14": max 65535}} - jointest join-12.12 65536 {1 {too many references to "t14": max 65535}} - jointest join-12.13 65537 {1 {too many references to "t14": max 65535}} - } -} + +# As of 2019-01-17, the number of elements in a SrcList is limited +# to 200. The following tests still run, but the answer is now +# an SQLITE_NOMEM error. +# +# jointest join-12.9 1000 {1 {at most 64 tables in a join}} +# +# If SQLite is built with SQLITE_MEMDEBUG, then the huge number of realloc() +# calls made by the following test cases are too time consuming to run. +# Without SQLITE_MEMDEBUG, realloc() is fast enough that these are not +# a problem. +# +# ifcapable pragma&&compileoption_diags { +# if {[lsearch [db eval {PRAGMA compile_options}] MEMDEBUG]<0} { +# jointest join-12.10 65534 {1 {at most 64 tables in a join}} +# jointest join-12.11 65535 {1 {too many references to "t14": max 65535}} +# jointest join-12.12 65536 {1 {too many references to "t14": max 65535}} +# jointest join-12.13 65537 {1 {too many references to "t14": max 65535}} +# } +# } #------------------------------------------------------------------------- @@ -844,4 +850,18 @@ do_execsql_test join-15.110 { ORDER BY a1, a2, a3, a4, a5; } {1 {} {} {} {} 1 11 {} {} {} 1 12 {} {} {} 1 12 121 {} {} 1 13 {} {} {}} +# 2019-02-05 Ticket https://www.sqlite.org/src/tktview/5948e09b8c415bc45da5c +# Error in join due to the LEFT JOIN strength reduction optimization. +# +do_execsql_test join-16.100 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(a INT); + INSERT INTO t1(a) VALUES(1); + CREATE TABLE t2(b INT); + SELECT a, b + FROM t1 LEFT JOIN t2 ON 0 + WHERE (b IS NOT NULL)=0; +} {1 {}} + finish_test diff --git a/sqlite/test/join5.test b/sqlite/test/join5.test index 2df66e7c..f4ded796 100644 --- a/sqlite/test/join5.test +++ b/sqlite/test/join5.test @@ -241,6 +241,18 @@ do_execsql_test 6.3.2 { SELECT ifnull(z, '!!!') FROM t3 LEFT JOIN t4 ON (x=y); } {!!!} +# 2019-02-08 https://sqlite.org/src/info/4e8e4857d32d401f +reset_db +do_execsql_test 6.100 { + CREATE TABLE t1(aa, bb); + CREATE INDEX t1x1 on t1(abs(aa), abs(bb)); + INSERT INTO t1 VALUES(-2,-3),(+2,-3),(-2,+3),(+2,+3); + SELECT * FROM (t1) + WHERE ((abs(aa)=1 AND 1=2) OR abs(aa)=2) + AND abs(bb)=3 + ORDER BY +1, +2; +} {-2 -3 -2 3 2 -3 2 3} + #------------------------------------------------------------------------- # reset_db @@ -267,8 +279,10 @@ do_eqp_test 7.2 { QUERY PLAN |--SCAN TABLE t1 `--MULTI-INDEX OR - |--SEARCH TABLE t2 USING INDEX t2xy (x=? AND y=?) - `--SEARCH TABLE t2 USING INDEX t2xy (x=? AND y=?) + |--INDEX 1 + | `--SEARCH TABLE t2 USING INDEX t2xy (x=? AND y=?) + `--INDEX 2 + `--SEARCH TABLE t2 USING INDEX t2xy (x=? AND y=?) } do_execsql_test 7.3 { diff --git a/sqlite/test/json101.test b/sqlite/test/json101.test index 9a93ee73..534478df 100644 --- a/sqlite/test/json101.test +++ b/sqlite/test/json101.test @@ -813,6 +813,23 @@ do_execsql_test json-14.170 { SELECT fullkey FROM json_tree('null'); } {$} - +# 2018-12-03 +# Make sure the table-valued functions contained within parentheses +# work correctly. +# +# Bug reported via private email. See TH3 for more information. +# +do_execsql_test json-15.100 { + SELECT * FROM JSON_EACH('{"a":1, "b":2}'); +} {a 1 integer 1 2 {} {$.a} {$} b 2 integer 2 4 {} {$.b} {$}} +do_execsql_test json-15.110 { + SELECT xyz.* FROM JSON_EACH('{"a":1, "b":2}') AS xyz; +} {a 1 integer 1 2 {} {$.a} {$} b 2 integer 2 4 {} {$.b} {$}} +do_execsql_test json-15.120 { + SELECT * FROM (JSON_EACH('{"a":1, "b":2}')); +} {a 1 integer 1 2 {} {$.a} {$} b 2 integer 2 4 {} {$.b} {$}} +do_execsql_test json-15.130 { + SELECT xyz.* FROM (JSON_EACH('{"a":1, "b":2}')) AS xyz; +} {a 1 integer 1 2 {} {$.a} {$} b 2 integer 2 4 {} {$.b} {$}} finish_test diff --git a/sqlite/test/lock_common.tcl b/sqlite/test/lock_common.tcl index a758e7af..3e1821ba 100644 --- a/sqlite/test/lock_common.tcl +++ b/sqlite/test/lock_common.tcl @@ -15,18 +15,20 @@ proc do_multiclient_test {varname script} { - foreach code [list { + foreach {tn code} [list 1 { if {[info exists ::G(valgrind)]} { db close ; continue } set ::code2_chan [launch_testfixture] set ::code3_chan [launch_testfixture] proc code2 {tcl} { testfixture $::code2_chan $tcl } proc code3 {tcl} { testfixture $::code3_chan $tcl } - set tn 1 - } { + } 2 { proc code2 {tcl} { uplevel #0 $tcl } proc code3 {tcl} { uplevel #0 $tcl } - set tn 2 }] { + # Do not run multi-process tests with the unix-excl VFS. + # + if {$tn==1 && [permutation]=="unix-excl"} continue + faultsim_delete_and_reopen proc code1 {tcl} { uplevel #0 $tcl } diff --git a/sqlite/test/memdb1.test b/sqlite/test/memdb1.test index 771d5e42..3d1a1f9a 100644 --- a/sqlite/test/memdb1.test +++ b/sqlite/test/memdb1.test @@ -72,6 +72,31 @@ do_execsql_test 140 { PRAGMA page_count; } {2} +do_test 150 { + catch {db deserialize -unknown 1 $db1} msg + set msg +} {unknown option: -unknown} +do_test 151 { + db deserialize -readonly 1 $db1 + db eval {SELECT * FROM t1} +} {1 2} +do_test 152 { + catchsql {INSERT INTO t1 VALUES(3,4);} +} {1 {attempt to write a readonly database}} + +breakpoint +do_test 160 { + db deserialize -maxsize 32768 $db1 + db eval {SELECT * FROM t1} +} {1 2} +do_test 161 { + db eval {INSERT INTO t1 VALUES(3,4); SELECT * FROM t1} +} {1 2 3 4} +do_test 162 { + catchsql {INSERT INTO t1 VALUES(5,randomblob(100000))} +} {1 {database or disk is full}} + + # Build a largish on-disk database and serialize it. Verify that the # serialization works. # @@ -154,7 +179,7 @@ do_test 600 { do_test 610 { set rc [catch {db deserialize a b c} msg] lappend rc $msg -} {1 {wrong # args: should be "db deserialize ?DATABASE? VALUE"}} +} {1 {unknown option: a}} do_test 620 { set rc [catch {db serialize a b} msg] lappend rc $msg diff --git a/sqlite/test/misc1.test b/sqlite/test/misc1.test index 9ac52e46..c14a31eb 100644 --- a/sqlite/test/misc1.test +++ b/sqlite/test/misc1.test @@ -744,5 +744,19 @@ do_execsql_test misc1-27.1 { SELECT a,b,c FROM dup1; } {10 11 12} +# 2018-12-20 +# +# The Cursor.seekOp debugging value set incorrectly +# in OP_NotExists. +# +sqlite3 db :memory: +do_execsql_test misc1-28.0 { + CREATE TABLE t1(x); + CREATE UNIQUE INDEX t1x ON t1(x) WHERE x=1; + INSERT OR ABORT INTO t1 DEFAULT VALUES; + UPDATE OR REPLACE t1 SET x = 1; + PRAGMA integrity_check; + SELECT * FROM t1; +} {ok 1} finish_test diff --git a/sqlite/test/misc7.test b/sqlite/test/misc7.test index 5ae8178d..e75a6840 100644 --- a/sqlite/test/misc7.test +++ b/sqlite/test/misc7.test @@ -227,6 +227,9 @@ ifcapable vtab { } } {1} set sqlite_where_trace 0 + do_catchsql_test misc7-10.1 { + INSERT INTO t1(a,b,c) VALUES(12345,2,3) ON CONFLICT(a) DO NOTHING; + } {1 {UPSERT not implemented for virtual table "t1"}} # Specify an ORDER BY clause that cannot be indexed. do_test misc7-11 { diff --git a/sqlite/test/normalize.test b/sqlite/test/normalize.test index e85bd003..8b0c7ed8 100644 --- a/sqlite/test/normalize.test +++ b/sqlite/test/normalize.test @@ -86,7 +86,7 @@ do_test 201 { } {} do_test 202 { sqlite3_normalized_sql $STMT -} {} +} {SELECT a,b FROM t1 WHERE b=?ORDER BY a;} do_test 203 { sqlite3_finalize $STMT } {SQLITE_OK} @@ -207,7 +207,7 @@ foreach {tnum sql flags norm} { 430 {SELECT "a" FROM t1 WHERE "x" IN ("1","2",'3');} 0x2 - {0 {SELECT"a"FROM t1 WHERE"x"IN(?,?,?);}} + {0 {SELECT a FROM t1 WHERE x IN(?,?,?);}} 440 {SELECT 'a' FROM t1 WHERE 'x';} @@ -217,7 +217,7 @@ foreach {tnum sql flags norm} { 450 {SELECT [a] FROM t1 WHERE [x];} 0x2 - {0 {SELECT"a"FROM t1 WHERE"x";}} + {0 {SELECT a FROM t1 WHERE x;}} 460 {SELECT * FROM t1 WHERE x IN (x);} @@ -232,12 +232,12 @@ foreach {tnum sql flags norm} { 480 {SELECT * FROM t1 WHERE x IN ([x],"a");} 0x2 - {0 {SELECT*FROM t1 WHERE x IN("x","a");}} + {0 {SELECT*FROM t1 WHERE x IN(x,a);}} 500 {SELECT * FROM t1 WHERE x IN ([x],"a",'b',sqlite_version());} 0x2 - {0 {SELECT*FROM t1 WHERE x IN("x","a",?,sqlite_version());}} + {0 {SELECT*FROM t1 WHERE x IN(x,a,?,sqlite_version());}} 520 {SELECT * FROM t1 WHERE x IN (SELECT x FROM t1);} @@ -247,12 +247,12 @@ foreach {tnum sql flags norm} { 540 {SELECT * FROM t1 WHERE x IN ((SELECT x FROM t1));} 0x2 - {0 {SELECT*FROM t1 WHERE x IN(?,?,?);}} + {0 {SELECT*FROM t1 WHERE x IN((SELECT x FROM t1));}} 550 {SELECT a, a+1, a||'b', a+"b" FROM t1;} 0x2 - {0 {SELECT a,a+?,a||?,a+"b"FROM t1;}} + {0 {SELECT a,a+?,a||?,a+b FROM t1;}} 570 {SELECT * FROM t1 WHERE x IN (1);} @@ -316,7 +316,7 @@ foreach {tnum sql flags norm} { 680 {SELECT a, "col f" FROM t1 LEFT OUTER JOIN t2 ON [t1].[col f] == [t2].[col y];} 0x2 - {0 {SELECT a,"col f"FROM t1 LEFT OUTER JOIN t2 ON"t1"."col f"=="t2"."col y";}} + {0 {SELECT a,"col f"FROM t1 LEFT OUTER JOIN t2 ON t1."col f"==t2."col y";}} 690 {SELECT * FROM ( WITH x AS ( SELECT * FROM t1 WHERE x IN ( 1)) SELECT 10);} @@ -346,7 +346,7 @@ foreach {tnum sql flags norm} { 760 {SELECT x FROM t1 WHERE x IN ([x] IS NOT NULL, NULL, 1, 'a', "b", x'00');} 0x2 - {0 {SELECT x FROM t1 WHERE x IN("x"IS NOT NULL,?,?,?,"b",?);}} + {0 {SELECT x FROM t1 WHERE x IN(x IS NOT NULL,?,?,?,b,?);}} } { do_test $tnum { set code [catch { diff --git a/sqlite/test/ossfuzz.c b/sqlite/test/ossfuzz.c index c3d66eb2..3b1017f7 100644 --- a/sqlite/test/ossfuzz.c +++ b/sqlite/test/ossfuzz.c @@ -155,6 +155,11 @@ int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { /* Set a limit on the maximum size of a prepared statement */ sqlite3_limit(cx.db, SQLITE_LIMIT_VDBE_OP, 25000); + /* Set a limit on the maximum length of a string or BLOB. Without this + ** limit, fuzzers will invoke randomblob(N) for a large N, and the process + ** will timeout trying to generate the huge blob */ + sqlite3_limit(cx.db, SQLITE_LIMIT_LENGTH, 50000); + /* Bit 1 of the selector enables foreign key constraints */ sqlite3_db_config(cx.db, SQLITE_DBCONFIG_ENABLE_FKEY, uSelector&1, &rc); uSelector >>= 1; diff --git a/sqlite/test/permutations.test b/sqlite/test/permutations.test index 6aa812e8..577cc7bd 100644 --- a/sqlite/test/permutations.test +++ b/sqlite/test/permutations.test @@ -430,10 +430,18 @@ lappend ::testsuitelist xxx test_suite "coverage-wal" -description { Coverage tests for file wal.c. } -files { - wal.test wal2.test wal3.test walmode.test - walbak.test walhook.test walcrash2.test walcksum.test - walfault.test walbig.test walnoshm.test - wal5.test + wal.test wal2.test wal3.test wal4.test wal5.test + wal64k.test wal6.test wal7.test wal8.test wal9.test + walbak.test walbig.test walblock.test walcksum.test walcrash2.test + walcrash3.test walcrash4.test walcrash.test walfault.test walhook.test + walmode.test walnoshm.test waloverwrite.test walpersist.test + walprotocol2.test walprotocol.test walro2.test walrofault.test + walro.test walshared.test walslow.test walvfs.test + walfault2.test + nockpt.test + + snapshot2.test snapshot3.test snapshot4.test + snapshot_fault.test snapshot.test snapshot_up.test } test_suite "coverage-pager" -description { @@ -744,7 +752,7 @@ test_suite "inmemory_journal" -description { # the number of fsync() calls. pager.test exclusive.test jrnlmode.test sync.test misc1.test journal1.test conflict.test crash8.test tkt3457.test io.test - journal3.test 8_3_names.test + journal3.test 8_3_names.test shmlock.test pager1.test async4.test corrupt.test filefmt.test pager2.test corrupt5.test corruptA.test pageropt.test @@ -958,7 +966,7 @@ test_suite "journaltest" -description { async4.test bigfile.test backcompat.test e_wal* fstat.test mmap2.test pager1.test syscall.test tkt3457.test *malloc* mmap* multiplex* nolock* pager2.test *fault* rowal* snapshot* superlock* symlink.test - delete_db.test + delete_db.test shmlock.test }] if {[info commands register_demovfs] != ""} { diff --git a/sqlite/test/prefixes.test b/sqlite/test/prefixes.test new file mode 100644 index 00000000..20809058 --- /dev/null +++ b/sqlite/test/prefixes.test @@ -0,0 +1,88 @@ +# 2018-01-15 +# +# 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 implements regression tests for SQLite library. The +# focus of this file is prefixes.c extension +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix unionvtab + +ifcapable !vtab { + finish_test + return +} + +load_static_extension db prefixes + +foreach {tn zLeft zRight expected} { + 1 abcdxxx abcyy 3 + 2 abcdxxx bcyyy 0 + 3 abcdxxx ab 2 + 4 ab abcd 2 + + 5 "xyz\u1234xz" "xyz\u1234xy" 5 + 6 "xyz\u1234" "xyz\u1234xy" 4 + 7 "xyz\u1234" "xyz\u1234" 4 + 8 "xyz\u1234xy" "xyz\u1234" 4 + 9 "xyz\u1234xy" "xyz\u1233" 3 + 10 "xyz\u1234xy" "xyz\u1235" 3 +} { + do_execsql_test 1.$tn { SELECT prefix_length($zLeft, $zRight) } $expected +} + + +do_execsql_test 2.0 { + CREATE TABLE t1(k TEXT UNIQUE, v INTEGER); + INSERT INTO t1 VALUES + ('aback', 1), + ('abaft', 2), + ('abandon', 3), + ('abandoned', 4), + ('abandoning', 5), + ('abandonment', 6), + ('abandons', 7), + ('abase', 8), + ('abased', 9), + ('abasement', 10), + ('abasements', 11), + ('abases', 12), + ('abash', 13), + ('abashed', 14), + ('abashes', 15), + ('abashing', 16), + ('abasing', 17), + ('abate', 18), + ('abated', 19), + ('abatement', 20), + ('abatements', 21); +} + +foreach {tn INPUT expected} { + 1 abatementt abatement + 2 abashet abash + 3 abandonio abandon + 4 abasemenu abase +} { + do_execsql_test 2.$tn { + WITH finder(str) AS ( + SELECT (SELECT max(k) FROM t1 WHERE k<=$INPUT) + UNION ALL + SELECT ( + SELECT max(k) FROM t1 + WHERE k<=substr($INPUT, 1, prefix_length(finder.str, $INPUT)) + ) FROM finder WHERE length(finder.str)>0 + ) + SELECT str FROM finder WHERE length(str)==prefix_length(str, $INPUT) LIMIT 1 + } $expected +} + +finish_test diff --git a/sqlite/test/releasetest.tcl b/sqlite/test/releasetest.tcl index 55c5a602..c520a535 100755 --- a/sqlite/test/releasetest.tcl +++ b/sqlite/test/releasetest.tcl @@ -50,6 +50,7 @@ array set ::Configs [strip_comments { -O2 --disable-amalgamation --disable-shared --enable-session + -DSQLITE_ENABLE_DESERIALIZE } "Sanitize" { CC=clang -fsanitize=undefined diff --git a/sqlite/test/resetdb.test b/sqlite/test/resetdb.test index de2dfcff..bdb83541 100644 --- a/sqlite/test/resetdb.test +++ b/sqlite/test/resetdb.test @@ -70,12 +70,12 @@ do_test 200 { UPDATE sqlite_dbpage SET data=randomblob(4096) WHERE pgno=1; PRAGMA quick_check; } -} {1 {unsupported file format}} +} {1 {file is not a database}} do_test 201 { catchsql { PRAGMA quick_check; } db2 -} {1 {unsupported file format}} +} {1 {file is not a database}} do_test 210 { # Reset the database file using SQLITE_DBCONFIG_RESET_DATABASE @@ -83,6 +83,10 @@ do_test 210 { db eval VACUUM sqlite3_db_config db RESET_DB 0 + # If using sqlite3_prepare() instead of _v2() or _v3(), the block + # below raises an SQLITE_SCHEMA error. The following fixes this. + if {[permutation]=="prepare"} { catchsql "SELECT * FROM sqlite_master" db2 } + # Verify that the reset took, even on the separate database connection catchsql { PRAGMA page_count; diff --git a/sqlite/test/rowvalue4.test b/sqlite/test/rowvalue4.test index 5c0d170f..2929a97d 100644 --- a/sqlite/test/rowvalue4.test +++ b/sqlite/test/rowvalue4.test @@ -235,9 +235,9 @@ do_eqp_test 5.1 { } { QUERY PLAN |--SEARCH TABLE d2 USING INDEX d2ab (a=? AND b=?) - |--LIST SUBQUERY + |--LIST SUBQUERY xxxxxx | `--SCAN TABLE d1 - `--LIST SUBQUERY + `--LIST SUBQUERY xxxxxx `--SCAN TABLE d1 } diff --git a/sqlite/test/select1.test b/sqlite/test/select1.test index 7023a6e6..468f118c 100644 --- a/sqlite/test/select1.test +++ b/sqlite/test/select1.test @@ -1080,5 +1080,24 @@ do_test select1-16.1 { do_catchsql_test select1-16.2 { SELECT 1 FROM sqlite_master LIMIT 1,#1; } {1 {near "#1": syntax error}} - + +# 2019-01-16 Chromium bug 922312 +# Sorting with a LIMIT clause using SRT_EphemTab and SRT_Table +# +do_execsql_test select1-17.1 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(x); INSERT INTO t1 VALUES(1); + CREATE TABLE t2(y,z); INSERT INTO t2 VALUES(2,3); + CREATE INDEX t2y ON t2(y); + SELECT * FROM t1,(SELECT * FROM t2 WHERE y=2 ORDER BY y,z); +} {1 2 3} +do_execsql_test select1-17.2 { + SELECT * FROM t1,(SELECT * FROM t2 WHERE y=2 ORDER BY y,z LIMIT 4); +} {1 2 3} +do_execsql_test select1-17.3 { + SELECT * FROM t1,(SELECT * FROM t2 WHERE y=2 + UNION ALL SELECT * FROM t2 WHERE y=3 ORDER BY y,z LIMIT 4); +} {1 2 3} + finish_test diff --git a/sqlite/test/shell1.test b/sqlite/test/shell1.test index aaf7addf..f105bac5 100644 --- a/sqlite/test/shell1.test +++ b/sqlite/test/shell1.test @@ -256,7 +256,7 @@ do_test shell1-3.1.3 { do_test shell1-3.1.4 { # too many arguments catchcmd "test.db" ".backup FOO BAR BAD" -} {1 {Usage: .backup ?DB? ?--append? FILENAME}} +} {1 {Usage: .backup ?DB? ?OPTIONS? FILENAME}} # .bail ON|OFF Stop after hitting an error. Default OFF do_test shell1-3.2.1 { diff --git a/sqlite/test/shell4.test b/sqlite/test/shell4.test index 88e5e69a..386e51f6 100644 --- a/sqlite/test/shell4.test +++ b/sqlite/test/shell4.test @@ -106,16 +106,16 @@ SELECT 1; [regexp {Autoindex Inserts} $res] } {1 1 1} +ifcapable trace { do_test shell4-2.1 { - catchcmd ":memory:" "CREATE TABLE t1(x);\n.trace" -} {1 {Usage: .trace FILE|off}} + catchcmd ":memory:" "CREATE TABLE t1(x);\n.trace --unknown" +} {1 {Unknown option "--unknown" on ".trace"}} do_test shell4-2.2 { catchcmd ":memory:" "CREATE TABLE t1(x);\n.trace off\n.trace off\n" } {0 {}} do_test shell4-2.3 { - catchcmd ":memory:" ".trace stdout\n.trace\n.trace off\n.dump\n" -} {/^1 {PRAGMA.*Usage:.*}$/} -ifcapable trace { + catchcmd ":memory:" ".trace stdout\n.dump\n.trace off\n" +} {/^0 {PRAGMA.*}$/} do_test shell4-2.4 { catchcmd ":memory:" ".trace stdout\nCREATE TABLE t1(x);SELECT * FROM t1;" } {0 {CREATE TABLE t1(x); diff --git a/sqlite/test/shmlock.test b/sqlite/test/shmlock.test new file mode 100644 index 00000000..89b29fd7 --- /dev/null +++ b/sqlite/test/shmlock.test @@ -0,0 +1,180 @@ +# 2018 December 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 + +set testprefix shmlock + +ifcapable !wal {finish_test ; return } + +sqlite3 db2 test.db +sqlite3 db3 test.db + +do_execsql_test 1.0 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(1, 2); +} {wal} +do_test 1.1 { execsql { SELECT * FROM t1 } db2 } {1 2} +do_test 1.2 { execsql { SELECT * FROM t1 } db3 } {1 2} + +foreach {tn dbhandle cmd res} { + 1 db {shared lock 7 1} OK + 2 db2 {exclusive lock 7 1} BUSY + 3 db {shared unlock 7 1} OK + 4 db2 {exclusive lock 7 1} OK + 5 db {shared lock 7 1} BUSY + 6 db {exclusive lock 7 1} BUSY + 7 db2 {exclusive unlock 7 1} OK + + 8 db {exclusive lock 0 8} OK + 9 db {exclusive unlock 0 8} OK + 10 db2 {exclusive lock 0 8} OK + 11 db2 {exclusive unlock 0 8} OK + + 12 db {shared lock 0 1} OK + 13 db2 {shared lock 0 1} OK + 14 db3 {shared lock 0 1} OK + 15 db3 {shared unlock 0 1} OK + 16 db3 {exclusive lock 0 1} BUSY + 17 db2 {shared unlock 0 1} OK + 18 db3 {exclusive lock 0 1} BUSY + 19 db {shared unlock 0 1} OK + 20 db3 {exclusive lock 0 1} OK + 21 db3 {exclusive unlock 0 1} OK + + 22 db {shared lock 3 1} OK + 23 db2 {exclusive lock 2 2} BUSY + 24 db {shared lock 2 1} OK + 25 db2 {exclusive lock 0 5} BUSY + 26 db2 {exclusive lock 0 4} BUSY + 27 db2 {exclusive lock 0 3} BUSY + 28 db {shared unlock 3 1} OK + 29 db2 {exclusive lock 2 2} BUSY + 28 db {shared unlock 2 1} OK + 29 db2 {exclusive lock 2 2} OK + 29 db2 {exclusive unlock 2 2} OK +} { + do_test 1.3.$tn [list vfs_shmlock $dbhandle main {*}$cmd] "SQLITE_$res" +} + +db close +db2 close +db3 close + +if {[permutation]=="unix-excl"} { + do_test 2.0 { + for {set i 0} {$i < 256} {incr i} { + sqlite3 db$i test.db + execsql { SELECT * FROM t1 } db$i + } + for {set i 0} {$i < 255} {incr i} { + set rc [vfs_shmlock db$i main shared lock 4 1] + if {$rc != "SQLITE_OK"} { error $rc } + } + + vfs_shmlock db255 main shared lock 4 1 + } {SQLITE_BUSY} + + do_test 2.1 { vfs_shmlock db255 main exclusive lock 4 1 } SQLITE_BUSY + do_test 2.2 { vfs_shmlock db0 main shared unlock 4 1 } SQLITE_OK + do_test 2.3 { vfs_shmlock db255 main shared lock 4 1 } SQLITE_OK + do_test 2.4 { vfs_shmlock db255 main shared unlock 4 1 } SQLITE_OK + do_test 2.5 { vfs_shmlock db255 main exclusive lock 4 1 } SQLITE_BUSY + + do_test 2.6 { + for {set i 1} {$i < 255} {incr i} { + set rc [vfs_shmlock db255 main exclusive lock 4 1] + if {$rc != "SQLITE_BUSY"} { error $rc } + set rc [vfs_shmlock db$i main shared unlock 4 1] + if {$rc != "SQLITE_OK"} { error $rc } + } + + vfs_shmlock db255 main exclusive lock 4 1 + } {SQLITE_OK} + + vfs_shmlock db255 main exclusive unlock 4 1 + + for {set i 0} {$i < 256} {incr i} { + db$i close + } +} + +sqlite3 db0 test.db +sqlite3 db1 test.db +do_test 3.1 { execsql { SELECT * FROM t1 } db0 } {1 2} +do_test 3.2 { execsql { SELECT * FROM t1 } db1 } {1 2} +if {$tcl_platform(platform)=="windows"} { + set isWindows 1 +} else { + set isWindows 0 +} + +set L(0) {n n n n n n n n} +set L(1) {n n n n n n n n} +proc random_lock_test {idx} { + global L + set iSlot [expr int(rand()*8)] + if {[expr int(rand()*2)]} { + # Unlock operation + if {[lindex $L($idx) $iSlot]!="n"} { + vfs_shmlock db$idx main [lindex $L($idx) $iSlot] unlock $iSlot 1 + lset L($idx) $iSlot n + } + } else { + # Lock operation + if {[lindex $L($idx) $iSlot]=="n"} { + set locktype [lindex {e s} [expr int(rand()*2)]] + set n 1 + if {$locktype=="e"} { + for {set l $iSlot} {$l<8 && [lindex $L($idx) $l]=="n"} {incr l} {} + set n [expr int(rand()*($l-$iSlot))+1] + # The LockFile() and UnlockFile() apis on windows require that + # every unlock correspond exactly to a prior lock. Hence, we cannot + # lock arbitrary ranges in this test on windows. + if {$::isWindows} {set n 1} + # puts "iSlot=$iSlot l=$l L=$L($idx)" + # puts "$iSlot $n" + } + set res [vfs_shmlock db$idx main $locktype lock $iSlot $n] + + set bBusy 0 + for {set i $iSlot} {$i<($iSlot+$n)} {incr i} { + set other [lindex $L([expr ($idx+1)%2]) $i] + if {($other!="n" && $locktype=="e")||($other=="e" && $locktype=="s")} { + if {$res != "SQLITE_BUSY"} { error "BUSY not detected" } + set bBusy 1 + break + } + } + + if {$bBusy==0} { + if {$res != "SQLITE_OK"} { error "BUSY false-positive" } + for {set i $iSlot} {$i<($iSlot+$n)} {incr i} { + lset L($idx) $i $locktype + } + } + } + } +} + +set nStep 100000 +for {set i 0} {$i < $nStep} {incr i} { + random_lock_test 0 + random_lock_test 1 +} + +db0 close +db1 close + +finish_test diff --git a/sqlite/test/snapshot_fault.test b/sqlite/test/snapshot_fault.test index c0df4ec8..2adb7936 100644 --- a/sqlite/test/snapshot_fault.test +++ b/sqlite/test/snapshot_fault.test @@ -221,6 +221,31 @@ do_faultsim_test 4.1 -faults shm* -prep { faultsim_test_result {0 {}} {1 SQLITE_IOERR} } +#------------------------------------------------------------------------- +# Test the handling of faults that occur within sqlite3_snapshot_get(). +# +reset_db +do_execsql_test 5.0 { + PRAGMA page_size = 512; + PRAGMA journal_mode = wal; + PRAGMA wal_autocheckpoint = 0; + CREATE TABLE t1(zzz); + INSERT INTO t1 VALUES(randomblob( 5000 )); + PRAGMA user_version = 211; +} {wal 0} +faultsim_save_and_close + +do_faultsim_test 5 -prep { + faultsim_restore_and_reopen + execsql { SELECT count(*) FROM sqlite_master } + execsql BEGIN +} -body { + sqlite3_snapshot_get_blob db main + set {} {} +} -test { + execsql END + faultsim_test_result {0 {}} {1 SQLITE_IOERR} {1 SQLITE_NOMEM} +} finish_test diff --git a/sqlite/test/tabfunc01.test b/sqlite/test/tabfunc01.test index dfe3190b..49f0df88 100644 --- a/sqlite/test/tabfunc01.test +++ b/sqlite/test/tabfunc01.test @@ -125,6 +125,11 @@ do_execsql_test tabfunc01-4.3 { SELECT * FROM aux1.generate_series(1,4) } {1 2 3 4} +# 2018-12-03: Fix bug reported by by private email. +do_execsql_test tabfunc01-4.4 { + SELECT * FROM (generate_series(1,5,2)) AS x LIMIT 10; +} {1 3 5} + # The next series of tests is verifying that virtual table are able # to optimize the IN operator, even on terms that are not marked "omit". # When the generate_series virtual table is compiled for the testfixture, diff --git a/sqlite/test/tester.tcl b/sqlite/test/tester.tcl index 14808d9c..0a165a26 100644 --- a/sqlite/test/tester.tcl +++ b/sqlite/test/tester.tcl @@ -941,6 +941,12 @@ proc do_execsql_test {args} { set result "" } elseif {[llength $args]==3} { foreach {testname sql result} $args {} + + # With some versions of Tcl on windows, if $result is all whitespace but + # contains some CR/LF characters, the [list {*}$result] below returns a + # copy of $result instead of a zero length string. Not clear exactly why + # this is. The following is a workaround. + if {[llength $result]==0} { set result "" } } else { error [string trim { wrong # args: should be "do_execsql_test ?-db DB? testname sql ?result?" @@ -2048,9 +2054,11 @@ proc memdebug_log_sql {filename} { set tbl2 "CREATE TABLE ${database}.frame(frame INTEGER PRIMARY KEY, line);\n" set tbl3 "CREATE TABLE ${database}.file(name PRIMARY KEY, content);\n" + set pid [pid] + foreach f [array names frames] { set addr [format %x $f] - set cmd "addr2line -e [info nameofexec] $addr" + set cmd "eu-addr2line --pid=$pid $addr" set line [eval exec $cmd] append sql "INSERT INTO ${database}.frame VALUES($f, '$line');\n" diff --git a/sqlite/test/triggerC.test b/sqlite/test/triggerC.test index 3e47521f..49d4ecae 100644 --- a/sqlite/test/triggerC.test +++ b/sqlite/test/triggerC.test @@ -1042,4 +1042,20 @@ do_execsql_test 15.2.1 { do_execsql_test 15.2.2 { SELECT * FROM x2; } {1 2 3 4} do_execsql_test 15.2.3 { SELECT * FROM """x2"""; } {3 11 x y} +#------------------------------------------------------------------------- +# At one point queries such as the following were causing segfaults. +# +do_catchsql_test 16.1 { + SELECT raise(ABORT, 'msg') FROM sqlite_master + UNION SELECT 1 + ORDER BY raise(IGNORE); +} {1 {1st ORDER BY term does not match any column in the result set}} + +do_catchsql_test 16.2 { + SELECT count(*) FROM sqlite_master + GROUP BY raise(IGNORE) + HAVING raise(ABORT, 'msg'); +} {1 {RAISE() may only be used within a trigger-program}} + finish_test + diff --git a/sqlite/test/triggerF.test b/sqlite/test/triggerF.test index e0c3b52d..2e3e35e3 100644 --- a/sqlite/test/triggerF.test +++ b/sqlite/test/triggerF.test @@ -20,7 +20,7 @@ ifcapable {!trigger} { foreach {tn sql log} { - 1 { } { } + 1 {} {} 2 { CREATE TRIGGER trd AFTER DELETE ON t1 BEGIN diff --git a/sqlite/test/unionvtab.test b/sqlite/test/unionvtab.test index 5725869b..ac5ecb7a 100644 --- a/sqlite/test/unionvtab.test +++ b/sqlite/test/unionvtab.test @@ -373,7 +373,7 @@ do_execsql_test 4.3.3 { } do_execsql_test 4.3.4 { SELECT * FROM sl WHERE rowid<-9223372036854775808 -} { } +} {} do_execsql_test 4.4.1 { SELECT * FROM sl WHERE rowid<9223372036854775807 @@ -394,7 +394,7 @@ do_execsql_test 4.4.3 { } do_execsql_test 4.4.4 { SELECT * FROM sl WHERE rowid>9223372036854775807 -} { } +} {} #------------------------------------------------------------------------- # More than 8 source tables. diff --git a/sqlite/test/update2.test b/sqlite/test/update2.test index a6c31134..41a7224d 100644 --- a/sqlite/test/update2.test +++ b/sqlite/test/update2.test @@ -216,4 +216,20 @@ do_execsql_test 6.2 { SELECT * FROM d1; } {3 2} +# 2019-01-22 Bug in UPDATE OR REPLACE discovered by the +# Matt Denton's LPM fuzzer +# +do_execsql_test 7.100 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(x,y); + CREATE UNIQUE INDEX t1x1 ON t1(x) WHERE x IS NOT NULL; + INSERT INTO t1(x) VALUES(NULL),(NULL); + CREATE INDEX t1x2 ON t1(y); + SELECT quote(x), quote(y), '|' FROM t1; +} {NULL NULL | NULL NULL |} +do_execsql_test 7.110 { + UPDATE OR REPLACE t1 SET x=1; + SELECT quote(x), quote(y), '|' FROM t1; +} {1 NULL |} + finish_test diff --git a/sqlite/test/vacuum-into.test b/sqlite/test/vacuum-into.test new file mode 100644 index 00000000..761db1f8 --- /dev/null +++ b/sqlite/test/vacuum-into.test @@ -0,0 +1,90 @@ +# 2018-12-07 +# +# 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 implements regression tests for SQLite library. The +# focus of this file is testing the VACUUM INTO statement. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +# If the VACUUM statement is disabled in the current build, skip all +# the tests in this file. +# +ifcapable {!vacuum} { + omit_test vacuum.test {Compiled with SQLITE_OMIT_VACUUM} + finish_test + return +} + +forcedelete out.db +do_execsql_test vacuum-into-100 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b); + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) + INSERT INTO t1(a,b) SELECT x, randomblob(600) FROM c; + CREATE INDEX t1b ON t1(b); + DELETE FROM t1 WHERE a%2; + SELECT count(*), sum(a), sum(length(b)) FROM t1; +} {50 2550 30000} +do_execsql_test vacuum-into-110 { + VACUUM main INTO 'out.db'; +} {} +sqlite3 db2 out.db +do_test vacuum-into-120 { + db2 eval {SELECT count(*), sum(a), sum(length(b)) FROM t1} +} {50 2550 30000} +do_catchsql_test vacuum-into-130 { + VACUUM INTO 'out.db'; +} {1 {output file already exists}} +forcedelete out2.db +do_catchsql_test vacuum-into-140 { + VACUUM INTO 'out2.db'; +} {0 {}} +do_catchsql_test vacuum-into-150 { + VACUUM INTO 'out2.db'; +} {1 {output file already exists}} + +do_catchsql_test vacuum-into-200 { + VACUUM main INTO ':memory:'; +} {0 {}} + +# The INTO argument can be an arbitrary expression. +# +do_execsql_test vacuum-into-300 { + CREATE TABLE t2(name TEXT); + INSERT INTO t2 VALUES(':memory:'); + VACUUM main INTO (SELECT name FROM t2); +} {} +do_catchsql_test vacuum-into-310 { + VACUUM INTO null; +} {1 {non-text filename}} +do_catchsql_test vacuum-into-320 { + VACUUM INTO x; +} {1 {no such column: x}} +do_catchsql_test vacuum-into-330 { + VACUUM INTO t1.nosuchcol; +} {1 {no such column: t1.nosuchcol}} +do_catchsql_test vacuum-into-340 { + VACUUM INTO main.t1.nosuchcol; +} {1 {no such column: main.t1.nosuchcol}} + +forcedelete test.db2 +db func target target +proc target {} { return "test.db2" } +do_test vacuum-into-410 { + execsql { VACUUM INTO target() } + file exists test.db2 +} 1 +do_catchsql_test vacuum-into-420 { + VACUUM INTO target2() +} {1 {no such function: target2}} + + +finish_test diff --git a/sqlite/test/vtabdrop.test b/sqlite/test/vtabdrop.test new file mode 100644 index 00000000..1f9309e4 --- /dev/null +++ b/sqlite/test/vtabdrop.test @@ -0,0 +1,127 @@ +# 2018 December 28 +# +# 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. +# +#*********************************************************************** +# +# The tests in this file test edge cases surrounding DROP TABLE on +# virtual tables. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +ifcapable !vtab { finish_test ; return } +source $testdir/fts3_common.tcl +source $testdir/malloc_common.tcl + +set testprefix vtabdrop + +#------------------------------------------------------------------------- +# Test that if a DROP TABLE is executed against an rtree table, but the +# xDestroy() call fails, the rtree table is not dropped, the sqlite_master +# table is not modified and the internal schema remains intact. +# +ifcapable rtree { + do_execsql_test 1.0 { + CREATE VIRTUAL TABLE rt USING rtree(id, x1, x2); + CREATE TABLE t1(x, y); + INSERT INTO t1 VALUES(1, 2); + } + + do_test 1.1 { + execsql { + BEGIN; + INSERT INTO t1 VALUES(3, 4); + } + db eval { SELECT * FROM t1 } { + catchsql { DROP TABLE rt } + } + execsql COMMIT + } {} + + do_execsql_test 1.2 { + SELECT name FROM sqlite_master ORDER BY 1; + SELECT * FROM t1; + SELECT * FROM rt; + } {rt rt_node rt_parent rt_rowid t1 1 2 3 4} + + db close + sqlite3 db test.db + + do_execsql_test 1.3 { + SELECT name FROM sqlite_master ORDER BY 1; + } {rt rt_node rt_parent rt_rowid t1} +} + +#------------------------------------------------------------------------- +# Same as tests 1.*, except with fts5 instead of rtree. +# +ifcapable fts5 { + reset_db + do_execsql_test 2.0 { + CREATE VIRTUAL TABLE ft USING fts5(x); + CREATE TABLE t1(x, y); + INSERT INTO t1 VALUES(1, 2); + } + + do_test 2.1 { + execsql { + BEGIN; + INSERT INTO t1 VALUES(3, 4); + } + db eval { SELECT * FROM t1 } { + catchsql { DROP TABLE ft } + } + execsql COMMIT + } {} + + do_execsql_test 2.2 { + SELECT name FROM sqlite_master ORDER BY 1; + } {ft ft_config ft_content ft_data ft_docsize ft_idx t1} + + db close + sqlite3 db test.db + + do_execsql_test 2.3 { + SELECT name FROM sqlite_master ORDER BY 1; + } {ft ft_config ft_content ft_data ft_docsize ft_idx t1} +} + +#------------------------------------------------------------------------- +# Same as tests 1.*, except with fts3 instead of rtree. +# +ifcapable fts3 { + reset_db + do_execsql_test 2.0 { + CREATE VIRTUAL TABLE ft USING fts3(x); + CREATE TABLE t1(x, y); + INSERT INTO t1 VALUES(1, 2); + } + + do_test 2.1 { + execsql { + BEGIN; + INSERT INTO t1 VALUES(3, 4); + } + db eval { SELECT * FROM t1 } { + catchsql { DROP TABLE ft } + } + execsql COMMIT + } {} + + do_execsql_test 2.2 { + SELECT name FROM sqlite_master ORDER BY 1; + } {ft ft_content ft_segdir ft_segments sqlite_autoindex_ft_segdir_1 t1} + + db close + sqlite3 db test.db + + do_execsql_test 2.3 { + SELECT name FROM sqlite_master ORDER BY 1; + } {ft ft_content ft_segdir ft_segments sqlite_autoindex_ft_segdir_1 t1} +} + +finish_test diff --git a/sqlite/test/wal.test b/sqlite/test/wal.test index bb164bb7..a003b6ad 100644 --- a/sqlite/test/wal.test +++ b/sqlite/test/wal.test @@ -1297,51 +1297,53 @@ do_test wal-19.4 { # At one point, SQLite was failing to grow the mapping of the wal-index # file in step 3 and the checkpoint was corrupting the database file. # -do_test wal-20.1 { - catch {db close} - forcedelete test.db test.db-wal test.db-journal - sqlite3 db test.db - execsql { - PRAGMA journal_mode = WAL; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(randomblob(900)); - SELECT count(*) FROM t1; - } -} {wal 1} -do_test wal-20.2 { - set ::buddy [launch_testfixture] - testfixture $::buddy { +if {[permutation]!="unix-excl"} { + do_test wal-20.1 { + catch {db close} + forcedelete test.db test.db-wal test.db-journal sqlite3 db test.db - db transaction { db eval { - PRAGMA wal_autocheckpoint = 0; - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 2 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 4 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 8 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 16 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 32 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 64 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 128 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 256 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 512 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 1024 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 2048 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 4096 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 8192 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 16384 */ - } } - } -} {0} -do_test wal-20.3 { - close $::buddy - execsql { PRAGMA wal_checkpoint } - execsql { SELECT count(*) FROM t1 } -} {16384} -do_test wal-20.4 { - db close - sqlite3 db test.db - execsql { SELECT count(*) FROM t1 } -} {16384} -integrity_check wal-20.5 + execsql { + PRAGMA journal_mode = WAL; + CREATE TABLE t1(x); + INSERT INTO t1 VALUES(randomblob(900)); + SELECT count(*) FROM t1; + } + } {wal 1} + do_test wal-20.2 { + set ::buddy [launch_testfixture] + testfixture $::buddy { + sqlite3 db test.db + db transaction { db eval { + PRAGMA wal_autocheckpoint = 0; + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 2 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 4 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 8 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 16 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 32 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 64 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 128 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 256 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 512 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 1024 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 2048 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 4096 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 8192 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 16384 */ + } } + } + } {0} + do_test wal-20.3 { + close $::buddy + execsql { PRAGMA wal_checkpoint } + execsql { SELECT count(*) FROM t1 } + } {16384} + do_test wal-20.4 { + db close + sqlite3 db test.db + execsql { SELECT count(*) FROM t1 } + } {16384} + integrity_check wal-20.5 +} catch { db2 close } catch { db close } diff --git a/sqlite/test/walfault2.test b/sqlite/test/walfault2.test new file mode 100644 index 00000000..a4c352be --- /dev/null +++ b/sqlite/test/walfault2.test @@ -0,0 +1,91 @@ +# 2010 May 03 +# +# 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 implements regression tests for SQLite library. The +# focus of this file is testing the operation of the library in +# "PRAGMA journal_mode=WAL" mode. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/malloc_common.tcl +source $testdir/lock_common.tcl + +ifcapable !wal {finish_test ; return } +set testprefix walfault2 + +#------------------------------------------------------------------------- +# Inject faults while truncating the wal file. +# +do_execsql_test 1.0 { + PRAGMA auto_vacuum = 0; + CREATE TABLE t1(a, b); + PRAGMA journal_mode = wal; + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 30 + ) + INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s; +} {wal} +faultsim_save_and_close + +do_faultsim_test 1 -prep { + catch { db close } + faultsim_restore + sqlite3 db file:test.db?psow=0 -uri 1 + file_control_powersafe_overwrite db 0 + execsql { + PRAGMA wal_checkpoint; + PRAGMA journal_size_limit = 10000; + PRAGMA synchronous = full; + } +} -body { + execsql { INSERT INTO t1 VALUES(1,1) } +} -test { + faultsim_test_result {0 {}} +} + +#------------------------------------------------------------------------- +# Inject faults while rewriting checksums. +# +reset_db +do_execsql_test 2.0 { + PRAGMA auto_vacuum = 0; + CREATE TABLE t1(a, b); + PRAGMA journal_mode = wal; + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 30 + ) + INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s; +} {wal} +faultsim_save_and_close + +do_faultsim_test 2 -prep { + faultsim_restore_and_reopen + execsql { + PRAGMA cache_size = 2; + BEGIN; + UPDATE t1 SET a=randomblob(400); + UPDATE t1 SET b=randomblob(400); + UPDATE t1 SET a=randomblob(400); + UPDATE t1 SET b=randomblob(400); + UPDATE t1 SET a=randomblob(400); + UPDATE t1 SET b=randomblob(400); + UPDATE t1 SET a=randomblob(400); + UPDATE t1 SET b=randomblob(400); + } +} -body { + execsql COMMIT +} -test { + faultsim_test_result {0 {}} +} + + + +finish_test diff --git a/sqlite/test/walvfs.test b/sqlite/test/walvfs.test new file mode 100644 index 00000000..cb8005c1 --- /dev/null +++ b/sqlite/test/walvfs.test @@ -0,0 +1,429 @@ +# 2018 December 23 +# +# 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 implements regression tests for SQLite library. The +# focus of this file is testing the operation of the library in +# "PRAGMA journal_mode=WAL" mode. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/lock_common.tcl +source $testdir/malloc_common.tcl +source $testdir/wal_common.tcl +set testprefix walvfs + +ifcapable !wal {finish_test ; return } + +db close +testvfs tvfs +tvfs script xSync +tvfs filter xSync +set ::sync_count 0 +proc xSync {method file args} { + if {[file tail $file]=="test.db-wal"} { + incr ::sync_count + } +} + + +#------------------------------------------------------------------------- +# Test that if IOCAP_SEQUENTIAL is set, the wal-header is not synced to +# disk immediately after it is written. +# +sqlite3 db test.db -vfs tvfs +do_execsql_test 1.0 { + PRAGMA auto_vacuum = 0; + PRAGMA journal_mode = wal; + PRAGMA synchronous = normal; + CREATE TABLE t1(a, b, c); + INSERT INTO t1 VALUES(1, 2, 3); + INSERT INTO t1 VALUES(4, 5, 6); + INSERT INTO t1 VALUES(7, 8, 9); + PRAGMA wal_checkpoint; +} {wal 0 5 5} + +set ::sync_count 0 +do_test 1.1 { + execsql { INSERT INTO t1 VALUES(10, 11, 12) } + set ::sync_count +} 1 + +db close +tvfs devchar sequential +sqlite3 db test.db -vfs tvfs +do_execsql_test 1.2 { + PRAGMA synchronous = normal; + INSERT INTO t1 VALUES(13, 14, 15); + INSERT INTO t1 VALUES(16, 17, 18); + PRAGMA wal_checkpoint; +} {0 4 4} + +set ::sync_count 0 +do_test 1.3 { + execsql { INSERT INTO t1 VALUES(10, 11, 12) } + set ::sync_count +} 0 + +#------------------------------------------------------------------------- +# Test that "PRAGMA journal_size_limit" works in wal mode. +# +reset_db +do_execsql_test 2.0 { + PRAGMA journal_size_limit = 10000; + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 + ) + INSERT INTO t1 SELECT randomblob(750) FROM s; +} {10000 wal} +do_test 2.1 { + expr [file size test.db-wal]>12000 +} {1} +do_test 2.2 { + execsql { + PRAGMA wal_checkpoint; + INSERT INTO t1 VALUES(randomblob(750)); + } + file size test.db-wal +} {10000} +do_test 2.3 { + execsql { + PRAGMA journal_size_limit = 8000; + PRAGMA wal_checkpoint; + INSERT INTO t1 VALUES(randomblob(750)); + } + file size test.db-wal +} {8000} + +#------------------------------------------------------------------------- +# Test that a checkpoint may be interrupted using sqlite3_interrupt(). +# And that the error code is SQLITE_NOMEM, not SQLITE_INTERRUPT, if +# an OOM error occurs just before the sqlite3_interrupt() call. +# +reset_db +db close +sqlite3 db test.db -vfs tvfs +tvfs filter {} + +do_execsql_test 3.0 { + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 + ) + INSERT INTO t1 SELECT randomblob(750) FROM s; +} {wal} + +tvfs filter xWrite +tvfs script xWrite +set ::cnt 2 +proc xWrite {method file args} { + if {[file tail $file]=="test.db"} { + incr ::cnt -1 + if {$::cnt==0} { + sqlite3_interrupt db + } + } + return SQLITE_OK +} + +do_catchsql_test 3.1 { + PRAGMA wal_checkpoint +} {1 interrupted} + +set ::cnt 2 +proc xWrite {method file args} { + if {[file tail $file]=="test.db"} { + incr ::cnt -1 + if {$::cnt==0} { + sqlite3_memdebug_fail 5 -repeat 0 + catchsql { SELECT 'a big long string!' } + sqlite3_interrupt db + } + } + return SQLITE_OK +} + +do_catchsql_test 3.2 { + PRAGMA wal_checkpoint +} {1 {out of memory}} + +#------------------------------------------------------------------------- +# +reset_db +db close +do_test 4.0 { + sqlite3 db test.db -vfs tvfs + execsql { + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 + ) + INSERT INTO t1 SELECT randomblob(750) FROM s; + } db +} {wal} +db close + +tvfs filter xShmMap +tvfs script xShmMap +proc xShmMap {method file args} { + return SQLITE_READONLY +} +sqlite3 db test.db -vfs tvfs +do_catchsql_test 4.1 { + SELECT count(*) FROM t1 +} {1 {attempt to write a readonly database}} + +set ::cnt 5 +tvfs filter {xShmMap xShmLock} +proc xShmMap {method file name args} { + switch -- $method { + xShmMap { return SQLITE_READONLY } + xShmLock { + if {$args == "{0 1 lock shared}"} { + incr ::cnt -1 + if {$::cnt>0} { return SQLITE_BUSY } + } + } + } + return SQLITE_OK +} +do_catchsql_test 4.2 { + SELECT count(*) FROM t1 +} {1 {attempt to write a readonly database}} + +#------------------------------------------------------------------------- +# +reset_db +db close +sqlite3 db test.db -vfs tvfs +tvfs filter {} +do_execsql_test 5.0 { + PRAGMA auto_vacuum = 0; + PRAGMA page_size = 1024; + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 + ) + INSERT INTO t1 SELECT randomblob(750) FROM s; +} {wal} + +do_execsql_test 5.1 { + SELECT count(*) FROM t1 +} {20} + +do_test 5.2 { + vfs_set_readmark db main 1 100 + vfs_set_readmark db main 2 100 + vfs_set_readmark db main 3 100 + vfs_set_readmark db main 4 100 +} {100} + +do_execsql_test 5.3 { + SELECT count(*) FROM t1 +} {20} + +do_test 5.3 { + list [vfs_set_readmark db main 1] \ + [vfs_set_readmark db main 2] \ + [vfs_set_readmark db main 3] \ + [vfs_set_readmark db main 4] +} {24 100 100 100} + +tvfs script xShmLock +tvfs filter xShmLock +set ::cnt 20 +proc xShmLock {args} { + incr ::cnt -1 + if {$::cnt>0} { return SQLITE_BUSY } + return SQLITE_OK +} + +do_test 5.4 { + vfs_set_readmark db main 1 100 + execsql { SELECT count(*) FROM t1 } +} {20} + +vfs_set_readmark db main 1 100 +vfs_set_readmark db main 2 100 +vfs_set_readmark db main 3 100 +vfs_set_readmark db main 4 100 + +tvfs script xShmMapLock +tvfs filter {xShmLock xShmMap} +proc xShmMapLock {method args} { + if {$method=="xShmMap"} { + return "SQLITE_READONLY" + } + return SQLITE_BUSY +} + +sqlite3 db2 test.db -vfs tvfs +breakpoint +do_test 5.5 { + list [catch { execsql { SELECT count(*) FROM t1 } db2 } msg] $msg +} {1 {attempt to write a readonly database}} + +tvfs filter {} +vfs_set_readmark db main 1 1 + +do_test 5.6 { + list [catch { execsql { SELECT count(*) FROM t1 } db2 } msg] $msg +} {0 20} +db2 close +db close + +#------------------------------------------------------------------------- +# Cause an SQLITE_PROTOCOL while attempting to restart the wal file. +# +reset_db +tvfs filter {} +db close +sqlite3 db test.db -vfs tvfs +do_execsql_test 6.0 { + PRAGMA auto_vacuum = 0; + PRAGMA page_size = 1024; + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 + ) + INSERT INTO t1 SELECT randomblob(750) FROM s; +} {wal} + +do_test 6.1 { + execsql { PRAGMA wal_checkpoint } + set {} {} +} {} + +tvfs filter xShmLock +tvfs script xShmLock +set ::flag 0 +proc xShmLock {method file handle spec} { + if {$::flag && [lrange $spec 2 end]=="lock shared"} { + return SQLITE_BUSY + } + if {$spec=="3 1 unlock shared"} { + set ::flag 1 + } + return SQLITE_OK +} + +puts "# WARNING: This next test takes around 12 seconds" +do_catchsql_test 6.2 { + INSERT INTO t1 VALUES(1); +} {1 {locking protocol}} + +#------------------------------------------------------------------------- +# Check that a checkpoint fails if it cannot get the CHECKPOINTER lock +# +reset_db +tvfs filter {} +db close +sqlite3 db test.db -vfs tvfs +do_execsql_test 7.0 { + PRAGMA auto_vacuum = 0; + PRAGMA page_size = 1024; + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 + ) + INSERT INTO t1 SELECT randomblob(750) FROM s; +} {wal} + +tvfs script xShmLock +tvfs filter xShmLock +proc xShmLock {method file handle spec} { + if {$spec=="1 1 lock exclusive"} { + return SQLITE_BUSY + } + return SQLITE_OK +} + +do_execsql_test 7.1 { + PRAGMA wal_checkpoint +} {1 -1 -1} + +#------------------------------------------------------------------------- +# Check that the page cache is correctly flushed if a checkpointer using +# a version 2 VFS makes a checkpoint with an out-of-date cache. +# +reset_db +testvfs tvfs2 -iversion 2 +db close +sqlite3 db test.db -vfs tvfs2 +do_execsql_test 8.0 { + PRAGMA auto_vacuum = 0; + PRAGMA page_size = 1024; + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 ) + INSERT INTO t1 SELECT randomblob(75) FROM s; +} {wal} + +do_execsql_test 8.1 { SELECT count(*) FROM t1 } {20} + +do_test 8.2 { + sqlite3 db2 test.db -vfs tvfs2 + execsql { + INSERT INTO t1 VALUES(randomblob(75)); + } db2 + db2 close +} {} + +do_execsql_test 8.3 { + PRAGMA wal_checkpoint; + SELECT count(*) FROM t1 +} {0 5 5 21} +tvfs2 delete + +#------------------------------------------------------------------------- +reset_db +db close +sqlite3 db test.db -vfs tvfs +do_execsql_test 9.0 { + PRAGMA auto_vacuum = 0; + PRAGMA page_size = 1024; + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 ) + INSERT INTO t1 SELECT randomblob(75) FROM s; +} {wal} + +sqlite3 db2 test.db -vfs tvfs +tvfs filter {xShmMap xShmLock} +tvfs script xShmMap +proc xShmMap {method file handle args} { + switch -- $method { + xShmMap { + return "SQLITE_READONLY_CANTINIT" + } + xShmLock { + if {$args=="{3 1 lock shared}"} { + return "SQLITE_IOERR" + } + } + } +} + +do_test 9.1 { + catchsql { SELECT count(*) FROM t1 } db2 +} {1 {disk I/O error}} + +db close +db2 close +tvfs delete +finish_test + diff --git a/sqlite/test/where.test b/sqlite/test/where.test index 1f38065c..e1b81aa0 100644 --- a/sqlite/test/where.test +++ b/sqlite/test/where.test @@ -1425,5 +1425,17 @@ do_execsql_test where-22.1 { SELECT count(*) FROM t1 LEFT JOIN t2 ON a IS NOT NULL; } {5} +# 20190-02-22: A bug introduced by checkin +# https://www.sqlite.org/src/info/fa792714ae62fa98. +# +do_execsql_test where-23.0 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(a INTEGER PRIMARY KEY); + INSERT INTO t1(a) VALUES(1),(2),(3); + CREATE TABLE t2(x INTEGER PRIMARY KEY, y INT); + INSERT INTO t2(y) VALUES(2),(3); + SELECT * FROM t1, t2 WHERE a=y AND y=3; +} {3 2 3} finish_test diff --git a/sqlite/test/where7.test b/sqlite/test/where7.test index 5abd0a8b..81111a9d 100644 --- a/sqlite/test/where7.test +++ b/sqlite/test/where7.test @@ -23353,8 +23353,10 @@ do_eqp_test where7-3.2 { } { QUERY PLAN |--MULTI-INDEX OR - | |--SEARCH TABLE t301 USING COVERING INDEX t301_c4 (c4=?) - | `--SEARCH TABLE t301 USING INTEGER PRIMARY KEY (rowid=?) + | |--INDEX 1 + | | `--SEARCH TABLE t301 USING COVERING INDEX t301_c4 (c4=?) + | `--INDEX 2 + | `--SEARCH TABLE t301 USING INTEGER PRIMARY KEY (rowid=?) |--SEARCH TABLE t302 USING INDEX t302_c8_c3 (c8=? AND c3>?) `--USE TEMP B-TREE FOR ORDER BY } diff --git a/sqlite/test/where9.test b/sqlite/test/where9.test index 87f5c156..7a019d31 100644 --- a/sqlite/test/where9.test +++ b/sqlite/test/where9.test @@ -364,8 +364,10 @@ ifcapable explain { QUERY PLAN |--SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?) `--MULTI-INDEX OR - |--SEARCH TABLE t2 USING INDEX t2d (d=?) - `--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?) + |--INDEX 1 + | `--SEARCH TABLE t2 USING INDEX t2d (d=?) + `--INDEX 3 + `--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?) }] do_eqp_test where9-3.2 { SELECT coalesce(t2.a,9999) @@ -375,8 +377,10 @@ ifcapable explain { QUERY PLAN |--SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?) `--MULTI-INDEX OR - |--SEARCH TABLE t2 USING INDEX t2d (d=?) - `--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?) + |--INDEX 1 + | `--SEARCH TABLE t2 USING INDEX t2d (d=?) + `--INDEX 2 + `--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?) }] } @@ -456,8 +460,10 @@ do_eqp_test where9-5.1 { } { QUERY PLAN `--MULTI-INDEX OR - |--SEARCH TABLE t1 USING INDEX t1c (c=?) - `--SEARCH TABLE t1 USING INDEX t1d (d=?) + |--INDEX 1 + | `--SEARCH TABLE t1 USING INDEX t1c (c=?) + `--INDEX 2 + `--SEARCH TABLE t1 USING INDEX t1d (d=?) } # In contrast, b=1000 is preferred over any OR-clause. diff --git a/sqlite/test/whereI.test b/sqlite/test/whereI.test index d08e62c3..7bb4ba39 100644 --- a/sqlite/test/whereI.test +++ b/sqlite/test/whereI.test @@ -31,8 +31,10 @@ do_eqp_test 1.1 { } { QUERY PLAN `--MULTI-INDEX OR - |--SEARCH TABLE t1 USING INDEX i1 (b=?) - `--SEARCH TABLE t1 USING INDEX i2 (c=?) + |--INDEX 1 + | `--SEARCH TABLE t1 USING INDEX i1 (b=?) + `--INDEX 2 + `--SEARCH TABLE t1 USING INDEX i2 (c=?) } do_execsql_test 1.2 { @@ -61,8 +63,10 @@ do_eqp_test 2.1 { } { QUERY PLAN `--MULTI-INDEX OR - |--SEARCH TABLE t2 USING INDEX i3 (b=?) - `--SEARCH TABLE t2 USING INDEX i4 (c=?) + |--INDEX 1 + | `--SEARCH TABLE t2 USING INDEX i3 (b=?) + `--INDEX 2 + `--SEARCH TABLE t2 USING INDEX i4 (c=?) } do_execsql_test 2.2 { diff --git a/sqlite/test/window1.test b/sqlite/test/window1.test index a8399a86..b3073985 100644 --- a/sqlite/test/window1.test +++ b/sqlite/test/window1.test @@ -591,7 +591,134 @@ do_execsql_test 13.5 { SELECT a, rank() OVER(ORDER BY b) FROM t1 INTERSECT SELECT a, rank() OVER(ORDER BY b DESC) FROM t1; +} {} + +# 2018-12-06 +# https://www.sqlite.org/src/info/f09fcd17810f65f7 +# Assertion fault when window functions are used. +# +# Root cause is the query flattener invoking sqlite3ExprDup() on +# expressions that contain subqueries with window functions. The +# sqlite3ExprDup() routine is not making correctly initializing +# Select.pWin field of the subqueries. +# +sqlite3 db :memory: +do_execsql_test 14.0 { + SELECT * FROM( + SELECT * FROM (SELECT 1 AS c) WHERE c IN ( + SELECT (row_number() OVER()) FROM (VALUES (0)) + ) + ); +} {1} +do_execsql_test 14.1 { + CREATE TABLE t1(x); INSERT INTO t1(x) VALUES(12345); + CREATE TABLE t2(c); INSERT INTO t2(c) VALUES(1); + SELECT y, y+1, y+2 FROM ( + SELECT c IN ( + SELECT (row_number() OVER()) FROM t1 + ) AS y FROM t2 + ); +} {1 2 3} + +# 2018-12-31 +# https://www.sqlite.org/src/info/d0866b26f83e9c55 +# Window function in correlated subquery causes assertion fault +# +do_catchsql_test 15.0 { + WITH t(id, parent) AS ( + SELECT CAST(1 AS INT), CAST(NULL AS INT) + UNION ALL + SELECT 2, NULL + UNION ALL + SELECT 3, 1 + UNION ALL + SELECT 4, 1 + UNION ALL + SELECT 5, 2 + UNION ALL + SELECT 6, 2 + ), q AS ( + SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.id) AS rn + FROM t + WHERE parent IS NULL + UNION ALL + SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.id) AS rn + FROM q + JOIN t + ON t.parent = q.id + ) + SELECT * + FROM q; +} {1 {cannot use window functions in recursive queries}} +do_execsql_test 15.1 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(x); + INSERT INTO t1 VALUES('a'), ('b'), ('c'); + CREATE TABLE t2(a, b); + INSERT INTO t2 VALUES('X', 1), ('X', 2), ('Y', 2), ('Y', 3); + SELECT x, ( + SELECT sum(b) + OVER (PARTITION BY a ROWS BETWEEN UNBOUNDED PRECEDING + AND UNBOUNDED FOLLOWING) + FROM t2 WHERE b +#include +#include +#include + +/* Return true if the line is all zeros */ +static int allZero(unsigned char *aLine){ + int i; + for(i=0; i<16 && aLine[i]==0; i++){} + return i==16; +} + +int main(int argc, char **argv){ + int pgsz = 0; /* page size */ + long szFile; /* Size of the input file in bytes */ + FILE *in; /* Input file */ + int i, j; /* Loop counters */ + int nErr = 0; /* Number of errors */ + const char *zInputFile = 0; /* Name of the input file */ + const char *zBaseName = 0; /* Base name of the file */ + int lastPage = 0; /* Last page number shown */ + int iPage; /* Current page number */ + unsigned char aLine[16]; /* A single line of the file */ + unsigned char aHdr[100]; /* File header */ + unsigned char bShow[256]; /* Characters ok to display */ + memset(bShow, '.', sizeof(bShow)); + for(i=' '; i<='~'; i++){ + if( i!='{' && i!='}' && i!='"' && i!='\\' ) bShow[i] = i; + } + for(i=1; i65536 || (pgsz&(pgsz-1))!=0 ){ + fprintf(stderr, "Page size must be a power of two between" + " 512 and 65536.\n"); + nErr++; + } + continue; + } + fprintf(stderr, "Unknown option: %s\n", argv[i]); + nErr++; + }else if( zInputFile ){ + fprintf(stderr, "Already using a different input file: [%s]\n", argv[i]); + nErr++; + }else{ + zInputFile = argv[i]; + } + } + if( zInputFile==0 ){ + fprintf(stderr, "No input file specified.\n"); + nErr++; + } + if( nErr ){ + fprintf(stderr, "Usage: %s [--pagesize N] FILENAME\n", argv[0]); + exit(1); + } + in = fopen(zInputFile, "rb"); + if( in==0 ){ + fprintf(stderr, "Cannot open input file [%s]\n", zInputFile); + exit(1); + } + fseek(in, 0, SEEK_END); + szFile = ftell(in); + rewind(in); + if( szFile<100 ){ + fprintf(stderr, "File too short. Minimum size is 100 bytes.\n"); + exit(1); + } + if( fread(aHdr, 100, 1, in)!=1 ){ + fprintf(stderr, "Cannot read file header\n"); + exit(1); + } + rewind(in); + if( pgsz==0 ){ + pgsz = (aHdr[16]<<8) | aHdr[17]; + if( pgsz==1 ) pgsz = 65536; + if( pgsz<512 || (pgsz&(pgsz-1))!=0 ){ + fprintf(stderr, "Invalid page size in header: %d\n", pgsz); + exit(1); + } + } + zBaseName = zInputFile; + for(i=0; zInputFile[i]; i++){ + if( zInputFile[i]=='/' && zInputFile[i+1]!=0 ) zBaseName = zInputFile+i+1; + } + printf("| size %d pagesize %d filename %s\n",(int)szFile,pgsz,zBaseName); + for(i=0; iThe dbtotxt Tool

    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­l5~g%`-VRh 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 KyGxvc>3;wPO0R*m)H5SiBMq(A%r2TnzAxv@ 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