Merge trunk into jni-threading branch.

FossilOrigin-Name: 8254479c6ff1ea3cc9e56de1698db8405c03da90b9bf4c401182e47e0842baf8
This commit is contained in:
stephan 2023-08-19 12:34:23 +00:00
commit 6f92f35449
35 changed files with 982 additions and 323 deletions

View File

@ -56,7 +56,7 @@ USE_STDCALL = 0
# in the core library.
#
!IFNDEF USE_SEH
USE_SEH = 0
USE_SEH = 1
!ENDIF
# Set this non-0 to have the shell executable link against the core dynamic
@ -225,6 +225,12 @@ WIN32HEAP = 0
OSTRACE = 0
!ENDIF
# enable address sanitizer using ASAN=1 on the command-line.
#
!IFNDEF ASAN
ASAN = 0
!ENDIF
# Set this to one of the following values to enable various debugging
# features. Each level includes the debugging options from the previous
# levels. Currently, the recognized values for DEBUG are:
@ -891,6 +897,13 @@ RCC = $(RCC) -DSQLITE_WIN32_MALLOC_VALIDATE=1
!ENDIF
!ENDIF
# Address sanitizer if ASAN=1
#
!IF $(ASAN)>0
TCC = $(TCC) /fsanitize=address
!ENDIF
# <<mark>>
# The locations of the Tcl header and library files. Also, the library that
# non-stubs enabled programs using Tcl must link against. These variables

View File

@ -104,9 +104,9 @@ For example:
mkdir bld ;# Build will occur in a sibling directory
cd bld ;# Change to the build directory
../sqlite/configure ;# Run the configure script
make ;# Run the makefile.
make ;# Builds the "sqlite3" command-line tool
make sqlite3.c ;# Build the "amalgamation" source file
make test ;# Run some tests (requires Tcl)
make devtest ;# Run some tests (requires Tcl)
See the makefile for additional targets.
@ -119,29 +119,30 @@ show what changes are needed.
## Using MSVC for Windows systems
On Windows, all applicable build products can be compiled with MSVC.
First open the command prompt window associated with the desired compiler
version (e.g. "Developer Command Prompt for VS2013"). Next, use NMAKE
with the provided "Makefile.msc" to build one of the supported targets.
You will also need a working installation of TCL.
See the [compile-for-windows.md](doc/compile-for-windows.md) document for
additional information about how to install MSVC and TCL and configure your
build environment.
For example, from the parent directory of the source subtree named "sqlite":
If you want to run tests, you need to let SQLite know the location of your
TCL library, using a command like this:
mkdir bld
cd bld
nmake /f ..\sqlite\Makefile.msc TOP=..\sqlite
nmake /f ..\sqlite\Makefile.msc sqlite3.c TOP=..\sqlite
nmake /f ..\sqlite\Makefile.msc sqlite3.dll TOP=..\sqlite
nmake /f ..\sqlite\Makefile.msc sqlite3.exe TOP=..\sqlite
nmake /f ..\sqlite\Makefile.msc test TOP=..\sqlite
set TCLDIR=c:\Tcl
There are several build options that can be set via the NMAKE command
line. For example, to build for WinRT, simply add "FOR_WINRT=1" argument
to the "sqlite3.dll" command line above. When debugging into the SQLite
code, adding the "DEBUG=1" argument to one of the above command lines is
recommended.
SQLite uses "tclsh.exe" as part of the build process, and so that utility
program will need to be somewhere on your %PATH%. The finished SQLite library
does not contain any TCL code, but it does use TCL to help with the build process
and to run tests.
SQLite does not require [Tcl](http://www.tcl.tk/) to run, but a Tcl installation
is required by the makefiles (including those for MSVC). SQLite contains
a lot of generated code and Tcl is used to do much of that code generation.
Build using Makefile.msc. Example:
nmake /f Makefile.msc
nmake /f Makefile.msc sqlite3.c
nmake /f Makefile.msc devtest
nmake /f Makefile.msc releasetest
There are many other makefile targets. See comments in Makefile.msc for
details.
## Source Code Tour

View File

@ -9,7 +9,7 @@ sqlite3_SOURCES = shell.c sqlite3.h
EXTRA_sqlite3_SOURCES = sqlite3.c
sqlite3_LDADD = @EXTRA_SHELL_OBJ@ @READLINE_LIBS@
sqlite3_DEPENDENCIES = @EXTRA_SHELL_OBJ@
sqlite3_CFLAGS = $(AM_CFLAGS) -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_ENABLE_STMTVTAB -DSQLITE_ENABLE_DBSTAT_VTAB $(SHELL_CFLAGS)
sqlite3_CFLAGS = $(AM_CFLAGS) -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_DQS=0 -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_ENABLE_STMTVTAB -DSQLITE_ENABLE_DBSTAT_VTAB $(SHELL_CFLAGS)
include_HEADERS = sqlite3.h sqlite3ext.h

View File

@ -56,7 +56,7 @@ USE_STDCALL = 0
# in the core library.
#
!IFNDEF USE_SEH
USE_SEH = 0
USE_SEH = 1
!ENDIF
# Set this non-0 to have the shell executable link against the core dynamic

View File

@ -0,0 +1,85 @@
# Notes On Compiling SQLite On Windows 11
Here are step-by-step instructions on how to build SQLite from
canonical source on a new Windows 11 PC, as of 2023-08-16:
1. Install Microsoft Visual Studio. The free "community edition"
will work fine. Do a standard install for C++ development.
SQLite only needs the
"cl" compiler and the "nmake" build tool.
2. Under the "Start" menu, find "All Apps" then go to "Visual Studio 20XX"
and find "x64 Native Tools Command Prompt for VS 20XX". Pin that
application to your task bar, as you will use it a lot. Bring up
an instance of this command prompt and do all of the subsequent steps
in that "x64 Native Tools" command prompt. (Or use "x86" if you want
a 32-bit build.) The subsequent steps will not work in a vanilla
DOS prompt. Nor will they work in PowerShell.
3. Install TCL development libraries. This note assumes that you wil
install the TCL development libraries in the "`c:\Tcl`" directory.
Make adjustments
if you want TCL installed somewhere else. SQLite needs both the
"tclsh.exe" command-line tool as part of the build process, and
the "tcl86.lib" library in order to run tests. You will need
TCL version 8.6 or later.
<ol type="a">
<li>Get the TCL source archive, perhaps from
<https://www.tcl.tk/software/tcltk/download.html>.
<li>Untar or unzip the source archive. CD into the "win/" subfolder
of the source tree.
<li>Run: `nmake /f makefile.vc release`
<li>Run: `nmake /f makefile.vc INSTALLDIR=c:\Tcl install`
<li>CD to c:\\Tcl\\lib. In that subfolder make a copy of the
"`tcl86t.lib`" file to the alternative name "`tcl86.lib`"
(omitting the second 't'). Leave the copy in the same directory
as the original.
<li>CD to c:\\Tcl\\bin. Make a copy of the "`tclsh86t.exe`"
file into "`tclsh.exe`" (without the "86t") in the same directory.
<li>Add c:\\Tcl\\bin to your %PATH%. To do this, go to Settings
and search for "path". Select "edit environment variables for
your account" and modify your default PATH accordingly.
You will need to close and reopen your command prompts after
making this change.
</ol>
4. Download the SQLite source tree and unpack it. CD into the
toplevel directory of the source tree.
5. Set the TCLDIR environment variable to point to your TCL installation.
Like this:
<ul>
<li> `set TCLDIR=c:\Tcl`
</ul>
6. Run the "`Makefile.msc`" makefile with an appropriate target.
Examples:
<ul>
<li> `nmake /f makefile.msc`
<li> `nmake /f makefile.msc sqlite3.c`
<li> `nmake /f makefile.msc devtest`
<li> `nmake /f makefile.msc releasetest`
</ul>
## 32-bit Builds
Doing a 32-bit build is just like doing a 64-bit build with the
following minor changes:
1. Use the "x86 Native Tools Command Prompt" instead of
"x64 Native Tools Command Prompt". "**x86**" instead of "**x64**".
2. Use a different installation directory for TCL.
The recommended directory is `c:\tcl32`. Thus you end up
with two TCL builds:
<ul>
<li> `c:\tcl` &larr; 64-bit (the default)
<li> `c:\tcl32` &larr; 32-bit
</ul>
3. Ensure that c:\\tcl32\\bin comes before c:\\tcl\\bin on
your PATH environment variable. You can achieve this using
a command like:
<ul>
<li> `set PATH=c:\tcl32\bin;%PATH%`
</ul>

View File

@ -492,8 +492,8 @@ struct Fts5ExtensionApi {
** as separate queries of the FTS index are required for each synonym.
**
** When using methods (2) or (3), it is important that the tokenizer only
** provide synonyms when tokenizing document text (method (2)) or query
** text (method (3)), not both. Doing so will not cause any errors, but is
** provide synonyms when tokenizing document text (method (3)) or query
** text (method (2)), not both. Doing so will not cause any errors, but is
** inefficient.
*/
typedef struct Fts5Tokenizer Fts5Tokenizer;

View File

@ -2583,6 +2583,8 @@ static char *fts5ExprPrintTcl(
if( zRet==0 ) return 0;
}
}else if( pExpr->eType==0 ){
zRet = sqlite3_mprintf("{}");
}else{
char const *zOp = 0;
int i;

View File

@ -7815,7 +7815,7 @@ static void fts5DecodeFunction(
fts5DecodeRowidList(&rc, &s, &a[4], iTermOff-4);
iOff = iTermOff;
while( iOff<szLeaf ){
while( iOff<szLeaf && rc==SQLITE_OK ){
int nAppend;
/* Read the term data for the next term*/
@ -7835,8 +7835,11 @@ static void fts5DecodeFunction(
}else{
iTermOff = szLeaf;
}
fts5DecodeRowidList(&rc, &s, &a[iOff], iTermOff-iOff);
if( iTermOff>szLeaf ){
rc = FTS5_CORRUPT;
}else{
fts5DecodeRowidList(&rc, &s, &a[iOff], iTermOff-iOff);
}
iOff = iTermOff;
if( iOff<szLeaf ){
iOff += fts5GetVarint32(&a[iOff], nKeep);

View File

@ -95,6 +95,9 @@ do_execsql_test 3.3 {
SELECT rowid, bm25(e1) FROM e1 WHERE e1 MATCH '"/" OR "just"' ORDER BY rank;
} {1 -1e-06}
do_execsql_test 3.4 "
SELECT fts5_expr_tcl('e AND \" \"');
" {{AND [nearset -- {e}] [{}]}}
finish_test

View File

@ -122,6 +122,9 @@ foreach {tn expr} {
4.1 "NEAR(one two, 2)"
4.2 "NEAR(one two three, 2)"
4.3 "NEAR(eight nine, 1) OR NEAR(six seven, 1)"
5.1 "one + two"
5.2 "1 + two"
} {
if {[fts5_expr_ok $expr ss]==0} {
do_test 1.$tok.$tn.OMITTED { list } [list]

View File

@ -166,8 +166,8 @@ SQLITE_OPT = \
-DSQLITE_THREADSAFE=1 \
-DSQLITE_TEMP_STORE=2 \
-DSQLITE_USE_URI=1 \
-DSQLITE_C=$(sqlite3.c) \
-DSQLITE_DEBUG
-DSQLITE_C=$(sqlite3.c)
# -DSQLITE_DEBUG
SQLITE_OPT += -g -DDEBUG -UNDEBUG

View File

@ -642,7 +642,7 @@ static Decimal *decimalFromDouble(double r){
/*
** SQL Function: decimal(X)
** OR: decimal_sci(X)
** OR: decimal_exp(X)
**
** Convert input X into decimal and then back into text.
**
@ -650,7 +650,7 @@ static Decimal *decimalFromDouble(double r){
** point value is done. Or if X is an 8-byte blob, it is interpreted
** as a float and similarly expanded.
**
** The decimal_sci(X) function returns the result in scientific notation.
** The decimal_exp(X) function returns the result in exponential notation.
** decimal(X) returns a complete decimal, without the e+NNN at the end.
*/
static void decimalFunc(
@ -853,7 +853,7 @@ int sqlite3_decimal_init(
void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
} aFunc[] = {
{ "decimal", 1, 0, decimalFunc },
{ "decimal_sci", 1, 1, decimalFunc },
{ "decimal_exp", 1, 1, decimalFunc },
{ "decimal_cmp", 2, 0, decimalCmpFunc },
{ "decimal_add", 2, 0, decimalAddFunc },
{ "decimal_sub", 2, 0, decimalSubFunc },

View File

@ -1,21 +1,21 @@
C JNI\sdoc\sadditions.
D 2023-08-19T12:32:00.131
C Merge\strunk\sinto\sjni-threading\sbranch.
D 2023-08-19T12:34:23.970
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F Makefile.in 6f391d54fa01f8a49b024fef5cce1ab8234c281164641cf9a52694b432bdec1b
F Makefile.linux-gcc f3842a0b1efbfbb74ac0ef60e56b301836d05b4d867d014f714fa750048f1ab6
F Makefile.msc dd4c8fcc274e7933756cc581f7d3b4de080e8e8eef7770edde079f4aa9c6c206
F README.md c1c4218efcc4071a6e26db2b517fdbc1035696a29b370edd655faddbef02b224
F Makefile.msc 26c2d196391a285c279adb10fd6001774d9b243af94b700b681e4a49cd476684
F README.md 093d7054271141a0a8518558e3d49087cb71f84d33b50ee10053946ed85dcac8
F VERSION c6366dc72582d3144ce87b013cc35fe48d62f6d07d5be0c9716ea33c862144aa
F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90
F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2
F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903
F autoconf/Makefile.am a8d1d24affe52ebf8d7ddcf91aa973fa0316618ab95bb68c87cabf8faf527dc8
F autoconf/Makefile.am adedc1324b6a87fdd1265ddd336d2fb7d4f36a0e77b86ea553ae7cc4ea239347
F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac
F autoconf/Makefile.msc 00f11ce1f7904416fe841c33e7d789defe8c39e1df6b97e93ed2af3b1bbaf9d7
F autoconf/Makefile.msc 012cdd820963653a7db147a185ebe9085756b6ab15ac964e8cc1dae4c29485cd
F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7
F autoconf/README.txt 42cfd21d0b19dc7d5d85fb5c405c5f3c6a4c923021c39128f6ba685355d8fd56
F autoconf/configure.ac ec7fa914c5e74ff212fe879f9bb6918e1234497e05facfb641f30c4d5893b277
@ -37,6 +37,7 @@ F configure 9dc3300339f4d6b3c3b108de60cc6ae6b3c547e25c7e6df280b4775db4de3a1b x
F configure.ac 4654d32ac0a0d0b48f1e1e79bdc3d777b723cf2f63c33eb1d7c4ed8b435938e8
F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad
F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd
F doc/compile-for-windows.md e9d49959f44114a35dbec66f6aa5c3688ea9cb1b3f969a8537cd80b86d8969f7
F doc/json-enhancements.md e356fc834781f1f1aa22ee300027a270b2c960122468499bf347bb123ce1ea4f
F doc/lemon.html d2862dbef72496e87f7996f37e814b146848190a742c12161d13fd15346051b0
F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710
@ -85,14 +86,14 @@ F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7
F ext/fts3/unicode/mkunicode.tcl d5aebf022fa4577ee8cdf27468f0d847879993959101f6dbd6348ef0cfc324a7
F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb
F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0
F ext/fts5/fts5.h 9bebc9fb8b75b0777e741c758540e07c3c80ce75204198979028fe6cc4c59486
F ext/fts5/fts5.h 05501612cc655504c5dce8ba765ab621d50fc478490089beaa0d75e00b23e520
F ext/fts5/fts5Int.h 78a63cc0795186cde5384816a9403a68c65774b35d952e05b81a1b4b158e07c8
F ext/fts5/fts5_aux.c 572d5ec92ba7301df2fea3258576332f2f4d2dfd66d8263afd157d9deceac480
F ext/fts5/fts5_buffer.c 3001fbabb585d6de52947b44b455235072b741038391f830d6b729225eeaf6a5
F ext/fts5/fts5_config.c 054359543566cbff1ba65a188330660a5457299513ac71c53b3a07d934c7b081
F ext/fts5/fts5_expr.c 2473c13542f463cae4b938c498d6193c90d38ea1a2a4f9849c0479736e50d24d
F ext/fts5/fts5_expr.c bd3b81ce669c4104e34ffe66570af1999a317b142c15fccb112de9fb0caa57a6
F ext/fts5/fts5_hash.c 65e7707bc8774706574346d18c20218facf87de3599b995963c3e6d6809f203d
F ext/fts5/fts5_index.c 93b4cd116b76b6adf224cd3d213f1e06cfe10ae0eb21d6372b1c53b8f0c382a3
F ext/fts5/fts5_index.c 002d674561fcba0813fe4959f3bce166287cd0ff33bed44d8a2ede6cd23110f2
F ext/fts5/fts5_main.c 7070031993ba5b5d89b13206ec4ef624895f2f7c0ec72725913d301e4d382445
F ext/fts5/fts5_storage.c 3c9b41fce41b6410f2e8f82eb035c6a29b2560483f773e6dc98cf3cb2e4ddbb5
F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae
@ -150,7 +151,7 @@ F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3
F ext/fts5/test/fts5dlidx.test b90852c55881b29dbac6380b274de27beae623ac4b6d567c6c8fb9cdc315a86e
F ext/fts5/test/fts5doclist.test faa9e9cc3c0645fa6203667cb5f007c359447c6ee66753f71a58175c2497cacd
F ext/fts5/test/fts5ea.test b01e3a18cdfabbff8104a96a5242a06a68a998a0
F ext/fts5/test/fts5eb.test a973baadac524dbbb4ad9b0e99030e12cabde2c6b28e0ac437298007b642cd12
F ext/fts5/test/fts5eb.test 5f0a86e9fe4715912e6bfa556368aae96d13c61a481373f24daa40429d5d5ca1
F ext/fts5/test/fts5fault1.test d28a65caee75db6897c3cf1358c5230d3bb2a3bf7fb31062c19c7e5382b3d2bd
F ext/fts5/test/fts5fault2.test 69c8fdbef830cd0d450908d4504d5bb86609e255af99c421c20a0756251fe344
F ext/fts5/test/fts5fault3.test da2f9e3e56ff5740d68ebdd6877c97089e7ed28ddff28a0da87a6afea27e5522
@ -207,7 +208,7 @@ F ext/fts5/test/fts5simple.test a298670508c1458b88ce6030440f26a30673931884eb5f40
F ext/fts5/test/fts5simple2.test 258a1b0c590409bfa5271e872c79572b319d2a56554d0585f68f146a0da603f0
F ext/fts5/test/fts5simple3.test d5c74a9d3ca71bd5dd5cacb7c55b86ea12cdddfc8b1910e3de2995206898380f
F ext/fts5/test/fts5synonym.test 1651815b8008de170e8e600dcacc17521d765482ea8f074ae82cfa870d8bb7fb
F ext/fts5/test/fts5synonym2.test b54cce5c34ec08ed616f646635538ae82e34a0e28f947ec60b6fadbc4b3fb17a
F ext/fts5/test/fts5synonym2.test 8f891fc49cc1e8daed727051e77e1f42849c784a6a54bef82564761b2cb3e016
F ext/fts5/test/fts5tok1.test 1f7817499f5971450d8c4a652114b3d833393c8134e32422d0af27884ffe9cef
F ext/fts5/test/fts5tok2.test dcacb32d4a2a3f0dd3215d4a3987f78ae4be21a2
F ext/fts5/test/fts5tokenizer.test ac3c9112b263a639fb0508ae73a3ee886bf4866d2153771a8e8a20c721305a43
@ -231,7 +232,7 @@ F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c
F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f400fc9
F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282
F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8
F ext/jni/GNUmakefile ace719d6d7025a0a454b7c661de2beef9a0e819535ad0ce0742034da8ff8d27f
F ext/jni/GNUmakefile 4849b0ac41c3a92777aebf0ec3d51c2be7c78d3ea9b91ece03ade6f9fa13d99a
F ext/jni/README.md 975b35173debbbf3a4ab7166e14d2ffa2bacff9b6850414f09cc919805e81ba4
F ext/jni/jar-dist.make 9a03d10dbb5a74c724bfec4b76fd9e4c9865cbbc858d731cb48f38ac897d73a3
F ext/jni/src/c/sqlite3-jni.c 8608cb36223d6bc64e8ddd9296b6d63a4fc54efaf8dbc3ea7e5eca81f4801d42
@ -333,7 +334,7 @@ F ext/misc/completion.c 6dafd7f4348eecc7be9e920d4b419d1fb2af75d938cd9c59a20cfe8b
F ext/misc/compress.c 3354c77a7c8e86e07d849916000cdac451ed96500bfb5bd83b20eb61eee012c9
F ext/misc/csv.c ca8d6dafc5469639de81937cb66ae2e6b358542aba94c4f791910d355a8e7f73
F ext/misc/dbdump.c b8592f6f2da292c62991a13864a60d6c573c47a9cc58362131b9e6a64f823e01
F ext/misc/decimal.c a61343b36672760e1d6d5b20a42cb52264db55bcd11d0a44e2e06e8ce23227e3
F ext/misc/decimal.c 172cf81a8634e6a0f0bedaf71a8372fee63348cf5a3c4e1b78bb233c35889fdc
F ext/misc/eval.c 04bc9aada78c888394204b4ed996ab834b99726fb59603b0ee3ed6e049755dc1
F ext/misc/explain.c 0086fab288d4352ea638cf40ac382aad3b0dc5e845a1ea829a694c015fd970fe
F ext/misc/fileio.c 4e7f7cd30de8df4820c552f14af3c9ca451c5ffe1f2e7bef34d598a12ebfb720
@ -636,7 +637,7 @@ F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500
F src/expr.c 1affe0cc049683ef0ef3545d9b6901508556b0ef7e2892a344c3df6d7288d79d
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36
F src/func.c cc1da67fd643a43cfe691784158ec656d8ec6d13bb17e67018b01b38b3e4f5ab
F src/func.c dd1ecd1be6aaa67c9fa723f841e05e1536314c6aaa0509e25289b310f64dbb9c
F src/global.c 29f56a330ed9d1b5cd9b79ac0ca36f97ac3afc730ff8bfa987b0db9e559d684d
F src/hash.c 9ee4269fb1d6632a6fecfb9479c93a1f29271bddbbaf215dd60420bcb80c7220
F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51
@ -645,7 +646,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276
F src/json.c ae840f87b418f039f5d336b488933d09396bd31e6b31e855b93055ccaee4e255
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
F src/loadext.c 176d6b2cb18a6ad73b133db17f6fc351c4d9a2d510deebdb76c22bde9cfd1465
F src/loadext.c 98cfba10989b3da6f1807ad42444017742db7f100a54f1032af7a8b1295912c0
F src/main.c fde8f13c876a658b4e8b74b77d875ca887915c174ea6a2f3122d80966f93d865
F src/malloc.c 47b82c5daad557d9b963e3873e99c22570fb470719082c6658bf64e3012f7d23
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
@ -668,7 +669,7 @@ F src/os_common.h 6c0eb8dd40ef3e12fe585a13e709710267a258e2c8dd1c40b1948a1d14582e
F src/os_kv.c 4d39e1f1c180b11162c6dc4aa8ad34053873a639bac6baae23272fc03349986a
F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d872107
F src/os_unix.c 2e8b12107f75d1bd16412f312b4c5d5103191807a37836d3b81beb26436ad81b
F src/os_win.c 7038223a1cda0a47e2ab4db47f63bf1833fe53ba0542f0f283a062ea13894103
F src/os_win.c 4a50a154aeebc66a1f8fb79c1ff6dd5fe3d005556533361e0d460d41cb6a45a8
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
F src/pager.c 993445a19b611d473ca007542ab3149840661a4c7e9f2d9e1ec008b7cc2abe78
F src/pager.h 6e326bd05970a24dd28d41d3980b6964fbaa37b4da54a2c0d4e0c5bdb06ff187
@ -684,17 +685,17 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
F src/resolve.c 37953a5f36c60bea413c3c04efcd433b6177009f508ef2ace0494728912fe2e9
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
F src/select.c 5f545a2c8702d4d3430bbb188cfec47d6c122d899061ef00cbe56af14591c574
F src/shell.c.in 694aaf751f00610381533d4a31c83d142cfc83ef91ef65e2aa6912ace7c39b40
F src/shell.c.in 2f9be25294b68b07e7e81f0adcec4475aba6011b64f160e414efe226910c4d7b
F src/sqlite.h.in 73a366c1c45d5ac9888cfe81c458826a44498531d106cfb4f328193ab5f6f17d
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h da473ce2b3d0ae407a6300c4a164589b9a6bfdbec9462688a8593ff16f3bb6e4
F src/sqlite3ext.h 2f30b2671f4c03cd27a43f039e11251391066c97d11385f5f963bb40b03038ac
F src/sqliteInt.h 025ed58a41968ef80d64cdc194caa8dd207b0256b147253d762fdac7a62408f9
F src/sqliteLimit.h 33b1c9baba578d34efe7dfdb43193b366111cdf41476b1e82699e14c11ee1fb6
F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
F src/tclsqlite.c ecbc3c99c0d0c3ed122a913f143026c26d38d57f33e06bb71185dd5c1efe37cd
F src/test1.c ebba2473874a23add4a10881b90bd445cfa7f59f90749434938aec14239c6486
F src/test2.c 827446e259a3b7ab949da1542953edda7b5117982576d3e6f1c24a0dd20a5cef
F src/test2.c 54520d0565ef2b9bf0f8f1dcac43dc4d06baf4ffe13d10905f8d8c3ad3e4b9ab
F src/test3.c e5178558c41ff53236ae0271e9acb3d6885a94981d2eb939536ee6474598840e
F src/test4.c 4533b76419e7feb41b40582554663ed3cd77aaa54e135cf76b3205098cd6e664
F src/test5.c 328aae2c010c57a9829d255dc099d6899311672d
@ -748,15 +749,15 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
F src/tokenize.c 23d9f4539880b40226254ad9072f4ecf12eb1902e62aea47aac29928afafcfd5
F src/treeview.c 1d52fbc4e97161e65858d36e3424ea6e3fc045dd8a679c82b4b9593dc30de3bd
F src/trigger.c ad6ab9452715fa9a8075442e15196022275b414b9141b566af8cdb7a1605f2b0
F src/update.c 0bb9171afaa4d0b100ad946873bccda7aef90ffe083ef5c63668fce08c4df9da
F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145
F src/update.c 6904814dd62a7a93bbb86d9f1419c7f134a9119582645854ab02b36b676d9f92
F src/upsert.c fa125a8d3410ce9a97b02cb50f7ae68a2476c405c76aa692d3acf6b8586e9242
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
F src/util.c a40062117e705eb3339201842717a022092816b92479eead6397cde28af32ff9
F src/util.c 278b81c3b33db1b5a5f3859adf8905c165b910080043061d44d3c5a25b4b406d
F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
F src/vdbe.c 346d848a0bf8128e3e3722c5406f4bde6c32d7093b93402c6f8e0718d19305c3
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
F src/vdbeapi.c f37822f215740ede2a8fcae99bc13f2cc3a72dd0e1d22b81b9298c5ca67dbc38
F src/vdbeapi.c 37341acd781fda162e8cf4d9fc2eaea2febad3b365877a9d7233b8c6d0960d85
F src/vdbeaux.c e3aa5c46827cd95e0fc4d0f302fa3e901ab5f07258fdbb42709eeef40f63018d
F src/vdbeblob.c 2516697b3ee8154eb8915f29466fb5d4f1ae39ee8b755ea909cefaf57ec5e2ce
F src/vdbemem.c 317b9f48708139db6239ade40c7980b4bc8233168383690d588dad6d8437f722
@ -765,7 +766,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8
F src/vdbevtab.c 57fa8f56478e5b5cb558cb425e7878515e0a105c54f96f1d1bbf4b9433529254
F src/vtab.c 1ecf8c3745d29275688d583e12822fa984d421e0286b5ef50c137bc3bf6d7a64
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
F src/wal.c 02e10f033a6972bc7d50122b400318003199c504cda48f61ad404564505f4e89
F src/wal.c 01e051a1e713d9eabdb25df38602837cec8f4c2cae448ce2cf6accc87af903e9
F src/wal.h 04a9e53121d5076f2a173b0f2facb39d33047093fee71bd3bbe6b1f6f1f5fd4b
F src/walker.c 7c7ea0115345851c3da4e04e2e239a29983b61fb5b038b94eede6aba462640e2
F src/where.c b8917792f1e0dbfa28fb29e6cd3d560060d69667be0ba4c491cbc772363264f5
@ -985,7 +986,7 @@ F test/dbpage.test fce29035c7566fd7835ec0f19422cb4b9c6944ce0e1b936ff8452443f92e8
F test/dbpagefault.test d9111a62f3601d3efc6841ace3940181937342d245f92a1cca6cba8206d4f58a
F test/dbstatus.test 4a4221a883025ffd39696b3d1b3910b928fb097d77e671351acb35f3aed42759
F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef
F test/decimal.test 18e7b4cb12e8d5c60d768b686ba52af3e1ca3ced4f870231f0476666fd9fab7e
F test/decimal.test ef731887b43ee32ef86e1c8fddb61a40789f988332c029c601dcf2c319277e9e
F test/default.test 9687cfb16717e4b8238c191697c98be88c0b16e568dd5368cd9284154097ef50
F test/delete.test 2686e1c98d552ef37d79ad55b17b93fe96fad9737786917ce3839767f734c48f
F test/delete2.test 3a03f2cca1f9a67ec469915cb8babd6485db43fa
@ -1170,7 +1171,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c
F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634
F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830
F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2
F test/fuzzcheck.c 29a2f0237553375498f891c9487a2ef3267b47deecc5d5b4335fa37f904cb8d3
F test/fuzzcheck.c ac8ff17018b30d6898c94d156a72223b3988921d3e999ed0579acb8e4ff83fac
F test/fuzzdata1.db 3e86d9cf5aea68ddb8e27c02d7dfdaa226347426c7eb814918e4d95475bf8517
F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f
F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba
@ -1272,7 +1273,7 @@ F test/json/README.md 63e3e589e1df8fd3cc1588ba1faaff659214003f8b77a15af5c6452b35
F test/json/json-generator.tcl dc0dd0f393800c98658fc4c47eaa6af29d4e17527380cd28656fb261bddc8a3f
F test/json/json-q1.txt 65f9d1cdcc4cffa9823fb73ed936aae5658700cd001fde448f68bfb91c807307
F test/json/json-speed-check.sh 8b7babf530faa58bd59d6d362cec8e9036a68c5457ff46f3b1f1511d21af6737 x
F test/json101.test 243b0a2650218ac5eafde6ce2a92a0e9d02bf24f62aec68693b69d9a693f120a
F test/json101.test dc9d5a2a5b1fd1b54dbd71c538b17933cc98d84b4c1f821ead754933663dca55
F test/json102.test 24f6f204f9cde45b971016691d0b92a9b4c58040d699e36d6b12cb165f9083ff
F test/json103.test 53df87f83a4e5fa0c0a56eb29ff6c94055c6eb919f33316d62161a8880112dbe
F test/json104.test 1b844a70cddcfa2e4cd81a5db0657b2e61e7f00868310f24f56a9ba0114348c1
@ -1284,7 +1285,7 @@ F test/kvtest.c 6e0228409ea7ca0497dad503fbd109badb5e59545d131014b6aaac68b56f484a
F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63
F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200
F test/lemon-test01.y 58b764610fd934e189ffbb0bbfa33d171b9cb06019b55bdc04d090d6767e11d7
F test/like.test 5fe0bc37f307aef0a453ce2de4632bdfc0759448f0421c39f6d53caefe905fac
F test/like.test 242ee7f5d08a031144c0daf63bbd7e7710c847ccf387a83347e0b61b3aa69526
F test/like2.test d3be15fefee3e02fc88942a9b98f26c5339bbdef7783c90023c092c4955fe3d3
F test/like3.test a76e5938fadbe6d32807284c796bafd869974a961057bc5fc5a28e06de98745c
F test/limit.test 350f5d03c29e7dff9a2cde016f84f8d368d40bcd02fa2b2a52fa10c4bf3cbfaf
@ -1410,7 +1411,7 @@ F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b
F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442
F test/pendingrace.test cbdf0f74bc939fb43cebad64dda7a0b5a3941a10b7e9cc2b596ff3e423a18156
F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff
F test/permutations.test 4268ad170a788ec1c0e3179786ffdaac6d8a022d4f849587a3378945a48fdde1
F test/permutations.test f7caf8dd5c7b1da74842a48df116f7f193399c656d4ffc805cd0d9658568c675
F test/pg_common.tcl 3b27542224db1e713ae387459b5d117c836a5f6e328846922993b6d2b7640d9f
F test/pragma.test 57a36226218c03cfb381019fe43234b2cefbd8a1f12825514f906a17ccf7991e
F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f
@ -1543,7 +1544,7 @@ F test/snapshot_up.test a0a29c4cf33475fcef07c3f8e64af795e24ab91b4cc68295863402a3
F test/soak.test 18944cf21b94a7fe0df02016a6ee1e9632bc4e8d095a0cb49d95e15d5cca2d5c
F test/softheap1.test 843cd84db9891b2d01b9ab64cef3e9020f98d087
F test/sort.test f86751134159abb5e5fd4381a0d7038c91013638cd1e3fa1d7850901f6df6196
F test/sort2.test cc23b7c19d684657559e8a55b02f7fcee03851d0
F test/sort2.test 2f8c66402a03adebe77ce7aafca129fbf32df27d6c9b8f7a9f1b958e39f56da8
F test/sort3.test 1480ed7c4c157682542224e05e3b75faf4a149e5
F test/sort4.test cca6f4b0b5255882645bbbe346a6a9f4a5c7b6a18513a6a7bf4ac1c4761ddc19
F test/sort5.test 6b43ae0e2169b5ceed441844492e55ba7f1ae0790528395ddf7888ab3094525d
@ -1602,8 +1603,8 @@ F test/temptable2.test 76821347810ecc88203e6ef0dd6897b6036ac788e9dd3e6b04fd4d163
F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637
F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc
F test/tester.tcl 68454ef88508c196d19e8694daa27bff7107a91857799eaa12f417188ae53ede
F test/testrunner.tcl 0cf11ad8611e483f47e73d4893df855790c98fa610bc932316d194ea9fc4bb8a
F test/testrunner_data.tcl 8169c68654ac8906833b8a6aadca973358a441ebf88270dd05c153e5f96f76b8
F test/testrunner.tcl 56a744d4e6e516b2091c2ca6b7b27b9600e9ded136a2c860c350515511ebe20a
F test/testrunner_data.tcl 8afa4eeec7f7421db3d3af64cdd5544015e887c4289cf871a730cca5a7a8d934
F test/thread001.test a0985c117eab62c0c65526e9fa5d1360dd1cac5b03bde223902763274ce21899
F test/thread002.test c24c83408e35ba5a952a3638b7ac03ccdf1ce4409289c54a050ac4c5f1de7502
F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7
@ -1818,7 +1819,7 @@ F test/upfrom2.test 66f3ebf721b3cebd922faee5c386bf244f816d416b57c000753ff51af623
F test/upfrom3.test 6130f24ebf97f5ea865e5d2a14a2d543fe5428a62e87cc60f62d875e45c1f5f0
F test/upfrom4.test 78f742a6577c91a7a55c64edb8811004e7c6aa99b8d57b2320f70a918c357807
F test/upfromfault.test 3a10075a0043f0c4fad6614b2c371f88a8ba5a4acab68b907438413865d6a8d6
F test/upsert1.test b0ae2f58680c5205b4bc1cdeed3c3d444057c506f6c44494fa3eac60731d68a2
F test/upsert1.test a512e2f884d3a36159fce2e45108c236f78ae38e35bda55f4050db580ceb25d3
F test/upsert2.test 720e94d09f7362a282bc69b3c6b83d51daeaaf0440eb4920a08b86518b8c7496
F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c
F test/upsert4.test 25d2a1da92f149331ae0c51ca6e3eee78189577585eab92de149900d62994fa5
@ -2057,7 +2058,7 @@ F tool/sqldiff.c 2a693b4e7c1818c23f871f82f0c3fe67d80b67e3f087893089d33da29c1e387
F tool/sqlite3_analyzer.c.in f88615bf33098945e0a42f17733f472083d150b58bdaaa5555a7129d0a51621c
F tool/sqltclsh.c.in 1bcc2e9da58fadf17b0bf6a50e68c1159e602ce057210b655d50bad5aaaef898
F tool/sqltclsh.tcl 862f4cf1418df5e1315b5db3b5ebe88969e2a784525af5fbf9596592f14ed848
F tool/src-verify.c f0cef434a8d8629c4928a02a644fb85e33c8b875a7f2352ba68cc50965a7d213
F tool/src-verify.c 41c586dee84d0b190ad13e0282ed83d4a65ec9fefde9adf4943efdf6558eea7f
F tool/srcck1.c 371de5363b70154012955544f86fdee8f6e5326f
F tool/stack_usage.tcl f8e71b92cdb099a147dad572375595eae55eca43
F tool/stripccomments.c 20b8aabc4694d0d4af5566e42da1f1a03aff057689370326e9269a9ddcffdc37
@ -2091,8 +2092,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P e202b6e69da8cced114d027cf2e91a04dfdd50b601b3274214783f7d750c558c
R 109361c70c87f2804d75b9c237ee841f
P 0c7ac34f30e1f7e35a2ac4e5e55e5f24857b24afa81a7abecba60f1c9c68b9ff c319033276c3565d0f1f2cae1c91791940d322fe79696bc26d74fddeb2664373
R 35896553571ede397fc34e5af8e0e6bc
U stephan
Z 56d27110aeccda606f4b75566f7a0870
Z 1f979ceda0d0b798d0ca7e29bc8a0301
# Remove this line to create a well-formed Fossil manifest.

View File

@ -1 +1 @@
0c7ac34f30e1f7e35a2ac4e5e55e5f24857b24afa81a7abecba60f1c9c68b9ff
8254479c6ff1ea3cc9e56de1698db8405c03da90b9bf4c401182e47e0842baf8

View File

@ -2154,8 +2154,10 @@ void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3 *db){
** sensitive.
*/
void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
FuncDef *pDef;
struct compareInfo *pInfo;
int flags;
int nArg;
if( caseSensitive ){
pInfo = (struct compareInfo*)&likeInfoAlt;
flags = SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE;
@ -2163,10 +2165,13 @@ void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
pInfo = (struct compareInfo*)&likeInfoNorm;
flags = SQLITE_FUNC_LIKE;
}
sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0, 0, 0);
sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0, 0, 0);
sqlite3FindFunction(db, "like", 2, SQLITE_UTF8, 0)->funcFlags |= flags;
sqlite3FindFunction(db, "like", 3, SQLITE_UTF8, 0)->funcFlags |= flags;
for(nArg=2; nArg<=3; nArg++){
sqlite3CreateFunc(db, "like", nArg, SQLITE_UTF8, pInfo, likeFunc,
0, 0, 0, 0, 0);
pDef = sqlite3FindFunction(db, "like", nArg, SQLITE_UTF8, 0);
pDef->funcFlags |= flags;
pDef->funcFlags &= ~SQLITE_FUNC_UNSAFE;
}
}
/*

View File

@ -512,7 +512,9 @@ static const sqlite3_api_routines sqlite3Apis = {
/* Version 3.40.0 and later */
sqlite3_value_encoding,
/* Version 3.41.0 and later */
sqlite3_is_interrupted
sqlite3_is_interrupted,
/* Version 3.43.0 and later */
sqlite3_stmt_explain
};
/* True if x is the directory separator character

View File

@ -4747,6 +4747,7 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"0123456789";
size_t i, j;
DWORD pid;
int nPre = sqlite3Strlen30(SQLITE_TEMP_FILE_PREFIX);
int nMax, nBuf, nDir, nLen;
char *zBuf;
@ -4959,7 +4960,10 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){
j = sqlite3Strlen30(zBuf);
sqlite3_randomness(15, &zBuf[j]);
pid = osGetCurrentProcessId();
for(i=0; i<15; i++, j++){
zBuf[j] += pid & 0xff;
pid >>= 8;
zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
}
zBuf[j] = 0;

View File

@ -4799,7 +4799,6 @@ static const char *(azHelp[]) = {
" --async Write to FILE without journal and fsync()",
#endif
".bail on|off Stop after hitting an error. Default OFF",
".binary on|off Turn binary output on or off. Default OFF",
#ifndef SQLITE_SHELL_FIDDLE
".cd DIRECTORY Change the working directory to DIRECTORY",
#endif
@ -4809,6 +4808,9 @@ static const char *(azHelp[]) = {
".clone NEWDB Clone data into NEWDB from the existing database",
#endif
".connection [close] [#] Open or close an auxiliary database connection",
#if defined(_WIN32) || defined(WIN32)
".crnl on|off Translate \\n to \\r\\n. Default ON",
#endif
".databases List names and files of attached databases",
".dbconfig ?op? ?val? List or change sqlite3_db_config() options",
#if SQLITE_SHELL_HAVE_RECOVER
@ -8164,6 +8166,7 @@ static int do_meta_command(char *zLine, ShellState *p){
}
}else
/* Undocumented. Legacy only. See "crnl" below */
if( c=='b' && n>=3 && cli_strncmp(azArg[0], "binary", n)==0 ){
if( nArg==2 ){
if( booleanValue(azArg[1]) ){
@ -8172,6 +8175,8 @@ static int do_meta_command(char *zLine, ShellState *p){
setTextMode(p->out, 1);
}
}else{
raw_printf(stderr, "The \".binary\" command is deprecated."
" Use \".crnl\" instead.\n");
raw_printf(stderr, "Usage: .binary on|off\n");
rc = 1;
}
@ -8299,6 +8304,22 @@ static int do_meta_command(char *zLine, ShellState *p){
}
}else
if( c=='c' && n==4 && cli_strncmp(azArg[0], "crnl", n)==0 ){
if( nArg==2 ){
if( booleanValue(azArg[1]) ){
setTextMode(p->out, 1);
}else{
setBinaryMode(p->out, 1);
}
}else{
#if !defined(_WIN32) && !defined(WIN32)
raw_printf(stderr, "The \".crnl\" is a no-op on non-Windows machines.\n");
#endif
raw_printf(stderr, "Usage: .crnl on|off\n");
rc = 1;
}
}else
if( c=='d' && n>1 && cli_strncmp(azArg[0], "databases", n)==0 ){
char **azName = 0;
int nName = 0;
@ -11283,6 +11304,7 @@ static int do_meta_command(char *zLine, ShellState *p){
#endif /* SQLITE_USER_AUTHENTICATION */
if( c=='v' && cli_strncmp(azArg[0], "version", n)==0 ){
char *zPtrSz = sizeof(void*)==8 ? "64-bit" : "32-bit";
utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
sqlite3_libversion(), sqlite3_sourceid());
#if SQLITE_HAVE_ZLIB
@ -11293,11 +11315,11 @@ static int do_meta_command(char *zLine, ShellState *p){
#if defined(__clang__) && defined(__clang_major__)
utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
CTIMEOPT_VAL(__clang_minor__) "."
CTIMEOPT_VAL(__clang_patchlevel__) "\n");
CTIMEOPT_VAL(__clang_patchlevel__) " (%s)\n", zPtrSz);
#elif defined(_MSC_VER)
utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) " (%s)\n", zPtrSz);
#elif defined(__GNUC__) && defined(__VERSION__)
utf8_printf(p->out, "gcc-" __VERSION__ "\n");
utf8_printf(p->out, "gcc-" __VERSION__ " (%s)\n", zPtrSz);
#endif
}else
@ -12471,7 +12493,8 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
}else if( cli_strcmp(z,"-bail")==0 ){
/* No-op. The bail_on_error flag should already be set. */
}else if( cli_strcmp(z,"-version")==0 ){
printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
printf("%s %s (%d-bit)\n", sqlite3_libversion(), sqlite3_sourceid(),
8*(int)sizeof(char*));
return 0;
}else if( cli_strcmp(z,"-interactive")==0 ){
stdin_is_interactive = 1;

View File

@ -361,6 +361,8 @@ struct sqlite3_api_routines {
int (*value_encoding)(sqlite3_value*);
/* Version 3.41.0 and later */
int (*is_interrupted)(sqlite3*);
/* Version 3.43.0 and later */
int (*stmt_explain)(sqlite3_stmt*,int);
};
/*
@ -689,6 +691,8 @@ typedef int (*sqlite3_loadext_entry)(
#define sqlite3_value_encoding sqlite3_api->value_encoding
/* Version 3.41.0 and later */
#define sqlite3_is_interrupted sqlite3_api->is_interrupted
/* Version 3.43.0 and later */
#define sqlite3_stmt_explain sqlite3_api->stmt_explain
#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)

View File

@ -608,7 +608,7 @@ static int faultSimCallback(int x){
zInt[i] = (x%10) + '0';
}
if( isNeg ) zInt[i--] = '-';
memcpy(faultSimScript+faultSimScriptSize, zInt+i+1, sizeof(zInt)-i);
memcpy(faultSimScript+faultSimScriptSize, zInt+i+1, sizeof(zInt)-i-1);
}
rc = Tcl_Eval(faultSimInterp, faultSimScript);
if( rc ){

View File

@ -1259,9 +1259,9 @@ static void updateVirtualTable(
sqlite3ExprDup(db, pChanges->a[aXRef[i]].pExpr, 0)
);
}else{
Expr *pRow = exprRowColumn(pParse, i);
if( pRow ) pRow->op2 = OPFLAG_NOCHNG;
pList = sqlite3ExprListAppend(pParse, pList, pRow);
Expr *pRowExpr = exprRowColumn(pParse, i);
if( pRowExpr ) pRowExpr->op2 = OPFLAG_NOCHNG;
pList = sqlite3ExprListAppend(pParse, pList, pRowExpr);
}
}

View File

@ -178,7 +178,7 @@ int sqlite3UpsertAnalyzeTarget(
pExpr = &sCol[0];
}
for(jj=0; jj<nn; jj++){
if( sqlite3ExprCompare(pParse,pTarget->a[jj].pExpr,pExpr,iCursor)<2 ){
if( sqlite3ExprCompare(0,pTarget->a[jj].pExpr,pExpr,iCursor)<2 ){
break; /* Column ii of the index matches column jj of target */
}
}

View File

@ -610,7 +610,11 @@ do_atof_calc:
}
assert( r>=0.0 );
if( r>+1.7976931348623157081452742373e+308L ){
#ifdef INFINITY
*pResult = +INFINITY;
#else
*pResult = 1.0e308*10.0;
#endif
}else{
*pResult = (double)r;
}
@ -1016,7 +1020,7 @@ void sqlite3FpDecode(FpDecode *p, double r, int iRound, int mxRound){
** The error terms on constants like 1.0e+100 computed using the
** decimal extension, for example as follows:
**
** SELECT decimal_sci(decimal_sub('1.0e+100',decimal(1.0e+100)));
** SELECT decimal_exp(decimal_sub('1.0e+100',decimal(1.0e+100)));
*/
double rr[2];
rr[0] = r;

View File

@ -1864,7 +1864,7 @@ int sqlite3_stmt_explain(sqlite3_stmt *pStmt, int eMode){
Vdbe *v = (Vdbe*)pStmt;
int rc;
sqlite3_mutex_enter(v->db->mutex);
if( v->explain==eMode ){
if( ((int)v->explain)==eMode ){
rc = SQLITE_OK;
}else if( eMode<0 || eMode>2 ){
rc = SQLITE_ERROR;

View File

@ -531,6 +531,8 @@ struct Wal {
#ifdef SQLITE_USE_SEH
u32 lockMask; /* Mask of locks held */
void *pFree; /* Pointer to sqlite3_free() if exception thrown */
u32 *pWiValue; /* Value to write into apWiData[iWiPg] */
int iWiPg; /* Write pWiValue into apWiData[iWiPg] */
int iSysErrno; /* System error code following exception */
#endif
#ifdef SQLITE_DEBUG
@ -702,11 +704,24 @@ static void sehInjectFault(Wal *pWal){
#define SEH_FREE_ON_ERROR(X,Y) \
assert( (X==0 || Y==0) && pWal->pFree==X ); pWal->pFree = Y
/*
** There are two ways to use this macro. To arrange for pWal->apWiData[iPg]
** to be set to pValue if an exception is thrown:
**
** SEH_SET_ON_ERROR(iPg, pValue);
**
** and to cancel the same:
**
** SEH_SET_ON_ERROR(0, 0);
*/
#define SEH_SET_ON_ERROR(X,Y) pWal->iWiPg = X; pWal->pWiValue = Y
#else
# define SEH_TRY VVA_ONLY(pWal->nSehTry++);
# define SEH_EXCEPT(X) VVA_ONLY(pWal->nSehTry--); assert( pWal->nSehTry==0 );
# define SEH_INJECT_FAULT assert( pWal->nSehTry>0 );
# define SEH_FREE_ON_ERROR(X,Y)
# define SEH_SET_ON_ERROR(X,Y)
#endif /* ifdef SQLITE_USE_SEH */
@ -1467,6 +1482,7 @@ static int walIndexRecover(Wal *pWal){
rc = walIndexPage(pWal, iPg, (volatile u32**)&aShare);
assert( aShare!=0 || rc!=SQLITE_OK );
if( aShare==0 ) break;
SEH_SET_ON_ERROR(iPg, aShare);
pWal->apWiData[iPg] = aPrivate;
for(iFrame=iFirst; iFrame<=iLast; iFrame++){
@ -1494,6 +1510,7 @@ static int walIndexRecover(Wal *pWal){
}
}
pWal->apWiData[iPg] = aShare;
SEH_SET_ON_ERROR(0,0);
nHdr = (iPg==0 ? WALINDEX_HDR_SIZE : 0);
nHdr32 = nHdr / sizeof(u32);
#ifndef SQLITE_SAFER_WALINDEX_RECOVERY
@ -2387,7 +2404,9 @@ static void walLimitSize(Wal *pWal, i64 nMax){
**
** 2) Frees the pointer at Wal.pFree, if any, using sqlite3_free().
**
** 3) Returns SQLITE_IOERR.
** 3) Set pWal->apWiData[pWal->iWiPg] to pWal->pWiValue if not NULL
**
** 4) Returns SQLITE_IOERR.
*/
static int walHandleException(Wal *pWal){
if( pWal->exclusiveMode==0 ){
@ -2406,6 +2425,10 @@ static int walHandleException(Wal *pWal){
}
sqlite3_free(pWal->pFree);
pWal->pFree = 0;
if( pWal->pWiValue ){
pWal->apWiData[pWal->iWiPg] = pWal->pWiValue;
pWal->pWiValue = 0;
}
return SQLITE_IOERR_IN_PAGE;
}
@ -3163,7 +3186,8 @@ static int walSnapshotRecover(
rc = walHashGet(pWal, walFramePage(i), &sLoc);
if( rc!=SQLITE_OK ) break;
pgno = sLoc.aPgno[i-sLoc.iZero];
assert( i - sLoc.iZero - 1 >=0 );
pgno = sLoc.aPgno[i-sLoc.iZero-1];
iDbOff = (i64)(pgno-1) * szPage;
if( iDbOff+szPage<=szDb ){

View File

@ -49,7 +49,7 @@ do_execsql_test 1080 {
SELECT decimal('+123e+4');
} {1230000}
do_execsql_test 1081 {
SELECT decimal_sci('+123e+4');
SELECT decimal_exp('+123e+4');
} {+1.23e+06}

View File

@ -2031,7 +2031,9 @@ int main(int argc, char **argv){
if( strcmp(z,"version")==0 ){
int ii;
const char *zz;
printf("SQLite %s %s\n", sqlite3_libversion(), sqlite3_sourceid());
printf("SQLite %s %s (%d-bit)\n",
sqlite3_libversion(), sqlite3_sourceid(),
8*(int)sizeof(char*));
for(ii=0; (zz = sqlite3_compileoption_get(ii))!=0; ii++){
printf("%s\n", zz);
}
@ -2536,9 +2538,10 @@ int main(int argc, char **argv){
printf("fuzzcheck: %u query invariants checked\n", g.nInvariant);
}
printf("fuzzcheck: 0 errors out of %d tests in %d.%03d seconds\n"
"SQLite %s %s\n",
"SQLite %s %s (%d-bit)\n",
nTest, (int)(iElapse/1000), (int)(iElapse%1000),
sqlite3_libversion(), sqlite3_sourceid());
sqlite3_libversion(), sqlite3_sourceid(),
8*(int)sizeof(char*));
}
free(azSrcDb);
free(pHeap);

View File

@ -122,14 +122,14 @@ do_execsql_test json101-4.8 {
# json_extract(JSON,'$') will return objects and arrays without change.
#
do_execsql_test json-4.10 {
do_execsql_test json101-4.10 {
SELECT count(*) FROM j1 WHERE json_type(x) IN ('object','array');
SELECT x FROM j1
WHERE json_extract(x,'$')<>x
AND json_type(x) IN ('object','array');
} {4}
do_execsql_test json-5.1 {
do_execsql_test json101-5.1 {
CREATE TABLE j2(id INTEGER PRIMARY KEY, json, src);
INSERT INTO j2(id,json,src)
VALUES(1,'{
@ -257,7 +257,7 @@ do_execsql_test json-5.1 {
SELECT count(*) FROM j2;
} {3}
do_execsql_test json-5.2 {
do_execsql_test json101-5.2 {
SELECT id, json_valid(json), json_type(json), '|' FROM j2 ORDER BY id;
} {1 1 object | 2 1 object | 3 1 array |}
@ -268,13 +268,13 @@ ifcapable !vtab {
# fullkey is always the same as path+key (with appropriate formatting)
#
do_execsql_test json-5.3 {
do_execsql_test json101-5.3 {
SELECT j2.rowid, jx.rowid, fullkey, path, key
FROM j2, json_tree(j2.json) AS jx
WHERE fullkey!=(path || CASE WHEN typeof(key)=='integer' THEN '['||key||']'
ELSE '.'||key END);
} {}
do_execsql_test json-5.4 {
do_execsql_test json101-5.4 {
SELECT j2.rowid, jx.rowid, fullkey, path, key
FROM j2, json_each(j2.json) AS jx
WHERE fullkey!=(path || CASE WHEN typeof(key)=='integer' THEN '['||key||']'
@ -285,58 +285,58 @@ do_execsql_test json-5.4 {
# Verify that the json_each.json and json_tree.json output is always the
# same as input.
#
do_execsql_test json-5.5 {
do_execsql_test json101-5.5 {
SELECT j2.rowid, jx.rowid, fullkey, path, key
FROM j2, json_each(j2.json) AS jx
WHERE jx.json<>j2.json;
} {}
do_execsql_test json-5.6 {
do_execsql_test json101-5.6 {
SELECT j2.rowid, jx.rowid, fullkey, path, key
FROM j2, json_tree(j2.json) AS jx
WHERE jx.json<>j2.json;
} {}
do_execsql_test json-5.7 {
do_execsql_test json101-5.7 {
SELECT j2.rowid, jx.rowid, fullkey, path, key
FROM j2, json_each(j2.json) AS jx
WHERE jx.value<>jx.atom AND type NOT IN ('array','object');
} {}
do_execsql_test json-5.8 {
do_execsql_test json101-5.8 {
SELECT j2.rowid, jx.rowid, fullkey, path, key
FROM j2, json_tree(j2.json) AS jx
WHERE jx.value<>jx.atom AND type NOT IN ('array','object');
} {}
do_execsql_test json-6.1 {
do_execsql_test json101-6.1 {
SELECT json_valid('{"a":55,"b":72,}');
} {0}
do_execsql_test json-6.2 {
do_execsql_test json101-6.2 {
SELECT json_error_position('{"a":55,"b":72,}');
} {0}
do_execsql_test json-6.3 {
do_execsql_test json101-6.3 {
SELECT json_valid(json('{"a":55,"b":72,}'));
} {1}
do_execsql_test json-6.4 {
do_execsql_test json101-6.4 {
SELECT json_valid('{"a":55,"b":72 , }');
} {0}
do_execsql_test json-6.5 {
do_execsql_test json101-6.5 {
SELECT json_error_position('{"a":55,"b":72 , }');
} {0}
do_execsql_test json-6.6 {
do_execsql_test json101-6.6 {
SELECT json_error_position('{"a":55,"b":72,,}');
} {16}
do_execsql_test json-6.7 {
do_execsql_test json101-6.7 {
SELECT json_valid('{"a":55,"b":72}');
} {1}
do_execsql_test json-6.8 {
do_execsql_test json101-6.8 {
SELECT json_error_position('["a",55,"b",72,]');
} {0}
do_execsql_test json-6.9 {
do_execsql_test json101-6.9 {
SELECT json_error_position('["a",55,"b",72 , ]');
} {0}
do_execsql_test json-6.10 {
do_execsql_test json101-6.10 {
SELECT json_error_position('["a",55,"b",72,,]');
} {16}
do_execsql_test json-6.11 {
do_execsql_test json101-6.11 {
SELECT json_valid('["a",55,"b",72]');
} {1}
@ -352,7 +352,7 @@ foreach {tn isvalid ws} {
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 \
do_execsql_test json101-$tn.1 \
"SELECT json_valid(printf('%s{%s\"x\"%s:%s9%s}%s',
$::ws,$::ws,$::ws,$::ws,$::ws,$::ws));" \
$isvalid
@ -361,23 +361,23 @@ foreach {tn isvalid ws} {
# Ticket https://www.sqlite.org/src/info/ad2559db380abf8e
# Control characters must be escaped in JSON strings.
#
do_execsql_test json-8.1 {
do_execsql_test json101-8.1 {
DROP TABLE IF EXISTS t8;
CREATE TABLE t8(a,b);
INSERT INTO t8(a) VALUES('abc' || char(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35) || 'xyz');
UPDATE t8 SET b=json_array(a);
SELECT b FROM t8;
} {{["abc\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#xyz"]}}
do_execsql_test json-8.2 {
do_execsql_test json101-8.2 {
SELECT a=json_extract(b,'$[0]') FROM t8;
} {1}
# 2017-04-12. Regression reported on the mailing list by Rolf Ade
#
do_execsql_test json-8.3 {
do_execsql_test json101-8.3 {
SELECT json_valid(char(0x22,0xe4,0x22));
} {1}
do_execsql_test json-8.4 {
do_execsql_test json101-8.4 {
SELECT unicode(json_extract(char(0x22,228,0x22),'$'));
} {228}
@ -385,331 +385,331 @@ do_execsql_test json-8.4 {
# String values are quoted and interior quotes are escaped. NULL values
# are rendered as the unquoted string "null".
#
do_execsql_test json-9.1 {
do_execsql_test json101-9.1 {
SELECT json_quote('abc"xyz');
} {{"abc\"xyz"}}
do_execsql_test json-9.2 {
do_execsql_test json101-9.2 {
SELECT json_quote(3.14159);
} {3.14159}
do_execsql_test json-9.3 {
do_execsql_test json101-9.3 {
SELECT json_quote(12345);
} {12345}
do_execsql_test json-9.4 {
do_execsql_test json101-9.4 {
SELECT json_quote(null);
} {"null"}
do_catchsql_test json-9.5 {
do_catchsql_test json101-9.5 {
SELECT json_quote(x'30313233');
} {1 {JSON cannot hold BLOB values}}
do_catchsql_test json-9.6 {
do_catchsql_test json101-9.6 {
SELECT json_quote(123,456)
} {1 {wrong number of arguments to function json_quote()}}
do_catchsql_test json-9.7 {
do_catchsql_test json101-9.7 {
SELECT json_quote()
} {1 {wrong number of arguments to function json_quote()}}
# Make sure only valid backslash-escapes are accepted.
#
do_execsql_test json-10.1 {
do_execsql_test json101-10.1 {
SELECT json_valid('" \ "');
} {0}
do_execsql_test json-10.2 {
do_execsql_test json101-10.2 {
SELECT json_valid('" \! "');
} {0}
do_execsql_test json-10.3 {
do_execsql_test json101-10.3 {
SELECT json_valid('" \" "');
} {1}
do_execsql_test json-10.4 {
do_execsql_test json101-10.4 {
SELECT json_valid('" \# "');
} {0}
do_execsql_test json-10.5 {
do_execsql_test json101-10.5 {
SELECT json_valid('" \$ "');
} {0}
do_execsql_test json-10.6 {
do_execsql_test json101-10.6 {
SELECT json_valid('" \% "');
} {0}
do_execsql_test json-10.7 {
do_execsql_test json101-10.7 {
SELECT json_valid('" \& "');
} {0}
do_execsql_test json-10.8 {
do_execsql_test json101-10.8 {
SELECT json_valid('" \'' "');
} {0}
do_execsql_test json-10.9 {
do_execsql_test json101-10.9 {
SELECT json_valid('" \( "');
} {0}
do_execsql_test json-10.10 {
do_execsql_test json101-10.10 {
SELECT json_valid('" \) "');
} {0}
do_execsql_test json-10.11 {
do_execsql_test json101-10.11 {
SELECT json_valid('" \* "');
} {0}
do_execsql_test json-10.12 {
do_execsql_test json101-10.12 {
SELECT json_valid('" \+ "');
} {0}
do_execsql_test json-10.13 {
do_execsql_test json101-10.13 {
SELECT json_valid('" \, "');
} {0}
do_execsql_test json-10.14 {
do_execsql_test json101-10.14 {
SELECT json_valid('" \- "');
} {0}
do_execsql_test json-10.15 {
do_execsql_test json101-10.15 {
SELECT json_valid('" \. "');
} {0}
do_execsql_test json-10.16 {
do_execsql_test json101-10.16 {
SELECT json_valid('" \/ "');
} {1}
do_execsql_test json-10.17 {
do_execsql_test json101-10.17 {
SELECT json_valid('" \0 "');
} {0}
do_execsql_test json-10.18 {
do_execsql_test json101-10.18 {
SELECT json_valid('" \1 "');
} {0}
do_execsql_test json-10.19 {
do_execsql_test json101-10.19 {
SELECT json_valid('" \2 "');
} {0}
do_execsql_test json-10.20 {
do_execsql_test json101-10.20 {
SELECT json_valid('" \3 "');
} {0}
do_execsql_test json-10.21 {
do_execsql_test json101-10.21 {
SELECT json_valid('" \4 "');
} {0}
do_execsql_test json-10.22 {
do_execsql_test json101-10.22 {
SELECT json_valid('" \5 "');
} {0}
do_execsql_test json-10.23 {
do_execsql_test json101-10.23 {
SELECT json_valid('" \6 "');
} {0}
do_execsql_test json-10.24 {
do_execsql_test json101-10.24 {
SELECT json_valid('" \7 "');
} {0}
do_execsql_test json-10.25 {
do_execsql_test json101-10.25 {
SELECT json_valid('" \8 "');
} {0}
do_execsql_test json-10.26 {
do_execsql_test json101-10.26 {
SELECT json_valid('" \9 "');
} {0}
do_execsql_test json-10.27 {
do_execsql_test json101-10.27 {
SELECT json_valid('" \: "');
} {0}
do_execsql_test json-10.28 {
do_execsql_test json101-10.28 {
SELECT json_valid('" \; "');
} {0}
do_execsql_test json-10.29 {
do_execsql_test json101-10.29 {
SELECT json_valid('" \< "');
} {0}
do_execsql_test json-10.30 {
do_execsql_test json101-10.30 {
SELECT json_valid('" \= "');
} {0}
do_execsql_test json-10.31 {
do_execsql_test json101-10.31 {
SELECT json_valid('" \> "');
} {0}
do_execsql_test json-10.32 {
do_execsql_test json101-10.32 {
SELECT json_valid('" \? "');
} {0}
do_execsql_test json-10.33 {
do_execsql_test json101-10.33 {
SELECT json_valid('" \@ "');
} {0}
do_execsql_test json-10.34 {
do_execsql_test json101-10.34 {
SELECT json_valid('" \A "');
} {0}
do_execsql_test json-10.35 {
do_execsql_test json101-10.35 {
SELECT json_valid('" \B "');
} {0}
do_execsql_test json-10.36 {
do_execsql_test json101-10.36 {
SELECT json_valid('" \C "');
} {0}
do_execsql_test json-10.37 {
do_execsql_test json101-10.37 {
SELECT json_valid('" \D "');
} {0}
do_execsql_test json-10.38 {
do_execsql_test json101-10.38 {
SELECT json_valid('" \E "');
} {0}
do_execsql_test json-10.39 {
do_execsql_test json101-10.39 {
SELECT json_valid('" \F "');
} {0}
do_execsql_test json-10.40 {
do_execsql_test json101-10.40 {
SELECT json_valid('" \G "');
} {0}
do_execsql_test json-10.41 {
do_execsql_test json101-10.41 {
SELECT json_valid('" \H "');
} {0}
do_execsql_test json-10.42 {
do_execsql_test json101-10.42 {
SELECT json_valid('" \I "');
} {0}
do_execsql_test json-10.43 {
do_execsql_test json101-10.43 {
SELECT json_valid('" \J "');
} {0}
do_execsql_test json-10.44 {
do_execsql_test json101-10.44 {
SELECT json_valid('" \K "');
} {0}
do_execsql_test json-10.45 {
do_execsql_test json101-10.45 {
SELECT json_valid('" \L "');
} {0}
do_execsql_test json-10.46 {
do_execsql_test json101-10.46 {
SELECT json_valid('" \M "');
} {0}
do_execsql_test json-10.47 {
do_execsql_test json101-10.47 {
SELECT json_valid('" \N "');
} {0}
do_execsql_test json-10.48 {
do_execsql_test json101-10.48 {
SELECT json_valid('" \O "');
} {0}
do_execsql_test json-10.49 {
do_execsql_test json101-10.49 {
SELECT json_valid('" \P "');
} {0}
do_execsql_test json-10.50 {
do_execsql_test json101-10.50 {
SELECT json_valid('" \Q "');
} {0}
do_execsql_test json-10.51 {
do_execsql_test json101-10.51 {
SELECT json_valid('" \R "');
} {0}
do_execsql_test json-10.52 {
do_execsql_test json101-10.52 {
SELECT json_valid('" \S "');
} {0}
do_execsql_test json-10.53 {
do_execsql_test json101-10.53 {
SELECT json_valid('" \T "');
} {0}
do_execsql_test json-10.54 {
do_execsql_test json101-10.54 {
SELECT json_valid('" \U "');
} {0}
do_execsql_test json-10.55 {
do_execsql_test json101-10.55 {
SELECT json_valid('" \V "');
} {0}
do_execsql_test json-10.56 {
do_execsql_test json101-10.56 {
SELECT json_valid('" \W "');
} {0}
do_execsql_test json-10.57 {
do_execsql_test json101-10.57 {
SELECT json_valid('" \X "');
} {0}
do_execsql_test json-10.58 {
do_execsql_test json101-10.58 {
SELECT json_valid('" \Y "');
} {0}
do_execsql_test json-10.59 {
do_execsql_test json101-10.59 {
SELECT json_valid('" \Z "');
} {0}
do_execsql_test json-10.60 {
do_execsql_test json101-10.60 {
SELECT json_valid('" \[ "');
} {0}
do_execsql_test json-10.61 {
do_execsql_test json101-10.61 {
SELECT json_valid('" \\ "');
} {1}
do_execsql_test json-10.62 {
do_execsql_test json101-10.62 {
SELECT json_valid('" \] "');
} {0}
do_execsql_test json-10.63 {
do_execsql_test json101-10.63 {
SELECT json_valid('" \^ "');
} {0}
do_execsql_test json-10.64 {
do_execsql_test json101-10.64 {
SELECT json_valid('" \_ "');
} {0}
do_execsql_test json-10.65 {
do_execsql_test json101-10.65 {
SELECT json_valid('" \` "');
} {0}
do_execsql_test json-10.66 {
do_execsql_test json101-10.66 {
SELECT json_valid('" \a "');
} {0}
do_execsql_test json-10.67 {
do_execsql_test json101-10.67 {
SELECT json_valid('" \b "');
} {1}
do_execsql_test json-10.68 {
do_execsql_test json101-10.68 {
SELECT json_valid('" \c "');
} {0}
do_execsql_test json-10.69 {
do_execsql_test json101-10.69 {
SELECT json_valid('" \d "');
} {0}
do_execsql_test json-10.70 {
do_execsql_test json101-10.70 {
SELECT json_valid('" \e "');
} {0}
do_execsql_test json-10.71 {
do_execsql_test json101-10.71 {
SELECT json_valid('" \f "');
} {1}
do_execsql_test json-10.72 {
do_execsql_test json101-10.72 {
SELECT json_valid('" \g "');
} {0}
do_execsql_test json-10.73 {
do_execsql_test json101-10.73 {
SELECT json_valid('" \h "');
} {0}
do_execsql_test json-10.74 {
do_execsql_test json101-10.74 {
SELECT json_valid('" \i "');
} {0}
do_execsql_test json-10.75 {
do_execsql_test json101-10.75 {
SELECT json_valid('" \j "');
} {0}
do_execsql_test json-10.76 {
do_execsql_test json101-10.76 {
SELECT json_valid('" \k "');
} {0}
do_execsql_test json-10.77 {
do_execsql_test json101-10.77 {
SELECT json_valid('" \l "');
} {0}
do_execsql_test json-10.78 {
do_execsql_test json101-10.78 {
SELECT json_valid('" \m "');
} {0}
do_execsql_test json-10.79 {
do_execsql_test json101-10.79 {
SELECT json_valid('" \n "');
} {1}
do_execsql_test json-10.80 {
do_execsql_test json101-10.80 {
SELECT json_valid('" \o "');
} {0}
do_execsql_test json-10.81 {
do_execsql_test json101-10.81 {
SELECT json_valid('" \p "');
} {0}
do_execsql_test json-10.82 {
do_execsql_test json101-10.82 {
SELECT json_valid('" \q "');
} {0}
do_execsql_test json-10.83 {
do_execsql_test json101-10.83 {
SELECT json_valid('" \r "');
} {1}
do_execsql_test json-10.84 {
do_execsql_test json101-10.84 {
SELECT json_valid('" \s "');
} {0}
do_execsql_test json-10.85 {
do_execsql_test json101-10.85 {
SELECT json_valid('" \t "');
} {1}
do_execsql_test json-10.86.0 {
do_execsql_test json101-10.86.0 {
SELECT json_valid('" \u "');
} {0}
do_execsql_test json-10.86.1 {
do_execsql_test json101-10.86.1 {
SELECT json_valid('" \ua "');
} {0}
do_execsql_test json-10.86.2 {
do_execsql_test json101-10.86.2 {
SELECT json_valid('" \uab "');
} {0}
do_execsql_test json-10.86.3 {
do_execsql_test json101-10.86.3 {
SELECT json_valid('" \uabc "');
} {0}
do_execsql_test json-10.86.4 {
do_execsql_test json101-10.86.4 {
SELECT json_valid('" \uabcd "');
} {1}
do_execsql_test json-10.86.5 {
do_execsql_test json101-10.86.5 {
SELECT json_valid('" \uFEDC "');
} {1}
do_execsql_test json-10.86.6 {
do_execsql_test json101-10.86.6 {
SELECT json_valid('" \u1234 "');
} {1}
do_execsql_test json-10.87 {
do_execsql_test json101-10.87 {
SELECT json_valid('" \v "');
} {0}
do_execsql_test json-10.88 {
do_execsql_test json101-10.88 {
SELECT json_valid('" \w "');
} {0}
do_execsql_test json-10.89 {
do_execsql_test json101-10.89 {
SELECT json_valid('" \x "');
} {0}
do_execsql_test json-10.90 {
do_execsql_test json101-10.90 {
SELECT json_valid('" \y "');
} {0}
do_execsql_test json-10.91 {
do_execsql_test json101-10.91 {
SELECT json_valid('" \z "');
} {0}
do_execsql_test json-10.92 {
do_execsql_test json101-10.92 {
SELECT json_valid('" \{ "');
} {0}
do_execsql_test json-10.93 {
do_execsql_test json101-10.93 {
SELECT json_valid('" \| "');
} {0}
do_execsql_test json-10.94 {
do_execsql_test json101-10.94 {
SELECT json_valid('" \} "');
} {0}
do_execsql_test json-10.95 {
do_execsql_test json101-10.95 {
SELECT json_valid('" \~ "');
} {0}
@ -719,20 +719,20 @@ do_execsql_test json-10.95 {
#
# The following tests confirm that deeply nested JSON is considered invalid.
#
do_execsql_test json-11.0 {
do_execsql_test json101-11.0 {
/* Shallow enough to be parsed */
SELECT json_valid(printf('%.1000c0%.1000c','[',']'));
} {1}
do_execsql_test json-11.1 {
do_execsql_test json101-11.1 {
/* Too deep by one */
SELECT json_valid(printf('%.1001c0%.1001c','[',']'));
} {0}
do_execsql_test json-11.2 {
do_execsql_test json101-11.2 {
/* Shallow enough to be parsed { */
SELECT json_valid(replace(printf('%.1000c0%.1000c','[','}'),'[','{"a":'));
/* } */
} {1}
do_execsql_test json-11.3 {
do_execsql_test json101-11.3 {
/* Too deep by one { */
SELECT json_valid(replace(printf('%.1001c0%.1001c','[','}'),'[','{"a":'));
/* } */
@ -742,7 +742,7 @@ do_execsql_test json-11.3 {
# a json structure even though the element name constains a "."
# character, by quoting the element name in the path.
#
do_execsql_test json-12.100 {
do_execsql_test json101-12.100 {
CREATE TABLE t12(x);
INSERT INTO t12(x) VALUES(
'{"settings":
@ -766,11 +766,11 @@ do_execsql_test json-12.100 {
}
}');
} {}
do_execsql_test json-12.110 {
do_execsql_test json101-12.110 {
SELECT json_remove(x, '$.settings.layer2."dis.legomenon".forceDisplay')
FROM t12;
} {{{"settings":{"layer2":{"hapax.legomenon":{"forceDisplay":true,"transliterate":true,"add.footnote":true,"summary.report":true},"dis.legomenon":{"transliterate":false,"add.footnote":false,"summary.report":true},"tris.legomenon":{"forceDisplay":true,"transliterate":false,"add.footnote":false,"summary.report":false}}}}}}
do_execsql_test json-12.120 {
do_execsql_test json101-12.120 {
SELECT json_extract(x, '$.settings.layer2."tris.legomenon"."summary.report"')
FROM t12;
} {0}
@ -779,7 +779,7 @@ do_execsql_test json-12.120 {
# ticket https://www.sqlite.org/src/tktview/80177f0c226ff54f6ddd41
# Make sure the query planner knows about the arguments to table-valued functions.
#
do_execsql_test json-13.100 {
do_execsql_test json101-13.100 {
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1(id, json);
@ -794,7 +794,7 @@ do_execsql_test json-13.100 {
WHERE EXISTS(SELECT 1 FROM json_each(t1.json,'$.items') AS Z
WHERE Z.value==t2.id);
} {1 {{"items":[3,5]}} 3 {{"value":3}} 1 {{"items":[3,5]}} 5 {{"value":5}}}
do_execsql_test json-13.110 {
do_execsql_test json101-13.110 {
SELECT * FROM t2 CROSS JOIN t1
WHERE EXISTS(SELECT 1 FROM json_each(t1.json,'$.items') AS Z
WHERE Z.value==t2.id);
@ -804,28 +804,28 @@ do_execsql_test json-13.110 {
# Incorrect fullkey output from json_each()
# when the input JSON is not an array or object.
#
do_execsql_test json-14.100 {
do_execsql_test json101-14.100 {
SELECT fullkey FROM json_each('123');
} {$}
do_execsql_test json-14.110 {
do_execsql_test json101-14.110 {
SELECT fullkey FROM json_each('123.56');
} {$}
do_execsql_test json-14.120 {
do_execsql_test json101-14.120 {
SELECT fullkey FROM json_each('"hello"');
} {$}
do_execsql_test json-14.130 {
do_execsql_test json101-14.130 {
SELECT fullkey FROM json_each('null');
} {$}
do_execsql_test json-14.140 {
do_execsql_test json101-14.140 {
SELECT fullkey FROM json_tree('123');
} {$}
do_execsql_test json-14.150 {
do_execsql_test json101-14.150 {
SELECT fullkey FROM json_tree('123.56');
} {$}
do_execsql_test json-14.160 {
do_execsql_test json101-14.160 {
SELECT fullkey FROM json_tree('"hello"');
} {$}
do_execsql_test json-14.170 {
do_execsql_test json101-14.170 {
SELECT fullkey FROM json_tree('null');
} {$}
@ -835,16 +835,16 @@ do_execsql_test json-14.170 {
#
# Bug reported via private email. See TH3 for more information.
#
do_execsql_test json-15.100 {
do_execsql_test json101-15.100 {
SELECT * FROM JSON_EACH('{"a":1, "b":2}');
} {a 1 integer 1 2 {} {$.a} {$} b 2 integer 2 4 {} {$.b} {$}}
do_execsql_test json-15.110 {
do_execsql_test json101-15.110 {
SELECT xyz.* FROM JSON_EACH('{"a":1, "b":2}') AS xyz;
} {a 1 integer 1 2 {} {$.a} {$} b 2 integer 2 4 {} {$.b} {$}}
do_execsql_test json-15.120 {
do_execsql_test json101-15.120 {
SELECT * FROM (JSON_EACH('{"a":1, "b":2}'));
} {a 1 integer 1 2 {} {$.a} {$} b 2 integer 2 4 {} {$.b} {$}}
do_execsql_test json-15.130 {
do_execsql_test json101-15.130 {
SELECT xyz.* FROM (JSON_EACH('{"a":1, "b":2}')) AS xyz;
} {a 1 integer 1 2 {} {$.a} {$} b 2 integer 2 4 {} {$.b} {$}}
@ -852,18 +852,18 @@ do_execsql_test json-15.130 {
# Mailing list bug report on the handling of surrogate pairs
# in JSON.
#
do_execsql_test json-16.10 {
do_execsql_test json101-16.10 {
SELECT length(json_extract('"abc\uD834\uDD1Exyz"','$'));
} {7}
do_execsql_test json-16.20 {
do_execsql_test json101-16.20 {
SELECT length(json_extract('"\uD834\uDD1E"','$'));
} {1}
do_execsql_test json-16.30 {
do_execsql_test json101-16.30 {
SELECT unicode(json_extract('"\uD834\uDD1E"','$'));
} {119070}
# 2022-01-30 dbsqlfuzz 4678cf825d27f87c9b8343720121e12cf944b71a
do_execsql_test json-17.1 {
do_execsql_test json101-17.1 {
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1(a,b,c);
@ -872,19 +872,19 @@ do_execsql_test json-17.1 {
} {}
# 2022-04-04 forum post https://sqlite.org/forum/forumpost/c082aeab43
do_execsql_test json-18.1 {
do_execsql_test json101-18.1 {
SELECT json_valid('{"":5}');
} {1}
do_execsql_test json-18.2 {
do_execsql_test json101-18.2 {
SELECT json_extract('{"":5}', '$.""');
} {5}
do_execsql_test json-18.3 {
do_execsql_test json101-18.3 {
SELECT json_extract('[3,{"a":4,"":[5,{"hi":6},7]},8]', '$[1].""[1].hi');
} {6}
do_execsql_test json-18.4 {
do_execsql_test json101-18.4 {
SELECT json_extract('[3,{"a":4,"":[5,{"hi":6},7]},8]', '$[1].""[1]."hi"');
} {6}
do_catchsql_test json-18.5 {
do_catchsql_test json101-18.5 {
SELECT json_extract('{"":8}', '$.');
} {1 {JSON path error near ''}}
@ -893,28 +893,28 @@ do_catchsql_test json-18.5 {
# a problem with transaction control. But the json() function makes
# the problem more easily accessible, so it is tested here.
#
do_execsql_test json-19.1 {
do_execsql_test json101-19.1 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(x);
} {}
do_catchsql_test json-19.2 {
do_catchsql_test json101-19.2 {
BEGIN;
INSERT INTO t1 VALUES(0), (json('not-valid-json'));
} {1 {malformed JSON}}
do_execsql_test json-19.3 {
do_execsql_test json101-19.3 {
COMMIT;
SELECT * FROM t1;
} {}
# 2023-03-17 positive and negative infinities
#
do_execsql_test json-20.1 {
do_execsql_test json101-20.1 {
SELECT json_object('a',2e370,'b',-3e380);
} {{{"a":9.0e+999,"b":-9.0e+999}}}
do_execsql_test json-20.2 {
do_execsql_test json101-20.2 {
SELECT json_object('a',2e370,'b',-3e380)->>'a';
} Inf
do_execsql_test json-20.3 {
do_execsql_test json101-20.3 {
SELECT json_object('a',2e370,'b',-3e380)->>'b';
} {-Inf}
@ -924,91 +924,91 @@ do_execsql_test json-20.3 {
#
db null NULL
if {[db exists {SELECT * FROM pragma_compile_options WHERE compile_options LIKE '%legacy_json_valid%'}]} {
do_execsql_test json-21.1-legacy {
do_execsql_test json101-21.1-legacy {
SELECT json_valid(NULL);
} 0
} else {
do_execsql_test json-21.1-correct {
do_execsql_test json101-21.1-correct {
SELECT json_valid(NULL);
} NULL
}
do_execsql_test json-21.2 {
do_execsql_test json101-21.2 {
SELECT json_error_position(NULL);
} NULL
do_execsql_test json-21.3 {
do_execsql_test json101-21.3 {
SELECT json(NULL);
} NULL
do_execsql_test json-21.4 {
do_execsql_test json101-21.4 {
SELECT json_array(NULL);
} {[null]}
do_execsql_test json-21.5 {
do_execsql_test json101-21.5 {
SELECT json_extract(NULL);
} NULL
do_execsql_test json-21.6 {
do_execsql_test json101-21.6 {
SELECT json_insert(NULL,'$',123);
} NULL
do_execsql_test json-21.7 {
do_execsql_test json101-21.7 {
SELECT NULL->0;
} NULL
do_execsql_test json-21.8 {
do_execsql_test json101-21.8 {
SELECT NULL->>0;
} NULL
do_execsql_test json-21.9 {
do_execsql_test json101-21.9 {
SELECT '{a:5}'->NULL;
} NULL
do_execsql_test json-21.10 {
do_execsql_test json101-21.10 {
SELECT '{a:5}'->>NULL;
} NULL
do_catchsql_test json-21.11 {
do_catchsql_test json101-21.11 {
SELECT json_object(NULL,5);
} {1 {json_object() labels must be TEXT}}
do_execsql_test json-21.12 {
do_execsql_test json101-21.12 {
SELECT json_patch(NULL,'{a:5}');
} NULL
do_execsql_test json-21.13 {
do_execsql_test json101-21.13 {
SELECT json_patch('{a:5}',NULL);
} NULL
do_execsql_test json-21.14 {
do_execsql_test json101-21.14 {
SELECT json_patch(NULL,NULL);
} NULL
do_execsql_test json-21.15 {
do_execsql_test json101-21.15 {
SELECT json_remove(NULL,'$');
} NULL
do_execsql_test json-21.16 {
do_execsql_test json101-21.16 {
SELECT json_remove('{a:5,b:7}',NULL);
} NULL
do_execsql_test json-21.17 {
do_execsql_test json101-21.17 {
SELECT json_replace(NULL,'$.a',123);
} NULL
do_execsql_test json-21.18 {
do_execsql_test json101-21.18 {
SELECT json_replace('{a:5,b:7}',NULL,NULL);
} {{{"a":5,"b":7}}}
do_execsql_test json-21.19 {
do_execsql_test json101-21.19 {
SELECT json_set(NULL,'$.a',123);
} NULL
do_execsql_test json-21.20 {
do_execsql_test json101-21.20 {
SELECT json_set('{a:5,b:7}',NULL,NULL);
} {{{"a":5,"b":7}}}
do_execsql_test json-21.21 {
do_execsql_test json101-21.21 {
SELECT json_type(NULL);
} NULL
do_execsql_test json-21.22 {
do_execsql_test json101-21.22 {
SELECT json_type('{a:5,b:7}',NULL);
} NULL
do_execsql_test json-21.23 {
do_execsql_test json101-21.23 {
SELECT json_quote(NULL);
} null
do_execsql_test json-21.24 {
do_execsql_test json101-21.24 {
SELECT count(*) FROM json_each(NULL);
} 0
do_execsql_test json-21.25 {
do_execsql_test json101-21.25 {
SELECT count(*) FROM json_tree(NULL);
} 0
do_execsql_test json-21.26 {
do_execsql_test json101-21.26 {
WITH c(x) AS (VALUES(1),(2.0),(NULL),('three'))
SELECT json_group_array(x) FROM c;
} {[1,2.0,null,"three"]}
do_execsql_test json-21.27 {
do_execsql_test json101-21.27 {
WITH c(x,y) AS (VALUES('a',1),('b',2.0),('c',NULL),(NULL,'three'),('e','four'))
SELECT json_group_object(x,y) FROM c;
} {{{"a":1,"b":2.0,"c":null,:"three","e":"four"}}}

View File

@ -1140,4 +1140,24 @@ do_execsql_test 17.1 {
} {1}
# 2023-08-15 https://sqlite.org/forum/forumpost/925dc9f67804c540
#
reset_db
sqlite3_db_config db DEFENSIVE 1
db eval {PRAGMA trusted_schema=OFF}
do_execsql_test 18.0 {
CREATE TABLE t1(x INT, y TEXT);
INSERT INTO t1 VALUES(1,'abc'),(2,'ABC'),(3,'Abc');
CREATE VIEW t2 AS SELECT * FROM t1 WHERE y LIKE 'a%';
SELECT * FROM t2;
} {1 abc 2 ABC 3 Abc}
do_execsql_test 18.1 {
PRAGMA case_sensitive_like=OFF;
SELECT * FROM t2;
} {1 abc 2 ABC 3 Abc}
do_execsql_test 18.2 {
PRAGMA case_sensitive_like=ON;
SELECT * FROM t2;
} {1 abc}
finish_test

View File

@ -10,7 +10,7 @@
#***********************************************************************
#
if {[info vars ::testdir]==""} {
if {[info vars ::trd::tcltest]==""} {
set testdir [file dirname $argv0]
source $testdir/tester.tcl
db close

View File

@ -69,7 +69,7 @@ foreach {tn script} {
# Because it uses so much data, this test can take 12-13 seconds even on
# a modern workstation. So it is omitted from "veryquick" and other
# permutations.test tests.
if {[isquick]==0} {
if {[isquick]==0 && [clang_sanitize_address]==0} {
do_execsql_test $tn.3 {
PRAGMA cache_size = 5;
WITH r(x,y) AS (

View File

@ -110,16 +110,20 @@ proc guess_number_of_cores {} {
if {[catch {number_of_cores} ret]} {
set ret 4
if {$::tcl_platform(os)=="Darwin"} {
set cmd "sysctl -n hw.logicalcpu"
if {$::tcl_platform(platform)=="windows"} {
catch { set ret $::env(NUMBER_OF_PROCESSORS) }
} else {
set cmd "nproc"
}
catch {
set fd [open "|$cmd" r]
set ret [gets $fd]
close $fd
set ret [expr $ret]
if {$::tcl_platform(os)=="Darwin"} {
set cmd "sysctl -n hw.logicalcpu"
} else {
set cmd "nproc"
}
catch {
set fd [open "|$cmd" r]
set ret [gets $fd]
close $fd
set ret [expr $ret]
}
}
}
return $ret
@ -188,10 +192,8 @@ set TRG(schema) {
state TEXT CHECK( state IN ('', 'ready', 'running', 'done', 'failed') ),
time INTEGER, -- Time in ms
output TEXT, -- full output of test script
priority AS (((config='make')*3) + (config='build') + (slow*2)),
jobtype AS (
CASE WHEN config IN ('build', 'make') THEN config ELSE 'script' END
),
priority INTEGER,
jobtype TEXT CHECK( jobtype IN ('script', 'build', 'make') ),
PRIMARY KEY(build, config, filename)
);
@ -278,6 +280,22 @@ if {([llength $argv]==2 || [llength $argv]==1)
}
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
# Check if this is the "script" command:
#
if {[string compare -nocase script [lindex $argv 0]]==0} {
if {[llength $argv]!=2 && !([llength $argv]==3&&[lindex $argv 1]=="-msvc")} {
usage
}
set bMsvc [expr ([llength $argv]==3)]
set config [lindex $argv [expr [llength $argv]-1]]
puts [trd_buildscript $config [file dirname $testdir] $bMsvc]
exit
}
#--------------------------------------------------------------------------
# Check if this is the "status" command:
#
@ -681,9 +699,20 @@ proc make_new_testset {} {
set state ""
}
set priority [expr {$slow*2}]
if {$c=="make"} { incr priority 3 }
if {$c=="build"} { incr priority 1 }
if {$c=="make" || $c=="build"} {
set jobtype $c
} else {
set jobtype "script"
}
trdb eval {
INSERT INTO script(build, config, filename, slow, state)
VALUES ($b, $c, $s, $slow, $state)
INSERT INTO script
(build, config, filename, slow, state, priority, jobtype)
VALUES ($b, $c, $s, $slow, $state, $priority, $jobtype)
}
}
}
@ -768,12 +797,7 @@ proc launch_another_job {iJob} {
if {$b=="Zipvfs"} {
set script [zipvfs_testrunner_script]
} else {
set cmd [info nameofexec]
lappend cmd [file join $testdir releasetest_data.tcl]
lappend cmd trscript
if {$TRG(platform)=="win"} { lappend cmd -msvc }
lappend cmd $b $srcdir
set script [exec {*}$cmd]
set script [trd_buildscript $b $srcdir [expr {$TRG(platform)=="win"}]]
}
set fd [open [file join $builddir $TRG(make)] w]

View File

@ -5,6 +5,7 @@ namespace eval trd {
variable tcltest
variable extra
variable all_configs
variable build
# Tcl tests to run for various builds.
@ -35,6 +36,7 @@ namespace eval trd {
set tcltest(win.Have-Not) veryquick
set tcltest(win.Windows-Memdebug) veryquick
set tcltest(win.Windows-Win32Heap) veryquick
set tcltest(win.Windows-Sanitize) veryquick
set tcltest(win.Default) full
# Extra [make xyz] tests that should be run for various builds.
@ -63,6 +65,7 @@ namespace eval trd {
set extra(win.Stdcall) {fuzztest sourcetest}
set extra(win.Windows-Memdebug) {fuzztest sourcetest}
set extra(win.Windows-Win32Heap) {fuzztest sourcetest}
set extra(win.Windows-Sanitize) fuzztest
set extra(win.Have-Not) {fuzztest sourcetest}
# The following mirrors the set of test suites invoked by "all.test".
@ -75,6 +78,245 @@ namespace eval trd {
inmemory_journal pcache0 pcache10 pcache50 pcache90
pcache100 prepare mmap
}
#-----------------------------------------------------------------------
# Start of build() definitions.
#
set build(Default) {
-O2
--disable-amalgamation --disable-shared
--enable-session
-DSQLITE_ENABLE_RBU
}
# These two are used by [testrunner.tcl mdevtest].
#
set build(All-Debug) {
--enable-debug --enable-all
}
set build(All-O0) {
-O0 --enable-all
}
set build(Sanitize) {
CC=clang -fsanitize=address,undefined
-DSQLITE_ENABLE_STAT4
-DCONFIG_SLOWDOWN_FACTOR=5.0
--enable-debug
--enable-all
}
set build(Stdcall) {
-DUSE_STDCALL=1
-O2
}
# The "Have-Not" configuration sets all possible -UHAVE_feature options
# in order to verify that the code works even on platforms that lack
# these support services.
set build(Have-Not) {
-DHAVE_FDATASYNC=0
-DHAVE_GMTIME_R=0
-DHAVE_ISNAN=0
-DHAVE_LOCALTIME_R=0
-DHAVE_LOCALTIME_S=0
-DHAVE_MALLOC_USABLE_SIZE=0
-DHAVE_STRCHRNUL=0
-DHAVE_USLEEP=0
-DHAVE_UTIME=0
}
set build(Unlock-Notify) {
-O2
-DSQLITE_ENABLE_UNLOCK_NOTIFY
-DSQLITE_THREADSAFE
-DSQLITE_TCL_DEFAULT_FULLMUTEX=1
}
set build(User-Auth) {
-O2
-DSQLITE_USER_AUTHENTICATION=1
}
set build(Secure-Delete) {
-O2
-DSQLITE_SECURE_DELETE=1
-DSQLITE_SOUNDEX=1
}
set build(Update-Delete-Limit) {
-O2
-DSQLITE_DEFAULT_FILE_FORMAT=4
-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
-DSQLITE_ENABLE_STMT_SCANSTATUS
-DSQLITE_LIKE_DOESNT_MATCH_BLOBS
-DSQLITE_ENABLE_CURSOR_HINTS
}
set build(Check-Symbols) {
-DSQLITE_MEMDEBUG=1
-DSQLITE_ENABLE_FTS3_PARENTHESIS=1
-DSQLITE_ENABLE_FTS3=1
-DSQLITE_ENABLE_RTREE=1
-DSQLITE_ENABLE_MEMSYS5=1
-DSQLITE_ENABLE_MEMSYS3=1
-DSQLITE_ENABLE_COLUMN_METADATA=1
-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
-DSQLITE_SECURE_DELETE=1
-DSQLITE_SOUNDEX=1
-DSQLITE_ENABLE_ATOMIC_WRITE=1
-DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
-DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1
-DSQLITE_ENABLE_STAT4
-DSQLITE_ENABLE_STMT_SCANSTATUS
--enable-fts5 --enable-session
}
set build(Debug-One) {
--disable-shared
-O2 -funsigned-char
-DSQLITE_DEBUG=1
-DSQLITE_MEMDEBUG=1
-DSQLITE_MUTEX_NOOP=1
-DSQLITE_TCL_DEFAULT_FULLMUTEX=1
-DSQLITE_ENABLE_FTS3=1
-DSQLITE_ENABLE_RTREE=1
-DSQLITE_ENABLE_MEMSYS5=1
-DSQLITE_ENABLE_COLUMN_METADATA=1
-DSQLITE_ENABLE_STAT4
-DSQLITE_ENABLE_HIDDEN_COLUMNS
-DSQLITE_MAX_ATTACHED=125
-DSQLITE_MUTATION_TEST
--enable-fts5
}
set build(Debug-Two) {
-DSQLITE_DEFAULT_MEMSTATUS=0
-DSQLITE_MAX_EXPR_DEPTH=0
--enable-debug
}
set build(Fast-One) {
-O6
-DSQLITE_ENABLE_FTS4=1
-DSQLITE_ENABLE_RTREE=1
-DSQLITE_ENABLE_STAT4
-DSQLITE_ENABLE_RBU
-DSQLITE_MAX_ATTACHED=125
-DSQLITE_MAX_MMAP_SIZE=12884901888
-DSQLITE_ENABLE_SORTER_MMAP=1
-DLONGDOUBLE_TYPE=double
--enable-session
}
set build(Device-One) {
-O2
-DSQLITE_DEBUG=1
-DSQLITE_DEFAULT_AUTOVACUUM=1
-DSQLITE_DEFAULT_CACHE_SIZE=64
-DSQLITE_DEFAULT_PAGE_SIZE=1024
-DSQLITE_DEFAULT_TEMP_CACHE_SIZE=32
-DSQLITE_DISABLE_LFS=1
-DSQLITE_ENABLE_ATOMIC_WRITE=1
-DSQLITE_ENABLE_IOTRACE=1
-DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
-DSQLITE_MAX_PAGE_SIZE=4096
-DSQLITE_OMIT_LOAD_EXTENSION=1
-DSQLITE_OMIT_PROGRESS_CALLBACK=1
-DSQLITE_OMIT_VIRTUALTABLE=1
-DSQLITE_ENABLE_HIDDEN_COLUMNS
-DSQLITE_TEMP_STORE=3
}
set build(Device-Two) {
-DSQLITE_4_BYTE_ALIGNED_MALLOC=1
-DSQLITE_DEFAULT_AUTOVACUUM=1
-DSQLITE_DEFAULT_CACHE_SIZE=1000
-DSQLITE_DEFAULT_LOCKING_MODE=0
-DSQLITE_DEFAULT_PAGE_SIZE=1024
-DSQLITE_DEFAULT_TEMP_CACHE_SIZE=1000
-DSQLITE_DISABLE_LFS=1
-DSQLITE_ENABLE_FTS3=1
-DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
-DSQLITE_ENABLE_RTREE=1
-DSQLITE_MAX_COMPOUND_SELECT=50
-DSQLITE_MAX_PAGE_SIZE=32768
-DSQLITE_OMIT_TRACE=1
-DSQLITE_TEMP_STORE=3
-DSQLITE_THREADSAFE=2
--enable-fts5 --enable-session
}
set build(Locking-Style) {
-O2
-DSQLITE_ENABLE_LOCKING_STYLE=1
}
set build(Apple) {
-Os
-DHAVE_GMTIME_R=1
-DHAVE_ISNAN=1
-DHAVE_LOCALTIME_R=1
-DHAVE_PREAD=1
-DHAVE_PWRITE=1
-DHAVE_UTIME=1
-DSQLITE_DEFAULT_CACHE_SIZE=1000
-DSQLITE_DEFAULT_CKPTFULLFSYNC=1
-DSQLITE_DEFAULT_MEMSTATUS=1
-DSQLITE_DEFAULT_PAGE_SIZE=1024
-DSQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS=1
-DSQLITE_ENABLE_API_ARMOR=1
-DSQLITE_ENABLE_AUTO_PROFILE=1
-DSQLITE_ENABLE_FLOCKTIMEOUT=1
-DSQLITE_ENABLE_FTS3=1
-DSQLITE_ENABLE_FTS3_PARENTHESIS=1
-DSQLITE_ENABLE_FTS3_TOKENIZER=1
-DSQLITE_ENABLE_PERSIST_WAL=1
-DSQLITE_ENABLE_PURGEABLE_PCACHE=1
-DSQLITE_ENABLE_RTREE=1
-DSQLITE_ENABLE_SNAPSHOT=1
-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
-DSQLITE_MAX_LENGTH=2147483645
-DSQLITE_MAX_VARIABLE_NUMBER=500000
-DSQLITE_NO_SYNC=1
-DSQLITE_OMIT_AUTORESET=1
-DSQLITE_OMIT_LOAD_EXTENSION=1
-DSQLITE_PREFER_PROXY_LOCKING=1
-DSQLITE_SERIES_CONSTRAINT_VERIFY=1
-DSQLITE_THREADSAFE=2
-DSQLITE_USE_URI=1
-DSQLITE_WRITE_WALFRAME_PREBUFFERED=1
-DUSE_GUARDED_FD=1
-DUSE_PREAD=1
--enable-fts5
}
set build(Extra-Robustness) {
-DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1
-DSQLITE_MAX_ATTACHED=62
}
set build(Devkit) {
-DSQLITE_DEFAULT_FILE_FORMAT=4
-DSQLITE_MAX_ATTACHED=30
-DSQLITE_ENABLE_COLUMN_METADATA
-DSQLITE_ENABLE_FTS4
-DSQLITE_ENABLE_FTS5
-DSQLITE_ENABLE_FTS4_PARENTHESIS
-DSQLITE_DISABLE_FTS4_DEFERRED
-DSQLITE_ENABLE_RTREE
--enable-fts5
}
set build(No-lookaside) {
-DSQLITE_TEST_REALLOC_STRESS=1
-DSQLITE_OMIT_LOOKASIDE=1
}
set build(Valgrind) {
-DSQLITE_ENABLE_STAT4
-DSQLITE_ENABLE_FTS4
-DSQLITE_ENABLE_RTREE
-DSQLITE_ENABLE_HIDDEN_COLUMNS
-DLONGDOUBLE_TYPE=double
-DCONFIG_SLOWDOWN_FACTOR=8.0
}
set build(Windows-Memdebug) {
MEMDEBUG=1
DEBUG=3
}
set build(Windows-Win32Heap) {
WIN32HEAP=1
DEBUG=4
}
set build(Windows-Sanitize) {
ASAN=1
}
}
@ -84,6 +326,7 @@ proc trd_import {} {
variable ::trd::tcltest
variable ::trd::extra
variable ::trd::all_configs
variable ::trd::build
}
}
@ -106,13 +349,13 @@ proc trd_builds {platform} {
set ret
}
proc trd_configs {platform build} {
proc trd_configs {platform bld} {
trd_import
set clist [list]
if {[info exists tcltest($platform.$build)]} {
set clist $tcltest($platform.$build)
if {[info exists tcltest($platform.$bld)]} {
set clist $tcltest($platform.$bld)
if {$clist=="all"} {
set clist $all_configs
} elseif {$clist=="all_plus_autovacuum_crash"} {
@ -123,12 +366,12 @@ proc trd_configs {platform build} {
set clist
}
proc trd_extras {platform build} {
proc trd_extras {platform bld} {
trd_import
set elist [list]
if {[info exists extra($platform.$build)]} {
set elist $extra($platform.$build)
if {[info exists extra($platform.$bld)]} {
set elist $extra($platform.$bld)
}
set elist
@ -139,5 +382,180 @@ proc trd_all_configs {} {
set all_configs
}
proc trimscript {text} {
set text [string map {"\n " "\n"} [string trim $text]]
}
proc make_sh_script {srcdir opts cflags makeOpts configOpts} {
set tcldir [::tcl::pkgconfig get libdir,install]
set myopts ""
if {[info exists ::env(OPTS)]} {
append myopts "# From environment variable:\n"
append myopts "OPTS=$::env(OPTS)\n"
}
foreach o [lsort $opts] {
append myopts "OPTS=\"\$OPTS $o\"\n"
}
return [trimscript [subst -nocommands {
set -e
if [ "\$#" -ne 1 ] ; then
echo "Usage: \$0 <target>"
exit -1
fi
SRCDIR="$srcdir"
TCLDIR="$tcldir"
if [ ! -f Makefile ] ; then
\$SRCDIR/configure --with-tcl=\$TCL $configOpts
fi
$myopts
CFLAGS="$cflags"
make \$1 "CFLAGS=\$CFLAGS" "OPTS=\$OPTS" $makeOpts
}]]
}
# Generate the text of a *.bat script.
#
proc make_bat_file {srcdir opts cflags makeOpts} {
set srcdir [file nativename [file normalize $srcdir]]
return [trimscript [subst -nocommands {
set TARGET=%1
set TMP=%CD%
nmake /f $srcdir\\Makefile.msc TOP="$srcdir" %TARGET% "CCOPTS=$cflags" "OPTS=$opts" $makeOpts
}]]
}
# Generate the text of a shell script.
#
proc make_script {cfg srcdir bMsvc} {
set opts [list] ;# OPTS value
set cflags [expr {$bMsvc ? "-Zi" : "-g"}] ;# CFLAGS value
set makeOpts [list] ;# Extra args for [make]
set configOpts [list] ;# Extra args for [configure]
# Define either SQLITE_OS_WIN or SQLITE_OS_UNIX, as appropriate.
if {$::tcl_platform(platform)=="windows"} {
lappend opts -DSQLITE_OS_WIN=1
} else {
lappend opts -DSQLITE_OS_UNIX=1
}
# Unless the configuration specifies -DHAVE_USLEEP=0, set -DHAVE_USLEEP=1.
#
if {[lsearch $cfg "-DHAVE_USLEEP=0"]<0} {
lappend cfg -DHAVE_USLEEP=1
}
# Loop through the parameters of the nominated configuration, updating
# $opts, $cflags, $makeOpts and $configOpts along the way. Rules are as
# follows:
#
# 1. If the parameter begins with "-D", add it to $opts.
#
# 2. If the parameter begins with "--" add it to $configOpts. Unless
# this command is preparing a script for MSVC - then add an
# equivalent to $makeOpts or $opts.
#
# 3. If the parameter begins with "-" add it to $cflags. If in MSVC
# mode and the parameter is an -O<integer> option, instead add
# an OPTIMIZATIONS=<integer> switch to $makeOpts.
#
# 4. If none of the above apply, add the parameter to $makeOpts
#
foreach param $cfg {
if {[string range $param 0 1]=="-D"} {
lappend opts $param
continue
}
if {[string range $param 0 1]=="--"} {
if {$bMsvc==0} {
lappend configOpts $param
} else {
switch -- $param {
--disable-amalgamation {
lappend makeOpts USE_AMALGAMATION=0
}
--disable-shared {
lappend makeOpts USE_CRT_DLL=0 DYNAMIC_SHELL=0
}
--enable-fts5 {
lappend opts -DSQLITE_ENABLE_FTS5
}
--enable-shared {
lappend makeOpts USE_CRT_DLL=1 DYNAMIC_SHELL=1
}
--enable-session {
lappend opts -DSQLITE_ENABLE_PREUPDATE_HOOK
lappend opts -DSQLITE_ENABLE_SESSION
}
--enable-all {
}
--enable-debug {
# lappend makeOpts OPTIMIZATIONS=0
lappend opts -DSQLITE_DEBUG
}
default {
error "Cannot translate $param for MSVC"
}
}
}
continue
}
if {[string range $param 0 0]=="-"} {
if {$bMsvc && [regexp -- {^-O(\d+)$} $param -> level]} {
lappend makeOpts OPTIMIZATIONS=$level
} else {
lappend cflags $param
}
continue
}
lappend makeOpts $param
}
if {$bMsvc==0} {
set zRet [make_sh_script $srcdir $opts $cflags $makeOpts $configOpts]
} else {
set zRet [make_bat_file $srcdir $opts $cflags $makeOpts]
}
}
# Usage:
#
# trd_buildscript CONFIG SRCDIR MSVC
#
# This command returns the full text of a script (either a shell script or
# an ms-dos bat file) that may be used to build SQLite source code according
# to a nominated configuration.
#
# Parameter CONFIG must be a configuration defined above in the ::trd::build
# array. SRCDIR is the root directory of an SQLite source tree (the parent
# directory of that containing this script). MSVC is a boolean - true to
# use the MSVC compiler, false otherwise.
#
proc trd_buildscript {config srcdir bMsvc} {
trd_import
# Ensure that the named configuration exists.
if {![info exists build($config)]} {
error "No such build config: $config"
}
# Generate and return the script.
return [make_script $build($config) $srcdir $bMsvc]
}

View File

@ -255,4 +255,17 @@ do_execsql_test upsert1-1100 {
SELECT * FROM t1;
} {1 22}
# 2023-08-17 dbsqlfuzz 9983e2c77634a8ccf33b5c91fa9982599de5f9e9
# Bound parameters in the ON CONFLICT clause of an UPSERT.
#
reset_db
do_execsql_test upsert1-1200 {
CREATE TABLE t1(a INT, b INT);
CREATE UNIQUE INDEX t1x ON t1(b+3);
}
sqlite3_db_config db ENABLE_QPSG 1
do_catchsql_test upsert1-1210 {
INSERT INTO t1(a,b) VALUES(1,2) ON CONFLICT(b+?1) DO NOTHING;
} {1 {ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint}}
finish_test

View File

@ -47,8 +47,12 @@
# include <unistd.h>
#else
# include <io.h>
# define R_OK 04
# define access(f,m) _access((f),(m))
# ifndef R_OK
# define R_OK 04
# endif
# ifndef access
# define access(f,m) _access((f),(m))
# endif
#endif
typedef unsigned long long int u64;