From 5394d771310a62e9449fa84e681cdba92f5c7978 Mon Sep 17 00:00:00 2001 From: swiftlyfalling Date: Tue, 3 Jan 2017 23:02:38 -0500 Subject: [PATCH] Update SQLite to 3.16.1 --- README.md | 8 +- sqlite/Makefile.in | 26 +- sqlite/Makefile.msc | 15 +- sqlite/VERSION | 2 +- sqlite/configure | 20 +- sqlite/configure.ac | 2 +- sqlite/ext/fts5/fts5_expr.c | 72 ++- sqlite/ext/fts5/test/fts5faultB.test | 28 + sqlite/ext/fts5/test/fts5prefix.test | 2 +- sqlite/ext/fts5/test/fts5simple2.test | 35 ++ sqlite/ext/misc/csv.c | 2 +- sqlite/ext/misc/json1.c | 11 +- sqlite/ext/misc/remember.c | 68 +++ sqlite/ext/rtree/rtreeD.test | 2 +- sqlite/ext/session/sqlite3session.c | 16 +- sqlite/main.mk | 28 +- sqlite/manifest | 282 ++++----- sqlite/manifest.uuid | 2 +- sqlite/src/alter.c | 10 +- sqlite/src/analyze.c | 4 +- sqlite/src/bitvec.c | 4 +- sqlite/src/btree.c | 257 ++++---- sqlite/src/btree.h | 7 +- sqlite/src/btreeInt.h | 32 +- sqlite/src/build.c | 70 ++- sqlite/src/ctime.c | 12 +- sqlite/src/date.c | 226 ++++--- sqlite/src/delete.c | 22 +- sqlite/src/expr.c | 193 ++++-- sqlite/src/fault.c | 4 +- sqlite/src/fkey.c | 30 +- sqlite/src/func.c | 104 ++-- sqlite/src/global.c | 6 +- sqlite/src/insert.c | 81 ++- sqlite/src/main.c | 85 ++- sqlite/src/malloc.c | 7 +- sqlite/src/os_unix.c | 16 +- sqlite/src/pager.c | 329 +++++++---- sqlite/src/pager.h | 7 +- sqlite/src/parse.y | 51 +- sqlite/src/pcache.c | 12 +- sqlite/src/pragma.c | 471 ++++++++++++--- sqlite/src/pragma.h | 752 +++++++++++++---------- sqlite/src/printf.c | 24 +- sqlite/src/random.c | 4 +- sqlite/src/select.c | 189 +++--- sqlite/src/shell.c | 595 +++++++++++++++---- sqlite/src/sqlite.h.in | 89 ++- sqlite/src/sqliteInt.h | 50 +- sqlite/src/tclsqlite.c | 3 +- sqlite/src/test1.c | 146 +++++ sqlite/src/test2.c | 2 +- sqlite/src/test_blob.c | 2 +- sqlite/src/test_config.c | 8 +- sqlite/src/test_delete.c | 4 +- sqlite/src/test_func.c | 2 +- sqlite/src/test_multiplex.c | 122 ---- sqlite/src/tokenize.c | 12 +- sqlite/src/treeview.c | 1 + sqlite/src/trigger.c | 4 +- sqlite/src/update.c | 19 +- sqlite/src/util.c | 105 +++- sqlite/src/vdbe.c | 200 ++++--- sqlite/src/vdbe.h | 32 +- sqlite/src/vdbeInt.h | 82 +-- sqlite/src/vdbeapi.c | 26 +- sqlite/src/vdbeaux.c | 94 +-- sqlite/src/vdbeblob.c | 5 +- sqlite/src/vdbemem.c | 16 +- sqlite/src/vdbesort.c | 14 +- sqlite/src/vtab.c | 61 +- sqlite/src/wal.c | 107 +++- sqlite/src/wal.h | 8 +- sqlite/src/where.c | 65 +- sqlite/src/wherecode.c | 9 +- sqlite/src/whereexpr.c | 16 +- sqlite/test/alter.test | 6 +- sqlite/test/alter4.test | 20 + sqlite/test/analyzeF.test | 26 + sqlite/test/attach.test | 2 +- sqlite/test/attach3.test | 4 +- sqlite/test/auth.test | 40 +- sqlite/test/auth3.test | 2 +- sqlite/test/autoinc.test | 2 +- sqlite/test/bestindex3.test | 1 - sqlite/test/bestindex4.test | 120 ++++ sqlite/test/corruptC.test | 11 +- sqlite/test/ctime.test | 12 + sqlite/test/date.test | 39 +- sqlite/test/dbfuzz.c | 754 ++++++++++++++++++++++++ sqlite/test/e_dropview.test | 2 +- sqlite/test/e_expr.test | 28 +- sqlite/test/e_select.test | 4 +- sqlite/test/filectrl.test | 4 +- sqlite/test/fkey1.test | 22 + sqlite/test/fkey2.test | 4 +- sqlite/test/fuzzcheck.c | 125 +++- sqlite/test/fuzzdata5.db | Bin 0 -> 6964224 bytes sqlite/test/gcfault.test | 56 ++ sqlite/test/hexlit.test | 3 + sqlite/test/hook.test | 6 + sqlite/test/incrblob4.test | 20 + sqlite/test/instr.test | 9 + sqlite/test/instrfault.test | 24 + sqlite/test/intarray.test | 2 +- sqlite/test/interrupt.test | 4 +- sqlite/test/interrupt2.test | 159 +++++ sqlite/test/join5.test | 30 +- sqlite/test/kvtest.c | 583 ++++++++++++++++++ sqlite/test/like.test | 20 +- sqlite/test/multiplex.test | 21 +- sqlite/test/nockpt.test | 66 +++ sqlite/test/ossfuzz.c | 86 +++ sqlite/test/ossshell.c | 61 ++ sqlite/test/regexp2.test | 1 - sqlite/test/rowvalue.test | 64 +- sqlite/test/rowvalue9.test | 1 - sqlite/test/rowvaluefault.test | 1 - sqlite/test/schema4.test | 2 +- sqlite/test/shell1.test | 16 +- sqlite/test/shell3.test | 2 +- sqlite/test/shell6.test | 101 ++++ sqlite/test/shell7.test | 54 ++ sqlite/test/snapshot.test | 818 ++++++++++++++------------ sqlite/test/snapshot2.test | 200 +++++++ sqlite/test/snapshot_fault.test | 62 ++ sqlite/test/speedtest1.c | 228 +++++-- sqlite/test/tabfunc01.test | 14 + sqlite/test/tempdb2.test | 1 - sqlite/test/temptrigger.test | 2 +- sqlite/test/tkt-80e031a00f.test | 4 - sqlite/test/tkt3630.test | 4 +- sqlite/test/tkt3810.test | 2 +- sqlite/test/uri.test | 8 + sqlite/test/uri2.test | 63 ++ sqlite/test/wal6.test | 31 + sqlite/test/with3.test | 56 ++ sqlite/test/without_rowid3.test | 4 +- sqlite/tool/cg_anno.tcl | 57 +- sqlite/tool/fuzzershell.c | 86 ++- sqlite/tool/lemon.c | 1 - sqlite/tool/lempar.c | 3 +- sqlite/tool/mkpragmatab.tcl | 152 ++++- sqlite/tool/showstat4.c | 6 +- sqlite/tool/speed-check.sh | 9 + 145 files changed, 7475 insertions(+), 2485 deletions(-) create mode 100644 sqlite/ext/misc/remember.c create mode 100644 sqlite/test/bestindex4.test create mode 100644 sqlite/test/dbfuzz.c create mode 100644 sqlite/test/fuzzdata5.db create mode 100644 sqlite/test/gcfault.test create mode 100644 sqlite/test/interrupt2.test create mode 100644 sqlite/test/kvtest.c create mode 100644 sqlite/test/nockpt.test create mode 100644 sqlite/test/ossfuzz.c create mode 100644 sqlite/test/ossshell.c create mode 100644 sqlite/test/shell6.test create mode 100644 sqlite/test/shell7.test create mode 100644 sqlite/test/snapshot2.test create mode 100644 sqlite/test/uri2.test diff --git a/README.md b/README.md index 01b789eb..55b8b946 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 3, 2016: Update SQLite to 3.15.2** ([changelog](CHANGELOG.md)). +**January 3, 2017: Update SQLite to 3.16.1** ([changelog](CHANGELOG.md)). **Requirements**: iOS 8.0+ / OSX 10.9+, Xcode 7.3+ -**SQLite Included:** **[3.15.2](https://www.sqlite.org/releaselog/3_15_2.html)** +**SQLite Included:** **[3.16.1](https://www.sqlite.org/releaselog/3_16_1.html)** @@ -65,7 +65,7 @@ There is no need to modify any other files. #### Compiling a Specific Version of SQLite: -SQLiteLib currently ships with the source for SQLite 3.15.2. +SQLiteLib currently ships with the source for SQLite 3.16.1. If you'd like to compile a newer (or older) version, the process is simple: @@ -127,7 +127,7 @@ The built-in OSX/iOS version of SQLite were built with the following compilation SQLiteLib uses these settings with one exception - on iOS: -The SQLite code (verified in: 3.15.2) uses a deprecated function (`gethostuuid()`). +The SQLite code uses a deprecated function (`gethostuuid()`). D. Richard Hipp (SQLite architect), suggests working around this on iOS using `-DSQLITE_ENABLE_LOCKING_STYLE=0`: > "The SQLITE_ENABLE_LOCKING_STYLE thing is an apple-only extension that diff --git a/sqlite/Makefile.in b/sqlite/Makefile.in index bb1f14b6..b961070c 100644 --- a/sqlite/Makefile.in +++ b/sqlite/Makefile.in @@ -430,6 +430,7 @@ TESTSRC += \ $(TOP)/ext/misc/nextchar.c \ $(TOP)/ext/misc/percentile.c \ $(TOP)/ext/misc/regexp.c \ + $(TOP)/ext/misc/remember.c \ $(TOP)/ext/misc/series.c \ $(TOP)/ext/misc/spellfix.c \ $(TOP)/ext/misc/totype.c \ @@ -550,7 +551,8 @@ FUZZDATA = \ $(TOP)/test/fuzzdata1.db \ $(TOP)/test/fuzzdata2.db \ $(TOP)/test/fuzzdata3.db \ - $(TOP)/test/fuzzdata4.db + $(TOP)/test/fuzzdata4.db \ + $(TOP)/test/fuzzdata5.db # Standard options to testfixture # @@ -563,7 +565,9 @@ SHELL_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS4 SHELL_OPT += -DSQLITE_ENABLE_EXPLAIN_COMMENTS SHELL_OPT += -DSQLITE_ENABLE_UNKNOWN_SQL_FUNCTION FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 -FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 +FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 -DSQLITE_OSS_FUZZ +FUZZCHECK_SRC = $(TOP)/test/fuzzcheck.c $(TOP)/test/ossfuzz.c +DBFUZZ_OPT = # This is the default Makefile target. The objects listed here # are what get build when you type just "make" with no arguments. @@ -612,8 +616,14 @@ fuzzershell$(TEXE): $(TOP)/tool/fuzzershell.c sqlite3.c sqlite3.h $(LTLINK) -o $@ $(FUZZERSHELL_OPT) \ $(TOP)/tool/fuzzershell.c sqlite3.c $(TLIBS) -fuzzcheck$(TEXE): $(TOP)/test/fuzzcheck.c sqlite3.c sqlite3.h - $(LTLINK) -o $@ $(FUZZCHECK_OPT) $(TOP)/test/fuzzcheck.c sqlite3.c $(TLIBS) +fuzzcheck$(TEXE): $(FUZZCHECK_SRC) sqlite3.c sqlite3.h + $(LTLINK) -o $@ $(FUZZCHECK_OPT) $(FUZZCHECK_SRC) sqlite3.c $(TLIBS) + +ossshell$(TEXE): $(TOP)/test/ossfuzz.c $(TOP)/test/ossshell.c sqlite3.c sqlite3.h + $(LTLINK) -o $@ $(FUZZCHECK_OPT) $(TOP)/test/ossshell.c sqlite3.c sqlite3.h $(TLIBS) + +dbfuzz$(TEXE): $(TOP)/test/dbfuzz.c sqlite3.c sqlite3.h + $(LTLINK) -o $@ $(DBFUZZ_OPT) $(TOP)/test/dbfuzz.c sqlite3.c $(TLIBS) mptester$(TEXE): sqlite3.lo $(TOP)/mptest/mptest.c $(LTLINK) -o $@ -I. $(TOP)/mptest/mptest.c sqlite3.lo \ @@ -1103,6 +1113,11 @@ fastfuzztest: fuzzcheck$(TEXE) $(FUZZDATA) valgrindfuzz: fuzzcheck$(TEXT) $(FUZZDATA) valgrind ./fuzzcheck$(TEXE) --cell-size-check --limit-mem 10M --timeout 600 $(FUZZDATA) +# The veryquick.test TCL tests. +# +tcltest: ./testfixture$(TEXE) + ./testfixture$(TEXE) $(TOP)/test/veryquick.test $(TESTOPTS) + # Minimal testing that runs in less than 3 minutes # quicktest: ./testfixture$(TEXE) @@ -1111,8 +1126,7 @@ quicktest: ./testfixture$(TEXE) # This is the common case. Run many tests that do not take too long, # including fuzzcheck, sqlite3_analyzer, and sqldiff tests. # -test: $(TESTPROGS) sourcetest fastfuzztest - ./testfixture$(TEXE) $(TOP)/test/veryquick.test $(TESTOPTS) +test: fastfuzztest sourcetest $(TESTPROGS) tcltest # Run a test using valgrind. This can take a really long time # because valgrind is so much slower than a native machine. diff --git a/sqlite/Makefile.msc b/sqlite/Makefile.msc index 0d42d41a..d4aba301 100644 --- a/sqlite/Makefile.msc +++ b/sqlite/Makefile.msc @@ -1396,6 +1396,7 @@ TESTEXT = \ $(TOP)\ext\misc\nextchar.c \ $(TOP)\ext\misc\percentile.c \ $(TOP)\ext\misc\regexp.c \ + $(TOP)\ext\misc\remember.c \ $(TOP)\ext\misc\series.c \ $(TOP)\ext\misc\spellfix.c \ $(TOP)\ext\misc\totype.c \ @@ -1479,7 +1480,8 @@ FUZZDATA = \ $(TOP)\test\fuzzdata1.db \ $(TOP)\test\fuzzdata2.db \ $(TOP)\test\fuzzdata3.db \ - $(TOP)\test\fuzzdata4.db + $(TOP)\test\fuzzdata4.db \ + $(TOP)\test\fuzzdata5.db # <> # Additional compiler options for the shell. These are only effective @@ -1494,7 +1496,9 @@ SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_SHELL_JSON1 -DSQLITE_ENABLE_ # MPTESTER_COMPILE_OPTS = -DSQLITE_SHELL_JSON1 -DSQLITE_ENABLE_FTS5 FUZZERSHELL_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 -FUZZCHECK_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 +FUZZCHECK_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 -DSQLITE_OSS_FUZZ +FUZZCHECK_SRC = $(TOP)\test\fuzzcheck.c $(TOP)\test\ossfuzz.c +OSSSHELL_SRC = $(TOP)\test\ossshell.c $(TOP)\test\ossfuzz.c # Standard options to testfixture. # @@ -1564,8 +1568,11 @@ sourcetest: srcck1.exe sqlite3.c fuzzershell.exe: $(TOP)\tool\fuzzershell.c $(SQLITE3C) $(SQLITE3H) $(LTLINK) $(NO_WARN) $(FUZZERSHELL_COMPILE_OPTS) $(TOP)\tool\fuzzershell.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) -fuzzcheck.exe: $(TOP)\test\fuzzcheck.c $(SQLITE3C) $(SQLITE3H) - $(LTLINK) $(NO_WARN) $(FUZZCHECK_COMPILE_OPTS) $(TOP)\test\fuzzcheck.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) +fuzzcheck.exe: $(FUZZCHECK_SRC) $(SQLITE3C) $(SQLITE3H) + $(LTLINK) $(NO_WARN) $(FUZZCHECK_COMPILE_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) mptester.exe: $(TOP)\mptest\mptest.c $(SQLITE3C) $(SQLITE3H) $(LTLINK) $(NO_WARN) $(MPTESTER_COMPILE_OPTS) $(TOP)\mptest\mptest.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) diff --git a/sqlite/VERSION b/sqlite/VERSION index 861845e4..ffaa55f5 100644 --- a/sqlite/VERSION +++ b/sqlite/VERSION @@ -1 +1 @@ -3.15.2 +3.16.1 diff --git a/sqlite/configure b/sqlite/configure index e22c4dc8..2523fb12 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.15.2. +# Generated by GNU Autoconf 2.69 for sqlite 3.16.1. # # # 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.15.2' -PACKAGE_STRING='sqlite 3.15.2' +PACKAGE_VERSION='3.16.1' +PACKAGE_STRING='sqlite 3.16.1' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1463,7 +1463,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.15.2 to adapt to many kinds of systems. +\`configure' configures sqlite 3.16.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1528,7 +1528,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sqlite 3.15.2:";; + short | recursive ) echo "Configuration of sqlite 3.16.1:";; esac cat <<\_ACEOF @@ -1652,7 +1652,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sqlite configure 3.15.2 +sqlite configure 3.16.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2071,7 +2071,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.15.2, which was +It was created by sqlite $as_me 3.16.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -11252,7 +11252,7 @@ else fi if test "${use_debug}" = "yes" ; then - TARGET_DEBUG="-DSQLITE_DEBUG=1" + TARGET_DEBUG="-DSQLITE_DEBUG=1 -DSQLITE_ENABLE_SELECTTRACE -DSQLITE_ENABLE_WHERETRACE" else TARGET_DEBUG="-DNDEBUG" fi @@ -12151,7 +12151,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.15.2, which was +This file was extended by sqlite $as_me 3.16.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -12217,7 +12217,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.15.2 +sqlite config.status 3.16.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/sqlite/configure.ac b/sqlite/configure.ac index c9e3af92..095db6bf 100644 --- a/sqlite/configure.ac +++ b/sqlite/configure.ac @@ -560,7 +560,7 @@ AC_SEARCH_LIBS(fdatasync, [rt]) AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug],[enable debugging & verbose explain]), [use_debug=$enableval],[use_debug=no]) if test "${use_debug}" = "yes" ; then - TARGET_DEBUG="-DSQLITE_DEBUG=1" + TARGET_DEBUG="-DSQLITE_DEBUG=1 -DSQLITE_ENABLE_SELECTTRACE -DSQLITE_ENABLE_WHERETRACE" else TARGET_DEBUG="-DNDEBUG" fi diff --git a/sqlite/ext/fts5/fts5_expr.c b/sqlite/ext/fts5/fts5_expr.c index bde9eaed..9dcd88a5 100644 --- a/sqlite/ext/fts5/fts5_expr.c +++ b/sqlite/ext/fts5/fts5_expr.c @@ -746,48 +746,61 @@ static int fts5ExprNearTest( ** Initialize all term iterators in the pNear object. If any term is found ** to match no documents at all, return immediately without initializing any ** further iterators. +** +** If an error occurs, return an SQLite error code. Otherwise, return +** SQLITE_OK. It is not considered an error if some term matches zero +** documents. */ static int fts5ExprNearInitAll( Fts5Expr *pExpr, Fts5ExprNode *pNode ){ Fts5ExprNearset *pNear = pNode->pNear; - int i, j; - int rc = SQLITE_OK; - int bEof = 1; + int i; assert( pNode->bNomatch==0 ); - for(i=0; rc==SQLITE_OK && inPhrase; i++){ + for(i=0; inPhrase; i++){ Fts5ExprPhrase *pPhrase = pNear->apPhrase[i]; - for(j=0; jnTerm; j++){ - Fts5ExprTerm *pTerm = &pPhrase->aTerm[j]; - Fts5ExprTerm *p; - - for(p=pTerm; p && rc==SQLITE_OK; p=p->pSynonym){ - if( p->pIter ){ - sqlite3Fts5IterClose(p->pIter); - p->pIter = 0; + if( pPhrase->nTerm==0 ){ + pNode->bEof = 1; + return SQLITE_OK; + }else{ + int j; + for(j=0; jnTerm; j++){ + Fts5ExprTerm *pTerm = &pPhrase->aTerm[j]; + Fts5ExprTerm *p; + int bHit = 0; + + for(p=pTerm; p; p=p->pSynonym){ + int rc; + if( p->pIter ){ + sqlite3Fts5IterClose(p->pIter); + p->pIter = 0; + } + rc = sqlite3Fts5IndexQuery( + pExpr->pIndex, p->zTerm, (int)strlen(p->zTerm), + (pTerm->bPrefix ? FTS5INDEX_QUERY_PREFIX : 0) | + (pExpr->bDesc ? FTS5INDEX_QUERY_DESC : 0), + pNear->pColset, + &p->pIter + ); + assert( (rc==SQLITE_OK)==(p->pIter!=0) ); + if( rc!=SQLITE_OK ) return rc; + if( 0==sqlite3Fts5IterEof(p->pIter) ){ + bHit = 1; + } } - rc = sqlite3Fts5IndexQuery( - pExpr->pIndex, p->zTerm, (int)strlen(p->zTerm), - (pTerm->bPrefix ? FTS5INDEX_QUERY_PREFIX : 0) | - (pExpr->bDesc ? FTS5INDEX_QUERY_DESC : 0), - pNear->pColset, - &p->pIter - ); - assert( rc==SQLITE_OK || p->pIter==0 ); - if( p->pIter && 0==sqlite3Fts5IterEof(p->pIter) ){ - bEof = 0; + + if( bHit==0 ){ + pNode->bEof = 1; + return SQLITE_OK; } } - - if( bEof ) break; } - if( bEof ) break; } - pNode->bEof = bEof; - return rc; + pNode->bEof = 0; + return SQLITE_OK; } /* @@ -1331,7 +1344,10 @@ int sqlite3Fts5ExprFirst(Fts5Expr *p, Fts5Index *pIdx, i64 iFirst, int bDesc){ /* If not at EOF but the current rowid occurs earlier than iFirst in ** the iteration order, move to document iFirst or later. */ - if( pRoot->bEof==0 && fts5RowidCmp(p, pRoot->iRowid, iFirst)<0 ){ + if( rc==SQLITE_OK + && 0==pRoot->bEof + && fts5RowidCmp(p, pRoot->iRowid, iFirst)<0 + ){ rc = fts5ExprNodeNext(p, pRoot, 1, iFirst); } diff --git a/sqlite/ext/fts5/test/fts5faultB.test b/sqlite/ext/fts5/test/fts5faultB.test index 40df8b60..2ce33f4b 100644 --- a/sqlite/ext/fts5/test/fts5faultB.test +++ b/sqlite/ext/fts5/test/fts5faultB.test @@ -78,6 +78,34 @@ do_faultsim_test 2.4 -faults oom* -body { faultsim_test_result {0 {{3 2} {2 3}}} } +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 3.0 { + CREATE VIRTUAL TABLE x1 USING fts5(z); +} + +do_faultsim_test 3.1 -faults oom* -body { + execsql { + SELECT rowid FROM x1('c') WHERE rowid>1; + } +} -test { + faultsim_test_result {0 {}} +} + +do_execsql_test 3.2 { + INSERT INTO x1 VALUES('a b c'); + INSERT INTO x1 VALUES('b c d'); + INSERT INTO x1 VALUES('c d e'); + INSERT INTO x1 VALUES('d e f'); +} +do_faultsim_test 3.3 -faults oom* -body { + execsql { + SELECT rowid FROM x1('c') WHERE rowid>1; + } +} -test { + faultsim_test_result {0 {2 3}} +} finish_test diff --git a/sqlite/ext/fts5/test/fts5prefix.test b/sqlite/ext/fts5/test/fts5prefix.test index 8e0d5a29..01d0fe5d 100644 --- a/sqlite/ext/fts5/test/fts5prefix.test +++ b/sqlite/ext/fts5/test/fts5prefix.test @@ -9,7 +9,7 @@ # #*********************************************************************** # -# This file containst tests focused on prefix indexes. +# This file contains tests focused on prefix indexes. # source [file join [file dirname [info script]] fts5_common.tcl] diff --git a/sqlite/ext/fts5/test/fts5simple2.test b/sqlite/ext/fts5/test/fts5simple2.test index 186d771f..a6c17894 100644 --- a/sqlite/ext/fts5/test/fts5simple2.test +++ b/sqlite/ext/fts5/test/fts5simple2.test @@ -332,6 +332,41 @@ do_execsql_test 16.0 { DELETE FROM t2; } +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 17.0 { + CREATE VIRTUAL TABLE t2 USING fts5(x, y); + BEGIN; + INSERT INTO t2 VALUES('a aa aaa', 'b bb bbb'); + INSERT INTO t2 VALUES('a aa aaa', 'b bb bbb'); + INSERT INTO t2 VALUES('a aa aaa', 'b bb bbb'); + COMMIT; +} +do_execsql_test 17.1 { SELECT * FROM t2('y:a*') WHERE rowid BETWEEN 10 AND 20 } +do_execsql_test 17.2 { + BEGIN; + INSERT INTO t2 VALUES('a aa aaa', 'b bb bbb'); + SELECT * FROM t2('y:a*') WHERE rowid BETWEEN 10 AND 20 ; +} +do_execsql_test 17.3 { + COMMIT +} + +reset_db +do_execsql_test 17.4 { + CREATE VIRTUAL TABLE t2 USING fts5(x, y); + BEGIN; + INSERT INTO t2 VALUES('a aa aaa', 'b bb bbb'); + INSERT INTO t2 VALUES('a aa aaa', 'b bb bbb'); + SELECT * FROM t2('y:a*') WHERE rowid>66; +} +do_execsql_test 17.5 { SELECT * FROM t2('x:b* OR y:a*') } +do_execsql_test 17.5 { COMMIT ; SELECT * FROM t2('x:b* OR y:a*') } +do_execsql_test 17.6 { + SELECT * FROM t2('x:b* OR y:a*') WHERE rowid>55 +} + #db eval {SELECT rowid, fts5_decode_none(rowid, block) aS r FROM t2_data} {puts $r} finish_test diff --git a/sqlite/ext/misc/csv.c b/sqlite/ext/misc/csv.c index 2a9463bd..f887784a 100644 --- a/sqlite/ext/misc/csv.c +++ b/sqlite/ext/misc/csv.c @@ -402,7 +402,7 @@ static int csv_boolean(const char *z){ if( sqlite3_stricmp("yes",z)==0 || sqlite3_stricmp("on",z)==0 || sqlite3_stricmp("true",z)==0 - || (z[0]=='1' && z[0]==0) + || (z[0]=='1' && z[1]==0) ){ return 1; } diff --git a/sqlite/ext/misc/json1.c b/sqlite/ext/misc/json1.c index 89dd1325..327ad575 100644 --- a/sqlite/ext/misc/json1.c +++ b/sqlite/ext/misc/json1.c @@ -595,12 +595,13 @@ static void jsonReturn( c = z[++i]; if( c=='u' ){ u32 v = 0, k; - for(k=0; k<4 && i='0' && c<='9' ) v = v*16 + c - '0'; - else if( c>='A' && c<='F' ) v = v*16 + c - 'A' + 10; - else if( c>='a' && c<='f' ) v = v*16 + c - 'a' + 10; - else break; + assert( safe_isxdigit(c) ); + if( c<='9' ) v = v*16 + c - '0'; + else if( c<='F' ) v = v*16 + c - 'A' + 10; + else v = v*16 + c - 'a' + 10; } if( v==0 ) break; if( v<=0x7f ){ diff --git a/sqlite/ext/misc/remember.c b/sqlite/ext/misc/remember.c new file mode 100644 index 00000000..aa3eff8a --- /dev/null +++ b/sqlite/ext/misc/remember.c @@ -0,0 +1,68 @@ +/* +** 2016-08-09 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file demonstrates how to create an SQL function that is a pass-through +** for integer values (it returns a copy of its argument) but also saves the +** value that is passed through into a C-language variable. The address of +** the C-language variable is supplied as the second argument. +** +** This allows, for example, a counter to incremented and the original +** value retrieved, atomically, using a single statement: +** +** UPDATE counterTab SET cnt=remember(cnt,$PTR)+1 WHERE id=$ID +** +** Prepare the above statement once. Then to use it, bind the address +** of the output variable to $PTR and the id of the counter to $ID and +** run the prepared statement. +** +** One can imagine doing similar things with floating-point values and +** strings, but this demonstration extension will stick to using just +** integers. +*/ +#include "sqlite3ext.h" +SQLITE_EXTENSION_INIT1 +#include + +/* +** remember(V,PTR) +** +** Return the integer value V. Also save the value of V in a +** C-language variable whose address is PTR. +*/ +static void rememberFunc( + sqlite3_context *pCtx, + int argc, + sqlite3_value **argv +){ + sqlite3_int64 v; + sqlite3_int64 ptr; + assert( argc==2 ); + v = sqlite3_value_int64(argv[0]); + ptr = sqlite3_value_int64(argv[1]); + *((sqlite3_int64*)ptr) = v; + sqlite3_result_int64(pCtx, v); +} + +#ifdef _WIN32 +__declspec(dllexport) +#endif +int sqlite3_remember_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc = SQLITE_OK; + SQLITE_EXTENSION_INIT2(pApi); + rc = sqlite3_create_function(db, "remember", 2, SQLITE_UTF8, 0, + rememberFunc, 0, 0); + return rc; +} diff --git a/sqlite/ext/rtree/rtreeD.test b/sqlite/ext/rtree/rtreeD.test index c4a7d22e..d846fc61 100644 --- a/sqlite/ext/rtree/rtreeD.test +++ b/sqlite/ext/rtree/rtreeD.test @@ -19,7 +19,7 @@ if {![info exists testdir]} { source [file join [file dirname [info script]] rtree_util.tcl] source $testdir/tester.tcl source $testdir/lock_common.tcl -ifcapable !rtree { +ifcapable !rtree||!builtin_test { finish_test return } diff --git a/sqlite/ext/session/sqlite3session.c b/sqlite/ext/session/sqlite3session.c index 70ca840d..50793df0 100644 --- a/sqlite/ext/session/sqlite3session.c +++ b/sqlite/ext/session/sqlite3session.c @@ -374,9 +374,7 @@ static int sessionSerializeValue( if( aBuf ){ sessionVarintPut(&aBuf[1], n); - memcpy(&aBuf[nVarint + 1], eType==SQLITE_TEXT ? - sqlite3_value_text(pValue) : sqlite3_value_blob(pValue), n - ); + if( n ) memcpy(&aBuf[nVarint + 1], z, n); } nByte = 1 + nVarint + n; @@ -1792,7 +1790,7 @@ static void sessionAppendBlob( int nBlob, int *pRc ){ - if( 0==sessionBufferGrow(p, nBlob, pRc) ){ + if( nBlob>0 && 0==sessionBufferGrow(p, nBlob, pRc) ){ memcpy(&p->aBuf[p->nBuf], aBlob, nBlob); p->nBuf += nBlob; } @@ -1978,13 +1976,13 @@ static int sessionAppendUpdate( } default: { - int nByte; - int nHdr = 1 + sessionVarintGet(&pCsr[1], &nByte); + int n; + int nHdr = 1 + sessionVarintGet(&pCsr[1], &n); assert( eType==SQLITE_TEXT || eType==SQLITE_BLOB ); - nAdvance = nHdr + nByte; + nAdvance = nHdr + n; if( eType==sqlite3_column_type(pStmt, i) - && nByte==sqlite3_column_bytes(pStmt, i) - && 0==memcmp(&pCsr[nHdr], sqlite3_column_blob(pStmt, i), nByte) + && n==sqlite3_column_bytes(pStmt, i) + && (n==0 || 0==memcmp(&pCsr[nHdr], sqlite3_column_blob(pStmt, i), n)) ){ break; } diff --git a/sqlite/main.mk b/sqlite/main.mk index a5a50d20..e07b964d 100644 --- a/sqlite/main.mk +++ b/sqlite/main.mk @@ -335,6 +335,7 @@ TESTSRC += \ $(TOP)/ext/misc/nextchar.c \ $(TOP)/ext/misc/percentile.c \ $(TOP)/ext/misc/regexp.c \ + $(TOP)/ext/misc/remember.c \ $(TOP)/ext/misc/series.c \ $(TOP)/ext/misc/spellfix.c \ $(TOP)/ext/misc/totype.c \ @@ -462,7 +463,8 @@ FUZZDATA = \ $(TOP)/test/fuzzdata1.db \ $(TOP)/test/fuzzdata2.db \ $(TOP)/test/fuzzdata3.db \ - $(TOP)/test/fuzzdata4.db + $(TOP)/test/fuzzdata4.db \ + $(TOP)/test/fuzzdata5.db # Standard options to testfixture # @@ -475,6 +477,7 @@ SHELL_OPT += -DSQLITE_ENABLE_EXPLAIN_COMMENTS SHELL_OPT += -DSQLITE_ENABLE_UNKNOWN_SQL_FUNCTION FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 +DBFUZZ_OPT = # This is the default Makefile target. The objects listed here # are what get build when you type just "make" with no arguments. @@ -511,10 +514,20 @@ fuzzershell$(EXE): $(TOP)/tool/fuzzershell.c sqlite3.c sqlite3.h $(FUZZERSHELL_OPT) $(TOP)/tool/fuzzershell.c sqlite3.c \ $(TLIBS) $(THREADLIB) -fuzzcheck$(EXE): $(TOP)/test/fuzzcheck.c sqlite3.c sqlite3.h +dbfuzz$(EXE): $(TOP)/test/dbfuzz.c sqlite3.c sqlite3.h + $(TCCX) -o dbfuzz$(EXE) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ + $(DBFUZZ_OPT) $(TOP)/test/dbfuzz.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 \ + $(TOP)/test/fuzzcheck.c $(TOP)/test/ossfuzz.c sqlite3.c $(TLIBS) $(THREADLIB) + +ossshell$(EXE): $(TOP)/test/ossfuzz.c $(TOP)/test/ossshell.c sqlite3.c sqlite3.h + $(TCCX) -o ossshell$(EXE) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ -DSQLITE_ENABLE_MEMSYS5 $(FUZZCHECK_OPT) \ - $(TOP)/test/fuzzcheck.c sqlite3.c $(TLIBS) $(THREADLIB) + $(TOP)/test/ossfuzz.c $(TOP)/test/ossshell.c sqlite3.c $(TLIBS) $(THREADLIB) mptester$(EXE): sqlite3.c $(TOP)/mptest/mptest.c $(TCCX) -o $@ -I. $(TOP)/mptest/mptest.c sqlite3.c \ @@ -791,6 +804,11 @@ fastfuzztest: fuzzcheck$(EXE) $(FUZZDATA) valgrindfuzz: fuzzcheck$(EXE) $(FUZZDATA) valgrind ./fuzzcheck$(EXE) --cell-size-check --limit-mem 10M --timeout 600 $(FUZZDATA) +# The veryquick.test TCL tests. +# +tcltest: ./testfixture$(EXE) + ./testfixture$(EXE) $(TOP)/test/veryquick.test $(TESTOPTS) + # A very quick test using only testfixture and omitting all the slower # tests. Designed to run in under 3 minutes on a workstation. # @@ -799,9 +817,7 @@ quicktest: ./testfixture$(EXE) # The default test case. Runs most of the faster standard TCL tests, # and fuzz tests, and sqlite3_analyzer and sqldiff tests. -# -test: $(TESTPROGS) sourcetest fastfuzztest - ./testfixture$(EXE) $(TOP)/test/veryquick.test $(TESTOPTS) +test: fastfuzztest sourcetest $(TESTPROGS) tcltest # Run a test using valgrind. This can take a really long time # because valgrind is so much slower than a native machine. diff --git a/sqlite/manifest b/sqlite/manifest index c45c5825..b057a396 100644 --- a/sqlite/manifest +++ b/sqlite/manifest @@ -1,10 +1,10 @@ -C Version\s3.15.2 -D 2016-11-28T19:13:37.853 -F Makefile.in 6fd48ffcf7c2deea7499062d1f3747f986c19678 +C Version\s3.16.1 +D 2017-01-03T18:27:03.194 +F Makefile.in 41bd4cad981487345c4a84081074bcdb876e4b2e F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 -F Makefile.msc e0217f2d35a0448abbe4b066132ae20136e8b408 +F Makefile.msc b8ca53350ae545e3562403d5da2a69cec79308da F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 -F VERSION 1efaccf9d0764b8f1ca730ded1f5530961a11844 +F VERSION 571f747f178898e400d90570d3ca7898732170a6 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 @@ -30,8 +30,8 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55 -F configure b2d6400d41ea39410a111b698a91dc78ecacd13d x -F configure.ac b5d3df43161374f8dffd2e5f4b88fbb51685b975 +F configure c12efc7bbef62c14d49c4363dfc95a76e9b310c7 x +F configure.ac 605173e829ab64514ed89f9b53d0da1739d7b0a0 F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/lemon.html b5a3c07d33ecb8e019ce8f7660fe2dbbad9d7977 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 @@ -102,7 +102,7 @@ F ext/fts5/fts5Int.h b2eda36e0f224365c8e23dc8f559311834f1c13f F ext/fts5/fts5_aux.c 67acf8d51723cf28ffc3828210ba662df4b8d267 F ext/fts5/fts5_buffer.c 4c1502d4c956cd092c89ce4480867f9d8bf325cd F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 -F ext/fts5/fts5_expr.c e12421946774482f4d49e334c974571177adbc70 +F ext/fts5/fts5_expr.c dc2cee9f56b1818b85df59304b8104a5dfb8ab60 F ext/fts5/fts5_hash.c 880998e596b60f078348d48732ca4ad9a90caad2 F ext/fts5/fts5_index.c fdbe46da11e81c1817cd4cb2de25ffdb4dd83711 F ext/fts5/fts5_main.c f85281445dcf8be32d18841c93a6f90fe27dbfe2 @@ -159,7 +159,7 @@ F ext/fts5/test/fts5fault7.test cb14ea3c1f42394f06f2284abc58eecee6ff8080 F ext/fts5/test/fts5fault8.test 6785af34bd1760de74e2824ea9c161965af78f85 F ext/fts5/test/fts5fault9.test e10e395428a9ea0596ebe752ff7123d16ab78e08 F ext/fts5/test/fts5faultA.test fa5d59c0ff62b7125cd14eee38ded1c46e15a7ea -F ext/fts5/test/fts5faultB.test 92ae906284062bf081b6c854afa54dcb1aa9ef88 +F ext/fts5/test/fts5faultB.test 7f3bba790fa172073ac314f9b8ed197390b61eca F ext/fts5/test/fts5full.test 6f6143af0c6700501d9fd597189dfab1555bb741 F ext/fts5/test/fts5fuzz1.test bece4695fc169b61ab236ada7931c6e4942cbef9 F ext/fts5/test/fts5hash.test 06f9309ccb4d5050a131594e9e47d0b21456837d @@ -175,14 +175,14 @@ F ext/fts5/test/fts5phrase.test f6d1d464da5beb25dc56277aa4f1d6102f0d9a2f F ext/fts5/test/fts5plan.test 6a55ecbac9890765b0e16f8c421c7e0888cfe436 F ext/fts5/test/fts5porter.test 7cdc07bef301d70eebbfa75dcaf45c3680e1d0e1 F ext/fts5/test/fts5porter2.test 2e65633d58a1c525d5af0f6c01e5a59155bb3487 -F ext/fts5/test/fts5prefix.test efd42e00bb8e8a36383f25c838185508681c093f +F ext/fts5/test/fts5prefix.test 6ef7e875738412907b17687d25db39a25cbdaba4 F ext/fts5/test/fts5query.test f5ec25f5f2fbb70033424113cdffc101b1985a40 F ext/fts5/test/fts5rank.test 2bdc0c5f22ccc1f9dbe9f4d0b82a491dce6f8a32 F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17 F ext/fts5/test/fts5rowid.test 16908a99d6efc9ba21081b4f2b86b3fc699839a6 F ext/fts5/test/fts5simple.test 5da9b15ed534eb0be9f279d8a2bb2e24d30e4e38 -F ext/fts5/test/fts5simple2.test 98377ae1ff7749a42c21fe1a139c1ed312522c46 +F ext/fts5/test/fts5simple2.test 00839031878f52391562594fdab0503e424ee071 F ext/fts5/test/fts5simple3.test 25faa8cb8ad470c6f01f670bcc1317c19a89f091 F ext/fts5/test/fts5synonym.test 6475d189c2e20d60795808f83e36bf9318708d48 F ext/fts5/test/fts5synonym2.test aa4c43bd3b691ff80f658cb064f5ab40690e834e @@ -208,16 +208,17 @@ F ext/misc/amatch.c 211108e201105e4bb0c076527b8cfd34330fc234 F ext/misc/carray.c 40c27641010a4dc67e3690bdb7c9d36ca58b3c2d F ext/misc/closure.c 0d2a038df8fbae7f19de42e7c7d71f2e4dc88704 F ext/misc/compress.c 122faa92d25033d6c3f07c39231de074ab3d2e83 -F ext/misc/csv.c 816a3715356e4210dae2d242057745e937050896 +F ext/misc/csv.c 531a46cbad789fca0aa9db69a0e6c8ac9e68767d F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fuzzer.c 7c64b8197bb77b7d64eff7cac7848870235d4c25 F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c -F ext/misc/json1.c f2ff73bb3f54cc643409766162174ffec3d7ea64 +F ext/misc/json1.c e0797ef1bfa637429ceab9140ecba620809ee02a F ext/misc/memvfs.c e5225bc22e79dde6b28380f3a068ddf600683a33 F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/percentile.c 92699c8cd7d517ff610e6037e56506f8904dae2e F ext/misc/regexp.c a68d25c659bd2d893cd1215667bbf75ecb9dc7d4 +F ext/misc/remember.c 8440f8d0b452c5cdefb62b57135ccd1267aa729d F ext/misc/rot13.c 1ac6f95f99b575907b9b09c81a349114cf9be45a F ext/misc/scrub.c 1c5bfb8b0cd18b602fcb55755e84abf0023ac2fb F ext/misc/series.c e11e534ada797d5b816d7e7a93c022306563ca35 @@ -274,7 +275,7 @@ F ext/rtree/rtree9.test b5eb13849545dfd271a54ff16784cb00d8792aea F ext/rtree/rtreeA.test ace05e729a36e342d40cf94e9efc7b4723d9dcdf F ext/rtree/rtreeB.test c85f9ce78766c4e68b8b89fbf2979ee9cfa82b4e F ext/rtree/rtreeC.test c0a9c67f2efa98b6fae12acb8a28348d231a481d -F ext/rtree/rtreeD.test 636630357638f5983701550b37f0f5867130d2ca +F ext/rtree/rtreeD.test bdfaaf26df8b4eea7364039aca9150bc1e1f8825 F ext/rtree/rtreeE.test 45a147a64a76306172819562309681d8e90f94bb F ext/rtree/rtreeF.test 66deb9fd1611c7ca2e374adba63debdc2dbb12b4 F ext/rtree/rtreeG.test 3b185719630795f38594f64cd7d1de86a33f91f1 @@ -302,7 +303,7 @@ F ext/session/sessionG.test 01ef705096a9d3984eebdcca79807a211dee1b60 F ext/session/session_common.tcl 9b696a341cf1d3744823715ed92bb19749b6c3d4 F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 F ext/session/sessionfault2.test 04aa0bc9aa70ea43d8de82c4f648db4de1e990b0 -F ext/session/sqlite3session.c 37485891b4add26cf61495df193c419f36556a32 +F ext/session/sqlite3session.c c61a43396368ec00dc127f7bc647e9bd6a4ee5fb F ext/session/sqlite3session.h 9345166bd8f80562145586cf817f707de5ecada2 F ext/session/test_session.c eb0bd6c1ea791c1d66ee4ef94c16500dad936386 F ext/userauth/sqlite3userauth.h 19cb6f0e31316d0ee4afdfb7a85ef9da3333a220 @@ -311,7 +312,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 06dc0b1a9c9e2d05c9275937dd5b894bfe7d17d8 +F main.mk 2cf5f0362c5687fd8e912c3a327b49a2e8ba0f9b F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -323,37 +324,37 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 299117695b1f21ac62dfc5b608588810ba22ed0d -F src/analyze.c 8b62b2cf4da85451534ac0af82cafc418d837f68 +F src/alter.c 3b23977620ce9662ac54443f65b87ba996e36121 +F src/analyze.c 3c4a63ff7a55faefecf6eb1589932fdbc06b2415 F src/attach.c f6725410c184a80d8141b294fdf98a854c8a52b5 F src/auth.c 930b376a9c56998557367e6f7f8aaeac82a2a792 F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b -F src/bitvec.c 3ee4c8b2c94ed3a7377256e18199e6ff5cf33f63 +F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c bc87dd3b062cc26edfe79918de2200ccb8d41e73 -F src/btree.c 72965b023102daacc042443c707f4d415e88cbd7 -F src/btree.h d05b2fcc290991a8a3d9ea1816ddd55a4359dcde -F src/btreeInt.h c18b7d2a3494695133e4e60ee36061d37f45d9a5 -F src/build.c 59dcfdc1ee55439d069af301ef7f2e84421b5102 +F src/btree.c d2c100618784bd89c089fcef03ff6e789768ecae +F src/btree.h 2349a588abcd7e0c04f984e15c5c777b61637583 +F src/btreeInt.h 10c4b77c2fb399580babbcc7cf652ac10dba796e +F src/build.c 9e799f1edd910dfa8a0bc29bd390d35d310596af F src/callback.c 2e76147783386374bf01b227f752c81ec872d730 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e -F src/ctime.c e77f3dc297b4b65c96da78b4ae4272fdfae863d7 -F src/date.c 95c9a8d00767e7221a8e9a31f4e913fc8029bf6b +F src/ctime.c 9f2296a4e5d26ebf0e0d95a0af4628f1ea694e7a +F src/date.c dc3f1391d9297f8c748132813aaffcb117090d6e F src/dbstat.c 19ee7a4e89979d4df8e44cfac7a8f905ec89b77d -F src/delete.c cb3f6300df24c26c609778b2731f82644b5532ec -F src/expr.c bf9c58cf9b6d9be4d2deb2b64aa96f25660a1e7f -F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb -F src/fkey.c b9ca262f6ad4d030a3cab737ebf9b0b3c8b4ac80 -F src/func.c 7057bc2c105b82faa668d8e2ec85fad4540e5c51 -F src/global.c 9da4ca5d74b90715f0ec4957f3d17a4749009f34 +F src/delete.c c8bc10d145c9666a34ae906250326fdaa8d58fa5 +F src/expr.c 1df03961abc008b46154edca14bcbb38e7a3be90 +F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 +F src/fkey.c 2e9aabe1aee76273aff8a84ee92c464e095400ae +F src/func.c d8582ee91975975645f206db332c38f534b783ad +F src/global.c dcdb89f30b7aa531c5660030af106bc5bc48ef2e F src/hash.c 63d0ee752a3b92d4695b2b1f5259c4621b2cfebd F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 2d5e197f2f60351937b201196965fd14cd88489c +F src/insert.c 91ba5d0143e66479081536ebbaff1850ec9f57d9 F src/legacy.c 75d3023be8f0d2b99d60f905090341a03358c58e F src/loadext.c 5d6642d141c07d366e43d359e94ec9de47add41d -F src/main.c c9e49e376820bccca55fa9bf2ca321a51725db91 -F src/malloc.c 1443d1ad95d67c21d77af7ae3f44678252f0efec +F src/main.c e207b81542d13b9f13d61e78ca441f9781f055b0 +F src/malloc.c f3fad34cd570022abca558c573f1761fb09a8212 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 6919bcf12f221868ea066eec27e579fed95ce98b F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 @@ -371,34 +372,34 @@ F src/os.c add02933b1dce7a39a005b00a2f5364b763e9a24 F src/os.h 8e976e59eb4ca1c0fca6d35ee803e38951cb0343 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c be9ca0f901a2b6c1bc93dc338f4863675180c189 +F src/os_unix.c 30e2c43e4955db990e5b5a81e901f8aa74cc8820 F src/os_win.c cf90abd4e50d9f56d2c20ce8e005aff55d7bd8e9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c b1ee3ec0e58a0f8ca090aec67b2d0c4d256d6bea -F src/pager.h ec9140e5349491e561bb76aeac7a756f191191a1 -F src/parse.y 0338f906b61e311c2b7e11a3f89b0092c780b664 -F src/pcache.c 5ff2a08f76a9c1b22f43eb063b7068fb085465ac +F src/pager.c 9dc72d23eebbdf992bd69f2ab954d0d3a27c7340 +F src/pager.h d1e944291030351f362a0a7da9b5c3e34e603e39 +F src/parse.y 29153738a7322054359320eb00b5a4cd44389f20 +F src/pcache.c 51070ec9b8251bbf9c6ea3d35fd96a458752929e F src/pcache.h 2cedcd8407eb23017d92790b112186886e179490 F src/pcache1.c e3967219b2a92b9edcb9324a4ba75009090d3953 -F src/pragma.c d932ba278654617cdd281f88a790a3185fca7c44 -F src/pragma.h 64c78a648751b9f4f297276c4eb7507b14b4628c +F src/pragma.c 5a23557e490e7ac5afef097efc4b59dce5b482c2 +F src/pragma.h f9b221b2c8949ea941dbee49934299e4ed5af41c F src/prepare.c b1140c3d0cf59bc85ace00ce363153041b424b7a -F src/printf.c a5f0ca08ddede803c241266abb46356ec748ded1 -F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 +F src/printf.c 0c8579432f47948d9be5077eb590e8c4a01be667 +F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c bb070cf5f23611c44ab7e4788803684e385fc3fb F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac -F src/select.c ea3af83e2d0f245fef81ea4cf04cb730ce67f722 -F src/shell.c b80396d2fadce4681397707e30078bf416e1dec2 -F src/sqlite.h.in 1011de924a6a7340c74e5442cb76f7b49c134512 +F src/select.c dfb6cadc3dcfba1b1bdbfba62ebba2b4b673413e +F src/shell.c 6095531aa900decdaa765e0f3993fba7153c92c1 +F src/sqlite.h.in e8e2d108d82647f0a812fdb74accf91c1ec08ddc F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 8648034aa702469afb553231677306cc6492a1ae -F src/sqliteInt.h 9fbddc799b0ea6ca61fce4a0ef8ed2a11358d515 +F src/sqliteInt.h 2075e22d50833ca2d9956d0b7a6bfb845ad05dd2 F src/sqliteLimit.h c0373387c287c8d0932510b5547ecde31b5da247 F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1 F src/table.c 5226df15ab9179b9ed558d89575ea0ce37b03fc9 -F src/tclsqlite.c aef87dcd8cb66564d560ab48d43d19ac812a1eab -F src/test1.c 1f1a399956c8730d5f7b09c729e98764f2082162 -F src/test2.c b7174313e993754303a8b33c43df7c44b46857ab +F src/tclsqlite.c 205c66b9b81d97978a155caa3ef5be9c4de2b174 +F src/test1.c 8a98191a1da8e100f77cdb5cc716df67d405028d +F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c d03f5b5da9a2410b7a91c64b0d3306ed28ab6fee F src/test4.c 18ec393bb4d0ad1de729f0b94da7267270f3d8e6 F src/test5.c 328aae2c010c57a9829d255dc099d6899311672d @@ -410,14 +411,14 @@ F src/test_async.c 195ab49da082053fdb0f949c114b806a49ca770a F src/test_autoext.c 915d245e736652a219a907909bb6710f0d587871 F src/test_backup.c bf5da90c9926df0a4b941f2d92825a01bbe090a0 F src/test_bestindex.c d23f80d334c59662af69191854c76b8d3d0c8c96 -F src/test_blob.c a0f7ad49a0c9d4b72f693fe2a71c58d7e507174d +F src/test_blob.c 6a4c7920d1d9c6cc0f7aa50c89c4f80016aeda83 F src/test_btree.c 8b2dc8b8848cf3a4db93f11578f075e82252a274 -F src/test_config.c 4d3d4a886416f369771d69a6dba926866deda788 -F src/test_delete.c 32690ea215abf29dda589a580cd1b790389759b6 +F src/test_config.c 83179ea845479b5be9a651d014649e3f2722a1fe +F src/test_delete.c 8499d4d323f2ec8e28301deb3d6ddd8eef8b8139 F src/test_demovfs.c a0c3bdd45ed044115c2c9f7779e56eafff18741e F src/test_devsym.c 4e58dec2602d8e139ca08659f62a62450587cb58 F src/test_fs.c e16cbe68d3b107e00a907c20a9a02629870eb69b -F src/test_func.c a2b4993da973b0ea60dd5d51a7066238ede8c329 +F src/test_func.c a4fdab3363b436c1b12660e9362ce3f3782b7b5e F src/test_hexio.c 1d4469ca61ab202a1fcec6543f584d2407205e8d F src/test_init.c 4413c211a94b62157ca4c145b3f27c497f03c664 F src/test_intarray.c 988fc61cb0ff539f4172c0d95f15287c92516f64 @@ -425,7 +426,7 @@ F src/test_intarray.h f3b7672f5d1056eac563c0d6ea8480a660b1475c F src/test_journal.c d3b83f2bcb7792c709e57abddc456a2b1818643a F src/test_loadext.c 337056bae59f80b9eb00ba82088b39d0f4fe6dfd F src/test_malloc.c c05f6c40bd6c8bfe5f1718212f81fd5687f91766 -F src/test_multiplex.c 7c5b218d855cd0505a43185d55283b3fc257c8da +F src/test_multiplex.c e054459f7633f3ff8ce1245da724f9a8be189e4e F src/test_multiplex.h 5436d03f2d0501d04f3ed50a75819e190495b635 F src/test_mutex.c 7f4337ba23ee6b1d2ec81c189653608cb069926a F src/test_onefile.c 416f87a28d6d673352d33fc4b1c7d39db878e50f @@ -447,41 +448,41 @@ F src/test_windirent.c 600398db0198ca1c77ca183831bf456746b6f5c4 F src/test_windirent.h 7edc57e2faa727026dbd5d010dd0e2e665d5aa01 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c 78c8085bc7af1922aa687f0f4bbd716821330de5 -F src/treeview.c f51b75a28b377adde9f79bc3deb6c7770bcf97c0 -F src/trigger.c 3419bb9862983d84d70735fb4c94b21b934cd0c5 -F src/update.c 8179e699dbd45b92934fd02d3d8e3732e8da8802 +F src/tokenize.c 5c2f516876fc27fbd7753913f032f49eb89e83b5 +F src/treeview.c 4e44ade3bfe59d82005039f72e09333ce2b4162c +F src/trigger.c c9f0810043b265724fdb1bdd466894f984dfc182 +F src/update.c 1da7c462110bffed442a42884cb0d528c1db46d8 F src/utf.c 699001c79f28e48e9bcdf8a463da029ea660540c -F src/util.c 3e2da6101888d073e79ecc6af5e0a2f70fa1e498 +F src/util.c 1534060bc034cdc51381c040c8bd6252dbcb64c9 F src/vacuum.c 33c174b28886b2faf26e503b5a49a1c01a9b1c16 -F src/vdbe.c f43aa96f2efe9bc8a06d17115661af527a3318fa -F src/vdbe.h c044be7050ac6bf596eecc6ab159f5dbc020a3b7 -F src/vdbeInt.h d8a56a491b752dbb5f671963b8c861ec72ea875e -F src/vdbeapi.c 97129bec6b1553da50d8e73f523c278bda66d9f6 -F src/vdbeaux.c 52d9b840859f260ce8418be9333dd77c902e1c74 -F src/vdbeblob.c 3e82a797b60c3b9fed7b8de8c539ca7607874937 -F src/vdbemem.c fcdd73a2001a673f48a244a77b1038928ae729c9 -F src/vdbesort.c 91fda3909326860382b0ca8aa251e609c6a9d62c +F src/vdbe.c 88bd6c32b333580d2661ac3afe33369757fb1522 +F src/vdbe.h 50ee139f9c68fff91be1d717ed3a6abbd496919c +F src/vdbeInt.h 281cb70332dc8b593b8c7afe776f3a2ba7d4255e +F src/vdbeapi.c d6ebaa465f070eb1af8ba4e7b34583ece87bdd24 +F src/vdbeaux.c 12919c5aa354296d6b9ba808bca3e9dda836858c +F src/vdbeblob.c f4f98ea672b242f807c08c92c7faaa79e5091b65 +F src/vdbemem.c d3fd85b7b7ef3eb75de29c6d7e1d10d3ca78b4fd +F src/vdbesort.c eda25cb2d1727efca6f7862fea32b8aa33c0face F src/vdbetrace.c 41963d5376f0349842b5fc4aaaaacd7d9cdc0834 -F src/vtab.c e02cacb5c7ae742631edeb9ae9f53d399f093fd8 +F src/vtab.c c4bbe0f870f52036553f8098aee0703997f0577a F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 02eeecc265f6ffd0597378f5d8ae9070b62a406a -F src/wal.h 6dd221ed384afdc204bc61e25c23ef7fd5a511f2 +F src/wal.c 40c543f0a2195d1b0dc88ef12142bea690009344 +F src/wal.h 06b2a0b599cc0f53ea97f497cf8c6b758c999f71 F src/walker.c 91a6df7435827e41cff6bb7df50ea00934ee78b0 -F src/where.c 125af074723cf390d0e71ed1ca385240e6d4ea7c +F src/where.c 6bbf9284f4f15a6fa48663d033870cc0d7f5ee66 F src/whereInt.h 2bcc3d176e6091cb8f50a30b65c006e88a73614d -F src/wherecode.c e895f34fe8cd06c386524f84da63eea5040b19b1 -F src/whereexpr.c c19a84ac530835d37217db2181e4fe75901b7b97 +F src/wherecode.c e04ac8f24c3ac8621df6c3be3ac8c7d4fa893745 +F src/whereexpr.c 87ecdf24beba4498e4380b31c4131febb0a6ceaa F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test b35b4cd69fc913f90d39a575e171e1116c3a4bb7 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/all.test 6ff7b43c2b4b905c74dc4a813d201d0fa64c5783 -F test/alter.test 2facdddf08d0d48e75dc6cc312cd2b030f4835dd +F test/alter.test b820ab9dcf85f8e3a65bc8326accb2f0c7be64ef F test/alter2.test 7ea05c7d92ac99349a802ef7ada17294dd647060 F test/alter3.test 4d79934d812eaeacc6f22781a080f8cfe012fdc3 -F test/alter4.test 0c33c542247ba5aee4f4a0133ac44bcf8f97e5e0 +F test/alter4.test b6d7b86860111864f6cddb54af313f5862dda23b F test/altermalloc.test e81ac9657ed25c6c5bb09bebfa5a047cd8e4acfc F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 3eb35a4af972f98422e5dc0586501b17d103d321 @@ -497,7 +498,7 @@ F test/analyzeB.test a4c1c3048f6d9e090eb76e83eecb18bcf6d31a70 F test/analyzeC.test 555a6cc388b9818b6eda6df816f01ce0a75d3a93 F test/analyzeD.test 42af58de25a6436502e43006e9e59e2d71bcb0cf F test/analyzeE.test 8684e8ac5722fb97c251887ad97e5d496a98af1d -F test/analyzeF.test 5d1fe1024ba2dfea3c18bede8c1ccef8aba1ab34 +F test/analyzeF.test f423125b557f11ad71bb29765ef9c34b6dcf4ab7 F test/analyzer1.test 459fa02c445ddbf0101a3bad47b34290a35f2e49 F test/async.test 1d0e056ba1bb9729283a0f22718d3a25e82c277b F test/async2.test c0a9bd20816d7d6a2ceca7b8c03d3d69c28ffb8b @@ -505,15 +506,15 @@ F test/async3.test d73a062002376d7edc1fe3edff493edbec1fc2f7 F test/async4.test 1787e3952128aa10238bf39945126de7ca23685a F test/async5.test 383ab533fdb9f7ad228cc99ee66e1acb34cc0dc0 F test/atof1.test ff0b0156fd705b67c506e1f2bfe9e26102bea9bd -F test/attach.test 437107943f14d131cf5efc2ae5305a94d7cb1d58 +F test/attach.test 9976867b1a6585018f0966857aa82ed44e0bd6dc F test/attach2.test 0ec5defa340363de6cd50fd595046465e9aaba2d -F test/attach3.test 359eb65d00102cdfcef6fa4e81dc1648f8f80b27 +F test/attach3.test c59d92791070c59272e00183b7353eeb94915976 F test/attach4.test 53bf502f17647c6d6c5add46dda6bac8b6f4665c F test/attachmalloc.test 3a4bfca9545bfe906a8d2e622de10fbac5b711b0 -F test/auth.test 872a122b3977c1d1bb9fd637dc20016e5c01880f +F test/auth.test c6ede04bee65637ff354b43fc1235aa560c0863e F test/auth2.test 9eb7fce9f34bf1f50d3f366fb3e606be5a2000a1 -F test/auth3.test b810826b193831929951c0d50783a200e5ef6b72 -F test/autoinc.test c3a55c3667f429f4f4c7bed05f67b4d93e89e79d +F test/auth3.test 0d48b901cf111c14b4b1b5205c7d28f1a278190f +F test/autoinc.test 6ae8fb69c9f656962464ae4e6667045d0dfc3b46 F test/autoindex1.test 14b63a9f1e405fe6d5bfc8c8d00249c2ebaf13ea F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df F test/autoindex3.test a3be0d1a53a7d2edff208a5e442312957047e972 @@ -534,7 +535,8 @@ F test/badutf2.test f5bc7f2d280670ecd79b9cf4f0f1760c607fe51f F test/bc_common.tcl b5e42d80305be95697e6370e015af571e5333a1c F test/bestindex1.test 0cf1bd2d7b97d3a3a8c10736125274f64765c4ee F test/bestindex2.test 4a06b8922ab2fd09434870da8d1cdf525aaf7060 -F test/bestindex3.test dd5fa4f483cd0356549203c4522f8c9e21cb1fc0 +F test/bestindex3.test 578b6a52dab819e63f28e3640e04b32c85aed320 +F test/bestindex4.test 4cb5ff7dbaebadb87d366f51969271778423b455 F test/between.test 34d375fb5ce1ae283ffe82b6b233e9f38e84fc6c F test/bigfile.test aa74f4e5db51c8e54a1d9de9fa65d01d1eb20b59 F test/bigfile2.test 1b489a3a39ae90c7f027b79110d6b4e1dbc71bfc @@ -598,7 +600,7 @@ F test/corrupt8.test 2399dfe40d2c0c63af86706e30f3e6302a8d0516 F test/corrupt9.test 730a3db08d4ab9aa43392ea30d9c2b4879cbff85 F test/corruptA.test 53e56dafd180addcdadb402244b8cb9771d2ba26 F test/corruptB.test 73a8d6c0b9833697ecf16b63e3c5c05c945b5dec -F test/corruptC.test 0c46574f8d4f27ecc799b1b5c4cbf9b1817bce9a +F test/corruptC.test 4ef10844eba5213bd262f4d96784d7fcda114afe F test/corruptD.test b3c205fac7952b1de645ce44bb02335cd9e3e040 F test/corruptE.test 82ccf4f8f543fdbedd4aa42c709cb077f7374c62 F test/corruptF.test be9fde98e4c93648f1ba52b74e5318edc8f59fe4 @@ -622,10 +624,11 @@ F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2 F test/createtab.test b5de160630b209c4b8925bdcbbaf48cc90b67fe8 F test/cse.test 277350a26264495e86b1785f34d2d0c8600e021c F test/csv01.test e0ba3caaa57e4c667a0b45977689fb8082f14348 -F test/ctime.test 0b995accd44a52914bd4744d5c1b6e1a56c7897c +F test/ctime.test ff6c38e822459d6ca743c34901caf57740b08b54 F test/cursorhint.test 7bc346788390475e77a345da2b92270d04d35856 F test/cursorhint2.test fa41f0d997e67db921d08c31e73111b32811201a -F test/date.test 984ac1e3e5e031386866f034006148d3972b4a65 +F test/date.test a6a5a48b90907bca9fbcc79a30be5a715c1ab2fc +F test/dbfuzz.c 8cc2bdb818b4483a052f9f80f96be74cbd9a6e1d F test/dbstatus.test 73149851b3aff14fc6db478e58f9083a66422cf5 F test/dbstatus2.test e93ab03bfae6d62d4d935f20de928c19ca0ed0ab F test/default.test 0cb49b1c315a0d81c81d775e407f66906a2a604d @@ -648,14 +651,14 @@ F test/e_changes.test fd66105385153dbf21fdb35eb8ef6c3e1eade579 F test/e_createtable.test d4c6059d44dcd4b636de9aae322766062b471844 F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e F test/e_droptrigger.test 3cd080807622c13e5bbb61fc9a57bd7754da2412 -F test/e_dropview.test 0c9f7f60989164a70a67a9d9c26d1083bc808306 -F test/e_expr.test 1ffa8866d38e7becc76893a8829e9432050e5716 +F test/e_dropview.test 21ce09c361227ddbc9819a5608ee2700c276bdd5 +F test/e_expr.test d0dd488e0527cbc560ae2dea1939cc44cb9b9924 F test/e_fkey.test 54cc0046d2d952d6c42b0dd94414e7a8f75f79f4 F test/e_fts3.test 5c02288842e4f941896fd44afdef564dd5fc1459 F test/e_insert.test 3de217e95094d3d165992a6de1164bbc4bd92dc7 F test/e_reindex.test 2bebf7b393e519198b7c654407221cf171a439b8 F test/e_resolve.test a61751c368b109db73df0f20fc75fb47e166b1d8 -F test/e_select.test 52692ff3849541e828ad4661fe3773a9b8711763 +F test/e_select.test 16651bb681e83a1a2875ff4a595ed2b4b4dee375 F test/e_select2.test aceb80ab927d46fba5ce7586ebabf23e2bb0604f F test/e_totalchanges.test b12ee5809d3e63aeb83238dd501a7bca7fd72c10 F test/e_update.test f46c2554d915c9197548681e8d8c33a267e84528 @@ -680,10 +683,10 @@ F test/expr.test 66a2c9ac34f74f036faa4092f5402c7d3162fc93 F test/extension01.test 00d13cec817f331a687a243e0e5a2d87b0e358c9 F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 F test/fallocate.test 3e979af17dfa7e5e9dda5eba1a696c04fa9d47f7 -F test/filectrl.test c6547e6c3c4c3ef9707a0b3dc147de718135cacc +F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 F test/filefmt.test e4edbdc637ca9576ccf4337a3cce627d9df7a56c -F test/fkey1.test 13e3d48236a2b9f5c5ebd232eef9b3ab682a8a2c -F test/fkey2.test f3d27ecba480a348c328965d154214719bb158a9 +F test/fkey1.test ba64806ff9a04eecab2679caad377ae99a5e94e4 +F test/fkey2.test 155809016fad6b2a1491facf2ac53a551bc57c2c F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d F test/fkey5.test 5a373303f201ac03c22ba1ef17a733d3f56e611a @@ -813,18 +816,20 @@ F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1 F test/fuzz3.test b47377143f0c80f91ed29d722861077ff34415d5 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test 328f70aaca63adf29b4c6f06505ed0cf57ca7c26 -F test/fuzzcheck.c f2e8102f7829f7b946ebdb6f1a16c6f942d9de66 +F test/fuzzcheck.c a87e6067a8d19844bade916841cb76150ecf24a2 F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db f03a420d3b822cc82e4f894ca957618fbe9c4973 F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba F test/fuzzdata4.db 1882f0055fb63214d8407ddc7aca9b0b1c59af21 +F test/fuzzdata5.db 9f0cdcc5c6e83b90cf9ae343bd07f684d2da2de7 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 +F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 -F test/hexlit.test d7b0a5f41123df1e43985b91b8b2e70f95282d21 +F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 F test/hidden.test 23c1393a79e846d68fd902d72c85d5e5dcf98711 -F test/hook.test 3b7b99d0eece6d279812c2aef6fa08bdfabc633e +F test/hook.test 3a01b876691f9151d3e44562354f7d663ff90fce F test/icu.test 73956798bace8982909c00476b216714a6d0559a F test/ieee754.test 806fc0ce7f305f57e3331eaceeddcfec9339e607 F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 @@ -836,7 +841,7 @@ F test/in5.test 6c006e0bcd7351b69350ef566e65f244023489e9 F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 F test/incrblob2.test a5ce5ed1d0b01e2ed347245a21170372528af0a5 F test/incrblob3.test d8d036fde015d4a159cd3cbae9d29003b37227a4 -F test/incrblob4.test f26502a5697893e5acea268c910f16478c2f0fab +F test/incrblob4.test 21a52a6843a56cdcce968c6a86b72a7066d0e6ba F test/incrblob_err.test 69f9247fed50278d48ea710d1a8f9cdb09e4c0b8 F test/incrblobfault.test 280474078f6da9e732cd2a215d3d854969014b6e F test/incrcorrupt.test 6c567fbf870aa9e91866fe52ce6f200cd548939a @@ -861,10 +866,11 @@ F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 F test/insert3.test 1b7db95a03ad9c5013fdf7d6722b6cd66ee55e30 F test/insert4.test a20432f1c0fbbcff8f11d0e6ab4acb8c9db58023 F test/insert5.test 394f96728d1258f406fe5f5aeb0aaf29487c39a6 -F test/instr.test 737bbf80685232033f3abedc6ae92f75860b5dd2 -F test/instrfault.test aa90b7c3486a069151b28384ae525644a1f79d51 -F test/intarray.test 066b7d7ac38d25bf96f87f1b017bfc687551cdd4 -F test/interrupt.test dfe9a67a94b0b2d8f70545ba1a6cca10780d71cc +F test/instr.test 9a8802f28437d8ade53fedfc47b2ca599b4e48ba +F test/instrfault.test 0f870b218ea17cd477bb19ed330eecdb460dd53a +F test/intarray.test 46d95b457916638c5d8b1af21fb174804b3acf8b +F test/interrupt.test 16ea879ec728cb76414c148c5f24afd5d1f91054 +F test/interrupt2.test e4408ca770a6feafbadb0801e54a0dcd1a8d108d F test/intpkey.test ac71107a49a06492b69b82aafaf225400598d3c8 F test/io.test f95bca1783b01ea7761671560d023360d2dfa4cc F test/ioerr.test 2a24bd6ed5a8b062e64bfe1f6cf94fb25e92210d @@ -877,7 +883,7 @@ F test/join.test f9d4a28dec81c6e9dc21b73518e024d73b5ebf57 F test/join2.test f2171c265e57ee298a27e57e7051d22962f9f324 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 -F test/join5.test 8a5c0be6f0c260a5c7177c3b8f07c7856141038a +F test/join5.test bc98ea4b4e5003f5b1453701ebb8cd7d1c01a550 F test/join6.test cfe6503791ceb0cbb509966740286ec423cbf10b F test/journal1.test 69abc726c51b4a0409189f9a85191205297c0577 F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4 @@ -889,9 +895,10 @@ F test/json101.test c0897616f32d95431f37fd291cb78742181980ac F test/json102.test bf3fe7a706d30936a76a0f7a0375e1e8e73aff5a F test/json103.test c5f6b85e69de05f6b3195f9f9d5ce9cd179099a0 F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff +F test/kvtest.c 2c66ddefcd03c2caa337f6dd79e6c82368af83df F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 -F test/like.test 81632c437a947bf1f7130b19537da6a1a844806a +F test/like.test 0603f4fa0dad50987f70032c05800cbfa8985302 F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da F test/like3.test 3608a2042b6f922f900fbfd5d3ce4e7eca57f7c4 F test/limit.test 0c99a27a87b14c646a9d583c7c89fd06c352663e @@ -955,13 +962,14 @@ F test/mmap2.test 9d6dd9ddb4ad2379f29cc78f38ce1e63ed418022 F test/mmap3.test b3c297e78e6a8520aafcc1a8f140535594c9086e F test/mmap4.test 2e2b4e32555b58da15176e6fe750f17c9dcf7f93 F test/mmapfault.test d4c9eff9cd8c2dc14bc43e71e042f175b0a26fe3 -F test/multiplex.test efd015ca0b5b4a57dc9535b8feb1273eebeadb60 +F test/multiplex.test dc0d67b66f84b484a83cb8bbdf3f0a7f49562ccd F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a F test/multiplex3.test d228f59eac91839a977eac19f21d053f03e4d101 F test/multiplex4.test e8ae4c4bd70606a5727743241f13b5701990abe4 F test/mutex1.test ea2cc74d97f077b9e74c84cbd024f14d79a8126f F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 F test/nan.test dacc57f80859c06a433d30839336fe227d2038b3 +F test/nockpt.test 9a436a7213ba5ef7a32304998d386d3ea3f76c9d F test/nolock.test f196cf8b8fbea4e2ca345140a2b3f3b0da45c76e F test/notify1.test 669b2b743618efdc18ca4b02f45423d5d2304abf F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 @@ -982,6 +990,8 @@ F test/orderby7.test 3d1383d52ade5b9eb3a173b3147fdd296f0202da F test/orderby8.test 23ef1a5d72bd3adcc2f65561c654295d1b8047bd F test/orderby9.test 87fb9548debcc2cd141c5299002dd94672fa76a3 F test/oserror.test b32dc34f2363ef18532e3a0a7358e3e7e321974f +F test/ossfuzz.c e469138f4be3e92df6173b79b3b216ab6e17b407 +F test/ossshell.c d9f1a6f43e7bab45d6be857a5800f5d4a1861db3 F test/ovfl.test 199c482696defceacee8c8e0e0ef36da62726b2f F test/pager1.test 841868017e9dd3cb459b8d78862091a7d9cff21d F test/pager2.test 67b8f40ae98112bcdba1f2b2d03ea83266418c71 @@ -1015,7 +1025,7 @@ F test/randexpr1.test eda062a97e60f9c38ae8d806b03b0ddf23d796df F test/rbu.test 168573d353cd0fd10196b87b0caa322c144ef736 F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8 F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 -F test/regexp2.test aa7ffcc21350007a78361b82bcf3b74d12227144 +F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c F test/reindex.test 44edd3966b474468b823d481eafef0c305022254 F test/releasetest.tcl cb06c4df0de4872e65b178316f8a87ccf7624d59 x F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb @@ -1025,7 +1035,7 @@ F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 F test/rowid.test 5b7509f384f4f6fae1af3c8c104c8ca299fea18d -F test/rowvalue.test f4dc97fe52d4e206e25b3395588b9497a8eed3ff +F test/rowvalue.test f4a60835c949ec4b8ddc15d78d8a9b412b805875 F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 F test/rowvalue4.test 4b556d7de161a0dd8cff095c336e913986398bea @@ -1033,8 +1043,8 @@ F test/rowvalue5.test c81c7d8cf36711ab37675ad7376084ae2a359cb6 F test/rowvalue6.test d19b54feb604d5601f8614b15e214e0774c01087 F test/rowvalue7.test 5d06ff19d9e6969e574a2e662a531dd0c67801a8 F test/rowvalue8.test 5900eddad9e2c3c2e26f1a95f74aafc1232ee5e0 -F test/rowvalue9.test e24f9eb02baffc6a67b6eed9e40d4c612c98079d -F test/rowvaluefault.test 7b16485e3f2b371f3e3d05455b8ded6d0c090244 +F test/rowvalue9.test d8dd2c6ecac432dadaa79e41dc2434f007be1b6b +F test/rowvaluefault.test 7cd9ccc6c2fbdd881672984087aad0491bb75504 F test/rtree.test 0c8d9dd458d6824e59683c19ab2ffa9ef946f798 F test/run-wordcount.sh 891e89c4c2d16e629cd45951d4ed899ad12afc09 F test/savepoint.test c671fdbd34cd3bfe1518a777526ada595180cf8d @@ -1048,7 +1058,7 @@ F test/scanstatus.test 5253c219e331318a437f436268e0e82345700285 F test/schema.test 8f7999be894260f151adf15c2c7540f1c6d6a481 F test/schema2.test 906408621ea881fdb496d878b1822572a34e32c5 F test/schema3.test 1bc1008e1f8cb5654b248c55f27249366eb7ed38 -F test/schema4.test e6a66e20cc69f0e306667c08be7fda3d11707dc5 +F test/schema4.test 3b26c9fa916abb6dadf894137adcf41b7796f7b9 F test/schema5.test 29699b4421f183c8f0e88bd28ce7d75d13ea653e F test/securedel.test 21749c32ccc30f1ea9e4b9f33295a6521ec20fa0 F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 @@ -1082,11 +1092,13 @@ F test/sharedA.test 0cdf1a76dfa00e6beee66af5b534b1e8df2720f5 F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e F test/shared_err.test 2f2aee20db294b9924e81f6ccbe60f19e21e8506 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 -F test/shell1.test 65b10cd8a90cda9b5af9100a45689a57dcc01a31 +F test/shell1.test 52ac23a345772ab0d6d3241a21a633fdaa3ed581 F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b -F test/shell3.test da513d522ef6f01cee8475dcf8332bff8982b3dd +F test/shell3.test 9b95ba643eaa228376f06a898fb410ee9b6e57c1 F test/shell4.test 89ad573879a745974ff2df20ff97c5d6ffffbd5d F test/shell5.test 50a732c1c2158b1cd62cf53975ce1ea7ce6b9dc9 +F test/shell6.test cff624fadf71bdb5e3a9b0f86eaf59a43c0622b1 +F test/shell7.test 07751911b294698e0c5df67bcbd29e7d2f0f2907 F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 F test/shrink.test 1b4330b1fd9e818c04726d45cb28db73087535ce @@ -1096,8 +1108,9 @@ F test/skipscan2.test d1d1450952b7275f0b0a3a981f0230532743951a F test/skipscan3.test ec5bab3f81c7038b43450e7b3062e04a198bdbb5 F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2 F test/skipscan6.test 5866039d03a56f5bd0b3d172a012074a1d90a15b -F test/snapshot.test a19465046168b4420b5afeed37c3214e42a49f4a -F test/snapshot_fault.test 062ff0438a074978d45e9f9a92e7ad459b74ee73 +F test/snapshot.test 85735bd997a4f6d710140c28fd860519a299649f +F test/snapshot2.test 867652ed4a13282dce218723535fad1c7b44c3c4 +F test/snapshot_fault.test 52c5e97ebd218846a8ae2da4d147d3e77d71f963 F test/soak.test 0b5b6375c9f4110c828070b826b3b4b0bb65cd5f F test/softheap1.test 843cd84db9891b2d01b9ab64cef3e9020f98d087 F test/sort.test c2adc635c2564241fefec0b3a68391ef6868fd3b @@ -1114,7 +1127,7 @@ F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b -F test/speedtest1.c 43b25ae8e303bcada98e00be036e710de17d346a +F test/speedtest1.c 0c92fd0db4cb778e3b6968db0ea859e28f077823 F test/spellfix.test f9c1f431e2c096c8775fec032952320c0e4700db F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 @@ -1134,18 +1147,18 @@ F test/symlink.test c9ebe7330d228249e447038276bfc8a7b22f4849 F test/sync.test 2f84bdbc2b2df1fcb0220575b4b9f8cea94b7529 F test/syscall.test f59ba4e25f7ba4a4c031026cc2ef8b6e4b4c639c F test/sysfault.test c9f2b0d8d677558f74de750c75e12a5454719d04 -F test/tabfunc01.test 50a9fb379f9747fd0d40ea6d8fa3a101361bb537 +F test/tabfunc01.test 8b2ef53caa37854864c89e1e57e8a10efd4f5e43 F test/table.test b708f3e5fa2542fa51dfab21fc07b36ea445cb2f F test/tableapi.test 2674633fa95d80da917571ebdd759a14d9819126 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 F test/tclsqlite.test 1d73b9203b1ca8798d7d7310742b8d3febc0d56e F test/tempdb.test bd92eba8f20e16a9136e434e20b280794de3cdb6 -F test/tempdb2.test 4fc92055f2a3f7626c0f2eabbb637dc021b311d5 +F test/tempdb2.test 27e41ed540b2f9b056c2e77e9bddc1b875358507 F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 F test/temptable2.test cd396beb41117a5302fff61767c35fa4270a0d5e F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 -F test/temptrigger.test 8ec228b0db5d7ebc4ee9b458fc28cb9e7873f5e1 +F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc F test/tester.tcl 4ce5afd5e192db4cae178e1a983b060e0f08c5d6 F test/thread001.test 9f22fd3525a307ff42a326b6bc7b0465be1745a5 F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 @@ -1186,7 +1199,7 @@ F test/tkt-78e04e52ea.test 813779f8888f3ca226df656c4eef078f9635f3c9 F test/tkt-7a31705a7e6.test e75a2bba4eec801b92c8040eb22096ac6d35e844 F test/tkt-7bbfb7d442.test 7b2cd79c7a17ae6750e75ec1a7846712a69c9d18 F test/tkt-80ba201079.test 105a721e6aad0ae3c5946d7615d1e4d03f6145b8 -F test/tkt-80e031a00f.test f50046f474ecf67ad5c50cd9200da04ff887d7cd +F test/tkt-80e031a00f.test 9ee36348b761bf7c14261e002b75a4c0d5a04d4c F test/tkt-8454a207b9.test c583a9f814a82a2b5ba95207f55001c9f0cd816c F test/tkt-868145d012.test a5f941107ece6a64410ca4755c6329b7eb57a356 F test/tkt-8c63ff0ec.test 258b7fc8d7e4e1cb5362c7d65c143528b9c4cbed @@ -1276,7 +1289,7 @@ F test/tkt3541.test 5dc257bde9bc833ab9cc6844bf170b998dbb950a F test/tkt3554.test f599967f279077bace39220cbe76085c7b423725 F test/tkt3581.test 1966b7193f1e3f14951cce8c66907ae69454e9a3 F test/tkt35xx.test f38c1b03713179d414969187c941466e44945b35 -F test/tkt3630.test 929f64852103054125200bc825c316d5f75d42f7 +F test/tkt3630.test 9a934c58c259f89a0ae6bb6bb846c56285a6fd0f F test/tkt3718.test 3b59dcb5c4e7754dacd91e7fd353a61492cc402a F test/tkt3731.test 0c5f4cbffe102d43c3b2188af91a9e36348f974b F test/tkt3757.test 10cd679a88675c880533083fc79ac04324525595 @@ -1285,7 +1298,7 @@ F test/tkt3762.test 4d439ff7abdc8d9323150269d182c37c2d514576 F test/tkt3773.test 7bca904d2a647a6a4a291bd86d7fd7c73855b789 F test/tkt3791.test a6624b9a80b216a26cf473607f42f3e51898c267 F test/tkt3793.test d90ffd75c52413908d15e1c44fc2ea9c80fcc449 -F test/tkt3810.test 90fa0635dfa7da9680c8cd3513350a49b3a8ae12 +F test/tkt3810.test 09608d81c63a6ff3aaf7bc70717909c51f5f4048 F test/tkt3824.test 150aa00bb6220672e5f0eb14dc8eaa36750425f0 F test/tkt3832.test 2300d10d57562b89875b72148338ac3e14f8847d F test/tkt3838.test 292e72489101cd1320d7278dc111c173ebf334d4 @@ -1336,7 +1349,8 @@ F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 -F test/uri.test 6630ecbdea2aac10df3c89dbae2243f4c2c353e4 +F test/uri.test 3481026f00ade6dfe8adb7acb6e1e47b04369568 +F test/uri2.test 9d3ba7a53ee167572d53a298ee4a5d38ec4a8fb7 F test/userauth01.test e740a2697a7b40d7c5003a7d7edaee16acd349a9 F test/utf16align.test 54cd35a27c005a9b6e7815d887718780b6a462ae F test/vacuum.test ce91c39f7f91a4273bf620efad21086b5aa6ef1d @@ -1373,7 +1387,7 @@ F test/wal2.test 56b0bc95b8693a0be294f8d210c49025dd094bd7 F test/wal3.test 2a93004bc0fb2b5c29888964024695bade278ab2 F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c F test/wal5.test 9c11da7aeccd83a46d79a556ad11a18d3cb15aa9 -F test/wal6.test a9d6aa635b9d63607dabdc11406f5f96ca986635 +F test/wal6.test b602704e4b066199bc89d91ca9000f335dcf4572 F test/wal64k.test 163655ecd2cb8afef4737cac2a40fdd2eeaf20b8 F test/wal7.test 2ae8f427d240099cc4b2dfef63cff44e2a68a1bd F test/wal8.test d9df3fba4caad5854ed69ed673c68482514203c8 @@ -1427,11 +1441,11 @@ F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc F test/with1.test cef099a491eac9874f2c28bd2dc86394fb3e47b3 F test/with2.test 2b40da883658eb74ad8ad06afabe11a408e7fb87 -F test/with3.test 511bacdbe41c49cf34f9fd1bd3245fe1575bca98 +F test/with3.test e71604a0e53cba82bc04c703987cb1d6751ec0b6 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 F test/without_rowid1.test 1a7b9bd51b899928d327052df9741d2fe8dbe701 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 -F test/without_rowid3.test aad4f9d383e199349b6c7e508a778f7dff5dff79 +F test/without_rowid3.test 2724c787a51a5dce09d078453a758117b4b728f1 F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a F test/without_rowid6.test 1f99644e6508447fb050f73697350c7ceca3392e @@ -1444,18 +1458,18 @@ F tool/Replace.cs 02c67258801c2fb5f63231e0ac0f220b4b36ba91 F tool/addopcodes.tcl 10c889c4a65ec6c5604e4a47306fa77ff57ae189 F tool/build-all-msvc.bat 018c1b273458a90c8ba633c6f0c5654cfcb138bf x F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 -F tool/cg_anno.tcl 692ce4b8693d59e3a3de77ca97f4139ecfa641b0 x +F tool/cg_anno.tcl f95b0006c52cf7f0496b506343415b6ee3cdcdd3 x F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2 F tool/dbhash.c a06228aa21ebc4e6ea8daa486601d938499238a5 F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 F tool/fast_vacuum.c 5ba0d6f5963a0a63bdc42840f678bad75b2ebce1 F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439 -F tool/fuzzershell.c f294ca67a10e87db76af130d75b2c94be36359c6 +F tool/fuzzershell.c dbf6c26eef936ec78cb0707570de3a4308b2507e F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 F tool/genfkey.test 4196a8928b78f51d54ef58e99e99401ab2f0a7e5 F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce -F tool/lemon.c e4fb7d888873ac88f20a41c84a7d1e61f5209a6d -F tool/lempar.c 7cf047778e74433126cb02896e3f898d7b1e20aa +F tool/lemon.c 5ccba178a8e8a4b21e1c9232944d23973da38ad7 +F tool/lempar.c 320d630b44da693407684c64d9fa91a163419dac F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca @@ -1465,7 +1479,7 @@ F tool/mkmsvcmin.tcl 2f12f7fa8858bbe61cf81820a2da96c79ed1ca8d F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl a01d2c1d8a6205b03fc635adf3735b4c523befd3 F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e -F tool/mkpragmatab.tcl f0d5bb266d1d388cf86fce5ba01a891e95d72d41 +F tool/mkpragmatab.tcl a30ee93515135466fc49ae881f75da07ebcafd19 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl fef88397668ae83166735c41af99d79f56afaabb F tool/mksqlite3c.tcl 06b2e6a0f21cc0a5d70fbbd136b3e0a96470645e @@ -1483,11 +1497,11 @@ F tool/run-speed-test.sh f95d19fd669b68c4c38b6b475242841d47c66076 F tool/showdb.c c695a5d5c8110640e0d9fadf5e254da90c79c36e F tool/showjournal.c 5bad7ae8784a43d2b270d953060423b8bd480818 F tool/showlocks.c 9920bcc64f58378ff1118caead34147201f48c68 -F tool/showstat4.c bda40d6e395df7edb6e9ea630784d3d762c35b4b +F tool/showstat4.c b14159aa062f661b394ba37b6b7b94bfb8012ab9 F tool/showwal.c ec79959834f7b21f1e0a2aa52bb7c056d2203977 F tool/soak1.tcl 8d407956e1a45b485a8e072470a3e629a27037fe F tool/spaceanal.tcl ab7d9bf68062907282a64b3e12ccbfad47193c5a -F tool/speed-check.sh da6ce45957c509ba6343fe3fef167e7e2b306262 +F tool/speed-check.sh e6ca0695b047af64201ebe0ef452e423f55d78b1 F tool/speedtest.tcl 06c76698485ccf597b9e7dbb1ac70706eb873355 F tool/speedtest16.c ecb6542862151c3e6509bbc00509b234562ae81e F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff @@ -1527,11 +1541,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 e31d646a319e03587a913d8e23e8c9f767a3481e -R 1d14b6b58ab1fcbf27ff915cd0c67140 +P a60b60d6b6ba3e3b17b7bb7d7e19ea0e6b40fa68 +R d4f21444156ee47430dc0da1e1aa71cf T +bgcolor * #d0c0ff T +sym-release * -T +sym-version-3.15.2 * +T +sym-version-3.16.1 * U drh -Z 790edc877406989babf0a6b5cdc9cbe9 +Z 2e6a3477dce68797105cb19052da7dea # Remove this line to create a well-formed manifest. diff --git a/sqlite/manifest.uuid b/sqlite/manifest.uuid index 4b7d526d..f6a1e9cc 100644 --- a/sqlite/manifest.uuid +++ b/sqlite/manifest.uuid @@ -1 +1 @@ -bbd85d235f7037c6a033a9690534391ffeacecc8 +979f04392853b8053817a3eea2fc679947b437fd diff --git a/sqlite/src/alter.c b/sqlite/src/alter.c index 2c86a8ba..067cbb89 100644 --- a/sqlite/src/alter.c +++ b/sqlite/src/alter.c @@ -504,7 +504,7 @@ void sqlite3AlterRenameTable( sqlite3NestedParse(pParse, "UPDATE \"%w\".%s SET " "sql = sqlite_rename_parent(sql, %Q, %Q) " - "WHERE %s;", zDb, SCHEMA_TABLE(iDb), zTabName, zName, zWhere); + "WHERE %s;", zDb, MASTER_NAME, zTabName, zName, zWhere); sqlite3DbFree(db, zWhere); } } @@ -528,7 +528,7 @@ void sqlite3AlterRenameTable( "ELSE name END " "WHERE tbl_name=%Q COLLATE nocase AND " "(type='table' OR type='index' OR type='trigger');", - zDb, SCHEMA_TABLE(iDb), zName, zName, zName, + zDb, MASTER_NAME, zName, zName, zName, #ifndef SQLITE_OMIT_TRIGGER zName, #endif @@ -689,7 +689,7 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ "UPDATE \"%w\".%s SET " "sql = substr(sql,1,%d) || ', ' || %Q || substr(sql,%d) " "WHERE type = 'table' AND name = %Q", - zDb, SCHEMA_TABLE(iDb), pNew->addColOffset, zCol, pNew->addColOffset+1, + zDb, MASTER_NAME, pNew->addColOffset, zCol, pNew->addColOffset+1, zTab ); sqlite3DbFree(db, zCol); @@ -773,7 +773,7 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ pNew = (Table*)sqlite3DbMallocZero(db, sizeof(Table)); if( !pNew ) goto exit_begin_add_column; pParse->pNewTable = pNew; - pNew->nRef = 1; + pNew->nTabRef = 1; pNew->nCol = pTab->nCol; assert( pNew->nCol>0 ); nAlloc = (((pNew->nCol-1)/8)*8)+8; @@ -793,7 +793,7 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ } pNew->pSchema = db->aDb[iDb].pSchema; pNew->addColOffset = pTab->addColOffset; - pNew->nRef = 1; + pNew->nTabRef = 1; /* Begin a transaction and increment the schema cookie. */ sqlite3BeginWriteOperation(pParse, 0, iDb); diff --git a/sqlite/src/analyze.c b/sqlite/src/analyze.c index e3955f30..c480a0c5 100644 --- a/sqlite/src/analyze.c +++ b/sqlite/src/analyze.c @@ -1766,7 +1766,9 @@ static int loadStatTbl( sqlite3_finalize(pStmt); return SQLITE_NOMEM_BKPT; } - memcpy(pSample->p, sqlite3_column_blob(pStmt, 4), pSample->n); + if( pSample->n ){ + memcpy(pSample->p, sqlite3_column_blob(pStmt, 4), pSample->n); + } pIdx->nSample++; } rc = sqlite3_finalize(pStmt); diff --git a/sqlite/src/bitvec.c b/sqlite/src/bitvec.c index 9d13ba91..bd4a0942 100644 --- a/sqlite/src/bitvec.c +++ b/sqlite/src/bitvec.c @@ -293,7 +293,7 @@ u32 sqlite3BitvecSize(Bitvec *p){ return p->iSize; } -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE /* ** Let V[] be an array of unsigned characters sufficient to hold ** up to N bits. Let I be an integer between 0 and N. 0<=InKey = sqlite3BtreePayloadSize(pCur); pKey = sqlite3Malloc( pCur->nKey ); if( pKey ){ - rc = sqlite3BtreeKey(pCur, 0, (int)pCur->nKey, pKey); + rc = sqlite3BtreePayload(pCur, 0, (int)pCur->nKey, pKey); if( rc==SQLITE_OK ){ pCur->pKey = pKey; }else{ @@ -763,26 +763,23 @@ static int btreeMoveto( ){ int rc; /* Status code */ UnpackedRecord *pIdxKey; /* Unpacked index key */ - char aSpace[384]; /* Temp space for pIdxKey - to avoid a malloc */ - char *pFree = 0; if( pKey ){ assert( nKey==(i64)(int)nKey ); - pIdxKey = sqlite3VdbeAllocUnpackedRecord( - pCur->pKeyInfo, aSpace, sizeof(aSpace), &pFree - ); + pIdxKey = sqlite3VdbeAllocUnpackedRecord(pCur->pKeyInfo); if( pIdxKey==0 ) return SQLITE_NOMEM_BKPT; sqlite3VdbeRecordUnpack(pCur->pKeyInfo, (int)nKey, pKey, pIdxKey); if( pIdxKey->nField==0 ){ - sqlite3DbFree(pCur->pKeyInfo->db, pFree); - return SQLITE_CORRUPT_BKPT; + rc = SQLITE_CORRUPT_BKPT; + goto moveto_done; } }else{ pIdxKey = 0; } rc = sqlite3BtreeMovetoUnpacked(pCur, pIdxKey, nKey, bias, pRes); - if( pFree ){ - sqlite3DbFree(pCur->pKeyInfo->db, pFree); +moveto_done: + if( pIdxKey ){ + sqlite3DbFree(pCur->pKeyInfo->db, pIdxKey); } return rc; } @@ -1743,7 +1740,7 @@ static int btreeInitPage(MemPage *pPage){ assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); if( !pPage->isInit ){ - u16 pc; /* Address of a freeblock within pPage->aData[] */ + int pc; /* Address of a freeblock within pPage->aData[] */ u8 hdr; /* Offset to beginning of page header */ u8 *data; /* Equal to pPage->aData */ BtShared *pBt; /* The main btree structure */ @@ -1823,25 +1820,30 @@ static int btreeInitPage(MemPage *pPage){ ** freeblocks. */ pc = get2byte(&data[hdr+1]); nFree = data[hdr+7] + top; /* Init nFree to non-freeblock free space */ - while( pc>0 ){ - u16 next, size; - if( pciCellLast ){ + if( pc>0 ){ + u32 next, size; + if( pc0 && next<=pc+size+3) || pc+size>usableSize ){ - /* Free blocks must be in ascending order. And the last byte of - ** the free-block must lie on the database page. */ - return SQLITE_CORRUPT_BKPT; + while( 1 ){ + if( pc>iCellLast ){ + return SQLITE_CORRUPT_BKPT; /* Freeblock off the end of the page */ + } + next = get2byte(&data[pc]); + size = get2byte(&data[pc+2]); + nFree = nFree + size; + if( next<=pc+size+3 ) break; + pc = next; + } + if( next>0 ){ + return SQLITE_CORRUPT_BKPT; /* Freeblock not in ascending order */ + } + if( pc+size>(unsigned int)usableSize ){ + return SQLITE_CORRUPT_BKPT; /* Last freeblock extends past page end */ } - nFree = nFree + size; - pc = next; } /* At this point, nFree contains the sum of the offset to the start @@ -2282,7 +2284,7 @@ int sqlite3BtreeOpen( goto btree_open_out; } rc = sqlite3PagerOpen(pVfs, &pBt->pPager, zFilename, - EXTRA_SIZE, flags, vfsFlags, pageReinit); + sizeof(MemPage), flags, vfsFlags, pageReinit); if( rc==SQLITE_OK ){ sqlite3PagerSetMmapLimit(pBt->pPager, db->szMmap); rc = sqlite3PagerReadFileheader(pBt->pPager,sizeof(zDbHeader),zDbHeader); @@ -2395,12 +2397,14 @@ int sqlite3BtreeOpen( btree_open_out: if( rc!=SQLITE_OK ){ if( pBt && pBt->pPager ){ - sqlite3PagerClose(pBt->pPager); + sqlite3PagerClose(pBt->pPager, 0); } sqlite3_free(pBt); sqlite3_free(p); *ppBtree = 0; }else{ + sqlite3_file *pFile; + /* If the B-Tree was successfully opened, set the pager-cache size to the ** default value. Except, when opening on an existing shared pager-cache, ** do not change the pager-cache size. @@ -2408,6 +2412,11 @@ int sqlite3BtreeOpen( if( sqlite3BtreeSchema(p, 0, 0)==0 ){ sqlite3PagerSetCachesize(p->pBt->pPager, SQLITE_DEFAULT_CACHE_SIZE); } + + pFile = sqlite3PagerFile(pBt->pPager); + if( pFile->pMethods ){ + sqlite3OsFileControlHint(pFile, SQLITE_FCNTL_PDB, (void*)&pBt->db); + } } if( mutexOpen ){ assert( sqlite3_mutex_held(mutexOpen) ); @@ -2537,7 +2546,7 @@ int sqlite3BtreeClose(Btree *p){ ** Clean out and delete the BtShared object. */ assert( !pBt->pCursor ); - sqlite3PagerClose(pBt->pPager); + sqlite3PagerClose(pBt->pPager, p->db); if( pBt->xFreeSchema && pBt->pSchema ){ pBt->xFreeSchema(pBt->pSchema); } @@ -3284,14 +3293,11 @@ static int setChildPtrmaps(MemPage *pPage){ int nCell; /* Number of cells in page pPage */ int rc; /* Return code */ BtShared *pBt = pPage->pBt; - u8 isInitOrig = pPage->isInit; Pgno pgno = pPage->pgno; assert( sqlite3_mutex_held(pPage->pBt->mutex) ); rc = btreeInitPage(pPage); - if( rc!=SQLITE_OK ){ - goto set_child_ptrmaps_out; - } + if( rc!=SQLITE_OK ) return rc; nCell = pPage->nCell; for(i=0; iisInit = isInitOrig; return rc; } @@ -3339,7 +3343,6 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){ } put4byte(pPage->aData, iTo); }else{ - u8 isInitOrig = pPage->isInit; int i; int nCell; int rc; @@ -3375,8 +3378,6 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){ } put4byte(&pPage->aData[pPage->hdrOffset+8], iTo); } - - pPage->isInit = isInitOrig; } return SQLITE_OK; } @@ -4271,6 +4272,10 @@ int sqlite3BtreeCursorIsValid(BtCursor *pCur){ return pCur && pCur->eState==CURSOR_VALID; } #endif /* NDEBUG */ +int sqlite3BtreeCursorIsValidNN(BtCursor *pCur){ + assert( pCur!=0 ); + return pCur->eState==CURSOR_VALID; +} /* ** Return the value of the integer key or "rowid" for a table btree. @@ -4640,43 +4645,35 @@ static int accessPayload( } /* -** Read part of the key associated with cursor pCur. Exactly -** "amt" bytes will be transferred into pBuf[]. The transfer +** Read part of the payload for the row at which that cursor pCur is currently +** pointing. "amt" bytes will be transferred into pBuf[]. The transfer ** begins at "offset". ** -** The caller must ensure that pCur is pointing to a valid row -** in the table. +** pCur can be pointing to either a table or an index b-tree. +** If pointing to a table btree, then the content section is read. If +** pCur is pointing to an index b-tree then the key section is read. +** +** For sqlite3BtreePayload(), the caller must ensure that pCur is pointing +** to a valid row in the table. For sqlite3BtreePayloadChecked(), the +** cursor might be invalid or might need to be restored before being read. ** ** Return SQLITE_OK on success or an error code if anything goes ** wrong. An error is returned if "offset+amt" is larger than ** the available payload. */ -int sqlite3BtreeKey(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ +int sqlite3BtreePayload(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ assert( cursorHoldsMutex(pCur) ); assert( pCur->eState==CURSOR_VALID ); assert( pCur->iPage>=0 && pCur->apPage[pCur->iPage] ); assert( pCur->aiIdx[pCur->iPage]apPage[pCur->iPage]->nCell ); return accessPayload(pCur, offset, amt, (unsigned char*)pBuf, 0); } - -/* -** Read part of the data associated with cursor pCur. Exactly -** "amt" bytes will be transfered into pBuf[]. The transfer -** begins at "offset". -** -** Return SQLITE_OK on success or an error code if anything goes -** wrong. An error is returned if "offset+amt" is larger than -** the available payload. -*/ -int sqlite3BtreeData(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ - int rc; - #ifndef SQLITE_OMIT_INCRBLOB +int sqlite3BtreePayloadChecked(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ + int rc; if ( pCur->eState==CURSOR_INVALID ){ return SQLITE_ABORT; } -#endif - assert( cursorOwnsBtShared(pCur) ); rc = restoreCursorPosition(pCur); if( rc==SQLITE_OK ){ @@ -4687,6 +4684,7 @@ int sqlite3BtreeData(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ } return rc; } +#endif /* SQLITE_OMIT_INCRBLOB */ /* ** Return a pointer to payload information from the entry that the @@ -4857,9 +4855,12 @@ static int moveToRoot(BtCursor *pCur){ } if( pCur->iPage>=0 ){ - while( pCur->iPage ){ - assert( pCur->apPage[pCur->iPage]!=0 ); - releasePageNotNull(pCur->apPage[pCur->iPage--]); + if( pCur->iPage ){ + do{ + assert( pCur->apPage[pCur->iPage]!=0 ); + releasePageNotNull(pCur->apPage[pCur->iPage--]); + }while( pCur->iPage); + goto skip_init; } }else if( pCur->pgnoRoot==0 ){ pCur->eState = CURSOR_INVALID; @@ -4870,7 +4871,7 @@ static int moveToRoot(BtCursor *pCur){ 0, pCur->curPagerFlags); if( rc!=SQLITE_OK ){ pCur->eState = CURSOR_INVALID; - return rc; + return rc; } pCur->iPage = 0; pCur->curIntKey = pCur->apPage[0]->intKey; @@ -4893,10 +4894,12 @@ static int moveToRoot(BtCursor *pCur){ return SQLITE_CORRUPT_BKPT; } +skip_init: pCur->aiIdx[0] = 0; pCur->info.nSize = 0; pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidNKey|BTCF_ValidOvfl); + pRoot = pCur->apPage[0]; if( pRoot->nCell>0 ){ pCur->eState = CURSOR_VALID; }else if( !pRoot->leaf ){ @@ -5153,16 +5156,16 @@ int sqlite3BtreeMovetoUnpacked( if( lwr>upr ){ c = +1; break; } }else{ assert( nCellKey==intKey ); - pCur->curFlags |= BTCF_ValidNKey; - pCur->info.nKey = nCellKey; pCur->aiIdx[pCur->iPage] = (u16)idx; if( !pPage->leaf ){ lwr = idx; goto moveto_next_layer; }else{ + pCur->curFlags |= BTCF_ValidNKey; + pCur->info.nKey = nCellKey; + pCur->info.nSize = 0; *pRes = 0; - rc = SQLITE_OK; - goto moveto_finish; + return SQLITE_OK; } } assert( lwr+upr>=0 ); @@ -5273,7 +5276,7 @@ int sqlite3BtreeMovetoUnpacked( } moveto_finish: pCur->info.nSize = 0; - pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); + assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); return rc; } @@ -5471,7 +5474,7 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur, int *pRes){ moveToParent(pCur); } assert( pCur->info.nSize==0 ); - assert( (pCur->curFlags & (BTCF_ValidNKey|BTCF_ValidOvfl))==0 ); + assert( (pCur->curFlags & (BTCF_ValidOvfl))==0 ); pCur->aiIdx[pCur->iPage]--; pPage = pCur->apPage[pCur->iPage]; @@ -5987,30 +5990,28 @@ static void freePage(MemPage *pPage, int *pRC){ static int clearCell( MemPage *pPage, /* The page that contains the Cell */ unsigned char *pCell, /* First byte of the Cell */ - u16 *pnSize /* Write the size of the Cell here */ + CellInfo *pInfo /* Size information about the cell */ ){ BtShared *pBt = pPage->pBt; - CellInfo info; Pgno ovflPgno; int rc; int nOvfl; u32 ovflPageSize; assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - pPage->xParseCell(pPage, pCell, &info); - *pnSize = info.nSize; - if( info.nLocal==info.nPayload ){ + pPage->xParseCell(pPage, pCell, pInfo); + if( pInfo->nLocal==pInfo->nPayload ){ return SQLITE_OK; /* No overflow pages. Return without doing anything */ } - if( pCell+info.nSize-1 > pPage->aData+pPage->maskPage ){ + if( pCell+pInfo->nSize-1 > pPage->aData+pPage->maskPage ){ return SQLITE_CORRUPT_BKPT; /* Cell extends past end of page */ } - ovflPgno = get4byte(pCell + info.nSize - 4); + ovflPgno = get4byte(pCell + pInfo->nSize - 4); assert( pBt->usableSize > 4 ); ovflPageSize = pBt->usableSize - 4; - nOvfl = (info.nPayload - info.nLocal + ovflPageSize - 1)/ovflPageSize; + nOvfl = (pInfo->nPayload - pInfo->nLocal + ovflPageSize - 1)/ovflPageSize; assert( nOvfl>0 || - (CORRUPT_DB && (info.nPayload + ovflPageSize)nPayload + ovflPageSize)=0 && idxnCell ); assert( CORRUPT_DB || sz==cellSize(pPage, idx) ); assert( sqlite3PagerIswriteable(pPage->pDbPage) ); @@ -6334,7 +6334,10 @@ static void insertCell( put4byte(pCell, iChild); } j = pPage->nOverflow++; - assert( j<(int)(sizeof(pPage->apOvfl)/sizeof(pPage->apOvfl[0])) ); + /* Comparison against ArraySize-1 since we hold back one extra slot + ** as a contingency. In other words, never need more than 3 overflow + ** slots but 4 are allocated, just to be safe. */ + assert( j < ArraySize(pPage->apOvfl)-1 ); pPage->apOvfl[j] = pCell; pPage->aiOvfl[j] = (u16)i; @@ -7074,7 +7077,7 @@ static int balance_nonroot( nMaxCells += 1+apOld[i]->nCell+apOld[i]->nOverflow; if( (i--)==0 ) break; - if( i+nxDiv==pParent->aiOvfl[0] && pParent->nOverflow ){ + if( pParent->nOverflow && i+nxDiv==pParent->aiOvfl[0] ){ apDiv[i] = pParent->apOvfl[0]; pgno = get4byte(apDiv[i]); szNew[i] = pParent->xCellSize(pParent, apDiv[i]); @@ -7928,17 +7931,19 @@ static int balance(BtCursor *pCur){ ** pX.pData,nData,nZero fields must be zero. ** ** If the seekResult parameter is non-zero, then a successful call to -** MovetoUnpacked() to seek cursor pCur to (pKey, nKey) has already -** been performed. seekResult is the search result returned (a negative -** number if pCur points at an entry that is smaller than (pKey, nKey), or -** a positive value if pCur points at an entry that is larger than -** (pKey, nKey)). -** -** If the seekResult parameter is non-zero, then the caller guarantees that -** cursor pCur is pointing at the existing copy of a row that is to be -** overwritten. If the seekResult parameter is 0, then cursor pCur may -** point to any entry or to no entry at all and so this function has to seek -** the cursor before the new key can be inserted. +** MovetoUnpacked() to seek cursor pCur to (pKey,nKey) has already +** been performed. In other words, if seekResult!=0 then the cursor +** is currently pointing to a cell that will be adjacent to the cell +** to be inserted. If seekResult<0 then pCur points to a cell that is +** smaller then (pKey,nKey). If seekResult>0 then pCur points to a cell +** that is larger than (pKey,nKey). +** +** If seekResult==0, that means pCur is pointing at some unknown location. +** In that case, this routine must seek the cursor to the correct insertion +** point for (pKey,nKey) before doing the insertion. For index btrees, +** if pX->nMem is non-zero, then pX->aMem contains pointers to the unpacked +** key values and pX->aMem can be used instead of pX->pKey to avoid having +** to decode the key. */ int sqlite3BtreeInsert( BtCursor *pCur, /* Insert data into the table of this cursor */ @@ -7999,15 +8004,30 @@ int sqlite3BtreeInsert( /* If the cursor is currently on the last row and we are appending a ** new row onto the end, set the "loc" to avoid an unnecessary ** btreeMoveto() call */ - if( (pCur->curFlags&BTCF_ValidNKey)!=0 && pX->nKey>0 - && pCur->info.nKey==pX->nKey-1 ){ - loc = -1; + if( (pCur->curFlags&BTCF_ValidNKey)!=0 && pX->nKey==pCur->info.nKey ){ + loc = 0; + }else if( (pCur->curFlags&BTCF_ValidNKey)!=0 && pX->nKey>0 + && pCur->info.nKey==pX->nKey-1 ){ + loc = -1; }else if( loc==0 ){ rc = sqlite3BtreeMovetoUnpacked(pCur, 0, pX->nKey, appendBias, &loc); if( rc ) return rc; } }else if( loc==0 ){ - rc = btreeMoveto(pCur, pX->pKey, pX->nKey, appendBias, &loc); + if( pX->nMem ){ + UnpackedRecord r; + r.pKeyInfo = pCur->pKeyInfo; + r.aMem = pX->aMem; + r.nField = pX->nMem; + r.default_rc = 0; + r.errCode = 0; + r.r1 = 0; + r.r2 = 0; + r.eqSeen = 0; + rc = sqlite3BtreeMovetoUnpacked(pCur, &r, 0, appendBias, &loc); + }else{ + rc = btreeMoveto(pCur, pX->pKey, pX->nKey, appendBias, &loc); + } if( rc ) return rc; } assert( pCur->eState==CURSOR_VALID || (pCur->eState==CURSOR_INVALID && loc) ); @@ -8028,7 +8048,7 @@ int sqlite3BtreeInsert( assert( szNew <= MX_CELL_SIZE(pBt) ); idx = pCur->aiIdx[pCur->iPage]; if( loc==0 ){ - u16 szOld; + CellInfo info; assert( idxnCell ); rc = sqlite3PagerWrite(pPage->pDbPage); if( rc ){ @@ -8038,8 +8058,19 @@ int sqlite3BtreeInsert( if( !pPage->leaf ){ memcpy(newCell, oldCell, 4); } - rc = clearCell(pPage, oldCell, &szOld); - dropCell(pPage, idx, szOld, &rc); + rc = clearCell(pPage, oldCell, &info); + if( info.nSize==szNew && info.nLocal==info.nPayload ){ + /* Overwrite the old cell with the new if they are the same size. + ** We could also try to do this if the old cell is smaller, then add + ** the leftover space to the free list. But experiments show that + ** doing that is no faster then skipping this optimization and just + ** calling dropCell() and insertCell(). */ + assert( rc==SQLITE_OK ); /* clearCell never fails when nLocal==nPayload */ + if( oldCell+szNew > pPage->aDataEnd ) return SQLITE_CORRUPT_BKPT; + memcpy(oldCell, newCell, szNew); + return SQLITE_OK; + } + dropCell(pPage, idx, info.nSize, &rc); if( rc ) goto end_insert; }else if( loc<0 && pPage->nCell>0 ){ assert( pPage->leaf ); @@ -8115,7 +8146,7 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ unsigned char *pCell; /* Pointer to cell to delete */ int iCellIdx; /* Index of cell to delete */ int iCellDepth; /* Depth of node containing pCell */ - u16 szCell; /* Size of the cell being deleted */ + CellInfo info; /* Size of the cell being deleted */ int bSkipnext = 0; /* Leaf cursor in SKIPNEXT state */ u8 bPreserve = flags & BTREE_SAVEPOSITION; /* Keep cursor valid */ @@ -8187,8 +8218,8 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ ** itself from within the page. */ rc = sqlite3PagerWrite(pPage->pDbPage); if( rc ) return rc; - rc = clearCell(pPage, pCell, &szCell); - dropCell(pPage, iCellIdx, szCell, &rc); + rc = clearCell(pPage, pCell, &info); + dropCell(pPage, iCellIdx, info.nSize, &rc); if( rc ) return rc; /* If the cell deleted was not located on a leaf page, then the cursor @@ -8438,7 +8469,7 @@ static int clearDatabasePage( unsigned char *pCell; int i; int hdr; - u16 szCell; + CellInfo info; assert( sqlite3_mutex_held(pBt->mutex) ); if( pgno>btreePagecount(pBt) ){ @@ -8458,7 +8489,7 @@ static int clearDatabasePage( rc = clearDatabasePage(pBt, get4byte(pCell), 1, pnChange); if( rc ) goto cleardatabasepage_out; } - rc = clearCell(pPage, pCell, &szCell); + rc = clearCell(pPage, pCell, &info); if( rc ) goto cleardatabasepage_out; } if( !pPage->leaf ){ @@ -8549,27 +8580,7 @@ static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){ assert( sqlite3BtreeHoldsMutex(p) ); assert( p->inTrans==TRANS_WRITE ); - - /* It is illegal to drop a table if any cursors are open on the - ** database. This is because in auto-vacuum mode the backend may - ** need to move another root-page to fill a gap left by the deleted - ** root page. If an open cursor was using this page a problem would - ** occur. - ** - ** This error is caught long before control reaches this point. - */ - if( NEVER(pBt->pCursor) ){ - sqlite3ConnectionBlocked(p->db, pBt->pCursor->pBtree->db); - return SQLITE_LOCKED_SHAREDCACHE; - } - - /* - ** It is illegal to drop the sqlite_master table on page 1. But again, - ** this error is caught long before reaching this point. - */ - if( NEVER(iTable<2) ){ - return SQLITE_CORRUPT_BKPT; - } + assert( iTable>=2 ); rc = btreeGetPage(pBt, (Pgno)iTable, &pPage, 0); if( rc ) return rc; @@ -9477,7 +9488,7 @@ int sqlite3BtreeCheckpoint(Btree *p, int eMode, int *pnLog, int *pnCkpt){ if( pBt->inTransaction!=TRANS_NONE ){ rc = SQLITE_LOCKED; }else{ - rc = sqlite3PagerCheckpoint(pBt->pPager, eMode, pnLog, pnCkpt); + rc = sqlite3PagerCheckpoint(pBt->pPager, p->db, eMode, pnLog, pnCkpt); } sqlite3BtreeLeave(p); } diff --git a/sqlite/src/btree.h b/sqlite/src/btree.h index 0df98a3a..5e54125d 100644 --- a/sqlite/src/btree.h +++ b/sqlite/src/btree.h @@ -275,6 +275,8 @@ struct BtreePayload { const void *pKey; /* Key content for indexes. NULL for tables */ sqlite3_int64 nKey; /* Size of pKey for indexes. PRIMARY KEY for tabs */ const void *pData; /* Data for tables. NULL for indexes */ + struct Mem *aMem; /* First of nMem value in the unpacked pKey */ + u16 nMem; /* Number of aMem[] value. Might be zero */ int nData; /* Size of pData. 0 if none. */ int nZero; /* Extra zero data appended after pData,nData */ }; @@ -287,15 +289,15 @@ int sqlite3BtreeNext(BtCursor*, int *pRes); int sqlite3BtreeEof(BtCursor*); int sqlite3BtreePrevious(BtCursor*, int *pRes); i64 sqlite3BtreeIntegerKey(BtCursor*); -int sqlite3BtreeKey(BtCursor*, u32 offset, u32 amt, void*); +int sqlite3BtreePayload(BtCursor*, u32 offset, u32 amt, void*); const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt); u32 sqlite3BtreePayloadSize(BtCursor*); -int sqlite3BtreeData(BtCursor*, u32 offset, u32 amt, void*); char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*); struct Pager *sqlite3BtreePager(Btree*); #ifndef SQLITE_OMIT_INCRBLOB +int sqlite3BtreePayloadChecked(BtCursor*, u32 offset, u32 amt, void*); int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*); void sqlite3BtreeIncrblobCursor(BtCursor *); #endif @@ -308,6 +310,7 @@ int sqlite3HeaderSizeBtree(void); #ifndef NDEBUG int sqlite3BtreeCursorIsValid(BtCursor*); #endif +int sqlite3BtreeCursorIsValidNN(BtCursor*); #ifndef SQLITE_OMIT_BTREECOUNT int sqlite3BtreeCount(BtCursor *, i64 *); diff --git a/sqlite/src/btreeInt.h b/sqlite/src/btreeInt.h index 6cd09025..fc2182b6 100644 --- a/sqlite/src/btreeInt.h +++ b/sqlite/src/btreeInt.h @@ -259,37 +259,39 @@ typedef struct CellInfo CellInfo; #define PTF_LEAF 0x08 /* -** As each page of the file is loaded into memory, an instance of the following -** structure is appended and initialized to zero. This structure stores -** information about the page that is decoded from the raw file page. +** An instance of this object stores information about each a single database +** page that has been loaded into memory. The information in this object +** is derived from the raw on-disk page content. ** -** The pParent field points back to the parent page. This allows us to -** walk up the BTree from any leaf to the root. Care must be taken to -** unref() the parent page pointer when this page is no longer referenced. -** The pageDestructor() routine handles that chore. +** As each database page is loaded into memory, the pager allocats an +** instance of this object and zeros the first 8 bytes. (This is the +** "extra" information associated with each page of the pager.) ** ** Access to all fields of this structure is controlled by the mutex ** stored in MemPage.pBt->mutex. */ struct MemPage { u8 isInit; /* True if previously initialized. MUST BE FIRST! */ - u8 nOverflow; /* Number of overflow cell bodies in aCell[] */ + u8 bBusy; /* Prevent endless loops on corrupt database files */ u8 intKey; /* True if table b-trees. False for index b-trees */ u8 intKeyLeaf; /* True if the leaf of an intKey table */ + Pgno pgno; /* Page number for this page */ + /* Only the first 8 bytes (above) are zeroed by pager.c when a new page + ** is allocated. All fields that follow must be initialized before use */ u8 leaf; /* True if a leaf page */ u8 hdrOffset; /* 100 for page 1. 0 otherwise */ u8 childPtrSize; /* 0 if leaf==1. 4 if leaf==0 */ u8 max1bytePayload; /* min(maxLocal,127) */ - u8 bBusy; /* Prevent endless loops on corrupt database files */ + u8 nOverflow; /* Number of overflow cell bodies in aCell[] */ u16 maxLocal; /* Copy of BtShared.maxLocal or BtShared.maxLeaf */ u16 minLocal; /* Copy of BtShared.minLocal or BtShared.minLeaf */ u16 cellOffset; /* Index in aData of first cell pointer */ u16 nFree; /* Number of free bytes on the page */ u16 nCell; /* Number of cells on this page, local and ovfl */ u16 maskPage; /* Mask for page offset */ - u16 aiOvfl[5]; /* Insert the i-th overflow cell before the aiOvfl-th + u16 aiOvfl[4]; /* Insert the i-th overflow cell before the aiOvfl-th ** non-overflow cell */ - u8 *apOvfl[5]; /* Pointers to the body of overflow cells */ + u8 *apOvfl[4]; /* Pointers to the body of overflow cells */ BtShared *pBt; /* Pointer to BtShared that this page is part of */ u8 *aData; /* Pointer to disk image of the page data */ u8 *aDataEnd; /* One byte past the end of usable data */ @@ -298,16 +300,8 @@ struct MemPage { DbPage *pDbPage; /* Pager page handle */ u16 (*xCellSize)(MemPage*,u8*); /* cellSizePtr method */ void (*xParseCell)(MemPage*,u8*,CellInfo*); /* btreeParseCell method */ - Pgno pgno; /* Page number for this page */ }; -/* -** The in-memory image of a disk page has the auxiliary information appended -** to the end. EXTRA_SIZE is the number of bytes of space needed to hold -** that extra information. -*/ -#define EXTRA_SIZE sizeof(MemPage) - /* ** A linked list of the following structures is stored at BtShared.pLock. ** Locks are added (or upgraded from READ_LOCK to WRITE_LOCK) when a cursor diff --git a/sqlite/src/build.c b/sqlite/src/build.c index 508e747e..cd9c81be 100644 --- a/sqlite/src/build.c +++ b/sqlite/src/build.c @@ -30,10 +30,10 @@ ** codeTableLocks() functions. */ struct TableLock { - int iDb; /* The database containing the table to be locked */ - int iTab; /* The root page of the table to be locked */ - u8 isWriteLock; /* True for write lock. False for a read lock */ - const char *zName; /* Name of the table */ + int iDb; /* The database containing the table to be locked */ + int iTab; /* The root page of the table to be locked */ + u8 isWriteLock; /* True for write lock. False for a read lock */ + const char *zLockName; /* Name of the table */ }; /* @@ -59,6 +59,8 @@ void sqlite3TableLock( TableLock *p; assert( iDb>=0 ); + if( iDb==1 ) return; + if( !sqlite3BtreeSharable(pParse->db->aDb[iDb].pBt) ) return; for(i=0; inTableLock; i++){ p = &pToplevel->aTableLock[i]; if( p->iDb==iDb && p->iTab==iTab ){ @@ -75,7 +77,7 @@ void sqlite3TableLock( p->iDb = iDb; p->iTab = iTab; p->isWriteLock = isWriteLock; - p->zName = zName; + p->zLockName = zName; }else{ pToplevel->nTableLock = 0; sqlite3OomFault(pToplevel->db); @@ -97,7 +99,7 @@ static void codeTableLocks(Parse *pParse){ TableLock *p = &pParse->aTableLock[i]; int p1 = p->iDb; sqlite3VdbeAddOp4(pVdbe, OP_TableLock, p1, p->iTab, p->isWriteLock, - p->zName, P4_STATIC); + p->zLockName, P4_STATIC); } } #else @@ -306,15 +308,22 @@ Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){ return 0; } #endif - for(i=OMIT_TEMPDB; inDb; i++){ - int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ - if( zDatabase==0 || sqlite3StrICmp(zDatabase, db->aDb[j].zDbSName)==0 ){ - assert( sqlite3SchemaMutexHeld(db, j, 0) ); - p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName); - if( p ) break; + while(1){ + for(i=OMIT_TEMPDB; inDb; i++){ + int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ + if( zDatabase==0 || sqlite3StrICmp(zDatabase, db->aDb[j].zDbSName)==0 ){ + assert( sqlite3SchemaMutexHeld(db, j, 0) ); + p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName); + if( p ) return p; + } } + /* Not found. If the name we were looking for was temp.sqlite_master + ** then change the name to sqlite_temp_master and try again. */ + if( sqlite3StrICmp(zName, MASTER_NAME)!=0 ) break; + if( sqlite3_stricmp(zDatabase, db->aDb[1].zDbSName)!=0 ) break; + zName = TEMP_MASTER_NAME; } - return p; + return 0; } /* @@ -350,6 +359,9 @@ Table *sqlite3LocateTable( ** 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(&pParse->db->aModule, zName); + if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){ + pMod = sqlite3PragmaVtabRegister(pParse->db, zName); + } if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){ return pMod->pEpoTab; } @@ -632,7 +644,7 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){ void sqlite3DeleteTable(sqlite3 *db, Table *pTable){ /* Do not delete the table until the reference count reaches zero. */ if( !pTable ) return; - if( ((!db || db->pnBytesFreed==0) && (--pTable->nRef)>0) ) return; + if( ((!db || db->pnBytesFreed==0) && (--pTable->nTabRef)>0) ) return; deleteTable(db, pTable); } @@ -686,7 +698,7 @@ char *sqlite3NameFromToken(sqlite3 *db, Token *pName){ */ void sqlite3OpenMasterTable(Parse *p, int iDb){ Vdbe *v = sqlite3GetVdbe(p); - sqlite3TableLock(p, iDb, MASTER_ROOT, 1, SCHEMA_TABLE(iDb)); + sqlite3TableLock(p, iDb, MASTER_ROOT, 1, MASTER_NAME); sqlite3VdbeAddOp4Int(v, OP_OpenWrite, 0, MASTER_ROOT, iDb, 5); if( p->nTab==0 ){ p->nTab = 1; @@ -704,7 +716,10 @@ int sqlite3FindDbName(sqlite3 *db, const char *zName){ if( zName ){ Db *pDb; for(i=(db->nDb-1), pDb=&db->aDb[i]; i>=0; i--, pDb--){ - if( 0==sqlite3StrICmp(pDb->zDbSName, zName) ) break; + if( 0==sqlite3_stricmp(pDb->zDbSName, zName) ) break; + /* "main" is always an acceptable alias for the primary database + ** even if it has been renamed using SQLITE_DBCONFIG_MAINDBNAME. */ + if( i==0 && 0==sqlite3_stricmp("main", zName) ) break; } } return i; @@ -923,7 +938,7 @@ void sqlite3StartTable( pTable->zName = zName; pTable->iPKey = -1; pTable->pSchema = db->aDb[iDb].pSchema; - pTable->nRef = 1; + pTable->nTabRef = 1; pTable->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); assert( pParse->pNewTable==0 ); pParse->pNewTable = pTable; @@ -1989,7 +2004,7 @@ void sqlite3EndTable( "UPDATE %Q.%s " "SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q " "WHERE rowid=#%d", - db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), + db->aDb[iDb].zDbSName, MASTER_NAME, zType, p->zName, p->zName, @@ -2326,7 +2341,7 @@ static void destroyRootPage(Parse *pParse, int iTable, int iDb){ */ sqlite3NestedParse(pParse, "UPDATE %Q.%s SET rootpage=%d WHERE #%d AND rootpage=#%d", - pParse->db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), iTable, r1, r1); + pParse->db->aDb[iDb].zDbSName, MASTER_NAME, iTable, r1, r1); #endif sqlite3ReleaseTempReg(pParse, r1); } @@ -2469,7 +2484,7 @@ void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, int isView){ */ sqlite3NestedParse(pParse, "DELETE FROM %Q.%s WHERE tbl_name=%Q and type!='trigger'", - pDb->zDbSName, SCHEMA_TABLE(iDb), pTab->zName); + pDb->zDbSName, MASTER_NAME, pTab->zName); if( !isView && !IsVirtual(pTab) ){ destroyTable(pParse, pTab); } @@ -2816,7 +2831,7 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ } sqlite3VdbeAddOp3(v, OP_SorterData, iSorter, regRecord, iIdx); sqlite3VdbeAddOp3(v, OP_Last, iIdx, 0, -1); - sqlite3VdbeAddOp3(v, OP_IdxInsert, iIdx, regRecord, 0); + sqlite3VdbeAddOp2(v, OP_IdxInsert, iIdx, regRecord); sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); sqlite3ReleaseTempReg(pParse, regRecord); sqlite3VdbeAddOp2(v, OP_SorterNext, iSorter, addr2); VdbeCoverage(v); @@ -3361,7 +3376,7 @@ void sqlite3CreateIndex( */ sqlite3NestedParse(pParse, "INSERT INTO %Q.%s VALUES('index',%Q,%Q,#%d,%Q);", - db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), + db->aDb[iDb].zDbSName, MASTER_NAME, pIndex->zName, pTab->zName, iMem, @@ -3513,7 +3528,7 @@ void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists){ sqlite3BeginWriteOperation(pParse, 1, iDb); sqlite3NestedParse(pParse, "DELETE FROM %Q.%s WHERE name=%Q AND type='index'", - db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), pIndex->zName + db->aDb[iDb].zDbSName, MASTER_NAME, pIndex->zName ); sqlite3ClearStatTables(pParse, iDb, "idx", pIndex->zName); sqlite3ChangeCookie(pParse, iDb); @@ -3656,7 +3671,7 @@ SrcList *sqlite3SrcListEnlarge( /* Allocate additional space if needed */ if( (u32)pSrc->nSrc+nExtra>pSrc->nAlloc ){ SrcList *pNew; - int nAlloc = pSrc->nSrc+nExtra; + int nAlloc = pSrc->nSrc*2+nExtra; int nGot; pNew = sqlite3DbRealloc(db, pSrc, sizeof(*pSrc) + (nAlloc-1)*sizeof(pSrc->a[0]) ); @@ -3734,9 +3749,12 @@ SrcList *sqlite3SrcListAppend( pList = sqlite3DbMallocRawNN(db, sizeof(SrcList) ); if( pList==0 ) return 0; pList->nAlloc = 1; - pList->nSrc = 0; + 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); } - pList = sqlite3SrcListEnlarge(db, pList, 1, pList->nSrc); if( db->mallocFailed ){ sqlite3SrcListDelete(db, pList); return 0; diff --git a/sqlite/src/ctime.c b/sqlite/src/ctime.c index 09587ea8..969bbc73 100644 --- a/sqlite/src/ctime.c +++ b/sqlite/src/ctime.c @@ -66,6 +66,9 @@ static const char * const azCompileOpt[] = { #if defined(SQLITE_DEFAULT_MMAP_SIZE) && !defined(SQLITE_DEFAULT_MMAP_SIZE_xc) "DEFAULT_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_MMAP_SIZE), #endif +#if SQLITE_DIRECT_OVERFLOW_READ + "DIRECT_OVERFLOW_READ", +#endif #if SQLITE_DISABLE_DIRSYNC "DISABLE_DIRSYNC", #endif @@ -152,6 +155,9 @@ static const char * const azCompileOpt[] = { #if SQLITE_ENABLE_UPDATE_DELETE_LIMIT "ENABLE_UPDATE_DELETE_LIMIT", #endif +#if defined(SQLITE_ENABLE_URI_00_ERROR) + "ENABLE_URI_00_ERROR", +#endif #if SQLITE_HAS_CODEC "HAS_CODEC", #endif @@ -227,9 +233,6 @@ static const char * const azCompileOpt[] = { #if SQLITE_OMIT_BTREECOUNT "OMIT_BTREECOUNT", #endif -#if SQLITE_OMIT_BUILTIN_TEST - "OMIT_BUILTIN_TEST", -#endif #if SQLITE_OMIT_CAST "OMIT_CAST", #endif @@ -392,6 +395,9 @@ static const char * const azCompileOpt[] = { #if defined(SQLITE_THREADSAFE) "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE), #endif +#if SQLITE_UNTESTABLE + "UNTESTABLE" +#endif #if SQLITE_USE_ALLOCA "USE_ALLOCA", #endif diff --git a/sqlite/src/date.c b/sqlite/src/date.c index 8b2f2fa7..a08248ce 100644 --- a/sqlite/src/date.c +++ b/sqlite/src/date.c @@ -65,16 +65,18 @@ struct tm *__cdecl localtime(const time_t *); */ typedef struct DateTime DateTime; struct DateTime { - sqlite3_int64 iJD; /* The julian day number times 86400000 */ - int Y, M, D; /* Year, month, and day */ - int h, m; /* Hour and minutes */ - int tz; /* Timezone offset in minutes */ - double s; /* Seconds */ - char validYMD; /* True (1) if Y,M,D are valid */ - char validHMS; /* True (1) if h,m,s are valid */ - char validJD; /* True (1) if iJD is valid */ - char validTZ; /* True (1) if tz is valid */ - char tzSet; /* Timezone was set explicitly */ + sqlite3_int64 iJD; /* The julian day number times 86400000 */ + int Y, M, D; /* Year, month, and day */ + int h, m; /* Hour and minutes */ + int tz; /* Timezone offset in minutes */ + double s; /* Seconds */ + char validJD; /* True (1) if iJD is valid */ + char rawS; /* Raw numeric value stored in s */ + char validYMD; /* True (1) if Y,M,D are valid */ + char validHMS; /* True (1) if h,m,s are valid */ + char validTZ; /* True (1) if tz is valid */ + char tzSet; /* Timezone was set explicitly */ + char isError; /* An overflow has occurred */ }; @@ -222,6 +224,7 @@ static int parseHhMmSs(const char *zDate, DateTime *p){ s = 0; } p->validJD = 0; + p->rawS = 0; p->validHMS = 1; p->h = h; p->m = m; @@ -231,6 +234,14 @@ static int parseHhMmSs(const char *zDate, DateTime *p){ return 0; } +/* +** Put the DateTime object into its error state. +*/ +static void datetimeError(DateTime *p){ + memset(p, 0, sizeof(*p)); + p->isError = 1; +} + /* ** Convert from YYYY-MM-DD HH:MM:SS to julian day. We always assume ** that the YYYY-MM-DD is according to the Gregorian calendar. @@ -250,6 +261,10 @@ static void computeJD(DateTime *p){ M = 1; D = 1; } + if( Y<-4713 || Y>9999 || p->rawS ){ + datetimeError(p); + return; + } if( M<=2 ){ Y--; M += 12; @@ -330,6 +345,21 @@ static int setDateTimeToCurrent(sqlite3_context *context, DateTime *p){ } } +/* +** Input "r" is a numeric quantity which might be a julian day number, +** or the number of seconds since 1970. If the value if r is within +** range of a julian day number, install it as such and set validJD. +** If the value is a valid unix timestamp, put it in p->s and set p->rawS. +*/ +static void setRawDateNumber(DateTime *p, double r){ + p->s = r; + p->rawS = 1; + if( r>=0.0 && r<5373484.5 ){ + p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5); + p->validJD = 1; + } +} + /* ** Attempt to parse the given string into a julian day number. Return ** the number of errors. @@ -359,13 +389,30 @@ static int parseDateOrTime( }else if( sqlite3StrICmp(zDate,"now")==0){ return setDateTimeToCurrent(context, p); }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8) ){ - p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5); - p->validJD = 1; + setRawDateNumber(p, r); return 0; } return 1; } +/* The julian day number for 9999-12-31 23:59:59.999 is 5373484.4999999. +** Multiplying this by 86400000 gives 464269060799999 as the maximum value +** for DateTime.iJD. +** +** But some older compilers (ex: gcc 4.2.1 on older Macs) cannot deal with +** such a large integer literal, so we have to encode it. +*/ +#define INT_464269060799999 ((((i64)0x1a640)<<32)|0x1072fdff) + +/* +** Return TRUE if the given julian day number is within range. +** +** The input is the JulianDay times 86400000. +*/ +static int validJulianDay(sqlite3_int64 iJD){ + return iJD>=0 && iJD<=INT_464269060799999; +} + /* ** Compute the Year, Month, and Day from the julian day number. */ @@ -377,6 +424,7 @@ static void computeYMD(DateTime *p){ p->M = 1; p->D = 1; }else{ + assert( validJulianDay(p->iJD) ); Z = (int)((p->iJD + 43200000)/86400000); A = (int)((Z - 1867216.25)/36524.25); A = Z + 1 + A - (A/4); @@ -407,6 +455,7 @@ static void computeHMS(DateTime *p){ s -= p->h*3600; p->m = s/60; p->s += s - p->m*60; + p->rawS = 0; p->validHMS = 1; } @@ -468,14 +517,14 @@ static int osLocaltime(time_t *t, struct tm *pTm){ #endif sqlite3_mutex_enter(mutex); pX = localtime(t); -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE if( sqlite3GlobalConfig.bLocaltimeFault ) pX = 0; #endif if( pX ) *pTm = *pX; sqlite3_mutex_leave(mutex); rc = pX==0; #else -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE if( sqlite3GlobalConfig.bLocaltimeFault ) return 1; #endif #if HAVE_LOCALTIME_R @@ -546,13 +595,38 @@ static sqlite3_int64 localtimeOffset( y.validYMD = 1; y.validHMS = 1; y.validJD = 0; + y.rawS = 0; y.validTZ = 0; + y.isError = 0; computeJD(&y); *pRc = SQLITE_OK; return y.iJD - x.iJD; } #endif /* SQLITE_OMIT_LOCALTIME */ +/* +** The following table defines various date transformations of the form +** +** 'NNN days' +** +** Where NNN is an arbitrary floating-point number and "days" can be one +** of several units of time. +*/ +static const struct { + u8 eType; /* Transformation type code */ + u8 nName; /* Length of th name */ + char *zName; /* Name of the transformation */ + double rLimit; /* Maximum NNN value for this transform */ + double rXform; /* Constant used for this transform */ +} aXformType[] = { + { 0, 6, "second", 464269060800.0, 86400000.0/(24.0*60.0*60.0) }, + { 0, 6, "minute", 7737817680.0, 86400000.0/(24.0*60.0) }, + { 0, 4, "hour", 128963628.0, 86400000.0/24.0 }, + { 0, 3, "day", 5373485.0, 86400000.0 }, + { 1, 5, "month", 176546.0, 30.0*86400000.0 }, + { 2, 4, "year", 14713.0, 365.0*86400000.0 }, +}; + /* ** Process a modifier to a date-time stamp. The modifiers are ** as follows: @@ -577,17 +651,15 @@ static sqlite3_int64 localtimeOffset( ** to context pCtx. If the error is an unrecognized modifier, no error is ** written to pCtx. */ -static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){ +static int parseModifier( + sqlite3_context *pCtx, /* Function context */ + const char *z, /* The text of the modifier */ + int n, /* Length of zMod in bytes */ + DateTime *p /* The date/time value to be modified */ +){ int rc = 1; - int n; double r; - char *z, zBuf[30]; - z = zBuf; - for(n=0; niJD += localtimeOffset(p, pCtx, &rc); clearYMD_HMS_TZ(p); @@ -607,16 +679,21 @@ static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){ /* ** unixepoch ** - ** Treat the current value of p->iJD as the number of + ** Treat the current value of p->s as the number of ** seconds since 1970. Convert to a real julian day number. */ - if( strcmp(z, "unixepoch")==0 && p->validJD ){ - p->iJD = (p->iJD + 43200)/86400 + 21086676*(i64)10000000; - clearYMD_HMS_TZ(p); - rc = 0; + if( sqlite3_stricmp(z, "unixepoch")==0 && p->rawS ){ + r = p->s*1000.0 + 210866760000000.0; + if( r>=0.0 && r<464269060800000.0 ){ + clearYMD_HMS_TZ(p); + p->iJD = (sqlite3_int64)r; + p->validJD = 1; + p->rawS = 0; + rc = 0; + } } #ifndef SQLITE_OMIT_LOCALTIME - else if( strcmp(z, "utc")==0 ){ + else if( sqlite3_stricmp(z, "utc")==0 ){ if( p->tzSet==0 ){ sqlite3_int64 c1; computeJD(p); @@ -642,7 +719,7 @@ static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){ ** weekday N where 0==Sunday, 1==Monday, and so forth. If the ** date is already on the appropriate weekday, this is a no-op. */ - if( strncmp(z, "weekday ", 8)==0 + if( sqlite3_strnicmp(z, "weekday ", 8)==0 && sqlite3AtoF(&z[8], &r, sqlite3Strlen30(&z[8]), SQLITE_UTF8) && (n=(int)r)==r && n>=0 && r<7 ){ sqlite3_int64 Z; @@ -665,7 +742,7 @@ static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){ ** Move the date backwards to the beginning of the current day, ** or month or year. */ - if( strncmp(z, "start of ", 9)!=0 ) break; + if( sqlite3_strnicmp(z, "start of ", 9)!=0 ) break; z += 9; computeYMD(p); p->validHMS = 1; @@ -673,15 +750,15 @@ static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){ p->s = 0.0; p->validTZ = 0; p->validJD = 0; - if( strcmp(z,"month")==0 ){ + if( sqlite3_stricmp(z,"month")==0 ){ p->D = 1; rc = 0; - }else if( strcmp(z,"year")==0 ){ + }else if( sqlite3_stricmp(z,"year")==0 ){ computeYMD(p); p->M = 1; p->D = 1; rc = 0; - }else if( strcmp(z,"day")==0 ){ + }else if( sqlite3_stricmp(z,"day")==0 ){ rc = 0; } break; @@ -699,6 +776,7 @@ static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){ case '8': case '9': { double rRounder; + int i; for(n=1; z[n] && z[n]!=':' && !sqlite3Isspace(z[n]); n++){} if( !sqlite3AtoF(z, &r, n, SQLITE_UTF8) ){ rc = 1; @@ -727,46 +805,48 @@ static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){ rc = 0; break; } + + /* If control reaches this point, it means the transformation is + ** one of the forms like "+NNN days". */ z += n; while( sqlite3Isspace(*z) ) z++; n = sqlite3Strlen30(z); if( n>10 || n<3 ) break; - if( z[n-1]=='s' ){ z[n-1] = 0; n--; } + if( sqlite3UpperToLower[(u8)z[n-1]]=='s' ) n--; computeJD(p); - rc = 0; + rc = 1; rRounder = r<0 ? -0.5 : +0.5; - if( n==3 && strcmp(z,"day")==0 ){ - p->iJD += (sqlite3_int64)(r*86400000.0 + rRounder); - }else if( n==4 && strcmp(z,"hour")==0 ){ - p->iJD += (sqlite3_int64)(r*(86400000.0/24.0) + rRounder); - }else if( n==6 && strcmp(z,"minute")==0 ){ - p->iJD += (sqlite3_int64)(r*(86400000.0/(24.0*60.0)) + rRounder); - }else if( n==6 && strcmp(z,"second")==0 ){ - p->iJD += (sqlite3_int64)(r*(86400000.0/(24.0*60.0*60.0)) + rRounder); - }else if( n==5 && strcmp(z,"month")==0 ){ - int x, y; - computeYMD_HMS(p); - p->M += (int)r; - x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12; - p->Y += x; - p->M -= x*12; - p->validJD = 0; - computeJD(p); - y = (int)r; - if( y!=r ){ - p->iJD += (sqlite3_int64)((r - y)*30.0*86400000.0 + rRounder); - } - }else if( n==4 && strcmp(z,"year")==0 ){ - int y = (int)r; - computeYMD_HMS(p); - p->Y += y; - p->validJD = 0; - computeJD(p); - if( y!=r ){ - p->iJD += (sqlite3_int64)((r - y)*365.0*86400000.0 + rRounder); + for(i=0; i-aXformType[i].rLimit && rM += (int)r; + x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12; + p->Y += x; + p->M -= x*12; + p->validJD = 0; + r -= (int)r; + break; + } + case 2: { /* Special processing to add years */ + int y = (int)r; + computeYMD_HMS(p); + p->Y += y; + p->validJD = 0; + r -= (int)r; + break; + } + } + computeJD(p); + p->iJD += (sqlite3_int64)(r*aXformType[i].rXform + rRounder); + rc = 0; + break; } - }else{ - rc = 1; } clearYMD_HMS_TZ(p); break; @@ -793,7 +873,7 @@ static int isDate( sqlite3_value **argv, DateTime *p ){ - int i; + int i, n; const unsigned char *z; int eType; memset(p, 0, sizeof(*p)); @@ -802,8 +882,7 @@ static int isDate( } if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT || eType==SQLITE_INTEGER ){ - p->iJD = (sqlite3_int64)(sqlite3_value_double(argv[0])*86400000.0 + 0.5); - p->validJD = 1; + setRawDateNumber(p, sqlite3_value_double(argv[0])); }else{ z = sqlite3_value_text(argv[0]); if( !z || parseDateOrTime(context, (char*)z, p) ){ @@ -812,8 +891,11 @@ static int isDate( } for(i=1; iisError || !validJulianDay(p->iJD) ) return 1; return 0; } diff --git a/sqlite/src/delete.c b/sqlite/src/delete.c index ec857182..9ec8ed59 100644 --- a/sqlite/src/delete.c +++ b/sqlite/src/delete.c @@ -36,7 +36,7 @@ Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){ sqlite3DeleteTable(pParse->db, pItem->pTab); pItem->pTab = pTab; if( pTab ){ - pTab->nRef++; + pTab->nTabRef++; } if( sqlite3IndexedByLookup(pParse, pItem) ){ pTab = 0; @@ -164,7 +164,7 @@ Expr *sqlite3LimitWhere( ** ); */ - pSelectRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0, 0); + pSelectRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0); if( pSelectRowid == 0 ) goto limit_where_cleanup; pEList = sqlite3ExprListAppend(pParse, 0, pSelectRowid); if( pEList == 0 ) goto limit_where_cleanup; @@ -183,8 +183,8 @@ Expr *sqlite3LimitWhere( if( pSelect == 0 ) return 0; /* now generate the new WHERE rowid IN clause for the DELETE/UDPATE */ - pWhereRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0, 0); - pInClause = pWhereRowid ? sqlite3PExpr(pParse, TK_IN, pWhereRowid, 0, 0) : 0; + pWhereRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0); + pInClause = pWhereRowid ? sqlite3PExpr(pParse, TK_IN, pWhereRowid, 0) : 0; sqlite3PExprAddSelect(pParse, pInClause, pSelect); return pInClause; @@ -449,7 +449,7 @@ void sqlite3DeleteFrom( nKey = 0; /* Zero tells OP_Found to use a composite key */ sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, iKey, sqlite3IndexAffinityStr(pParse->db, pPk), nPk); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iEphCur, iKey); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iEphCur, iKey, iPk, nPk); }else{ /* Add the rowid of the row to be deleted to the RowSet */ nKey = 1; /* OP_Seek always uses a single rowid */ @@ -495,7 +495,7 @@ void sqlite3DeleteFrom( } }else if( pPk ){ addrLoop = sqlite3VdbeAddOp1(v, OP_Rewind, iEphCur); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_RowKey, iEphCur, iKey); + sqlite3VdbeAddOp2(v, OP_RowData, iEphCur, iKey); assert( nKey==0 ); /* OP_Found will use a composite key */ }else{ addrLoop = sqlite3VdbeAddOp3(v, OP_RowSetRead, iRowSet, 0, iKey); @@ -538,14 +538,6 @@ void sqlite3DeleteFrom( sqlite3VdbeGoto(v, addrLoop); sqlite3VdbeJumpHere(v, addrLoop); } - - /* Close the cursors open on the table and its indexes. */ - if( !isView && !IsVirtual(pTab) ){ - if( !pPk ) sqlite3VdbeAddOp1(v, OP_Close, iDataCur); - for(i=0, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ - sqlite3VdbeAddOp1(v, OP_Close, iIdxCur + i); - } - } } /* End non-truncate path */ /* Update the sqlite_sequence table by storing the content of the @@ -720,7 +712,7 @@ void sqlite3GenerateRowDelete( u8 p5 = 0; sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur,0,iIdxNoSeek); sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, (count?OPFLAG_NCHANGE:0)); - sqlite3VdbeChangeP4(v, -1, (char*)pTab, P4_TABLE); + sqlite3VdbeAppendP4(v, (char*)pTab, P4_TABLE); if( eMode!=ONEPASS_OFF ){ sqlite3VdbeChangeP5(v, OPFLAG_AUXDELETE); } diff --git a/sqlite/src/expr.c b/sqlite/src/expr.c index 75d0485d..6e615fe0 100644 --- a/sqlite/src/expr.c +++ b/sqlite/src/expr.c @@ -414,9 +414,10 @@ Expr *sqlite3ExprForVectorField( assert( pVector->flags & EP_xIsSelect ); /* The TK_SELECT_COLUMN Expr node: ** - ** pLeft: pVector containing TK_SELECT + ** pLeft: pVector containing TK_SELECT. Not deleted. ** pRight: not used. But recursively deleted. ** iColumn: Index of a column in pVector + ** iTable: 0 or the number of columns on the LHS of an assignment ** pLeft->iTable: First in an array of register holding result, or 0 ** if the result is not yet computed. ** @@ -427,7 +428,7 @@ Expr *sqlite3ExprForVectorField( ** with the same pLeft pointer to the pVector, but only one of them ** will own the pVector. */ - pRet = sqlite3PExpr(pParse, TK_SELECT_COLUMN, 0, 0, 0); + pRet = sqlite3PExpr(pParse, TK_SELECT_COLUMN, 0, 0); if( pRet ){ pRet->iColumn = iField; pRet->pLeft = pVector; @@ -527,7 +528,10 @@ static void codeVectorCompare( u8 opx = op; int addrDone = sqlite3VdbeMakeLabel(v); - assert( nLeft==sqlite3ExprVectorSize(pRight) ); + if( nLeft!=sqlite3ExprVectorSize(pRight) ){ + sqlite3ErrorMsg(pParse, "row value misused"); + return; + } assert( pExpr->op==TK_EQ || pExpr->op==TK_NE || pExpr->op==TK_IS || pExpr->op==TK_ISNOT || pExpr->op==TK_LT || pExpr->op==TK_GT @@ -819,15 +823,19 @@ Expr *sqlite3PExpr( Parse *pParse, /* Parsing context */ int op, /* Expression opcode */ Expr *pLeft, /* Left operand */ - Expr *pRight, /* Right operand */ - const Token *pToken /* Argument token */ + Expr *pRight /* Right operand */ ){ Expr *p; if( op==TK_AND && pParse->nErr==0 ){ /* Take advantage of short-circuit false optimization for AND */ p = sqlite3ExprAnd(pParse->db, pLeft, pRight); }else{ - p = sqlite3ExprAlloc(pParse->db, op & TKFLG_MASK, pToken, 1); + p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)); + if( p ){ + memset(p, 0, sizeof(Expr)); + p->op = op & TKFLG_MASK; + p->iAgg = -1; + } sqlite3ExprAttachSubtrees(pParse->db, p, pLeft, pRight); } if( p ) { @@ -930,7 +938,7 @@ Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token *pToken){ ** variable number. ** ** Wildcards of the form "?nnn" are assigned the number "nnn". We make -** sure "nnn" is not too be to avoid a denial of service attack when +** sure "nnn" is not too big to avoid a denial of service attack when ** the SQL statement comes from an external source. ** ** Wildcards of the form ":aaa", "@aaa", or "$aaa" are assigned the same number @@ -941,6 +949,7 @@ Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token *pToken){ void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n){ sqlite3 *db = pParse->db; const char *z; + ynVar x; if( pExpr==0 ) return; assert( !ExprHasProperty(pExpr, EP_IntValue|EP_Reduced|EP_TokenOnly) ); @@ -951,9 +960,9 @@ void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n){ if( z[1]==0 ){ /* Wildcard of the form "?". Assign the next variable number */ assert( z[0]=='?' ); - pExpr->iColumn = (ynVar)(++pParse->nVar); + x = (ynVar)(++pParse->nVar); }else{ - ynVar x; + int doAdd = 0; if( z[0]=='?' ){ /* Wildcard of the form "?nnn". Convert "nnn" to an integer and ** use it as the variable number */ @@ -969,40 +978,29 @@ void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n){ db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]); return; } - if( i>pParse->nVar ){ - pParse->nVar = (int)i; + if( x>pParse->nVar ){ + pParse->nVar = (int)x; + doAdd = 1; + }else if( sqlite3VListNumToName(pParse->pVList, x)==0 ){ + doAdd = 1; } }else{ /* Wildcards like ":aaa", "$aaa" or "@aaa". Reuse the same variable ** number as the prior appearance of the same name, or if the name ** has never appeared before, reuse the same variable number */ - ynVar i; - for(i=x=0; inzVar; i++){ - if( pParse->azVar[i] && strcmp(pParse->azVar[i],z)==0 ){ - x = (ynVar)i+1; - break; - } + x = (ynVar)sqlite3VListNameToNum(pParse->pVList, z, n); + if( x==0 ){ + x = (ynVar)(++pParse->nVar); + doAdd = 1; } - if( x==0 ) x = (ynVar)(++pParse->nVar); - } - pExpr->iColumn = x; - if( x>pParse->nzVar ){ - char **a; - a = sqlite3DbRealloc(db, pParse->azVar, x*sizeof(a[0])); - if( a==0 ){ - assert( db->mallocFailed ); /* Error reported through mallocFailed */ - return; - } - pParse->azVar = a; - memset(&a[pParse->nzVar], 0, (x-pParse->nzVar)*sizeof(a[0])); - pParse->nzVar = x; } - if( pParse->azVar[x-1]==0 ){ - pParse->azVar[x-1] = sqlite3DbStrNDup(db, z, n); + if( doAdd ){ + pParse->pVList = sqlite3VListAdd(db, pParse->pVList, z, n, x); } - } - if( pParse->nVar>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ + } + pExpr->iColumn = x; + if( x>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ sqlite3ErrorMsg(pParse, "too many SQL variables"); } } @@ -1091,7 +1089,7 @@ static int dupedExprStructSize(Expr *p, int flags){ assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */ assert( EXPR_FULLSIZE<=0xfff ); assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 ); - if( 0==flags ){ + if( 0==flags || p->op==TK_SELECT_COLUMN ){ nSize = EXPR_FULLSIZE; }else{ assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); @@ -1234,6 +1232,8 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ if( !ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ if( pNew->op==TK_SELECT_COLUMN ){ pNew->pLeft = p->pLeft; + assert( p->iColumn==0 || p->pRight==0 ); + assert( p->pRight==0 || p->pRight==p->pLeft ); }else{ pNew->pLeft = sqlite3ExprDup(db, p->pLeft, 0); } @@ -1296,6 +1296,7 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ ExprList *pNew; struct ExprList_item *pItem, *pOldItem; int i; + Expr *pPriorSelectCol = 0; assert( db!=0 ); if( p==0 ) return 0; pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew) ); @@ -1310,7 +1311,24 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ pOldItem = p->a; for(i=0; inExpr; i++, pItem++, pOldItem++){ Expr *pOldExpr = pOldItem->pExpr; + Expr *pNewExpr; pItem->pExpr = sqlite3ExprDup(db, pOldExpr, flags); + if( pOldExpr + && pOldExpr->op==TK_SELECT_COLUMN + && (pNewExpr = pItem->pExpr)!=0 + ){ + assert( pNewExpr->iColumn==0 || i>0 ); + if( pNewExpr->iColumn==0 ){ + assert( pOldExpr->pLeft==pOldExpr->pRight ); + pPriorSelectCol = pNewExpr->pLeft = pNewExpr->pRight; + }else{ + assert( i>0 ); + assert( pItem[-1].pExpr!=0 ); + assert( pNewExpr->iColumn==pItem[-1].pExpr->iColumn+1 ); + assert( pPriorSelectCol==pItem[-1].pExpr->pLeft ); + pNewExpr->pLeft = pPriorSelectCol; + } + } pItem->zName = sqlite3DbStrDup(db, pOldItem->zName); pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan); pItem->sortOrder = pOldItem->sortOrder; @@ -1361,7 +1379,7 @@ SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){ } pTab = pNewItem->pTab = pOldItem->pTab; if( pTab ){ - pTab->nRef++; + pTab->nTabRef++; } pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect, flags); pNewItem->pOn = sqlite3ExprDup(db, pOldItem->pOn, flags); @@ -1502,13 +1520,19 @@ ExprList *sqlite3ExprListAppendVector( ** exit prior to this routine being invoked */ if( NEVER(pColumns==0) ) goto vector_append_error; if( pExpr==0 ) goto vector_append_error; - n = sqlite3ExprVectorSize(pExpr); - if( pColumns->nId!=n ){ + + /* If the RHS is a vector, then we can immediately check to see that + ** the size of the RHS and LHS match. But if the RHS is a SELECT, + ** wildcards ("*") in the result set of the SELECT must be expanded before + ** we can do the size check, so defer the size check until code generation. + */ + if( pExpr->op!=TK_SELECT && pColumns->nId!=(n=sqlite3ExprVectorSize(pExpr)) ){ sqlite3ErrorMsg(pParse, "%d columns assigned %d values", pColumns->nId, n); goto vector_append_error; } - for(i=0; inId; i++){ Expr *pSubExpr = sqlite3ExprForVectorField(pParse, pExpr, i); pList = sqlite3ExprListAppend(pParse, pList, pSubExpr); if( pList ){ @@ -1517,11 +1541,20 @@ ExprList *sqlite3ExprListAppendVector( pColumns->a[i].zName = 0; } } + if( pExpr->op==TK_SELECT ){ if( pList && pList->a[iFirst].pExpr ){ - assert( pList->a[iFirst].pExpr->op==TK_SELECT_COLUMN ); - pList->a[iFirst].pExpr->pRight = pExpr; + Expr *pFirst = pList->a[iFirst].pExpr; + assert( pFirst->op==TK_SELECT_COLUMN ); + + /* Store the SELECT statement in pRight so it will be deleted when + ** sqlite3ExprListDelete() is called */ + pFirst->pRight = pExpr; pExpr = 0; + + /* Remember the size of the LHS in iTable so that we can check that + ** the RHS and LHS sizes match during code generation. */ + pFirst->iTable = pColumns->nId; } } @@ -2351,6 +2384,28 @@ void sqlite3SubselectError(Parse *pParse, int nActual, int nExpect){ } #endif +/* +** Expression pExpr is a vector that has been used in a context where +** it is not permitted. If pExpr is a sub-select vector, this routine +** loads the Parse object with a message of the form: +** +** "sub-select returns N columns - expected 1" +** +** Or, if it is a regular scalar vector: +** +** "row value misused" +*/ +void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ +#ifndef SQLITE_OMIT_SUBQUERY + if( pExpr->flags & EP_xIsSelect ){ + sqlite3SubselectError(pParse, pExpr->x.pSelect->pEList->nExpr, 1); + }else +#endif + { + sqlite3ErrorMsg(pParse, "row value misused"); + } +} + /* ** Generate code for scalar subqueries used as a subquery expression, EXISTS, ** or IN operators. Examples: @@ -2538,7 +2593,7 @@ int sqlite3CodeSubselect( }else{ sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); sqlite3ExprCacheAffinityChange(pParse, r3, 1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, pExpr->iTable, r2); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pExpr->iTable, r2, r3, 1); } } } @@ -2633,11 +2688,7 @@ int sqlite3ExprCheckIN(Parse *pParse, Expr *pIn){ return 1; } }else if( nVector!=1 ){ - if( (pIn->pLeft->flags & EP_xIsSelect) ){ - sqlite3SubselectError(pParse, nVector, 1); - }else{ - sqlite3ErrorMsg(pParse, "row value misused"); - } + sqlite3VectorErrorMsg(pParse, pIn->pLeft); return 1; } return 0; @@ -2942,22 +2993,22 @@ static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){ const char *z = pExpr->u.zToken; assert( z!=0 ); c = sqlite3DecOrHexToI64(z, &value); - if( c==0 || (c==2 && negFlag) ){ - if( negFlag ){ value = c==2 ? SMALLEST_INT64 : -value; } - sqlite3VdbeAddOp4Dup8(v, OP_Int64, 0, iMem, 0, (u8*)&value, P4_INT64); - }else{ + if( c==1 || (c==2 && !negFlag) || (negFlag && value==SMALLEST_INT64)){ #ifdef SQLITE_OMIT_FLOATING_POINT sqlite3ErrorMsg(pParse, "oversized integer: %s%s", negFlag ? "-" : "", z); #else #ifndef SQLITE_OMIT_HEX_INTEGER if( sqlite3_strnicmp(z,"0x",2)==0 ){ - sqlite3ErrorMsg(pParse, "hex literal too big: %s", z); + sqlite3ErrorMsg(pParse, "hex literal too big: %s%s", negFlag?"-":"",z); }else #endif { codeReal(v, z, negFlag, iMem); } #endif + }else{ + if( negFlag ){ value = c==2 ? SMALLEST_INT64 : -value; } + sqlite3VdbeAddOp4Dup8(v, OP_Int64, 0, iMem, 0, (u8*)&value, P4_INT64); } } } @@ -3408,9 +3459,10 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ assert( pExpr->u.zToken[0]!=0 ); sqlite3VdbeAddOp2(v, OP_Variable, pExpr->iColumn, target); if( pExpr->u.zToken[1]!=0 ){ - assert( pExpr->u.zToken[0]=='?' - || strcmp(pExpr->u.zToken, pParse->azVar[pExpr->iColumn-1])==0 ); - sqlite3VdbeChangeP4(v, -1, pParse->azVar[pExpr->iColumn-1], P4_STATIC); + const char *z = sqlite3VListNumToName(pParse->pVList, pExpr->iColumn); + assert( pExpr->u.zToken[0]=='?' || strcmp(pExpr->u.zToken, z)==0 ); + pParse->pVList[0] = 0; /* Indicate VList may no longer be enlarged */ + sqlite3VdbeAppendP4(v, (char*)z, P4_STATIC); } return target; } @@ -3696,9 +3748,17 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ break; } case TK_SELECT_COLUMN: { + int n; if( pExpr->pLeft->iTable==0 ){ pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft, 0, 0); } + assert( pExpr->iTable==0 || pExpr->pLeft->op==TK_SELECT ); + if( pExpr->iTable + && pExpr->iTable!=(n = sqlite3ExprVectorSize(pExpr->pLeft)) + ){ + sqlite3ErrorMsg(pParse, "%d columns assigned %d values", + pExpr->iTable, n); + } return pExpr->pLeft->iTable + pExpr->iColumn; } case TK_IN: { @@ -4086,8 +4146,13 @@ int sqlite3ExprCodeExprList( if( !ConstFactorOk(pParse) ) flags &= ~SQLITE_ECEL_FACTOR; for(pItem=pList->a, i=0; ipExpr; - if( (flags & SQLITE_ECEL_REF)!=0 && (j = pList->a[i].u.x.iOrderByCol)>0 ){ - sqlite3VdbeAddOp2(v, copyOp, j+srcReg-1, target+i); + if( (flags & SQLITE_ECEL_REF)!=0 && (j = pItem->u.x.iOrderByCol)>0 ){ + if( flags & SQLITE_ECEL_OMITREF ){ + i--; + n--; + }else{ + sqlite3VdbeAddOp2(v, copyOp, j+srcReg-1, target+i); + } }else if( (flags & SQLITE_ECEL_FACTOR)!=0 && sqlite3ExprIsConstant(pExpr) ){ sqlite3ExprCodeAtInit(pParse, pExpr, target+i, 0); }else{ @@ -4162,6 +4227,11 @@ static void exprCodeBetween( if( xJump ){ xJump(pParse, &exprAnd, dest, jumpIfNull); }else{ + /* Mark the expression is being from the ON or USING clause of a join + ** so that the sqlite3ExprCodeTarget() routine will not attempt to move + ** it into the Parse.pConstExpr list. We should use a new bit for this, + ** for clarity, but we are out of bits in the Expr.flags field so we + ** have to reuse the EP_FromJoin bit. Bummer. */ exprX.flags |= EP_FromJoin; sqlite3ExprCodeTarget(pParse, &exprAnd, dest); } @@ -4600,11 +4670,10 @@ int sqlite3ExprImpliesExpr(Expr *pE1, Expr *pE2, int iTab){ ){ return 1; } - if( pE2->op==TK_NOTNULL - && sqlite3ExprCompare(pE1->pLeft, pE2->pLeft, iTab)==0 - && (pE1->op!=TK_ISNULL && pE1->op!=TK_IS) - ){ - return 1; + if( pE2->op==TK_NOTNULL && pE1->op!=TK_ISNULL && pE1->op!=TK_IS ){ + Expr *pX = sqlite3ExprSkipCollate(pE1->pLeft); + testcase( pX!=pE1->pLeft ); + if( sqlite3ExprCompare(pX, pE2->pLeft, iTab)==0 ) return 1; } return 0; } diff --git a/sqlite/src/fault.c b/sqlite/src/fault.c index c3028c4f..5b41b603 100644 --- a/sqlite/src/fault.c +++ b/sqlite/src/fault.c @@ -26,7 +26,7 @@ #include "sqliteInt.h" -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE /* ** Global variables. @@ -84,4 +84,4 @@ void sqlite3EndBenignMalloc(void){ } } -#endif /* #ifndef SQLITE_OMIT_BUILTIN_TEST */ +#endif /* #ifndef SQLITE_UNTESTABLE */ diff --git a/sqlite/src/fkey.c b/sqlite/src/fkey.c index 883cc641..cb78764f 100644 --- a/sqlite/src/fkey.c +++ b/sqlite/src/fkey.c @@ -225,7 +225,7 @@ int sqlite3FkLocateIndex( } for(pIdx=pParent->pIndex; pIdx; pIdx=pIdx->pNext){ - if( pIdx->nKeyCol==nCol && IsUniqueIndex(pIdx) ){ + if( pIdx->nKeyCol==nCol && IsUniqueIndex(pIdx) && pIdx->pPartIdxWhere==0 ){ /* pIdx is a UNIQUE index (or a PRIMARY KEY) and has the right number ** of columns. If each indexed column corresponds to a foreign key ** column of pFKey, then this index is a winner. */ @@ -584,7 +584,7 @@ static void fkScanChildren( assert( iCol>=0 ); zCol = pFKey->pFrom->aCol[iCol].zName; pRight = sqlite3Expr(db, TK_ID, zCol); - pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight, 0); + pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight); pWhere = sqlite3ExprAnd(db, pWhere, pEq); } @@ -606,7 +606,7 @@ static void fkScanChildren( if( HasRowid(pTab) ){ pLeft = exprTableRegister(pParse, pTab, regData, -1); pRight = exprTableColumn(db, pTab, pSrc->a[0].iCursor, -1); - pNe = sqlite3PExpr(pParse, TK_NE, pLeft, pRight, 0); + pNe = sqlite3PExpr(pParse, TK_NE, pLeft, pRight); }else{ Expr *pEq, *pAll = 0; Index *pPk = sqlite3PrimaryKeyIndex(pTab); @@ -616,10 +616,10 @@ static void fkScanChildren( 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, 0); + pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight); pAll = sqlite3ExprAnd(db, pAll, pEq); } - pNe = sqlite3PExpr(pParse, TK_NOT, pAll, 0, 0); + pNe = sqlite3PExpr(pParse, TK_NOT, pAll, 0); } pWhere = sqlite3ExprAnd(db, pWhere, pNe); } @@ -1007,7 +1007,7 @@ void sqlite3FkCheck( struct SrcList_item *pItem = pSrc->a; pItem->pTab = pFKey->pFrom; pItem->zName = pFKey->pFrom->zName; - pItem->pTab->nRef++; + pItem->pTab->nTabRef++; pItem->iCursor = pParse->nTab++; if( regNew!=0 ){ @@ -1205,10 +1205,9 @@ static Trigger *fkActionTrigger( pEq = sqlite3PExpr(pParse, TK_EQ, sqlite3PExpr(pParse, TK_DOT, sqlite3ExprAlloc(db, TK_ID, &tOld, 0), - sqlite3ExprAlloc(db, TK_ID, &tToCol, 0) - , 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)), sqlite3ExprAlloc(db, TK_ID, &tFromCol, 0) - , 0); + ); pWhere = sqlite3ExprAnd(db, pWhere, pEq); /* For ON UPDATE, construct the next term of the WHEN clause. @@ -1220,13 +1219,11 @@ static Trigger *fkActionTrigger( pEq = sqlite3PExpr(pParse, TK_IS, sqlite3PExpr(pParse, TK_DOT, sqlite3ExprAlloc(db, TK_ID, &tOld, 0), - sqlite3ExprAlloc(db, TK_ID, &tToCol, 0), - 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)), sqlite3PExpr(pParse, TK_DOT, sqlite3ExprAlloc(db, TK_ID, &tNew, 0), - sqlite3ExprAlloc(db, TK_ID, &tToCol, 0), - 0), - 0); + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)) + ); pWhen = sqlite3ExprAnd(db, pWhen, pEq); } @@ -1235,8 +1232,7 @@ static Trigger *fkActionTrigger( if( action==OE_Cascade ){ pNew = sqlite3PExpr(pParse, TK_DOT, sqlite3ExprAlloc(db, TK_ID, &tNew, 0), - sqlite3ExprAlloc(db, TK_ID, &tToCol, 0) - , 0); + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)); }else if( action==OE_SetDflt ){ Expr *pDflt = pFKey->pFrom->aCol[iFromCol].pDflt; if( pDflt ){ @@ -1292,7 +1288,7 @@ static Trigger *fkActionTrigger( pStep->pExprList = sqlite3ExprListDup(db, pList, EXPRDUP_REDUCE); pStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); if( pWhen ){ - pWhen = sqlite3PExpr(pParse, TK_NOT, pWhen, 0, 0); + pWhen = sqlite3PExpr(pParse, TK_NOT, pWhen, 0); pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE); } } diff --git a/sqlite/src/func.c b/sqlite/src/func.c index 6ec0962d..4afb25ad 100644 --- a/sqlite/src/func.c +++ b/sqlite/src/func.c @@ -200,25 +200,28 @@ static void instrFunc( if( typeHaystack==SQLITE_NULL || typeNeedle==SQLITE_NULL ) return; nHaystack = sqlite3_value_bytes(argv[0]); nNeedle = sqlite3_value_bytes(argv[1]); - if( typeHaystack==SQLITE_BLOB && typeNeedle==SQLITE_BLOB ){ - zHaystack = sqlite3_value_blob(argv[0]); - zNeedle = sqlite3_value_blob(argv[1]); - isText = 0; - }else{ - zHaystack = sqlite3_value_text(argv[0]); - zNeedle = sqlite3_value_text(argv[1]); - isText = 1; - if( zNeedle==0 ) return; - assert( zHaystack ); - } - while( nNeedle<=nHaystack && memcmp(zHaystack, zNeedle, nNeedle)!=0 ){ - N++; - do{ - nHaystack--; - zHaystack++; - }while( isText && (zHaystack[0]&0xc0)==0x80 ); + if( nNeedle>0 ){ + if( typeHaystack==SQLITE_BLOB && typeNeedle==SQLITE_BLOB ){ + zHaystack = sqlite3_value_blob(argv[0]); + zNeedle = sqlite3_value_blob(argv[1]); + assert( zNeedle!=0 ); + assert( zHaystack!=0 || nHaystack==0 ); + isText = 0; + }else{ + zHaystack = sqlite3_value_text(argv[0]); + zNeedle = sqlite3_value_text(argv[1]); + isText = 1; + if( zHaystack==0 || zNeedle==0 ) return; + } + while( nNeedle<=nHaystack && memcmp(zHaystack, zNeedle, nNeedle)!=0 ){ + N++; + do{ + nHaystack--; + zHaystack++; + }while( isText && (zHaystack[0]&0xc0)==0x80 ); + } + if( nNeedle>nHaystack ) N = 0; } - if( nNeedle>nHaystack ) N = 0; sqlite3_result_int(context, N); } @@ -598,9 +601,19 @@ static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 }; static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 }; /* -** Compare two UTF-8 strings for equality where the first string can -** potentially be a "glob" or "like" expression. Return true (1) if they -** are the same and false (0) if they are different. +** Possible error returns from patternMatch() +*/ +#define SQLITE_MATCH 0 +#define SQLITE_NOMATCH 1 +#define SQLITE_NOWILDCARDMATCH 2 + +/* +** Compare two UTF-8 strings for equality where the first string is +** a GLOB or LIKE expression. Return values: +** +** SQLITE_MATCH: Match +** SQLITE_NOMATCH: No match +** SQLITE_NOWILDCARDMATCH: No match in spite of having * or % wildcards. ** ** Globbing rules: ** @@ -651,30 +664,31 @@ static int patternCompare( ** single character of the input string for each "?" skipped */ while( (c=Utf8Read(zPattern)) == matchAll || c == matchOne ){ if( c==matchOne && sqlite3Utf8Read(&zString)==0 ){ - return 0; + return SQLITE_NOWILDCARDMATCH; } } if( c==0 ){ - return 1; /* "*" at the end of the pattern matches */ + return SQLITE_MATCH; /* "*" at the end of the pattern matches */ }else if( c==matchOther ){ if( pInfo->matchSet==0 ){ c = sqlite3Utf8Read(&zPattern); - if( c==0 ) return 0; + if( c==0 ) return SQLITE_NOWILDCARDMATCH; }else{ /* "[...]" immediately follows the "*". We have to do a slow ** recursive search in this case, but it is an unusual case. */ assert( matchOther<0x80 ); /* '[' is a single-byte character */ - while( *zString - && patternCompare(&zPattern[-1],zString,pInfo,matchOther)==0 ){ + while( *zString ){ + int bMatch = patternCompare(&zPattern[-1],zString,pInfo,matchOther); + if( bMatch!=SQLITE_NOMATCH ) return bMatch; SQLITE_SKIP_UTF8(zString); } - return *zString!=0; + return SQLITE_NOWILDCARDMATCH; } } /* At this point variable c contains the first character of the ** pattern string past the "*". Search in the input string for the - ** first matching character and recursively contine the match from + ** first matching character and recursively continue the match from ** that point. ** ** For a case-insensitive search, set variable cx to be the same as @@ -683,6 +697,7 @@ static int patternCompare( */ if( c<=0x80 ){ u32 cx; + int bMatch; if( noCase ){ cx = sqlite3Toupper(c); c = sqlite3Tolower(c); @@ -691,27 +706,30 @@ static int patternCompare( } while( (c2 = *(zString++))!=0 ){ if( c2!=c && c2!=cx ) continue; - if( patternCompare(zPattern,zString,pInfo,matchOther) ) return 1; + bMatch = patternCompare(zPattern,zString,pInfo,matchOther); + if( bMatch!=SQLITE_NOMATCH ) return bMatch; } }else{ + int bMatch; while( (c2 = Utf8Read(zString))!=0 ){ if( c2!=c ) continue; - if( patternCompare(zPattern,zString,pInfo,matchOther) ) return 1; + bMatch = patternCompare(zPattern,zString,pInfo,matchOther); + if( bMatch!=SQLITE_NOMATCH ) return bMatch; } } - return 0; + return SQLITE_NOWILDCARDMATCH; } if( c==matchOther ){ if( pInfo->matchSet==0 ){ c = sqlite3Utf8Read(&zPattern); - if( c==0 ) return 0; + if( c==0 ) return SQLITE_NOMATCH; zEscaped = zPattern; }else{ u32 prior_c = 0; int seen = 0; int invert = 0; c = sqlite3Utf8Read(&zString); - if( c==0 ) return 0; + if( c==0 ) return SQLITE_NOMATCH; c2 = sqlite3Utf8Read(&zPattern); if( c2=='^' ){ invert = 1; @@ -735,7 +753,7 @@ static int patternCompare( c2 = sqlite3Utf8Read(&zPattern); } if( c2==0 || (seen ^ invert)==0 ){ - return 0; + return SQLITE_NOMATCH; } continue; } @@ -746,23 +764,25 @@ static int patternCompare( continue; } if( c==matchOne && zPattern!=zEscaped && c2!=0 ) continue; - return 0; + return SQLITE_NOMATCH; } - return *zString==0; + return *zString==0 ? SQLITE_MATCH : SQLITE_NOMATCH; } /* -** The sqlite3_strglob() interface. +** The sqlite3_strglob() interface. Return 0 on a match (like strcmp()) and +** non-zero if there is no match. */ int sqlite3_strglob(const char *zGlobPattern, const char *zString){ - return patternCompare((u8*)zGlobPattern, (u8*)zString, &globInfo, '[')==0; + return patternCompare((u8*)zGlobPattern, (u8*)zString, &globInfo, '['); } /* -** The sqlite3_strlike() interface. +** The sqlite3_strlike() interface. Return 0 on a match and non-zero for +** a miss - like strcmp(). */ int sqlite3_strlike(const char *zPattern, const char *zStr, unsigned int esc){ - return patternCompare((u8*)zPattern, (u8*)zStr, &likeInfoNorm, esc)==0; + return patternCompare((u8*)zPattern, (u8*)zStr, &likeInfoNorm, esc); } /* @@ -843,7 +863,7 @@ static void likeFunc( #ifdef SQLITE_TEST sqlite3_like_count++; #endif - sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape)); + sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape)==SQLITE_MATCH); } } @@ -1614,7 +1634,7 @@ static void groupConcatStep( zSep = ","; nSep = 1; } - if( nSep ) sqlite3StrAccumAppend(pAccum, zSep, nSep); + if( zSep ) sqlite3StrAccumAppend(pAccum, zSep, nSep); } zVal = (char*)sqlite3_value_text(argv[0]); nVal = sqlite3_value_bytes(argv[0]); diff --git a/sqlite/src/global.c b/sqlite/src/global.c index f7865c95..ff6c7dba 100644 --- a/sqlite/src/global.c +++ b/sqlite/src/global.c @@ -181,8 +181,8 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = { SQLITE_ALLOW_COVERING_INDEX_SCAN, /* bUseCis */ 0x7ffffffe, /* mxStrlen */ 0, /* neverCorrupt */ - 128, /* szLookaside */ - 500, /* nLookaside */ + 512, /* szLookaside */ + 125, /* nLookaside */ SQLITE_STMTJRNL_SPILL, /* nStmtSpill */ {0,0,0,0,0,0,0,0}, /* m */ {0,0,0,0,0,0,0,0,0}, /* mutex */ @@ -219,7 +219,7 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = { 0, /* xVdbeBranch */ 0, /* pVbeBranchArg */ #endif -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE 0, /* xTestCallback */ #endif 0, /* bLocaltimeFault */ diff --git a/sqlite/src/insert.c b/sqlite/src/insert.c index 8167ff78..27e05d4d 100644 --- a/sqlite/src/insert.c +++ b/sqlite/src/insert.c @@ -485,7 +485,7 @@ void sqlite3Insert( sqlite3 *db; /* The main database structure */ Table *pTab; /* The table to insert into. aka TABLE */ char *zTab; /* Name of the table into which we are inserting */ - int i, j, idx; /* Loop counters */ + int i, j; /* Loop counters */ Vdbe *v; /* Generate code into this virtual machine */ Index *pIdx; /* For looping over indices of the table */ int nColumn; /* Number of columns in the data */ @@ -792,8 +792,10 @@ void sqlite3Insert( if( aRegIdx==0 ){ goto insert_cleanup; } - for(i=0; ipIndex; ipNext, i++){ + assert( pIdx ); aRegIdx[i] = ++pParse->nMem; + pParse->nMem += pIdx->nColumn; } } @@ -995,12 +997,26 @@ void sqlite3Insert( #endif { int isReplace; /* Set to true if constraints may cause a replace */ + int bUseSeek; /* True to use OPFLAG_SEEKRESULT */ sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur, regIns, 0, ipkColumn>=0, onError, endOfLoop, &isReplace, 0 ); sqlite3FkCheck(pParse, pTab, 0, regIns, 0, 0); + + /* Set the OPFLAG_USESEEKRESULT flag if either (a) there are no REPLACE + ** constraints or (b) there are no triggers and this table is not a + ** parent table in a foreign key constraint. It is safe to set the + ** flag in the second case as if any REPLACE constraint is hit, an + ** OP_Delete or OP_IdxDelete instruction will be executed on each + ** cursor that is disturbed. And these instructions both clear the + ** VdbeCursor.seekResult variable, disabling the OPFLAG_USESEEKRESULT + ** functionality. */ + bUseSeek = (isReplace==0 || (pTrigger==0 && + ((db->flags & SQLITE_ForeignKeys)==0 || sqlite3FkReferences(pTab)==0) + )); sqlite3CompleteInsertion(pParse, pTab, iDataCur, iIdxCur, - regIns, aRegIdx, 0, appendFlag, isReplace==0); + regIns, aRegIdx, 0, appendFlag, bUseSeek + ); } } @@ -1029,14 +1045,6 @@ void sqlite3Insert( sqlite3VdbeJumpHere(v, addrInsTop); } - if( !IsVirtual(pTab) && !isView ){ - /* Close all tables opened */ - if( iDataCurpIndex; pIdx; pIdx=pIdx->pNext, idx++){ - sqlite3VdbeAddOp1(v, OP_Close, idx+iIdxCur); - } - } - insert_end: /* Update the sqlite_sequence table by storing the content of the ** maximum rowid counter values recorded while inserting into @@ -1243,7 +1251,6 @@ void sqlite3GenerateConstraintChecks( int ipkBottom = 0; /* Bottom of the rowid change constraint check */ u8 isUpdate; /* True if this is an UPDATE operation */ u8 bAffinityDone = 0; /* True if the OP_Affinity operation has been run */ - int regRowid = -1; /* Register holding ROWID value */ isUpdate = regOldData!=0; db = pParse->db; @@ -1298,8 +1305,9 @@ void sqlite3GenerateConstraintChecks( case OE_Fail: { char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName, pTab->aCol[i].zName); - sqlite3VdbeAddOp4(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, onError, - regNewData+1+i, zMsg, P4_DYNAMIC); + sqlite3VdbeAddOp3(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, onError, + regNewData+1+i); + sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC); sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); VdbeCoverage(v); break; @@ -1363,7 +1371,7 @@ void sqlite3GenerateConstraintChecks( } if( isUpdate ){ - /* pkChng!=0 does not mean that the rowid has change, only that + /* pkChng!=0 does not mean that the rowid has changed, only that ** it might have changed. Skip the conflict logic below if the rowid ** is unchanged. */ sqlite3VdbeAddOp3(v, OP_Eq, regNewData, addrRowidOk, regOldData); @@ -1441,7 +1449,7 @@ void sqlite3GenerateConstraintChecks( ** OP_Insert replace the existing entry than it is to delete the ** existing entry and then insert a new one. */ sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, OPFLAG_ISNOOP); - sqlite3VdbeChangeP4(v, -1, (char *)pTab, P4_TABLE); + sqlite3VdbeAppendP4(v, pTab, P4_TABLE); } #endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ if( pTab->pIndex ){ @@ -1498,7 +1506,7 @@ void sqlite3GenerateConstraintChecks( /* Create a record for this index entry as it should appear after ** the insert or update. Store that record in the aRegIdx[ix] register */ - regIdx = sqlite3GetTempRange(pParse, pIdx->nColumn); + regIdx = aRegIdx[ix]+1; for(i=0; inColumn; i++){ int iField = pIdx->aiColumn[i]; int x; @@ -1509,9 +1517,7 @@ void sqlite3GenerateConstraintChecks( VdbeComment((v, "%s column %d", pIdx->zName, i)); }else{ if( iField==XN_ROWID || iField==pTab->iPKey ){ - if( regRowid==regIdx+i ) continue; /* ROWID already in regIdx+i */ x = regNewData; - regRowid = pIdx->pPartIdxWhere ? -1 : regIdx+i; }else{ x = iField + regNewData + 1; } @@ -1521,7 +1527,6 @@ void sqlite3GenerateConstraintChecks( } sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn, aRegIdx[ix]); VdbeComment((v, "for %s", pIdx->zName)); - sqlite3ExprCacheAffinityChange(pParse, regIdx, pIdx->nColumn); /* In an UPDATE operation, if this index is the PRIMARY KEY index ** of a WITHOUT ROWID table and there has been no change the @@ -1535,7 +1540,6 @@ void sqlite3GenerateConstraintChecks( /* Find out what action to take in case there is a uniqueness conflict */ onError = pIdx->onError; if( onError==OE_None ){ - sqlite3ReleaseTempRange(pParse, regIdx, pIdx->nColumn); sqlite3VdbeResolveLabel(v, addrUniqueOk); continue; /* pIdx is not a UNIQUE index */ } @@ -1544,6 +1548,12 @@ void sqlite3GenerateConstraintChecks( }else if( onError==OE_Default ){ onError = OE_Abort; } + + if( ix==0 && pPk==pIdx && onError==OE_Replace && pPk->pNext==0 ){ + sqlite3VdbeResolveLabel(v, addrUniqueOk); + continue; + } + /* Check to see if the new index entry will be unique */ sqlite3VdbeAddOp4Int(v, OP_NoConflict, iThisCur, addrUniqueOk, @@ -1634,7 +1644,6 @@ void sqlite3GenerateConstraintChecks( } } sqlite3VdbeResolveLabel(v, addrUniqueOk); - sqlite3ReleaseTempRange(pParse, regIdx, pIdx->nColumn); if( regR!=regIdx ) sqlite3ReleaseTempRange(pParse, regR, nPkField); } if( ipkTop ){ @@ -1684,7 +1693,9 @@ void sqlite3CompleteInsertion( sqlite3VdbeAddOp2(v, OP_IsNull, aRegIdx[i], sqlite3VdbeCurrentAddr(v)+2); VdbeCoverage(v); } - sqlite3VdbeAddOp2(v, OP_IdxInsert, iIdxCur+i, aRegIdx[i]); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iIdxCur+i, aRegIdx[i], + aRegIdx[i]+1, + pIdx->uniqNotNull ? pIdx->nKeyCol: pIdx->nColumn); pik_flags = 0; if( useSeekResult ) pik_flags = OPFLAG_USESEEKRESULT; if( IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab) ){ @@ -1697,8 +1708,10 @@ void sqlite3CompleteInsertion( regData = regNewData + 1; regRec = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_MakeRecord, regData, pTab->nCol, regRec); - if( !bAffinityDone ) sqlite3TableAffinity(v, pTab, 0); - sqlite3ExprCacheAffinityChange(pParse, regData, pTab->nCol); + if( !bAffinityDone ){ + sqlite3TableAffinity(v, pTab, 0); + sqlite3ExprCacheAffinityChange(pParse, regData, pTab->nCol); + } if( pParse->nested ){ pik_flags = 0; }else{ @@ -1713,7 +1726,7 @@ void sqlite3CompleteInsertion( } sqlite3VdbeAddOp3(v, OP_Insert, iDataCur, regRec, regNewData); if( !pParse->nested ){ - sqlite3VdbeChangeP4(v, -1, (char *)pTab, P4_TABLE); + sqlite3VdbeAppendP4(v, pTab, P4_TABLE); } sqlite3VdbeChangeP5(v, pik_flags); } @@ -2096,6 +2109,7 @@ static int xferOptimization( sqlite3VdbeJumpHere(v, addr1); } if( HasRowid(pSrc) ){ + u8 insFlags; sqlite3OpenTable(pParse, iSrc, iDbSrc, pSrc, OP_OpenRead); emptySrcTest = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); VdbeCoverage(v); if( pDest->iPKey>=0 ){ @@ -2112,9 +2126,16 @@ static int xferOptimization( assert( (pDest->tabFlags & TF_Autoincrement)==0 ); } sqlite3VdbeAddOp2(v, OP_RowData, iSrc, regData); + if( db->flags & SQLITE_Vacuum ){ + sqlite3VdbeAddOp3(v, OP_Last, iDest, 0, -1); + insFlags = OPFLAG_NCHANGE|OPFLAG_LASTROWID| + OPFLAG_APPEND|OPFLAG_USESEEKRESULT; + }else{ + insFlags = OPFLAG_NCHANGE|OPFLAG_LASTROWID|OPFLAG_APPEND; + } sqlite3VdbeAddOp4(v, OP_Insert, iDest, regData, regRowid, (char*)pDest, P4_TABLE); - sqlite3VdbeChangeP5(v, OPFLAG_NCHANGE|OPFLAG_LASTROWID|OPFLAG_APPEND); + sqlite3VdbeChangeP5(v, insFlags); sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); @@ -2136,7 +2157,7 @@ static int xferOptimization( sqlite3VdbeChangeP5(v, OPFLAG_BULKCSR); VdbeComment((v, "%s", pDestIdx->zName)); addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_RowKey, iSrc, regData); + sqlite3VdbeAddOp2(v, OP_RowData, iSrc, regData); if( db->flags & SQLITE_Vacuum ){ /* This INSERT command is part of a VACUUM operation, which guarantees ** that the destination table is empty. If all indexed columns use @@ -2166,8 +2187,8 @@ static int xferOptimization( if( !HasRowid(pSrc) && pDestIdx->idxType==2 ){ idxInsFlags |= OPFLAG_NCHANGE; } - sqlite3VdbeAddOp3(v, OP_IdxInsert, iDest, regData, 1); - sqlite3VdbeChangeP5(v, idxInsFlags); + sqlite3VdbeAddOp2(v, OP_IdxInsert, iDest, regData); + sqlite3VdbeChangeP5(v, idxInsFlags|OPFLAG_APPEND); sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1+1); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addr1); sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); diff --git a/sqlite/src/main.c b/sqlite/src/main.c index 392a0042..9aad8fdd 100644 --- a/sqlite/src/main.c +++ b/sqlite/src/main.c @@ -810,6 +810,7 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){ { SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_EnableTrigger }, { SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, SQLITE_Fts3Tokenizer }, { SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, SQLITE_LoadExtension }, + { SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, SQLITE_NoCkptOnClose }, }; unsigned int i; rc = SQLITE_ERROR; /* IMP: R-42790-23372 */ @@ -1567,7 +1568,7 @@ int sqlite3_busy_timeout(sqlite3 *db, int ms){ */ void sqlite3_interrupt(sqlite3 *db){ #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ){ + if( !sqlite3SafetyCheckOk(db) && (db==0 || db->magic!=SQLITE_MAGIC_ZOMBIE) ){ (void)SQLITE_MISUSE_BKPT; return; } @@ -2106,6 +2107,13 @@ int sqlite3_wal_checkpoint_v2( sqlite3Error(db, rc); } rc = sqlite3ApiExit(db, rc); + + /* If there are no active statements, clear the interrupt flag at this + ** point. */ + if( db->nVdbeActive==0 ){ + db->u1.isInterrupted = 0; + } + sqlite3_mutex_leave(db->mutex); return rc; #endif @@ -2608,6 +2616,7 @@ int sqlite3ParseUri( assert( octet>=0 && octet<256 ); if( octet==0 ){ +#ifndef SQLITE_ENABLE_URI_00_ERROR /* This branch is taken when "%00" appears within the URI. In this ** case we ignore all text in the remainder of the path, name or ** value currently being parsed. So ignore the current character @@ -2620,6 +2629,12 @@ int sqlite3ParseUri( iIn++; } continue; +#else + /* If ENABLE_URI_00_ERROR is defined, "%00" in a URI is an error. */ + *pzErrMsg = sqlite3_mprintf("unexpected %%00 in uri"); + rc = SQLITE_ERROR; + goto parse_uri_out; +#endif } c = octet; }else if( eState==1 && (c=='&' || c=='=') ){ @@ -2724,7 +2739,9 @@ int sqlite3ParseUri( }else{ zFile = sqlite3_malloc64(nUri+2); if( !zFile ) return SQLITE_NOMEM_BKPT; - memcpy(zFile, zUri, nUri); + if( nUri ){ + memcpy(zFile, zUri, nUri); + } zFile[nUri] = '\0'; zFile[nUri+1] = '\0'; flags &= ~SQLITE_OPEN_URI; @@ -3518,7 +3535,7 @@ int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){ */ int sqlite3_test_control(int op, ...){ int rc = 0; -#ifdef SQLITE_OMIT_BUILTIN_TEST +#ifdef SQLITE_UNTESTABLE UNUSED_PARAMETER(op); #else va_list ap; @@ -3855,7 +3872,7 @@ int sqlite3_test_control(int op, ...){ } } va_end(ap); -#endif /* SQLITE_OMIT_BUILTIN_TEST */ +#endif /* SQLITE_UNTESTABLE */ return rc; } @@ -3911,15 +3928,8 @@ sqlite3_int64 sqlite3_uri_int64( ** Return the Btree pointer identified by zDbName. Return NULL if not found. */ Btree *sqlite3DbNameToBtree(sqlite3 *db, const char *zDbName){ - int i; - for(i=0; inDb; i++){ - if( db->aDb[i].pBt - && (zDbName==0 || sqlite3StrICmp(zDbName, db->aDb[i].zDbSName)==0) - ){ - return db->aDb[i].pBt; - } - } - return 0; + int iDb = zDbName ? sqlite3FindDbName(db, zDbName) : 0; + return iDb<0 ? 0 : db->aDb[iDb].pBt; } /* @@ -3966,7 +3976,6 @@ int sqlite3_snapshot_get( ){ int rc = SQLITE_ERROR; #ifndef SQLITE_OMIT_WAL - int iDb; #ifdef SQLITE_ENABLE_API_ARMOR if( !sqlite3SafetyCheckOk(db) ){ @@ -3975,13 +3984,15 @@ int sqlite3_snapshot_get( #endif sqlite3_mutex_enter(db->mutex); - iDb = sqlite3FindDbName(db, zDb); - if( iDb==0 || iDb>1 ){ - Btree *pBt = db->aDb[iDb].pBt; - if( 0==sqlite3BtreeIsInTrans(pBt) ){ - rc = sqlite3BtreeBeginTrans(pBt, 0); - if( rc==SQLITE_OK ){ - rc = sqlite3PagerSnapshotGet(sqlite3BtreePager(pBt), ppSnapshot); + if( db->autoCommit==0 ){ + int iDb = sqlite3FindDbName(db, zDb); + if( iDb==0 || iDb>1 ){ + Btree *pBt = db->aDb[iDb].pBt; + if( 0==sqlite3BtreeIsInTrans(pBt) ){ + rc = sqlite3BtreeBeginTrans(pBt, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSnapshotGet(sqlite3BtreePager(pBt), ppSnapshot); + } } } } @@ -4028,6 +4039,38 @@ int sqlite3_snapshot_open( return rc; } +/* +** Recover as many snapshots as possible from the wal file associated with +** schema zDb of database db. +*/ +int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb){ + int rc = SQLITE_ERROR; + int iDb; +#ifndef SQLITE_OMIT_WAL + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + + sqlite3_mutex_enter(db->mutex); + iDb = sqlite3FindDbName(db, zDb); + if( iDb==0 || iDb>1 ){ + Btree *pBt = db->aDb[iDb].pBt; + if( 0==sqlite3BtreeIsInReadTrans(pBt) ){ + rc = sqlite3BtreeBeginTrans(pBt, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSnapshotRecover(sqlite3BtreePager(pBt)); + sqlite3BtreeCommit(pBt); + } + } + } + sqlite3_mutex_leave(db->mutex); +#endif /* SQLITE_OMIT_WAL */ + return rc; +} + /* ** Free a snapshot handle obtained from sqlite3_snapshot_get(). */ diff --git a/sqlite/src/malloc.c b/sqlite/src/malloc.c index 462d78e6..84191c78 100644 --- a/sqlite/src/malloc.c +++ b/sqlite/src/malloc.c @@ -519,7 +519,7 @@ void *sqlite3Realloc(void *pOld, u64 nBytes){ sqlite3_mutex_enter(mem0.mutex); sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, (int)nBytes); nDiff = nNew - nOld; - if( sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED) >= + if( nDiff>0 && sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED) >= mem0.alarmThreshold-nDiff ){ sqlite3MallocAlarm(nDiff); } @@ -726,9 +726,8 @@ char *sqlite3DbStrDup(sqlite3 *db, const char *z){ if( z==0 ){ return 0; } - n = sqlite3Strlen30(z) + 1; - assert( (n&0x7fffffff)==n ); - zNew = sqlite3DbMallocRaw(db, (int)n); + n = strlen(z) + 1; + zNew = sqlite3DbMallocRaw(db, n); if( zNew ){ memcpy(zNew, z, n); } diff --git a/sqlite/src/os_unix.c b/sqlite/src/os_unix.c index 08d4cb5d..7f0ebdba 100644 --- a/sqlite/src/os_unix.c +++ b/sqlite/src/os_unix.c @@ -1061,7 +1061,14 @@ struct unixFileId { #if OS_VXWORKS struct vxworksFileId *pId; /* Unique file ID for vxworks. */ #else - ino_t ino; /* Inode number */ + /* We are told that some versions of Android contain a bug that + ** sizes ino_t at only 32-bits instead of 64-bits. (See + ** https://android-review.googlesource.com/#/c/115351/3/dist/sqlite3.c) + ** To work around this, always allocate 64-bits for the inode number. + ** On small machines that only have 32-bit inodes, this wastes 4 bytes, + ** but that should not be a big deal. */ + /* WAS: ino_t ino; */ + u64 ino; /* Inode number */ #endif }; @@ -1306,7 +1313,7 @@ static int findInodeInfo( #if OS_VXWORKS fileId.pId = pFile->pId; #else - fileId.ino = statbuf.st_ino; + fileId.ino = (u64)statbuf.st_ino; #endif pInode = inodeList; while( pInode && memcmp(&fileId, &pInode->fileId, sizeof(fileId)) ){ @@ -1340,7 +1347,8 @@ static int fileHasMoved(unixFile *pFile){ #else struct stat buf; return pFile->pInode!=0 && - (osStat(pFile->zPath, &buf)!=0 || buf.st_ino!=pFile->pInode->fileId.ino); + (osStat(pFile->zPath, &buf)!=0 + || (u64)buf.st_ino!=pFile->pInode->fileId.ino); #endif } @@ -5512,7 +5520,7 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ unixEnterMutex(); pInode = inodeList; while( pInode && (pInode->fileId.dev!=sStat.st_dev - || pInode->fileId.ino!=sStat.st_ino) ){ + || pInode->fileId.ino!=(u64)sStat.st_ino) ){ pInode = pInode->pNext; } if( pInode ){ diff --git a/sqlite/src/pager.c b/sqlite/src/pager.c index 6f9a1819..5813b4db 100644 --- a/sqlite/src/pager.c +++ b/sqlite/src/pager.c @@ -693,6 +693,7 @@ struct Pager { int nRead; /* Database pages read */ #endif void (*xReiniter)(DbPage*); /* Call this routine when reloading pages */ + int (*xGet)(Pager*,Pgno,DbPage**,int); /* Routine to fetch a patch */ #ifdef SQLITE_HAS_CODEC void *(*xCodec)(void*,void*,Pgno,int); /* Routine for en/decoding data */ void (*xCodecSizeChng)(void*,int,int); /* Notify of page size changes */ @@ -1019,6 +1020,33 @@ static char *print_pager_state(Pager *p){ } #endif +/* Forward references to the various page getters */ +static int getPageNormal(Pager*,Pgno,DbPage**,int); +static int getPageError(Pager*,Pgno,DbPage**,int); +#if SQLITE_MAX_MMAP_SIZE>0 +static int getPageMMap(Pager*,Pgno,DbPage**,int); +#endif + +/* +** Set the Pager.xGet method for the appropriate routine used to fetch +** content from the pager. +*/ +static void setGetterMethod(Pager *pPager){ + if( pPager->errCode ){ + pPager->xGet = getPageError; +#if SQLITE_MAX_MMAP_SIZE>0 + }else if( USEFETCH(pPager) +#ifdef SQLITE_HAS_CODEC + && pPager->xCodec==0 +#endif + ){ + pPager->xGet = getPageMMap; +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + }else{ + pPager->xGet = getPageNormal; + } +} + /* ** Return true if it is necessary to write page *pPg into the sub-journal. ** A page needs to be written into the sub-journal if there exists one @@ -1833,6 +1861,7 @@ static void pager_unlock(Pager *pPager){ } if( USEFETCH(pPager) ) sqlite3OsUnfetch(pPager->fd, 0, 0); pPager->errCode = SQLITE_OK; + setGetterMethod(pPager); } pPager->journalOff = 0; @@ -1870,6 +1899,7 @@ static int pager_error(Pager *pPager, int rc){ if( rc2==SQLITE_FULL || rc2==SQLITE_IOERR ){ pPager->errCode = rc; pPager->eState = PAGER_ERROR; + setGetterMethod(pPager); } return rc; } @@ -2038,7 +2068,7 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ pPager->pInJournal = 0; pPager->nRec = 0; if( rc==SQLITE_OK ){ - if( pagerFlushOnCommit(pPager, bCommit) ){ + if( MEMDB || pagerFlushOnCommit(pPager, bCommit) ){ sqlite3PcacheCleanAll(pPager->pPCache); }else{ sqlite3PcacheClearWritable(pPager->pPCache); @@ -3437,6 +3467,7 @@ static void pagerFixMaplimit(Pager *pPager){ sqlite3_int64 sz; sz = pPager->szMmap; pPager->bUseFetch = (sz>0); + setGetterMethod(pPager); sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_MMAP_SIZE, &sz); } #endif @@ -3933,6 +3964,7 @@ static int pagerSyncHotJournal(Pager *pPager){ return rc; } +#if SQLITE_MAX_MMAP_SIZE>0 /* ** Obtain a reference to a memory mapped page object for page number pgno. ** The new object will use the pointer pData, obtained from xFetch(). @@ -3955,7 +3987,8 @@ static int pagerAcquireMapPage( *ppPage = p = pPager->pMmapFreelist; pPager->pMmapFreelist = p->pDirty; p->pDirty = 0; - memset(p->pExtra, 0, pPager->nExtra); + assert( pPager->nExtra>=8 ); + memset(p->pExtra, 0, 8); }else{ *ppPage = p = (PgHdr *)sqlite3MallocZero(sizeof(PgHdr) + pPager->nExtra); if( p==0 ){ @@ -3980,6 +4013,7 @@ static int pagerAcquireMapPage( return SQLITE_OK; } +#endif /* ** Release a reference to page pPg. pPg must have been returned by an @@ -4022,9 +4056,10 @@ static void pagerFreeMapHdrs(Pager *pPager){ ** a hot journal may be left in the filesystem but no error is returned ** to the caller. */ -int sqlite3PagerClose(Pager *pPager){ +int sqlite3PagerClose(Pager *pPager, sqlite3 *db){ u8 *pTmp = (u8 *)pPager->pTmpSpace; + assert( db || pagerUseWal(pPager)==0 ); assert( assert_pager_state(pPager) ); disable_simulated_io_errors(); sqlite3BeginBenignMalloc(); @@ -4032,7 +4067,10 @@ int sqlite3PagerClose(Pager *pPager){ /* pPager->errCode = 0; */ pPager->exclusiveMode = 0; #ifndef SQLITE_OMIT_WAL - sqlite3WalClose(pPager->pWal, pPager->ckptSyncFlags, pPager->pageSize, pTmp); + assert( db || pPager->pWal==0 ); + sqlite3WalClose(pPager->pWal, db, pPager->ckptSyncFlags, pPager->pageSize, + (db && (db->flags & SQLITE_NoCkptOnClose) ? 0 : pTmp) + ); pPager->pWal = 0; #endif pager_reset(pPager); @@ -4551,7 +4589,9 @@ int sqlite3PagerFlush(Pager *pPager){ ** ** The nExtra parameter specifies the number of bytes of space allocated ** along with each page reference. This space is available to the user -** via the sqlite3PagerGetExtra() API. +** via the sqlite3PagerGetExtra() API. When a new page is allocated, the +** first 8 bytes of this space are zeroed but the remainder is uninitialized. +** (The extra space is used by btree as the MemPage object.) ** ** The flags argument is used to specify properties that affect the ** operation of the pager. It should be passed some bitwise combination @@ -4781,8 +4821,8 @@ int sqlite3PagerOpen( /* Initialize the PCache object. */ if( rc==SQLITE_OK ){ - assert( nExtra<1000 ); nExtra = ROUND8(nExtra); + assert( nExtra>=8 && nExtra<1000 ); rc = sqlite3PcacheOpen(szPageDflt, nExtra, !memDb, !memDb?pagerStress:0, (void *)pPager, pPager->pPCache); } @@ -4847,6 +4887,7 @@ int sqlite3PagerOpen( /* pPager->xBusyHandler = 0; */ /* pPager->pBusyHandlerArg = 0; */ pPager->xReiniter = xReinit; + setGetterMethod(pPager); /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */ /* pPager->szMmap = SQLITE_DEFAULT_MMAP_SIZE // will be set by btree.c */ @@ -5260,10 +5301,17 @@ static void pagerUnlockIfUnused(Pager *pPager){ } /* -** Acquire a reference to page number pgno in pager pPager (a page -** reference has type DbPage*). If the requested reference is +** The page getter methods each try to acquire a reference to a +** page with page number pgno. If the requested reference is ** successfully obtained, it is copied to *ppPage and SQLITE_OK returned. ** +** There are different implementations of the getter method depending +** on the current state of the pager. +** +** getPageNormal() -- The normal getter +** getPageError() -- Used if the pager is in an error state +** getPageMmap() -- Used if memory-mapped I/O is enabled +** ** If the requested page is already in the cache, it is returned. ** Otherwise, a new page object is allocated and populated with data ** read from the database file. In some cases, the pcache module may @@ -5275,14 +5323,14 @@ static void pagerUnlockIfUnused(Pager *pPager){ ** already in the cache when this function is called, then the extra ** data is left as it was when the page object was last used. ** -** If the database image is smaller than the requested page or if a -** non-zero value is passed as the noContent parameter and the +** If the database image is smaller than the requested page or if +** the flags parameter contains the PAGER_GET_NOCONTENT bit and the ** requested page is not already stored in the cache, then no ** actual disk read occurs. In this case the memory image of the ** page is initialized to all zeros. ** -** If noContent is true, it means that we do not care about the contents -** of the page. This occurs in two scenarios: +** If PAGER_GET_NOCONTENT is true, it means that we do not care about +** the contents of the page. This occurs in two scenarios: ** ** a) When reading a free-list leaf page from the database, and ** @@ -5290,8 +5338,8 @@ static void pagerUnlockIfUnused(Pager *pPager){ ** a new page into the cache to be filled with the data read ** from the savepoint journal. ** -** If noContent is true, then the data returned is zeroed instead of -** being read from the database. Additionally, the bits corresponding +** If PAGER_GET_NOCONTENT is true, then the data returned is zeroed instead +** of being read from the database. Additionally, the bits corresponding ** to pgno in Pager.pInJournal (bitvec of pages already written to the ** journal file) and the PagerSavepoint.pInSavepoint bitvecs of any open ** savepoints are set. This means if the page is made writable at any @@ -5309,106 +5357,39 @@ static void pagerUnlockIfUnused(Pager *pPager){ ** Since Lookup() never goes to disk, it never has to deal with locks ** or journal files. */ -int sqlite3PagerGet( +static int getPageNormal( Pager *pPager, /* The pager open on the database file */ Pgno pgno, /* Page number to fetch */ DbPage **ppPage, /* Write a pointer to the page here */ int flags /* PAGER_GET_XXX flags */ ){ int rc = SQLITE_OK; - PgHdr *pPg = 0; - u32 iFrame = 0; /* Frame to read from WAL file */ - const int noContent = (flags & PAGER_GET_NOCONTENT); - - /* It is acceptable to use a read-only (mmap) page for any page except - ** page 1 if there is no write-transaction open or the ACQUIRE_READONLY - ** flag was specified by the caller. And so long as the db is not a - ** temporary or in-memory database. */ - const int bMmapOk = (pgno>1 && USEFETCH(pPager) - && (pPager->eState==PAGER_READER || (flags & PAGER_GET_READONLY)) -#ifdef SQLITE_HAS_CODEC - && pPager->xCodec==0 -#endif - ); + PgHdr *pPg; + u8 noContent; /* True if PAGER_GET_NOCONTENT is set */ + sqlite3_pcache_page *pBase; - /* Optimization note: Adding the "pgno<=1" term before "pgno==0" here - ** allows the compiler optimizer to reuse the results of the "pgno>1" - ** test in the previous statement, and avoid testing pgno==0 in the - ** common case where pgno is large. */ - if( pgno<=1 && pgno==0 ){ - return SQLITE_CORRUPT_BKPT; - } + assert( pPager->errCode==SQLITE_OK ); assert( pPager->eState>=PAGER_READER ); assert( assert_pager_state(pPager) ); - assert( noContent==0 || bMmapOk==0 ); - assert( pPager->hasHeldSharedLock==1 ); - /* If the pager is in the error state, return an error immediately. - ** Otherwise, request the page from the PCache layer. */ - if( pPager->errCode!=SQLITE_OK ){ - rc = pPager->errCode; - }else{ - if( bMmapOk && pagerUseWal(pPager) ){ - rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iFrame); - if( rc!=SQLITE_OK ) goto pager_acquire_err; - } - - if( bMmapOk && iFrame==0 ){ - void *pData = 0; - - rc = sqlite3OsFetch(pPager->fd, - (i64)(pgno-1) * pPager->pageSize, pPager->pageSize, &pData - ); - - if( rc==SQLITE_OK && pData ){ - if( pPager->eState>PAGER_READER || pPager->tempFile ){ - pPg = sqlite3PagerLookup(pPager, pgno); - } - if( pPg==0 ){ - rc = pagerAcquireMapPage(pPager, pgno, pData, &pPg); - }else{ - sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1)*pPager->pageSize, pData); - } - if( pPg ){ - assert( rc==SQLITE_OK ); - *ppPage = pPg; - return SQLITE_OK; - } - } - if( rc!=SQLITE_OK ){ - goto pager_acquire_err; - } - } - - { - sqlite3_pcache_page *pBase; - pBase = sqlite3PcacheFetch(pPager->pPCache, pgno, 3); - if( pBase==0 ){ - rc = sqlite3PcacheFetchStress(pPager->pPCache, pgno, &pBase); - if( rc!=SQLITE_OK ) goto pager_acquire_err; - if( pBase==0 ){ - pPg = *ppPage = 0; - rc = SQLITE_NOMEM_BKPT; - goto pager_acquire_err; - } - } - pPg = *ppPage = sqlite3PcacheFetchFinish(pPager->pPCache, pgno, pBase); - assert( pPg!=0 ); - } - } - - if( rc!=SQLITE_OK ){ - /* Either the call to sqlite3PcacheFetch() returned an error or the - ** pager was already in the error-state when this function was called. - ** Set pPg to 0 and jump to the exception handler. */ + if( pgno==0 ) return SQLITE_CORRUPT_BKPT; + pBase = sqlite3PcacheFetch(pPager->pPCache, pgno, 3); + if( pBase==0 ){ pPg = 0; - goto pager_acquire_err; + rc = sqlite3PcacheFetchStress(pPager->pPCache, pgno, &pBase); + if( rc!=SQLITE_OK ) goto pager_acquire_err; + if( pBase==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto pager_acquire_err; + } } + pPg = *ppPage = sqlite3PcacheFetchFinish(pPager->pPCache, pgno, pBase); assert( pPg==(*ppPage) ); assert( pPg->pgno==pgno ); assert( pPg->pPager==pPager || pPg->pPager==0 ); + noContent = (flags & PAGER_GET_NOCONTENT)!=0; if( pPg->pPager && !noContent ){ /* In this case the pcache already contains an initialized copy of ** the page. Return without further ado. */ @@ -5418,17 +5399,18 @@ int sqlite3PagerGet( }else{ /* The pager cache has created a new page. Its content needs to - ** be initialized. */ - - pPg->pPager = pPager; - - /* The maximum page number is 2^31. Return SQLITE_CORRUPT if a page - ** number greater than this, or the unused locking-page, is requested. */ + ** be initialized. But first some error checks: + ** + ** (1) The maximum page number is 2^31 + ** (2) Never try to fetch the locking page + */ if( pgno>PAGER_MAX_PGNO || pgno==PAGER_MJ_PGNO(pPager) ){ rc = SQLITE_CORRUPT_BKPT; goto pager_acquire_err; } + pPg->pPager = pPager; + assert( !isOpen(pPager->fd) || !MEMDB ); if( !isOpen(pPager->fd) || pPager->dbSizepPager->mxPgno ){ @@ -5454,7 +5436,8 @@ int sqlite3PagerGet( memset(pPg->pData, 0, pPager->pageSize); IOTRACE(("ZERO %p %d\n", pPager, pgno)); }else{ - if( pagerUseWal(pPager) && bMmapOk==0 ){ + u32 iFrame = 0; /* Frame to read from WAL file */ + if( pagerUseWal(pPager) ){ rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iFrame); if( rc!=SQLITE_OK ) goto pager_acquire_err; } @@ -5467,7 +5450,6 @@ int sqlite3PagerGet( } pager_set_pagehash(pPg); } - return SQLITE_OK; pager_acquire_err: @@ -5476,11 +5458,109 @@ int sqlite3PagerGet( sqlite3PcacheDrop(pPg); } pagerUnlockIfUnused(pPager); - *ppPage = 0; return rc; } +#if SQLITE_MAX_MMAP_SIZE>0 +/* The page getter for when memory-mapped I/O is enabled */ +static int getPageMMap( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int flags /* PAGER_GET_XXX flags */ +){ + int rc = SQLITE_OK; + PgHdr *pPg = 0; + u32 iFrame = 0; /* Frame to read from WAL file */ + + /* It is acceptable to use a read-only (mmap) page for any page except + ** page 1 if there is no write-transaction open or the ACQUIRE_READONLY + ** flag was specified by the caller. And so long as the db is not a + ** temporary or in-memory database. */ + const int bMmapOk = (pgno>1 + && (pPager->eState==PAGER_READER || (flags & PAGER_GET_READONLY)) + ); + + assert( USEFETCH(pPager) ); +#ifdef SQLITE_HAS_CODEC + assert( pPager->xCodec==0 ); +#endif + + /* Optimization note: Adding the "pgno<=1" term before "pgno==0" here + ** allows the compiler optimizer to reuse the results of the "pgno>1" + ** test in the previous statement, and avoid testing pgno==0 in the + ** common case where pgno is large. */ + if( pgno<=1 && pgno==0 ){ + return SQLITE_CORRUPT_BKPT; + } + assert( pPager->eState>=PAGER_READER ); + assert( assert_pager_state(pPager) ); + assert( pPager->hasHeldSharedLock==1 ); + assert( pPager->errCode==SQLITE_OK ); + + if( bMmapOk && pagerUseWal(pPager) ){ + rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iFrame); + if( rc!=SQLITE_OK ){ + *ppPage = 0; + return rc; + } + } + if( bMmapOk && iFrame==0 ){ + void *pData = 0; + rc = sqlite3OsFetch(pPager->fd, + (i64)(pgno-1) * pPager->pageSize, pPager->pageSize, &pData + ); + if( rc==SQLITE_OK && pData ){ + if( pPager->eState>PAGER_READER || pPager->tempFile ){ + pPg = sqlite3PagerLookup(pPager, pgno); + } + if( pPg==0 ){ + rc = pagerAcquireMapPage(pPager, pgno, pData, &pPg); + }else{ + sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1)*pPager->pageSize, pData); + } + if( pPg ){ + assert( rc==SQLITE_OK ); + *ppPage = pPg; + return SQLITE_OK; + } + } + if( rc!=SQLITE_OK ){ + *ppPage = 0; + return rc; + } + } + return getPageNormal(pPager, pgno, ppPage, flags); +} +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + +/* The page getter method for when the pager is an error state */ +static int getPageError( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int flags /* PAGER_GET_XXX flags */ +){ + UNUSED_PARAMETER(pgno); + UNUSED_PARAMETER(flags); + assert( pPager->errCode!=SQLITE_OK ); + *ppPage = 0; + return pPager->errCode; +} + + +/* Dispatch all page fetch requests to the appropriate getter method. +*/ +int sqlite3PagerGet( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int flags /* PAGER_GET_XXX flags */ +){ + return pPager->xGet(pPager, pgno, ppPage, flags); +} + /* ** Acquire a page if it is already in the in-memory cache. Do ** not read the page from disk. Return a pointer to the page, @@ -5954,11 +6034,11 @@ int sqlite3PagerWrite(PgHdr *pPg){ assert( (pPg->flags & PGHDR_MMAP)==0 ); assert( pPager->eState>=PAGER_WRITER_LOCKED ); assert( assert_pager_state(pPager) ); - if( pPager->errCode ){ - return pPager->errCode; - }else if( (pPg->flags & PGHDR_WRITEABLE)!=0 && pPager->dbSize>=pPg->pgno ){ + if( (pPg->flags & PGHDR_WRITEABLE)!=0 && pPager->dbSize>=pPg->pgno ){ if( pPager->nSavepoint ) return subjournalPageIfRequired(pPg); return SQLITE_OK; + }else if( pPager->errCode ){ + return pPager->errCode; }else if( pPager->sectorSize > (u32)pPager->pageSize ){ assert( pPager->tempFile==0 ); return pagerWriteLargeSector(pPg); @@ -6453,6 +6533,7 @@ int sqlite3PagerRollback(Pager *pPager){ */ pPager->errCode = SQLITE_ABORT; pPager->eState = PAGER_ERROR; + setGetterMethod(pPager); return rc; } }else{ @@ -6714,6 +6795,7 @@ int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ ){ pPager->errCode = SQLITE_ABORT; pPager->eState = PAGER_ERROR; + setGetterMethod(pPager); } #endif } @@ -6786,6 +6868,7 @@ void sqlite3PagerSetCodec( pPager->xCodecSizeChng = xCodecSizeChng; pPager->xCodecFree = xCodecFree; pPager->pCodec = pCodec; + setGetterMethod(pPager); pagerReportSize(pPager); } void *sqlite3PagerGetCodec(Pager *pPager){ @@ -7195,10 +7278,16 @@ void sqlite3PagerClearCache(Pager *pPager){ ** ** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART. */ -int sqlite3PagerCheckpoint(Pager *pPager, int eMode, int *pnLog, int *pnCkpt){ +int sqlite3PagerCheckpoint( + Pager *pPager, /* Checkpoint on this pager */ + sqlite3 *db, /* Db handle used to check for interrupts */ + int eMode, /* Type of checkpoint */ + int *pnLog, /* OUT: Final number of frames in log */ + int *pnCkpt /* OUT: Final number of checkpointed frames */ +){ int rc = SQLITE_OK; if( pPager->pWal ){ - rc = sqlite3WalCheckpoint(pPager->pWal, eMode, + rc = sqlite3WalCheckpoint(pPager->pWal, db, eMode, (eMode==SQLITE_CHECKPOINT_PASSIVE ? 0 : pPager->xBusyHandler), pPager->pBusyHandlerArg, pPager->ckptSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace, @@ -7330,7 +7419,7 @@ int sqlite3PagerOpenWal( ** error (SQLITE_BUSY) is returned and the log connection is not closed. ** If successful, the EXCLUSIVE lock is not released before returning. */ -int sqlite3PagerCloseWal(Pager *pPager){ +int sqlite3PagerCloseWal(Pager *pPager, sqlite3 *db){ int rc = SQLITE_OK; assert( pPager->journalMode==PAGER_JOURNALMODE_WAL ); @@ -7358,7 +7447,7 @@ int sqlite3PagerCloseWal(Pager *pPager){ if( rc==SQLITE_OK && pPager->pWal ){ rc = pagerExclusiveLock(pPager); if( rc==SQLITE_OK ){ - rc = sqlite3WalClose(pPager->pWal, pPager->ckptSyncFlags, + rc = sqlite3WalClose(pPager->pWal, db, pPager->ckptSyncFlags, pPager->pageSize, (u8*)pPager->pTmpSpace); pPager->pWal = 0; pagerFixMaplimit(pPager); @@ -7395,6 +7484,20 @@ int sqlite3PagerSnapshotOpen(Pager *pPager, sqlite3_snapshot *pSnapshot){ } return rc; } + +/* +** If this is a WAL database, call sqlite3WalSnapshotRecover(). If this +** is not a WAL database, return an error. +*/ +int sqlite3PagerSnapshotRecover(Pager *pPager){ + int rc; + if( pPager->pWal ){ + rc = sqlite3WalSnapshotRecover(pPager->pWal); + }else{ + rc = SQLITE_ERROR; + } + return rc; +} #endif /* SQLITE_ENABLE_SNAPSHOT */ #endif /* !SQLITE_OMIT_WAL */ diff --git a/sqlite/src/pager.h b/sqlite/src/pager.h index fe71fde5..dd57f598 100644 --- a/sqlite/src/pager.h +++ b/sqlite/src/pager.h @@ -122,7 +122,7 @@ int sqlite3PagerOpen( int, void(*)(DbPage*) ); -int sqlite3PagerClose(Pager *pPager); +int sqlite3PagerClose(Pager *pPager, sqlite3*); int sqlite3PagerReadFileheader(Pager*, int, unsigned char*); /* Functions used to configure a Pager object. */ @@ -173,15 +173,16 @@ int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint); int sqlite3PagerSharedLock(Pager *pPager); #ifndef SQLITE_OMIT_WAL - int sqlite3PagerCheckpoint(Pager *pPager, int, int*, int*); + int sqlite3PagerCheckpoint(Pager *pPager, sqlite3*, int, int*, int*); int sqlite3PagerWalSupported(Pager *pPager); int sqlite3PagerWalCallback(Pager *pPager); int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen); - int sqlite3PagerCloseWal(Pager *pPager); + int sqlite3PagerCloseWal(Pager *pPager, sqlite3*); int sqlite3PagerUseWal(Pager *pPager); # ifdef SQLITE_ENABLE_SNAPSHOT int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppSnapshot); int sqlite3PagerSnapshotOpen(Pager *pPager, sqlite3_snapshot *pSnapshot); + int sqlite3PagerSnapshotRecover(Pager *pPager); # endif #else # define sqlite3PagerUseWal(x) 0 diff --git a/sqlite/src/parse.y b/sqlite/src/parse.y index 1eff123d..c9dbc767 100644 --- a/sqlite/src/parse.y +++ b/sqlite/src/parse.y @@ -268,7 +268,7 @@ ccons ::= DEFAULT LP expr(X) RP. {sqlite3AddDefaultValue(pParse,&X);} ccons ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,&X);} ccons ::= DEFAULT MINUS(A) term(X). { ExprSpan v; - v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0, 0); + v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0); v.zStart = A.z; v.zEnd = X.zEnd; sqlite3AddDefaultValue(pParse,&v); @@ -543,9 +543,9 @@ selcollist(A) ::= sclp(A) STAR. { A = sqlite3ExprListAppend(pParse, A, p); } selcollist(A) ::= sclp(A) nm(X) DOT STAR. { - Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0, 0); - Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); - Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); + Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0); + Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1); + Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); A = sqlite3ExprListAppend(pParse,A, pDot); } @@ -870,15 +870,15 @@ expr(A) ::= nm(X) DOT nm(Y). { Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1); Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1); spanSet(&A,&X,&Y); /*A-overwrites-X*/ - A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0); + A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); } expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1); Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1); Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &Z, 1); - Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0); + Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3); spanSet(&A,&X,&Z); /*A-overwrites-X*/ - A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0); + A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); } term(A) ::= FLOAT|BLOB(X). {spanExpr(&A,pParse,@X,X);/*A-overwrites-X*/} term(A) ::= STRING(X). {spanExpr(&A,pParse,@X,X);/*A-overwrites-X*/} @@ -904,7 +904,7 @@ expr(A) ::= VARIABLE(X). { sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t); A.pExpr = 0; }else{ - A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, 0); + A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); if( A.pExpr ) sqlite3GetInt32(&t.z[1], &A.pExpr->iTable); } } @@ -916,7 +916,8 @@ expr(A) ::= expr(A) COLLATE ids(C). { %ifndef SQLITE_OMIT_CAST expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). { spanSet(&A,&X,&Y); /*A-overwrites-X*/ - A.pExpr = sqlite3PExpr(pParse, TK_CAST, E.pExpr, 0, &T); + A.pExpr = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1); + sqlite3ExprAttachSubtrees(pParse->db, A.pExpr, E.pExpr, 0); } %endif SQLITE_OMIT_CAST expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP(E). { @@ -948,7 +949,7 @@ term(A) ::= CTIME_KW(OP). { ExprSpan *pLeft, /* The left operand, and output */ ExprSpan *pRight /* The right operand */ ){ - pLeft->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0); + pLeft->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr); pLeft->zEnd = pRight->zEnd; } @@ -957,14 +958,14 @@ term(A) ::= CTIME_KW(OP). { */ static void exprNot(Parse *pParse, int doNot, ExprSpan *pSpan){ if( doNot ){ - pSpan->pExpr = sqlite3PExpr(pParse, TK_NOT, pSpan->pExpr, 0, 0); + pSpan->pExpr = sqlite3PExpr(pParse, TK_NOT, pSpan->pExpr, 0); } } } expr(A) ::= LP(L) nexprlist(X) COMMA expr(Y) RP(R). { ExprList *pList = sqlite3ExprListAppend(pParse, X, Y.pExpr); - A.pExpr = sqlite3PExpr(pParse, TK_VECTOR, 0, 0, 0); + A.pExpr = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); if( A.pExpr ){ A.pExpr->x.pList = pList; spanSet(&A, &L, &R); @@ -1021,7 +1022,7 @@ expr(A) ::= expr(A) likeop(OP) expr(Y) ESCAPE expr(E). [LIKE_KW] { ExprSpan *pOperand, /* The operand, and output */ Token *pPostOp /* The operand token for setting the span */ ){ - pOperand->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); + pOperand->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0); pOperand->zEnd = &pPostOp->z[pPostOp->n]; } } @@ -1068,7 +1069,7 @@ expr(A) ::= expr(A) IS NOT expr(Y). { Token *pPreOp /* The operand token for setting the span */ ){ pOut->zStart = pPreOp->z; - pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); + pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0); pOut->zEnd = pOperand->zEnd; } } @@ -1090,7 +1091,7 @@ between_op(A) ::= NOT BETWEEN. {A = 1;} expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { ExprList *pList = sqlite3ExprListAppend(pParse,0, X.pExpr); pList = sqlite3ExprListAppend(pParse,pList, Y.pExpr); - A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, A.pExpr, 0, 0); + A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, A.pExpr, 0); if( A.pExpr ){ A.pExpr->x.pList = pList; }else{ @@ -1114,7 +1115,7 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { ** regardless of the value of expr1. */ sqlite3ExprDelete(pParse->db, A.pExpr); - A.pExpr = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &sqlite3IntTokens[N]); + A.pExpr = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1); }else if( Y->nExpr==1 ){ /* Expressions of the form: ** @@ -1141,9 +1142,9 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { pRHS->flags &= ~EP_Collate; pRHS->flags |= EP_Generic; } - A.pExpr = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, A.pExpr, pRHS, 0); + A.pExpr = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, A.pExpr, pRHS); }else{ - A.pExpr = sqlite3PExpr(pParse, TK_IN, A.pExpr, 0, 0); + A.pExpr = sqlite3PExpr(pParse, TK_IN, A.pExpr, 0); if( A.pExpr ){ A.pExpr->x.pList = Y; sqlite3ExprSetHeightAndFlags(pParse, A.pExpr); @@ -1156,11 +1157,11 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { } expr(A) ::= LP(B) select(X) RP(E). { spanSet(&A,&B,&E); /*A-overwrites-B*/ - A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); + A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0); sqlite3PExprAddSelect(pParse, A.pExpr, X); } expr(A) ::= expr(A) in_op(N) LP select(Y) RP(E). [IN] { - A.pExpr = sqlite3PExpr(pParse, TK_IN, A.pExpr, 0, 0); + A.pExpr = sqlite3PExpr(pParse, TK_IN, A.pExpr, 0); sqlite3PExprAddSelect(pParse, A.pExpr, Y); exprNot(pParse, N, &A); A.zEnd = &E.z[E.n]; @@ -1169,7 +1170,7 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); if( E ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E); - A.pExpr = sqlite3PExpr(pParse, TK_IN, A.pExpr, 0, 0); + A.pExpr = sqlite3PExpr(pParse, TK_IN, A.pExpr, 0); sqlite3PExprAddSelect(pParse, A.pExpr, pSelect); exprNot(pParse, N, &A); A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n]; @@ -1177,7 +1178,7 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { expr(A) ::= EXISTS(B) LP select(Y) RP(E). { Expr *p; spanSet(&A,&B,&E); /*A-overwrites-B*/ - p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); + p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); sqlite3PExprAddSelect(pParse, p, Y); } %endif SQLITE_OMIT_SUBQUERY @@ -1185,7 +1186,7 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { /* CASE expressions */ expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { spanSet(&A,&C,&E); /*A-overwrites-C*/ - A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, 0, 0); + A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, 0); if( A.pExpr ){ A.pExpr->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y; sqlite3ExprSetHeightAndFlags(pParse, A.pExpr); @@ -1445,14 +1446,14 @@ trigger_cmd(A) ::= select(X). // The special RAISE expression that may occur in trigger programs expr(A) ::= RAISE(X) LP IGNORE RP(Y). { spanSet(&A,&X,&Y); /*A-overwrites-X*/ - A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0); + A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0); if( A.pExpr ){ A.pExpr->affinity = OE_Ignore; } } expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). { spanSet(&A,&X,&Y); /*A-overwrites-X*/ - A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &Z); + A.pExpr = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1); if( A.pExpr ) { A.pExpr->affinity = (char)T; } diff --git a/sqlite/src/pcache.c b/sqlite/src/pcache.c index 68f4b51d..0fc44c54 100644 --- a/sqlite/src/pcache.c +++ b/sqlite/src/pcache.c @@ -108,7 +108,7 @@ struct PCache { int sqlite3PcachePageSanity(PgHdr *pPg){ PCache *pCache; assert( pPg!=0 ); - assert( pPg->pgno>0 ); /* Page number is 1 or more */ + assert( pPg->pgno>0 || pPg->pPager==0 ); /* Page number is 1 or more */ pCache = pPg->pCache; assert( pCache!=0 ); /* Every page has an associated PCache */ if( pPg->flags & PGHDR_CLEAN ){ @@ -284,6 +284,12 @@ int sqlite3PcacheSize(void){ return sizeof(PCache); } ** has already been allocated and is passed in as the p pointer. ** The caller discovers how much space needs to be allocated by ** calling sqlite3PcacheSize(). +** +** szExtra is some extra space allocated for each page. The first +** 8 bytes of the extra space will be zeroed as the page is allocated, +** but remaining content will be uninitialized. Though it is opaque +** to this module, the extra space really ends up being the MemPage +** structure in the pager. */ int sqlite3PcacheOpen( int szPage, /* Size of every page */ @@ -296,6 +302,7 @@ int sqlite3PcacheOpen( memset(p, 0, sizeof(PCache)); p->szPage = 1; p->szExtra = szExtra; + assert( szExtra>=8 ); /* First 8 bytes will be zeroed */ p->bPurgeable = bPurgeable; p->eCreate = 2; p->xStress = xStress; @@ -365,7 +372,6 @@ sqlite3_pcache_page *sqlite3PcacheFetch( assert( pCache!=0 ); assert( pCache->pCache!=0 ); assert( createFlag==3 || createFlag==0 ); - assert( pgno>0 ); assert( pCache->eCreate==((pCache->bPurgeable && pCache->pDirty) ? 1 : 2) ); /* eCreate defines what to do if the page does not exist. @@ -465,7 +471,7 @@ static SQLITE_NOINLINE PgHdr *pcacheFetchFinishWithInit( pPgHdr->pPage = pPage; pPgHdr->pData = pPage->pBuf; pPgHdr->pExtra = (void *)&pPgHdr[1]; - memset(pPgHdr->pExtra, 0, pCache->szExtra); + memset(pPgHdr->pExtra, 0, 8); pPgHdr->pCache = pCache; pPgHdr->pgno = pgno; pPgHdr->flags = PGHDR_CLEAN; diff --git a/sqlite/src/pragma.c b/sqlite/src/pragma.c index e774de34..6f2e0b54 100644 --- a/sqlite/src/pragma.c +++ b/sqlite/src/pragma.c @@ -163,29 +163,29 @@ static int changeTempStorage(Parse *pParse, const char *zStorageType){ #endif /* SQLITE_PAGER_PRAGMAS */ /* -** Set the names of the first N columns to the values in azCol[] +** Set result column names for a pragma. */ -static void setAllColumnNames( - Vdbe *v, /* The query under construction */ - int N, /* Number of columns */ - const char **azCol /* Names of columns */ +static void setPragmaResultColumnNames( + Vdbe *v, /* The query under construction */ + const PragmaName *pPragma /* The pragma */ ){ - int i; - sqlite3VdbeSetNumCols(v, N); - for(i=0; inPragCName; + sqlite3VdbeSetNumCols(v, n==0 ? 1 : n); + if( n==0 ){ + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, pPragma->zName, SQLITE_STATIC); + }else{ + int i, j; + for(i=0, j=pPragma->iPragCName; iupr ? 0 : &aPragmaName[mid]; +} + /* ** Process a pragma statement. ** @@ -305,12 +323,11 @@ void sqlite3Pragma( Token *pId; /* Pointer to token */ char *aFcntl[4]; /* Argument to SQLITE_FCNTL_PRAGMA */ int iDb; /* Database index for */ - int lwr, upr, mid = 0; /* Binary search bounds */ int rc; /* return value form SQLITE_FCNTL_PRAGMA */ sqlite3 *db = pParse->db; /* The database connection */ Db *pDb; /* The specific database being pragmaed */ Vdbe *v = sqlite3GetVdbe(pParse); /* Prepared statement */ - const struct sPragmaNames *pPragma; + const PragmaName *pPragma; /* The pragma */ if( v==0 ) return; sqlite3VdbeRunOnlyOnce(v); @@ -365,7 +382,9 @@ void sqlite3Pragma( db->busyHandler.nBusy = 0; rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_PRAGMA, (void*)aFcntl); if( rc==SQLITE_OK ){ - returnSingleText(v, "result", aFcntl[0]); + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, aFcntl[0], SQLITE_TRANSIENT); + returnSingleText(v, aFcntl[0]); sqlite3_free(aFcntl[0]); goto pragma_out; } @@ -380,26 +399,19 @@ void sqlite3Pragma( } /* Locate the pragma in the lookup table */ - lwr = 0; - upr = ArraySize(aPragmaNames)-1; - while( lwr<=upr ){ - mid = (lwr+upr)/2; - rc = sqlite3_stricmp(zLeft, aPragmaNames[mid].zName); - if( rc==0 ) break; - if( rc<0 ){ - upr = mid - 1; - }else{ - lwr = mid + 1; - } - } - if( lwr>upr ) goto pragma_out; - pPragma = &aPragmaNames[mid]; + pPragma = pragmaLocate(zLeft); + if( pPragma==0 ) goto pragma_out; /* Make sure the database schema is loaded if the pragma requires that */ - if( (pPragma->mPragFlag & PragFlag_NeedSchema)!=0 ){ + if( (pPragma->mPragFlg & PragFlg_NeedSchema)!=0 ){ if( sqlite3ReadSchema(pParse) ) goto pragma_out; } + /* Register the result column names for pragmas that return results */ + if( (pPragma->mPragFlg & PragFlg_NoColumns)==0 ){ + setPragmaResultColumnNames(v, pPragma); + } + /* Jump to the appropriate pragma handler */ switch( pPragma->ePragTyp ){ @@ -436,7 +448,6 @@ void sqlite3Pragma( VdbeOp *aOp; sqlite3VdbeUsesBtree(v, iDb); if( !zRight ){ - setOneColumnName(v, "cache_size"); pParse->nMem += 2; sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(getCacheSize)); aOp = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize, iLn); @@ -471,7 +482,7 @@ void sqlite3Pragma( assert( pBt!=0 ); if( !zRight ){ int size = ALWAYS(pBt) ? sqlite3BtreeGetPageSize(pBt) : 0; - returnSingleInt(v, "page_size", size); + returnSingleInt(v, size); }else{ /* Malloc may fail when setting the page-size, as there is an internal ** buffer that the pager module resizes using sqlite3_realloc(). @@ -506,7 +517,7 @@ void sqlite3Pragma( } } b = sqlite3BtreeSecureDelete(pBt, b); - returnSingleInt(v, "secure_delete", b); + returnSingleInt(v, b); break; } @@ -538,8 +549,6 @@ void sqlite3Pragma( sqlite3AbsInt32(sqlite3Atoi(zRight))); } sqlite3VdbeAddOp2(v, OP_ResultRow, iReg, 1); - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, SQLITE_TRANSIENT); break; } @@ -585,7 +594,7 @@ void sqlite3Pragma( if( eMode==PAGER_LOCKINGMODE_EXCLUSIVE ){ zRet = "exclusive"; } - returnSingleText(v, "locking_mode", zRet); + returnSingleText(v, zRet); break; } @@ -598,7 +607,6 @@ void sqlite3Pragma( int eMode; /* One of the PAGER_JOURNALMODE_XXX symbols */ int ii; /* Loop counter */ - setOneColumnName(v, "journal_mode"); if( zRight==0 ){ /* If there is no "=MODE" part of the pragma, do a query for the ** current mode */ @@ -644,7 +652,7 @@ void sqlite3Pragma( if( iLimit<-1 ) iLimit = -1; } iLimit = sqlite3PagerJournalSizeLimit(pPager, iLimit); - returnSingleInt(v, "journal_size_limit", iLimit); + returnSingleInt(v, iLimit); break; } @@ -662,7 +670,7 @@ void sqlite3Pragma( Btree *pBt = pDb->pBt; assert( pBt!=0 ); if( !zRight ){ - returnSingleInt(v, "auto_vacuum", sqlite3BtreeGetAutoVacuum(pBt)); + returnSingleInt(v, sqlite3BtreeGetAutoVacuum(pBt)); }else{ int eAuto = getAutoVacuum(zRight); assert( eAuto>=0 && eAuto<=2 ); @@ -741,7 +749,7 @@ void sqlite3Pragma( case PragTyp_CACHE_SIZE: { assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); if( !zRight ){ - returnSingleInt(v, "cache_size", pDb->pSchema->cache_size); + returnSingleInt(v, pDb->pSchema->cache_size); }else{ int size = sqlite3Atoi(zRight); pDb->pSchema->cache_size = size; @@ -775,7 +783,7 @@ void sqlite3Pragma( case PragTyp_CACHE_SPILL: { assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); if( !zRight ){ - returnSingleInt(v, "cache_spill", + returnSingleInt(v, (db->flags & SQLITE_CacheSpill)==0 ? 0 : sqlite3BtreeSetSpillSize(pDb->pBt,0)); }else{ @@ -829,7 +837,7 @@ void sqlite3Pragma( rc = SQLITE_OK; #endif if( rc==SQLITE_OK ){ - returnSingleInt(v, "mmap_size", sz); + returnSingleInt(v, sz); }else if( rc!=SQLITE_NOTFOUND ){ pParse->nErr++; pParse->rc = rc; @@ -850,7 +858,7 @@ void sqlite3Pragma( */ case PragTyp_TEMP_STORE: { if( !zRight ){ - returnSingleInt(v, "temp_store", db->temp_store); + returnSingleInt(v, db->temp_store); }else{ changeTempStorage(pParse, zRight); } @@ -869,7 +877,7 @@ void sqlite3Pragma( */ case PragTyp_TEMP_STORE_DIRECTORY: { if( !zRight ){ - returnSingleText(v, "temp_store_directory", sqlite3_temp_directory); + returnSingleText(v, sqlite3_temp_directory); }else{ #ifndef SQLITE_OMIT_WSD if( zRight[0] ){ @@ -913,7 +921,7 @@ void sqlite3Pragma( */ case PragTyp_DATA_STORE_DIRECTORY: { if( !zRight ){ - returnSingleText(v, "data_store_directory", sqlite3_data_directory); + returnSingleText(v, sqlite3_data_directory); }else{ #ifndef SQLITE_OMIT_WSD if( zRight[0] ){ @@ -952,7 +960,7 @@ void sqlite3Pragma( sqlite3_file *pFile = sqlite3PagerFile(pPager); sqlite3OsFileControlHint(pFile, SQLITE_GET_LOCKPROXYFILE, &proxy_file_path); - returnSingleText(v, "lock_proxy_file", proxy_file_path); + returnSingleText(v, proxy_file_path); }else{ Pager *pPager = sqlite3BtreePager(pDb->pBt); sqlite3_file *pFile = sqlite3PagerFile(pPager); @@ -984,7 +992,7 @@ void sqlite3Pragma( */ case PragTyp_SYNCHRONOUS: { if( !zRight ){ - returnSingleInt(v, "synchronous", pDb->safety_level-1); + returnSingleInt(v, pDb->safety_level-1); }else{ if( !db->autoCommit ){ sqlite3ErrorMsg(pParse, @@ -1004,7 +1012,8 @@ void sqlite3Pragma( #ifndef SQLITE_OMIT_FLAG_PRAGMAS case PragTyp_FLAG: { if( zRight==0 ){ - returnSingleInt(v, pPragma->zName, (db->flags & pPragma->iArg)!=0 ); + setPragmaResultColumnNames(v, pPragma); + returnSingleInt(v, (db->flags & pPragma->iArg)!=0 ); }else{ int mask = pPragma->iArg; /* Mask of bits to set or clear. */ if( db->autoCommit==0 ){ @@ -1054,16 +1063,12 @@ void sqlite3Pragma( Table *pTab; pTab = sqlite3LocateTable(pParse, LOCATE_NOERR, zRight, zDb); if( pTab ){ - static const char *azCol[] = { - "cid", "name", "type", "notnull", "dflt_value", "pk" - }; int i, k; int nHidden = 0; Column *pCol; Index *pPk = sqlite3PrimaryKeyIndex(pTab); pParse->nMem = 6; sqlite3CodeVerifySchema(pParse, iDb); - setAllColumnNames(v, 6, azCol); assert( 6==ArraySize(azCol) ); sqlite3ViewGetColumnNames(pParse, pTab); for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ if( IsHiddenColumn(pCol) ){ @@ -1092,13 +1097,10 @@ void sqlite3Pragma( break; case PragTyp_STATS: { - static const char *azCol[] = { "table", "index", "width", "height" }; Index *pIdx; HashElem *i; - v = sqlite3GetVdbe(pParse); pParse->nMem = 4; sqlite3CodeVerifySchema(pParse, iDb); - setAllColumnNames(v, 4, azCol); assert( 4==ArraySize(azCol) ); for(i=sqliteHashFirst(&pDb->pSchema->tblHash); i; i=sqliteHashNext(i)){ Table *pTab = sqliteHashData(i); sqlite3VdbeMultiLoad(v, 1, "ssii", @@ -1123,9 +1125,6 @@ void sqlite3Pragma( Table *pTab; pIdx = sqlite3FindIndex(db, zRight, zDb); if( pIdx ){ - static const char *azCol[] = { - "seqno", "cid", "name", "desc", "coll", "key" - }; int i; int mx; if( pPragma->iArg ){ @@ -1139,8 +1138,7 @@ void sqlite3Pragma( } pTab = pIdx->pTable; sqlite3CodeVerifySchema(pParse, iDb); - assert( pParse->nMem<=ArraySize(azCol) ); - setAllColumnNames(v, pParse->nMem, azCol); + assert( pParse->nMem<=pPragma->nPragCName ); for(i=0; iaiColumn[i]; sqlite3VdbeMultiLoad(v, 1, "iis", i, cnum, @@ -1163,13 +1161,8 @@ void sqlite3Pragma( int i; pTab = sqlite3FindTable(db, zRight, zDb); if( pTab ){ - static const char *azCol[] = { - "seq", "name", "unique", "origin", "partial" - }; - v = sqlite3GetVdbe(pParse); pParse->nMem = 5; sqlite3CodeVerifySchema(pParse, iDb); - setAllColumnNames(v, 5, azCol); assert( 5==ArraySize(azCol) ); for(pIdx=pTab->pIndex, i=0; pIdx; pIdx=pIdx->pNext, i++){ const char *azOrigin[] = { "c", "u", "pk" }; sqlite3VdbeMultiLoad(v, 1, "isisi", @@ -1185,10 +1178,8 @@ void sqlite3Pragma( break; case PragTyp_DATABASE_LIST: { - static const char *azCol[] = { "seq", "name", "file" }; int i; pParse->nMem = 3; - setAllColumnNames(v, 3, azCol); assert( 3==ArraySize(azCol) ); for(i=0; inDb; i++){ if( db->aDb[i].pBt==0 ) continue; assert( db->aDb[i].zDbSName!=0 ); @@ -1202,11 +1193,9 @@ void sqlite3Pragma( break; case PragTyp_COLLATION_LIST: { - static const char *azCol[] = { "seq", "name" }; int i = 0; HashElem *p; pParse->nMem = 2; - setAllColumnNames(v, 2, azCol); assert( 2==ArraySize(azCol) ); for(p=sqliteHashFirst(&db->aCollSeq); p; p=sqliteHashNext(p)){ CollSeq *pColl = (CollSeq *)sqliteHashData(p); sqlite3VdbeMultiLoad(v, 1, "is", i++, pColl->zName); @@ -1222,17 +1211,11 @@ void sqlite3Pragma( Table *pTab; pTab = sqlite3FindTable(db, zRight, zDb); if( pTab ){ - v = sqlite3GetVdbe(pParse); pFK = pTab->pFKey; if( pFK ){ - static const char *azCol[] = { - "id", "seq", "table", "from", "to", "on_update", "on_delete", - "match" - }; int i = 0; pParse->nMem = 8; sqlite3CodeVerifySchema(pParse, iDb); - setAllColumnNames(v, 8, azCol); assert( 8==ArraySize(azCol) ); while(pFK){ int j; for(j=0; jnCol; j++){ @@ -1273,14 +1256,11 @@ void sqlite3Pragma( int addrTop; /* Top of a loop checking foreign keys */ int addrOk; /* Jump here if the key is OK */ int *aiCols; /* child to parent column mapping */ - static const char *azCol[] = { "table", "rowid", "parent", "fkid" }; regResult = pParse->nMem+1; pParse->nMem += 4; regKey = ++pParse->nMem; regRow = ++pParse->nMem; - v = sqlite3GetVdbe(pParse); - setAllColumnNames(v, 4, azCol); assert( 4==ArraySize(azCol) ); sqlite3CodeVerifySchema(pParse, iDb); k = sqliteHashFirst(&db->aDb[iDb].pSchema->tblHash); while( k ){ @@ -1419,7 +1399,6 @@ void sqlite3Pragma( /* Initialize the VDBE program */ pParse->nMem = 6; - setOneColumnName(v, "integrity_check"); /* Set the maximum error count */ mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; @@ -1671,7 +1650,7 @@ void sqlite3Pragma( assert( encnames[SQLITE_UTF8].enc==SQLITE_UTF8 ); assert( encnames[SQLITE_UTF16LE].enc==SQLITE_UTF16LE ); assert( encnames[SQLITE_UTF16BE].enc==SQLITE_UTF16BE ); - returnSingleText(v, "encoding", encnames[ENC(pParse->db)].zName); + returnSingleText(v, encnames[ENC(pParse->db)].zName); }else{ /* "PRAGMA encoding = XXX" */ /* Only change the value of sqlite.enc if the database handle is not ** initialized. If the main database exists, the new sqlite.enc value @@ -1734,7 +1713,7 @@ void sqlite3Pragma( case PragTyp_HEADER_VALUE: { int iCookie = pPragma->iArg; /* Which cookie to read or write */ sqlite3VdbeUsesBtree(v, iDb); - if( zRight && (pPragma->mPragFlag & PragFlag_ReadOnly)==0 ){ + if( zRight && (pPragma->mPragFlg & PragFlg_ReadOnly)==0 ){ /* Write the specified cookie value */ static const VdbeOpList setCookie[] = { { OP_Transaction, 0, 1, 0}, /* 0 */ @@ -1762,8 +1741,6 @@ void sqlite3Pragma( aOp[0].p1 = iDb; aOp[1].p1 = iDb; aOp[1].p3 = iCookie; - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, SQLITE_TRANSIENT); sqlite3VdbeReusable(v); } } @@ -1781,7 +1758,6 @@ void sqlite3Pragma( int i = 0; const char *zOpt; pParse->nMem = 1; - setOneColumnName(v, "compile_option"); while( (zOpt = sqlite3_compileoption_get(i++))!=0 ){ sqlite3VdbeLoadString(v, 1, zOpt); sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); @@ -1798,7 +1774,6 @@ void sqlite3Pragma( ** Checkpoint the database. */ case PragTyp_WAL_CHECKPOINT: { - static const char *azCol[] = { "busy", "log", "checkpointed" }; int iBt = (pId2->z?iDb:SQLITE_MAX_ATTACHED); int eMode = SQLITE_CHECKPOINT_PASSIVE; if( zRight ){ @@ -1810,7 +1785,6 @@ void sqlite3Pragma( eMode = SQLITE_CHECKPOINT_TRUNCATE; } } - setAllColumnNames(v, 3, azCol); assert( 3==ArraySize(azCol) ); pParse->nMem = 3; sqlite3VdbeAddOp3(v, OP_Checkpoint, iBt, eMode, 1); sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); @@ -1829,7 +1803,7 @@ void sqlite3Pragma( if( zRight ){ sqlite3_wal_autocheckpoint(db, sqlite3Atoi(zRight)); } - returnSingleInt(v, "wal_autocheckpoint", + returnSingleInt(v, db->xWalCallback==sqlite3WalDefaultHook ? SQLITE_PTR_TO_INT(db->pWalArg) : 0); } @@ -1862,7 +1836,7 @@ void sqlite3Pragma( if( zRight ){ sqlite3_busy_timeout(db, sqlite3Atoi(zRight)); } - returnSingleInt(v, "timeout", db->busyTimeout); + returnSingleInt(v, db->busyTimeout); break; } @@ -1882,7 +1856,7 @@ void sqlite3Pragma( if( zRight && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK ){ sqlite3_soft_heap_limit64(N); } - returnSingleInt(v, "soft_heap_limit", sqlite3_soft_heap_limit64(-1)); + returnSingleInt(v, sqlite3_soft_heap_limit64(-1)); break; } @@ -1901,8 +1875,7 @@ void sqlite3Pragma( ){ sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, (int)(N&0x7fffffff)); } - returnSingleInt(v, "threads", - sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, -1)); + returnSingleInt(v, sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, -1)); break; } @@ -1914,9 +1887,7 @@ void sqlite3Pragma( static const char *const azLockName[] = { "unlocked", "shared", "reserved", "pending", "exclusive" }; - static const char *azCol[] = { "database", "status" }; int i; - setAllColumnNames(v, 2, azCol); assert( 2==ArraySize(azCol) ); pParse->nMem = 2; for(i=0; inDb; i++){ Btree *pBt; @@ -1986,5 +1957,311 @@ void sqlite3Pragma( sqlite3DbFree(db, zLeft); sqlite3DbFree(db, zRight); } +#ifndef SQLITE_OMIT_VIRTUALTABLE +/***************************************************************************** +** Implementation of an eponymous virtual table that runs a pragma. +** +*/ +typedef struct PragmaVtab PragmaVtab; +typedef struct PragmaVtabCursor PragmaVtabCursor; +struct PragmaVtab { + sqlite3_vtab base; /* Base class. Must be first */ + sqlite3 *db; /* The database connection to which it belongs */ + const PragmaName *pName; /* Name of the pragma */ + u8 nHidden; /* Number of hidden columns */ + u8 iHidden; /* Index of the first hidden column */ +}; +struct PragmaVtabCursor { + sqlite3_vtab_cursor base; /* Base class. Must be first */ + sqlite3_stmt *pPragma; /* The pragma statement to run */ + sqlite_int64 iRowid; /* Current rowid */ + char *azArg[2]; /* Value of the argument and schema */ +}; + +/* +** Pragma virtual table module xConnect method. +*/ +static int pragmaVtabConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + const PragmaName *pPragma = (const PragmaName*)pAux; + PragmaVtab *pTab = 0; + int rc; + int i, j; + char cSep = '('; + StrAccum acc; + char zBuf[200]; + + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + sqlite3StrAccumAppendAll(&acc, "CREATE TABLE x"); + for(i=0, j=pPragma->iPragCName; inPragCName; i++, j++){ + sqlite3XPrintf(&acc, "%c\"%s\"", cSep, pragCName[j]); + cSep = ','; + } + if( i==0 ){ + sqlite3XPrintf(&acc, "(\"%s\"", pPragma->zName); + cSep = ','; + i++; + } + j = 0; + if( pPragma->mPragFlg & PragFlg_Result1 ){ + sqlite3StrAccumAppendAll(&acc, ",arg HIDDEN"); + j++; + } + if( pPragma->mPragFlg & (PragFlg_SchemaOpt|PragFlg_SchemaReq) ){ + sqlite3StrAccumAppendAll(&acc, ",schema HIDDEN"); + j++; + } + sqlite3StrAccumAppend(&acc, ")", 1); + sqlite3StrAccumFinish(&acc); + assert( strlen(zBuf) < sizeof(zBuf)-1 ); + rc = sqlite3_declare_vtab(db, zBuf); + if( rc==SQLITE_OK ){ + pTab = (PragmaVtab*)sqlite3_malloc(sizeof(PragmaVtab)); + if( pTab==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(pTab, 0, sizeof(PragmaVtab)); + pTab->pName = pPragma; + pTab->db = db; + pTab->iHidden = i; + pTab->nHidden = j; + } + }else{ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + } + + *ppVtab = (sqlite3_vtab*)pTab; + return rc; +} + +/* +** Pragma virtual table module xDisconnect method. +*/ +static int pragmaVtabDisconnect(sqlite3_vtab *pVtab){ + PragmaVtab *pTab = (PragmaVtab*)pVtab; + sqlite3_free(pTab); + return SQLITE_OK; +} + +/* Figure out the best index to use to search a pragma virtual table. +** +** There are not really any index choices. But we want to encourage the +** query planner to give == constraints on as many hidden parameters as +** possible, and especially on the first hidden parameter. So return a +** high cost if hidden parameters are unconstrained. +*/ +static int pragmaVtabBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ + PragmaVtab *pTab = (PragmaVtab*)tab; + const struct sqlite3_index_constraint *pConstraint; + int i, j; + int seen[2]; + + pIdxInfo->estimatedCost = (double)1; + if( pTab->nHidden==0 ){ return SQLITE_OK; } + pConstraint = pIdxInfo->aConstraint; + seen[0] = 0; + seen[1] = 0; + for(i=0; inConstraint; i++, pConstraint++){ + if( pConstraint->usable==0 ) continue; + if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + if( pConstraint->iColumn < pTab->iHidden ) continue; + j = pConstraint->iColumn - pTab->iHidden; + assert( j < 2 ); + seen[j] = i+1; + } + if( seen[0]==0 ){ + pIdxInfo->estimatedCost = (double)2147483647; + pIdxInfo->estimatedRows = 2147483647; + return SQLITE_OK; + } + j = seen[0]-1; + pIdxInfo->aConstraintUsage[j].argvIndex = 1; + pIdxInfo->aConstraintUsage[j].omit = 1; + if( seen[1]==0 ) return SQLITE_OK; + pIdxInfo->estimatedCost = (double)20; + pIdxInfo->estimatedRows = 20; + j = seen[1]-1; + pIdxInfo->aConstraintUsage[j].argvIndex = 2; + pIdxInfo->aConstraintUsage[j].omit = 1; + return SQLITE_OK; +} + +/* Create a new cursor for the pragma virtual table */ +static int pragmaVtabOpen(sqlite3_vtab *pVtab, sqlite3_vtab_cursor **ppCursor){ + PragmaVtabCursor *pCsr; + pCsr = (PragmaVtabCursor*)sqlite3_malloc(sizeof(*pCsr)); + if( pCsr==0 ) return SQLITE_NOMEM; + memset(pCsr, 0, sizeof(PragmaVtabCursor)); + pCsr->base.pVtab = pVtab; + *ppCursor = &pCsr->base; + return SQLITE_OK; +} + +/* Clear all content from pragma virtual table cursor. */ +static void pragmaVtabCursorClear(PragmaVtabCursor *pCsr){ + int i; + sqlite3_finalize(pCsr->pPragma); + pCsr->pPragma = 0; + for(i=0; iazArg); i++){ + sqlite3_free(pCsr->azArg[i]); + pCsr->azArg[i] = 0; + } +} + +/* Close a pragma virtual table cursor */ +static int pragmaVtabClose(sqlite3_vtab_cursor *cur){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)cur; + pragmaVtabCursorClear(pCsr); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* Advance the pragma virtual table cursor to the next row */ +static int pragmaVtabNext(sqlite3_vtab_cursor *pVtabCursor){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + int rc = SQLITE_OK; + + /* Increment the xRowid value */ + pCsr->iRowid++; + assert( pCsr->pPragma ); + if( SQLITE_ROW!=sqlite3_step(pCsr->pPragma) ){ + rc = sqlite3_finalize(pCsr->pPragma); + pCsr->pPragma = 0; + pragmaVtabCursorClear(pCsr); + } + return rc; +} + +/* +** Pragma virtual table module xFilter method. +*/ +static int pragmaVtabFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + PragmaVtab *pTab = (PragmaVtab*)(pVtabCursor->pVtab); + int rc; + int i, j; + StrAccum acc; + char *zSql; + + UNUSED_PARAMETER(idxNum); + UNUSED_PARAMETER(idxStr); + pragmaVtabCursorClear(pCsr); + j = (pTab->pName->mPragFlg & PragFlg_Result1)!=0 ? 0 : 1; + for(i=0; iazArg) ); + pCsr->azArg[j] = sqlite3_mprintf("%s", sqlite3_value_text(argv[i])); + if( pCsr->azArg[j]==0 ){ + return SQLITE_NOMEM; + } + } + sqlite3StrAccumInit(&acc, 0, 0, 0, pTab->db->aLimit[SQLITE_LIMIT_SQL_LENGTH]); + sqlite3StrAccumAppendAll(&acc, "PRAGMA "); + if( pCsr->azArg[1] ){ + sqlite3XPrintf(&acc, "%Q.", pCsr->azArg[1]); + } + sqlite3StrAccumAppendAll(&acc, pTab->pName->zName); + if( pCsr->azArg[0] ){ + sqlite3XPrintf(&acc, "=%Q", pCsr->azArg[0]); + } + zSql = sqlite3StrAccumFinish(&acc); + if( zSql==0 ) return SQLITE_NOMEM; + rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pCsr->pPragma, 0); + sqlite3_free(zSql); + if( rc!=SQLITE_OK ){ + pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db)); + return rc; + } + return pragmaVtabNext(pVtabCursor); +} + +/* +** Pragma virtual table module xEof method. +*/ +static int pragmaVtabEof(sqlite3_vtab_cursor *pVtabCursor){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + return (pCsr->pPragma==0); +} + +/* The xColumn method simply returns the corresponding column from +** the PRAGMA. +*/ +static int pragmaVtabColumn( + sqlite3_vtab_cursor *pVtabCursor, + sqlite3_context *ctx, + int i +){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + PragmaVtab *pTab = (PragmaVtab*)(pVtabCursor->pVtab); + if( iiHidden ){ + sqlite3_result_value(ctx, sqlite3_column_value(pCsr->pPragma, i)); + }else{ + sqlite3_result_text(ctx, pCsr->azArg[i-pTab->iHidden],-1,SQLITE_TRANSIENT); + } + return SQLITE_OK; +} + +/* +** Pragma virtual table module xRowid method. +*/ +static int pragmaVtabRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *p){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + *p = pCsr->iRowid; + return SQLITE_OK; +} + +/* The pragma virtual table object */ +static const sqlite3_module pragmaVtabModule = { + 0, /* iVersion */ + 0, /* xCreate - create a table */ + pragmaVtabConnect, /* xConnect - connect to an existing table */ + pragmaVtabBestIndex, /* xBestIndex - Determine search strategy */ + pragmaVtabDisconnect, /* xDisconnect - Disconnect from a table */ + 0, /* xDestroy - Drop a table */ + pragmaVtabOpen, /* xOpen - open a cursor */ + pragmaVtabClose, /* xClose - close a cursor */ + pragmaVtabFilter, /* xFilter - configure scan constraints */ + pragmaVtabNext, /* xNext - advance a cursor */ + pragmaVtabEof, /* xEof */ + pragmaVtabColumn, /* xColumn - read data */ + pragmaVtabRowid, /* xRowid - read data */ + 0, /* xUpdate - write data */ + 0, /* xBegin - begin transaction */ + 0, /* xSync - sync transaction */ + 0, /* xCommit - commit transaction */ + 0, /* xRollback - rollback transaction */ + 0, /* xFindFunction - function overloading */ + 0, /* xRename - rename the table */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0 /* xRollbackTo */ +}; + +/* +** Check to see if zTabName is really the name of a pragma. If it is, +** then register an eponymous virtual table for that pragma and return +** a pointer to the Module object for the new virtual table. +*/ +Module *sqlite3PragmaVtabRegister(sqlite3 *db, const char *zName){ + const PragmaName *pName; + assert( sqlite3_strnicmp(zName, "pragma_", 7)==0 ); + pName = pragmaLocate(zName+7); + if( pName==0 ) return 0; + if( (pName->mPragFlg & (PragFlg_Result0|PragFlg_Result1))==0 ) return 0; + assert( sqlite3HashFind(&db->aModule, zName)==0 ); + return sqlite3VtabCreateModule(db, zName, &pragmaVtabModule, (void*)pName, 0); +} + +#endif /* SQLITE_OMIT_VIRTUALTABLE */ #endif /* SQLITE_OMIT_PRAGMA */ diff --git a/sqlite/src/pragma.h b/sqlite/src/pragma.h index 81779e9d..b854b4f3 100644 --- a/sqlite/src/pragma.h +++ b/sqlite/src/pragma.h @@ -3,6 +3,8 @@ ** ../tool/mkpragmatab.tcl. To update the set of pragmas, edit ** that script and rerun it. */ + +/* The various pragma types */ #define PragTyp_HEADER_VALUE 0 #define PragTyp_AUTO_VACUUM 1 #define PragTyp_FLAG 2 @@ -46,419 +48,559 @@ #define PragTyp_REKEY 40 #define PragTyp_LOCK_STATUS 41 #define PragTyp_PARSER_TRACE 42 -#define PragFlag_NeedSchema 0x01 -#define PragFlag_ReadOnly 0x02 -static const struct sPragmaNames { - const char *const zName; /* Name of pragma */ - u8 ePragTyp; /* PragTyp_XXX value */ - u8 mPragFlag; /* Zero or more PragFlag_XXX values */ - u32 iArg; /* Extra argument */ -} aPragmaNames[] = { + +/* Property flags associated with various pragma. */ +#define PragFlg_NeedSchema 0x01 /* Force schema load before running */ +#define PragFlg_NoColumns 0x02 /* OP_ResultRow called with zero columns */ +#define PragFlg_ReadOnly 0x04 /* Read-only HEADER_VALUE */ +#define PragFlg_Result0 0x08 /* Acts as query when no argument */ +#define PragFlg_Result1 0x10 /* Acts as query when has one argument */ +#define PragFlg_SchemaOpt 0x20 /* Schema restricts name search if present */ +#define PragFlg_SchemaReq 0x40 /* Schema required - "main" is default */ + +/* Names of columns for pragmas that return multi-column result +** or that return single-column results where the name of the +** result column is different from the name of the pragma +*/ +static const char *const pragCName[] = { + /* 0 */ "cache_size", /* Used by: default_cache_size */ + /* 1 */ "cid", /* Used by: table_info */ + /* 2 */ "name", + /* 3 */ "type", + /* 4 */ "notnull", + /* 5 */ "dflt_value", + /* 6 */ "pk", + /* 7 */ "table", /* Used by: stats */ + /* 8 */ "index", + /* 9 */ "width", + /* 10 */ "height", + /* 11 */ "seqno", /* Used by: index_info */ + /* 12 */ "cid", + /* 13 */ "name", + /* 14 */ "seqno", /* Used by: index_xinfo */ + /* 15 */ "cid", + /* 16 */ "name", + /* 17 */ "desc", + /* 18 */ "coll", + /* 19 */ "key", + /* 20 */ "seq", /* Used by: index_list */ + /* 21 */ "name", + /* 22 */ "unique", + /* 23 */ "origin", + /* 24 */ "partial", + /* 25 */ "seq", /* Used by: database_list */ + /* 26 */ "name", + /* 27 */ "file", + /* 28 */ "seq", /* Used by: collation_list */ + /* 29 */ "name", + /* 30 */ "id", /* Used by: foreign_key_list */ + /* 31 */ "seq", + /* 32 */ "table", + /* 33 */ "from", + /* 34 */ "to", + /* 35 */ "on_update", + /* 36 */ "on_delete", + /* 37 */ "match", + /* 38 */ "table", /* Used by: foreign_key_check */ + /* 39 */ "rowid", + /* 40 */ "parent", + /* 41 */ "fkid", + /* 42 */ "busy", /* Used by: wal_checkpoint */ + /* 43 */ "log", + /* 44 */ "checkpointed", + /* 45 */ "timeout", /* Used by: busy_timeout */ + /* 46 */ "database", /* Used by: lock_status */ + /* 47 */ "status", +}; + +/* Definitions of all built-in pragmas */ +typedef struct PragmaName { + const char *const zName; /* Name of pragma */ + u8 ePragTyp; /* PragTyp_XXX value */ + u8 mPragFlg; /* Zero or more PragFlg_XXX values */ + u8 iPragCName; /* Start of column names in pragCName[] */ + u8 nPragCName; /* Num of col names. 0 means use pragma name */ + u32 iArg; /* Extra argument */ +} PragmaName; +static const PragmaName aPragmaName[] = { #if defined(SQLITE_HAS_CODEC) || defined(SQLITE_ENABLE_CEROD) - { /* zName: */ "activate_extensions", - /* ePragTyp: */ PragTyp_ACTIVATE_EXTENSIONS, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "activate_extensions", + /* ePragTyp: */ PragTyp_ACTIVATE_EXTENSIONS, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) - { /* zName: */ "application_id", - /* ePragTyp: */ PragTyp_HEADER_VALUE, - /* ePragFlag: */ 0, - /* iArg: */ BTREE_APPLICATION_ID }, + {/* zName: */ "application_id", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_APPLICATION_ID }, #endif #if !defined(SQLITE_OMIT_AUTOVACUUM) - { /* zName: */ "auto_vacuum", - /* ePragTyp: */ PragTyp_AUTO_VACUUM, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "auto_vacuum", + /* ePragTyp: */ PragTyp_AUTO_VACUUM, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_AUTOMATIC_INDEX) - { /* zName: */ "automatic_index", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_AutoIndex }, -#endif -#endif - { /* zName: */ "busy_timeout", - /* ePragTyp: */ PragTyp_BUSY_TIMEOUT, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "automatic_index", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_AutoIndex }, +#endif +#endif + {/* zName: */ "busy_timeout", + /* ePragTyp: */ PragTyp_BUSY_TIMEOUT, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 45, 1, + /* iArg: */ 0 }, #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) - { /* zName: */ "cache_size", - /* ePragTyp: */ PragTyp_CACHE_SIZE, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "cache_size", + /* ePragTyp: */ PragTyp_CACHE_SIZE, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "cache_spill", - /* ePragTyp: */ PragTyp_CACHE_SPILL, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, -#endif - { /* zName: */ "case_sensitive_like", - /* ePragTyp: */ PragTyp_CASE_SENSITIVE_LIKE, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, - { /* zName: */ "cell_size_check", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_CellSizeCk }, + {/* zName: */ "cache_spill", + /* ePragTyp: */ PragTyp_CACHE_SPILL, + /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif + {/* zName: */ "case_sensitive_like", + /* ePragTyp: */ PragTyp_CASE_SENSITIVE_LIKE, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "cell_size_check", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_CellSizeCk }, #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "checkpoint_fullfsync", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_CkptFullFSync }, + {/* zName: */ "checkpoint_fullfsync", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_CkptFullFSync }, #endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) - { /* zName: */ "collation_list", - /* ePragTyp: */ PragTyp_COLLATION_LIST, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "collation_list", + /* ePragTyp: */ PragTyp_COLLATION_LIST, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 28, 2, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS) - { /* zName: */ "compile_options", - /* ePragTyp: */ PragTyp_COMPILE_OPTIONS, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "compile_options", + /* ePragTyp: */ PragTyp_COMPILE_OPTIONS, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "count_changes", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_CountRows }, + {/* zName: */ "count_changes", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_CountRows }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN - { /* zName: */ "data_store_directory", - /* ePragTyp: */ PragTyp_DATA_STORE_DIRECTORY, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "data_store_directory", + /* ePragTyp: */ PragTyp_DATA_STORE_DIRECTORY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) - { /* zName: */ "data_version", - /* ePragTyp: */ PragTyp_HEADER_VALUE, - /* ePragFlag: */ PragFlag_ReadOnly, - /* iArg: */ BTREE_DATA_VERSION }, + {/* zName: */ "data_version", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_Result0|PragFlg_ReadOnly, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_DATA_VERSION }, #endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) - { /* zName: */ "database_list", - /* ePragTyp: */ PragTyp_DATABASE_LIST, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "database_list", + /* ePragTyp: */ PragTyp_DATABASE_LIST, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0, + /* ColNames: */ 25, 3, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) - { /* zName: */ "default_cache_size", - /* ePragTyp: */ PragTyp_DEFAULT_CACHE_SIZE, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "default_cache_size", + /* ePragTyp: */ PragTyp_DEFAULT_CACHE_SIZE, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 1, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) - { /* zName: */ "defer_foreign_keys", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_DeferFKs }, + {/* zName: */ "defer_foreign_keys", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_DeferFKs }, #endif #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "empty_result_callbacks", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_NullCallback }, + {/* zName: */ "empty_result_callbacks", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_NullCallback }, #endif #if !defined(SQLITE_OMIT_UTF16) - { /* zName: */ "encoding", - /* ePragTyp: */ PragTyp_ENCODING, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "encoding", + /* ePragTyp: */ PragTyp_ENCODING, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) - { /* zName: */ "foreign_key_check", - /* ePragTyp: */ PragTyp_FOREIGN_KEY_CHECK, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "foreign_key_check", + /* ePragTyp: */ PragTyp_FOREIGN_KEY_CHECK, + /* ePragFlg: */ PragFlg_NeedSchema, + /* ColNames: */ 38, 4, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FOREIGN_KEY) - { /* zName: */ "foreign_key_list", - /* ePragTyp: */ PragTyp_FOREIGN_KEY_LIST, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "foreign_key_list", + /* ePragTyp: */ PragTyp_FOREIGN_KEY_LIST, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 30, 8, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) - { /* zName: */ "foreign_keys", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_ForeignKeys }, + {/* zName: */ "foreign_keys", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ForeignKeys }, #endif #endif #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) - { /* zName: */ "freelist_count", - /* ePragTyp: */ PragTyp_HEADER_VALUE, - /* ePragFlag: */ PragFlag_ReadOnly, - /* iArg: */ BTREE_FREE_PAGE_COUNT }, + {/* zName: */ "freelist_count", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_Result0|PragFlg_ReadOnly, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_FREE_PAGE_COUNT }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "full_column_names", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_FullColNames }, - { /* zName: */ "fullfsync", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_FullFSync }, + {/* zName: */ "full_column_names", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_FullColNames }, + {/* zName: */ "fullfsync", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_FullFSync }, #endif #if defined(SQLITE_HAS_CODEC) - { /* zName: */ "hexkey", - /* ePragTyp: */ PragTyp_HEXKEY, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, - { /* zName: */ "hexrekey", - /* ePragTyp: */ PragTyp_HEXKEY, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "hexkey", + /* ePragTyp: */ PragTyp_HEXKEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "hexrekey", + /* ePragTyp: */ PragTyp_HEXKEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_CHECK) - { /* zName: */ "ignore_check_constraints", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_IgnoreChecks }, + {/* zName: */ "ignore_check_constraints", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_IgnoreChecks }, #endif #endif #if !defined(SQLITE_OMIT_AUTOVACUUM) - { /* zName: */ "incremental_vacuum", - /* ePragTyp: */ PragTyp_INCREMENTAL_VACUUM, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "incremental_vacuum", + /* ePragTyp: */ PragTyp_INCREMENTAL_VACUUM, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) - { /* zName: */ "index_info", - /* ePragTyp: */ PragTyp_INDEX_INFO, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, - { /* zName: */ "index_list", - /* ePragTyp: */ PragTyp_INDEX_LIST, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, - { /* zName: */ "index_xinfo", - /* ePragTyp: */ PragTyp_INDEX_INFO, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 1 }, + {/* zName: */ "index_info", + /* ePragTyp: */ PragTyp_INDEX_INFO, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 11, 3, + /* iArg: */ 0 }, + {/* zName: */ "index_list", + /* ePragTyp: */ PragTyp_INDEX_LIST, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 20, 5, + /* iArg: */ 0 }, + {/* zName: */ "index_xinfo", + /* ePragTyp: */ PragTyp_INDEX_INFO, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 14, 6, + /* iArg: */ 1 }, #endif #if !defined(SQLITE_OMIT_INTEGRITY_CHECK) - { /* zName: */ "integrity_check", - /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "integrity_check", + /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, + /* ePragFlg: */ PragFlg_NeedSchema, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) - { /* zName: */ "journal_mode", - /* ePragTyp: */ PragTyp_JOURNAL_MODE, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, - { /* zName: */ "journal_size_limit", - /* ePragTyp: */ PragTyp_JOURNAL_SIZE_LIMIT, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "journal_mode", + /* ePragTyp: */ PragTyp_JOURNAL_MODE, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "journal_size_limit", + /* ePragTyp: */ PragTyp_JOURNAL_SIZE_LIMIT, + /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if defined(SQLITE_HAS_CODEC) - { /* zName: */ "key", - /* ePragTyp: */ PragTyp_KEY, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "key", + /* ePragTyp: */ PragTyp_KEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "legacy_file_format", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_LegacyFileFmt }, + {/* zName: */ "legacy_file_format", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_LegacyFileFmt }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE - { /* zName: */ "lock_proxy_file", - /* ePragTyp: */ PragTyp_LOCK_PROXY_FILE, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "lock_proxy_file", + /* ePragTyp: */ PragTyp_LOCK_PROXY_FILE, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) - { /* zName: */ "lock_status", - /* ePragTyp: */ PragTyp_LOCK_STATUS, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "lock_status", + /* ePragTyp: */ PragTyp_LOCK_STATUS, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 46, 2, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) - { /* zName: */ "locking_mode", - /* ePragTyp: */ PragTyp_LOCKING_MODE, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, - { /* zName: */ "max_page_count", - /* ePragTyp: */ PragTyp_PAGE_COUNT, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, - { /* zName: */ "mmap_size", - /* ePragTyp: */ PragTyp_MMAP_SIZE, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, - { /* zName: */ "page_count", - /* ePragTyp: */ PragTyp_PAGE_COUNT, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, - { /* zName: */ "page_size", - /* ePragTyp: */ PragTyp_PAGE_SIZE, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "locking_mode", + /* ePragTyp: */ PragTyp_LOCKING_MODE, + /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "max_page_count", + /* ePragTyp: */ PragTyp_PAGE_COUNT, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "mmap_size", + /* ePragTyp: */ PragTyp_MMAP_SIZE, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "page_count", + /* ePragTyp: */ PragTyp_PAGE_COUNT, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "page_size", + /* ePragTyp: */ PragTyp_PAGE_SIZE, + /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_PARSER_TRACE) - { /* zName: */ "parser_trace", - /* ePragTyp: */ PragTyp_PARSER_TRACE, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "parser_trace", + /* ePragTyp: */ PragTyp_PARSER_TRACE, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "query_only", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_QueryOnly }, + {/* zName: */ "query_only", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_QueryOnly }, #endif #if !defined(SQLITE_OMIT_INTEGRITY_CHECK) - { /* zName: */ "quick_check", - /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "quick_check", + /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, + /* ePragFlg: */ PragFlg_NeedSchema, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "read_uncommitted", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_ReadUncommitted }, - { /* zName: */ "recursive_triggers", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_RecTriggers }, + {/* zName: */ "read_uncommitted", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ReadUncommitted }, + {/* zName: */ "recursive_triggers", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_RecTriggers }, #endif #if defined(SQLITE_HAS_CODEC) - { /* zName: */ "rekey", - /* ePragTyp: */ PragTyp_REKEY, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "rekey", + /* ePragTyp: */ PragTyp_REKEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "reverse_unordered_selects", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_ReverseOrder }, + {/* zName: */ "reverse_unordered_selects", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ReverseOrder }, #endif #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) - { /* zName: */ "schema_version", - /* ePragTyp: */ PragTyp_HEADER_VALUE, - /* ePragFlag: */ 0, - /* iArg: */ BTREE_SCHEMA_VERSION }, + {/* zName: */ "schema_version", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_SCHEMA_VERSION }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) - { /* zName: */ "secure_delete", - /* ePragTyp: */ PragTyp_SECURE_DELETE, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "secure_delete", + /* ePragTyp: */ PragTyp_SECURE_DELETE, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "short_column_names", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_ShortColNames }, -#endif - { /* zName: */ "shrink_memory", - /* ePragTyp: */ PragTyp_SHRINK_MEMORY, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, - { /* zName: */ "soft_heap_limit", - /* ePragTyp: */ PragTyp_SOFT_HEAP_LIMIT, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "short_column_names", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ShortColNames }, +#endif + {/* zName: */ "shrink_memory", + /* ePragTyp: */ PragTyp_SHRINK_MEMORY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "soft_heap_limit", + /* ePragTyp: */ PragTyp_SOFT_HEAP_LIMIT, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if defined(SQLITE_DEBUG) - { /* zName: */ "sql_trace", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_SqlTrace }, + {/* zName: */ "sql_trace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_SqlTrace }, #endif #endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) - { /* zName: */ "stats", - /* ePragTyp: */ PragTyp_STATS, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "stats", + /* ePragTyp: */ PragTyp_STATS, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 7, 4, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) - { /* zName: */ "synchronous", - /* ePragTyp: */ PragTyp_SYNCHRONOUS, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "synchronous", + /* ePragTyp: */ PragTyp_SYNCHRONOUS, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) - { /* zName: */ "table_info", - /* ePragTyp: */ PragTyp_TABLE_INFO, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "table_info", + /* ePragTyp: */ PragTyp_TABLE_INFO, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 1, 6, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) - { /* zName: */ "temp_store", - /* ePragTyp: */ PragTyp_TEMP_STORE, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, - { /* zName: */ "temp_store_directory", - /* ePragTyp: */ PragTyp_TEMP_STORE_DIRECTORY, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, -#endif - { /* zName: */ "threads", - /* ePragTyp: */ PragTyp_THREADS, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "temp_store", + /* ePragTyp: */ PragTyp_TEMP_STORE, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "temp_store_directory", + /* ePragTyp: */ PragTyp_TEMP_STORE_DIRECTORY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif + {/* zName: */ "threads", + /* ePragTyp: */ PragTyp_THREADS, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) - { /* zName: */ "user_version", - /* ePragTyp: */ PragTyp_HEADER_VALUE, - /* ePragFlag: */ 0, - /* iArg: */ BTREE_USER_VERSION }, + {/* zName: */ "user_version", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_USER_VERSION }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if defined(SQLITE_DEBUG) - { /* zName: */ "vdbe_addoptrace", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_VdbeAddopTrace }, - { /* zName: */ "vdbe_debug", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace }, - { /* zName: */ "vdbe_eqp", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_VdbeEQP }, - { /* zName: */ "vdbe_listing", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_VdbeListing }, - { /* zName: */ "vdbe_trace", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_VdbeTrace }, + {/* zName: */ "vdbe_addoptrace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_VdbeAddopTrace }, + {/* zName: */ "vdbe_debug", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace }, + {/* zName: */ "vdbe_eqp", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_VdbeEQP }, + {/* zName: */ "vdbe_listing", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_VdbeListing }, + {/* zName: */ "vdbe_trace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_VdbeTrace }, #endif #endif #if !defined(SQLITE_OMIT_WAL) - { /* zName: */ "wal_autocheckpoint", - /* ePragTyp: */ PragTyp_WAL_AUTOCHECKPOINT, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, - { /* zName: */ "wal_checkpoint", - /* ePragTyp: */ PragTyp_WAL_CHECKPOINT, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "wal_autocheckpoint", + /* ePragTyp: */ PragTyp_WAL_AUTOCHECKPOINT, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "wal_checkpoint", + /* ePragTyp: */ PragTyp_WAL_CHECKPOINT, + /* ePragFlg: */ PragFlg_NeedSchema, + /* ColNames: */ 42, 3, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "writable_schema", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_WriteSchema|SQLITE_RecoveryMode }, + {/* zName: */ "writable_schema", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_WriteSchema|SQLITE_RecoveryMode }, #endif }; /* Number of pragmas: 60 on by default, 73 total. */ diff --git a/sqlite/src/printf.c b/sqlite/src/printf.c index a888d50b..91b753e0 100644 --- a/sqlite/src/printf.c +++ b/sqlite/src/printf.c @@ -841,7 +841,7 @@ void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){ assert( p->accError==0 || p->nAlloc==0 ); if( p->nChar+N >= p->nAlloc ){ enlargeAndAppend(p,z,N); - }else{ + }else if( N ){ assert( p->zText ); p->nChar += N; memcpy(&p->zText[p->nChar-N], z, N); @@ -861,18 +861,23 @@ void sqlite3StrAccumAppendAll(StrAccum *p, const char *z){ ** Return a pointer to the resulting string. Return a NULL ** pointer if any kind of error was encountered. */ +static SQLITE_NOINLINE char *strAccumFinishRealloc(StrAccum *p){ + assert( p->mxAlloc>0 && !isMalloced(p) ); + p->zText = sqlite3DbMallocRaw(p->db, p->nChar+1 ); + if( p->zText ){ + memcpy(p->zText, p->zBase, p->nChar+1); + p->printfFlags |= SQLITE_PRINTF_MALLOCED; + }else{ + setStrAccumError(p, STRACCUM_NOMEM); + } + return p->zText; +} char *sqlite3StrAccumFinish(StrAccum *p){ if( p->zText ){ assert( (p->zText==p->zBase)==!isMalloced(p) ); p->zText[p->nChar] = 0; if( p->mxAlloc>0 && !isMalloced(p) ){ - p->zText = sqlite3DbMallocRaw(p->db, p->nChar+1 ); - if( p->zText ){ - memcpy(p->zText, p->zBase, p->nChar+1); - p->printfFlags |= SQLITE_PRINTF_MALLOCED; - }else{ - setStrAccumError(p, STRACCUM_NOMEM); - } + return strAccumFinishRealloc(p); } } return p->zText; @@ -1012,7 +1017,8 @@ char *sqlite3_vsnprintf(int n, char *zBuf, const char *zFormat, va_list ap){ #endif sqlite3StrAccumInit(&acc, 0, zBuf, n, 0); sqlite3VXPrintf(&acc, zFormat, ap); - return sqlite3StrAccumFinish(&acc); + zBuf[acc.nChar] = 0; + return zBuf; } char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){ char *z; diff --git a/sqlite/src/random.c b/sqlite/src/random.c index 179d01be..d4ae77c4 100644 --- a/sqlite/src/random.c +++ b/sqlite/src/random.c @@ -106,7 +106,7 @@ void sqlite3_randomness(int N, void *pBuf){ sqlite3_mutex_leave(mutex); } -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE /* ** For testing purposes, we sometimes want to preserve the state of ** PRNG and restore the PRNG to its saved state at a later time, or @@ -131,4 +131,4 @@ void sqlite3PrngRestoreState(void){ sizeof(sqlite3Prng) ); } -#endif /* SQLITE_OMIT_BUILTIN_TEST */ +#endif /* SQLITE_UNTESTABLE */ diff --git a/sqlite/src/select.c b/sqlite/src/select.c index 199e13f1..e5f4c7fc 100644 --- a/sqlite/src/select.c +++ b/sqlite/src/select.c @@ -334,7 +334,7 @@ static void addWhereTerm( pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iColLeft); pE2 = sqlite3CreateColumnExpr(db, pSrc, iRight, iColRight); - pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2, 0); + pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2); if( pEq && isOuterJoin ){ ExprSetProperty(pEq, EP_FromJoin); assert( !ExprHasProperty(pEq, EP_TokenOnly|EP_Reduced) ); @@ -521,7 +521,7 @@ static void pushOntoSorter( int iLimit; /* LIMIT counter */ assert( bSeq==0 || bSeq==1 ); - assert( nData==1 || regData==regOrigData ); + assert( nData==1 || regData==regOrigData || regOrigData==0 ); if( nPrefixReg ){ assert( nPrefixReg==nExpr+bSeq ); regBase = regData - nExpr - bSeq; @@ -533,11 +533,11 @@ static void pushOntoSorter( iLimit = pSelect->iOffset ? pSelect->iOffset+1 : pSelect->iLimit; pSort->labelDone = sqlite3VdbeMakeLabel(v); sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, regOrigData, - SQLITE_ECEL_DUP|SQLITE_ECEL_REF); + SQLITE_ECEL_DUP | (regOrigData? SQLITE_ECEL_REF : 0)); if( bSeq ){ sqlite3VdbeAddOp2(v, OP_Sequence, pSort->iECursor, regBase+nExpr); } - if( nPrefixReg==0 ){ + if( nPrefixReg==0 && nData>0 ){ sqlite3ExprCodeMove(pParse, regData, regBase+nExpr+bSeq, nData); } sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase+nOBSat, nBase-nOBSat, regRecord); @@ -587,7 +587,8 @@ static void pushOntoSorter( }else{ op = OP_IdxInsert; } - sqlite3VdbeAddOp2(v, op, pSort->iECursor, regRecord); + sqlite3VdbeAddOp4Int(v, op, pSort->iECursor, regRecord, + regBase+nOBSat, nBase-nOBSat); if( iLimit ){ int addr; int r1 = 0; @@ -595,7 +596,7 @@ static void pushOntoSorter( ** register is initialized with value of LIMIT+OFFSET.) After the sorter ** fills up, delete the least entry in the sorter after each insert. ** Thus we never hold more than the LIMIT+OFFSET rows in memory at once */ - addr = sqlite3VdbeAddOp3(v, OP_IfNotZero, iLimit, 0, 1); VdbeCoverage(v); + addr = sqlite3VdbeAddOp1(v, OP_IfNotZero, iLimit); VdbeCoverage(v); sqlite3VdbeAddOp1(v, OP_Last, pSort->iECursor); if( pSort->bOrderedInnerLoop ){ r1 = ++pParse->nMem; @@ -655,7 +656,7 @@ static void codeDistinct( r1 = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp4Int(v, OP_Found, iTab, addrRepeat, iMem, N); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_MakeRecord, iMem, N, r1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iTab, r1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r1, iMem, N); sqlite3ReleaseTempReg(pParse, r1); } @@ -666,7 +667,7 @@ static void codeDistinct( ** If srcTab is negative, then the pEList expressions ** are evaluated in order to get the data for this row. If srcTab is ** zero or more, then data is pulled from srcTab and pEList is used only -** to get number columns and the datatype for each column. +** to get the number of columns and the collation sequence for each column. */ static void selectInnerLoop( Parse *pParse, /* The parser context */ @@ -681,13 +682,20 @@ static void selectInnerLoop( ){ Vdbe *v = pParse->pVdbe; int i; - int hasDistinct; /* True if the DISTINCT keyword is present */ - int regResult; /* Start of memory holding result set */ + int hasDistinct; /* True if the DISTINCT keyword is present */ int eDest = pDest->eDest; /* How to dispose of results */ int iParm = pDest->iSDParm; /* First argument to disposal method */ int nResultCol; /* Number of result columns */ int nPrefixReg = 0; /* Number of extra registers before regResult */ + /* Usually, regResult is the first cell in an array of memory cells + ** containing the current result row. In this case regOrig is set to the + ** same value. However, if the results are being sent to the sorter, the + ** values for any expressions that are also part of the sort-key are omitted + ** from this array. In this case regOrig is set to zero. */ + int regResult; /* Start of memory holding current results */ + int regOrig; /* Start of memory holding full result (or 0) */ + assert( v ); assert( pEList!=0 ); hasDistinct = pDistinct ? pDistinct->eTnctType : WHERE_DISTINCT_NOOP; @@ -718,7 +726,7 @@ static void selectInnerLoop( pParse->nMem += nResultCol; } pDest->nSdst = nResultCol; - regResult = pDest->iSdst; + regOrig = regResult = pDest->iSdst; if( srcTab>=0 ){ for(i=0; ipOrderBy), set the associated + ** iOrderByCol value to one more than the index of the ORDER BY + ** expression within the sort-key that pushOntoSorter() will generate. + ** This allows the pEList field to be omitted from the sorted record, + ** saving space and CPU cycles. */ + ecelFlags |= (SQLITE_ECEL_OMITREF|SQLITE_ECEL_REF); + for(i=pSort->nOBSat; ipOrderBy->nExpr; i++){ + int j; + if( (j = pSort->pOrderBy->a[i].u.x.iOrderByCol)>0 ){ + pEList->a[j-1].u.x.iOrderByCol = i+1-pSort->nOBSat; + } + } + regOrig = 0; + assert( eDest==SRT_Set || eDest==SRT_Mem + || eDest==SRT_Coroutine || eDest==SRT_Output ); + } + nResultCol = sqlite3ExprCodeExprList(pParse,pEList,regResult,0,ecelFlags); } /* If the DISTINCT keyword was present on the SELECT statement @@ -808,7 +835,7 @@ static void selectInnerLoop( int r1; r1 = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, r1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, nResultCol); sqlite3ReleaseTempReg(pParse, r1); break; } @@ -845,7 +872,7 @@ static void selectInnerLoop( int addr = sqlite3VdbeCurrentAddr(v) + 4; sqlite3VdbeAddOp4Int(v, OP_Found, iParm+1, addr, r1, 0); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm+1, r1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm+1, r1,regResult,nResultCol); assert( pSort==0 ); } #endif @@ -874,14 +901,14 @@ static void selectInnerLoop( ** does not matter. But there might be a LIMIT clause, in which ** case the order does matter */ pushOntoSorter( - pParse, pSort, p, regResult, regResult, nResultCol, nPrefixReg); + pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg); }else{ int r1 = sqlite3GetTempReg(pParse); assert( sqlite3Strlen30(pDest->zAffSdst)==nResultCol ); sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult, nResultCol, r1, pDest->zAffSdst, nResultCol); sqlite3ExprCacheAffinityChange(pParse, regResult, nResultCol); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, r1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, nResultCol); sqlite3ReleaseTempReg(pParse, r1); } break; @@ -900,11 +927,12 @@ static void selectInnerLoop( ** memory cells and break out of the scan loop. */ case SRT_Mem: { - assert( nResultCol==pDest->nSdst ); if( pSort ){ + assert( nResultCol<=pDest->nSdst ); pushOntoSorter( - pParse, pSort, p, regResult, regResult, nResultCol, nPrefixReg); + pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg); }else{ + assert( nResultCol==pDest->nSdst ); assert( regResult==iParm ); /* The LIMIT clause will jump out of the loop for us */ } @@ -917,7 +945,7 @@ static void selectInnerLoop( testcase( eDest==SRT_Coroutine ); testcase( eDest==SRT_Output ); if( pSort ){ - pushOntoSorter(pParse, pSort, p, regResult, regResult, nResultCol, + pushOntoSorter(pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg); }else if( eDest==SRT_Coroutine ){ sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm); @@ -967,7 +995,7 @@ static void selectInnerLoop( } sqlite3VdbeAddOp2(v, OP_Sequence, iParm, r2+nKey); sqlite3VdbeAddOp3(v, OP_MakeRecord, r2, nKey+2, r1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, r1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, r2, nKey+2); if( addrTest ) sqlite3VdbeJumpHere(v, addrTest); sqlite3ReleaseTempReg(pParse, r1); sqlite3ReleaseTempRange(pParse, r2, nKey+2); @@ -1202,14 +1230,13 @@ static void generateSortTail( int iParm = pDest->iSDParm; int regRow; int regRowid; + int iCol; int nKey; int iSortTab; /* Sorter cursor to read from */ int nSortData; /* Trailing values to read from sorter */ int i; int bSeq; /* True if sorter record includes seq. no. */ -#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS struct ExprList_item *aOutEx = p->pEList->a; -#endif assert( addrBreak<0 ); if( pSort->labelBkOut ){ @@ -1247,8 +1274,14 @@ static void generateSortTail( iSortTab = iTab; bSeq = 1; } - for(i=0; izAffSdst, nColumn); sqlite3ExprCacheAffinityChange(pParse, regRow, nColumn); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, regRowid); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, regRowid, regRow, nColumn); break; } case SRT_Mem: { @@ -1773,7 +1806,7 @@ Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){ /* The sqlite3ResultSetOfSelect() is only used n contexts where lookaside ** is disabled */ assert( db->lookaside.bDisable ); - pTab->nRef = 1; + pTab->nTabRef = 1; pTab->zName = 0; pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); sqlite3ColumnsFromExprList(pParse, pSelect->pEList, &pTab->nCol, &pTab->aCol); @@ -2004,6 +2037,7 @@ static void generateWithRecursiveQuery( /* Process the LIMIT and OFFSET clauses, if they exist */ addrBreak = sqlite3VdbeMakeLabel(v); + p->nSelectRow = 320; /* 4 billion rows */ computeLimitRegisters(pParse, p, addrBreak); pLimit = p->pLimit; pOffset = p->pOffset; @@ -2473,7 +2507,7 @@ static int multiSelect( computeLimitRegisters(pParse, p, iBreak); sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v); r1 = sqlite3GetTempReg(pParse); - iStart = sqlite3VdbeAddOp2(v, OP_RowKey, tab1, r1); + iStart = sqlite3VdbeAddOp2(v, OP_RowData, tab1, r1); sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0); VdbeCoverage(v); sqlite3ReleaseTempReg(pParse, r1); selectInnerLoop(pParse, p, p->pEList, tab1, @@ -2640,7 +2674,8 @@ static int generateOutputSubroutine( sqlite3VdbeAddOp4(v, OP_MakeRecord, pIn->iSdst, pIn->nSdst, r1, pDest->zAffSdst, pIn->nSdst); sqlite3ExprCacheAffinityChange(pParse, pIn->iSdst, pIn->nSdst); - sqlite3VdbeAddOp2(v, OP_IdxInsert, pDest->iSDParm, r1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pDest->iSDParm, r1, + pIn->iSdst, pIn->nSdst); sqlite3ReleaseTempReg(pParse, r1); break; } @@ -3099,8 +3134,8 @@ static int multiSelectOrderBy( #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) /* Forward Declarations */ -static void substExprList(sqlite3*, ExprList*, int, ExprList*); -static void substSelect(sqlite3*, Select *, int, ExprList*, int); +static void substExprList(Parse*, ExprList*, int, ExprList*); +static void substSelect(Parse*, Select *, int, ExprList*, int); /* ** Scan through the expression pExpr. Replace every reference to @@ -3116,36 +3151,46 @@ static void substSelect(sqlite3*, Select *, int, ExprList*, int); ** of the subquery rather the result set of the subquery. */ static Expr *substExpr( - sqlite3 *db, /* Report malloc errors to this connection */ + Parse *pParse, /* Report errors here */ Expr *pExpr, /* Expr in which substitution occurs */ int iTable, /* Table to be substituted */ ExprList *pEList /* Substitute expressions */ ){ + sqlite3 *db = pParse->db; if( pExpr==0 ) return 0; if( pExpr->op==TK_COLUMN && pExpr->iTable==iTable ){ if( pExpr->iColumn<0 ){ pExpr->op = TK_NULL; }else{ Expr *pNew; + Expr *pCopy = pEList->a[pExpr->iColumn].pExpr; assert( pEList!=0 && pExpr->iColumnnExpr ); assert( pExpr->pLeft==0 && pExpr->pRight==0 ); - pNew = sqlite3ExprDup(db, pEList->a[pExpr->iColumn].pExpr, 0); - sqlite3ExprDelete(db, pExpr); - pExpr = pNew; + if( sqlite3ExprIsVector(pCopy) ){ + sqlite3VectorErrorMsg(pParse, pCopy); + }else{ + pNew = sqlite3ExprDup(db, pCopy, 0); + if( pNew && (pExpr->flags & EP_FromJoin) ){ + pNew->iRightJoinTable = pExpr->iRightJoinTable; + pNew->flags |= EP_FromJoin; + } + sqlite3ExprDelete(db, pExpr); + pExpr = pNew; + } } }else{ - pExpr->pLeft = substExpr(db, pExpr->pLeft, iTable, pEList); - pExpr->pRight = substExpr(db, pExpr->pRight, iTable, pEList); + pExpr->pLeft = substExpr(pParse, pExpr->pLeft, iTable, pEList); + pExpr->pRight = substExpr(pParse, pExpr->pRight, iTable, pEList); if( ExprHasProperty(pExpr, EP_xIsSelect) ){ - substSelect(db, pExpr->x.pSelect, iTable, pEList, 1); + substSelect(pParse, pExpr->x.pSelect, iTable, pEList, 1); }else{ - substExprList(db, pExpr->x.pList, iTable, pEList); + substExprList(pParse, pExpr->x.pList, iTable, pEList); } } return pExpr; } static void substExprList( - sqlite3 *db, /* Report malloc errors here */ + Parse *pParse, /* Report errors here */ ExprList *pList, /* List to scan and in which to make substitutes */ int iTable, /* Table to be substituted */ ExprList *pEList /* Substitute values */ @@ -3153,11 +3198,11 @@ static void substExprList( int i; if( pList==0 ) return; for(i=0; inExpr; i++){ - pList->a[i].pExpr = substExpr(db, pList->a[i].pExpr, iTable, pEList); + pList->a[i].pExpr = substExpr(pParse, pList->a[i].pExpr, iTable, pEList); } } static void substSelect( - sqlite3 *db, /* Report malloc errors here */ + Parse *pParse, /* Report errors here */ Select *p, /* SELECT statement in which to make substitutions */ int iTable, /* Table to be replaced */ ExprList *pEList, /* Substitute values */ @@ -3168,17 +3213,17 @@ static void substSelect( int i; if( !p ) return; do{ - substExprList(db, p->pEList, iTable, pEList); - substExprList(db, p->pGroupBy, iTable, pEList); - substExprList(db, p->pOrderBy, iTable, pEList); - p->pHaving = substExpr(db, p->pHaving, iTable, pEList); - p->pWhere = substExpr(db, p->pWhere, iTable, pEList); + substExprList(pParse, p->pEList, iTable, pEList); + substExprList(pParse, p->pGroupBy, iTable, pEList); + substExprList(pParse, p->pOrderBy, iTable, pEList); + p->pHaving = substExpr(pParse, p->pHaving, iTable, pEList); + p->pWhere = substExpr(pParse, p->pWhere, iTable, pEList); pSrc = p->pSrc; assert( pSrc!=0 ); for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ - substSelect(db, pItem->pSelect, iTable, pEList, 1); + substSelect(pParse, pItem->pSelect, iTable, pEList, 1); if( pItem->fg.isTabFunc ){ - substExprList(db, pItem->u1.pFuncArg, iTable, pEList); + substExprList(pParse, pItem->u1.pFuncArg, iTable, pEList); } } }while( doPrior && (p = p->pPrior)!=0 ); @@ -3575,12 +3620,12 @@ static int flattenSubquery( */ if( ALWAYS(pSubitem->pTab!=0) ){ Table *pTabToDel = pSubitem->pTab; - if( pTabToDel->nRef==1 ){ + if( pTabToDel->nTabRef==1 ){ Parse *pToplevel = sqlite3ParseToplevel(pParse); pTabToDel->pNextZombie = pToplevel->pZombieTab; pToplevel->pZombieTab = pTabToDel; }else{ - pTabToDel->nRef--; + pTabToDel->nTabRef--; } pSubitem->pTab = 0; } @@ -3703,7 +3748,7 @@ static int flattenSubquery( }else{ pParent->pWhere = sqlite3ExprAnd(db, pWhere, pParent->pWhere); } - substSelect(db, pParent, iParent, pSub->pEList, 0); + substSelect(pParse, pParent, iParent, pSub->pEList, 0); /* The flattened query is distinct if either the inner or the ** outer query is distinct. @@ -3777,7 +3822,7 @@ static int flattenSubquery( ** terms are duplicated into the subquery. */ static int pushDownWhereTerms( - sqlite3 *db, /* The database connection (for malloc()) */ + Parse *pParse, /* Parse context (for malloc() and error reporting) */ Select *pSubq, /* The subquery whose WHERE clause is to be augmented */ Expr *pWhere, /* The WHERE clause of the outer query */ int iCursor /* Cursor number of the subquery */ @@ -3798,16 +3843,16 @@ static int pushDownWhereTerms( return 0; /* restriction (3) */ } while( pWhere->op==TK_AND ){ - nChng += pushDownWhereTerms(db, pSubq, pWhere->pRight, iCursor); + nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight, iCursor); pWhere = pWhere->pLeft; } if( ExprHasProperty(pWhere,EP_FromJoin) ) return 0; /* restriction 5 */ if( sqlite3ExprIsTableConstant(pWhere, iCursor) ){ nChng++; while( pSubq ){ - pNew = sqlite3ExprDup(db, pWhere, 0); - pNew = substExpr(db, pNew, iCursor, pSubq->pEList); - pSubq->pWhere = sqlite3ExprAnd(db, pSubq->pWhere, pNew); + pNew = sqlite3ExprDup(pParse->db, pWhere, 0); + pNew = substExpr(pParse, pNew, iCursor, pSubq->pEList); + pSubq->pWhere = sqlite3ExprAnd(pParse->db, pSubq->pWhere, pNew); pSubq = pSubq->pPrior; } } @@ -4099,7 +4144,7 @@ static int withExpand( assert( pFrom->pTab==0 ); pFrom->pTab = pTab = sqlite3DbMallocZero(db, sizeof(Table)); if( pTab==0 ) return WRC_Abort; - pTab->nRef = 1; + pTab->nTabRef = 1; pTab->zName = sqlite3DbStrDup(db, pCte->zName); pTab->iPKey = -1; pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); @@ -4122,20 +4167,20 @@ static int withExpand( ){ pItem->pTab = pTab; pItem->fg.isRecursive = 1; - pTab->nRef++; + pTab->nTabRef++; pSel->selFlags |= SF_Recursive; } } } /* Only one recursive reference is permitted. */ - if( pTab->nRef>2 ){ + if( pTab->nTabRef>2 ){ sqlite3ErrorMsg( pParse, "multiple references to recursive table: %s", pCte->zName ); return SQLITE_ERROR; } - assert( pTab->nRef==1 || ((pSel->selFlags&SF_Recursive) && pTab->nRef==2 )); + assert( pTab->nTabRef==1 || ((pSel->selFlags&SF_Recursive) && pTab->nTabRef==2 )); pCte->zCteErr = "circular reference: %s"; pSavedWith = pParse->pWith; @@ -4268,7 +4313,7 @@ static int selectExpander(Walker *pWalker, Select *p){ if( sqlite3WalkSelect(pWalker, pSel) ) return WRC_Abort; pFrom->pTab = pTab = sqlite3DbMallocZero(db, sizeof(Table)); if( pTab==0 ) return WRC_Abort; - pTab->nRef = 1; + pTab->nTabRef = 1; pTab->zName = sqlite3MPrintf(db, "sqlite_sq_%p", (void*)pTab); while( pSel->pPrior ){ pSel = pSel->pPrior; } sqlite3ColumnsFromExprList(pParse, pSel->pEList,&pTab->nCol,&pTab->aCol); @@ -4281,13 +4326,13 @@ static int selectExpander(Walker *pWalker, Select *p){ assert( pFrom->pTab==0 ); pFrom->pTab = pTab = sqlite3LocateTableItem(pParse, 0, pFrom); if( pTab==0 ) return WRC_Abort; - if( pTab->nRef==0xffff ){ + if( pTab->nTabRef>=0xffff ){ sqlite3ErrorMsg(pParse, "too many references to \"%s\": max 65535", pTab->zName); pFrom->pTab = 0; return WRC_Abort; } - pTab->nRef++; + pTab->nTabRef++; if( !IsVirtual(pTab) && cannotBeFunction(pParse, pFrom) ){ return WRC_Abort; } @@ -4437,10 +4482,10 @@ static int selectExpander(Walker *pWalker, Select *p){ if( longNames || pTabList->nSrc>1 ){ Expr *pLeft; pLeft = sqlite3Expr(db, TK_ID, zTabName); - pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); + pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); if( zSchemaName ){ pLeft = sqlite3Expr(db, TK_ID, zSchemaName); - pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pExpr, 0); + pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pExpr); } if( longNames ){ zColname = sqlite3MPrintf(db, "%s.%s", zTabName, zName); @@ -4677,8 +4722,8 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ ExprList *pList = pF->pExpr->x.pList; assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) ); - sqlite3VdbeAddOp4(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0, 0, - (void*)pF->pFunc, P4_FUNCDEF); + sqlite3VdbeAddOp2(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0); + sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF); } } @@ -4729,8 +4774,8 @@ static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){ if( regHit==0 && pAggInfo->nAccumulator ) regHit = ++pParse->nMem; sqlite3VdbeAddOp4(v, OP_CollSeq, regHit, 0, 0, (char *)pColl, P4_COLLSEQ); } - sqlite3VdbeAddOp4(v, OP_AggStep0, 0, regAgg, pF->iMem, - (void*)pF->pFunc, P4_FUNCDEF); + sqlite3VdbeAddOp3(v, OP_AggStep0, 0, regAgg, pF->iMem); + sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF); sqlite3VdbeChangeP5(v, (u8)nArg); sqlite3ExprCacheAffinityChange(pParse, regAgg, nArg); sqlite3ReleaseTempRange(pParse, regAgg, nArg); @@ -4964,7 +5009,7 @@ int sqlite3Select( ** inside the subquery. This can help the subquery to run more efficiently. */ if( (pItem->fg.jointype & JT_OUTER)==0 - && pushDownWhereTerms(db, pSub, p->pWhere, pItem->iCursor) + && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem->iCursor) ){ #if SELECTTRACE_ENABLED if( sqlite3SelectTrace & 0x100 ){ @@ -5126,7 +5171,9 @@ int sqlite3Select( /* Set the limiter. */ iEnd = sqlite3VdbeMakeLabel(v); - p->nSelectRow = 320; /* 4 billion rows */ + if( (p->selFlags & SF_FixedLimit)==0 ){ + p->nSelectRow = 320; /* 4 billion rows */ + } computeLimitRegisters(pParse, p, iEnd); if( p->iLimit==0 && sSort.addrSortIndex>=0 ){ sqlite3VdbeChangeOpcode(v, sSort.addrSortIndex, OP_SorterOpen); diff --git a/sqlite/src/shell.c b/sqlite/src/shell.c index 732ef628..b0928ce7 100644 --- a/sqlite/src/shell.c +++ b/sqlite/src/shell.c @@ -668,11 +668,12 @@ struct ShellState { #define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ #define MODE_Html 4 /* Generate an XHTML table */ #define MODE_Insert 5 /* Generate SQL "insert" statements */ -#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */ -#define MODE_Csv 7 /* Quote strings, numbers are plain */ -#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */ -#define MODE_Ascii 9 /* Use ASCII unit and record separators (0x1F/0x1E) */ -#define MODE_Pretty 10 /* Pretty-print schemas */ +#define MODE_Quote 6 /* Quote values as for SQL */ +#define MODE_Tcl 7 /* Generate ANSI-C or TCL quoted elements */ +#define MODE_Csv 8 /* Quote strings, numbers are plain */ +#define MODE_Explain 9 /* Like MODE_Column, but do not truncate data */ +#define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */ +#define MODE_Pretty 11 /* Pretty-print schemas */ static const char *modeDescr[] = { "line", @@ -681,6 +682,7 @@ static const char *modeDescr[] = { "semi", "html", "insert", + "quote", "tcl", "csv", "explain", @@ -944,6 +946,25 @@ static int shellAuth( } #endif +/* +** Print a schema statement. Part of MODE_Semi and MODE_Pretty output. +** +** This routine converts some CREATE TABLE statements for shadow tables +** in FTS3/4/5 into CREATE TABLE IF NOT EXISTS statements. +*/ +static void printSchemaLine(FILE *out, const char *z, const char *zTail){ + if( sqlite3_strglob("CREATE TABLE ['\"]*", z)==0 ){ + utf8_printf(out, "CREATE TABLE IF NOT EXISTS %s%s", z+13, zTail); + }else{ + utf8_printf(out, "%s%s", z, zTail); + } +} +static void printSchemaLineN(FILE *out, char *z, int n, const char *zTail){ + char c = z[n]; + z[n] = 0; + printSchemaLine(out, z, zTail); + z[n] = c; +} /* ** This is the callback routine that the shell @@ -1062,7 +1083,7 @@ static int shell_callback( break; } case MODE_Semi: { /* .schema and .fullschema output */ - utf8_printf(p->out, "%s;\n", azArg[0]); + printSchemaLine(p->out, azArg[0], ";\n"); break; } case MODE_Pretty: { /* .schema and .fullschema with --indent */ @@ -1106,14 +1127,14 @@ static int shell_callback( }else if( c==')' ){ nParen--; if( nLine>0 && nParen==0 && j>0 ){ - utf8_printf(p->out, "%.*s\n", j, z); + printSchemaLineN(p->out, z, j, "\n"); j = 0; } } z[j++] = c; if( nParen==1 && (c=='(' || c==',' || c=='\n') ){ if( c=='\n' ) j--; - utf8_printf(p->out, "%.*s\n ", j, z); + printSchemaLineN(p->out, z, j, "\n "); j = 0; nLine++; while( IsSpace(z[i+1]) ){ i++; } @@ -1121,7 +1142,7 @@ static int shell_callback( } z[j] = 0; } - utf8_printf(p->out, "%s;\n", z); + printSchemaLine(p->out, z, ";\n"); sqlite3_free(z); break; } @@ -1198,19 +1219,28 @@ static int shell_callback( setTextMode(p->out, 1); break; } + case MODE_Quote: case MODE_Insert: { - p->cnt++; if( azArg==0 ) break; - utf8_printf(p->out,"INSERT INTO %s",p->zDestTable); - if( p->showHeader ){ - raw_printf(p->out,"("); + if( p->cMode==MODE_Insert ){ + utf8_printf(p->out,"INSERT INTO %s",p->zDestTable); + if( p->showHeader ){ + raw_printf(p->out,"("); + for(i=0; i0 ? ",": ""; + utf8_printf(p->out, "%s%s", zSep, azCol[i]); + } + raw_printf(p->out,")"); + } + raw_printf(p->out," VALUES("); + }else if( p->cnt==0 && p->showHeader ){ for(i=0; i0 ? ",": ""; - utf8_printf(p->out, "%s%s", zSep, azCol[i]); + if( i>0 ) raw_printf(p->out, ","); + output_quoted_string(p->out, azCol[i]); } - raw_printf(p->out,")"); + raw_printf(p->out,"\n"); } - raw_printf(p->out," VALUES("); + p->cnt++; for(i=0; i0 ? ",": ""; if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ @@ -1233,7 +1263,7 @@ static int shell_callback( output_quoted_string(p->out, azArg[i]); } } - raw_printf(p->out,");\n"); + raw_printf(p->out,p->cMode==MODE_Quote?"\n":");\n"); break; } case MODE_Ascii: { @@ -1896,6 +1926,7 @@ static int shell_exec( continue; } zStmtSql = sqlite3_sql(pStmt); + if( zStmtSql==0 ) zStmtSql = ""; while( IsSpace(zStmtSql[0]) ) zStmtSql++; /* save off the prepared statment handle and reset row count */ @@ -2034,7 +2065,7 @@ static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){ sqlite3_free(zIns); return 0; }else{ - utf8_printf(p->out, "%s;\n", zSql); + printSchemaLine(p->out, zSql, ";\n"); } if( strcmp(zType, "table")==0 ){ @@ -2158,6 +2189,9 @@ static char zHelp[] = ".headers on|off Turn display of headers on or off\n" ".help Show this message\n" ".import FILE TABLE Import data from FILE into TABLE\n" +#ifndef SQLITE_OMIT_TEST_CONTROL + ".imposter INDEX TABLE Create imposter table TABLE on index INDEX\n" +#endif ".indexes ?TABLE? Show names of all indexes\n" " If TABLE specified, only show indexes for tables\n" " matching LIKE pattern TABLE.\n" @@ -2165,6 +2199,8 @@ static char zHelp[] = ".iotrace FILE Enable I/O diagnostic logging to FILE\n" #endif ".limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT\n" + ".lint OPTIONS Report potential schema issues. Options:\n" + " fkey-indexes Find missing foreign key indexes\n" #ifndef SQLITE_OMIT_LOAD_EXTENSION ".load FILE ?ENTRY? Load an extension library\n" #endif @@ -2177,6 +2213,7 @@ static char zHelp[] = " insert SQL insert statements for TABLE\n" " line One value per line\n" " list Values delimited by .separator strings\n" + " quote Escape answers as for SQL\n" " tabs Tab-separated values\n" " tcl TCL list elements\n" ".nullvalue STRING Use STRING in place of NULL values\n" @@ -2243,14 +2280,22 @@ void session_help(ShellState *p){ /* Forward reference */ static int process_input(ShellState *p, FILE *in); - /* -** Read the content of a file into memory obtained from sqlite3_malloc64(). -** The caller is responsible for freeing the memory. +** Read the content of file zName into memory obtained from sqlite3_malloc64() +** and return a pointer to the buffer. The caller is responsible for freeing +** the memory. +** +** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes +** read. ** -** NULL is returned if any error is encountered. +** For convenience, a nul-terminator byte is always appended to the data read +** from the file before the buffer is returned. This byte is not included in +** the final value of (*pnByte), if applicable. +** +** NULL is returned if any error is encountered. The final value of *pnByte +** is undefined in this case. */ -static char *readFile(const char *zName){ +static char *readFile(const char *zName, int *pnByte){ FILE *in = fopen(zName, "rb"); long nIn; size_t nRead; @@ -2268,6 +2313,7 @@ static char *readFile(const char *zName){ return 0; } pBuf[nIn] = 0; + if( pnByte ) *pnByte = nIn; return pBuf; } @@ -2283,12 +2329,13 @@ static void readfileFunc( ){ const char *zName; void *pBuf; + int nBuf; UNUSED_PARAMETER(argc); zName = (const char*)sqlite3_value_text(argv[0]); if( zName==0 ) return; - pBuf = readFile(zName); - if( pBuf ) sqlite3_result_blob(context, pBuf, -1, sqlite3_free); + pBuf = readFile(zName, &nBuf); + if( pBuf ) sqlite3_result_blob(context, pBuf, nBuf, sqlite3_free); } /* @@ -2567,6 +2614,8 @@ static FILE *output_file_open(const char *zFile){ return f; } +#if !defined(SQLITE_UNTESTABLE) +#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT) /* ** A routine for handling output from sqlite3_trace(). */ @@ -2587,6 +2636,8 @@ static int sql_trace_callback( } return 0; } +#endif +#endif /* ** A no-op routine that runs with the ".breakpoint" doc-command. This is @@ -3214,6 +3265,253 @@ int shellDeleteFile(const char *zFilename){ return rc; } + +/* +** The implementation of SQL scalar function fkey_collate_clause(), used +** by the ".lint fkey-indexes" command. This scalar function is always +** called with four arguments - the parent table name, the parent column name, +** the child table name and the child column name. +** +** fkey_collate_clause('parent-tab', 'parent-col', 'child-tab', 'child-col') +** +** If either of the named tables or columns do not exist, this function +** returns an empty string. An empty string is also returned if both tables +** and columns exist but have the same default collation sequence. Or, +** if both exist but the default collation sequences are different, this +** function returns the string " COLLATE ", where +** is the default collation sequence of the parent column. +*/ +static void shellFkeyCollateClause( + sqlite3_context *pCtx, + int nVal, + sqlite3_value **apVal +){ + sqlite3 *db = sqlite3_context_db_handle(pCtx); + const char *zParent; + const char *zParentCol; + const char *zParentSeq; + const char *zChild; + const char *zChildCol; + const char *zChildSeq = 0; /* Initialize to avoid false-positive warning */ + int rc; + + assert( nVal==4 ); + zParent = (const char*)sqlite3_value_text(apVal[0]); + zParentCol = (const char*)sqlite3_value_text(apVal[1]); + zChild = (const char*)sqlite3_value_text(apVal[2]); + zChildCol = (const char*)sqlite3_value_text(apVal[3]); + + sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC); + rc = sqlite3_table_column_metadata( + db, "main", zParent, zParentCol, 0, &zParentSeq, 0, 0, 0 + ); + if( rc==SQLITE_OK ){ + rc = sqlite3_table_column_metadata( + db, "main", zChild, zChildCol, 0, &zChildSeq, 0, 0, 0 + ); + } + + if( rc==SQLITE_OK && sqlite3_stricmp(zParentSeq, zChildSeq) ){ + char *z = sqlite3_mprintf(" COLLATE %s", zParentSeq); + sqlite3_result_text(pCtx, z, -1, SQLITE_TRANSIENT); + sqlite3_free(z); + } +} + + +/* +** The implementation of dot-command ".lint fkey-indexes". +*/ +static int lintFkeyIndexes( + ShellState *pState, /* Current shell tool state */ + char **azArg, /* Array of arguments passed to dot command */ + int nArg /* Number of entries in azArg[] */ +){ + sqlite3 *db = pState->db; /* Database handle to query "main" db of */ + FILE *out = pState->out; /* Stream to write non-error output to */ + int bVerbose = 0; /* If -verbose is present */ + int bGroupByParent = 0; /* If -groupbyparent is present */ + int i; /* To iterate through azArg[] */ + const char *zIndent = ""; /* How much to indent CREATE INDEX by */ + int rc; /* Return code */ + sqlite3_stmt *pSql = 0; /* Compiled version of SQL statement below */ + + /* + ** This SELECT statement returns one row for each foreign key constraint + ** in the schema of the main database. The column values are: + ** + ** 0. The text of an SQL statement similar to: + ** + ** "EXPLAIN QUERY PLAN SELECT rowid FROM child_table WHERE child_key=?" + ** + ** This is the same SELECT that the foreign keys implementation needs + ** to run internally on child tables. If there is an index that can + ** be used to optimize this query, then it can also be used by the FK + ** implementation to optimize DELETE or UPDATE statements on the parent + ** table. + ** + ** 1. A GLOB pattern suitable for sqlite3_strglob(). If the plan output by + ** the EXPLAIN QUERY PLAN command matches this pattern, then the schema + ** contains an index that can be used to optimize the query. + ** + ** 2. Human readable text that describes the child table and columns. e.g. + ** + ** "child_table(child_key1, child_key2)" + ** + ** 3. Human readable text that describes the parent table and columns. e.g. + ** + ** "parent_table(parent_key1, parent_key2)" + ** + ** 4. A full CREATE INDEX statement for an index that could be used to + ** optimize DELETE or UPDATE statements on the parent table. e.g. + ** + ** "CREATE INDEX child_table_child_key ON child_table(child_key)" + ** + ** 5. The name of the parent table. + ** + ** These six values are used by the C logic below to generate the report. + */ + const char *zSql = + "SELECT " + " 'EXPLAIN QUERY PLAN SELECT rowid FROM ' || quote(s.name) || ' WHERE '" + " || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' " + " || fkey_collate_clause(f.[table], f.[to], s.name, f.[from]),' AND ')" + ", " + " 'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('" + " || group_concat('*=?', ' AND ') || ')'" + ", " + " s.name || '(' || group_concat(f.[from], ', ') || ')'" + ", " + " f.[table] || '(' || group_concat(COALESCE(f.[to], " + " (SELECT name FROM pragma_table_info(f.[table]) WHERE pk=seq+1)" + " )) || ')'" + ", " + " 'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))" + " || ' ON ' || quote(s.name) || '('" + " || group_concat(quote(f.[from]) ||" + " fkey_collate_clause(f.[table], f.[to], s.name, f.[from]), ', ')" + " || ');'" + ", " + " f.[table] " + + "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f " + "GROUP BY s.name, f.id " + "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)" + ; + + for(i=2; i1 && sqlite3_strnicmp("-verbose", azArg[i], n)==0 ){ + bVerbose = 1; + } + else if( n>1 && sqlite3_strnicmp("-groupbyparent", azArg[i], n)==0 ){ + bGroupByParent = 1; + zIndent = " "; + } + else{ + raw_printf(stderr, "Usage: %s %s ?-verbose? ?-groupbyparent?\n", + azArg[0], azArg[1] + ); + return SQLITE_ERROR; + } + } + + /* Register the fkey_collate_clause() SQL function */ + rc = sqlite3_create_function(db, "fkey_collate_clause", 4, SQLITE_UTF8, + 0, shellFkeyCollateClause, 0, 0 + ); + + + if( rc==SQLITE_OK ){ + rc = sqlite3_prepare_v2(db, zSql, -1, &pSql, 0); + } + if( rc==SQLITE_OK ){ + sqlite3_bind_int(pSql, 1, bGroupByParent); + } + + if( rc==SQLITE_OK ){ + int rc2; + char *zPrev = 0; + while( SQLITE_ROW==sqlite3_step(pSql) ){ + int res = -1; + sqlite3_stmt *pExplain = 0; + const char *zEQP = (const char*)sqlite3_column_text(pSql, 0); + const char *zGlob = (const char*)sqlite3_column_text(pSql, 1); + const char *zFrom = (const char*)sqlite3_column_text(pSql, 2); + const char *zTarget = (const char*)sqlite3_column_text(pSql, 3); + const char *zCI = (const char*)sqlite3_column_text(pSql, 4); + const char *zParent = (const char*)sqlite3_column_text(pSql, 5); + + rc = sqlite3_prepare_v2(db, zEQP, -1, &pExplain, 0); + if( rc!=SQLITE_OK ) break; + if( SQLITE_ROW==sqlite3_step(pExplain) ){ + const char *zPlan = (const char*)sqlite3_column_text(pExplain, 3); + res = (0==sqlite3_strglob(zGlob, zPlan)); + } + rc = sqlite3_finalize(pExplain); + if( rc!=SQLITE_OK ) break; + + if( res<0 ){ + raw_printf(stderr, "Error: internal error"); + break; + }else{ + if( bGroupByParent + && (bVerbose || res==0) + && (zPrev==0 || sqlite3_stricmp(zParent, zPrev)) + ){ + raw_printf(out, "-- Parent table %s\n", zParent); + sqlite3_free(zPrev); + zPrev = sqlite3_mprintf("%s", zParent); + } + + if( res==0 ){ + raw_printf(out, "%s%s --> %s\n", zIndent, zCI, zTarget); + }else if( bVerbose ){ + raw_printf(out, "%s/* no extra indexes required for %s -> %s */\n", + zIndent, zFrom, zTarget + ); + } + } + } + sqlite3_free(zPrev); + + if( rc!=SQLITE_OK ){ + raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); + } + + rc2 = sqlite3_finalize(pSql); + if( rc==SQLITE_OK && rc2!=SQLITE_OK ){ + rc = rc2; + raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); + } + }else{ + raw_printf(stderr, "%s\n", sqlite3_errmsg(db)); + } + + return rc; +} + +/* +** Implementation of ".lint" dot command. +*/ +static int lintDotCommand( + ShellState *pState, /* Current shell tool state */ + char **azArg, /* Array of arguments passed to dot command */ + int nArg /* Number of entries in azArg[] */ +){ + int n; + n = (nArg>=2 ? (int)strlen(azArg[1]) : 0); + if( n<1 || sqlite3_strnicmp(azArg[1], "fkey-indexes", n) ) goto usage; + return lintFkeyIndexes(pState, azArg, nArg); + + usage: + raw_printf(stderr, "Usage %s sub-command ?switches...?\n", azArg[0]); + raw_printf(stderr, "Where sub-commands are:\n"); + raw_printf(stderr, " fkey-indexes\n"); + return SQLITE_ERROR; +} + + /* ** If an input line begins with "." then invoke this routine to ** process that line. @@ -3377,7 +3675,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( nArg!=2 ){ raw_printf(stderr, "Usage: .check GLOB-PATTERN\n"); rc = 2; - }else if( (zRes = readFile("testcase-out.txt"))==0 ){ + }else if( (zRes = readFile("testcase-out.txt", 0))==0 ){ raw_printf(stderr, "Error: cannot read 'testcase-out.txt'\n"); rc = 2; }else if( testcase_glob(azArg[1],zRes)==0 ){ @@ -3406,13 +3704,12 @@ static int do_meta_command(char *zLine, ShellState *p){ char *zErrMsg = 0; open_db(p, 0); memcpy(&data, p, sizeof(data)); - data.showHeader = 1; - data.cMode = data.mode = MODE_Column; - data.colWidth[0] = 3; - data.colWidth[1] = 15; - data.colWidth[2] = 58; + data.showHeader = 0; + data.cMode = data.mode = MODE_List; + sqlite3_snprintf(sizeof(data.colSeparator),data.colSeparator,": "); data.cnt = 0; - sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg); + sqlite3_exec(p->db, "SELECT name, file FROM pragma_database_list", + callback, &data, &zErrMsg); if( zErrMsg ){ utf8_printf(stderr,"Error: %s\n", zErrMsg); sqlite3_free(zErrMsg); @@ -3793,51 +4090,78 @@ static int do_meta_command(char *zLine, ShellState *p){ if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0); }else - if( c=='i' && (strncmp(azArg[0], "indices", n)==0 - || strncmp(azArg[0], "indexes", n)==0) ){ - ShellState data; - char *zErrMsg = 0; - open_db(p, 0); - memcpy(&data, p, sizeof(data)); - data.showHeader = 0; - data.cMode = data.mode = MODE_List; - if( nArg==1 ){ - rc = sqlite3_exec(p->db, - "SELECT name FROM sqlite_master " - "WHERE type='index' AND name NOT LIKE 'sqlite_%' " - "UNION ALL " - "SELECT name FROM sqlite_temp_master " - "WHERE type='index' " - "ORDER BY 1", - callback, &data, &zErrMsg - ); - }else if( nArg==2 ){ - zShellStatic = azArg[1]; - rc = sqlite3_exec(p->db, - "SELECT name FROM sqlite_master " - "WHERE type='index' AND tbl_name LIKE shellstatic() " - "UNION ALL " - "SELECT name FROM sqlite_temp_master " - "WHERE type='index' AND tbl_name LIKE shellstatic() " - "ORDER BY 1", - callback, &data, &zErrMsg - ); - zShellStatic = 0; - }else{ - raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n"); +#ifndef SQLITE_UNTESTABLE + if( c=='i' && strncmp(azArg[0], "imposter", n)==0 ){ + char *zSql; + char *zCollist = 0; + sqlite3_stmt *pStmt; + int tnum = 0; + int i; + if( nArg!=3 ){ + utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n"); rc = 1; goto meta_command_exit; } - if( zErrMsg ){ - utf8_printf(stderr,"Error: %s\n", zErrMsg); - sqlite3_free(zErrMsg); + open_db(p, 0); + zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master" + " WHERE name='%q' AND type='index'", azArg[1]); + sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( sqlite3_step(pStmt)==SQLITE_ROW ){ + tnum = sqlite3_column_int(pStmt, 0); + } + sqlite3_finalize(pStmt); + if( tnum==0 ){ + utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]); rc = 1; - }else if( rc != SQLITE_OK ){ - raw_printf(stderr, - "Error: querying sqlite_master and sqlite_temp_master\n"); + goto meta_command_exit; + } + zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + i = 0; + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + char zLabel[20]; + const char *zCol = (const char*)sqlite3_column_text(pStmt,2); + i++; + if( zCol==0 ){ + if( sqlite3_column_int(pStmt,1)==-1 ){ + zCol = "_ROWID_"; + }else{ + sqlite3_snprintf(sizeof(zLabel),zLabel,"expr%d",i); + zCol = zLabel; + } + } + if( zCollist==0 ){ + zCollist = sqlite3_mprintf("\"%w\"", zCol); + }else{ + zCollist = sqlite3_mprintf("%z,\"%w\"", zCollist, zCol); + } + } + sqlite3_finalize(pStmt); + zSql = sqlite3_mprintf( + "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID", + azArg[2], zCollist, zCollist); + sqlite3_free(zCollist); + rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum); + if( rc==SQLITE_OK ){ + rc = sqlite3_exec(p->db, zSql, 0, 0, 0); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 0); + if( rc ){ + utf8_printf(stderr, "Error in [%s]: %s\n", zSql, sqlite3_errmsg(p->db)); + }else{ + utf8_printf(stdout, "%s;\n", zSql); + raw_printf(stdout, + "WARNING: writing to an imposter table will corrupt the index!\n" + ); + } + }else{ + raw_printf(stderr, "SQLITE_TESTCTRL_IMPOSTER returns %d\n", rc); rc = 1; } + sqlite3_free(zSql); }else +#endif /* !defined(SQLITE_OMIT_TEST_CONTROL) */ #ifdef SQLITE_ENABLE_IOTRACE if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){ @@ -3861,6 +4185,7 @@ static int do_meta_command(char *zLine, ShellState *p){ } }else #endif + if( c=='l' && n>=5 && strncmp(azArg[0], "limits", n)==0 ){ static const struct { const char *zLimitName; /* Name of a limit */ @@ -3920,6 +4245,11 @@ static int do_meta_command(char *zLine, ShellState *p){ } }else + if( c=='l' && n>2 && strncmp(azArg[0], "lint", n)==0 ){ + open_db(p, 0); + lintDotCommand(p, azArg, nArg); + }else + #ifndef SQLITE_OMIT_LOAD_EXTENSION if( c=='l' && strncmp(azArg[0], "load", n)==0 ){ const char *zFile, *zProc; @@ -3977,13 +4307,15 @@ static int do_meta_command(char *zLine, ShellState *p){ }else if( c2=='i' && strncmp(azArg[1],"insert",n2)==0 ){ p->mode = MODE_Insert; set_table_name(p, nArg>=3 ? azArg[2] : "table"); + }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){ + p->mode = MODE_Quote; }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){ p->mode = MODE_Ascii; sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit); sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record); }else { raw_printf(stderr, "Error: mode should be one of: " - "ascii column csv html insert line list tabs tcl\n"); + "ascii column csv html insert line list quote tabs tcl\n"); rc = 1; } p->cMode = p->mode; @@ -4581,7 +4913,10 @@ static int do_meta_command(char *zLine, ShellState *p){ } }else - if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 ){ + if( (c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0) + || (c=='i' && (strncmp(azArg[0], "indices", n)==0 + || strncmp(azArg[0], "indexes", n)==0) ) + ){ sqlite3_stmt *pStmt; char **azResult; int nRow, nAlloc; @@ -4594,28 +4929,41 @@ static int do_meta_command(char *zLine, ShellState *p){ /* Create an SQL statement to query for the list of tables in the ** main and all attached databases where the table name matches the ** LIKE pattern bound to variable "?1". */ - zSql = sqlite3_mprintf( - "SELECT name FROM sqlite_master" - " WHERE type IN ('table','view')" - " AND name NOT LIKE 'sqlite_%%'" - " AND name LIKE ?1"); - while( zSql && sqlite3_step(pStmt)==SQLITE_ROW ){ + if( c=='t' ){ + zSql = sqlite3_mprintf( + "SELECT name FROM sqlite_master" + " WHERE type IN ('table','view')" + " AND name NOT LIKE 'sqlite_%%'" + " AND name LIKE ?1"); + }else if( nArg>2 ){ + /* It is an historical accident that the .indexes command shows an error + ** when called with the wrong number of arguments whereas the .tables + ** command does not. */ + raw_printf(stderr, "Usage: .indexes ?LIKE-PATTERN?\n"); + rc = 1; + goto meta_command_exit; + }else{ + zSql = sqlite3_mprintf( + "SELECT name FROM sqlite_master" + " WHERE type='index'" + " AND tbl_name LIKE ?1"); + } + for(ii=0; zSql && sqlite3_step(pStmt)==SQLITE_ROW; ii++){ const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1); - if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue; - if( strcmp(zDbName,"temp")==0 ){ + if( zDbName==0 || ii==0 ) continue; + if( c=='t' ){ zSql = sqlite3_mprintf( "%z UNION ALL " - "SELECT 'temp.' || name FROM sqlite_temp_master" + "SELECT '%q.' || name FROM \"%w\".sqlite_master" " WHERE type IN ('table','view')" " AND name NOT LIKE 'sqlite_%%'" - " AND name LIKE ?1", zSql); + " AND name LIKE ?1", zSql, zDbName, zDbName); }else{ zSql = sqlite3_mprintf( "%z UNION ALL " "SELECT '%q.' || name FROM \"%w\".sqlite_master" - " WHERE type IN ('table','view')" - " AND name NOT LIKE 'sqlite_%%'" - " AND name LIKE ?1", zSql, zDbName, zDbName); + " WHERE type='index'" + " AND tbl_name LIKE ?1", zSql, zDbName, zDbName); } } rc = sqlite3_finalize(pStmt); @@ -4690,7 +5038,7 @@ static int do_meta_command(char *zLine, ShellState *p){ output_reset(p); p->out = output_file_open("testcase-out.txt"); if( p->out==0 ){ - utf8_printf(stderr, "Error: cannot open 'testcase-out.txt'\n"); + raw_printf(stderr, "Error: cannot open 'testcase-out.txt'\n"); } if( nArg>=2 ){ sqlite3_snprintf(sizeof(p->zTestcase), p->zTestcase, "%s", azArg[1]); @@ -4699,6 +5047,7 @@ static int do_meta_command(char *zLine, ShellState *p){ } }else +#ifndef SQLITE_UNTESTABLE if( c=='t' && n>=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){ static const struct { const char *zCtrlName; /* Name of a test-control option */ @@ -4874,6 +5223,7 @@ static int do_meta_command(char *zLine, ShellState *p){ } #endif }else +#endif /* !defined(SQLITE_UNTESTABLE) */ #if SQLITE_USER_AUTHENTICATION if( c=='u' && strncmp(azArg[0], "user", n)==0 ){ @@ -5082,6 +5432,42 @@ static int line_is_complete(char *zSql, int nSql){ return rc; } +/* +** Run a single line of SQL +*/ +static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ + int rc; + char *zErrMsg = 0; + + open_db(p, 0); + if( p->backslashOn ) resolve_backslashes(zSql); + BEGIN_TIMER; + rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg); + END_TIMER; + if( rc || zErrMsg ){ + char zPrefix[100]; + if( in!=0 || !stdin_is_interactive ){ + sqlite3_snprintf(sizeof(zPrefix), zPrefix, + "Error: near line %d:", startline); + }else{ + sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:"); + } + if( zErrMsg!=0 ){ + utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg); + sqlite3_free(zErrMsg); + zErrMsg = 0; + }else{ + utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db)); + } + return 1; + }else if( p->countChanges ){ + raw_printf(p->out, "changes: %3d total_changes: %d\n", + sqlite3_changes(p->db), sqlite3_total_changes(p->db)); + } + return 0; +} + + /* ** Read input from *in and process it. If *in==0 then input ** is interactive - the user is typing it it. Otherwise, input @@ -5098,7 +5484,6 @@ static int process_input(ShellState *p, FILE *in){ int nSql = 0; /* Bytes of zSql[] used */ int nAlloc = 0; /* Allocated zSql[] space */ int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */ - char *zErrMsg; /* Error message returned */ int rc; /* Error code */ int errCnt = 0; /* Number of errors seen */ int lineno = 0; /* Current line number */ @@ -5158,32 +5543,7 @@ static int process_input(ShellState *p, FILE *in){ } if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) && sqlite3_complete(zSql) ){ - p->cnt = 0; - open_db(p, 0); - if( p->backslashOn ) resolve_backslashes(zSql); - BEGIN_TIMER; - rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg); - END_TIMER; - if( rc || zErrMsg ){ - char zPrefix[100]; - if( in!=0 || !stdin_is_interactive ){ - sqlite3_snprintf(sizeof(zPrefix), zPrefix, - "Error: near line %d:", startline); - }else{ - sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:"); - } - if( zErrMsg!=0 ){ - utf8_printf(stderr, "%s %s\n", zPrefix, zErrMsg); - sqlite3_free(zErrMsg); - zErrMsg = 0; - }else{ - utf8_printf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db)); - } - errCnt++; - }else if( p->countChanges ){ - raw_printf(p->out, "changes: %3d total_changes: %d\n", - sqlite3_changes(p->db), sqlite3_total_changes(p->db)); - } + errCnt += runOneSqlLine(p, zSql, in, startline); nSql = 0; if( p->outCount ){ output_reset(p); @@ -5194,11 +5554,8 @@ static int process_input(ShellState *p, FILE *in){ nSql = 0; } } - if( nSql ){ - if( !_all_whitespace(zSql) ){ - utf8_printf(stderr, "Error: incomplete SQL: %s\n", zSql); - errCnt++; - } + if( nSql && !_all_whitespace(zSql) ){ + runOneSqlLine(p, zSql, in, startline); } free(zSql); free(zLine); diff --git a/sqlite/src/sqlite.h.in b/sqlite/src/sqlite.h.in index 8857d133..caa89721 100644 --- a/sqlite/src/sqlite.h.in +++ b/sqlite/src/sqlite.h.in @@ -127,7 +127,7 @@ extern "C" { /* ** CAPI3REF: Run-Time Library Version Numbers -** KEYWORDS: sqlite3_version, sqlite3_sourceid +** KEYWORDS: sqlite3_version sqlite3_sourceid ** ** These interfaces provide the same information as the [SQLITE_VERSION], ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros @@ -1035,6 +1035,7 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_VFS_POINTER 27 #define SQLITE_FCNTL_JOURNAL_POINTER 28 #define SQLITE_FCNTL_WIN32_GET_HANDLE 29 +#define SQLITE_FCNTL_PDB 30 /* deprecated names */ #define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE @@ -1987,6 +1988,18 @@ struct sqlite3_mem_methods { ** until after the database connection closes. ** ** +**
SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
+**
Usually, when a database in wal mode is closed or detached from a +** database handle, SQLite checks if this will mean that there are now no +** connections at all to the database. If so, it performs a checkpoint +** operation before closing the connection. This option may be used to +** override this behaviour. The first parameter passed to this operation +** is an integer - non-zero to disable checkpoints-on-close, or zero (the +** default) to enable them. The second parameter is a pointer to an integer +** into which is written 0 or 1 to indicate whether checkpoints-on-close +** have been disabled - 0 if they are not disabled, 1 if they are. +**
+** ** */ #define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ @@ -1995,6 +2008,7 @@ struct sqlite3_mem_methods { #define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ #define SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1004 /* int int* */ #define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005 /* int int* */ +#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */ /* @@ -3596,6 +3610,10 @@ char *sqlite3_expanded_sql(sqlite3_stmt *pStmt); ** sqlite3_stmt_readonly() to return true since, while those statements ** change the configuration of a database connection, they do not make ** changes to the content of the database files on disk. +** ^The sqlite3_stmt_readonly() interface returns true for [BEGIN] since +** [BEGIN] merely sets internal flags, but the [BEGIN|BEGIN IMMEDIATE] and +** [BEGIN|BEGIN EXCLUSIVE] commands do touch the database and so +** sqlite3_stmt_readonly() returns false for those commands. */ int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); @@ -8211,7 +8229,8 @@ int sqlite3_db_cacheflush(sqlite3*); ** ** See also: [sqlite3_update_hook()] */ -SQLITE_EXPERIMENTAL void *sqlite3_preupdate_hook( +#if defined(SQLITE_ENABLE_PREUPDATE_HOOK) +void *sqlite3_preupdate_hook( sqlite3 *db, void(*xPreUpdate)( void *pCtx, /* Copy of third arg to preupdate_hook() */ @@ -8224,10 +8243,11 @@ SQLITE_EXPERIMENTAL void *sqlite3_preupdate_hook( ), void* ); -SQLITE_EXPERIMENTAL int sqlite3_preupdate_old(sqlite3 *, int, sqlite3_value **); -SQLITE_EXPERIMENTAL int sqlite3_preupdate_count(sqlite3 *); -SQLITE_EXPERIMENTAL int sqlite3_preupdate_depth(sqlite3 *); -SQLITE_EXPERIMENTAL int sqlite3_preupdate_new(sqlite3 *, int, sqlite3_value **); +int sqlite3_preupdate_old(sqlite3 *, int, sqlite3_value **); +int sqlite3_preupdate_count(sqlite3 *); +int sqlite3_preupdate_depth(sqlite3 *); +int sqlite3_preupdate_new(sqlite3 *, int, sqlite3_value **); +#endif /* ** CAPI3REF: Low-level system error code @@ -8243,7 +8263,7 @@ int sqlite3_system_errno(sqlite3*); /* ** CAPI3REF: Database Snapshot -** KEYWORDS: {snapshot} +** KEYWORDS: {snapshot} {sqlite3_snapshot} ** EXPERIMENTAL ** ** An instance of the snapshot object records the state of a [WAL mode] @@ -8267,7 +8287,9 @@ int sqlite3_system_errno(sqlite3*); ** to an historical snapshot (if possible). The destructor for ** sqlite3_snapshot objects is [sqlite3_snapshot_free()]. */ -typedef struct sqlite3_snapshot sqlite3_snapshot; +typedef struct sqlite3_snapshot { + unsigned char hidden[48]; +} sqlite3_snapshot; /* ** CAPI3REF: Record A Database Snapshot @@ -8278,9 +8300,32 @@ typedef struct sqlite3_snapshot sqlite3_snapshot; ** schema S in database connection D. ^On success, the ** [sqlite3_snapshot_get(D,S,P)] interface writes a pointer to the newly ** created [sqlite3_snapshot] object into *P and returns SQLITE_OK. -** ^If schema S of [database connection] D is not a [WAL mode] database -** that is in a read transaction, then [sqlite3_snapshot_get(D,S,P)] -** leaves the *P value unchanged and returns an appropriate [error code]. +** If there is not already a read-transaction open on schema S when +** this function is called, one is opened automatically. +** +** The following must be true for this function to succeed. If any of +** the following statements are false when sqlite3_snapshot_get() is +** called, SQLITE_ERROR is returned. The final value of *P is undefined +** in this case. +** +**
    +**
  • The database handle must be in [autocommit mode]. +** +**
  • Schema S of [database connection] D must be a [WAL mode] database. +** +**
  • There must not be a write transaction open on schema S of database +** connection D. +** +**
  • One or more transactions must have been written to the current wal +** file since it was created on disk (by any connection). This means +** that a snapshot cannot be taken on a wal mode database with no wal +** file immediately after it is first opened. At least one transaction +** must be written to it first. +**
+** +** This function may also return SQLITE_NOMEM. If it is called with the +** database handle in autocommit mode but fails for some other reason, +** whether or not a read transaction is opened on schema S is undefined. ** ** The [sqlite3_snapshot] object returned from a successful call to ** [sqlite3_snapshot_get()] must be freed using [sqlite3_snapshot_free()] @@ -8373,6 +8418,28 @@ SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp( sqlite3_snapshot *p2 ); +/* +** CAPI3REF: Recover snapshots from a wal file +** EXPERIMENTAL +** +** If all connections disconnect from a database file but do not perform +** a checkpoint, the existing wal file is opened along with the database +** file the next time the database is opened. At this point it is only +** possible to successfully call sqlite3_snapshot_open() to open the most +** recent snapshot of the database (the one at the head of the wal file), +** even though the wal file may contain other valid snapshots for which +** clients have sqlite3_snapshot handles. +** +** This function attempts to scan the wal file associated with database zDb +** of database handle db and make all valid snapshots available to +** sqlite3_snapshot_open(). It is an error if there is already a read +** transaction open on the database, or if the database is not a wal mode +** database. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb); + /* ** Undo the hack that converts floating point types to integer for ** builds on processors without floating point support. diff --git a/sqlite/src/sqliteInt.h b/sqlite/src/sqliteInt.h index 98cfcb4e..d78d2072 100644 --- a/sqlite/src/sqliteInt.h +++ b/sqlite/src/sqliteInt.h @@ -1046,6 +1046,14 @@ typedef struct Walker Walker; typedef struct WhereInfo WhereInfo; typedef struct With With; +/* A VList object records a mapping between parameters/variables/wildcards +** in the SQL statement (such as $abc, @pqr, or :xyz) and the integer +** variable number associated with that parameter. See the format description +** on the sqlite3VListAdd() routine for more information. A VList is really +** just an array of integers. +*/ +typedef int VList; + /* ** Defer sourcing vdbe.h and btree.h until after the "u8" and ** "BusyHandler" typedefs. vdbe.h also requires a few of the opaque @@ -1435,6 +1443,7 @@ struct sqlite3 { #define SQLITE_Vacuum 0x10000000 /* Currently in a VACUUM */ #define SQLITE_CellSizeCk 0x20000000 /* Check btree cell sizes on load */ #define SQLITE_Fts3Tokenizer 0x40000000 /* Enable fts3_tokenizer(2) */ +#define SQLITE_NoCkptOnClose 0x80000000 /* No checkpoint on close()/DETACH */ /* @@ -1460,13 +1469,8 @@ struct sqlite3 { /* ** Macros for testing whether or not optimizations are enabled or disabled. */ -#ifndef SQLITE_OMIT_BUILTIN_TEST #define OptimizationDisabled(db, mask) (((db)->dbOptFlags&(mask))!=0) #define OptimizationEnabled(db, mask) (((db)->dbOptFlags&(mask))==0) -#else -#define OptimizationDisabled(db, mask) 0 -#define OptimizationEnabled(db, mask) 1 -#endif /* ** Return true if it OK to factor constant expressions into the initialization @@ -1805,9 +1809,9 @@ struct Table { ExprList *pCheck; /* All CHECK constraints */ /* ... also used as column name list in a VIEW */ int tnum; /* Root BTree page for this table */ + u32 nTabRef; /* Number of pointers to this Table */ i16 iPKey; /* If not negative, use aCol[iPKey] as the rowid */ i16 nCol; /* Number of columns in this table */ - u16 nRef; /* Number of pointers to this Table */ LogEst nRowLogEst; /* Estimated rows in table - from sqlite_stat1 table */ LogEst szTabRow; /* Estimated size of each table row in bytes */ #ifdef SQLITE_ENABLE_COSTMULT @@ -2956,7 +2960,6 @@ struct Parse { Token sLastToken; /* The last token parsed */ ynVar nVar; /* Number of '?' variables seen in the SQL so far */ - int nzVar; /* Number of available slots in azVar[] */ u8 iPkSortOrder; /* ASC or DESC for INTEGER PRIMARY KEY */ u8 explain; /* True if the EXPLAIN flag is found on the query */ #ifndef SQLITE_OMIT_VIRTUALTABLE @@ -2968,7 +2971,7 @@ struct Parse { int iSelectId; /* ID of current select for EXPLAIN output */ int iNextSelectId; /* Next available select ID for EXPLAIN output */ #endif - char **azVar; /* Pointers to names of parameters */ + VList *pVList; /* Mapping between variable names and numbers */ 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 */ @@ -3236,7 +3239,7 @@ struct Sqlite3Config { void (*xVdbeBranch)(void*,int iSrcLine,u8 eThis,u8 eMx); /* Callback */ void *pVdbeBranchArg; /* 1st argument */ #endif -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ #endif int bLocaltimeFault; /* True to fail localtime() calls */ @@ -3440,7 +3443,7 @@ void sqlite3ScratchFree(void*); void *sqlite3PageMalloc(int); void sqlite3PageFree(void*); void sqlite3MemSetDefault(void); -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE void sqlite3BenignMallocHooks(void (*)(void), void (*)(void)); #endif int sqlite3HeapNearlyFull(void); @@ -3551,7 +3554,7 @@ int sqlite3NoTempsInRange(Parse*,int,int); Expr *sqlite3ExprAlloc(sqlite3*,int,const Token*,int); Expr *sqlite3Expr(sqlite3*,int,const char*); void sqlite3ExprAttachSubtrees(sqlite3*,Expr*,Expr*,Expr*); -Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*, const Token*); +Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*); void sqlite3PExprAddSelect(Parse*, Expr*, Select*); Expr *sqlite3ExprAnd(sqlite3*,Expr*, Expr*); Expr *sqlite3ExprFunction(Parse*,ExprList*, Token*); @@ -3567,6 +3570,9 @@ u32 sqlite3ExprListFlags(const ExprList*); int sqlite3Init(sqlite3*, char**); int sqlite3InitCallback(void*, int, char**, char**); void sqlite3Pragma(Parse*,Token*,Token*,Token*,int); +#ifndef SQLITE_OMIT_VIRTUALTABLE +Module *sqlite3PragmaVtabRegister(sqlite3*,const char *zName); +#endif void sqlite3ResetAllSchemasOfConnection(sqlite3*); void sqlite3ResetOneSchema(sqlite3*,int); void sqlite3CollapseDatabaseArray(sqlite3*); @@ -3595,7 +3601,7 @@ int sqlite3ParseUri(const char*,const char*,unsigned int*, sqlite3_vfs**,char**,char **); Btree *sqlite3DbNameToBtree(sqlite3*,const char*); -#ifdef SQLITE_OMIT_BUILTIN_TEST +#ifdef SQLITE_UNTESTABLE # define sqlite3FaultSim(X) SQLITE_OK #else int sqlite3FaultSim(int); @@ -3608,7 +3614,7 @@ int sqlite3BitvecSet(Bitvec*, u32); void sqlite3BitvecClear(Bitvec*, u32, void*); void sqlite3BitvecDestroy(Bitvec*); u32 sqlite3BitvecSize(Bitvec*); -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE int sqlite3BitvecBuiltinTest(int,int*); #endif @@ -3705,6 +3711,7 @@ int sqlite3ExprCodeExprList(Parse*, ExprList*, int, int, u8); #define SQLITE_ECEL_DUP 0x01 /* Deep, not shallow copies */ #define SQLITE_ECEL_FACTOR 0x02 /* Factor out constant terms */ #define SQLITE_ECEL_REF 0x04 /* Use ExprList.u.x.iOrderByCol */ +#define SQLITE_ECEL_OMITREF 0x08 /* Omit if ExprList.u.x.iOrderByCol */ void sqlite3ExprIfTrue(Parse*, Expr*, int, int); void sqlite3ExprIfFalse(Parse*, Expr*, int, int); void sqlite3ExprIfFalseDup(Parse*, Expr*, int, int); @@ -3727,7 +3734,7 @@ void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*); int sqlite3ExprCoveredByIndex(Expr*, int iCur, Index *pIdx); int sqlite3FunctionUsesThisSrc(Expr*, SrcList*); Vdbe *sqlite3GetVdbe(Parse*); -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE void sqlite3PrngSaveState(void); void sqlite3PrngRestoreState(void); #endif @@ -3864,6 +3871,9 @@ LogEst sqlite3LogEstFromDouble(double); defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) u64 sqlite3LogEstToInt(LogEst); #endif +VList *sqlite3VListAdd(sqlite3*,VList*,const char*,int,int); +const char *sqlite3VListNumToName(VList*,int); +int sqlite3VListNameToNum(VList*,const char*,int); /* ** Routines to read and write variable-length integers. These used to @@ -4080,6 +4090,13 @@ void sqlite3AutoLoadExtensions(sqlite3*); int sqlite3VtabSavepoint(sqlite3 *, int, int); void sqlite3VtabImportErrmsg(Vdbe*, sqlite3_vtab*); VTable *sqlite3GetVTable(sqlite3*, Table*); + Module *sqlite3VtabCreateModule( + sqlite3*, + const char*, + const sqlite3_module*, + void*, + void(*)(void*) + ); # define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0) #endif int sqlite3VtabEponymousTableInit(Parse*,Module*); @@ -4155,10 +4172,10 @@ const char *sqlite3JournalModename(int); /* ** The interface to the code in fault.c used for identifying "benign" -** malloc failures. This is only present if SQLITE_OMIT_BUILTIN_TEST +** malloc failures. This is only present if SQLITE_UNTESTABLE ** is not defined. */ -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE void sqlite3BeginBenignMalloc(void); void sqlite3EndBenignMalloc(void); #else @@ -4289,5 +4306,6 @@ int sqlite3ExprVectorSize(Expr *pExpr); int sqlite3ExprIsVector(Expr *pExpr); Expr *sqlite3VectorFieldSubexpr(Expr*, int); Expr *sqlite3ExprForVectorField(Parse*,Expr*,int); +void sqlite3VectorErrorMsg(Parse*, Expr*); #endif /* SQLITEINT_H */ diff --git a/sqlite/src/tclsqlite.c b/sqlite/src/tclsqlite.c index b2f13bd5..1d87c9b3 100644 --- a/sqlite/src/tclsqlite.c +++ b/sqlite/src/tclsqlite.c @@ -3140,7 +3140,8 @@ static int SQLITE_TCLAPI DbObjCmd( */ case DB_PREUPDATE: { #ifndef SQLITE_ENABLE_PREUPDATE_HOOK - Tcl_AppendResult(interp, "preupdate_hook was omitted at compile-time"); + Tcl_AppendResult(interp, "preupdate_hook was omitted at compile-time", + (char*)0); rc = TCL_ERROR; #else static const char *azSub[] = {"count", "depth", "hook", "new", "old", 0}; diff --git a/sqlite/src/test1.c b/sqlite/src/test1.c index 6c9a0ea1..d17fc102 100644 --- a/sqlite/src/test1.c +++ b/sqlite/src/test1.c @@ -2310,6 +2310,38 @@ static int SQLITE_TCLAPI test_snapshot_get( } #endif /* SQLITE_ENABLE_SNAPSHOT */ +#ifdef SQLITE_ENABLE_SNAPSHOT +/* +** Usage: sqlite3_snapshot_recover DB DBNAME +*/ +static int SQLITE_TCLAPI test_snapshot_recover( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + int rc; + sqlite3 *db; + char *zName; + + if( objc!=3 ){ + Tcl_WrongNumArgs(interp, 1, objv, "DB DBNAME"); + return TCL_ERROR; + } + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; + zName = Tcl_GetString(objv[2]); + + rc = sqlite3_snapshot_recover(db, zName); + if( rc!=SQLITE_OK ){ + Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1)); + return TCL_ERROR; + }else{ + Tcl_ResetResult(interp); + } + return TCL_OK; +} +#endif /* SQLITE_ENABLE_SNAPSHOT */ + #ifdef SQLITE_ENABLE_SNAPSHOT /* ** Usage: sqlite3_snapshot_open DB DBNAME SNAPSHOT @@ -2388,6 +2420,113 @@ static int SQLITE_TCLAPI test_snapshot_cmp( } #endif /* SQLITE_ENABLE_SNAPSHOT */ +#ifdef SQLITE_ENABLE_SNAPSHOT +/* +** Usage: sqlite3_snapshot_get_blob DB DBNAME +*/ +static int SQLITE_TCLAPI test_snapshot_get_blob( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + int rc; + sqlite3 *db; + char *zName; + sqlite3_snapshot *pSnapshot = 0; + + if( objc!=3 ){ + Tcl_WrongNumArgs(interp, 1, objv, "DB DBNAME"); + return TCL_ERROR; + } + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; + zName = Tcl_GetString(objv[2]); + + rc = sqlite3_snapshot_get(db, zName, &pSnapshot); + if( rc!=SQLITE_OK ){ + Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1)); + return TCL_ERROR; + }else{ + Tcl_SetObjResult(interp, + Tcl_NewByteArrayObj((unsigned char*)pSnapshot, sizeof(sqlite3_snapshot)) + ); + sqlite3_snapshot_free(pSnapshot); + } + return TCL_OK; +} +#endif /* SQLITE_ENABLE_SNAPSHOT */ + +#ifdef SQLITE_ENABLE_SNAPSHOT + /* + ** Usage: sqlite3_snapshot_open_blob DB DBNAME SNAPSHOT +*/ +static int SQLITE_TCLAPI test_snapshot_open_blob( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + int rc; + sqlite3 *db; + char *zName; + unsigned char *pBlob; + int nBlob; + + if( objc!=4 ){ + Tcl_WrongNumArgs(interp, 1, objv, "DB DBNAME SNAPSHOT"); + return TCL_ERROR; + } + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; + zName = Tcl_GetString(objv[2]); + pBlob = Tcl_GetByteArrayFromObj(objv[3], &nBlob); + if( nBlob!=sizeof(sqlite3_snapshot) ){ + Tcl_AppendResult(interp, "bad SNAPSHOT", 0); + return TCL_ERROR; + } + rc = sqlite3_snapshot_open(db, zName, (sqlite3_snapshot*)pBlob); + if( rc!=SQLITE_OK ){ + Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1)); + return TCL_ERROR; + } + return TCL_OK; +} +#endif /* SQLITE_ENABLE_SNAPSHOT */ + +#ifdef SQLITE_ENABLE_SNAPSHOT +/* +** Usage: sqlite3_snapshot_cmp_blob SNAPSHOT1 SNAPSHOT2 +*/ +static int SQLITE_TCLAPI test_snapshot_cmp_blob( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + int res; + unsigned char *p1; + unsigned char *p2; + int n1; + int n2; + + if( objc!=3 ){ + Tcl_WrongNumArgs(interp, 1, objv, "SNAPSHOT1 SNAPSHOT2"); + return TCL_ERROR; + } + + p1 = Tcl_GetByteArrayFromObj(objv[1], &n1); + p2 = Tcl_GetByteArrayFromObj(objv[2], &n2); + + if( n1!=sizeof(sqlite3_snapshot) || n1!=n2 ){ + Tcl_AppendResult(interp, "bad SNAPSHOT", 0); + return TCL_ERROR; + } + + res = sqlite3_snapshot_cmp((sqlite3_snapshot*)p1, (sqlite3_snapshot*)p2); + Tcl_SetObjResult(interp, Tcl_NewIntObj(res)); + return TCL_OK; +} +#endif /* SQLITE_ENABLE_SNAPSHOT */ + /* ** Usage: sqlite3_delete_database FILENAME */ @@ -6819,6 +6958,7 @@ static int SQLITE_TCLAPI tclLoadStaticExtensionCmd( extern int sqlite3_nextchar_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_percentile_init(sqlite3*,char**,const sqlite3_api_routines*); 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*); extern int sqlite3_spellfix_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_totype_init(sqlite3*,char**,const sqlite3_api_routines*); @@ -6838,6 +6978,7 @@ static int SQLITE_TCLAPI tclLoadStaticExtensionCmd( { "nextchar", sqlite3_nextchar_init }, { "percentile", sqlite3_percentile_init }, { "regexp", sqlite3_regexp_init }, + { "remember", sqlite3_remember_init }, { "series", sqlite3_series_init }, { "spellfix", sqlite3_spellfix_init }, { "totype", sqlite3_totype_init }, @@ -7221,6 +7362,7 @@ static int SQLITE_TCLAPI test_sqlite3_db_config( { "TRIGGER", SQLITE_DBCONFIG_ENABLE_TRIGGER }, { "FTS3_TOKENIZER", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, { "LOAD_EXTENSION", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, + { "NO_CKPT_ON_CLOSE",SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, }; int i; int v; @@ -7538,6 +7680,10 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ { "sqlite3_snapshot_open", test_snapshot_open, 0 }, { "sqlite3_snapshot_free", test_snapshot_free, 0 }, { "sqlite3_snapshot_cmp", test_snapshot_cmp, 0 }, + { "sqlite3_snapshot_recover", test_snapshot_recover, 0 }, + { "sqlite3_snapshot_get_blob", test_snapshot_get_blob, 0 }, + { "sqlite3_snapshot_open_blob", test_snapshot_open_blob, 0 }, + { "sqlite3_snapshot_cmp_blob", test_snapshot_cmp_blob, 0 }, #endif { "sqlite3_delete_database", test_delete_database, 0 }, }; diff --git a/sqlite/src/test2.c b/sqlite/src/test2.c index dfca1d2b..850e1e1a 100644 --- a/sqlite/src/test2.c +++ b/sqlite/src/test2.c @@ -93,7 +93,7 @@ static int SQLITE_TCLAPI pager_close( return TCL_ERROR; } pPager = sqlite3TestTextToPtr(argv[1]); - rc = sqlite3PagerClose(pPager); + rc = sqlite3PagerClose(pPager, 0); if( rc!=SQLITE_OK ){ Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); return TCL_ERROR; diff --git a/sqlite/src/test_blob.c b/sqlite/src/test_blob.c index 3ac6c114..7fa733be 100644 --- a/sqlite/src/test_blob.c +++ b/sqlite/src/test_blob.c @@ -114,7 +114,7 @@ static int SQLITE_TCLAPI test_blob_open( const char *zVarname; int nVarname; - sqlite3_blob *pBlob = (sqlite3_blob*)0xFFFFFFFF; + sqlite3_blob *pBlob = (sqlite3_blob*)&flags; /* Non-zero initialization */ int rc; if( objc!=8 ){ diff --git a/sqlite/src/test_config.c b/sqlite/src/test_config.c index 1e68e58d..f409b1ca 100644 --- a/sqlite/src/test_config.c +++ b/sqlite/src/test_config.c @@ -268,7 +268,7 @@ static void set_options(Tcl_Interp *interp){ Tcl_SetVar2(interp, "sqlite_options", "between_opt", "1", TCL_GLOBAL_ONLY); #endif -#ifdef SQLITE_OMIT_BUILTIN_TEST +#ifdef SQLITE_UNTESTABLE Tcl_SetVar2(interp, "sqlite_options", "builtin_test", "0", TCL_GLOBAL_ONLY); #else Tcl_SetVar2(interp, "sqlite_options", "builtin_test", "1", TCL_GLOBAL_ONLY); @@ -714,6 +714,12 @@ Tcl_SetVar2(interp, "sqlite_options", "mergesort", "1", TCL_GLOBAL_ONLY); Tcl_SetVar2(interp, "sqlite_options", "sqllog", "0", TCL_GLOBAL_ONLY); #endif +#ifdef SQLITE_ENABLE_URI_00_ERROR + Tcl_SetVar2(interp, "sqlite_options", "uri_00_error", "1", TCL_GLOBAL_ONLY); +#else + Tcl_SetVar2(interp, "sqlite_options", "uri_00_error", "0", TCL_GLOBAL_ONLY); +#endif + #define LINKVAR(x) { \ static const int cv_ ## x = SQLITE_ ## x; \ Tcl_LinkVar(interp, "SQLITE_" #x, (char *)&(cv_ ## x), \ diff --git a/sqlite/src/test_delete.c b/sqlite/src/test_delete.c index 6b3d9e85..731f11e2 100644 --- a/sqlite/src/test_delete.c +++ b/sqlite/src/test_delete.c @@ -47,7 +47,7 @@ */ static void sqlite3Delete83Name(char *z){ int i, sz; - sz = strlen(z); + sz = (int)strlen(z); for(i=sz-1; i>0 && z[i]!='/' && z[i]!='.'; i--){} if( z[i]=='.' && (sz>i+4) ) memmove(&z[i+1], &z[sz-3], 4); } @@ -105,7 +105,7 @@ int sqlite3_delete_database( /* Allocate a buffer large enough for any of the files that need to be ** deleted. */ - nBuf = strlen(zFile) + 100; + nBuf = (int)strlen(zFile) + 100; zBuf = (char*)sqlite3_malloc(nBuf); if( zBuf==0 ) return SQLITE_NOMEM; diff --git a/sqlite/src/test_func.c b/sqlite/src/test_func.c index 26f0d369..c7860fe8 100644 --- a/sqlite/src/test_func.c +++ b/sqlite/src/test_func.c @@ -155,7 +155,7 @@ static void test_destructor_count( ** arguments. It returns the text value returned by the sqlite3_errmsg16() ** API function. */ -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE void sqlite3BeginBenignMalloc(void); void sqlite3EndBenignMalloc(void); #else diff --git a/sqlite/src/test_multiplex.c b/sqlite/src/test_multiplex.c index 1027aa13..ed8c9f7f 100644 --- a/sqlite/src/test_multiplex.c +++ b/sqlite/src/test_multiplex.c @@ -68,19 +68,6 @@ #define MAX_PAGE_SIZE 0x10000 #define DEFAULT_SECTOR_SIZE 0x1000 -/* -** For a build without mutexes, no-op the mutex calls. -*/ -#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE==0 -#define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8) -#define sqlite3_mutex_free(X) -#define sqlite3_mutex_enter(X) -#define sqlite3_mutex_try(X) SQLITE_OK -#define sqlite3_mutex_leave(X) -#define sqlite3_mutex_held(X) ((void)(X),1) -#define sqlite3_mutex_notheld(X) ((void)(X),1) -#endif /* SQLITE_THREADSAFE==0 */ - /* Maximum chunk number */ #define MX_CHUNK_NUMBER 299 @@ -139,7 +126,6 @@ struct multiplexGroup { unsigned int szChunk; /* Chunk size used for this group */ unsigned char bEnabled; /* TRUE to use Multiplex VFS for this file */ unsigned char bTruncate; /* TRUE to enable truncation of databases */ - multiplexGroup *pNext, *pPrev; /* Doubly linked list of all group objects */ }; /* @@ -187,28 +173,9 @@ static struct { /* True when this shim has been initialized. */ int isInitialized; - - /* For run-time access any of the other global data structures in this - ** shim, the following mutex must be held. In practice, all this mutex - ** protects is add/remove operations to/from the linked list of group objects - ** starting at pGroups below. More specifically, it protects the value of - ** pGroups itself, and the pNext/pPrev fields of each multiplexGroup - ** structure. */ - sqlite3_mutex *pMutex; - - /* List of multiplexGroup objects. - */ - multiplexGroup *pGroups; } gMultiplex; /************************* Utility Routines *********************************/ -/* -** Acquire and release the mutex used to serialize access to the -** list of multiplexGroups. -*/ -static void multiplexEnter(void){ sqlite3_mutex_enter(gMultiplex.pMutex); } -static void multiplexLeave(void){ sqlite3_mutex_leave(gMultiplex.pMutex); } - /* ** Compute a string length that is limited to what can be stored in ** lower 30 bits of a 32-bit signed integer. @@ -519,7 +486,6 @@ static int multiplexOpen( /* We need to create a group structure and manage ** access to this group of files. */ - multiplexEnter(); pMultiplexOpen = (multiplexConn*)pConn; if( rc==SQLITE_OK ){ @@ -626,16 +592,11 @@ static int multiplexOpen( }else{ pMultiplexOpen->base.pMethods = &gMultiplex.sIoMethodsV2; } - /* place this group at the head of our list */ - pGroup->pNext = gMultiplex.pGroups; - if( gMultiplex.pGroups ) gMultiplex.pGroups->pPrev = pGroup; - gMultiplex.pGroups = pGroup; }else{ multiplexFreeComponents(pGroup); sqlite3_free(pGroup); } } - multiplexLeave(); sqlite3_free(zToFree); return rc; } @@ -738,17 +699,8 @@ static int multiplexClose(sqlite3_file *pConn){ multiplexConn *p = (multiplexConn*)pConn; multiplexGroup *pGroup = p->pGroup; int rc = SQLITE_OK; - multiplexEnter(); multiplexFreeComponents(pGroup); - /* remove from linked list */ - if( pGroup->pNext ) pGroup->pNext->pPrev = pGroup->pPrev; - if( pGroup->pPrev ){ - pGroup->pPrev->pNext = pGroup->pNext; - }else{ - gMultiplex.pGroups = pGroup->pNext; - } sqlite3_free(pGroup); - multiplexLeave(); return rc; } @@ -845,7 +797,6 @@ static int multiplexTruncate(sqlite3_file *pConn, sqlite3_int64 size){ multiplexConn *p = (multiplexConn*)pConn; multiplexGroup *pGroup = p->pGroup; int rc = SQLITE_OK; - multiplexEnter(); if( !pGroup->bEnabled ){ sqlite3_file *pSubOpen = multiplexSubOpen(pGroup, 0, &rc, NULL, 0); if( pSubOpen==0 ){ @@ -877,7 +828,6 @@ static int multiplexTruncate(sqlite3_file *pConn, sqlite3_int64 size){ } if( rc ) rc = SQLITE_IOERR_TRUNCATE; } - multiplexLeave(); return rc; } @@ -888,7 +838,6 @@ static int multiplexSync(sqlite3_file *pConn, int flags){ multiplexGroup *pGroup = p->pGroup; int rc = SQLITE_OK; int i; - multiplexEnter(); for(i=0; inReal; i++){ sqlite3_file *pSubOpen = pGroup->aReal[i].p; if( pSubOpen ){ @@ -896,7 +845,6 @@ static int multiplexSync(sqlite3_file *pConn, int flags){ if( rc2!=SQLITE_OK ) rc = rc2; } } - multiplexLeave(); return rc; } @@ -908,7 +856,6 @@ static int multiplexFileSize(sqlite3_file *pConn, sqlite3_int64 *pSize){ multiplexGroup *pGroup = p->pGroup; int rc = SQLITE_OK; int i; - multiplexEnter(); if( !pGroup->bEnabled ){ sqlite3_file *pSubOpen = multiplexSubOpen(pGroup, 0, &rc, NULL, 0); if( pSubOpen==0 ){ @@ -924,7 +871,6 @@ static int multiplexFileSize(sqlite3_file *pConn, sqlite3_int64 *pSize){ *pSize = i*(sqlite3_int64)pGroup->szChunk + sz; } } - multiplexLeave(); return rc; } @@ -1151,11 +1097,6 @@ int sqlite3_multiplex_initialize(const char *zOrigVfsName, int makeDefault){ pOrigVfs = sqlite3_vfs_find(zOrigVfsName); if( pOrigVfs==0 ) return SQLITE_ERROR; assert( pOrigVfs!=&gMultiplex.sThisVfs ); - gMultiplex.pMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); - if( !gMultiplex.pMutex ){ - return SQLITE_NOMEM; - } - gMultiplex.pGroups = NULL; gMultiplex.isInitialized = 1; gMultiplex.pOrigVfs = pOrigVfs; gMultiplex.sThisVfs = *pOrigVfs; @@ -1214,14 +1155,7 @@ int sqlite3_multiplex_initialize(const char *zOrigVfsName, int makeDefault){ int sqlite3_multiplex_shutdown(int eForce){ int rc = SQLITE_OK; if( gMultiplex.isInitialized==0 ) return SQLITE_MISUSE; - if( gMultiplex.pGroups ){ - sqlite3_log(SQLITE_MISUSE, "sqlite3_multiplex_shutdown() called " - "while database connections are still open"); - if( !eForce ) return SQLITE_MISUSE; - rc = SQLITE_MISUSE; - } gMultiplex.isInitialized = 0; - sqlite3_mutex_free(gMultiplex.pMutex); sqlite3_vfs_unregister(&gMultiplex.sThisVfs); memset(&gMultiplex, 0, sizeof(gMultiplex)); return rc; @@ -1299,61 +1233,6 @@ static int SQLITE_TCLAPI test_multiplex_shutdown( return TCL_OK; } -/* -** tclcmd: sqlite3_multiplex_dump -*/ -static int SQLITE_TCLAPI test_multiplex_dump( - void * clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *CONST objv[] -){ - Tcl_Obj *pResult; - Tcl_Obj *pGroupTerm; - multiplexGroup *pGroup; - int i; - int nChunks = 0; - - UNUSED_PARAMETER(clientData); - UNUSED_PARAMETER(objc); - UNUSED_PARAMETER(objv); - - pResult = Tcl_NewObj(); - multiplexEnter(); - for(pGroup=gMultiplex.pGroups; pGroup; pGroup=pGroup->pNext){ - pGroupTerm = Tcl_NewObj(); - - if( pGroup->zName ){ - pGroup->zName[pGroup->nName] = '\0'; - Tcl_ListObjAppendElement(interp, pGroupTerm, - Tcl_NewStringObj(pGroup->zName, -1)); - }else{ - Tcl_ListObjAppendElement(interp, pGroupTerm, Tcl_NewObj()); - } - Tcl_ListObjAppendElement(interp, pGroupTerm, - Tcl_NewIntObj(pGroup->nName)); - Tcl_ListObjAppendElement(interp, pGroupTerm, - Tcl_NewIntObj(pGroup->flags)); - - /* count number of chunks with open handles */ - for(i=0; inReal; i++){ - if( pGroup->aReal[i].p!=0 ) nChunks++; - } - Tcl_ListObjAppendElement(interp, pGroupTerm, - Tcl_NewIntObj(nChunks)); - - Tcl_ListObjAppendElement(interp, pGroupTerm, - Tcl_NewIntObj(pGroup->szChunk)); - Tcl_ListObjAppendElement(interp, pGroupTerm, - Tcl_NewIntObj(pGroup->nReal)); - - Tcl_ListObjAppendElement(interp, pResult, pGroupTerm); - } - multiplexLeave(); - Tcl_SetObjResult(interp, pResult); - return TCL_OK; -} - /* ** Tclcmd: test_multiplex_control HANDLE DBNAME SUB-COMMAND ?INT-VALUE? */ @@ -1428,7 +1307,6 @@ int Sqlitemultiplex_Init(Tcl_Interp *interp){ } aCmd[] = { { "sqlite3_multiplex_initialize", test_multiplex_initialize }, { "sqlite3_multiplex_shutdown", test_multiplex_shutdown }, - { "sqlite3_multiplex_dump", test_multiplex_dump }, { "sqlite3_multiplex_control", test_multiplex_control }, }; int i; diff --git a/sqlite/src/tokenize.c b/sqlite/src/tokenize.c index 9230da2a..c400dcd5 100644 --- a/sqlite/src/tokenize.c +++ b/sqlite/src/tokenize.c @@ -81,13 +81,13 @@ static const unsigned char aiClass[] = { /* 1x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, /* 2x */ 27, 27, 27, 27, 27, 7, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, /* 3x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -/* 4x */ 7, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 12, 17, 20, 10, +/* 4x */ 7, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 12, 17, 20, 10, /* 5x */ 24, 27, 27, 27, 27, 27, 27, 27, 27, 27, 15, 4, 21, 18, 19, 27, -/* 6x */ 11, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 23, 22, 1, 13, 7, +/* 6x */ 11, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 23, 22, 1, 13, 6, /* 7x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 8, 5, 5, 5, 8, 14, 8, /* 8x */ 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, 27, /* 9x */ 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, 27, -/* 9x */ 25, 1, 1, 1, 1, 1, 1, 0, 1, 1, 27, 27, 27, 27, 27, 27, +/* Ax */ 27, 25, 1, 1, 1, 1, 1, 0, 1, 1, 27, 27, 27, 27, 27, 27, /* Bx */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 9, 27, 27, 27, 27, 27, /* Cx */ 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, 27, /* Dx */ 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, 27, @@ -500,8 +500,7 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ assert( pParse->pNewTable==0 ); assert( pParse->pNewTrigger==0 ); assert( pParse->nVar==0 ); - assert( pParse->nzVar==0 ); - assert( pParse->azVar==0 ); + assert( pParse->pVList==0 ); while( 1 ){ assert( i>=0 ); if( zSql[i]!=0 ){ @@ -588,8 +587,7 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ if( pParse->pWithToFree ) sqlite3WithDelete(db, pParse->pWithToFree); sqlite3DeleteTrigger(db, pParse->pNewTrigger); - for(i=pParse->nzVar-1; i>=0; i--) sqlite3DbFree(db, pParse->azVar[i]); - sqlite3DbFree(db, pParse->azVar); + sqlite3DbFree(db, pParse->pVList); while( pParse->pAinc ){ AutoincInfo *p = pParse->pAinc; pParse->pAinc = p->pNext; diff --git a/sqlite/src/treeview.c b/sqlite/src/treeview.c index d3671f2c..0ea512b5 100644 --- a/sqlite/src/treeview.c +++ b/sqlite/src/treeview.c @@ -65,6 +65,7 @@ static void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ va_start(ap, zFormat); sqlite3VXPrintf(&acc, zFormat, ap); va_end(ap); + assert( acc.nChar>0 ); if( zBuf[acc.nChar-1]!='\n' ) sqlite3StrAccumAppend(&acc, "\n", 1); sqlite3StrAccumFinish(&acc); fprintf(stdout,"%s", zBuf); diff --git a/sqlite/src/trigger.c b/sqlite/src/trigger.c index 7eb14bcf..bdf96408 100644 --- a/sqlite/src/trigger.c +++ b/sqlite/src/trigger.c @@ -308,7 +308,7 @@ void sqlite3FinishTrigger( z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n); sqlite3NestedParse(pParse, "INSERT INTO %Q.%s VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')", - db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), zName, + db->aDb[iDb].zDbSName, MASTER_NAME, zName, pTrig->table, z); sqlite3DbFree(db, z); sqlite3ChangeCookie(pParse, iDb); @@ -559,7 +559,7 @@ void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ if( (v = sqlite3GetVdbe(pParse))!=0 ){ sqlite3NestedParse(pParse, "DELETE FROM %Q.%s WHERE name=%Q AND type='trigger'", - db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), pTrigger->zName + db->aDb[iDb].zDbSName, MASTER_NAME, pTrigger->zName ); sqlite3ChangeCookie(pParse, iDb); sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0); diff --git a/sqlite/src/update.c b/sqlite/src/update.c index 15e58e34..5f89e31d 100644 --- a/sqlite/src/update.c +++ b/sqlite/src/update.c @@ -69,7 +69,7 @@ void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ sqlite3ValueFromExpr(sqlite3VdbeDb(v), pCol->pDflt, enc, pCol->affinity, &pValue); if( pValue ){ - sqlite3VdbeChangeP4(v, -1, (const char *)pValue, P4_MEM); + sqlite3VdbeAppendP4(v, pValue, P4_MEM); } #ifndef SQLITE_OMIT_FLOATING_POINT if( pTab->aCol[i].affinity==SQLITE_AFF_REAL ){ @@ -282,12 +282,14 @@ void sqlite3Update( int reg; if( chngKey || hasFK || pIdx->pPartIdxWhere || pIdx==pPk ){ reg = ++pParse->nMem; + pParse->nMem += pIdx->nColumn; }else{ reg = 0; for(i=0; inKeyCol; i++){ i16 iIdxCol = pIdx->aiColumn[i]; if( iIdxCol<0 || aXRef[iIdxCol]>=0 ){ reg = ++pParse->nMem; + pParse->nMem += pIdx->nColumn; break; } } @@ -398,7 +400,7 @@ void sqlite3Update( }else{ sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, regKey, sqlite3IndexAffinityStr(db, pPk), nPk); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iEph, regKey); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iEph, regKey, iPk, nPk); } sqlite3WhereEnd(pWInfo); } @@ -450,7 +452,7 @@ void sqlite3Update( }else if( pPk ){ labelContinue = sqlite3VdbeMakeLabel(v); sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v); - addrTop = sqlite3VdbeAddOp2(v, OP_RowKey, iEph, regKey); + addrTop = sqlite3VdbeAddOp2(v, OP_RowData, iEph, regKey); sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0); VdbeCoverage(v); }else{ @@ -608,7 +610,7 @@ void sqlite3Update( regNewRowid ); if( !pParse->nested ){ - sqlite3VdbeChangeP4(v, -1, (char*)pTab, P4_TABLE); + sqlite3VdbeAppendP4(v, pTab, P4_TABLE); } #else if( hasFK || chngKey || pPk!=0 ){ @@ -657,15 +659,6 @@ void sqlite3Update( } sqlite3VdbeResolveLabel(v, labelBreak); - /* Close all tables */ - for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ - assert( aRegIdx ); - if( aToOpen[i+1] ){ - sqlite3VdbeAddOp2(v, OP_Close, iIdxCur+i, 0); - } - } - if( iDataCur=3 ? (n+8)<<(x-3) : (n+8)>>(3-x); } #endif /* defined SCANSTAT or STAT4 or ESTIMATED_ROWS */ + +/* +** Add a new name/number pair to a VList. This might require that the +** VList object be reallocated, so return the new VList. If an OOM +** error occurs, the original VList returned and the +** db->mallocFailed flag is set. +** +** A VList is really just an array of integers. To destroy a VList, +** simply pass it to sqlite3DbFree(). +** +** The first integer is the number of integers allocated for the whole +** VList. The second integer is the number of integers actually used. +** Each name/number pair is encoded by subsequent groups of 3 or more +** integers. +** +** Each name/number pair starts with two integers which are the numeric +** value for the pair and the size of the name/number pair, respectively. +** The text name overlays one or more following integers. The text name +** is always zero-terminated. +** +** Conceptually: +** +** struct VList { +** int nAlloc; // Number of allocated slots +** int nUsed; // Number of used slots +** struct VListEntry { +** int iValue; // Value for this entry +** int nSlot; // Slots used by this entry +** // ... variable name goes here +** } a[0]; +** } +** +** During code generation, pointers to the variable names within the +** VList are taken. When that happens, nAlloc is set to zero as an +** indication that the VList may never again be enlarged, since the +** accompanying realloc() would invalidate the pointers. +*/ +VList *sqlite3VListAdd( + sqlite3 *db, /* The database connection used for malloc() */ + VList *pIn, /* The input VList. Might be NULL */ + const char *zName, /* Name of symbol to add */ + int nName, /* Bytes of text in zName */ + int iVal /* Value to associate with zName */ +){ + int nInt; /* number of sizeof(int) objects needed for zName */ + char *z; /* Pointer to where zName will be stored */ + int i; /* Index in pIn[] where zName is stored */ + + nInt = nName/4 + 3; + assert( pIn==0 || pIn[0]>=3 ); /* Verify ok to add new elements */ + if( pIn==0 || pIn[1]+nInt > pIn[0] ){ + /* Enlarge the allocation */ + int nAlloc = (pIn ? pIn[0]*2 : 10) + nInt; + VList *pOut = sqlite3DbRealloc(db, pIn, nAlloc*sizeof(int)); + if( pOut==0 ) return pIn; + if( pIn==0 ) pOut[1] = 2; + pIn = pOut; + pIn[0] = nAlloc; + } + i = pIn[1]; + pIn[i] = iVal; + pIn[i+1] = nInt; + z = (char*)&pIn[i+2]; + pIn[1] = i+nInt; + assert( pIn[1]<=pIn[0] ); + memcpy(z, zName, nName); + z[nName] = 0; + return pIn; +} + +/* +** Return a pointer to the name of a variable in the given VList that +** has the value iVal. Or return a NULL if there is no such variable in +** the list +*/ +const char *sqlite3VListNumToName(VList *pIn, int iVal){ + int i, mx; + if( pIn==0 ) return 0; + mx = pIn[1]; + i = 2; + do{ + if( pIn[i]==iVal ) return (char*)&pIn[i+2]; + i += pIn[i+1]; + }while( iapCsr[iCur] = pCx = (VdbeCursor*)pMem->z; - memset(pCx, 0, sizeof(VdbeCursor)); + memset(pCx, 0, offsetof(VdbeCursor,pAltCursor)); pCx->eCurType = eCurType; pCx->iDb = iDb; pCx->nField = nField; @@ -977,7 +977,7 @@ case OP_Halt: { p->rc = pOp->p1; p->errorAction = (u8)pOp->p2; p->pc = pcx; - assert( pOp->p5>=0 && pOp->p5<=4 ); + assert( pOp->p5<=4 ); if( p->rc ){ if( pOp->p5 ){ static const char * const azType[] = { "NOT NULL", "UNIQUE", "CHECK", @@ -1190,7 +1190,7 @@ case OP_Variable: { /* out2 */ Mem *pVar; /* Value being transferred */ assert( pOp->p1>0 && pOp->p1<=p->nVar ); - assert( pOp->p4.z==0 || pOp->p4.z==p->azVar[pOp->p1-1] ); + assert( pOp->p4.z==0 || pOp->p4.z==sqlite3VListNumToName(p->pVList,pOp->p1) ); pVar = &p->aVar[pOp->p1 - 1]; if( sqlite3VdbeMemTooBig(pVar) ){ goto too_big; @@ -2003,8 +2003,7 @@ 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 ); - if( (flags1&MEM_Null)!=0 - && (flags3&MEM_Null)!=0 + if( (flags1&flags3&MEM_Null)!=0 && (flags3&MEM_Cleared)==0 ){ res = 0; /* Operands are equal */ @@ -2471,7 +2470,6 @@ case OP_Column: { assert( pC->eCurType!=CURTYPE_VTAB ); assert( pC->eCurType!=CURTYPE_PSEUDO || pC->nullRow ); assert( pC->eCurType!=CURTYPE_SORTER ); - pCrsr = pC->uc.pCursor; if( pC->cacheStatus!=p->cacheCtr ){ /*OPTIMIZATION-IF-FALSE*/ if( pC->nullRow ){ @@ -2487,6 +2485,7 @@ case OP_Column: { goto op_column_out; } }else{ + pCrsr = pC->uc.pCursor; assert( pC->eCurType==CURTYPE_BTREE ); assert( pCrsr ); assert( sqlite3BtreeCursorIsValid(pCrsr) ); @@ -2550,7 +2549,7 @@ case OP_Column: { /* Make sure zData points to enough of the record to cover the header. */ if( pC->aRow==0 ){ memset(&sMem, 0, sizeof(sMem)); - rc = sqlite3VdbeMemFromBtree(pCrsr, 0, aOffset[0], !pC->isTable, &sMem); + rc = sqlite3VdbeMemFromBtree(pC->uc.pCursor, 0, aOffset[0], &sMem); if( rc!=SQLITE_OK ) goto abort_due_to_error; zData = (u8*)sMem.z; }else{ @@ -2663,8 +2662,7 @@ case OP_Column: { static u8 aZero[8]; /* This is the bogus content */ sqlite3VdbeSerialGet(aZero, t, pDest); }else{ - rc = sqlite3VdbeMemFromBtree(pCrsr, aOffset[p2], len, !pC->isTable, - pDest); + rc = sqlite3VdbeMemFromBtree(pC->uc.pCursor, aOffset[p2], len, pDest); if( rc!=SQLITE_OK ) goto abort_due_to_error; sqlite3VdbeSerialGet((const u8*)pDest->z, t, pDest); pDest->flags &= ~MEM_Ephem; @@ -3529,10 +3527,10 @@ case OP_OpenEphemeral: { if( pCx==0 ) goto no_mem; pCx->nullRow = 1; pCx->isEphemeral = 1; - rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBt, + rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx, BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags); if( rc==SQLITE_OK ){ - rc = sqlite3BtreeBeginTrans(pCx->pBt, 1); + rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1); } if( rc==SQLITE_OK ){ /* If a transient index is required, create it by calling @@ -3540,21 +3538,20 @@ case OP_OpenEphemeral: { ** opening it. If a transient table is required, just use the ** automatically created table with root-page 1 (an BLOB_INTKEY table). */ - if( (pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ + if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ int pgno; assert( pOp->p4type==P4_KEYINFO ); - rc = sqlite3BtreeCreateTable(pCx->pBt, &pgno, BTREE_BLOBKEY | pOp->p5); + 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) ); - pCx->pKeyInfo = pKeyInfo; - rc = sqlite3BtreeCursor(pCx->pBt, pgno, BTREE_WRCSR, + rc = sqlite3BtreeCursor(pCx->pBtx, pgno, BTREE_WRCSR, pKeyInfo, pCx->uc.pCursor); } pCx->isTable = 0; }else{ - rc = sqlite3BtreeCursor(pCx->pBt, MASTER_ROOT, BTREE_WRCSR, + rc = sqlite3BtreeCursor(pCx->pBtx, MASTER_ROOT, BTREE_WRCSR, 0, pCx->uc.pCursor); pCx->isTable = 1; } @@ -3786,7 +3783,8 @@ case OP_SeekGT: { /* jump, in3 */ if( pC->isTable ){ /* The BTREE_SEEK_EQ flag is only set on index cursors */ - assert( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ)==0 ); + assert( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ)==0 + || CORRUPT_DB ); /* The input value in P3 might be of any type: integer, real, string, ** blob, or NULL. But it needs to be an integer before we can do @@ -3988,10 +3986,9 @@ case OP_Found: { /* jump, in3 */ int ii; VdbeCursor *pC; int res; - char *pFree; + UnpackedRecord *pFree; UnpackedRecord *pIdxKey; UnpackedRecord r; - char aTempRec[ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*4 + 7]; #ifdef SQLITE_TEST if( pOp->opcode!=OP_NoConflict ) sqlite3_found_count++; @@ -4008,7 +4005,6 @@ case OP_Found: { /* jump, in3 */ assert( pC->eCurType==CURTYPE_BTREE ); assert( pC->uc.pCursor!=0 ); assert( pC->isTable==0 ); - pFree = 0; if( pOp->p4.i>0 ){ r.pKeyInfo = pC->pKeyInfo; r.nField = (u16)pOp->p4.i; @@ -4021,10 +4017,9 @@ case OP_Found: { /* jump, in3 */ } #endif pIdxKey = &r; + pFree = 0; }else{ - pIdxKey = sqlite3VdbeAllocUnpackedRecord( - pC->pKeyInfo, aTempRec, sizeof(aTempRec), &pFree - ); + pFree = pIdxKey = sqlite3VdbeAllocUnpackedRecord(pC->pKeyInfo); if( pIdxKey==0 ) goto no_mem; assert( pIn3->flags & MEM_Blob ); (void)ExpandBlob(pIn3); @@ -4044,7 +4039,7 @@ case OP_Found: { /* jump, in3 */ } } rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, pIdxKey, 0, 0, &res); - sqlite3DbFree(db, pFree); + if( pFree ) sqlite3DbFree(db, pFree); if( rc!=SQLITE_OK ){ goto abort_due_to_error; } @@ -4271,7 +4266,7 @@ case OP_NewRowid: { /* out2 */ sqlite3VdbeMemIntegerify(pMem); assert( (pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */ if( pMem->u.i==MAX_ROWID || pC->useRandomRowid ){ - rc = SQLITE_FULL; /* IMP: R-12275-61338 */ + rc = SQLITE_FULL; /* IMP: R-17817-00630 */ goto abort_due_to_error; } if( vu.i+1 ){ @@ -4323,15 +4318,10 @@ case OP_NewRowid: { /* out2 */ ** then rowid is stored for subsequent return by the ** sqlite3_last_insert_rowid() function (otherwise it is unmodified). ** -** If the OPFLAG_USESEEKRESULT flag of P5 is set and if the result of -** the last seek operation (OP_NotExists or OP_SeekRowid) was a success, -** then this -** operation will not attempt to find the appropriate row before doing -** the insert but will instead overwrite the row that the cursor is -** currently pointing to. Presumably, the prior OP_NotExists or -** OP_SeekRowid opcode -** has already positioned the cursor correctly. This is an optimization -** that boosts performance by avoiding redundant seeks. +** If the OPFLAG_USESEEKRESULT flag of P5 is set, the implementation might +** run faster by avoiding an unnecessary seek on cursor P1. However, +** the OPFLAG_USESEEKRESULT flag must only be set if there have been no prior +** seeks on the cursor or if the most recent seek used a key equal to P3. ** ** If the OPFLAG_ISUPDATE flag is set, then this opcode is part of an ** UPDATE operation. Otherwise (if the flag is clear) then this opcode @@ -4555,6 +4545,7 @@ case OP_Delete: { rc = sqlite3BtreeDelete(pC->uc.pCursor, pOp->p5); pC->cacheStatus = CACHE_STALE; + pC->seekResult = 0; if( rc ) goto abort_due_to_error; /* Invoke the update-hook if required. */ @@ -4644,26 +4635,18 @@ case OP_SorterData: { /* Opcode: RowData P1 P2 * * * ** Synopsis: r[P2]=data ** -** Write into register P2 the complete row data for cursor P1. +** Write into register P2 the complete row content for the row at +** which cursor P1 is currently pointing. ** There is no interpretation of the data. ** It is just copied onto the P2 register exactly as ** it is found in the database file. ** -** If the P1 cursor must be pointing to a valid row (not a NULL row) -** of a real table, not a pseudo-table. -*/ -/* Opcode: RowKey P1 P2 * * * -** Synopsis: r[P2]=key -** -** Write into register P2 the complete row key for cursor P1. -** There is no interpretation of the data. -** The key is copied onto the P2 register exactly as -** it is found in the database file. +** If cursor P1 is an index, then the content is the key of the row. +** If cursor P2 is a table, then the content extracted is the data. ** ** If the P1 cursor must be pointing to a valid row (not a NULL row) ** of a real table, not a pseudo-table. */ -case OP_RowKey: case OP_RowData: { VdbeCursor *pC; BtCursor *pCrsr; @@ -4672,19 +4655,16 @@ case OP_RowData: { pOut = &aMem[pOp->p2]; memAboutToChange(p, pOut); - /* Note that RowKey and RowData are really exactly the same instruction */ assert( pOp->p1>=0 && pOp->p1nCursor ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); assert( pC->eCurType==CURTYPE_BTREE ); assert( isSorter(pC)==0 ); - assert( pC->isTable || pOp->opcode!=OP_RowData ); - assert( pC->isTable==0 || pOp->opcode==OP_RowData ); assert( pC->nullRow==0 ); assert( pC->uc.pCursor!=0 ); pCrsr = pC->uc.pCursor; - /* The OP_RowKey and OP_RowData opcodes always follow OP_NotExists or + /* The OP_RowData opcodes always follow OP_NotExists or ** OP_SeekRowid or OP_Rewind/Op_Next with no intervening instructions ** that might invalidate the cursor. ** If this where not the case, on of the following assert()s @@ -4709,11 +4689,7 @@ case OP_RowData: { } pOut->n = n; MemSetTypeFlag(pOut, MEM_Blob); - if( pC->isTable==0 ){ - rc = sqlite3BtreeKey(pCrsr, 0, n, pOut->z); - }else{ - rc = sqlite3BtreeData(pCrsr, 0, n, pOut->z); - } + rc = sqlite3BtreePayload(pCrsr, 0, n, pOut->z); if( rc ) goto abort_due_to_error; pOut->enc = SQLITE_UTF8; /* In case the blob is ever cast to text */ UPDATE_MAX_BLOBSIZE(pOut); @@ -4804,6 +4780,13 @@ case OP_NullRow: { ** This opcode leaves the cursor configured to move in reverse order, ** from the end toward the beginning. In other words, the cursor is ** configured to use Prev, not Next. +** +** If P3 is -1, then the cursor is positioned at the end of the btree +** for the purpose of appending a new entry onto the btree. In that +** case P2 must be 0. It is assumed that the cursor is used only for +** appending and so if the cursor is valid, then the cursor must already +** be pointing at the end of the btree and so no changes are made to +** the cursor. */ case OP_Last: { /* jump */ VdbeCursor *pC; @@ -4817,23 +4800,36 @@ case OP_Last: { /* jump */ pCrsr = pC->uc.pCursor; res = 0; assert( pCrsr!=0 ); - rc = sqlite3BtreeLast(pCrsr, &res); - pC->nullRow = (u8)res; - pC->deferredMoveto = 0; - pC->cacheStatus = CACHE_STALE; pC->seekResult = pOp->p3; #ifdef SQLITE_DEBUG pC->seekOp = OP_Last; #endif - if( rc ) goto abort_due_to_error; - if( pOp->p2>0 ){ - VdbeBranchTaken(res!=0,2); - if( res ) goto jump_to_p2; + if( pOp->p3==0 || !sqlite3BtreeCursorIsValidNN(pCrsr) ){ + rc = sqlite3BtreeLast(pCrsr, &res); + pC->nullRow = (u8)res; + pC->deferredMoveto = 0; + pC->cacheStatus = CACHE_STALE; + if( rc ) goto abort_due_to_error; + if( pOp->p2>0 ){ + VdbeBranchTaken(res!=0,2); + if( res ) goto jump_to_p2; + } + }else{ + assert( pOp->p2==0 ); } break; } +/* Opcode: SorterSort P1 P2 * * * +** +** After all records have been inserted into the Sorter object +** identified by P1, invoke this opcode to actually do the sorting. +** Jump to P2 if there are no records to be sorted. +** +** This opcode is an alias for OP_Sort and OP_Rewind that is used +** for Sorter objects. +*/ /* Opcode: Sort P1 P2 * * * ** ** This opcode does exactly the same thing as OP_Rewind except that @@ -4961,6 +4957,13 @@ case OP_Rewind: { /* jump */ ** This opcode works just like Prev except that if cursor P1 is not ** open it behaves a no-op. */ +/* Opcode: SorterNext P1 P2 * * P5 +** +** This opcode works just like OP_Next except that P1 must be a +** sorter object for which the OP_SorterSort opcode has been +** invoked. This opcode advances the cursor to the next sorted +** record, or jumps to P2 if there are no more sorted records. +*/ case OP_SorterNext: { /* jump */ VdbeCursor *pC; int res; @@ -5017,27 +5020,41 @@ case OP_Next: /* jump */ goto check_for_interrupt; } -/* Opcode: IdxInsert P1 P2 P3 * P5 +/* Opcode: IdxInsert P1 P2 P3 P4 P5 ** Synopsis: key=r[P2] ** ** Register P2 holds an SQL index key made using the ** MakeRecord instructions. This opcode writes that key ** into the index P1. Data for the entry is nil. ** -** P3 is a flag that provides a hint to the b-tree layer that this -** insert is likely to be an append. +** If P4 is not zero, then it is the number of values in the unpacked +** key of reg(P2). In that case, P3 is the index of the first register +** for the unpacked key. The availability of the unpacked key can sometimes +** be an optimization. +** +** If P5 has the OPFLAG_APPEND bit set, that is a hint to the b-tree layer +** that this insert is likely to be an append. ** ** If P5 has the OPFLAG_NCHANGE bit set, then the change counter is ** incremented by this instruction. If the OPFLAG_NCHANGE bit is clear, ** then the change counter is unchanged. ** -** If P5 has the OPFLAG_USESEEKRESULT bit set, then the cursor must have -** just done a seek to the spot where the new entry is to be inserted. -** This flag avoids doing an extra seek. +** If the OPFLAG_USESEEKRESULT flag of P5 is set, the implementation might +** run faster by avoiding an unnecessary seek on cursor P1. However, +** the OPFLAG_USESEEKRESULT flag must only be set if there have been no prior +** seeks on the cursor or if the most recent seek used a key equivalent +** to P2. ** ** This instruction only works for indices. The equivalent instruction ** for tables is OP_Insert. */ +/* Opcode: SorterInsert P1 P2 * * * +** Synopsis: key=r[P2] +** +** Register P2 holds an SQL index key made using the +** MakeRecord instructions. This opcode writes that key +** into the sorter P1. Data for the entry is nil. +*/ case OP_SorterInsert: /* in2 */ case OP_IdxInsert: { /* in2 */ VdbeCursor *pC; @@ -5059,7 +5076,10 @@ case OP_IdxInsert: { /* in2 */ }else{ x.nKey = pIn2->n; x.pKey = pIn2->z; - rc = sqlite3BtreeInsert(pC->uc.pCursor, &x, pOp->p3, + x.aMem = aMem + pOp->p3; + x.nMem = (u16)pOp->p4.i; + rc = sqlite3BtreeInsert(pC->uc.pCursor, &x, + (pOp->p5 & OPFLAG_APPEND)!=0, ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0) ); assert( pC->deferredMoveto==0 ); @@ -5103,6 +5123,7 @@ case OP_IdxDelete: { } assert( pC->deferredMoveto==0 ); pC->cacheStatus = CACHE_STALE; + pC->seekResult = 0; break; } @@ -5472,7 +5493,7 @@ case OP_ParseSchema: { assert( iDb>=0 && iDbnDb ); assert( DbHasProperty(db, iDb, DB_SchemaLoaded) ); /* Used to be a conditional */ { - zMaster = SCHEMA_TABLE(iDb); + zMaster = MASTER_NAME; initData.db = db; initData.iDb = pOp->p1; initData.pzErrMsg = &p->zErrMsg; @@ -5983,29 +6004,42 @@ case OP_IfPos: { /* jump, in1 */ ** Otherwise, r[P2] is set to the sum of r[P1] and r[P3]. */ case OP_OffsetLimit: { /* in1, out2, in3 */ + i64 x; pIn1 = &aMem[pOp->p1]; pIn3 = &aMem[pOp->p3]; pOut = out2Prerelease(p, pOp); assert( pIn1->flags & MEM_Int ); assert( pIn3->flags & MEM_Int ); - pOut->u.i = pIn1->u.i<=0 ? -1 : pIn1->u.i+(pIn3->u.i>0?pIn3->u.i:0); + x = pIn1->u.i; + if( x<=0 || sqlite3AddInt64(&x, pIn3->u.i>0?pIn3->u.i:0) ){ + /* If the LIMIT is less than or equal to zero, loop forever. This + ** is documented. But also, if the LIMIT+OFFSET exceeds 2^63 then + ** also loop forever. This is undocumented. In fact, one could argue + ** that the loop should terminate. But assuming 1 billion iterations + ** per second (far exceeding the capabilities of any current hardware) + ** it would take nearly 300 years to actually reach the limit. So + ** looping forever is a reasonable approximation. */ + pOut->u.i = -1; + }else{ + pOut->u.i = x; + } break; } -/* Opcode: IfNotZero P1 P2 P3 * * -** Synopsis: if r[P1]!=0 then r[P1]-=P3, goto P2 +/* Opcode: IfNotZero P1 P2 * * * +** Synopsis: if r[P1]!=0 then r[P1]--, goto P2 ** ** Register P1 must contain an integer. If the content of register P1 is -** initially nonzero, then subtract P3 from the value in register P1 and -** jump to P2. If register P1 is initially zero, leave it unchanged -** and fall through. +** initially greater than zero, then decrement the value in register P1. +** If it is non-zero (negative or positive) and then also jump to P2. +** If register P1 is initially zero, leave it unchanged and fall through. */ case OP_IfNotZero: { /* jump, in1 */ pIn1 = &aMem[pOp->p1]; assert( pIn1->flags&MEM_Int ); VdbeBranchTaken(pIn1->u.i<0, 2); if( pIn1->u.i ){ - pIn1->u.i -= pOp->p3; + if( pIn1->u.i>0 ) pIn1->u.i--; goto jump_to_p2; } break; @@ -6014,13 +6048,13 @@ case OP_IfNotZero: { /* jump, in1 */ /* Opcode: DecrJumpZero P1 P2 * * * ** Synopsis: if (--r[P1])==0 goto P2 ** -** Register P1 must hold an integer. Decrement the value in register P1 -** then jump to P2 if the new value is exactly zero. +** Register P1 must hold an integer. Decrement the value in P1 +** and jump to P2 if the new value is exactly zero. */ case OP_DecrJumpZero: { /* jump, in1 */ pIn1 = &aMem[pOp->p1]; assert( pIn1->flags&MEM_Int ); - pIn1->u.i--; + if( pIn1->u.i>SMALLEST_INT64 ) pIn1->u.i--; VdbeBranchTaken(pIn1->u.i==0, 2); if( pIn1->u.i==0 ) goto jump_to_p2; break; @@ -6266,7 +6300,7 @@ case OP_JournalMode: { /* out2 */ ** file. An EXCLUSIVE lock may still be held on the database file ** after a successful return. */ - rc = sqlite3PagerCloseWal(pPager); + rc = sqlite3PagerCloseWal(pPager, db); if( rc==SQLITE_OK ){ sqlite3PagerSetJournalMode(pPager, eNew); } diff --git a/sqlite/src/vdbe.h b/sqlite/src/vdbe.h index ecb2b0e3..925ba08e 100644 --- a/sqlite/src/vdbe.h +++ b/sqlite/src/vdbe.h @@ -110,22 +110,21 @@ typedef struct VdbeOpList VdbeOpList; #define P4_NOTUSED 0 /* The P4 parameter is not used */ #define P4_DYNAMIC (-1) /* Pointer to a string obtained from sqliteMalloc() */ #define P4_STATIC (-2) /* Pointer to a static string */ -#define P4_COLLSEQ (-4) /* P4 is a pointer to a CollSeq structure */ -#define P4_FUNCDEF (-5) /* P4 is a pointer to a FuncDef structure */ -#define P4_KEYINFO (-6) /* P4 is a pointer to a KeyInfo structure */ -#define P4_EXPR (-7) /* P4 is a pointer to an Expr tree */ -#define P4_MEM (-8) /* P4 is a pointer to a Mem* structure */ +#define P4_COLLSEQ (-3) /* P4 is a pointer to a CollSeq structure */ +#define P4_FUNCDEF (-4) /* P4 is a pointer to a FuncDef structure */ +#define P4_KEYINFO (-5) /* P4 is a pointer to a KeyInfo structure */ +#define P4_EXPR (-6) /* P4 is a pointer to an Expr tree */ +#define P4_MEM (-7) /* P4 is a pointer to a Mem* structure */ #define P4_TRANSIENT 0 /* P4 is a pointer to a transient string */ -#define P4_VTAB (-10) /* P4 is a pointer to an sqlite3_vtab structure */ -#define P4_MPRINTF (-11) /* P4 is a string obtained from sqlite3_mprintf() */ -#define P4_REAL (-12) /* P4 is a 64-bit floating point value */ -#define P4_INT64 (-13) /* P4 is a 64-bit signed integer */ -#define P4_INT32 (-14) /* P4 is a 32-bit signed integer */ -#define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */ -#define P4_SUBPROGRAM (-18) /* P4 is a pointer to a SubProgram structure */ -#define P4_ADVANCE (-19) /* P4 is a pointer to BtreeNext() or BtreePrev() */ -#define P4_TABLE (-20) /* P4 is a pointer to a Table structure */ -#define P4_FUNCCTX (-21) /* P4 is a pointer to an sqlite3_context object */ +#define P4_VTAB (-8) /* P4 is a pointer to an sqlite3_vtab structure */ +#define P4_REAL (-9) /* P4 is a 64-bit floating point value */ +#define P4_INT64 (-10) /* P4 is a 64-bit signed integer */ +#define P4_INT32 (-11) /* P4 is a 32-bit signed integer */ +#define P4_INTARRAY (-12) /* P4 is a vector of 32-bit integers */ +#define P4_SUBPROGRAM (-13) /* P4 is a pointer to a SubProgram structure */ +#define P4_ADVANCE (-14) /* P4 is a pointer to BtreeNext() or BtreePrev() */ +#define P4_TABLE (-15) /* P4 is a pointer to a Table structure */ +#define P4_FUNCCTX (-16) /* P4 is a pointer to an sqlite3_context object */ /* Error message codes for OP_Halt */ #define P5_ConstraintNotNull 1 @@ -198,6 +197,7 @@ void sqlite3VdbeJumpHere(Vdbe*, int addr); int sqlite3VdbeChangeToNoop(Vdbe*, int addr); int sqlite3VdbeDeletePriorOpcode(Vdbe*, u8 op); void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); +void sqlite3VdbeAppendP4(Vdbe*, void *pP4, int p4type); void sqlite3VdbeSetP4KeyInfo(Parse*, Index*); void sqlite3VdbeUsesBtree(Vdbe*, int); VdbeOp *sqlite3VdbeGetOp(Vdbe*, int); @@ -233,7 +233,7 @@ int sqlite3MemCompare(const Mem*, const Mem*, const CollSeq*); void sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,UnpackedRecord*); int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*); int sqlite3VdbeRecordCompareWithSkip(int, const void *, UnpackedRecord *, int); -UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(KeyInfo *, char *, int, char **); +UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(KeyInfo*); typedef int (*RecordCompare)(int,const void*,UnpackedRecord*); RecordCompare sqlite3VdbeFindCompare(UnpackedRecord*); diff --git a/sqlite/src/vdbeInt.h b/sqlite/src/vdbeInt.h index 86445cef..3e6bb068 100644 --- a/sqlite/src/vdbeInt.h +++ b/sqlite/src/vdbeInt.h @@ -73,57 +73,60 @@ typedef struct AuxData AuxData; */ typedef struct VdbeCursor VdbeCursor; struct VdbeCursor { - u8 eCurType; /* One of the CURTYPE_* values above */ - i8 iDb; /* Index of cursor database in db->aDb[] (or -1) */ - u8 nullRow; /* True if pointing to a row with no data */ - u8 deferredMoveto; /* A call to sqlite3BtreeMoveto() is needed */ - u8 isTable; /* True for rowid tables. False for indexes */ + u8 eCurType; /* One of the CURTYPE_* values above */ + i8 iDb; /* Index of cursor database in db->aDb[] (or -1) */ + u8 nullRow; /* True if pointing to a row with no data */ + u8 deferredMoveto; /* A call to sqlite3BtreeMoveto() is needed */ + u8 isTable; /* True for rowid tables. False for indexes */ #ifdef SQLITE_DEBUG - u8 seekOp; /* Most recent seek operation on this cursor */ - u8 wrFlag; /* The wrFlag argument to sqlite3BtreeCursor() */ + u8 seekOp; /* Most recent seek operation on this cursor */ + u8 wrFlag; /* The wrFlag argument to sqlite3BtreeCursor() */ #endif - Bool isEphemeral:1; /* True for an ephemeral table */ - Bool useRandomRowid:1;/* Generate new record numbers semi-randomly */ - Bool isOrdered:1; /* True if the table is not BTREE_UNORDERED */ - Pgno pgnoRoot; /* Root page of the open btree cursor */ - i16 nField; /* Number of fields in the header */ - u16 nHdrParsed; /* Number of header fields parsed so far */ + Bool isEphemeral:1; /* True for an ephemeral table */ + Bool useRandomRowid:1; /* Generate new record numbers semi-randomly */ + Bool isOrdered:1; /* True if the table is not BTREE_UNORDERED */ + Btree *pBtx; /* Separate file holding temporary table */ + i64 seqCount; /* Sequence counter */ + int *aAltMap; /* Mapping from table to index column numbers */ + + /* Cached OP_Column parse information is only valid if cacheStatus matches + ** Vdbe.cacheCtr. Vdbe.cacheCtr will never take on the value of + ** CACHE_STALE (0) and so setting cacheStatus=CACHE_STALE guarantees that + ** the cache is out of date. */ + u32 cacheStatus; /* Cache is valid if this matches Vdbe.cacheCtr */ + int seekResult; /* Result of previous sqlite3BtreeMoveto() or 0 + ** if there have been no prior seeks on the cursor. */ + /* NB: seekResult does not distinguish between "no seeks have ever occurred + ** on this cursor" and "the most recent seek was an exact match". */ + + /* When a new VdbeCursor is allocated, only the fields above are zeroed. + ** The fields that follow are uninitialized, and must be individually + ** initialized prior to first use. */ + VdbeCursor *pAltCursor; /* Associated index cursor from which to read */ union { BtCursor *pCursor; /* CURTYPE_BTREE. Btree cursor */ sqlite3_vtab_cursor *pVCur; /* CURTYPE_VTAB. Vtab cursor */ int pseudoTableReg; /* CURTYPE_PSEUDO. Reg holding content. */ VdbeSorter *pSorter; /* CURTYPE_SORTER. Sorter object */ } uc; - Btree *pBt; /* Separate file holding temporary table */ - KeyInfo *pKeyInfo; /* Info about index keys needed by index cursors */ - int seekResult; /* Result of previous sqlite3BtreeMoveto() */ - i64 seqCount; /* Sequence counter */ - i64 movetoTarget; /* Argument to the deferred sqlite3BtreeMoveto() */ - VdbeCursor *pAltCursor; /* Associated index cursor from which to read */ - int *aAltMap; /* Mapping from table to index column numbers */ + KeyInfo *pKeyInfo; /* Info about index keys needed by index cursors */ + u32 iHdrOffset; /* Offset to next unparsed byte of the header */ + Pgno pgnoRoot; /* Root page of the open btree cursor */ + i16 nField; /* Number of fields in the header */ + u16 nHdrParsed; /* Number of header fields parsed so far */ + i64 movetoTarget; /* Argument to the deferred sqlite3BtreeMoveto() */ + u32 *aOffset; /* Pointer to aType[nField] */ + const u8 *aRow; /* Data for the current row, if all on one page */ + u32 payloadSize; /* Total number of bytes in the record */ + u32 szRow; /* Byte available in aRow */ #ifdef SQLITE_ENABLE_COLUMN_USED_MASK - u64 maskUsed; /* Mask of columns used by this cursor */ + u64 maskUsed; /* Mask of columns used by this cursor */ #endif - /* Cached information about the header for the data record that the - ** cursor is currently pointing to. Only valid if cacheStatus matches - ** Vdbe.cacheCtr. Vdbe.cacheCtr will never take on the value of - ** CACHE_STALE and so setting cacheStatus=CACHE_STALE guarantees that - ** the cache is out of date. - ** - ** aRow might point to (ephemeral) data for the current row, or it might - ** be NULL. - */ - u32 cacheStatus; /* Cache is valid if this matches Vdbe.cacheCtr */ - u32 payloadSize; /* Total number of bytes in the record */ - u32 szRow; /* Byte available in aRow */ - u32 iHdrOffset; /* Offset to next unparsed byte of the header */ - const u8 *aRow; /* Data for the current row, if all on one page */ - u32 *aOffset; /* Pointer to aType[nField] */ - u32 aType[1]; /* Type values for all entries in the record */ /* 2*nField extra array elements allocated for aType[], beyond the one ** static element declared in the structure. nField total array slots for ** aType[] and nField+1 array slots for aOffset[] */ + u32 aType[1]; /* Type values record decode. MUST BE LAST */ }; @@ -343,7 +346,6 @@ struct Vdbe { Vdbe *pPrev,*pNext; /* Linked list of VDBEs with the same Vdbe.db */ Parse *pParse; /* Parsing context used to create this Vdbe */ ynVar nVar; /* Number of entries in aVar[] */ - ynVar nzVar; /* Number of entries in azVar[] */ u32 magic; /* Magic number for sanity checking */ int nMem; /* Number of memory locations currently allocated */ int nCursor; /* Number of slots in apCsr[] */ @@ -368,7 +370,7 @@ struct Vdbe { 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. */ - char **azVar; /* Name of variables */ + VList *pVList; /* Name of variables */ #ifndef SQLITE_OMIT_TRACE i64 startTime; /* Time when query started - used for profiling */ #endif @@ -484,7 +486,7 @@ void sqlite3VdbeIntegerAffinity(Mem*); int sqlite3VdbeMemRealify(Mem*); int sqlite3VdbeMemNumerify(Mem*); void sqlite3VdbeMemCast(Mem*,u8,u8); -int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,int,Mem*); +int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,Mem*); void sqlite3VdbeMemRelease(Mem *p); int sqlite3VdbeMemFinalize(Mem*, FuncDef*); const char *sqlite3OpcodeName(int); diff --git a/sqlite/src/vdbeapi.c b/sqlite/src/vdbeapi.c index 645ef1c8..32794de9 100644 --- a/sqlite/src/vdbeapi.c +++ b/sqlite/src/vdbeapi.c @@ -1470,10 +1470,8 @@ int sqlite3_bind_parameter_count(sqlite3_stmt *pStmt){ */ const char *sqlite3_bind_parameter_name(sqlite3_stmt *pStmt, int i){ Vdbe *p = (Vdbe*)pStmt; - if( p==0 || i<1 || i>p->nzVar ){ - return 0; - } - return p->azVar[i-1]; + if( p==0 ) return 0; + return sqlite3VListNumToName(p->pVList, i); } /* @@ -1482,19 +1480,8 @@ const char *sqlite3_bind_parameter_name(sqlite3_stmt *pStmt, int i){ ** return 0. */ int sqlite3VdbeParameterIndex(Vdbe *p, const char *zName, int nName){ - int i; - if( p==0 ){ - return 0; - } - if( zName ){ - for(i=0; inzVar; i++){ - const char *z = p->azVar[i]; - if( z && strncmp(z,zName,nName)==0 && z[nName]==0 ){ - return i+1; - } - } - } - return 0; + if( p==0 || zName==0 ) return 0; + return sqlite3VListNameToNum(p->pVList, zName, nName); } int sqlite3_bind_parameter_index(sqlite3_stmt *pStmt, const char *zName){ return sqlite3VdbeParameterIndex((Vdbe*)pStmt, zName, sqlite3Strlen30(zName)); @@ -1657,10 +1644,9 @@ static UnpackedRecord *vdbeUnpackRecord( int nKey, const void *pKey ){ - char *dummy; /* Dummy argument for AllocUnpackedRecord() */ UnpackedRecord *pRet; /* Return value */ - pRet = sqlite3VdbeAllocUnpackedRecord(pKeyInfo, 0, 0, &dummy); + pRet = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); if( pRet ){ memset(pRet->aMem, 0, sizeof(Mem)*(pKeyInfo->nField+1)); sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, pRet); @@ -1695,7 +1681,7 @@ int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ nRec = sqlite3BtreePayloadSize(p->pCsr->uc.pCursor); aRec = sqlite3DbMallocRaw(db, nRec); if( !aRec ) goto preupdate_old_out; - rc = sqlite3BtreeData(p->pCsr->uc.pCursor, 0, nRec, aRec); + rc = sqlite3BtreePayload(p->pCsr->uc.pCursor, 0, nRec, aRec); if( rc==SQLITE_OK ){ p->pUnpacked = vdbeUnpackRecord(&p->keyinfo, nRec, aRec); if( !p->pUnpacked ) rc = SQLITE_NOMEM; diff --git a/sqlite/src/vdbeaux.c b/sqlite/src/vdbeaux.c index 596ab30c..7c9a295c 100644 --- a/sqlite/src/vdbeaux.c +++ b/sqlite/src/vdbeaux.c @@ -313,7 +313,11 @@ int sqlite3VdbeAddOp4Int( int p4 /* The P4 operand as an integer */ ){ int addr = sqlite3VdbeAddOp3(p, op, p1, p2, p3); - sqlite3VdbeChangeP4(p, addr, SQLITE_INT_TO_PTR(p4), P4_INT32); + if( p->db->mallocFailed==0 ){ + VdbeOp *pOp = &p->aOp[addr]; + pOp->p4type = P4_INT32; + pOp->p4.i = p4; + } return addr; } @@ -824,10 +828,6 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){ break; } #endif - case P4_MPRINTF: { - if( db->pnBytesFreed==0 ) sqlite3_free(p4); - break; - } case P4_FUNCDEF: { freeEphemeralFunction(db, (FuncDef*)p4); break; @@ -972,16 +972,42 @@ void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int n){ } } +/* +** Change the P4 operand of the most recently coded instruction +** to the value defined by the arguments. This is a high-speed +** version of sqlite3VdbeChangeP4(). +** +** The P4 operand must not have been previously defined. And the new +** P4 must not be P4_INT32. Use sqlite3VdbeChangeP4() in either of +** those cases. +*/ +void sqlite3VdbeAppendP4(Vdbe *p, void *pP4, int n){ + VdbeOp *pOp; + assert( n!=P4_INT32 && n!=P4_VTAB ); + assert( n<=0 ); + if( p->db->mallocFailed ){ + freeP4(p->db, n, pP4); + }else{ + assert( pP4!=0 ); + assert( p->nOp>0 ); + pOp = &p->aOp[p->nOp-1]; + assert( pOp->p4type==P4_NOTUSED ); + pOp->p4type = n; + pOp->p4.p = pP4; + } +} + /* ** Set the P4 on the most recently added opcode to the KeyInfo for the ** index given. */ void sqlite3VdbeSetP4KeyInfo(Parse *pParse, Index *pIdx){ Vdbe *v = pParse->pVdbe; + KeyInfo *pKeyInfo; assert( v!=0 ); assert( pIdx!=0 ); - sqlite3VdbeChangeP4(v, -1, (char*)sqlite3KeyInfoOfIndex(pParse, pIdx), - P4_KEYINFO); + pKeyInfo = sqlite3KeyInfoOfIndex(pParse, pIdx); + if( pKeyInfo ) sqlite3VdbeAppendP4(v, pKeyInfo, P4_KEYINFO); } #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS @@ -1271,7 +1297,7 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){ sqlite3XPrintf(&x, "%s(%d)", pDef->zName, pDef->nArg); break; } -#ifdef SQLITE_DEBUG +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) case P4_FUNCCTX: { FuncDef *pDef = pOp->p4.pCtx->pFunc; sqlite3XPrintf(&x, "%s(%d)", pDef->zName, pDef->nArg); @@ -1949,10 +1975,8 @@ void sqlite3VdbeMakeReady( x.nFree = x.nNeeded; }while( !db->mallocFailed ); - p->nzVar = pParse->nzVar; - p->azVar = pParse->azVar; - pParse->nzVar = 0; - pParse->azVar = 0; + p->pVList = pParse->pVList; + pParse->pVList = 0; p->explain = pParse->explain; if( db->mallocFailed ){ p->nVar = 0; @@ -1980,15 +2004,15 @@ void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){ if( pCx==0 ){ return; } - assert( pCx->pBt==0 || pCx->eCurType==CURTYPE_BTREE ); + assert( pCx->pBtx==0 || pCx->eCurType==CURTYPE_BTREE ); switch( pCx->eCurType ){ case CURTYPE_SORTER: { sqlite3VdbeSorterClose(p->db, pCx); break; } case CURTYPE_BTREE: { - if( pCx->pBt ){ - sqlite3BtreeClose(pCx->pBt); + if( pCx->pBtx ){ + sqlite3BtreeClose(pCx->pBtx); /* The pCx->pCursor will be close automatically, if it exists, by ** the call above. */ }else{ @@ -2946,7 +2970,6 @@ void sqlite3VdbeDeleteAuxData(sqlite3 *db, AuxData **pp, int iOp, int mask){ */ void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ SubProgram *pSub, *pNext; - int i; assert( p->db==0 || p->db==db ); releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); for(pSub=p->pProgram; pSub; pSub=pNext){ @@ -2956,18 +2979,20 @@ void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ } if( p->magic!=VDBE_MAGIC_INIT ){ releaseMemArray(p->aVar, p->nVar); - for(i=p->nzVar-1; i>=0; i--) sqlite3DbFree(db, p->azVar[i]); - sqlite3DbFree(db, p->azVar); + sqlite3DbFree(db, p->pVList); sqlite3DbFree(db, p->pFree); } vdbeFreeOpArray(db, p->aOp, p->nOp); sqlite3DbFree(db, p->aColName); sqlite3DbFree(db, p->zSql); #ifdef SQLITE_ENABLE_STMT_SCANSTATUS - for(i=0; inScan; i++){ - sqlite3DbFree(db, p->aScan[i].zName); + { + int i; + for(i=0; inScan; i++){ + sqlite3DbFree(db, p->aScan[i].zName); + } + sqlite3DbFree(db, p->aScan); } - sqlite3DbFree(db, p->aScan); #endif } @@ -3468,30 +3493,13 @@ u32 sqlite3VdbeSerialGet( ** If an OOM error occurs, NULL is returned. */ UnpackedRecord *sqlite3VdbeAllocUnpackedRecord( - KeyInfo *pKeyInfo, /* Description of the record */ - char *pSpace, /* Unaligned space available */ - int szSpace, /* Size of pSpace[] in bytes */ - char **ppFree /* OUT: Caller should free this pointer */ + KeyInfo *pKeyInfo /* Description of the record */ ){ UnpackedRecord *p; /* Unpacked record to return */ - int nOff; /* Increment pSpace by nOff to align it */ int nByte; /* Number of bytes required for *p */ - - /* We want to shift the pointer pSpace up such that it is 8-byte aligned. - ** Thus, we need to calculate a value, nOff, between 0 and 7, to shift - ** it by. If pSpace is already 8-byte aligned, nOff should be zero. - */ - nOff = (8 - (SQLITE_PTR_TO_INT(pSpace) & 7)) & 7; nByte = ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nField+1); - if( nByte>szSpace+nOff ){ - p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte); - *ppFree = (char *)p; - if( !p ) return 0; - }else{ - p = (UnpackedRecord*)&pSpace[nOff]; - *ppFree = 0; - } - + p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte); + if( !p ) return 0; p->aMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))]; assert( pKeyInfo->aSortOrder!=0 ); p->pKeyInfo = pKeyInfo; @@ -4365,7 +4373,7 @@ int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){ /* Read in the complete content of the index entry */ sqlite3VdbeMemInit(&m, db, 0); - rc = sqlite3VdbeMemFromBtree(pCur, 0, (u32)nCellKey, 1, &m); + rc = sqlite3VdbeMemFromBtree(pCur, 0, (u32)nCellKey, &m); if( rc ){ return rc; } @@ -4445,7 +4453,7 @@ int sqlite3VdbeIdxKeyCompare( return SQLITE_CORRUPT_BKPT; } sqlite3VdbeMemInit(&m, db, 0); - rc = sqlite3VdbeMemFromBtree(pCur, 0, (u32)nCellKey, 1, &m); + rc = sqlite3VdbeMemFromBtree(pCur, 0, (u32)nCellKey, &m); if( rc ){ return rc; } diff --git a/sqlite/src/vdbeblob.c b/sqlite/src/vdbeblob.c index 570e253f..520d16c9 100644 --- a/sqlite/src/vdbeblob.c +++ b/sqlite/src/vdbeblob.c @@ -262,8 +262,7 @@ int sqlite3_blob_open( {OP_Column, 0, 0, 1}, /* 4 */ {OP_ResultRow, 1, 0, 0}, /* 5 */ {OP_Goto, 0, 2, 0}, /* 6 */ - {OP_Close, 0, 0, 0}, /* 7 */ - {OP_Halt, 0, 0, 0}, /* 8 */ + {OP_Halt, 0, 0, 0}, /* 7 */ }; Vdbe *v = (Vdbe *)pBlob->pStmt; int iDb = sqlite3SchemaToIndex(db, pTab->pSchema); @@ -441,7 +440,7 @@ static int blobReadWrite( ** Read data from a blob handle. */ int sqlite3_blob_read(sqlite3_blob *pBlob, void *z, int n, int iOffset){ - return blobReadWrite(pBlob, z, n, iOffset, sqlite3BtreeData); + return blobReadWrite(pBlob, z, n, iOffset, sqlite3BtreePayloadChecked); } /* diff --git a/sqlite/src/vdbemem.c b/sqlite/src/vdbemem.c index 9b78d543..9a73b627 100644 --- a/sqlite/src/vdbemem.c +++ b/sqlite/src/vdbemem.c @@ -934,10 +934,9 @@ int sqlite3VdbeMemSetStr( /* ** Move data out of a btree key or data field and into a Mem structure. -** The data or key is taken from the entry that pCur is currently pointing +** The data is payload from the entry that pCur is currently pointing ** to. offset and amt determine what portion of the data or key to retrieve. -** key is true to get the key or false to get data. The result is written -** into the pMem element. +** The result is written into the pMem element. ** ** The pMem object must have been initialized. This routine will use ** pMem->zMalloc to hold the content from the btree, if possible. New @@ -952,17 +951,12 @@ static SQLITE_NOINLINE int vdbeMemFromBtreeResize( BtCursor *pCur, /* Cursor pointing at record to retrieve. */ u32 offset, /* Offset from the start of data to return bytes from. */ u32 amt, /* Number of bytes to return. */ - int key, /* If true, retrieve from the btree key, not data. */ Mem *pMem /* OUT: Return data in this Mem structure. */ ){ int rc; pMem->flags = MEM_Null; if( SQLITE_OK==(rc = sqlite3VdbeMemClearAndResize(pMem, amt+2)) ){ - if( key ){ - rc = sqlite3BtreeKey(pCur, offset, amt, pMem->z); - }else{ - rc = sqlite3BtreeData(pCur, offset, amt, pMem->z); - } + rc = sqlite3BtreePayload(pCur, offset, amt, pMem->z); if( rc==SQLITE_OK ){ pMem->z[amt] = 0; pMem->z[amt+1] = 0; @@ -978,7 +972,6 @@ int sqlite3VdbeMemFromBtree( BtCursor *pCur, /* Cursor pointing at record to retrieve. */ u32 offset, /* Offset from the start of data to return bytes from. */ u32 amt, /* Number of bytes to return. */ - int key, /* If true, retrieve from the btree key, not data. */ Mem *pMem /* OUT: Return data in this Mem structure. */ ){ char *zData; /* Data from the btree layer */ @@ -999,7 +992,7 @@ int sqlite3VdbeMemFromBtree( pMem->flags = MEM_Blob|MEM_Ephem; pMem->n = (int)amt; }else{ - rc = vdbeMemFromBtreeResize(pCur, offset, amt, key, pMem); + rc = vdbeMemFromBtreeResize(pCur, offset, amt, pMem); } return rc; @@ -1340,6 +1333,7 @@ static int valueFromExpr( }else if( op==TK_NULL ){ pVal = valueNew(db, pCtx); if( pVal==0 ) goto no_mem; + sqlite3VdbeMemNumerify(pVal); } #ifndef SQLITE_OMIT_BLOB_LITERAL else if( op==TK_BLOB ){ diff --git a/sqlite/src/vdbesort.c b/sqlite/src/vdbesort.c index 69619802..631fb196 100644 --- a/sqlite/src/vdbesort.c +++ b/sqlite/src/vdbesort.c @@ -959,7 +959,7 @@ int sqlite3VdbeSorterInit( } #endif - assert( pCsr->pKeyInfo && pCsr->pBt==0 ); + assert( pCsr->pKeyInfo && pCsr->pBtx==0 ); assert( pCsr->eCurType==CURTYPE_SORTER ); szKeyInfo = sizeof(KeyInfo) + (pCsr->pKeyInfo->nField-1)*sizeof(CollSeq*); sz = sizeof(VdbeSorter) + nWorker * sizeof(SortSubtask); @@ -1327,12 +1327,8 @@ static int vdbeSorterOpenTempFile( */ static int vdbeSortAllocUnpacked(SortSubtask *pTask){ if( pTask->pUnpacked==0 ){ - char *pFree; - pTask->pUnpacked = sqlite3VdbeAllocUnpackedRecord( - pTask->pSorter->pKeyInfo, 0, 0, &pFree - ); - assert( pTask->pUnpacked==(UnpackedRecord*)pFree ); - if( pFree==0 ) return SQLITE_NOMEM_BKPT; + pTask->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pTask->pSorter->pKeyInfo); + if( pTask->pUnpacked==0 ) return SQLITE_NOMEM_BKPT; pTask->pUnpacked->nField = pTask->pSorter->pKeyInfo->nField; pTask->pUnpacked->errCode = 0; } @@ -2733,9 +2729,7 @@ int sqlite3VdbeSorterCompare( r2 = pSorter->pUnpacked; pKeyInfo = pCsr->pKeyInfo; if( r2==0 ){ - char *p; - r2 = pSorter->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pKeyInfo,0,0,&p); - assert( pSorter->pUnpacked==(UnpackedRecord*)p ); + r2 = pSorter->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); if( r2==0 ) return SQLITE_NOMEM_BKPT; r2->nField = nKeyCol; } diff --git a/sqlite/src/vtab.c b/sqlite/src/vtab.c index c54dc657..30079cbb 100644 --- a/sqlite/src/vtab.c +++ b/sqlite/src/vtab.c @@ -28,6 +28,41 @@ struct VtabCtx { int bDeclared; /* True after sqlite3_declare_vtab() is called */ }; +/* +** Construct and install a Module object for a virtual table. When this +** routine is called, it is guaranteed that all appropriate locks are held +** and the module is not already part of the connection. +*/ +Module *sqlite3VtabCreateModule( + sqlite3 *db, /* Database in which module is registered */ + const char *zName, /* Name assigned to this module */ + const sqlite3_module *pModule, /* The definition of the module */ + void *pAux, /* Context pointer for xCreate/xConnect */ + void (*xDestroy)(void *) /* Module destructor function */ +){ + Module *pMod; + int nName = sqlite3Strlen30(zName); + pMod = (Module *)sqlite3DbMallocRawNN(db, sizeof(Module) + nName + 1); + if( pMod ){ + Module *pDel; + char *zCopy = (char *)(&pMod[1]); + memcpy(zCopy, zName, nName+1); + pMod->zName = zCopy; + pMod->pModule = pModule; + pMod->pAux = pAux; + pMod->xDestroy = xDestroy; + pMod->pEpoTab = 0; + pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,(void*)pMod); + assert( pDel==0 || pDel==pMod ); + if( pDel ){ + sqlite3OomFault(db); + sqlite3DbFree(db, pDel); + pMod = 0; + } + } + return pMod; +} + /* ** The actual function that does the work of creating a new module. ** This function implements the sqlite3_create_module() and @@ -41,35 +76,15 @@ static int createModule( void (*xDestroy)(void *) /* Module destructor function */ ){ int rc = SQLITE_OK; - int nName; sqlite3_mutex_enter(db->mutex); - nName = sqlite3Strlen30(zName); if( sqlite3HashFind(&db->aModule, zName) ){ rc = SQLITE_MISUSE_BKPT; }else{ - Module *pMod; - pMod = (Module *)sqlite3DbMallocRawNN(db, sizeof(Module) + nName + 1); - if( pMod ){ - Module *pDel; - char *zCopy = (char *)(&pMod[1]); - memcpy(zCopy, zName, nName+1); - pMod->zName = zCopy; - pMod->pModule = pModule; - pMod->pAux = pAux; - pMod->xDestroy = xDestroy; - pMod->pEpoTab = 0; - pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,(void*)pMod); - assert( pDel==0 || pDel==pMod ); - if( pDel ){ - sqlite3OomFault(db); - sqlite3DbFree(db, pDel); - } - } + (void)sqlite3VtabCreateModule(db, zName, pModule, pAux, xDestroy); } rc = sqlite3ApiExit(db, rc); if( rc!=SQLITE_OK && xDestroy ) xDestroy(pAux); - sqlite3_mutex_leave(db->mutex); return rc; } @@ -408,7 +423,7 @@ void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ "UPDATE %Q.%s " "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q " "WHERE rowid=#%d", - db->aDb[iDb].zDbSName, SCHEMA_TABLE(iDb), + db->aDb[iDb].zDbSName, MASTER_NAME, pTab->zName, pTab->zName, zStmt, @@ -1133,7 +1148,7 @@ int sqlite3VtabEponymousTableInit(Parse *pParse, Module *pMod){ return 0; } pMod->pEpoTab = pTab; - pTab->nRef = 1; + pTab->nTabRef = 1; pTab->pSchema = db->aDb[0].pSchema; pTab->tabFlags |= TF_Virtual; pTab->nModuleArg = 0; diff --git a/sqlite/src/wal.c b/sqlite/src/wal.c index 235d383e..09f605fe 100644 --- a/sqlite/src/wal.c +++ b/sqlite/src/wal.c @@ -1723,6 +1723,7 @@ static void walRestartHdr(Wal *pWal, u32 salt1){ */ static int walCheckpoint( Wal *pWal, /* Wal connection */ + sqlite3 *db, /* Check for interrupts on this handle */ int eMode, /* One of PASSIVE, FULL or RESTART */ int (*xBusy)(void*), /* Function to call when busy */ void *pBusyArg, /* Context argument for xBusyHandler */ @@ -1817,6 +1818,10 @@ static int walCheckpoint( while( rc==SQLITE_OK && 0==walIteratorNext(pIter, &iDbpage, &iFrame) ){ i64 iOffset; assert( walFramePgno(pWal, iFrame)==iDbpage ); + if( db->u1.isInterrupted ){ + rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_INTERRUPT; + break; + } if( iFrame<=nBackfill || iFrame>mxSafeFrame || iDbpage>mxPage ){ continue; } @@ -1921,6 +1926,7 @@ static void walLimitSize(Wal *pWal, i64 nMax){ */ int sqlite3WalClose( Wal *pWal, /* Wal to close */ + sqlite3 *db, /* For interrupt flag */ int sync_flags, /* Flags to pass to OsSync() (or 0) */ int nBuf, u8 *zBuf /* Buffer of at least nBuf bytes */ @@ -1937,13 +1943,14 @@ int sqlite3WalClose( ** ** The EXCLUSIVE lock is not released before returning. */ - rc = sqlite3OsLock(pWal->pDbFd, SQLITE_LOCK_EXCLUSIVE); - if( rc==SQLITE_OK ){ + if( zBuf!=0 + && SQLITE_OK==(rc = sqlite3OsLock(pWal->pDbFd, SQLITE_LOCK_EXCLUSIVE)) + ){ if( pWal->exclusiveMode==WAL_NORMAL_MODE ){ pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; } - rc = sqlite3WalCheckpoint( - pWal, SQLITE_CHECKPOINT_PASSIVE, 0, 0, sync_flags, nBuf, zBuf, 0, 0 + rc = sqlite3WalCheckpoint(pWal, db, + SQLITE_CHECKPOINT_PASSIVE, 0, 0, sync_flags, nBuf, zBuf, 0, 0 ); if( rc==SQLITE_OK ){ int bPersist = -1; @@ -2372,6 +2379,84 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ return rc; } +#ifdef SQLITE_ENABLE_SNAPSHOT +/* +** Attempt to reduce the value of the WalCkptInfo.nBackfillAttempted +** variable so that older snapshots can be accessed. To do this, loop +** through all wal frames from nBackfillAttempted to (nBackfill+1), +** comparing their content to the corresponding page with the database +** file, if any. Set nBackfillAttempted to the frame number of the +** first frame for which the wal file content matches the db file. +** +** This is only really safe if the file-system is such that any page +** writes made by earlier checkpointers were atomic operations, which +** is not always true. It is also possible that nBackfillAttempted +** may be left set to a value larger than expected, if a wal frame +** contains content that duplicate of an earlier version of the same +** page. +** +** SQLITE_OK is returned if successful, or an SQLite error code if an +** error occurs. It is not an error if nBackfillAttempted cannot be +** decreased at all. +*/ +int sqlite3WalSnapshotRecover(Wal *pWal){ + int rc; + + assert( pWal->readLock>=0 ); + rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); + if( rc==SQLITE_OK ){ + volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + int szPage = (int)pWal->szPage; + i64 szDb; /* Size of db file in bytes */ + + rc = sqlite3OsFileSize(pWal->pDbFd, &szDb); + if( rc==SQLITE_OK ){ + void *pBuf1 = sqlite3_malloc(szPage); + void *pBuf2 = sqlite3_malloc(szPage); + if( pBuf1==0 || pBuf2==0 ){ + rc = SQLITE_NOMEM; + }else{ + u32 i = pInfo->nBackfillAttempted; + for(i=pInfo->nBackfillAttempted; i>pInfo->nBackfill; i--){ + volatile ht_slot *dummy; + volatile u32 *aPgno; /* Array of page numbers */ + u32 iZero; /* Frame corresponding to aPgno[0] */ + u32 pgno; /* Page number in db file */ + i64 iDbOff; /* Offset of db file entry */ + i64 iWalOff; /* Offset of wal file entry */ + + rc = walHashGet(pWal, walFramePage(i), &dummy, &aPgno, &iZero); + if( rc!=SQLITE_OK ) break; + pgno = aPgno[i-iZero]; + iDbOff = (i64)(pgno-1) * szPage; + + if( iDbOff+szPage<=szDb ){ + iWalOff = walFrameOffset(i, szPage) + WAL_FRAME_HDRSIZE; + rc = sqlite3OsRead(pWal->pWalFd, pBuf1, szPage, iWalOff); + + if( rc==SQLITE_OK ){ + rc = sqlite3OsRead(pWal->pDbFd, pBuf2, szPage, iDbOff); + } + + if( rc!=SQLITE_OK || 0==memcmp(pBuf1, pBuf2, szPage) ){ + break; + } + } + + pInfo->nBackfillAttempted = i-1; + } + } + + sqlite3_free(pBuf1); + sqlite3_free(pBuf2); + } + walUnlockExclusive(pWal, WAL_CKPT_LOCK, 1); + } + + return rc; +} +#endif /* SQLITE_ENABLE_SNAPSHOT */ + /* ** Begin a read transaction on the database. ** @@ -2434,7 +2519,11 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ ** has not yet set the pInfo->nBackfillAttempted variable to indicate ** its intent. To avoid the race condition this leads to, ensure that ** there is no checkpointer process by taking a shared CKPT lock - ** before checking pInfo->nBackfillAttempted. */ + ** before checking pInfo->nBackfillAttempted. + ** + ** TODO: Does the aReadMark[] lock prevent a checkpointer from doing + ** this already? + */ rc = walLockShared(pWal, WAL_CKPT_LOCK); if( rc==SQLITE_OK ){ @@ -3191,6 +3280,7 @@ int sqlite3WalFrames( */ int sqlite3WalCheckpoint( Wal *pWal, /* Wal connection */ + sqlite3 *db, /* Check this handle's interrupt flag */ int eMode, /* PASSIVE, FULL, RESTART, or TRUNCATE */ int (*xBusy)(void*), /* Function to call when busy */ void *pBusyArg, /* Context argument for xBusyHandler */ @@ -3265,7 +3355,7 @@ int sqlite3WalCheckpoint( if( pWal->hdr.mxFrame && walPagesize(pWal)!=nBuf ){ rc = SQLITE_CORRUPT_BKPT; }else{ - rc = walCheckpoint(pWal, eMode2, xBusy2, pBusyArg, sync_flags, zBuf); + rc = walCheckpoint(pWal, db, eMode2, xBusy2, pBusyArg, sync_flags, zBuf); } /* If no error occurred, set the output variables. */ @@ -3385,9 +3475,14 @@ int sqlite3WalHeapMemory(Wal *pWal){ int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot){ int rc = SQLITE_OK; WalIndexHdr *pRet; + static const u32 aZero[4] = { 0, 0, 0, 0 }; assert( pWal->readLock>=0 && pWal->writeLock==0 ); + if( memcmp(&pWal->hdr.aFrameCksum[0],aZero,16)==0 ){ + *ppSnapshot = 0; + return SQLITE_ERROR; + } pRet = (WalIndexHdr*)sqlite3_malloc(sizeof(WalIndexHdr)); if( pRet==0 ){ rc = SQLITE_NOMEM_BKPT; diff --git a/sqlite/src/wal.h b/sqlite/src/wal.h index 6048e798..4f6d01da 100644 --- a/sqlite/src/wal.h +++ b/sqlite/src/wal.h @@ -28,7 +28,7 @@ #ifdef SQLITE_OMIT_WAL # define sqlite3WalOpen(x,y,z) 0 # define sqlite3WalLimit(x,y) -# define sqlite3WalClose(w,x,y,z) 0 +# define sqlite3WalClose(v,w,x,y,z) 0 # define sqlite3WalBeginReadTransaction(y,z) 0 # define sqlite3WalEndReadTransaction(z) # define sqlite3WalDbsize(y) 0 @@ -38,7 +38,7 @@ # define sqlite3WalSavepoint(y,z) # define sqlite3WalSavepointUndo(y,z) 0 # define sqlite3WalFrames(u,v,w,x,y,z) 0 -# define sqlite3WalCheckpoint(r,s,t,u,v,w,x,y,z) 0 +# define sqlite3WalCheckpoint(q,r,s,t,u,v,w,x,y,z) 0 # define sqlite3WalCallback(z) 0 # define sqlite3WalExclusiveMode(y,z) 0 # define sqlite3WalHeapMemory(z) 0 @@ -56,7 +56,7 @@ typedef struct Wal Wal; /* Open and close a connection to a write-ahead log. */ int sqlite3WalOpen(sqlite3_vfs*, sqlite3_file*, const char *, int, i64, Wal**); -int sqlite3WalClose(Wal *pWal, int sync_flags, int, u8 *); +int sqlite3WalClose(Wal *pWal, sqlite3*, int sync_flags, int, u8 *); /* Set the limiting size of a WAL file. */ void sqlite3WalLimit(Wal*, i64); @@ -99,6 +99,7 @@ int sqlite3WalFrames(Wal *pWal, int, PgHdr *, Pgno, int, int); /* Copy pages from the log to the database file */ int sqlite3WalCheckpoint( Wal *pWal, /* Write-ahead log connection */ + sqlite3 *db, /* Check this handle's interrupt flag */ int eMode, /* One of PASSIVE, FULL and RESTART */ int (*xBusy)(void*), /* Function to call when busy */ void *pBusyArg, /* Context argument for xBusyHandler */ @@ -130,6 +131,7 @@ int sqlite3WalHeapMemory(Wal *pWal); #ifdef SQLITE_ENABLE_SNAPSHOT int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot); void sqlite3WalSnapshotOpen(Wal *pWal, sqlite3_snapshot *pSnapshot); +int sqlite3WalSnapshotRecover(Wal *pWal); #endif #ifdef SQLITE_ENABLE_ZIPVFS diff --git a/sqlite/src/where.c b/sqlite/src/where.c index d77c333c..81cc1f13 100644 --- a/sqlite/src/where.c +++ b/sqlite/src/where.c @@ -198,11 +198,13 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ WhereTerm *pTerm; /* The term being tested */ int k = pScan->k; /* Where to start scanning */ - while( pScan->iEquiv<=pScan->nEquiv ){ - iCur = pScan->aiCur[pScan->iEquiv-1]; + assert( pScan->iEquiv<=pScan->nEquiv ); + pWC = pScan->pWC; + while(1){ iColumn = pScan->aiColumn[pScan->iEquiv-1]; - if( iColumn==XN_EXPR && pScan->pIdxExpr==0 ) return 0; - while( (pWC = pScan->pWC)!=0 ){ + iCur = pScan->aiCur[pScan->iEquiv-1]; + assert( pWC!=0 ); + do{ for(pTerm=pWC->a+k; knTerm; k++, pTerm++){ if( pTerm->leftCursor==iCur && pTerm->u.leftColumn==iColumn @@ -252,15 +254,17 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ testcase( pTerm->eOperator & WO_IS ); continue; } + pScan->pWC = pWC; pScan->k = k+1; return pTerm; } } } - pScan->pWC = pScan->pWC->pOuter; + pWC = pWC->pOuter; k = 0; - } - pScan->pWC = pScan->pOrigWC; + }while( pWC!=0 ); + if( pScan->iEquiv>=pScan->nEquiv ) break; + pWC = pScan->pOrigWC; k = 0; pScan->iEquiv++; } @@ -294,24 +298,24 @@ static WhereTerm *whereScanInit( u32 opMask, /* Operator(s) to scan for */ Index *pIdx /* Must be compatible with this index */ ){ - int j = 0; - - /* memset(pScan, 0, sizeof(*pScan)); */ pScan->pOrigWC = pWC; pScan->pWC = pWC; pScan->pIdxExpr = 0; + pScan->idxaff = 0; + pScan->zCollName = 0; if( pIdx ){ - j = iColumn; + int j = iColumn; iColumn = pIdx->aiColumn[j]; - if( iColumn==XN_EXPR ) pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; - if( iColumn==pIdx->pTable->iPKey ) iColumn = XN_ROWID; - } - if( pIdx && iColumn>=0 ){ - pScan->idxaff = pIdx->pTable->aCol[iColumn].affinity; - pScan->zCollName = pIdx->azColl[j]; - }else{ - pScan->idxaff = 0; - pScan->zCollName = 0; + if( iColumn==XN_EXPR ){ + pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; + }else if( iColumn==pIdx->pTable->iPKey ){ + iColumn = XN_ROWID; + }else if( iColumn>=0 ){ + pScan->idxaff = pIdx->pTable->aCol[iColumn].affinity; + pScan->zCollName = pIdx->azColl[j]; + } + }else if( iColumn==XN_EXPR ){ + return 0; } pScan->opMask = opMask; pScan->k = 0; @@ -4907,27 +4911,6 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ continue; } - /* 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); - } - } - /* 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/wherecode.c b/sqlite/src/wherecode.c index d9e7db23..032c56fe 100644 --- a/sqlite/src/wherecode.c +++ b/sqlite/src/wherecode.c @@ -1142,7 +1142,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeAddOp2(v, OP_Integer, nConstraint, iReg+1); sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrNotFound, iReg, pLoop->u.vtab.idxStr, - pLoop->u.vtab.needFree ? P4_MPRINTF : P4_STATIC); + pLoop->u.vtab.needFree ? P4_DYNAMIC : P4_STATIC); VdbeCoverage(v); pLoop->u.vtab.needFree = 0; pLevel->p1 = iCur; @@ -1175,7 +1175,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( /* Generate code that will continue to the next row if ** the IN constraint is not satisfied */ - pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0, 0); + pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0); assert( pCompare!=0 || db->mallocFailed ); if( pCompare ){ pCompare->pLeft = pTerm->pExpr->pLeft; @@ -1774,7 +1774,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( pAndExpr = sqlite3ExprAnd(db, pAndExpr, pExpr); } if( pAndExpr ){ - pAndExpr = sqlite3PExpr(pParse, TK_AND|TKFLG_DONTFOLD, 0, pAndExpr, 0); + pAndExpr = sqlite3PExpr(pParse, TK_AND|TKFLG_DONTFOLD, 0, pAndExpr); } } @@ -1847,7 +1847,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( } if( iSet>=0 ){ sqlite3VdbeAddOp3(v, OP_MakeRecord, r, nPk, regRowid); - sqlite3VdbeAddOp3(v, OP_IdxInsert, regRowset, regRowid, 0); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, regRowset, regRowid, + r, nPk); if( iSet ) sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); } diff --git a/sqlite/src/whereexpr.c b/sqlite/src/whereexpr.c index 13d56114..4bb16104 100644 --- a/sqlite/src/whereexpr.c +++ b/sqlite/src/whereexpr.c @@ -734,7 +734,7 @@ static void exprAnalyzeOrTerm( } assert( pLeft!=0 ); pDup = sqlite3ExprDup(db, pLeft, 0); - pNew = sqlite3PExpr(pParse, TK_IN, pDup, 0, 0); + pNew = sqlite3PExpr(pParse, TK_IN, pDup, 0); if( pNew ){ int idxNew; transferJoinMarkings(pNew, pExpr); @@ -1032,7 +1032,7 @@ static void exprAnalyze( int idxNew; pNewExpr = sqlite3PExpr(pParse, ops[i], sqlite3ExprDup(db, pExpr->pLeft, 0), - sqlite3ExprDup(db, pList->a[i].pExpr, 0), 0); + sqlite3ExprDup(db, pList->a[i].pExpr, 0)); transferJoinMarkings(pNewExpr, pExpr); idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); testcase( idxNew==0 ); @@ -1117,7 +1117,7 @@ static void exprAnalyze( pNewExpr1 = sqlite3ExprDup(db, pLeft, 0); pNewExpr1 = sqlite3PExpr(pParse, TK_GE, sqlite3ExprAddCollateString(pParse,pNewExpr1,zCollSeqName), - pStr1, 0); + pStr1); transferJoinMarkings(pNewExpr1, pExpr); idxNew1 = whereClauseInsert(pWC, pNewExpr1, wtFlags); testcase( idxNew1==0 ); @@ -1125,7 +1125,7 @@ static void exprAnalyze( pNewExpr2 = sqlite3ExprDup(db, pLeft, 0); pNewExpr2 = sqlite3PExpr(pParse, TK_LT, sqlite3ExprAddCollateString(pParse,pNewExpr2,zCollSeqName), - pStr2, 0); + pStr2); transferJoinMarkings(pNewExpr2, pExpr); idxNew2 = whereClauseInsert(pWC, pNewExpr2, wtFlags); testcase( idxNew2==0 ); @@ -1158,7 +1158,7 @@ static void exprAnalyze( if( (prereqExpr & prereqColumn)==0 ){ Expr *pNewExpr; pNewExpr = sqlite3PExpr(pParse, TK_MATCH, - 0, sqlite3ExprDup(db, pRight, 0), 0); + 0, sqlite3ExprDup(db, pRight, 0)); idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); testcase( idxNew==0 ); pNewTerm = &pWC->a[idxNew]; @@ -1197,7 +1197,7 @@ static void exprAnalyze( Expr *pLeft = sqlite3ExprForVectorField(pParse, pExpr->pLeft, i); Expr *pRight = sqlite3ExprForVectorField(pParse, pExpr->pRight, i); - pNew = sqlite3PExpr(pParse, pExpr->op, pLeft, pRight, 0); + pNew = sqlite3PExpr(pParse, pExpr->op, pLeft, pRight); transferJoinMarkings(pNew, pExpr); idxNew = whereClauseInsert(pWC, pNew, TERM_DYNAMIC); exprAnalyze(pSrc, pWC, idxNew); @@ -1249,7 +1249,7 @@ static void exprAnalyze( pNewExpr = sqlite3PExpr(pParse, TK_GT, sqlite3ExprDup(db, pLeft, 0), - sqlite3ExprAlloc(db, TK_NULL, 0, 0), 0); + sqlite3ExprAlloc(db, TK_NULL, 0, 0)); idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC|TERM_VNULL); @@ -1435,7 +1435,7 @@ void sqlite3WhereTabFuncArgs( pColRef->iColumn = k++; pColRef->pTab = pTab; pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef, - sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0), 0); + sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0)); whereClauseInsert(pWC, pTerm, TERM_DYNAMIC); } } diff --git a/sqlite/test/alter.test b/sqlite/test/alter.test index ebfe97a7..76c18ced 100644 --- a/sqlite/test/alter.test +++ b/sqlite/test/alter.test @@ -77,7 +77,7 @@ do_test alter-1.2 { ifcapable tempdb { execsql { INSERT INTO objlist SELECT type, name, tbl_name - FROM sqlite_temp_master WHERE NAME!='objlist'; + FROM temp.sqlite_master WHERE NAME!='objlist'; } } @@ -153,7 +153,7 @@ ifcapable tempdb { CREATE TEMP TABLE objlist(type, name, tbl_name); INSERT INTO objlist SELECT type, name, tbl_name FROM sqlite_master; INSERT INTO objlist - SELECT type, name, tbl_name FROM sqlite_temp_master + SELECT type, name, tbl_name FROM temp.sqlite_master WHERE NAME!='objlist'; SELECT type, name, tbl_name FROM objlist ORDER BY tbl_name, type desc, name; @@ -524,7 +524,7 @@ do_test alter-3.3.7 { ifcapable tempdb { do_test alter-3.3.8 { execsql { - SELECT * FROM sqlite_temp_master WHERE type = 'trigger'; + SELECT * FROM temp.sqlite_master WHERE type = 'trigger'; } } {} } diff --git a/sqlite/test/alter4.test b/sqlite/test/alter4.test index 2cd78777..5155110c 100644 --- a/sqlite/test/alter4.test +++ b/sqlite/test/alter4.test @@ -45,18 +45,33 @@ do_test alter4-1.1 { SELECT sql FROM sqlite_temp_master; } } {{CREATE TABLE abc(a, b, c)}} +do_test alter4-1.1b { + execsql { + SELECT sql FROM temp.sqlite_master; + } +} {{CREATE TABLE abc(a, b, c)}} do_test alter4-1.2 { execsql {ALTER TABLE abc ADD d INTEGER;} execsql { SELECT sql FROM sqlite_temp_master; } } {{CREATE TABLE abc(a, b, c, d INTEGER)}} +do_test alter4-1.2b { + execsql { + SELECT sql FROM temp.sqlite_master; + } +} {{CREATE TABLE abc(a, b, c, d INTEGER)}} do_test alter4-1.3 { execsql {ALTER TABLE abc ADD e} execsql { SELECT sql FROM sqlite_temp_master; } } {{CREATE TABLE abc(a, b, c, d INTEGER, e)}} +do_test alter4-1.3b { + execsql { + SELECT sql FROM temp.sqlite_master; + } +} {{CREATE TABLE abc(a, b, c, d INTEGER, e)}} do_test alter4-1.4 { execsql { CREATE TABLE temp.t1(a, b); @@ -64,6 +79,11 @@ do_test alter4-1.4 { SELECT sql FROM sqlite_temp_master WHERE tbl_name = 't1'; } } {{CREATE TABLE t1(a, b, c)}} +do_test alter4-1.4b { + execsql { + SELECT sql FROM temp.sqlite_master WHERE tbl_name = 't1'; + } +} {{CREATE TABLE t1(a, b, c)}} do_test alter4-1.5 { execsql { ALTER TABLE t1 ADD d CHECK (a>d); diff --git a/sqlite/test/analyzeF.test b/sqlite/test/analyzeF.test index 3cbc5f47..76891ddf 100644 --- a/sqlite/test/analyzeF.test +++ b/sqlite/test/analyzeF.test @@ -120,5 +120,31 @@ do_catchsql_test 4.4 { SELECT * FROM t1 WHERE x = test_zeroblob(1100000) AND y = 4; } {1 {string or blob too big}} +# 2016-12-08: Constraints of the form "x=? AND x IS NOT NULL" were being +# mishandled. The sqlite3Stat4ProbeSetValue() routine was assuming that +# valueNew() was returning a Mem object that was preset to NULL, which is +# not the case. The consequence was the the "x IS NOT NULL" constraint +# was used to drive the index (via the "x>NULL" pseudo-constraint) rather +# than the "x=?" constraint. +# +do_execsql_test 5.1 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c INT); + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<10000) + INSERT INTO t1(a, c) SELECT x, x FROM c; + UPDATE t1 SET b=printf('x%02x',a/500) WHERE a>4000; + UPDATE t1 SET b='xyz' where a>=9998; + CREATE INDEX t1b ON t1(b); + ANALYZE; + SELECT count(*), b FROM t1 GROUP BY 2 ORDER BY 2; +} {4000 {} 499 x08 500 x09 500 x0a 500 x0b 500 x0c 500 x0d 500 x0e 500 x0f 500 x10 500 x11 500 x12 498 x13 3 xyz} +do_execsql_test 5.2 { + explain query plan + SELECT * FROM t1 WHERE b='xyz' AND b IS NOT NULL ORDER BY +a; + /* v---- Should be "=", not ">" */ +} {/USING INDEX t1b .b=/} +do_execsql_test 5.3 { + SELECT * FROM t1 WHERE b='xyz' AND b IS NOT NULL ORDER BY +a; +} {9998 xyz 9998 9999 xyz 9999 10000 xyz 10000} finish_test diff --git a/sqlite/test/attach.test b/sqlite/test/attach.test index 31c24e61..54be6a41 100644 --- a/sqlite/test/attach.test +++ b/sqlite/test/attach.test @@ -193,7 +193,7 @@ do_test attach-1.20.2 { } ;# ifcapable schema_pragmas integrity_check attach-1.20.3 ifcapable tempdb { - execsql {select * from sqlite_temp_master} + execsql {select * from temp.sqlite_master} } do_test attach-1.21 { catchsql { diff --git a/sqlite/test/attach3.test b/sqlite/test/attach3.test index 1ac10d97..1c8601c7 100644 --- a/sqlite/test/attach3.test +++ b/sqlite/test/attach3.test @@ -207,7 +207,7 @@ ifcapable tempdb { CREATE TEMP TRIGGER tst_trigger BEFORE INSERT ON aux.t4 BEGIN SELECT 'hello world'; END; - SELECT count(*) FROM sqlite_temp_master; + SELECT count(*) FROM temp.sqlite_master; } } {1} do_test attach3-9.1 { @@ -219,7 +219,7 @@ ifcapable tempdb { do_test attach3-9.2 { execsql { DROP TABLE aux.t4; - SELECT count(*) FROM sqlite_temp_master; + SELECT count(*) FROM temp.sqlite_master; } } {0} } diff --git a/sqlite/test/auth.test b/sqlite/test/auth.test index d9e12edc..0044fdde 100644 --- a/sqlite/test/auth.test +++ b/sqlite/test/auth.test @@ -91,7 +91,7 @@ ifcapable tempdb { catchsql {CREATE TEMP TABLE t1(a,b,c)} } {1 {not authorized}} do_test auth-1.6 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {} do_test auth-1.7.1 { proc auth {code arg1 arg2 arg3 arg4 args} { @@ -148,7 +148,7 @@ ifcapable tempdb { catchsql {CREATE TEMP TABLE t1(a,b,c)} } {0 {}} do_test auth-1.14 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {} do_test auth-1.15 { proc auth {code arg1 arg2 arg3 arg4 args} { @@ -561,7 +561,7 @@ ifcapable tempdb { catchsql {DROP TABLE t1} } {0 {}} do_test auth-1.78 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {t1} } @@ -632,7 +632,7 @@ ifcapable tempdb { set ::authargs } {v1 {} temp {}} do_test auth-1.90 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {t1} } @@ -779,7 +779,7 @@ ifcapable tempdb { } } {1 {not authorized}} do_test auth-1.113 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {t1 v1} do_test auth-1.114 { proc auth {code arg1 arg2 arg3 arg4 args} { @@ -823,7 +823,7 @@ ifcapable tempdb { set ::authargs } {v1 {} temp {}} do_test auth-1.121 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {t1 v1} do_test auth-1.122 { proc auth {code arg1 arg2 arg3 arg4 args} { @@ -980,7 +980,7 @@ do_test auth-1.139 { set ::authargs } {r1 t1 temp {}} do_test auth-1.140 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {t1} do_test auth-1.141 { proc auth {code arg1 arg2 arg3 arg4 args} { @@ -1016,7 +1016,7 @@ do_test auth-1.144 { set ::authargs } {r1 t1 temp {}} do_test auth-1.145 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {t1} do_test auth-1.146 { proc auth {code arg1 arg2 arg3 arg4 args} { @@ -1052,7 +1052,7 @@ do_test auth-1.149 { set ::authargs } {r1 t1 temp {}} do_test auth-1.150 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {t1 r1} do_test auth-1.151 { @@ -1142,7 +1142,7 @@ do_test auth-1.164 { catchsql {DROP TRIGGER r1} } {1 {not authorized}} do_test auth-1.165 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {t1 r1} do_test auth-1.166 { proc auth {code arg1 arg2 arg3 arg4 args} { @@ -1170,7 +1170,7 @@ do_test auth-1.169 { catchsql {DROP TRIGGER r1} } {0 {}} do_test auth-1.170 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {t1 r1} do_test auth-1.171 { proc auth {code arg1 arg2 arg3 arg4 args} { @@ -1202,7 +1202,7 @@ do_test auth-1.175 { set ::authargs } {r1 t1 temp {}} do_test auth-1.176 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {t1} } ;# ifcapable trigger @@ -1306,7 +1306,7 @@ ifcapable tempdb { catchsql {CREATE INDEX i1 ON t1(b)} } {1 {not authorized}} do_test auth-1.194 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {t1} do_test auth-1.195 { proc auth {code arg1 arg2 arg3 arg4 args} { @@ -1350,7 +1350,7 @@ ifcapable tempdb { set ::authargs } {i1 t1 temp {}} do_test auth-1.202 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {t1 i1} } @@ -1466,7 +1466,7 @@ ifcapable tempdb { catchsql {DROP INDEX i1} } {0 {}} do_test auth-1.222 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {t1 i1} do_test auth-1.223 { proc auth {code arg1 arg2 arg3 arg4 args} { @@ -1482,7 +1482,7 @@ ifcapable tempdb { set ::authargs } {i1 t1 temp {}} do_test auth-1.225 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {t1 i1} do_test auth-1.226 { proc auth {code arg1 arg2 arg3 arg4 args} { @@ -1498,7 +1498,7 @@ ifcapable tempdb { set ::authargs } {i1 t1 temp {}} do_test auth-1.228 { - execsql {SELECT name FROM sqlite_temp_master} + execsql {SELECT name FROM temp.sqlite_master} } {t1} } @@ -1765,7 +1765,7 @@ ifcapable attach { } } {0 {}} do_test auth-1.267 { - execsql {SELECT name FROM sqlite_temp_master WHERE type='table'} + execsql {SELECT name FROM temp.sqlite_master WHERE type='table'} } {t1x} do_test auth-1.268 { set authargs @@ -2070,7 +2070,7 @@ ifcapable {altertable} { } } {1 {not authorized}} do_test auth-1.307 { - set x [execsql {SELECT sql FROM sqlite_temp_master WHERE type='t5'}] + set x [execsql {SELECT sql FROM temp.sqlite_master WHERE type='t5'}] regexp new_col_3 $x } {0} @@ -2373,7 +2373,7 @@ ifcapable compound&&subquery { do_test auth-5.2 { execsql { SELECT name FROM ( - SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) + SELECT * FROM sqlite_master UNION ALL SELECT * FROM temp.sqlite_master) WHERE type='table' ORDER BY name } diff --git a/sqlite/test/auth3.test b/sqlite/test/auth3.test index ca7e16c8..013486e5 100644 --- a/sqlite/test/auth3.test +++ b/sqlite/test/auth3.test @@ -122,7 +122,7 @@ do_execsql_test auth3-3.0 { key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE, value TEXT NOT NULL ON CONFLICT FAIL); ALTER TABLE TempTable RENAME TO DoNotRead; - SELECT name FROM sqlite_temp_master; + SELECT name FROM temp.sqlite_master; } {DoNotRead sqlite_autoindex_DoNotRead_1} finish_test diff --git a/sqlite/test/autoinc.test b/sqlite/test/autoinc.test index 4c108ead..8ac12b17 100644 --- a/sqlite/test/autoinc.test +++ b/sqlite/test/autoinc.test @@ -344,7 +344,7 @@ ifcapable tempdb { do_test autoinc-4.1 { execsql { SELECT 1, name FROM sqlite_master WHERE type='table'; - SELECT 2, name FROM sqlite_temp_master WHERE type='table'; + SELECT 2, name FROM temp.sqlite_master WHERE type='table'; } } {1 sqlite_sequence} do_test autoinc-4.2 { diff --git a/sqlite/test/bestindex3.test b/sqlite/test/bestindex3.test index 8baf8542..70c60d66 100644 --- a/sqlite/test/bestindex3.test +++ b/sqlite/test/bestindex3.test @@ -172,4 +172,3 @@ do_execsql_test 3.1 { CREATE VIRTUAL TABLE t3 USING tcl('vvv_command') } do_execsql_test 3.2 { CREATE VIRTUAL TABLE t4 USING tcl('yyy_command') } finish_test - diff --git a/sqlite/test/bestindex4.test b/sqlite/test/bestindex4.test new file mode 100644 index 00000000..64727bd0 --- /dev/null +++ b/sqlite/test/bestindex4.test @@ -0,0 +1,120 @@ +# 2016 November 11 +# +# 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 the virtual table interface. In particular the xBestIndex +# method. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix bestindex4 + +ifcapable !vtab { + finish_test + return +} + +#------------------------------------------------------------------------- +# Virtual table callback for a virtual table named $tbl. +# +# The table created is: +# +# "CREATE TABLE t1 (id, host, class)" +# +# The virtual table supports == operators on a subset of its columns. The +# exact subset depends on the value of bitmask paramater $param. +# +# 0x01 - == on "id" supported +# 0x02 - == on "host" supported +# 0x04 - == on "class" supported +# +# $param also supports the following bits: +# +# 0x08 - ignore the "usable" flag (malfunction) +# +# +# +proc vtab_cmd {param method args} { + switch -- $method { + xConnect { + return "CREATE TABLE t1(id TEXT, host TEXT, class TEXT)" + } + + xBestIndex { + foreach {clist orderby mask} $args {} + + set ret [list] + + set use use + + + for {set i 0} {$i < [llength $clist]} {incr i} { + array unset C + array set C [lindex $clist $i] + if { ($C(usable) || ($param & 0x08)) + && $C(op)=="eq" && ($param & 1<<$C(column)) + } { + lappend ret $use $i + break + } + } + + set score 1000000 + if {$ret!=""} { + set score [expr $score / [llength $ret]] + } + lappend ret cost $score rows $score + + return $ret + } + + xFilter { + } + } + return "" +} + +register_tcl_module db + +for {set param1 0} {$param1<16} {incr param1} { + for {set param2 0} {$param2<16} {incr param2} { + reset_db + register_tcl_module db + do_execsql_test 1.$param1.$param2.1 " + CREATE VIRTUAL TABLE t1 USING tcl('vtab_cmd $param1'); + CREATE VIRTUAL TABLE t2 USING tcl('vtab_cmd $param2'); + " + + foreach {tn sql} { + 2 "select t1.id as ID from t1, t2 where t1.id=t2.host and t2.class='xx'" + 3 { + select t1.id as ID from t1, t2 where t2.class ='xx' and t2.id = t1.host + } + 4 { + select t1.id as ID from t1, t2 where t1.host = t2.id and t2. class ='xx' + } + } { + + if {($param1 & 0x08)==0 && ($param2 & 0x08)==0} { + + do_execsql_test 1.$param1.$param2.$tn.a $sql {} + + } else { + do_test 1.$param1.$param2.$tn.b { + catchsql $sql + set {} {} + } {} + } + } + + } +} + +finish_test diff --git a/sqlite/test/corruptC.test b/sqlite/test/corruptC.test index 80c3c09f..e2fb1f33 100644 --- a/sqlite/test/corruptC.test +++ b/sqlite/test/corruptC.test @@ -100,6 +100,12 @@ do_test corruptC-2.1 { } {1 {database disk image is malformed}} # test that a corrupt content offset size is handled (seed 5649) +# +# Update 2016-12-27: As of check-in [0b86fbca66] "In sqlite3BtreeInsert() when +# replacing a re-existing row, try to overwrite the cell directly rather than +# deallocate and reallocate the cell" on 2016-12-09, this test case no longer +# detects the offset size problem during the UPDATE. We have to run a subsequent +# integrity_check to see it. do_test corruptC-2.2 { db close forcecopy test.bu test.db @@ -117,8 +123,9 @@ do_test corruptC-2.2 { hexio_write test.db 3746 [format %02x 0x9a] sqlite3 db test.db - catchsql {UPDATE t1 SET y=1} -} {1 {database disk image is malformed}} + db eval {UPDATE t1 SET y=1} + db eval {PRAGMA integrity_check} +} {/Offset .* out of range/} # test that a corrupt free cell size is handled (seed 13329) do_test corruptC-2.3 { diff --git a/sqlite/test/ctime.test b/sqlite/test/ctime.test index efdf1708..8ed55635 100644 --- a/sqlite/test/ctime.test +++ b/sqlite/test/ctime.test @@ -224,5 +224,17 @@ do_test ctime-2.5.$tc { } ] } {0 {{}}} +#-------------------------------------------------------------------------- +# Test that SQLITE_DIRECT_OVERFLOW_READ is reflected in the output of +# "PRAGMA compile_options". +# +ifcapable direct_read { + set res 1 +} else { + set res 0 +} +do_test ctime-3.0.1 { + expr [lsearch [db eval {PRAGMA compile_options}] DIRECT_OVERFLOW_READ]>=0 +} $res finish_test diff --git a/sqlite/test/date.test b/sqlite/test/date.test index 2f48b111..2d336e6c 100644 --- a/sqlite/test/date.test +++ b/sqlite/test/date.test @@ -62,7 +62,7 @@ datetest 1.20 {julianday('2000-01-01 12:00:00.01')} 2451545.00000012 datetest 1.21 {julianday('2000-01-01 12:00:00.001')} 2451545.00000001 datetest 1.22 {julianday('2000-01-01 12:00:00.')} NULL datetest 1.23 julianday(12345.6) 12345.6 -datetest 1.23b julianday('12345.6') 12345.6 +datetest 1.23b julianday(1721059.5) 1721059.5 datetest 1.24 {julianday('2001-01-01 12:00:00 bogus')} NULL datetest 1.25 {julianday('2001-01-01 bogus')} NULL datetest 1.26 {julianday('2001-01-01 12:60:00')} NULL @@ -560,4 +560,41 @@ do_test date-15.2 { } } {1} +# Tests of extreme values in date/time functions. Run with UBSan or the +# equivalent to verify no signed interger overflow warnings. +# +datetest 16.1 {date(147483649)} NULL +datetest 16.2 {datetime(0)} {-4713-11-24 12:00:00} +datetest 16.3 {datetime(5373484.49999999)} {9999-12-31 23:59:59} +datetest 16.4 {julianday('-4713-11-24 12:00:00')} 0.0 +datetest 16.5 {julianday('9999-12-31 23:59:59.999')} 5373484.49999999 +datetest 16.6 {datetime(0,'+464269060799 seconds')} {9999-12-31 23:59:59} +datetest 16.7 {datetime(0,'+464269060800 seconds')} NULL +datetest 16.8 {datetime(0,'+7737817679 minutes')} {9999-12-31 23:59:00} +datetest 16.9 {datetime(0,'+7737817680 minutes')} NULL +datetest 16.10 {datetime(0,'+128963627 hours')} {9999-12-31 23:00:00} +datetest 16.11 {datetime(0,'+128963628 hours')} NULL +datetest 16.12 {datetime(0,'+5373484 days')} {9999-12-31 12:00:00} +datetest 16.13 {datetime(0,'+5373485 days')} NULL +datetest 16.14 {datetime(0,'+176545 months')} {9999-12-24 12:00:00} +datetest 16.15 {datetime(0,'+176546 months')} NULL +datetest 16.16 {datetime(0,'+14712 years')} {9999-11-24 12:00:00} +datetest 16.17 {datetime(0,'+14713 years')} NULL +datetest 16.20 {datetime(5373484.4999999,'-464269060799 seconds')} \ + {-4713-11-24 12:00:00} +datetest 16.21 {datetime(5373484,'-464269060800 seconds')} NULL +datetest 16.22 {datetime(5373484.4999999,'-7737817679 minutes')} \ + {-4713-11-24 12:00:59} +datetest 16.23 {datetime(5373484,'-7737817680 minutes')} NULL +datetest 16.24 {datetime(5373484.4999999,'-128963627 hours')} \ + {-4713-11-24 12:59:59} +datetest 16.25 {datetime(5373484,'-128963628 hours')} NULL +datetest 16.26 {datetime(5373484,'-5373484 days')} {-4713-11-24 12:00:00} +datetest 16.27 {datetime(5373484,'-5373485 days')} NULL +datetest 16.28 {datetime(5373484,'-176545 months')} {-4713-12-01 12:00:00} +datetest 16.29 {datetime(5373484,'-176546 months')} NULL +datetest 16.30 {datetime(5373484,'-14712 years')} {-4713-12-31 12:00:00} +datetest 16.31 {datetime(5373484,'-14713 years')} NULL + + finish_test diff --git a/sqlite/test/dbfuzz.c b/sqlite/test/dbfuzz.c new file mode 100644 index 00000000..2de97c35 --- /dev/null +++ b/sqlite/test/dbfuzz.c @@ -0,0 +1,754 @@ +/* +** 2016-12-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 program is designed for fuzz-testing SQLite database files. +** +** This program reads fuzzed database files from the disk files named +** on the command-line. Each database is loaded into an in-memory +** filesystem so that the original database file is unmolested. +** +** The fuzzed database is then opened, and series of SQL statements +** are run against the database to ensure that SQLite can safely handle +** the fuzzed database. +*/ +#include +#include +#include +#include +#include +#include +#define ISSPACE(X) isspace((unsigned char)(X)) +#define ISDIGIT(X) isdigit((unsigned char)(X)) +#include "sqlite3.h" +#ifdef __unix__ +# include +# include +#endif + +/* +** Print sketchy documentation for this utility program +*/ +static void showHelp(const char *zArgv0){ + printf("Usage: %s [options] DATABASE ...\n", zArgv0); + printf( +"Read databases into an in-memory filesystem. Run test SQL as specified\n" +"by command-line arguments or from\n" +"\n" +" SELECT group_concat(sql) FROM autoexec;\n" +"\n" +"Options:\n" +" --help Show this help text\n" +" -q|--quiet Reduced output\n" +" --limit-mem N Limit memory used by test SQLite instances to N bytes\n" +" --limit-vdbe Panic if any test runs for more than 100,000 cycles\n" +" --no-lookaside Disable the lookaside memory allocator\n" +" --timeout N Timeout after N seconds.\n" +" --trace Show the results of each SQL command\n" +" -v|--verbose Increased output. Repeat for more output.\n" + ); + exit(0); +} + +/* +** Print an error message and quit. +*/ +static void fatalError(const char *zFormat, ...){ + va_list ap; + va_start(ap, zFormat); + vfprintf(stderr, zFormat, ap); + va_end(ap); + fprintf(stderr, "\n"); + exit(1); +} + +/* +** Files in the virtual file system. +*/ +typedef struct VFile VFile; +typedef struct VHandle VHandle; +struct VFile { + char *zFilename; /* Filename. NULL for delete-on-close. From malloc() */ + int sz; /* Size of the file in bytes */ + int nRef; /* Number of references to this file */ + unsigned char *a; /* Content of the file. From malloc() */ +}; +struct VHandle { + sqlite3_file base; /* Base class. Must be first */ + VFile *pVFile; /* The underlying file */ +}; + +/* +** Maximum number of files in the in-memory virtual filesystem. +*/ +#define MX_FILE 10 + +/* +** Maximum allowed file size +*/ +#define MX_FILE_SZ 1000000 + +/* +** All global variables are gathered into the "g" singleton. +*/ +static struct GlobalVars { + VFile aFile[MX_FILE]; /* The virtual filesystem */ +} g; + + +/* +** Initialize the virtual file system. +*/ +static void formatVfs(void){ + int i; + for(i=0; i0 ){ + fatalError("file %d still open. nRef=%d", i, g.aFile[i].nRef); + } + g.aFile[i].sz = -1; + free(g.aFile[i].a); + g.aFile[i].a = 0; + g.aFile[i].nRef = 0; + } +} + +/* +** Find a VFile by name +*/ +static VFile *findVFile(const char *zName){ + int i; + if( zName==0 ) return 0; + for(i=0; i=0; i++){} + if( i>=MX_FILE ) return 0; + if( zDiskFile ){ + in = fopen(zDiskFile, "rb"); + if( in==0 ) fatalError("no such file: \"%s\"", zDiskFile); + fseek(in, 0, SEEK_END); + sz = ftell(in); + rewind(in); + } + pNew = &g.aFile[i]; + if( zName ){ + int nName = (int)strlen(zName)+1; + pNew->zFilename = malloc(nName); + if( pNew->zFilename==0 ){ + if( in ) fclose(in); + return 0; + } + memcpy(pNew->zFilename, zName, nName); + }else{ + pNew->zFilename = 0; + } + pNew->nRef = 0; + pNew->sz = sz; + pNew->a = malloc(sz); + if( sz>0 ){ + if( pNew->a==0 || fread(pNew->a, sz, 1, in)<1 ){ + free(pNew->zFilename); + free(pNew->a); + pNew->a = 0; + pNew->zFilename = 0; + pNew->sz = -1; + pNew = 0; + } + } + if( in ) fclose(in); + return pNew; +} + +/* Methods for the VHandle object +*/ +static int inmemClose(sqlite3_file *pFile){ + VHandle *p = (VHandle*)pFile; + VFile *pVFile = p->pVFile; + pVFile->nRef--; + if( pVFile->nRef==0 && pVFile->zFilename==0 ){ + pVFile->sz = -1; + free(pVFile->a); + pVFile->a = 0; + } + return SQLITE_OK; +} +static int inmemRead( + sqlite3_file *pFile, /* Read from this open file */ + void *pData, /* Store content in this buffer */ + int iAmt, /* Bytes of content */ + sqlite3_int64 iOfst /* Start reading here */ +){ + VHandle *pHandle = (VHandle*)pFile; + VFile *pVFile = pHandle->pVFile; + if( iOfst<0 || iOfst>=pVFile->sz ){ + memset(pData, 0, iAmt); + return SQLITE_IOERR_SHORT_READ; + } + if( iOfst+iAmt>pVFile->sz ){ + memset(pData, 0, iAmt); + iAmt = (int)(pVFile->sz - iOfst); + memcpy(pData, pVFile->a, iAmt); + return SQLITE_IOERR_SHORT_READ; + } + memcpy(pData, pVFile->a + iOfst, iAmt); + return SQLITE_OK; +} +static int inmemWrite( + sqlite3_file *pFile, /* Write to this file */ + const void *pData, /* Content to write */ + int iAmt, /* bytes to write */ + sqlite3_int64 iOfst /* Start writing here */ +){ + VHandle *pHandle = (VHandle*)pFile; + VFile *pVFile = pHandle->pVFile; + if( iOfst+iAmt > pVFile->sz ){ + unsigned char *aNew; + if( iOfst+iAmt >= MX_FILE_SZ ){ + return SQLITE_FULL; + } + aNew = realloc(pVFile->a, (int)(iOfst+iAmt)); + if( aNew==0 ){ + return SQLITE_FULL; + } + pVFile->a = aNew; + if( iOfst > pVFile->sz ){ + memset(pVFile->a + pVFile->sz, 0, (int)(iOfst - pVFile->sz)); + } + pVFile->sz = (int)(iOfst + iAmt); + } + memcpy(pVFile->a + iOfst, pData, iAmt); + return SQLITE_OK; +} +static int inmemTruncate(sqlite3_file *pFile, sqlite3_int64 iSize){ + VHandle *pHandle = (VHandle*)pFile; + VFile *pVFile = pHandle->pVFile; + if( pVFile->sz>iSize && iSize>=0 ) pVFile->sz = (int)iSize; + return SQLITE_OK; +} +static int inmemSync(sqlite3_file *pFile, int flags){ + return SQLITE_OK; +} +static int inmemFileSize(sqlite3_file *pFile, sqlite3_int64 *pSize){ + *pSize = ((VHandle*)pFile)->pVFile->sz; + return SQLITE_OK; +} +static int inmemLock(sqlite3_file *pFile, int type){ + return SQLITE_OK; +} +static int inmemUnlock(sqlite3_file *pFile, int type){ + return SQLITE_OK; +} +static int inmemCheckReservedLock(sqlite3_file *pFile, int *pOut){ + *pOut = 0; + return SQLITE_OK; +} +static int inmemFileControl(sqlite3_file *pFile, int op, void *pArg){ + return SQLITE_NOTFOUND; +} +static int inmemSectorSize(sqlite3_file *pFile){ + return 512; +} +static int inmemDeviceCharacteristics(sqlite3_file *pFile){ + return + SQLITE_IOCAP_SAFE_APPEND | + SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | + SQLITE_IOCAP_POWERSAFE_OVERWRITE; +} + + +/* Method table for VHandle +*/ +static sqlite3_io_methods VHandleMethods = { + /* iVersion */ 1, + /* xClose */ inmemClose, + /* xRead */ inmemRead, + /* xWrite */ inmemWrite, + /* xTruncate */ inmemTruncate, + /* xSync */ inmemSync, + /* xFileSize */ inmemFileSize, + /* xLock */ inmemLock, + /* xUnlock */ inmemUnlock, + /* xCheck... */ inmemCheckReservedLock, + /* xFileCtrl */ inmemFileControl, + /* xSectorSz */ inmemSectorSize, + /* xDevchar */ inmemDeviceCharacteristics, + /* xShmMap */ 0, + /* xShmLock */ 0, + /* xShmBarrier */ 0, + /* xShmUnmap */ 0, + /* xFetch */ 0, + /* xUnfetch */ 0 +}; + +/* +** Open a new file in the inmem VFS. All files are anonymous and are +** delete-on-close. +*/ +static int inmemOpen( + sqlite3_vfs *pVfs, + const char *zFilename, + sqlite3_file *pFile, + int openFlags, + int *pOutFlags +){ + VFile *pVFile = createVFile(zFilename, 0); + VHandle *pHandle = (VHandle*)pFile; + if( pVFile==0 ){ + return SQLITE_FULL; + } + pHandle->pVFile = pVFile; + pVFile->nRef++; + pFile->pMethods = &VHandleMethods; + if( pOutFlags ) *pOutFlags = openFlags; + return SQLITE_OK; +} + +/* +** Delete a file by name +*/ +static int inmemDelete( + sqlite3_vfs *pVfs, + const char *zFilename, + int syncdir +){ + VFile *pVFile = findVFile(zFilename); + if( pVFile==0 ) return SQLITE_OK; + if( pVFile->nRef==0 ){ + free(pVFile->zFilename); + pVFile->zFilename = 0; + pVFile->sz = -1; + free(pVFile->a); + pVFile->a = 0; + return SQLITE_OK; + } + return SQLITE_IOERR_DELETE; +} + +/* Check for the existance of a file +*/ +static int inmemAccess( + sqlite3_vfs *pVfs, + const char *zFilename, + int flags, + int *pResOut +){ + VFile *pVFile = findVFile(zFilename); + *pResOut = pVFile!=0; + return SQLITE_OK; +} + +/* Get the canonical pathname for a file +*/ +static int inmemFullPathname( + sqlite3_vfs *pVfs, + const char *zFilename, + int nOut, + char *zOut +){ + sqlite3_snprintf(nOut, zOut, "%s", zFilename); + return SQLITE_OK; +} + +/* +** Register the VFS that reads from the g.aFile[] set of files. +*/ +static void inmemVfsRegister(void){ + static sqlite3_vfs inmemVfs; + sqlite3_vfs *pDefault = sqlite3_vfs_find(0); + inmemVfs.iVersion = 3; + inmemVfs.szOsFile = sizeof(VHandle); + inmemVfs.mxPathname = 200; + inmemVfs.zName = "inmem"; + inmemVfs.xOpen = inmemOpen; + inmemVfs.xDelete = inmemDelete; + inmemVfs.xAccess = inmemAccess; + inmemVfs.xFullPathname = inmemFullPathname; + inmemVfs.xRandomness = pDefault->xRandomness; + inmemVfs.xSleep = pDefault->xSleep; + inmemVfs.xCurrentTimeInt64 = pDefault->xCurrentTimeInt64; + sqlite3_vfs_register(&inmemVfs, 0); +}; + +/* +** Timeout handler +*/ +#ifdef __unix__ +static void timeoutHandler(int NotUsed){ + (void)NotUsed; + fatalError("timeout\n"); +} +#endif + +/* +** Set the an alarm to go off after N seconds. Disable the alarm +** if N==0 +*/ +static void setAlarm(int N){ +#ifdef __unix__ + alarm(N); +#else + (void)N; +#endif +} +/*************************************************************************** +** String accumulator object +*/ +typedef struct Str Str; +struct Str { + char *z; /* The string. Memory from malloc() */ + sqlite3_uint64 n; /* Bytes of input used */ + sqlite3_uint64 nAlloc; /* Bytes allocated to z[] */ + int oomErr; /* OOM error has been seen */ +}; + +/* Initialize a Str object */ +static void StrInit(Str *p){ + memset(p, 0, sizeof(*p)); +} + +/* Append text to the end of a Str object */ +static void StrAppend(Str *p, const char *z){ + sqlite3_uint64 n = strlen(z); + if( p->n + n >= p->nAlloc ){ + char *zNew; + sqlite3_uint64 nNew; + if( p->oomErr ) return; + nNew = p->nAlloc*2 + 100 + n; + zNew = sqlite3_realloc(p->z, nNew); + if( zNew==0 ){ + sqlite3_free(p->z); + memset(p, 0, sizeof(*p)); + p->oomErr = 1; + return; + } + p->z = zNew; + p->nAlloc = nNew; + } + memcpy(p->z + p->n, z, n); + p->n += n; + p->z[p->n] = 0; +} + +/* Return the current string content */ +static char *StrStr(Str *p){ + return p->z; +} + +/* Free the string */ +static void StrFree(Str *p){ + sqlite3_free(p->z); + StrInit(p); +} + +/* +** Return the value of a hexadecimal digit. Return -1 if the input +** is not a hex digit. +*/ +static int hexDigitValue(char c){ + if( c>='0' && c<='9' ) return c - '0'; + if( c>='a' && c<='f' ) return c - 'a' + 10; + if( c>='A' && c<='F' ) return c - 'A' + 10; + return -1; +} + +/* +** Interpret zArg as an integer value, possibly with suffixes. +*/ +static int integerValue(const char *zArg){ + sqlite3_int64 v = 0; + static const struct { char *zSuffix; int iMult; } aMult[] = { + { "KiB", 1024 }, + { "MiB", 1024*1024 }, + { "GiB", 1024*1024*1024 }, + { "KB", 1000 }, + { "MB", 1000000 }, + { "GB", 1000000000 }, + { "K", 1000 }, + { "M", 1000000 }, + { "G", 1000000000 }, + }; + int i; + int isNeg = 0; + if( zArg[0]=='-' ){ + isNeg = 1; + zArg++; + }else if( zArg[0]=='+' ){ + zArg++; + } + if( zArg[0]=='0' && zArg[1]=='x' ){ + int x; + zArg += 2; + while( (x = hexDigitValue(zArg[0]))>=0 ){ + v = (v<<4) + x; + zArg++; + } + }else{ + while( ISDIGIT(zArg[0]) ){ + v = v*10 + zArg[0] - '0'; + zArg++; + } + } + for(i=0; i0x7fffffff ) fatalError("parameter too large - max 2147483648"); + return (int)(isNeg? -v : v); +} + +/* +** This callback is invoked by sqlite3_log(). +*/ +static void sqlLog(void *pNotUsed, int iErrCode, const char *zMsg){ + printf("LOG: (%d) %s\n", iErrCode, zMsg); + fflush(stdout); +} + +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK +/* +** This an SQL progress handler. After an SQL statement has run for +** many steps, we want to interrupt it. This guards against infinite +** loops from recursive common table expressions. +** +** *pVdbeLimitFlag is true if the --limit-vdbe command-line option is used. +** In that case, hitting the progress handler is a fatal error. +*/ +static int progressHandler(void *pVdbeLimitFlag){ + if( *(int*)pVdbeLimitFlag ) fatalError("too many VDBE cycles"); + return 1; +} +#endif + +/* +** Allowed values for the runFlags parameter to runSql() +*/ +#define SQL_TRACE 0x0001 /* Print each SQL statement as it is prepared */ +#define SQL_OUTPUT 0x0002 /* Show the SQL output */ + +/* +** Run multiple commands of SQL. Similar to sqlite3_exec(), but does not +** stop if an error is encountered. +*/ +static void runSql(sqlite3 *db, const char *zSql, unsigned runFlags){ + const char *zMore; + const char *zEnd = &zSql[strlen(zSql)]; + sqlite3_stmt *pStmt; + + while( zSql && zSql[0] ){ + zMore = 0; + pStmt = 0; + sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zMore); + assert( zMore<=zEnd ); + if( zMore==zSql ) break; + if( runFlags & SQL_TRACE ){ + const char *z = zSql; + int n; + while( z0 && ISSPACE(z[n-1]) ) n--; + if( n==0 ) break; + if( pStmt==0 ){ + printf("TRACE: %.*s (error: %s)\n", n, z, sqlite3_errmsg(db)); + }else{ + printf("TRACE: %.*s\n", n, z); + } + } + zSql = zMore; + if( pStmt ){ + if( (runFlags & SQL_OUTPUT)==0 ){ + while( SQLITE_ROW==sqlite3_step(pStmt) ){} + }else{ + int nCol = -1; + int nRow; + for(nRow=0; SQLITE_ROW==sqlite3_step(pStmt); nRow++){ + int i; + if( nCol<0 ){ + nCol = sqlite3_column_count(pStmt); + } + for(i=0; i0 ){ + void *pHeap = malloc( nHeap ); + if( pHeap==0 ) fatalError("cannot allocate %d-byte heap\n", nHeap); + rc = sqlite3_config(SQLITE_CONFIG_HEAP, pHeap, nHeap, 32); + if( rc ) fatalError("heap configuration failed: %d\n", rc); + } + if( noLookaside ){ + sqlite3_config(SQLITE_CONFIG_LOOKASIDE, 0, 0); + } + inmemVfsRegister(); + formatVfs(); + StrInit(&sql); +#ifdef __unix__ + signal(SIGALRM, timeoutHandler); +#endif + for(i=0; i1 ){ + printf("DATABASE-FILE: %s\n", azDb[i]); + fflush(stdout); + } + if( iTimeout ) setAlarm(iTimeout); + createVFile("test.db", azDb[i]); + rc = sqlite3_open_v2("test.db", &db, SQLITE_OPEN_READWRITE, "inmem"); + if( rc ){ + printf("cannot open test.db for \"%s\"\n", azDb[i]); + reformatVfs(); + continue; + } +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + if( vdbeLimitFlag ){ + sqlite3_progress_handler(db, 100000, progressHandler, &vdbeLimitFlag); + } +#endif + rc = sqlite3_prepare_v2(db, "SELECT sql FROM autoexec", -1, &pStmt, 0); + if( rc==SQLITE_OK ){ + while( SQLITE_ROW==sqlite3_step(pStmt) ){ + StrAppend(&sql, (const char*)sqlite3_column_text(pStmt, 0)); + StrAppend(&sql, "\n"); + } + } + sqlite3_finalize(pStmt); + StrAppend(&sql, "PRAGMA integrity_check;\n"); + runSql(db, StrStr(&sql), runFlags); + sqlite3_close(db); + reformatVfs(); + StrFree(&sql); + if( sqlite3_memory_used()>0 ){ + free(azDb); + reformatVfs(); + fatalError("memory leak of %lld bytes", sqlite3_memory_used()); + } + } + StrFree(&sql); + reformatVfs(); + return 0; +} diff --git a/sqlite/test/e_dropview.test b/sqlite/test/e_dropview.test index 143dce29..04c4ad8c 100644 --- a/sqlite/test/e_dropview.test +++ b/sqlite/test/e_dropview.test @@ -45,7 +45,7 @@ proc list_all_views {{db db}} { set res [list] $db eval { PRAGMA database_list } { set tbl "$name.sqlite_master" - if {$name == "temp"} { set tbl sqlite_temp_master } + if {$name == "temp"} { set tbl temp.sqlite_master } set sql "SELECT '$name.' || name FROM $tbl WHERE type = 'view'" lappend res {*}[$db eval $sql] diff --git a/sqlite/test/e_expr.test b/sqlite/test/e_expr.test index 6165aa35..de7b43c9 100644 --- a/sqlite/test/e_expr.test +++ b/sqlite/test/e_expr.test @@ -1437,6 +1437,13 @@ do_expr_test e_expr-27.2.2 { CAST(NULL AS text) } null {} do_expr_test e_expr-27.2.3 { CAST(NULL AS blob) } null {} do_expr_test e_expr-27.2.4 { CAST(NULL AS number) } null {} +# EVIDENCE-OF: R-29283-15561 Otherwise, the storage class of the result +# is determined by applying the rules for determining column affinity to +# the type-name. +# +# The R-29283-15561 requirement above is demonstrated by all of the +# subsequent e_expr-26 tests. +# # EVIDENCE-OF: R-43522-35548 Casting a value to a type-name with no # affinity causes the value to be converted into a BLOB. # @@ -1786,8 +1793,8 @@ do_test e_expr-35.0 { } } {} -# EVIDENCE-OF: R-00980-39256 A SELECT statement enclosed in parentheses -# may appear as a scalar quantity. +# EVIDENCE-OF: R-43573-23448 A SELECT statement enclosed in parentheses +# is a subquery. # # EVIDENCE-OF: R-56294-03966 All types of SELECT statement, including # aggregate and compound SELECT queries (queries with keywords like @@ -1806,8 +1813,9 @@ do_expr_test e_expr-35.1.6 { (SELECT a FROM t2 UNION SELECT COALESCE(b, 55) FROM t2 ORDER BY 1) } integer 4 -# EVIDENCE-OF: R-46899-53765 A SELECT used as a scalar quantity must -# return a result set with a single column. +# EVIDENCE-OF: R-22239-33740 A subquery that returns two or more columns +# is a row value subquery and can only be used as the operand of a +# comparison operator. # # The following block tests that errors are returned in a bunch of cases # where a subquery returns more than one column. @@ -1824,11 +1832,11 @@ foreach {tn sql} { do_catchsql_test e_expr-35.2.$tn $sql $M } -# EVIDENCE-OF: R-35764-28041 The result of the expression is the value -# of the only column in the first row returned by the SELECT statement. +# EVIDENCE-OF: R-18318-14995 The value of a subquery expression is the +# first row of the result from the enclosed SELECT statement. # -# EVIDENCE-OF: R-41898-06686 If the SELECT yields more than one result -# row, all rows after the first are ignored. +# EVIDENCE-OF: R-15900-52156 In other words, an implied "LIMIT 1" is +# added to the subquery, overriding an explicitly coded LIMIT. # do_execsql_test e_expr-36.3.1 { CREATE TABLE t4(x, y); @@ -1852,8 +1860,8 @@ foreach {tn expr restype resval} { do_expr_test e_expr-36.3.$tn $expr $restype $resval } -# EVIDENCE-OF: R-25492-41572 If the SELECT yields no rows, then the -# value of the expression is NULL. +# EVIDENCE-OF: R-52325-25449 The value of a subquery expression is NULL +# if the enclosed SELECT statement returns no rows. # foreach {tn expr} { 1 { ( SELECT x FROM t4 WHERE x>3 ORDER BY x ) } diff --git a/sqlite/test/e_select.test b/sqlite/test/e_select.test index 89d61b53..9aa2de60 100644 --- a/sqlite/test/e_select.test +++ b/sqlite/test/e_select.test @@ -1252,8 +1252,8 @@ do_select_tests e_select-5.5 { 1 "SELECT DISTINCT d FROM h3" {{} 2 2,3 2,4 3} } -# EVIDENCE-OF: R-58359-52112 The normal rules for selecting a collation -# sequence to compare text values with apply. +# EVIDENCE-OF: R-47709-27231 The usual rules apply for selecting a +# collation sequence to compare text values. # do_select_tests e_select-5.6 { 1 "SELECT DISTINCT b FROM h1" {one I i four IV iv} diff --git a/sqlite/test/filectrl.test b/sqlite/test/filectrl.test index cb469941..460b71e2 100644 --- a/sqlite/test/filectrl.test +++ b/sqlite/test/filectrl.test @@ -53,7 +53,7 @@ if {$tcl_platform(platform)=="windows"} { db close forcedelete test2.db list $size $handle [expr {$handle != 0}] - } {/^0 \{0 \d+\} 1$/} + } {/^0 \{0 [0-9A-Fa-f]+\} 1$/} do_test filectrl-2.2 { sqlite3 db test2.db @@ -66,7 +66,7 @@ if {$tcl_platform(platform)=="windows"} { db close forcedelete test2.db list $size $handle [expr {$handle != 0}] - } {/^1\d+ \{0 \d+\} 1$/} + } {/^1\d+ \{0 [0-9A-Fa-f]+\} 1$/} } finish_test diff --git a/sqlite/test/fkey1.test b/sqlite/test/fkey1.test index e10781ac..d9b038a0 100644 --- a/sqlite/test/fkey1.test +++ b/sqlite/test/fkey1.test @@ -15,6 +15,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix fkey1 ifcapable {!foreignkey} { finish_test @@ -185,4 +186,25 @@ do_catchsql_test fkey1-5.4 { INSERT OR REPLACE INTO Foo(Id, ParentId, C1) VALUES (2, 3, 'A-2-3'); } {1 {FOREIGN KEY constraint failed}} +#------------------------------------------------------------------------- +# Check that foreign key processing is not fooled by partial indexes +# on the parent table. +# +do_execsql_test 6.0 { + CREATE TABLE p1(x, y); + CREATE UNIQUE INDEX p1x ON p1(x) WHERE y<2; + INSERT INTO p1 VALUES(1, 1); + CREATE TABLE c1(a REFERENCES p1(x)); +} + +do_catchsql_test 6.1 { + INSERT INTO c1 VALUES(1); +} {1 {foreign key mismatch - "c1" referencing "p1"}} + +do_execsql_test 6.2 { + CREATE UNIQUE INDEX p1x2 ON p1(x); + INSERT INTO c1 VALUES(1); +} {} + + finish_test diff --git a/sqlite/test/fkey2.test b/sqlite/test/fkey2.test index aec75ed6..c2ae3788 100644 --- a/sqlite/test/fkey2.test +++ b/sqlite/test/fkey2.test @@ -1062,7 +1062,7 @@ ifcapable altertable { PRAGMA foreign_keys = off; ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1; PRAGMA foreign_keys = on; - SELECT sql FROM sqlite_temp_master WHERE name='t2'; + SELECT sql FROM temp.sqlite_master WHERE name='t2'; } } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} @@ -1093,7 +1093,7 @@ ifcapable altertable { ] do_test fkey2-14.2tmp.2.2 { execsql { ALTER TABLE t1 RENAME TO t4 } - execsql { SELECT sql FROM sqlite_temp_master WHERE type = 'table'} + execsql { SELECT sql FROM temp.sqlite_master WHERE type = 'table'} } [list \ {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4")} \ {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2)} \ diff --git a/sqlite/test/fuzzcheck.c b/sqlite/test/fuzzcheck.c index fec65881..75d51956 100644 --- a/sqlite/test/fuzzcheck.c +++ b/sqlite/test/fuzzcheck.c @@ -70,7 +70,6 @@ #include #include #include "sqlite3.h" -#include #define ISSPACE(X) isspace((unsigned char)(X)) #define ISDIGIT(X) isdigit((unsigned char)(X)) @@ -80,6 +79,11 @@ # include #endif +#ifdef SQLITE_OSS_FUZZ +# include +# include +#endif + /* ** Files in the virtual file system. */ @@ -128,6 +132,7 @@ static struct GlobalVars { Blob *pFirstDb; /* Content of first template database */ int nSql; /* Number of SQL scripts */ Blob *pFirstSql; /* First SQL script */ + unsigned int uRandom; /* Seed for the SQLite PRNG */ char zTestName[100]; /* Name of current test */ } g; @@ -590,10 +595,18 @@ static int inmemFullPathname( return SQLITE_OK; } +/* Always use the same random see, for repeatability. +*/ +static int inmemRandomness(sqlite3_vfs *NotUsed, int nBuf, char *zBuf){ + memset(zBuf, 0, nBuf); + memcpy(zBuf, &g.uRandom, nBufxRandomness; + inmemVfs.xRandomness = inmemRandomness; inmemVfs.xSleep = pDefault->xSleep; inmemVfs.xCurrentTimeInt64 = pDefault->xCurrentTimeInt64; - sqlite3_vfs_register(&inmemVfs, 0); + sqlite3_vfs_register(&inmemVfs, makeDefault); }; /* @@ -622,14 +635,12 @@ static void inmemVfsRegister(void){ */ static void runSql(sqlite3 *db, const char *zSql, unsigned runFlags){ const char *zMore; - const char *zEnd = &zSql[strlen(zSql)]; sqlite3_stmt *pStmt; while( zSql && zSql[0] ){ zMore = 0; pStmt = 0; sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zMore); - assert( zMore<=zEnd ); if( zMore==zSql ) break; if( runFlags & SQL_TRACE ){ const char *z = zSql; @@ -794,6 +805,8 @@ static void showHelp(void){ " --load-db ARGS... Load template databases from files into SOURCE_DB\n" " -m TEXT Add a description to the database\n" " --native-vfs Use the native VFS for initially empty database files\n" +" --oss-fuzz Enable OSS-FUZZ testing\n" +" --prng-seed N Seed value for the PRGN inside of SQLite\n" " --rebuild Rebuild and vacuum the database file\n" " --result-trace Show the results of each SQL command\n" " --sqlid N Use only SQL where sqlid=N\n" @@ -832,9 +845,13 @@ int main(int argc, char **argv){ int sqlFuzz = 0; /* True for SQL fuzz testing. False for DB fuzz */ int iTimeout = 120; /* Default 120-second timeout */ int nMem = 0; /* Memory limit */ + int nMemThisDb = 0; /* Memory limit set by the CONFIG table */ char *zExpDb = 0; /* Write Databases to files in this directory */ char *zExpSql = 0; /* Write SQL to files in this directory */ void *pHeap = 0; /* Heap for use by SQLite */ + int ossFuzz = 0; /* enable OSS-FUZZ testing */ + int ossFuzzThisDb = 0; /* ossFuzz value for this particular database */ + sqlite3_vfs *pDfltVfs; /* The default VFS */ iBegin = timeOfDay(); #ifdef __unix__ @@ -842,6 +859,8 @@ int main(int argc, char **argv){ #endif g.zArgv0 = argv[0]; zFailCode = getenv("TEST_FAILURE"); + pDfltVfs = sqlite3_vfs_find(0); + inmemVfsRegister(1); for(i=1; i=argc-1 ) fatalError("missing arguments on %s", argv[i]); + g.uRandom = atoi(argv[++i]); + }else if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){ quietFlag = 1; verboseFlag = 0; @@ -945,7 +971,8 @@ int main(int argc, char **argv){ /* Process each source database separately */ for(iSrcDb=0; iSrcDbzName); if( rc ){ fatalError("cannot open source database %s - %s", azSrcDb[iSrcDb], sqlite3_errmsg(db)); @@ -971,6 +998,34 @@ int main(int argc, char **argv){ sqlite3_free(zSql); if( rc ) fatalError("cannot change description: %s", sqlite3_errmsg(db)); } + ossFuzzThisDb = ossFuzz; + + /* If the CONFIG(name,value) table exists, read db-specific settings + ** from that table */ + if( sqlite3_table_column_metadata(db,0,"config",0,0,0,0,0,0)==SQLITE_OK ){ + rc = sqlite3_prepare_v2(db, "SELECT name, value FROM config", -1, &pStmt, 0); + if( rc ) fatalError("cannot prepare query of CONFIG table: %s", + sqlite3_errmsg(db)); + while( SQLITE_ROW==sqlite3_step(pStmt) ){ + const char *zName = (const char *)sqlite3_column_text(pStmt,0); + if( zName==0 ) continue; + if( strcmp(zName, "oss-fuzz")==0 ){ + ossFuzzThisDb = sqlite3_column_int(pStmt,1); + if( verboseFlag ) printf("Config: oss-fuzz=%d\n", ossFuzzThisDb); + } + if( strcmp(zName, "limit-mem")==0 ){ +#if !defined(SQLITE_ENABLE_MEMSYS3) && !defined(SQLITE_ENABLE_MEMSYS5) + fatalError("the limit-mem option requires -DSQLITE_ENABLE_MEMSYS5" + " or _MEMSYS3"); +#else + nMemThisDb = sqlite3_column_int(pStmt,1); + if( verboseFlag ) printf("Config: limit-mem=%d\n", nMemThisDb); +#endif + } + } + sqlite3_finalize(pStmt); + } + if( zInsSql ){ sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0, readfileFunc, 0, 0); @@ -1086,19 +1141,17 @@ int main(int argc, char **argv){ } /* Limit available memory, if requested */ - if( nMem>0 ){ + if( nMemThisDb>0 ){ sqlite3_shutdown(); - pHeap = malloc(nMem); + pHeap = realloc(pHeap, nMemThisDb); if( pHeap==0 ){ fatalError("failed to allocate %d bytes of heap memory", nMem); } - sqlite3_config(SQLITE_CONFIG_HEAP, pHeap, nMem, 128); + sqlite3_config(SQLITE_CONFIG_HEAP, pHeap, nMemThisDb, 128); } - /* Register the in-memory virtual filesystem - */ + /* Reset the in-memory virtual filesystem */ formatVfs(); - inmemVfsRegister(); /* Run a test using each SQL script against each database. */ @@ -1123,25 +1176,37 @@ int main(int argc, char **argv){ } } createVFile("main.db", pDb->sz, pDb->a); - openFlags = SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE; - if( nativeFlag && pDb->sz==0 ){ - openFlags |= SQLITE_OPEN_MEMORY; - zVfs = 0; - } - rc = sqlite3_open_v2("main.db", &db, openFlags, zVfs); - if( rc ) fatalError("cannot open inmem database"); - if( cellSzCkFlag ) runSql(db, "PRAGMA cell_size_check=ON", runFlags); - setAlarm(iTimeout); + sqlite3_randomness(0,0); + if( ossFuzzThisDb ){ +#ifndef SQLITE_OSS_FUZZ + fatalError("--oss-fuzz not supported: recompile with -DSQLITE_OSS_FUZZ"); +#else + extern int LLVMFuzzerTestOneInput(const uint8_t*, size_t); + LLVMFuzzerTestOneInput((const uint8_t*)pSql->a, (size_t)pSql->sz); +#endif + }else{ + openFlags = SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE; + if( nativeFlag && pDb->sz==0 ){ + openFlags |= SQLITE_OPEN_MEMORY; + zVfs = 0; + } + rc = sqlite3_open_v2("main.db", &db, openFlags, zVfs); + if( rc ) fatalError("cannot open inmem database"); + sqlite3_limit(db, SQLITE_LIMIT_LENGTH, 100000000); + sqlite3_limit(db, SQLITE_LIMIT_LIKE_PATTERN_LENGTH, 50); + if( cellSzCkFlag ) runSql(db, "PRAGMA cell_size_check=ON", runFlags); + setAlarm(iTimeout); #ifndef SQLITE_OMIT_PROGRESS_CALLBACK - if( sqlFuzz || vdbeLimitFlag ){ - sqlite3_progress_handler(db, 100000, progressHandler, &vdbeLimitFlag); - } + if( sqlFuzz || vdbeLimitFlag ){ + sqlite3_progress_handler(db, 100000, progressHandler, &vdbeLimitFlag); + } #endif - do{ - runSql(db, (char*)pSql->a, runFlags); - }while( timeoutTest ); - setAlarm(0); - sqlite3_close(db); + do{ + runSql(db, (char*)pSql->a, runFlags); + }while( timeoutTest ); + setAlarm(0); + sqlite3_close(db); + } if( sqlite3_memory_used()>0 ) fatalError("memory leak"); reformatVfs(); nTest++; diff --git a/sqlite/test/fuzzdata5.db b/sqlite/test/fuzzdata5.db new file mode 100644 index 0000000000000000000000000000000000000000..4645b1921b32d1b4a8255c69904eb968a023ca77 GIT binary patch literal 6964224 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 ^}wD# zfD*#C8mB9xRoJh;ym=dt;=f5uNO3yLmL;HcN%II$GK~@jH})6|6x{FbZXN~-8-+m< zdm^?Ge?U)kt^reeOqo&qCCL=Vp}oyR(8A^xS_sd?pHdsS_j%2O@NP=2rB+}nQDHq7 zIxQrXp$NE8U0;YZc>e!y|D`r0sKUU2pbTO@Jgvj{uZ@k>M%O;6RuoJ7X`tobXD7?; zb-5)?g#l&A^>lgr*Gz z&C0aYG#n3f_%WGITW6e>=j%8$zRav5cK*g`Uf3G_oOC`Q2N?lBH0BXm1;HhE0*QR9 z-&$e~@fB}zadFG0nH@XezV(Ihf6ds~%w<1>%*Dl@!vEPVgX_r&DWhKb!lzcQTpT0U z@v6k)IvoEO&`yN^GTPq#lIGDe`q(85MI34F8Ia>m9|D7siQ+I6NeiAxT9;0zn{Ir{ zJ{C+TiB5QlULBht_J0c7yl4j;b()#G^>vpW=b=6AMpTq$JBKB?-S8R5!7A2FRvNd~ zVNFVADPefpf3@4iDoLFqD(b z;s<7dhok`)H!rK82se~*FX{aMJcQuSw7uoZ=6o5w-}z5T(9%i9QsK0@e(;=dBB!=< zA{&@fxFtx<3GeT$V%)UMF;z;D!zBGbHg|M>_t7JF9@sy~^{1tNaw=4iS~=+O z{kMPp*I$0ycfR+3cr}#^U8QykWkd6LS$M8KouXs=KN;PMO52K06;~Dhws0rbo|K;YhuUZITck9M*lgCmw0$`zeAvsE}6%E_fe zg>0IjB(Sf)_eKw5(@NjVdZE(H9o^;x6ypjiig!_Nk z=F{nMzC8mFb8mnMinY=%OP-L_!|J4MEUMhFhVwBrXf59cqAXeMYH%J^tN-ku#Q%k_ zpyFp>=eC|k;BBw)%4PJc{3{^69rBnRC9GTj(;F}JN^nn~fA^+e`x^KqCBb`apB2i%X$Eb$*diSQAcO?yLs2}DF`G;vQzez45v3+RO;bBfouKIiwV`OwfZ}(M z^{#yZ7as6vQP2y6y}7}d>e?0

    _WK^yG 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ΦLzMjmbg#+270%@f{Iy0BZ=wa)){P4G4Y;1|Z83m?cg|XF# z^{ULpGU{fP)fdF?ADf;TpPCGXQRAGPxd;sB`LqP@feRd3PGK3|;n4MtjsCPr*6NY{ ze?jyMB(DgZFFga1vmwk~l(`CM-%M%G@tBjAG3N=ij>_rQ7v-W!omp@hstF7%^GN26 zz_iRmDK%D+SX@U!RYZp7=N`;l8AK=8>#~COi8B6?fetoAa7#A8AU6w5);eZIQp7z5 z3ep;jnfq=~!gEJ5S3uv{(GGTfx1w!Kv36mh2%Jk&#aqX*{XY*~jpR!M-O{8KM*oCf zK>Hv;4LzB4HhT0&^MbyTB%pSyfzx_2Yi)qcdk4~;xdwo+9ma+MqL_S$MzmiuCaFvV z_fn=2gfcsJ@X+p=*{SKV-TTI;$M!<(C}AD7Gd-C#wwbUq z!N{woI}`2bZ6iF}cd~PHw`8t{E;ZIvmt0lh{>+=8Q|v>y239fAO}%}g;(-nj`Grvu zytJ(k94;iZIavPBN4t^yY59J+Bk+sBM+5f-)=PgYy+!JVYLdz{J(=|mK)MIJ`)|8FjVqW(mLC)>|Mgh@ zcgpd=j|0C8C;zOJ{*QD&oCfw2lv%U}=*ev2ah#nVKNwQrNQjU!x?#`gM5HAa-mFI3 zaP&pxhM{c(Au0!P9KxeLnXbZsSfCRio%TQ&E-xxLYJ*F7G@VHSkku4FV|UCz02JvH zfk-BUJ6KI+_z-meG_1`HPZ%g*gNsFQ?sKJFi)@V8yraw z4dVmfG|?Kp{{T*}x8~3~TQdo7pz0gyM;q{z*3t+Zi9n{hTQhMRPzsy^Fw)oE-+vof zTmVpwVo($-B@>g;jkFh(Z&a|5hp$thQdfFy=0X(fW^;j%Hx6me~TmU@snuf#`})sO^4F z?*WMw){SGCUUxdWV6Z3zdNMsWbPPQnNkk$k62eXROb%23H6p@KPo~=r2s~j+cEn>H ziBwVuL^T;0)JW!f0Mbh3lpBmt#4{!YC-s5{0ywHCbDaP;qeXMHBC18(>=B5{{zg95 z`q-1X)(a42?>(cF#I|lA(F0>Mq3{huDv(hu{}-bfB)=rTSH4$nljXqQ2mUhfvB28{ z`vS?pRnpI;uS=hhrll165A?sF;Nrt|nKuL8Mkx`^UZQQ{Ne$||E(6DDIzoW6JK-O# z-+@=2qp4^#8jHumD2yTCBWRs)pb!$|ctUn4Xd8ef5R#eOWHe*oF4hT`rr}I-OVg2f zM=FwNOC_WDL2)FOil*SivjjXuhBb2|`h8bqc5%np5XO$i+FPQr6!h#(nVmA~HR9EB zefoy<&`^3y6bghgJGhhW)Y>i9Ll`@t=%twv8L?AKwW1hCb7q)33ro$g7w7evAsG!D zP>Qs`v+-0srau;M1F&l{x5$VcI6%NcL1URWWVXww-2^Pw)=tpfW=0pE6Nmb)%nZut zT2q}?V25^`yD>8$qcKA+JibY^CEzKJXi|;(VwryKEJA`OsR6a@D}^&Rb7zfdm4NU- z1jFfUH zmK#C-zZ`fzFdArb#&mQu22Tfy<{g&9u8*^!JyQ%P_F+S`&bK`l54)7TcP z)scv`$2;0n5lgK#893eAsCD8kkz{-bfn-RucRlGiYDU8NJlc2(tNR+@QG?coJ!0*Z%BVBy$nwz zKLx9he=Plh^!w5Wr1whil%A3vmySsf!ph`?v|qkn?vxYq200`*$ZwP{l`oW6%0c*+ z!LI^85BxOn4}rgtKP25P-7bwtgVI*12fk^Nlp<1-v{rhP^aknmQoXACR%i1qK#5Eq z?pM#}F;#v)Hv!iV+`uSaD8vC z7p^CBJ#c+C*A3VGIR&o!a#zB2Z|-uq?#W#S*U{W1aJ@VCI=J4IyAZCo=T^gYXKoc- zM{*dG;oM5N-jaoV*{cV#um-#OrtD$3Zp|Ko>z3@jaP7^G!?h=i@$AmR&W+XAXYYjT zb=lkDx;eWYuA8#k;M$dia~@Z>Wv_#4EPE|nquEVxjb!0z&+67}60XhJI9waEQMg{6 z-3Zsqvm4-gVYU^ntFujTU6l>NwLaSj*YmU2z_l(5R%G>x?3>_vZuSbeo|An8T!Yz* z;VNf=*;WTKN8pMwfcdKb%uK=c7a7>GuSH*MG@uh3n5UfZM8n z&P3q)PZ{_!)vBLnu7d0TmjN2C`oEdi!}W(5pxCOv%>b=d{Y?gFwd%D@9bA8qk)f@( z<#12mn!~+&GS>mu$8)%kzm;o)>ti|G(}!}nrw`_EPanwPp5C9sJ)O+8!1Z7b_je+P z`+IK=a9BN_!~MM{*8tZ8xi!$%U(dt$^HzO-eiW|Xn+KY&Ix`O(vg-8wPPqQn{0_K& zZGHrsRJ)f$Nv&VO&=I#r!t7zA_J7wCd&go8kKZ&ff&r&&|X9eDzbg>mmNJ z`5WQ-!h9O8*?HixRUe!O9$WSPdEl{C@0kZ4TlKDa=;^Ab<~PIjiFp{=Rde&0dWYxX zq2#Iq^X+imJD-5-p7|JDN9Uo}tA2$Qmm#qEvOiCE^7!aNM59`W+9>Nv#QBW6jIyP( zy5Oc1>~MIWQPWOUvmcA8TeP#rDi%z{N_uT&a|W>8TUhY8V&|Q09<3VLVB=e4go&;> zQs7EV5wvqtD>_C>tM;vrlB$&=DaNYl_?cqWMY@v979&9M5fj1m+X6}FZT$~Di11$} z!+RghOa;*&(Pw!6!h#oGscIADFD%&liqseuqR>mOm8{GIzW;x~|6kXa&T3d2(N&ig zV=k~ixv*sz$e=vqPcBrxF|tjWy{QTaU#a9`VZp>jlyST%8<7A1#;7pzE}q_EmoVH;&}@Z<8GV z`5zHTDu$|bdLv!Q7yB&oRCt2UW~NwyT<7um-!~D0zhx6Xd4A?l5dD;%73)7-^umBu z{piMjxM=b>^xNW99{B$Mg=O9YcQEECxw2%C`AtavGOj+p4zXf}-j^g>f)+#0^2tN_ zAX7=hgt!3Y{~UBFk^<Jn!>+CAp>#uM!}^AX zriQtOZ9@$WkPeOtF4LZw)nCnbu4<~eF*Bo|!w^!gry%KD^fCC3PiyCwe@@ctpMmyz zGSl$>Gd;8?q@CGT7j1!d>wfvmPoCPkZAaaXK{#Nrjs^AbDJT;S;}R{=w@+sd2hsb- zwPwogEL8uS%AOx8nFOgA@$t2hiHQ1bG2|>vXTZA!5|;l9(G-F=eV&6e0Iz_zW%7X| zfu6vH(rM{^@XkyK{Sn&7K1iOAm(&b;83&U86K82gtDzAevaGu>V-yg#H@} z!XFw?P+voOTVL14Y>-nISe`E+8i=Y3CEC*37>|xNl23SIb&<--`tiS@%~S<56Iu&8 z0pH=X>EKssY>lh6)IJkc)0Pd$=&%Nxt4mw6uP3?GiwN6GWswk9+@2e*smx=7x;FaT zqJ)o`s0xGwz0Udx$MG1Ia3u4nj1HJ7W2u1$8bA?ZZp=L5r4e<2G)@07ujw%bOn3>7 zFlyH+OMoXQ6Uu>B{0X_+MC|a4m8v|n94lpTGxa>YjgCn~~`UcX&Bi#erSv@5ZQBRsoCL@vNW>IZxWo7Tw=)~B}Uh-*Qd%Q%zw1!!; zNP_dJ;9P*zdia7}lA#5WUY2@%Gz(wnd4isP%NJsChqhRmX4We1tWB%lC>3c309KSO zmAz2P8FhxU7fR_}1^T%ogGat=w2Opz_ENKsU?$Yw_{FpEwIX`>8K;u4;qBB6o>jA8 z`431Bp}_m$;)e=S;P_Qp_~gvv^k@~HUp&Qie%{hIJkmGVI|9}8MC>9nIE-_Nv>CEk z8Dm5T9ka3#H3s~V+HwAmEeMg0Yg|PoqtPTWxQq?sjdb_MnmS`z4GO?c3#r86b504DR|j;r~D?%Y8q&InvY`Yav$_Y0=Y6IjAeUM*mEW zOI;maTbO+Ir0uDJEPOcmJy+9lQFYka;lY*7n8K>oN>%>fgaV(IeiwH8z{#zC&?#_T z7JsLeekKe)%i7%5e0t^9?wx&uH-ca*%DqP>#z!aNW38b`xNi_v_r~|$r)~@YdFhOv z9_Y-jm(jzNZHYRu1;7*m7C2lPw9z`R+UWG@G=6f7apW|XAWfi97N??0pyi6vM#sCe z@Ll;QRv3s&)iEX^1f8TRC8A>Lw6Ssq>OiWd$|-^ryjrX+WzhFg_^4T;tvwM-M&V0C zv3B^T68^{!d<`zuo=mmHu`R%X7!yN7s=a_l;Q2x-1)l@MpMvX1MI+I+WFm#XLj)f$ zYHNoNAGSx6@J&wu zZbQw0x)l_*X=WS-4I;t{i$oG!Iy!tk$7e_POpNWGfvx%nN3|*{PRh)YgP~a19w)9JCS(k78eIDZTK07(uF19p(OYiz zre<&hmX7+upwS)wlt~!orn1do`t~knn96AStP|wL%Rg}E>s7+qGkovX)3zcMU7QFh zqkCpxHynBC)+kA}DeUDSrAdjJ6`tB8zM6BYP8F7eIvA!s>#8k+0zaD=&B!o}1Og#D zeH!HdBCUk^$DXQ7q7cmJv3o~6p;XB=Nkr3m9AH;bW7wJ_9M0=tm4$Hz$ zSm>?T!`I4C*=UbM6VYf#Jdunfk}3R!`gk-6E47h$d$g^iBN2_XwZ}R{s+s^A(VJv3 z`?i6DAaDd^bwG=K-jL%;TF#-vBjW_w*k+-SPZn5R?~^HJPZzBq9TQt>n*fqqd#DaH z0r|h!OtC7Yi=hWKAq!-}vlNb#h&77m51%)>HG)!^TwZz-%x6Yis_YYs~s1{=WdQ^gBHu6h#W|1#UfJ%2i-4TEt- z#gXDrqY!2`OC^5{ z6l-2%mPxmgGFpa3B)4mVshzhKBET zi0aBc^>v-gg8N|DG;#X$uD+42ro@u(q$t4sR?#ERB53dZF{_C&6Ujf>|BK-0uZo}k z_3T604MFs~NA=AX1#U00$izvJWU(||9L*xud$Q=7W{ah^=BqtMb%+>cqYSFc^L{U1 zU(s)W^m8Uq5gWfv92IT)L0rHj_ zp2yZwvsgk4u%bzY8#&VJ;`>l&O`QmZqe?qz{?%c6a}rLP0T}OjaK;>b$LAJBI~~B% zQGj+!$7N|e5{ienannm%@h(zl=^)Lq49NeRxWuBynyb%8E$I7FRErd#LuwgL->*07 zNlGaF*Fv)D8-M)#4?o&tn&qU9z8(`M>e+lh^;8<;b6X5++aA|~bO1KCL@!XJiq!$w zv_Si!{p#gS8Qd*j#!I(Pa&-k!9-K9s&-K!n4neD_16Vo=P^5HRe0xo4BK$3kP?pkI z=+*WA-3Y;78N!R_WH$!U57-&~1;0aF^y+cpY+RJwkZ~!hral~nqblSENYr6^Q-mk& z0IBIbIBQ8hw`M6oyJhK2g}ob!hqrOlOIz_~mfUq+1AKot|9|xw46U#M)Z6##>9pWu zK3#Zf=y9JeIxYCvQqcwEzrow-96Gj3g{zOJJ_b1EkAsmO^vG{MeY>8q zxZzGz*HFOb#;+$Pj87MzF778{=`<=AzkvL&)mt&f%GIW^75&a{Pp1VR^XbA(AQql!K^Q(q=h)xY-Y$<8u(?uT(e;jmL@UdE_3pxK^+J&T-;o^r-?|x zL>ybr{R7TX;6MJvmNGGZ-`K=aIEvfxfPd{pZ;z$L6y;M59BAQe7rYi#nP5>scfQA? z&En!zmMx43(RQS|5R4&F2$Pf$b304+g{pt zg(6hmR!RY#Vk-C*cMs&h2^V%~+#$={OcAs#1#~kS+`YKhxPZ5Y#ij7qa0?ELLS<2v z3990r2zwzOMscbT08132?JGMwW9w~%1Ta^`~E{bCyycV4LM#OMJNX}d{`n@Y&ZTgqt5o~@y1(*lRF zDQfP34o^eP4SGa_Zfu@>PRXt6QXt0B1u(~f9LQCwS*Qm%Wd0wx5(S=uiywRn=oEPC zZP|Dby{lbcR5&y}-UXp2ePiDsjuae*w)OY-bobs&Dso`J3vD?*osGfgyvHlhoCt3L zYJwzDO-S=zQdrh=bwNQx5=Bp(nC_$6nYjE!_u}EEwfJ8H1a+hYNqh}1?!9E0$-%K0 zhaQUx@DwDm;){qB0#;B~kYt05_mVYC`Z9O2%;5Qv6Er1A;%n$}LqVKuNg#=KQm-m{ zZ2x6+7)hUz8sMk=;ce@($sl@eTUDxgv!VmLwDE1LvTcCyn(9IrFx&9>_1Q!az3rUp z!c1h}b*7~;1Fx1*O$*vFB)K^=hQem{fX+CgE~rfVZ}}CJ6(m`zkpx3QoMK5JiFTSm z8!>Oavw*HX3J5ylJWeKp3F3+=Gua?f+TY-?cRII8YX?2J6UG%{KyHK5+w08^thoQPPQbF zM3MXx|6giF@@0Vy@Z$$33d}v4O~Lo!A6uluZ5W+0ssKSdh9t^B;zSX*%#CF`fB=h~ zycrrSBLPSU4UMrb>%B8Qf>3XvqwN*$C`FC?HK6W7CwHM2c2t%BpP;}Q>DSUvoS5Iw zt7!_X&Tf*?I;OccH7Dlo$aVpbcd;~h+NM8nGjNOk<($^$-W@|j>A{iRTe?TmP+WnB z0+X}*Ly?wf__SWG#Zt~wL1q8c^w{`;$=&yj9o@b6p0U06F+4Kpw~!5fxcw+@Uk?Wc zjyGgGgXr--);){>7A{vo;v~={RrXcAi>jccAjyCOyAc#LB+-K6L|y0U>;G8(CG^h- z|1JOUmQ~qngXkHymKRr=6Gomg2!I0YePCj0Pbk(xpPT@Paj8+fcT&w_spL8H!he&e zxmYOF67-j^FD{9Bm_0`4i^mu+NKN;SG}kWnxQ{#?tBtxYgGtb@dHiuN24EdIfg@#S zSlmd>lZ^32i4_9T1Pr)0z3?~RWXg$CF1}t^SSX*?^)N&=#^l)MgQ?Oyf*>ikl+M_rP>22-w^t8F1GaIRPUqay`(oLUQ#Bh6q9383}F91 zfUZZ<_u*1Rc>2QZbwTuAHnFU z^A7Mx9E-fiDXcfuiA(u@zV1&MOp|Z_#fn*+Y9O7XRrFrc8xx;B_8)XW2N77)Iv9Cn zf*Tg2P;>MqlLWXJgr3XC1n2bum&K@z*KYN;*peElYFpc-Vav*1C3-|Lw(D^<;%poR zY76w9*bV?x}ck;rP&teYm93q=T*8f+a6q2UUzoNfHe~jLV#^BaHgtIru=r(O>xii|N zDAQ9%CilTUtQZ&XjD^FfFO*HoXqQ`AQuNB~78zYDEDC_G%=X&kMj^K$+asf!MRi+a z(T?_51Q&WZ+Z{x64{N2G6Bgg)M$E3ty+;wduQLEd(DB& z(d_j>^y&k&dFztAX_>;%l3_SKYahZeSOB*vZjWL^e#J$c+6Ldh9Y6o8lfH`NFUl{-_s9)_e-3;q@Ic@ONb*DNQQ)oj zWw*hZ9d}SAn8aZdxh7*x5eUiTX84C=5EAeoGI0tC@MF5y%F|r<1i3P9dgKuW_=@sW0+?#? zY^EVuQXH+!T#i<1ff5EBF93`6X)XFO%0puDVIX@uxI0%<#W1j4_u)2eB5~~}m7)>s(@h;Yw0rN= zGUX_VAqHPna> zhh;!nh^zJVh_IjrHoJrGwALhrN6P3I43WF*$&MI0tyk6&;EEe7(@v+d!(s&NV05VL zKzJfMWT+d75U86uByHP2zCL>ky!&?xrS@_#Ok(@3>KX4|nbDzA;q05a#cRX(vd&R!G=M8fscL^ zlA^FQm`bVp|6fGXchQSAApD@%ck_zfFc?cDnv}B$neh#csB~u|uMap^gUcoP^q&5T z_{FU{Ve!YW$=(%2Z)J}|s)16NAl0bEFhL6#G>-o2n5hG;k1y_~Caii{J*H+C(jo&# zvE;z3jnf2S)8gucO|bl*hmN4YI|DZd&XxWj=?SS5{R|Sy86LUfu8OjCgnjt4!~;hOz*aSs65y;vo*UPTE4`f z%Yk$W+@eZCMo1PRIkd#4O);(P*6dhGK;d??`*>HE*nrK12pSR$7Z#!Drh2k_4Su?2 zK!CecbqEEG(-Rf0F|8-NM+AiQ^jeUOF;aNIsnmNVL>C(rpbpHyWfIsZ2YNOm^)|CJ9|OrM!T{ z%&m$+R~N3P2Gwc!!smB3$_R43w3$pIG9v;+i2axQko-7Y{NPi-r$BKO=*W)Ci0dYB6f&LC|8#!}^T+W>7I-0!)6ep`IG>24~r^q4~)dOsys}rjm z2rL2LINQTcVi48!|Em##KS6l%&g{Lg!han#m<9FAuY^Y#2G}QrPl#&_B3~68u@8>6 zg54W8xTvS9z!h&4zecD%ee`_cszTwa5rzf%zmcF?ed?)3DCkqqSIur7e)ZZY?DP9R zDnA>m-m&t>$sZ?m8KHE>8qfdFmA-=Hm4UwrygjfrAj6FxYLo)8>>(N5$26F?<)@zP z6u)jiq}FOa<`$IMsoBv9ct7e`Oxf3yoh%ZF{&L#B?b(9>gq|hW>4=HiI-C(cI(cAh zCKOh&1x!Yd&J1>s>=^3q$4f7b*$El#Fj8a_?psVz_Kv~{OcZ|9XuT<%!O7OFhS7$WhCK~u&Lo7{ z42Xwvi)%qSgX_a6s+%+v)?m?i+u(z{#DI6$_S&X4tLaQHZ@po_;$=cZ@2EYx&{1V( zc6$Hp_`$IdW)b|BDMupvnwXNV9o1Rx%o(5B^#*DKrHiEY4B5#)r*Lu48ReZ;evo4{b!(}GY?S9;-m0)WY&J)a9( z;D}>i6Sv?@WDtCY-eTlvUvtUDa+}Uwq#5-6ON6#GJf1f%hUSODqFSO3iMt zs-8hEu+0}Z_7$U!NXam)?Nv3#uPRNWqr%mAuoV6K`d@t^_HPg{A=Kajstv#6`mDB# z>38X$HCw~Z<7hE799_n3L)La!O=qUjJ8EC9L_)iWVQJ~q$hL-(5C2*i{+HV98>qpT z?}CW2#*x`~P6WuXGn&mVbDDe|9E_USuzZsWX|fOl82c z8hp>|v(rKJkuY89DPwcmFf%dmeIDQEaq)S8LvM!v+bY63j4|!?F2Tb?xf1E;+Mifx z1E>AiSa(LyA~iyb3f=|`OZJDAjs_!%iQqIJe%*$uB*gUOT7&#==Mdwf7H@;D^<&?w zDF4f**SJkavs!RJ-MSx(M53+ak0YlRWgT@HVjEg{tX{oi=RYdac|s^hI9nh5vXcwD z{I1XMoY|?IEAgCWa1j^}lA)7T9|MSasENxv6QPKec#rLJ+)x#0+u?(eV_hn{8mGp{ znJd_ssgz^r+1Il2h;eRBhk!w*USvUYae!i-iZ99R8_)mGN9`!EGmw(LBz;(#m2Q-- zL_b6yL5CpOE+n(Z^z#O}jUvkE{RcvkaFg<)a>LNJfsi)wRmhV{<;Cy~?b%0VbVN%Q zRXk=_vn~6Gj1Jq@v~4k&eb@MbB(WLvB+i zF7qRN!C_M;`N0?GY+)`qjYC&tkI0C<*~FlMV+eSiSf8B@qPG;d%%VS)CVNUs?Pq$B zej?o-%2~C9*P6JTMR#b*Oy3EG;S-4U_0B7RR1J#Cn->59pjhd^h^ay23R_+gGJ~qrg&9izz3L=8lR>Sgyz( zh^Pdn?_5zjmj9zNy!^C0B(Epu zf4@uWl`ca+LZ=|3^r0=cQZ?igaGVk|shS@JMsu(wif!S@Q1>95;xW><4JUw&ZOhep ztcL;U^`g1+)I*m{N-Ht+^x9g?Qi3MvCC!y-33Iw$gD;V6PPVVloum6Z;7QqdXR$k@xuAZQH|I&} zQLFdamXn1(q*{mZqUJ*BUTZiPpzP2)qBj6BYa7X&Wbbcoi-v98!ekEFS9J0xQ`yJ# z<6}7Ns55>{QS8WggZljM!$|rL`f%w*y#x@C$8+^?;@5qOdi2T0rlyVR|2&T5^?Q8c z0SyX02SK4JU3T?dfnW#^!+$#fJVGPsf$g|_7hq;W5AI10y|`m01T4U!w|ls^drMj; z3&!H{wYl@*_^$y$dDkANyNX1P_N`ioRX%*|m{HM3L2n$#bdKa=n0Z|X$ig^wZF7QQ z;KMr&Vxo*s&W;_Jrh z#4|-a7o<%TT*1Ihaj}vthM6cr0;Q%g)A%fPXpipRyKTovdWhE1X-JM>8>B?l)wZT5 z^$JOR(3>USIC5^f)kQ?g%40_LY9=`CCn3adTsz8&Gj_D2%&Juc7>ILISb@t%tceJn zbYhJ+ZJeFiILp!jx@!MFgQO3k&tP3pOW|E3xm7_l-&(MwSSvJ(N6lJLCnhB>H$<+3 zMBD;H1t-G*%WS)z8OdD`M8Cak`$*2Sv*T$ixx5UB!T1@+)nxo|rr9lXQ60E~djsRM zpa}07+j}1yYYlOHZ`TJ})-KXf*V+i5Yl#DY?STKc`eQ)&04~f$uhaYS;YrWwZ3CM-#|5D%u1b=?;DNwx>cL7a0 zm0mQ2K|5J1ROMpN;wM-}Rp`7 zU!Ir{l}Vngix?K61g&UZL~{_X%Ii?<@Yyf%EwVd{w7q6(7!+K^7g?9VVEY5D8BeRn z%e=Vi+sUBe>>`Vcc>XV;zeM=2*24#t+=W5(nY0U~ya=*CMJ(#cIQ31{-^wntJDAl) z+96`XEC1NvVD7++(9kfu69$@lVSPp@@cr+=GGF4dkFsgP<<45W=HOIu>G$T4?=yH#&>Cqz603*-T3)m5I*-UeMfp#`c#>} z`%UHRcz5m+cw=sbrqaN+(^C|>M@G7Pw<^6un>WMDlH-%g-J`Q(A@!W|rhQ`%?jE1q zkCXRVlcyf(-PJd;74I`292jk=um6qq26cZQ{swq^yuGzOS>FPQ2^{n`S+#+|(XzDF z)X~+|lfJQU5WnC_qoCFCi=yy@KT@tJ-6I!c@bTuPkeeNReHU;nhyx!CMKh&ygR))G++)_a`C=QC906m8VHdd>!YSz^O zcOqG_&>P3GYMl$I`~TmG0Z(JbLBCy}3(+ z=*ip8&JiH?qg;ld3P+pBzw})c_%2-huzV;m_ek#YAUg4=Rg8Im$KocnMzQyyxk=4- zZjy5~@UHAsQ|~tW9L)>D9uIYRgdS3dClBfPHMuvyd*e4RLH~hlMN+QFYK{cw$SQCo zRrv?M^9$1Q;r#-7^0rj&${>2~fyJ3|I#B@Y#bfQs_Qj}(STxa|=!hp19hGdgc&UtvCyUNnuz;>b2r(H|+U<3ueGVt) zV(lrONMcdJGff)Q$+E!;cwoZCuy?rxV=*|<V-BWCv|86{UZjJ0 z*|r@6gEotMcEzn+0Fnz-B0*Q`iw6#1sU`@Mg&($3w>ft;eA8C2o?+50#??yZf+rGl z&AB%P(eXPRC@5t2j}gYWmUeg%mP1>abnv@7>00KQGl1?@#iQF&adaQay|LJ7Qp$r5 z#8#mhf55O5QjxNiQOwC`mSUQO(lWz*s}jER>DMW+fz4G10#&dR?vKOK8kdS!Y)AwA&@yz)w{6 zC4`?uOZW*ik$>qH1b==g1qGgH&Rr8kPdT~k6_QTljG|iEdkNK7Z4k&sz+JMv$bSG` zfY1NE06l$OZe0*PFFQ;%Yk_y$bjz;I>}$pd!DyOnqpt1^zKJ^QV$%zc1nz_VKWn-D zKg(Ro67i1q4t>;X(VvLx=$DsijS2&syoT~NSbE;8tStkAsdDC7I2UDD&UWqPbK{6& z1|C!+9J9J zW%F~GO#jI8BnYT$dH}$ew-j%!R6B99p4^&9z#g2YL@bp^CEMeXINdP}V?(3xh(WkD z#%A+y*#Mh%B_BUG*9d!VURSoUw2V!mLs=Oh3Z;aZF`X>44G%l>vS|G; zASF;B0T(}bq5y2IYjSyJB%CJ2+uPmWKv*=3^BeepMeLsY6{0^(Vh$=hTxpf9wE7C) z``aR}YK}dg#_N9p>BlIr3od?GwiNh-P_8A2zP6)KgXFHWEUFHcAEr*M%QeGm90l7y z_vS>8N332z0d}*1qSUm~Uz=w&@Tk7Uijrd`Yw^;fMOXic8UY1BoJbg~L-2N7Yf*%^ zVof_qe`||Eb^~{*`dXn4>%}|b?U9an!kvT`Q7M}8c!r4mKRb-I7a?shHhGSvXEi&t zs+W-5t2vb;M=_%W3jw8LqxyP~|HI}<2NhoW>kILS(!hvOI_jH**g6c=D=u~dUJOSI zAI_Lm6s11>Es!Ovmyk=XcR>E9&9BN^&AO%%ORRgW46m|Jk%R2>9>+|MH1wSZGs_p} z|563c(Y?Bz2dk!@xMDQ@Mx*#2+g9&i9Y5V(!cEpUqs0@scsX7%(C zNB7?lSL7KkZjIVLG;l-(rdD`Cj`o1#6vt|$!)w&nZ>@u-kwXB?5h%r^)B|Q?tA$Ks zMZH*#vEQd@M{nN?uyPDu@G|TXf&pSryG;XIu8}G=KSCF9@D)g{C=hkL`~gd71JXzux!{xo9oTVmm^f5b1Gu?2k`Eoc>c^${~rXx1e8)U427p=zh*#jdij zlC>>O%lLB*AcR;m+Y`EaEu5WA_9tytn=Br6TS-}ze~48DRx?6#xwNQ>(DGdc2Z1>o z<{Bzf_^v{!Tm|+0zoQ7jUq!=vAIP-^(H}XTSySXndy&-y&&q(=mfjIslzJEGP-~xj zx50d+qI~avOu_ndU-SBH7j!cRe;7Htj+%teYC&=khwGqjm>= zZKwaxlII5@ssmGLTxc)IijVPi6+j-lRF%faY3-@fxEQEoUVCd*&jL&ovl-uTihKgz z9O-CFCgQ33pE(>Pk7ZteZ^nt|>^)(pS^`cr^j~kAB^z~_wubDwyH^;XuPD_1@p^oq12tAMGDsRqOrT`zO-O4yFaw1tEM+Ja;M!lqT=d&|fkqv-VQ_dV}x(yAa!Lq9v5V z0{F2c0_!jh_v-)0@EIU`2CLy9o*vE}xR@bL~`C91L2qVtBUkK{>e?8@w`V9?kVDXAcU; z{_M~m)kSmqL< z6+ofPSlgmh+t{CNiojw2Z#m>&-T(hj2*Ka756`a1C4=Y#{=Bz*Q_W?e@2g4Ylu>)b zQqT$b{}!0F>d*hpYaY7yQj4xz8L3wRugQrITfOdx($+Bemy;^C%)Wfd4TM1ai1VB-`M=r(^Ev@PF`2HVx{)g6~ zz%_8O3nw1Rb-)K-j{47w%JzuH_>A0f@!Vml$!-8ydNE5x?;gmt2T}fNfAq^e`Zo5W zQ0r)P=Ivb+@co}4^Z$SZ-vDAf;z!OV3Y>U2mjd1XurJ+ZlkN#JRirwd{t6#$fNsCH zg?KeZ@L(~@9n1f@=y4=HByEvap>Lq~!cB$4>fCiQTBkGMt?5*5vy80n#xH;Q$x~am z?Wo%^*tc!4uCA`TzaOr3svlaHif(9$c6Ft4*NW@nQ7}U=)s5#i$>^Yt3H5M$7ewz- zb+p3=JD;wvkLS7ys8#=TdrJol@e_euXAnJACuoh%`~AHOnu9Og5M=wd8ovXCl2SB& z8gP392?dO{RD_57yR%Cm|KLeLk3F3KLF_-e8sR@dc=FEN^+EKG>ll;5QNw&3A3bac z#!Ta#p&-2x6;ZYib>BG9tvoO~v3vB$?9|?S#`fNKXli_N_S)Cf@O}7Mpdh-$<&WBy zS1XEIW*|jH3a+35DM@eadoMy&@5i(?+e1H~(xp4Qdw1*@&>=z0wkFBAR{dy#Hbm@a ztwN)F7H-z+Lmdbl_S{%Uuv@d9J2jua8AZHoG%KXid=&3NaTU-nGN6 zKYE*MXjBLYGATy1oHYR#s)(ZY(hxzD;_O02?DMnoEQ0+$mx_k6DuBEMSIja-HX z7KaQ5<&hqGt8V<`%LAd6PB4@7)TTVJ?yyLCWx+VV>SC%$l^=cMyH@a-LoJxPg7~jV05PfD5^qkJ|Fd zbt2HtiYy+@(@QUk5a9bi4gcRs!B(J29&=-yBEhG+4l*fBYl_e}a}zDgx1z^st_Tv% z(@QUk_B$l}am$u@o0JdCiQmXo(f&9OV zA38%^FQz9~W^B3kv}I@!Qx}C_ZE=MwxofLC{8p*pP=*v*iHfB+oDh~aBVz=dkteI$LO{qoE>LW&hbdX>hM(#1?p z)klkq!yFT#U>cNEc=YzkfY3`73685P1oHoGinrjG(wEP2l^s%;)-3NB(^d+?Z#kMw zGb<9poMp_;F#%gg6Y4xDXki>n0xq=ttpr})F>Le@(Lp7wZz&9Ha^=h|;`1?@>ogFC@@J!_F{@}oG*<_VCz~4A zh`nq!BvZ>(%p(>j#-o%|c4C>QcjT8=Gb9>soQv?eie8aV)>CPW&*kGZpZ$t5MQNmh zZH6INB$;N0WbM-t(Gv_YzC}K6D1>ipGi@^n2%0Ox*{~XAYLM3BlSOHUM)<;doK_Q| zVBarVONYb9_*_2DmmzW6Oxp}YwW`6{7G2v6_kNJKm0<_4H#4r4Qs4i71G*vJ!%#rGH_^ z?P;a1OQ|#F!qid`SAe35#@W_-TXTIuGfCFyuc_~}zcral2hlqZ^KJ5Rjznsd zX1eP(T9SeQ|Nnhh{$*JF4}3>@^{jaYFt5a&H{3Dbq(yWwZa;KZ0V%h{~w^hYk@BZ-W7OAx(5Bg7Ff+?^yG%Y z_~9dV`gf#a@)D%o3sO%l-covW1;AVL`xKgWY^a8P`aVBVMD`6!+K?M+fYNpwse2@ zNW<#fHtry)^xzhB{Hoj_r~&=_8e2iAjH0kKulp93EK5Q;^duH(p-9l7@-yv}hEE|* zqJ1{0O*X;y{~YutB)x_XqMfJ{qFlHEV%~zTS~S zs;?=eFpn5e{PC-DBk-k9Z2y>yEg7yN)hRR8}BlI6e`15XF~0zq_! zQvfv_J-$A77r1`6P}WZ-ldYZo=`HC)Bcr`rarD~cwUDTW)7834Av2 zez@_&Sx$jDDYq|(j<291v8S2DF6bK!l`9(7gX&=RU7g!2qqGPG%?0h-oZACBM`A@n zd%}Qd6X1w{t{FYVBEwqN?ev&?W%SU(j)m2^QFXz9sGL2artl@XyJZxm5Ft4Xo@>*d zhPjd4Zcq}fG{;U!QfngA4T+Y;YXVJM3gLT6H0gdU|1#Q*q?PC^@KfsW)>Q5QJk4Ob zRUHr@{%{Bm@5ZB~;F#e?PcA41Yf2wZ<@R%CfHv0O-#r{U)QndEwWRLRP=EiSVbcC> zxP3@}Vmdb#L{E>?5yp)E+GcumE%&RQa?4#`YvOX%s9jx4L7Xt09(nD*)SR!99|64P zW?Doos9p`tg!mk%xc9a~T+n6^TndhAsWnF|TSD6mx-C6D5L4G|!k7xW)RHHL_u8NT z$w$8Z^FRFd2NnhnqcB<^n+1pn79?wa4NY-8=>CW1gq(l= z`NJV27-c8#pip1JKN(edzwa5{vJ7Tkc*N+4Y0zM*?Z|43(1flkWCcJCY8 zbL7D4+%cGyt?k_w8oZ&uuQxQZaYgP?Xm4$__ofxOM{o?%&dWV4qs!KWz!5($_Yg#t zM;=k`Tah~o`O4j+cb}VkP(~L)Y(?$?oOH+N=()N3anc=kuFM^g(Ur=rjp_83nK$HS zWz??VFU2TFCdcH~Y zx?n|qCB&M4(zfu#&G|Z*&|lfCZ6cXDvS(%%5N&~fVX*awrr`rY`$I}&7ZjMC9zPh0 zu8SzG(R6>hd3Zuk=zu^ze@reB$nG7v7nfa!i>;ZyXuK0w#Zd4k#v%|lL?e-A5|kr{ z4vk^zsJG3^!O;gX3gKp44vOK>Oqy*BD{2*%u4Su*)N8D*tsN9yYeU0kyq%`uz{IJk zJvge+eK9yy**`J0F1*m$)iunmQ#eG^{S5#T2l!cs!A|XIXy_Zpas6g$H!HvwYiezv zISo@7&8R6vbdY>m28^|)mxHDOCdYgn^3{(l!JB&Fk+$|kv@OApq8>L<3U0q`O(H2P z^5+3#hvf_B&dsj?GZt!UIyZkVj;w4tFMkdgz{cMIkyhn{GP7kd@?hXETOV5Un1bbBk#0fq-^*v@FUp^iKPtafenh@c9+h{*Yv zOX;f5hh=niTe^QZod)MCln=>hSA6@nq3)r7v=6r}EWEZN-w0d~1AaI+zaF?C_Ck1N zejPYL(Xj`^$~~dE75TNG&M%4%a)MUzXm_-~_2}ySHQ*CP(|9TU!^z}uZ}+Nv0}xP6 z(Gu2h2~ciTUV(%NMR+KEUjAxe@yM+YF7&U+zX`e?LDItI`Kw^d%EqR@`PR+M z9#rwdZ+`Z(XY2BBl+ooR@7Y!PD*+mbs|hReR{#izKYL#Oa)7%5WV>l){tZCC4e@w9 zvUYT3{xa=m?b^}0{G|X3av;7Ue+g9G5MMjGDt|FR-4KKF_&+Xo5fp1}{T}K<>+-Lc z(Jig5r#~P5%0qp9eG7d9a5aUGE&O^#{&fJZwe{mWSLQE-79oc1--Y?rz;&&yo6{rI zB%YUF1(>$Bc71&38}b)`hikCZv=o;A*P&mdz_$Wl3Vbf`iNLAAn!rWUe@Z`;z9GE~ z^8Hci_oeqp=R%R?7S7AVhe9vwl2%A)?)>~F;QlK+UtS3PQfi`Xv{b(<^YB4Yip=@> zP8nT=F-xN+V7io+RWE`5?*LKmd}*OB-wvGA`O-_FmtMLcpOn#>&X;=OJ)G{5^uopY zHrR{R`BEqh9Ruz2Qiyc$vV1~DZS+p->CV3Nu7&gSaonI*4y;WKNb|bR7nX_|TD#$M z^HJQ}7s4y@5s-n-!J$xHek1O8_u!V7UaHG)z;VcbA$)v&z7_BNC~7u(R#n3CAC$g^ ze7Jxx4f5wT%<$t~&MoIs8&64a&?tQ`56#G2-Cl?#WSDj0nB&3t_gc zoW2)k_@%Fv(O=Ckp|@&T?GC@RNc|Qr%F;BPl$pa5EN{yjbHs!a#YG9Y@ z>9ecWbhJrPfNduCg`!Q7FzVZyhog%C4_3|)p>k>zy{@iq`l{^chCRL827r^5+irh+ zZN3LK{thgO9Bu)=X|A?d6M@B=&S-dgY&ZS}v^ILC zGI&8p{Wun-j8I3h586Sl29ma~e&Wl7MR&htBA$qn8d`b+w%G1z*zhsf3{F{T=E%WN zWMecO-9SD@Pqw%3fu$Mz+8Goj5qbx|?|tHTMqYX4mEKog>FVD3%8sM>^st@XT|0K* zC8rMf{;}Gj8-Z?GmskX<2?7z@SX&a|yx(e$b?qBHI+I>^O?@~D96Hq=kHn*G8)3fG z1|f+*u#DwjMjr$JU-};WRDS^14!_t5ieY1u(zH>de5XPEHaAC`!!2-uRX$a|VsOh= z{M7Y7b*)Xks)ZsgF_k08m0Kd@D`=~Rd=d{M*4Azdg|D*+Fl6;oZBv61izeC=9r0u$ zwJ91#&8JQ^!@pB=59HxUgcCEo+S4^4Q-yU@oD@)c@RD82VQ4_XOL8H~)}18BB|GGj z&jZGkc=_d*)uh2~BZE8o`$3BJmT`e=Ed`*?Un#Td7=^HE07NH7hi7+>PtJ@@!)Xkp zE07ON0;e8eCSl#=qAYDGyDlVg$!TaMGNwC6G%WuC>Fp@+0l4^KX({lOoQHD>PM+_i z+c47;;b*$7HI_)lQZ3Q;NHh_RcEl6ONFtev#iQ-v@3e>`RPNAxYWzb&_|z%BB8#6o1&b;;Ec_C|dJZBtr=GYp564hE6)mja zzT(mcUF=CLxv^Om@-L$?6!@m}ckol5aQxvsoS^f>!w&2}OM<#HMwK{TjvXq7Vv+W^ z#pV;~*SUw+DFiwLZd4hixx{B|%*!%iLMQKHK~FmOdwDV)tJYMGpQ1Ka;#U>m&u8~8=wBt-n+ zQ=oVX^yGKK6AV~M*B_a{la_m@j!aLEPV7DiJD=fUihUj|QX{nYt~{I)GuMqpabuH9 zP&Rfw(u9|S@$ajsQFXppgwO75qS=xBh>Q-nz{gefDsv-wI7;qBE71=#M`6>CAWZI^ z+$$J1Mr33}xo%!c$j46wALPeHy`^A8LyN zk9X&H1<~79fIzX6g5eRr^X;DT$@_p4hWiEv()QJ0XS9b>Gxto>P0!ZH-*8kwjI7Wv zwn#kIo=m}H4xqt`W~wdO)*g*_B$7#3du)p)V~~w!l;l~(7nEWVF}AYVv6T^VD@G8` zh}wXNwkUh2j@%C$2*NGVQ>V1`4&t#ca6_^MT)73+ONQ&(VdFsJ!GqTxv_ZyYP5HzB z_My3V?}ej>?^8~x^Z)N+`TuThvA+wpb9d$OsV-nejJO@54f?tS3e1Db z_gm5Th%Jecw6Q&v89H_J@#Gth)i-F!+VnVyWAb|DU43D)gr=9(6TkKXr5d4tyrR z!G^faeR&t0Gd-qi-bz*9+;@?T&;p*|C*Hj$e|r$+`+TypC56S3)!V|wlC%ONPImlO zF^c}wq%;d!MXg48upu6bRK^i1K`T|{e^l1~`|JPJKEQ%-9-#b8{Kj|0Q$}!hhuqPhOmdL*}1_=co3bx5*I)_JURKW%#hl zgVFR*qy+3%nN~`GsHe^5B!EK43|E)luLvnNA4+Gaqzmg6~t#Df- z;eApb&Z+;X`4RZ^xKYbcJz{W0$L{ESN0)+4cFourUQ*H8$ul`oUX1kuSkN zXFog_%)^=W$1gC!=u$*bJSsq=qO^UuXn1(olONSK>KOM92+^>?Ze}8XHvqZQ(iff* ztPf`Lc46w%5fEm=Lu>=ikL2M9{<%lJHRrs+p%{|Q-I9k7%A9C)Zr_wkJLrs#w^AOF zwtw(1c!&&a{lC>uP{Y=da>$Jj9Dm=N5LZ<*76##Ug+9b)iJ&avMOXPW_i3*3i7U5& z{C|qK0KN+Fr4$T^o%ZpSm(aJVU9wJGTpCGYFVe5ZoE&8+NTECf3nku9-A)Q`vJ!Vv%ro}@3KlBJh^^;2BdO& z?6rMkYK@`vsXzQXH4Q%O$)G@l0TMRJ0MS|{1Ek@=nlD*DyaG}`!vzdUl<>n4D|3}|O_-`47XRpe`cd|G_fv+kY|tQ0Di*KOVRnA|5_+EodsTy_RS;nRU#bcFUm)vNJKdMBzlD8su`fkM$b&B>^d2m0LIv`K zug=8kOtt@CK?we8KRmlWe-O+*eD_W0YM%wueoZXMk5^OgU0-?=&83oY@BLUBd+Vt8 zOQYZlny!KU|2+KvqQB@2;=+W*=kcn2BvE+*C##Du)71yvgp#Epb+xjX^~&ne(jfn@ zkf(OkLDNtxP#ny)yee2qS?oA2iYTR>8C8*{rcVa_2WvWiFy{2iW;Mhe71nVe|F1In zcb7&g7|w*(g}K7L(RxBSg)xaYgI@I-%xH@26=sEph|taaJWdx?&aral8LIz1Odgy8 z>C9(j1LsN1pCSR1_}rl%tWxgha>YKiE!5zG z{Qre{zXjbtq3c99|H){ZmfH@10AF}4e<+Af%cXsahBu>_=4Ke1+L=0ntMsie4&|rLL38hbLm$tM%IFSFZ_4oI5_ulNZZ?lB&bc&oz6VJhL3*FsnRq9K<7GWZvFS5G6;2v6d zWxP|}TedhZ_j(0X6RT+;|6f<%Lh{#Ky$)8z9S~kAaveZ0LPX}Um2e`m~?zCIAS3Gf2Hqgpp>kh6@atK z8S@=6`v(yw*&_avt6?gYm@nV;A&~#m9%kD{J!iYN=+Pgf>gDB^U7ajCmGcOBpFfN7 z%JaVP2%frnWi!UN0(Zo)OtoZ!G=@u!`yiyoz2|f7{gV7pdWr+` z|6O{-gfFuGE;z%%+ch^StRfDs5w`^7{|w%4XYhdO6pi-_mdTv7ia2Dc-4g#Pj?)7G zZ~R{Kf`gYD7$f>Vy>Tm4O+Cr+7aX-0OkGWx$LU@HPpLgZENqA>wBWe<`?|Sj{Wwds zUoC3B8gVRrr_ybm!kdg~!pS7l>*|KP79^{@;Q#-%`})6|W8klMxxGQfbZof>a`A&$ zMN=bR$CX&jZMnnu|5eF!f8=GOR{9&dv$ds`Nl~US#eBk*|BBkk0aZ1;>4C5S#}a)lG^!)Z$kKmPxGKedzJ7l zpFW^KTL^7mX?ajmNK~BXJ^iwIdjgLGoPJp zimu3$M~$tt#nnW0vH#KeKS}HDR^r>>HHZ6T$J|WX`r)QpA9{mDKsv97kN9NqsFN~| zq67nk~XADdez*sxc>5)A49jO~e-7Nrgk#cM+QlApbuMX)*+gQfw}? zC@%kU>6XNy1MX-Y*DsurJ|LIJM8Jtq%Xbn>fD#)U!RZTFn zi`YW{|97x&(y45t6k0q$G-aKoIDOFQ!QtYyXhHt}o>EsC9GMwFBojBATAPde;)#CL zpjC7N?vFf)y^W^ZWA7NUA-X}?{yfGevg*p2ExRNR^8XK%QgCtF%1rnT+R6-2UE4}g z=1_L9@gI+kWA2b%jh0r+nut5XT1p`Q{}|8z?TXL4*n2b-7sr+o?z39H2aMgrp;fK(Y5`R?)pv+INlJ>@+J0@b@$-m@qIKgtmNN?(`&vj17(WBP8?e{4Y#+PUw0}<-{!`@4IX| zl|%MJf1ha{t(k;AWbW|L)e#YEm6?j{R=xC@h^V``xS=XMs@=pakFuejR>cTJqubqj?mpj081ehR ziSw+~7Vu)Hr@%cc=8mPU2ew3H={kL-re(PTy;44lOzLDOBh%6cWow(OXdzTWj;)O1 z8|BvTnQuk{%s0C}|3(#!9iy8^N5(Um8)l}D9^SoodTQ^)Y-hG7*R^S^Gpl#Geuy6! z$`1|o7Y2v=2J?M`Jwrn>2dt)!4u*E@oo2%#c6~AdAt)rD?RxUTRdYwv)+0M2AAbn^x4 z`;fMiT$Tczr11yi`_%U#FS?DU%Z!h1+18e6D`nbt4Ug>H397Y}p)y>^=6dmOaQ#r< zKo0${%?{-9=V2jbwb5KDq!PP|Ni=aRie1IzB+Q<$DU-aXbGN0f|DB3Vmw6nA<~wK*>fu{mA)QJl zU&^QtF-by{q~@fEhq>z!xBEX9r`!IYQVx{fRbZSoWN z|95@wAA%#*q=5{lWRP#=JAdlPPnDd$59PG-ot%+0Qed4>GJi0>PkkRY2C#yXjD+$~ zzLoFfjLl9?1$P;F`JsG=E2cz+xeb%n4=aTYeZdZc{QuNf8`0+Sh0>BW53IFPWtrs4 zoqCHXqUKj4T+dxuloYQ zE0?3>^nIwL^}W?UT&*Vto}JO>pc%aI!YVG)nd`#o+#pc294p_^hdvP4(9-H$RVpFx zG+b1syKi^@|FJs!35$wa0&vUZnfAttff5t(kH(7 z+fRJ>b6>^?D$nFw`OYCiUM8a>Ff<^E7A^!67lmYi@|^?Tvz7d4%mgoUR+iG5Vne}F zJkSLmXxafafd|F3csgkjNdFYRPo0O6P2A>&hANougICys*HgoRx?2t$ZifmDWE1 z>l)SimDIH{-q<%WI|=Iy-E5_SCGfoR=F4UW^MgZ$zQJr?Uw@&{Qz#VB^k)vj=R=sd zZn*T)glkd49GW2=%%gY)fW-G^vA%#uqzExVDVtqGFf0~}YrC%=Yr6!^|0Pl-3x2VS zDG*b@oB|IH&D{>GeYdvkbS8}b{{#Mi2FD#V(Y`Zh1i<`hajGhL?XeucH3PBnnSCz%rc+<4B??W0c)V#Ku zHYH>O`Tu#doc|Z1^*rm-EOkL5U9}K!g1C2g)qH2Db0my`c8X2}LvEjB6e2h_vHp&Z zLeVNIkpEu{3$MS{cB3e5E(5_Z6YyqcP25gGvojsPBr4xBa=Fy)Dv{S7+KqtG4Q=vKq@E0{xl(h;?55MC|q zOnIGwzO_`fR>RU3z2R@xWCneq8K8P7by|k3J@Nd%^#>OEwW#~(IdiX1ThDE5=sc|J zEv@KTQfF21;d0f2U&Yi3Lf z_Lh@Mx!O(>#5OlMftp#A+HslG1e$Tel3-#+p_a0_o5|h=`Tw8#4W^ftevQ{v>tWVv z`o9piP-D9q*%sGy*6toXaIhK9Oa%G=bv*y)KK_$+ERpr1kpXIuOmTu}*fh39U~QjK zsHJQXH0Ez6d!&B0NMkj>#$b;HyOQn@Q_Xjhg3pmK35`q_M+T@KZBNUPiHzs}l2=>s zi(O2C2r2NP7tP&~ww^vGo|bh4PZm9m9TkzeZ#XRrw*UVl^Z$9vf}feY|Fv_+)7D#G z(b#s4f|QzRHABkz%$P!BYvAfWuihj(K&2g%_2`E*19sjqYlK1?T(H+|Sq_4*S^tmH zwp5Q@38ly}XdM$B+qP~R8}I1Y(*t32Ig;71WAx~V)!Er4e4e%<`F}$!|Kd2st+kD~ zIF|n^PT;IW{=d&MwU&Yo( zr+3XcTr&Ytb>GO&oT%|zLNSvDa*6S-Bar_z;?$+Zs38`JsGL0clpxmiCYFpYKWkq- zKe(}Y)rp5<>5oqOpMDzT|9MMI`eR1*AH77xUsanEvf8UttLat?f`)Uou%*IRzM^JB zbAG(atWdS-v;!vhu(u)%f=lN;uhYT#+BX3`gl}Hwt=HBjfm01iJBM)oyF>W!A+RY; z0X3cMeBpC*Ulc~Xoc$`RJSK2x@&-|bO>+jYvSGPQtToI)*8h@LGHEvZAE#Pu6!_5o zxjWO=*Di1U^&Aa*Yvhb|Te46r#X%L={vh?sPgTA$;$ClQ#+hohf2NHO7e^_Yb@bu5 zrm{|=l7$?HBWqz@aw3`b;}sbMLETrdT^Ua&bH)}}JF-?oy_qR6jWU&VMJ*Ur*3u?y z8_1|;YC+X6!K?}mrDo!77g8xj253oYH(#cS?SF?CLGZEtpLoiGU+kKk0*`K(yDM## zUl?2J)!P+j%G$qY^i?w()K_NNxT8u7vihn!CKcHJr#ugMemb!q{N?XW{WA5Rsh_0& zA@zgQbE#)i-$?y&>MN-)rhX^&$<$M+CsL249!Uio{>Tv3&)V|c~Qdg$7 zr#7c9Nj{tW^W>i<|1kOc$uA^7ll*vcKKWb84^L7aa&?0aWJtzbx~?vs*qZf>P&T{UY&Yb zYI*9kR66C$} zBKpfeQBDITK3+!SqK}s0jQZstDI?lEW#0+@llB|HpSNERe%Zba{14l=g8w1=DEN=t zv*3Tgo&o>;_ATJQ&pr(Pd+jOkkK5b8zr)@N{_E{A@Nc)bfPb648T_O6W#G@+uLb`W zdlUFm_D1jz*&D#W*&YG^MjO7?vV6aN0r>mu_2BQd*MYy=9svJ3y9oZ(_8Rc7vU|bb zWp{(W)9wU+++GF#4tpi|+wF6~zufKsf6P7y{4Mrb;BU5H1^#Po_zv9iP4>&d-)Nr+ z{w4Mq;E&ob1%HG667Wat7lS`+F9UzQ4PD6ctPK=gzSces{2sdv{8jd;;IFWO!Iqz6 zBdWgAPJ#b&8`1U*8_~AiMzn34y9@m1&mjsY<`9Lgx#O@mbz$xf@P9c6)L!`&%^&da_!cL@AHm^%pm@6Fu|{+H%%0%(ug5VQR4 z_5tu8v2O(bVfzN~-)2vO|5kf1_;0cIfd58&0{jQ<-QYi9zYhHS?d!n5&%Oryd+n>h zKVe@9{%_dh;NNNQ0RIj4b|~w2=K$ui&(DDdV=98i1NhvtBK%Rcx7s_)}ZpwfTy2~_R}o&e03z5fZobJ=^J01THs_5_0bo+p62 zmc8o<;HYKqd;&OX*`rTfjQE~uBw{Oy)`7<2=W0xuHsB8k90L=!3Dql|4u&ci(xK8$ zU@=o~hJT-!@PavK#e@$WzxqoJ6K2hLRk!N#LXiK2wZcL_FZb4Mww1Pi^Sq^PcbX~$ z-T<|0N!{xNPuI7&`pyaa^L(W`n5d0A4H3&5`w(g@Z|I|B^`SzQJR5v=g=sxN{+Gw{=G!k+X;(K*Q`fbbo27q?`!-Fp z3m@+V`9J-rG^+4V4`~&KMuV58FlCl>Q^$?qdJ`2$qV3H6M&t@_8_of<0dx!6k|6&t zuFh_+l4Q}DG8)BIyQYriEtWUqH6lkpRLktq%Nof4OMsWbh1GSVvAhw&RYJQe#}u5Q z>e>h`*uTYnn?HMk{J&JE$st#4)W>T9bvYWE&jCl@zY!H3_icy{Ix3(wf6eUI(rk#h ze~Z@w^kSkB5pIK3Y0NcL*6{wH2tH6of#L(0U`Sm4_y+~(%(EhD4CQ11ak%s9HC zbJZL3c#G7Yagf3f%{&G*+&;Q_ba=;TX8LG`^eOU&1Tri`{)pKSv!O;3-_Bm)f>MRq z94hHXZoVezrm;tz^8++1wsK>jgQEQy`HgRW?467!2}%{<$86E%G@rOid4Bj%iw@zc83L5I)o91)5;{Kk-5fezAMUUOSn#p1dqJ zdz;Pdt;|rGY=L9YDyvx}<{Q}lFGE5f_x~X_eroy=wI{1hM;2;Rd_YHL+Ch;1cro<< zy4C8q|EK+b@cVzM`29ca@`tWO7fAd06@0V=vE+CbC9{ z{vVz7@M;6jHuxUBJR78p*Aeea9HTrBO`R%bt0Bc#HPz>ZafW{K1-|&wuDWg%k?GB; z@w)qso3~yJY5R50aNOvXBct2K+2e?d%`&)tS5_T-^-E}6X9i>u){RxIy@W!nxm@iF z^8XqqX?w+VkazgG%qz-5t|U03;S~n?Kg->5=#fRS<{V?5vc27t$c%bE zS3Rx`C#;*Oo|V+rz^vQ$ri&J6Kxe@7#M+6|!U?rJPqCT^Tm$ldHoav}!PO-`{M2%my$?9jPq4htEg3+K|k1UEc z*Iec)FT88+cMq@K%t>SAj7= z!}T+H5eaO6bmIHDS{`7VBjhXwON9!NMCIz#9Rh|JhvZXr2dPtHRK-P?3Fe02{(Xd*=TK`~N>>B|cTX^&dm14+S1Q-+o@&vfmJovf@#e+IKURVDgp_*#77n zP%E+eFv-w-1BJLN!HpMsbQ6!tFx|ilCLNgg(w5sMvL354Deznf>an7F2i<6bH6Eca zD*ma2cVeX-UTGtX9dh~c4g%`;oN78|{1br4{!dviwGuzFz6%%Z9vreyOtCj6$S=g2xrnwhtq9NcKP-{v^p`&`7$K z(O9qp2h(O6B4o=|*J@lw8QW@mQc1TqrC?*KMK5e-O=ci6W`OF^_OuMS>p=4F-|a%S zVAjBAOjX|PR{Xkjg<7vV*{M|HJ^qmNp{1>^6ZOK90WUs>B0<;^oD$x+PFY zM%lGQPH0VqJgguyb)>7TP9s-DH4aE=G=!U~DUtkRoQYSt2x~|bE%qwr$|yh@DnMln zRI_O-cr>+gz+RQL<)UI#T-;C^hBKmE%_pE0z7V7f1)YXt@szLSX*nkq8YH;IxZC~Q zU3Z}@4HQ}|UjI*RvEUcGm;x~cs-eJxtL!$IINwpvc~)wSe&4tM(4Wl%bAPMhf6eg7 z&YfFInNp^$ZQJ(Yja!D>+i#ja%BI_9ro;yscrr6Jad7vc>3x&V>nV_8mj;R}u~Y_m z8XfTVc3(8$VQ>nE04~&VU409Xh~k?P9-@K-dONgeG88d0=xNcO>CAOy4j#C9^5E^P z@!K#T%ueh%c(e_*HH~j$mKKib?Cv6rli5E#GkM^KsoghE-hQN~oiQN?h9{;W?O`~; z=EyDW4w2+mLOiRTdi50vGP5Bq?6V#jU8}S<)uEkw4>r2gg;yfJ0=g0`#a!^O2~u|& zOR7p^HWUic7vDq;&j({1sX*e!ho_ToITJQAoPCPYt`B#3I_fYZ(~&2yS|6U~jN$Xn{9PsvFlSO=F$;o@`I9%a!D5sDIw; z9fBp>dxjoOl1W-g11M5mY5T@nCX`ZkO_qnIyGC7CuVrc_VSXHE){lVv_l5ZSMM&+c z);p9?v|L}J)|Pc$u^!bQmG2g{SdS{-;-S_7TnrUiCkTbTg^Sn(g zWu{U#M3tF5yf=t`su)by*>yRlUU{tgz?>rIrLUl%dLr3i97?G`a}Y-q8@& zz4ak9gSfkxFx-vnT=OPag5=i=QpN4vvg}q%)nV2jqN%u`sS2jOV|~jO87kMeOHkP5 zHFhuKGS;Z>FqTOi@+bpD|ME8nrow$eYGO zP0Pizn4!p3$5~8}|3PuH1(9CxLz>#L0Gn#j<`7_CiB#-q#1pZ_qp{qo8(lVqgn|4I zRoqW0d=j!kRSzfpx=H_Ge&feou_<%p##j^9d$!*_?*j6_uG05em5m;YKpQSSO~`a8 z>f=KjeY)|9M)AhBL*%vtZmlTD5At8{Zo5WSLu}Djti6~LFl4BxcG?3I$EqO$)liK! z3-W*ds46;SLg4$1E#h{H$Mz+8+pO1Cr>e(vHR>F~PG>C{O^DY2wA)>mW z{C`nA{>N5VXpJ9hLd__^Yk!|1bsO9ZvoVR*p74Ebg5@LzykTvHObxO{kii#^|NZSq zce^*Ju@-YfVYx9ByO{hM#p~{k+8si+C8w#UY52V&XqFkY=XTv zPRw);7K=UEY_>QwG_*25Sm+z*%l75^*A{U!dE%L%pyXq)U?6kx2hO%%l(xPw5)Vm{ zG%a0&Sm;)P4lUCc*IT`V$XtLVUMq$molFKjMO8@S2r|v2<^>U#pXl;3B~WnGfgtUQ z++%$~REIw(cq*tFrY^)dNA(DRBCc~)s;$nr5(O;K!fD&Z+dld_3w)#F5r-}^XAcRy zXA(m1kQ8Ckl*(B;Ib_VToK@{FkHqOYH%T0E5jUjIw{kp;ilwK4_n>9b#wwjQ`S zDy9-FFDx_-GMst>1+!6zVX5=iAc8J|gvM!^!5YeV5F|W|E+XsyYpmp&R%ZSf_xe!a z?lJqNY3u%TnoP-f*xz1bPG@B6FOl$67ytyTnPPu`-+-?n;^?xF2+Nod@$Sju`7%LG zSEMdT|9^*-xT8KC6qn*q;NFCNM%sGll-ddt>w|E2Mfpw~p$1#TkVzv6k-$YPtK#G( zwLGahcidD6653|7D}CxAs1+*AA!oe&dwBn+@)!-te=_kU=>NfsU8_;xfgbzJwDq>@ z!srlDa*^Dz| zrl-0FUG$a2@wo2Y1ARuRD~07lX@o?jV3p-G!8{NYy)ZR^7~Y7~M#LbBO-nj+Mym@t z@~R^yQ-mZpY(Ul|bzwM9&XBBJX)!h?3ulwYwvpH@g7mJNBE$aDRH?$Ai`f5{S&7Rk z1Q2Iq6u38MzZ~rO8|u&(w~~rf6hG3kq;pn>%0geI?LoLKqSaISKhCC_DS9A9G!NEEpHD*F{+^bf>(Erbo+9HyO_ z*+BKwtT>#ywY|A4z>Mx? zNd8mSeOBTpiFI&kkUNpJ&w?FMla=ZVqv=v+l7ZsYOKG@mlz{VVYL2t1yc+7EdtPL} z8a4?LI;(Ha(a0DJ;DrE;LzX2D)C05fda)@GK!(x_m&o^784b_%>O6!?A;yq?sP18t0K1k_G2$bfZmdQ0Ys zy2Y7v^g2^EM_QDmhXvuj{^D988+?-00f8V6^ol8R>j6R+DhhG6!)XK&f`wOpgrQWD z20^wSfZ^eyEDP8~a$Tj;Bd@YEY3sL21|)JsoQpjrmNP~g8psX}^be_9R~$9xuTBCb zOcW-8WV!xgkJ)OTl8MotT^Y^XHHE%(EA$9w*Str7UJSF7*%D!3p9gqvV=V2o63>Nr z)`zH!Ewh^bnQNF49v9q76uA2`y8~7OUu7^J zsQ-`&*_oO(d*dNf#3Q(B(Gkart`VH?!)zbxBLjwaSpKaKTIkoD?!K$-bJNzFhhm1q zqbPaEPv^a3Nvl%ueTB*Qp(JU_3{H#4f698$O8!;ix8c$_cXFk@5~kuVuSm@0i8Eia zvne|mOW+Z0m>IcB0W$+so#6|D2WFu(9fxj8C7{%KkyA?T`D8T{Ev16zE?sk>6;kSK zdqvYu@A_6Lm_!jx?-Kj}Vk>!Z<3v9$xs@q!_d0u3+Pd%d1}ko7eg~^{ajM5{9BEc! zs>|*<<_PF*^nH+w3mxX;HET_8P%611rHEeVZe?*wc9S#j_%@dR#P3<~i(M;H;GUA* z2}}BSG*bKqdi+;1c~>_8W*3?I)4flxkyL3#l*5tcay8jPF11zzSe8~##Um~k2T+UK zUVP1k>{)SSnFY{cODwFv_7*Rq4?N{RX^mUfA0RIpcmH9#J8iwyWH*nd>BJUC?UIEE zjlw2Gg5}FA?i;eZ($<@9jZOmc{rnsU4Tf&!GUNfgZNOcZ%6ktg1{HOAaj9I+JQ{|t zH#LyLweA0r#M4b0P)AYra4cdHVbx3{3}O~6u6mnBrL~yNDG9`=nQ(FGa&^N`_+H3B zQ6Lh8(fjRMz2C~X7d`tdhkWG47R-(<)F|E+o0>w#cr@K_XeiOk9O|~!Ih@6%91tgZ zRnpI3(PzW473x|~G-5^UG*LwsTWuAwZZIBNa;wjP#{Vg6#7aG!_$*v1aVHPky=m)S zZtkNFsZ<)ha@*$NO=E0ltYCvu^aqAA^@VbMuGY1ZJ=6Y7I&UK+DC<)Jm?!bBG zfd|n5;)RnEiBHSbUz~!skB$v*8C4QFPiKcmcJAB)1GZfxFg!*+yhd+@%JOQ{5Zb>{ zERB_p0PLC7t4pQ3ciBC#3a|gLLJ>?hb-%EBFHKB&8DnlRQZ~0#nOb>dlRjuY7oL$7 z;9Frg=8k3IZ|R3I%v`NVB0P;7Vgtb7d3F5;&sUQ5|E-n-tGi~^8}}GfH{HSJZ32vK)AMJ z#GlQRxXr?%_AsYtz<;?rH^m1$DvH zpQ8tbXO#tk7}p>s7jj2m2m{U_du#9J83;36D7*h08vWXusPhcdVs;T-mJ+OoU5I38l@HG3=JqDilS>&H3ql2 zXvHc+u_MC-7Rj$yT|G*~K_d@f155zZiX!lKfr+aOMj!(i^Qfd-s-|>PWkp$b5hjTf zV_2A_j^r8vjR~tDF6zy+w`+x`8MUoQz6hw$>YOH$!#E7`zsESSdBR24987fa)tnAN zDHk1`f+{T1k)#!4SU3nusOJ&Tc=0MoWb-pi!NAOFUy@2P6uX%vj({m!t0@Rs#A^GQ zr5YkK-QaW8l!eSv(06+$ zN$HWK<~T%GfKcPcR0fq=DlzTixuw9FpCvm<-w@!|eVr#j?2fAGQ9pqKrP7Ac@rjX3 zu~Cuh%B;R-;=0aneDkY!!>0W%xFrD;9h?SbF#{kW5G9rX`13Mw?On6d#gq8jHlg(H zuBgS#8_NT!ssYpxZnk$F*vN<*$qDeND2U4;R-aloe8cc0#CRmqGE9Y$Emu05bmeaO`ss2Be__>w3F8LF<#BOO&;K7^i;k5PkYr^PWkF*ggNGRd+9;JxU z!6mNHIOy$edf;XDMQQ78n)wnDzEL;`2`KKsgJ;?o!p>+sk8A|gJW){bCXfKd8xXsr zw9$5&O6k!853ahV^{b0oEoV0-R}1v`a?SYNBCax;c|s%pYUU-X$&05OyZ{7GpGDq7 z@kXy8w21k{iyDi#%1tdAbkaC@df9(Mp`t+$o3Qqn3atBhf%UM#ogt(QnEy*A4xshF z1CcA17$B#>17r3`+IsjL)^Opj^z)=>KS$=m{=Tlv-sz)L+c#~zbezL+(ture5Z3=L zcCY{O#6ck=zVZj+0V2BPxtbRs)UW1cX$wG+wO{{3JeAJ^PqBr@>7%8R!%gsX)lfd) z*Ef*Q_7w;F3j+iFgSqS~#DfBXe*|csHE~^&49W=sqNhK(W^$hEhgADt3eAAbVWSP`beCE?EgL2N_@e3#5z|i01xc4 zH-hDAI%zsQK0XXXv{lECBY${D23r-E9|b277H+nWZW`M#dL@qr%XJz)Z*>X&ycLi3 z3xz1o4Mv}t9@EK_yKOTeMhLPT?kIPRYhh7HA_P4^;uQB>WRIq;2cO5%gu99i6PqMU zQ1fC2KoYNEH?MVXHK}kf1Q{cWQDPXL3%5d0myyI7ByuNl$LN6x>4cyMG9*P9t)_t~ z5x}D$h!%1RL6%;6jw9WP+%Y7#8ZX=nK~|CyMQ%Mv5GE~x@9G2;0D62O)}2m>5rPB& z^3_Q7-kk#H?R3WrIfWoANr@u29^^uK>P7;LiK~-W&?U9dM*2}ulR=CU!%%{7D+Ec= z(o-5`kjS0H9iy+CkWL7CAVX3#Lujt`>1J^KK+bH?sVFSHe$>YbS%sjk<4_(8w?YtxzcVn}zO;U$ z?ZZ&y5goqz`a-OLE>5G~yHj|97jgM-YV@S2sc;Q|MRzd)hzF~SVgcc&9#gdof0juK*opp>4x{}<)=e_o5f z|HBILzb+25jn&ajV|R>8bGehaV@LsNyl^iBJ&++OJTw{PQ6K~*Uoyh(L9yl_mq%NZ zXtP;Mvi`r?N~~^@fnW2Yaqs2!Wohe;s~FV-uJzDu3L64OLW~e(sJf%vF(L?@Pe{Up zry<9{s#$n4^$E%$Jf#5KF|I^H5+UeHCW9AKdK4uj5rQ^h6pY=0xjQgQ~dIm+!C)^7`kJLg6A?T4<#@8#68;(1M*WbB?*#C#D#G&RjycZ2-??~C3)7Jb882bcV7xxIl zsl39l!mSWwsohcT7*QHOn%gkCV+4l}9hl`$OK>3fbC6Ua7AF;@4~3Q~vEAnvUqzyD8+cQ1+vZY< zZmh2$?+EGt~TNvm7`X9PO+*kD2=U@FKVpS#6;S#t5Pf{eb9$m z#N}91Witn-C-&{0ylr-J>d1lVDfAi4E}Xhs%=5L1od^Yoosz?rVwHAo2g_uE$p2H8 z1;1u@_ieMcrL8xgr)@bYlD5{l@T%r4J}P6DKBf<}t%wAfJipVSv!=1LSs*%!2kE2^ z?j-mD`AII*(jc{I(r6H?b8+64TZ+W@rUqj+bR8%S0dM0N5|r3nh!=uVl9DL@Nvq#V zd>TAcck;NsJ#F3l20%8z844m3yi7QWt%Be4*=(*CQ^#C*Ngl|S^A{0H#smhBy$bSZ z+Lboi=NInTXkQL5{+in_L1b+b`e*juI5Bm@{^8aApbiSqx_F<9vvC?HlAYnht8z(u0$*Uh~>=IK-y6K(*!@_c){Kda^}Cwzo)FA#5fd5#ivB|BqM} z{OaW1ny|;y)(1|Z7MssSJ9;qF9+;$N#577;IjhAw69{ao%tN#oYBtm4wbl=&)k6p) z*Bm?y>;HG5`M-4HR4a9T>NUwc1eU0SQ^&3hJavrfBl#3w(xQ$prD5mkiIJ-&+()O1 z&+%DY4mcc;9y6FciTknsh&q}>Om2h>8aDFMPTXK$k+$yM!DBQbu?%wls|17O@JZzJ z$S3ctvpfTd;Qbfm(2#Gw{OP__@^u^!0~mNg^TQ6Y3oGL z`DzqbG{~?;??%fv~_YliS_g;j0{~dT|IKzmf`V{OYvJ4$h#FeKo1|S zw|WFZotc9pm#*l_jBOo92{g%Z9_GPb2J~@iwC+U9$_-vWQ7V8AxLZ0@+7m_jfz&|k z@H9CID~N~-V_Pw!5%E%fz)R<=FkJXTv+(_(WNmGtj7b)nR*Qt`(|4%DaerTp`p@=14>=p+>~n6U|XdWmVc|$O8h-| zKJM<4eO=nR?+!*`?Nw}Lafm9#vo2DMtc)cJco)40rz(CEsuUSa2~dB;2+P2w2^_VV z?>WQ17Cr~KR;Z&p=z^!2gOSpNGiONSXa<{Zm=bR8#~K(shnQSZ6F8ChTx3!XL8rrv zi)=tGog(RH`~X+oN(io?y2OF)|Ku~!|N97k{3xbCOHly&|JPO4|9gE?wFckqk`xi^ z6}c92KQ`7uA;15XfW!ad^Zx=F9Nz!k9r*sQ)M{*oGz3!#3+yNQu)!!W>9nZw5*6#V6%F`5rJHoM_dmLAV;E) zAQ~$hPZn{*)U`B^lhU_*oAY{!A#EMS1Q3?ec(tOGCu9y+atut0H75UJU=y+C5s6jB zpAn_)8VV)WSpGbrZ)7t5|5q#VLF-=wd%)ID@Zc(YB5geqV)Gg!ZXNq@-uN&>`=&Q- zx35oI@1Z9KNNvn-cow>s1L^OEpv=A{&vAp0gkG>p6O#uDBx@l50`XH3t~2xxq>{Oc z)1nf(_SMk~cgJS61@3wXiFCu8Olp^K>=9cZ65q2Mk)nYTLSZ$4Tx29l(cHc)p%|+P(CF8=y<10Tc(Yk+yucA{IT0Mb|~8T=$37e zia!w&$=O*}42j)T0>`K{Z)8iXYzYxhw0X@cz||WIqe^Ho4TlD5N^l8Y4WF9wL~I((8J22;vV*{VTxxE|A(S;9lA z=Z3Ey%}_}mFJ&@#{@?njg?`QN-g1e(CvCm|bg5eEjimWt%}qC#A*Bh|LsV*Uh(&JL zv}1hJ*vPmiEM6xuTf>*LDq>$IDHUbr(p5orRf)lwP*Nt*w(G^lm1QD`ZaFS;(oS{?qq1OMCiSw;g8obzrqQKo7 z?8&rs{|f~cRf4op&jm)*o?6q`DvR9l zIvQqXKJG1|fq= z1Cu%^WHZSk)gh*HMa-#?-IIz=!#V**{f>!_o{l{o^g~Vfh$AHbDeD|7xjJzkT-@%Y zWgi49R(l8%gIh~+t5F#aZJYorNJFHPN&9A?L7O7{_?BgB9U5GeBXxFssD}v^?!Mf< z38p)=-#@Ph6(s7{qre)K;i7fKtmD9U0<0n$)`m5JcT&Q#ROl4;na*q%$&UR?gs>|p zf8b4OCAg8H=0vCtBqfhe78fG^SqHMYLM}JhS14u+#i4v(ZlEt$931G&_6_9v2L}te zZ2v%hNQ={R&xNWNfx@xzse@s)>y5jE)^680T&c_=sw=BBZ#W#1E4-LR0p$N(u{hvE zA~Qts@8FpcuHmfXgTiS)3pZFz5<2Sw#HF`dBU9mSN#rv<~v_dMNlS ze9^>hhRzFSUBTj4-)O*3Sx)BW>O@kK#PBT5a==x_%AczweeA$c^2m}TWob$E*MDxz9MJ8VY>qh4!Je_4L__{)Jl~6>O-rtLT_R zb}5T^vIA`Ycc2CqES}z6F$=rR28I4xXg;Ogj2fY0+u0v0hfkgp@Iyfv$6m=&=9xm7 z6}`E5f@HHmr2VD4ldbYK@9Ga&*s;*%|s} zBtT>HRacK9UT~(hSb(TXE6wFq zdAg0mu?M~c8BrEE&*}JaxH`DOZ3dZ1UVxsPxDGu+<>Eadci(7FLsRcWz+~qM0g!Mv ztUIP2OSn!KoOaVdx(Dk>}RoAz+a5@?o2dG*`+LSun1+W|E zN;RvWO67o6U5}t309EUHEdPo17W`rtmIC))XwSfjpeebNM0b9zs_7Opy*W)RH%P<+ zq5;iWOV@L+&%97YXuSuHL4X2k#w;vmbB)pobd9Y=-+(NYm^5O=6{U10HW-gJ; zZy%-)57W$UW@O{brj-tlYMa!ITZNw8Mr*Y-t+Y4=XxK%oIwz(oRofbEsS^?dRvIM- z{!JdDJ1+24Jno7$-EZxq@cdu$3M=(6c(IEq5Df($TWQ~#wmx;asyG+fnhjZ$tJ-IF z3QWd5asQNk3@q-6I#3RZ`z`pN6HHShJs0;9lZTk86gUhf7E?1Uq1Az-mbfJ;E}Dwe zu5xG~>K6kGLo6AEeM<-Vw_UHNS0>>r zeP+=s-N#7c-`U5nO%4umXcM+@rh6;F0zk9Rh}o*fd+NB2IH7TRbh_c zL+_xT0c7yWi(%l(;!12Mf==rIy8DjC==NJ>~+U`I(kyhL2@s{j@z^|F?c%CBF^cqI7pp zmo0dieQ)DbOx;BZvqN^M)inaGhK9KVnEK=@`!4AIea@;8m2j{L)0CY671jhM5ApQY zUZDIZK=|PoyO;utg90a4l@p6z{$U*HHUg0zknMl~Rf!rLk4dvV?oUqxuv}075S)SE zKQLH?L1|Ae?`xCBAlMK;CMTcnh-uNhv>@aEKea6QwZ41H%5pMoz0YUcX(+?bbLJ}6 ziv5Lwf&M{caOQe?3;p>*zQ0h&=8E~ai)fkd688RmjEw&$ti)%miJHj&$;-=W__n*| ztC4hC>)dJA$ec}hWu}fEJa}M#XBN9ra%n*yJ|qOE>*k6%_}*Z#0OzY0@_pS|x3M%p zOgGXF@+3W--=?d!_gqp=rL6}~cTvunWklbU4ERDU+DziV#Q{>FX(VTr5(oUt?1k?t z_7C+H;j2l5`TW2@u5W0tI5-&eDP~qgNZ`3ZY3*z?>;-!-w)cXKXbu)U@dxta@TsE2`4TL4x%r!<%V+bNr}EJB<2aS z*+QY{pFm6;b>Sjx=mmfK#If@8V9oQED#-_64LT{8-baIWQzv5Xgk2D`#yttt{!^i- ziwn)b(E+q{r|c~4&<3Gp2f!8_=o<*+lR#kkY+rE@Y)z-C5Qr9CRsynS2gPDS7Su{C zA1wtJMT1KuS@i79YYX!KX(Fg0`Q2D_Wx?VlL#a!M&IZa5lg7VKY?@9}YQ`XIz?fA; z^=n!}ovjP8PlFz>{t(uu*YEptv|LLoKB&PE$2;~2>@WJcFXTt$)VvELSh;Gc`mGU1HfLSoMXsEnP z0_h{Vb?pT}{(lGNPz6h7F<3QR!x|AiwrD*22k0AOi^gXflXF_g-o`*ThK5~%MS~{1 zvoPK3Oyf0Vy3I&R8959n7mt%&^YV4=RhqR&VJw8NwbFT6Y;{RR(IF#R-u+Eyi3u(6 zl2j&`7@1*ag&v)n?SS=5{QfV(M$qv_rMP$t7aNPENPSa{7K>#)hx}p-)od20rR1ON z|GCMszH5P3OJ}btpPIJ5;r&uZ)^n!@*~mcmJdBKIe78nGVi?qX{w=R6p8{I}-7C6m zV@SLrE=hxMW2(D&7QYT`@l7o)mfC`t{BQXG0^29V_B5GZf98{r!rU-AK0I1&sYw!M^1hg?v6r=prSdj zFl$&*R^@Qj3z52VN|2mF!yA%;mKcCz<#-7g)q@o&qIlb8K%K~AkpJH`N+=|%oEjvj zKoi4O!iBTC>915>2xvwdWR=#J&SQnj)uX|ytt6`!(bK#d!6CJxOI`PPQLMQc6XgGk z9X--lLG%?dXEdJQJdZvlg%o#;RoFs=hJvsfs$5EYeZx4h0WH*^VkuU-i-1u*)H6fD zAz0LbfCgaYdtO2Qza-GakU4NIJYnJo^-_EO9T!y184JXN4w3n2>&3dYRduV6_;H@k z1SvT*{(vr{7P~PG-*90=ccn9BUCP^!R3r$8cfY8+^gj;^|63J zk1)*U$^79Sgq_8w4JjbaUc5!^NXn*ZHf&_`dCmkIeMfg4?0=9`k9sf&&7h=y?zu3q zA+-P=qgVlk0u)W<-8B-@Luu|(`K+TSQG!5-ujH~;@I|Bo#ErAyiCgc6#uTrx)r@iA zOeE2}9(0ll#Eicv8dy>fX#Fpp=!WnACBC1ShCu8*C~$GPJ#C$61IASx6_CBtu&<(1 zI&+Ui(UX30u0!P)0Fd1Z1h|!fcs+=43B$)!6(h+d=_6sB7d=&Gq#(*ZgZK(mf(6s=qT{sX(pZE5Ra4F}NH zjjqL@xGy7ScT{XO^`t;F{Gz9eQ>dmNHK#6z;>t6zAI{lU%@=Vw64iEeGkB$uo!hsM zj*agg-?W8%Y=jv(P#Xl7IG{gDTta0+3==ji7Bwpj6)j*x%Ef4)C)|yezStwzt->G_rFEy*^~#qk_C zq)VcUt8X@M4BF_2b~59mTeh`j+De%=^5yMP27+zmJ6`SWnVY7M&P=&uCJydCG`(-K zoj9iK7a!5c`G4yz3x1*9{TG&B1m7x7DQyn7x^~gUDLHjXba54C^9I!v+!BIrO7ZjLr-2^UIqt9I$!kS$$iK!)rRN5p&Dn?fj7s%Y4-kpbckZH z2p_R2z)6aQA{>MT2S^SM4fGB55A?zLid|7qm+b%lu9f^-cmrTDxqF^pehC=Brz@m~ zTU`U`;*^|Hl8a<{_Isw57%nS9LV`{U*2O6Z(_39iU7V6zN)is|DzYLZr0fROMd=mf z;dUqL=WrKy@)hM5!`A=?+-bs=L?KAo!jT3+kg^-p&#zPp3u}!v3^KVxeU6ug;KV`l zpGur=CBK)Pg-h%n+gg5E+WPdllXAo&wK$3Hl^UK`_f*L@ zG?48ZAg4`{Cn&e`(zX!ve~RDk#xHpScN`{mpvxEP>~O13t$95(6rksX53=H5&iM~- zD4zj~Al@&6kL8weNv4B*?tS|j3Wc8kv;0q_HgMg@ zh+-us>GGx3L-8@UV~9x90NJHIaBS#EtYpqcESq_bTygQ6Mm1tQu>ZfF&yz_jVHU|@ z?t0lPjUCB~I!rQ;V$;Zz9865fHAq;OtW6Vcu0STL2Wg{}6_Ecwbr%}9rkf@>CR}SG zGOFJ~ihL+h8w*u6YP55d=Jkt>A&H@a;;pkPzi=zQtKyCmsU%{|4MuPAm=zhk`U)YzM}x ze{6=N73Bq(d{NneApie2Uj1{Fm`i;{Io5JYaRRR5l$8Ln^RBHO7~6p2+&T^mJ7Apc zH(rb6PK%O&t6iIijTF-ctrfKD7*!#<$88m+O|8sggehkcMdp{Rh2%6;K^ccsIrq?v zW(IHl$X5T@x*xmpRY1S>Km7h*qGZ7@cHt=SyXTb8Ok2O)DD@NgCV0c7-2U!G)y1y_ zTokBL7m3O-n}c0)bCh8F{~sd%zpxU&2*>ei;fJ?Zkx;q|B&dMd9YM-O%8x-u7B z2q~yO<58}N8m6fs=z3P8re%$zBVsbS^|?&uhJ(|4@WD63nG4pV6RGIC0;r)$vd(L9 zqh}W2mC6Mo|2JBR8(W*7n;rXmUs`@e+IpxLlV0*_${2WOcVpzXp7mPlI-)xHPg?t| z#0Kzc{Rmd}D?pN@Fx zyVa{#cSvsQc6n?XcP)0X@JmxSsDH~hX(5pE-bS!B;gtixG8Y00h%EH-wg&EvjJtU zreFhsaf4X5dGHNpvZlbbMbM0l1wj6vm4K0(U@}yw5&{7$Hdz%)omI=f$Qp264M0{% z?S_${LVW$33V_y|J6e(bLeU=N|1TMr1a&3|a8vMhAe%G?nw+i>^2fO;$cpjx$Fpfz zAf_#$KyY*Us{@e#=g91gM9~0tjoE-u75mZ4ZjE|5pQ*37L2KHe&Cws}bOoC16{-%w z=-HXV4-J@UBpu!y=g?sN!POG5BG)a1d2?_@aLY9XNrTZOOcom10D<_A$4`8*RO;<@ z-aK?p@fbSy2G|Oe!3V37vMo3u8GRrQ$$tm>avkM+g43OP=eexIg$6Yc2r5gUfMK!0Wma16(74nNm6#SnWALCt79^-{EwHeV%a(GE^OZ>? zm-TW6(h@1>MhXm(nk`#OYRE_nREmny-h6>uMZti!fWNQS<6L&9VX?In|IoP94wXjG z0yA4f7|xsU2%XAx4ch;cwBY-H7lOBl+`e)K&X{+9{*LftCbRDMyZ24ZPR<@UGzq(< zhlbFnLLH6a_jqV%h`cF^k57DafBEdR_1Lsa?5W&)?MHz04lgC zFdb_9S&BfBST|Bmk@uYVlEq9n!rb5Yko>2ui>%~Bi8ovS0fCV2!ByoIY3mX9#~i4j zor~}k2Of^3cqSkZ1cvquX8R?_EUVQS@)ad2(`+;Vqwk|o<-a-cvhumG|H}P^Wr|Vd zx&a-e5R{vpvz`M*f}NmEPTXGZfQ{0(Iy7Q|=rPM;oi|v>Ws5#~FE^0Q72u;&eT8DS zP#ntl!9mKo;^06Ze2gU5KZvsT599|-btk3|BR~GzfZAgZ7DB=V{l16H8c0+*)6Z(y*9mB`Xh$i?T`=61TUTesV+~S$I{YcKioCKWK zaRREDgfb!LQgN0%#bB<>oT8jSNY;psW)3wRRGdI-ny*fU!~m^Ri%ZQSkQloDkI(-| zK54-(b}b^Jz^H@|D^S}mHY;HP3Z3FDR;s-mDiCz zMewQcZ`ibBeAC#-xT}Ir($HF>(4QUX>%(g_4iFUZ1VmG5F>Uba8Qb8 z(SZfH61qu6Kr74zx6Mxpu=O0Y@wWGeR+Lwztw%jKez_~p=%dh=TajMWaSC<g{uH?P@^W|DdgCh2BsfG_sy7F_9HmF%gQGtdAMqz-|J%X>bof6O z-8{Y#^6)G^r3mRAvjF3zFMeGvQ+@fQOe6Gah=o|bz8JBtOu8#+Gk>CGcoT>y@mL6n z5A?VSWr(ctKbR>b){tQ_4swd)kG&ci$$!%Nv6a{i-ePyxmV4l(0O=fJN}BonZc}@uWB&OVjZP2_JeBAuv}#JR%G#wAC}f zt&=y*9GJa*_ud;P_ujmIY+-Ec`0XVv7i<_sp9ffXX!4NUL6vsw8piUU__me&5qPm% z927X&US0#{?`uSsW)c>KqH8s{C(kVR0zLYgAMecG36SUAM-IGx5?&?YZM9G<)Uo}a zOj_`Z-IAoh-LEgNOesy>E-Br$}t+%8&hR*0n z(0$@lHh3~K$iG<7UP~QqSJsp|l^poJ5St z1=+&#pR(?Q`TxX6;nE;?az(ih3^ZxgM&*!o@HIMK6$p9PnIx+eK&5b%!4=2Qp|@NE z6~DY(KlL$WUI04fn}$xbF}%q|p3r1|?WL)zlgr8HP|<`=E6X{clQjRY7E(8Ua;j1( z1~i{W84}Q5a7`Ez2|PgYD8dV}S|t^=INvD#@?N9qqPCMGL-l5U5B}nuS1D#efK>{p zEfNBQP7|VOo1G$216-@_QSkUb)nUOeb}7kF~`Zb5~QfWI>Eu~Qb@aHep5~;MhmFGjJRU!FLThCglGm{r4 zehGm^<4(T1JOpDvzS{4*BAsa~W!mUMY(@yS@z^#Y9;FsiIUG|e!D8#g$fdpOHjnle zi|{KJSHk~!Qs6wer!fK$uc92Z+A?&_n3au-#qAGE-m|;gcH~DlTYY`dtZcKvbMIq| z=s#iscD=Yf2%90=9MpZtL(`}!pmrz5%L8y?Suck|HzBZEZM+@=4CT?7HRKJi6~&y_${`gnUj^wr54I>xxT9w~u0gJn^^wj1(eaQ`&`6 zVQ|AEv->;yA@|OmU0WcsbYikxgnDgtGO*QpZM~dSDBzRQ=aB@$8;HAj29p2?dQOYE zZTGRxYKj2hVe;pt73R?vb$4h6`Y9*fDV$a-xJ& zYBB*sJ4s;DG2 zva(u8zn$zTuLJ$R$wA$pPEImWgZJePG&s)5d8&%Ga^v816V(;+qvuHf15h{<;SlQo zlgSlU@*lyAT}%ND1s)tKuZJ^U`LU!GNRp8)R2`G+_ZOlb0tUK2JNc6G`JfI~J2KYf zmEcArSOety-p*di%>J3lNz{Xb4aMJ6l67;xndU;xtua^gxxzqUpg1(x=UA^`vKI0~ zg`wg=ekjYVSCbYKHBN1)Kfujt6NDHNGFct!*2vb-_6xP3O}4eXKEu?C zDJ9F6_x5iWLb~B{EZ<`H8OwLjl%TuK+WK~v8zmm%TZ%0{giTSy=KnEEb{kun$NK5$2VxD1H7E>= zeh&Y?jQL%!6XFrUb9%y5Y0g!l0YDpsnEPbdYwTXq6~{^(_4%|1cN9Pee~mhJpXTPu~J*WtJZz``tn6->!0x}=oq(%+pQ6kS#cK;cMm4r0~pf( z^YFRl3)9vIFAF7?C~++YP7Dce83dI7`*|Sq(~14ypZ>1YFH`@S`bp{^Qa?yNmwG1k zjnp5fzLNT4>UUC~Og)u)BK276(bQW~52Q|}j;D^L4ySHP?MuBbb!BRMYIEw6{? zPyT8050k&2{6g|G$&V-JlfRYxK=R$mN0M(!-k1E14`EC?>Lr?!=13S&5e?UYuwrs_*pQee&f% zi7!0)67WC!?ijnBUT{2lYBfq(gY8~9`Mr-Hv_ z{`ugK%p*K6F2kFhrw^B35B^2vTfx7u44*+f{etog`0LA4;185<2ESOo5&Zu0UhoU$ z>%q^KcZ0vSd@cBE%2$KmQ@#rPSCy{>|K;Uz@Xsvo0RLs>?ckqL-Uj|l%Ui*JNqIB) zrzuLJ+lc~pzH&tC!lBlA1Kf7?95|DJh-`JM9!^IPW;=Evs8z@MFm{_ymfc~pyA z<}U;P@ce7RpPol`IW&)Iad3VF`~&l-7C$PV2mW7|VHJJ(_sbdZpDCXO{jB=0{oAZp_P|EWdk2Bf6|7wUOsO_TQ4u$z>Uj4Y(tAL z|BwwWzWi}}7W@y`(C*9MZ{Gs``|QKu|2o`;HLO=cOxi4+A)DEXE8hm^Y|?W~x_E3` z)l%G|8O7Caf)eC^p%&JM!_p)WGj`0_XvMpJj9qJ{X6ChPb550OSv6a`)X(yRePKnr zKcQxXsb*&YAmu#{(o;sEN<0q`&jXmu1GJbi4f3CexBA5k*+Iv2#@(s!DW+cJscx%J z9lBDG|0Lgw7;m(TH`-yQ^WtZ);W@W}Ip4|~X=^53jV6lk9tmZR1SSvT^?y+9asS6= zY@(d1DK=^U*JufCrv3k?ryWIDn}tZmSo9hte>L%-JYEdI?+jHmvWm^nx|yM1|38m> zGlFUXL(4DJR-C1&0USfw37i)*cHJ1eu1xLppjA#X*MFlT$p7;(_Fi(|q!t_>hQ`vR zKXE8tYHQeQf<_BUjT{^C!vR44PjMYi)zZ^Cg0W$wmcy8-O+4Ok)SwfHtqmB1@nP8F z(TBj{kqx5J{2$tv5uf)Fzs(v?f;xRiWb%bh`Dm;O&ECfGd;jMHR^o-$2aqmkF87;v zlrK(OU%JDnBWD#wiM>WM%KDWsivfmE+efY_52vlaCj$9@0q$wy-Uw)<%!I_# z_3;4Oz^ZIz6AR?Oy+TuT(F_+C&&&`TGgSMsgW6rR^n`HDh_V>gpwM_9&wAh)4`==Z z0#T7Imacdm%AgZnR4PZ1qfla`pQEegoE#iBV5O{$R`R`xJK<8PJK0wrh11n<4pm!} zIQ&E%WU9|tg>a<%#X*zP*M)T_m9g0%1J(ZIE6N*yYy&8aU6qr4er45{Y;-JD&FR)B zC(0vf>)wrwHc=ZjVnehBaTq14s*nYKis%T_kz{A0~h%*`8cKa#`$y*VW#BUOuyL`1YK2-ns2v5|w-iBB4S` z`e}Q|o({y5)UiFj2o+4VYGuB3bMItl&Pb4ib%Y-DeRYd} zkKVFwoIF&Vm^lE40Z&*NWdEnE*I9}Gn|KFYB6hGWuvuCbaK2BTp>z0H5HhpS@|lS> zdnOKMd-7cud@O^4{UmtF_N`kwS@J&Qx>oF)n4N@AbC)s<9=)>L%r3Pe=tJK8OV@;p zGDmJXcwlyN_c8Q^ZsD;IY}<7eX_pesGCO(b@a`kC(=(InGrd_&?AUOAWfr^c!E7$O zKD(wkl+R}S26ICLL-_)W>RMR%W%nZA)euX0xOw=KQ1=-a} z1GeZGG4|*qcFXe!*>N_OLV(4B?8?BaN!fFDW$9d4=n+=3DbU$%B$$t#*jgS-TX*vh zGAe~T7?L{h!g-x=h&}MnPBVEV_J~$WLbtvtp{v2<>+J84>$Uke}T z;6uD9$OP~^Iwtn?d}2*U2cW>PVb>D=Hatp1tHtWT5~x>R`(fBz2E!n!mqSlIa&%0T z#t0gy@q4;+NdA-7+pWZRz-tb7a=5%5y82U`O0v3mRV(N@0i@8B-EvY1;BgL?!T`LQ zlx1O8f`JYy%NYe4cVJ+f#!ydr&x-QpY3l(lDFP}i$gbYlEdh13r-SLTrqW@ax;$ca zg!}*GGZy?}7gJ!7P~has@(vgbTuwC`Rb$y~fy~T^{s4(R?!-YFDcham6DN!UFs+m8 z#W4YSY6@IHi68_xfksd1Tu2X2OmTtMN9OGmeluHHU6 zHoRpNr#g+e620m#ZIqoetI2bI4=^$Zouvg_48?t7&ymh-*O6O1=Q)MR(Tp?ynPD|9 z;i=Q&&LS|-uSKWcqh}|u8y_4(>;?`@-;JBMUfj|BhsbqzUw7R#*D*&@EG)qNi4$+{ zeEY)N7k{K1J`lv*w>DsmIv1}G?XJDy^p8K zotf4fW~PrG-o1BvYVX7>ZmCUUo%w9nlTV^nD#2v@#J=4}r}j=CI&@%mc50tZ++Czegbwr5c2s;g=97X}9hhx!I`YqJBn{COmp zLn-j{pP~?RKW*>s?uO*xgB$3}6$b}UO;*pYhB?4jqA`+Qo}6e0DIpyTvMWKDr4(aX zm|amy9%kYd3oWRGSZM1av~2mc1<1{mU2Rk(>hoiYFTP$WJcGxb{SxTxT_!%V|I^8{ zt<=M*j^qRcVi!|@Q{ck#m1*ll3Y&J!VpFcltz+2j8ZPbJxpU#f`tlWN>*QS+gkl`B zThSVH^6N67IJG<>Dnu43DF=$9OC@n8^=lL5UC*;lyp_Jg%!;Qenem!gSdhn)fAcI1 zDaJE@v*Ovm>3KGf!aXG9+~&HTMnD9BV2r=|ZJWzG)7Jlb4TaC1va6JXMY5~(kVAIJ zETlt0C=R|#emW~k#)X!TFDxIsiqA-xJ=ryUJzjEgiiF4PnUqT#Ns_7%$s$fQ5Xtyv z8(R#L5aIagP}0TeE5zX_;Q1ny^FRxgJ=H$cMrw;>DcKdk?m2k0jSuQeZKds_o5nVb zUWv#2o!zj*4!O*J*wl33hN;~*Pu_l{ryUVX$dqZz;1+;{hav5eTiP=>O&^_^g1Le= zwkHqANH^*M%oQ4&F{N1juN1VRk}`CZ1@?=V4~c?J^gvcOr4P zI}7`*vf$?j1_t|K`E;N!pI>|Doz5JXlNBVaDL0B?53W&;;>8WN|(+B2Q+{%V&r3F&ALIU}2joB8L%2PgKv_lr+H z`Nc1M_WPZg&dluXhv`OLxTAAn5I4F1yVJSOUo8xeTndR$GM)-@E}v=fgj8 zYAneA+2o0rpBqG?kh$UD^qve%i%#w9%oVa?Vn`5`^DQd45D_aW>|KXkcW=Ijrj4c| zh6P7jCMHct;`L?5wvLbO+`RdM9Ntw8_l&|g9^Gti`X*;6=e(O3QJN>KIHU@J=HB|; zM=lxNzF|Y=>78vm$2M&pV|%;Nm8dEblgZ3XOzoRKv`e{8_XATK2UQQD#(B4r%0+PV7B5@%)%-n{9q4zZ}v904)qO!)sP<~ zYm77oJ%$)5)`0+laH++dJPe3w>WV1RnJ0uHs0)eUA$9^4+a%&Nl;nuqpAj8fz=MUd zj&Ah3;9JQ39`?ce3;ZLG*m#rEr|7(eaP-LJ%d*Caegufdv^y z(XIk6WTlYY7a3f*9q5A>7W#|X{(=77V1Hj zH`fIZP!<0DTLg9JuD(THe9A5?fb@{+(PvO~WIl9sAc=s2i`jw??~;ZW`S$6jzZNM2 zpc29XWUY8$>d5R2wxLjac68uH-j0ry})o=q_>% zm4{}n1sy49xNuCpal=n=mZl>P!b*$yGQo+p#MMx}?ok~OEnG0PXl`T5u?%XdP-djX zg8X;zGPKycQ0M7&p$e)PixJg!9<9zvDib`Ga-fG7ajG!5!*~7x7JQ)#5Dja=gB3*g z3PB~uVR$g!w&_-p0Uk%~&m*2*H#F4$G@eyOCf}vQyEcu%;fYe_JDuc@TMG-Ae@;Kw zi35|Gj0*5LAIxepQA~#h%4PGWEtWMU&)T@|x*;ZW)6s(mV7N1JdnZ~4$#u1Zap+2E z7!f%@lX8_pp$=8n!lY1~CaRKEIBP=JK!xB%gO$9s8%HNNMWC`4QfpZ|IvKNooUmd9 z)r^!v(EqOhX>?{Qh#`(Of-}B`@#=mm{A`c|CVTg>WBYU8{Mz6jehs<%|7>s&BFRS2 zW8FLq*55d6#5{IP8G&~}8Pd!HlpqYa0`L%Y5jQUv7D%)+nV|-05)D#ir%F_d7 zHnRfAT+U~OSmFR=STaN`s+;9euZW72ST{r#6EnPpOmYk5hx+?-e$!H7FG--FVc)Ut zV*($LoxZykR_*TvJ|InnxMA=ZnH&>J7ul^!n!!>MxRvB0hT$dN%{xbTbkbLT_TV`O z+zaYG3IRcaZ89{?hT-wyi-&iNS_@VJN4<+Y$gLaR3{^jJ3v2~Iv*ly4>*meF<3JbWpcc&G z6%Dw7g)qXNnVxJHY`re@zyxkjz9(~0uF#W*`T8|IaLx7L0{4zPJJ(_t8O?4)I_Lc$tF2@DmO@yr(1VyNAB zq6>CHgtoAOzJcsee_^O^s2{O2=3}PXMAgj{POj^A*dc<%1zt?pg!qSK>KKOUZI-B( z*V9+RK~s+7+id9e3?AX65dt(3JsgLfMuiSv+A%tQ^ZKy`nEF5m+4umXkDSvT1n3at z#ruHZSt10+OQzs?L>N>wq(Mhy5z>UFd?*}v;@Z`q@r@g%F$8wvJQI@1YDd*Zhz!{O zs~qucZt_$iHoUPZxA;nB<9V9l%X!U!%X#9c#XY2iIQ-;G<sLF-d01{6ewZwB>+xjF0+HgWOl&X#B;C;ER zR08?$Y8LWvrW5s%QQH|MVk(X&j>U$)o!}w~rVNjb#fC9YB`m|~SV?Y2f@@(;f&6zP zq-X>C7SZ^wfRe9S6jsQN#i6o*KdTYCayDtGxN$Yy_y#v1M2k?h3HyG;a3KGysr_$2 zYtEsRZ+V14Zl|SuwalXG`;BFZ=>bkqI8l2R-a+Zj75Z{8OW%i6P$~GD-+ z>*x6UYMgrrUmEf|8z`#T8FNPt%vBJNpeXYQ83_p$Uz0OHaO*&tFjWx*U#u`Eg8?v{ z7;OLZ5X-|!51c$?LWtkv&r7kdDUnrcu~a2Yi{{y5a53!^9>KRUqliM+I3dIRzxAgU z`nA4$%gXZAY3qIX+-I&2opFj7I*T;<|&Y09YU z6sz+^q|TxL??v*Tw7z8}{s+9p;o$K1YuVxNqUcm1O_eu#LzRGo_9v}ReEiA#zVda& zdcXUw@-^_05PZDf(xz06)MevaKZpg8{HGG@;rkznr{EI1Fcf&##Q$gSO#tLL%0uCr z!+>lVBiROnIYw*A+GAFlnLTIMvb>Vlmaw$4rIo;d5v$c&7M8T~?g}F#Y$W-@0Uv}b zKoXLd1T;MYb38}_0TK*x!ts-XBaZU|d3m`Yc?sc9Lau#Zo&8mHbx-$PJG@x*`T@}19*mPM$8ZH-D z5O6CRIM|ez%Sb5#SGoO>xeD51c4fe7Ok^8o9iopOq1=iP*s5<4-GK`0GE!7uZKw;}|#@{!on@QYcioVbd7*yr$ru% zqFi*=7nbk;j}iiZRi}pr&b=W`9-XB_fk(1#?k|SAk+cO1zf%|klehv_Q-y3pl{IKb zP>Ujz5&$w$@aox_R*=Eo_Zk&i1$sU8s`_-yvcO=n-MPu<`k(FpkCFF0N_wz$T*lJ zB#}@VWi73=3PGT(53mmJ55!s!Ih6H5LJ%nH0}Rz6fV?2y8qUD1M`e`t5e7lXZ1LPg ziqPu_DW-f!N|}BIu45xRWFCF*yZ%5cbZj2~eun!01?2lAxih&su_LhpvP&vmeeRAF z*@JW=b%f6BJ5|@6I|N_4y1)jBK>1cF85-V8hUQhhD4*VP?)Ee}yTVGt9UZ@BS`SIa zHZi)gs0Nq9$dRXc6MjXpQPbMeCrElgM$s2 z4Wi5%7qect2PrbGk$vT@xW!u&+{)oy1$oO}d=nZ$psb)|0z-8OATNkk!;IIM4fy>3 zI7xmvF-;y{c-Q}>8_(UDCSSf3IxJq|b^Z1|o!J49 zdR-)~iIM8;&DvRg`HT8LpwgFxt=7RaH=lcBnmn)$x~HrWjgidCGq(l_iE3q5o+%*8 z%dEt-wMm#-c_7X@NoWYqAHIRk9z#PUWOkn-12wyp{f=y9l8=m?DV{qFKlag(6~s?9 zO1cc)Rx1JInF6A`%my)&Ftzev_=uRy$}^|$2L<&KP@W}%R2~>*5o{fNLNjk}`T5?i zS8X4EWf$KBrvTs&Qvl3-umS$(=TE=$dDjiIzw`M`%8@NXOCRS=QCzgQx5vkyG5?Az zMU1H;LM*z0a7U%0Rw4~VRu7+F{vr#YO;OL{o?{}b2>gF&k+^fF;vCD4~JM7#}jiiS4a^qDw<>_^)r#83WwD%8NflAkK$z+EDIa88d=KA zLVCpypAnTBt=~9TH5eQz%2KgUuC~3`?cuLphAJ;D#P)%Wo4Hn{*Gx*GW~1MJf(b{7 zY!h!2zeb!hMyC|_F!7@PW`YK+*Xr?k3IUC2=((Xe{p1-e(G6tdz-ZDz0>IhZLI$a=UGg{>+epPa3pmCN>Yre>!3H&r_xdE(vjBO$wY??zuZ6}7-uedAqbdh-MHTj=>h5x#Jlp;N0& z>vFy80E7OAl+R7fwa?G<0zFDi^bc-=Z|TBkQ#-rw&39_q?tA%HcD=_cP$ZFF&QKIZ z$-*8n=UzLrD3vQU5*&_jX`!@$Vz59lGE9f$uidp9m?a?3AV zfl&mcksEi8P|HUke1p>ccDZzdfBoAPGP{CXL}9S6uWET(}!rQuQ=gv%K zWc)H>F?ib{F>95V89;$wchzrW{5AzahxG;yPa|Lo%8D2!sQop={Kj4M zF-QJ+Kc=Z|=k9`=CoXrDCZ;>~8Emj-_*9Ra0Q1?NJbXk6L2HWRqlYoD6%9?oRwe$_j$A zMxG@D16e$VajOKAE(cWLNA6qB%|V=kZ?#A)DXm@>$apz^d_aw6iX$bGEZrJ! zi-a-A$f8d(t@hH|_mnk|QQ%kjCCNxo3smaq`_9cmm`GKrRD+c)Qt`CjSR3?8R{|lo zU-Oe+_^Hqj&5OQRU`hPO9oun>;L!7GDz}aih-3_+c>#M>5B&P*Lb$ogus6?)$YB~j zeb>1+!K`s;QI24>o#ylZ>qzo^;&$@7>doJVdFDCi?t$>SDnOyauGtvK6{6TqoSvIF z(#|$iiu4nY8#8V_+n?&_MAaR03|!Q8ws#)+_P6PABRym?x6iiolB#13C)@u%+X+=0 zj}X#HdmwBfn%7Yz)DNCz#8mB>t>;d{?0r#yCKzjhAo&Y%Bz3b|mVK~{W z{6whRBy$p#m&KY}R7w~ulTrh~1hwM@kHo=sV`p}qdo!r9#&w+(LGQ+BNG(gOkl+=V zF={#t)*O2F+NWBIBWWLauCcxk+wqXrD4mngoU$2_Ze!VStrKLH_#Wi(H(5e)*#4=vRyNh)2}{v3VPV* ziYTR)BviMcL6VSX2@7WlE}CRfLdY`0lv#O3pmLt;1WQdIRy!cYGqcQDIm(rtUPl%>}U{^MF|0Ajgk!q>LeO45Dt6OJNlxv>JkaScO=I<6G}T%C!t? z2=3vu7^(B(MyRf?yvn(mOqcl4p8l#px=4mVrXx>nJJX$`Csq##Bl(U5dl;P_)4iviZSH^ydgtC=~kgeJrhmi%pghWnRgT-Fem8=jJ?^47hKd!s+Ye zHT1Yi9Ymc1Q=!G15y3{r7!`X^Jrai!R#aJrb_M+Z2HHToM}1pGJ4sblxEVyBqS*LG zB&BFq$(8Sb(jM}J`iYdRy5HY3(BrRhU!8%Dx(j`M^xhy~BThkM=S!)tQ&W)YKIl?* zp-N9W~(6NKqjal8sQc$S(TZ* zV`2vGprK{938OejN(h)Eg%h`C*}}2u?XAd2cBDZnX)t-J^KhyViU9w=kq;Ch|HWCzs*I&rzi-Vnj3Ekm|XReWLU2GZ~rYkOfm(l$EPmjAy-7xG_?*qbaeUepWyzaeD}~dew=4FCMmd1niJO!va$}60V$Uu+_byn zhSA--;U4a5;Qxl6p3&?7n%>I$%)i0^@g40WtiWK*mZv_wZrw9Ito@mMmX8k8E29mYpr{sky2TrD*zNV??!(`kpYP3QGSX`J85Jo}p#aozY43|& zoq8awL7lZIg4+0n^K2_y8a*r2^)NsG)vtgtz;$y6-B24IUaS8sNH;2U-)%m{vUnh%0vE-&wy(3_yh<~EfI1Iwn#i8AqL$I#A3N2@O#WTwEZroE%B4gT8NqQGK$ZEcFg|E@rzLNleRXn|B6v`<5$ z@W6lOAT&Wo!2fr+qC;Klc4lI3irx?SN*Vpo76k35o33uVSWnQjYq#6p)<&Nr))PFD zxnpD;X+jRWhuFmmu}kGthOU(0$qrG?H2vLq)l$D8Av`w zUs@c#f{NOFJBb=lRu`h#ifF!ix-zpT4$yV~>>T{2lg+`?_G}gI`WMTIl{vr$!x?A@ zmoXB^^!kA%%3KlbFAf?%&GdHg-!TO4HNE0z4Q;nnZ8WN%p_V3;+A-ueIEdW`=TicO=1;T}p*jr&~h9wG6IdyH_ zyL&gK_NE=#FxI>R;j+xmCxq~3ToHLyHd^^nZA39{$6_Gn0gt7b)OT4 zO>X@_mNUr~3x$qs=Ux4MeLVy46L9-sTFTQOgV!9pq7$~$Gi@IyWc|$S;ptVG{q&ky?JV}0yyd4U*bX(~; zaOc)$b(4xd!-gz@lBMCa!=r385s`UG>4Fs8e=oK(==(zEJBRnJAB8s@kk03p(kTLu zm)=dz>?oz+wy&3|(PBi@EeLKks$w8;kXt39NfuokfYHz-1gex-dG?{L=$LRu+2A0H znj9L6gg})v`$M?n8&xr>yr8V6o!_z{K+arUO7bUVF*?f2tUNQk3-^ue*gLwX{WrAq zT`j>In6)x5Xb7_K-S2i-K=mp_?Q*w8Qm~#srD{j_jPKsQb^J)@(PQuu4ETv|%jgZe zcEb;KvxH4X{D(X~F^Qi_L_wZ1{ik=A5^$q1Z1ZWVVET|X^2{o=gE1JgC}Ct75kT3H zECq(7dpI) z9G;!~lkxwYzpnILn3FG1){x22)q|E!96LNYeGoS9J6;Ng%u3XtyJ!j0X}JEsnJ=T) z;h*0(xdp8rs&P}d3+Co9fLn_Z`+{iNQF?V0z0^x@JP^so-GFXR7Yg~o-a@WulZT0F z2vwmA6vda6x2b;A7ReAt)DIg0dhj0w0fIECkb=p2JxP)eIt8D$Jt|`O4?Yv>{+M!Y8MYF8rHGBJ9bcRCr*f0 zE@URBj~+jKWNQEP@j19&pUqImqiO%-#D+#;&<_OAJP_B#pv34Q(}^AF(Uy%0yH z_U$8-H0(&w=S1h}@BSV1`aeOgA@nb5dS7p8MVfr(L%sMT-R2yaN1Kjcj^(7w&Ld>EHqQ zsP)u=6YwHaoc#SiMSAJ{KL)2z=|!bWQlt;hB-dS+KTZFiePQYO@B#QdZWA&D3^G6j zwE8sh`=v4&`Xw9o@f7V*yTh|9Gjm7onv!=zwd)Udy08;|fLL{g2zn8h=>25yi>`d9 z7Bsn>cn$=6F_p}$x0SnBu4H#n=KFf#@ra(>z<@bC{9a1>`vPMrZ&vAYoGxcz*PcC- zq8HP{F#lg1&;N2@xLVN2p)76Fi+V|G4QLXouLvOk79c*+TL|D9;ML;O>q209Lc&BX zR*!06>OvTedQmUwh^kkWfr23dTLT+Sfiz&PV5(kk)Jv>mMpcwz6j;3n24-NR4y%`R z#8w}u3SJT1wV+m`P1lOis2BB;ju=v%;QzN$&|p%5t$~e!gbhp`R&UfxtaCSEJHLy|dW^l)J*g&#@jkaObX&WW8NC_AmJQbeyN)QHuUerq_ z^PpCvO-I!m^^#3X21H;nu#v7Pbx{oU7}z?j(Wn>ol8(swWEnjJr!s_rpcnO$DM3)H z(WavsjZunr*e;lZ)q zg-`w3um0wjn1Du`Uers14t@8F4=SzJarBa+;5!h(YRvho(Yz9@woLc`Qsi?a^+e)1 za9T`hTWK}i{d_qZ0d=kA$@o_Ah6kQoT9qb`T#9H}N78O$fuMnnK6WLo!fRhhz>19q ztX?$43T)J2^^%Ur`eRlFBj~MqDGH@POlxC6bo1&qDg`-&?D4iJ@$vnamR^u1Pj;cc zTY1;P6k+ZED(e4f@+p%1ZsL3*2btDS_mo};et!}v$n{!Tp&}2c@k~ zKRrCM@9DiK=?B;LjSRyFHs|jtU0xUFbSEl^_tQ4!@UY%x>|wot4&okCCKA-tgsfNF zS)K~jB1uY!I*?MdB~4Y~W&|4vQIRXgJhQHJDQIe!>b~13d*jwbWh5nXDJYutC#9HF z$1%!wds?Gd7$I!=l8rk6w(qAmS9LrXjMwbh+rS!6h z0%T^UjvtwrWbb%`9}`C2Fx0=L^wLU1j!qq&rZXjf;Ys(9R@gDx-QT~hbR`gRmuOPP zA&NS4a%la?9$#%-z5djxtz=|JzaVcJmNd)Rw~Dq8AV)HU}s{##rs3}wi;WAktDyF_=m*i#D>Jhyihb#EM=*6i;uu4NGtM+%(X%*nH3qJdr_$? zMP4RxpI_=sk*mam0_(?z)?ZxeNRc(FV*RD1_7s8JUdG4aae>T{_8r4J*N;Q(dcAf9 zt$lgv>J-^3VY|MO>4g88u5Wa1{Qi5t4X;XF|NPQAms{qlTTY+uDy>bEGq066nb{xF zE8nB-`Kj)FR=(@t=+yi2xJu;nSqxM?CMKWN3i+Me$NB3b;I$DT|LND2t^xz!8Dm>r1O4lP5qzlD^wa}NZXnlR^PLcy{^rj6{L;OaLjMUli{@JQrZxj2%nWLM5zBK;lrQFE%Dbs zt91R-Zz&bn7bNBAhH*$=1FOyFYIikhxX-$l>)Ndd62tP_L_0}l{_IdG5BGej)f~WB zf`KOq56aWtL++QUP0!N6m>u-2ZPP$&m!S3p7qOXyEirsTbnF;Ybs6QL#Q10KjUPtpGPq3})LZeE@_6QYWOd^1eXK3_h{!h+=|HENn5=?^QeP%qz2AO;w*KXjKd9W+(UIo;Nx*U_KO?1zj z3x!!rfx0z;M6K8+r=p-sc3%{DjjTy!pfs2wCw!EKyC}ZnEk553AA>%dDGfkq7)7|= zD}$B`?0@mLM{C=xP-cTQ&J^YCeWChIlKO;iw*N<7OOn5rco&@NnZVz!X_&w1hF7ci zN@r0+2N^ti(qD9+=e1$sl=ohJ)l(m5SHEmJm!!L83Dh>c$kf(=pa=Vka!`VU9#Y#- z!_-#q=w2u&tC1ep@aVo~cFq#rDf=jHoEMb7 zUBmKDb<;DuM|X_EoAdZ!@FyzOueK_qt1Ifd!85@kkt4_&+;_c>VbU1VP z*yPOA(Wzr|6G!&HX=3ukiKFn{M~P3J<(uw=p)2#95a4r2)8L_?%_i( zB1s-e&+dw^Ub3>SQod7Q(}-sY6TBBf*MX6GAN?1cmN#Qx|7ZLEiJy?VD5BHQtfL&vLcXi{TxPX4+BWmoHyyNW#}cG+(c4qDV6}{cS|;!PjYKt5@K|8Q7N>FkcuHh7JOdXbQ} zI;wR(#&K_Pcz|_FX>L0D`X*e+4I6yCS8_Iq=yC(*{~PNx|Jzuws{wJFUbXW~*iIX! zXg9_>#SrHI@aPYF{%1M)f6Mk24EdFILk_db%p5&B0q$`49{S1|xYYiXyok`wa%EL- zX!9%g;U%Fj5)ylKRBq2=F`(}p7Sy)gt~TaQ0r;MK1ETxCjd~p%G&ty(Oz8_%O!;t&Y{h z^VM~v2GNiRlD9z(wnyPob- zQdjYiW1%GQLe9e>f&uxPTP0VBX1w*KR;4TG!{;{+jTg09N^cD{`B-D))hynb>TwTW z^)IwVu=$^?CG^iPJ$7?xXPW%tx+YJ2%G=}7)Gv;0KIUs+kuIf?-TElq#=Aw0zVY6^ z$dwL1o6b_7N2Bg$>pT8F8%=-e@}oJ)(+8S@z*ExN_G{49EQRMu64qy9`XFePmrb_i zZQPl7WIXqxvrX6*HZwl|f0GdSTm0$Kt4m{P@}XN6YNaCMO<>e%{Ja!mLiP!6E=%@$#f4df7|4&^8E&AZ1cOcAa4`KK$;aWMEBI#*X_P{6f`al~?)_V6B zV!+9&Wn0LeMB^O*UEQ!Wh@kCv`<4>WdS^i_p>5odLx)gM2#`h)1pmKB(hVU(2oOmP z&LN;ffW!ppjU5dNII%x-^IEQU2>$<;VC#zAFLpokR>I}#ElbZ+!2eIhbBlJLYzr8- z?dJs)hiNv1lp#P6(GbufKw^T6YqkLYf2-wQ@pz;c?G>H$zz{3X|4NfY?!&gB`Np|B_b{_={7l0jz;f zjh1dslfS+szL}z}!f&tvd$X1(+TdUG!r#&cYyUUH|F^j^hL~DIfVlJ;y=Js6(pySE z>&zNUXdAcYSxr1BT-VeN!T(Qt);VY>cs2{4tUUjPU;kwMGn9V47JG8+$)>Y}u!#^L zh-wJv5FkDT!T-@HvDYLx3QPLD2MuI7mSt90DIhK-)pq zXnRqJq#ay?4gpeuAo%}TqG1g(ML-Q>uA>41l%?AAcol4FSYmN{gid?)ow8%Gyg4U<;C|3x0i^EgsEk6}H z5|4BR1uc$|uF#2ilq)D`Ax60wH{`8)3=KWc%C0u%H)#($s6aR1)bvG<8t-mtUWeVa zk-^i`1N-Nn|IDMsCJY*kQca^%r<)o)U1t?O{ST>6FHIkMEzyVijRK7@kw19~cHq$$ zQdfA}u3tau-G^#FMve4>G=izsW$1*JV{Qflq@>Dbg&#pi@j7)05yO1CdF;w2AK zCCk>P&u76XAEmx77T-0QdX;vgFMgZjl{Qg9one)^T-4+SuSVHNtn`tL?f}((k~baxODnx=~ZcRc7MxXN>p{lr(HsFy+4pH?MstKE^he_v&kQ=dE!ZXAt!B*C(|fW zajN%V(cKx>|1Ti-lH_-iznyrDd=IisOs^`vE=^ANNGFi@mEV5i$dTJ;Pad1x1Y*+f zeMf7UpTBDUbWiEEX>#Vy(4^US#Ut_&OJs$m$vtnjR_qjreP%=HHEDAHgumE+AC%_N zosR4Lyx)}5_$7VwC$QC}TT`S<>Pz(S%+;k=gBsoMK#z=%k8ItRfh{k39N9DUah~8= zj@OKe>l^ok!d;{ejnEfgae5-Vd6;K1Z4+$~NKMUnNev599&xSGx}6EmvG;$ILxlb{ zFg9#a^bfX+6zFST3Nn%!a#8BCiJiHOJfc%k zPH!sR4vUKWl$@bE-afYSkBg+EKV^f*=hCD;4Y(Cde1>B!5-H|2_UmT#l#XF+)QL>20%Ghj~Kf-B#zJfjKLu#sC znZG_M>Zb26R0ZBTQN>V@jd*a<6{ftxo%h{>P6Ejo$4^DkmPrPv~Fe#$D zN4Jk%Klfr`P`}@)8w=Jn|Gbk=$KVqP+OM$hqeFvssE?RT9WEZ{xtD_AY(}%>@FQolh5o| zrUu`PU{AJVlcpAq%fh79TWZ3#*~w&(WADH7xRt68rus=Xq?57VSA(RdeEfQ&m<0jR z?@#&>Fx%|B40S-9`-)$JLH_wOFDOkzBwg3E0krgPZYHO+w!ZrGqKIj9c;Cp@y?b|J ziKtFrR4g5%zgBn#nhjiq+S50dj=~RHmnv+Nx?iaGgmwg2d8E;d#-wBiL?NVsYqJQL z$1nJq4%F8=eR`$ybzQ8(kUgo%RZUOxj5(6sXKa+W*Gt}3kio~QtmC!}JWabcFhI!w^s8ty4;sC(cwaq zo(uHsX=y5Rr|C03odil5C0NJ(;T4C;O z1sN8b&VuBv=&5xw1T+u9p3vf0Z?~GS#q&RZULz<51hr8=@Gg5Y$^`^2-mt4`%@pKs z@x;d_zE}-a%>R7{17{G1sJKh<&Rqg`_+_QKaru`Z8En)LmyRh@glc zq{E;#pE0f}6t#vMMZW%*@Bi{@)o0O)04uAp(u8Xjw|S$C#H(w!*gArCqc$UKlz2;7 z>m%^K2+J~~()|auuih4nG5ny<*67t7`1=1clKc^Q54o9KMrjmFZ?@eUv1!C+&_?Z+ z(%sr!Y4S3`0FyTmQHow4xqnaTO=E^mwBq?U2Ens#(Abjj3$y8z-=W;r+0omU>x zhzprY8ncXAX2YQL>B>e2od2@`rNzTPx4w;c8`>$0ZU#UgqvIe#;c zT9=u|WtM#g)~9;eV$-?Xm`Qz9MRzgWS*WCd}Ux?)aJ1A>rrum<%+6pF+K~dZy5R()>|vf#@(yB z;d4FDP(C5-t%L!C0t~UG&EH26{)1sXhdhVS{r_ZQf+W5Lhd9+=0}oG@?oE>?ZW{-RuvlITJHQi)|TFyChy}jT+M$=(?t1 z7-7x+PuKqmvWL*WI;F?fl^edp+&@sXW3qiw((OYjws z!eDWrI561LSM1IA4h;5o;pCx!8jE>1f{7ez?dreJ))be5dC@h0YtOn`FsT0`Bc6g`8-JnJKX|!W!$5?e85VR6>%ZJY zHtx0X%9E-;;fgDDcKx5akicJ@Vht=~4gA~z2i}DLsqNNnD_Bu3y;TUT{hwsN|C3J> z@>67cxDx-ASd%V=wY} z4)-p)*M|KMWLKT`g`gc|uN#@1pZ{q%!jgxTW?&;@WA$1@S^5%ElaKj#`r_J!idM<7t*Iai_qn7ih2BKcO>5DIe^i$4kp3eU(lJNZ>c>X_i zFx8h@o%}}f6Uk|)ic_osrh#qFN?31Q?tU0=<;s;m8AV0*)rbrQ{h#jLNdqy+2PtQz&kh^c4pa1jqTbvbmVJJWS zL*FqYz5=Aq!^0V$&uwO$=cS1H@mkJB>O8!8_;l8JZi?(zRg#dm0$}0q3g<4?YqXV74}(l()9U%DTbBCu3>BS z81?@&`8SgIo5ab)KFBPS^jhZyp!i`qD`wgefw%w&ezW0jG z%&{vvvYmIeZ5!FQee6cKJ14V-*0z0|ko6ho5^6(xz(`?tEt5HN_|B;#hwqr4K1j)T zKsfJw_!8&&@S@MFT%fi26UX;YP9K|`m}5|4Qz&zM20mkWJ5;UBceooxJ@9LbYEccc zswcbF#e(a+U%&q{=i)SZxVvHOln7G9La5XUP{Cb^+V55rq)@1HKWkLV*xnsGV4Ohr z)ZL?471C~Nb&C2`jUJ;2P|Y-bz%rSJ1puiS&`+?hLD*PWC4ht|gdthFx)%Ka2lUOq z*Iiw@uhxHhUiF)5PPl&ip7HHtTgTfnnS6F*hnNE4!Uzg@3XI|CLLt^mYzIxZ1MHJu zsyglA7Z9-Eg|*@5thUS-#GZ9=3~U zGMD6wyd?~h0;!?t@ThhE-u=AHbKB8Wg&A#-rz#Qt|yGy-N!o`?D^E}sR?j@$w?o8 zV8a{Og|rauB3QBQ(A?HtV|!p7 zvVCk^tW5A$XlDJy0eFQti@hCub6P*P58?F;gYye;(dw%XhXIST0zB2yJJ{3TTl99- z8`nNAU1IQn-=3X3HaC&) z0IToM_GSx(Y+*yT&9Uq{h-kuPq+z|HH}fcwHQxWL%MxdXQ3FW0u@`*_NnI+bDD zk9-4t1Dr$)oOmNYyS0$J)-CzMxF9^&)n(T3a^_TD-zLAN0O2r7XdxJqFLZsoMP;|> z4$H0b3ntPVoy*{-sausXcXh4Zvj_h$1U60W(!I?l1Hr!Q#vQx1;K>5=YhijYs-U>; zR$2!%C#RhR_5X{=4J7%2A~z+Dr73s>_K#|}-+ws%nH*KsM|j4!V1_MDmF zzJU9R09@2x$#;;l@1ci|KIi2r;?AK%SXVG}OI=yyeVL8tDjMQ)9GY>X{q)NFQUkY; zZO?bJ@CfkP9zCq#67=;-UtA*`Vmz7$+?VLMVYveCnFG#?;fs^ol^+Zp8XkT1%{yQv zLZ@*0o9b^(9XU9C_>T7JY(C%7xlu&_p+hq!pdZ}+$tS!?+!^C{GEflM6Hmw=Z`Ims zZi4-k%RH7UgmxyA86Dr60V%x;G&(uuJHY7@fI;^`=u)t&OHFJ3I7&+tgnI4q{Tav| z<3BiyUzI8Gt^r8EgPsNkhN=IrA_aQ?&%>!5sY{dJO@1)BKY3N+uM;eL^iq1-(KqIAS(DE?rv7z{PO8d~xYTA2V(hx4?u&tmOfqQ^V!Kjt8DR4_Xj= zjBv%n2*}(K2AA?TNYTL49tl?vp|P{0-&vm`vub#>0If}CBHU6W7TJr=)fT2)LpDSd zr$OL#5pXF(x}ubP*G9yZlS`q4t^boLlKQ>W&!?tR9gvOF^3uSWHm3-m#d0TFm_qid zJCXW?htu0(^Mi2crMb*0cX4$JzvhHCqLh`-&Gb>6N|1epo|}>_duQ(+SiQk&H4ED;JPLLT2kmnPv?){2ov$=y zb~ybh;$8@_sg_Q#u(=0QEx+UJ^3KfWJlt~D>-6DCg-^?Vv+;YckZ9EZ6J!^me|1O? zbvr|8^5}jQJr|cPX;z~Z>S@S=a6L)-_y+2N$J$X_#cVxAtyk}h^%TlSf0PA{Et-O4 zr5>rmfHZ}RXP^Va8uS0;O9=eMDb@hez}W-NaGE?6aanLmzDod}%*hw>eZ2+h7JlK2YP#R{e>omp2$%qn*Y-QZ^e$mFEDOI)#4_+t0FIrYx$WD ztf9rrI;0L_2eT~yeXR!@Rha7re>;pyDU6hw&4&>$6j8S8$nKvxM6W!w%NjQSC%!`9 zFHVb91Mk@ATmvutpNw|Z6-N@+g=x;Zu3yUW7Iyx>OidnoUc=5xlOrSwW?{CeVk2MX zM!vWfx9(tBqmkQ8b9NBV(x>wEe`1=zUz{4Rfp=cuY)X?4ToTXJ+?2ERbI+wbQ`b*R zc(#W5|0{g|zeEW9wRU=Nw{vZpyfdEv#Uv2Bj!=ZshwXy7j#|R5vsjnRp6h?=^NUlD z@g^YJ2#q%Z!|a6VhE7ZNCA0$oylq?aDB{(qXT|C6Mb{{G(^*23VI;gQAm%PF>o)l zDCMBgF}!Qb7UxFoW_$VcgPlendx}NU$kP%fGUD72K@gpYE68XBL2|$v9`%u(k%DY- zu8&9r?rK*=Xa;(7<_c#k+^gG%^;-E}-AV?`45t-uxrt=TXY$S#(9NL*(2b9`HYOZt zF+diW1gzj;8W`oN|6c@8l&3zQI+@y(N+iFMe0$oueaxP zX+R$+V-~U@mn-!5JFmizVks*%A?Yn~@DN0QUvU5)CMyi}pUyk`z`(V+fUQ5+18DH# zGWbvk)vBpj_1KFrR~U9S^1AxHP?<@1))E|x64ai#o}cIT4oCab*tA(Zi+$!=XD>YQ zny_mogwP>CjDD@DZ^yjP#7G6!nUPYe$Vd%taK>Q?;Jyn*vzQR-;UKjfg;jCe@;ll` z*chAo4vmk-sQ)L(215TTr-#OzTjA3mYwYrihe20}d8rLvGz4kut{po@#@Pn7T&&Qu zd1TortZgJgd1j9j(uET+9Hk!8*4EBX;>g@at1%0+cg@dd4$)U@i zzGK&(J+p@k=v~iD6hAqf`FZ+SBkhA0B&%~`P?oQnjJ1o>yALO!cd0G=x$@vdZtBJKu3s9HMubNlD!EW-%jn;+RZiW(GjRjN?f)=cdGMjR6UPv`$+@&hFK9XP}( z)py<5TdT}kU{a^;o+%q*ZE#5Gh&B1F&;9Y6#O&pKB+<8r!yn7_lLJ&^@ZVW;3 z$&%%8mWKMzAVMS?FSky~9VUdr?|=UvU;qCVA@H|!(}OQ`UI!ohbYB-_Tk>oW%A>!$ zuq?e(1Cn0Oi(0puLup4Hg<*KA6c3f*Bov@V5x2qP=!hiRBd0g2uoeSVkz|buBpVgn z@(oT|!=W21oWy_d z^*?|#&~88y%78kR5{lLF5;tbl^RkgxymB?SJO zpB}u|c|E)?ED?B}w&?XtRj(G^A|A7o3es$N6iBpnIm6|1l1`78>b$;cY+n|9YF(c5 zf8zfV_>0rh*TDT3JNx0A1Fu*r0hb00@5HvmgOu#B>N(HA(M@V95LJQef4cd%)c611 zuypqSU`Usd*^4!SyKJT1S8FBL;&rcp?IxxprmKkH3$o3LHY}9y;*7Q_jT;amQig&M zb%Fk$d>(2Tez2~dqKf?dZ~s% zF(ZqY3L{QQsU}2M)iEesGCHQ35VFjwwn{_?@RFtTGampA}b8Z66*51sR)c0vVq?C>XB_^=OO*qoDae35);a3zqT~07R{+h*1ml zCSJ7LSIi9-;SJR^d4@{a3S`)bb2xca@S;M554-6|Bzjhej3_QeVWjXBd+{p}e;cg( ze9l_-;04@LbM}aH5Y_>=g^yai+g?t%H#}b{cDkLGxO(SRCuFmGj!s(PHjqbSNLTDD zSPwT#)knyv0ir^=vlQL`Pmw1{^81OW;nec!%w^6U;K|()>{Dt%9}P_(5`=1wfr*Mx zK!$ELP0Mi*L~EnRgwja3;|O{=wCMCAw4$^hycknGSMWUa@Sf8=`*%aAc zFg-bnE@PCV{7_6b ztNT3jDV{cwKPDrOwfU-WUj=3OsT+8ZJ1bvTST2~DBaj0tAf2=#f(TOqwP^`Shrkr7 zBJJT%TPTJbANlY9zf1`HwPt$oHO?F1y`RO%5nO0VsRgOZ(5Dr|s&q7f7)eeLm<7G* zLe{GhK>!M0HR{7f$H;4~x*;eUh%OysueB_=;Ix-aN~_Ge#8!~1x`hY8G9LWC7(M`s zDK9E{k>-pRg#j6r7DZ2V|4$~aAjx%bh?CO5nHA0vm`q-@+@g*MS=6FkBRTsj=T6uZ z=vi*cu!msk>dfPt>i;UhK*kcu^tr<`@i2MaNahYLoBtDUAn+Hb258`cmpVt`SAgi( zpK84G#etrDkH_HL!BmitQ6?!W_1OqR%Dlp09AvFL>#ev{3x7-p$*ig+cXU>5kg=j* z0Gn)ncrFi2!OFq~mAQ&27{Df#BqYxm-X;UIvuX*?&I(D?!k|}p`klQ6heBCYHVt5(|6zo*>T7)AS7%2>75y4W0`3a(SpTMMb897xXk<5BfbUeL; zWHY-WerFggaHN$jW>Oq=R4;9L{hIRl|y^1R0c2wQ5jx2u@~I8-vCrBoqM4X4Dg?ve&vW z^b%gDQ-4Lsp768Ike8U0vJb8RvRV?LWiG6!5mPlQaY_)VDTH1tf+x^A9s$W$+@X2F0I8-D+5p&*Es?$k-~>DCq!4Uq$g#AqAub* zt6L|c>k^i-AzrddiKH@|f+%)da8!Q zsG^%upeEVD9two_G#L^DgPe{B6|naIbH4xoLqgzhiKhowIn(eE!1_A48dGMM)UJ0l zX^Z(AtldEv4RP=c5Nu=j?dDSC_pF141dN;273eFNap#~*oYzwJGQ>ir*z0PCor zqG`aTj9O(@N5`es(v#LB*45UPRY?}8`HCjWdMU>V&a8|^#p0xjvx&>d=&iV9_ag-n z*bfB-8Qt%Ytb&3hB%_-T3ai$r>G-T9_%6AqpltvK`9GcilgVu)`B^x`Db_%h8hHO2 z=dLt)^2T~CuE6c-_O$I52w1lMpGP)1$KeHk_tlHtvRuo7BL6r1|0@(1Q4ANMQIEz5 z6g7xiV=k#DEsZZPVEMewdMhqjCX|+z6lC`#+#fU!@`fXZf?-gfQMJ9>_F8cz!6+Nz zAd1j}N`aIZkx0NgTZF1}^_3K3L{SL7h^j>f%wMCU8bqz(M;a_IC=AGWlirF;sM`V! z{Qs}9#=Oub3k4x4G+J7dKV_?AV2!9$2a^jV(QILSY!CHVi~>ICt+?bJ|9I@NF)fC% z4>Er|n%E+6AF)YgVGj^~|C8O8XM=^sYB+IhTDnsrN=gnLT2&)NQP=2*f>?*WhLn;? zcv-e?abfzton}CKD=yg-$mwDzq`P?T*NhyG0pzjLkU67jq;OP=okb^!fo$}l-AD$8 zzDK7X#q?Z%b#=|pTQ=_oXiEIY^C9uK_<9gSSE#P5On~GIp*>x5NI2CX>f*>D1C-bN zbR*SDXxx=XRfefnmHfg?AcQdPWZZ`+tfgQlZ1eQUiSFUCvCJ ze6X75#+YwtF2{$;Z|h3H(^DjeQ3fCg#Bok2P$>p7D&f4W)B#Z`a2yzRMc_aZ%@!s? z?1O9nzqtUsc{*`B99N%D{d?*sseefQP3kXF&!)bU`c~@qQ%|M7koxu1CsXCrucbba zdUxv4)WfMWsZ*&prH-fGm^zqxed^Vz-Kia^80ndFnnQu0@l zzmR-?@?FVyBp*z^EqPCJE_p0@NAf`Ob;*6no0G3hUZ1=+IhZUYv&pNIndD27mnEN{ zd|on{_)qx$@INO0F7cO%|CRV&;tvyFPkc4;rNnQ-H;F%%_-Nvn6CX;vH}QDlk;MIp zd*Lg^Gl?UK+f&!2hElz$4XO52Tk55$7p7j2x-gYa{&(``SX{;@qeCQ4aZNPzXXn-IuGwqTm8xN&w=A7&VyoCf9!l3 zj_1!qY+e0uc@mBfmfrx!2g`8S22HJgLHQy$UR1sijw{Nv*Uu}{UO%@?d-|L*d^mdb1q{0nCqjz4gY!SR1NN8$Kq&Jj31>%0+; zf9f2D<1@}3aQqWz3Xb1%K&z|1>rBA$I}Ye})wiAfaQtKE^>F+n=QfbxBj>3+zgDL5 z{EzZm;rPqtd*Jx<<&$vyQ2A~+{#+TPTK(=aNV588%OJ_>ca=es)lZZ`lGTruL6X&v zmhXh)JIf%+>YpitBOgCwipUZ#@#f%7^ze#?0+9KY$n_^$ef1LM2u>&_lHe$Cki z$KQ8g1Xul@17o-9cO4kJRbO>B!SN{vMsU^dI52{%e%pZ&T=gZV2*)ovbkxe{laT*{ za}^wa%YiXk^?3(uZ`Eg=7r^l|4vfgE|LK6{SAE){ke_nEm{)zg1pQrAE>ZpeT8Zla zS4&j?zg(i4|4`{T96wk(!sh?v1_FO^iZxI{182vaS$GgI`1`NkhnD3e4ChF5rJ8vG zk-mVb(aRoluEzXnAME@U6hlX)z`jy?cwt`|m|>^`;-eG7Dpt@mV_@*B2#5lIFQDKJ z39JVil3vhB=xrVbXs}V|5RxA^oeM7c(%}t)cGP}E=YTq)vY3jli%L>sOfRfzZCdXX zN62VNHSpTlV3a~CXiC$fEa=F%bfENU4cN<1sk;IuGT0T<}M$t*B5(lx% zg3(>G15|HP^jNE2!qEOL6iRQ!CEvlt#8n<+>Qn>i09r_BPKNVqpziF_s%}~`de2P& zy%m?h|Nn1DZU_uhK-Gw?g5Y&aLRa>lqE3sf>N{kru&WmK>987bb)xISt>-zt6_@Os z6oequ>Oo!WuM!?I-lVtUlCLVfM4$#^>Ln{3@c(~waRkN2tJNlYM9GoV7}MKJ)!MY) zDUOiQl4{_!O^=GEJW@C%7X!d0uR1A?f)E52o566gtCpIhH+}SkvaKgIB5VXr5WN+b z!2kcLRmK?0rS(8H@Y<#;9{5|6l8XW0lCMfBo$%0{4CmeSUR%2?Dsf-EaC$2)+4WL8 z1;sLt5Ajot(;DCvf;)R}huYS3sYjVRfeK7{z{q_^Ty&Dsjq z6lSHQp&8X+#Ydn9VAGWj{H;mJ#Q<=rRa9yd8_Ox8t~(TZBSKdVq7GIGL2uKNznD-c zcwDKF>u{VdmD-^hetpyv{A}lQQy)lKFK(HGQ@2l?I5M|?a$@q1sr|Eu@0ps{Qr1bp z^S|u(Kk_St{Lv=(P2yTYTlLS+JDUGfhc~2ehJ$SfrZ?UhtYj?N|sBc>h2)6GcPsQNV( z1kF_1SRq{rvWu`ssuNL$xXxNtGQc=gJ^%kV4Fy*JcLz-jlWqAanj}O`i$#qV?i`|u zsu8#{N-0P1)CN!rgPAcR#j>~+aYWVjT0Fp!fOP>7sv#<38{PrU-Xijd9;%JhjX)AW z)RQnHO|(Etj0{4p46HLosL+5*h?0ilg;`h`Kpei}_K8PE_SDr&4sfbzVBfT$8|4BU$F44_UT z0xc{tFM1TlBs9bfD0=X@#4_lz67WSK73W2>Aqoe!2tupizZeI8a?1=sw7M{&(*cc* z=t3yjnCMhsk(7+GtaVm&L;}Ov2cAJx)^aEjITy@JF-6j|I?=$_|GZIDNy%}s5lTnu z!mP}Wnq?i<)hg6S>A0Vn z%{!;kj5|`vsEo7Lok8e#s7T!i=4Nl$-AoggrJB4C@L8df)x$U99p0ThdwGU zi1;55-{af^d)FuHz5&Yhk~fv(6%nNP_s3uAoJ^As*Yv?S+HIx}rWsY@+fyN;@7Ht=01S$XnxCuNocs6uVhsO!$T@)`vCKRjI+l1Jx*~ND|qq8({T?Eyj z!?RMIL-cCdM2lJ>!7 z(xE1xXJ0~?fc73S(J@y5!$rgi5l|4K4tEOYT@-}@8O}jvG=8FyfwV{ zOH|Zhv2fl+(Mi!#1rY(2LAbnh5}Y)vGa3SljZwJlCGI)S%XWS6S*-vwM7AJ^DohsV zEf_#E*cK>L1*EANQCqebY+N&T|6lcA@XbR8;A+ZMpr{KwJPe!@gCn<4s55F*6R&sq zss_oHo>e7>Rz==q07Q2R%7Q0FnK9B!niL_K2&%~HBqy^|R$hpUwH=7@`gr_Wa{Scz z@C=tx9MyozGBOg6uLZR+d_@g1+$dD0lHI~Jz<&!IMoJt!GO&6tA5raNs=ON0mE>h? zP;%;|5sGS%sEyPH@Cf4Pilv|+gK#Ww$Bd{+gPaJVjEl?ND!=*? z|9QkwGUg|QCC}#Qw^e)3#VOpzvob?ITawBoa_6I#-1 zke*b7sKc7Uc^5@tK!$5sWg1{=k_Y2&iOoU;)@(U=g%yN+u91-0@LtL7FGh$RVB>`D ze1$Y{WLU0vIyx#LqNvv05_3uL90t-wN0c-q14DLibnAE~b7&^?4Fao^iUH4PO#Fn? znIja{AnLH?;k=8YFd(z=Rv1=BCO?z78du@HZw@bHw;qN;ZL){TJQjX%gne-Bd5>00 zLgFI~1uE*WW^mp`Q5bB{X^CYhfU058yqW^YqROxec~B6dA}m`;70#GMb!_?kUkhs` z0~bK{P8W{WiuUI4at9~AUROh+hDy}np}={C;2IbkJc_R}T3bUb91&HLtBfn7%BeP2 zM%t!VD`;;MsDS@K&M??v$*&OT{eMY#@HcTm9iILrOe?tqr?}$~$UkK-EZ# zI&RY_6u7Vo6gEK8@43@?YnnK(ZGzPCZ*_bOl>Q;(aZ%ief`B`Eu1||PMg`~uk9D1R zAtoM%L2XP{+&A8FS1Q~VvfqfGs~${8Q!XM3Fkt%Z-9$f1wrJhUKte zi>hEA^`OBA21$m9qS_|!5U}_EB>tAbU!0b*2JXMqxi3u~?rOpshkK#xYrM?OJ(Rn7 zT!mtJeFSQ>q##5s_Gz4VkrW0aMN2AEBflUXtZe}|K=BSCU;jT%{r~C3Z2o6nR!*eJ z{hO;dZ!s#xK^B2sJD~N{GFUr0u)0Csh#(XwqoCjo`^$RBxjb|VxP)d5LAU~)qIe}G zNjUdkS|*Fs|53N8Hke|WT9j^>{*|t21~svIi3BZhl`laRlx(&U*MTIejR(g@5Hy=D z_T}>f`P_iw!2nvy{|}O6jvQ>1|DWAfPQja{F0auynJ)b@B~Ud;y`}@g$k`p`B#h!UX+#%R1seo^<|Ck#~~hcM_k4)54}RSC^jyllU#Q8y6qG zFk|How4VmuarMB;ifT}?Z~-jX&}p#L4bNOzz5p~e+)Pa^BC7^NN;lMyLJzn$a?D&j z11gOO&Y{V=uoBx3m9;aT+{ie*isx+opZFp5{~s=_^T*s9tbx;q%Fj!avwH$#2K~V+ zDCP6Lz5T`h;vkI%%%ZY+9lk1v0{`W0etylolYkdk!JG8Ed;0r(dh>;1q1e~k-_zg0 zU#mYqPhYM-|5Nsst38v`>wE91_IT6^|_Y34$vhjsMfq{@!xjYO7jKyHFXRy%2 z0H_oi2!{=91dx0m90np#!=RjnwVr7Hp zpOz>8_(kOl;ngcwRx?3*f&m>d&u}X!_~~`!J5H8Yq{+|S-2`@Fqqf(jyfrQFWYSkm zL4!RkU>;kl5ekg(Lim4iY#p%3iLFCh1_r3ZSn|cILYS0Yov0AMIJ}BZ$~<6tCMy+3 zbEb3HjYGj3%|=mxg6>nc@TSxIMCvBCV?Ji(m00^9#mFF|d#WS33hJ(Go=fnTi3prql zw_ztnF}!^&yEUD8wa-))!I9($RITv}7hFE{t7fugOukl ziE3$NWUGhm!PS9vA_8PtquD45=n(80>2F+$5JJf764}YBdm{-25U9iY91QzKvAKCYBE(3?<`(^N zkT`a-xDdj+g56(67c({o1Pgo22mil95{V5uHfUv7(kP@I%7(}mW)iX!kmSQbhwz`+ zm_r#e`2UNwE7dqcGgAy!u-b_QQOl}$r zY|zq*#o4f4qZk`A`2S1MhHxCAz2@t!2@_a@?NGJ`*kia*A3z|E&T(|E7@fiYUk1h) zU`FBWFgEBWywfO-&fZw;t%;4<@{6qWPvd8Fxc_hU%L}y8vu9&MR($1`cO<+u#@NIL z?NyPt#!#9ZO3#SN1~}W}xleTjLUy|G?#80s-Jo~;*u39sOYsjXXfYMiW#av3W=A2l zMc*}P4=~Cajb@`Lz(TNFB*t9z{df@&S7$0eLhYTCyfr>U7h*8Xef6qGRT8ojSRzK` ze?8_M6K_pCO4`%f!Y06AysGlnw7l||vqjqXf%X3ytBw88a|>DQvmjElejvvI^73I$n^!|B~_x(&Wjj>S74Ai=bwoH|fCI|0?SL z3G%0e{w=Ze;F|L4G_3t>FKiY;a&$7OlU~4g{KLgJT-9Zk}B(4jgD)U{OX~i^r)QRA2@LY(0TiEC6dX zE}O-;RDrDn**3`7hbIq?AnMc5ioPPYTr9=x`SDEEwsX9RJ|KF zV7&zXpKbKq8T(7oyR>TXk|e&&!v09}-sMOfHu4?d|J~?L3Rh_hKOe+lqxoUO9e<0z z(8j<8YJ+1M5{_q=iv!~Yy1sk|J$U09RZiG(qI>>$H;yYd7+t`G)jkIg3k}^_)N8cB zu@ahF_}E(GXn2fJbc~;R3%TMz4|K8@?wJ_q&-L~Unh#@GcCh^vH$Jju$0(*BYtN#+ zvGzi)!*RMiY5u44H0_z3W@mJ85>Vj3|9_jL+7sViV!!__-|jqeWBIZ)dC#Tw`sLHO z+!oFVQ%sg-{enSFk(~3uKhGep^j9#QYlVw(GyG6m;eX16HS)$!43;lVlfS6XH>;@T zynS#xh`TL7<>$f~keu8F20uj)i_ouj>LfwZ0PPkZN4qkE`ea}jMWIwLfv7{KTc{vQ znbEAZ5$ao9+2NhWt3ROueroZ4hP4T|PX>lj6mUUGv17OlSdK;wn(Fra51aqVr6lpU zaNy}v{pA;?$zR=7arPMG*QWvZlMU(Ohv=erqfC(Sa~Np$#c{cNH+?-wb(B@`h3;A+ zIqwMOCg9Bd4h+J288B&Zj-EaVK_JlQ@4vKsIox2_6?RkwGeH5LtgcIMF*D|5ffJ+! zOcwH$?8C~rD#n#{+iS=MA8TdFYKIN&V|K7u%xlW6qyK|xu-E_5-UjsoD=aKrh!GWR z{ijw6P}#%lDp9mp(bOQwwGn!tnC2=)jgZ~_y5Jp(X2p;imq{2=dxQc2%(k_Vc~#oh;a=A6EA$^ z7_oC*2Oy;FH!41Y|M#QYOl1G+IblCZiH5MmI$9YpTwuL6Sf^B_&D5zd`8WvrJH|pp z1!e~DL_zf%@pQ}Ia{mt}Tt|P;Ru`H{Dnm&W%@}HM)_DH+P6*8ED_c#pF$!sk^|G?CjvdMxYx9rAEWx&SER|~H-)|5C3t1XLV`GWA_J_UhThX&eo>l~_BMeXmWAhi zgNF5Hl?pg+FTIhmJ`O_HwH}e9*Kp|(J54x3IwmuRXzyn!_B7}_pDAr0H;H?$t4Qi|sW+wa$-hq?PxdGNDN!arARmJ2YSWhTx->bx zB2cM?4cXoe*+Q0{Y0fPa;HQnz9iv;yYbz7!&SyQ(Ja?_#<2d<_L+^h4k;hKoSiUMv z&IUgVTfkH}vR(8%1a{C#V*8Hv0(%C_nVdd0IWgDnZE%EGYYg##yip^Hl&@b4JihHD zwv^i{>jQL|FHnUtl@|JihC$6zscS+J$psM^C}&b6_*qy`kC3E5DX~Luq2r$ND}en; zyLQD>kzBKO5US^ZAG`SD?S2otkCa~y%%5wgESTqe^Hf-7lyHJ`p&vQ`C#k=eRn#A& zk?rkObT|=8OA>i$SR$@4l*k4Ui4u7&bB`-46Jg4N1xe=Ay&1YNDQ4-~1T^s3-`qN$ z$sD5ozk(c-{{N%oN0J8;-%4blssZWrhVq6qIWrMB0x*eyl=P7&nR@$KIosV!|AxN7 z&&H7g>wpG;EOy9@pvQ}pw57+Vv*m7(__mrPwlZvxyw5LZLEbg>m$$puUvaJ`wQ*zP zx24=w(M;)(D+}c|3WSiEZYg(0Bf_jlS`oAP%%Lsij%tYjB}JsY3L>3C9z|q*NFv2k z+-<2Uv&tpd)U&00br>S9Cfpn)M&khY|8%mOB>yw{+2jml;uLGZPXk-Zg)kP!Z53RG zni;?*!~$(-k2u$Ur=4FWZjE; z5EGOy8k3N=a_xEH{OY}sqDE1aWi}9Wd9CLEMBat}P!e_urthS3+M zRPIfaM=M;?N%5E&a;vjxkV#K( zNEC@`E7R>`r2x|@0qGfa-G_D-t|}r>$HXypjgRX{0t0Wl z{7eKmR8E?(S^;o9Wq%{C)&ar)ulGvH7{j4*(nQn>fa@vy%dbEo!!g;JA5^2L(`=&& zPH3BKka%uZ6I3fOnAi^Su5JY%XX=AP<)kTED*&#iyhv>@x+ZAnjm}D4GNmwzbj>eo z#aYvsR$u^4H)7!G*AGK-UerX^3JW7Y69EpDlP0WI09;Sm7+bWWsdh5(O30YPAs_{} z3dBmnOZp-BNl^c@#!M>!j;Cy>(Vwh|Y*ON8Dv#a;UE?T27r1a%7X0_VpzHs{KNI+i z)AG>32Tzv!(&V#uhuJd}c7+WL%pN7v3G_&f?|_2WObiqU1_}cMgZch}{{G(n9t~M5 zFb?rdBNT0_Mpv>s8Vn8&l@o)6wf`3O{7>R7B=L7}h*L8)@c2#Tfi(H0D^ z!!CBPoU~!UAYws~gb0EGASsd}Az%rDFhMK`ESQ6l7$k}kMOmU`Ne(9m89TFdIG=;Q z?`-QFPrS2|^=*CI=YMzKL1)>%JNxeJ6aIUZx~jXX!%X)~&u$kM9bdhA^>S6$bc>}o zuIfK$oKW`lqH7xewRUK` z@`{BCi9DUL;2w->dU~w!CkwsBfTt0~PbA%VuANW-rXz3%U5{cEDln4+1@~{7+9jDM z%9dDV9RDc_ZWT-sxYixDmv9^grrk$)xwgmite?Ik=%hKhUHN`&M=5ZYJ#`y|uk0rNGFJAV zp~4}DDh&hdQGZceppPu?RRjeRXb8TPOmRnu?vf$ z`{<5-5ROU{kmW>^n|8v)$Za`hZ{5cFk_AK;gG-n=^7gqeimQ1@L5bJ{MNrsQxz^X< z3--TRwC%cdohEso9V8)Xjxq^UsIh^Odgzo!=!7l>IP0rsNU1}^OpSGV{KcqhkmAzmfGx>!fxpe{eG#hBe+6Ov?rIc(J<$nP`=%ai?AA^w6sI9>V0K&RNf$Vp;mbVT{%c1H zf0=aHR=~j7QujK%tNqam-}8UTf1U4w|DL^s=GPM$lX%(?r%GFlHl0E^Tk4t-YUF}d zxR1xKp0rJAic`RRBKM44COj$j7TMEfq|+FiU~g4b67Ml~*iGNRGjf`){J_|H;pg!fmk0bUAwI!nzW9ZfjIaVeHkI zOE2kcudHpgrkd=NE$(g8kw-2j5Z^T(0R7j6)J-z>LF0vPT8CPp-KUK)Dva%#FG_0o zZFngqeOn)YsT7E+6;o8tCy7?jaSakXQE90s5fo#SqBA%;qjS!CkXwO)&d#D9iu9 zN1X3vI{4?rCBuQ2PFc9TL|%JKyd;Wy(5^I&hi0g3`AEqB zw=(;Gj5v=aqhL9fXdF0RTDYP_K73aH4biNb5yMJ1nH+mZqsRS^1v*RVnV+w6u$hQ4b!-0tbiqi%IwJ12IjX4!_Q0h8O2Rp0o&RU~KUyGrrJYb9G(rGkB9Hal$BWBi&V0fl6gr$(UjyM)M9;eEA7zib3FyFtk1}Mb zm=WP9OfYy$!odMMrF*uKH~BRmlISc@uzC&y8X1b74M4caL0}sbnTMU;Q;oga34`=r zGTZ;g%_oKZue{T3!e3eXViyRG0FG^$q0=+C3TIjvjIK_DV>;`B>=5tD@OLkUDEqSyRdOCuRGHJpUDC1?;Sfr(%b-b8SQBFT&(q4xtOHah=}t^}*g9>4)RrF*uK zH~F=06%y?KZbZ%;U95~aVWt*G4FFrHIf&JgZj(|(uhkvgdl_aLFj?R3kOix zmL9S*oAoe|biKVGgYPA&;yk7zd(dg88g6mI`rf^iDLZWpG}@kMSrTv3fuB~c$OK7cxe&L5w!aE-Wo0oa>w3kMN(ov zQ{5{Xd$kh=X(y~*ssbOxs=OgWgku&tolORMWTIYf$@BWQ5<0n`kID{y<_JyN)yxlY<# z$560*a7G1k1pD8~Bpo1B29Tm1EoTp`+F7U!IIx6+11N0E?}f**6a~qMv6-WwknSbv z!O-avt5Fn~1{hrlR?o65!n+6dKO6Y;M0Stk@`YD%Js%zj4hW8bVvFUFHXS!=Rn}NO z&;Z4l8OoA$-9%{fLgYdPpaK-O<@a1i!7unMDcwE@GDPc)RIva1x-Z-fEep!OaG`;#LNgDgyIQSsSkUNEI>furxbM%Zzz~OB3Im84NM?u+ ze60;LqBE^{NFwl5iaUtEv^(kcCbW6R(%5O*z|sP5hghiKy)f>)HQdmWum8#D`XBNd z!M`k(-@1C?YIrg3M~j($xk#`bd(6Xb7&@SYg99jRD?sE;e!;aao=9fKzcJEn=`ABa zU19~#1gk{)CC)>}HwY%#9Zwd#g-my^g3tc8!~Z=Y@n5iu?j=LSRhNnEN~ZgaB+4Ev zMUh4pC9}(vS-^F~uwxC=8&Vz|%=KvbQZB){^o$B)zGy|+#}x`zg*sBK0rgoc#vUmM z6j~IMX{4cOXMft)x%JZz0A|K z2C3z65K<&4hx54xaXrX$dfG??XDE_%eHP9CAAtOSuV8@39g02!oxWnC-3J60BpgFx zLglL_>-g??E(k!4ZXTOGpea+LwuV$Oidb*iR)uhnMGxF7>QThIK@CWBUR(iel6AyE zjJi=fE>OD)BCl8uyhP|=@-7^N7YWTl1DKIshg33=pu}79_EK$7+5_1CL)~N^fGmJ( zdQ%81oGZT*P&aWtNMgK1$Q$%P-i3qkBB43xKsuz7i3CMuT_%Y45}|g+bQ~9+;)uf) z*=Sfx!T04|I0!Einu7-Dkq=pnx>n5q``_n7ENJl4Me;PVBy7!tKWKKqtHv24KCLiA7{c?7kppdg@f=Sp~3#=IC!o?3f}^l zp*jPoAz2xZ@!?EY+vy6o(jEIDlAm}>k|)M?<=w7&6(AX7YxJV2B}oRa7JxW$21!c2 zM93S0Y_)0qrti#)E1*NNF3vN_6GfSoYsz5&MwLzzw-qex&`YfkKwJn0ly|#obRZoP z9m746pE&CzPt=y=vAml!$7Bn>15-Uvgck`7x&MRk{{XEbuQD9*F!4q`-S(Wupezhj5^Dqux*K#) zLlz7u@4|t#1l^OBBqn*qau5tC?^+s__YK&C?rGq`fbuRJSWD17SxI7&S1bp?fbwov zjSj>^sr{7X^NSex!+fk--+b)B3if}{42V}fz;;0WPH?rLyFvG~Hi7}=T{y6opnI~C z#3Zj+4uS#Y-L4v49;#?zEL@h{GlIywk$CGxA#3v+%Z%5U^Ltqm!fzkAxZq`_xX$)L zcZ2R}Sb_oNT{y6opnI~C#3Zj+4uS#Y-L4v4W~%7pu;iZa4qlLVBl32VrK22ICV4yR z4w2nqy7*3CI-_$O{}-I!CdF4^lb2!Tz|m_Lt|^h{&v6y#z}%tz+h^zY&F+{Vsa9&H z&(dmEG)TLUrp$@Zck*sTL-+p%LdVC>JXpKJZNlrjCL7{+q)-@E)z9hfjRQxYSl9@z#!s@elwJwNL^r*$DTJ+8R91ooWCnue_pZj zQMEcA+oMH(Z_7yC%PxAJ^DO6!S22b`Cm;uS4Cx*QT5~#WS-jM|T#UIJlFGmj0(Am& zM^hRUrEXr&%j(>Z=J}CdCyZA@@^p3j2A=y-$6p;iabirC5wKh*Z0IMTPoA8eQ&N9= zDA)fK$ZA4f$Bn7{=pzf)mB_C@?2aK++5)DQjNJwcf%Or}EqNN~rYHj-S9#(KS1epx zB42)b@YLjiMv)>t43}Wevn=rp?CBBs|70$eaH+UIKwn;3uDa?xyIFeK4cPxvuJ$i4 z-FEwpM|t1#IG}69a?lB||EKM@NAs|&dPr$mmE!na@r(C@*)Aj-_b4JC4TMc|xX1J_N-l?-f2+tv}~>XGKc`%C25 zL$R@JQL(T^S?Ua@I{PY^Bc@ehudJ<5YmFMKHAF@DC8i2(1QxK}wjt{CdEc$Gmli3 zrvVq2Qn_y7Ht;d40yUypSy!(#$16?zkN^0tQip%z%{sI7>lU`f#{|_WN)6M@!q!l~ zr_$k4g=jcA*Dl-&NP<`XHUXUX3l1#(x_04~xQOaT23@;wb61FvG>t!ZEZhW$8i6uX zA^`Yq85gbqPvDOhc$ErqW?>6pUeO!o^$RxwlHlL92arbzd3s?p;CQxMLPjs|zUJ1A zTQ_b-6IcC&ddz)Jh52vla`+|g($zE1qDAGDL214k{IuE-KUUHC9F__%0Vy3CW+NDF zj8)QrBaqROlmZ*%vAq=uqR>d84b8)K1xh(o(JPf1yr`6JPZ)Md6CAK2uZRoEUf!e7 z>Y2o*K#P93mqhg5?B*#a9HnZ`Ti{iay!|Ks{*S_50)KhQIgly`K62W^?IrT5b1flj zEnVa>&i#SvKJb!$ZgmB`Hr??m@#B};oQjYiOHvf7g1`V?K&IogaRR>!zQNr855oVW zVbn=xtDTfgz~0Fd6@nit_mo2)pu7hM0%0h(u5??b)g+}!25X(NNKJGp5a>94=ew6V zoPt0_=3L{ufT-DZ3lgV1fW~y@urpn3md%v4v<_aMXeY5Fxh}awM=2jw1(>wC2<3?i!H<=D za0skrTY6XCqt|!^+{qjKnsIE!^Z$Z#3UM~TX1SKj7d}uVwk5^mwb8Ni+6kqM!*Thk zr^;)q^yr7yF5FQfKeIhgYniV3VhmS7(@s%S<-QGmJ_R6yl?AW(^ z*TIp|c=g=alXyL}|5HhoINx^mI5qM&q)iUNskO{3d??_-2`a$E#Vk0wL{E6xG_kO~ zNNhhSQgL{?d)30d(6|#IRnfRwQ3=&oFWdtNPKkz~i515uFv=?^CKf&ziT3i^nwBLz zKf7>uiG1vafVKm(j2QL6uRnk6qJ_Ikv8>6H3>Mh)cAsiP6dzMUE+OR z%Ka0Ak)@`eOIc=Ua@IiGryCgmi_YJX;;$B7fn8pfItLEFb78hbj$CPW6u3S{tQ*9A zT`8i*!TAIC&+mC?*9ZVtCe}&_s9HWyKS7JUhzI71E{IkUmhSDeFWswE#>Sp87w?Kn zDfu8EGCu|1P8x}ZkGiQ%=&hxYH^bzlVeynp?+12YRd0#b3DpR%RWN;-@7Um&*= z=L@h&tQ@&!VHd0_K1)d6%S^$0RIw;Zrs&GrTB|lSIZF@7TQy_m#+t>l36i zrg<+T&hxHTmX(Il_>b#axl(O2`s9st)QnI8{2Z*=FPAJD%ZgOV0@m&1FHjj zcK3%pNQUU2hr;0Q43a&EZ(Fz@ek5^Of{s|Yn?$lEp|!XdH0pVp3!$Z3X#Y;(p9uWr zCFj6$;=mDSVGp=G%lduS=ew3ekI?V3GA<4@M?5-K9m8P?j_z&c659>9F3eZYndy7B zXsrs&EA!GDni?P)MS<6}zM6X_KqjWl#Z2`@wJHysF01HK7!zf4qN@`VYxv>C?j`dP z0KkKmU9%7FpM&VV{r*FH_uhZ-@qM#(N%`+gS;?)ft>T|(pGMj+j<|@Yq9dLX{Sf`~ zc1GN%*Xwn5TL5b}y*2TCX)>YS5Q-yZ8H44RHHFDi!K)mGsEe*JS)`GvwN58BL>m9e zFB1G4p7Qcl3qMdIpSL^-)QnekJVJRw)xfo=Wo~ec5zCwjOV#VZbK;kn{cj-z{(3LZ zk1sq}A}{YS`^!PurEAUL3{v;by=4O~t@@D`@cYpX*1XoNPLTniA9O7d_A1GRa%i?2 z$fAAmTdAZRMz1es-O>IF&Il=94V%1JIdJT)3lG71nzd#Qn?0L=l@l@LbvUr7Ot?7- z&c*EK&&&k4KJd#rYInYAS<-#@iiN%KIMuRvJo~~!h3|s`E&(k8qZJlvHfYtBUDzdT z6~XMFPEO^C0AIo!3DJ;#vP99qAkC%uzw;Di6(~}qdLZ`D zFg&>teKhH8KB_63*us2NJxU^E=ePk$LOMam|KxE}cm+27EHI#cIL?5&!FUjF3cul> zvck2G+SRN0S@08E285OA!W%{mK1|YZ$rA?1eo-SYS`P%Y0+3}gt+WCCqANZarEm05 zWw#1^7d###C)$db(MwPE6IO zJ+m>5`qbn!&dAiKT2s~O>SV1xT>}L0qx;5WeX?0&tDAeJ%{vLyW3%!ZyP!+=L-mO% zWy%SsB;=G+z0TtQJR$Jcuk!q93kTpSf#p3={yCG#rZ03%)hBu_xAC~H$jU#zN^(?wD2L9W9B?&&QI4;mWn-q{lDh+N75J6WHN^M6Hh8!4VeJ^{OA%DRO^ zMe?MWjWo~THtLOu$!dLavbL+*YK}}yHV7#{d1&Xsm*y7c;i>p+aCJ5TFSp9WC%9&- zDkn;1J@0}0HjDb15y~CcZ@hJ*g!3Z9^Go1A{H*mN{!3!~85hoW;1mt+O;s${lI@}- znjLiC5w{P0;d=LkhHxAb;m`iq-3tdxcuSxTaBrDwJ|w8(VUu^ zn66HT{uTs(bZRUv;#yqH(W_>kTICsx)-5B?9K^79J^)kH5v1oVephQBBZPwTXwf=DQ8~{|__!-$UR3 z-9P1DhAq9eX5sM?dHv1+xvmX-XN=UD@>4W1#Q6h}A@cp2wRM~+1G#E#GN&l%%k3})gvQ#?$`8Im(Zav*{-L;&IF zQh?O*>#hdYDG-(C6H}92hX+ge8`ZTs?po0ARz+QRACXFTtr}01<`@ zn4IrwRReMdy8eeeO30US)3-9S@T~pYrF3eqgI8p;T6+=e-XL-$lTcodC`aikdSU7vpa?xU=;YGPpjKeOb` ztnL?mZf5bFWo~9mFOq@%yXH^*G;ADtz!W5pW+IGo?kLQ`D|s}_6Gl&>I!p;8&iLg? zqx}W({>&jy8a?Wsh7TMl+j0KcJ06WU79O5)8C(DNPlUkVGAlpvP`gkfzrWo+kLXnb z2>ss4fn520BdOt0{=s=fJUx+NI$4f8@zc+^1YP z-J{Ko#d$`N1z$otpl#rtfh%996FC02^m-KpDtfcu0Xx4lRmyk{WpxYTs^30lSx+o9fnBo??w{MUZysto@Si?l z`iI`u4j;R#eQJrk*osd!B|vIvZqTO3`pez-Vf;UpY{2(_zv|rKtR!D0FTiP>GShxb z@NfAb;8ZL1=6I!9pB%5$;jmd5uQw|VJZZ8o70dNY!t4C+rr-u?yo|c|5rqv{~xKXt&PGeM=133TI_KBmTTDMdi_QaRjpnrUtMcf)`7@Cl9hTL zE^?ODMmN^x=6>t9=>EUa!hc87#GeB+rfQe*-i@#R*-DK;ux+EU?aVW8U%%nD+itvE z{P^S`daEtTeq%gZaw!0=%;0Sr#q45J{FFafP5)>v%nL7;o? zM-yy)8-I*L-vKkW?)I^D!9;I?uN?Y~I=H!1#V@e$Z9qw>Z3+AB-scW(@gtF=lKw1%rbs611BX#w;Gnu2?M zTAo(%kxvs4)WFT5?OY6i)6{lqXglBs72GNyqObziLDOA=Y+yhTHXwAu&&oy!=*VATDKGwpLiU3?Xk3N(*~O5ih9F&01hhv8@1XGcH+ zyjjcRt`>24$OLNsm7;~JCR62!r{QUdkcA$!GiEfw29UIVD*VZNiwdFbpS*RZM`@#y zhJ2h`G0bP^mt3@iOERPr@%xuZeTY5`<}&U#zNS0_cj%106 zw%EnA2gYvcue#(~a`B(7|9g=*FQO;N%fLAB$=&T$CGw@M`Qu0>$B3@y{f(NvM9eIW z{a5}9 z>5vH8kWYtrW*W0(6LNSFo~MBQ{~Pao7LD`N*X2g(TZk9z#qx9_%jrb0?3Sgn<9IjR zOV~X`uJBn__!xn}F5*<}BGK8nNTb+9TU-+Je+6fbIDZ10yrj*67jA2x3ttPqtPit% zklFpl7f)}$wM2d=;N!&b6NN+xx(p~Aq+|DVwb^|{xCvDdlUoy>_ZMwVMOQu$&pW3CL|#%YTyTfkUhEsMlBuG=;4u) z{pzXZ2H}te43@b$7U}gxYh7XLqR+C+vVUsJF?c~|-Gj#@8b710_VBFmF|7DegB*SS zN1h<~*WdDdq5ZZJd3i-2LSZZiN5yNK&GFd`m7zW_Y|(&d((ALk0rij4Vh#1M4^za_ zqI%%735VymmR&m8=(0A^Kx=nx?P2UUC@j0gehwb6{x4?y&&>k^9>yQB1LcZf9<}La zb8@QLtWGtis;!BMTD^)WXnX^Vy8K*I<2olJT{4=SNYn$;kQ$^l8LGT}rKr`|sx!%b z1fftuaj=X;GeVAA#Rlk2KYy0h;=uYSh~8ebxS&M!M8h=w{eR)-N%589YS`r^=Rnpu z@cdKl^GoDoPxm2lgc0&@zi>hO?IrT@;P)>jGlv4r{niU_Yo75_&zOnH&ls4rtSY7x&13oSZUbk$8bbRNBT4XQd&%XpgBzT z|Hjw9`qi)h{@1^1nx_Pw1;?#OX$IPVfpm!T4cKJ999i9dSBV_Ua{`>YMnyKscfxTKFL4QS|KG>?zc-O{N%1SiAs47nR7-Cj%`TGD-F=BG_KE71qfF zLgUw&F!!{A;m2~iN6D7yfd8JIJM_preu%3!dg6qnZ*1)3NqO?(R_%_wj@{TgJ9ol4 zvb+7>5;-3HDy|5$ZrA~oFv>!^FFKGYPrF0P7-A7=a($w#K74I^HE7y7fw}`?J^1k6 zJ@dP^KeFqPMn)^zw`}TAsN+_@#0Hn-2g-2y`|bmChxTuuo!d9-iUnha^!Q_A z9KJku-R7HSq+X1!hQm?#|226@99|46LzU^mu~z%SurI#V;k#SqHJ4S?kGIiJs9n)6 z7s<21JP>u+H`u`W!6J0ND7e*rPgv9RLqZeOZLQn3@x}_>z)$%`G3I-i5<#;S77mkU zhq$2b%q2$})TGUF}QYY5YyWPAb`yKEfO3&XnkUGy#s7GQ$QTNj53F(8zXu1#d zxmS49JzQ^J3ZIt`?KRX5WK86QIuUn+;+CT#cVNP~!C1ggtg^7);DcYt&`kKEA@2`O zHktINb)jj|IMOA%$7}En=#!iAgVMG=?iE!-4;;Dp+>|XMNZ*lu@_Svxr@Z)mZF&z29L;LHkLYcF6 z-3`Qf=9!;_Ch*XPBuZUp^ZE_fuU#iNu>S1Lct{A$b+P>a72;e;UO^TPyu4U$uPKpF zYz*{~;87x2fve7D2V_MN#p)q>`sPQc+M^}%+0b0g+K}rYQ>E2l^btr>eRgF32t7)H z*?sIl%0Ac<`=e-F;!FS){yN%w;)v}DMXnwqu&UN2j6Y@F!?mB{lKW<5DGc)2{`VNX7_Oyhw% z=Kl_Pn&4mG%X81REAR@yVy;fLQByu()miHeHu%tZh_12|nfvo=d!OD+)~s zaoI;tnU9R4?twR=!lZ*3{o;OkjQ@jDO%M$o|D(-&rDqptm|UY{vZ{tVSvVfnngVJY zpGGGrtg+~rtX+$!1Y z`^e(|8-&2$@Rye_X|FAj&)qV}gd#Im4!*)_e~Kd6bj@`&VtOKWn0HacwsIR)3gLaV z^03C-u6E6>WV@zdv+)w<|Gv%a|4W3xU#81*TifHX0BI~YZT57!Kc?LWwa<*d1dHhp zQ?0F3Wv0hWk*sqs`$!SZFK#XYk-(?d57sfQ~-(i$07+K^+hD0 zBuE2lb)a;|&V$$yIC^NuV4O;V2a&6s&Evvh4LfYcip#h z{=kmeU6{*!5&MTZfIp3}9+b8f{XtE)W4g$mmp9&CGCBo+uHT_UnsFmj7M=C){e*R_$z;y|LDf zk3QEU_x%JBI3J`(LZ93{YMgEU&mk4~2vBhPig!PKO}kMdi)V$6Z<(IEHY$}xNLboy z1nmh$W}R4JHAS0NFi8xDj9#Jdq$xde&5P5k+#716_aviULlDxDQp;5cSR`UgJez~u z|4-1agMJcbWv@ptLM}El^MDJ}$#coLcI!9yCF=@?Fpp$IcP3M->9_*3f_TlvVAzPo zmPfjAUmOL-f9Jad{_?WKIq=eH?PiI*c5a@(sb*?0t*~I$?c9Xo>s=q-yjNIW6X3Yz$%5dDNz9wPF%ICo~u5gP1r_bsRyu2pykTZa(l8w zo(p}ILufYyPh3uw`6{qUw^Y4_-GX^9Ecz=?)?r$F|DL_b%A0N-i&N9B#So9JgDdP1 zR*2D}x5eAQJ7xA76x0d!{vazPLW2+JS{tywx0LtJAK3HI2m}p$#n9*&U1^5#zewIp z3g3cX0KWOt54G394Bz(H8R8WljS>>GYcV7r|KCeDwp%6gnfLUexr`c3Xr?I{8EPa0 zvvq3_b9rtBi4fM^EQII>G`+I_obUV_T&ZzZe=-qIn7Ix8A#d~wx0g2Bf{sl!VTKWq*ol-06ltiwYpEvr~S z{WRsU^v{hCJ~sHq00N=4%>ZPB40*anhbPI_{zc?zo#p>lG_@t=>xR|OS;Z4s$^jXf zRJp{`OrXl8*gXna*kiGJ4VedpJLi-R?ddmX&d4K7LMH}-^M7ZP%kcYOA1~fkyrA$W zg&!~6Us&V(jq`KPBTkKcm%L8q0f3d6_WMiZ@QRQLJNT>;`??+d;BghdO-(njpM;MV zwc4A)zE=caH-azU)^JNd?IiY4_xh-H>-0N-6cfcUI@7)`67lq7N#pqKc<2ax6tg}# z4xd}%A6uGfUmF1lG)=KU!*%?uChTD&-(1sbZw&8+AIBQR(Q024w{Cg$j@6abJ6A*9 z4c*nf5bMsws0*ED{RRU@n%8$z7g&gOuZ~d{x><+5;(yxT_jOnI^3|i$?W>C9(GX3S zGODb`7J0MN?JHwf#p=JjdbHNQqDb~cY?Zc&lDRxmFUt??dJI2}2O23gg8u&BnSf^i zu*pj_4#4l>pC%RmJgMdkenApN+X z{A}Ohr`k8bw@RK4vAB?kHoUc|{gZ!93Y%dweC6nh_7-@=d|sFUz!F_`1LbK@Q-SB8 z+SMlL3MjjF`D&hI>sL|#C@{d&!KUdpf;7=?Su+}>d);_je2-kVBcNzbQ@Pr$uG8mU z7ZtQt!_dY7W+uo#vI&#fUmH7GZQlsO2z&nlP?o#JHyrd*j-1}U4cLEvT=s+b#c&ah%Cr;EUCfQ)kEVinf0_=X z@sy^$n&Xq;0u!w(PACpKBv%+D(IH0bO>7g>bW=rsuU=tEwjADhV0biyL zNJU(O(UsqJU1gym!xLPATcej#qd2^~eJczK!ae}+lU%Q43(F4ZJ4#Utb2M?>K=Jd`vYKr8{%r8Yk=T^%n?c2c(gsopz`Xqgi_JAxJU%f0Y!z`WOe&)(8*0b>LiVuhVbd?oiTih`7(_8 zo{2j(9NWMwf`dmH-carrI@2DPJ~*f0%9ve%bGxg5&P~yAm%i-Tt;e~Q+jjzs(y(8H z|F^KnbqScv3g>1sX9)rN!eA3mPIVrk{TJZVpM`Z9`Tpn8i`)0WB+^YuSij&l_r|JI zj+<56>|IJ!v_&Or^epratjRWb7Py6Gg|Ze1jVSs;g=7;=i1`m~@RurjZhv&9{XuvL zvLY2hNj9+IpOF~~KY{sl6xD>GazjYM#%Y(w@sO*zHF$H@Jk1a-%9I8%-k1bbc%qb` zOYH4Zd=LhyEdGCw6#m@#Q}Vq`#Q!vjIJ~$0AxP=&NkM5*2Nl&yO8dGOFQ0?h4k56I zIfx(yM}K8B%`Ew;BNw#q1s1f@5qUQ(P;oMqjv3*C{LMmI#@!_c}YJrdVa_tJv$Tjc*3VFrgPn8Njmzus+hLKgmR& zq-O(aXtZ^ooCe&IL6Y`?&aE9iqrC(2yLWV<7!sRzC?#*?@!!o$!s9;%2p0cehTs1> zKSy3p(gSpZ>qxo1tD6xUB+pU@EHf^_Bes@IIOV|0GaW_QX_$cVS4?@t20XfNAUskB z{?g?_dLlW%(&9^KU519L?&m+AE;W*V^VQ`8fJJGQ{i?z3Rd6HbdgH5%Np8Z6cGY+qssNfIXL zETJ;v1QoNQG9b(cGA2x!j`S`}i7Gi^(!rnlBq~F~?3?{Rn6Aoj6I5p1`e*+`r811z zKtDwNu03Rc{r^BNOi-^tCd!*QJOXBB*!~>|{_vNVoC8rf0QSE(GxqN{!{A&kAzw|C zLuuk6$z0~`pL~?y-@warbM1%V#lEw#MuQW`ebv2+#NK^!#h%MW0EDVa2B9Lw1;TtO z8-Hpn9`^a03&bK7kme`Gr)TtzaiIX~D!b3yHDbV_p6SPc-C*JoYDaS9myoP$IEReOv7 zyZGOWe^dO6;-444Q~Xx(KNNot-U{$*#a}A^TydfJlf};#KUsXa_(JhW@u}h?#r?$} zDBf4RxA=kLt;Nm7YYTr=_(tK4!tWG*qwwXzFBV=e{7m7Cg)bCdD}18xQsKG64;G#% z%op|*9w_WAe6VnP;pW2o3)d8`DohvZg-YR)Lb-53;jM)?7fve_oPT!y!TDR~ubltn z{E72z=WEWtbAHSDH_op(zu1Q%3;(n5_l55k{!8J{ia+Xn$hphe=4^4UcV?U`oJptZtZ^=K z-tD~IS?Qd~eBY{<7FPo&KC)Pb?S~iN1KSrD-woTR7T*Qi#}_Yv?W2othwUSaZ-ecj z#kazCesLviA6`5gw)+>~4BNTIGhqAB;tJUAU4$i9t8VSIV0%kv3br?QCSiMH2YzwA zYI6tPyS(a#P7Su3I#t+S-+{L+th%-{4%>~LwXogLf%mkmn(2(e_I;f-uwB;~f$enX z64*|4E`sf3=e@9<=pg;g&V{gTbg&oo4pLt0Am!B#Qhr(IJlKwR&V}vT&MMeeI_JQ4 ztb>%V=>RWQjdqa!kq**-Y3EI_y`)ou?Rz@~*sg9r3)^?MpMmY$+fT!GW&0`Ep3#01 zwx_nAfNin;IBW~;$6)KU55bnS55n7~PPQM0?f+@d!Sywtv-rKeYQm2k@`DzjGgK@9XS;P9+{`)padF2~z(8iU&*9Muc{N46DVEa35knGBT z+ddz*zu5+zT>0y5knGAYw?VQi|79CAbLB6z-vZm8Z=VL+pKF6OSN?1p41Z;(4KgLf z`_u9~dT0x}M1b$cTdM&(R`hU_mpq$L@{b6z2#mW_hW$z40_n(1{67oq-zoeifxo=u z92iCpe7M%$S0bO>osSy9QJTDt8idqQBV+*oMD3qIG6R3{%kx*Y=St*bPBvMevC*T- z`aItkybbC@vAmMH1TO#DZihmNwmsNYGaY_^NE zYYc-uuMeJ=(OlA^ebQ-7=#SB+g1an!ealk*yelDs2P`Q#y2dL}{J&cP9nE%ns z+XvwXAx|bfhTwrn?BHd-$4pzortZi>dR8}T_9Re|^|dx@u^+!W(=O8G>WrosFx zaJZ7)lB33ZfhLIWz_Jk^cp_xIQ3DK#mjyDSt{59jT71<0o!9aGAFmI_{_|GjaNx*D z`w(PAx25bYx#u$~x=>%=_&E7D8+#*vJl6!jl$r-##e4rpeCO=tmBDVkIfcdZG8ZDE zPApfWFBKOk^q-yXE+3e?Zfx^SGw}9fLQcrv{}#yxc>k|+E9|-{N6u(J25gS^i_YHJ z+&`Yi)4Ictv>%063_P3x3-!;DsQH1SGM0&B)u3tS5pgwsMy0P`*Je+nia27IlJg+lsx2mbDi!G2bJbOI9Tsol+27zY zBEQ=naupR*4^a(Xnw{vk2(veDUcbdPT%6sAA*Z-h#LH#{_ORI_?V%J?Hqpyi0Xb@W z`deJ-_@8{8;NKD{UpT-0M2UPk-V1lSn}*V4hbX{%O4lDYpx|kM4@V3XF_c|j%BIc( z0v)jwt*hW2oh=#Y6PFCe!mdoQTMp6oR8FNk&Vt+@e*d#-g;a+AHEjs6^d$*gOLYb+ zVpz)JFz{rMwm{s0OC4B_@KRw={Cq13a#8gbT11YcX%m+~!^Jig$C^y#k zHON?pHZDCehc&S>Jz>US)4El}aRaA62AO9bi)5d>H2fA`Vf~R5g z4TkZ5;VuGydC57DAP0VUW&6nz`9=4Av+xC>(9bdC(=ggdLzznonV6T5!7fz|_4wWy zcq7QFv)oLhF9W?k&vIle4b6wu?%KS3num=x)5|SGhty#IZ}vR#6Nv;k1I=CJ(}XZg z@Mdekq2=w*@?kYb<{kp)U}qD-{@)^V2R8ahbGkuwC^Vx0sq%#s+PF2TG_%*-&Z@QpRZpDo zr9F$8^$YJEoT$2ewmw5zMk_d%rUvEOBNqv3S+uZ_u;+2wkd=+Vy9!@X+cP}>bAFb< zUtWfR1HW)t`>7K7i^RW?B6LnpCm1GEz@5vnPQJQX7#!GabhZGSIi~~P8=ws6m1f*< zn#hDB5>Yr0XR3J*+iC|XQD@+EK{&>N7#!mi%2@?an^N-rqRX( zlDWMEn3c0$SH+0Rqp+<9&#Pe3Md|u={d#|<1;GB_7M98ZU7R#ySPl-hO25GVnC!GQMqQNU>Q9<(pC$wF`;Itf~R568w~UR zq5h#XVAxTkB^(Zigghtg~e zat0XLAoquF1h2Zl&(a~7FH1M#QY~gqwuf1Zh#7R2?PLNBSNlmC)mO$DVbgu#&;ad( z^>%5_L4f_g!&OtoWk*fTdYQe?bxF4^A&7hqBE>m~Muumz-K?lzz7_2Moq?GeT|Sv7 zc-}B5Of@78$rC9Yy0ZYYK`SXaVCf>_DQp8+K zjdMKtgrDxHS26mf8Ew67X-`i29%&)>KOg>=p~pEpe0~%HHHeEwZm-z-sv>#fk)V1e zmUwhMonWQ_9go=+@zgP`r_Nyi7YdRR(Zd1(Y zRP}VNS_H%%hHFESm0-$Cc_OK0{1|LzlB;gkUXp1Yfx9LXGb<8NC+YxU@D#+0VWNLw z<8dvrGvn*Z`9y8cu>P-bFM+?jfRo{!OUN*Tg~8VsH;#*1HkQ^zThPn^?-<}_z)Ufc^5U3C1~ z4k?k3WQ3yVgU6G+V9<{Ec2wWIh#{UOH;3j~q8kv?;_u*K52wR74x81(p$2EXj|r-r{8h9t{p?V3`FEUbU?GP!w1d|*#s zkE56uYH;ZAqwn@_U5TRj8KGps{w7`f_n855le^wYwS+z>;2rZJbn%6v0ETd$7#*zD z#|cJ?eX0zljYu9D`y^Jqg{oy@K`Bs48tyoqb0}bjM+iSKTyj|pep|d`lzf(v=0~*L zSV%bvuFV#%9WqAN5wdR0g=5k3^axOx{};%4#2JH)TaKLFDV4~viwB%?tIlVVn_1wm z(=|tfQ9;x4fOIkf&yU~IDMHeJX$E-`J%fvp`9}(>{qbJh*RXD~96N3Q9?iWm*X4_M zP+9uWu%~JOt0$tYf5IKQ{am+homcl6XfHa>?Ejmj@CNy&YyLxibo5Z?O(pXDTz@Uq zAZX!mR5|fkg>r>WX!q{oFvH;5YEs1H8e)2uIQ_k-?}-z?|BdgT{KmGjLx|AM7$sv*sIIeAPL|366zpCzA6&iZ@9 zbga-hqeNauD_lnVcVO@je|ZV!0F3|7Om_T_ z9wxFc$%IGZi*N#;9S&cw`r>DKKoR-7Jr`4RN%#$z7!sHquuUh7BLt&+V)6e@;(VOk z8La*>?;dG%-V6hP2YYbemzi=n*5yD2lpGtlZPj=*HxXhK$EIU@J7<;1i}&=vHfU4L zTH=`F{M`JGy(86Xvs!II;k#CAbPdcbj4qb1z4fLWN6K3_Zr-?ITbYh>N5xq8GI~(f z$5BjYqxXIbeeZ|YQX<*FWon<}Ye0IDJ`nQ?wJ^T2E9LTm9sBN^duZq0xt$};T61#r z`bO(_Z@O*8ZCf_ov;|=l=<-N?6t0vH%pKZypIB?Kdgtns-=PI8cSWss<=EI*`M|FI zdw0z4I=KZNfWvvc!p8qCQurxnKWW9Vaj@@my0CBVv8YPW=%;wN2u7V@>$mx0m|UPE z36{+R+s^KSZIuaa63DOXu^H1f^XtrUNfXnYjl62Id3|WZpA1H1+ijhaCm9tkaazC4x~qU$!_ zGy?&PmC@C(ABF#4;}_h+i^ne7dg26}!vw;Got5BfuZ!a|Of2b6V!j1tCe%z~gJcrR z|KClV4dmT^_e;%Iyk$J!Ur*q}#gPrr>@%-Hh7z`hZj!l3` zj+JXy)?l~pb~wCm$NVm^^{Zi;r3R5g9ZkVGf?%n#-B`KW0MM~AyrgXkQP3iAGF*V8 z?nA%s_CWLklLbB0MdF}Ungn~yCB%#pcaCO7g)CMH=MaUbAPfr@MT^7m{O@gXpZ|Gy zAu^|>FK$c3NliFt|Bmy&2>j(`IdR}vvGaC#$a+SSP8f$UdM3x582Z87IeSNfUS2UL zXU;fNwf_RFD~9KPVNU=LKh?Pa)~7t(v&NXaXiLt4O)z!h)2twF*-+_`Ebe#`p8uU6 z_xYd49J(R8xBh#k`36ppoG6eJAwkkLOrH!yc_I;O94azZoSc|wOlb2YyE7p%%vg0t3 zfr&9u@`Ty{v!rm7vxz*Lu=$6hJA7@Y3=SgJ59v)J0Waek{&%d!bOrM=J*gSV{TsXS6^KNi>+q1?6%N#z<$BbO-2gi91pmQ9k z@dhM|z>L-7Cbe|@Usz4xFE2R<3>-LmSLZ^Qt&R1v7lU)cY|L<3=E0_WP{UZKuf~~u z3c0^1>xpZ$u*K&8K1ZC-8AP978Yl;jeWn=@-jk3{P3Dl2at>tWcL4U z;(U9cs-8EVFb9rZ)OjyV@86jF4)2VG#cpV>k#x3^qR+FWM$rZjE)Q7#-ynrX!U~w9 zTdEv5x~X#!3<%E4zH8~LO`CkjaM*u=93jpx!)71_R>WTd6KAo0DC8e3HeqI(&5p8r z<%19J-7~*y`@y+G2WEF|-*X@QX5BDDNLQ^!m|4@2>nnPxmKl({PBtWiG}H}uVskS!T+h`#!_-z_2KSPs`vOb;9l=>Q_*FB`!q~;|!;?wZ-&6Bqf{4}X=WGG4k z_9m5tam#gbfxj0>^Kn5^jPP}inxd}Ly{K26{@kK5UbV}0y4jqZYBsA=jj3vDVxl%# zn;PF#UR$;Nn&G<5*KFFlZPS(w+k$_LFcKuf_*PJ_PfXMs)6I#A>8Z(4ppTg@cgFhT zgTVR!5&nA#W$`-Z{{`|r0#Ei#`4(#G7pBHpn&A|)SSMMGj@*J=Ut-8*4dXNXDQ#{+ zbG}tBNhxACDjFR8b-AW7&gk3t0@H8&QEZxH41Infbahiwa<_ZVR9nbHID`P*LcF8+ zc>Evw5FYM;`a1~rw$__?!h6SaYc?v%%_BDteW(>vfs_}Gm^tb7K0_U!(~iw_{?FM- z3I}16mlQbg38%BBM80@xJ_iVIL4x7t)gN&>qb2gGoFUq4p$3o^gD|dw|Letob@;}n zF+)e5dzd3;*YnlOAT`&LSDAY#FLVQzdNYn8N~kg5Y2)(<-H9_fLRm3@cGR^S z8Az&!h*UMw8=XaK#xh-~IM{|H~nB1poR_ zo`mRv-b$OPc_RKIZ%yA_U#NYP z&ZC^&+dta82w%ub3eQr_2!If%wXvvZgQe*_jE8<{CJq*yE06vecJJsuXt10dW@W^J+%bM?4yPkL zUyd;`%}CVHuw0L_@$^86$Xu%wVFF7jw`_?FNFb0&WxCwlj)IB8hC=&_YM2lM<^kX% zDQL>jm0TBu^2_X9^(-0C1+Rn@Wu$XIs%OdVpBsK||Kq+V3(7no|NfWboI~I*FUWz9 z&UP*m~oM zrjY-$Fw7DorU91cW|rIte#s!F-?;NP0ji8!1~G!#SnnyPiIYa|1zUVjCSybwQ4cbZ zq}e#6ChQ3bLvpJ3{6ESA4dVzQg>Kn6$ioCagk#Pj*D-bF0dt!+=AoQy_j+WkR72Hq z=d$t0CIv&0jPK3h|$p7EZ?EgE&`OdO7|0UV^W93dA-T@rx{oyRB(p?mu1sKU%=G>@x)+^?RHDSRC zo^|`%v>~IZ3XC3<$2HobEE*CSIx{t42+(vr^k8d>3y#PRWj&}`8u$> z0vIL)_6r>h_NYZ}YdwIPYoA>sfgp$9enR zbPPiry50(XNiGzqkvrR=YB~4ajr`ToRO9l{S%l_M`kzPf=8c(V3f^ux+rV<}dtdB7 zAOEN7S_g_8^8d*tk^kpTHP!LIL$(q8OR79S(wTxE`P~*}F5Nb&PAw;C1dj)`_1*!ByrvLdVA09(_Orc7rhGHjcqedf?3kv#w=) zVuH>86-bQ~#$gks9DTggg0DY4nn~m4(o&~gRGZL7&~YXl@-&oAjg21N(wPR~UpS1y zXWxI~4u{%sphc^m-7qgm4W3!O@WEampekcBQ)!|lMw_bHU3+_){}+k`{_?UsIRGAg z-IDO=1~XNy7@~skOpCFS_4d8_xovTXZl}Mk_iZWaZ zNR{BZ`R&Kf?pz5ISr-qhsUZt2*`aMfnFlUuOJ>DAvY~TDi5!pg`|}=EFnq9J5w4&- zy+sG21=hpJS&QH;d$5>z|NQAyRVP#*IH9ils|Xq+&9|rygdXdwJYr(+zwz}L4}!c% zlyxUT(h1V-WQVmhGQpZ>CQMTZrE@kY9j3Cn)&mo|Uc6_q1SMth+3)O)3+l_W5A4{td)L8{QIDzv7Nr6k z_a>WoB-$w{9-5~_;F502FN}8H2W!Od=z~(j(E1Lx{%4Fh^i4oR<^cLjF1VZZxw}D| zUh3`!{A=W)H1dL4u+Rh9t{n_3J@5RzZo&pVcl0f==B!`hi zZA1@!Luxjb&JE}ne?25lTGA4fZY($Zhv1*b|4{D-@qfcIjQ^U|XfG$gSx4sV#G<%Z zQBw<>DNcYWgNF#&I2*Hc-x11?A&dX{^Z!ue_XEK5|7(Wm`G3r~8I-FS9qI!n-_cS_p+r-?HiuJJj9%Yoz9bgl*KKP%;l4p_z@KJ_#WpW)(eTkd;J zR%5H-12!6h!o6iJh7}id&kbpDD+du0{h39Vd508?X`qo=`+pNT0qg&rUvnOJCdl8y zNjA$&XLE@h4qa~xALqaiNzxB-j#HZfsZ5U7N2#gKbZ&@@gw5=N*ziw9vcB_vKoa@^ zdrApI;>R)5*%XBkNZV=d$KDV{RS0@hk-fP-4ie}H{4h-*5iEiA|JU`h{=ZJ&&1Zh& zmh@i2EW{Dkt5+W)tIx` zu&rF)ePHg;{_V4K`(}5{kJM@`Fu;068wA_|raADHAiAh=^u&oVLvgO_Y>U91@h0$x z`3~ks49;k#vo+KQG%FkvwSEJVR_E3tc|4HA4fI5iHlxf|@2sz`tj7O4SC5W&ZYh%4 zz`F2wrtW@-qTac=NJ2i;Otk=fuKaqLqZKb~V2HQMUj6}>KaCXshx-I>mv zq0Vd_ynCQVo!K{=72(Y2UM7DZh=ink@Zr6C=67vBICtp4?5^#5?xQQLI1*I!dTpYP zacym_TAQraC#zGniAt+ggMUye)k+JwzgvjNs|~Gcjv(hjt&;O#2zkKP|9*myHwbL9 zP+FbscE5T>ZM33iBddl+^S=6C@6J%P&@O?(WAF?J_PfGmY-WF z3>lMMS1!7^df<{EOg4Z+W`5Dsz)%Ym`(^4>*Shs?uDhV9jAym6GMYR+5iKPxGK&Zr z&01q>x>22;oNBfvrlc6H+U?$Obv4#eWIeY~EJ;+vVq;brV3P9!^~^JCjmM)Yd~tPH zxhRw^1(%t9W_c%-6~6SJSs4F|WCJOD$+;DF-IOC|bnb)b`Hlqa22Bh9huMxk1h_=T z0GEFufx+iP=}g&n^8J(KnvI(`ZrccqIQb8h8xC&i?SI~I+pV{5+_G)^HS4!+q*uh| zUz|9x;Z~Saf^+A?H*{u8Ldi>X(VX##xVo|(>G`vVmu8lI8hS_S$*o<3c! zvS;%Zd`vH&$~@Qul5u8GGo2p@MN)@nGv%kAD&sR6R`4ZCib1wId#n?wyf?7p&-7Qr z11fx+&!6efbRGyLpgezI&qE{A&}OBHgy0e-+}9_0FIt`5VFZ+SJhFQP5Y%9O0Iq6> zg<6&RT43eno%@UAX`5P^W`RLCu-c3D|HvhsU67Jm=7AOctIH9#a?z)h7#_nslqV&H zDniL!bmEF^G-&*T1YN?tf~=4*mAF=A)ene9aPJw&DQUFpo9M;zq5b=J9T-9DEAOS6 zplhGHY$hoq4Is1+P2{{#7D9n?N@-{cp6dmjA08GP!61MCNTMM*x0BpXsBg$)iFA>f zjjNddznR=XieD){3+w;>N8$Ct!NR!nm(CZR?al?{o8;qgGg_JHJZaAvVf84c&yb
    mz`*c&fHA(9RXa5P5NG;`T51VD95rV!m}rj96o+%Z!a9ylW_&iPoIG%b3F=k z>s1_0prF8#Zx(@};UiPq>-%AfI~7^!BPwpahAHi$5YB*mh{Qj_D^)D#vA3C?IIn&W z>=tqyuobG~BU+G9W+tB(+Gu8!Jqob2z`9KFXQn)BJgcJr%4 zg+#@+RFDEL8u}+JbHi-18#6b&Uwfbz`~Q>)W})E7oNiyw8YfhsJPS!br~H4Ne2HlP z4$*81@Y2`8@GpIFpT*@_huT5j-7kGHMb3Lp4D0OygW{#H7ayx1NRVH8tZg%U{$mpt z!TpwQdH>A1p$xa9sKb=6qcZ|1`bCj_np+RP|6^?ae*)kCT})001&l~wV%49t_k;Q@(c zES`xcQn39rmQ7@mDcFn(r}4v%)N~T|qoy*jO*`4&Piy7Wy2emZjpW5r>9J1(Z3Bv+ z@#7DjeH(2q{pEVE!M<50#bFU`hMvSZY+DSvg5%BU3U(M4oo?~p|JKtLQ2lQUbrbCw z?KRN%g94s=Atmeg7kH)d~F79m55sP~HT7E?WWJ?o1yF${cv47}*fY{x&#IA%#Ywm)IrVc9g;%ME5fwlS zObU=|78$MNT1NQ_8pzMsBWNJeE4iGw%Gdv1L$tNwTxY|t)Jf?JR@{Jz$~rVm z3pPSPRltE&#sR2~>8Qpn$A3zIxw=Hp|62Q`If@j-Vdr4d>c6|_k>BFgUc$9&tk5Gu z$w)*E2;Gy)F}tmL?#X4}=N|8Y&a-oGiK^7{Lut;XI@rGw+LL#5ytk_=pfw2q?p~nm zb71B?t>O2^OV$XW|4%u{^&a!6Nfk|SGE|B5T^F8ENiG3g9PuO%7e+cMaJ4y&Z_+Bm zPa{Oc7YS|JDkw z7HoKhMH-H+XD2u*(#eDLY3(Q^eoJMns5}x$aIK*V6@F_ixU6KtZB~t{v2rmM^#62^ zr3-r$yA8WddH)K+T_tHf{k~l#EcT@l2pie!S2l$9sx-1>Xr`LbDGk_aOr(PBTar-p zs!6HqfNwcuX(hE1=>OZHG5qp4umtP^QpT^q5-eJ|s2vC_f#_0~#a@H{KU1Ykmm~aD zY_q8xRvrXNHc{8#UYj4JFZ z*Y4UzBNj2J(F(YZv#aU?7qUedA8CJsZivb=Ge3*&hCu(HJxG5fi$;K<_N^@bn}XvN zY8Z4yRrRH|cBl#6vJ5nvAW~9feb{#U%FNPRz}j1M(b`>Iv*~&y5T@GYdJL^ayDy}! z2pd(=srvdyhA80Nz<#Tu;wN9q9#u%|@3DA`33G(#<+8lRlt^$bp_R4%Pl%<;{G&rP zab9#=SX7Vlv0|4#P%-|#nx_D1d1 z-~}$=zzXNUa6yApbZoyArw2XWI5{>(SIxNJqsOP>Cj>H2JbP z%4$IqYdW85p@v>;tjLoZt_2OGRkNz$7DQ8_!VRhj(@Amu*Ha|aL!R=h{mn>s_S(Y5 zU@J#Fb-od;S8tnhRy}@8;bm}9=q67R>qYO;pwxm<=ht}Bq!q+wiO~c$#Jf9Wty-a} zmarvh|9>$#Lc;$PephHNlnK3zd>CFE?Y0*#hXI3fcII|EXxdII3fE35OF%GDcY_V= zzoT#&V92VN^a2 zG?B#9tU@U5gzzWyFtp5cj1BR6zVrKV@05VRkPqHJ{QWQd;Wxiv+*Viv?cDFmS$%eX zcKTSC(Ff}oqSgY$03b*ro=FkKE}UTeD+-qY{pKnk>)8M{+gbS&Xm%;;r*P>?;7 z%R8f@>7^(IW3`Vmek6M1D!~}Z8iLLL$zKue#?aq@w+h|aM+#R!tB0gS;bC=g%jvxI zSJ8qs+%u1L7;q+JN@@98XJ$3CIdhq5Xuy)LK_uZaCq<7-;c4UCn+mUhlZ%Hg5Dw6u zr9u3ZTvVD4t*yf0v#CM{j9wq8pTl-x;j09$<=aHZ+U5$KN;)`}L_N+hes6Kb{;N1LdSFA4@>x0n+zKZuJy9!sgk!O|f zcPI*UP_x(`%ACBoOPhTnDI*h)P)7xcCdWBF%S&J26NgcFwMM2ryXmpfU858BzMAU)CFDP=#nO&Hx^49`E*=Ab4JhP)7fp=&6#b9Zez0p41lnpx(7_a;SbgS2KHN;Eq!SrX2N zt|R|QULf=E;>TqQeeye5Z!BrV^6-<03}0gJji>3_I$v;CKt0)fBA&?z^h`WSF-N1+=w&*LT^sHs^W_$Z*(7{3vSYSXgmmj>X2qcHkC z!CzMXkwSdAkQnXU_KmOcq{MX(8YR(>zPb>B`^ppek)y?UC|aq}Jf+{7pv79dX{i2R zM$$z4eeHePUaceirSRk7b)h>#uP1*C)?f~z++4OWsD55!+Ha)Os%m&jMYb?dC9f{* zi31~in#($rSV_f{SjwGf*tp(b$jC4APUQA%{akJ1dbW_RM5-+xE0}#;gm%}@ZYiYT z8}(bH&^KDZq_OojJ)W)L8Nt3ig52I)=!efsxQWZf!uuBNsznVKlFFAX_o6rw>qlI( zi^;=>#^FL@kw~D@I|^|?q8NLZHnUU*O}rGk;ez3l4w=UkRAhcnA*PYLyhTU$uK6A? zF@?=F^oqQI;Fa?KnqY?V7`!N66?e59}iYzXevpa!wu#n?NH zAsvGIN+>N4)&Hwu$glN>?+f1+zA>B(uMb}lS_u7f=+8r641GHEtD$#?_J%Gde@Na( z?jkpvvxAPpevRNyso}S#TaAvwqy@4imM%nPl;KzIwiL50Nf&}O3w#K;?oj>1kWBz}3}CXK8Y^@$nX zfcQowNpGwdAUOpRjYR=+gM{=MK+f5l3L|agQQXb5Vr(_HJgPM@pen;Fv?`{B7Y3c` z{~GdTy8rJTVG`O9x-t|Z|4RM>Kr7946b?v{i=P44QFxODVt`oQr9zA|0C}SV>5g}U zCf%t(K-*&Py18&i8~JaqMV;mbNHt}ZY!ce4Sg)E2Y_(~{Xbjk*rH+ShzrX%;sBk-M z3%q#Qs|LjU+PUt+ZSb?*+n1dfwQbb!^0bpfPPjx37j9K18b)QIjP;7n&L(A4$<-RF z;TEZFi)oFcHJV4CENbO6i$0$}cH+R?{LF0rz~SlH{2>UPUWpZ9_IMervgFlL=pUHf z-&oobm%g71>ZjQLRWH$jeAP0Jr2YTq78r{LIvVIGThUpjxzGhAf6C00&i^lhBR{pR z;jfXelFvf0HC;#Hu$+}AyJK`2>X3va^1Vj#7mgJUwvkWc=YT{!oyzoP;kJ%MIvz{F zZ`zXSbblrWE01&$GLbemr;WshOg53>2P8gZ!s(Z#4dRT)Obk?$y~9r|lZKH=BvY|u zDjQE2=>+^zE}e)0s{U*`k<6sianBNiq)p`jjATFl!Xt&LHu3{pd~K!xKye>AyS;EX ztOMe)wmynua^xv+JOX4f!A}=$l;q)QrP)k|3Oy15K?ADs(Lk2bC^S_-0~--=pyfCK z`u{Pv?lI7WfCB*sRzC+o|9>+WxCR_(JO}I(uGOzgjpt$WhYO(pzvVSW4q7bWK)`|3 z%>mH=7n*Nn0t*vxAmBhNa)2)Ov-R+$HFJT<2{;gNpmq*4;oIEWPt;CE@SQ8*K)`|3 zzyTQle{vc6f0qyPOFIAw2naY3a3H~c-S5~N6R2Xqfq(-S1PAE;ze~w2^#0#}3w=5C z6rB9AGn5KlA9^JK>v3nd7LLO&#PN65$r$`Rly0Phy-d9^y1|a_w(E|?l`VGwq0s=b zKvRmVEwz%-e~?pXz)xb2$!&$n&F`f@2t2AnVAoVf;eHFGJK0gVPld!bZ|*5f%Of0; zn`7PS7(6I5Qt7k-yAS0ngmx6}g&%X_!4tORm=g9LvTcj@%p7ZH;fO|V7QdadV8CJl z&$+#Yd*H-`2qx>}n;fxWtSvzIMarwAp^40`W1>CGhNXclYem_}acKGG;I&GFmBzR$ zjRvnK(1<(W8i6BD_m0wCbZ~=99)uq6en~cwtBY$Pti4G&)qgGg6w!8szY1R90uC$- z2Zjp|C_iR(?=__88?aqJo6W>i77G(QQ8)oe@@U&!yB>)|^hGsUIEVhgDNi%XDNof1 z=Veyw?fiFIb*AJUF4$~?>VKGgkiakg;n7-dTVW2G6E|}waTl|t4}@*{v`dAWxb%%r zTw9oJBhQRTfru%i5VuwkjQM&4oM+!xxm;cw=xZ&aEq|ZjF<4p#!X<@l=+pp~eSOvQ zOpJ$2hCONLTGa&h4E4OnVB0@)A*TPKa36uczy%zr!huJ}3-fK{$?HsmDu&gjNtQDN zuwxu5LDorw>p0!C@s?N$Wic-0P^3y+Eu~qAuO%b1&NO$%L1rD5uA2;2?YeXGO3?m4 z6#6iMzreLJ2Ois3IN3&??(v~|Ev6ERcCy(r{`{=P$XrUz1>LLNI4)Atsk!3I71#j$ z_kV=A8nVT-8X#oZDPs3Uqq^%-m(2q@>MpQFY<&ahw>5rUGU#Yd*KV@`#5y|GMap9! z0#q4oA^rp7S#_t=RDl?jIVNoZK~7!NH!1&%9$x z;Zz&>0G{scT%52fh9bSz2%{GkknJFzy1|ySf+16=^VLJQI(>Ma1GPgAiv_S%U#mek$j7t06ow%5Yonf~#+>M{7}nDBzm@6=`t^HG9zA;C(9F@3 z$BrL3K6NZV=UqdrvVsNpvBP2QBRs*Im2^=fN?F&u!j!TGMPZaKLpIppOI5qTdJ^#d z{|Z8WhQI^dQx_FZLqFQF*mF(vvIH0;G1gKy}o>0Mw5LSIeJ!x)2p)w(%R*m!`L&{s3~gkduD zRTOoS?SaY#j3D&A3wI~Qo*wa_zgjq~*0V+pt*2-Ap9dL@zDlSI3_<9t$$1!K(68Ep zn9zpG1&ko{Z8_i-W6)PqxWUW}YC;}%P0pe)27PxV7>mAl37Dc)IfeA0zijpWso#Wy0k2h8XH@#6_e2YB*&{`;?>@+&@HbhiU$>-!u+v z{2zLNXzzkY;F`~YXRa!|xsANPcM0ZKD5U74kWt?Sh9LCS| zso@|@h+l;H_rps!|NcEH@KPGE+A3pQUZW>2TpC=tXM z^wkt@Ft<`{sCYlNuwZ6SvIMp6xT#PQ5{V@+e-feG$2bLwp#4MINB_I)cNv+&x|YY^ zTCrl2yO1hg(cD;WWTH!-ojEx>eXI*Ef{Sd_=gr{k-rVT;4HNW3Q6GN0&tN(u5{Dg7 zRoPx?{tp|dERJm|rbHZ_zCUkXeV0m^iRw-xe%ET(fu#`Iav zut5q?c5I(HLvsQH+S~W+9lB}PkUlqa&-{UV^HV1d9GyNkJ%2;)wiDAwkFFWi*9bAu z2ffnjgB9X*z^%{a51pJ{!@BMseeQvy)ARWQr}DFN(=*4rB0W8NDw#;YdE@Z}{O69| zh>VS+8bR9b;vEd|ej<`@#(Wl^BC!DIivuVNRnl5gF)nZ02K(iJSnl+xQ%7K(30_hu z_JA~r1P`(2z&+E+SQ@^l^&4rpX*n5(vT|ZaumA-Cea{SMz=n9^5ES3Y*!6v*eUP)sP{CbN}oD7$LrYB)1OEf z*;FDGO&dKu1N$Mir{{*;{LskG-f{Y0-?nw&!`%y!(?&cR&#alJMUP}M@yHtP_^^$K z^&4^%QzJV!4Z#1c14Co+$j(Iei@PV+OpcH49;ay_wPMM5Pz?O^fl~M3srmf;^szi> zd^SrJ4pLN)&StY*88(4fEHKLSAI*HlbSIA=e#vwSF`Vc%vt99cG8@mvQ{Ydq{eR?Z zg#N93_w2^PnKtslTLcs9{wj|e>u5X)@alAE3XGGfO^{2JNQE)ztJVTx3PRUXXuL=} zoV#gsT%;E*Pd&WIl$iqlhz$zUd2%j4i{?z3VJ;-E%g4>1BdRNI({TS*X54GC1He*2h3h921P+K{+>d{z-t<8c&tAa z>reL^888^}tN~_}c3P>y!Rst-z|<8WBNKx?wEL!d4EmYPssRSThZ!LN&@p3_#Xo+S zjRSx!S-!TQbYZe9lfBv+eY21lou!{Yutx1dX}_62erQItC#y6}Hwygw-@SzV34urR z+*A7tkF=3@8B3s)#N;kG3YCXU}$0jdMX_Z zKYb4EgBAvN%gIJLG#*x>kPs`>v@|LhlcKN2@i4}qzo^$xPfTVOqPd z5`%FP8H6mIJRkr610nFYs@)S;7TyXYf<^y+#-({J+=Un9I{Iq79fkvxD%m&+%#3~| z#4OG&p;D5PA5)^QM2R5ApijYS7<1TRb=A-dxqF#dB>G5-^f3l~jIqBnxGT`LvX~Nm zL@RxaL0`tWBJ==S$f9OyfgRvMH?q650sJOjoJ*pXM#D%2`g~Ji?R#sbjWIFFq7a0> zjKL7bppS6syTROnESGC?OAMxvG}l%L=4VLx13~C3Q6h*j=+{>`=2q|{2z@20kwr^- zT?#@F`qgQWDR7#tADcej#UAnKCn7!1M&jMQ>Su4*Z!2B(f@E3@VIK5ljaEkU+rD&Q zHE8vmgLv}B55P|u)3$i#c&(>S^T6^c{SZxq6xtw(KjO?-~vMs`j84J{lXJ_iy`=>Km^B= zjJxy)UU(#)mB$w5ujEz=MrTZ36lthkenbxVUPqTt*>{kmGY{rx;j7^I?g{!nHhOc8 z`ij$Clhl@4L8k^Ef`ZleHA3;QW>{JDt%DbtwprjgT*s$dGQ+(3Rjy{!lnck2P4a1#f85qjZN<|yBOrxo) z;|=^okp%t!8dX<5*0bB{SPjjv#G}PP!Tijm7H7x#RN1GfQ(KR^V9G+ZsZK-Z5dNh; zka$#V(EmSV+~E4OxVc==UrH4~23wiC>^h=$`KYZ+L8?z9BKjdPZGq)z(AopAvO-@; zC#t6Ex0H0Y%qo!N3hPa!BwJUdWS_Sz1JXLCDM5d^{9_i?9y5u@9)yj_?Teynq|3p^ z<{}Co$9peAfk^YkO}GeX?H}>;r(0pcHBdESVl0bejq9f^Xjk6COilBVU?{;pM9C(1 zoeNSMfmX$3Ax$cz!p;iAiC`#Ua=?|{wX*sG7)rQ(#BB)gR;HMuge+12&%giwF(L4` zYTSEYTfDrDd<@T0sU}S>AD)7~kul9O*Qv%vCb7zbp0n==CLAp_;efIK*Qw6OmUx+; zt~cRuV%3YpD$@#Vw+1iJu^nAbljAfYY&9$3X~VW$vHm|aOyDnYb#dSw@nQ$u1UB8m zn_pZec8l-K)s?G?D-;%!;run-Qha@=V{x>;>e1Qu(tMX~K*tIF|2L_~*SZC9(cb`~OSGS`vOb zln?3T&&h9*50YB}Fj#!G`kRKlFcRrh9`5#~R*rhqdQi7Dd(6n-LA&{_+1}yet1NpH zmF!%y^ME7MD}IT=@hN~9`+Y`7@oJ51F#FYfEYV%ON+Wlg5NcTHA}4K4_z!y`5ds(f zriP1GT4=yH*VMf+8v>DfxcJINAfdlNF?v(y^x_q56Kw+LPKz?GU^MF5p1G z0m*@E@%74Y^uSPW_O{+xuzMNB_H`7mv2axEOUW7!Di$@I%D}d~%Hux8 zgm?vGZ`eIL&W4d*DFobeu*vlwmI2sGfQtoKd7vjEMIBE1yfv^{qSf7G!%eFeCC}<) zV!6#j!z$uFA#>xW4OVwX8y>b=@aJ^)*^C|qNNTE>)y?F(Gdh`! zd~8nZxR~vgsawh_gy{BGqQJEr?|~pi@ah@Mg8qNkF4fIb+Mv-Zo1W%zUJ;WFm6KXr zWtwZj)a1@=)tF0{iqzc*-WjPSro(%y6|stktH}$5i7v!0T_Xhzq#79N<|QF>&Bosp|(VSCK#iE-;fP)3H3~^=JW_V zG#d2(2OepCfN?0c7?PaDAl5|>@T^lAEGXy|R2%OqV$0dR1x9cwjUed%UkWRk_B*+!M9F@U} z1YO8db|IC!4>UifADGJ)>g?G1-(}=EqRnap+7;oy4}Uy-JRA@GbLh*V4~LG!uL7T2 z%2h!^&h{1i+Q_*nTo=q_V5uGUHtU^Jozc#NeVw0(COOOtZb@r>0h?q;X1KxB(p(d$ znIgqrjoe;=UZv1XF{+UVE2Z@;`r2ZTM$BIjxUj{zw%F~RqOho|QAT?X8fX+$;_ulG#I_Z7?EP+Miroj5|}9r(!~{ zZ44C+F!&ccn}qe`#%69cnGyEv`JTAF7=w#H(@rFH4hfcGNKsiXoD?`(wPLG@k&q)( z{i2|DhwA7COQNvKby6@09k7z;(!O2)LzaCrDW&O{?YN9n%n!D(|Pv*o&Rg0>xlNQ&~xAg&d!1NZz-nQ$j8mw zoyE$#Iz4aH;1E$BO%+jj)~4fxAu#Ea8d(ElIO^|Zxd2`~f}G?<~UL>;2TU8=o7f8RPwDWwH7~mH7r!M1lP%bEKGs zpUAwtQVw&-qUKbQbQ}G}jQVRt{sR+Bu_h8TKz|p>e*Y7CD+&F5=-Z)pK_GBT$$^gI zu)NcyKOZ;xhl@k%Z*=K(l5kCga;v26dPy@HehXu!>L~7zXp>vOJ$6-bdmDMGR~0j> z_*>slb*Q9Ycow)~FMzs^EJAz1dysni2yY%&E~|2^Nr{C}o5`p8-%j?C@H62(;j2P_ z8hUqVJhX;u1jBnS46CEz1T0uCI_GTYQ83X?iN1&9dtO`=Egm@LyaHD1l}INCv-+A64|O zw#@9NJ)^f5t{mLyg+#faP*R`(`E`99$xS|xV0w9PAspmFZ~UYGdsErsjV`R{rm~8x zNYJ|zDL+{N!f-JZ!;vlKYRs#f{K^(@sFs)C*~kb*Qh2%NP83Jl$m7`EvJ*p$XzsSr zeG~h-bYZ#7b3{^bi99+ZBETHbjc~Z}kh&!NhXmWU$;=R9Q89a3-w9oj+OfGNN~O9} zTaWWt|7Z z-+w>41zz#k@niRPjZ^)nCoH$xAE`pN$ye@Fh9oF|_oA0p3^Daeklqj*f}_4aH${{HUbQF&!2g(MQ` zWV}C>$i&j={!A>pA=TfXNbw&OcNFhevZuNS-rrHYPk|&EWLkkF0CIWpUX835^07Tm zGaXTq#QPHfxkrUSrfe}U1$DbIeY|TR)7=}7Cj0nbJRVK;MbqkAJTgcN$@OH5hi!TL zJo9GyD5iLy%zMap-XzQ0r<8lpHLpH@`b2)_o-QLIX_n;<2%4vS~JwyD_#gmMy+XmN!7f8~^OS8DR!Gig!tD1J}nk!u@z}l#pybm4zPU zP8E{q&vX>;ut1Ukx!nSxx9Z(yg(NzPw^|_aY)5gw6#{rBtq>@E!UBl_h5J;9LHoG9 zDx{ave2WE=%nTRzD7N0b4%ZC8h)%f{*W;etY;m__wVBlna2!46yA1Uvl2rd+30=MR zFWPstFKNH4{hIb3?VuJ7|0Mi{@O#4#gx?Ta2$e&Rgf4+ZjdN!&E4~$u`MFjo?G0e! zN5@AdbZYsi?V~OMjvmRv9^liU02xsh@S6_ua#S`f(C4v|!2Zq^AAyFre{u9M8ZBfR z5kf+&jF>SwKDv9HcFwZY;o@7A=C^Ty@_|*jTdg>Eb$ z3qd23d-vwXCl1^&G?D9JPEW_8blUxpoOTb5jR6PXl%6MFSOBNrxOew1b2vcZ(=SAB z++2LnkwZT;bMp8+SVfNT76{EXqe8~p_jDAGE0Cdm?R%*HUqKQ? zyCeLc(9chVd&Ad+Ump4itOmRYz5NG6w}xIx{(!s%lAyb(1Q#`*y;8LF)TtxDVYjBK z+-MPKw3|vDzA)*$5Rc}kn0A&fSL9fsDQc4!N|Zi#@)*!;i=mQ4Q4NxO_JzGe*Oe~O z$fydY(x{sWXqwAQ7fb9Dz>kj7%Ov)(+>I0Mmz6Hk$aMlut}AkVsm(>jIX6?OE>!Vt zB@HSc68S6^$zj{kfLP4p-K8)fz{Ae`ArNNHv`2%LE$@L+2#Oe~iAH-7l}k9=S%Q;w z&S5K5t_8Jk{Eu0D7G$ic(#1h0w&Sr*15?nR(r6q6luy!rBd&u2Rf=b*>o^%1S{nWp6rW zB!^2^)`Uc#ojQJa=GeibGY6rG1d`X3Ua1j0BJ0HL^zr$7y1+hBx2|-BM%c_1x`3n8 z_vepJ-#asNn4WhS5%>T6A|deCa_)%(rB}hpUudPP^LI5!WpngIXfG8%=5!0I5}9Nw z0e`SGlZvI22_v1##0?|apN{S@di4G{jL9)){~!(NhELnzi8|$K8@%asp$<^=X0ow( z!idqYc}XLlO#*FJgN3h1f6oO}b*!@iW%%M*zl!#y$pf3kG>OyXRn-45xr>B9 z4Ua~<$M%=jwvnd|G0Un^A1XDA3-cGlFk27T0y4}kx7*OR5?j>X&`($HSy5iR`DFbE z`%VMBXFOwMqsdq%ws;yndTcD$yW2XKE4>Cj6?R-GlI0kfRWwaC>wg;d|B!SI>i=kO z>9w$-509zgn!UrQG-Gs)!G})(rDMt#LUM7Zn=f-v=&i4{ne|4Qs1w`u$#W{ z!P+9S!sz|6t4iyX{Xc;zhIUwr9>YygTgi~p@qd{7AqjsQ9xLBHrj@P%F~{AMs$Gg_ zWRr`QR~BL%ac09Yb&NN~GR0sDY%Q3L)2wBo9djmztp01@n8woz`m(JstBxh&$)w9t zKy@74m>G#|atfA~tz%Sbo*flqtsNs;C0~fGS?jT9RR1p} zQ4;=Q_~Fpm&`f9p`6Y6g>>=9#XmcHE`p@;&l%$}T^l zLoVJ(N%=8@`Mq4%JAd%PzPqRHp6b*$^oT7J14g91JDq_2r>1;#ZtU#r?i}m9v6KPP zxPpsDU04L7;S&6M5x?bEM&wORt^@~wo)uHgdXNZWc9!5|Puy!$Hy*~I;S!t?=~gd& z)XrwtdTpd!9xf%SB54Pw_ZskYHkCjUcSWKf%^yE9e=iv34f=g2k50oUtEtmnG5Vc5 zBHKIC$&jos85-Gz&8?(2qWy75KNvN-qVeGpTmvI3ZB0he3X9XFyF^h86v?L2W{pg` z76si+3J4U%8P}Hj%uSD0l$c^u32uI~;W`S{Jm2*k)SFe6qJx4rl;GYsF&Y6}hwhyM z6Ca60vr!flVZ(S$2`+gPU-7KzjB848yW5aS`1aT=Y;NKo@v?ou)%B%_$-_;s*<%yz z_!u3(Avd@;N4?v)vR+<-%iF|O*-e9+1_!DBUkOux?YCj4@6Uzr4G)B`4*ekX$xqO8*(|`?F$EU@7d0p-EtKO;_n=jod2o zS$1-n3Sso}Ei~y8Z00{HDs1PN;9;Ed5DqXqgr*2MYQ*|Wqb6}(9y#5(e`RT>M#L{< zx}e7z2V@cB>e5XbF$5g|iB5FUC%|Ecy#pRGI!ds6UW|!&%8nB3iB}=fj?#z)5-~QF z;DeB8^^~?rIw)qIs0%l`M4(}~ zqhp!w(pGaDxIoDXSYV%|*~jQeM4-N|1i#c18)r~1y2ghlCif1F(UPd#pM9t_2;(Lc z5b^T>Gj*-+fIXt1*Y{0yjU)YbUl7tg>z2u+5_FK#++eJ%?mJ5ZUh2*=roU zFBb|2fFWu5cJ~hqd0bsDf5oZy73AW`#S?p4VjJ2lg zg~6~GXetP6FApYosbnmbflnE+{w!=4ilq}t*vZz%_s3Xpi3!7xfwi4ZnFLo{V z^e~G=XO}Dh%QSXAnv8(@vrWsxrQLFTVn<+mHzFo#88Zeb-&h(4BwMj5tyIXQT`E zrJC4}&@PD(N!ebK;#}CVg35)qU#woMLJ&v{SlfP!F>g3a4AB2@H14aHShdzauzzC7 z(J2Oj{i|V&vJ&kd9oIH|=oLs!ZBm1SCh(OJfPe;LtmT^*c=rs=osW2ztB8tEX<=Kt zJ@ z!COIQV`}bJ8$0IKXzAK&FNF{0YV?=ZO#j0_BJdZufCCo*2hLqunuLu4YjKIKe)DEG z2xv6Wm&(>eOWz3nCqE(d@4|9VgiHI|$TMPVkw^FMDjc+9lWi*usRsgU+Ln<6*Lt}E ztrfVCYi?KfRnz~6L+>Twi{KHs7U97Ax0G&^m%w_M7GLUW7h3F_(C>i-;ENx9uyku1 zd2;T8>=Iqs=nAx(!m7NbOlFu`#_l`1EolBr{FAvaH&MAN9->++=UmzE3ak~gWWbVC z#BXtq$-Z@BU3=AQS@dwl?h34t+h}BJA;v6%1`vT{BaXHjrF#t$SV>@Iv2wJtE1N0M zGr|{x;J2Bs2o#?3Mgjd_1AD?5QdtT5io7?igB{57D6w$%3oIyj7wjA}ua-uvgIS4q zDw|Q*Rf~$awyZ1A-b7UxE}PuHoSH?b;-N|sFSAO?iflAQ78_NZe?GYK-xX+bOvF-J zed}wZb(Icy-PY&bh=kLM6p4itQeIf{71M}T%6&JIY1;y2^*6Asr7!T6wz6$l^~ze0 zqE?yF()E8h;}PcnaKh(xE{Quz@|@+K?L9r)^+(4`cff2>oD1pEZa$PMZA5$0JryjU zZ+ij_-;kM!NwnwS$vwi%=WP&sdc+}GKGHTy%1s+i14x>!Yo-zVVE%u5%gz5A(xOoD zYMqvAgSY}seu~&?m?f*1vPEkff>ZtPAYb9{3HU8bS0)lO=sh?6+e*{5A~4T? zW(c0zRJyl~Jh#tUv^NRKt=Vq)od_mCA8ExZNSbMig#~(;FHGFphf7D~j&sb6K1I^2 zPxT!fnTYXc3@e|7Bar8(;Ee*tO7{Q~@jG11j6OvY<>@Hbc*glTh8w|F9_}dR0o_Gb z4!Ea>A8WloN>2whHi^4xSTn#csNi}9@q4LW_-)fCB3G5*(gbnLF@@0I3Biv7??cv#DHP?xRXyrRf@*0I+T{rUaj*`4ap|>6Wu~WT!@7}Z1>6~f* z-$q_Rw9Vx0}WF7f-RN?Cc|YZr-3bH;N9Br0Y3tMs5-ftF;1VZ1ZfIw^`#FFej_6#@V z_Kh&&6X~u0`nh-F2sm=qD9yn+XGbb48e*Z{h25Zgy!Uy)7Z$u@ELk#Qtpupe*p^Gu zCAgKU>R8b^`p-npUSE0usw(b)#~yV#~AdTDfr9-WHy9T2up3~i)VyP3B6;Q zj;w*s6aMIoT9%fOKJ>llV?Utl&H3PuFS>0JXr?5hU0114#naD-A-}1$`amS6Cr> zN4Y~nhQ@DzYwyaJTOhpvxy%CTiFK6QB_!Jo^juz+7pZN}(mQ0!@*=hENt&di3>T>( zISG2JY)2XHP%|NM27w#X5E9)U-42zISEg-;uVdTw%gXY~H2U6AhAY!Vo`LKZV~f#I z))WXFN;c6^4ogTfdc6T@LK0#O#0MY^e5Mn4`m&pi&9F-PRt3@xm#1DIn+=6R zx`&pz73`i%K!3u^5;f{ZNiivi)9rd-z^`Pz5))*F5lv|g*5k86mR?iR268}YIfa2W zX}!Xz)|D8ua%PkJ5;`-R4tq1KgRrIu1?QzyC)7cLgC^m%DcKGK2bqwsQSB~e zSLLD_W`&8`EQx%Z?5Up$(EqC%fW`|2=LTa&HQDh(p@^fqWfbPi!h_Y>Saq|gp);5! zQekgvdIGxao$RsJu@_BgrZBTvq{3ym!3C5(u_Q~D)h$f{&xxKBBAx6E7&RDZz5x4001`EQNG4pIe3IRSY~;hgur45d=x0ZR)xSP zfNXi4Mo#lZ?MHN--4T(hn zU!##XE2WBm4F{9Tj^G6Po&nmA*o;kUen$!u6Y4pSMKMc zP=LTST|7iz*j+H@t5<-2;qjYR6wXl5i)MT}QAB^G=?^=Kef0kNTjFwhPtVyock=z>qc1!h*Q`!x97I ziF%M^?MS*^3x*P{M7WW_Qrw@XBPp{s7_fE+)$0rTzs^#kTY*q#cXCC}TBu%JJFHP1 zpOCANHEV{(#@4L4b#!9q?#YQYqcm<|Va>vtHRi3B$z+l)Ie>?b4sbA>+(08??8ZF^ zBvM%z5yF^|<^1ZA-vB||yMM2I1nB>3&6`!dTWZ!hS2v6y#L5-L`Z2Aw^I zl7L5w-S#?MCEeNi_uv*5KFyro{=*;go3P<PDLJv+H?l!s59y64oU!BeNGm~@|_qtzdxgZ0Fr;h}xGAO3KY0CiH;>Fnk? zx7X&nw_oq(C=!nE?AZ_xJb4z0It8wiKJ>%+=b7t!{`s-zpU=bMLO$QF$n?H0vGj@aRd^;F@ z!5SIeIyk&1vo{8611`!vs)C6`8t$Hk_1u2=&5(I_s)C7On?63DKQcQ#f7+usR(?BO zn6u_|LfUmFE}2QcXJ$4(oxlI|k+}oMIns6~S|`@q@32hn%$ET(7r&UvSAU`ZCjE@nQS_d?N29+WPgOU2(I5#pDnIO=@T9XcxogMPww4|3cLw=+6CUK=9A+zUkUlB z;@~H(`s}8O?rw_Vh8&IQ`RHf4qc0&#Y6|%%?MJ1fc-0>mKr43i4WLr4b`lN^^8+NE34(3d!OU2*eU(f%R&{Xax@ z5c*e-d+~MU4Q=G7TalG(u!DuqC(+K?&hLE3hz@);4*%`-X&)V*$nD(+Yl~*5%<>#m z^O$IbDQ2IQ4on}vX9hTpk&>$xmdd4GG~|}t$Z^QS7ZUZxknE_Z0@%>rzKOkN6d(^W zxI^?w$N{neU_iI9Acl3qb30In7wagM0-$M-lNA|tm~xErU2+cd4PJWbr8+zuYCy%@ z2Bk&*%a3Wt6N1on^i{YX479g{N|~-fOk+C_fEuoXATvw_u?AiJQ60>2T;;BntMpBc z72yhuWi{YcB@p(iYK~36&FWSNh#s)wfU1UG62|_orurWyhe`O0@Mw~IY^uDejXZr5 z^18taXQEw6Ho_#jvBt+lyOMa}A@TqIUqAlNkAM89|I;HHz-o$fiSkC+@^in*fq=1I zjQjT=OU8l?kakIj;}doIUD9jS${fDnV%2R70@-+3e42XX_<{TLr{|*W^aG{NK2y$i zjhNIlp%gaPKQRL{XgNByh6X!3lMFJPo47TX8>e9QJEMEThN1&x`2&ZiXY+^VXJ$`}fq``tIXN`BYySuxqf5BC(5R3|Q`pD; zRO$y&$Yk1$B4{d+ZL~_^A?Si38R$$b_WbjFjtB39gBu}&P6=@eh$9htpbUnYf4k)k zUqm)B(B&iDgPjZC{VwQ#=XYJ)py)uD_F|#n3-hW#93Ul$62u%<(0u;bi34-c3i)nj z2b&qh0IZE2n#~`}AD>rCv!Y@JI6+Q`io$;;*OUr!CFovNwb<&30f&!7E=gRnxumj# zly@b#EEQ49SHprBCrE)PL6&@IVq$1yrw&Ua^f|OoXZmo~gTOH~r z>s7olJ;+LA66shbkxXV|vc!rEUMz7+ITab*j(t(%d{21=LSnGw^dlIT!eE!WpFoqj zIr`OmcIx=ynPUf!&ivY+eD&L6@0eR!3bUj?*p;+?gCAho{x_6o$^UnBVIADqjk&#h zb2t2*espSX9#*mDluvy*zL1Mk@OH{B1qmF85VL$?gzww2ZvDvY%*hi64$T}tG&N68 zOo;TxyDiD8z0mTirKv4G#t2jLIOwG3w_E8P6a$mZ-Fo+C9ez1Mzfb*FZi0%6g2@@Q zR=gH&_@K&JT-^}LlpAuaGeYC4Z|aHbho_Ei?(XV7x*7gYZK6L3+oZ=gO{w4zfzACj zF@;j8hz?Pr9GDp01q)Ct4c&1Y*_ukhU#fRtEO$fh#KhFdP8!_G zfMOTLHkM|am?^^KPsw9M2I7&s;YS73ZQI6u^O@-8!EM`&C;}acFoODNma?CJa$6tX;X}77ed;jv50=;=*+<`W8(m<9l}Kk%6sIcm%d=o$4f80G{Fbc zoXyY})AKWP_vVe%k^Ed&gnd{!4a!T^0xZKm1~4BmaqWCHojKgPGq*R_*@?3V_~jFY zc6RO>ni$#HIX|z@{P9r^>9ob^^D|~T2+z}W+bCYxdqCI!H1aW`T^9N-crESDMa$i= z#B-Mz;h5|D;$4i$>|p!5Jz2H*#+Ftaw%Sr-O-djB{O3OMkx!mK*ISMNzYf%g1t$`# zlV5{uZA#P;8TQL}mb=W9Gf|ur@9S0yyRj*Etw%# zeHj;5DvbSg_WNHl1MB~xpAGE_g~`8>kHTxST()e$fdE1v2hF)kH9!w-lHqcU9<*zw z#l;MISX57}4?6UC3?4mnNre6QlKtj0a_kYK_mTL}*rA!DC*zYH<<0P0QGtVgCC%+D z_W|0g5rkM@pkoi69ZZQmwh?s!8PPw|BQHdZp7pt@;c~A+A*v&alUi-h2V5VpNXUScaj124RAEPrff5$LK;}?zi=Z10nZ9zY zicL&-`1BfzJjkYZgwP>#BEqL0qxuopouEvnrI!Y)_G@mELJ)z!}0Ne~3t zM69Q6~u9(f$bAVcyfpHkoJQ znJir#pubhiCKK$ZN3leIvNOug{|<-lAmPu!BXAAmz_~Y-lWpYjAz_bO$`pd>v=~O^ z#U4e?r!b)wYYN8KhQwiQWlok7vV)X@qa!QoYO^LK7XIRPBLXq9r9 z^L+xj-y9zD{XgF%;Y-Ok8z}tCi3&!7DP<(MVinJ#ZYT_vu}$OD3AE|a*>XQz0zAFa zwaJBTa0Jj|2ak4RXBx#Nu!HsyY{QHwv^rn^i?R7XiB(ry=+&~z*sCR-eTuY?o^6!G zzN&f(sb8`ri$pcPz3shPqMTVN=F8FL(>@+2Sjs1^QuC)!VD-~0g>AJM56V%d@a)m> znJ4f6VgGM`^Y;Hfx~n`0JKGVQ=+TM=xcKO{B_HOj*j}4c% z!LO?1_fX7@zVENAOYrSQwLkIbm;N6%>cG*GHIffU}b)Peej}Tbu*+I&?62uHPkn*YoJrcVV z<^odiC_x9AE;%iAQS(xI?4R+hyTxe=HHR9eap0UF1)>C5;>x8dJJk8_Q&=8bA$F8b z5|k85(EQHHPAAaeOsOt?s_$Um!KtIMXgsp*1)T=_dC;;20=^tZrp(`js3_I2pw$WD zkdeJ`c#S>MH#-#0*n=(&U}K4!G5%%WPSlHeD*bAhr*T3Yv?)oHpjw0o>w_l41;m-& zp2Aw1ExoGmp#Pf(9R*a(u0|qedrO?0%2E*!2H)5q_!#;8(;U27_^l?&7eGaXK&~(3% ziX|%$8m~eqP{y1>@EQv%sxp|Ckb{ry6ZD5?^q}oVAau0YEzah(km+QEQX{&70I1S^ zwio9a6`2*@UQ{PhlPv6rN9JWl8awQW&wjIqpj&5hZd%-*bP2V>602Q5& z@e|V6vvW5n>)uq9p3;?uqr3W3n_>5K3NH3ZMGfv}Q;D>C{)u`-3Y?Q-s5Xq+8*ayx z4&QEs_U1;%Z^+#y!D#s;#6(jCq~uhBGLs#szP|*k!MFhjw&cWwkzkfB#O)!rkhkpr z*8-SMI1_n|*mlDjR#%RN;k001$&N})$JkAH2ot+nn8yob!STtlF`8V7)(?S_%y-2i zm=%!o9J<(3M1Q@~KDv+QW%)+;>2vqaP9MMD0XRShv$Ln!B^3I8C`#Yot?%m^8tXa; zKb?T^)Cu~Aa0h9!G^vD|NOO0L4GrEtxYdDENsMtaJ3^@M4jmjE9~>J}Pc-9sDy0To zgLF%obk@|?H=1gIK8DIS!j9sL?F@q$JIINE=BMt)at?4@Vb8$goVlEk!M(f3#)gMR zZXPP%;6aSsISCy+RbumOC)`oV;nAU?@<>%2?XcC-8^^%VE6c+g>9N%ZzW)uW-~U+k z;K7sW{Fh}6n7eJy*wE-WQpSEWWdETOJA{>98wY1}pBB+A zcHnJ;f8aPRCc!{d>>Gc`T`bN^fpW$`KCC|kfF4-Cba+kfrqS_B(Pkc=n$LG7lb0rw zprg=bE-d_?g*9OL`B}J@{uN%n4*$pG`0-OR$ULdvgi?2$noU4$bMy$)tO3sd&h?a>ZFGZ+wZ5+uZrV0#|xhiA# zkE~v?2hz*LvKkU*)*AFbX}vj4Ca0n0uDK-HN*8~tOr6Xjv6vOFRB4%!hL*X} z1TlWADw5Y&*G4i)g#1^JWvGnZKeA=!m48B8qSlgJNBaSwa+}B;5{t+o z0Wy&qlJUMWRHnl}GC#5b`cIc997s9&4zL8M^|L2-#8s}5Be^W4<@g1(I;d0WcSK5n znhe9086)#nZMa)6z(^2l2iR!Mk3 z|I=ok%Izl$sf3UstGDK|1d}8sP?Lr~csHtd~*eo3beyb|dOH96M zTp7E6WXsGe|AaC&EqARYx!B68Uzs|YQeyGd)K$#@=zoS|uMu-)g8d^~W+4)sty~+) zei8CtJ(i&|cK^thnOFV^ZHZb-avkjlfXZzmb4V;AhXlw(YDmWW%21gO|H$f;4f>&9 zQ18Di$RHD|b!XwqHF6}Em{tP6Eab09(rY4GCbm?ZzFY{+EUWKBHf3VTD=WsB&!_ z$t5Nq#hU8o(X{@NEiJZ&gKdSwUYlu8iG3vSsF#e?l3Xmb=!HTsPUP zOr6XjvG{80smZ36s|Hzh^SN;iYiCRl? z9qk8z%55TZNGu|U1js~cNXGlhP?-+@$m*00I_DSE`!5SJ$i!;hS-5hI9LXi7mB23x z`74t2nuwN(EfuFP7eX`3>idvQnOO453bVeMEL`^WztC+2{sPxP4*cpX%A;-MOL)_W z+17RukfP$Wsg*TMV)7xIX89h5yGCRx)e6QXC8W*{Pmo?yg=Jz(#pz4sHgY7Fm|B2W zF!mpyB9B|)eUK#S7gdu0AGxcst0rVJF(;*ROUTri&e1j)A(N^}B-BSmW#YPMvuAgw zLxr+%11nIirB;rya_~|Dd^BV=K1gJ0Yc#MS>;*IwHPFny|AjtD;4g41f&Sm{NxyBa2J3A>2WSJec(ozj9rFz3a|G%AzJUwpZ zeeZhDZ~V?jKlV3s`9mjX^9K&+#mO@7_HcvyhW6+7?1pn5c>xov5Y0wsqB849?O1UM=`sN(@Zl_`JeB@4|j?H$YAIN`hAj$)PSLD0_OhVtA| zwtJNoS*1a{DAy#v3k!6cMJGM?!iE-Kz0tV|tjc;$+^VdUbGVMDdN59k(?*bm%ooiB z=`0cjZ?yk^8Tl0w`f=#DLersj!uwan%p&99;*?FMMF8^&xFc1w~_Zd4i&QNG9zC+>~Y8f3*7Re=4N3TD>6%f zBP{@2OE444yl%*JX{7TOfj3{=jaxONVrKUWtgJo=`u`!S{}+)5VEr$2CHWe86oSol z9py=RkTsL|o#hD-YP^6~w5-pIYHg{9%llOQu*n9B6v~#z`*3;hB9I7*9>2bPOB;FH zE-a%8DHY@yF({gBf^1lwTEh<1b3C~5WMJLcnx%o7upfQfNT@nssYVjeLxr-yB6&{*m?3Gy+afZUDx$F49DOo$+73C{$D~)lJK{~&xFUrSA<>)?I524 zKr`KN`7TAn1iS1SZ+{nc-!=&6jnOP;!{s-&k#pFi)`kUcXE*T+#4aFm9p^%bdTGIt z`vwPbzkn?@&yr%*2llH!CP2te&l`f%5Gd zd9z0nTUyi*vrPuew`t@p_ROe#9(3q~pWt-fRK68zfwu|?EO5A-$mckp9j;k^!CDpo zSmJXV%lqLlz+0@b(87EOc(-&B2#&z{hC>rM353vM;T+w;yXnxJBc``HM-J{{r>PF? zXC8l8UKBVDI^*1B=e`q0$;^vrRd^#-``4YC3f<%C<7fdPj>MBpG? zYrKAR`u_aU({Q*f;^YV8vTRBj`?`2eKw`(Cq(VwuQVG&+#k2ZgwHPAz;t_E@Rdkdg zOpI*0s-Y8-D(|%OYLwCeF!O(ChM#SG01}1F4uP4n3?XW3s*G~sW9{5_K>}qQF)4!M zmKi|@;dEqZcHRoKyJ9CKi!+Vc3C0%z@%M!ugXg+;X+P2aUHcd9@3p_uzN>v(`?~fe z?Y#DR?RT|LY9G^nP5Y4c0qs57v)WVIIqi&gN;{$5rybVbq}`_N)yA|NwH?}kmel&R zF0E60o%Sm2722g*TllBp{|x^q{7>P(4gVngo$$B9UkiUBTnc|K{5#=~hd&bj@8Rde z?+^bhj6I$R|4jJd@O=1q_}=ir@EgPX!+XMS2;UIi7S4p@;b?ecSP!oYUlqPQd`UPQ z`ro1d2>n~=A47i=`d;WyL*EE}1;#A}xWnjEu!`{;pC?(!f!BW1X`YF$@3 z16m9K~A)n(}O*1e)kx!O^pb-%21 z9G)*P(OO(ux)Yu+E5W{)br+TP!?UeKY12v*gsfdC?Stn}OJnf-KP4!A?f)(T{r~VtD>R5hP*lOGN_D^M$uUGzr7y-!T5a z6oP@fU^#GhXZh|n@+hvucnxZ7V;>yb+mky6L$-uC7sxo~Vb}m68UQVzj-61qe-bXP zvEW6VfXq58gYo|XxADJ?cstSf?qlG#;5wXJrg2_Oj2-2W#ya}&80XP(AJzX*sE5E` z;3{+A@mtDMFdNup6CxBs0Y<^Lfh}?ia$GH0t?3(EdVr0uNcd=lkA6xqO5zf;o$N*x z`k2u9%~Qk2)HJ*-wyY5H^w9 ztu{>m2@JsCukr55*Ow2rk!Obl0Tt+=cOM{~Es@MdOf`KKGzZB%_?EVdfPUxHT~=6K zyqg>un%uu@P|?99Z3)MaM3{C87lhcwT2%8IjF-vSD93+tZlV@h-KOjRp+NtaOE_&3 zR+oNN6Jxu$+TT434fJ1V?(*w@I8-Fz|Aa^2Rvri7-mAQF@0FCMhI9|UhrwPQ;gXN* z(CFC>5yAz7&b5^f1KTchDB%UhwqXA6TjgQ?f6tQ5|Akz7cAr+cUA|=12fB7ew7)MO z?e$JMsl=d}*jlGk@7%C+#QyG=L!2hRsre4%N-@U%4BBAsj{QTo>-?Jve9_!(&heJ75&TiU zzrDeW z_SgBMqQQj*LWx{o9_ywL-k!T-Xl#5Hn$+)G9XFXvtK+b9sgk4P|1kL+(cT4*73N?< zJ{?TR<(H=AQQu{roDELy8re_30s&#}33t;R&&gcJI z2!X#^-IF`Y_qCCCUbG4gx3x+aq+;>;VMAq{bCrr2N4tNh&egN6%~(FG&ybeyn^`yq+zKm5+Y@>7S!lv+LSlb4k5hsD7vJ52+n!(q8FMgc>rFl5($FbhLVJPKIh z`cJjhkDX{jKd{6NCA6p|#)vIJL|{*<*ptOc%;It{RpYS!KfFNTFK__|E;J52eX@MC zjl6qCDC^45S)4pAb`k{h|9#6e{y!Fs|6$Z6#BHf;eWT9zFvnX(S=ItnOV`m1okHZ9^W#v&BiPWqsAj|YzljYl0 z*Q!ds7^Vh;sYVW_g6)D_o|-mAq@8^&4c0V5Y9XR#OSdScTmdq80k(>efhDPVljP01 zIq>^jNSAo13;q9{L3bCd#hHtdODum?gnk9s-X<9bfwtLZuGap4W!JW41{qH@yIpIj zX(DLT`nLY92EIZ6e^=1|2mOE0|5rVdv4u=FemP$JU~M`3f92EZl1$?k&#fAI)y6eZ zOBQ;%?oI=a#$VKOj5T*FwrQ&Bz<^4AYluAb{|D-B%2s6lD%ZQeO;6b!dy|6i{iU0sq9j0mMftQKu|Z&TXg2lFw? zo5gFs=FZ}Py^Ue7%E!ewR)CF3EA;>Qp#PWFJ`gP1JT_p+s%A*g|6}uB2!bABy`HV6 z!TvuRLr@}C_sE|QfT;ct`9A=>;YV)=D^kIV6qCdYLD?!U673(VQxd2O*Y0>>;{NYH zBcVU59Yv6%g*oudYs;r#$shZ&;A`H6yT{+l?7-ar9xA~$8M%N*LtdN;Mo6N&;9h+a z(!!(63)eQV^Z!DGz~2Sw-Z5W(u#Nn}v0xsu7}dre+ZkYgug`KeiM`PO-%FML z!nJ-ue;vD$Ju%dS z{{KGO;PUHtOAl9kn!})ZmvkiWvsIQOS;IQa6)sZhM_>D1AJ+eq8AAV-z`gUL^6576 ze8&pssGW-|{1E718gxNUgP{LE3jb$Xcwu%a+9j|>D|f&k+OA_B zVTCt=o$bMdA=pW39=X^sJEbbR-IUtjp->q6ABX?5!T4YK;hqbhE^z)}=iH#Nc0nO23uE?oBapirA`uMUR5*#80A z|F@jMvKy&jwj9ismwmSEIy$El#}#cYS^uwf6Zi{Uz=41Ro*a1k4dpX%6Y$y*$tGr82d8P1O!|NhuRlQf1r(T}Q-&Xe4g+1L!_byOI#7np z`ol-E;kOg--e?aOu zJOh-^|KBMswM8|kY0UVFFr-3E4%{Ix)#@=WF13C!Bk>D)6O{6)taDT``#Hq_^Qa#2 zDflS}&mP053SF}qs$SOPvTAnUElp5{RCY}m$UN96tNQubfsd=xZ(e|#`Uy3c%iEW- zbDa$y?*Gp#>;D8oaFq!zn=l9W1jc)qbmG^TPBZD!-x;sh>X$aXnmAH?xT?{WNyp@7 z^k*Q`C0YNu1_YM@g*gBVAl_I2Wjyw3($dm>><@mD^+Ycai3EZnF*Iij&WW}_pO_+W zY+43Cg?8y^xZ7_snfiM=;NMz8Bm)sq!S%^7-7oc?o|>4R93CMkf63q}u?Wz2q-=91 zC}q-^61{7#g6O}1yomb%eFuUP;7S;8s6t;Zhx>*F%F`E{a8(t$be3|U^ob;fIb-M6 z`kK9t-78ZDUD}0(Ds-jGU|R*wyzY+3vYAwWSAVcyhngyzD12oet53W(8*f63~5`A|NFCqulLh6m!kh)L!?#DF^DL9dXuW~1eVzC!bDbX0v2&lV^wsL^4aJsbE_rF=c-3r zb|0-;dFrr7CtE9hhVnCMyfgLG^0h?v8)zE#uL6dw{Q94VM}PA3zh$>92EoO103Kv* zE&d>@R|`PX(?n=U$p!}41^z_u+0+X@_vIU=(u!(D}K^8Ozj{)5Ya zHN*k9|Nlhs`+viVh7v@SOqiN;1#J)0d&{k*plpz;4;0J+in*WkoVjFiC zP1|#Ay2RGmfVI_GK4nA*Z?8fNwQ4yju?dDIM)y7m&wfMrf#RfC9Zfeh*&+O?TvC4J z16?k=;)z&F3B_ioXYYQG%k9~J(C2V8bV$uU&yT}RZXdp1K(p%cr75Xs{NdJH@9vE> zXVGZK+n^h!QYuGuJ3#b*19uhn|M_{oiTf8s4Oj^d#PLp;%>ngns#EDDl{%ZI(xo80 zN?chWr<1TZ%;Xx20@570RMSjj=BXXR59f-1X>ZEYM&N~ch`~GaA^hn)q;x(|N-OJ_ z3~)6&3|Euc|7TMT>gB{A! zHwUURKymJQzbnFe&6=TOKhR8plxzAp7?gU_^-5x%h5&1`NXR%qLcgV_H*mBopspe& zX2(a)OiheWOegYToH!}v%eGklLFi-`CoeN`}XbcnVhub;~OTE7@aw7_c)y7yC$NXgw)%&|Cqso`kHz`Kt@-p zsz~M{=WhhsbbD3M$WoB6#9i|&3qp04_d5y;Hq=v9@M!Rlcr@w&6_lK;ngvxS3s3G6 zX+eTa0!(kHXJARCP=&#Y@?++fD&N2<;g^kGbnkXMJ-a<{!5>5mkDC}C1u|`uujPu_ z><;$dyxHG%lW3^lFQ)tpGc%_aF3iun7W9CV3oa8xeAktaLX2`O-s*;#U2#w$RFR#5B<`PFzHmFt3Y;?EQPHzN-c zFx>yQ3Dx{B`Dgh6_YN0?%zSWh3wFXfYp2#2+@MCm<6@e-hB093O@4>v-vmqx)wrPw zUA$*S#;fYdIb09R>C=nu2oO;j_M&qM((V6KO$`U54`2thS+kTjfrSbOeb_GF1?O=u zPP-i%^Y~1###6Z&X)xRu=|iX;+n{~83(i}a)FiG-r!x3H**SUe9s$Mk($Mu}?Rd9t z!=%N+PLevscD$=}BD=L7lM?aaIz9Gfcf{>5_2)QJqW{}b2NJ#_jPvjD-{fE5FY&Yd zNxqYBB5x0}5 z4IU5F-~f~l+9cck_=td725pV?U(W_HC1K~(Wd@W}Gn{yJbXMBlCe8rSv%_Ptv5BeK5g@b^`?NT6!`V1iykFB;x^wX~p{;nIfOcmZbIxwXt*RWy z>?YhIpdAFqGH4lm2saDpFiDvLKl(ZK?1^(JF;SZY!P$tLfZK2f7uryby#l&-AhcmK z_6Uf277>KqjokuDn=_(NMa{v&cH9WE=u7MJ^H2+_-C&`{P0icWn6%^u=!s%7lz{rP z0*HDT#5R*fE%6nKp{v7tK{|66$XW)!gj$VApW2Hb^c}U44{-17CP|&JTBbvD{~G=gFT&r zaJSjqAtmAKjIQS9R(h{qPr`by+f8;!;gYlcX#(1c?$-UyEk3BRv}(=GE$&Hgi`OfT zL`TlVh7*(V(a|eFD_{1-J@_~*n~p7FJURVO4+J9Gu`nj+R4N%=i|B48)4n(!<>{Wg zsoCrG?eltHXWUT+qiqgy_uzg3^}VQ+XU4gSF6~8=Uxb6ta6+#IM+9{487*QK9@`ri z&1Mrl>In7BxDO2X{QvyiM}PNM<6f{ma|mt0#{^V2o9be|q8|4MXz0AHJFv?WKN}0l zJ5FM+T}+%CjVEEcC#I)HV#D#L><-uYE%;HWEh9Ss$929McLUv-R97|bB9X3{!?+W) zS{T*#*QD-npZx7NrNgQJD4iiEy`ke<@FUR3Q;O7EC5v?{{w$c_Ooqi;gTvr^9y1S_ zH{%f4(#On{y7@kQR6vbGY;@u7zK9g)a1i~k;lGRIr+@$Df6f1le+`lb7#yf14%FZ$ zK(2}KR^!J(pCGakKL!hk+aIJpNHyUh0gZiRrrUyJ(euNT(bKWvk%{T?q{V_b*vga_ zAQlVk+lsIg11@4;D?SOUv%eP6NBI $nFrame1 +} {1} + +# The auto-checkpoint in test 4.0 should not have been interrupted. So +# this db write should not cause the wal file to grow. +do_test 4.2 { + set nFrame1 [wal_frame_count test.db-wal 1024] + execsql { CREATE TABLE t4(x, y) } + set nFrame2 [wal_frame_count test.db-wal 1024] + expr $nFrame2 == $nFrame1 +} {1} + +finish_test diff --git a/sqlite/test/join5.test b/sqlite/test/join5.test index 543cd4d2..352ffd40 100644 --- a/sqlite/test/join5.test +++ b/sqlite/test/join5.test @@ -13,10 +13,10 @@ # This file implements tests for left outer joins containing ON # clauses that restrict the scope of the left term of the join. # -# $Id: join5.test,v 1.2 2007/06/08 00:20:48 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix join5 do_test join5-1.1 { @@ -184,4 +184,32 @@ do_execsql_test join6-4.2 { LEFT JOIN (SELECT 1) ON fruit='banana'; } {apple {} banana 1} +#------------------------------------------------------------------------- +do_execsql_test 5.0 { + CREATE TABLE y1(x, y, z); + INSERT INTO y1 VALUES(0, 0, 1); + CREATE TABLE y2(a); +} + +do_execsql_test 5.1 { + SELECT count(z) FROM y1 LEFT JOIN y2 ON x GROUP BY y; +} 1 + +do_execsql_test 5.2 { + SELECT count(z) FROM ( SELECT * FROM y1 ) LEFT JOIN y2 ON x GROUP BY y; +} 1 + +do_execsql_test 5.3 { + CREATE VIEW v1 AS SELECT x, y, z FROM y1; + SELECT count(z) FROM v1 LEFT JOIN y2 ON x GROUP BY y; +} 1 + +do_execsql_test 5.4 { + SELECT count(z) FROM ( SELECT * FROM y1 ) LEFT JOIN y2 ON x +} 1 + +do_execsql_test 5.5 { + SELECT * FROM ( SELECT * FROM y1 ) LEFT JOIN y2 ON x +} {0 0 1 {}} + finish_test diff --git a/sqlite/test/kvtest.c b/sqlite/test/kvtest.c new file mode 100644 index 00000000..877605ac --- /dev/null +++ b/sqlite/test/kvtest.c @@ -0,0 +1,583 @@ +/* +** 2016-12-28 +** +** 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 "key-value" performance test for SQLite. The +** purpose is to compare the speed of SQLite for accessing large BLOBs +** versus reading those same BLOB values out of individual files in the +** filesystem. +** +** Run "kvtest" with no arguments for on-line help, or see comments below. +** +** HOW TO COMPILE: +** +** (1) Gather this source file and a recent SQLite3 amalgamation with its +** header into the working directory. You should have: +** +** kvtest.c >--- this file +** sqlite3.c \___ SQLite +** sqlite3.h / amlagamation & header +** +** (2) Run you compiler against the two C source code files. +** +** (a) On linux or mac: +** +** OPTS="-DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION" +** gcc -Os -I. $OPTS kvtest.c sqlite3.c -o kvtest +** +** The $OPTS options can be omitted. The $OPTS merely omit +** the need to link against -ldl and -lpthread, or whatever +** the equivalent libraries are called on your system. +** +** (b) Windows with MSVC: +** +** cl -I. kvtest.c sqlite3.c +** +** USAGE: +** +** (1) Create a test database by running "kvtest init" with appropriate +** options. See the help message for available options. +** +** (2) Construct the corresponding pile-of-files database on disk using +** the "kvtest export" command. +** +** (3) Run tests using "kvtest run" against either the SQLite database or +** the pile-of-files database and with appropriate options. +** +** For example: +** +** ./kvtest init x1.db --count 100000 --size 10000 +** mkdir x1 +** ./kvtest export x1.db x1 +** ./kvtest run x1.db --count 10000 --max-id 1000000 +** ./kvtest run x1 --count 10000 --max-id 1000000 +*/ +static const char zHelp[] = +"Usage: kvhelp COMMAND ARGS...\n" +"\n" +" kvhelp init DBFILE --count N --size M --pagesize X\n" +"\n" +" Generate a new test database file named DBFILE containing N\n" +" BLOBs each of size M bytes. The page size of the new database\n" +" file will be X\n" +"\n" +" kvhelp export DBFILE DIRECTORY\n" +"\n" +" Export all the blobs in the kv table of DBFILE into separate\n" +" files in DIRECTORY.\n" +"\n" +" kvhelp run DBFILE [options]\n" +"\n" +" Run a performance test. DBFILE can be either the name of a\n" +" database or a directory containing sample files. Options:\n" +"\n" +" --asc Read blobs in ascending order\n" +" --blob-api Use the BLOB API\n" +" --cache-size N Database cache size\n" +" --count N Read N blobs\n" +" --desc Read blobs in descending order\n" +" --max-id N Maximum blob key to use\n" +" --random Read blobs in a random order\n" +" --start N Start reading with this blob key\n" +; + +/* Reference resources used */ +#include +#include +#include +#include +#include +#include +#include "sqlite3.h" + +#ifndef _WIN32 +# include +#else + /* Provide Windows equivalent for the needed parts of unistd.h */ +# include +# define R_OK 2 +# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) +# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +# define access _access +#endif + + +/* +** Show thqe help text and quit. +*/ +static void showHelp(void){ + fprintf(stdout, "%s", zHelp); + exit(1); +} + +/* +** Show an error message an quit. +*/ +static void fatalError(const char *zFormat, ...){ + va_list ap; + fprintf(stdout, "ERROR: "); + va_start(ap, zFormat); + vfprintf(stdout, zFormat, ap); + va_end(ap); + fprintf(stdout, "\n"); + exit(1); +} + +/* +** Check the filesystem object zPath. Determine what it is: +** +** PATH_DIR A directory +** PATH_DB An SQLite database +** PATH_NEXIST Does not exist +** PATH_OTHER Something else +*/ +#define PATH_DIR 1 +#define PATH_DB 2 +#define PATH_NEXIST 0 +#define PATH_OTHER 99 +static int pathType(const char *zPath){ + struct stat x; + int rc; + if( access(zPath,R_OK) ) return PATH_NEXIST; + memset(&x, 0, sizeof(x)); + rc = stat(zPath, &x); + if( rc<0 ) return PATH_OTHER; + if( S_ISDIR(x.st_mode) ) return PATH_DIR; + if( (x.st_size%512)==0 ) return PATH_DB; + return PATH_OTHER; +} + +/* +** Return the size of a file in bytes. Or return -1 if the +** named object is not a regular file or does not exist. +*/ +static sqlite3_int64 fileSize(const char *zPath){ + struct stat x; + int rc; + memset(&x, 0, sizeof(x)); + rc = stat(zPath, &x); + if( rc<0 ) return -1; + if( !S_ISREG(x.st_mode) ) return -1; + return x.st_size; +} + +/* +** A Pseudo-random number generator with a fixed seed. Use this so +** that the same sequence of "random" numbers are generated on each +** run, for repeatability. +*/ +static unsigned int randInt(void){ + static unsigned int x = 0x333a13cd; + static unsigned int y = 0xecb2adea; + x = (x>>1) ^ ((1+~(x&1)) & 0xd0000001); + y = y*1103515245 + 12345; + return x^y; +} + +/* +** Do database initialization. +*/ +static int initMain(int argc, char **argv){ + char *zDb; + int i, rc; + int nCount = 1000; + int sz = 10000; + int pgsz = 4096; + sqlite3 *db; + char *zSql; + char *zErrMsg = 0; + + assert( strcmp(argv[1],"init")==0 ); + assert( argc>=3 ); + zDb = argv[2]; + for(i=3; i65536 || ((pgsz-1)&pgsz)!=0 ){ + fatalError("the --pagesize must be power of 2 between 512 and 65536"); + } + continue; + } + fatalError("unknown option: \"%s\"", argv[i]); + } + rc = sqlite3_open(zDb, &db); + if( rc ){ + fatalError("cannot open database \"%s\": %s", zDb, sqlite3_errmsg(db)); + } + zSql = sqlite3_mprintf( + "DROP TABLE IF EXISTS kv;\n" + "PRAGMA page_size=%d;\n" + "VACUUM;\n" + "BEGIN;\n" + "CREATE TABLE kv(k INTEGER PRIMARY KEY, v BLOB);\n" + "WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<%d)" + " INSERT INTO kv(k,v) SELECT x, randomblob(%d) FROM c;\n" + "COMMIT;\n", + pgsz, nCount, sz + ); + rc = sqlite3_exec(db, zSql, 0, 0, &zErrMsg); + if( rc ) fatalError("database create failed: %s", zErrMsg); + sqlite3_free(zSql); + sqlite3_close(db); + return 0; +} + +/* +** Implementation of the "writefile(X,Y)" SQL function. The argument Y +** is written into file X. The number of bytes written is returned. Or +** NULL is returned if something goes wrong, such as being unable to open +** file X for writing. +*/ +static void writefileFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + FILE *out; + const char *z; + sqlite3_int64 rc; + const char *zFile; + + zFile = (const char*)sqlite3_value_text(argv[0]); + if( zFile==0 ) return; + out = fopen(zFile, "wb"); + if( out==0 ) return; + z = (const char*)sqlite3_value_blob(argv[1]); + if( z==0 ){ + rc = 0; + }else{ + rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out); + } + fclose(out); + printf("\r%s ", zFile); fflush(stdout); + sqlite3_result_int64(context, rc); +} + +/* +** Export the kv table to individual files in the filesystem +*/ +static int exportMain(int argc, char **argv){ + char *zDb; + char *zDir; + sqlite3 *db; + char *zSql; + int rc; + char *zErrMsg = 0; + + assert( strcmp(argv[1],"export")==0 ); + assert( argc>=3 ); + zDb = argv[2]; + if( argc!=4 ) fatalError("Usage: kvtest export DATABASE DIRECTORY"); + zDir = argv[3]; + if( pathType(zDir)!=PATH_DIR ){ + fatalError("object \"%s\" is not a directory", zDir); + } + rc = sqlite3_open(zDb, &db); + if( rc ){ + fatalError("cannot open database \"%s\": %s", zDb, sqlite3_errmsg(db)); + } + sqlite3_create_function(db, "writefile", 2, SQLITE_UTF8, 0, + writefileFunc, 0, 0); + zSql = sqlite3_mprintf( + "SELECT writefile(printf('%s/%%06d',k),v) FROM kv;", + zDir + ); + rc = sqlite3_exec(db, zSql, 0, 0, &zErrMsg); + if( rc ) fatalError("database create failed: %s", zErrMsg); + sqlite3_free(zSql); + sqlite3_close(db); + printf("\n"); + return 0; +} + +/* +** Read the content of file zName into memory obtained from sqlite3_malloc64() +** and return a pointer to the buffer. The caller is responsible for freeing +** the memory. +** +** If parameter pnByte is not NULL, (*pnByte) is set to the number of bytes +** read. +** +** For convenience, a nul-terminator byte is always appended to the data read +** from the file before the buffer is returned. This byte is not included in +** the final value of (*pnByte), if applicable. +** +** NULL is returned if any error is encountered. The final value of *pnByte +** is undefined in this case. +*/ +static unsigned char *readFile(const char *zName, int *pnByte){ + FILE *in; /* FILE from which to read content of zName */ + sqlite3_int64 nIn; /* Size of zName in bytes */ + size_t nRead; /* Number of bytes actually read */ + unsigned char *pBuf; /* Content read from disk */ + + nIn = fileSize(zName); + if( nIn<0 ) return 0; + in = fopen(zName, "rb"); + if( in==0 ) return 0; + pBuf = sqlite3_malloc64( nIn ); + if( pBuf==0 ) return 0; + nRead = fread(pBuf, nIn, 1, in); + fclose(in); + if( nRead!=1 ){ + sqlite3_free(pBuf); + return 0; + } + if( pnByte ) *pnByte = nIn; + return pBuf; +} + +/* +** Return the current time in milliseconds since the beginning of +** the Julian epoch. +*/ +static sqlite3_int64 timeOfDay(void){ + static sqlite3_vfs *clockVfs = 0; + sqlite3_int64 t; + if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0); + if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){ + clockVfs->xCurrentTimeInt64(clockVfs, &t); + }else{ + double r; + clockVfs->xCurrentTime(clockVfs, &r); + t = (sqlite3_int64)(r*86400000.0); + } + return t; +} + +/* Blob access order */ +#define ORDER_ASC 1 +#define ORDER_DESC 2 +#define ORDER_RANDOM 3 + +/* +** Run a performance test +*/ +static int runMain(int argc, char **argv){ + int eType; /* Is zDb a database or a directory? */ + char *zDb; /* Database or directory name */ + int i; /* Loop counter */ + int rc; /* Return code from SQLite calls */ + int nCount = 1000; /* Number of blob fetch operations */ + int nExtra = 0; /* Extra cycles */ + int iKey = 1; /* Next blob key */ + int iMax = 1000; /* Largest allowed key */ + int iPagesize = 0; /* Database page size */ + int iCache = 1000; /* Database cache size in kibibytes */ + int bBlobApi = 0; /* Use the incremental blob I/O API */ + int eOrder = ORDER_ASC; /* Access order */ + sqlite3 *db = 0; /* Database connection */ + sqlite3_stmt *pStmt = 0; /* Prepared statement for SQL access */ + sqlite3_blob *pBlob = 0; /* Handle for incremental Blob I/O */ + sqlite3_int64 tmStart; /* Start time */ + sqlite3_int64 tmElapsed; /* Elapsed time */ + int nData = 0; /* Bytes of data */ + sqlite3_int64 nTotal = 0; /* Total data read */ + unsigned char *pData; /* Content of the blob */ + + + assert( strcmp(argv[1],"run")==0 ); + assert( argc>=3 ); + zDb = argv[2]; + eType = pathType(zDb); + if( eType==PATH_OTHER ) fatalError("unknown object type: \"%s\"", zDb); + if( eType==PATH_NEXIST ) fatalError("object does not exist: \"%s\"", zDb); + for(i=3; iiMax ) iKey = 1; + }else if( eOrder==ORDER_DESC ){ + iKey--; + if( iKey<=0 ) iKey = iMax; + }else{ + iKey = (randInt()%iMax)+1; + } + nTotal += nData; + if( nData==0 ){ nCount++; nExtra++; } + } + if( pStmt ) sqlite3_finalize(pStmt); + if( pBlob ) sqlite3_blob_close(pBlob); + if( db ) sqlite3_close(db); + tmElapsed = timeOfDay() - tmStart; + if( nExtra ){ + printf("%d cycles due to %d misses\n", nCount, nExtra); + } + if( eType==PATH_DB ){ + printf("SQLite version: %s\n", sqlite3_libversion()); + } + printf("--count %d --max-id %d", nCount-nExtra, iMax); + if( eType==PATH_DB ){ + printf(" --cache-size %d", iCache); + } + switch( eOrder ){ + case ORDER_RANDOM: printf(" --random\n"); break; + case ORDER_DESC: printf(" --desc\n"); break; + default: printf(" --asc\n"); break; + } + if( iPagesize ) printf("Database page size: %d\n", iPagesize); + printf("Total elapsed time: %.3f\n", tmElapsed/1000.0); + printf("Microseconds per BLOB read: %.3f\n", tmElapsed*1000.0/nCount); + printf("Content read rate: %.1f MB/s\n", nTotal/(1000.0*tmElapsed)); + return 0; +} + + +int main(int argc, char **argv){ + if( argc<3 ) showHelp(); + if( strcmp(argv[1],"init")==0 ){ + return initMain(argc, argv); + } + if( strcmp(argv[1],"export")==0 ){ + return exportMain(argc, argv); + } + if( strcmp(argv[1],"run")==0 ){ + return runMain(argc, argv); + } + showHelp(); + return 0; +} diff --git a/sqlite/test/like.test b/sqlite/test/like.test index fba89e90..8082b351 100644 --- a/sqlite/test/like.test +++ b/sqlite/test/like.test @@ -980,6 +980,24 @@ do_execsql_test like-13.4 { SELECT char(0x4d) LIKE char(0x6d); } {1} - +# Performance testing for patterns with many wildcards. These LIKE and GLOB +# patterns were quite slow with SQLite 3.15.2 and earlier. +# +do_test like-14.1 { + set x [lindex [time { + db one {SELECT 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz'GLOB'*a*a*a*a*a*a*a*a*y'} + }] 0] + puts -nonewline " ($x ms - want less than 1000) " + expr {$x<1000} +} {1} +ifcapable !icu { + do_test like-14.2 { + set x [lindex [time { + db one {SELECT 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz'LIKE'%a%a%a%a%a%a%a%a%y'} + }] 0] + puts -nonewline " ($x ms - want less than 1000) " + expr {$x<1000} + } {1} +} finish_test diff --git a/sqlite/test/multiplex.test b/sqlite/test/multiplex.test index 5db56f26..6ea32890 100644 --- a/sqlite/test/multiplex.test +++ b/sqlite/test/multiplex.test @@ -195,15 +195,16 @@ do_test multiplex-2.3.1 { unset -nocomplain ::log -do_test multiplex-2.4.1 { - sqlite3_multiplex_shutdown -} {SQLITE_MISUSE} +#do_test multiplex-2.4.1 { +# sqlite3_multiplex_shutdown +#} {SQLITE_MISUSE} do_test multiplex-2.4.2 { execsql { INSERT INTO t1 VALUES(3, randomblob(1100)) } } {} -do_test multiplex-2.4.3 { - set ::log -} {SQLITE_MISUSE {sqlite3_multiplex_shutdown() called while database connections are still open}} +#do_test multiplex-2.4.3 { +# set ::log +#} {SQLITE_MISUSE {sqlite3_multiplex_shutdown() called while database connections are still open}} + do_test multiplex-2.4.4 { file size [multiplex_name test.x 0] } {7168} do_test multiplex-2.4.5 { db close @@ -445,11 +446,7 @@ multiplex_set db main 32768 16 # Return a list of all currently defined multiplexs. proc multiplex_list {} { - set allq {} - foreach q [sqlite3_multiplex_dump] { - lappend allq [lindex $q 0] - } - return [lsort $allq] + glob -nocomplain test2.db* } do_test multiplex-4.1.6 { @@ -494,7 +491,7 @@ do_test multiplex-4.1.11 { do_test multiplex-4.1.12 { db close multiplex_list -} {} +} {test2.db} #------------------------------------------------------------------------- diff --git a/sqlite/test/nockpt.test b/sqlite/test/nockpt.test new file mode 100644 index 00000000..bd3953f1 --- /dev/null +++ b/sqlite/test/nockpt.test @@ -0,0 +1,66 @@ +# 2016 October 31 +# +# 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 SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE +# option. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/lock_common.tcl +source $testdir/malloc_common.tcl +source $testdir/wal_common.tcl +ifcapable !wal {finish_test ; return } +if {[permutation]=="journaltest" || [permutation]=="inmemory_journal"} { + finish_test + return +} + +set testprefix nockpt + +do_execsql_test 1.0 { + PRAGMA auto_vacuum=OFF; + PRAGMA page_size = 1024; + PRAGMA journal_mode = wal; + CREATE TABLE c1(x, y, z); + INSERT INTO c1 VALUES(1, 2, 3); +} {wal} + +do_test 1.1 { file exists test.db-wal } 1 +do_test 1.2 { file size test.db-wal } [wal_file_size 3 1024] +do_test 1.3 { db close } {} +do_test 1.4 { file exists test.db-wal } 0 + +sqlite3 db test.db +do_execsql_test 1.5 { + INSERT INTO c1 VALUES(4, 5, 6); + INSERT INTO c1 VALUES(7, 8, 9); +} +do_test 1.6 { file exists test.db-wal } 1 +do_test 1.7 { sqlite3_db_config db NO_CKPT_ON_CLOSE 1 } {1} +do_test 1.8 { file size test.db-wal } [wal_file_size 2 1024] +do_test 1.9 { db close } {} +do_test 1.10 { file exists test.db-wal } 1 +do_test 1.11 { file size test.db-wal } [wal_file_size 2 1024] + +sqlite3 db test.db +do_execsql_test 1.12 { + SELECT * FROM c1 +} {1 2 3 4 5 6 7 8 9} + +do_execsql_test 1.13 { PRAGMA main.journal_mode } {wal} +do_test 1.14 { sqlite3_db_config db NO_CKPT_ON_CLOSE 1 } {1} +do_execsql_test 1.14 { PRAGMA main.journal_mode = delete } {delete} +do_test 1.15 { file exists test.db-wal } {0} + + + +finish_test diff --git a/sqlite/test/ossfuzz.c b/sqlite/test/ossfuzz.c new file mode 100644 index 00000000..3a3e852c --- /dev/null +++ b/sqlite/test/ossfuzz.c @@ -0,0 +1,86 @@ +/* +** This module interfaces SQLite to the Google OSS-Fuzz, fuzzer as a service. +** (https://github.com/google/oss-fuzz) +*/ +#include +#include +#include "sqlite3.h" + +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK +/* +** Progress handler callback +*/ +static int progress_handler(void *pReturn) { + return *(int*)pReturn; +} +#endif + +/* +** Callback for sqlite3_exec(). +*/ +static int exec_handler(void *pCnt, int argc, char **argv, char **namev){ + int i; + if( argv ){ + for(i=0; i>= 1; + progressArg = uSelector & 1; uSelector >>= 1; + + /* Bit 2 of the selector enables foreign key constraints */ + sqlite3_db_config(db, SQLITE_DBCONFIG_ENABLE_FKEY, uSelector&1, &rc); + uSelector >>= 1; + + /* Remaining bits of the selector determine a limit on the number of + ** output rows */ + execCnt = uSelector + 1; + + /* Run the SQL. The sqlite_exec() interface expects a zero-terminated + ** string, so make a copy. */ + zSql = sqlite3_mprintf("%.*s", (int)size, data); + sqlite3_exec(db, zSql, exec_handler, (void*)&execCnt, &zErrMsg); + + /* Cleanup and return */ + sqlite3_free(zErrMsg); + sqlite3_free(zSql); + sqlite3_close(db); + return 0; +} diff --git a/sqlite/test/ossshell.c b/sqlite/test/ossshell.c new file mode 100644 index 00000000..15902a91 --- /dev/null +++ b/sqlite/test/ossshell.c @@ -0,0 +1,61 @@ +/* +** This is a test interface for the ossfuzz.c module. The ossfuzz.c module +** is an adaptor for OSS-FUZZ. (https://github.com/google/oss-fuzz) +** +** This program links against ossfuzz.c. It reads files named on the +** command line and passes them one by one into ossfuzz.c. +*/ +#include +#include +#include +#include +#include "sqlite3.h" + +/* +** The entry point in ossfuzz.c that this routine will be calling +*/ +int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size); + + +/* +** Read files named on the command-line and invoke the fuzzer for +** each one. +*/ +int main(int argc, char **argv){ + FILE *in; + int i; + int nErr = 0; + uint8_t *zBuf = 0; + size_t sz; + + for(i=1; i p1(a) + } + + 2 { + CREATE TABLE p1(a PRIMARY KEY, b); + CREATE TABLE c2(x REFERENCES p1, y REFERENCES p1); + } { + CREATE INDEX 'c2_y' ON 'c2'('y'); --> p1(a) + CREATE INDEX 'c2_x' ON 'c2'('x'); --> p1(a) + } + + 3 { + CREATE TABLE 'p 1'(a, b, c, PRIMARY KEY(c, b)); + CREATE TABLE 'c 1'(x, y, z, FOREIGN KEY (z, y) REFERENCES 'p 1'); + } { + CREATE INDEX 'c 1_z_y' ON 'c 1'('z', 'y'); --> p 1(c,b) + } + + 4 { + CREATE TABLE p1(a, 'b b b' PRIMARY KEY); + CREATE TABLE c1('x y z' REFERENCES p1); + CREATE INDEX i1 ON c1('x y z') WHERE "x y z" IS NOT NULL; + } { + } + + 5 { + CREATE TABLE p1(a, 'b b b' PRIMARY KEY); + CREATE TABLE c1('x y z' REFERENCES p1); + CREATE INDEX i1 ON c1('x y z') WHERE "x y z" IS NOT 12; + } { + CREATE INDEX 'c1_x y z' ON 'c1'('x y z'); --> p1(b b b) + } + + 6 { + CREATE TABLE x1(a, b, c, UNIQUE(a, b)); + CREATE TABLE y1(a, b, c, FOREIGN KEY(b, a) REFERENCES x1(a, b)); + CREATE INDEX y1i ON y1(a, c, b); + } { + CREATE INDEX 'y1_b_a' ON 'y1'('b', 'a'); --> x1(a,b) + } + + 6 { + CREATE TABLE x1(a COLLATE nocase, b, UNIQUE(a)); + CREATE TABLE y1(a COLLATE rtrim REFERENCES x1(a)); + } { + CREATE INDEX 'y1_a' ON 'y1'('a' COLLATE nocase); --> x1(a) + } + +} { + forcedelete test.db + sqlite3 db test.db + execsql $schema + + set expected "" + foreach line [split $output "\n"] { + set line [string trim $line] + if {$line!=""} { + append expected "$line\n" + } + } + + do_test 1.$tn.1 { + set RES [catchcmd test.db [list .lint fkey-indexes]] + } [list 0 [string trim $expected]] + + do_test 1.$tn.2 { + execsql [lindex $RES 1] + catchcmd test.db [list .lint fkey-indexes] + } {0 {}} + + db close +} + +finish_test diff --git a/sqlite/test/shell7.test b/sqlite/test/shell7.test new file mode 100644 index 00000000..a0628851 --- /dev/null +++ b/sqlite/test/shell7.test @@ -0,0 +1,54 @@ +# 2016 December 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. +# +#*********************************************************************** +# +# Test the readfile() function built into the shell tool. Specifically, +# that it does not truncate the blob read at the first embedded 0x00 +# byte. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix shell7 +set CLI [test_find_cli] + + +do_execsql_test 1.0 { + CREATE TABLE f1(tn INTEGER PRIMARY KEY, x BLOB); + CREATE TABLE f2(tn INTEGER PRIMARY KEY, x BLOB); + + INSERT INTO f1 VALUES(1, X'01020304'); + INSERT INTO f1 VALUES(2, X'01000304'); + INSERT INTO f1 VALUES(3, randomblob(200)); +} + +foreach {tn l x} [db eval { SELECT tn, length(x) AS l, x FROM f1 }] { + forcedelete shell7_test.bin + set fd [open shell7_test.bin w] + fconfigure $fd -encoding binary + fconfigure $fd -translation binary + puts -nonewline $fd $x + close $fd + + do_test 1.$tn.1 { file size shell7_test.bin } $l + do_test 1.$tn.2 { + catchcmd test.db "INSERT INTO f2 VALUES($tn, readfile('shell7_test.bin'));" + } {0 {}} + + do_execsql_test 1.$tn.3 { + SELECT (SELECT x FROM f1 WHERE tn=1)==(SELECT x FROM f2 WHERE tn=1) + } {1} +} + + + +finish_test + + diff --git a/sqlite/test/snapshot.test b/sqlite/test/snapshot.test index b2d61941..99d3ed47 100644 --- a/sqlite/test/snapshot.test +++ b/sqlite/test/snapshot.test @@ -26,413 +26,457 @@ if {[permutation]=="inmemory_journal"} { return } -#------------------------------------------------------------------------- -# Check some error conditions in snapshot_get(). It is an error if: -# -# 1) snapshot_get() is called on a non-WAL database, or -# 2) there is an open write transaction on the database. -# -do_execsql_test 1.0 { - CREATE TABLE t1(a, b); - INSERT INTO t1 VALUES(1, 2); - INSERT INTO t1 VALUES(3, 4); -} - -do_test 1.1.1 { - execsql { BEGIN; SELECT * FROM t1; } - list [catch { sqlite3_snapshot_get db main } msg] $msg -} {1 SQLITE_ERROR} -do_execsql_test 1.1.2 COMMIT - -do_test 1.2.1 { - execsql { - PRAGMA journal_mode = WAL; - BEGIN; - INSERT INTO t1 VALUES(5, 6); - INSERT INTO t1 VALUES(7, 8); +foreach {tn tcl} { + 1 { + proc snapshot_get {DB DBNAME} { + uplevel [list sqlite3_snapshot_get $DB $DBNAME] + } + proc snapshot_open {DB DBNAME SNAPSHOT} { + uplevel [list sqlite3_snapshot_open $DB $DBNAME $SNAPSHOT] + } + proc snapshot_free {SNAPSHOT} { + uplevel [list sqlite3_snapshot_free $SNAPSHOT] + } + proc snapshot_cmp {SNAPSHOT1 SNAPSHOT2} { + uplevel [list sqlite3_snapshot_cmp $SNAPSHOT1 $SNAPSHOT2] + } } - list [catch { sqlite3_snapshot_get db main } msg] $msg -} {1 SQLITE_ERROR} -do_execsql_test 1.3.2 COMMIT -#------------------------------------------------------------------------- -# Check that a simple case works. Reuse the database created by the -# block of tests above. -# -do_execsql_test 2.1.0 { - BEGIN; - SELECT * FROM t1; -} {1 2 3 4 5 6 7 8} - -do_test 2.1.1 { - set snapshot [sqlite3_snapshot_get db main] - execsql { - COMMIT; - INSERT INTO t1 VALUES(9, 10); - SELECT * FROM t1; + 2 { + proc snapshot_get {DB DBNAME} { + uplevel [list sqlite3_snapshot_get_blob $DB $DBNAME] + } + proc snapshot_open {DB DBNAME SNAPSHOT} { + uplevel [list sqlite3_snapshot_open_blob $DB $DBNAME $SNAPSHOT] + } + proc snapshot_free {SNAPSHOT} { + } + proc snapshot_cmp {SNAPSHOT1 SNAPSHOT2} { + uplevel [list sqlite3_snapshot_cmp_blob $SNAPSHOT1 $SNAPSHOT2] + } } -} {1 2 3 4 5 6 7 8 9 10} - -do_test 2.1.2 { - execsql BEGIN - sqlite3_snapshot_open db main $snapshot - execsql { - SELECT * FROM t1; +} { + + reset_db + eval $tcl + + #------------------------------------------------------------------------- + # Check some error conditions in snapshot_get(). It is an error if: + # + # 1) snapshot_get() is called on a non-WAL database, or + # 2) there is an open write transaction on the database. + # 3) the database handle is in auto-commit mode + # + do_execsql_test $tn.1.0 { + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(1, 2); + INSERT INTO t1 VALUES(3, 4); } -} {1 2 3 4 5 6 7 8} -do_test 2.1.3 { - sqlite3_snapshot_free $snapshot - execsql COMMIT -} {} - -do_test 2.2.0 { - sqlite3 db2 test.db - execsql { + do_test $tn.1.1.1 { + execsql { BEGIN; SELECT * FROM t1; } + list [catch { snapshot_get db main } msg] $msg + } {1 SQLITE_ERROR} + do_execsql_test $tn.1.1.2 COMMIT + + do_test $tn.1.2.1 { + execsql { + PRAGMA journal_mode = WAL; + BEGIN; + INSERT INTO t1 VALUES(5, 6); + INSERT INTO t1 VALUES(7, 8); + } + list [catch { snapshot_get db main } msg] $msg + } {1 SQLITE_ERROR} + do_execsql_test $tn.1.2.2 COMMIT + + do_test $tn.1.3.1 { + list [catch { snapshot_get db main } msg] $msg + } {1 SQLITE_ERROR} + do_test $tn.1.3.2 { + db trans { set snap [snapshot_get db main] } + snapshot_free $snap + } {} + + #------------------------------------------------------------------------- + # Check that a simple case works. Reuse the database created by the + # block of tests above. + # + do_execsql_test $tn.2.1.0 { BEGIN; SELECT * FROM t1; - } db2 -} {1 2 3 4 5 6 7 8 9 10} - -do_test 2.2.1 { - set snapshot [sqlite3_snapshot_get db2 main] - execsql { - INSERT INTO t1 VALUES(11, 12); - SELECT * FROM t1; - } -} {1 2 3 4 5 6 7 8 9 10 11 12} + } {1 2 3 4 5 6 7 8} -do_test 2.2.2 { - execsql BEGIN - sqlite3_snapshot_open db main $snapshot - execsql { - SELECT * FROM t1; - } -} {1 2 3 4 5 6 7 8 9 10} + do_test $tn.2.1.1 { + set snapshot [snapshot_get db main] + execsql { + COMMIT; + INSERT INTO t1 VALUES(9, 10); + SELECT * FROM t1; + } + } {1 2 3 4 5 6 7 8 9 10} -do_test 2.2.3 { - sqlite3_snapshot_free $snapshot - execsql COMMIT - execsql COMMIT db2 - db2 close -} {} - -do_test 2.3.1 { - execsql { DELETE FROM t1 WHERE a>6 } - set snapshot [sqlite3_snapshot_get db main] - execsql { - INSERT INTO t1 VALUES('a', 'b'); - INSERT INTO t1 VALUES('c', 'd'); - SELECT * FROM t1; - } -} {1 2 3 4 5 6 a b c d} -do_test 2.3.2 { - execsql BEGIN - sqlite3_snapshot_open db main $snapshot - execsql { SELECT * FROM t1 } -} {1 2 3 4 5 6} - -do_test 2.3.3 { - catchsql { - INSERT INTO t1 VALUES('x','y') - } -} {1 {database is locked}} -do_test 2.3.4 { - execsql COMMIT - sqlite3_snapshot_free $snapshot -} {} - -#------------------------------------------------------------------------- -# Check some errors in sqlite3_snapshot_open(). It is an error if: -# -# 1) the db is in auto-commit mode, -# 2) the db has an open (read or write) transaction, -# 3) the db is not a wal database, -# -# Reuse the database created by earlier tests. -# -do_execsql_test 3.0.0 { - CREATE TABLE t2(x, y); - INSERT INTO t2 VALUES('a', 'b'); - INSERT INTO t2 VALUES('c', 'd'); - BEGIN; - SELECT * FROM t2; -} {a b c d} -do_test 3.0.1 { - set snapshot [sqlite3_snapshot_get db main] - execsql { COMMIT } - execsql { INSERT INTO t2 VALUES('e', 'f'); } -} {} - -do_test 3.1 { - list [catch {sqlite3_snapshot_open db main $snapshot } msg] $msg -} {1 SQLITE_ERROR} - -do_test 3.2.1 { - execsql { + do_test $tn.2.1.2 { + execsql BEGIN + snapshot_open db main $snapshot + execsql { + SELECT * FROM t1; + } + } {1 2 3 4 5 6 7 8} + + do_test $tn.2.1.3 { + snapshot_free $snapshot + execsql COMMIT + } {} + + do_test $tn.2.2.0 { + sqlite3 db2 test.db + execsql { + BEGIN; + SELECT * FROM t1; + } db2 + } {1 2 3 4 5 6 7 8 9 10} + + do_test $tn.2.2.1 { + set snapshot [snapshot_get db2 main] + execsql { + INSERT INTO t1 VALUES(11, 12); + SELECT * FROM t1; + } + } {1 2 3 4 5 6 7 8 9 10 11 12} + + do_test $tn.2.2.2 { + execsql BEGIN + snapshot_open db main $snapshot + execsql { + SELECT * FROM t1; + } + } {1 2 3 4 5 6 7 8 9 10} + + do_test $tn.2.2.3 { + snapshot_free $snapshot + execsql COMMIT + execsql COMMIT db2 + db2 close + } {} + + do_test $tn.2.3.1 { + execsql { DELETE FROM t1 WHERE a>6 } + db trans { set snapshot [snapshot_get db main] } + execsql { + INSERT INTO t1 VALUES('a', 'b'); + INSERT INTO t1 VALUES('c', 'd'); + SELECT * FROM t1; + } + } {1 2 3 4 5 6 a b c d} + do_test $tn.2.3.2 { + execsql BEGIN + snapshot_open db main $snapshot + execsql { SELECT * FROM t1 } + } {1 2 3 4 5 6} + + do_test $tn.2.3.3 { + catchsql { + INSERT INTO t1 VALUES('x','y') + } + } {1 {database is locked}} + do_test $tn.2.3.4 { + execsql COMMIT + snapshot_free $snapshot + } {} + + #------------------------------------------------------------------------- + # Check some errors in snapshot_open(). It is an error if: + # + # 1) the db is in auto-commit mode, + # 2) the db has an open (read or write) transaction, + # 3) the db is not a wal database, + # + # Reuse the database created by earlier tests. + # + do_execsql_test $tn.3.0.0 { + CREATE TABLE t2(x, y); + INSERT INTO t2 VALUES('a', 'b'); + INSERT INTO t2 VALUES('c', 'd'); BEGIN; SELECT * FROM t2; - } -} {a b c d e f} -do_test 3.2.2 { - list [catch {sqlite3_snapshot_open db main $snapshot } msg] $msg -} {1 SQLITE_ERROR} - -do_test 3.2.3 { - execsql { - COMMIT; - BEGIN; - INSERT INTO t2 VALUES('g', 'h'); - } - list [catch {sqlite3_snapshot_open db main $snapshot } msg] $msg -} {1 SQLITE_ERROR} -do_execsql_test 3.2.4 COMMIT - -do_test 3.3.1 { - execsql { PRAGMA journal_mode = DELETE } - execsql { BEGIN } - list [catch {sqlite3_snapshot_open db main $snapshot } msg] $msg -} {1 SQLITE_ERROR} - -do_test 3.3.2 { - sqlite3_snapshot_free $snapshot - execsql COMMIT -} {} - -#------------------------------------------------------------------------- -# Check that SQLITE_BUSY_SNAPSHOT is returned if the specified snapshot -# no longer exists because the wal file has been checkpointed. -# -# 1. Reading a snapshot from the middle of a wal file is not possible -# after the wal file has been checkpointed. -# -# 2. That a snapshot from the end of a wal file can not be read once -# the wal file has been wrapped. -# -do_execsql_test 4.1.0 { - PRAGMA journal_mode = wal; - CREATE TABLE t3(i, j); - INSERT INTO t3 VALUES('o', 't'); - INSERT INTO t3 VALUES('t', 'f'); - BEGIN; - SELECT * FROM t3; -} {wal o t t f} - -do_test 4.1.1 { - set snapshot [sqlite3_snapshot_get db main] - execsql COMMIT -} {} -do_test 4.1.2 { - execsql { - INSERT INTO t3 VALUES('f', 's'); - BEGIN; - } - sqlite3_snapshot_open db main $snapshot - execsql { SELECT * FROM t3 } -} {o t t f} - -do_test 4.1.3 { - execsql { - COMMIT; - PRAGMA wal_checkpoint; - BEGIN; - } - list [catch {sqlite3_snapshot_open db main $snapshot} msg] $msg -} {1 SQLITE_BUSY_SNAPSHOT} -do_test 4.1.4 { - sqlite3_snapshot_free $snapshot - execsql COMMIT -} {} - -do_test 4.2.1 { - execsql { - INSERT INTO t3 VALUES('s', 'e'); - INSERT INTO t3 VALUES('n', 't'); + } {a b c d} + do_test $tn.3.0.1 { + set snapshot [snapshot_get db main] + execsql { COMMIT } + execsql { INSERT INTO t2 VALUES('e', 'f'); } + } {} + + do_test $tn.3.1 { + list [catch {snapshot_open db main $snapshot } msg] $msg + } {1 SQLITE_ERROR} + + do_test $tn.3.2.1 { + execsql { + BEGIN; + SELECT * FROM t2; + } + } {a b c d e f} + do_test $tn.3.2.2 { + list [catch {snapshot_open db main $snapshot } msg] $msg + } {1 SQLITE_ERROR} + + do_test $tn.3.2.3 { + execsql { + COMMIT; + BEGIN; + INSERT INTO t2 VALUES('g', 'h'); + } + list [catch {snapshot_open db main $snapshot } msg] $msg + } {1 SQLITE_ERROR} + do_execsql_test $tn.3.2.4 COMMIT + + do_test $tn.3.3.1 { + execsql { PRAGMA journal_mode = DELETE } + execsql { BEGIN } + list [catch {snapshot_open db main $snapshot } msg] $msg + } {1 SQLITE_ERROR} + + do_test $tn.$tn.3.3.2 { + snapshot_free $snapshot + execsql COMMIT + } {} + + #------------------------------------------------------------------------- + # Check that SQLITE_BUSY_SNAPSHOT is returned if the specified snapshot + # no longer exists because the wal file has been checkpointed. + # + # 1. Reading a snapshot from the middle of a wal file is not possible + # after the wal file has been checkpointed. + # + # 2. That a snapshot from the end of a wal file can not be read once + # the wal file has been wrapped. + # + do_execsql_test $tn.4.1.0 { + PRAGMA journal_mode = wal; + CREATE TABLE t3(i, j); + INSERT INTO t3 VALUES('o', 't'); + INSERT INTO t3 VALUES('t', 'f'); BEGIN; SELECT * FROM t3; - } -} {o t t f f s s e n t} -do_test 4.2.2 { - set snapshot [sqlite3_snapshot_get db main] - execsql { - COMMIT; - PRAGMA wal_checkpoint; - BEGIN; - } - sqlite3_snapshot_open db main $snapshot - execsql { SELECT * FROM t3 } -} {o t t f f s s e n t} -do_test 4.2.3 { - execsql { - COMMIT; - INSERT INTO t3 VALUES('e', 't'); + } {wal o t t f} + + do_test $tn.4.1.1 { + set snapshot [snapshot_get db main] + execsql COMMIT + } {} + do_test $tn.4.1.2 { + execsql { + INSERT INTO t3 VALUES('f', 's'); + BEGIN; + } + snapshot_open db main $snapshot + execsql { SELECT * FROM t3 } + } {o t t f} + + do_test $tn.4.1.3 { + execsql { + COMMIT; + PRAGMA wal_checkpoint; + BEGIN; + } + list [catch {snapshot_open db main $snapshot} msg] $msg + } {1 SQLITE_BUSY_SNAPSHOT} + do_test $tn.4.1.4 { + snapshot_free $snapshot + execsql COMMIT + } {} + + do_test $tn.4.2.1 { + execsql { + INSERT INTO t3 VALUES('s', 'e'); + INSERT INTO t3 VALUES('n', 't'); + BEGIN; + SELECT * FROM t3; + } + } {o t t f f s s e n t} + do_test $tn.4.2.2 { + set snapshot [snapshot_get db main] + execsql { + COMMIT; + PRAGMA wal_checkpoint; + BEGIN; + } + snapshot_open db main $snapshot + execsql { SELECT * FROM t3 } + } {o t t f f s s e n t} + do_test $tn.4.2.3 { + execsql { + COMMIT; + INSERT INTO t3 VALUES('e', 't'); + BEGIN; + } + list [catch {snapshot_open db main $snapshot} msg] $msg + } {1 SQLITE_BUSY_SNAPSHOT} + do_test $tn.4.2.4 { + snapshot_free $snapshot + } {} + + #------------------------------------------------------------------------- + # Check that SQLITE_BUSY is returned if a checkpoint is running when + # sqlite3_snapshot_open() is called. + # + reset_db + db close + testvfs tvfs + sqlite3 db test.db -vfs tvfs + + do_execsql_test $tn.5.1 { + PRAGMA journal_mode = wal; + CREATE TABLE x1(x, xx, xxx); + INSERT INTO x1 VALUES('z', 'zz', 'zzz'); BEGIN; + SELECT * FROM x1; + } {wal z zz zzz} + + do_test $tn.5.2 { + set ::snapshot [snapshot_get db main] + sqlite3 db2 test.db -vfs tvfs + execsql { + INSERT INTO x1 VALUES('a', 'aa', 'aaa'); + COMMIT; + } + } {} + + set t53 0 + proc write_callback {args} { + do_test $tn.5.3.[incr ::t53] { + execsql BEGIN + list [catch { snapshot_open db main $::snapshot } msg] $msg + } {1 SQLITE_BUSY} + catchsql COMMIT } - list [catch {sqlite3_snapshot_open db main $snapshot} msg] $msg -} {1 SQLITE_BUSY_SNAPSHOT} -do_test 4.2.4 { - sqlite3_snapshot_free $snapshot -} {} - -#------------------------------------------------------------------------- -# Check that SQLITE_BUSY is returned if a checkpoint is running when -# sqlite3_snapshot_open() is called. -# -reset_db -db close -testvfs tvfs -sqlite3 db test.db -vfs tvfs - -do_execsql_test 5.1 { - PRAGMA journal_mode = wal; - CREATE TABLE x1(x, xx, xxx); - INSERT INTO x1 VALUES('z', 'zz', 'zzz'); - BEGIN; - SELECT * FROM x1; -} {wal z zz zzz} - -do_test 5.2 { - set ::snapshot [sqlite3_snapshot_get db main] - sqlite3 db2 test.db -vfs tvfs - execsql { - INSERT INTO x1 VALUES('a', 'aa', 'aaa'); - COMMIT; - } -} {} - -set t53 0 -proc write_callback {args} { - do_test 5.3.[incr ::t53] { - execsql BEGIN - list [catch { sqlite3_snapshot_open db main $::snapshot } msg] $msg - } {1 SQLITE_BUSY} - catchsql COMMIT -} -tvfs filter xWrite -tvfs script write_callback -db2 eval { PRAGMA wal_checkpoint } -db close -db2 close -tvfs delete -sqlite3_snapshot_free $snapshot - -#------------------------------------------------------------------------- -# Test that sqlite3_snapshot_get() may be called immediately after -# "BEGIN; PRAGMA user_version;". And that sqlite3_snapshot_open() may -# be called after opening the db handle and running the script -# "PRAGMA user_version; BEGIN". -reset_db -do_execsql_test 6.1 { - PRAGMA journal_mode = wal; - CREATE TABLE x1(x, xx, xxx); - INSERT INTO x1 VALUES('z', 'zz', 'zzz'); - BEGIN; - PRAGMA user_version; -} {wal 0} -do_test 6.2 { - set ::snapshot [sqlite3_snapshot_get db main] - execsql { - INSERT INTO x1 VALUES('a', 'aa', 'aaa'); - COMMIT; - } -} {} -do_test 6.3 { - sqlite3 db2 test.db - db2 eval "PRAGMA user_version ; BEGIN" - sqlite3_snapshot_open db2 main $::snapshot - db2 eval { SELECT * FROM x1 } -} {z zz zzz} -do_test 6.4 { + tvfs filter xWrite + tvfs script write_callback + db2 eval { PRAGMA wal_checkpoint } + db close db2 close - sqlite3 db2 test.db - db2 eval "PRAGMA application_id" - db2 eval "BEGIN" - sqlite3_snapshot_open db2 main $::snapshot - db2 eval { SELECT * FROM x1 } -} {z zz zzz} - -do_test 6.5 { - db2 close - sqlite3 db2 test.db - db2 eval "BEGIN" - list [catch {sqlite3_snapshot_open db2 main $::snapshot} msg] $msg -} {1 SQLITE_ERROR} - -sqlite3_snapshot_free $snapshot - -#------------------------------------------------------------------------- -# The following tests investigate the sqlite3_snapshot_cmp() API. -# - -# Compare snapshots $p1 and $p2, checking that the result is $r. -# -proc do_snapshot_cmp_test {tn p1 p2 r} { - uplevel [list do_test $tn.1 [list sqlite3_snapshot_cmp $p1 $p2] $r] - uplevel [list do_test $tn.2 [list sqlite3_snapshot_cmp $p2 $p1] [expr $r*-1]] - uplevel [list do_test $tn.3 [list sqlite3_snapshot_cmp $p1 $p1] 0] - uplevel [list do_test $tn.4 [list sqlite3_snapshot_cmp $p2 $p2] 0] -} - -catch { db2 close } -reset_db - -do_execsql_test 7.1 { - PRAGMA journal_mode = wal; - CREATE TABLE t1(x); -} wal - -do_test 7.1.2 { - execsql { BEGIN ; PRAGMA application_id } - set p1 [sqlite3_snapshot_get db main] - execsql { - INSERT INTO t1 VALUES(10); - COMMIT; - } - execsql { BEGIN ; PRAGMA application_id } - set p2 [sqlite3_snapshot_get db main] - execsql COMMIT -} {} - -do_snapshot_cmp_test 7.1.3 $p1 $p2 -1 -sqlite3_snapshot_free $p1 -sqlite3_snapshot_free $p2 - -do_execsql_test 7.2.1 { - INSERT INTO t1 VALUES(11); - INSERT INTO t1 VALUES(12); - INSERT INTO t1 VALUES(13); - BEGIN; - PRAGMA application_id; -} {0} -do_test 7.2.2 { - set p1 [sqlite3_snapshot_get db main] - execsql { - COMMIT; - INSERT INTO t1 VALUES(14); - PRAGMA wal_checkpoint; + tvfs delete + snapshot_free $snapshot + + #------------------------------------------------------------------------- + # Test that sqlite3_snapshot_get() may be called immediately after + # "BEGIN; PRAGMA user_version;". And that sqlite3_snapshot_open() may + # be called after opening the db handle and running the script + # "PRAGMA user_version; BEGIN". + reset_db + do_execsql_test $tn.6.1 { + PRAGMA journal_mode = wal; + CREATE TABLE x1(x, xx, xxx); + INSERT INTO x1 VALUES('z', 'zz', 'zzz'); BEGIN; - PRAGMA application_id; + PRAGMA user_version; + } {wal 0} + do_test $tn.6.2 { + set ::snapshot [snapshot_get db main] + execsql { + INSERT INTO x1 VALUES('a', 'aa', 'aaa'); + COMMIT; + } + } {} + do_test $tn.6.3 { + sqlite3 db2 test.db + db2 eval "PRAGMA user_version ; BEGIN" + snapshot_open db2 main $::snapshot + db2 eval { SELECT * FROM x1 } + } {z zz zzz} + do_test $tn.6.4 { + db2 close + sqlite3 db2 test.db + db2 eval "PRAGMA application_id" + db2 eval "BEGIN" + snapshot_open db2 main $::snapshot + db2 eval { SELECT * FROM x1 } + } {z zz zzz} + + do_test $tn.6.5 { + db2 close + sqlite3 db2 test.db + db2 eval "BEGIN" + list [catch {snapshot_open db2 main $::snapshot} msg] $msg + } {1 SQLITE_ERROR} + + snapshot_free $snapshot + + #------------------------------------------------------------------------- + # The following tests investigate the sqlite3_snapshot_cmp() API. + # + + # Compare snapshots $p1 and $p2, checking that the result is $r. + # + proc do_snapshot_cmp_test {tn p1 p2 r} { + uplevel [list do_test $tn.1 [list snapshot_cmp $p1 $p2] $r] + uplevel [list do_test $tn.2 [list snapshot_cmp $p2 $p1] [expr $r*-1]] + uplevel [list do_test $tn.3 [list snapshot_cmp $p1 $p1] 0] + uplevel [list do_test $tn.4 [list snapshot_cmp $p2 $p2] 0] } - set p2 [sqlite3_snapshot_get db main] - execsql COMMIT -} {} -do_snapshot_cmp_test 7.2.3 $p1 $p2 -1 -sqlite3_snapshot_free $p2 - -do_test 7.3.1 { - execsql { - INSERT INTO t1 VALUES(14); - BEGIN; + catch { db2 close } + reset_db + + do_execsql_test $tn.7.1 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(x); + } wal + + do_test $tn.7.1.2 { + execsql { BEGIN ; PRAGMA application_id } + set p1 [snapshot_get db main] + execsql { + INSERT INTO t1 VALUES(10); + COMMIT; + } + execsql { BEGIN ; PRAGMA application_id } + set p2 [snapshot_get db main] + execsql COMMIT + } {} + + do_snapshot_cmp_test $tn.7.1.3 $p1 $p2 -1 + snapshot_free $p1 + snapshot_free $p2 + + do_execsql_test $tn.7.2.1 { + INSERT INTO t1 VALUES(11); + INSERT INTO t1 VALUES(12); + INSERT INTO t1 VALUES(13); + BEGIN; PRAGMA application_id; - } - set p2 [sqlite3_snapshot_get db main] - execsql COMMIT -} {} - -do_snapshot_cmp_test 7.3.2 $p1 $p2 -1 -sqlite3_snapshot_free $p1 -sqlite3_snapshot_free $p2 + } {0} + do_test $tn.7.2.2 { + set p1 [snapshot_get db main] + execsql { + COMMIT; + INSERT INTO t1 VALUES(14); + PRAGMA wal_checkpoint; + BEGIN; + PRAGMA application_id; + } + set p2 [snapshot_get db main] + execsql COMMIT + } {} + + do_snapshot_cmp_test $tn.7.2.3 $p1 $p2 -1 + snapshot_free $p2 + + do_test $tn.7.3.1 { + execsql { + INSERT INTO t1 VALUES(14); + BEGIN; + PRAGMA application_id; + } + set p2 [snapshot_get db main] + execsql COMMIT + } {} + + do_snapshot_cmp_test $tn.7.3.2 $p1 $p2 -1 + snapshot_free $p1 + snapshot_free $p2 +} finish_test diff --git a/sqlite/test/snapshot2.test b/sqlite/test/snapshot2.test new file mode 100644 index 00000000..41e55525 --- /dev/null +++ b/sqlite/test/snapshot2.test @@ -0,0 +1,200 @@ +# 2016 November 18 +# +# 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 the sqlite3_snapshot_xxx() APIs. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +ifcapable !snapshot {finish_test; return} +set testprefix snapshot2 + +# This test does not work with the inmemory_journal permutation. The reason +# is that each connection opened as part of this permutation executes +# "PRAGMA journal_mode=memory", which fails if the database is in wal mode +# and there are one or more existing connections. +if {[permutation]=="inmemory_journal"} { + finish_test + return +} + +#------------------------------------------------------------------------- +# Check that it is not possible to obtain a snapshot immediately after +# a wal mode database with an empty wal file is opened. But it is after +# the file has been written, even by some other connection. +# +do_execsql_test 1.0 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(a, b, c); + INSERT INTO t1 VALUES(1, 2, 3); + INSERT INTO t1 VALUES(4, 5, 6); +} {wal} + +db close +do_test 1.1.1 { list [file exists test.db] [file exists test.db-wal] } {1 0} + +sqlite3 db test.db +do_execsql_test 1.1.2 { SELECT * FROM t1 } {1 2 3 4 5 6} + +do_test 1.1.3 { + execsql BEGIN + list [catch { sqlite3_snapshot_get_blob db main } msg] $msg +} {1 SQLITE_ERROR} +execsql COMMIT + +do_test 1.1.4 { + execsql { INSERT INTO t1 VALUES(7, 8, 9) } + execsql BEGIN + string length [sqlite3_snapshot_get_blob db main] +} 48 +execsql COMMIT + +db close +do_test 1.2.1 { list [file exists test.db] [file exists test.db-wal] } {1 0} + +sqlite3 db test.db +do_execsql_test 1.2.2 { SELECT * FROM t1 } {1 2 3 4 5 6 7 8 9} + +do_test 1.2.3 { + execsql BEGIN + list [catch { sqlite3_snapshot_get_blob db main } msg] $msg +} {1 SQLITE_ERROR} +execsql COMMIT + +do_test 1.2.4 { + sqlite3 db2 test.db + execsql { INSERT INTO t1 VALUES(10, 11, 12) } db2 + execsql BEGIN + string length [sqlite3_snapshot_get_blob db main] +} 48 +execsql COMMIT +db2 close + +#------------------------------------------------------------------------- +# Simple tests for sqlite3_snapshot_recover(). +# +reset_db +do_execsql_test 2.0 { + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + INSERT INTO t1 VALUES(1); + INSERT INTO t1 VALUES(2); +} {wal} + +do_test 2.1 { + db trans { set snap [sqlite3_snapshot_get_blob db main] } + sqlite3_db_config db NO_CKPT_ON_CLOSE 1 + db close + sqlite3 db test.db + + execsql {SELECT * FROM sqlite_master} + execsql BEGIN + sqlite3_snapshot_open_blob db main $snap + execsql COMMIT; + execsql { INSERT INTO t1 VALUES(3); } +} {} + +do_test 2.2 { + sqlite3_db_config db NO_CKPT_ON_CLOSE 1 + db close + sqlite3 db test.db + + execsql {SELECT * FROM sqlite_master} + execsql BEGIN + list [catch { sqlite3_snapshot_open_blob db main $snap } msg] $msg +} {1 SQLITE_BUSY_SNAPSHOT} + +do_test 2.3 { + execsql COMMIT + sqlite3_snapshot_recover db main + execsql BEGIN + sqlite3_snapshot_open_blob db main $snap + execsql { SELECT * FROM t1 } +} {1 2} + +do_test 2.4 { + execsql COMMIT + execsql { SELECT * FROM t1 } +} {1 2 3} + +do_test 2.5 { + execsql { PRAGMA wal_checkpoint } + sqlite3_db_config db NO_CKPT_ON_CLOSE 1 + db close + sqlite3 db test.db + + sqlite3_snapshot_recover db main + execsql BEGIN + list [catch { sqlite3_snapshot_open_blob db main $snap } msg] $msg +} {1 SQLITE_BUSY_SNAPSHOT} + +#------------------------------------------------------------------------- +# Check that calling sqlite3_snapshot_recover() does not confuse the +# pager cache. +reset_db +do_execsql_test 3.0 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(x, y); + INSERT INTO t1 VALUES('a', 'b'); + INSERT INTO t1 VALUES('c', 'd'); +} {wal} +do_test 3.1 { + sqlite3 db2 test.db + execsql { INSERT INTO t1 VALUES('e', 'f') } db2 + db2 close + sqlite3_snapshot_recover db main +} {} +do_execsql_test 3.2 { + SELECT * FROM t1; +} {a b c d e f} + +#------------------------------------------------------------------------- +# Check that sqlite3_snapshot_recover() returns an error if it is called +# with an open read-transaction. Or on a database that does not exist. Or +# on the temp database. Or on a db that is not in wal mode. +# +do_test 4.1 { + sqlite3_snapshot_recover db main +} {} +do_test 4.2 { + execsql { + BEGIN; + SELECT * FROM sqlite_master; + } + list [catch { sqlite3_snapshot_recover db main } msg] $msg +} {1 SQLITE_ERROR} +do_test 4.3 { + execsql COMMIT + sqlite3_snapshot_recover db main +} {} +do_test 4.4 { + list [catch { sqlite3_snapshot_recover db aux } msg] $msg +} {1 SQLITE_ERROR} +do_test 4.5 { + forcedelete test.db2 + execsql { + ATTACH 'test.db2' AS aux; + PRAGMA aux.journal_mode = wal; + CREATE TABLE aux.t2(x, y); + } + list [catch { sqlite3_snapshot_recover db aux } msg] $msg +} {0 {}} +do_test 4.6 { + list [catch { sqlite3_snapshot_recover db temp } msg] $msg +} {1 SQLITE_ERROR} +do_test 4.7 { + execsql { + PRAGMA aux.journal_mode = delete; + } + list [catch { sqlite3_snapshot_recover db aux } msg] $msg +} {1 SQLITE_ERROR} + +finish_test diff --git a/sqlite/test/snapshot_fault.test b/sqlite/test/snapshot_fault.test index f90690e3..5c6cf40a 100644 --- a/sqlite/test/snapshot_fault.test +++ b/sqlite/test/snapshot_fault.test @@ -159,6 +159,68 @@ do_faultsim_test 3.0 -prep { sqlite3_snapshot_free $::snapshot } +#------------------------------------------------------------------------- +# Test the handling of faults that occur within sqlite3_snapshot_recover(). +# +reset_db +do_execsql_test 4.0 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(zzz); + INSERT INTO t1 VALUES('abc'); + INSERT INTO t1 VALUES('def'); +} {wal} +faultsim_save_and_close + +do_test 4.0.1 { + faultsim_restore_and_reopen + db eval { SELECT * FROM sqlite_master } + sqlite3_snapshot_recover db main +} {} +db close + +do_faultsim_test 4.0 -faults oom* -prep { + faultsim_restore_and_reopen + db eval { SELECT * FROM sqlite_master } +} -body { + sqlite3_snapshot_recover db main +} -test { + faultsim_test_result {0 {}} {1 SQLITE_NOMEM} {1 SQLITE_IOERR_NOMEM} +} + +# The following test cases contrive to call sqlite3_snapshot_recover() +# before all pages of the *-shm file have been mapped. This tests an +# extra branch of error handling logic in snapshot_recover(). +# +reset_db +do_execsql_test 4.1.0 { + PRAGMA page_size = 512; + PRAGMA journal_mode = wal; + PRAGMA wal_autocheckpoint = 0; + CREATE TABLE t1(zzz); + INSERT INTO t1 VALUES(randomblob( 500 * 9500 )); + PRAGMA user_version = 211; +} {wal 0} + +do_test 4.1.1 { + list [file size test.db-shm] [file size test.db] +} {98304 512} + +faultsim_save_and_close +do_faultsim_test 4.1 -faults shm* -prep { + catch { db2 close } + catch { db close } + faultsim_restore_and_reopen + sqlite3 db2 test.db + db2 eval { SELECT * FROM sqlite_master } + db eval BEGIN + sqlite3_snapshot_get_blob db main + db eval COMMIT +} -body { + sqlite3_snapshot_recover db main +} -test { + faultsim_test_result {0 {}} {1 SQLITE_IOERR} +} + finish_test diff --git a/sqlite/test/speedtest1.c b/sqlite/test/speedtest1.c index 7ae6739f..d568aada 100644 --- a/sqlite/test/speedtest1.c +++ b/sqlite/test/speedtest1.c @@ -15,6 +15,7 @@ static const char zHelp[] = " --journal M Set the journal_mode to M\n" " --key KEY Set the encryption key to KEY\n" " --lookaside N SZ Configure lookaside for N slots of SZ bytes each\n" + " --mmap SZ MMAP the first SZ bytes of the database file\n" " --multithread Set multithreaded mode\n" " --nomemstat Disable memory statistics\n" " --nosync Set PRAGMA synchronous=OFF\n" @@ -22,6 +23,7 @@ static const char zHelp[] = " --pagesize N Set the page size to N\n" " --pcache N SZ Configure N pages of pagecache each of size SZ bytes\n" " --primarykey Use PRIMARY KEY instead of UNIQUE where appropriate\n" + " --repeat N Repeat each SELECT N times (default: 1)\n" " --reprepare Reprepare each statement upon every invocation\n" " --scratch N SZ Configure scratch memory for N slots of SZ bytes each\n" " --serialized Set serialized threading mode\n" @@ -48,6 +50,7 @@ static const char zHelp[] = #include #include #include +#include #define ISSPACE(X) isspace((unsigned char)(X)) #define ISDIGIT(X) isdigit((unsigned char)(X)) @@ -72,6 +75,7 @@ static struct Global { int bMemShrink; /* Call sqlite3_db_release_memory() often */ int eTemp; /* 0: no TEMP. 9: always TEMP. */ int szTest; /* Scale factor for test iterations */ + int nRepeat; /* Repeat selects this many times */ const char *zWR; /* Might be WITHOUT ROWID */ const char *zNN; /* Might be NOT NULL */ const char *zPK; /* Might be UNIQUE or PRIMARY KEY */ @@ -453,6 +457,68 @@ static int est_square_root(int x){ return y0; } + +#if SQLITE_VERSION_NUMBER<3005004 +/* +** An implementation of group_concat(). Used only when testing older +** versions of SQLite that lack the built-in group_concat(). +*/ +struct groupConcat { + char *z; + int nAlloc; + int nUsed; +}; +static void groupAppend(struct groupConcat *p, const char *z, int n){ + if( p->nUsed+n >= p->nAlloc ){ + int n2 = (p->nAlloc+n+1)*2; + char *z2 = sqlite3_realloc(p->z, n2); + if( z2==0 ) return; + p->z = z2; + p->nAlloc = n2; + } + memcpy(p->z+p->nUsed, z, n); + p->nUsed += n; +} +static void groupStep( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zVal; + struct groupConcat *p; + const char *zSep; + int nVal, nSep; + assert( argc==1 || argc==2 ); + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; + p= (struct groupConcat*)sqlite3_aggregate_context(context, sizeof(*p)); + + if( p ){ + int firstTerm = p->nUsed==0; + if( !firstTerm ){ + if( argc==2 ){ + zSep = (char*)sqlite3_value_text(argv[1]); + nSep = sqlite3_value_bytes(argv[1]); + }else{ + zSep = ","; + nSep = 1; + } + if( nSep ) groupAppend(p, zSep, nSep); + } + zVal = (char*)sqlite3_value_text(argv[0]); + nVal = sqlite3_value_bytes(argv[0]); + if( zVal ) groupAppend(p, zVal, nVal); + } +} +static void groupFinal(sqlite3_context *context){ + struct groupConcat *p; + p = sqlite3_aggregate_context(context, 0); + if( p && p->z ){ + p->z[p->nUsed] = 0; + sqlite3_result_text(context, p->z, p->nUsed, sqlite3_free); + } +} +#endif + /* ** The main and default testset */ @@ -461,11 +527,12 @@ void testset_main(void){ int n; /* iteration count */ int sz; /* Size of the tables */ int maxb; /* Maximum swizzled value */ - unsigned x1, x2; /* Parameters */ - int len; /* Length of the zNum[] string */ + unsigned x1 = 0, x2 = 0; /* Parameters */ + int len = 0; /* Length of the zNum[] string */ char zNum[2000]; /* A number name */ sz = n = g.szTest*500; + zNum[0] = 0; maxb = roundup_allones(sz); speedtest1_begin_test(100, "%d INSERTs into table with no index", n); speedtest1_exec("BEGIN"); @@ -521,17 +588,23 @@ void testset_main(void){ speedtest1_exec("COMMIT"); speedtest1_end_test(); +#if SQLITE_VERSION_NUMBER<3005004 + sqlite3_create_function(g.db, "group_concat", 1, SQLITE_UTF8, 0, + 0, groupStep, groupFinal); +#endif n = 25; speedtest1_begin_test(130, "%d SELECTS, numeric BETWEEN, unindexed", n); speedtest1_exec("BEGIN"); speedtest1_prepare( - "SELECT count(*), avg(b), sum(length(c)) FROM t1\n" + "SELECT count(*), avg(b), sum(length(c)), group_concat(c) FROM t1\n" " WHERE b BETWEEN ?1 AND ?2; -- %d times", n ); for(i=1; i<=n; i++){ - x1 = speedtest1_random()%maxb; - x2 = speedtest1_random()%10 + sz/5000 + x1; + if( (i-1)%g.nRepeat==0 ){ + x1 = speedtest1_random()%maxb; + x2 = speedtest1_random()%10 + sz/5000 + x1; + } sqlite3_bind_int(g.pStmt, 1, x1); sqlite3_bind_int(g.pStmt, 2, x2); speedtest1_run(); @@ -544,16 +617,18 @@ void testset_main(void){ speedtest1_begin_test(140, "%d SELECTS, LIKE, unindexed", n); speedtest1_exec("BEGIN"); speedtest1_prepare( - "SELECT count(*), avg(b), sum(length(c)) FROM t1\n" + "SELECT count(*), avg(b), sum(length(c)), group_concat(c) FROM t1\n" " WHERE c LIKE ?1; -- %d times", n ); for(i=1; i<=n; i++){ - x1 = speedtest1_random()%maxb; - zNum[0] = '%'; - len = speedtest1_numbername(i, zNum+1, sizeof(zNum)-2); - zNum[len] = '%'; - zNum[len+1] = 0; - sqlite3_bind_text(g.pStmt, 1, zNum, len, SQLITE_STATIC); + if( (i-1)%g.nRepeat==0 ){ + x1 = speedtest1_random()%maxb; + zNum[0] = '%'; + len = speedtest1_numbername(i, zNum+1, sizeof(zNum)-2); + zNum[len] = '%'; + zNum[len+1] = 0; + } + sqlite3_bind_text(g.pStmt, 1, zNum, len+1, SQLITE_STATIC); speedtest1_run(); } speedtest1_exec("COMMIT"); @@ -568,12 +643,14 @@ void testset_main(void){ " ORDER BY a; -- %d times", n ); for(i=1; i<=n; i++){ - x1 = speedtest1_random()%maxb; - zNum[0] = '%'; - len = speedtest1_numbername(i, zNum+1, sizeof(zNum)-2); - zNum[len] = '%'; - zNum[len+1] = 0; - sqlite3_bind_text(g.pStmt, 1, zNum, len, SQLITE_STATIC); + if( (i-1)%g.nRepeat==0 ){ + x1 = speedtest1_random()%maxb; + zNum[0] = '%'; + len = speedtest1_numbername(i, zNum+1, sizeof(zNum)-2); + zNum[len] = '%'; + zNum[len+1] = 0; + } + sqlite3_bind_text(g.pStmt, 1, zNum, len+1, SQLITE_STATIC); speedtest1_run(); } speedtest1_exec("COMMIT"); @@ -587,12 +664,14 @@ void testset_main(void){ " ORDER BY a LIMIT 10; -- %d times", n ); for(i=1; i<=n; i++){ - x1 = speedtest1_random()%maxb; - zNum[0] = '%'; - len = speedtest1_numbername(i, zNum+1, sizeof(zNum)-2); - zNum[len] = '%'; - zNum[len+1] = 0; - sqlite3_bind_text(g.pStmt, 1, zNum, len, SQLITE_STATIC); + if( (i-1)%g.nRepeat==0 ){ + x1 = speedtest1_random()%maxb; + zNum[0] = '%'; + len = speedtest1_numbername(i, zNum+1, sizeof(zNum)-2); + zNum[len] = '%'; + zNum[len+1] = 0; + } + sqlite3_bind_text(g.pStmt, 1, zNum, len+1, SQLITE_STATIC); speedtest1_run(); } speedtest1_exec("COMMIT"); @@ -614,12 +693,14 @@ void testset_main(void){ speedtest1_begin_test(160, "%d SELECTS, numeric BETWEEN, indexed", n); speedtest1_exec("BEGIN"); speedtest1_prepare( - "SELECT count(*), avg(b), sum(length(c)) FROM t1\n" + "SELECT count(*), avg(b), sum(length(c)), group_concat(a) FROM t1\n" " WHERE b BETWEEN ?1 AND ?2; -- %d times", n ); for(i=1; i<=n; i++){ - x1 = speedtest1_random()%maxb; - x2 = speedtest1_random()%10 + sz/5000 + x1; + if( (i-1)%g.nRepeat==0 ){ + x1 = speedtest1_random()%maxb; + x2 = speedtest1_random()%10 + sz/5000 + x1; + } sqlite3_bind_int(g.pStmt, 1, x1); sqlite3_bind_int(g.pStmt, 2, x2); speedtest1_run(); @@ -632,12 +713,14 @@ void testset_main(void){ speedtest1_begin_test(161, "%d SELECTS, numeric BETWEEN, PK", n); speedtest1_exec("BEGIN"); speedtest1_prepare( - "SELECT count(*), avg(b), sum(length(c)) FROM t2\n" + "SELECT count(*), avg(b), sum(length(c)), group_concat(a) FROM t2\n" " WHERE a BETWEEN ?1 AND ?2; -- %d times", n ); for(i=1; i<=n; i++){ - x1 = speedtest1_random()%maxb; - x2 = speedtest1_random()%10 + sz/5000 + x1; + if( (i-1)%g.nRepeat==0 ){ + x1 = speedtest1_random()%maxb; + x2 = speedtest1_random()%10 + sz/5000 + x1; + } sqlite3_bind_int(g.pStmt, 1, x1); sqlite3_bind_int(g.pStmt, 2, x2); speedtest1_run(); @@ -650,12 +733,14 @@ void testset_main(void){ speedtest1_begin_test(170, "%d SELECTS, text BETWEEN, indexed", n); speedtest1_exec("BEGIN"); speedtest1_prepare( - "SELECT count(*), avg(b), sum(length(c)) FROM t1\n" + "SELECT count(*), avg(b), sum(length(c)), group_concat(a) FROM t1\n" " WHERE c BETWEEN ?1 AND (?1||'~'); -- %d times", n ); for(i=1; i<=n; i++){ - x1 = swizzle(i, maxb); - len = speedtest1_numbername(x1, zNum, sizeof(zNum)-1); + if( (i-1)%g.nRepeat==0 ){ + x1 = swizzle(i, maxb); + len = speedtest1_numbername(x1, zNum, sizeof(zNum)-1); + } sqlite3_bind_text(g.pStmt, 1, zNum, len, SQLITE_STATIC); speedtest1_run(); } @@ -814,6 +899,65 @@ void testset_main(void){ speedtest1_run(); speedtest1_end_test(); + sz = n = g.szTest*700; + zNum[0] = 0; + maxb = roundup_allones(sz/3); + speedtest1_begin_test(400, "%d REPLACE ops on an IPK", n); + speedtest1_exec("BEGIN"); + speedtest1_exec("CREATE%s TABLE t5(a INTEGER PRIMARY KEY, b %s);", + isTemp(9), g.zNN); + speedtest1_prepare("REPLACE INTO t5 VALUES(?1,?2); -- %d times",n); + for(i=1; i<=n; i++){ + x1 = swizzle(i,maxb); + speedtest1_numbername(i, zNum, sizeof(zNum)); + sqlite3_bind_int(g.pStmt, 1, (sqlite3_int64)x1); + sqlite3_bind_text(g.pStmt, 2, zNum, -1, SQLITE_STATIC); + speedtest1_run(); + } + speedtest1_exec("COMMIT"); + speedtest1_end_test(); + speedtest1_begin_test(410, "%d SELECTS on an IPK", n); + speedtest1_prepare("SELECT b FROM t5 WHERE a=?1; -- %d times",n); + for(i=1; i<=n; i++){ + x1 = swizzle(i,maxb); + sqlite3_bind_int(g.pStmt, 1, (sqlite3_int64)x1); + speedtest1_run(); + } + speedtest1_end_test(); + + sz = n = g.szTest*700; + zNum[0] = 0; + maxb = roundup_allones(sz/3); + speedtest1_begin_test(500, "%d REPLACE on TEXT PK", n); + speedtest1_exec("BEGIN"); + speedtest1_exec("CREATE%s TABLE t6(a TEXT PRIMARY KEY, b %s)%s;", + isTemp(9), g.zNN, + sqlite3_libversion_number()>=3008002 ? "WITHOUT ROWID" : ""); + speedtest1_prepare("REPLACE INTO t6 VALUES(?1,?2); -- %d times",n); + for(i=1; i<=n; i++){ + x1 = swizzle(i,maxb); + speedtest1_numbername(x1, zNum, sizeof(zNum)); + sqlite3_bind_int(g.pStmt, 2, i); + sqlite3_bind_text(g.pStmt, 1, zNum, -1, SQLITE_STATIC); + speedtest1_run(); + } + speedtest1_exec("COMMIT"); + speedtest1_end_test(); + speedtest1_begin_test(510, "%d SELECTS on a TEXT PK", n); + speedtest1_prepare("SELECT b FROM t6 WHERE a=?1; -- %d times",n); + for(i=1; i<=n; i++){ + x1 = swizzle(i,maxb); + speedtest1_numbername(x1, zNum, sizeof(zNum)); + sqlite3_bind_text(g.pStmt, 1, zNum, -1, SQLITE_STATIC); + speedtest1_run(); + } + speedtest1_end_test(); + speedtest1_begin_test(520, "%d SELECT DISTINCT", n); + speedtest1_exec("SELECT DISTINCT b FROM t5;"); + speedtest1_exec("SELECT DISTINCT b FROM t6;"); + speedtest1_end_test(); + + speedtest1_begin_test(980, "PRAGMA integrity_check"); speedtest1_exec("PRAGMA integrity_check"); speedtest1_end_test(); @@ -1238,6 +1382,7 @@ int main(int argc, char **argv){ int nScratch = 0, szScratch=0;/* --scratch configuration */ int showStats = 0; /* True for --stats */ int nThread = 0; /* --threads value */ + int mmapSize = 0; /* How big of a memory map to use */ const char *zTSet = "main"; /* Which --testset torun */ int doTrace = 0; /* True for --trace */ const char *zEncoding = 0; /* --utf16be or --utf16le */ @@ -1260,6 +1405,7 @@ int main(int argc, char **argv){ g.zNN = ""; g.zPK = "UNIQUE"; g.szTest = 100; + g.nRepeat = 1; for(i=1; i=3006000 }else if( strcmp(z,"multithread")==0 ){ sqlite3_config(SQLITE_CONFIG_MULTITHREAD); }else if( strcmp(z,"nomemstat")==0 ){ sqlite3_config(SQLITE_CONFIG_MEMSTATUS, 0); +#endif +#if SQLITE_VERSION_NUMBER>=3007017 + }else if( strcmp(z, "mmap")==0 ){ + if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]); + mmapSize = integerValue(argv[++i]); + #endif }else if( strcmp(z,"nosync")==0 ){ noSync = 1; }else if( strcmp(z,"notnull")==0 ){ @@ -1317,6 +1470,10 @@ int main(int argc, char **argv){ i += 2; }else if( strcmp(z,"primarykey")==0 ){ g.zPK = "PRIMARY KEY"; + }else if( strcmp(z,"repeat")==0 ){ + if( i>=argc-1 ) fatal_error("missing arguments on %s\n", argv[i]); + g.nRepeat = integerValue(argv[i+1]); + i += 1; }else if( strcmp(z,"reprepare")==0 ){ g.bReprepare = 1; }else if( strcmp(z,"scratch")==0 ){ @@ -1324,10 +1481,12 @@ int main(int argc, char **argv){ nScratch = integerValue(argv[i+1]); szScratch = integerValue(argv[i+2]); i += 2; +#if SQLITE_VERSION_NUMBER>=3006000 }else if( strcmp(z,"serialized")==0 ){ sqlite3_config(SQLITE_CONFIG_SERIALIZED); }else if( strcmp(z,"singlethread")==0 ){ sqlite3_config(SQLITE_CONFIG_SINGLETHREAD); +#endif }else if( strcmp(z,"sqlonly")==0 ){ g.bSqlOnly = 1; }else if( strcmp(z,"shrink-memory")==0 ){ @@ -1421,6 +1580,9 @@ int main(int argc, char **argv){ #ifndef SQLITE_OMIT_DEPRECATED if( doTrace ) sqlite3_trace(g.db, traceCallback, 0); #endif + if( mmapSize>0 ){ + speedtest1_exec("PRAGMA mmap_size=%d", mmapSize); + } speedtest1_exec("PRAGMA threads=%d", nThread); if( zKey ){ speedtest1_exec("PRAGMA key('%s')", zKey); diff --git a/sqlite/test/tabfunc01.test b/sqlite/test/tabfunc01.test index 19d3cc66..f25d0708 100644 --- a/sqlite/test/tabfunc01.test +++ b/sqlite/test/tabfunc01.test @@ -23,6 +23,7 @@ ifcapable !vtab { } load_static_extension db series load_static_extension db carray +load_static_extension db remember do_execsql_test tabfunc01-1.1 { SELECT *, '|' FROM generate_series WHERE start=1 AND stop=9 AND step=2; @@ -172,6 +173,19 @@ do_test tabfunc01-720 { SELECT b FROM t600, carray($PTR,5,'int64') WHERE a=value; } } {(005) (007) (013) (017) (023)} +do_test tabfunc01-721 { + db eval { + SELECT remember(123,$PTR); + SELECT value FROM carray($PTR,5,'int64'); + } +} {123 123 7 13 17 23} +do_test tabfunc01-722 { + set PTR2 [expr {$PTR+16}] + db eval { + SELECT remember(987,$PTR2); + SELECT value FROM carray($PTR,5,'int64'); + } +} {987 123 7 987 17 23} do_test tabfunc01-730 { set PTR [doublearray_addr 5.0 7.0 13.0 17.0 23.0] diff --git a/sqlite/test/tempdb2.test b/sqlite/test/tempdb2.test index bc2822e7..5f019bd1 100644 --- a/sqlite/test/tempdb2.test +++ b/sqlite/test/tempdb2.test @@ -74,4 +74,3 @@ do_execsql_test 1.4 { } {1 1 1} finish_test - diff --git a/sqlite/test/temptrigger.test b/sqlite/test/temptrigger.test index 551c6204..e4277adf 100644 --- a/sqlite/test/temptrigger.test +++ b/sqlite/test/temptrigger.test @@ -236,7 +236,7 @@ do_test 5.1 { do_execsql_test 5.2 { SELECT * FROM sqlite_master; - SELECT * FROM sqlite_temp_master; + SELECT * FROM temp.sqlite_master; } { trigger tr1 t1 0 {CREATE TRIGGER tr1 BEFORE INSERT ON t1 BEGIN SELECT 1,2,3; END} diff --git a/sqlite/test/tkt-80e031a00f.test b/sqlite/test/tkt-80e031a00f.test index af1d636e..4ad0a772 100644 --- a/sqlite/test/tkt-80e031a00f.test +++ b/sqlite/test/tkt-80e031a00f.test @@ -20,10 +20,6 @@ source $testdir/tester.tcl source $testdir/lock_common.tcl source $testdir/malloc_common.tcl -# EVIDENCE-OF: R-58875-56087 The IN and NOT IN operators take a single -# scalar operand on the left and a vector operand on the right formed by -# an explicit list of zero or more scalars or by a single subquery. -# # EVIDENCE-OF: R-52275-55503 When the right operand is an empty set, the # result of IN is false and the result of NOT IN is true, regardless of # the left operand and even if the left operand is NULL. diff --git a/sqlite/test/tkt3630.test b/sqlite/test/tkt3630.test index b329c48d..1fe7ce70 100644 --- a/sqlite/test/tkt3630.test +++ b/sqlite/test/tkt3630.test @@ -23,7 +23,7 @@ source $testdir/tester.tcl do_test tkt3630-1 { db eval { CREATE TEMP TABLE temp1(a,b,c); - SELECT * FROM sqlite_temp_master WHERE sql GLOB '*TEMP*'; + SELECT * FROM temp.sqlite_master WHERE sql GLOB '*TEMP*'; } } {} do_test tkt3630-2 { @@ -39,7 +39,7 @@ ifcapable altertable { db eval { ALTER TABLE temp2 ADD COLUMN d; ALTER TABLE temp2 RENAME TO temp2rn; - SELECT name FROM sqlite_temp_master WHERE name LIKE 'temp2%'; + SELECT name FROM temp.sqlite_master WHERE name LIKE 'temp2%'; } } {temp2rn} } diff --git a/sqlite/test/tkt3810.test b/sqlite/test/tkt3810.test index 7e1b2ec5..f15eb7d6 100644 --- a/sqlite/test/tkt3810.test +++ b/sqlite/test/tkt3810.test @@ -62,7 +62,7 @@ do_test tkt3810-3 { # an orphan. # do_test tkt3810-4 { - execsql {SELECT name FROM sqlite_temp_master ORDER BY name} + execsql {SELECT name FROM temp.sqlite_master ORDER BY name} } {r1} # Because it is an orphan, it cannot be dropped. diff --git a/sqlite/test/uri.test b/sqlite/test/uri.test index a0a88d22..0931a25e 100644 --- a/sqlite/test/uri.test +++ b/sqlite/test/uri.test @@ -55,6 +55,10 @@ foreach {tn uri file} { ifcapable !curdir { if {$tn==3} break } + ifcapable uri_00_error { + if {[string first %00 $uri]>=0} continue + } + if {$tcl_platform(platform)=="windows"} { # # NOTE: Due to limits on legal characters for file names imposed by @@ -124,6 +128,10 @@ foreach {tn uri kvlist} { 14 http:test.db?hello&world {} } { + ifcapable uri_00_error { + if {[string first %00 $uri]>=0} continue + } + if {$tcl_platform(platform) == "windows" && $tn>12} { continue } diff --git a/sqlite/test/uri2.test b/sqlite/test/uri2.test new file mode 100644 index 00000000..52feb7b5 --- /dev/null +++ b/sqlite/test/uri2.test @@ -0,0 +1,63 @@ +# 2016 October 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. +# +#*********************************************************************** +# +# Tests for SQLITE_ENABLE_URI_00_ERROR builds. + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +ifcapable !uri_00_error { + finish_test + return +} + +set testprefix uri2 +db close +sqlite3_shutdown +sqlite3_config_uri 1 + +foreach {tn uri} { + 1 file:test.db%00trailing + 2 file:test.db?%00trailing=1 + 3 file:test.db?trailing=1%00 + 4 file:test.db?trailing=1&abc%00def + 5 file:test.db?trailing=1&abc%00def +} { + do_test 1.$tn.1 { + set rc [catch { sqlite3 db $uri } msg] + list $rc $msg + } {1 {unexpected %00 in uri}} + + do_test 1.$tn.2 { + set DB2 [sqlite3_open $uri] + sqlite3_errcode $DB2 + } {SQLITE_ERROR} + + catch { sqlite3_close $DB2 } + + do_test 1.$tn.2 { + sqlite3 db "" + catchsql { ATTACH $uri AS aux } + } {1 {unexpected %00 in uri}} + + do_test 1.$tn.3 { + sqlite3_errcode db + } {SQLITE_ERROR} + + catch { db close } +} + +reset_db +do_test 2.0 { + expr {[lsearch [execsql {PRAGMA compile_options}] ENABLE_URI_00_ERROR] >= 0} +} 1 + +finish_test diff --git a/sqlite/test/wal6.test b/sqlite/test/wal6.test index 2574a64a..9bbc5840 100644 --- a/sqlite/test/wal6.test +++ b/sqlite/test/wal6.test @@ -234,5 +234,36 @@ do_test 4.4.2 { catchsql { SELECT * FROM t2 } db2 } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +# Confirm that it is possible to get an SQLITE_BUSY_SNAPSHOT error from +# "BEGIN EXCLUSIVE" if the connection already has an open read-transaction. +# +db close +db2 close +reset_db +sqlite3 db2 test.db +do_execsql_test 5.1 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(x, y); + INSERT INTO t1 VALUES(1, 2); + INSERT INTO t1 VALUES(3, 4); +} {wal} +do_test 5.2 { + set res [list] + db eval { + SELECT * FROM t1 + } { + if {$x==1} { + db2 eval { INSERT INTO t1 VALUES(5, 6) } + } + if {$x==3} { + set res [catchsql {BEGIN EXCLUSIVE}] + lappend res [sqlite3_extended_errcode db] + } + } + set res +} {1 {database is locked} SQLITE_BUSY_SNAPSHOT} + + finish_test diff --git a/sqlite/test/with3.test b/sqlite/test/with3.test index 62e88441..5540a7fc 100644 --- a/sqlite/test/with3.test +++ b/sqlite/test/with3.test @@ -61,4 +61,60 @@ do_execsql_test 2.1 { SELECT * FROM t1; } {200} +#------------------------------------------------------------------------- +# Test that the planner notices LIMIT clauses on recursive WITH queries. +# + +ifcapable analyze { + do_execsql_test 3.1.1 { + CREATE TABLE y1(a, b); + CREATE INDEX y1a ON y1(a); + + WITH cnt(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM cnt LIMIT 1000) + INSERT INTO y1 SELECT i%10, i FROM cnt; + ANALYZE; + + } + + do_eqp_test 3.1.2 { + WITH cnt(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM cnt LIMIT 1) + SELECT * FROM cnt, y1 WHERE i=a + } { + 3 0 0 {SCAN TABLE cnt} + 1 0 0 {COMPOUND SUBQUERIES 0 AND 0 (UNION ALL)} + 0 0 0 {SCAN SUBQUERY 1} + 0 1 1 {SEARCH TABLE y1 USING INDEX y1a (a=?)} + } + + do_eqp_test 3.1.3 { + WITH cnt(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM cnt LIMIT 1000000) + SELECT * FROM cnt, y1 WHERE i=a + } { + 3 0 0 {SCAN TABLE cnt} + 1 0 0 {COMPOUND SUBQUERIES 0 AND 0 (UNION ALL)} + 0 0 1 {SCAN TABLE y1} + 0 1 0 {SEARCH SUBQUERY 1 USING AUTOMATIC COVERING INDEX (i=?)} + } +} + +do_execsql_test 3.2.1 { + CREATE TABLE w1(pk INTEGER PRIMARY KEY, x INTEGER); + CREATE TABLE w2(pk INTEGER PRIMARY KEY); +} + +do_eqp_test 3.2.2 { + WITH RECURSIVE c(w,id) AS (SELECT 0, (SELECT pk FROM w2 LIMIT 1) + UNION ALL SELECT c.w + 1, x FROM w1, c LIMIT 1) + SELECT * FROM c, w2, w1 + WHERE c.id=w2.pk AND c.id=w1.pk; +} { + 2 0 0 {EXECUTE SCALAR SUBQUERY 3} + 3 0 0 {SCAN TABLE w2} + 4 0 0 {SCAN TABLE w1} + 4 1 1 {SCAN TABLE c} + 1 0 0 {COMPOUND SUBQUERIES 0 AND 0 (UNION ALL)} 0 0 0 {SCAN SUBQUERY 1} + 0 1 1 {SEARCH TABLE w2 USING INTEGER PRIMARY KEY (rowid=?)} + 0 2 2 {SEARCH TABLE w1 USING INTEGER PRIMARY KEY (rowid=?)} +} + finish_test diff --git a/sqlite/test/without_rowid3.test b/sqlite/test/without_rowid3.test index 2af43a91..387a213b 100644 --- a/sqlite/test/without_rowid3.test +++ b/sqlite/test/without_rowid3.test @@ -1031,7 +1031,7 @@ ifcapable altertable { PRAGMA foreign_keys = off; ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1; PRAGMA foreign_keys = on; - SELECT sql FROM sqlite_temp_master WHERE name='t2'; + SELECT sql FROM temp.sqlite_master WHERE name='t2'; } } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} @@ -1064,7 +1064,7 @@ ifcapable altertable { ] do_test without_rowid3-14.2tmp.2.2 { execsql { ALTER TABLE t1 RENAME TO t4 } - execsql { SELECT sql FROM sqlite_temp_master WHERE type = 'table'} + execsql { SELECT sql FROM temp.sqlite_master WHERE type = 'table'} } [list \ {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4") WITHOUT rowid} \ {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2) diff --git a/sqlite/tool/cg_anno.tcl b/sqlite/tool/cg_anno.tcl index f806c5a5..43d2b74f 100755 --- a/sqlite/tool/cg_anno.tcl +++ b/sqlite/tool/cg_anno.tcl @@ -2,23 +2,76 @@ # # A wrapper around cg_annotate that sets appropriate command-line options # and rearranges the output so that annotated files occur in a consistent -# sorted order. Used by the run-speed-test.tcl script. +# sorted order. Used by the speed-check.tcl script. # set in [open "|cg_annotate --show=Ir --auto=yes --context=40 $argv" r] set dest ! set out(!) {} +set linenum 0 +set cntlines 0 ;# true to remember cycle counts on each line +set seenSqlite3 0 ;# true if we have seen the sqlite3.c file while {![eof $in]} { set line [string map {\t { }} [gets $in]] if {[regexp {^-- Auto-annotated source: (.*)} $line all name]} { set dest $name - } elseif {[regexp {^-- line \d+ ------} $line]} { + if {[string match */sqlite3.c $dest]} { + set cntlines 1 + set seenSqlite3 1 + } else { + set cntlines 0 + } + } elseif {[regexp {^-- line (\d+) ------} $line all ln]} { set line [lreplace $line 2 2 {#}] + set linenum [expr {$ln-1}] } elseif {[regexp {^The following files chosen for } $line]} { set dest ! } append out($dest) $line\n + if {$cntlines} { + incr linenum + if {[regexp {^ *([0-9,]+) } $line all x]} { + set x [string map {, {}} $x] + set cycles($linenum) $x + } + } } foreach x [lsort [array names out]] { puts $out($x) } + +# If the sqlite3.c file has been seen, then output a summary of the +# cycle counts for each file that went into making up sqlite3.c +# +if {$seenSqlite3} { + close $in + set in [open sqlite3.c] + set linenum 0 + set fn sqlite3.c + set pattern1 {^/\*+ Begin file ([^ ]+) \*} + set pattern2 {^/\*+ Continuing where we left off in ([^ ]+) \*} + while {![eof $in]} { + set line [gets $in] + incr linenum + if {[regexp $pattern1 $line all newfn]} { + set fn $newfn + } elseif {[regexp $pattern2 $line all newfn]} { + set fn $newfn + } elseif {[info exists cycles($linenum)]} { + incr fcycles($fn) $cycles($linenum) + } + } + close $in + puts {**********************************************************************} + set lx {} + set sum 0 + foreach {fn cnt} [array get fcycles] { + lappend lx [list $cnt $fn] + incr sum $cnt + } + puts [format {%20s %14d %8.3f%%} TOTAL $sum 100] + foreach entry [lsort -index 0 -integer -decreasing $lx] { + foreach {cnt fn} $entry break + puts [format {%20s %14d %8.3f%%} $fn $cnt [expr {$cnt*100.0/$sum}]] + } +} diff --git a/sqlite/tool/fuzzershell.c b/sqlite/tool/fuzzershell.c index d19139d9..c75beb4d 100644 --- a/sqlite/tool/fuzzershell.c +++ b/sqlite/tool/fuzzershell.c @@ -195,12 +195,14 @@ static int execCallback(void *NotUsed, int argc, char **argv, char **colv){ int i; static unsigned cnt = 0; printf("ROW #%u:\n", ++cnt); - for(i=0; in + n >= p->nAlloc ){ + char *zNew; + sqlite3_uint64 nNew; + if( p->oomErr ) return; + nNew = p->nAlloc*2 + 100 + n; + zNew = sqlite3_realloc(p->z, nNew); + if( zNew==0 ){ + sqlite3_free(p->z); + memset(p, 0, sizeof(*p)); + p->oomErr = 1; + return; + } + p->z = zNew; + p->nAlloc = nNew; + } + memcpy(p->z + p->n, z, n); + p->n += n; + p->z[p->n] = 0; +} + +/* Return the current string content */ +static char *StrStr(Str *p){ + return p->z; +} + +/* Free the string */ +static void StrFree(Str *p){ + sqlite3_free(p->z); + StrInit(p); +} + /*************************************************************************** ** eval() implementation copied from ../ext/misc/eval.c */ @@ -1026,6 +1078,8 @@ int main(int argc, char **argv){ oomCnt = 0; } do{ + Str sql; + StrInit(&sql); if( zDbName ){ rc = sqlite3_open_v2(zDbName, &db, SQLITE_OPEN_READWRITE, 0); if( rc!=SQLITE_OK ){ @@ -1055,6 +1109,25 @@ int main(int argc, char **argv){ if( pageSize ) sqlexec(db, "PRAGMA pagesize=%d", pageSize); if( doAutovac ) sqlexec(db, "PRAGMA auto_vacuum=FULL"); iStart = timeOfDay(); + + /* If using an input database file and that database contains a table + ** named "autoexec" with a column "sql", then replace the input SQL + ** with the concatenated text of the autoexec table. In this way, + ** if the database file is the input being fuzzed, the SQL text is + ** fuzzed at the same time. */ + if( sqlite3_table_column_metadata(db,0,"autoexec","sql",0,0,0,0,0)==0 ){ + sqlite3_stmt *pStmt; + rc = sqlite3_prepare_v2(db, "SELECT sql FROM autoexec", -1, &pStmt, 0); + if( rc==SQLITE_OK ){ + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + StrAppend(&sql, (const char*)sqlite3_column_text(pStmt, 0)); + StrAppend(&sql, "\n"); + } + } + sqlite3_finalize(pStmt); + zSql = StrStr(&sql); + } + g.bOomEnable = 1; if( verboseFlag ){ zErrMsg = 0; @@ -1068,6 +1141,7 @@ int main(int argc, char **argv){ } g.bOomEnable = 0; iEnd = timeOfDay(); + StrFree(&sql); rc = sqlite3_close(db); if( rc ){ abendError("sqlite3_close() failed with rc=%d", rc); diff --git a/sqlite/tool/lemon.c b/sqlite/tool/lemon.c index 0fa3d63b..aa0f4e3e 100644 --- a/sqlite/tool/lemon.c +++ b/sqlite/tool/lemon.c @@ -4159,7 +4159,6 @@ void ReportTable( */ for(rp=lemp->rule; rp; rp=rp->next) rp->doesReduce = LEMON_FALSE; for(i=0; inxstate; i++){ - struct action *ap; for(ap=lemp->sorted[i]->ap; ap; ap=ap->next){ if( ap->type==REDUCE || ap->type==SHIFTREDUCE ){ ap->x.rp->doesReduce = i; diff --git a/sqlite/tool/lempar.c b/sqlite/tool/lempar.c index 5195d9c3..dab8343f 100644 --- a/sqlite/tool/lempar.c +++ b/sqlite/tool/lempar.c @@ -538,7 +538,6 @@ static int yy_find_reduce_action( */ static void yyStackOverflow(yyParser *yypParser){ ParseARG_FETCH; - yypParser->yytos--; #ifndef NDEBUG if( yyTraceFILE ){ fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt); @@ -592,12 +591,14 @@ static void yy_shift( #endif #if YYSTACKDEPTH>0 if( yypParser->yytos>=&yypParser->yystack[YYSTACKDEPTH] ){ + yypParser->yytos--; yyStackOverflow(yypParser); return; } #else if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){ if( yyGrowStack(yypParser) ){ + yypParser->yytos--; yyStackOverflow(yypParser); return; } diff --git a/sqlite/tool/mkpragmatab.tcl b/sqlite/tool/mkpragmatab.tcl index 145a365c..d9e10036 100644 --- a/sqlite/tool/mkpragmatab.tcl +++ b/sqlite/tool/mkpragmatab.tcl @@ -10,6 +10,15 @@ # new pragma in ../src/pragma.c. # +# Flag meanings: +set flagMeaning(NeedSchema) {Force schema load before running} +set flagMeaning(ReadOnly) {Read-only HEADER_VALUE} +set flagMeaning(Result0) {Acts as query when no argument} +set flagMeaning(Result1) {Acts as query when has one argument} +set flagMeaning(SchemaReq) {Schema required - "main" is default} +set flagMeaning(SchemaOpt) {Schema restricts name search if present} +set flagMeaning(NoColumns) {OP_ResultRow called with zero columns} + set pragma_def { NAME: full_column_names TYPE: FLAG @@ -47,6 +56,7 @@ set pragma_def { IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: cache_spill + FLAG: Result0 SchemaReq IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: reverse_unordered_selects @@ -139,50 +149,56 @@ set pragma_def { ARG: SQLITE_CellSizeCk NAME: default_cache_size - FLAG: NeedSchema + FLAG: NeedSchema Result0 SchemaReq + COLS: cache_size IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) NAME: page_size + FLAG: Result0 SchemaReq IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) NAME: secure_delete + FLAG: Result0 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) NAME: page_count - FLAG: NeedSchema + FLAG: NeedSchema Result0 SchemaReq IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) NAME: max_page_count TYPE: PAGE_COUNT - FLAG: NeedSchema + FLAG: NeedSchema Result0 SchemaReq IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) NAME: locking_mode + FLAG: Result0 SchemaReq IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) NAME: journal_mode - FLAG: NeedSchema + FLAG: NeedSchema Result0 SchemaReq IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) NAME: journal_size_limit + FLAG: Result0 SchemaReq IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) NAME: cache_size - FLAG: NeedSchema + FLAG: NeedSchema Result0 SchemaReq IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) NAME: mmap_size IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) NAME: auto_vacuum - FLAG: NeedSchema + FLAG: NeedSchema Result0 SchemaReq IF: !defined(SQLITE_OMIT_AUTOVACUUM) NAME: incremental_vacuum - FLAG: NeedSchema + FLAG: NeedSchema NoColumns IF: !defined(SQLITE_OMIT_AUTOVACUUM) NAME: temp_store + FLAG: Result0 IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) NAME: temp_store_directory @@ -195,46 +211,56 @@ set pragma_def { IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE NAME: synchronous - FLAG: NeedSchema + FLAG: NeedSchema Result0 SchemaReq IF: !defined(SQLITE_OMIT_PAGER_PRAGMAS) NAME: table_info - FLAG: NeedSchema + FLAG: NeedSchema Result1 SchemaOpt + COLS: cid name type notnull dflt_value pk IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) NAME: stats - FLAG: NeedSchema + FLAG: NeedSchema Result0 SchemaReq + COLS: table index width height IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) NAME: index_info TYPE: INDEX_INFO ARG: 0 - FLAG: NeedSchema + FLAG: NeedSchema Result1 SchemaOpt + COLS: seqno cid name IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) NAME: index_xinfo TYPE: INDEX_INFO ARG: 1 - FLAG: NeedSchema + FLAG: NeedSchema Result1 SchemaOpt + COLS: seqno cid name desc coll key IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) NAME: index_list - FLAG: NeedSchema + FLAG: NeedSchema Result1 SchemaOpt + COLS: seq name unique origin partial IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) NAME: database_list - FLAG: NeedSchema + FLAG: NeedSchema Result0 + COLS: seq name file IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) NAME: collation_list + FLAG: Result0 + COLS: seq name IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) NAME: foreign_key_list - FLAG: NeedSchema + FLAG: NeedSchema Result1 SchemaOpt + COLS: id seq table from to on_update on_delete match IF: !defined(SQLITE_OMIT_FOREIGN_KEY) NAME: foreign_key_check FLAG: NeedSchema + COLS: table rowid parent fkid IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) NAME: parser_trace @@ -252,6 +278,7 @@ set pragma_def { IF: !defined(SQLITE_OMIT_INTEGRITY_CHECK) NAME: encoding + FLAG: Result0 IF: !defined(SQLITE_OMIT_UTF16) NAME: schema_version @@ -282,10 +309,12 @@ set pragma_def { IF: !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) NAME: compile_options + FLAG: Result0 IF: !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS) NAME: wal_checkpoint FLAG: NeedSchema + COLS: busy log checkpointed IF: !defined(SQLITE_OMIT_WAL) NAME: wal_autocheckpoint @@ -294,8 +323,12 @@ set pragma_def { NAME: shrink_memory NAME: busy_timeout + FLAG: Result0 + COLS: timeout NAME: lock_status + FLAG: Result0 + COLS: database status IF: defined(SQLITE_DEBUG) || defined(SQLITE_TEST) NAME: key @@ -315,8 +348,10 @@ set pragma_def { IF: defined(SQLITE_HAS_CODEC) || defined(SQLITE_ENABLE_CEROD) NAME: soft_heap_limit + FLAG: Result0 NAME: threads + FLAG: Result0 } # Open the output file @@ -336,15 +371,29 @@ set name {} set type {} set if {} set flags {} +set cols {} +set cols_list {} set arg 0 proc record_one {} { - global name type if arg allbyname typebyif flags + global name type if arg allbyname typebyif flags cols allcols + global cols_list colUsedBy if {$name==""} return - set allbyname($name) [list $type $arg $if $flags] + if {$cols!=""} { + if {![info exists allcols($cols)]} { + lappend cols_list $cols + set allcols($cols) [llength $cols_list] + } + set cx $allcols($cols) + lappend colUsedBy($cols) $name + } else { + set cx 0 + } + set allbyname($name) [list $type $arg $if $flags $cx] set name {} set type {} set if {} set flags {} + set cols {} set arg 0 } foreach line [split $pragma_def \n] { @@ -358,8 +407,16 @@ foreach line [split $pragma_def \n] { set type [string toupper $val] } elseif {$id=="TYPE"} { set type $val + if {$type=="FLAG"} { + lappend flags Result0 NoColumns + } + if {$type=="HEADER_VALUE"} { + lappend flags Result0 + } } elseif {$id=="ARG"} { set arg $val + } elseif {$id=="COLS"} { + set cols $val } elseif {$id=="IF"} { lappend if $val } elseif {$id=="FLAG"} { @@ -378,6 +435,7 @@ set allnames [lsort [array names allbyname]] # omit in default builds (defined(SQLITE_DEBUG) and defined(SQLITE_HAS_CODEC)) # at the end. # +puts $fd "\n/* The various pragma types */" set pnum 0 foreach name $allnames { set type [lindex $allbyname($name) 0] @@ -407,25 +465,58 @@ foreach name $allnames { # Generate #defines for flags # +puts $fd "\n/* Property flags associated with various pragma. */" set fv 1 foreach f [lsort [array names allflags]] { - puts $fd [format {#define PragFlag_%-20s 0x%02x} $f $fv] + puts $fd [format {#define PragFlg_%-10s 0x%02x /* %s */} \ + $f $fv $flagMeaning($f)] set fv [expr {$fv*2}] } +# Generate the array of column names used by pragmas that act like +# queries. +# +puts $fd "\n/* Names of columns for pragmas that return multi-column result" +puts $fd "** or that return single-column results where the name of the" +puts $fd "** result column is different from the name of the pragma\n*/" +puts $fd "static const char *const pragCName\[\] = {" +set offset 0 +foreach cols $cols_list { + set cols_offset($allcols($cols)) $offset + set ub " /* Used by: $colUsedBy($cols) */" + foreach c $cols { + puts $fd [format " /* %3d */ %-14s%s" $offset \"$c\", $ub] + set ub "" + incr offset + } +} +puts $fd "\175;" + # Generate the lookup table # -puts $fd "static const struct sPragmaNames \173" -puts $fd " const char *const zName; /* Name of pragma */" -puts $fd " u8 ePragTyp; /* PragTyp_XXX value */" -puts $fd " u8 mPragFlag; /* Zero or more PragFlag_XXX values */" -puts $fd " u32 iArg; /* Extra argument */" -puts $fd "\175 aPragmaNames\[\] = \173" +puts $fd "\n/* Definitions of all built-in pragmas */" +puts $fd "typedef struct PragmaName \173" +puts $fd " const char *const zName; /* Name of pragma */" +puts $fd " u8 ePragTyp; /* PragTyp_XXX value */" +puts $fd " u8 mPragFlg; /* Zero or more PragFlg_XXX values */" +puts $fd { u8 iPragCName; /* Start of column names in pragCName[] */} +puts $fd " u8 nPragCName; \ +/* Num of col names. 0 means use pragma name */" +puts $fd " u32 iArg; /* Extra argument */" +puts $fd "\175 PragmaName;" +puts $fd "static const PragmaName aPragmaName\[\] = \173" set current_if {} set spacer [format { %26s } {}] foreach name $allnames { - foreach {type arg if flag} $allbyname($name) break + foreach {type arg if flag cx} $allbyname($name) break + if {$cx==0} { + set cy 0 + set nx 0 + } else { + set cy $cols_offset($cx) + set nx [llength [lindex $cols_list [expr {$cx-1}]]] + } if {$if!=$current_if} { if {$current_if!=""} { foreach this_if $current_if { @@ -443,12 +534,13 @@ foreach name $allnames { if {$flag==""} { set flagx "0" } else { - set flagx PragFlag_[join $flag {|PragFlag_}] + set flagx PragFlg_[join $flag {|PragFlg_}] } - puts $fd " \173 /* zName: */ \"$name\"," - puts $fd " /* ePragTyp: */ PragTyp_$type," - puts $fd " /* ePragFlag: */ $flagx," - puts $fd " /* iArg: */ $arg \175," + puts $fd " \173/* zName: */ \"$name\"," + puts $fd " /* ePragTyp: */ PragTyp_$type," + puts $fd " /* ePragFlg: */ $flagx," + puts $fd " /* ColNames: */ $cy, $nx," + puts $fd " /* iArg: */ $arg \175," } if {$current_if!=""} { foreach this_if $current_if { diff --git a/sqlite/tool/showstat4.c b/sqlite/tool/showstat4.c index c7f9b10f..e31150f0 100644 --- a/sqlite/tool/showstat4.c +++ b/sqlite/tool/showstat4.c @@ -130,11 +130,11 @@ int main(int argc, char **argv){ } printf("'"); }else{ - printf("%s\"", zSep); + printf("%s'", zSep); for(j=0; j

    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%0Aj7nn(+&DpGEf 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%0AL8#k(GB6VCouQk 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�)8hM&b}eaM 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