Merge trunk into jni-threading branch.
FossilOrigin-Name: 8254479c6ff1ea3cc9e56de1698db8405c03da90b9bf4c401182e47e0842baf8
This commit is contained in:
commit
6f92f35449
15
Makefile.msc
15
Makefile.msc
@ -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
|
||||
|
43
README.md
43
README.md
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
85
doc/compile-for-windows.md
Normal file
85
doc/compile-for-windows.md
Normal 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` ← 64-bit (the default)
|
||||
<li> `c:\tcl32` ← 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>
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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]
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 },
|
||||
|
75
manifest
75
manifest
@ -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.
|
||||
|
@ -1 +1 @@
|
||||
0c7ac34f30e1f7e35a2ac4e5e55e5f24857b24afa81a7abecba60f1c9c68b9ff
|
||||
8254479c6ff1ea3cc9e56de1698db8405c03da90b9bf4c401182e47e0842baf8
|
13
src/func.c
13
src/func.c
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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 ){
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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 */
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
28
src/wal.c
28
src/wal.c
@ -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 ){
|
||||
|
@ -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}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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"}}}
|
||||
|
@ -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
|
||||
|
@ -10,7 +10,7 @@
|
||||
#***********************************************************************
|
||||
#
|
||||
|
||||
if {[info vars ::testdir]==""} {
|
||||
if {[info vars ::trd::tcltest]==""} {
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
db close
|
||||
|
@ -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 (
|
||||
|
@ -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]
|
||||
|
@ -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]
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user