Merge recent enhancements from trunk. Version now 3.9.1.

FossilOrigin-Name: 26fa091d68e89a0b6af61ba706d23a9f37e8025a
This commit is contained in:
drh 2015-10-16 20:53:57 +00:00
commit 0030aaad67
48 changed files with 526 additions and 240 deletions

View File

@ -292,9 +292,9 @@ NSDKLIBPATH = $(NSDKLIBPATH:\\=\)
# will run on the platform that is doing the build. # will run on the platform that is doing the build.
# #
!IF $(USE_FULLWARN)!=0 !IF $(USE_FULLWARN)!=0
BCC = $(NCC) -nologo -W4 BCC = $(NCC) -nologo -W4 $(CCOPTS) $(BCCOPTS)
!ELSE !ELSE
BCC = $(NCC) -nologo -W3 BCC = $(NCC) -nologo -W3 $(CCOPTS) $(BCCOPTS)
!ENDIF !ENDIF
# Check if assembly code listings should be generated for the source # Check if assembly code listings should be generated for the source
@ -322,13 +322,13 @@ NLTLIBPATHS = $(NLTLIBPATHS) "/LIBPATH:$(NUCRTLIBPATH)"
# same unless your are cross-compiling.) # same unless your are cross-compiling.)
# #
!IF $(USE_FULLWARN)!=0 !IF $(USE_FULLWARN)!=0
TCC = $(CC) -nologo -W4 -DINCLUDE_MSVC_H=1 TCC = $(CC) -nologo -W4 -DINCLUDE_MSVC_H=1 $(CCOPTS) $(TCCOPTS)
!ELSE !ELSE
TCC = $(CC) -nologo -W3 TCC = $(CC) -nologo -W3 $(CCOPTS) $(TCCOPTS)
!ENDIF !ENDIF
TCC = $(TCC) -DSQLITE_OS_WIN=1 -I. -I$(TOP) -I$(TOP)\src -fp:precise TCC = $(TCC) -DSQLITE_OS_WIN=1 -I. -I$(TOP) -I$(TOP)\src -fp:precise
RCC = $(RC) -DSQLITE_OS_WIN=1 -I$(TOP) -I$(TOP)\src RCC = $(RC) -DSQLITE_OS_WIN=1 -I$(TOP) -I$(TOP)\src $(RCOPTS) $(RCCOPTS)
# Check if we want to use the "stdcall" calling convention when compiling. # Check if we want to use the "stdcall" calling convention when compiling.
# This is not supported by the compilers for non-x86 platforms. It should # This is not supported by the compilers for non-x86 platforms. It should
@ -573,6 +573,10 @@ LIBTCL = tcl85.lib
LIBTCLSTUB = tclstub85.lib LIBTCLSTUB = tclstub85.lib
!ENDIF !ENDIF
!IFNDEF LIBTCLPATH
LIBTCLPATH = c:\tcl\bin
!ENDIF
# The locations of the ICU header and library files. These variables # The locations of the ICU header and library files. These variables
# (ICUINCDIR, ICULIBDIR, and LIBICU) may be overridden via the environment # (ICUINCDIR, ICULIBDIR, and LIBICU) may be overridden via the environment
# prior to running nmake in order to match the actual installed location on # prior to running nmake in order to match the actual installed location on
@ -796,7 +800,9 @@ LTLINKOPTS = $(LTLINKOPTS) "/LIBPATH:$(PSDKLIBPATH)"
# If either debugging or symbols are enabled, enable PDBs. # If either debugging or symbols are enabled, enable PDBs.
# #
!IF $(DEBUG)>1 || $(SYMBOLS)!=0 !IF $(DEBUG)>1 || $(SYMBOLS)!=0
LDFLAGS = /DEBUG LDFLAGS = /DEBUG $(LDOPTS)
!ELSE
LDFLAGS = $(LDOPTS)
!ENDIF !ENDIF
# Start with the Tcl related linker options. # Start with the Tcl related linker options.
@ -1311,7 +1317,7 @@ lempar.c: $(TOP)\src\lempar.c
lemon.exe: $(TOP)\tool\lemon.c lempar.c lemon.exe: $(TOP)\tool\lemon.c lempar.c
$(BCC) $(NO_WARN) -Daccess=_access \ $(BCC) $(NO_WARN) -Daccess=_access \
-Fe$@ $(TOP)\tool\lemon.c /link $(NLTLINKOPTS) $(NLTLIBPATHS) -Fe$@ $(TOP)\tool\lemon.c /link $(LDFLAGS) $(NLTLINKOPTS) $(NLTLIBPATHS)
# Rules to build individual *.lo files from generated *.c files. This # Rules to build individual *.lo files from generated *.c files. This
# applies to: # applies to:
@ -1598,7 +1604,7 @@ sqlite3ext.h: .target_source
mkkeywordhash.exe: $(TOP)\tool\mkkeywordhash.c mkkeywordhash.exe: $(TOP)\tool\mkkeywordhash.c
$(BCC) $(NO_WARN) -Fe$@ $(REQ_FEATURE_FLAGS) $(OPT_FEATURE_FLAGS) $(OPTS) \ $(BCC) $(NO_WARN) -Fe$@ $(REQ_FEATURE_FLAGS) $(OPT_FEATURE_FLAGS) $(OPTS) \
$(TOP)\tool\mkkeywordhash.c /link $(NLTLINKOPTS) $(NLTLIBPATHS) $(TOP)\tool\mkkeywordhash.c /link $(LDFLAGS) $(NLTLINKOPTS) $(NLTLIBPATHS)
keywordhash.h: $(TOP)\tool\mkkeywordhash.c mkkeywordhash.exe keywordhash.h: $(TOP)\tool\mkkeywordhash.c mkkeywordhash.exe
.\mkkeywordhash.exe > keywordhash.h .\mkkeywordhash.exe > keywordhash.h
@ -1735,18 +1741,23 @@ testfixture.exe: $(TESTFIXTURE_SRC) $(LIBRESOBJS) $(HDR)
/link $(LDFLAGS) $(LTLINKOPTS) $(LTLIBPATHS) $(LIBRESOBJS) $(LTLIBS) $(TLIBS) /link $(LDFLAGS) $(LTLINKOPTS) $(LTLIBPATHS) $(LIBRESOBJS) $(LTLIBS) $(TLIBS)
extensiontest: testfixture.exe testloadext.dll extensiontest: testfixture.exe testloadext.dll
@set PATH=$(LIBTCLPATH);$(PATH)
.\testfixture.exe $(TOP)\test\loadext.test $(TESTOPTS) .\testfixture.exe $(TOP)\test\loadext.test $(TESTOPTS)
fulltest: $(TESTPROGS) fuzztest fulltest: $(TESTPROGS) fuzztest
@set PATH=$(LIBTCLPATH);$(PATH)
.\testfixture.exe $(TOP)\test\all.test $(TESTOPTS) .\testfixture.exe $(TOP)\test\all.test $(TESTOPTS)
soaktest: $(TESTPROGS) soaktest: $(TESTPROGS)
@set PATH=$(LIBTCLPATH);$(PATH)
.\testfixture.exe $(TOP)\test\all.test -soak=1 $(TESTOPTS) .\testfixture.exe $(TOP)\test\all.test -soak=1 $(TESTOPTS)
fulltestonly: $(TESTPROGS) fuzztest fulltestonly: $(TESTPROGS) fuzztest
@set PATH=$(LIBTCLPATH);$(PATH)
.\testfixture.exe $(TOP)\test\full.test .\testfixture.exe $(TOP)\test\full.test
queryplantest: testfixture.exe sqlite3.exe queryplantest: testfixture.exe sqlite3.exe
@set PATH=$(LIBTCLPATH);$(PATH)
.\testfixture.exe $(TOP)\test\permutations.test queryplanner $(TESTOPTS) .\testfixture.exe $(TOP)\test\permutations.test queryplanner $(TESTOPTS)
fuzztest: fuzzcheck.exe fuzztest: fuzzcheck.exe
@ -1758,15 +1769,18 @@ fastfuzztest: fuzzcheck.exe
# Minimal testing that runs in less than 3 minutes (on a fast machine) # Minimal testing that runs in less than 3 minutes (on a fast machine)
# #
quicktest: testfixture.exe quicktest: testfixture.exe
@set PATH=$(LIBTCLPATH);$(PATH)
.\testfixture.exe $(TOP)\test\extraquick.test $(TESTOPTS) .\testfixture.exe $(TOP)\test\extraquick.test $(TESTOPTS)
# This is the common case. Run many tests that do not take too long, # This is the common case. Run many tests that do not take too long,
# including fuzzcheck, sqlite3_analyzer, and sqldiff tests. # including fuzzcheck, sqlite3_analyzer, and sqldiff tests.
# #
test: $(TESTPROGS) fastfuzztest test: $(TESTPROGS) fastfuzztest
@set PATH=$(LIBTCLPATH);$(PATH)
.\testfixture.exe $(TOP)\test\veryquick.test $(TESTOPTS) .\testfixture.exe $(TOP)\test\veryquick.test $(TESTOPTS)
smoketest: $(TESTPROGS) smoketest: $(TESTPROGS)
@set PATH=$(LIBTCLPATH);$(PATH)
.\testfixture.exe $(TOP)\test\main.test $(TESTOPTS) .\testfixture.exe $(TOP)\test\main.test $(TESTOPTS)
sqlite3_analyzer.c: $(SQLITE3C) $(TOP)\src\tclsqlite.c $(TOP)\tool\spaceanal.tcl sqlite3_analyzer.c: $(SQLITE3C) $(TOP)\src\tclsqlite.c $(TOP)\tool\spaceanal.tcl

View File

@ -1 +1 @@
3.9.0 3.9.1

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.69 for sqlite 3.9.0. # Generated by GNU Autoconf 2.69 for sqlite 3.9.1.
# #
# #
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@ -726,8 +726,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='sqlite' PACKAGE_NAME='sqlite'
PACKAGE_TARNAME='sqlite' PACKAGE_TARNAME='sqlite'
PACKAGE_VERSION='3.9.0' PACKAGE_VERSION='3.9.1'
PACKAGE_STRING='sqlite 3.9.0' PACKAGE_STRING='sqlite 3.9.1'
PACKAGE_BUGREPORT='' PACKAGE_BUGREPORT=''
PACKAGE_URL='' PACKAGE_URL=''
@ -1458,7 +1458,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.9.0 to adapt to many kinds of systems. \`configure' configures sqlite 3.9.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1523,7 +1523,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.9.0:";; short | recursive ) echo "Configuration of sqlite 3.9.1:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1643,7 +1643,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.9.0 sqlite configure 3.9.1
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@ -2062,7 +2062,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.9.0, which was It was created by sqlite $as_me 3.9.1, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@ -11946,7 +11946,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by sqlite $as_me 3.9.0, which was This file was extended by sqlite $as_me 3.9.1, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -12012,7 +12012,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
sqlite config.status 3.9.0 sqlite config.status 3.9.1
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@ -137,7 +137,7 @@ static void fts5HighlightAppend(
const char *z, int n const char *z, int n
){ ){
if( *pRc==SQLITE_OK ){ if( *pRc==SQLITE_OK ){
if( n<0 ) n = strlen(z); if( n<0 ) n = (int)strlen(z);
p->zOut = sqlite3_mprintf("%z%.*s", p->zOut, n, z); p->zOut = sqlite3_mprintf("%z%.*s", p->zOut, n, z);
if( p->zOut==0 ) *pRc = SQLITE_NOMEM; if( p->zOut==0 ) *pRc = SQLITE_NOMEM;
} }

View File

@ -92,7 +92,7 @@ void sqlite3Fts5BufferAppendString(
Fts5Buffer *pBuf, Fts5Buffer *pBuf,
const char *zStr const char *zStr
){ ){
int nStr = strlen(zStr); int nStr = (int)strlen(zStr);
sqlite3Fts5BufferAppendBlob(pRc, pBuf, nStr+1, (const u8*)zStr); sqlite3Fts5BufferAppendBlob(pRc, pBuf, nStr+1, (const u8*)zStr);
pBuf->n--; pBuf->n--;
} }
@ -264,7 +264,7 @@ char *sqlite3Fts5Strndup(int *pRc, const char *pIn, int nIn){
char *zRet = 0; char *zRet = 0;
if( *pRc==SQLITE_OK ){ if( *pRc==SQLITE_OK ){
if( nIn<0 ){ if( nIn<0 ){
nIn = strlen(pIn); nIn = (int)strlen(pIn);
} }
zRet = (char*)sqlite3_malloc(nIn+1); zRet = (char*)sqlite3_malloc(nIn+1);
if( zRet ){ if( zRet ){

View File

@ -211,7 +211,7 @@ static int fts5ConfigParseSpecial(
char **pzErr /* OUT: Error message */ char **pzErr /* OUT: Error message */
){ ){
int rc = SQLITE_OK; int rc = SQLITE_OK;
int nCmd = strlen(zCmd); int nCmd = (int)strlen(zCmd);
if( sqlite3_strnicmp("prefix", zCmd, nCmd)==0 ){ if( sqlite3_strnicmp("prefix", zCmd, nCmd)==0 ){
const int nByte = sizeof(int) * FTS5_MAX_PREFIX_INDEXES; const int nByte = sizeof(int) * FTS5_MAX_PREFIX_INDEXES;
const char *p; const char *p;
@ -248,7 +248,7 @@ static int fts5ConfigParseSpecial(
if( sqlite3_strnicmp("tokenize", zCmd, nCmd)==0 ){ if( sqlite3_strnicmp("tokenize", zCmd, nCmd)==0 ){
const char *p = (const char*)zArg; const char *p = (const char*)zArg;
int nArg = strlen(zArg) + 1; int nArg = (int)strlen(zArg) + 1;
char **azArg = sqlite3Fts5MallocZero(&rc, sizeof(char*) * nArg); char **azArg = sqlite3Fts5MallocZero(&rc, sizeof(char*) * nArg);
char *pDel = sqlite3Fts5MallocZero(&rc, nArg * 2); char *pDel = sqlite3Fts5MallocZero(&rc, nArg * 2);
char *pSpace = pDel; char *pSpace = pDel;
@ -364,7 +364,7 @@ static const char *fts5ConfigGobbleWord(
){ ){
const char *zRet = 0; const char *zRet = 0;
int nIn = strlen(zIn); int nIn = (int)strlen(zIn);
char *zOut = sqlite3_malloc(nIn+1); char *zOut = sqlite3_malloc(nIn+1);
assert( *pRc==SQLITE_OK ); assert( *pRc==SQLITE_OK );

View File

@ -907,7 +907,7 @@ static int fts5ExprNearInitAll(
p->pIter = 0; p->pIter = 0;
} }
rc = sqlite3Fts5IndexQuery( rc = sqlite3Fts5IndexQuery(
pExpr->pIndex, p->zTerm, strlen(p->zTerm), pExpr->pIndex, p->zTerm, (int)strlen(p->zTerm),
(pTerm->bPrefix ? FTS5INDEX_QUERY_PREFIX : 0) | (pTerm->bPrefix ? FTS5INDEX_QUERY_PREFIX : 0) |
(pExpr->bDesc ? FTS5INDEX_QUERY_DESC : 0), (pExpr->bDesc ? FTS5INDEX_QUERY_DESC : 0),
pNear->pColset, pNear->pColset,
@ -1518,7 +1518,7 @@ Fts5ExprPhrase *sqlite3Fts5ParseTerm(
int flags = FTS5_TOKENIZE_QUERY | (bPrefix ? FTS5_TOKENIZE_QUERY : 0); int flags = FTS5_TOKENIZE_QUERY | (bPrefix ? FTS5_TOKENIZE_QUERY : 0);
int n; int n;
sqlite3Fts5Dequote(z); sqlite3Fts5Dequote(z);
n = strlen(z); n = (int)strlen(z);
rc = sqlite3Fts5Tokenize(pConfig, flags, z, n, &sCtx, fts5ParseTokenize); rc = sqlite3Fts5Tokenize(pConfig, flags, z, n, &sCtx, fts5ParseTokenize);
} }
sqlite3_free(z); sqlite3_free(z);
@ -1591,7 +1591,8 @@ int sqlite3Fts5ExprClonePhrase(
Fts5ExprTerm *p; Fts5ExprTerm *p;
for(p=&pOrig->aTerm[i]; p && rc==SQLITE_OK; p=p->pSynonym){ for(p=&pOrig->aTerm[i]; p && rc==SQLITE_OK; p=p->pSynonym){
const char *zTerm = p->zTerm; const char *zTerm = p->zTerm;
rc = fts5ParseTokenize((void*)&sCtx, tflags, zTerm, strlen(zTerm), 0, 0); rc = fts5ParseTokenize((void*)&sCtx, tflags, zTerm, (int)strlen(zTerm),
0, 0);
tflags = FTS5_TOKEN_COLOCATED; tflags = FTS5_TOKEN_COLOCATED;
} }
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
@ -1833,7 +1834,7 @@ static char *fts5ExprTermPrint(Fts5ExprTerm *pTerm){
/* Determine the maximum amount of space required. */ /* Determine the maximum amount of space required. */
for(p=pTerm; p; p=p->pSynonym){ for(p=pTerm; p; p=p->pSynonym){
nByte += strlen(pTerm->zTerm) * 2 + 3 + 2; nByte += (int)strlen(pTerm->zTerm) * 2 + 3 + 2;
} }
zQuoted = sqlite3_malloc(nByte); zQuoted = sqlite3_malloc(nByte);

View File

@ -170,7 +170,7 @@ static int fts5HashResize(Fts5Hash *pHash){
int iHash; int iHash;
Fts5HashEntry *p = apOld[i]; Fts5HashEntry *p = apOld[i];
apOld[i] = p->pHashNext; apOld[i] = p->pHashNext;
iHash = fts5HashKey(nNew, (u8*)p->zKey, strlen(p->zKey)); iHash = fts5HashKey(nNew, (u8*)p->zKey, (int)strlen(p->zKey));
p->pHashNext = apNew[iHash]; p->pHashNext = apNew[iHash];
apNew[iHash] = p; apNew[iHash] = p;
} }
@ -458,7 +458,7 @@ void sqlite3Fts5HashScanEntry(
){ ){
Fts5HashEntry *p; Fts5HashEntry *p;
if( (p = pHash->pScan) ){ if( (p = pHash->pScan) ){
int nTerm = strlen(p->zKey); int nTerm = (int)strlen(p->zKey);
fts5HashAddPoslistSize(p); fts5HashAddPoslistSize(p);
*pzTerm = p->zKey; *pzTerm = p->zKey;
*ppDoclist = (const u8*)&p->zKey[nTerm+1]; *ppDoclist = (const u8*)&p->zKey[nTerm+1];

View File

@ -1766,6 +1766,7 @@ static void fts5SegIterNext(
const u8 *pList = 0; const u8 *pList = 0;
const char *zTerm = 0; const char *zTerm = 0;
int nList = 0; int nList = 0;
assert( (pIter->flags & FTS5_SEGITER_ONETERM) || pbNewTerm );
if( 0==(pIter->flags & FTS5_SEGITER_ONETERM) ){ if( 0==(pIter->flags & FTS5_SEGITER_ONETERM) ){
sqlite3Fts5HashScanNext(p->pHash); sqlite3Fts5HashScanNext(p->pHash);
sqlite3Fts5HashScanEntry(p->pHash, &zTerm, &pList, &nList); sqlite3Fts5HashScanEntry(p->pHash, &zTerm, &pList, &nList);
@ -1778,9 +1779,10 @@ static void fts5SegIterNext(
pIter->pLeaf->nn = nList; pIter->pLeaf->nn = nList;
pIter->pLeaf->szLeaf = nList; pIter->pLeaf->szLeaf = nList;
pIter->iEndofDoclist = nList+1; pIter->iEndofDoclist = nList+1;
sqlite3Fts5BufferSet(&p->rc, &pIter->term, strlen(zTerm), (u8*)zTerm); sqlite3Fts5BufferSet(&p->rc, &pIter->term, (int)strlen(zTerm),
(u8*)zTerm);
pIter->iLeafOffset = fts5GetVarint(pList, (u64*)&pIter->iRowid); pIter->iLeafOffset = fts5GetVarint(pList, (u64*)&pIter->iRowid);
if( pbNewTerm ) *pbNewTerm = 1; *pbNewTerm = 1;
} }
}else{ }else{
iOff = 0; iOff = 0;
@ -2185,7 +2187,7 @@ static void fts5SegIterHashInit(
if( pTerm==0 || (flags & FTS5INDEX_QUERY_SCAN) ){ if( pTerm==0 || (flags & FTS5INDEX_QUERY_SCAN) ){
p->rc = sqlite3Fts5HashScanInit(p->pHash, (const char*)pTerm, nTerm); p->rc = sqlite3Fts5HashScanInit(p->pHash, (const char*)pTerm, nTerm);
sqlite3Fts5HashScanEntry(p->pHash, (const char**)&z, &pList, &nList); sqlite3Fts5HashScanEntry(p->pHash, (const char**)&z, &pList, &nList);
n = (z ? strlen((const char*)z) : 0); n = (z ? (int)strlen((const char*)z) : 0);
}else{ }else{
pIter->flags |= FTS5_SEGITER_ONETERM; pIter->flags |= FTS5_SEGITER_ONETERM;
sqlite3Fts5HashQuery(p->pHash, (const char*)pTerm, nTerm, &pList, &nList); sqlite3Fts5HashQuery(p->pHash, (const char*)pTerm, nTerm, &pList, &nList);
@ -3758,7 +3760,7 @@ static void fts5FlushOneHash(Fts5Index *p){
/* Write the term for this entry to disk. */ /* Write the term for this entry to disk. */
sqlite3Fts5HashScanEntry(pHash, &zTerm, &pDoclist, &nDoclist); sqlite3Fts5HashScanEntry(pHash, &zTerm, &pDoclist, &nDoclist);
fts5WriteAppendTerm(p, &writer, strlen(zTerm), (const u8*)zTerm); fts5WriteAppendTerm(p, &writer, (int)strlen(zTerm), (const u8*)zTerm);
assert( writer.bFirstRowidInPage==0 ); assert( writer.bFirstRowidInPage==0 );
if( pgsz>=(pBuf->n + pPgidx->n + nDoclist + 1) ){ if( pgsz>=(pBuf->n + pPgidx->n + nDoclist + 1) ){
@ -4034,7 +4036,7 @@ static void fts5SegiterPoslist(
PoslistCallbackCtx sCtx; PoslistCallbackCtx sCtx;
sCtx.pBuf = pBuf; sCtx.pBuf = pBuf;
sCtx.pColset = pColset; sCtx.pColset = pColset;
sCtx.eState = pColset ? fts5IndexColsetTest(pColset, 0) : 1; sCtx.eState = fts5IndexColsetTest(pColset, 0);
assert( sCtx.eState==0 || sCtx.eState==1 ); assert( sCtx.eState==0 || sCtx.eState==1 );
fts5ChunkIterate(p, pSeg, (void*)&sCtx, fts5PoslistFilterCallback); fts5ChunkIterate(p, pSeg, (void*)&sCtx, fts5PoslistFilterCallback);
} }
@ -5196,7 +5198,6 @@ static void fts5IndexIntegrityCheckSegment(
fts5DataRelease(pLeaf); fts5DataRelease(pLeaf);
if( p->rc ) break; if( p->rc ) break;
/* Now check that the iter.nEmpty leaves following the current leaf /* Now check that the iter.nEmpty leaves following the current leaf
** (a) exist and (b) contain no terms. */ ** (a) exist and (b) contain no terms. */
fts5IndexIntegrityCheckEmpty( fts5IndexIntegrityCheckEmpty(

View File

@ -447,7 +447,10 @@ static int fts5CreateMethod(
*/ */
static void fts5SetUniqueFlag(sqlite3_index_info *pIdxInfo){ static void fts5SetUniqueFlag(sqlite3_index_info *pIdxInfo){
#if SQLITE_VERSION_NUMBER>=3008012 #if SQLITE_VERSION_NUMBER>=3008012
if( sqlite3_libversion_number()>=3008012 ){ #ifndef SQLITE_CORE
if( sqlite3_libversion_number()>=3008012 )
#endif
{
pIdxInfo->idxFlags |= SQLITE_INDEX_SCAN_UNIQUE; pIdxInfo->idxFlags |= SQLITE_INDEX_SCAN_UNIQUE;
} }
#endif #endif

View File

@ -297,10 +297,10 @@ int sqlite3Fts5StorageOpen(
int i; int i;
int iOff; int iOff;
sqlite3_snprintf(nDefn, zDefn, "id INTEGER PRIMARY KEY"); sqlite3_snprintf(nDefn, zDefn, "id INTEGER PRIMARY KEY");
iOff = strlen(zDefn); iOff = (int)strlen(zDefn);
for(i=0; i<pConfig->nCol; i++){ for(i=0; i<pConfig->nCol; i++){
sqlite3_snprintf(nDefn-iOff, &zDefn[iOff], ", c%d", i); sqlite3_snprintf(nDefn-iOff, &zDefn[iOff], ", c%d", i);
iOff += strlen(&zDefn[iOff]); iOff += (int)strlen(&zDefn[iOff]);
} }
rc = sqlite3Fts5CreateTable(pConfig, "content", zDefn, 0, pzErr); rc = sqlite3Fts5CreateTable(pConfig, "content", zDefn, 0, pzErr);
} }
@ -725,17 +725,7 @@ int sqlite3Fts5StorageContentInsert(
}else{ }else{
sqlite3_stmt *pInsert = 0; /* Statement to write %_content table */ sqlite3_stmt *pInsert = 0; /* Statement to write %_content table */
int i; /* Counter variable */ int i; /* Counter variable */
#if 0
if( eConflict==SQLITE_REPLACE ){
eStmt = FTS5_STMT_REPLACE_CONTENT;
rc = fts5StorageDeleteFromIndex(p, sqlite3_value_int64(apVal[1]));
}else{
eStmt = FTS5_STMT_INSERT_CONTENT;
}
#endif
if( rc==SQLITE_OK ){
rc = fts5StorageGetStmt(p, FTS5_STMT_INSERT_CONTENT, &pInsert, 0); rc = fts5StorageGetStmt(p, FTS5_STMT_INSERT_CONTENT, &pInsert, 0);
}
for(i=1; rc==SQLITE_OK && i<=pConfig->nCol+1; i++){ for(i=1; rc==SQLITE_OK && i<=pConfig->nCol+1; i++){
rc = sqlite3_bind_value(pInsert, i, apVal[i]); rc = sqlite3_bind_value(pInsert, i, apVal[i]);
} }

View File

@ -242,7 +242,7 @@ static int fts5UnicodeAddExceptions(
int bTokenChars /* 1 for 'tokenchars', 0 for 'separators' */ int bTokenChars /* 1 for 'tokenchars', 0 for 'separators' */
){ ){
int rc = SQLITE_OK; int rc = SQLITE_OK;
int n = strlen(z); int n = (int)strlen(z);
int *aNew; int *aNew;
if( n>0 ){ if( n>0 ){

View File

@ -168,8 +168,8 @@ static int fts5VocabInitVtab(
const char *zDb = bDb ? argv[3] : argv[1]; const char *zDb = bDb ? argv[3] : argv[1];
const char *zTab = bDb ? argv[4] : argv[3]; const char *zTab = bDb ? argv[4] : argv[3];
const char *zType = bDb ? argv[5] : argv[4]; const char *zType = bDb ? argv[5] : argv[4];
int nDb = strlen(zDb)+1; int nDb = (int)strlen(zDb)+1;
int nTab = strlen(zTab)+1; int nTab = (int)strlen(zTab)+1;
int eType; int eType;
rc = fts5VocabTableType(zType, pzErr, &eType); rc = fts5VocabTableType(zType, pzErr, &eType);

View File

@ -159,9 +159,20 @@ do_execsql_test 6.3 {
} }
do_execsql_test 6.4 { do_execsql_test 6.4 {
REPLACE INTO t1(x, y) VALUES('x y z', 'x y z');
}
do_execsql_test 6.5 {
INSERT INTO t1(t1) VALUES('integrity-check') INSERT INTO t1(t1) VALUES('integrity-check')
} }
do_execsql_test 6.6 {
SELECT rowid, * FROM t1;
} {
22 {l l l} {l l l}
23 {x y z} {x y z}
}
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
reset_db reset_db

View File

@ -250,8 +250,6 @@ foreach rowid [db eval {SELECT rowid FROM x1_data WHERE rowid>100}] {
} }
} }
}
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# #
reset_db reset_db
@ -335,6 +333,44 @@ do_catchsql_test 6.3.5 {
INSERT INTO t1(t1) VALUES('integrity-check'); INSERT INTO t1(t1) VALUES('integrity-check');
} {1 {database disk image is malformed}} } {1 {database disk image is malformed}}
}
#------------------------------------------------------------------------
#
reset_db
reset_db
proc rnddoc {n} {
set map [list a b c d]
set doc [list]
for {set i 0} {$i < $n} {incr i} {
lappend doc "x[lindex $map [expr int(rand()*4)]]"
}
set doc
}
db func rnddoc rnddoc
do_test 7.0 {
execsql {
CREATE VIRTUAL TABLE t5 USING fts5(x);
INSERT INTO t5 VALUES( rnddoc(10000) );
INSERT INTO t5 VALUES( rnddoc(10000) );
INSERT INTO t5 VALUES( rnddoc(10000) );
INSERT INTO t5 VALUES( rnddoc(10000) );
INSERT INTO t5(t5) VALUES('optimize');
}
} {}
do_test 7.1 {
foreach i [db eval { SELECT rowid FROM t5_data WHERE rowid>100 }] {
db eval BEGIN
db eval {DELETE FROM t5_data WHERE rowid = $i}
set r [catchsql { INSERT INTO t5(t5) VALUES('integrity-check')} ]
if {$r != "1 {database disk image is malformed}"} { error $r }
db eval ROLLBACK
}
} {}
sqlite3_fts5_may_be_corrupt 0 sqlite3_fts5_may_be_corrupt 0
finish_test finish_test

View File

@ -87,5 +87,26 @@ do_faultsim_test 1 -faults oom-t* -prep {
faultsim_test_result {0 {}} faultsim_test_result {0 {}}
} }
#-------------------------------------------------------------------------
# Test fault-injection when a segment is promoted.
#
reset_db
do_execsql_test 2.0 {
CREATE VIRTUAL TABLE xy USING fts5(x);
INSERT INTO xy(rowid, x) VALUES(1, '1 2 3');
INSERT INTO xy(rowid, x) VALUES(2, '2 3 4');
INSERT INTO xy(rowid, x) VALUES(3, '3 4 5');
}
faultsim_save_and_close
do_faultsim_test 2 -faults oom-* -prep {
faultsim_restore_and_reopen
} -body {
db eval { UPDATE OR REPLACE xy SET rowid=3 WHERE rowid = 2 }
} -test {
faultsim_test_result {0 {}}
}
finish_test finish_test

View File

@ -84,10 +84,12 @@ lappend vocab xyz
do_execsql_test 1.1 { do_execsql_test 1.1 {
CREATE VIRTUAL TABLE vocab USING fts5vocab(eee, 'row'); CREATE VIRTUAL TABLE vocab USING fts5vocab(eee, 'row');
BEGIN; BEGIN;
WITH ii(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM ii WHERE i<100)
INSERT INTO eee SELECT r($vocab, 5), r($vocab, 7) FROM ii;
INSERT INTO eee(eee) VALUES('integrity-check');
} }
do_test 1.2 {
for {set i 1} {$i <= 100} {incr i} {
execsql { INSERT INTO eee VALUES( r($vocab, 5), r($vocab, 7) ) }
}
} {}
do_test 1.2 { do_test 1.2 {
db eval { SELECT term, doc FROM vocab } { db eval { SELECT term, doc FROM vocab } {

View File

@ -195,6 +195,108 @@ for {set x 0} {$x<2} {incr x} {
execsql { INSERT INTO t3(t3) VALUES('integrity-check') } execsql { INSERT INTO t3(t3) VALUES('integrity-check') }
} }
#-------------------------------------------------------------------------
#
reset_db
do_execsql_test 4.0 {
CREATE VIRTUAL TABLE t2 USING fts5(c1, c2);
INSERT INTO t2 VALUES('xa xb', 'xb xa');
INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 2
INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 4
INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 8
INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 16
INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 32
INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 64
INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 128
INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 256
INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 512
INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 1024
INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 2048
INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 4096
SELECT count(*) FROM t2('x*');
} {4096}
do_execsql_test 4.1 {
UPDATE t2 SET c2 = 'ya yb';
SELECT count(*) FROM t2('c1:x*');
SELECT count(*) FROM t2('c2:x*');
} {4096 0}
do_execsql_test 4.2 {
UPDATE t2 SET c2 = 'xa';
SELECT count(*) FROM t2('c1:x*');
SELECT count(*) FROM t2('c2:x*');
} {4096 4096}
#-------------------------------------------------------------------------
#
reset_db
proc rnddoc {n} {
set map [list a b c d]
set doc [list]
for {set i 0} {$i < $n} {incr i} {
lappend doc "x[lindex $map [expr int(rand()*4)]]"
}
set doc
}
set cols [list]
for {set i 1} {$i<250} {incr i} {
lappend cols "c$i"
lappend vals "'[rnddoc 10]'"
}
do_test 5.0 {
execsql "CREATE VIRTUAL TABLE t4 USING fts5([join $cols ,])"
execsql {INSERT INTO t4(t4, rank) VALUES('pgsz', 32)}
execsql "INSERT INTO t4 VALUES([join $vals ,])"
execsql "INSERT INTO t4 VALUES([join $vals ,])"
execsql "INSERT INTO t4 VALUES([join $vals ,])"
execsql "INSERT INTO t4 VALUES([join $vals ,])"
} {}
proc gmatch {col pattern} {
expr {[lsearch -glob $col $pattern]>=0}
}
db func gmatch gmatch
foreach {tn col pattern} {
1 c100 {xa*}
2 c200 {xb*}
} {
set res [db eval "SELECT rowid FROM t4 WHERE gmatch($col, \$pattern)"]
set query "$col : $pattern"
do_execsql_test 5.$tn { SELECT rowid FROM t4($query) } $res
}
reset_db
db func fts5_rnddoc fts5_rnddoc
do_test 6.0 {
execsql {
CREATE VIRTUAL TABLE t5 USING fts5(x, y);
INSERT INTO t5 VALUES( fts5_rnddoc(10000), fts5_rnddoc(10000) );
INSERT INTO t5 VALUES( fts5_rnddoc(10000), fts5_rnddoc(10000) );
INSERT INTO t5 VALUES( fts5_rnddoc(10000), fts5_rnddoc(10000) );
INSERT INTO t5 VALUES( fts5_rnddoc(10000), fts5_rnddoc(10000) );
}
} {}
proc gmatch {col pattern} {
expr {[lsearch -glob $col $pattern]>=0}
}
db func gmatch gmatch
foreach {tn col pattern} {
1 y {xa*}
2 y {xb*}
3 y {xc*}
4 x {xa*}
5 x {xb*}
6 x {xc*}
} {
set res [db eval "SELECT rowid FROM t5 WHERE gmatch($col, \$pattern)"]
set query "$col : $pattern"
do_execsql_test 6.$tn { SELECT rowid FROM t5($query) } $res
}
finish_test finish_test

View File

@ -300,5 +300,27 @@ do_execsql_test 12.2 {
COMMIT; COMMIT;
} {} } {}
#-------------------------------------------------------------------------
# Try an UPDATE OR REPLACE query.
#
do_execsql_test 13.1 {
CREATE VIRTUAL TABLE xy USING fts5(x);
INSERT INTO xy(rowid, x) VALUES(1, '1 2 3');
INSERT INTO xy(rowid, x) VALUES(2, '2 3 4');
INSERT INTO xy(rowid, x) VALUES(3, '3 4 5');
}
do_execsql_test 13.2 {
UPDATE OR REPLACE xy SET rowid=3 WHERE rowid = 2;
SELECT rowid, x FROM xy;
} {
1 {1 2 3}
3 {2 3 4}
}
do_execsql_test 13.3 {
INSERT INTO xy(xy) VALUES('integrity-check');
}
finish_test finish_test

View File

@ -28,7 +28,6 @@
SQLITE_EXTENSION_INIT1 SQLITE_EXTENSION_INIT1
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
#include <ctype.h> /* amalgamator: keep */
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>
@ -43,8 +42,17 @@ SQLITE_EXTENSION_INIT1
** Versions of isspace(), isalnum() and isdigit() to which it is safe ** Versions of isspace(), isalnum() and isdigit() to which it is safe
** to pass signed char values. ** to pass signed char values.
*/ */
#ifdef sqlite3Isdigit
/* Use the SQLite core versions if this routine is part of the
** SQLite amalgamation */
# define safe_isdigit(x) sqlite3Isdigit(x)
# define safe_isalnum(x) sqlite3Isalnum(x)
#else
/* Use the standard library for separate compilation */
#include <ctype.h> /* amalgamator: keep */
# define safe_isdigit(x) isdigit((unsigned char)(x)) # define safe_isdigit(x) isdigit((unsigned char)(x))
# define safe_isalnum(x) isalnum((unsigned char)(x)) # define safe_isalnum(x) isalnum((unsigned char)(x))
#endif
/* /*
** Growing our own isspace() routine this way is twice as fast as ** Growing our own isspace() routine this way is twice as fast as
@ -52,7 +60,7 @@ SQLITE_EXTENSION_INIT1
** increase for the parser. (Ubuntu14.10 gcc 4.8.4 x64 with -Os). ** increase for the parser. (Ubuntu14.10 gcc 4.8.4 x64 with -Os).
*/ */
static const char jsonIsSpace[] = { static const char jsonIsSpace[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@ -514,7 +522,13 @@ static void jsonReturn(
int_as_real: /* fall through to real */; int_as_real: /* fall through to real */;
} }
case JSON_REAL: { case JSON_REAL: {
double r = strtod(pNode->u.zJContent, 0); double r;
#ifdef SQLITE_AMALGAMATION
const char *z = pNode->u.zJContent;
sqlite3AtoF(z, &r, sqlite3Strlen30(z), SQLITE_UTF8);
#else
r = strtod(pNode->u.zJContent, 0);
#endif
sqlite3_result_double(pCtx, r); sqlite3_result_double(pCtx, r);
break; break;
} }

102
manifest
View File

@ -1,10 +1,10 @@
C Merge\sin\sall\sthe\s3.9.0\supdates\sfrom\strunk. C Merge\srecent\senhancements\sfrom\strunk.\s\sVersion\snow\s3.9.1.
D 2015-10-14T20:09:54.505 D 2015-10-16T20:53:57.452
F Makefile.in 2ea961bc09e441874eb3d1bf7398e04feb24f3ee F Makefile.in 2ea961bc09e441874eb3d1bf7398e04feb24f3ee
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc 9660c072f65b2742595687b30f6d9ae55001ae06 F Makefile.msc 4eb750e0fdf52050a06d881e1b060f4bb116ed7e
F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7
F VERSION cacf16a72f9a03cd06b939a764e32f6f53254c7f F VERSION a47917b59f38b632b3a8662d14fd20f94956bdd0
F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90
@ -35,7 +35,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 99485c9c0446d1236a78a53de6f2737f45f0aca5 x F configure 762a66c6eb9331f8af21f5d00b610bd61eaf8e14 x
F configure.ac f36bd4fb8c53eed8374c5a5ef319807c08c23fa9 F configure.ac f36bd4fb8c53eed8374c5a5ef319807c08c23fa9
F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad
F doc/lemon.html 334dbf6621b8fb8790297ec1abf3cfa4621709d1 F doc/lemon.html 334dbf6621b8fb8790297ec1abf3cfa4621709d1
@ -104,24 +104,24 @@ F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95
F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0
F ext/fts5/fts5.h 8b9a13b309b180e9fb88ea5666c0d8d73c6102d9 F ext/fts5/fts5.h 8b9a13b309b180e9fb88ea5666c0d8d73c6102d9
F ext/fts5/fts5Int.h 38667e39859ff3f3bc91f47efe672023a145a118 F ext/fts5/fts5Int.h 38667e39859ff3f3bc91f47efe672023a145a118
F ext/fts5/fts5_aux.c b09aa27dcdaa3d50a30be433fddaa48a50aa827b F ext/fts5/fts5_aux.c 1f384972d606375b8fa078319f25ab4b5feb1b35
F ext/fts5/fts5_buffer.c e99224a316cc5b2c574ccccdc7f2344bca54784d F ext/fts5/fts5_buffer.c 9a3aa73a4e7b26b1c805b9c92c1344ba3d19d2a8
F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 F ext/fts5/fts5_config.c 88a77f5d5e4dfbb2355b8f6cc9969b7f02d94685
F ext/fts5/fts5_expr.c bc31478fd04de55150031f6e6a652939d3e335ac F ext/fts5/fts5_expr.c 28b15c9ae296204bc0a2e5cf7a667d840a9d2900
F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 F ext/fts5/fts5_hash.c a9d4c1efebc2a91d26ad7ebdfcbf2678ceac405f
F ext/fts5/fts5_index.c f73968357818455039ecb79dcd4b082c3baaeaeb F ext/fts5/fts5_index.c c76d636d6cd22e3b82b1dbf3a3993447091c3bed
F ext/fts5/fts5_main.c bf43550b8e9a68514abd179500f1917a2256cd7a F ext/fts5/fts5_main.c d3fde32e1fdd7962dc7062400d1d8c7ec2297acf
F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 F ext/fts5/fts5_storage.c 9b30115742b758706de70595a8d1d084e940c978
F ext/fts5/fts5_tcl.c 3bf445e66de32137d4693694ff7b1fd6074e32bd F ext/fts5/fts5_tcl.c 3bf445e66de32137d4693694ff7b1fd6074e32bd
F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf
F ext/fts5/fts5_tokenize.c f380f46f341af9c9a9908e1aade685ba1eaa157a F ext/fts5/fts5_tokenize.c 12c5d925286491a71bb3dad7c8924ce9cfd18320
F ext/fts5/fts5_unicode2.c 78273fbd588d1d9bd0a7e4e0ccc9207348bae33c F ext/fts5/fts5_unicode2.c 78273fbd588d1d9bd0a7e4e0ccc9207348bae33c
F ext/fts5/fts5_varint.c 3f86ce09cab152e3d45490d7586b7ed2e40c13f1 F ext/fts5/fts5_varint.c 3f86ce09cab152e3d45490d7586b7ed2e40c13f1
F ext/fts5/fts5_vocab.c a05027ab6abb692ad27654c85137a4f1061a159e F ext/fts5/fts5_vocab.c 85ebf2e93089c9d3d136cc69163370592fc040f3
F ext/fts5/fts5parse.y e83dca6028e3309178d05b5bd920e372dc295d35 F ext/fts5/fts5parse.y e83dca6028e3309178d05b5bd920e372dc295d35
F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba
F ext/fts5/test/fts5_common.tcl 51f7ef3af444b89c6f6ce3896a0ac349ff4e996d F ext/fts5/test/fts5_common.tcl 51f7ef3af444b89c6f6ce3896a0ac349ff4e996d
F ext/fts5/test/fts5aa.test 4804f237005bb4ba8ea4a76120d8011ebcb5d611 F ext/fts5/test/fts5aa.test 34ad813e9e958115d388658b2c4a8dde6b1474a5
F ext/fts5/test/fts5ab.test 6fe3a56731d15978afbb74ae51b355fc9310f2ad F ext/fts5/test/fts5ab.test 6fe3a56731d15978afbb74ae51b355fc9310f2ad
F ext/fts5/test/fts5ac.test 9737992d08c56bfd4803e933744d2d764e23795c F ext/fts5/test/fts5ac.test 9737992d08c56bfd4803e933744d2d764e23795c
F ext/fts5/test/fts5ad.test e3dfb150fce971b4fd832498c29f56924d451b63 F ext/fts5/test/fts5ad.test e3dfb150fce971b4fd832498c29f56924d451b63
@ -143,7 +143,7 @@ F ext/fts5/test/fts5config.test ad2ff42ddc856aed2d05bf89dc1c578c8a39ea3b
F ext/fts5/test/fts5content.test 9a952c95518a14182dc3b59e3c8fa71cda82a4e1 F ext/fts5/test/fts5content.test 9a952c95518a14182dc3b59e3c8fa71cda82a4e1
F ext/fts5/test/fts5corrupt.test c2ad090192708150d50d961278df10ae7a4b8b62 F ext/fts5/test/fts5corrupt.test c2ad090192708150d50d961278df10ae7a4b8b62
F ext/fts5/test/fts5corrupt2.test 26c0a39dd9ff73207e6229f83b50b21d37c7658c F ext/fts5/test/fts5corrupt2.test 26c0a39dd9ff73207e6229f83b50b21d37c7658c
F ext/fts5/test/fts5corrupt3.test a1429635c30f922079189e35b2b631eb7463a2fb F ext/fts5/test/fts5corrupt3.test a2b537c120bdd43c79c42fe2438d7b8c81fe5599
F ext/fts5/test/fts5dlidx.test ecba5e62ea8b26c33829961602069c546228046d F ext/fts5/test/fts5dlidx.test ecba5e62ea8b26c33829961602069c546228046d
F ext/fts5/test/fts5doclist.test 8edb5b57e5f144030ed74ec00ef6fa4294fed79b F ext/fts5/test/fts5doclist.test 8edb5b57e5f144030ed74ec00ef6fa4294fed79b
F ext/fts5/test/fts5ea.test b01e3a18cdfabbff8104a96a5242a06a68a998a0 F ext/fts5/test/fts5ea.test b01e3a18cdfabbff8104a96a5242a06a68a998a0
@ -154,9 +154,9 @@ F ext/fts5/test/fts5fault3.test d6e9577d4312e331a913c72931bf131704efc8f3
F ext/fts5/test/fts5fault4.test 762991d526ee67c2b374351a17248097ea38bee7 F ext/fts5/test/fts5fault4.test 762991d526ee67c2b374351a17248097ea38bee7
F ext/fts5/test/fts5fault5.test 54da9fd4c3434a1d4f6abdcb6469299d91cf5875 F ext/fts5/test/fts5fault5.test 54da9fd4c3434a1d4f6abdcb6469299d91cf5875
F ext/fts5/test/fts5fault6.test 9682664d679643ac6736e90c225526cc84073cda F ext/fts5/test/fts5fault6.test 9682664d679643ac6736e90c225526cc84073cda
F ext/fts5/test/fts5fault7.test f62ed4d98f137eb03f1db94d1fa41b17a771d971 F ext/fts5/test/fts5fault7.test 01be274bfc8d9bf22451a3bf5892e9399d044f1b
F ext/fts5/test/fts5full.test 6f6143af0c6700501d9fd597189dfab1555bb741 F ext/fts5/test/fts5full.test 6f6143af0c6700501d9fd597189dfab1555bb741
F ext/fts5/test/fts5hash.test 42eb066f667e9a389a63437cb7038c51974d4fc6 F ext/fts5/test/fts5hash.test 7cf4607b8657c383f0b520668a99971e95d8b139
F ext/fts5/test/fts5integrity.test 29f41d2c7126c6122fbb5d54e556506456876145 F ext/fts5/test/fts5integrity.test 29f41d2c7126c6122fbb5d54e556506456876145
F ext/fts5/test/fts5matchinfo.test 2163b0013e824bba65499da9e34ea4da41349cc2 F ext/fts5/test/fts5matchinfo.test 2163b0013e824bba65499da9e34ea4da41349cc2
F ext/fts5/test/fts5merge.test 8f3cdba2ec9c5e7e568246e81b700ad37f764367 F ext/fts5/test/fts5merge.test 8f3cdba2ec9c5e7e568246e81b700ad37f764367
@ -167,12 +167,12 @@ F ext/fts5/test/fts5phrase.test f6d1d464da5beb25dc56277aa4f1d6102f0d9a2f
F ext/fts5/test/fts5plan.test 6a55ecbac9890765b0e16f8c421c7e0888cfe436 F ext/fts5/test/fts5plan.test 6a55ecbac9890765b0e16f8c421c7e0888cfe436
F ext/fts5/test/fts5porter.test 7cdc07bef301d70eebbfa75dcaf45c3680e1d0e1 F ext/fts5/test/fts5porter.test 7cdc07bef301d70eebbfa75dcaf45c3680e1d0e1
F ext/fts5/test/fts5porter2.test 2e65633d58a1c525d5af0f6c01e5a59155bb3487 F ext/fts5/test/fts5porter2.test 2e65633d58a1c525d5af0f6c01e5a59155bb3487
F ext/fts5/test/fts5prefix.test ad3069f099ff593a2196422244fa218f8942dfb9 F ext/fts5/test/fts5prefix.test 7ccbdf180ed561a912acef520519e85af8642239
F ext/fts5/test/fts5rank.test 11dcebba31d822f7e99685b4ea2c2ae3ec0b16f1 F ext/fts5/test/fts5rank.test 11dcebba31d822f7e99685b4ea2c2ae3ec0b16f1
F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b
F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17 F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17
F ext/fts5/test/fts5rowid.test 400384798349d658eaf06aefa1e364957d5d4821 F ext/fts5/test/fts5rowid.test 400384798349d658eaf06aefa1e364957d5d4821
F ext/fts5/test/fts5simple.test f8463172dc2d4bf9f74c78e9df9c83e942c63a94 F ext/fts5/test/fts5simple.test 41333e267c6145efc3620342af53dfe65d5676b7
F ext/fts5/test/fts5synonym.test cf88c0a56d5ea9591e3939ef1f6e294f7f2d0671 F ext/fts5/test/fts5synonym.test cf88c0a56d5ea9591e3939ef1f6e294f7f2d0671
F ext/fts5/test/fts5tokenizer.test ea4df698b35cc427ebf2ba22829d0e28386d8c89 F ext/fts5/test/fts5tokenizer.test ea4df698b35cc427ebf2ba22829d0e28386d8c89
F ext/fts5/test/fts5unicode.test fbef8d8a3b4b88470536cc57604a82ca52e51841 F ext/fts5/test/fts5unicode.test fbef8d8a3b4b88470536cc57604a82ca52e51841
@ -195,7 +195,7 @@ F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2
F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f
F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767 F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767
F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e
F ext/misc/json1.c fed5b948168f26f39e67d898b03d93dd00e75196 F ext/misc/json1.c 4f45afd9dbcd6feca8c528251efbb7fc09299a09
F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342
F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63 F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63
F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc
@ -290,7 +290,7 @@ F src/ctime.c 509ef9c64d1321f42448f111da86400b1799218a
F src/date.c fb1c99172017dcc8e237339132c91a21a0788584 F src/date.c fb1c99172017dcc8e237339132c91a21a0788584
F src/dbstat.c e637e7a7ff40ef32132a418c6fdf1cfb63aa27c7 F src/dbstat.c e637e7a7ff40ef32132a418c6fdf1cfb63aa27c7
F src/delete.c 35c939eb8bacc9dd8a6715964e5f69feb8c20e44 F src/delete.c 35c939eb8bacc9dd8a6715964e5f69feb8c20e44
F src/expr.c 7afc6450c3da35127f2ffe8b0412962c46cc0fa6 F src/expr.c 41c83c44758eba4c2bac868090346ce69d2f2dd7
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
F src/fkey.c 31900763094a3736a5fc887469202eb579fef2d0 F src/fkey.c 31900763094a3736a5fc887469202eb579fef2d0
F src/func.c ecdd69ec6a1e406f04cc73324be2ebbf6354197f F src/func.c ecdd69ec6a1e406f04cc73324be2ebbf6354197f
@ -298,18 +298,18 @@ F src/global.c 508e4087f7b41d688e4762dcf4d4fe28cfbc87f9
F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5 F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5
F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094 F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094
F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08
F src/insert.c 3c522beb5bf50a2efee1fca1e80fd40942e5817c F src/insert.c 6dadbb671c2cc035ddbbf11a0b0209185d5bfe2c
F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d
F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e
F src/lempar.c d344a95d60c24e2f490ee59db9784b1b17439012 F src/lempar.c d344a95d60c24e2f490ee59db9784b1b17439012
F src/loadext.c c5916a158f1fb74d955847c84f7ebdb6f5de9d8c F src/loadext.c 18586e45a215325f15096821e9c082035d4fb810
F src/main.c fec97668771438033a7559883401067b139729e1 F src/main.c fec97668771438033a7559883401067b139729e1
F src/malloc.c 3a37ce6979a40f499d8cea9e9ab4e8517854d35d F src/malloc.c 0a2e42b835c980ba91c17866e9b6a9810ff54d75
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
F src/mem1.c abe6ee469b6c5a35c7f22bfeb9c9bac664a1c987 F src/mem1.c 52485a88f22649c3b3b4f3eb15760505d49ccf71
F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3
F src/mem3.c 61c9d47b792908c532ca3a62b999cf21795c6534 F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a
F src/mem5.c 61eeb90134f9a5be6c2e68d8daae7628b25953fb F src/mem5.c c1ab1153bd6443bdf6f71e4213c6fb31221b9eb7
F src/memjournal.c 3eb2c0b51adbd869cb6a44780323f05fa904dc85 F src/memjournal.c 3eb2c0b51adbd869cb6a44780323f05fa904dc85
F src/msvc.h d9ba56c6851227ab44b3f228a35f3f5772296495 F src/msvc.h d9ba56c6851227ab44b3f228a35f3f5772296495
F src/mutex.c 8e45800ee78e0cd1f1f3fe8e398853307f4a085c F src/mutex.c 8e45800ee78e0cd1f1f3fe8e398853307f4a085c
@ -330,7 +330,7 @@ F src/pager.h ac213f8143ebfee6a8bfb91cf4ca02c9a83343c5
F src/parse.y f599aa5e871a493330d567ced93de696f61f48f7 F src/parse.y f599aa5e871a493330d567ced93de696f61f48f7
F src/pcache.c 24be750c79272e0ca7b6e007bc94999700f3e5ef F src/pcache.c 24be750c79272e0ca7b6e007bc94999700f3e5ef
F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9 F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9
F src/pcache1.c e822007159d53a7ea7aa040d6e28964ddb6de083 F src/pcache1.c 902e1bc7bdaa81b40f8543407c5e2ac8ef4dc035
F src/pragma.c dcfe3a35d2de935feeaba1455528b4a5c4f1208c F src/pragma.c dcfe3a35d2de935feeaba1455528b4a5c4f1208c
F src/pragma.h 631a91c8b0e6ca8f051a1d8a4a0da4150e04620a F src/pragma.h 631a91c8b0e6ca8f051a1d8a4a0da4150e04620a
F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1 F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1
@ -338,14 +338,14 @@ F src/printf.c 0c4bcdd1c2e2521024f0a69cb5eb334f86b3652a
F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696
F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91
F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e
F src/select.c 3e4a4691e11d810b024407d90aa5dd845b1f5aac F src/select.c 167b4e9058bc8e997d18d6b6b20ecbb0c9c457af
F src/shell.c d25df04168d6ba5a4fa05bdbf859df667f9eb621 F src/shell.c d25df04168d6ba5a4fa05bdbf859df667f9eb621
F src/sqlite.h.in dc35357824c6bb84a04acd4e99dee3e07299a8c6 F src/sqlite.h.in 839c818e16ea68703d90d17bd2bb3607191debce
F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad
F src/sqlite3ext.h 4b66e3e3435da4b4c8c83696d0349f0c503b3924 F src/sqlite3ext.h 4b66e3e3435da4b4c8c83696d0349f0c503b3924
F src/sqliteInt.h d2d529e342d5becf735ca2edde2ba1477c935d45 F src/sqliteInt.h af76837cad8fb696e6527ec2745f175de7cb9093
F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46
F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179 F src/status.c 286f6398a4d2cd1e8ff0771e3d30f8dddb4768ea
F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e
F src/tclsqlite.c d9439b6a910985b7fff43ba6756bcef00de22649 F src/tclsqlite.c d9439b6a910985b7fff43ba6756bcef00de22649
F src/test1.c 8fff9c5aa63d6490f516d018b70c12a9cb9a4d8a F src/test1.c 8fff9c5aa63d6490f516d018b70c12a9cb9a4d8a
@ -394,21 +394,21 @@ F src/test_vfs.c 3b65d42e18b262805716bd96178c81da8f2d9283
F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698 F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
F src/threads.c bbfb74450643cb5372a43ad4f6cffd7e9dfcecb0 F src/threads.c bbfb74450643cb5372a43ad4f6cffd7e9dfcecb0
F src/tokenize.c 83c6ed569423a3af83a83973b444cf7123be33a6 F src/tokenize.c 338bc8f7c9dd103188952cda7964696bacac6d22
F src/treeview.c 154f0acc622fa3514de8777dcedf4c8a8802b4ce F src/treeview.c 154f0acc622fa3514de8777dcedf4c8a8802b4ce
F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f
F src/update.c dc37664095ca8604293ff1de2d9a547c6efb5e6e F src/update.c aa10336a2719bd1b9f89004f3d7ba6d566623a49
F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c
F src/util.c fc612367108b74573c5fd13a85d0a23027f438bd F src/util.c fc612367108b74573c5fd13a85d0a23027f438bd
F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701
F src/vdbe.c 4d4d88a68c354a62e8d4d3fffa365397e532374d F src/vdbe.c 10d66354fec90acb5fc908ad36da404ef9796170
F src/vdbe.h efb7a8c1459e31f3ea4377824c6a7e4cb5068637 F src/vdbe.h efb7a8c1459e31f3ea4377824c6a7e4cb5068637
F src/vdbeInt.h c1508eb4ee04d4db7bdfca5620cfa8ad632fdd62 F src/vdbeInt.h 33403622c6a8feaaac5f0f3f17f5d1bf6df42286
F src/vdbeapi.c 020681b943e77766b32ae1cddf86d7831b7374ca F src/vdbeapi.c 020681b943e77766b32ae1cddf86d7831b7374ca
F src/vdbeaux.c 7dccd114c9ee5f801709daecee36464fe6ce71af F src/vdbeaux.c 717bc2ae9cc0b58ef398fff44bd9164bfd96772a
F src/vdbeblob.c 565fabd302f5fca3bdf3d56cac330483616a39b6 F src/vdbeblob.c 565fabd302f5fca3bdf3d56cac330483616a39b6
F src/vdbemem.c 19b3036aa4d676e7103b0fb5efd6327da455f915 F src/vdbemem.c fdd1578e47bea61390d472de53c565781d81e045
F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbesort.c 8b23930a1289526f6d2a3a9f2e965bcc963e4a68
F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0
F src/vtab.c 2a8b44aa372c33f6154208e7a7f6c44254549806 F src/vtab.c 2a8b44aa372c33f6154208e7a7f6c44254549806
F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb
@ -417,7 +417,7 @@ F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba
F src/where.c 05a178b78c835928d7037c0b2e409b7b656a68a4 F src/where.c 05a178b78c835928d7037c0b2e409b7b656a68a4
F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647
F src/wherecode.c 4d60b2e8a88adb35851201fa4eff6fbf9aa57ad6 F src/wherecode.c 9aa2043685ec3eb73e87fa6f50aa4ec092f197dd
F src/whereexpr.c e63244ca06c503e5f3c5b7f3c9aea0db826089ed F src/whereexpr.c e63244ca06c503e5f3c5b7f3c9aea0db826089ed
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
@ -816,7 +816,7 @@ F test/journal3.test ff8af941f9e06161d3db1b46bb9f965ff0e7f307
F test/jrnlmode.test 7864d59cf7f6e552b9b99ba0f38acd167edc10fa F test/jrnlmode.test 7864d59cf7f6e552b9b99ba0f38acd167edc10fa
F test/jrnlmode2.test 81610545a4e6ed239ea8fa661891893385e23a1d F test/jrnlmode2.test 81610545a4e6ed239ea8fa661891893385e23a1d
F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa
F test/json101.test 83e6ebfb3cef6329853ab854403ec82b1787b537 F test/json101.test f0178422b3a2418f423fd0d3caf3571c8d1b9863
F test/json102.test bf3fe7a706d30936a76a0f7a0375e1e8e73aff5a F test/json102.test bf3fe7a706d30936a76a0f7a0375e1e8e73aff5a
F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff
F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63
@ -1334,7 +1334,7 @@ F test/wordcount.c 9915e06cb33d8ca8109b8700791afe80d305afda
F test/zeroblob.test 3857870fe681b8185654414a9bccfde80b62a0fa F test/zeroblob.test 3857870fe681b8185654414a9bccfde80b62a0fa
F test/zerodamage.test cf6748bad89553cc1632be51a6f54e487e4039ac F test/zerodamage.test cf6748bad89553cc1632be51a6f54e487e4039ac
F tool/GetFile.cs a15e08acb5dd7539b75ba23501581d7c2b462cb5 F tool/GetFile.cs a15e08acb5dd7539b75ba23501581d7c2b462cb5
F tool/GetTclKit.bat f8159730269bdbf5c334383134011dda4df45511 F tool/GetTclKit.bat 8606413d3035c05373a0d7fae82ebf59ae9e16c3
F tool/addopcodes.tcl 7cc82ecca456a6b3148abf492b0419b83140881a F tool/addopcodes.tcl 7cc82ecca456a6b3148abf492b0419b83140881a
F tool/build-all-msvc.bat 2b1703b322da121e56b955cb58de091107f777c3 x F tool/build-all-msvc.bat 2b1703b322da121e56b955cb58de091107f777c3 x
F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367
@ -1342,7 +1342,7 @@ F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2
F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2
F tool/fast_vacuum.c 5ba0d6f5963a0a63bdc42840f678bad75b2ebce1 F tool/fast_vacuum.c 5ba0d6f5963a0a63bdc42840f678bad75b2ebce1
F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439 F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439
F tool/fuzzershell.c 87cc3d6f00239d786d231954289f106131989cc7 F tool/fuzzershell.c b36096cdbcb4af985a2d6c20093d61e55b49bfe1
F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4
F tool/genfkey.test 4196a8928b78f51d54ef58e99e99401ab2f0a7e5 F tool/genfkey.test 4196a8928b78f51d54ef58e99e99401ab2f0a7e5
F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce
@ -1359,7 +1359,7 @@ F tool/mkpragmatab.tcl 84af2b180484323a2ea22a2279e8bd9e3e1e492e
F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97
F tool/mksqlite3c-noext.tcl 87240b09c20042999b41d5fabe091b7111287835 F tool/mksqlite3c-noext.tcl 87240b09c20042999b41d5fabe091b7111287835
F tool/mksqlite3c.tcl b66b4170f693602cd6985aed15d9509fe2f18c84 F tool/mksqlite3c.tcl b66b4170f693602cd6985aed15d9509fe2f18c84
F tool/mksqlite3h.tcl e3ac3f23897d86cb8f5f5df92e91643229fcc8d1 F tool/mksqlite3h.tcl 1d41ab59bffb025121f75b76e183125ce41b3ec8
F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b
F tool/mkvsix.tcl bbe57cd9ae11c6cc70319241101ef8d2b8c3765b F tool/mkvsix.tcl bbe57cd9ae11c6cc70319241101ef8d2b8c3765b
F tool/offsets.c fe4262fdfa378e8f5499a42136d17bf3b98f6091 F tool/offsets.c fe4262fdfa378e8f5499a42136d17bf3b98f6091
@ -1369,7 +1369,7 @@ F tool/replace.tcl 7727c60a04299b65a92f5e1590896fea0f25b9e0
F tool/restore_jrnl.tcl 6957a34f8f1f0f8285e07536225ec3b292a9024a F tool/restore_jrnl.tcl 6957a34f8f1f0f8285e07536225ec3b292a9024a
F tool/rollback-test.c 9fc98427d1e23e84429d7e6d07d9094fbdec65a5 F tool/rollback-test.c 9fc98427d1e23e84429d7e6d07d9094fbdec65a5
F tool/showdb.c b1e16174385d5bd0815823a7fda1ecc82ed6088b F tool/showdb.c b1e16174385d5bd0815823a7fda1ecc82ed6088b
F tool/showjournal.c 053eb1cc774710c6890b7dd6293300cc297b16a5 F tool/showjournal.c 5bad7ae8784a43d2b270d953060423b8bd480818
F tool/showlocks.c 9920bcc64f58378ff1118caead34147201f48c68 F tool/showlocks.c 9920bcc64f58378ff1118caead34147201f48c68
F tool/showstat4.c 9515faa8ec176599d4a8288293ba8ec61f7b728a F tool/showstat4.c 9515faa8ec176599d4a8288293ba8ec61f7b728a
F tool/showwal.c 85cb36d4fe3e93e2fbd63e786e0d1ce42d0c4fad F tool/showwal.c 85cb36d4fe3e93e2fbd63e786e0d1ce42d0c4fad
@ -1388,11 +1388,11 @@ F tool/symbols.sh fec58532668296d7c7dc48be9c87f75ccdb5814f
F tool/tostr.tcl 96022f35ada2194f6f8ccf6fd95809e90ed277c4 F tool/tostr.tcl 96022f35ada2194f6f8ccf6fd95809e90ed277c4
F tool/varint.c 5d94cb5003db9dbbcbcc5df08d66f16071aee003 F tool/varint.c 5d94cb5003db9dbbcbcc5df08d66f16071aee003
F tool/vdbe-compress.tcl 5926c71f9c12d2ab73ef35c29376e756eb68361c F tool/vdbe-compress.tcl 5926c71f9c12d2ab73ef35c29376e756eb68361c
F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P fbe637620fb7f2c9395c9ddac77d26746d6d4178 4bd0d43db7c1877f2d8a8d2f2a48f24a10f0c3b8 P 29444149342fc6b1ea8cd34c2c8e1fcb06eaa7ed 39e8a5d93fa370afb03223bf0c20ea0f3448b9fc
R 95393720801ae9935a00efdbdde27bba R 65f1893d9bc2d803f33dd71113ac3287
U drh U drh
Z 98cfd2338cc7382cd129bb1eb7f3da88 Z c857f56fb460d2406ff0431b8f8cb27b

View File

@ -1 +1 @@
29444149342fc6b1ea8cd34c2c8e1fcb06eaa7ed 26fa091d68e89a0b6af61ba706d23a9f37e8025a

View File

@ -2497,9 +2497,12 @@ void sqlite3ExprCodeGetColumnOfTable(
/* /*
** Generate code that will extract the iColumn-th column from ** Generate code that will extract the iColumn-th column from
** table pTab and store the column value in a register. An effort ** table pTab and store the column value in a register.
** is made to store the column value in register iReg, but this is **
** not guaranteed. The location of the column value is returned. ** An effort is made to store the column value in register iReg. This
** is not garanteeed for GetColumn() - the result can be stored in
** any register. But the result is guaranteed to land in register iReg
** for GetColumnToReg().
** **
** There must be an open cursor to pTab in iTable when this routine ** There must be an open cursor to pTab in iTable when this routine
** is called. If iColumn<0 then code is generated that extracts the rowid. ** is called. If iColumn<0 then code is generated that extracts the rowid.
@ -2510,7 +2513,7 @@ int sqlite3ExprCodeGetColumn(
int iColumn, /* Index of the table column */ int iColumn, /* Index of the table column */
int iTable, /* The cursor pointing to the table */ int iTable, /* The cursor pointing to the table */
int iReg, /* Store results here */ int iReg, /* Store results here */
u8 p5 /* P5 value for OP_Column */ u8 p5 /* P5 value for OP_Column + FLAGS */
){ ){
Vdbe *v = pParse->pVdbe; Vdbe *v = pParse->pVdbe;
int i; int i;
@ -2532,6 +2535,17 @@ int sqlite3ExprCodeGetColumn(
} }
return iReg; return iReg;
} }
void sqlite3ExprCodeGetColumnToReg(
Parse *pParse, /* Parsing and code generating context */
Table *pTab, /* Description of the table we are reading from */
int iColumn, /* Index of the table column */
int iTable, /* The cursor pointing to the table */
int iReg /* Store results here */
){
int r1 = sqlite3ExprCodeGetColumn(pParse, pTab, iColumn, iTable, iReg, 0);
if( r1!=iReg ) sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, r1, iReg);
}
/* /*
** Clear all column cache entries. ** Clear all column cache entries.

View File

@ -1422,7 +1422,7 @@ void sqlite3GenerateConstraintChecks(
}else{ }else{
x = iField + regNewData + 1; x = iField + regNewData + 1;
} }
sqlite3VdbeAddOp2(v, OP_SCopy, x, regIdx+i); sqlite3VdbeAddOp2(v, iField<0 ? OP_IntCopy : OP_SCopy, x, regIdx+i);
VdbeComment((v, "%s", iField<0 ? "rowid" : pTab->aCol[iField].zName)); VdbeComment((v, "%s", iField<0 ? "rowid" : pTab->aCol[iField].zName));
} }
} }

View File

@ -615,7 +615,7 @@ int sqlite3_enable_load_extension(sqlite3 *db, int onoff){
** dummy pointer. ** dummy pointer.
*/ */
#ifdef SQLITE_OMIT_LOAD_EXTENSION #ifdef SQLITE_OMIT_LOAD_EXTENSION
static const sqlite3_api_routines sqlite3Apis; static const sqlite3_api_routines sqlite3Apis = { 0 };
#endif #endif

View File

@ -131,9 +131,7 @@ int sqlite3MallocInit(void){
sqlite3MemSetDefault(); sqlite3MemSetDefault();
} }
memset(&mem0, 0, sizeof(mem0)); memset(&mem0, 0, sizeof(mem0));
if( sqlite3GlobalConfig.bCoreMutex ){
mem0.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); mem0.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM);
}
if( sqlite3GlobalConfig.pScratch && sqlite3GlobalConfig.szScratch>=100 if( sqlite3GlobalConfig.pScratch && sqlite3GlobalConfig.szScratch>=100
&& sqlite3GlobalConfig.nScratch>0 ){ && sqlite3GlobalConfig.nScratch>0 ){
int i, n, sz; int i, n, sz;
@ -224,7 +222,7 @@ static int mallocWithAlarm(int n, void **pp){
void *p; void *p;
assert( sqlite3_mutex_held(mem0.mutex) ); assert( sqlite3_mutex_held(mem0.mutex) );
nFull = sqlite3GlobalConfig.m.xRoundup(n); nFull = sqlite3GlobalConfig.m.xRoundup(n);
sqlite3StatusSet(SQLITE_STATUS_MALLOC_SIZE, n); sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, n);
if( mem0.alarmThreshold>0 ){ if( mem0.alarmThreshold>0 ){
sqlite3_int64 nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); sqlite3_int64 nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED);
if( nUsed >= mem0.alarmThreshold - nFull ){ if( nUsed >= mem0.alarmThreshold - nFull ){
@ -316,7 +314,7 @@ void *sqlite3ScratchMalloc(int n){
assert( n>0 ); assert( n>0 );
sqlite3_mutex_enter(mem0.mutex); sqlite3_mutex_enter(mem0.mutex);
sqlite3StatusSet(SQLITE_STATUS_SCRATCH_SIZE, n); sqlite3StatusHighwater(SQLITE_STATUS_SCRATCH_SIZE, n);
if( mem0.nScratchFree && sqlite3GlobalConfig.szScratch>=n ){ if( mem0.nScratchFree && sqlite3GlobalConfig.szScratch>=n ){
p = mem0.pScratchFree; p = mem0.pScratchFree;
mem0.pScratchFree = mem0.pScratchFree->pNext; mem0.pScratchFree = mem0.pScratchFree->pNext;
@ -411,6 +409,7 @@ int sqlite3MallocSize(void *p){
return sqlite3GlobalConfig.m.xSize(p); return sqlite3GlobalConfig.m.xSize(p);
} }
int sqlite3DbMallocSize(sqlite3 *db, void *p){ int sqlite3DbMallocSize(sqlite3 *db, void *p){
assert( p!=0 );
if( db==0 || !isLookaside(db,p) ){ if( db==0 || !isLookaside(db,p) ){
#if SQLITE_DEBUG #if SQLITE_DEBUG
if( db==0 ){ if( db==0 ){
@ -430,7 +429,7 @@ int sqlite3DbMallocSize(sqlite3 *db, void *p){
sqlite3_uint64 sqlite3_msize(void *p){ sqlite3_uint64 sqlite3_msize(void *p){
assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) );
assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) );
return (sqlite3_uint64)sqlite3GlobalConfig.m.xSize(p); return p ? sqlite3GlobalConfig.m.xSize(p) : 0;
} }
/* /*
@ -456,7 +455,7 @@ void sqlite3_free(void *p){
** *db->pnBytesFreed. ** *db->pnBytesFreed.
*/ */
static SQLITE_NOINLINE void measureAllocationSize(sqlite3 *db, void *p){ static SQLITE_NOINLINE void measureAllocationSize(sqlite3 *db, void *p){
*db->pnBytesFreed += sqlite3DbMallocSize(db,p); if( p ) *db->pnBytesFreed += sqlite3DbMallocSize(db,p);
} }
/* /*
@ -518,7 +517,7 @@ void *sqlite3Realloc(void *pOld, u64 nBytes){
pNew = pOld; pNew = pOld;
}else if( sqlite3GlobalConfig.bMemstat ){ }else if( sqlite3GlobalConfig.bMemstat ){
sqlite3_mutex_enter(mem0.mutex); sqlite3_mutex_enter(mem0.mutex);
sqlite3StatusSet(SQLITE_STATUS_MALLOC_SIZE, (int)nBytes); sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, (int)nBytes);
nDiff = nNew - nOld; nDiff = nNew - nOld;
if( sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED) >= if( sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED) >=
mem0.alarmThreshold-nDiff ){ mem0.alarmThreshold-nDiff ){

View File

@ -171,11 +171,11 @@ static void sqlite3MemFree(void *pPrior){
** or xRealloc(). ** or xRealloc().
*/ */
static int sqlite3MemSize(void *pPrior){ static int sqlite3MemSize(void *pPrior){
assert( pPrior!=0 );
#ifdef SQLITE_MALLOCSIZE #ifdef SQLITE_MALLOCSIZE
return pPrior ? (int)SQLITE_MALLOCSIZE(pPrior) : 0; return (int)SQLITE_MALLOCSIZE(pPrior);
#else #else
sqlite3_int64 *p; sqlite3_int64 *p;
if( pPrior==0 ) return 0;
p = (sqlite3_int64*)pPrior; p = (sqlite3_int64*)pPrior;
p--; p--;
return (int)p[0]; return (int)p[0];

View File

@ -476,7 +476,7 @@ static void memsys3FreeUnsafe(void *pOld){
*/ */
static int memsys3Size(void *p){ static int memsys3Size(void *p){
Mem3Block *pBlock; Mem3Block *pBlock;
if( p==0 ) return 0; assert( p!=0 );
pBlock = (Mem3Block*)p; pBlock = (Mem3Block*)p;
assert( (pBlock[-1].u.hdr.size4x&1)!=0 ); assert( (pBlock[-1].u.hdr.size4x&1)!=0 );
return (pBlock[-1].u.hdr.size4x&~3)*2 - 4; return (pBlock[-1].u.hdr.size4x&~3)*2 - 4;

View File

@ -200,12 +200,11 @@ static void memsys5Leave(void){
** works for chunks that are currently checked out. ** works for chunks that are currently checked out.
*/ */
static int memsys5Size(void *p){ static int memsys5Size(void *p){
int iSize = 0; int iSize, i;
if( p ){ assert( p!=0 );
int i = (int)(((u8 *)p-mem5.zPool)/mem5.szAtom); i = (int)(((u8 *)p-mem5.zPool)/mem5.szAtom);
assert( i>=0 && i<mem5.nBlock ); assert( i>=0 && i<mem5.nBlock );
iSize = mem5.szAtom * (1 << (mem5.aCtrl[i]&CTRL_LOGSIZE)); iSize = mem5.szAtom * (1 << (mem5.aCtrl[i]&CTRL_LOGSIZE));
}
return iSize; return iSize;
} }

View File

@ -320,7 +320,7 @@ static void *pcache1Alloc(int nByte){
pcache1.nFreeSlot--; pcache1.nFreeSlot--;
pcache1.bUnderPressure = pcache1.nFreeSlot<pcache1.nReserve; pcache1.bUnderPressure = pcache1.nFreeSlot<pcache1.nReserve;
assert( pcache1.nFreeSlot>=0 ); assert( pcache1.nFreeSlot>=0 );
sqlite3StatusSet(SQLITE_STATUS_PAGECACHE_SIZE, nByte); sqlite3StatusHighwater(SQLITE_STATUS_PAGECACHE_SIZE, nByte);
sqlite3StatusUp(SQLITE_STATUS_PAGECACHE_USED, 1); sqlite3StatusUp(SQLITE_STATUS_PAGECACHE_USED, 1);
} }
sqlite3_mutex_leave(pcache1.mutex); sqlite3_mutex_leave(pcache1.mutex);
@ -334,7 +334,7 @@ static void *pcache1Alloc(int nByte){
if( p ){ if( p ){
int sz = sqlite3MallocSize(p); int sz = sqlite3MallocSize(p);
sqlite3_mutex_enter(pcache1.mutex); sqlite3_mutex_enter(pcache1.mutex);
sqlite3StatusSet(SQLITE_STATUS_PAGECACHE_SIZE, nByte); sqlite3StatusHighwater(SQLITE_STATUS_PAGECACHE_SIZE, nByte);
sqlite3StatusUp(SQLITE_STATUS_PAGECACHE_OVERFLOW, sz); sqlite3StatusUp(SQLITE_STATUS_PAGECACHE_OVERFLOW, sz);
sqlite3_mutex_leave(pcache1.mutex); sqlite3_mutex_leave(pcache1.mutex);
} }

View File

@ -5295,13 +5295,8 @@ int sqlite3Select(
struct AggInfo_col *pCol = &sAggInfo.aCol[i]; struct AggInfo_col *pCol = &sAggInfo.aCol[i];
if( pCol->iSorterColumn>=j ){ if( pCol->iSorterColumn>=j ){
int r1 = j + regBase; int r1 = j + regBase;
int r2; sqlite3ExprCodeGetColumnToReg(pParse,
pCol->pTab, pCol->iColumn, pCol->iTable, r1);
r2 = sqlite3ExprCodeGetColumn(pParse,
pCol->pTab, pCol->iColumn, pCol->iTable, r1, 0);
if( r1!=r2 ){
sqlite3VdbeAddOp2(v, OP_SCopy, r2, r1);
}
j++; j++;
} }
} }

View File

@ -6572,7 +6572,8 @@ int sqlite3_status64(
** The value written into the *pCurrent parameter is undefined.</dd>)^ ** The value written into the *pCurrent parameter is undefined.</dd>)^
** **
** [[SQLITE_STATUS_PARSER_STACK]] ^(<dt>SQLITE_STATUS_PARSER_STACK</dt> ** [[SQLITE_STATUS_PARSER_STACK]] ^(<dt>SQLITE_STATUS_PARSER_STACK</dt>
** <dd>This parameter records the deepest parser stack. It is only ** <dd>The *pHighwater parameter records the deepest parser stack.
** The *pCurrent value is undefined. The *pHighwater value is only
** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].</dd>)^ ** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].</dd>)^
** </dl> ** </dl>
** **

View File

@ -3212,7 +3212,7 @@ const sqlite3_mem_methods *sqlite3MemGetMemsys5(void);
sqlite3_int64 sqlite3StatusValue(int); sqlite3_int64 sqlite3StatusValue(int);
void sqlite3StatusUp(int, int); void sqlite3StatusUp(int, int);
void sqlite3StatusDown(int, int); void sqlite3StatusDown(int, int);
void sqlite3StatusSet(int, int); void sqlite3StatusHighwater(int, int);
/* Access to mutexes used by sqlite3_status() */ /* Access to mutexes used by sqlite3_status() */
sqlite3_mutex *sqlite3Pcache1Mutex(void); sqlite3_mutex *sqlite3Pcache1Mutex(void);
@ -3396,6 +3396,7 @@ int sqlite3WhereOkOnePass(WhereInfo*, int*);
#define ONEPASS_MULTI 2 /* ONEPASS is valid for multiple rows */ #define ONEPASS_MULTI 2 /* ONEPASS is valid for multiple rows */
void sqlite3ExprCodeLoadIndexColumn(Parse*, Index*, int, int, int); void sqlite3ExprCodeLoadIndexColumn(Parse*, Index*, int, int, int);
int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int, u8); int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int, u8);
void sqlite3ExprCodeGetColumnToReg(Parse*, Table*, int, int, int);
void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int); void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int);
void sqlite3ExprCodeMove(Parse*, int, int, int); void sqlite3ExprCodeMove(Parse*, int, int, int);
void sqlite3ExprCacheStore(Parse*, int, int, int); void sqlite3ExprCacheStore(Parse*, int, int, int);

View File

@ -108,18 +108,21 @@ void sqlite3StatusDown(int op, int N){
} }
/* /*
** Set the value of a status to X. The highwater mark is adjusted if ** Adjust the highwater mark if necessary.
** necessary. The caller must hold the appropriate mutex. ** The caller must hold the appropriate mutex.
*/ */
void sqlite3StatusSet(int op, int X){ void sqlite3StatusHighwater(int op, int X){
wsdStatInit; wsdStatInit;
assert( op>=0 && op<ArraySize(wsdStat.nowValue) ); assert( op>=0 && op<ArraySize(wsdStat.nowValue) );
assert( op>=0 && op<ArraySize(statMutex) ); assert( op>=0 && op<ArraySize(statMutex) );
assert( sqlite3_mutex_held(statMutex[op] ? sqlite3Pcache1Mutex() assert( sqlite3_mutex_held(statMutex[op] ? sqlite3Pcache1Mutex()
: sqlite3MallocMutex()) ); : sqlite3MallocMutex()) );
wsdStat.nowValue[op] = X; assert( op==SQLITE_STATUS_MALLOC_SIZE
if( wsdStat.nowValue[op]>wsdStat.mxValue[op] ){ || op==SQLITE_STATUS_PAGECACHE_SIZE
wsdStat.mxValue[op] = wsdStat.nowValue[op]; || op==SQLITE_STATUS_SCRATCH_SIZE
|| op==SQLITE_STATUS_PARSER_STACK );
if( X>wsdStat.mxValue[op] ){
wsdStat.mxValue[op] = X;
} }
} }
@ -252,10 +255,10 @@ int sqlite3_db_status(
+ pSchema->idxHash.count + pSchema->idxHash.count
+ pSchema->fkeyHash.count + pSchema->fkeyHash.count
); );
nByte += sqlite3MallocSize(pSchema->tblHash.ht); nByte += sqlite3_msize(pSchema->tblHash.ht);
nByte += sqlite3MallocSize(pSchema->trigHash.ht); nByte += sqlite3_msize(pSchema->trigHash.ht);
nByte += sqlite3MallocSize(pSchema->idxHash.ht); nByte += sqlite3_msize(pSchema->idxHash.ht);
nByte += sqlite3MallocSize(pSchema->fkeyHash.ht); nByte += sqlite3_msize(pSchema->fkeyHash.ht);
for(p=sqliteHashFirst(&pSchema->trigHash); p; p=sqliteHashNext(p)){ for(p=sqliteHashFirst(&pSchema->trigHash); p; p=sqliteHashNext(p)){
sqlite3DeleteTrigger(db, (Trigger*)sqliteHashData(p)); sqlite3DeleteTrigger(db, (Trigger*)sqliteHashData(p));

View File

@ -467,7 +467,7 @@ abort_parse:
} }
#ifdef YYTRACKMAXSTACKDEPTH #ifdef YYTRACKMAXSTACKDEPTH
sqlite3_mutex_enter(sqlite3MallocMutex()); sqlite3_mutex_enter(sqlite3MallocMutex());
sqlite3StatusSet(SQLITE_STATUS_PARSER_STACK, sqlite3StatusHighwater(SQLITE_STATUS_PARSER_STACK,
sqlite3ParserStackPeak(pEngine) sqlite3ParserStackPeak(pEngine)
); );
sqlite3_mutex_leave(sqlite3MallocMutex()); sqlite3_mutex_leave(sqlite3MallocMutex());

View File

@ -522,7 +522,7 @@ void sqlite3Update(
*/ */
testcase( i==31 ); testcase( i==31 );
testcase( i==32 ); testcase( i==32 );
sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regNew+i); sqlite3ExprCodeGetColumnToReg(pParse, pTab, i, iDataCur, regNew+i);
}else{ }else{
sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i);
} }

View File

@ -519,16 +519,24 @@ static int checkSavepointCount(sqlite3 *db){
** Return the register of pOp->p2 after first preparing it to be ** Return the register of pOp->p2 after first preparing it to be
** overwritten with an integer value. ** overwritten with an integer value.
*/ */
static SQLITE_NOINLINE Mem *out2PrereleaseWithClear(Mem *pOut){
sqlite3VdbeMemSetNull(pOut);
pOut->flags = MEM_Int;
return pOut;
}
static Mem *out2Prerelease(Vdbe *p, VdbeOp *pOp){ static Mem *out2Prerelease(Vdbe *p, VdbeOp *pOp){
Mem *pOut; Mem *pOut;
assert( pOp->p2>0 ); assert( pOp->p2>0 );
assert( pOp->p2<=(p->nMem-p->nCursor) ); assert( pOp->p2<=(p->nMem-p->nCursor) );
pOut = &p->aMem[pOp->p2]; pOut = &p->aMem[pOp->p2];
memAboutToChange(p, pOut); memAboutToChange(p, pOut);
if( VdbeMemDynamic(pOut) ) sqlite3VdbeMemSetNull(pOut); if( VdbeMemDynamic(pOut) ){
return out2PrereleaseWithClear(pOut);
}else{
pOut->flags = MEM_Int; pOut->flags = MEM_Int;
return pOut; return pOut;
} }
}
/* /*
@ -1265,6 +1273,22 @@ case OP_SCopy: { /* out2 */
break; break;
} }
/* Opcode: IntCopy P1 P2 * * *
** Synopsis: r[P2]=r[P1]
**
** Transfer the integer value held in register P1 into register P2.
**
** This is an optimized version of SCopy that works only for integer
** values.
*/
case OP_IntCopy: { /* out2 */
pIn1 = &aMem[pOp->p1];
assert( (pIn1->flags & MEM_Int)!=0 );
pOut = &aMem[pOp->p2];
sqlite3VdbeMemSetInt64(pOut, pIn1->u.i);
break;
}
/* Opcode: ResultRow P1 P2 * * * /* Opcode: ResultRow P1 P2 * * *
** Synopsis: output=r[P1@P2] ** Synopsis: output=r[P1@P2]
** **
@ -2344,7 +2368,7 @@ case OP_Column: {
const u8 *zHdr; /* Next unparsed byte of the header */ const u8 *zHdr; /* Next unparsed byte of the header */
const u8 *zEndHdr; /* Pointer to first byte after the header */ const u8 *zEndHdr; /* Pointer to first byte after the header */
u32 offset; /* Offset into the data */ u32 offset; /* Offset into the data */
u32 szField; /* Number of bytes in the content of a field */ u64 offset64; /* 64-bit offset */
u32 avail; /* Number of bytes of available data */ u32 avail; /* Number of bytes of available data */
u32 t; /* A type code from the record header */ u32 t; /* A type code from the record header */
u16 fx; /* pDest->flags value */ u16 fx; /* pDest->flags value */
@ -2415,6 +2439,15 @@ case OP_Column: {
pC->nHdrParsed = 0; pC->nHdrParsed = 0;
aOffset[0] = offset; aOffset[0] = offset;
if( avail<offset ){
/* pC->aRow does not have to hold the entire row, but it does at least
** need to cover the header of the record. If pC->aRow does not contain
** the complete header, then set it to zero, forcing the header to be
** dynamically allocated. */
pC->aRow = 0;
pC->szRow = 0;
/* Make sure a corrupt database has not given us an oversize header. /* Make sure a corrupt database has not given us an oversize header.
** Do this now to avoid an oversize memory allocation. ** Do this now to avoid an oversize memory allocation.
** **
@ -2428,14 +2461,6 @@ case OP_Column: {
rc = SQLITE_CORRUPT_BKPT; rc = SQLITE_CORRUPT_BKPT;
goto op_column_error; goto op_column_error;
} }
if( avail<offset ){
/* pC->aRow does not have to hold the entire row, but it does at least
** need to cover the header of the record. If pC->aRow does not contain
** the complete header, then set it to zero, forcing the header to be
** dynamically allocated. */
pC->aRow = 0;
pC->szRow = 0;
} }
/* The following goto is an optimization. It can be omitted and /* The following goto is an optimization. It can be omitted and
@ -2458,11 +2483,8 @@ case OP_Column: {
/* Make sure zData points to enough of the record to cover the header. */ /* Make sure zData points to enough of the record to cover the header. */
if( pC->aRow==0 ){ if( pC->aRow==0 ){
memset(&sMem, 0, sizeof(sMem)); memset(&sMem, 0, sizeof(sMem));
rc = sqlite3VdbeMemFromBtree(pCrsr, 0, aOffset[0], rc = sqlite3VdbeMemFromBtree(pCrsr, 0, aOffset[0], !pC->isTable, &sMem);
!pC->isTable, &sMem); if( rc!=SQLITE_OK ) goto op_column_error;
if( rc!=SQLITE_OK ){
goto op_column_error;
}
zData = (u8*)sMem.z; zData = (u8*)sMem.z;
}else{ }else{
zData = pC->aRow; zData = pC->aRow;
@ -2470,44 +2492,32 @@ case OP_Column: {
/* Fill in pC->aType[i] and aOffset[i] values through the p2-th field. */ /* Fill in pC->aType[i] and aOffset[i] values through the p2-th field. */
i = pC->nHdrParsed; i = pC->nHdrParsed;
offset = aOffset[i]; offset64 = aOffset[i];
zHdr = zData + pC->iHdrOffset; zHdr = zData + pC->iHdrOffset;
zEndHdr = zData + aOffset[0]; zEndHdr = zData + aOffset[0];
assert( i<=p2 && zHdr<zEndHdr ); assert( i<=p2 && zHdr<zEndHdr );
do{ do{
if( zHdr[0]<0x80 ){ if( (t = zHdr[0])<0x80 ){
t = zHdr[0];
zHdr++; zHdr++;
offset64 += sqlite3VdbeOneByteSerialTypeLen(t);
}else{ }else{
zHdr += sqlite3GetVarint32(zHdr, &t); zHdr += sqlite3GetVarint32(zHdr, &t);
offset64 += sqlite3VdbeSerialTypeLen(t);
} }
pC->aType[i] = t; pC->aType[i++] = t;
szField = sqlite3VdbeSerialTypeLen(t); aOffset[i] = (u32)(offset64 & 0xffffffff);
offset += szField;
if( offset<szField ){ /* True if offset overflows */
zHdr = &zEndHdr[1]; /* Forces SQLITE_CORRUPT return below */
break;
}
i++;
aOffset[i] = offset;
}while( i<=p2 && zHdr<zEndHdr ); }while( i<=p2 && zHdr<zEndHdr );
pC->nHdrParsed = i; pC->nHdrParsed = i;
pC->iHdrOffset = (u32)(zHdr - zData); pC->iHdrOffset = (u32)(zHdr - zData);
if( pC->aRow==0 ){ if( pC->aRow==0 ) sqlite3VdbeMemRelease(&sMem);
sqlite3VdbeMemRelease(&sMem);
sMem.flags = MEM_Null;
}
/* The record is corrupt if any of the following are true: /* The record is corrupt if any of the following are true:
** (1) the bytes of the header extend past the declared header size ** (1) the bytes of the header extend past the declared header size
** (zHdr>zEndHdr)
** (2) the entire header was used but not all data was used ** (2) the entire header was used but not all data was used
** (zHdr==zEndHdr && offset!=pC->payloadSize)
** (3) the end of the data extends beyond the end of the record. ** (3) the end of the data extends beyond the end of the record.
** (offset > pC->payloadSize)
*/ */
if( (zHdr>=zEndHdr && (zHdr>zEndHdr || offset!=pC->payloadSize)) if( (zHdr>=zEndHdr && (zHdr>zEndHdr || offset64!=pC->payloadSize))
|| (offset > pC->payloadSize) || (offset64 > pC->payloadSize)
){ ){
rc = SQLITE_CORRUPT_BKPT; rc = SQLITE_CORRUPT_BKPT;
goto op_column_error; goto op_column_error;
@ -2526,6 +2536,8 @@ case OP_Column: {
} }
goto op_column_out; goto op_column_out;
} }
}else{
t = pC->aType[p2];
} }
/* Extract the content for the p2+1-th column. Control can only /* Extract the content for the p2+1-th column. Control can only
@ -2536,7 +2548,7 @@ case OP_Column: {
assert( rc==SQLITE_OK ); assert( rc==SQLITE_OK );
assert( sqlite3VdbeCheckMemInvariants(pDest) ); assert( sqlite3VdbeCheckMemInvariants(pDest) );
if( VdbeMemDynamic(pDest) ) sqlite3VdbeMemSetNull(pDest); if( VdbeMemDynamic(pDest) ) sqlite3VdbeMemSetNull(pDest);
t = pC->aType[p2]; assert( t==pC->aType[p2] );
if( pC->szRow>=aOffset[p2+1] ){ if( pC->szRow>=aOffset[p2+1] ){
/* This is the common case where the desired content fits on the original /* This is the common case where the desired content fits on the original
** page - where the content is not on an overflow page */ ** page - where the content is not on an overflow page */
@ -2648,7 +2660,7 @@ case OP_MakeRecord: {
int file_format; /* File format to use for encoding */ int file_format; /* File format to use for encoding */
int i; /* Space used in zNewRecord[] header */ int i; /* Space used in zNewRecord[] header */
int j; /* Space used in zNewRecord[] content */ int j; /* Space used in zNewRecord[] content */
int len; /* Length of a field */ u32 len; /* Length of a field */
/* Assuming the record contains N fields, the record format looks /* Assuming the record contains N fields, the record format looks
** like this: ** like this:
@ -2698,8 +2710,7 @@ case OP_MakeRecord: {
pRec = pLast; pRec = pLast;
do{ do{
assert( memIsValid(pRec) ); assert( memIsValid(pRec) );
pRec->uTemp = serial_type = sqlite3VdbeSerialType(pRec, file_format); pRec->uTemp = serial_type = sqlite3VdbeSerialType(pRec, file_format, &len);
len = sqlite3VdbeSerialTypeLen(serial_type);
if( pRec->flags & MEM_Zero ){ if( pRec->flags & MEM_Zero ){
if( nData ){ if( nData ){
if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem; if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem;

View File

@ -423,7 +423,8 @@ int sqlite3VdbeCursorRestore(VdbeCursor*);
void sqlite3VdbePrintOp(FILE*, int, Op*); void sqlite3VdbePrintOp(FILE*, int, Op*);
#endif #endif
u32 sqlite3VdbeSerialTypeLen(u32); u32 sqlite3VdbeSerialTypeLen(u32);
u32 sqlite3VdbeSerialType(Mem*, int); u8 sqlite3VdbeOneByteSerialTypeLen(u8);
u32 sqlite3VdbeSerialType(Mem*, int, u32*);
u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32); u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32);
u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*);
void sqlite3VdbeDeleteAuxData(Vdbe*, int, int); void sqlite3VdbeDeleteAuxData(Vdbe*, int, int);

View File

@ -3036,11 +3036,13 @@ int sqlite3VdbeCursorMoveto(VdbeCursor *p){
/* /*
** Return the serial-type for the value stored in pMem. ** Return the serial-type for the value stored in pMem.
*/ */
u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){ u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){
int flags = pMem->flags; int flags = pMem->flags;
u32 n; u32 n;
assert( pLen!=0 );
if( flags&MEM_Null ){ if( flags&MEM_Null ){
*pLen = 0;
return 0; return 0;
} }
if( flags&MEM_Int ){ if( flags&MEM_Int ){
@ -3054,15 +3056,23 @@ u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){
u = i; u = i;
} }
if( u<=127 ){ if( u<=127 ){
return ((i&1)==i && file_format>=4) ? 8+(u32)u : 1; if( (i&1)==i && file_format>=4 ){
*pLen = 0;
return 8+(u32)u;
}else{
*pLen = 1;
return 1;
} }
if( u<=32767 ) return 2; }
if( u<=8388607 ) return 3; if( u<=32767 ){ *pLen = 2; return 2; }
if( u<=2147483647 ) return 4; if( u<=8388607 ){ *pLen = 3; return 3; }
if( u<=MAX_6BYTE ) return 5; if( u<=2147483647 ){ *pLen = 4; return 4; }
if( u<=MAX_6BYTE ){ *pLen = 6; return 5; }
*pLen = 8;
return 6; return 6;
} }
if( flags&MEM_Real ){ if( flags&MEM_Real ){
*pLen = 8;
return 7; return 7;
} }
assert( pMem->db->mallocFailed || flags&(MEM_Str|MEM_Blob) ); assert( pMem->db->mallocFailed || flags&(MEM_Str|MEM_Blob) );
@ -3071,26 +3081,46 @@ u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){
if( flags & MEM_Zero ){ if( flags & MEM_Zero ){
n += pMem->u.nZero; n += pMem->u.nZero;
} }
*pLen = n;
return ((n*2) + 12 + ((flags&MEM_Str)!=0)); return ((n*2) + 12 + ((flags&MEM_Str)!=0));
} }
/* /*
** The sizes for serial types less than 12 ** The sizes for serial types less than 128
*/ */
static const u8 sqlite3SmallTypeSizes[] = { static const u8 sqlite3SmallTypeSizes[] = {
0, 1, 2, 3, 4, 6, 8, 8, 0, 0, 0, 0 /* 0 1 2 3 4 5 6 7 8 9 */
/* 0 */ 0, 1, 2, 3, 4, 6, 8, 8, 0, 0,
/* 10 */ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3,
/* 20 */ 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
/* 30 */ 9, 9, 10, 10, 11, 11, 12, 12, 13, 13,
/* 40 */ 14, 14, 15, 15, 16, 16, 17, 17, 18, 18,
/* 50 */ 19, 19, 20, 20, 21, 21, 22, 22, 23, 23,
/* 60 */ 24, 24, 25, 25, 26, 26, 27, 27, 28, 28,
/* 70 */ 29, 29, 30, 30, 31, 31, 32, 32, 33, 33,
/* 80 */ 34, 34, 35, 35, 36, 36, 37, 37, 38, 38,
/* 90 */ 39, 39, 40, 40, 41, 41, 42, 42, 43, 43,
/* 100 */ 44, 44, 45, 45, 46, 46, 47, 47, 48, 48,
/* 110 */ 49, 49, 50, 50, 51, 51, 52, 52, 53, 53,
/* 120 */ 54, 54, 55, 55, 56, 56, 57, 57
}; };
/* /*
** Return the length of the data corresponding to the supplied serial-type. ** Return the length of the data corresponding to the supplied serial-type.
*/ */
u32 sqlite3VdbeSerialTypeLen(u32 serial_type){ u32 sqlite3VdbeSerialTypeLen(u32 serial_type){
if( serial_type>=12 ){ if( serial_type>=128 ){
return (serial_type-12)/2; return (serial_type-12)/2;
}else{ }else{
assert( serial_type<12
|| sqlite3SmallTypeSizes[serial_type]==(serial_type - 12)/2 );
return sqlite3SmallTypeSizes[serial_type]; return sqlite3SmallTypeSizes[serial_type];
} }
} }
u8 sqlite3VdbeOneByteSerialTypeLen(u8 serial_type){
assert( serial_type<128 );
return sqlite3SmallTypeSizes[serial_type];
}
/* /*
** If we are on an architecture with mixed-endian floating ** If we are on an architecture with mixed-endian floating

View File

@ -1427,17 +1427,16 @@ static void recordFunc(
sqlite3_value **argv sqlite3_value **argv
){ ){
const int file_format = 1; const int file_format = 1;
int iSerial; /* Serial type */ u32 iSerial; /* Serial type */
int nSerial; /* Bytes of space for iSerial as varint */ int nSerial; /* Bytes of space for iSerial as varint */
int nVal; /* Bytes of space required for argv[0] */ u32 nVal; /* Bytes of space required for argv[0] */
int nRet; int nRet;
sqlite3 *db; sqlite3 *db;
u8 *aRet; u8 *aRet;
UNUSED_PARAMETER( argc ); UNUSED_PARAMETER( argc );
iSerial = sqlite3VdbeSerialType(argv[0], file_format); iSerial = sqlite3VdbeSerialType(argv[0], file_format, &nVal);
nSerial = sqlite3VarintLen(iSerial); nSerial = sqlite3VarintLen(iSerial);
nVal = sqlite3VdbeSerialTypeLen(iSerial);
db = sqlite3_context_db_handle(context); db = sqlite3_context_db_handle(context);
nRet = 1 + nSerial + nVal; nRet = 1 + nSerial + nVal;

View File

@ -978,7 +978,7 @@ int sqlite3VdbeSorterInit(
} }
pSorter->pgsz = pgsz = sqlite3BtreeGetPageSize(db->aDb[0].pBt); pSorter->pgsz = pgsz = sqlite3BtreeGetPageSize(db->aDb[0].pBt);
pSorter->nTask = nWorker + 1; pSorter->nTask = nWorker + 1;
pSorter->iPrev = nWorker-1; pSorter->iPrev = (u8)(nWorker - 1);
pSorter->bUseThreads = (pSorter->nTask>1); pSorter->bUseThreads = (pSorter->nTask>1);
pSorter->db = db; pSorter->db = db;
for(i=0; i<pSorter->nTask; i++){ for(i=0; i<pSorter->nTask; i++){

View File

@ -1455,11 +1455,7 @@ Bitmask sqlite3WhereCodeOneLoopStart(
r = sqlite3GetTempRange(pParse, nPk); r = sqlite3GetTempRange(pParse, nPk);
for(iPk=0; iPk<nPk; iPk++){ for(iPk=0; iPk<nPk; iPk++){
int iCol = pPk->aiColumn[iPk]; int iCol = pPk->aiColumn[iPk];
int rx; sqlite3ExprCodeGetColumnToReg(pParse, pTab, iCol, iCur, r+iPk);
rx = sqlite3ExprCodeGetColumn(pParse, pTab, iCol, iCur,r+iPk,0);
if( rx!=r+iPk ){
sqlite3VdbeAddOp2(v, OP_SCopy, rx, r+iPk);
}
} }
/* Check if the temp table already contains this key. If so, /* Check if the temp table already contains this key. If so,

View File

@ -324,5 +324,22 @@ do_execsql_test json-6.4 {
SELECT json_valid('["a",55,"b",72]'); SELECT json_valid('["a",55,"b",72]');
} {1} } {1}
# White-space tests. Note that form-feed is not white-space in JSON.
# ticket [57eec374ae1d0a1d4a23077a95f4e173fe269113]
#
foreach {tn isvalid ws} {
7.1 1 char(0x20)
7.2 1 char(0x09)
7.3 1 char(0x0A)
7.4 1 char(0x0D)
7.5 0 char(0x0C)
7.6 1 char(0x20,0x09,0x0a,0x0d,0x20)
7.7 0 char(0x20,0x09,0x0a,0x0c,0x0d,0x20)
} {
do_execsql_test json-$tn.1 \
"SELECT json_valid(printf('%s{%s\"x\"%s:%s9%s}%s',
$::ws,$::ws,$::ws,$::ws,$::ws,$::ws));" \
$isvalid
}
finish_test finish_test

View File

@ -173,6 +173,7 @@ IF DEFINED TCLKIT_NOSDK GOTO skip_sdkVariables
%__ECHO% ECHO SET TCLINCDIR=%TEMP%\%TCLKIT_SDK%\include%APPEND%"%ROOT%\SetTclKitEnv.bat" %__ECHO% ECHO SET TCLINCDIR=%TEMP%\%TCLKIT_SDK%\include%APPEND%"%ROOT%\SetTclKitEnv.bat"
%__ECHO% ECHO SET TCLLIBDIR=%TEMP%\%TCLKIT_SDK%\lib%APPEND%"%ROOT%\SetTclKitEnv.bat" %__ECHO% ECHO SET TCLLIBDIR=%TEMP%\%TCLKIT_SDK%\lib%APPEND%"%ROOT%\SetTclKitEnv.bat"
%__ECHO% ECHO SET LIBTCLPATH=%TEMP%\%TCLKIT_SDK%\lib%APPEND%"%ROOT%\SetTclKitEnv.bat"
%__ECHO% ECHO SET LIBTCL=%TCLKIT_LIB%%APPEND%"%ROOT%\SetTclKitEnv.bat" %__ECHO% ECHO SET LIBTCL=%TCLKIT_LIB%%APPEND%"%ROOT%\SetTclKitEnv.bat"
%__ECHO% ECHO SET LIBTCLSTUB=%TCLKIT_LIB_STUB%%APPEND%"%ROOT%\SetTclKitEnv.bat" %__ECHO% ECHO SET LIBTCLSTUB=%TCLKIT_LIB_STUB%%APPEND%"%ROOT%\SetTclKitEnv.bat"

View File

@ -725,12 +725,6 @@ int main(int argc, char **argv){
} }
#ifndef SQLITE_OMIT_TRACE #ifndef SQLITE_OMIT_TRACE
sqlite3_trace(db, verboseFlag ? traceCallback : traceNoop, 0); sqlite3_trace(db, verboseFlag ? traceCallback : traceNoop, 0);
#endif
#ifdef SQLITE_ENABLE_JSON1
{
extern int sqlite3_json_init(sqlite3*);
sqlite3_json_init(db);
}
#endif #endif
sqlite3_create_function(db, "eval", 1, SQLITE_UTF8, 0, sqlEvalFunc, 0, 0); sqlite3_create_function(db, "eval", 1, SQLITE_UTF8, 0, sqlEvalFunc, 0, 0);
sqlite3_create_function(db, "eval", 2, SQLITE_UTF8, 0, sqlEvalFunc, 0, 0); sqlite3_create_function(db, "eval", 2, SQLITE_UTF8, 0, sqlEvalFunc, 0, 0);

View File

@ -98,7 +98,7 @@ foreach file $filelist {
# File sqlite3rtree.h contains a line "#include <sqlite3.h>". Omit this # File sqlite3rtree.h contains a line "#include <sqlite3.h>". Omit this
# line when copying sqlite3rtree.h into sqlite3.h. # line when copying sqlite3rtree.h into sqlite3.h.
# #
if {[string match {*#include*<sqlite3.h>*} $line]} continue if {[string match {*#include*[<"]sqlite3.h[>"]*} $line]} continue
regsub -- --VERS-- $line $zVersion line regsub -- --VERS-- $line $zVersion line
regsub -- --VERSION-NUMBER-- $line $nVersion line regsub -- --VERSION-NUMBER-- $line $nVersion line

View File

@ -30,7 +30,7 @@ static unsigned char *read_content(int N, int iOfst){
unsigned char *pBuf = malloc(N); unsigned char *pBuf = malloc(N);
if( pBuf==0 ) out_of_memory(); if( pBuf==0 ) out_of_memory();
fseek(db, iOfst, SEEK_SET); fseek(db, iOfst, SEEK_SET);
got = fread(pBuf, 1, N, db); got = (int)fread(pBuf, 1, N, db);
if( got<0 ){ if( got<0 ){
fprintf(stderr, "I/O error reading %d bytes from %d\n", N, iOfst); fprintf(stderr, "I/O error reading %d bytes from %d\n", N, iOfst);
memset(pBuf, 0, N); memset(pBuf, 0, N);
@ -53,7 +53,7 @@ static unsigned print_decode_line(
unsigned val = aData[ofst]; unsigned val = aData[ofst];
char zBuf[100]; char zBuf[100];
sprintf(zBuf, " %05x: %02x", ofst, aData[ofst]); sprintf(zBuf, " %05x: %02x", ofst, aData[ofst]);
i = strlen(zBuf); i = (int)strlen(zBuf);
for(j=1; j<4; j++){ for(j=1; j<4; j++){
if( j>=nByte ){ if( j>=nByte ){
sprintf(&zBuf[i], " "); sprintf(&zBuf[i], " ");
@ -61,7 +61,7 @@ static unsigned print_decode_line(
sprintf(&zBuf[i], " %02x", aData[ofst+j]); sprintf(&zBuf[i], " %02x", aData[ofst+j]);
val = val*256 + aData[ofst+j]; val = val*256 + aData[ofst+j];
} }
i += strlen(&zBuf[i]); i += (int)strlen(&zBuf[i]);
} }
sprintf(&zBuf[i], " %10u", val); sprintf(&zBuf[i], " %10u", val);
printf("%s %s\n", zBuf, zMsg); printf("%s %s\n", zBuf, zMsg);

View File

@ -1,8 +1,16 @@
#!/bin/tclsh #!/bin/tclsh
# #
# SUMMARY:
# Run this script in the same directory as the "vdbe_profile.out" file. # Run this script in the same directory as the "vdbe_profile.out" file.
# This script summarizes the results contained in that file. # This script summarizes the results contained in that file.
# #
# DETAILS:
# Compile SQLite using the -DVDBE_PROFILE option on Linux. This causes
# performance information about individual VDBE operations to be appended
# to the "vdbe_profile.out" file. After content has been accumulated in
# vdbe_profile.out, run this script to analyze the output and generate a
# report.
#
if {![file readable vdbe_profile.out]} { if {![file readable vdbe_profile.out]} {
error "run this script in the same directory as the vdbe_profile.out file" error "run this script in the same directory as the vdbe_profile.out file"
} }