1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-29 08:01:23 +03:00

Merge recent trunk enhancements into the ota-update branch.

FossilOrigin-Name: 5489cb68921f62f10d832adbc4d19ea8c6c5da50
This commit is contained in:
drh
2015-03-09 13:24:46 +00:00
53 changed files with 1234 additions and 358 deletions

View File

@ -287,6 +287,7 @@ SRC = \
$(TOP)/src/vdbetrace.c \ $(TOP)/src/vdbetrace.c \
$(TOP)/src/vdbeInt.h \ $(TOP)/src/vdbeInt.h \
$(TOP)/src/vtab.c \ $(TOP)/src/vtab.c \
$(TOP)/src/vxworks.h \
$(TOP)/src/wal.c \ $(TOP)/src/wal.c \
$(TOP)/src/wal.h \ $(TOP)/src/wal.h \
$(TOP)/src/walker.c \ $(TOP)/src/walker.c \
@ -482,6 +483,7 @@ HDR = \
$(TOP)/src/sqliteLimit.h \ $(TOP)/src/sqliteLimit.h \
$(TOP)/src/vdbe.h \ $(TOP)/src/vdbe.h \
$(TOP)/src/vdbeInt.h \ $(TOP)/src/vdbeInt.h \
$(TOP)/src/vxworks.h \
$(TOP)/src/whereInt.h \ $(TOP)/src/whereInt.h \
config.h config.h

View File

@ -805,6 +805,7 @@ SRC2 = \
$(TOP)\src\vdbetrace.c \ $(TOP)\src\vdbetrace.c \
$(TOP)\src\vdbeInt.h \ $(TOP)\src\vdbeInt.h \
$(TOP)\src\vtab.c \ $(TOP)\src\vtab.c \
$(TOP)\src\vxworks.h \
$(TOP)\src\wal.c \ $(TOP)\src\wal.c \
$(TOP)\src\wal.h \ $(TOP)\src\wal.h \
$(TOP)\src\walker.c \ $(TOP)\src\walker.c \
@ -1004,6 +1005,7 @@ HDR = \
$(TOP)\src\sqliteLimit.h \ $(TOP)\src\sqliteLimit.h \
$(TOP)\src\vdbe.h \ $(TOP)\src\vdbe.h \
$(TOP)\src\vdbeInt.h \ $(TOP)\src\vdbeInt.h \
$(TOP)\src\vxworks.h \
$(TOP)\src\whereInt.h $(TOP)\src\whereInt.h
# Header files used by extensions # Header files used by extensions
@ -1536,32 +1538,32 @@ speedtest1.exe: $(TOP)\test\speedtest1.c $(SQLITE3C)
$(TOP)\test\speedtest1.c $(SQLITE3C) $(TOP)\test\speedtest1.c $(SQLITE3C)
clean: clean:
del /Q *.lo *.ilk *.lib *.obj *.pdb sqlite3.exe libsqlite3.lib del /Q *.lo *.ilk *.lib *.obj *.pdb sqlite3.exe libsqlite3.lib 2>NUL
del /Q *.cod *.da *.bb *.bbg gmon.out del /Q *.cod *.da *.bb *.bbg gmon.out 2>NUL
del /Q sqlite3.h opcodes.c opcodes.h del /Q sqlite3.h opcodes.c opcodes.h 2>NUL
del /Q lemon.* lempar.c parse.* del /Q lemon.* lempar.c parse.* 2>NUL
del /Q mkkeywordhash.* keywordhash.h del /Q mkkeywordhash.* keywordhash.h 2>NUL
del /Q notasharedlib.* del /Q notasharedlib.* 2>NUL
-rmdir /Q/S .deps -rmdir /Q/S .deps 2>NUL
-rmdir /Q/S .libs -rmdir /Q/S .libs 2>NUL
-rmdir /Q/S quota2a -rmdir /Q/S quota2a 2>NUL
-rmdir /Q/S quota2b -rmdir /Q/S quota2b 2>NUL
-rmdir /Q/S quota2c -rmdir /Q/S quota2c 2>NUL
-rmdir /Q/S tsrc -rmdir /Q/S tsrc 2>NUL
del /Q .target_source del /Q .target_source 2>NUL
del /Q tclsqlite3.exe tclsqlite3.exp del /Q tclsqlite3.exe tclsqlite3.exp 2>NUL
del /Q testloadext.dll testloadext.exp del /Q testloadext.dll testloadext.exp 2>NUL
del /Q testfixture.exe testfixture.exp test.db del /Q testfixture.exe testfixture.exp test.db 2>NUL
del /Q LogEst.exe fts3view.exe rollback-test.exe showdb.exe del /Q LogEst.exe fts3view.exe rollback-test.exe showdb.exe 2>NUL
del /Q showjournal.exe showstat4.exe showwal.exe speedtest1.exe del /Q showjournal.exe showstat4.exe showwal.exe speedtest1.exe 2>NUL
del /Q wordcount.exe del /Q wordcount.exe 2>NUL
del /Q sqlite3.dll sqlite3.lib sqlite3.exp sqlite3.def del /Q sqlite3.dll sqlite3.lib sqlite3.exp sqlite3.def 2>NUL
del /Q sqlite3.c sqlite3-*.c del /Q sqlite3.c sqlite3-*.c 2>NUL
del /Q sqlite3rc.h del /Q sqlite3rc.h 2>NUL
del /Q shell.c sqlite3ext.h del /Q shell.c sqlite3ext.h 2>NUL
del /Q sqlite3_analyzer.exe sqlite3_analyzer.exp sqlite3_analyzer.c del /Q sqlite3_analyzer.exe sqlite3_analyzer.exp sqlite3_analyzer.c 2>NUL
del /Q sqlite-*-output.vsix del /Q sqlite-*-output.vsix 2>NUL
del /Q mptester.exe del /Q mptester.exe 2>NUL
# Dynamic link library section. # Dynamic link library section.
# #

View File

@ -1 +1 @@
3.8.8 3.8.9

18
configure vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.62 for sqlite 3.8.8. # Generated by GNU Autoconf 2.62 for sqlite 3.8.9.
# #
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
@ -743,8 +743,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package. # Identity of this package.
PACKAGE_NAME='sqlite' PACKAGE_NAME='sqlite'
PACKAGE_TARNAME='sqlite' PACKAGE_TARNAME='sqlite'
PACKAGE_VERSION='3.8.8' PACKAGE_VERSION='3.8.9'
PACKAGE_STRING='sqlite 3.8.8' PACKAGE_STRING='sqlite 3.8.9'
PACKAGE_BUGREPORT='' PACKAGE_BUGREPORT=''
# Factoring default headers for most tests. # Factoring default headers for most tests.
@ -1480,7 +1480,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures sqlite 3.8.8 to adapt to many kinds of systems. \`configure' configures sqlite 3.8.9 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1545,7 +1545,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of sqlite 3.8.8:";; short | recursive ) echo "Configuration of sqlite 3.8.9:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1659,7 +1659,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
sqlite configure 3.8.8 sqlite configure 3.8.9
generated by GNU Autoconf 2.62 generated by GNU Autoconf 2.62
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@ -1673,7 +1673,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by sqlite $as_me 3.8.8, which was It was created by sqlite $as_me 3.8.9, which was
generated by GNU Autoconf 2.62. Invocation command line was generated by GNU Autoconf 2.62. Invocation command line was
$ $0 $@ $ $0 $@
@ -13951,7 +13951,7 @@ exec 6>&1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by sqlite $as_me 3.8.8, which was This file was extended by sqlite $as_me 3.8.9, which was
generated by GNU Autoconf 2.62. Invocation command line was generated by GNU Autoconf 2.62. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -14004,7 +14004,7 @@ Report bugs to <bug-autoconf@gnu.org>."
_ACEOF _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_version="\\ ac_cs_version="\\
sqlite config.status 3.8.8 sqlite config.status 3.8.9
configured by $0, generated by GNU Autoconf 2.62, configured by $0, generated by GNU Autoconf 2.62,
with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"

View File

@ -1253,7 +1253,7 @@ void sqlite3Fts3Snippet(
*/ */
for(iRead=0; iRead<pTab->nColumn; iRead++){ for(iRead=0; iRead<pTab->nColumn; iRead++){
SnippetFragment sF = {0, 0, 0, 0}; SnippetFragment sF = {0, 0, 0, 0};
int iS; int iS = 0;
if( iCol>=0 && iRead!=iCol ) continue; if( iCol>=0 && iRead!=iCol ) continue;
/* Find the best snippet of nFToken tokens in column iRead. */ /* Find the best snippet of nFToken tokens in column iRead. */

View File

@ -38,6 +38,7 @@ static void compressFunc(
unsigned int nIn; unsigned int nIn;
unsigned long int nOut; unsigned long int nOut;
unsigned char x[8]; unsigned char x[8];
int rc;
int i, j; int i, j;
pIn = sqlite3_value_blob(argv[0]); pIn = sqlite3_value_blob(argv[0]);
@ -50,8 +51,12 @@ static void compressFunc(
for(i=0; i<4 && x[i]==0; i++){} for(i=0; i<4 && x[i]==0; i++){}
for(j=0; i<=4; i++, j++) pOut[j] = x[i]; for(j=0; i<=4; i++, j++) pOut[j] = x[i];
pOut[j-1] |= 0x80; pOut[j-1] |= 0x80;
compress(&pOut[j], &nOut, pIn, nIn); rc = compress(&pOut[j], &nOut, pIn, nIn);
if( rc==Z_OK ){
sqlite3_result_blob(context, pOut, nOut+j, sqlite3_free); sqlite3_result_blob(context, pOut, nOut+j, sqlite3_free);
}else{
sqlite3_free(pOut);
}
} }
/* /*
@ -82,6 +87,8 @@ static void uncompressFunc(
rc = uncompress(pOut, &nOut, &pIn[i], nIn-i); rc = uncompress(pOut, &nOut, &pIn[i], nIn-i);
if( rc==Z_OK ){ if( rc==Z_OK ){
sqlite3_result_blob(context, pOut, nOut, sqlite3_free); sqlite3_result_blob(context, pOut, nOut, sqlite3_free);
}else{
sqlite3_free(pOut);
} }
} }

View File

@ -165,6 +165,7 @@ SRC = \
$(TOP)/src/vdbetrace.c \ $(TOP)/src/vdbetrace.c \
$(TOP)/src/vdbeInt.h \ $(TOP)/src/vdbeInt.h \
$(TOP)/src/vtab.c \ $(TOP)/src/vtab.c \
$(TOP)/src/vxworks.h \
$(TOP)/src/wal.c \ $(TOP)/src/wal.c \
$(TOP)/src/wal.h \ $(TOP)/src/wal.h \
$(TOP)/src/walker.c \ $(TOP)/src/walker.c \
@ -368,6 +369,7 @@ HDR = \
$(TOP)/src/sqliteLimit.h \ $(TOP)/src/sqliteLimit.h \
$(TOP)/src/vdbe.h \ $(TOP)/src/vdbe.h \
$(TOP)/src/vdbeInt.h \ $(TOP)/src/vdbeInt.h \
$(TOP)/src/vxworks.h \
$(TOP)/src/whereInt.h $(TOP)/src/whereInt.h
# Header files used by extensions # Header files used by extensions

112
manifest
View File

@ -1,12 +1,12 @@
C Fix\ssome\sproblems\swith\sOTA\sand\sempty\starget\sdatabases,\sor\starget\sdatabases\swith\sthe\swrong\sset\sof\stables.\sAlso\sadd\sSQLITE_FCNTL_VFSNAME\ssupport\sto\sthe\sOTA\sVFS. C Merge\srecent\strunk\senhancements\sinto\sthe\sota-update\sbranch.
D 2015-03-05T16:21:20.067 D 2015-03-09T13:24:46.462
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 6b9e7677829aa94b9f30949656e27312aefb9a46 F Makefile.in 2f643d6968dfc0b82d2e546a0525a39079f9e928
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F Makefile.msc fc6b0b233b5621f3e56298e4d6a0b3f6c936c520 F Makefile.msc 529e61cd9d29a3934758b4b3a0bb649b6c653481
F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858
F README.md d58e3bebc0a4145e0f2a87994015fdb575a8e866 F README.md d58e3bebc0a4145e0f2a87994015fdb575a8e866
F VERSION d846487aff892625eb8e75960234e7285f0462fe F VERSION 319eb1ced4b4d17a67730f2b7b85f15c1346cb60
F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
F addopcodes.awk 9eb448a552d5c0185cf62c463f9c173cedae3811 F addopcodes.awk 9eb448a552d5c0185cf62c463f9c173cedae3811
F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
@ -38,7 +38,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63
F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977 F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977
F config.h.in 42b71ad3fe21c9e88fa59e8458ca1a6bc72eb0c0 F config.h.in 42b71ad3fe21c9e88fa59e8458ca1a6bc72eb0c0
F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55 F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55
F configure b2882796ddebd33ac4e9d4ccf5c5ca11888fc30e x F configure 613b220c2f2c7adcd50eb5ee4144ab581a150b47 x
F configure.ac 6a8d145aea6d81f0b90013340780e43ed74fd5f4 F configure.ac 6a8d145aea6d81f0b90013340780e43ed74fd5f4
F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad
F doc/lemon.html 334dbf6621b8fb8790297ec1abf3cfa4621709d1 F doc/lemon.html 334dbf6621b8fb8790297ec1abf3cfa4621709d1
@ -87,7 +87,7 @@ F ext/fts3/fts3_hash.c 29b986e43f4e9dd40110eafa377dc0d63c422c60
F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf
F ext/fts3/fts3_icu.c e319e108661147bcca8dd511cd562f33a1ba81b5 F ext/fts3/fts3_icu.c e319e108661147bcca8dd511cd562f33a1ba81b5
F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009
F ext/fts3/fts3_snippet.c f16ef6425f92339a8fecc87d9aaf2b12355c78e4 F ext/fts3/fts3_snippet.c 52c2dcf410b1f9af5a44d81a2cf8c68ed1cb5283
F ext/fts3/fts3_term.c a521f75132f9a495bdca1bdd45949b3191c52763 F ext/fts3/fts3_term.c a521f75132f9a495bdca1bdd45949b3191c52763
F ext/fts3/fts3_test.c 8a3a78c4458b2d7c631fcf4b152a5cd656fa7038 F ext/fts3/fts3_test.c 8a3a78c4458b2d7c631fcf4b152a5cd656fa7038
F ext/fts3/fts3_tokenize_vtab.c becc661223db7898b213f9e8a23d75bac02408c9 F ext/fts3/fts3_tokenize_vtab.c becc661223db7898b213f9e8a23d75bac02408c9
@ -108,7 +108,7 @@ F ext/icu/icu.c d415ccf984defeb9df2c0e1afcfaa2f6dc05eacb
F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37 F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37
F ext/misc/amatch.c 27b9b601fb1453084e18a3432ea0240d7af8decb F ext/misc/amatch.c 27b9b601fb1453084e18a3432ea0240d7af8decb
F ext/misc/closure.c 636024302cde41b2bf0c542f81c40c624cfb7012 F ext/misc/closure.c 636024302cde41b2bf0c542f81c40c624cfb7012
F ext/misc/compress.c 76e45655f4046e756064ab10c62e18f2eb846b9f F ext/misc/compress.c 122faa92d25033d6c3f07c39231de074ab3d2e83
F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2
F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f
F ext/misc/fuzzer.c e3e18f47252c151b5553d7e806f38e757d37c4cc F ext/misc/fuzzer.c e3e18f47252c151b5553d7e806f38e757d37c4cc
@ -170,7 +170,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60
F main.mk 584d60a533f4301ec660d54a6057970a7ee913c3 F main.mk cdf4a20c72d798188f63e2fd6d3eea638bddd431
F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea
F mkopcodeh.awk c6b3fa301db6ef7ac916b14c60868aeaec1337b5 F mkopcodeh.awk c6b3fa301db6ef7ac916b14c60868aeaec1337b5
F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83
@ -203,7 +203,7 @@ F src/delete.c 37964e6c1d73ff49cbea9ff690c9605fb15f600e
F src/expr.c 3ef111b88ae2941b84b6b6ea4be8d501ba1af0cb F src/expr.c 3ef111b88ae2941b84b6b6ea4be8d501ba1af0cb
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
F src/fkey.c e0444b61bed271a76840cbe6182df93a9baa3f12 F src/fkey.c e0444b61bed271a76840cbe6182df93a9baa3f12
F src/func.c f7f0f44b0a2cb568a9c42b1b07e613380ee0b9c6 F src/func.c 44512c557d6d4a40e51f3980c5854ae3e92862d6
F src/global.c 4f77cadbc5427d00139ba43d0f3979804cbb700e F src/global.c 4f77cadbc5427d00139ba43d0f3979804cbb700e
F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5 F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5
F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094 F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094
@ -213,7 +213,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d
F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e
F src/lempar.c 7274c97d24bb46631e504332ccd3bd1b37841770 F src/lempar.c 7274c97d24bb46631e504332ccd3bd1b37841770
F src/loadext.c 86bd4e2fccd520b748cba52492ab60c4a770f660 F src/loadext.c 86bd4e2fccd520b748cba52492ab60c4a770f660
F src/main.c 80edeba383aac89f72498b2572a115e21d0ecbbd F src/main.c fa997fa27d95febc16d57095299384b667a7f762
F src/malloc.c 740db54387204c9a2eb67c6d98e68b08e9ef4eab F src/malloc.c 740db54387204c9a2eb67c6d98e68b08e9ef4eab
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
F src/mem1.c abe6ee469b6c5a35c7f22bfeb9c9bac664a1c987 F src/mem1.c abe6ee469b6c5a35c7f22bfeb9c9bac664a1c987
@ -226,38 +226,38 @@ F src/mutex.c 19bf9acba69ca2f367c3761080f8a9f0cf4670a8
F src/mutex.h 779d588e3b7756ec3ecf7d78cde1d84aba414f85 F src/mutex.h 779d588e3b7756ec3ecf7d78cde1d84aba414f85
F src/mutex_noop.c 529bab0743c3321c940f32c3464de494fd38cfa9 F src/mutex_noop.c 529bab0743c3321c940f32c3464de494fd38cfa9
F src/mutex_unix.c 5cf676464bd19e0a866297515d146e8bf1669dfb F src/mutex_unix.c 5cf676464bd19e0a866297515d146e8bf1669dfb
F src/mutex_w32.c a6f0b84068db2cbd96a94f23c622aeb875c57dff F src/mutex_w32.c 61660ada28d8308ad190f444c2170c4f2a590c2f
F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7 F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7
F src/os.c 8fd25588eeba74068d41102d26810e216999b6c8 F src/os.c 8fd25588eeba74068d41102d26810e216999b6c8
F src/os.h 3e57a24e2794a94d3cf2342c6d9a884888cd96bf F src/os.h 3e57a24e2794a94d3cf2342c6d9a884888cd96bf
F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa
F src/os_unix.c c06b1b263d52e14473ccc619422af6b64570a3b8 F src/os_unix.c 49d06acee4053920e4a6429844f440b5f975cea4
F src/os_win.c 8223e7db5b7c4a81d8b161098ac3959400434cdb F src/os_win.c 8223e7db5b7c4a81d8b161098ac3959400434cdb
F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca
F src/pager.c 4120a49ecd37697e28f5ed807f470b9c0b88410c F src/pager.c 4120a49ecd37697e28f5ed807f470b9c0b88410c
F src/pager.h c3476e7c89cdf1c6914e50a11f3714e30b4e0a77 F src/pager.h c3476e7c89cdf1c6914e50a11f3714e30b4e0a77
F src/parse.y 0f8e7d60f0ab3cb53d270adef69259ac307d83a8 F src/parse.y 0f8e7d60f0ab3cb53d270adef69259ac307d83a8
F src/pcache.c d210cf90d04365a74f85d21374dded65af67b0cb F src/pcache.c 10539fb959849ad6efff80050541cab3d25089d4
F src/pcache.h b44658c9c932d203510279439d891a2a83e12ba8 F src/pcache.h b44658c9c932d203510279439d891a2a83e12ba8
F src/pcache1.c 1e77432b40b7d3288327d9cdf399dcdfd2b6d3bf F src/pcache1.c 1e77432b40b7d3288327d9cdf399dcdfd2b6d3bf
F src/pragma.c ea0be138a99784b14e87bd4522fea40e7b979e9c F src/pragma.c ac4f3f856b4234e85f55b0f069698a4766011100
F src/pragma.h 09c89bca58e9a44de2116cc8272b8d454657129f F src/pragma.h 09c89bca58e9a44de2116cc8272b8d454657129f
F src/prepare.c 173a5a499138451b2561614ecb87d78f9f4644b9 F src/prepare.c 173a5a499138451b2561614ecb87d78f9f4644b9
F src/printf.c 8da9a2687a396daa19860f4dc90975d319304744 F src/printf.c 8da9a2687a396daa19860f4dc90975d319304744
F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696
F src/resolve.c f4d79e31ffa5820c2e3d1740baa5e9b190425f2b F src/resolve.c f4d79e31ffa5820c2e3d1740baa5e9b190425f2b
F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e
F src/select.c e46cef4c224549b439384c88fc7f57ba064dad54 F src/select.c 94e016b6733b1d39a2f4c8d431155b4c2897d907
F src/shell.c 6276582ee4e9114e0bb0795772414caaf21c0f8e F src/shell.c cce82ca26392578a4a1ee927dfe55ea3411c7c92
F src/sqlite.h.in f7df4082533ae9c5acf19bd513e4ff4b638f51d1 F src/sqlite.h.in 95df7ba81981e1de0729ba14d1acbd8c4c6a9697
F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad
F src/sqlite3ext.h 17d487c3c91b0b8c584a32fbeb393f6f795eea7d F src/sqlite3ext.h 17d487c3c91b0b8c584a32fbeb393f6f795eea7d
F src/sqliteInt.h 57a405ae6d2ed10fff52de376d18f21e04d96609 F src/sqliteInt.h fae682c2b4dfbe489b134d74521c41c088f16ab1
F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46
F src/status.c 81712116e826b0089bb221b018929536b2b5406f F src/status.c 81712116e826b0089bb221b018929536b2b5406f
F src/table.c e7a09215315a978057fb42c640f890160dbcc45e F src/table.c e7a09215315a978057fb42c640f890160dbcc45e
F src/tclsqlite.c c7897dcf036c0bb7bd814a0e615723b83bc7df86 F src/tclsqlite.c fb310fcbb6f8b6c9af0cb3efda805fd04a6faf45
F src/test1.c 90fbedce75330d48d99eadb7d5f4223e86969585 F src/test1.c 90fbedce75330d48d99eadb7d5f4223e86969585
F src/test2.c 577961fe48961b2f2e5c8b56ee50c3f459d3359d F src/test2.c 577961fe48961b2f2e5c8b56ee50c3f459d3359d
F src/test3.c 64d2afdd68feac1bb5e2ffb8226c8c639f798622 F src/test3.c 64d2afdd68feac1bb5e2ffb8226c8c639f798622
@ -272,7 +272,7 @@ F src/test_autoext.c dea8a01a7153b9adc97bd26161e4226329546e12
F src/test_backup.c 2e6e6a081870150f20c526a2e9d0d29cda47d803 F src/test_backup.c 2e6e6a081870150f20c526a2e9d0d29cda47d803
F src/test_blob.c 1f2e3e25255b731c4fcf15ee7990d06347cb6c09 F src/test_blob.c 1f2e3e25255b731c4fcf15ee7990d06347cb6c09
F src/test_btree.c 2e9978eca99a9a4bfa8cae949efb00886860a64f F src/test_btree.c 2e9978eca99a9a4bfa8cae949efb00886860a64f
F src/test_config.c a55a18bbbb117eab92e4343f7ee753b25e0aee49 F src/test_config.c 7d28ede476189eefd75252fa9acaadc6ba93a733
F src/test_demovfs.c 0de72c2c89551629f58486fde5734b7d90758852 F src/test_demovfs.c 0de72c2c89551629f58486fde5734b7d90758852
F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc
F src/test_fs.c ced436e3d4b8e4681328409b8081051ce614e28f F src/test_fs.c ced436e3d4b8e4681328409b8081051ce614e28f
@ -284,7 +284,7 @@ F src/test_intarray.h 9dc57417fb65bc7835cc18548852cc08cc062202
F src/test_journal.c 5360fbe1d1e4416ca36290562fd5a2e3f70f32aa F src/test_journal.c 5360fbe1d1e4416ca36290562fd5a2e3f70f32aa
F src/test_loadext.c a5251f956ab6af21e138dc1f9c0399394a510cb4 F src/test_loadext.c a5251f956ab6af21e138dc1f9c0399394a510cb4
F src/test_malloc.c b9495384e74923aefde8311de974bf9b0f5ba570 F src/test_malloc.c b9495384e74923aefde8311de974bf9b0f5ba570
F src/test_multiplex.c 72c0ad1e97af3d6d19975bbd81813072b40c7290 F src/test_multiplex.c 61edf02530f7511a0529352cd8139ead3af4c401
F src/test_multiplex.h c08e4e8f8651f0c5e0509b138ff4d5b43ed1f5d3 F src/test_multiplex.h c08e4e8f8651f0c5e0509b138ff4d5b43ed1f5d3
F src/test_mutex.c 293042d623ebba969160f471a82aa1551626454f F src/test_mutex.c 293042d623ebba969160f471a82aa1551626454f
F src/test_onefile.c 0396f220561f3b4eedc450cef26d40c593c69a25 F src/test_onefile.c 0396f220561f3b4eedc450cef26d40c593c69a25
@ -311,21 +311,22 @@ F src/update.c 3c4ecc282accf12d39edb8d524cf089645e55a13
F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c
F src/util.c 98a7627ca48ad3265b6940915a1d08355eb3fc7e F src/util.c 98a7627ca48ad3265b6940915a1d08355eb3fc7e
F src/vacuum.c 9460b9de7b2d4e34b0d374894aa6c8a0632be8ec F src/vacuum.c 9460b9de7b2d4e34b0d374894aa6c8a0632be8ec
F src/vdbe.c ddfc977981cd6324668aa6b114045eb1c677421a F src/vdbe.c 94cbc2115075b1a562a2a702c29ba48e74f85d34
F src/vdbe.h 6fc69d9c5e146302c56e163cb4b31d1ee64a18c3 F src/vdbe.h 6fc69d9c5e146302c56e163cb4b31d1ee64a18c3
F src/vdbeInt.h bb56fd199d8af1a2c1b9639ee2f70724b4338e3a F src/vdbeInt.h bb56fd199d8af1a2c1b9639ee2f70724b4338e3a
F src/vdbeapi.c 3d88089b10f71750b019a806224f0277d371a072 F src/vdbeapi.c dac0d0d8009a8aa549cd77d9c29da44c0344f0c4
F src/vdbeaux.c 97911edb61074b871ec4aa2d6bb779071643dee5 F src/vdbeaux.c 97911edb61074b871ec4aa2d6bb779071643dee5
F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90 F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90
F src/vdbemem.c 31d8eabb0cd78bfeab4e5124c7363c3e9e54db9f F src/vdbemem.c 31d8eabb0cd78bfeab4e5124c7363c3e9e54db9f
F src/vdbesort.c 6d64c5448b64851b99931ede980addc3af70d5e2 F src/vdbesort.c 6d64c5448b64851b99931ede980addc3af70d5e2
F src/vdbetrace.c 7e4222955e07dd707a2f360c0eb73452be1cb010 F src/vdbetrace.c 7e4222955e07dd707a2f360c0eb73452be1cb010
F src/vtab.c 699f2b8d509cfe379c33dde33827875d5b030e01 F src/vtab.c 699f2b8d509cfe379c33dde33827875d5b030e01
F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb
F src/wal.c 39303f2c9db02a4e422cd8eb2c8760420c6a51fe F src/wal.c 39303f2c9db02a4e422cd8eb2c8760420c6a51fe
F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804
F src/where.c d46de821bc604a4fd36fa3928c086950e91aafb1 F src/where.c eb141b075776e9864d38f279333e2472a8653202
F src/whereInt.h d3633e9b592103241b74b0ec76185f3e5b8b62e0 F src/whereInt.h cbe4aa57326998d89e7698ca65bb7c28541d483c
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
F test/aggnested.test b35b4cd69fc913f90d39a575e171e1116c3a4bb7 F test/aggnested.test b35b4cd69fc913f90d39a575e171e1116c3a4bb7
@ -338,7 +339,7 @@ F test/alter4.test c461150723ac957f3b2214aa0b11552cd72023ec
F test/altermalloc.test e81ac9657ed25c6c5bb09bebfa5a047cd8e4acfc F test/altermalloc.test e81ac9657ed25c6c5bb09bebfa5a047cd8e4acfc
F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f
F test/analyze.test 1772936d66471c65221e437b6d1999c3a03166c4 F test/analyze.test 1772936d66471c65221e437b6d1999c3a03166c4
F test/analyze3.test bf41f0f680dd1e0d44eed5e769531e93a5320275 F test/analyze3.test 75b9e42ea1e4edc919250450dc5762186965d4e6
F test/analyze4.test eff2df19b8dd84529966420f29ea52edc6b56213 F test/analyze4.test eff2df19b8dd84529966420f29ea52edc6b56213
F test/analyze5.test 765c4e284aa69ca172772aa940946f55629bc8c4 F test/analyze5.test 765c4e284aa69ca172772aa940946f55629bc8c4
F test/analyze6.test f1c552ce39cca4ec922a7e4e0e5d0203d6b3281f F test/analyze6.test f1c552ce39cca4ec922a7e4e0e5d0203d6b3281f
@ -365,10 +366,10 @@ F test/auth.test 855233ef26eb3601b6886567ea4e326c72959360
F test/auth2.test 264c6af53cad9aba5218c68bbe18036e39007bfa F test/auth2.test 264c6af53cad9aba5218c68bbe18036e39007bfa
F test/auth3.test 5cfa94ed90c6617c42b7ba4b133fd79678b251c7 F test/auth3.test 5cfa94ed90c6617c42b7ba4b133fd79678b251c7
F test/autoinc.test c58912526998a39e11f66b533e23cfabea7f25b7 F test/autoinc.test c58912526998a39e11f66b533e23cfabea7f25b7
F test/autoindex1.test 6ff78b94f43a59616c06c11c55b12935173506d7 F test/autoindex1.test 7008c9f604141fdabe31b7bb95b5ff31b518251f
F test/autoindex2.test af7e595c6864cc6ef5fc38d5db579a3e34940cb8 F test/autoindex2.test af7e595c6864cc6ef5fc38d5db579a3e34940cb8
F test/autoindex3.test a3be0d1a53a7d2edff208a5e442312957047e972 F test/autoindex3.test a3be0d1a53a7d2edff208a5e442312957047e972
F test/autoindex4.test fc807f9efd158bec60f5dfdf34ebe46fb274612d F test/autoindex4.test 49d3cd791a9baa16fb461d7ea3de80d019a819cf
F test/autovacuum.test 941892505d2c0f410a0cb5970dfa1c7c4e5f6e74 F test/autovacuum.test 941892505d2c0f410a0cb5970dfa1c7c4e5f6e74
F test/autovacuum_ioerr2.test 8a367b224183ad801e0e24dcb7d1501f45f244b4 F test/autovacuum_ioerr2.test 8a367b224183ad801e0e24dcb7d1501f45f244b4
F test/avtrans.test 0252654f4295ddda3b2cce0e894812259e655a85 F test/avtrans.test 0252654f4295ddda3b2cce0e894812259e655a85
@ -404,7 +405,7 @@ F test/btreefault.test c2bcb542685eea44621275cfedbd8a13f65201e3
F test/busy.test 76b4887f8b9160ba903c1ac22e8ff406ad6ae2f0 F test/busy.test 76b4887f8b9160ba903c1ac22e8ff406ad6ae2f0
F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de
F test/capi2.test 011c16da245fdc0106a2785035de6b242c05e738 F test/capi2.test 011c16da245fdc0106a2785035de6b242c05e738
F test/capi3.test f0718f4f90d0efdc980119bfbdf1d7f1541ee5ef F test/capi3.test bf6f0308bbbba1e770dac13aa08e5c2ac61c7324
F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4
F test/capi3c.test fdc0d67a2cb8e8fc400d5b7735e330161ea057a2 F test/capi3c.test fdc0d67a2cb8e8fc400d5b7735e330161ea057a2
F test/capi3d.test a82b6321c50a1cfc848e386fa2c851893606f68c F test/capi3d.test a82b6321c50a1cfc848e386fa2c851893606f68c
@ -488,7 +489,7 @@ F test/e_dropview.test 0c9f7f60989164a70a67a9d9c26d1083bc808306
F test/e_expr.test 8f5fdd7261e2d746813b0c6a1c0e34824ad3c5ad F test/e_expr.test 8f5fdd7261e2d746813b0c6a1c0e34824ad3c5ad
F test/e_fkey.test a1783fe1f759e1990e6a11adfcf0702dac4d0707 F test/e_fkey.test a1783fe1f759e1990e6a11adfcf0702dac4d0707
F test/e_fts3.test 5c02288842e4f941896fd44afdef564dd5fc1459 F test/e_fts3.test 5c02288842e4f941896fd44afdef564dd5fc1459
F test/e_insert.test 7b2fa9cd1456f83474d6c5d27db3abaeb8be2023 F test/e_insert.test 0e63edc037afe738bb81a626a676811ed7862c90
F test/e_reindex.test 396b7b4f0a66863b4e95116a67d93b227193e589 F test/e_reindex.test 396b7b4f0a66863b4e95116a67d93b227193e589
F test/e_resolve.test dcce9308fb13b934ce29591105d031d3e14fbba6 F test/e_resolve.test dcce9308fb13b934ce29591105d031d3e14fbba6
F test/e_select.test 52692ff3849541e828ad4661fe3773a9b8711763 F test/e_select.test 52692ff3849541e828ad4661fe3773a9b8711763
@ -497,7 +498,7 @@ F test/e_totalchanges.test b12ee5809d3e63aeb83238dd501a7bca7fd72c10
F test/e_update.test 312cb8f5ccfe41515a6bb092f8ea562a9bd54d52 F test/e_update.test 312cb8f5ccfe41515a6bb092f8ea562a9bd54d52
F test/e_uri.test 5ae33760fb2039c61aa2d90886f1664664173585 F test/e_uri.test 5ae33760fb2039c61aa2d90886f1664664173585
F test/e_vacuum.test 5bfbdc21b65c0abf24398d0ba31dc88d93ca77a9 F test/e_vacuum.test 5bfbdc21b65c0abf24398d0ba31dc88d93ca77a9
F test/e_wal.test 0967f0b8f1dfda871dc7b9b5574198f1f4f7d69a F test/e_wal.test ae9a593207a77d711443ee69ffe081fda9243625
F test/e_walauto.test ca70cf75c07a6cb1874ced101dd426da76625649 F test/e_walauto.test ca70cf75c07a6cb1874ced101dd426da76625649
F test/e_walckpt.test 65e29b6631e51f210f83e4ff11571e647ba93608 F test/e_walckpt.test 65e29b6631e51f210f83e4ff11571e647ba93608
F test/e_walhook.test da3ea8b3483d1af72190337bda50155a91a4b664 F test/e_walhook.test da3ea8b3483d1af72190337bda50155a91a4b664
@ -521,7 +522,7 @@ F test/fkey1.test e1d1fa84cde579185ea01358436839703e415a5b
F test/fkey2.test 1db212cda86b0d3ce72714001f7b6381c321341c F test/fkey2.test 1db212cda86b0d3ce72714001f7b6381c321341c
F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49
F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d
F test/fkey5.test 488601fbda8350619b3029487e56830447056fd2 F test/fkey5.test 56bcb5a6e8b725b17febc267fb041a6695e86853
F test/fkey6.test abb59f866c1b44926fd02d1fdd217d831fe04f48 F test/fkey6.test abb59f866c1b44926fd02d1fdd217d831fe04f48
F test/fkey7.test 72e915890ee4a005daaf3002cb208e8fe973ac13 F test/fkey7.test 72e915890ee4a005daaf3002cb208e8fe973ac13
F test/fkey8.test 8f08203458321e6c19a263829de4cfc936274ab0 F test/fkey8.test 8f08203458321e6c19a263829de4cfc936274ab0
@ -670,9 +671,9 @@ F test/index2.test ee83c6b5e3173a3d7137140d945d9a5d4fdfb9d6
F test/index3.test 55a90cff99834305e8141df7afaef39674b57062 F test/index3.test 55a90cff99834305e8141df7afaef39674b57062
F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6
F test/index5.test 25b0b451aceed4ac5f7d49f856f6de7257470b3e F test/index5.test 25b0b451aceed4ac5f7d49f856f6de7257470b3e
F test/index6.test fb370966ac3cd0989053dd5385757b5c3e24ab6a F test/index6.test 3ae54e53c53f2adcacda269237d8e52bdb05a481
F test/index7.test 917cf1e1c7439bb155abbeabec511b28945e157b F test/index7.test 3d54dce09344c4530ea39a458aa304da044c887a
F test/indexedby.test b2f22f3e693a53813aa3f50b812eb609ba6df1ec F test/indexedby.test 5f527a78bae74c61b8046ae3037f9dfb0bf0c353
F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d
F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7
F test/insert.test 38742b5e9601c8f8d76e9b7555f7270288c2d371 F test/insert.test 38742b5e9601c8f8d76e9b7555f7270288c2d371
@ -706,12 +707,13 @@ F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa
F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff
F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63
F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200
F test/like.test e191e536d0fcd722a6b965e7cd1ee0bfd12a5991 F test/like.test 4f2a71d36a536233727f71995fef900756705e56
F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da
F test/limit.test 3d7df19c35ac672a11f7de406cd3205d592babbb F test/like3.test 7b0525a39e4f25c4fd113de7e2e28eb712dcdedf
F test/limit.test 0c99a27a87b14c646a9d583c7c89fd06c352663e
F test/loadext.test 648cb95f324d1775c54a55c12271b2d1156b633b F test/loadext.test 648cb95f324d1775c54a55c12271b2d1156b633b
F test/loadext2.test 0408380b57adca04004247179837a18e866a74f7 F test/loadext2.test 0408380b57adca04004247179837a18e866a74f7
F test/lock.test 87af515b0c4cf928576d0f89946d67d7c265dfb4 F test/lock.test b984ab9034e7389be0d863fe4e64cbbc4d2028f5
F test/lock2.test 5242d8ac4e2d59c403aebff606af449b455aceff F test/lock2.test 5242d8ac4e2d59c403aebff606af449b455aceff
F test/lock3.test f271375930711ae044080f4fe6d6eda930870d00 F test/lock3.test f271375930711ae044080f4fe6d6eda930870d00
F test/lock4.test e175ae13865bc87680607563bafba21f31a26f12 F test/lock4.test e175ae13865bc87680607563bafba21f31a26f12
@ -770,7 +772,7 @@ F test/mmapfault.test d4c9eff9cd8c2dc14bc43e71e042f175b0a26fe3
F test/multiplex.test efd015ca0b5b4a57dc9535b8feb1273eebeadb60 F test/multiplex.test efd015ca0b5b4a57dc9535b8feb1273eebeadb60
F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a
F test/multiplex3.test d228f59eac91839a977eac19f21d053f03e4d101 F test/multiplex3.test d228f59eac91839a977eac19f21d053f03e4d101
F test/multiplex4.test d3e8a5a522c51cbf3ed1c5b0bd496be02c29d7b1 F test/multiplex4.test e8ae4c4bd70606a5727743241f13b5701990abe4
F test/mutex1.test 78b2b9bb320e51d156c4efdb71b99b051e7a4b41 F test/mutex1.test 78b2b9bb320e51d156c4efdb71b99b051e7a4b41
F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660
F test/nan.test e9648b9d007c7045242af35e11a984d4b169443a F test/nan.test e9648b9d007c7045242af35e11a984d4b169443a
@ -806,8 +808,8 @@ F test/pcache.test b09104b03160aca0d968d99e8cd2c5b1921a993d
F test/pcache2.test a83efe2dec0d392f814bfc998def1d1833942025 F test/pcache2.test a83efe2dec0d392f814bfc998def1d1833942025
F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff
F test/permutations.test 0e2dc2aab7b1043bd2b4404f51651c31da007e52 F test/permutations.test 0e2dc2aab7b1043bd2b4404f51651c31da007e52
F test/pragma.test 66776f48f533c7248d04c1473deb3ebb792daacd F test/pragma.test ad99d05e411c7687302124be56f3b362204be041
F test/pragma2.test aea7b3d82c76034a2df2b38a13745172ddc0bc13 F test/pragma2.test f624a496a95ee878e81e59961eade66d5c00c028
F test/pragma3.test 6f849ccffeee7e496d2f2b5e74152306c0b8757c F test/pragma3.test 6f849ccffeee7e496d2f2b5e74152306c0b8757c
F test/printf.test ec9870c4dce8686a37818e0bf1aba6e6a1863552 F test/printf.test ec9870c4dce8686a37818e0bf1aba6e6a1863552
F test/printf2.test b4acd4bf8734243257f01ddefa17c4fb090acc8a F test/printf2.test b4acd4bf8734243257f01ddefa17c4fb090acc8a
@ -821,7 +823,7 @@ F test/quota2.test 7dc12e08b11cbc4c16c9ba2aa2e040ea8d8ab4b8
F test/quote.test 215897dbe8de1a6f701265836d6601cc6ed103e6 F test/quote.test 215897dbe8de1a6f701265836d6601cc6ed103e6
F test/randexpr1.tcl 40dec52119ed3a2b8b2a773bce24b63a3a746459 F test/randexpr1.tcl 40dec52119ed3a2b8b2a773bce24b63a3a746459
F test/randexpr1.test eda062a97e60f9c38ae8d806b03b0ddf23d796df F test/randexpr1.test eda062a97e60f9c38ae8d806b03b0ddf23d796df
F test/rdonly.test dd30a4858d8e0fbad2304c2bd74a33d4df36412a F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8
F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8
F test/reindex.test 44edd3966b474468b823d481eafef0c305022254 F test/reindex.test 44edd3966b474468b823d481eafef0c305022254
F test/releasetest.tcl b290782d0697b4e83d671da192cd9a7f71e2f6c1 F test/releasetest.tcl b290782d0697b4e83d671da192cd9a7f71e2f6c1
@ -851,7 +853,7 @@ F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5
F test/select1.test fc2a61f226a649393664ad54bc5376631801517c F test/select1.test fc2a61f226a649393664ad54bc5376631801517c
F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56
F test/select3.test 2ce595f8fb8e2ac10071d3b4e424cadd4634a054 F test/select3.test 2ce595f8fb8e2ac10071d3b4e424cadd4634a054
F test/select4.test 8c5a60d439e2df824aed56223566877a883c5c84 F test/select4.test e20e8ce47b558de80616102ef273704cf0d48a3b
F test/select5.test e758b8ef94f69b111df4cb819008856655dcd535 F test/select5.test e758b8ef94f69b111df4cb819008856655dcd535
F test/select6.test 39eac4a5c03650b2b473c532882273283ee8b7a0 F test/select6.test 39eac4a5c03650b2b473c532882273283ee8b7a0
F test/select7.test 7fd2ef598cfabb6b9ff6ac13973b91d0527df49d F test/select7.test 7fd2ef598cfabb6b9ff6ac13973b91d0527df49d
@ -884,7 +886,7 @@ F test/shell4.test 8a9c08976291e6c6c808b4d718f4a8b299f339f5
F test/shell5.test c04e9f9f948305706b88377c464c7f08ce7479f9 F test/shell5.test c04e9f9f948305706b88377c464c7f08ce7479f9
F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3
F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5
F test/shrink.test 8c70f62b6e8eb4d54533de6d65bd06b1b9a17868 F test/shrink.test 06deac10d591186017466ce67d10645150bfdeec
F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329 F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329
F test/skipscan1.test 2ddfe5d168462170c4487f534e2a99fb006b2076 F test/skipscan1.test 2ddfe5d168462170c4487f534e2a99fb006b2076
F test/skipscan2.test d1d1450952b7275f0b0a3a981f0230532743951a F test/skipscan2.test d1d1450952b7275f0b0a3a981f0230532743951a
@ -892,11 +894,11 @@ F test/skipscan3.test ec5bab3f81c7038b43450e7b3062e04a198bdbb5
F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2 F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2
F test/skipscan6.test 5866039d03a56f5bd0b3d172a012074a1d90a15b F test/skipscan6.test 5866039d03a56f5bd0b3d172a012074a1d90a15b
F test/soak.test 0b5b6375c9f4110c828070b826b3b4b0bb65cd5f F test/soak.test 0b5b6375c9f4110c828070b826b3b4b0bb65cd5f
F test/softheap1.test 40562fe6cac6d9827b7b42b86d45aedf12c15e24 F test/softheap1.test 843cd84db9891b2d01b9ab64cef3e9020f98d087
F test/sort.test 3f492e5b7be1d3f756728d2ff6edf4f6091e84cb F test/sort.test 3f492e5b7be1d3f756728d2ff6edf4f6091e84cb
F test/sort2.test 37afbc03f5559f2eb0f18940b55d38dfbb5172ac F test/sort2.test 37afbc03f5559f2eb0f18940b55d38dfbb5172ac
F test/sort3.test 6178ade30810ac9166fcdf14b7065e49c0f534e2 F test/sort3.test 6178ade30810ac9166fcdf14b7065e49c0f534e2
F test/sort4.test d5e8903194ae551551349ce25dc8d0b40ca2b9c3 F test/sort4.test 5c34d9623a4ae5921d956dfa2b70e77ed0fc6e5c
F test/sort5.test a448240a42b49239edc00f85d6d7ac7a1b261e1f F test/sort5.test a448240a42b49239edc00f85d6d7ac7a1b261e1f
F test/sortfault.test d4ccf606a0c77498e2beb542764fd9394acb4d66 F test/sortfault.test d4ccf606a0c77498e2beb542764fd9394acb4d66
F test/speed1.test f2974a91d79f58507ada01864c0e323093065452 F test/speed1.test f2974a91d79f58507ada01864c0e323093065452
@ -909,7 +911,7 @@ F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa
F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b
F test/speedtest1.c 9f1b745c24886cced3f70ffc666300152a39013c F test/speedtest1.c 9f1b745c24886cced3f70ffc666300152a39013c
F test/spellfix.test 24f676831acddd2f4056a598fd731a72c6311f49 F test/spellfix.test 24f676831acddd2f4056a598fd731a72c6311f49
F test/sqllimits1.test 9014524e7ab16e2a4976b13397db4c29cc29c6d9 F test/sqllimits1.test e05786eaed7950ff6a2d00031d001d8a26131e68
F test/stat.test 76fd746b85459e812a0193410fb599f0531f22de F test/stat.test 76fd746b85459e812a0193410fb599f0531f22de
F test/stmt.test 25d64e3dbf9a3ce89558667d7f39d966fe2a71b9 F test/stmt.test 25d64e3dbf9a3ce89558667d7f39d966fe2a71b9
F test/subquery.test 666fdecceac258f5fd84bed09a64e49d9f37edd9 F test/subquery.test 666fdecceac258f5fd84bed09a64e49d9f37edd9
@ -1176,7 +1178,7 @@ F test/where4.test d8420ceeb8323a41ceff1f1841fc528e824e1ecf
F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2 F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2
F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b
F test/where7.test 5a4b0abc207d71da4deecd734ad8579e8dd40aa8 F test/where7.test 5a4b0abc207d71da4deecd734ad8579e8dd40aa8
F test/where8.test 806f1dcec4088be2b826b33f757fe6e17c3236a1 F test/where8.test 2eafe74e01cc10355985874e1ff868ac03dbae5e
F test/where8m.test da346596e19d54f0aba35ebade032a7c47d79739 F test/where8m.test da346596e19d54f0aba35ebade032a7c47d79739
F test/where9.test 729c3ba9b47e8f9f1aab96bae7dad2a524f1d1a2 F test/where9.test 729c3ba9b47e8f9f1aab96bae7dad2a524f1d1a2
F test/whereA.test 4d253178d135ec46d1671e440cd8f2b916aa6e6b F test/whereA.test 4d253178d135ec46d1671e440cd8f2b916aa6e6b
@ -1225,7 +1227,7 @@ F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e
F tool/mkpragmatab.tcl 94f196c9961e0ca3513e29f57125a3197808be2d F tool/mkpragmatab.tcl 94f196c9961e0ca3513e29f57125a3197808be2d
F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97
F tool/mksqlite3c-noext.tcl 9ef48e1748dce7b844f67e2450ff9dfeb0fb4ab5 F tool/mksqlite3c-noext.tcl 9ef48e1748dce7b844f67e2450ff9dfeb0fb4ab5
F tool/mksqlite3c.tcl 262e7e3d39df25af10c8aef2163f3a0cc133814c F tool/mksqlite3c.tcl e885509e1a95e6468b734ca5c2b5886248758a3c
F tool/mksqlite3h.tcl ba24038056f51fde07c0079c41885ab85e2cff12 F tool/mksqlite3h.tcl ba24038056f51fde07c0079c41885ab85e2cff12
F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b
F tool/mkvsix.tcl 52a4c613707ac34ae9c226e5ccc69cb948556105 F tool/mkvsix.tcl 52a4c613707ac34ae9c226e5ccc69cb948556105
@ -1258,7 +1260,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P 158c1a48818a9abc001b9ea547167c2624a7bad3 P 46119e8d8e391d8dea844352521b58415f7365b1 984c3fd5261619fb542a5a95dab37707b5d79dbf
R 7821567dbf824c3a63e6bcb2750b28bb R cedac19b028b57bfd6e4b6a8dc32f35d
U dan U drh
Z 8ad790ee74643fcdb7735e278f227f09 Z a1b922ecd928e4798569ef4c1738d815

View File

@ -1 +1 @@
46119e8d8e391d8dea844352521b58415f7365b1 5489cb68921f62f10d832adbc4d19ea8c6c5da50

View File

@ -1650,6 +1650,11 @@ void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
** then set aWc[0] through aWc[2] to the wildcard characters and ** then set aWc[0] through aWc[2] to the wildcard characters and
** return TRUE. If the function is not a LIKE-style function then ** return TRUE. If the function is not a LIKE-style function then
** return FALSE. ** return FALSE.
**
** *pIsNocase is set to true if uppercase and lowercase are equivalent for
** the function (default for LIKE). If the function makes the distinction
** between uppercase and lowercase (as does GLOB) then *pIsNocase is set to
** false.
*/ */
int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){ int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
FuncDef *pDef; FuncDef *pDef;

View File

@ -340,26 +340,28 @@ int sqlite3_config(int op, ...){
*/ */
#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-54466-46756 */ #if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-54466-46756 */
case SQLITE_CONFIG_SINGLETHREAD: { case SQLITE_CONFIG_SINGLETHREAD: {
/* Disable all mutexing */ /* EVIDENCE-OF: R-02748-19096 This option sets the threading mode to
sqlite3GlobalConfig.bCoreMutex = 0; ** Single-thread. */
sqlite3GlobalConfig.bFullMutex = 0; sqlite3GlobalConfig.bCoreMutex = 0; /* Disable mutex on core */
sqlite3GlobalConfig.bFullMutex = 0; /* Disable mutex on connections */
break; break;
} }
#endif #endif
#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-20520-54086 */ #if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-20520-54086 */
case SQLITE_CONFIG_MULTITHREAD: { case SQLITE_CONFIG_MULTITHREAD: {
/* Disable mutexing of database connections */ /* EVIDENCE-OF: R-14374-42468 This option sets the threading mode to
/* Enable mutexing of core data structures */ ** Multi-thread. */
sqlite3GlobalConfig.bCoreMutex = 1; sqlite3GlobalConfig.bCoreMutex = 1; /* Enable mutex on core */
sqlite3GlobalConfig.bFullMutex = 0; sqlite3GlobalConfig.bFullMutex = 0; /* Disable mutex on connections */
break; break;
} }
#endif #endif
#if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-59593-21810 */ #if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-59593-21810 */
case SQLITE_CONFIG_SERIALIZED: { case SQLITE_CONFIG_SERIALIZED: {
/* Enable all mutexing */ /* EVIDENCE-OF: R-41220-51800 This option sets the threading mode to
sqlite3GlobalConfig.bCoreMutex = 1; ** Serialized. */
sqlite3GlobalConfig.bFullMutex = 1; sqlite3GlobalConfig.bCoreMutex = 1; /* Enable mutex on core */
sqlite3GlobalConfig.bFullMutex = 1; /* Enable mutex on connections */
break; break;
} }
#endif #endif
@ -471,7 +473,8 @@ int sqlite3_config(int op, ...){
case SQLITE_CONFIG_HEAP: { case SQLITE_CONFIG_HEAP: {
/* EVIDENCE-OF: R-19854-42126 There are three arguments to /* EVIDENCE-OF: R-19854-42126 There are three arguments to
** SQLITE_CONFIG_HEAP: An 8-byte aligned pointer to the memory, the ** SQLITE_CONFIG_HEAP: An 8-byte aligned pointer to the memory, the
** number of bytes in the memory buffer, and the minimum allocation size. */ ** number of bytes in the memory buffer, and the minimum allocation size.
*/
sqlite3GlobalConfig.pHeap = va_arg(ap, void*); sqlite3GlobalConfig.pHeap = va_arg(ap, void*);
sqlite3GlobalConfig.nHeap = va_arg(ap, int); sqlite3GlobalConfig.nHeap = va_arg(ap, int);
sqlite3GlobalConfig.mnReq = va_arg(ap, int); sqlite3GlobalConfig.mnReq = va_arg(ap, int);
@ -576,7 +579,9 @@ int sqlite3_config(int op, ...){
** compile-time maximum mmap size set by the SQLITE_MAX_MMAP_SIZE ** compile-time maximum mmap size set by the SQLITE_MAX_MMAP_SIZE
** compile-time option. ** compile-time option.
*/ */
if( mxMmap<0 || mxMmap>SQLITE_MAX_MMAP_SIZE ) mxMmap = SQLITE_MAX_MMAP_SIZE; if( mxMmap<0 || mxMmap>SQLITE_MAX_MMAP_SIZE ){
mxMmap = SQLITE_MAX_MMAP_SIZE;
}
if( szMmap<0 ) szMmap = SQLITE_DEFAULT_MMAP_SIZE; if( szMmap<0 ) szMmap = SQLITE_DEFAULT_MMAP_SIZE;
if( szMmap>mxMmap) szMmap = mxMmap; if( szMmap>mxMmap) szMmap = mxMmap;
sqlite3GlobalConfig.mxMmap = mxMmap; sqlite3GlobalConfig.mxMmap = mxMmap;
@ -2420,7 +2425,19 @@ int sqlite3ParseUri(
if( !zFile ) return SQLITE_NOMEM; if( !zFile ) return SQLITE_NOMEM;
iIn = 5; iIn = 5;
#ifndef SQLITE_ALLOW_URI_AUTHORITY #ifdef SQLITE_ALLOW_URI_AUTHORITY
if( strncmp(zUri+5, "///", 3)==0 ){
iIn = 7;
/* The following condition causes URIs with five leading / characters
** like file://///host/path to be converted into UNCs like //host/path.
** The correct URI for that UNC has only two or four leading / characters
** file://host/path or file:////host/path. But 5 leading slashes is a
** common error, we are told, so we handle it as a special case. */
if( strncmp(zUri+7, "///", 3)==0 ){ iIn++; }
}else if( strncmp(zUri+5, "//localhost/", 12)==0 ){
iIn = 16;
}
#else
/* Discard the scheme and authority segments of the URI. */ /* Discard the scheme and authority segments of the URI. */
if( zUri[5]=='/' && zUri[6]=='/' ){ if( zUri[5]=='/' && zUri[6]=='/' ){
iIn = 7; iIn = 7;
@ -2863,7 +2880,8 @@ static int openDatabase(
opendb_out: opendb_out:
sqlite3_free(zOpen); sqlite3_free(zOpen);
if( db ){ if( db ){
assert( db->mutex!=0 || isThreadsafe==0 || sqlite3GlobalConfig.bFullMutex==0 ); assert( db->mutex!=0 || isThreadsafe==0
|| sqlite3GlobalConfig.bFullMutex==0 );
sqlite3_mutex_leave(db->mutex); sqlite3_mutex_leave(db->mutex);
} }
rc = sqlite3_errcode(db); rc = sqlite3_errcode(db);
@ -3617,8 +3635,8 @@ int sqlite3_test_control(int op, ...){
** table should connect. ** table should connect.
** **
** Enable imposter mode only when the schema has already been parsed. Then ** Enable imposter mode only when the schema has already been parsed. Then
** run a single CREATE TABLE statement to construct the imposter table in the ** run a single CREATE TABLE statement to construct the imposter table in
** parsed schema. Then turn imposter mode back off again. ** the parsed schema. Then turn imposter mode back off again.
** **
** If onOff==0 and tnum>0 then reset the schema for all databases, causing ** If onOff==0 and tnum>0 then reset the schema for all databases, causing
** the schema to be reparsed the next time it is needed. This has the ** the schema to be reparsed the next time it is needed. This has the

View File

@ -194,8 +194,8 @@ static sqlite3_mutex *winMutexAlloc(int iType){
case SQLITE_MUTEX_RECURSIVE: { case SQLITE_MUTEX_RECURSIVE: {
p = sqlite3MallocZero( sizeof(*p) ); p = sqlite3MallocZero( sizeof(*p) );
if( p ){ if( p ){
#ifdef SQLITE_DEBUG
p->id = iType; p->id = iType;
#ifdef SQLITE_DEBUG
#ifdef SQLITE_WIN32_MUTEX_TRACE_DYNAMIC #ifdef SQLITE_WIN32_MUTEX_TRACE_DYNAMIC
p->trace = 1; p->trace = 1;
#endif #endif
@ -216,8 +216,8 @@ static sqlite3_mutex *winMutexAlloc(int iType){
} }
#endif #endif
p = &winMutex_staticMutexes[iType-2]; p = &winMutex_staticMutexes[iType-2];
#ifdef SQLITE_DEBUG
p->id = iType; p->id = iType;
#ifdef SQLITE_DEBUG
#ifdef SQLITE_WIN32_MUTEX_TRACE_STATIC #ifdef SQLITE_WIN32_MUTEX_TRACE_STATIC
p->trace = 1; p->trace = 1;
#endif #endif

View File

@ -71,18 +71,6 @@
# endif # endif
#endif #endif
/*
** Define the OS_VXWORKS pre-processor macro to 1 if building on
** vxworks, or 0 otherwise.
*/
#ifndef OS_VXWORKS
# if defined(__RTP__) || defined(_WRS_KERNEL)
# define OS_VXWORKS 1
# else
# define OS_VXWORKS 0
# endif
#endif
/* /*
** standard include files. ** standard include files.
*/ */
@ -97,18 +85,19 @@
# include <sys/mman.h> # include <sys/mman.h>
#endif #endif
#if SQLITE_ENABLE_LOCKING_STYLE || OS_VXWORKS #if SQLITE_ENABLE_LOCKING_STYLE
# include <sys/ioctl.h> # include <sys/ioctl.h>
# if OS_VXWORKS
# include <semaphore.h>
# include <limits.h>
# else
# include <sys/file.h> # include <sys/file.h>
# include <sys/param.h> # include <sys/param.h>
# endif
#endif /* SQLITE_ENABLE_LOCKING_STYLE */ #endif /* SQLITE_ENABLE_LOCKING_STYLE */
#if defined(__APPLE__) || (SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS) #if OS_VXWORKS
# include <sys/ioctl.h>
# include <semaphore.h>
# include <limits.h>
#endif /* OS_VXWORKS */
#if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE
# include <sys/mount.h> # include <sys/mount.h>
#endif #endif
@ -149,6 +138,10 @@
*/ */
#define MAX_PATHNAME 512 #define MAX_PATHNAME 512
/* Always cast the getpid() return type for compatibility with
** kernel modules in VxWorks. */
#define osGetpid(X) (pid_t)getpid()
/* /*
** Only set the lastErrno if the error code is a real error and not ** Only set the lastErrno if the error code is a real error and not
** a normal expected return code of SQLITE_BUSY or SQLITE_OK ** a normal expected return code of SQLITE_BUSY or SQLITE_OK
@ -237,7 +230,7 @@ struct unixFile {
** method was called. If xOpen() is called from a different process id, ** method was called. If xOpen() is called from a different process id,
** indicating that a fork() has occurred, the PRNG will be reset. ** indicating that a fork() has occurred, the PRNG will be reset.
*/ */
static int randomnessPid = 0; static pid_t randomnessPid = 0;
/* /*
** Allowed values for the unixFile.ctrlFlags bitmask: ** Allowed values for the unixFile.ctrlFlags bitmask:
@ -385,7 +378,7 @@ static struct unix_syscall {
{ "read", (sqlite3_syscall_ptr)read, 0 }, { "read", (sqlite3_syscall_ptr)read, 0 },
#define osRead ((ssize_t(*)(int,void*,size_t))aSyscall[8].pCurrent) #define osRead ((ssize_t(*)(int,void*,size_t))aSyscall[8].pCurrent)
#if defined(USE_PREAD) || (SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS) #if defined(USE_PREAD) || SQLITE_ENABLE_LOCKING_STYLE
{ "pread", (sqlite3_syscall_ptr)pread, 0 }, { "pread", (sqlite3_syscall_ptr)pread, 0 },
#else #else
{ "pread", (sqlite3_syscall_ptr)0, 0 }, { "pread", (sqlite3_syscall_ptr)0, 0 },
@ -402,7 +395,7 @@ static struct unix_syscall {
{ "write", (sqlite3_syscall_ptr)write, 0 }, { "write", (sqlite3_syscall_ptr)write, 0 },
#define osWrite ((ssize_t(*)(int,const void*,size_t))aSyscall[11].pCurrent) #define osWrite ((ssize_t(*)(int,const void*,size_t))aSyscall[11].pCurrent)
#if defined(USE_PREAD) || (SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS) #if defined(USE_PREAD) || SQLITE_ENABLE_LOCKING_STYLE
{ "pwrite", (sqlite3_syscall_ptr)pwrite, 0 }, { "pwrite", (sqlite3_syscall_ptr)pwrite, 0 },
#else #else
{ "pwrite", (sqlite3_syscall_ptr)0, 0 }, { "pwrite", (sqlite3_syscall_ptr)0, 0 },
@ -1541,7 +1534,8 @@ static int unixLock(sqlite3_file *id, int eFileLock){
assert( pFile ); assert( pFile );
OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h, OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h,
azFileLock(eFileLock), azFileLock(pFile->eFileLock), azFileLock(eFileLock), azFileLock(pFile->eFileLock),
azFileLock(pFile->pInode->eFileLock), pFile->pInode->nShared , getpid())); azFileLock(pFile->pInode->eFileLock), pFile->pInode->nShared,
osGetpid()));
/* If there is already a lock of this type or more restrictive on the /* If there is already a lock of this type or more restrictive on the
** unixFile, do nothing. Don't use the end_lock: exit path, as ** unixFile, do nothing. Don't use the end_lock: exit path, as
@ -1749,7 +1743,7 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){
assert( pFile ); assert( pFile );
OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (unix)\n", pFile->h, eFileLock, OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (unix)\n", pFile->h, eFileLock,
pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared, pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared,
getpid())); osGetpid()));
assert( eFileLock<=SHARED_LOCK ); assert( eFileLock<=SHARED_LOCK );
if( pFile->eFileLock<=eFileLock ){ if( pFile->eFileLock<=eFileLock ){
@ -2176,7 +2170,7 @@ static int dotlockUnlock(sqlite3_file *id, int eFileLock) {
assert( pFile ); assert( pFile );
OSTRACE(("UNLOCK %d %d was %d pid=%d (dotlock)\n", pFile->h, eFileLock, OSTRACE(("UNLOCK %d %d was %d pid=%d (dotlock)\n", pFile->h, eFileLock,
pFile->eFileLock, getpid())); pFile->eFileLock, osGetpid()));
assert( eFileLock<=SHARED_LOCK ); assert( eFileLock<=SHARED_LOCK );
/* no-op if possible */ /* no-op if possible */
@ -2239,10 +2233,9 @@ static int dotlockClose(sqlite3_file *id) {
** still works when you do this, but concurrency is reduced since ** still works when you do this, but concurrency is reduced since
** only a single process can be reading the database at a time. ** only a single process can be reading the database at a time.
** **
** Omit this section if SQLITE_ENABLE_LOCKING_STYLE is turned off or if ** Omit this section if SQLITE_ENABLE_LOCKING_STYLE is turned off
** compiling for VXWORKS.
*/ */
#if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS #if SQLITE_ENABLE_LOCKING_STYLE
/* /*
** Retry flock() calls that fail with EINTR ** Retry flock() calls that fail with EINTR
@ -2395,7 +2388,7 @@ static int flockUnlock(sqlite3_file *id, int eFileLock) {
assert( pFile ); assert( pFile );
OSTRACE(("UNLOCK %d %d was %d pid=%d (flock)\n", pFile->h, eFileLock, OSTRACE(("UNLOCK %d %d was %d pid=%d (flock)\n", pFile->h, eFileLock,
pFile->eFileLock, getpid())); pFile->eFileLock, osGetpid()));
assert( eFileLock<=SHARED_LOCK ); assert( eFileLock<=SHARED_LOCK );
/* no-op if possible */ /* no-op if possible */
@ -2456,7 +2449,7 @@ static int flockClose(sqlite3_file *id) {
** to a non-zero value otherwise *pResOut is set to zero. The return value ** to a non-zero value otherwise *pResOut is set to zero. The return value
** is set to SQLITE_OK unless an I/O error occurs during lock checking. ** is set to SQLITE_OK unless an I/O error occurs during lock checking.
*/ */
static int semCheckReservedLock(sqlite3_file *id, int *pResOut) { static int semXCheckReservedLock(sqlite3_file *id, int *pResOut) {
int rc = SQLITE_OK; int rc = SQLITE_OK;
int reserved = 0; int reserved = 0;
unixFile *pFile = (unixFile*)id; unixFile *pFile = (unixFile*)id;
@ -2523,7 +2516,7 @@ static int semCheckReservedLock(sqlite3_file *id, int *pResOut) {
** This routine will only increase a lock. Use the sqlite3OsUnlock() ** This routine will only increase a lock. Use the sqlite3OsUnlock()
** routine to lower a locking level. ** routine to lower a locking level.
*/ */
static int semLock(sqlite3_file *id, int eFileLock) { static int semXLock(sqlite3_file *id, int eFileLock) {
unixFile *pFile = (unixFile*)id; unixFile *pFile = (unixFile*)id;
sem_t *pSem = pFile->pInode->pSem; sem_t *pSem = pFile->pInode->pSem;
int rc = SQLITE_OK; int rc = SQLITE_OK;
@ -2556,14 +2549,14 @@ static int semLock(sqlite3_file *id, int eFileLock) {
** If the locking level of the file descriptor is already at or below ** If the locking level of the file descriptor is already at or below
** the requested locking level, this routine is a no-op. ** the requested locking level, this routine is a no-op.
*/ */
static int semUnlock(sqlite3_file *id, int eFileLock) { static int semXUnlock(sqlite3_file *id, int eFileLock) {
unixFile *pFile = (unixFile*)id; unixFile *pFile = (unixFile*)id;
sem_t *pSem = pFile->pInode->pSem; sem_t *pSem = pFile->pInode->pSem;
assert( pFile ); assert( pFile );
assert( pSem ); assert( pSem );
OSTRACE(("UNLOCK %d %d was %d pid=%d (sem)\n", pFile->h, eFileLock, OSTRACE(("UNLOCK %d %d was %d pid=%d (sem)\n", pFile->h, eFileLock,
pFile->eFileLock, getpid())); pFile->eFileLock, osGetpid()));
assert( eFileLock<=SHARED_LOCK ); assert( eFileLock<=SHARED_LOCK );
/* no-op if possible */ /* no-op if possible */
@ -2593,10 +2586,10 @@ static int semUnlock(sqlite3_file *id, int eFileLock) {
/* /*
** Close a file. ** Close a file.
*/ */
static int semClose(sqlite3_file *id) { static int semXClose(sqlite3_file *id) {
if( id ){ if( id ){
unixFile *pFile = (unixFile*)id; unixFile *pFile = (unixFile*)id;
semUnlock(id, NO_LOCK); semXUnlock(id, NO_LOCK);
assert( pFile ); assert( pFile );
unixEnterMutex(); unixEnterMutex();
releaseInodeInfo(pFile); releaseInodeInfo(pFile);
@ -2777,7 +2770,7 @@ static int afpLock(sqlite3_file *id, int eFileLock){
assert( pFile ); assert( pFile );
OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (afp)\n", pFile->h, OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (afp)\n", pFile->h,
azFileLock(eFileLock), azFileLock(pFile->eFileLock), azFileLock(eFileLock), azFileLock(pFile->eFileLock),
azFileLock(pInode->eFileLock), pInode->nShared , getpid())); azFileLock(pInode->eFileLock), pInode->nShared , osGetpid()));
/* If there is already a lock of this type or more restrictive on the /* If there is already a lock of this type or more restrictive on the
** unixFile, do nothing. Don't use the afp_end_lock: exit path, as ** unixFile, do nothing. Don't use the afp_end_lock: exit path, as
@ -2963,7 +2956,7 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) {
assert( pFile ); assert( pFile );
OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (afp)\n", pFile->h, eFileLock, OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (afp)\n", pFile->h, eFileLock,
pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared, pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared,
getpid())); osGetpid()));
assert( eFileLock<=SHARED_LOCK ); assert( eFileLock<=SHARED_LOCK );
if( pFile->eFileLock<=eFileLock ){ if( pFile->eFileLock<=eFileLock ){
@ -4002,7 +3995,9 @@ static int unixDeviceCharacteristics(sqlite3_file *id){
** Instead, it should be called via macro osGetpagesize(). ** Instead, it should be called via macro osGetpagesize().
*/ */
static int unixGetpagesize(void){ static int unixGetpagesize(void){
#if defined(_BSD_SOURCE) #if OS_VXWORKS
return 1024;
#elif defined(_BSD_SOURCE)
return getpagesize(); return getpagesize();
#else #else
return (int)sysconf(_SC_PAGESIZE); return (int)sysconf(_SC_PAGESIZE);
@ -4631,7 +4626,7 @@ static int unixShmLock(
} }
sqlite3_mutex_leave(pShmNode->mutex); sqlite3_mutex_leave(pShmNode->mutex);
OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x\n", OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x\n",
p->id, getpid(), p->sharedMask, p->exclMask)); p->id, osGetpid(), p->sharedMask, p->exclMask));
return rc; return rc;
} }
@ -5034,7 +5029,7 @@ IOMETHODS(
0 /* xShmMap method */ 0 /* xShmMap method */
) )
#if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS #if SQLITE_ENABLE_LOCKING_STYLE
IOMETHODS( IOMETHODS(
flockIoFinder, /* Finder function name */ flockIoFinder, /* Finder function name */
flockIoMethods, /* sqlite3_io_methods object name */ flockIoMethods, /* sqlite3_io_methods object name */
@ -5052,10 +5047,10 @@ IOMETHODS(
semIoFinder, /* Finder function name */ semIoFinder, /* Finder function name */
semIoMethods, /* sqlite3_io_methods object name */ semIoMethods, /* sqlite3_io_methods object name */
1, /* shared memory is disabled */ 1, /* shared memory is disabled */
semClose, /* xClose method */ semXClose, /* xClose method */
semLock, /* xLock method */ semXLock, /* xLock method */
semUnlock, /* xUnlock method */ semXUnlock, /* xUnlock method */
semCheckReservedLock, /* xCheckReservedLock method */ semXCheckReservedLock, /* xCheckReservedLock method */
0 /* xShmMap method */ 0 /* xShmMap method */
) )
#endif #endif
@ -5179,15 +5174,13 @@ static const sqlite3_io_methods
#endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ #endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */
#if OS_VXWORKS && SQLITE_ENABLE_LOCKING_STYLE #if OS_VXWORKS
/* /*
** This "finder" function attempts to determine the best locking strategy ** This "finder" function for VxWorks checks to see if posix advisory
** for the database file "filePath". It then returns the sqlite3_io_methods ** locking works. If it does, then that is what is used. If it does not
** object that implements that strategy. ** work, then fallback to named semaphore locking.
**
** This is for VXWorks only.
*/ */
static const sqlite3_io_methods *autolockIoFinderImpl( static const sqlite3_io_methods *vxworksIoFinderImpl(
const char *filePath, /* name of the database file */ const char *filePath, /* name of the database file */
unixFile *pNew /* the open file object */ unixFile *pNew /* the open file object */
){ ){
@ -5213,9 +5206,9 @@ static const sqlite3_io_methods *autolockIoFinderImpl(
} }
} }
static const sqlite3_io_methods static const sqlite3_io_methods
*(*const autolockIoFinder)(const char*,unixFile*) = autolockIoFinderImpl; *(*const vxworksIoFinder)(const char*,unixFile*) = vxworksIoFinderImpl;
#endif /* OS_VXWORKS && SQLITE_ENABLE_LOCKING_STYLE */ #endif /* OS_VXWORKS */
/* /*
** An abstract type for a pointer to an IO method finder function: ** An abstract type for a pointer to an IO method finder function:
@ -5728,8 +5721,8 @@ static int unixOpen(
** the same instant might all reset the PRNG. But multiple resets ** the same instant might all reset the PRNG. But multiple resets
** are harmless. ** are harmless.
*/ */
if( randomnessPid!=getpid() ){ if( randomnessPid!=osGetpid() ){
randomnessPid = getpid(); randomnessPid = osGetpid();
sqlite3_randomness(0,0); sqlite3_randomness(0,0);
} }
@ -6120,7 +6113,7 @@ static int unixRandomness(sqlite3_vfs *NotUsed, int nBuf, char *zBuf){
** tests repeatable. ** tests repeatable.
*/ */
memset(zBuf, 0, nBuf); memset(zBuf, 0, nBuf);
randomnessPid = getpid(); randomnessPid = osGetpid();
#if !defined(SQLITE_TEST) #if !defined(SQLITE_TEST)
{ {
int fd, got; int fd, got;
@ -6441,7 +6434,7 @@ static int proxyGetLockPath(const char *dbPath, char *lPath, size_t maxLen){
{ {
if( !confstr(_CS_DARWIN_USER_TEMP_DIR, lPath, maxLen) ){ if( !confstr(_CS_DARWIN_USER_TEMP_DIR, lPath, maxLen) ){
OSTRACE(("GETLOCKPATH failed %s errno=%d pid=%d\n", OSTRACE(("GETLOCKPATH failed %s errno=%d pid=%d\n",
lPath, errno, getpid())); lPath, errno, osGetpid()));
return SQLITE_IOERR_LOCK; return SQLITE_IOERR_LOCK;
} }
len = strlcat(lPath, "sqliteplocks", maxLen); len = strlcat(lPath, "sqliteplocks", maxLen);
@ -6463,7 +6456,7 @@ static int proxyGetLockPath(const char *dbPath, char *lPath, size_t maxLen){
} }
lPath[i+len]='\0'; lPath[i+len]='\0';
strlcat(lPath, ":auto:", maxLen); strlcat(lPath, ":auto:", maxLen);
OSTRACE(("GETLOCKPATH proxy lock path=%s pid=%d\n", lPath, getpid())); OSTRACE(("GETLOCKPATH proxy lock path=%s pid=%d\n", lPath, osGetpid()));
return SQLITE_OK; return SQLITE_OK;
} }
@ -6490,7 +6483,7 @@ static int proxyCreateLockPath(const char *lockPath){
if( err!=EEXIST ) { if( err!=EEXIST ) {
OSTRACE(("CREATELOCKPATH FAILED creating %s, " OSTRACE(("CREATELOCKPATH FAILED creating %s, "
"'%s' proxy lock path=%s pid=%d\n", "'%s' proxy lock path=%s pid=%d\n",
buf, strerror(err), lockPath, getpid())); buf, strerror(err), lockPath, osGetpid()));
return err; return err;
} }
} }
@ -6499,7 +6492,7 @@ static int proxyCreateLockPath(const char *lockPath){
} }
buf[i] = lockPath[i]; buf[i] = lockPath[i];
} }
OSTRACE(("CREATELOCKPATH proxy lock path=%s pid=%d\n", lockPath, getpid())); OSTRACE(("CREATELOCKPATH proxy lock path=%s pid=%d\n", lockPath, osGetpid()));
return 0; return 0;
} }
@ -6804,7 +6797,8 @@ static int proxyTakeConch(unixFile *pFile){
int forceNewLockPath = 0; int forceNewLockPath = 0;
OSTRACE(("TAKECONCH %d for %s pid=%d\n", conchFile->h, OSTRACE(("TAKECONCH %d for %s pid=%d\n", conchFile->h,
(pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), getpid())); (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"),
osGetpid()));
rc = proxyGetHostID(myHostID, &pError); rc = proxyGetHostID(myHostID, &pError);
if( (rc&0xff)==SQLITE_IOERR ){ if( (rc&0xff)==SQLITE_IOERR ){
@ -7014,7 +7008,7 @@ static int proxyReleaseConch(unixFile *pFile){
conchFile = pCtx->conchFile; conchFile = pCtx->conchFile;
OSTRACE(("RELEASECONCH %d for %s pid=%d\n", conchFile->h, OSTRACE(("RELEASECONCH %d for %s pid=%d\n", conchFile->h,
(pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"),
getpid())); osGetpid()));
if( pCtx->conchHeld>0 ){ if( pCtx->conchHeld>0 ){
rc = conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK); rc = conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK);
} }
@ -7156,7 +7150,7 @@ static int proxyTransformUnixFile(unixFile *pFile, const char *path) {
} }
OSTRACE(("TRANSPROXY %d for %s pid=%d\n", pFile->h, OSTRACE(("TRANSPROXY %d for %s pid=%d\n", pFile->h,
(lockPath ? lockPath : ":auto:"), getpid())); (lockPath ? lockPath : ":auto:"), osGetpid()));
pCtx = sqlite3_malloc( sizeof(*pCtx) ); pCtx = sqlite3_malloc( sizeof(*pCtx) );
if( pCtx==0 ){ if( pCtx==0 ){
@ -7497,8 +7491,10 @@ int sqlite3_os_init(void){
** array cannot be const. ** array cannot be const.
*/ */
static sqlite3_vfs aVfs[] = { static sqlite3_vfs aVfs[] = {
#if SQLITE_ENABLE_LOCKING_STYLE && (OS_VXWORKS || defined(__APPLE__)) #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
UNIXVFS("unix", autolockIoFinder ), UNIXVFS("unix", autolockIoFinder ),
#elif OS_VXWORKS
UNIXVFS("unix", vxworksIoFinder ),
#else #else
UNIXVFS("unix", posixIoFinder ), UNIXVFS("unix", posixIoFinder ),
#endif #endif
@ -7508,11 +7504,11 @@ int sqlite3_os_init(void){
#if OS_VXWORKS #if OS_VXWORKS
UNIXVFS("unix-namedsem", semIoFinder ), UNIXVFS("unix-namedsem", semIoFinder ),
#endif #endif
#if SQLITE_ENABLE_LOCKING_STYLE #if SQLITE_ENABLE_LOCKING_STYLE || OS_VXWORKS
UNIXVFS("unix-posix", posixIoFinder ), UNIXVFS("unix-posix", posixIoFinder ),
#if !OS_VXWORKS
UNIXVFS("unix-flock", flockIoFinder ),
#endif #endif
#if SQLITE_ENABLE_LOCKING_STYLE
UNIXVFS("unix-flock", flockIoFinder ),
#endif #endif
#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
UNIXVFS("unix-afp", afpIoFinder ), UNIXVFS("unix-afp", afpIoFinder ),

View File

@ -114,12 +114,20 @@ static void pcacheUnpin(PgHdr *p){
} }
/* /*
** Compute the number of pages of cache requested. ** Compute the number of pages of cache requested. p->szCache is the
** cache size requested by the "PRAGMA cache_size" statement.
**
**
*/ */
static int numberOfCachePages(PCache *p){ static int numberOfCachePages(PCache *p){
if( p->szCache>=0 ){ if( p->szCache>=0 ){
/* IMPLEMENTATION-OF: R-42059-47211 If the argument N is positive then the
** suggested cache size is set to N. */
return p->szCache; return p->szCache;
}else{ }else{
/* IMPLEMENTATION-OF: R-61436-13639 If the argument N is negative, then
** the number of cache pages is adjusted to use approximately abs(N*1024)
** bytes of memory. */
return (int)((-1024*(i64)p->szCache)/(p->szPage+p->szExtra)); return (int)((-1024*(i64)p->szCache)/(p->szPage+p->szExtra));
} }
} }

View File

@ -317,6 +317,17 @@ void sqlite3Pragma(
/* Send an SQLITE_FCNTL_PRAGMA file-control to the underlying VFS /* Send an SQLITE_FCNTL_PRAGMA file-control to the underlying VFS
** connection. If it returns SQLITE_OK, then assume that the VFS ** connection. If it returns SQLITE_OK, then assume that the VFS
** handled the pragma and generate a no-op prepared statement. ** handled the pragma and generate a no-op prepared statement.
**
** IMPLEMENTATION-OF: R-12238-55120 Whenever a PRAGMA statement is parsed,
** an SQLITE_FCNTL_PRAGMA file control is sent to the open sqlite3_file
** object corresponding to the database file to which the pragma
** statement refers.
**
** IMPLEMENTATION-OF: R-29875-31678 The argument to the SQLITE_FCNTL_PRAGMA
** file control is an array of pointers to strings (char**) in which the
** second element of the array is the name of the pragma and the third
** element is the argument to the pragma or NULL if the pragma has no
** argument.
*/ */
aFcntl[0] = 0; aFcntl[0] = 0;
aFcntl[1] = zLeft; aFcntl[1] = zLeft;
@ -1077,17 +1088,27 @@ void sqlite3Pragma(
pIdx = sqlite3FindIndex(db, zRight, zDb); pIdx = sqlite3FindIndex(db, zRight, zDb);
if( pIdx ){ if( pIdx ){
int i; int i;
int mx = pPragma->iArg ? pIdx->nColumn : pIdx->nKeyCol; int mx;
pTab = pIdx->pTable; if( pPragma->iArg ){
sqlite3VdbeSetNumCols(v, 6); /* PRAGMA index_xinfo (newer version with more rows and columns) */
mx = pIdx->nColumn;
pParse->nMem = 6; pParse->nMem = 6;
}else{
/* PRAGMA index_info (legacy version) */
mx = pIdx->nKeyCol;
pParse->nMem = 3;
}
pTab = pIdx->pTable;
sqlite3VdbeSetNumCols(v, pParse->nMem);
sqlite3CodeVerifySchema(pParse, iDb); sqlite3CodeVerifySchema(pParse, iDb);
sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seqno", SQLITE_STATIC); sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seqno", SQLITE_STATIC);
sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "cid", SQLITE_STATIC); sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "cid", SQLITE_STATIC);
sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "name", SQLITE_STATIC); sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "name", SQLITE_STATIC);
if( pPragma->iArg ){
sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "desc", SQLITE_STATIC); sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "desc", SQLITE_STATIC);
sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "coll", SQLITE_STATIC); sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "coll", SQLITE_STATIC);
sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "key", SQLITE_STATIC); sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "key", SQLITE_STATIC);
}
for(i=0; i<mx; i++){ for(i=0; i<mx; i++){
i16 cnum = pIdx->aiColumn[i]; i16 cnum = pIdx->aiColumn[i];
sqlite3VdbeAddOp2(v, OP_Integer, i, 1); sqlite3VdbeAddOp2(v, OP_Integer, i, 1);
@ -1097,10 +1118,12 @@ void sqlite3Pragma(
}else{ }else{
sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pTab->aCol[cnum].zName, 0); sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pTab->aCol[cnum].zName, 0);
} }
if( pPragma->iArg ){
sqlite3VdbeAddOp2(v, OP_Integer, pIdx->aSortOrder[i], 4); sqlite3VdbeAddOp2(v, OP_Integer, pIdx->aSortOrder[i], 4);
sqlite3VdbeAddOp4(v, OP_String8, 0, 5, 0, pIdx->azColl[i], 0); sqlite3VdbeAddOp4(v, OP_String8, 0, 5, 0, pIdx->azColl[i], 0);
sqlite3VdbeAddOp2(v, OP_Integer, i<pIdx->nKeyCol, 6); sqlite3VdbeAddOp2(v, OP_Integer, i<pIdx->nKeyCol, 6);
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 6); }
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, pParse->nMem);
} }
} }
} }
@ -1802,8 +1825,9 @@ void sqlite3Pragma(
/* /*
** PRAGMA shrink_memory ** PRAGMA shrink_memory
** **
** This pragma attempts to free as much memory as possible from the ** IMPLEMENTATION-OF: R-23445-46109 This pragma causes the database
** current database connection. ** connection on which it is invoked to free up as much memory as it
** can, by calling sqlite3_db_release_memory().
*/ */
case PragTyp_SHRINK_MEMORY: { case PragTyp_SHRINK_MEMORY: {
sqlite3_db_release_memory(db); sqlite3_db_release_memory(db);
@ -1832,8 +1856,12 @@ void sqlite3Pragma(
** PRAGMA soft_heap_limit ** PRAGMA soft_heap_limit
** PRAGMA soft_heap_limit = N ** PRAGMA soft_heap_limit = N
** **
** Call sqlite3_soft_heap_limit64(N). Return the result. If N is omitted, ** IMPLEMENTATION-OF: R-26343-45930 This pragma invokes the
** use -1. ** sqlite3_soft_heap_limit64() interface with the argument N, if N is
** specified and is a non-negative integer.
** IMPLEMENTATION-OF: R-64451-07163 The soft_heap_limit pragma always
** returns the same integer that would be returned by the
** sqlite3_soft_heap_limit64(-1) C-language function.
*/ */
case PragTyp_SOFT_HEAP_LIMIT: { case PragTyp_SOFT_HEAP_LIMIT: {
sqlite3_int64 N; sqlite3_int64 N;

View File

@ -563,20 +563,17 @@ static void pushOntoSorter(
} }
sqlite3VdbeAddOp2(v, op, pSort->iECursor, regRecord); sqlite3VdbeAddOp2(v, op, pSort->iECursor, regRecord);
if( pSelect->iLimit ){ if( pSelect->iLimit ){
int addr1, addr2; int addr;
int iLimit; int iLimit;
if( pSelect->iOffset ){ if( pSelect->iOffset ){
iLimit = pSelect->iOffset+1; iLimit = pSelect->iOffset+1;
}else{ }else{
iLimit = pSelect->iLimit; iLimit = pSelect->iLimit;
} }
addr1 = sqlite3VdbeAddOp1(v, OP_IfZero, iLimit); VdbeCoverage(v); addr = sqlite3VdbeAddOp3(v, OP_IfNotZero, iLimit, 0, -1); VdbeCoverage(v);
sqlite3VdbeAddOp2(v, OP_AddImm, iLimit, -1);
addr2 = sqlite3VdbeAddOp0(v, OP_Goto);
sqlite3VdbeJumpHere(v, addr1);
sqlite3VdbeAddOp1(v, OP_Last, pSort->iECursor); sqlite3VdbeAddOp1(v, OP_Last, pSort->iECursor);
sqlite3VdbeAddOp1(v, OP_Delete, pSort->iECursor); sqlite3VdbeAddOp1(v, OP_Delete, pSort->iECursor);
sqlite3VdbeJumpHere(v, addr2); sqlite3VdbeJumpHere(v, addr);
} }
} }
@ -973,7 +970,7 @@ static void selectInnerLoop(
** the output for us. ** the output for us.
*/ */
if( pSort==0 && p->iLimit ){ if( pSort==0 && p->iLimit ){
sqlite3VdbeAddOp3(v, OP_IfZero, p->iLimit, iBreak, -1); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_DecrJumpZero, p->iLimit, iBreak); VdbeCoverage(v);
} }
} }
@ -1826,7 +1823,7 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){
sqlite3ExprCode(pParse, p->pLimit, iLimit); sqlite3ExprCode(pParse, p->pLimit, iLimit);
sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); VdbeCoverage(v); sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); VdbeCoverage(v);
VdbeComment((v, "LIMIT counter")); VdbeComment((v, "LIMIT counter"));
sqlite3VdbeAddOp2(v, OP_IfZero, iLimit, iBreak); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, iBreak); VdbeCoverage(v);
} }
if( p->pOffset ){ if( p->pOffset ){
p->iOffset = iOffset = ++pParse->nMem; p->iOffset = iOffset = ++pParse->nMem;
@ -2045,7 +2042,7 @@ static void generateWithRecursiveQuery(
selectInnerLoop(pParse, p, p->pEList, iCurrent, selectInnerLoop(pParse, p, p->pEList, iCurrent,
0, 0, pDest, addrCont, addrBreak); 0, 0, pDest, addrCont, addrBreak);
if( regLimit ){ if( regLimit ){
sqlite3VdbeAddOp3(v, OP_IfZero, regLimit, addrBreak, -1); sqlite3VdbeAddOp2(v, OP_DecrJumpZero, regLimit, addrBreak);
VdbeCoverage(v); VdbeCoverage(v);
} }
sqlite3VdbeResolveLabel(v, addrCont); sqlite3VdbeResolveLabel(v, addrCont);
@ -2270,7 +2267,7 @@ static int multiSelect(
p->iLimit = pPrior->iLimit; p->iLimit = pPrior->iLimit;
p->iOffset = pPrior->iOffset; p->iOffset = pPrior->iOffset;
if( p->iLimit ){ if( p->iLimit ){
addr = sqlite3VdbeAddOp1(v, OP_IfZero, p->iLimit); VdbeCoverage(v); addr = sqlite3VdbeAddOp1(v, OP_IfNot, p->iLimit); VdbeCoverage(v);
VdbeComment((v, "Jump ahead if LIMIT reached")); VdbeComment((v, "Jump ahead if LIMIT reached"));
} }
explainSetInteger(iSub2, pParse->iNextSelectId); explainSetInteger(iSub2, pParse->iNextSelectId);
@ -2671,7 +2668,7 @@ static int generateOutputSubroutine(
/* Jump to the end of the loop if the LIMIT is reached. /* Jump to the end of the loop if the LIMIT is reached.
*/ */
if( p->iLimit ){ if( p->iLimit ){
sqlite3VdbeAddOp3(v, OP_IfZero, p->iLimit, iBreak, -1); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_DecrJumpZero, p->iLimit, iBreak); VdbeCoverage(v);
} }
/* Generate the subroutine return /* Generate the subroutine return

View File

@ -24,6 +24,13 @@
#include "msvc.h" #include "msvc.h"
#endif #endif
/*
** No support for loadable extensions in VxWorks.
*/
#if defined(_WRS_KERNEL) && !SQLITE_OMIT_LOAD_EXTENSION
# define SQLITE_OMIT_LOAD_EXTENSION 1
#endif
/* /*
** Enable large-file support for fopen() and friends on unix. ** Enable large-file support for fopen() and friends on unix.
*/ */
@ -59,18 +66,38 @@
# include <readline/readline.h> # include <readline/readline.h>
# include <readline/history.h> # include <readline/history.h>
#endif #endif
#if HAVE_EDITLINE #if HAVE_EDITLINE
# undef HAVE_READLINE
# define HAVE_READLINE 1
# include <editline/readline.h> # include <editline/readline.h>
#endif #endif
#if !HAVE_READLINE
# define add_history(X) #if HAVE_EDITLINE || HAVE_READLINE
# define read_history(X)
# define write_history(X) # define shell_add_history(X) add_history(X)
# define stifle_history(X) # define shell_read_history(X) read_history(X)
# define shell_write_history(X) write_history(X)
# define shell_stifle_history(X) stifle_history(X)
# define shell_readline(X) readline(X)
#elif HAVE_LINENOISE
# include "linenoise.h"
# define shell_add_history(X) linenoiseHistoryAdd(X)
# define shell_read_history(X) linenoiseHistoryLoad(X)
# define shell_write_history(X) linenoiseHistorySave(X)
# define shell_stifle_history(X) linenoiseHistorySetMaxLen(X)
# define shell_readline(X) linenoise(X)
#else
# define shell_read_history(X)
# define shell_write_history(X)
# define shell_stifle_history(X)
# define SHELL_USE_LOCAL_GETLINE 1
#endif #endif
#if defined(_WIN32) || defined(WIN32) #if defined(_WIN32) || defined(WIN32)
# include <io.h> # include <io.h>
# include <fcntl.h> # include <fcntl.h>
@ -87,10 +114,15 @@
*/ */
extern int isatty(int); extern int isatty(int);
#if !defined(__RTP__) && !defined(_WRS_KERNEL)
/* popen and pclose are not C89 functions and so are sometimes omitted from /* popen and pclose are not C89 functions and so are sometimes omitted from
** the <stdio.h> header */ ** the <stdio.h> header */
extern FILE *popen(const char*,const char*); extern FILE *popen(const char*,const char*);
extern int pclose(FILE*); extern int pclose(FILE*);
#else
# define SQLITE_OMIT_POPEN 1
#endif
#endif #endif
#if defined(_WIN32_WCE) #if defined(_WIN32_WCE)
@ -145,11 +177,19 @@ static sqlite3_int64 timeOfDay(void){
return t; return t;
} }
#if !defined(_WIN32) && !defined(WIN32) && !defined(_WRS_KERNEL) \ #if !defined(_WIN32) && !defined(WIN32) && !defined(__minux)
&& !defined(__minux)
#include <sys/time.h> #include <sys/time.h>
#include <sys/resource.h> #include <sys/resource.h>
/* VxWorks does not support getrusage() as far as we can determine */
#if defined(_WRS_KERNEL) || defined(__RTP__)
struct rusage {
struct timeval ru_utime; /* user CPU time used */
struct timeval ru_stime; /* system CPU time used */
};
#define getrusage(A,B) memset(B,0,sizeof(*B))
#endif
/* Saved resource information for the beginning of an operation */ /* Saved resource information for the beginning of an operation */
static struct rusage sBegin; /* CPU time at start */ static struct rusage sBegin; /* CPU time at start */
static sqlite3_int64 iBegin; /* Wall-clock time at start */ static sqlite3_int64 iBegin; /* Wall-clock time at start */
@ -175,8 +215,8 @@ static double timeDiff(struct timeval *pStart, struct timeval *pEnd){
*/ */
static void endTimer(void){ static void endTimer(void){
if( enableTimer ){ if( enableTimer ){
struct rusage sEnd;
sqlite3_int64 iEnd = timeOfDay(); sqlite3_int64 iEnd = timeOfDay();
struct rusage sEnd;
getrusage(RUSAGE_SELF, &sEnd); getrusage(RUSAGE_SELF, &sEnd);
printf("Run Time: real %.3f user %f sys %f\n", printf("Run Time: real %.3f user %f sys %f\n",
(iEnd - iBegin)*0.001, (iEnd - iBegin)*0.001,
@ -451,14 +491,14 @@ static char *one_input_line(FILE *in, char *zPrior, int isContinuation){
zResult = local_getline(zPrior, in); zResult = local_getline(zPrior, in);
}else{ }else{
zPrompt = isContinuation ? continuePrompt : mainPrompt; zPrompt = isContinuation ? continuePrompt : mainPrompt;
#if HAVE_READLINE #if SHELL_USE_LOCAL_GETLINE
free(zPrior);
zResult = readline(zPrompt);
if( zResult && *zResult ) add_history(zResult);
#else
printf("%s", zPrompt); printf("%s", zPrompt);
fflush(stdout); fflush(stdout);
zResult = local_getline(zPrior, stdin); zResult = local_getline(zPrior, stdin);
#else
free(zPrior);
zResult = shell_readline(zPrompt);
if( zResult && *zResult ) shell_add_history(zResult);
#endif #endif
} }
return zResult; return zResult;
@ -2419,7 +2459,9 @@ static void tryToClone(ShellState *p, const char *zNewDb){
*/ */
static void output_reset(ShellState *p){ static void output_reset(ShellState *p){
if( p->outfile[0]=='|' ){ if( p->outfile[0]=='|' ){
#ifndef SQLITE_OMIT_POPEN
pclose(p->out); pclose(p->out);
#endif
}else{ }else{
output_file_close(p->out); output_file_close(p->out);
} }
@ -2912,9 +2954,14 @@ static int do_meta_command(char *zLine, ShellState *p){
sCtx.zFile = zFile; sCtx.zFile = zFile;
sCtx.nLine = 1; sCtx.nLine = 1;
if( sCtx.zFile[0]=='|' ){ if( sCtx.zFile[0]=='|' ){
#ifdef SQLITE_OMIT_POPEN
fprintf(stderr, "Error: pipes are not supporte in this OS\n");
return 1;
#else
sCtx.in = popen(sCtx.zFile+1, "r"); sCtx.in = popen(sCtx.zFile+1, "r");
sCtx.zFile = "<pipe>"; sCtx.zFile = "<pipe>";
xCloser = pclose; xCloser = pclose;
#endif
}else{ }else{
sCtx.in = fopen(sCtx.zFile, "rb"); sCtx.in = fopen(sCtx.zFile, "rb");
xCloser = fclose; xCloser = fclose;
@ -3237,6 +3284,11 @@ static int do_meta_command(char *zLine, ShellState *p){
} }
output_reset(p); output_reset(p);
if( zFile[0]=='|' ){ if( zFile[0]=='|' ){
#ifdef SQLITE_OMIT_POPEN
fprintf(stderr,"Error: pipes are not supported in this OS\n");
rc = 1;
p->out = stdout;
#else
p->out = popen(zFile + 1, "w"); p->out = popen(zFile + 1, "w");
if( p->out==0 ){ if( p->out==0 ){
fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1); fprintf(stderr,"Error: cannot open pipe \"%s\"\n", zFile + 1);
@ -3245,6 +3297,7 @@ static int do_meta_command(char *zLine, ShellState *p){
}else{ }else{
sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile); sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", zFile);
} }
#endif
}else{ }else{
p->out = output_file_open(zFile); p->out = output_file_open(zFile);
if( p->out==0 ){ if( p->out==0 ){
@ -4169,7 +4222,7 @@ static char *find_home_dir(void){
** **
** Returns the number of errors. ** Returns the number of errors.
*/ */
static int process_sqliterc( static void process_sqliterc(
ShellState *p, /* Configuration data */ ShellState *p, /* Configuration data */
const char *sqliterc_override /* Name of config file. NULL to use default */ const char *sqliterc_override /* Name of config file. NULL to use default */
){ ){
@ -4177,15 +4230,13 @@ static int process_sqliterc(
const char *sqliterc = sqliterc_override; const char *sqliterc = sqliterc_override;
char *zBuf = 0; char *zBuf = 0;
FILE *in = NULL; FILE *in = NULL;
int rc = 0;
if (sqliterc == NULL) { if (sqliterc == NULL) {
home_dir = find_home_dir(); home_dir = find_home_dir();
if( home_dir==0 ){ if( home_dir==0 ){
#if !defined(__RTP__) && !defined(_WRS_KERNEL) fprintf(stderr, "-- warning: cannot find home directory;"
fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0); " cannot read ~/.sqliterc\n");
#endif return;
return 1;
} }
sqlite3_initialize(); sqlite3_initialize();
zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir); zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir);
@ -4196,11 +4247,10 @@ static int process_sqliterc(
if( stdin_is_interactive ){ if( stdin_is_interactive ){
fprintf(stderr,"-- Loading resources from %s\n",sqliterc); fprintf(stderr,"-- Loading resources from %s\n",sqliterc);
} }
rc = process_input(p,in); process_input(p,in);
fclose(in); fclose(in);
} }
sqlite3_free(zBuf); sqlite3_free(zBuf);
return rc;
} }
/* /*
@ -4476,10 +4526,7 @@ int main(int argc, char **argv){
** is given on the command line, look for a file named ~/.sqliterc and ** is given on the command line, look for a file named ~/.sqliterc and
** try to process it. ** try to process it.
*/ */
rc = process_sqliterc(&data,zInitFile); process_sqliterc(&data,zInitFile);
if( rc>0 ){
return rc;
}
/* Make a second pass through the command-line argument and set /* Make a second pass through the command-line argument and set
** options. This second pass is delayed until after the initialization ** options. This second pass is delayed until after the initialization
@ -4636,13 +4683,11 @@ int main(int argc, char **argv){
sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome); sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome);
} }
} }
#if HAVE_READLINE if( zHistory ) shell_read_history(zHistory);
if( zHistory ) read_history(zHistory);
#endif
rc = process_input(&data, 0); rc = process_input(&data, 0);
if( zHistory ){ if( zHistory ){
stifle_history(100); shell_stifle_history(100);
write_history(zHistory); shell_write_history(zHistory);
free(zHistory); free(zHistory);
} }
}else{ }else{

View File

@ -751,14 +751,16 @@ struct sqlite3_io_methods {
** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] ** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()]
** interface. ** interface.
** **
** <ul>
** <li>[[SQLITE_FCNTL_LOCKSTATE]]
** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This ** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This
** opcode causes the xFileControl method to write the current state of ** opcode causes the xFileControl method to write the current state of
** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], ** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED],
** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) ** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE])
** into an integer that the pArg argument points to. This capability ** into an integer that the pArg argument points to. This capability
** is used during testing and only needs to be supported when SQLITE_TEST ** is used during testing and is only available when the SQLITE_TEST
** is defined. ** compile-time option is used.
** <ul> **
** <li>[[SQLITE_FCNTL_SIZE_HINT]] ** <li>[[SQLITE_FCNTL_SIZE_HINT]]
** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS ** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS
** layer a hint of how large the database file will grow to be during the ** layer a hint of how large the database file will grow to be during the
@ -883,7 +885,9 @@ struct sqlite3_io_methods {
** [PRAGMA] processing continues. ^If the [SQLITE_FCNTL_PRAGMA] ** [PRAGMA] processing continues. ^If the [SQLITE_FCNTL_PRAGMA]
** file control returns [SQLITE_OK], then the parser assumes that the ** file control returns [SQLITE_OK], then the parser assumes that the
** VFS has handled the PRAGMA itself and the parser generates a no-op ** VFS has handled the PRAGMA itself and the parser generates a no-op
** prepared statement. ^If the [SQLITE_FCNTL_PRAGMA] file control returns ** prepared statement if result string is NULL, or that returns a copy
** of the result string if the string is non-NULL.
** ^If the [SQLITE_FCNTL_PRAGMA] file control returns
** any result code other than [SQLITE_OK] or [SQLITE_NOTFOUND], that means ** any result code other than [SQLITE_OK] or [SQLITE_NOTFOUND], that means
** that the VFS encountered an error while handling the [PRAGMA] and the ** that the VFS encountered an error while handling the [PRAGMA] and the
** compilation of the PRAGMA fails with an error. ^The [SQLITE_FCNTL_PRAGMA] ** compilation of the PRAGMA fails with an error. ^The [SQLITE_FCNTL_PRAGMA]
@ -1748,7 +1752,6 @@ struct sqlite3_mem_methods {
** compiled for Windows with the [SQLITE_WIN32_MALLOC] pre-processor macro ** compiled for Windows with the [SQLITE_WIN32_MALLOC] pre-processor macro
** defined. ^SQLITE_CONFIG_WIN32_HEAPSIZE takes a 32-bit unsigned integer value ** defined. ^SQLITE_CONFIG_WIN32_HEAPSIZE takes a 32-bit unsigned integer value
** that specifies the maximum size of the created heap. ** that specifies the maximum size of the created heap.
** </dl>
** **
** [[SQLITE_CONFIG_PCACHE_HDRSZ]] ** [[SQLITE_CONFIG_PCACHE_HDRSZ]]
** <dt>SQLITE_CONFIG_PCACHE_HDRSZ ** <dt>SQLITE_CONFIG_PCACHE_HDRSZ
@ -3188,16 +3191,14 @@ int sqlite3_limit(sqlite3*, int id, int newVal);
** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2() ** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2()
** use UTF-16. ** use UTF-16.
** **
** ^If the nByte argument is less than zero, then zSql is read up to the ** ^If the nByte argument is negative, then zSql is read up to the
** first zero terminator. ^If nByte is non-negative, then it is the maximum ** first zero terminator. ^If nByte is positive, then it is the
** number of bytes read from zSql. ^When nByte is non-negative, the ** number of bytes read from zSql. ^If nByte is zero, then no prepared
** zSql string ends at either the first '\000' or '\u0000' character or ** statement is generated.
** the nByte-th byte, whichever comes first. If the caller knows ** If the caller knows that the supplied string is nul-terminated, then
** that the supplied string is nul-terminated, then there is a small ** there is a small performance advantage to passing an nByte parameter that
** performance advantage to be gained by passing an nByte parameter that ** is the number of bytes in the input string <i>including</i>
** is equal to the number of bytes in the input string <i>including</i> ** the nul-terminator.
** the nul-terminator bytes as this saves SQLite from having to
** make a copy of the input string.
** **
** ^If pzTail is not NULL then *pzTail is made to point to the first byte ** ^If pzTail is not NULL then *pzTail is made to point to the first byte
** past the end of the first SQL statement in zSql. These routines only ** past the end of the first SQL statement in zSql. These routines only
@ -4226,8 +4227,8 @@ int sqlite3_create_function_v2(
** These functions are [deprecated]. In order to maintain ** These functions are [deprecated]. In order to maintain
** backwards compatibility with older code, these functions continue ** backwards compatibility with older code, these functions continue
** to be supported. However, new applications should avoid ** to be supported. However, new applications should avoid
** the use of these functions. To help encourage people to avoid ** the use of these functions. To encourage programmers to avoid
** using these functions, we are not going to tell you what they do. ** these functions, we will not explain what they do.
*/ */
#ifndef SQLITE_OMIT_DEPRECATED #ifndef SQLITE_OMIT_DEPRECATED
SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*); SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*);
@ -6989,20 +6990,20 @@ typedef struct sqlite3_backup sqlite3_backup;
** is not a permanent error and does not affect the return value of ** is not a permanent error and does not affect the return value of
** sqlite3_backup_finish(). ** sqlite3_backup_finish().
** **
** [[sqlite3_backup__remaining()]] [[sqlite3_backup_pagecount()]] ** [[sqlite3_backup_remaining()]] [[sqlite3_backup_pagecount()]]
** <b>sqlite3_backup_remaining() and sqlite3_backup_pagecount()</b> ** <b>sqlite3_backup_remaining() and sqlite3_backup_pagecount()</b>
** **
** ^Each call to sqlite3_backup_step() sets two values inside ** ^The sqlite3_backup_remaining() routine returns the number of pages still
** the [sqlite3_backup] object: the number of pages still to be backed ** to be backed up at the conclusion of the most recent sqlite3_backup_step().
** up and the total number of pages in the source database file. ** ^The sqlite3_backup_pagecount() routine returns the total number of pages
** The sqlite3_backup_remaining() and sqlite3_backup_pagecount() interfaces ** in the source database at the conclusion of the most recent
** retrieve these two values, respectively. ** sqlite3_backup_step().
** ** ^(The values returned by these functions are only updated by
** ^The values returned by these functions are only updated by ** sqlite3_backup_step(). If the source database is modified in a way that
** sqlite3_backup_step(). ^If the source database is modified during a backup ** changes the size of the source database or the number of pages remaining,
** operation, then the values are not updated to account for any extra ** those changes are not reflected in the output of sqlite3_backup_pagecount()
** pages that need to be updated or the size of the source database file ** and sqlite3_backup_remaining() until after the next
** changing. ** sqlite3_backup_step().)^
** **
** <b>Concurrent Usage of Database Handles</b> ** <b>Concurrent Usage of Database Handles</b>
** **

View File

@ -23,6 +23,11 @@
*/ */
#include "msvc.h" #include "msvc.h"
/*
** Special setup for VxWorks
*/
#include "vxworks.h"
/* /*
** These #defines should enable >2GB file support on POSIX if the ** These #defines should enable >2GB file support on POSIX if the
** underlying operating system supports it. If the OS lacks ** underlying operating system supports it. If the OS lacks
@ -2250,7 +2255,7 @@ struct SrcList {
#define WHERE_OMIT_OPEN_CLOSE 0x0010 /* Table cursors are already open */ #define WHERE_OMIT_OPEN_CLOSE 0x0010 /* Table cursors are already open */
#define WHERE_FORCE_TABLE 0x0020 /* Do not use an index-only search */ #define WHERE_FORCE_TABLE 0x0020 /* Do not use an index-only search */
#define WHERE_ONETABLE_ONLY 0x0040 /* Only code the 1st table in pTabList */ #define WHERE_ONETABLE_ONLY 0x0040 /* Only code the 1st table in pTabList */
/* 0x0080 // not currently used */ #define WHERE_NO_AUTOINDEX 0x0080 /* Disallow automatic indexes */
#define WHERE_GROUPBY 0x0100 /* pOrderBy is really a GROUP BY */ #define WHERE_GROUPBY 0x0100 /* pOrderBy is really a GROUP BY */
#define WHERE_DISTINCTBY 0x0200 /* pOrderby is really a DISTINCT clause */ #define WHERE_DISTINCTBY 0x0200 /* pOrderby is really a DISTINCT clause */
#define WHERE_WANT_DISTINCT 0x0400 /* All output needs to be distinct */ #define WHERE_WANT_DISTINCT 0x0400 /* All output needs to be distinct */

View File

@ -98,15 +98,17 @@
#endif #endif
/* /*
** The maximum number of in-memory pages to use for the main database ** The suggested maximum number of in-memory pages to use for
** table and for temporary tables. The SQLITE_DEFAULT_CACHE_SIZE ** the main database table and for temporary tables.
**
** IMPLEMENTATION-OF: R-31093-59126 The default suggested cache size
** is 2000 pages.
** IMPLEMENTATION-OF: R-48205-43578 The default suggested cache size can be
** altered using the SQLITE_DEFAULT_CACHE_SIZE compile-time options.
*/ */
#ifndef SQLITE_DEFAULT_CACHE_SIZE #ifndef SQLITE_DEFAULT_CACHE_SIZE
# define SQLITE_DEFAULT_CACHE_SIZE 2000 # define SQLITE_DEFAULT_CACHE_SIZE 2000
#endif #endif
#ifndef SQLITE_DEFAULT_TEMP_CACHE_SIZE
# define SQLITE_DEFAULT_TEMP_CACHE_SIZE 500
#endif
/* /*
** The default number of frames to accumulate in the log file before ** The default number of frames to accumulate in the log file before

View File

@ -3429,7 +3429,7 @@ static void MD5DigestToBase10x8(unsigned char digest[16], char zDigest[50]){
for(i=j=0; i<16; i+=2){ for(i=j=0; i<16; i+=2){
x = digest[i]*256 + digest[i+1]; x = digest[i]*256 + digest[i+1];
if( i>0 ) zDigest[j++] = '-'; if( i>0 ) zDigest[j++] = '-';
sqlite3_snprintf(16-j, &zDigest[j], "%05u", x); sqlite3_snprintf(50-j, &zDigest[j], "%05u", x);
j += 5; j += 5;
} }
zDigest[j] = 0; zDigest[j] = 0;

View File

@ -656,7 +656,6 @@ Tcl_SetVar2(interp, "sqlite_options", "mergesort", "1", TCL_GLOBAL_ONLY);
LINKVAR( MAX_PAGE_COUNT ); LINKVAR( MAX_PAGE_COUNT );
LINKVAR( MAX_LIKE_PATTERN_LENGTH ); LINKVAR( MAX_LIKE_PATTERN_LENGTH );
LINKVAR( MAX_TRIGGER_DEPTH ); LINKVAR( MAX_TRIGGER_DEPTH );
LINKVAR( DEFAULT_TEMP_CACHE_SIZE );
LINKVAR( DEFAULT_CACHE_SIZE ); LINKVAR( DEFAULT_CACHE_SIZE );
LINKVAR( DEFAULT_PAGE_SIZE ); LINKVAR( DEFAULT_PAGE_SIZE );
LINKVAR( DEFAULT_FILE_FORMAT ); LINKVAR( DEFAULT_FILE_FORMAT );

View File

@ -1004,6 +1004,13 @@ static int multiplexFileControl(sqlite3_file *pConn, int op, void *pArg){
break; break;
case SQLITE_FCNTL_PRAGMA: { case SQLITE_FCNTL_PRAGMA: {
char **aFcntl = (char**)pArg; char **aFcntl = (char**)pArg;
/*
** EVIDENCE-OF: R-29875-31678 The argument to the SQLITE_FCNTL_PRAGMA
** file control is an array of pointers to strings (char**) in which the
** second element of the array is the name of the pragma and the third
** element is the argument to the pragma or NULL if the pragma has no
** argument.
*/
if( aFcntl[1] && sqlite3_stricmp(aFcntl[1],"multiplex_truncate")==0 ){ if( aFcntl[1] && sqlite3_stricmp(aFcntl[1],"multiplex_truncate")==0 ){
if( aFcntl[2] && aFcntl[2][0] ){ if( aFcntl[2] && aFcntl[2][0] ){
if( sqlite3_stricmp(aFcntl[2], "on")==0 if( sqlite3_stricmp(aFcntl[2], "on")==0
@ -1015,6 +1022,12 @@ static int multiplexFileControl(sqlite3_file *pConn, int op, void *pArg){
pGroup->bTruncate = 0; pGroup->bTruncate = 0;
} }
} }
/* EVIDENCE-OF: R-27806-26076 The handler for an SQLITE_FCNTL_PRAGMA
** file control can optionally make the first element of the char**
** argument point to a string obtained from sqlite3_mprintf() or the
** equivalent and that string will become the result of the pragma
** or the error message if the pragma fails.
*/
aFcntl[0] = sqlite3_mprintf(pGroup->bTruncate ? "on" : "off"); aFcntl[0] = sqlite3_mprintf(pGroup->bTruncate ? "on" : "off");
rc = SQLITE_OK; rc = SQLITE_OK;
break; break;

View File

@ -1015,7 +1015,7 @@ case OP_Real: { /* same as TK_FLOAT, out2-prerelease */
** Synopsis: r[P2]='P4' ** Synopsis: r[P2]='P4'
** **
** P4 points to a nul terminated UTF-8 string. This opcode is transformed ** P4 points to a nul terminated UTF-8 string. This opcode is transformed
** into a String before it is executed for the first time. During ** into a String opcode before it is executed for the first time. During
** this transformation, the length of string P4 is computed and stored ** this transformation, the length of string P4 is computed and stored
** as the P1 parameter. ** as the P1 parameter.
*/ */
@ -1047,10 +1047,15 @@ case OP_String8: { /* same as TK_STRING, out2-prerelease */
/* Fall through to the next case, OP_String */ /* Fall through to the next case, OP_String */
} }
/* Opcode: String P1 P2 * P4 * /* Opcode: String P1 P2 P3 P4 P5
** Synopsis: r[P2]='P4' (len=P1) ** Synopsis: r[P2]='P4' (len=P1)
** **
** The string value P4 of length P1 (bytes) is stored in register P2. ** The string value P4 of length P1 (bytes) is stored in register P2.
**
** If P5!=0 and the content of register P3 is greater than zero, then
** the datatype of the register P2 is converted to BLOB. The content is
** the same sequence of bytes, it is merely interpreted as a BLOB instead
** of a string, as if it had been CAST.
*/ */
case OP_String: { /* out2-prerelease */ case OP_String: { /* out2-prerelease */
assert( pOp->p4.z!=0 ); assert( pOp->p4.z!=0 );
@ -1059,6 +1064,13 @@ case OP_String: { /* out2-prerelease */
pOut->n = pOp->p1; pOut->n = pOp->p1;
pOut->enc = encoding; pOut->enc = encoding;
UPDATE_MAX_BLOBSIZE(pOut); UPDATE_MAX_BLOBSIZE(pOut);
if( pOp->p5 ){
assert( pOp->p3>0 );
assert( pOp->p3<=(p->nMem-p->nCursor) );
pIn3 = &aMem[pOp->p3];
assert( pIn3->flags & MEM_Int );
if( pIn3->u.i ) pOut->flags = MEM_Blob|MEM_Static|MEM_Term;
}
break; break;
} }
@ -3050,7 +3062,12 @@ case OP_Transaction: {
p->nStmtDefImmCons = db->nDeferredImmCons; p->nStmtDefImmCons = db->nDeferredImmCons;
} }
/* Gather the schema version number for checking */ /* Gather the schema version number for checking:
** IMPLEMENTATION-OF: R-32195-19465 The schema version is used by SQLite
** each time a query is executed to ensure that the internal cache of the
** schema used when compiling the SQL query matches the schema of the
** database against which the compiled query is actually executed.
*/
sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&iMeta); sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&iMeta);
iGen = db->aDb[pOp->p1].pSchema->iGeneration; iGen = db->aDb[pOp->p1].pSchema->iGeneration;
}else{ }else{
@ -5568,10 +5585,12 @@ case OP_MemMax: { /* in2 */
/* Opcode: IfPos P1 P2 * * * /* Opcode: IfPos P1 P2 * * *
** Synopsis: if r[P1]>0 goto P2 ** Synopsis: if r[P1]>0 goto P2
** **
** If the value of register P1 is 1 or greater, jump to P2. ** Register P1 must contain an integer.
** If the value of register P1 is 1 or greater, jump to P2 and
** add the literal value P3 to register P1.
** **
** It is illegal to use this instruction on a register that does ** If the initial value of register P1 is less than 1, then the
** not contain an integer. An assertion fault will result if you try. ** value is unchanged and control passes through to the next instruction.
*/ */
case OP_IfPos: { /* jump, in1 */ case OP_IfPos: { /* jump, in1 */
pIn1 = &aMem[pOp->p1]; pIn1 = &aMem[pOp->p1];
@ -5600,16 +5619,34 @@ case OP_IfNeg: { /* jump, in1 */
break; break;
} }
/* Opcode: IfZero P1 P2 P3 * * /* Opcode: IfNotZero P1 P2 P3 * *
** Synopsis: r[P1]+=P3, if r[P1]==0 goto P2 ** Synopsis: if r[P1]!=0 then r[P1]+=P3, goto P2
** **
** The register P1 must contain an integer. Add literal P3 to the ** Register P1 must contain an integer. If the content of register P1 is
** value in register P1. If the result is exactly 0, jump to P2. ** initially nonzero, then add P3 to P1 and jump to P2. If register P1 is
** initially zero, leave it unchanged and fall through.
*/ */
case OP_IfZero: { /* jump, in1 */ case OP_IfNotZero: { /* jump, in1 */
pIn1 = &aMem[pOp->p1]; pIn1 = &aMem[pOp->p1];
assert( pIn1->flags&MEM_Int ); assert( pIn1->flags&MEM_Int );
VdbeBranchTaken(pIn1->u.i<0, 2);
if( pIn1->u.i ){
pIn1->u.i += pOp->p3; pIn1->u.i += pOp->p3;
pc = pOp->p2 - 1;
}
break;
}
/* 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.
*/
case OP_DecrJumpZero: { /* jump, in1 */
pIn1 = &aMem[pOp->p1];
assert( pIn1->flags&MEM_Int );
pIn1->u.i--;
VdbeBranchTaken(pIn1->u.i==0, 2); VdbeBranchTaken(pIn1->u.i==0, 2);
if( pIn1->u.i==0 ){ if( pIn1->u.i==0 ){
pc = pOp->p2 - 1; pc = pOp->p2 - 1;
@ -5617,6 +5654,24 @@ case OP_IfZero: { /* jump, in1 */
break; break;
} }
/* Opcode: JumpZeroIncr P1 P2 * * *
** Synopsis: if (r[P1]++)==0 ) goto P2
**
** The register P1 must contain an integer. If register P1 is initially
** zero, then jump to P2. Increment register P1 regardless of whether or
** not the jump is taken.
*/
case OP_JumpZeroIncr: { /* jump, in1 */
pIn1 = &aMem[pOp->p1];
assert( pIn1->flags&MEM_Int );
VdbeBranchTaken(pIn1->u.i==0, 2);
if( (pIn1->u.i++)==0 ){
pc = pOp->p2 - 1;
}
break;
}
/* Opcode: AggStep * P2 P3 P4 P5 /* Opcode: AggStep * P2 P3 P4 P5
** Synopsis: accum=r[P3] step(r[P2@P5]) ** Synopsis: accum=r[P3] step(r[P2@P5])
** **

View File

@ -170,6 +170,10 @@ const void *sqlite3_value_text16le(sqlite3_value *pVal){
return sqlite3ValueText(pVal, SQLITE_UTF16LE); return sqlite3ValueText(pVal, SQLITE_UTF16LE);
} }
#endif /* SQLITE_OMIT_UTF16 */ #endif /* SQLITE_OMIT_UTF16 */
/* EVIDENCE-OF: R-12793-43283 Every value in SQLite has one of five
** fundamental datatypes: 64-bit signed integer 64-bit IEEE floating
** point number string BLOB NULL
*/
int sqlite3_value_type(sqlite3_value* pVal){ int sqlite3_value_type(sqlite3_value* pVal){
static const u8 aType[] = { static const u8 aType[] = {
SQLITE_BLOB, /* 0x00 */ SQLITE_BLOB, /* 0x00 */

29
src/vxworks.h Normal file
View File

@ -0,0 +1,29 @@
/*
** 2015-03-02
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
**
** May you do good and not evil.
** May you find forgiveness for yourself and forgive others.
** May you share freely, never taking more than you give.
**
******************************************************************************
**
** This file contains code that is specific to Wind River's VxWorks
*/
#if defined(__RTP__) || defined(_WRS_KERNEL)
/* This is VxWorks. Set up things specially for that OS
*/
#include <vxWorks.h>
#include <pthread.h> /* amalgamator: dontcache */
#define OS_VXWORKS 1
#define SQLITE_OS_OTHER 0
#define SQLITE_HOMEGROWN_RECURSIVE_MUTEX 1
#define SQLITE_OMIT_LOAD_EXTENSION 1
#define SQLITE_ENABLE_LOCKING_STYLE 0
#define HAVE_UTIME 1
#else
/* This is not VxWorks. */
#define OS_VXWORKS 0
#endif /* defined(_WRS_KERNEL) */

View File

@ -202,7 +202,7 @@ static void whereClauseClear(WhereClause *pWC){
** calling this routine. Such pointers may be reinitialized by referencing ** calling this routine. Such pointers may be reinitialized by referencing
** the pWC->a[] array. ** the pWC->a[] array.
*/ */
static int whereClauseInsert(WhereClause *pWC, Expr *p, u8 wtFlags){ static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){
WhereTerm *pTerm; WhereTerm *pTerm;
int idx; int idx;
testcase( wtFlags & TERM_VIRTUAL ); testcase( wtFlags & TERM_VIRTUAL );
@ -627,7 +627,11 @@ static void exprAnalyzeAll(
** so and false if not. ** so and false if not.
** **
** In order for the operator to be optimizible, the RHS must be a string ** In order for the operator to be optimizible, the RHS must be a string
** literal that does not begin with a wildcard. ** literal that does not begin with a wildcard. The LHS must be a column
** that may only be NULL, a string, or a BLOB, never a number. (This means
** that virtual tables cannot participate in the LIKE optimization.) If the
** collating sequence for the column on the LHS must be appropriate for
** the operator.
*/ */
static int isLikeOrGlob( static int isLikeOrGlob(
Parse *pParse, /* Parsing and code generating context */ Parse *pParse, /* Parsing and code generating context */
@ -656,7 +660,7 @@ static int isLikeOrGlob(
pLeft = pList->a[1].pExpr; pLeft = pList->a[1].pExpr;
if( pLeft->op!=TK_COLUMN if( pLeft->op!=TK_COLUMN
|| sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT
|| IsVirtual(pLeft->pTab) || IsVirtual(pLeft->pTab) /* Value might be numeric */
){ ){
/* IMP: R-02065-49465 The left-hand side of the LIKE or GLOB operator must /* IMP: R-02065-49465 The left-hand side of the LIKE or GLOB operator must
** be the name of an indexed column with TEXT affinity. */ ** be the name of an indexed column with TEXT affinity. */
@ -1105,7 +1109,7 @@ static void exprAnalyze(
Bitmask extraRight = 0; /* Extra dependencies on LEFT JOIN */ Bitmask extraRight = 0; /* Extra dependencies on LEFT JOIN */
Expr *pStr1 = 0; /* RHS of LIKE/GLOB operator */ Expr *pStr1 = 0; /* RHS of LIKE/GLOB operator */
int isComplete = 0; /* RHS of LIKE/GLOB ends with wildcard */ int isComplete = 0; /* RHS of LIKE/GLOB ends with wildcard */
int noCase = 0; /* LIKE/GLOB distinguishes case */ int noCase = 0; /* uppercase equivalent to lowercase */
int op; /* Top-level operator. pExpr->op */ int op; /* Top-level operator. pExpr->op */
Parse *pParse = pWInfo->pParse; /* Parsing context */ Parse *pParse = pWInfo->pParse; /* Parsing context */
sqlite3 *db = pParse->db; /* Database connection */ sqlite3 *db = pParse->db; /* Database connection */
@ -1243,12 +1247,15 @@ static void exprAnalyze(
/* Add constraints to reduce the search space on a LIKE or GLOB /* Add constraints to reduce the search space on a LIKE or GLOB
** operator. ** operator.
** **
** A like pattern of the form "x LIKE 'abc%'" is changed into constraints ** A like pattern of the form "x LIKE 'aBc%'" is changed into constraints
** **
** x>='abc' AND x<'abd' AND x LIKE 'abc%' ** x>='ABC' AND x<'abd' AND x LIKE 'aBc%'
** **
** The last character of the prefix "abc" is incremented to form the ** The last character of the prefix "abc" is incremented to form the
** termination condition "abd". ** termination condition "abd". If case is not significant (the default
** for LIKE) then the lower-bound is made all uppercase and the upper-
** bound is made all lowercase so that the bounds also work when comparing
** BLOBs.
*/ */
if( pWC->op==TK_AND if( pWC->op==TK_AND
&& isLikeOrGlob(pParse, pExpr, &pStr1, &isComplete, &noCase) && isLikeOrGlob(pParse, pExpr, &pStr1, &isComplete, &noCase)
@ -1260,9 +1267,25 @@ static void exprAnalyze(
int idxNew1; int idxNew1;
int idxNew2; int idxNew2;
Token sCollSeqName; /* Name of collating sequence */ Token sCollSeqName; /* Name of collating sequence */
const u16 wtFlags = TERM_LIKEOPT | TERM_VIRTUAL | TERM_DYNAMIC;
pLeft = pExpr->x.pList->a[1].pExpr; pLeft = pExpr->x.pList->a[1].pExpr;
pStr2 = sqlite3ExprDup(db, pStr1, 0); pStr2 = sqlite3ExprDup(db, pStr1, 0);
/* Convert the lower bound to upper-case and the upper bound to
** lower-case (upper-case is less than lower-case in ASCII) so that
** the range constraints also work for BLOBs
*/
if( noCase && !pParse->db->mallocFailed ){
int i;
char c;
pTerm->wtFlags |= TERM_LIKE;
for(i=0; (c = pStr1->u.zToken[i])!=0; i++){
pStr1->u.zToken[i] = sqlite3Toupper(c);
pStr2->u.zToken[i] = sqlite3Tolower(c);
}
}
if( !db->mallocFailed ){ if( !db->mallocFailed ){
u8 c, *pC; /* Last character before the first wildcard */ u8 c, *pC; /* Last character before the first wildcard */
pC = (u8*)&pStr2->u.zToken[sqlite3Strlen30(pStr2->u.zToken)-1]; pC = (u8*)&pStr2->u.zToken[sqlite3Strlen30(pStr2->u.zToken)-1];
@ -1286,7 +1309,7 @@ static void exprAnalyze(
sqlite3ExprAddCollateToken(pParse,pNewExpr1,&sCollSeqName), sqlite3ExprAddCollateToken(pParse,pNewExpr1,&sCollSeqName),
pStr1, 0); pStr1, 0);
transferJoinMarkings(pNewExpr1, pExpr); transferJoinMarkings(pNewExpr1, pExpr);
idxNew1 = whereClauseInsert(pWC, pNewExpr1, TERM_VIRTUAL|TERM_DYNAMIC); idxNew1 = whereClauseInsert(pWC, pNewExpr1, wtFlags);
testcase( idxNew1==0 ); testcase( idxNew1==0 );
exprAnalyze(pSrc, pWC, idxNew1); exprAnalyze(pSrc, pWC, idxNew1);
pNewExpr2 = sqlite3ExprDup(db, pLeft, 0); pNewExpr2 = sqlite3ExprDup(db, pLeft, 0);
@ -1294,7 +1317,7 @@ static void exprAnalyze(
sqlite3ExprAddCollateToken(pParse,pNewExpr2,&sCollSeqName), sqlite3ExprAddCollateToken(pParse,pNewExpr2,&sCollSeqName),
pStr2, 0); pStr2, 0);
transferJoinMarkings(pNewExpr2, pExpr); transferJoinMarkings(pNewExpr2, pExpr);
idxNew2 = whereClauseInsert(pWC, pNewExpr2, TERM_VIRTUAL|TERM_DYNAMIC); idxNew2 = whereClauseInsert(pWC, pNewExpr2, wtFlags);
testcase( idxNew2==0 ); testcase( idxNew2==0 );
exprAnalyze(pSrc, pWC, idxNew2); exprAnalyze(pSrc, pWC, idxNew2);
pTerm = &pWC->a[idxTerm]; pTerm = &pWC->a[idxTerm];
@ -1612,11 +1635,16 @@ static void constructAutomaticIndex(
pLoop = pLevel->pWLoop; pLoop = pLevel->pWLoop;
idxCols = 0; idxCols = 0;
for(pTerm=pWC->a; pTerm<pWCEnd; pTerm++){ for(pTerm=pWC->a; pTerm<pWCEnd; pTerm++){
Expr *pExpr = pTerm->pExpr;
assert( !ExprHasProperty(pExpr, EP_FromJoin) /* prereq always non-zero */
|| pExpr->iRightJoinTable!=pSrc->iCursor /* for the right-hand */
|| pLoop->prereq!=0 ); /* table of a LEFT JOIN */
if( pLoop->prereq==0 if( pLoop->prereq==0
&& (pTerm->wtFlags & TERM_VIRTUAL)==0 && (pTerm->wtFlags & TERM_VIRTUAL)==0
&& sqlite3ExprIsTableConstant(pTerm->pExpr, pSrc->iCursor) ){ && !ExprHasProperty(pExpr, EP_FromJoin)
&& sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor) ){
pPartial = sqlite3ExprAnd(pParse->db, pPartial, pPartial = sqlite3ExprAnd(pParse->db, pPartial,
sqlite3ExprDup(pParse->db, pTerm->pExpr, 0)); sqlite3ExprDup(pParse->db, pExpr, 0));
} }
if( termCanDriveIndex(pTerm, pSrc, notReady) ){ if( termCanDriveIndex(pTerm, pSrc, notReady) ){
int iCol = pTerm->u.leftColumn; int iCol = pTerm->u.leftColumn;
@ -2464,20 +2492,43 @@ static int whereInScanEst(
** but joins might run a little slower. The trick is to disable as much ** but joins might run a little slower. The trick is to disable as much
** as we can without disabling too much. If we disabled in (1), we'd get ** as we can without disabling too much. If we disabled in (1), we'd get
** the wrong answer. See ticket #813. ** the wrong answer. See ticket #813.
**
** If all the children of a term are disabled, then that term is also
** automatically disabled. In this way, terms get disabled if derived
** virtual terms are tested first. For example:
**
** x GLOB 'abc*' AND x>='abc' AND x<'acd'
** \___________/ \______/ \_____/
** parent child1 child2
**
** Only the parent term was in the original WHERE clause. The child1
** and child2 terms were added by the LIKE optimization. If both of
** the virtual child terms are valid, then testing of the parent can be
** skipped.
**
** Usually the parent term is marked as TERM_CODED. But if the parent
** term was originally TERM_LIKE, then the parent gets TERM_LIKECOND instead.
** The TERM_LIKECOND marking indicates that the term should be coded inside
** a conditional such that is only evaluated on the second pass of a
** LIKE-optimization loop, when scanning BLOBs instead of strings.
*/ */
static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){
if( pTerm int nLoop = 0;
while( pTerm
&& (pTerm->wtFlags & TERM_CODED)==0 && (pTerm->wtFlags & TERM_CODED)==0
&& (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin)) && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin))
&& (pLevel->notReady & pTerm->prereqAll)==0 && (pLevel->notReady & pTerm->prereqAll)==0
){ ){
if( nLoop && (pTerm->wtFlags & TERM_LIKE)!=0 ){
pTerm->wtFlags |= TERM_LIKECOND;
}else{
pTerm->wtFlags |= TERM_CODED; pTerm->wtFlags |= TERM_CODED;
if( pTerm->iParent>=0 ){
WhereTerm *pOther = &pTerm->pWC->a[pTerm->iParent];
if( (--pOther->nChild)==0 ){
disableTerm(pLevel, pOther);
}
} }
if( pTerm->iParent<0 ) break;
pTerm = &pTerm->pWC->a[pTerm->iParent];
pTerm->nChild--;
if( pTerm->nChild!=0 ) break;
nLoop++;
} }
} }
@ -2961,7 +3012,34 @@ static void addScanStatus(
# define addScanStatus(a, b, c, d) ((void)d) # define addScanStatus(a, b, c, d) ((void)d)
#endif #endif
/*
** If the most recently coded instruction is a constant range contraint
** that originated from the LIKE optimization, then change the P3 to be
** pLoop->iLikeRepCntr and set P5.
**
** The LIKE optimization trys to evaluate "x LIKE 'abc%'" as a range
** expression: "x>='ABC' AND x<'abd'". But this requires that the range
** scan loop run twice, once for strings and a second time for BLOBs.
** The OP_String opcodes on the second pass convert the upper and lower
** bound string contants to blobs. This routine makes the necessary changes
** to the OP_String opcodes for that to happen.
*/
static void whereLikeOptimizationStringFixup(
Vdbe *v, /* prepared statement under construction */
WhereLevel *pLevel, /* The loop that contains the LIKE operator */
WhereTerm *pTerm /* The upper or lower bound just coded */
){
if( pTerm->wtFlags & TERM_LIKEOPT ){
VdbeOp *pOp;
assert( pLevel->iLikeRepCntr>0 );
pOp = sqlite3VdbeGetOp(v, -1);
assert( pOp!=0 );
assert( pOp->opcode==OP_String8
|| pTerm->pWC->pWInfo->pParse->db->mallocFailed );
pOp->p3 = pLevel->iLikeRepCntr;
pOp->p5 = 1;
}
}
/* /*
** Generate code for the start of the iLevel-th loop in the WHERE clause ** Generate code for the start of the iLevel-th loop in the WHERE clause
@ -3291,10 +3369,25 @@ static Bitmask codeOneLoopStart(
if( pLoop->wsFlags & WHERE_BTM_LIMIT ){ if( pLoop->wsFlags & WHERE_BTM_LIMIT ){
pRangeStart = pLoop->aLTerm[j++]; pRangeStart = pLoop->aLTerm[j++];
nExtraReg = 1; nExtraReg = 1;
/* Like optimization range constraints always occur in pairs */
assert( (pRangeStart->wtFlags & TERM_LIKEOPT)==0 ||
(pLoop->wsFlags & WHERE_TOP_LIMIT)!=0 );
} }
if( pLoop->wsFlags & WHERE_TOP_LIMIT ){ if( pLoop->wsFlags & WHERE_TOP_LIMIT ){
pRangeEnd = pLoop->aLTerm[j++]; pRangeEnd = pLoop->aLTerm[j++];
nExtraReg = 1; nExtraReg = 1;
if( (pRangeEnd->wtFlags & TERM_LIKEOPT)!=0 ){
assert( pRangeStart!=0 ); /* LIKE opt constraints */
assert( pRangeStart->wtFlags & TERM_LIKEOPT ); /* occur in pairs */
pLevel->iLikeRepCntr = ++pParse->nMem;
testcase( bRev );
testcase( pIdx->aSortOrder[nEq]==SQLITE_SO_DESC );
sqlite3VdbeAddOp2(v, OP_Integer,
bRev ^ (pIdx->aSortOrder[nEq]==SQLITE_SO_DESC),
pLevel->iLikeRepCntr);
VdbeComment((v, "LIKE loop counter"));
pLevel->addrLikeRep = sqlite3VdbeCurrentAddr(v);
}
if( pRangeStart==0 if( pRangeStart==0
&& (j = pIdx->aiColumn[nEq])>=0 && (j = pIdx->aiColumn[nEq])>=0
&& pIdx->pTable->aCol[j].notNull==0 && pIdx->pTable->aCol[j].notNull==0
@ -3337,6 +3430,7 @@ static Bitmask codeOneLoopStart(
if( pRangeStart ){ if( pRangeStart ){
Expr *pRight = pRangeStart->pExpr->pRight; Expr *pRight = pRangeStart->pExpr->pRight;
sqlite3ExprCode(pParse, pRight, regBase+nEq); sqlite3ExprCode(pParse, pRight, regBase+nEq);
whereLikeOptimizationStringFixup(v, pLevel, pRangeStart);
if( (pRangeStart->wtFlags & TERM_VNULL)==0 if( (pRangeStart->wtFlags & TERM_VNULL)==0
&& sqlite3ExprCanBeNull(pRight) && sqlite3ExprCanBeNull(pRight)
){ ){
@ -3382,6 +3476,7 @@ static Bitmask codeOneLoopStart(
Expr *pRight = pRangeEnd->pExpr->pRight; Expr *pRight = pRangeEnd->pExpr->pRight;
sqlite3ExprCacheRemove(pParse, regBase+nEq, 1); sqlite3ExprCacheRemove(pParse, regBase+nEq, 1);
sqlite3ExprCode(pParse, pRight, regBase+nEq); sqlite3ExprCode(pParse, pRight, regBase+nEq);
whereLikeOptimizationStringFixup(v, pLevel, pRangeEnd);
if( (pRangeEnd->wtFlags & TERM_VNULL)==0 if( (pRangeEnd->wtFlags & TERM_VNULL)==0
&& sqlite3ExprCanBeNull(pRight) && sqlite3ExprCanBeNull(pRight)
){ ){
@ -3609,7 +3704,8 @@ static Bitmask codeOneLoopStart(
*/ */
wctrlFlags = WHERE_OMIT_OPEN_CLOSE wctrlFlags = WHERE_OMIT_OPEN_CLOSE
| WHERE_FORCE_TABLE | WHERE_FORCE_TABLE
| WHERE_ONETABLE_ONLY; | WHERE_ONETABLE_ONLY
| WHERE_NO_AUTOINDEX;
for(ii=0; ii<pOrWc->nTerm; ii++){ for(ii=0; ii<pOrWc->nTerm; ii++){
WhereTerm *pOrTerm = &pOrWc->a[ii]; WhereTerm *pOrTerm = &pOrWc->a[ii];
if( pOrTerm->leftCursor==iCur || (pOrTerm->eOperator & WO_AND)!=0 ){ if( pOrTerm->leftCursor==iCur || (pOrTerm->eOperator & WO_AND)!=0 ){
@ -3771,6 +3867,7 @@ static Bitmask codeOneLoopStart(
*/ */
for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){ for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){
Expr *pE; Expr *pE;
int skipLikeAddr = 0;
testcase( pTerm->wtFlags & TERM_VIRTUAL ); testcase( pTerm->wtFlags & TERM_VIRTUAL );
testcase( pTerm->wtFlags & TERM_CODED ); testcase( pTerm->wtFlags & TERM_CODED );
if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue;
@ -3785,7 +3882,13 @@ static Bitmask codeOneLoopStart(
if( pLevel->iLeftJoin && !ExprHasProperty(pE, EP_FromJoin) ){ if( pLevel->iLeftJoin && !ExprHasProperty(pE, EP_FromJoin) ){
continue; continue;
} }
if( pTerm->wtFlags & TERM_LIKECOND ){
assert( pLevel->iLikeRepCntr>0 );
skipLikeAddr = sqlite3VdbeAddOp1(v, OP_IfNot, pLevel->iLikeRepCntr);
VdbeCoverage(v);
}
sqlite3ExprIfFalse(pParse, pE, addrCont, SQLITE_JUMPIFNULL); sqlite3ExprIfFalse(pParse, pE, addrCont, SQLITE_JUMPIFNULL);
if( skipLikeAddr ) sqlite3VdbeJumpHere(v, skipLikeAddr);
pTerm->wtFlags |= TERM_CODED; pTerm->wtFlags |= TERM_CODED;
} }
@ -4450,6 +4553,10 @@ static int whereLoopAddBtreeIndex(
} }
if( pTerm->prereqRight & pNew->maskSelf ) continue; if( pTerm->prereqRight & pNew->maskSelf ) continue;
/* Do not allow the upper bound of a LIKE optimization range constraint
** to mix with a lower range bound from some other source */
if( pTerm->wtFlags & TERM_LIKEOPT && pTerm->eOperator==WO_LT ) continue;
pNew->wsFlags = saved_wsFlags; pNew->wsFlags = saved_wsFlags;
pNew->u.btree.nEq = saved_nEq; pNew->u.btree.nEq = saved_nEq;
pNew->nLTerm = saved_nLTerm; pNew->nLTerm = saved_nLTerm;
@ -4493,6 +4600,17 @@ static int whereLoopAddBtreeIndex(
pNew->wsFlags |= WHERE_COLUMN_RANGE|WHERE_BTM_LIMIT; pNew->wsFlags |= WHERE_COLUMN_RANGE|WHERE_BTM_LIMIT;
pBtm = pTerm; pBtm = pTerm;
pTop = 0; pTop = 0;
if( pTerm->wtFlags & TERM_LIKEOPT ){
/* Range contraints that come from the LIKE optimization are
** always used in pairs. */
pTop = &pTerm[1];
assert( (pTop-(pTerm->pWC->a))<pTerm->pWC->nTerm );
assert( pTop->wtFlags & TERM_LIKEOPT );
assert( pTop->eOperator==WO_LT );
if( whereLoopResize(db, pNew, pNew->nLTerm+1) ) break; /* OOM */
pNew->aLTerm[pNew->nLTerm++] = pTop;
pNew->wsFlags |= WHERE_TOP_LIMIT;
}
}else{ }else{
assert( eOp & (WO_LT|WO_LE) ); assert( eOp & (WO_LT|WO_LE) );
testcase( eOp & WO_LT ); testcase( eOp & WO_LT );
@ -4694,7 +4812,12 @@ static int whereUsablePartialIndex(int iTab, WhereClause *pWC, Expr *pWhere){
int i; int i;
WhereTerm *pTerm; WhereTerm *pTerm;
for(i=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){ for(i=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){
if( sqlite3ExprImpliesExpr(pTerm->pExpr, pWhere, iTab) ) return 1; Expr *pExpr = pTerm->pExpr;
if( sqlite3ExprImpliesExpr(pExpr, pWhere, iTab)
&& (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->iRightJoinTable==iTab)
){
return 1;
}
} }
return 0; return 0;
} }
@ -4798,6 +4921,7 @@ static int whereLoopAddBtree(
#ifndef SQLITE_OMIT_AUTOMATIC_INDEX #ifndef SQLITE_OMIT_AUTOMATIC_INDEX
/* Automatic indexes */ /* Automatic indexes */
if( !pBuilder->pOrSet if( !pBuilder->pOrSet
&& (pWInfo->wctrlFlags & WHERE_NO_AUTOINDEX)==0
&& (pWInfo->pParse->db->flags & SQLITE_AutoIndex)!=0 && (pWInfo->pParse->db->flags & SQLITE_AutoIndex)!=0
&& pSrc->pIndex==0 && pSrc->pIndex==0
&& !pSrc->viaCoroutine && !pSrc->viaCoroutine
@ -6583,6 +6707,16 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){
sqlite3VdbeJumpHere(v, pLevel->addrSkip); sqlite3VdbeJumpHere(v, pLevel->addrSkip);
sqlite3VdbeJumpHere(v, pLevel->addrSkip-2); sqlite3VdbeJumpHere(v, pLevel->addrSkip-2);
} }
if( pLevel->addrLikeRep ){
int op;
if( sqlite3VdbeGetOp(v, pLevel->addrLikeRep-1)->p1 ){
op = OP_DecrJumpZero;
}else{
op = OP_JumpZeroIncr;
}
sqlite3VdbeAddOp2(v, op, pLevel->iLikeRepCntr, pLevel->addrLikeRep);
VdbeCoverage(v);
}
if( pLevel->iLeftJoin ){ if( pLevel->iLeftJoin ){
addr = sqlite3VdbeAddOp1(v, OP_IfPos, pLevel->iLeftJoin); VdbeCoverage(v); addr = sqlite3VdbeAddOp1(v, OP_IfPos, pLevel->iLeftJoin); VdbeCoverage(v);
assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0

View File

@ -69,6 +69,8 @@ struct WhereLevel {
int addrCont; /* Jump here to continue with the next loop cycle */ int addrCont; /* Jump here to continue with the next loop cycle */
int addrFirst; /* First instruction of interior of the loop */ int addrFirst; /* First instruction of interior of the loop */
int addrBody; /* Beginning of the body of this loop */ int addrBody; /* Beginning of the body of this loop */
int iLikeRepCntr; /* LIKE range processing counter register */
int addrLikeRep; /* LIKE range processing address */
u8 iFrom; /* Which entry in the FROM clause */ u8 iFrom; /* Which entry in the FROM clause */
u8 op, p3, p5; /* Opcode, P3 & P5 of the opcode that ends the loop */ u8 op, p3, p5; /* Opcode, P3 & P5 of the opcode that ends the loop */
int p1, p2; /* Operands of the opcode used to ends the loop */ int p1, p2; /* Operands of the opcode used to ends the loop */
@ -253,7 +255,7 @@ struct WhereTerm {
} u; } u;
LogEst truthProb; /* Probability of truth for this expression */ LogEst truthProb; /* Probability of truth for this expression */
u16 eOperator; /* A WO_xx value describing <op> */ u16 eOperator; /* A WO_xx value describing <op> */
u8 wtFlags; /* TERM_xxx bit flags. See below */ u16 wtFlags; /* TERM_xxx bit flags. See below */
u8 nChild; /* Number of children that must disable us */ u8 nChild; /* Number of children that must disable us */
WhereClause *pWC; /* The clause this term is part of */ WhereClause *pWC; /* The clause this term is part of */
Bitmask prereqRight; /* Bitmask of tables used by pExpr->pRight */ Bitmask prereqRight; /* Bitmask of tables used by pExpr->pRight */
@ -275,6 +277,9 @@ struct WhereTerm {
#else #else
# define TERM_VNULL 0x00 /* Disabled if not using stat3 */ # define TERM_VNULL 0x00 /* Disabled if not using stat3 */
#endif #endif
#define TERM_LIKEOPT 0x100 /* Virtual terms from the LIKE optimization */
#define TERM_LIKECOND 0x200 /* Conditionally this LIKE operator term */
#define TERM_LIKE 0x400 /* The original LIKE operator */
/* /*
** An instance of the WhereScan object is used as an iterator for locating ** An instance of the WhereScan object is used as an iterator for locating

View File

@ -281,35 +281,35 @@ do_eqp_test analyze3-2.3 {
do_test analyze3-2.4 { do_test analyze3-2.4 {
sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE 'a%' } sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE 'a%' }
} {101 0 100} } {102 0 100}
do_test analyze3-2.5 { do_test analyze3-2.5 {
sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE '%a' } sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE '%a' }
} {999 999 100} } {999 999 100}
do_test analyze3-2.4 { do_test analyze3-2.6 {
set like "a%" set like "a%"
sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like }
} {101 0 100} } {102 0 100}
do_test analyze3-2.5 { do_test analyze3-2.7 {
set like "%a" set like "%a"
sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like }
} {999 999 100} } {999 999 100}
do_test analyze3-2.6 { do_test analyze3-2.8 {
set like "a" set like "a"
sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like }
} {101 0 0} } {102 0 0}
do_test analyze3-2.7 { do_test analyze3-2.9 {
set like "ab" set like "ab"
sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like }
} {11 0 0} } {12 0 0}
do_test analyze3-2.8 { do_test analyze3-2.10 {
set like "abc" set like "abc"
sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like }
} {2 0 1} } {3 0 1}
do_test analyze3-2.9 { do_test analyze3-2.11 {
set like "a_c" set like "a_c"
sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like }
} {101 0 10} } {102 0 10}
#------------------------------------------------------------------------- #-------------------------------------------------------------------------

View File

@ -11,6 +11,9 @@
# This file implements regression tests for SQLite library. The # This file implements regression tests for SQLite library. The
# focus of this script is testing automatic index creation logic. # focus of this script is testing automatic index creation logic.
# #
# EVIDENCE-OF: R-34271-33106 PRAGMA automatic_index; PRAGMA
# automatic_index = boolean; Query, set, or clear the automatic indexing
# capability.
set testdir [file dirname $argv0] set testdir [file dirname $argv0]
source $testdir/tester.tcl source $testdir/tester.tcl

View File

@ -49,4 +49,35 @@ do_execsql_test autoindex4-2.0 {
ORDER BY rowid; ORDER BY rowid;
} {1 123 654 | 0 555 444 | 4 234 987 |} } {1 123 654 | 0 555 444 | 4 234 987 |}
# Ticket [2326c258d02ead33d]
# Two joins, one with and the other without an ORDER BY clause.
# The one without ORDER BY correctly returns two rows of result.
# The one with ORDER BY returns no rows.
#
do_execsql_test autoindex4-3.0 {
CREATE TABLE A(Name text);
CREATE TABLE Items(ItemName text , Name text);
INSERT INTO Items VALUES('Item1','Parent');
INSERT INTO Items VALUES('Item2','Parent');
CREATE TABLE B(Name text);
SELECT Items.ItemName
FROM Items
LEFT JOIN A ON (A.Name = Items.ItemName and Items.ItemName = 'dummy')
LEFT JOIN B ON (B.Name = Items.ItemName)
WHERE Items.Name = 'Parent'
ORDER BY Items.ItemName;
} {Item1 Item2}
do_execsql_test autoindex4-3.1 {
CREATE INDEX Items_x1 ON Items(ItemName,Name) WHERE ItemName = 'dummy';
SELECT Items.ItemName
FROM Items
LEFT JOIN A ON (A.Name = Items.ItemName and Items.ItemName = 'dummy')
LEFT JOIN B ON (B.Name = Items.ItemName)
WHERE Items.Name = 'Parent'
ORDER BY Items.ItemName;
} {Item1 Item2}
finish_test finish_test

View File

@ -452,10 +452,22 @@ proc check_data {STMT test types ints doubles strings} {
# types # types
do_test $test.1 { do_test $test.1 {
set types [list] set types [list]
foreach i $idxlist {lappend types [sqlite3_column_type $STMT $i]} foreach i $idxlist {
set x [sqlite3_column_type $STMT $i]
# EVIDENCE-OF: R-12793-43283 Every value in SQLite has one of five
# fundamental datatypes: 64-bit signed integer 64-bit IEEE floating
# point number string BLOB NULL
if {[lsearch {INTEGER FLOAT TEXT BLOB NULL} $x]<0} {
set types ERROR
break
} else {
lappend types $x
}
}
set types set types
} $types } $types
# Integers # Integers
do_test $test.2 { do_test $test.2 {
set ints [list] set ints [list]

View File

@ -348,9 +348,9 @@ do_insert_tests e_insert-3.2 {
6.2 "SELECT * FROM a1" {{} {} {} {}} 6.2 "SELECT * FROM a1" {{} {} {} {}}
} }
# EVIDENCE-OF: R-46928-50290 The optional conflict-clause allows the # EVIDENCE-OF: R-03235-45250 The "REPLACE" and "INSERT OR action" forms
# specification of an alternative constraint conflict resolution # specify an alternative constraint conflict resolution algorithm to use
# algorithm to use during this one INSERT command. # during this one INSERT command.
# #
# EVIDENCE-OF: R-23110-47146 the parser allows the use of the single # EVIDENCE-OF: R-23110-47146 the parser allows the use of the single
# keyword REPLACE as an alias for "INSERT OR REPLACE". # keyword REPLACE as an alias for "INSERT OR REPLACE".

View File

@ -200,10 +200,11 @@ do_test 3.4.2 {
db close db close
# EVIDENCE-OF: R-22428-28959 To prevent older versions of SQLite from # EVIDENCE-OF: R-45540-25505 To prevent older versions of SQLite (prior
# trying to recover a WAL-mode database (and making matters worse) the # to version 3.7.0, 2010-07-22) from trying to recover a WAL-mode
# database file format version numbers (bytes 18 and 19 in the database # database (and making matters worse) the database file format version
# header) are increased from 1 to 2 in WAL mode. # numbers (bytes 18 and 19 in the database header) are increased from 1
# to 2 in WAL mode.
# #
reset_db reset_db
do_execsql_test 4.1.1 { CREATE TABLE t1(x, y) } do_execsql_test 4.1.1 { CREATE TABLE t1(x, y) }

View File

@ -12,8 +12,13 @@
# #
# This file tests the PRAGMA foreign_key_check command. # This file tests the PRAGMA foreign_key_check command.
# #
# EVIDENCE-OF: R-05426-18119 PRAGMA foreign_key_check; PRAGMA # EVIDENCE-OF: R-01427-50262 PRAGMA database.foreign_key_check; PRAGMA
# foreign_key_check(table-name); # database.foreign_key_check(table-name);
#
# EVIDENCE-OF: R-23918-17301 The foreign_key_check pragma checks the
# database, or the table called "table-name", for foreign key
# constraints that are violated and returns one row of output for each
# violation.
set testdir [file dirname $argv0] set testdir [file dirname $argv0]
source $testdir/tester.tcl source $testdir/tester.tcl
@ -74,6 +79,16 @@ do_test fkey5-1.2 {
PRAGMA foreign_key_check; PRAGMA foreign_key_check;
} }
} {c1 87 p1 0 c1 90 p1 0} } {c1 87 p1 0 c1 90 p1 0}
do_test fkey5-1.2b {
db eval {
PRAGMA main.foreign_key_check;
}
} {c1 87 p1 0 c1 90 p1 0}
do_test fkey5-1.2c {
db eval {
PRAGMA temp.foreign_key_check;
}
} {}
do_test fkey5-1.3 { do_test fkey5-1.3 {
db eval { db eval {
PRAGMA foreign_key_check(c1); PRAGMA foreign_key_check(c1);
@ -84,6 +99,16 @@ do_test fkey5-1.4 {
PRAGMA foreign_key_check(c2); PRAGMA foreign_key_check(c2);
} }
} {} } {}
do_test fkey5-1.5 {
db eval {
PRAGMA main.foreign_key_check(c2);
}
} {}
do_test fkey5-1.6 {
catchsql {
PRAGMA temp.foreign_key_check(c2);
}
} {1 {no such table: temp.c2}}
# EVIDENCE-OF: R-45728-08709 There are four columns in each result row. # EVIDENCE-OF: R-45728-08709 There are four columns in each result row.
# #

View File

@ -267,5 +267,64 @@ do_execsql_test index6-6.2 {
PRAGMA integrity_check; PRAGMA integrity_check;
} {ok} } {ok}
# Test case for ticket [2326c258d02ead33d69faa63de8f4686b9b1b9d9] on
# 2015-02-24. Any use of a partial index qualifying constraint inside
# the ON clause of a LEFT JOIN was causing incorrect results for all
# versions of SQLite 3.8.0 through 3.8.8.
#
do_execsql_test index6-7.0 {
CREATE TABLE t7a(x);
CREATE TABLE t7b(y);
INSERT INTO t7a(x) VALUES(1);
CREATE INDEX t7ax ON t7a(x) WHERE x=99;
PRAGMA automatic_index=OFF;
SELECT * FROM t7a LEFT JOIN t7b ON (x=99) ORDER BY x;
} {1 {}}
do_execsql_test index6-7.1 {
INSERT INTO t7b(y) VALUES(2);
SELECT * FROM t7a JOIN t7b ON (x=99) ORDER BY x;
} {}
do_execsql_test index6-7.2 {
INSERT INTO t7a(x) VALUES(99);
SELECT * FROM t7a LEFT JOIN t7b ON (x=99) ORDER BY x;
} {1 {} 99 2}
do_execsql_test index6-7.3 {
SELECT * FROM t7a JOIN t7b ON (x=99) ORDER BY x;
} {99 2}
do_execsql_test index6-7.4 {
EXPLAIN QUERY PLAN
SELECT * FROM t7a JOIN t7b ON (x=99) ORDER BY x;
} {/USING COVERING INDEX t7ax/}
do_execsql_test index6-8.0 {
CREATE TABLE t8a(a,b);
CREATE TABLE t8b(x,y);
CREATE INDEX i8c ON t8b(y) WHERE x = 'value';
INSERT INTO t8a VALUES(1, 'one');
INSERT INTO t8a VALUES(2, 'two');
INSERT INTO t8a VALUES(3, 'three');
INSERT INTO t8b VALUES('value', 1);
INSERT INTO t8b VALUES('dummy', 2);
INSERT INTO t8b VALUES('value', 3);
INSERT INTO t8b VALUES('dummy', 4);
} {}
do_eqp_test index6-8.1 {
SELECT * FROM t8a LEFT JOIN t8b ON (x = 'value' AND y = a)
} {
0 0 0 {SCAN TABLE t8a}
0 1 1 {SEARCH TABLE t8b USING INDEX i8c (y=?)}
}
do_execsql_test index6-8.2 {
SELECT * FROM t8a LEFT JOIN t8b ON (x = 'value' AND y = a)
} {
1 one value 1
2 two {} {}
3 three value 3
}
finish_test finish_test

View File

@ -21,6 +21,31 @@ ifcapable !vtab {
return return
} }
# Capture the output of a pragma in a TEMP table.
#
proc capture_pragma {db tabname sql} {
$db eval "DROP TABLE IF EXISTS temp.$tabname"
set once 1
$db eval $sql x {
if {$once} {
set once 0
set ins "INSERT INTO $tabname VALUES"
set crtab "CREATE TEMP TABLE $tabname "
set sep "("
foreach col $x(*) {
append ins ${sep}\$x($col)
append crtab ${sep}\"$col\"
set sep ,
}
append ins )
append crtab )
$db eval $crtab
}
$db eval $ins
}
}
load_static_extension db wholenumber; load_static_extension db wholenumber;
do_test index7-1.1 { do_test index7-1.1 {
# Able to parse and manage partial indices # Able to parse and manage partial indices
@ -37,6 +62,15 @@ do_test index7-1.1 {
} }
} {14 20 ok} } {14 20 ok}
# (The "partial" column of the PRAGMA index_list output is...)
# EVIDENCE-OF: R-34457-09668 "1" if the index is a partial index and "0"
# if not.
#
do_test index7-1.1a {
capture_pragma db out {PRAGMA index_list(t1)}
db eval {SELECT "name", "partial", '|' FROM out ORDER BY "name"}
} {sqlite_autoindex_t1_1 0 | t1a 1 | t1b 1 |}
# Make sure the count(*) optimization works correctly with # Make sure the count(*) optimization works correctly with
# partial indices. Ticket [a5c8ed66cae16243be6] 2013-10-03. # partial indices. Ticket [a5c8ed66cae16243be6] 2013-10-03.
# #

View File

@ -1,4 +1,4 @@
# 2008 October 4 # 2008-10-04
# #
# The author disclaims copyright to this source code. In place of # The author disclaims copyright to this source code. In place of
# a legal notice, here is a blessing: # a legal notice, here is a blessing:
@ -9,7 +9,6 @@
# #
#*********************************************************************** #***********************************************************************
# #
# $Id: indexedby.test,v 1.5 2009/03/22 20:36:19 drh Exp $
set testdir [file dirname $argv0] set testdir [file dirname $argv0]
source $testdir/tester.tcl source $testdir/tester.tcl
@ -59,19 +58,44 @@ do_execsql_test indexedby-1.4 {
# SQL view. Also test that specifying an index that does not exist or # SQL view. Also test that specifying an index that does not exist or
# is attached to a different table is detected as an error. # is attached to a different table is detected as an error.
# #
# EVIDENCE-OF: R-63761-48810 -- syntax diagram qualified-table-name
#
# EVIDENCE-OF: R-58230-57098 The "INDEXED BY index-name" phrase
# specifies that the named index must be used in order to look up values
# on the preceding table.
#
do_test indexedby-2.1 { do_test indexedby-2.1 {
execsql { SELECT * FROM t1 NOT INDEXED WHERE a = 'one' AND b = 'two'} execsql { SELECT * FROM t1 NOT INDEXED WHERE a = 'one' AND b = 'two'}
} {} } {}
do_test indexedby-2.1b {
execsql { SELECT * FROM main.t1 NOT INDEXED WHERE a = 'one' AND b = 'two'}
} {}
do_test indexedby-2.2 { do_test indexedby-2.2 {
execsql { SELECT * FROM t1 INDEXED BY i1 WHERE a = 'one' AND b = 'two'} execsql { SELECT * FROM t1 INDEXED BY i1 WHERE a = 'one' AND b = 'two'}
} {} } {}
do_test indexedby-2.2b {
execsql { SELECT * FROM main.t1 INDEXED BY i1 WHERE a = 'one' AND b = 'two'}
} {}
do_test indexedby-2.3 { do_test indexedby-2.3 {
execsql { SELECT * FROM t1 INDEXED BY i2 WHERE a = 'one' AND b = 'two'} execsql { SELECT * FROM t1 INDEXED BY i2 WHERE a = 'one' AND b = 'two'}
} {} } {}
# EVIDENCE-OF: R-44699-55558 The INDEXED BY clause does not give the
# optimizer hints about which index to use; it gives the optimizer a
# requirement of which index to use.
# EVIDENCE-OF: R-15800-25719 If index-name does not exist or cannot be
# used for the query, then the preparation of the SQL statement fails.
#
do_test indexedby-2.4 { do_test indexedby-2.4 {
catchsql { SELECT * FROM t1 INDEXED BY i3 WHERE a = 'one' AND b = 'two'} catchsql { SELECT * FROM t1 INDEXED BY i3 WHERE a = 'one' AND b = 'two'}
} {1 {no such index: i3}} } {1 {no such index: i3}}
# EVIDENCE-OF: R-62112-42456 If the query optimizer is unable to use the
# index specified by the INDEX BY clause, then the query will fail with
# an error.
do_test indexedby-2.4.1 {
catchsql { SELECT b FROM t1 INDEXED BY i1 WHERE b = 'two' }
} {1 {no query solution}}
do_test indexedby-2.5 { do_test indexedby-2.5 {
catchsql { SELECT * FROM t1 INDEXED BY i5 WHERE a = 'one' AND b = 'two'} catchsql { SELECT * FROM t1 INDEXED BY i5 WHERE a = 'one' AND b = 'two'}
} {1 {no such index: i5}} } {1 {no such index: i5}}
@ -82,11 +106,26 @@ do_test indexedby-2.7 {
catchsql { SELECT * FROM v1 INDEXED BY i1 WHERE a = 'one' } catchsql { SELECT * FROM v1 INDEXED BY i1 WHERE a = 'one' }
} {1 {no such index: i1}} } {1 {no such index: i1}}
# Tests for single table cases. # Tests for single table cases.
# #
# EVIDENCE-OF: R-37002-28871 The "NOT INDEXED" clause specifies that no
# index shall be used when accessing the preceding table, including
# implied indices create by UNIQUE and PRIMARY KEY constraints. However,
# the rowid can still be used to look up entries even when "NOT INDEXED"
# is specified.
#
do_execsql_test indexedby-3.1 { do_execsql_test indexedby-3.1 {
EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a = 'one' AND b = 'two'
} {/SEARCH TABLE t1 USING INDEX/}
do_execsql_test indexedby-3.1.1 {
EXPLAIN QUERY PLAN SELECT * FROM t1 NOT INDEXED WHERE a = 'one' AND b = 'two' EXPLAIN QUERY PLAN SELECT * FROM t1 NOT INDEXED WHERE a = 'one' AND b = 'two'
} {0 0 0 {SCAN TABLE t1}} } {0 0 0 {SCAN TABLE t1}}
do_execsql_test indexedby-3.1.2 {
EXPLAIN QUERY PLAN SELECT * FROM t1 NOT INDEXED WHERE rowid=1
} {/SEARCH TABLE t1 USING INTEGER PRIMARY KEY .rowid=/}
do_execsql_test indexedby-3.2 { do_execsql_test indexedby-3.2 {
EXPLAIN QUERY PLAN EXPLAIN QUERY PLAN
SELECT * FROM t1 INDEXED BY i1 WHERE a = 'one' AND b = 'two' SELECT * FROM t1 INDEXED BY i1 WHERE a = 'one' AND b = 'two'
@ -184,6 +223,10 @@ do_execsql_test indexedby-6.2 {
EXPLAIN QUERY PLAN SELECT * FROM t1 NOT INDEXED WHERE b = 10 ORDER BY rowid EXPLAIN QUERY PLAN SELECT * FROM t1 NOT INDEXED WHERE b = 10 ORDER BY rowid
} {0 0 0 {SCAN TABLE t1}} } {0 0 0 {SCAN TABLE t1}}
# EVIDENCE-OF: R-40297-14464 The INDEXED BY phrase forces the SQLite
# query planner to use a particular named index on a DELETE, SELECT, or
# UPDATE statement.
#
# Test that "INDEXED BY" can be used in a DELETE statement. # Test that "INDEXED BY" can be used in a DELETE statement.
# #
do_execsql_test indexedby-7.1 { do_execsql_test indexedby-7.1 {

View File

@ -749,7 +749,7 @@ ifcapable like_opt&&!icu {
count { count {
SELECT a FROM t10 WHERE f LIKE '12%' ORDER BY +a; SELECT a FROM t10 WHERE f LIKE '12%' ORDER BY +a;
} }
} {12 123 scan 3 like 0} } {12 123 scan 4 like 0}
do_test like-10.6 { do_test like-10.6 {
count { count {
SELECT a FROM t10 WHERE a LIKE '12%' ORDER BY +a; SELECT a FROM t10 WHERE a LIKE '12%' ORDER BY +a;
@ -790,7 +790,7 @@ ifcapable like_opt&&!icu {
count { count {
SELECT a FROM t10b WHERE f GLOB '12*' ORDER BY +a; SELECT a FROM t10b WHERE f GLOB '12*' ORDER BY +a;
} }
} {12 123 scan 3 like 0} } {12 123 scan 4 like 0}
do_test like-10.15 { do_test like-10.15 {
count { count {
SELECT a FROM t10b WHERE a GLOB '12*' ORDER BY +a; SELECT a FROM t10b WHERE a GLOB '12*' ORDER BY +a;

112
test/like3.test Normal file
View File

@ -0,0 +1,112 @@
# 2015-03-06
#
# 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 LIKE and GLOB operators and
# in particular the optimizations that occur to help those operators
# run faster and that those optimizations work correctly when there
# are both strings and blobs being tested.
#
# Ticket 05f43be8fdda9fbd948d374319b99b054140bc36 shows that the following
# SQL was not working correctly:
#
# CREATE TABLE t1(x TEXT UNIQUE COLLATE nocase);
# INSERT INTO t1(x) VALUES(x'616263');
# SELECT 'query-1', x FROM t1 WHERE x LIKE 'a%';
# SELECT 'query-2', x FROM t1 WHERE +x LIKE 'a%';
#
# This script verifies that it works right now.
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
do_execsql_test like3-1.1 {
PRAGMA encoding=UTF8;
CREATE TABLE t1(a,b TEXT COLLATE nocase);
INSERT INTO t1(a,b)
VALUES(1,'abc'),
(2,'ABX'),
(3,'BCD'),
(4,x'616263'),
(5,x'414258'),
(6,x'424344');
CREATE INDEX t1ba ON t1(b,a);
SELECT a, b FROM t1 WHERE b LIKE 'aB%' ORDER BY +a;
} {1 abc 2 ABX 4 abc 5 ABX}
do_execsql_test like3-1.2 {
SELECT a, b FROM t1 WHERE +b LIKE 'aB%' ORDER BY +a;
} {1 abc 2 ABX 4 abc 5 ABX}
do_execsql_test like3-2.0 {
CREATE TABLE t2(a, b TEXT);
INSERT INTO t2 SELECT a, b FROM t1;
CREATE INDEX t2ba ON t2(b,a);
SELECT a, b FROM t2 WHERE b GLOB 'ab*' ORDER BY +a;
} {1 abc 4 abc}
do_execsql_test like3-2.1 {
SELECT a, b FROM t2 WHERE +b GLOB 'ab*' ORDER BY +a;
} {1 abc 4 abc}
do_execsql_test like3-2.2 {
SELECT a, b FROM t2 WHERE b>=x'6162' AND b GLOB 'ab*'
} {4 abc}
do_execsql_test like3-2.3 {
SELECT a, b FROM t2 WHERE +b>=x'6162' AND +b GLOB 'ab*'
} {4 abc}
do_execsql_test like3-2.4 {
SELECT a, b FROM t2 WHERE b GLOB 'ab*' AND b>=x'6162'
} {4 abc}
do_execsql_test like3-2.5 {
SELECT a, b FROM t2 WHERE +b GLOB 'ab*' AND +b>=x'6162'
} {4 abc}
do_execsql_test like3-3.0 {
CREATE TABLE t3(x TEXT PRIMARY KEY COLLATE nocase);
INSERT INTO t3(x) VALUES('aaa'),('abc'),('abd'),('abe'),('acz');
INSERT INTO t3(x) SELECT CAST(x AS blob) FROM t3;
SELECT quote(x) FROM t3 WHERE x LIKE 'ab%' ORDER BY x;
} {'abc' 'abd' 'abe' X'616263' X'616264' X'616265'}
do_execsql_test like3-3.1 {
SELECT quote(x) FROM t3 WHERE x LIKE 'ab%' ORDER BY x DESC;
} {X'616265' X'616264' X'616263' 'abe' 'abd' 'abc'}
do_execsql_test like3-3.1ck {
SELECT quote(x) FROM t3 WHERE x LIKE 'ab%' ORDER BY +x DESC;
} {X'616265' X'616264' X'616263' 'abe' 'abd' 'abc'}
do_execsql_test like3-3.2 {
SELECT quote(x) FROM t3 WHERE x LIKE 'ab%' ORDER BY x ASC;
} {'abc' 'abd' 'abe' X'616263' X'616264' X'616265'}
do_execsql_test like3-3.2ck {
SELECT quote(x) FROM t3 WHERE x LIKE 'ab%' ORDER BY +x ASC;
} {'abc' 'abd' 'abe' X'616263' X'616264' X'616265'}
do_execsql_test like3-4.0 {
CREATE TABLE t4(x TEXT COLLATE nocase);
CREATE INDEX t4x ON t4(x DESC);
INSERT INTO t4(x) SELECT x FROM t3;
SELECT quote(x) FROM t4 WHERE x LIKE 'ab%' ORDER BY x;
} {'abc' 'abd' 'abe' X'616263' X'616264' X'616265'}
do_execsql_test like3-4.1 {
SELECT quote(x) FROM t4 WHERE x LIKE 'ab%' ORDER BY x DESC;
} {X'616265' X'616264' X'616263' 'abe' 'abd' 'abc'}
do_execsql_test like3-4.1ck {
SELECT quote(x) FROM t4 WHERE x LIKE 'ab%' ORDER BY +x DESC;
} {X'616265' X'616264' X'616263' 'abe' 'abd' 'abc'}
do_execsql_test like3-4.2 {
SELECT quote(x) FROM t4 WHERE x LIKE 'ab%' ORDER BY x ASC;
} {'abc' 'abd' 'abe' X'616263' X'616264' X'616265'}
do_execsql_test like3-4.2ck {
SELECT quote(x) FROM t4 WHERE x LIKE 'ab%' ORDER BY +x ASC;
} {'abc' 'abd' 'abe' X'616263' X'616264' X'616265'}
finish_test

View File

@ -251,6 +251,12 @@ do_test limit-6.8 {
# Make sure LIMIT works well with compound SELECT statements. # Make sure LIMIT works well with compound SELECT statements.
# Ticket #393 # Ticket #393
# #
# EVIDENCE-OF: R-13512-64012 In a compound SELECT, only the last or
# right-most simple SELECT may contain a LIMIT clause.
#
# EVIDENCE-OF: R-03782-50113 In a compound SELECT, the LIMIT clause
# applies to the entire compound, not just the final SELECT.
#
ifcapable compound { ifcapable compound {
do_test limit-7.1.1 { do_test limit-7.1.1 {
catchsql { catchsql {

View File

@ -241,6 +241,9 @@ execsql {ROLLBACK}
# Test the built-in busy timeout handler # Test the built-in busy timeout handler
# #
# EVIDENCE-OF: R-23579-05241 PRAGMA busy_timeout; PRAGMA busy_timeout =
# milliseconds; Query or change the setting of the busy timeout.
#
do_test lock-2.8 { do_test lock-2.8 {
db2 timeout 400 db2 timeout 400
execsql BEGIN execsql BEGIN

View File

@ -59,6 +59,14 @@ do_test multiplex4-1.1 {
multiplex_file_list mx4test multiplex_file_list mx4test
} {mx4test.db} } {mx4test.db}
# NB: The PRAGMA multiplex_truncate command is implemented using the
# SQLITE_FCNTL_PRAGMA file-control...
#
# EVIDENCE-OF: R-12238-55120 Whenever a PRAGMA statement is parsed, an
# SQLITE_FCNTL_PRAGMA file control is sent to the open sqlite3_file
# object corresponding to the database file to which the pragma
# statement refers.
#
do_test multiplex4-1.2 { do_test multiplex4-1.2 {
db eval {PRAGMA multiplex_truncate} db eval {PRAGMA multiplex_truncate}
} {on} } {on}
@ -84,6 +92,16 @@ do_test multiplex4-1.9 {
db eval {PRAGMA multiplex_truncate=0} db eval {PRAGMA multiplex_truncate=0}
} {off} } {off}
# EVIDENCE-OF: R-26188-08449 If the SQLITE_FCNTL_PRAGMA file control
# returns SQLITE_OK, then the parser assumes that the VFS has handled
# the PRAGMA itself and the parser generates a no-op prepared statement
# if result string is NULL, or that returns a copy of the result string
# if the string is non-NULL.
#
do_test multiplex4-1.9-explain {
db eval {EXPLAIN PRAGMA multiplex_truncate=0;}
} {/String8 \d \d \d off/}
do_test multiplex4-1.10 { do_test multiplex4-1.10 {
db eval { db eval {
INSERT INTO t1(x) VALUES(randomblob(250000)); INSERT INTO t1(x) VALUES(randomblob(250000));

View File

@ -83,7 +83,11 @@ delete_file test.db test.db-journal
delete_file test3.db test3.db-journal delete_file test3.db test3.db-journal
sqlite3 db test.db; set DB [sqlite3_connection_pointer db] sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
# EVIDENCE-OF: R-24197-42751 PRAGMA database.cache_size; PRAGMA
# database.cache_size = pages; PRAGMA database.cache_size = -kibibytes;
# Query or change the suggested maximum number of database disk pages
# that SQLite will hold in memory at once per open database file.
#
ifcapable pager_pragmas { ifcapable pager_pragmas {
set DFLT_CACHE_SZ [db one {PRAGMA default_cache_size}] set DFLT_CACHE_SZ [db one {PRAGMA default_cache_size}]
set TEMP_CACHE_SZ [db one {PRAGMA temp.default_cache_size}] set TEMP_CACHE_SZ [db one {PRAGMA temp.default_cache_size}]
@ -95,6 +99,8 @@ do_test pragma-1.1 {
} }
} [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 2] } [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 2]
do_test pragma-1.2 { do_test pragma-1.2 {
# EVIDENCE-OF: R-42059-47211 If the argument N is positive then the
# suggested cache size is set to N.
execsql { execsql {
PRAGMA synchronous=OFF; PRAGMA synchronous=OFF;
PRAGMA cache_size=1234; PRAGMA cache_size=1234;
@ -662,6 +668,37 @@ do_test pragma-6.5.1 {
} }
db eval {SELECT seqno, cid, name FROM out ORDER BY seqno} db eval {SELECT seqno, cid, name FROM out ORDER BY seqno}
} {0 0 a 1 1 b} } {0 0 a 1 1 b}
# EVIDENCE-OF: R-23114-21695 The auxiliary index-columns are not shown
# by the index_info pragma, but they are listed by the index_xinfo
# pragma.
#
do_test pragma-6.5.1b {
capture_pragma db out {PRAGMA index_xinfo(t3i1)}
db eval {SELECT seqno, cid, name FROM out ORDER BY seqno}
} {0 0 a 1 1 b 2 -1 {}}
# EVIDENCE-OF: R-62725-03366 PRAGMA database.index_info(index-name);
# This pragma returns one row for each key column in the named index.
#
# (The first column of output from PRAGMA index_info is...)
# EVIDENCE-OF: R-34186-52914 The rank of the column within the index. (0
# means left-most.)
#
# (The second column of output from PRAGMA index_info is...)
# EVIDENCE-OF: R-65019-08383 The rank of the column within the table
# being indexed.
#
# (The third column of output from PRAGMA index_info is...)
# EVIDENCE-OF: R-09773-34266 The name of the column being indexed.
#
do_execsql_test pragma-6.5.1c {
CREATE INDEX t3i2 ON t3(b,a);
PRAGMA index_info='t3i2';
DROP INDEX t3i2;
} {0 1 b 1 0 a}
do_test pragma-6.5.2 { do_test pragma-6.5.2 {
execsql { execsql {
pragma index_info(t3i1_bogus); pragma index_info(t3i1_bogus);
@ -719,6 +756,9 @@ do_test pragma-6.7 {
# Miscellaneous tests # Miscellaneous tests
# #
ifcapable schema_pragmas { ifcapable schema_pragmas {
# EVIDENCE-OF: R-63500-32024 PRAGMA database.index_list(table-name);
# This pragma returns one row for each index associated with the given
# table.
do_test pragma-7.1.1 { do_test pragma-7.1.1 {
# Make sure a pragma knows to read the schema if it needs to # Make sure a pragma knows to read the schema if it needs to
db close db close
@ -1311,17 +1351,22 @@ ifcapable pager_pragmas {
forcedelete test.db forcedelete test.db
sqlite3 db test.db sqlite3 db test.db
# EVIDENCE-OF: R-13905-26312 PRAGMA database.page_count; Return the
# total number of pages in the database file.
#
do_test pragma-14.1 { do_test pragma-14.1 {
execsql { pragma auto_vacuum = 0 } execsql { pragma auto_vacuum = 0 }
execsql { pragma page_count } execsql { pragma page_count; pragma main.page_count }
} {0} } {0 0}
do_test pragma-14.2 { do_test pragma-14.2 {
execsql { execsql {
CREATE TABLE abc(a, b, c); CREATE TABLE abc(a, b, c);
PRAGMA page_count; PRAGMA page_count;
PRAGMA main.page_count;
PRAGMA temp.page_count;
} }
} {2} } {2 2 0}
do_test pragma-14.2uc { do_test pragma-14.2uc {
execsql {pragma PAGE_COUNT} execsql {pragma PAGE_COUNT}
} {2} } {2}
@ -1730,29 +1775,90 @@ do_test 23.1 {
CREATE TABLE t1(a INTEGER PRIMARY KEY,b,c,d); CREATE TABLE t1(a INTEGER PRIMARY KEY,b,c,d);
CREATE INDEX i1 ON t1(b,c); CREATE INDEX i1 ON t1(b,c);
CREATE INDEX i2 ON t1(c,d); CREATE INDEX i2 ON t1(c,d);
CREATE INDEX i2x ON t1(d COLLATE nocase, c DESC);
CREATE TABLE t2(x INTEGER REFERENCES t1); CREATE TABLE t2(x INTEGER REFERENCES t1);
} }
db2 eval {SELECT name FROM sqlite_master} db2 eval {SELECT name FROM sqlite_master}
} {t1 i1 i2 t2} } {t1 i1 i2 i2x t2}
do_test 23.2a { do_test 23.2a {
db eval { db eval {
DROP INDEX i2; DROP INDEX i2;
CREATE INDEX i2 ON t1(c,d,b); CREATE INDEX i2 ON t1(c,d,b);
} }
capture_pragma db2 out {PRAGMA index_info(i2)} capture_pragma db2 out {PRAGMA index_info(i2)}
db2 eval {SELECT cid, name, "desc", coll, "key", '|' FROM out ORDER BY seqno} db2 eval {SELECT cid, name, '|' FROM out ORDER BY seqno}
} {2 c 0 BINARY 1 | 3 d 0 BINARY 1 | 1 b 0 BINARY 1 |} } {2 c | 3 d | 1 b |}
# EVIDENCE-OF: R-44874-46325 PRAGMA database.index_xinfo(index-name);
# This pragma returns information about every column in an index.
#
# EVIDENCE-OF: R-45970-35618 Unlike this index_info pragma, this pragma
# returns information about every column in the index, not just the key
# columns.
#
do_test 23.2b { do_test 23.2b {
capture_pragma db2 out {PRAGMA index_xinfo(i2)} capture_pragma db2 out {PRAGMA index_xinfo(i2)}
db2 eval {SELECT cid, name, "desc", coll, "key", '|' FROM out ORDER BY seqno} db2 eval {SELECT cid, name, "desc", coll, "key", '|' FROM out ORDER BY seqno}
} {2 c 0 BINARY 1 | 3 d 0 BINARY 1 | 1 b 0 BINARY 1 | -1 {} 0 BINARY 0 |} } {2 c 0 BINARY 1 | 3 d 0 BINARY 1 | 1 b 0 BINARY 1 | -1 {} 0 BINARY 0 |}
# (The first column of output from PRAGMA index_xinfo is...)
# EVIDENCE-OF: R-00197-14279 The rank of the column within the index. (0
# means left-most. Key columns come before auxiliary columns.)
#
# (The second column of output from PRAGMA index_xinfo is...)
# EVIDENCE-OF: R-40889-06838 The rank of the column within the table
# being indexed, or -1 if the index-column is the rowid of the table
# being indexed.
#
# (The third column of output from PRAGMA index_xinfo is...)
# EVIDENCE-OF: R-22751-28901 The name of the column being indexed, or
# NULL if the index-column is the rowid of the table being indexed.
#
# (The fourth column of output from PRAGMA index_xinfo is...)
# EVIDENCE-OF: R-11847-09179 1 if the index-column is sorted in reverse
# (DESC) order by the index and 0 otherwise.
#
# (The fifth column of output from PRAGMA index_xinfo is...)
# EVIDENCE-OF: R-15313-19540 The name for the collating sequence used to
# compare values in the index-column.
#
# (The sixth column of output from PRAGMA index_xinfo is...)
# EVIDENCE-OF: R-14310-64553 1 if the index-column is a key column and 0
# if the index-column is an auxiliary column.
#
do_test 23.2c {
db2 eval {PRAGMA index_xinfo(i2)}
} {0 2 c 0 BINARY 1 1 3 d 0 BINARY 1 2 1 b 0 BINARY 1 3 -1 {} 0 BINARY 0}
do_test 23.2d {
db2 eval {PRAGMA index_xinfo(i2x)}
} {0 3 d 0 nocase 1 1 2 c 1 BINARY 1 2 -1 {} 0 BINARY 0}
# EVIDENCE-OF: R-63500-32024 PRAGMA database.index_list(table-name);
# This pragma returns one row for each index associated with the given
# table.
#
# (The first column of output from PRAGMA index_list is...)
# EVIDENCE-OF: R-02753-24748 A sequence number assigned to each index
# for internal tracking purposes.
#
# (The second column of output from PRAGMA index_list is...)
# EVIDENCE-OF: R-35496-03635 The name of the index.
#
# (The third column of output from PRAGMA index_list is...)
# EVIDENCE-OF: R-57301-64506 "1" if the index is UNIQUE and "0" if not.
#
# (The fourth column of output from PRAGMA index_list is...)
# EVIDENCE-OF: R-36609-39554 "c" if the index was created by a CREATE
# INDEX statement, "u" if the index was created by a UNIQUE constraint,
# or "pk" if the index was created by a PRIMARY KEY constraint.
#
do_test 23.3 { do_test 23.3 {
db eval { db eval {
CREATE INDEX i3 ON t1(d,b,c); CREATE INDEX i3 ON t1(d,b,c);
} }
capture_pragma db2 out {PRAGMA index_list(t1)} capture_pragma db2 out {PRAGMA index_list(t1)}
db2 eval {SELECT name, "unique", origin FROM out ORDER BY seq} db2 eval {SELECT seq, name, "unique", origin, '|' FROM out ORDER BY seq}
} {i3 0 c i2 0 c i1 0 c} } {0 i3 0 c | 1 i2 0 c | 2 i2x 0 c | 3 i1 0 c |}
do_test 23.4 { do_test 23.4 {
db eval { db eval {
ALTER TABLE t1 ADD COLUMN e; ALTER TABLE t1 ADD COLUMN e;

View File

@ -39,6 +39,10 @@ delete_file test3.db test3.db-journal
sqlite3 db test.db; set DB [sqlite3_connection_pointer db] sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
db eval {PRAGMA auto_vacuum=0} db eval {PRAGMA auto_vacuum=0}
# EVIDENCE-OF: R-17887-14874 PRAGMA database.freelist_count; Return the
# number of unused pages in the database file.
#
do_test pragma2-1.1 { do_test pragma2-1.1 {
execsql { execsql {
PRAGMA freelist_count; PRAGMA freelist_count;

View File

@ -32,6 +32,11 @@ do_test rdonly-1.1 {
SELECT * FROM t1; SELECT * FROM t1;
} }
} {1} } {1}
# EVIDENCE-OF: R-29639-16887 The sqlite3_db_readonly(D,N) interface
# returns 1 if the database N of connection D is read-only, 0 if it is
# read/write, or -1 if N is not the name of a database on connection D.
#
do_test rdonly-1.1.1 { do_test rdonly-1.1.1 {
sqlite3_db_readonly db main sqlite3_db_readonly db main
} {0} } {0}

View File

@ -105,6 +105,10 @@ ifcapable subquery {
} }
} {0 1 2 2 3 3 3 3} } {0 1 2 2 3 3 3 3}
} }
# EVIDENCE-OF: R-02644-22131 In a compound SELECT statement, only the
# last or right-most simple SELECT may have an ORDER BY clause.
#
do_test select4-1.3 { do_test select4-1.3 {
set v [catch {execsql { set v [catch {execsql {
SELECT DISTINCT log FROM t1 ORDER BY log SELECT DISTINCT log FROM t1 ORDER BY log

View File

@ -24,6 +24,9 @@ do_test shrink-1.1 {
INSERT INTO t1 VALUES(randomblob(1000000),1); INSERT INTO t1 VALUES(randomblob(1000000),1);
} }
set ::baseline sqlite3_memory_used set ::baseline sqlite3_memory_used
# EVIDENCE-OF: R-58814-63508 The sqlite3_db_release_memory(D) interface
# attempts to free as much heap memory as possible from database
# connection D.
sqlite3_db_release_memory db sqlite3_db_release_memory db
expr {$::baseline > [sqlite3_memory_used]+500000} expr {$::baseline > [sqlite3_memory_used]+500000}
} {1} } {1}

View File

@ -24,6 +24,14 @@ ifcapable !integrityck {
return return
} }
# EVIDENCE-OF: R-26343-45930 This pragma invokes the
# sqlite3_soft_heap_limit64() interface with the argument N, if N is
# specified and is a non-negative integer.
#
# EVIDENCE-OF: R-64451-07163 The soft_heap_limit pragma always returns
# the same integer that would be returned by the
# sqlite3_soft_heap_limit64(-1) C-language function.
#
do_test softheap1-1.0 { do_test softheap1-1.0 {
execsql {PRAGMA soft_heap_limit} execsql {PRAGMA soft_heap_limit}
} [sqlite3_soft_heap_limit -1] } [sqlite3_soft_heap_limit -1]

View File

@ -25,7 +25,20 @@ sqlite3 db test.db
# Configure the sorter to use 3 background threads. # Configure the sorter to use 3 background threads.
db eval {PRAGMA threads=3} #
# EVIDENCE-OF: R-19249-32353 SQLITE_LIMIT_WORKER_THREADS The maximum
# number of auxiliary worker threads that a single prepared statement
# may start.
#
do_test sort4-init001 {
db eval {PRAGMA threads=5}
sqlite3_limit db SQLITE_LIMIT_WORKER_THREADS -1
} {5}
do_test sort4-init002 {
sqlite3_limit db SQLITE_LIMIT_WORKER_THREADS 3
db eval {PRAGMA threads}
} {3}
# Minimum number of seconds to run for. If the value is 0, each test # Minimum number of seconds to run for. If the value is 0, each test
# is run exactly once. Otherwise, tests are repeated until the timeout # is run exactly once. Otherwise, tests are repeated until the timeout

View File

@ -250,6 +250,9 @@ do_test sqllimits1-4.10.1 {
# Test cases sqllimits1-5.* test that the SQLITE_MAX_LENGTH limit # Test cases sqllimits1-5.* test that the SQLITE_MAX_LENGTH limit
# is enforced. # is enforced.
# #
# EVIDENCE-OF: R-61987-00541 SQLITE_LIMIT_LENGTH The maximum size of any
# string or BLOB or table row, in bytes.
#
db close db close
sqlite3 db test.db sqlite3 db test.db
set LARGESIZE 99999 set LARGESIZE 99999
@ -406,6 +409,9 @@ unset strvalue
# Test cases sqllimits1-6.* test that the SQLITE_MAX_SQL_LENGTH limit # Test cases sqllimits1-6.* test that the SQLITE_MAX_SQL_LENGTH limit
# is enforced. # is enforced.
# #
# EVIDENCE-OF: R-09808-17554 SQLITE_LIMIT_SQL_LENGTH The maximum length
# of an SQL statement, in bytes.
#
do_test sqllimits1-6.1 { do_test sqllimits1-6.1 {
sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 50000 sqlite3_limit db SQLITE_LIMIT_SQL_LENGTH 50000
set sql "SELECT 1 WHERE 1==1" set sql "SELECT 1 WHERE 1==1"
@ -567,6 +573,11 @@ do_test sqllimits1-7.7.4 {
#-------------------------------------------------------------------- #--------------------------------------------------------------------
# Test cases sqllimits1-8.* test the SQLITE_MAX_COLUMN limit. # Test cases sqllimits1-8.* test the SQLITE_MAX_COLUMN limit.
# #
# EVIDENCE-OF: R-43996-29471 SQLITE_LIMIT_COLUMN The maximum number of
# columns in a table definition or in the result set of a SELECT or the
# maximum number of columns in an index or in an ORDER BY or GROUP BY
# clause.
#
set SQLITE_LIMIT_COLUMN 200 set SQLITE_LIMIT_COLUMN 200
sqlite3_limit db SQLITE_LIMIT_COLUMN $SQLITE_LIMIT_COLUMN sqlite3_limit db SQLITE_LIMIT_COLUMN $SQLITE_LIMIT_COLUMN
do_test sqllimits1-8.1 { do_test sqllimits1-8.1 {
@ -670,6 +681,9 @@ do_test sqllimits1-8.11 {
# limit is enforced. The limit refers to the number of terms in # limit is enforced. The limit refers to the number of terms in
# the expression. # the expression.
# #
# EVIDENCE-OF: R-12723-08526 SQLITE_LIMIT_EXPR_DEPTH The maximum depth
# of the parse tree on any expression.
#
if {$SQLITE_MAX_EXPR_DEPTH==0} { if {$SQLITE_MAX_EXPR_DEPTH==0} {
puts -nonewline stderr "WARNING: Compile with -DSQLITE_MAX_EXPR_DEPTH to run " puts -nonewline stderr "WARNING: Compile with -DSQLITE_MAX_EXPR_DEPTH to run "
puts stderr "tests sqllimits1-9.X" puts stderr "tests sqllimits1-9.X"
@ -729,6 +743,9 @@ if 0 {
# Test the SQLITE_LIMIT_FUNCTION_ARG limit works. Test case names # Test the SQLITE_LIMIT_FUNCTION_ARG limit works. Test case names
# match the pattern "sqllimits1-11.*". # match the pattern "sqllimits1-11.*".
# #
# EVIDENCE-OF: R-59001-45278 SQLITE_LIMIT_FUNCTION_ARG The maximum
# number of arguments on a function.
#
for {set max 5} {$max<=$SQLITE_MAX_FUNCTION_ARG} {incr max} { for {set max 5} {$max<=$SQLITE_MAX_FUNCTION_ARG} {incr max} {
do_test sqllimits1-11.$max.1 { do_test sqllimits1-11.$max.1 {
set vals [list] set vals [list]
@ -762,6 +779,9 @@ for {set max 5} {$max<=$SQLITE_MAX_FUNCTION_ARG} {incr max} {
#-------------------------------------------------------------------- #--------------------------------------------------------------------
# Test cases sqllimits1-12.*: Test the SQLITE_MAX_ATTACHED limit. # Test cases sqllimits1-12.*: Test the SQLITE_MAX_ATTACHED limit.
# #
# EVIDENCE-OF: R-41778-26203 SQLITE_LIMIT_ATTACHED The maximum number of
# attached databases.
#
ifcapable attach { ifcapable attach {
do_test sqllimits1-12.1 { do_test sqllimits1-12.1 {
set max $::SQLITE_MAX_ATTACHED set max $::SQLITE_MAX_ATTACHED
@ -785,6 +805,9 @@ ifcapable attach {
# Test cases sqllimits1-13.*: Check that the SQLITE_MAX_VARIABLE_NUMBER # Test cases sqllimits1-13.*: Check that the SQLITE_MAX_VARIABLE_NUMBER
# limit works. # limit works.
# #
# EVIDENCE-OF: R-42363-29104 SQLITE_LIMIT_VARIABLE_NUMBER The maximum
# index number of any parameter in an SQL statement.
#
do_test sqllimits1-13.1 { do_test sqllimits1-13.1 {
set max $::SQLITE_MAX_VARIABLE_NUMBER set max $::SQLITE_MAX_VARIABLE_NUMBER
catchsql "SELECT ?[expr {$max+1}] FROM t1" catchsql "SELECT ?[expr {$max+1}] FROM t1"
@ -806,6 +829,9 @@ do_test sqllimits1-13.2 {
# implementation by overriding the like() scalar function bypasses # implementation by overriding the like() scalar function bypasses
# this limitation. # this limitation.
# #
# EVIDENCE-OF: R-12940-37052 SQLITE_LIMIT_LIKE_PATTERN_LENGTH The
# maximum length of the pattern argument to the LIKE or GLOB operators.
#
# These tests check that the limit is not incorrectly applied to # These tests check that the limit is not incorrectly applied to
# the left-hand-side of the LIKE operator (the string being tested # the left-hand-side of the LIKE operator (the string being tested
# against the pattern). # against the pattern).

View File

@ -66,11 +66,11 @@ do_test where8-1.3 {
do_test where8-1.4 { do_test where8-1.4 {
execsql_status2 { SELECT c FROM t1 WHERE a > 8 OR b GLOB 't*' } execsql_status2 { SELECT c FROM t1 WHERE a > 8 OR b GLOB 't*' }
} {IX X III II 0 0 9} } {IX X III II 0 0 10}
do_test where8-1.5 { do_test where8-1.5 {
execsql_status2 { SELECT c FROM t1 WHERE a > 8 OR b GLOB 'f*' } execsql_status2 { SELECT c FROM t1 WHERE a > 8 OR b GLOB 'f*' }
} {IX X V IV 0 0 9} } {IX X V IV 0 0 10}
do_test where8-1.6 { do_test where8-1.6 {
execsql_status { SELECT c FROM t1 WHERE a = 1 OR b = 'three' ORDER BY rowid } execsql_status { SELECT c FROM t1 WHERE a = 1 OR b = 'three' ORDER BY rowid }

View File

@ -120,6 +120,7 @@ foreach hdr {
sqliteLimit.h sqliteLimit.h
vdbe.h vdbe.h
vdbeInt.h vdbeInt.h
vxworks.h
wal.h wal.h
whereInt.h whereInt.h
} { } {