Compare commits
77 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 195956af94 | |||
| 28a7f01f90 | |||
| d968525382 | |||
| eb8089ef46 | |||
| 9455a6e8b8 | |||
| 56d831e064 | |||
| 7754f53045 | |||
| 4619855103 | |||
| be4cf645a8 | |||
| 065daf24b4 | |||
| 0b8e4294d5 | |||
| d61dbf7072 | |||
| 586361fa7c | |||
| e7f190b8e1 | |||
| 130a2f52b1 | |||
| 92f91ca37d | |||
| 4edee00ee0 | |||
| 91020438c0 | |||
| b4af09c80e | |||
| 75ca99ab99 | |||
| cf0ba94657 | |||
| d7d632d581 | |||
| 4cefe53a33 | |||
| afd432f86e | |||
| 7aadad63e9 | |||
| b9bf2d9382 | |||
| d8d88d9390 | |||
| c0e3a8ca19 | |||
| f28c0f37f2 | |||
| 2af776ff59 | |||
| 8fb8782e2a | |||
| 7fa9e45746 | |||
| 6f341f499a | |||
| f91151bfa1 | |||
| 20bfeccb65 | |||
| f942995fd2 | |||
| 62ed0b79da | |||
| a00b9b99ba | |||
| 9976684d26 | |||
| 8200750eb1 | |||
| dca1f04f07 | |||
| 1df00568b3 | |||
| f8b5cc695c | |||
| 3c2b02d919 | |||
| 08a256958f | |||
| 7af1d61886 | |||
| c6925d5922 | |||
| 4bace197e1 | |||
| 81b8ad0830 | |||
| b33477c5b4 | |||
| d271627f96 | |||
| fbb07ff67f | |||
| db97d2ef81 | |||
| 6f15549f91 | |||
| 90916e5ba0 | |||
| 8376b87ae3 | |||
| 1702244d2e | |||
| bb4743c278 | |||
| 5e972ddd9f | |||
| 51d3e6d51c | |||
| 1be5689087 | |||
| c30e1a10ef | |||
| 4a27581f14 | |||
| 697d29ea49 | |||
| 7f84ce0ea9 | |||
| a6c95406c1 | |||
| e3fc1fc8dd | |||
| 6f097125cd | |||
| 0e77c3fa4d | |||
| 527062ac5e | |||
| 656563cce9 | |||
| 6cebfa56cc | |||
| 8e875fa3bd | |||
| c5c9c6093b | |||
| 16478dbfdd | |||
| a939a635a2 | |||
| 1ecc135cc5 |
+4
-16
@@ -11,17 +11,6 @@
|
||||
#
|
||||
all:
|
||||
########################################################################
|
||||
#
|
||||
# Known TODOs/FIXMEs/TOIMPROVEs for the autosetup port, in no
|
||||
# particular order...
|
||||
#
|
||||
# - TEA pieces.
|
||||
#
|
||||
# - Replace the autotools-specific distribution deliverable(s).
|
||||
#
|
||||
# - Confirm whether cross-compilation works and patch it
|
||||
# appropriately.
|
||||
#
|
||||
# Maintenance reminders:
|
||||
#
|
||||
# - This makefile should remain as POSIX-make-compatible as possible:
|
||||
@@ -264,8 +253,8 @@ AS_AUTO_DEF = $(TOP)/auto.def
|
||||
# invoked with to produce this makefile.
|
||||
#
|
||||
AS_AUTORECONFIG = @SQLITE_AUTORECONFIG@
|
||||
.PHONY: reconfigure
|
||||
reconfigure:
|
||||
.PHONY: config reconfigure
|
||||
config reconfigure:
|
||||
$(AS_AUTORECONFIG)
|
||||
USE_AMALGAMATION ?= @USE_AMALGAMATION@
|
||||
LINK_TOOLS_DYNAMICALLY ?= @LINK_TOOLS_DYNAMICALLY@
|
||||
@@ -324,9 +313,8 @@ fiddle: sqlite3.c shell.c
|
||||
./custom.rws: ./tool/custom.txt
|
||||
@echo 'Updating custom dictionary from tool/custom.txt'
|
||||
aspell --lang=en create master ./custom.rws < ./tool/custom.txt
|
||||
# Note that jimsh does not work here:
|
||||
# https://github.com/msteveb/jimtcl/issues/319
|
||||
misspell: ./custom.rws has_tclsh84
|
||||
# $(JIMSH) does not work with spellsift.tcl
|
||||
$(TCLSH_CMD) ./tool/spellsift.tcl ./src/*.c ./src/*.h ./src/*.in
|
||||
|
||||
#
|
||||
@@ -343,7 +331,7 @@ distclean: distclean-autosetup
|
||||
|
||||
#
|
||||
# tool/version-info: a utility for emitting sqlite3 version info
|
||||
# in various forms.
|
||||
# in various forms. It's used by ext/wasm/.
|
||||
#
|
||||
version-info$(T.exe): $(TOP)/tool/version-info.c Makefile sqlite3.h
|
||||
$(T.link) $(ST_OPT) -o $@ $(TOP)/tool/version-info.c
|
||||
|
||||
@@ -12,6 +12,11 @@
|
||||
#
|
||||
# JimTCL: https://jim.tcl.tk
|
||||
#
|
||||
# Code-diver notes: APIs names starting with "sqlite-" are specific to
|
||||
# this project and can be found in autosetup/sqlite-config.tcl. Names
|
||||
# starting with "proj-" are project-agnostic and found in
|
||||
# autosetup/proj.tcl.
|
||||
#
|
||||
use sqlite-config
|
||||
sqlite-configure canonical {
|
||||
proj-if-opt-truthy dev {
|
||||
|
||||
@@ -222,9 +222,12 @@ install: install-lib
|
||||
# Flags to link the shell app either directly against sqlite3.c
|
||||
# (ENABLE_STATIC_SHELL==1) or libsqlite3.so (ENABLE_STATIC_SHELL==0).
|
||||
#
|
||||
# Maintenance reminder: placement of $(LDFLAGS) is more relevant for
|
||||
# some platforms than others:
|
||||
# https://sqlite.org/forum/forumpost/d80ecdaddd
|
||||
ENABLE_STATIC_SHELL = @ENABLE_STATIC_SHELL@
|
||||
sqlite3-shell-link-flags.1 = $(TOP)/sqlite3.c $(LDFLAGS.libsqlite3)
|
||||
sqlite3-shell-link-flags.0 = -L. -lsqlite3 $(LDFLAGS.zlib) $(LDFLAGS.math)
|
||||
sqlite3-shell-link-flags.1 = $(TOP)/sqlite3.c $(LDFLAGS) $(LDFLAGS.libsqlite3)
|
||||
sqlite3-shell-link-flags.0 = $(LDFLAGS) -L. -lsqlite3 $(LDFLAGS.zlib) $(LDFLAGS.math)
|
||||
sqlite3-shell-deps.1 = $(TOP)/sqlite3.c
|
||||
sqlite3-shell-deps.0 = $(libsqlite3.DLL)
|
||||
#
|
||||
@@ -245,7 +248,7 @@ sqlite3$(T.exe): $(TOP)/shell.c $(sqlite3-shell-deps.$(ENABLE_STATIC_SHELL))
|
||||
$(sqlite3-shell-static.flags.$(STATIC_CLI_SHELL)) \
|
||||
-I. $(OPT_FEATURE_FLAGS) $(SHELL_OPT) \
|
||||
$(CFLAGS) $(CFLAGS.readline) $(CFLAGS.icu) \
|
||||
$(LDFLAGS) $(LDFLAGS.readline)
|
||||
$(LDFLAGS.readline)
|
||||
|
||||
sqlite3$(T.exe)-1:
|
||||
sqlite3$(T.exe)-0: sqlite3$(T.exe)
|
||||
|
||||
+4
-3
@@ -380,8 +380,9 @@ and its own special handling of `--enable-...` flags makes `--debug`
|
||||
an alias for `--enable-debug`. As this project has a long history of
|
||||
using `--enable-debug`, we patch autosetup to use the name
|
||||
`--autosetup-debug` in place of `--debug`. That requires (as of this
|
||||
writing) four small edits in [](/file/autosetup/autosetup), as
|
||||
demonstrated in [check-in 3296c8d3](/info/3296c8d3).
|
||||
writing) four small edits in
|
||||
[/autosetup/autosetup](/file/autosetup/autosetup), as demonstrated in
|
||||
[check-in 3296c8d3](/info/3296c8d3).
|
||||
|
||||
If autosetup is upgraded and this patch is _not_ applied the invoking
|
||||
`./configure` will fail loudly because of the declaration of the
|
||||
@@ -426,7 +427,7 @@ proc sqlite-custom-flags {} {
|
||||
```
|
||||
|
||||
That function must return either an empty string or a list in the form
|
||||
used internally by `sqlite-config.tcl:sqlite-configure`.
|
||||
used internally by [sqlite-config.tcl][]'s `sqlite-configure`.
|
||||
|
||||
Next, define:
|
||||
|
||||
|
||||
+11
-7
@@ -406,8 +406,8 @@ proc options-add {opts} {
|
||||
# Find the corresponding value in the user options
|
||||
# and set the default if necessary
|
||||
if {[string match "-*" $opt]} {
|
||||
# This is a documentation-only option, like "-C <dir>"
|
||||
set opthelp $opt
|
||||
# We no longer support documentation-only options, like "-C <dir>"
|
||||
autosetup-error "Option $opt is not supported"
|
||||
} elseif {$colon eq ""} {
|
||||
# Boolean option
|
||||
lappend autosetup(options) $name
|
||||
@@ -1611,7 +1611,7 @@ proc autosetup_output_block {type lines} {
|
||||
# Generate a command reference from inline documentation
|
||||
proc automf_command_reference {} {
|
||||
lappend files $::autosetup(prog)
|
||||
lappend files {*}[lsort [glob -nocomplain $::autosetup(libdir)/*.tcl]]
|
||||
lappend files {*}[lsort [glob -nocomplain $::autosetup(libdir)/{*/*.tcl,*.tcl}]]
|
||||
|
||||
# We want to process all non-module files before module files
|
||||
# and then modules in alphabetical order.
|
||||
@@ -2124,7 +2124,7 @@ if {$autosetup(istcl)} {
|
||||
set frame [info frame -$i]
|
||||
if {[dict exists $frame file]} {
|
||||
# We don't need proc, so use ""
|
||||
lappend stacktrace "" [dict get $frame file] [dict get $frame line]
|
||||
lappend stacktrace "" [dict get $frame file] [dict get $frame line] ""
|
||||
}
|
||||
}
|
||||
return $stacktrace
|
||||
@@ -2181,8 +2181,12 @@ proc error-location {msg} {
|
||||
if {$::autosetup(debug)} {
|
||||
return -code error $msg
|
||||
}
|
||||
# Search back through the stack trace for the first error in a .def file
|
||||
foreach {p f l} [stacktrace] {
|
||||
set vars {p f l cmd}
|
||||
if {!$::autosetup(istcl) && ![dict exists $::tcl_platform stackFormat]} {
|
||||
# Older versions of Jim had a 3 element stacktrace
|
||||
set vars {p f l}
|
||||
}
|
||||
foreach $vars [stacktrace] {
|
||||
if {[string match *.def $f]} {
|
||||
return "[relative-path $f]:$l: Error: $msg"
|
||||
}
|
||||
@@ -2534,7 +2538,7 @@ if {[catch {main $argv} msg opts] == 1} {
|
||||
show-notices
|
||||
autosetup-full-error [error-dump $msg $opts $autosetup(debug)]
|
||||
if {!$autosetup(debug)} {
|
||||
puts stderr "Try: '[file tail $autosetup(exe)] --autosetup-debug' for a full stack trace"
|
||||
puts stderr "Try: '[file tail $autosetup(exe)] --debug' for a full stack trace"
|
||||
}
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -89,13 +89,15 @@ switch -glob -- [get-define host] {
|
||||
define SH_SOPREFIX -Wl,-h,
|
||||
}
|
||||
}
|
||||
*-*-hpux {
|
||||
# XXX: These haven't been tested
|
||||
define SHOBJ_CFLAGS "+O3 +z"
|
||||
*-*-hpux* {
|
||||
define SHOBJ_CFLAGS +z
|
||||
define SHOBJ_LDFLAGS -b
|
||||
define SH_CFLAGS +z
|
||||
define SH_LDFLAGS -b
|
||||
define SH_LINKFLAGS -Wl,+s
|
||||
define LD_LIBRARY_PATH SHLIB_PATH
|
||||
define SH_LINKRPATH "-Wl,+b -Wl,%s"
|
||||
define SH_SOPREFIX -Wl,+h,
|
||||
define STRIPLIBFLAGS -Wl,-s
|
||||
}
|
||||
*-*-haiku {
|
||||
define SHOBJ_CFLAGS ""
|
||||
|
||||
+12
-25
@@ -9132,7 +9132,7 @@ int Jim_StringEqObj(Jim_Obj *aObjPtr, Jim_Obj *bObjPtr)
|
||||
const char *sA = Jim_GetString(aObjPtr, &Alen);
|
||||
const char *sB = Jim_GetString(bObjPtr, &Blen);
|
||||
|
||||
return Alen == Blen && *sA == *sB && memcmp(sA, sB, Alen) == 0;
|
||||
return Alen == Blen && memcmp(sA, sB, Alen) == 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10242,7 +10242,7 @@ static int JimCommandsHT_KeyCompare(void *privdata, const void *key1, const void
|
||||
int len1, len2;
|
||||
const char *str1 = Jim_GetStringNoQualifier((Jim_Obj *)key1, &len1);
|
||||
const char *str2 = Jim_GetStringNoQualifier((Jim_Obj *)key2, &len2);
|
||||
return len1 == len2 && *str1 == *str2 && memcmp(str1, str2, len1) == 0;
|
||||
return len1 == len2 && memcmp(str1, str2, len1) == 0;
|
||||
}
|
||||
|
||||
static void JimCommandsHT_ValDestructor(void *interp, void *val)
|
||||
@@ -13864,13 +13864,6 @@ static int JimExprOpNumUnary(Jim_Interp *interp, struct JimExprNode *node)
|
||||
case JIM_EXPROP_NOT:
|
||||
wC = !bA;
|
||||
break;
|
||||
case JIM_EXPROP_UNARYPLUS:
|
||||
case JIM_EXPROP_UNARYMINUS:
|
||||
rc = JIM_ERR;
|
||||
Jim_SetResultFormatted(interp,
|
||||
"can't use non-numeric string as operand of \"%s\"",
|
||||
node->type == JIM_EXPROP_UNARYPLUS ? "+" : "-");
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
@@ -19875,22 +19868,16 @@ wrongargs:
|
||||
}
|
||||
else if (errorCodeObj) {
|
||||
int len = Jim_ListLength(interp, argv[idx + 1]);
|
||||
int i;
|
||||
|
||||
if (len > Jim_ListLength(interp, errorCodeObj)) {
|
||||
ret = JIM_OK;
|
||||
|
||||
ret = -1;
|
||||
}
|
||||
else {
|
||||
int i;
|
||||
ret = JIM_OK;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
Jim_Obj *matchObj = Jim_ListGetIndex(interp, argv[idx + 1], i);
|
||||
Jim_Obj *objPtr = Jim_ListGetIndex(interp, errorCodeObj, i);
|
||||
if (Jim_StringCompareObj(interp, matchObj, objPtr, 0) != 0) {
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
for (i = 0; i < len; i++) {
|
||||
Jim_Obj *matchObj = Jim_ListGetIndex(interp, argv[idx + 1], i);
|
||||
Jim_Obj *objPtr = Jim_ListGetIndex(interp, errorCodeObj, i);
|
||||
if (Jim_StringCompareObj(interp, matchObj, objPtr, 0) != 0) {
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20266,7 +20253,7 @@ static int Jim_DictCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
|
||||
}
|
||||
|
||||
case OPT_SET:
|
||||
return Jim_SetDictKeysVector(interp, argv[2], argv + 3, argc - 4, argv[argc - 1], JIM_ERRMSG | JIM_UNSHARED);
|
||||
return Jim_SetDictKeysVector(interp, argv[2], argv + 3, argc - 4, argv[argc - 1], JIM_ERRMSG);
|
||||
|
||||
case OPT_EXISTS:{
|
||||
int rc = Jim_DictKeysVector(interp, argv[2], argv + 3, argc - 3, &objPtr, JIM_NONE);
|
||||
@@ -20278,7 +20265,7 @@ static int Jim_DictCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
|
||||
}
|
||||
|
||||
case OPT_UNSET:
|
||||
if (Jim_SetDictKeysVector(interp, argv[2], argv + 3, argc - 3, NULL, JIM_UNSHARED) != JIM_OK) {
|
||||
if (Jim_SetDictKeysVector(interp, argv[2], argv + 3, argc - 3, NULL, JIM_NONE) != JIM_OK) {
|
||||
return JIM_ERR;
|
||||
}
|
||||
return JIM_OK;
|
||||
|
||||
+63
-14
@@ -378,8 +378,8 @@ proc proj-bin-define {binName {defName {}}} {
|
||||
#
|
||||
# Despite using cc-path-progs to do the search, this function clears
|
||||
# any define'd name that function stores for the result (because the
|
||||
# caller has no sensible way of knowing which result it was unless
|
||||
# they pass only a single argument).
|
||||
# caller has no sensible way of knowing which [define] name it has
|
||||
# unless they pass only a single argument).
|
||||
#
|
||||
proc proj-first-bin-of {args} {
|
||||
set rc ""
|
||||
@@ -451,7 +451,9 @@ proc proj-opt-set {flag {val 1}} {
|
||||
# @proj-opt-exists flag
|
||||
#
|
||||
# Returns 1 if the given flag has been defined as a legal configure
|
||||
# option, else returns 0.
|
||||
# option, else returns 0. Options set via proj-opt-set "exist" for
|
||||
# this purpose even if they were not defined via autosetup's
|
||||
# [options] function.
|
||||
#
|
||||
proc proj-opt-exists {flag} {
|
||||
expr {$flag in $::autosetup(options)};
|
||||
@@ -704,11 +706,20 @@ proc proj-file-write {args} {
|
||||
}
|
||||
|
||||
#
|
||||
# @proj-check-compile-commands ?configFlag?
|
||||
# @proj-check-compile-commands ?-assume-for-clang? ?configFlag?
|
||||
#
|
||||
# Checks the compiler for compile_commands.json support. If passed an
|
||||
# argument it is assumed to be the name of an autosetup boolean config
|
||||
# which controls whether to run/skip this check.
|
||||
# Checks the compiler for compile_commands.json support. If
|
||||
# $configFlag is not empty then it is assumed to be the name of an
|
||||
# autosetup boolean config which controls whether to run/skip this
|
||||
# check.
|
||||
#
|
||||
# If -assume-for-clang is provided and $configFlag is not empty and CC
|
||||
# matches *clang* and no --$configFlag was explicitly provided to the
|
||||
# configure script then behave as if --$configFlag had been provided.
|
||||
# To disable that assumption, either don't pass -assume-for-clang or
|
||||
# pass --$configFlag=0 to the configure script. (The reason for this
|
||||
# behavior is that clang supports compile-commands but some other
|
||||
# compilers report false positives with these tests.)
|
||||
#
|
||||
# Returns 1 if supported, else 0, and defines HAVE_COMPILE_COMMANDS to
|
||||
# that value. Defines MAKE_COMPILATION_DB to "yes" if supported, "no"
|
||||
@@ -716,12 +727,38 @@ proc proj-file-write {args} {
|
||||
# HAVE_COMPILE_COMMANDS is preferred.
|
||||
#
|
||||
# ACHTUNG: this test has a long history of false positive results
|
||||
# because of compilers reacting differently to the -MJ flag.
|
||||
# because of compilers reacting differently to the -MJ flag. Because
|
||||
# of this, it is recommended that this support be an opt-in feature,
|
||||
# rather than an on-by-default default one. That is: in the
|
||||
# configure script define the option as
|
||||
# {--the-flag-name=0 => {Enable ....}}
|
||||
#
|
||||
proc proj-check-compile-commands {{configFlag {}}} {
|
||||
proc proj-check-compile-commands {args} {
|
||||
set i 0
|
||||
set configFlag {}
|
||||
set fAssumeForClang 0
|
||||
set doAssume 0
|
||||
msg-checking "compile_commands.json support... "
|
||||
if {"" ne $configFlag && ![proj-opt-truthy $configFlag]} {
|
||||
msg-result "explicitly disabled"
|
||||
if {"-assume-for-clang" eq [lindex $args 0]} {
|
||||
lassign $args - configFlag
|
||||
incr fAssumeForClang
|
||||
} elseif {1 == [llength $args]} {
|
||||
lassign $args configFlag
|
||||
} else {
|
||||
proj-error "Invalid arguments"
|
||||
}
|
||||
if {1 == $fAssumeForClang && "" ne $configFlag} {
|
||||
if {[string match *clang* [get-define CC]]
|
||||
&& ![proj-opt-was-provided $configFlag]
|
||||
&& ![proj-opt-truthy $configFlag]} {
|
||||
proj-indented-notice [subst -nocommands -nobackslashes {
|
||||
CC appears to be clang, so assuming that --$configFlag is likely
|
||||
to work. To disable this assumption use --$configFlag=0.}]
|
||||
incr doAssume
|
||||
}
|
||||
}
|
||||
if {!$doAssume && "" ne $configFlag && ![proj-opt-truthy $configFlag]} {
|
||||
msg-result "check disabled. Use --${configFlag} to enable it."
|
||||
define HAVE_COMPILE_COMMANDS 0
|
||||
define MAKE_COMPILATION_DB no
|
||||
return 0
|
||||
@@ -730,7 +767,7 @@ proc proj-check-compile-commands {{configFlag {}}} {
|
||||
# This test reportedly incorrectly succeeds on one of
|
||||
# Martin G.'s older systems. drh also reports a false
|
||||
# positive on an unspecified older Mac system.
|
||||
msg-result "compiler supports compile_commands.json"
|
||||
msg-result "compiler supports -MJ. Assuming it's useful for compile_commands.json"
|
||||
define MAKE_COMPILATION_DB yes; # deprecated
|
||||
define HAVE_COMPILE_COMMANDS 1
|
||||
return 1
|
||||
@@ -1133,6 +1170,10 @@ proc proj-check-rpath {} {
|
||||
if {"" eq $wl} {
|
||||
set wl [proj-cc-check-Wl-flag -R$lp]
|
||||
}
|
||||
if {"" eq $wl} {
|
||||
# HP-UX: https://sqlite.org/forum/forumpost/d80ecdaddd
|
||||
set wl [proj-cc-check-Wl-flag +b $lp]
|
||||
}
|
||||
define LDFLAGS_RPATH $wl
|
||||
}
|
||||
}
|
||||
@@ -1142,7 +1183,7 @@ proc proj-check-rpath {} {
|
||||
#
|
||||
# @proj-check-soname ?libname?
|
||||
#
|
||||
# Checks whether CC supports the -Wl,soname,lib... flag. If so, it
|
||||
# Checks whether CC supports the -Wl,-soname,lib... flag. If so, it
|
||||
# returns 1 and defines LDFLAGS_SONAME_PREFIX to the flag's prefix, to
|
||||
# which the client would need to append "libwhatever.N". If not, it
|
||||
# returns 0 and defines LDFLAGS_SONAME_PREFIX to an empty string.
|
||||
@@ -1158,6 +1199,10 @@ proc proj-check-soname {{libname "libfoo.so.0"}} {
|
||||
if {[cc-check-flags "-Wl,-soname,${libname}"]} {
|
||||
define LDFLAGS_SONAME_PREFIX "-Wl,-soname,"
|
||||
return 1
|
||||
} elseif {[cc-check-flags "-Wl,+h,${libname}"]} {
|
||||
# HP-UX: https://sqlite.org/forum/forumpost/d80ecdaddd
|
||||
define LDFLAGS_SONAME_PREFIX "-Wl,+h,"
|
||||
return 1
|
||||
} else {
|
||||
define LDFLAGS_SONAME_PREFIX ""
|
||||
return 0
|
||||
@@ -1643,7 +1688,11 @@ proc proj-tweak-default-env-dirs {} {
|
||||
# processing the file. In the context of that script, the vars
|
||||
# $dotInsIn and $dotInsOut will be set to the input and output file
|
||||
# names. This can be used, for example, to make the output file
|
||||
# executable or perform validation on its contents.
|
||||
# executable or perform validation on its contents:
|
||||
#
|
||||
## proj-dot-ins-append my.sh.in my.sh {
|
||||
## catch {exec chmod u+x $dotInsOut}
|
||||
## }
|
||||
#
|
||||
# See [proj-dot-ins-process], [proj-dot-ins-list]
|
||||
#
|
||||
|
||||
+55
-30
@@ -1,7 +1,7 @@
|
||||
# This file holds functions for autosetup which are specific to the
|
||||
# sqlite build tree. They are in this file, instead of auto.def, so
|
||||
# that they can be reused in the autoconf sub-tree. This file requires
|
||||
# functions from proj.tcl.
|
||||
# functions from the project-agnostic proj.tcl.
|
||||
|
||||
if {[string first " " $autosetup(srcdir)] != -1} {
|
||||
user-error "The pathname of the source tree\
|
||||
@@ -11,7 +11,7 @@ if {[string first " " $autosetup(builddir)] != -1} {
|
||||
user-error "The pathname of the build directory\
|
||||
may not contain space characters"
|
||||
}
|
||||
#parray ::autosetup; exit 0
|
||||
|
||||
use proj
|
||||
#
|
||||
# We want the package version info to be emitted early on, but doing
|
||||
@@ -69,7 +69,8 @@ array set sqliteConfig [subst [proj-strip-hash-comments {
|
||||
|
||||
#
|
||||
# Default value for the --all flag. Can hypothetically be modified
|
||||
# by non-canonical builds.
|
||||
# by non-canonical builds (it was added for a Tcl extension build
|
||||
# mode which was eventually removed).
|
||||
#
|
||||
all-flag-default 0
|
||||
}]]
|
||||
@@ -92,7 +93,7 @@ array set sqliteConfig [subst [proj-strip-hash-comments {
|
||||
# sqlite-configure BUILD_NAME { build-specific configure script }
|
||||
#
|
||||
# There are snippets of build-mode-specific decision-making in
|
||||
# [sqlite-configure-finalize]
|
||||
# [sqlite-configure-finalize], which gets run after $configScript.
|
||||
proc sqlite-configure {buildMode configScript} {
|
||||
proj-assert {$::sqliteConfig(build-mode) eq "unknown"} \
|
||||
"sqlite-configure must not be called more than once"
|
||||
@@ -112,8 +113,10 @@ proc sqlite-configure {buildMode configScript} {
|
||||
#
|
||||
# Reference: https://msteveb.github.io/autosetup/developer/
|
||||
#
|
||||
# All configure flags must be described in an 'options' call. The
|
||||
# general syntax is:
|
||||
# All configure flags must be described in one or more calls to
|
||||
# autosetup's [options] and [options-add] functions. The general
|
||||
# syntax of the single argument to those functions is a list contain
|
||||
# a mapping of flags to help text:
|
||||
#
|
||||
# FLAG => {Help text}
|
||||
#
|
||||
@@ -164,13 +167,18 @@ proc sqlite-configure {buildMode configScript} {
|
||||
########################################################################
|
||||
set allFlags {
|
||||
# Structure: a list of M {Z} pairs, where M is a descriptive
|
||||
# option group name and Z is a list of X Y pairs. X is a list of
|
||||
# option group name and Z is a list of X Y pairs. X is a list of
|
||||
# $buildMode name(s) to which the Y flags apply, or {*} to apply
|
||||
# to all builds. Y is a {block} in the form expected by
|
||||
# autosetup's [options] command. Each block which is applicable
|
||||
# to $buildMode is appended to a new list before that list is
|
||||
# passed on to [options]. The order of each Y and sub-Y is
|
||||
# retained, which is significant for rendering of --help.
|
||||
# autosetup's [options] and [options-add] command. Each block
|
||||
# which is applicable to $buildMode is passed on to
|
||||
# [options-add]. The order of each Y and sub-Y is retained, which
|
||||
# is significant for rendering of --help.
|
||||
#
|
||||
# Maintenance note: [options] does not support comments in
|
||||
# options, but we filter this object through
|
||||
# [proj-strip-hash-comments] to remove them before passing them on
|
||||
# to [options].
|
||||
|
||||
# When writing {help text blocks}, be aware that:
|
||||
#
|
||||
@@ -180,7 +188,7 @@ proc sqlite-configure {buildMode configScript} {
|
||||
# pretty-printed.
|
||||
#
|
||||
# B) Vars and commands are NOT expanded, but we use a [subst] call
|
||||
# below which will replace (only) var refs.
|
||||
# below which will replace (only) $var refs.
|
||||
|
||||
# Options for how to build the library
|
||||
build-modes {
|
||||
@@ -321,7 +329,7 @@ proc sqlite-configure {buildMode configScript} {
|
||||
Needed only by ext/wasm. Default=EMSDK env var.}
|
||||
|
||||
amalgamation-extra-src:FILES
|
||||
=> {Space-separated list of soure files to append as-is to the resulting
|
||||
=> {Space-separated list of source files to append as-is to the resulting
|
||||
sqlite3.c amalgamation file. May be provided multiple times.}
|
||||
}
|
||||
}
|
||||
@@ -337,7 +345,6 @@ proc sqlite-configure {buildMode configScript} {
|
||||
}
|
||||
{canonical autoconf} {
|
||||
rpath=1 => {Disable use of the rpath linker flag}
|
||||
|
||||
# soname: https://sqlite.org/src/forumpost/5a3b44f510df8ded
|
||||
soname:=legacy
|
||||
=> {SONAME for libsqlite3.so. "none", or not using this flag, sets no
|
||||
@@ -408,7 +415,6 @@ proc sqlite-configure {buildMode configScript} {
|
||||
# ^^^ lappend of [sqlite-custom-flags] introduces weirdness if
|
||||
# we delay [proj-strip-hash-comments] until after that.
|
||||
|
||||
|
||||
########################################################################
|
||||
# sqlite-custom.tcl is intended only for vendor-branch-specific
|
||||
# customization. See autosetup/README.md#branch-customization for
|
||||
@@ -426,6 +432,8 @@ proc sqlite-configure {buildMode configScript} {
|
||||
}
|
||||
}
|
||||
|
||||
#lappend allFlags just-testing {{*} {soname:=duplicateEntry => {x}}}
|
||||
|
||||
# Filter allFlags to create the set of [options] legal for this build
|
||||
foreach {group XY} [subst -nobackslashes -nocommands $allFlags] {
|
||||
foreach {X Y} $XY {
|
||||
@@ -434,7 +442,7 @@ proc sqlite-configure {buildMode configScript} {
|
||||
}
|
||||
}
|
||||
}
|
||||
#lappend opts "soname:=duplicateEntry => {x}"; #just testing
|
||||
|
||||
if {[catch {options {}} msg xopts]} {
|
||||
# Workaround for <https://github.com/msteveb/autosetup/issues/73>
|
||||
# where [options] behaves oddly on _some_ TCL builds when it's
|
||||
@@ -449,8 +457,9 @@ proc sqlite-configure {buildMode configScript} {
|
||||
|
||||
########################################################################
|
||||
# Runs "phase 1" of the configure process: after initial --flags
|
||||
# handling but before the build-specific parts are run. $buildMode
|
||||
# must be the mode which was passed to [sqlite-configure].
|
||||
# handling but before sqlite-configure's $configScript argument is
|
||||
# run. $buildMode must be the mode which was passed to
|
||||
# [sqlite-configure].
|
||||
proc sqlite-configure-phase1 {buildMode} {
|
||||
define PACKAGE_NAME sqlite
|
||||
define PACKAGE_URL {https://sqlite.org}
|
||||
@@ -492,6 +501,7 @@ proc sqlite-configure-phase1 {buildMode} {
|
||||
if {[file exists $srcdir/sqlite3.pc.in]} {
|
||||
proj-dot-ins-append $srcdir/sqlite3.pc.in
|
||||
}
|
||||
sqlite-handle-hpux; # must be relatively early so that other config tests can work
|
||||
}; # sqlite-configure-phase1
|
||||
|
||||
########################################################################
|
||||
@@ -1017,7 +1027,7 @@ proc sqlite-handle-emsdk {} {
|
||||
proc sqlite-get-readline-dir-list {} {
|
||||
# Historical note: the dirs list, except for the inclusion of
|
||||
# $prefix and some platform-specific dirs, originates from the
|
||||
# legacy configure script
|
||||
# legacy configure script.
|
||||
set dirs [list [get-define prefix]]
|
||||
switch -glob -- [get-define host] {
|
||||
*-linux-android {
|
||||
@@ -1035,7 +1045,7 @@ proc sqlite-get-readline-dir-list {} {
|
||||
if {[opt-val with-readline-ldflags] in {auto ""}} {
|
||||
# If the user did not supply their own --with-readline-ldflags
|
||||
# value, hijack that flag to inject options which are known to
|
||||
# work on a default Haiku installation.
|
||||
# work on Haiku OS installations.
|
||||
if {"" ne [glob -nocomplain /boot/system/lib/libreadline*]} {
|
||||
proj-opt-set with-readline-ldflags {-L/boot/system/lib -lreadline}
|
||||
}
|
||||
@@ -1085,8 +1095,8 @@ proc sqlite-get-readline-dir-list {} {
|
||||
# 4) Default to automatic search for optional readline
|
||||
#
|
||||
# 5) Try to find readline or editline. If it's not found AND the
|
||||
# corresponding --FEATURE flag was explicitly given, fail fatally,
|
||||
# else fail silently.
|
||||
# corresponding --FEATURE flag was explicitly given then fail
|
||||
# fatally, else fail non-fatally.
|
||||
proc sqlite-check-line-editing {} {
|
||||
msg-result "Checking for line-editing capability..."
|
||||
define HAVE_READLINE 0
|
||||
@@ -1099,7 +1109,7 @@ proc sqlite-check-line-editing {} {
|
||||
# if the library is not found.
|
||||
set libsForReadline {readline edit} ; # -l<LIB> names to check for readline().
|
||||
# The libedit check changes this.
|
||||
set editLibName "readline" ; # "readline" or "editline"
|
||||
set editLibName "readline" ; # "readline" or "editline"
|
||||
set editLibDef "HAVE_READLINE" ; # "HAVE_READLINE" or "HAVE_EDITLINE"
|
||||
set dirLn [opt-val with-linenoise]
|
||||
if {"" ne $dirLn} {
|
||||
@@ -1116,7 +1126,7 @@ proc sqlite-check-line-editing {} {
|
||||
foreach f $lnCOpts {
|
||||
if {[file exists $dirLn/$f]} {
|
||||
set lnC $dirLn/$f
|
||||
break;
|
||||
break
|
||||
}
|
||||
}
|
||||
if {"" eq $lnC} {
|
||||
@@ -1226,16 +1236,18 @@ proc sqlite-check-line-editing {} {
|
||||
set rlLib [opt-val with-readline-ldflags]
|
||||
#proc-debug "rlLib=$rlLib"
|
||||
if {$rlLib in {auto ""}} {
|
||||
set rlLib ""
|
||||
set libTerm ""
|
||||
if {[proj-check-function-in-lib tgetent "$editLibName ncurses curses termcap"]} {
|
||||
set rlLib "" ; # make sure it's not "auto", as we may append to it below
|
||||
set libTerm ""; # lib with tgetent(3)
|
||||
if {[proj-check-function-in-lib tgetent [list $editLibName ncurses curses termcap]]} {
|
||||
# ^^^ that libs list comes from the legacy configure script ^^^
|
||||
set libTerm [get-define lib_tgetent]
|
||||
undefine lib_tgetent
|
||||
}
|
||||
if {$editLibName eq $libTerm} {
|
||||
# tgetent(3) was found in the editing library
|
||||
set rlLib $libTerm
|
||||
} elseif {[proj-check-function-in-lib readline $libsForReadline $libTerm]} {
|
||||
# tgetent(3) was found in an external lib
|
||||
set rlLib [get-define lib_readline]
|
||||
lappend rlLib $libTerm
|
||||
undefine lib_readline
|
||||
@@ -1265,8 +1277,8 @@ proc sqlite-check-line-editing {} {
|
||||
msg-result "Using $editLibName flags: $rlInc $rlLib"
|
||||
# Check whether rl_completion_matches() has a signature we can use
|
||||
# and disable that sub-feature if it doesn't.
|
||||
if {![cctest \
|
||||
-cflags "$rlInc -D${editLibDef}" -libs $rlLib -nooutput 1 -source {
|
||||
if {![cctest -cflags "$rlInc -D${editLibDef}" -libs $rlLib -nooutput 1 \
|
||||
-source {
|
||||
#include <stdio.h>
|
||||
#ifdef HAVE_EDITLINE
|
||||
#include <editline/readline.h>
|
||||
@@ -1319,7 +1331,7 @@ proc sqlite-handle-line-editing {} {
|
||||
# - pkg-config: use only pkg-config to determine flags
|
||||
# - /path/to/icu-config: use that to determine flags
|
||||
#
|
||||
# If --with-icu-config is used as neither pkg-config nor icu-config
|
||||
# If --with-icu-config is used and neither pkg-config nor icu-config
|
||||
# are found, fail fatally.
|
||||
#
|
||||
# If both --with-icu-ldflags and --with-icu-config are provided, they
|
||||
@@ -1534,6 +1546,19 @@ proc sqlite-handle-mac-install-name {} {
|
||||
return $rc
|
||||
}
|
||||
|
||||
#
|
||||
# Checks specific to HP-UX.
|
||||
#
|
||||
proc sqlite-handle-hpux {} {
|
||||
switch -glob -- [get-define host] {
|
||||
*hpux* {
|
||||
if {[cc-check-flags "-Ae"]} {
|
||||
define-append CFLAGS -Ae
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
########################################################################
|
||||
# Handles the --dll-basename configure flag. [define]'s
|
||||
# SQLITE_DLL_BASENAME to the DLL's preferred base name (minus
|
||||
|
||||
+8
-12
@@ -14,6 +14,13 @@
|
||||
#ifndef _FTSINT_H
|
||||
#define _FTSINT_H
|
||||
|
||||
/*
|
||||
** Activate assert() only if SQLITE_TEST is enabled.
|
||||
*/
|
||||
#if !defined(NDEBUG) && !defined(SQLITE_DEBUG)
|
||||
# define NDEBUG 1
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
@@ -21,10 +28,6 @@
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#if !defined(NDEBUG) && !defined(SQLITE_DEBUG)
|
||||
# define NDEBUG 1
|
||||
#endif
|
||||
|
||||
/* FTS3/FTS4 require virtual tables */
|
||||
#ifdef SQLITE_OMIT_VIRTUALTABLE
|
||||
# undef SQLITE_ENABLE_FTS3
|
||||
@@ -44,7 +47,7 @@
|
||||
|
||||
/* If not building as part of the core, include sqlite3ext.h. */
|
||||
#ifndef SQLITE_CORE
|
||||
# include "sqlite3ext.h"
|
||||
# include "sqlite3ext.h"
|
||||
SQLITE_EXTENSION_INIT3
|
||||
#endif
|
||||
|
||||
@@ -186,13 +189,6 @@ typedef sqlite3_int64 i64; /* 8-byte signed integer */
|
||||
*/
|
||||
#define UNUSED_PARAMETER(x) (void)(x)
|
||||
|
||||
/*
|
||||
** Activate assert() only if SQLITE_TEST is enabled.
|
||||
*/
|
||||
#if !defined(NDEBUG) && !defined(SQLITE_DEBUG)
|
||||
# define NDEBUG 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
** The TESTONLY macro is used to enclose variable declarations or
|
||||
** other bits of code that are needed to support the arguments
|
||||
|
||||
+7
-14
@@ -60,21 +60,14 @@ typedef sqlite3_uint64 u64;
|
||||
# define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32))
|
||||
# define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64)
|
||||
|
||||
/* The uptr type is an unsigned integer large enough to hold a pointer
|
||||
/*
|
||||
** This macro is used in a single assert() within fts5 to check that an
|
||||
** allocation is aligned to an 8-byte boundary. But it is a complicated
|
||||
** macro to get right for multiple platforms without generating warnings.
|
||||
** So instead of reproducing the entire definition from sqliteInt.h, we
|
||||
** just do without this assert() for the rare non-amalgamation builds.
|
||||
*/
|
||||
#if defined(HAVE_STDINT_H)
|
||||
typedef uintptr_t uptr;
|
||||
#elif SQLITE_PTRSIZE==4
|
||||
typedef u32 uptr;
|
||||
#else
|
||||
typedef u64 uptr;
|
||||
#endif
|
||||
|
||||
#ifdef SQLITE_4_BYTE_ALIGNED_MALLOC
|
||||
# define EIGHT_BYTE_ALIGNMENT(X) ((((uptr)(X) - (uptr)0)&3)==0)
|
||||
#else
|
||||
# define EIGHT_BYTE_ALIGNMENT(X) ((((uptr)(X) - (uptr)0)&7)==0)
|
||||
#endif
|
||||
#define EIGHT_BYTE_ALIGNMENT(x) 1
|
||||
|
||||
/*
|
||||
** Macros needed to provide flexible arrays in a portable way
|
||||
|
||||
+8
-4
@@ -52,10 +52,12 @@
|
||||
** as the number of elements in the array. The virtual table steps through
|
||||
** the array, element by element.
|
||||
*/
|
||||
#include "sqlite3ext.h"
|
||||
SQLITE_EXTENSION_INIT1
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#ifndef SQLITE3_H
|
||||
# include "sqlite3ext.h"
|
||||
SQLITE_EXTENSION_INIT1
|
||||
# include <assert.h>
|
||||
# include <string.h>
|
||||
#endif
|
||||
#ifdef _WIN32
|
||||
struct iovec {
|
||||
void *iov_base;
|
||||
@@ -547,7 +549,9 @@ SQLITE_API int sqlite3_carray_init(
|
||||
const sqlite3_api_routines *pApi
|
||||
){
|
||||
int rc = SQLITE_OK;
|
||||
#ifdef SQLITE_EXTENSION_INIT2
|
||||
SQLITE_EXTENSION_INIT2(pApi);
|
||||
#endif
|
||||
#ifndef SQLITE_OMIT_VIRTUALTABLE
|
||||
rc = sqlite3_create_module(db, "carray", &carrayModule, 0);
|
||||
#ifdef SQLITE_TEST
|
||||
|
||||
+1
-1
@@ -32,7 +32,7 @@ SQLITE_API int sqlite3_carray_bind(
|
||||
void *aData, /* Pointer to array data */
|
||||
int nData, /* Number of data elements */
|
||||
int mFlags, /* CARRAY flags */
|
||||
void (*xDel)(void*) /* Destructgor for aData*/
|
||||
void (*xDel)(void*) /* Destructor for aData */
|
||||
);
|
||||
|
||||
/* Allowed values for the mFlags parameter to sqlite3_carray_bind().
|
||||
|
||||
+5
-38
@@ -197,8 +197,6 @@ struct CksmFile {
|
||||
char computeCksm; /* True to compute checksums.
|
||||
** Always true if reserve size is 8. */
|
||||
char verifyCksm; /* True to verify checksums */
|
||||
char isWal; /* True if processing a WAL file */
|
||||
char inCkpt; /* Currently doing a checkpoint */
|
||||
CksmFile *pPartner; /* Ptr from WAL to main-db, or from main-db to WAL */
|
||||
};
|
||||
|
||||
@@ -444,11 +442,9 @@ static int cksmRead(
|
||||
** (1) the size indicates that we are dealing with a complete
|
||||
** database page
|
||||
** (2) checksum verification is enabled
|
||||
** (3) we are not in the middle of checkpoint
|
||||
*/
|
||||
if( iAmt>=512 && (iAmt & (iAmt-1))==0 /* (1) */
|
||||
&& p->verifyCksm /* (2) */
|
||||
&& !p->inCkpt /* (3) */
|
||||
){
|
||||
u8 cksum[8];
|
||||
cksmCompute((u8*)zBuf, iAmt-8, cksum);
|
||||
@@ -489,7 +485,6 @@ static int cksmWrite(
|
||||
*/
|
||||
if( iAmt>=512
|
||||
&& p->computeCksm
|
||||
&& !p->inCkpt
|
||||
){
|
||||
cksmCompute((u8*)zBuf, iAmt-8, ((u8*)zBuf)+iAmt-8);
|
||||
}
|
||||
@@ -576,21 +571,6 @@ static int cksmFileControl(sqlite3_file *pFile, int op, void *pArg){
|
||||
/* Do not allow page size changes on a checksum database */
|
||||
return SQLITE_OK;
|
||||
}
|
||||
}else if( op==SQLITE_FCNTL_CKPT_START || op==SQLITE_FCNTL_CKPT_DONE ){
|
||||
p->inCkpt = op==SQLITE_FCNTL_CKPT_START;
|
||||
if( p->pPartner ) p->pPartner->inCkpt = p->inCkpt;
|
||||
}else if( op==SQLITE_FCNTL_CKSM_FILE ){
|
||||
/* This VFS needs to obtain a pointer to the corresponding database
|
||||
** file handle from within xOpen() calls to open wal files. To do this,
|
||||
** it uses the sqlite3_database_file_object() API to obtain a pointer
|
||||
** to the file-handle used by SQLite to access the db file. This is
|
||||
** fine if cksmvfs happens to be the top-level VFS, but not if there
|
||||
** are one or more wrapper VFS. To handle this case, this file-control
|
||||
** is used to extract the cksmvfs file-handle from any wrapper file
|
||||
** handle. */
|
||||
sqlite3_file **ppFile = (sqlite3_file**)pArg;
|
||||
*ppFile = (sqlite3_file*)p;
|
||||
return SQLITE_OK;
|
||||
}
|
||||
rc = pFile->pMethods->xFileControl(pFile, op, pArg);
|
||||
if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){
|
||||
@@ -611,8 +591,10 @@ static int cksmSectorSize(sqlite3_file *pFile){
|
||||
** Return the device characteristic flags supported by a cksm-file.
|
||||
*/
|
||||
static int cksmDeviceCharacteristics(sqlite3_file *pFile){
|
||||
int devchar = 0;
|
||||
pFile = ORIGFILE(pFile);
|
||||
return pFile->pMethods->xDeviceCharacteristics(pFile);
|
||||
devchar = pFile->pMethods->xDeviceCharacteristics(pFile);
|
||||
return (devchar & ~SQLITE_IOCAP_SUBPAGE_READ);
|
||||
}
|
||||
|
||||
/* Create a shared memory file mapping */
|
||||
@@ -689,7 +671,7 @@ static int cksmOpen(
|
||||
sqlite3_vfs *pSubVfs;
|
||||
int rc;
|
||||
pSubVfs = ORIGVFS(pVfs);
|
||||
if( (flags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_WAL))==0 ){
|
||||
if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
|
||||
return pSubVfs->xOpen(pSubVfs, zName, pFile, flags, pOutFlags);
|
||||
}
|
||||
p = (CksmFile*)pFile;
|
||||
@@ -698,19 +680,6 @@ static int cksmOpen(
|
||||
pFile->pMethods = &cksm_io_methods;
|
||||
rc = pSubVfs->xOpen(pSubVfs, zName, pSubFile, flags, pOutFlags);
|
||||
if( rc ) goto cksm_open_done;
|
||||
if( flags & SQLITE_OPEN_WAL ){
|
||||
sqlite3_file *pDb = sqlite3_database_file_object(zName);
|
||||
rc = pDb->pMethods->xFileControl(pDb, SQLITE_FCNTL_CKSM_FILE, (void*)&pDb);
|
||||
assert( rc==SQLITE_OK );
|
||||
p->pPartner = (CksmFile*)pDb;
|
||||
assert( p->pPartner->pPartner==0 );
|
||||
p->pPartner->pPartner = p;
|
||||
p->isWal = 1;
|
||||
p->computeCksm = p->pPartner->computeCksm;
|
||||
}else{
|
||||
p->isWal = 0;
|
||||
p->computeCksm = 0;
|
||||
}
|
||||
p->zFName = zName;
|
||||
cksm_open_done:
|
||||
if( rc ) pFile->pMethods = 0;
|
||||
@@ -820,9 +789,7 @@ static int cksmRegisterFunc(
|
||||
*/
|
||||
static int cksmRegisterVfs(void){
|
||||
int rc = SQLITE_OK;
|
||||
sqlite3_vfs *pOrig;
|
||||
if( sqlite3_vfs_find("cksmvfs")!=0 ) return SQLITE_OK;
|
||||
pOrig = sqlite3_vfs_find(0);
|
||||
sqlite3_vfs *pOrig = sqlite3_vfs_find(0);
|
||||
if( pOrig==0 ) return SQLITE_ERROR;
|
||||
cksm_vfs.iVersion = pOrig->iVersion;
|
||||
cksm_vfs.pAppData = pOrig;
|
||||
|
||||
@@ -290,4 +290,39 @@ do_execsql_test 5.4 {
|
||||
SELECT * FROM X1;
|
||||
} {1 1}
|
||||
|
||||
#--------------------------------------------------------------------
|
||||
reset_db
|
||||
do_execsql_test 6.0 {
|
||||
CREATE TABLE p1(a INTEGER PRIMARY KEY, b);
|
||||
CREATE TABLE c1(x INTEGER PRIMARY KEY, y REFERENCES p1);
|
||||
}
|
||||
|
||||
set ::cc [changeset_from_sql {
|
||||
INSERT INTO c1 VALUES(10, 20);
|
||||
}]
|
||||
|
||||
forcedelete test.db2
|
||||
sqlite3 db2 test.db2
|
||||
do_execsql_test -db db2 6.1 {
|
||||
CREATE TABLE c1(x INTEGER PRIMARY KEY, y REFERENCES p1);
|
||||
PRAGMA foreign_keys = ON;
|
||||
PRAGMA foreign_keys;
|
||||
} {1}
|
||||
|
||||
proc conflict_handler {args} {
|
||||
puts $args
|
||||
return "OMIT"
|
||||
}
|
||||
|
||||
do_test 6.2 {
|
||||
list [catch {sqlite3changeset_apply_v2 db2 $::cc conflict_handler} msg] $msg
|
||||
} {1 SQLITE_ERROR}
|
||||
|
||||
do_test 6.3.1 { sqlite3_errmsg db2 } {no such table: main.p1}
|
||||
do_test 6.3.2 { sqlite3_errcode db2 } {SQLITE_ERROR}
|
||||
|
||||
do_test 6.4 {
|
||||
catchsql { INSERT INTO c1 VALUES(100, 200) } db2
|
||||
} {1 {no such table: main.p1}}
|
||||
|
||||
finish_test
|
||||
|
||||
@@ -174,6 +174,147 @@ do_test 3.5 {
|
||||
{INSERT sqlite_stat1 CONFLICT {t xyz t sqlite_autoindex_xyz_1 t {100 1 1}} {t xyz t sqlite_autoindex_xyz_1 t {200 1 1}}}
|
||||
}]
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Test that the conflict-handler is invoked for conflicts caused by
|
||||
# DELETE ops even if SQLITE_CHANGESETAPPLY_IGNORENOOP is specified.
|
||||
#
|
||||
set ::conflict_list [list]
|
||||
proc xConflict {args} {
|
||||
lappend ::conflict_list $args
|
||||
return "OMIT"
|
||||
}
|
||||
|
||||
foreach {tn wo} {
|
||||
1 ""
|
||||
2 " WITHOUT ROWID "
|
||||
} {
|
||||
reset_db
|
||||
forcedelete test.db2
|
||||
do_execsql_test 4.$tn.0 "
|
||||
CREATE TABLE x1(a INTEGER PRIMARY KEY, b, c) $wo;
|
||||
INSERT INTO x1 VALUES(1, 'one', 'i');
|
||||
INSERT INTO x1 VALUES(2, 'two', 'ii');
|
||||
INSERT INTO x1 VALUES(3, 'three', 'iii');
|
||||
VACUUM INTO 'test.db2';
|
||||
"
|
||||
|
||||
set C [changeset_from_sql {
|
||||
DELETE FROM x1 WHERE a=2;
|
||||
}]
|
||||
|
||||
sqlite3 db2 test.db2
|
||||
do_execsql_test -db db2 4.$tn.1 {
|
||||
UPDATE x1 SET b='four hundred' WHERE a=2;
|
||||
}
|
||||
|
||||
do_test 4.$tn.2.1 {
|
||||
set ::conflict_list [list]
|
||||
sqlite3changeset_apply_v2 db2 $C xConflict
|
||||
set ::conflict_list
|
||||
} [list {*}{
|
||||
{DELETE x1 DATA {i 2 t two t ii} {i 2 t {four hundred} t ii}}
|
||||
}]
|
||||
|
||||
do_test 4.$tn.2.2 {
|
||||
set ::conflict_list [list]
|
||||
sqlite3changeset_apply_v2 -ignorenoop db2 $C xConflict
|
||||
set ::conflict_list
|
||||
} [list {*}{
|
||||
{DELETE x1 DATA {i 2 t two t ii} {i 2 t {four hundred} t ii}}
|
||||
}]
|
||||
}
|
||||
|
||||
foreach {tn wo} {
|
||||
1 ""
|
||||
2 " WITHOUT ROWID "
|
||||
} {
|
||||
reset_db
|
||||
forcedelete test.db2
|
||||
do_execsql_test 5.$tn.0 "
|
||||
PRAGMA foreign_keys = ON;
|
||||
CREATE TABLE p1(a INTEGER PRIMARY KEY, b, c) $wo;
|
||||
CREATE TABLE c1(a INTEGER PRIMARY KEY REFERENCES p1, b);
|
||||
INSERT INTO p1 VALUES(1, 'one', 'i');
|
||||
INSERT INTO p1 VALUES(2, 'two', 'ii');
|
||||
INSERT INTO p1 VALUES(3, 'three', 'iii');
|
||||
VACUUM INTO 'test.db2';
|
||||
"
|
||||
|
||||
set C [changeset_from_sql {
|
||||
DELETE FROM p1 WHERE a=2;
|
||||
}]
|
||||
|
||||
sqlite3 db2 test.db2
|
||||
do_execsql_test -db db2 5.$tn.1 {
|
||||
PRAGMA foreign_keys = ON;
|
||||
INSERT INTO c1 VALUES(2, 'xyz');
|
||||
}
|
||||
|
||||
do_test 5.$tn.2.1 {
|
||||
set ::conflict_list [list]
|
||||
sqlite3changeset_apply_v2 db2 $C xConflict
|
||||
set ::conflict_list
|
||||
} [list {*}{
|
||||
{FOREIGN_KEY 1}
|
||||
}]
|
||||
|
||||
# Reinsert the row deleted by test case 5.$tn.2.1
|
||||
execsql { INSERT INTO p1 VALUES(2, 'two', 'ii') } db2
|
||||
|
||||
do_test 5.$tn.2.2 {
|
||||
set ::conflict_list [list]
|
||||
sqlite3changeset_apply_v2 -ignorenoop db2 $C xConflict
|
||||
set ::conflict_list
|
||||
} [list {*}{
|
||||
{FOREIGN_KEY 1}
|
||||
}]
|
||||
}
|
||||
|
||||
foreach {tn wo} {
|
||||
1 ""
|
||||
2 " WITHOUT ROWID "
|
||||
} {
|
||||
reset_db
|
||||
forcedelete test.db2
|
||||
do_execsql_test 6.$tn.0 "
|
||||
CREATE TABLE x1(a INTEGER PRIMARY KEY, b, c) $wo;
|
||||
CREATE TABLE x2(x UNIQUE);
|
||||
|
||||
INSERT INTO x1 VALUES(1, 'one', 'i');
|
||||
INSERT INTO x1 VALUES(2, 'two', 'ii');
|
||||
INSERT INTO x1 VALUES(3, 'three', 'iii');
|
||||
VACUUM INTO 'test.db2';
|
||||
"
|
||||
|
||||
set C [changeset_from_sql {
|
||||
DELETE FROM x1 WHERE a=2;
|
||||
}]
|
||||
|
||||
sqlite3 db2 test.db2
|
||||
do_execsql_test -db db2 6.$tn.1 {
|
||||
INSERT INTO x2 VALUES(0);
|
||||
CREATE TRIGGER tr1 AFTER DELETE ON x1 BEGIN
|
||||
INSERT INTO x2 VALUES(0);
|
||||
END;
|
||||
}
|
||||
|
||||
do_test 6.$tn.2.1 {
|
||||
set ::conflict_list [list]
|
||||
sqlite3changeset_apply_v2 db2 $C xConflict
|
||||
set ::conflict_list
|
||||
} [list {*}{
|
||||
{DELETE x1 CONSTRAINT {i 2 t two t ii}}
|
||||
}]
|
||||
|
||||
breakpoint
|
||||
do_test 6.$tn.2.2 {
|
||||
set ::conflict_list [list]
|
||||
sqlite3changeset_apply_v2 -ignorenoop db2 $C xConflict
|
||||
set ::conflict_list
|
||||
} [list {*}{
|
||||
{DELETE x1 CONSTRAINT {i 2 t two t ii}}
|
||||
}]
|
||||
}
|
||||
|
||||
|
||||
finish_test
|
||||
|
||||
@@ -2815,6 +2815,19 @@ static int sessionAppendDelete(
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int sessionPrepare(
|
||||
sqlite3 *db,
|
||||
sqlite3_stmt **pp,
|
||||
char **pzErrmsg,
|
||||
const char *zSql
|
||||
){
|
||||
int rc = sqlite3_prepare_v2(db, zSql, -1, pp, 0);
|
||||
if( pzErrmsg && rc!=SQLITE_OK ){
|
||||
*pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db));
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
** Formulate and prepare a SELECT statement to retrieve a row from table
|
||||
** zTab in database zDb based on its primary key. i.e.
|
||||
@@ -2836,12 +2849,12 @@ static int sessionSelectStmt(
|
||||
int nCol, /* Number of columns in table */
|
||||
const char **azCol, /* Names of table columns */
|
||||
u8 *abPK, /* PRIMARY KEY array */
|
||||
sqlite3_stmt **ppStmt /* OUT: Prepared SELECT statement */
|
||||
sqlite3_stmt **ppStmt, /* OUT: Prepared SELECT statement */
|
||||
char **pzErrmsg /* OUT: Error message */
|
||||
){
|
||||
int rc = SQLITE_OK;
|
||||
char *zSql = 0;
|
||||
const char *zSep = "";
|
||||
int nSql = -1;
|
||||
int i;
|
||||
|
||||
SessionBuffer cols = {0, 0, 0};
|
||||
@@ -2921,7 +2934,7 @@ static int sessionSelectStmt(
|
||||
#endif
|
||||
|
||||
if( rc==SQLITE_OK ){
|
||||
rc = sqlite3_prepare_v2(db, zSql, nSql, ppStmt, 0);
|
||||
rc = sessionPrepare(db, ppStmt, pzErrmsg, zSql);
|
||||
}
|
||||
sqlite3_free(zSql);
|
||||
sqlite3_free(nooptest.aBuf);
|
||||
@@ -3085,7 +3098,7 @@ static int sessionGenerateChangeset(
|
||||
/* Build and compile a statement to execute: */
|
||||
if( rc==SQLITE_OK ){
|
||||
rc = sessionSelectStmt(db, 0, pSession->zDb,
|
||||
zName, pTab->bRowid, pTab->nCol, pTab->azCol, pTab->abPK, &pSel
|
||||
zName, pTab->bRowid, pTab->nCol, pTab->azCol, pTab->abPK, &pSel, 0
|
||||
);
|
||||
}
|
||||
|
||||
@@ -4294,6 +4307,7 @@ struct SessionApplyCtx {
|
||||
u8 bRebase; /* True to collect rebase information */
|
||||
u8 bIgnoreNoop; /* True to ignore no-op conflicts */
|
||||
int bRowid;
|
||||
char *zErr; /* Error message, if any */
|
||||
};
|
||||
|
||||
/* Number of prepared UPDATE statements to cache. */
|
||||
@@ -4519,7 +4533,7 @@ static int sessionDeleteRow(
|
||||
}
|
||||
|
||||
if( rc==SQLITE_OK ){
|
||||
rc = sqlite3_prepare_v2(db, (char *)buf.aBuf, buf.nBuf, &p->pDelete, 0);
|
||||
rc = sessionPrepare(db, &p->pDelete, &p->zErr, (char*)buf.aBuf);
|
||||
}
|
||||
sqlite3_free(buf.aBuf);
|
||||
|
||||
@@ -4546,7 +4560,7 @@ static int sessionSelectRow(
|
||||
){
|
||||
/* TODO */
|
||||
return sessionSelectStmt(db, p->bIgnoreNoop,
|
||||
"main", zTab, p->bRowid, p->nCol, p->azCol, p->abPK, &p->pSelect
|
||||
"main", zTab, p->bRowid, p->nCol, p->azCol, p->abPK, &p->pSelect, &p->zErr
|
||||
);
|
||||
}
|
||||
|
||||
@@ -4583,16 +4597,12 @@ static int sessionInsertRow(
|
||||
sessionAppendStr(&buf, ")", &rc);
|
||||
|
||||
if( rc==SQLITE_OK ){
|
||||
rc = sqlite3_prepare_v2(db, (char *)buf.aBuf, buf.nBuf, &p->pInsert, 0);
|
||||
rc = sessionPrepare(db, &p->pInsert, &p->zErr, (char*)buf.aBuf);
|
||||
}
|
||||
sqlite3_free(buf.aBuf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int sessionPrepare(sqlite3 *db, sqlite3_stmt **pp, const char *zSql){
|
||||
return sqlite3_prepare_v2(db, zSql, -1, pp, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
** Prepare statements for applying changes to the sqlite_stat1 table.
|
||||
** These are similar to those created by sessionSelectRow(),
|
||||
@@ -4602,14 +4612,14 @@ static int sessionPrepare(sqlite3 *db, sqlite3_stmt **pp, const char *zSql){
|
||||
static int sessionStat1Sql(sqlite3 *db, SessionApplyCtx *p){
|
||||
int rc = sessionSelectRow(db, "sqlite_stat1", p);
|
||||
if( rc==SQLITE_OK ){
|
||||
rc = sessionPrepare(db, &p->pInsert,
|
||||
rc = sessionPrepare(db, &p->pInsert, 0,
|
||||
"INSERT INTO main.sqlite_stat1 VALUES(?1, "
|
||||
"CASE WHEN length(?2)=0 AND typeof(?2)='blob' THEN NULL ELSE ?2 END, "
|
||||
"?3)"
|
||||
);
|
||||
}
|
||||
if( rc==SQLITE_OK ){
|
||||
rc = sessionPrepare(db, &p->pDelete,
|
||||
rc = sessionPrepare(db, &p->pDelete, 0,
|
||||
"DELETE FROM main.sqlite_stat1 WHERE tbl=?1 AND idx IS "
|
||||
"CASE WHEN length(?2)=0 AND typeof(?2)='blob' THEN NULL ELSE ?2 END "
|
||||
"AND (?4 OR stat IS ?3)"
|
||||
@@ -4833,7 +4843,7 @@ static int sessionConflictHandler(
|
||||
void *pCtx, /* First argument for conflict handler */
|
||||
int *pbReplace /* OUT: Set to true if PK row is found */
|
||||
){
|
||||
int res = 0; /* Value returned by conflict handler */
|
||||
int res = SQLITE_CHANGESET_OMIT;/* Value returned by conflict handler */
|
||||
int rc;
|
||||
int nCol;
|
||||
int op;
|
||||
@@ -4854,11 +4864,9 @@ static int sessionConflictHandler(
|
||||
|
||||
if( rc==SQLITE_ROW ){
|
||||
/* There exists another row with the new.* primary key. */
|
||||
if( p->bIgnoreNoop
|
||||
&& sqlite3_column_int(p->pSelect, sqlite3_column_count(p->pSelect)-1)
|
||||
if( 0==p->bIgnoreNoop
|
||||
|| 0==sqlite3_column_int(p->pSelect, sqlite3_column_count(p->pSelect)-1)
|
||||
){
|
||||
res = SQLITE_CHANGESET_OMIT;
|
||||
}else{
|
||||
pIter->pConflict = p->pSelect;
|
||||
res = xConflict(pCtx, eType, pIter);
|
||||
pIter->pConflict = 0;
|
||||
@@ -4872,7 +4880,9 @@ static int sessionConflictHandler(
|
||||
int nBlob = pIter->in.iNext - pIter->in.iCurrent;
|
||||
sessionAppendBlob(&p->constraints, aBlob, nBlob, &rc);
|
||||
return SQLITE_OK;
|
||||
}else{
|
||||
}else if( p->bIgnoreNoop==0 || op!=SQLITE_DELETE
|
||||
|| eType==SQLITE_CHANGESET_CONFLICT
|
||||
){
|
||||
/* No other row with the new.* primary key. */
|
||||
res = xConflict(pCtx, eType+1, pIter);
|
||||
if( res==SQLITE_CHANGESET_REPLACE ) rc = SQLITE_MISUSE;
|
||||
@@ -4970,7 +4980,7 @@ static int sessionApplyOneOp(
|
||||
|
||||
sqlite3_step(p->pDelete);
|
||||
rc = sqlite3_reset(p->pDelete);
|
||||
if( rc==SQLITE_OK && sqlite3_changes(p->db)==0 && p->bIgnoreNoop==0 ){
|
||||
if( rc==SQLITE_OK && sqlite3_changes(p->db)==0 ){
|
||||
rc = sessionConflictHandler(
|
||||
SQLITE_CHANGESET_DATA, p, pIter, xConflict, pCtx, pbRetry
|
||||
);
|
||||
@@ -5392,6 +5402,11 @@ static int sessionChangesetApply(
|
||||
db->flags &= ~((u64)SQLITE_FkNoAction);
|
||||
db->aDb[0].pSchema->schema_cookie -= 32;
|
||||
}
|
||||
|
||||
assert( rc!=SQLITE_OK || sApply.zErr==0 );
|
||||
sqlite3_set_errmsg(db, rc, sApply.zErr);
|
||||
sqlite3_free(sApply.zErr);
|
||||
|
||||
sqlite3_mutex_leave(sqlite3_db_mutex(db));
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -1114,6 +1114,12 @@ void sqlite3changegroup_delete(sqlite3_changegroup*);
|
||||
** update the "main" database attached to handle db with the changes found in
|
||||
** the changeset passed via the second and third arguments.
|
||||
**
|
||||
** All changes made by these functions are enclosed in a savepoint transaction.
|
||||
** If any other error (aside from a constraint failure when attempting to
|
||||
** write to the target database) occurs, then the savepoint transaction is
|
||||
** rolled back, restoring the target database to its original state, and an
|
||||
** SQLite error code returned.
|
||||
**
|
||||
** The fourth argument (xFilter) passed to these functions is the "filter
|
||||
** callback". This may be passed NULL, in which case all changes in the
|
||||
** changeset are applied to the database. For sqlite3changeset_apply() and
|
||||
@@ -1251,12 +1257,6 @@ void sqlite3changegroup_delete(sqlite3_changegroup*);
|
||||
** This can be used to further customize the application's conflict
|
||||
** resolution strategy.
|
||||
**
|
||||
** All changes made by these functions are enclosed in a savepoint transaction.
|
||||
** If any other error (aside from a constraint failure when attempting to
|
||||
** write to the target database) occurs, then the savepoint transaction is
|
||||
** rolled back, restoring the target database to its original state, and an
|
||||
** SQLite error code returned.
|
||||
**
|
||||
** If the output parameters (ppRebase) and (pnRebase) are non-NULL and
|
||||
** the input is a changeset (not a patchset), then sqlite3changeset_apply_v2()
|
||||
** may set (*ppRebase) to point to a "rebase" that may be used with the
|
||||
|
||||
+41
-23
@@ -1,11 +1,10 @@
|
||||
#######################################################################
|
||||
# This GNU makefile drives the build of the sqlite3 WASM
|
||||
# components. It is not part of the canonical build process.
|
||||
# This GNU makefile creates the canonical sqlite3 WASM builds.
|
||||
#
|
||||
# This build assumes a Linux platform and is not intended for
|
||||
# general-purpose client-level use, except for creating builds with
|
||||
# custom configurations. It is primarily intended for the sqlite
|
||||
# project's own development of the JS/WASM components.
|
||||
# custom configurations. It is primarily intended for the SQLite
|
||||
# project's own development of its JS/WASM components.
|
||||
#
|
||||
# Primary targets:
|
||||
#
|
||||
@@ -134,7 +133,10 @@ JS_BUILD_NAMES = sqlite3 sqlite3-wasmfs
|
||||
# - bundler-friendly = esm slightly tweaked for "bundler"
|
||||
# tools. Bundlers are invariably based on node.js, so these builds
|
||||
# are intended to be read at build-time by node.js but with a final
|
||||
# target of browsers.
|
||||
# target of browsers. All bundler-friendly builds are UNTESTED.
|
||||
# They are provided primarily for use by the community-supported
|
||||
# subproject which hosts npm builds of sqlite3, and they are
|
||||
# actively supported only to the extent needed by that subproject.
|
||||
#
|
||||
# - node = for use by node.js for node.js, as opposed to by node.js on
|
||||
# behalf of browser-side code (use bundler-friendly for that). Note
|
||||
@@ -451,6 +453,8 @@ emcc.WASM_BIGINT ?= 1
|
||||
# has shown -Oz to produce the smallest deliverables with only a
|
||||
# roughly 10% performance hit in the resulting WASM file compared to
|
||||
# -O2 (which consistently creates the fastest-running deliverables).
|
||||
# Build time suffers greatly compared to -O0, which is why -O0 is the
|
||||
# default.
|
||||
ifeq (,$(filter $(OPTIMIZED_TARGETS),$(MAKECMDGOALS)))
|
||||
emcc_opt ?= -O0
|
||||
else
|
||||
@@ -499,7 +503,7 @@ emcc_opt_full = $(emcc_opt) -g3
|
||||
#
|
||||
# Much practice has demonstrated that -O2 consistently gives the best
|
||||
# runtime speeds, but not by a large enough factor to rule out use of
|
||||
# -Oz when small deliverable size is a priority.
|
||||
# -Oz when smaller deliverable size is a priority.
|
||||
########################################################################
|
||||
|
||||
########################################################################
|
||||
@@ -583,9 +587,20 @@ $(SOAP.js.bld): $(SOAP.js)
|
||||
# them. Tools like wasm-objdump can be used to find the list of
|
||||
# imports but it's questionable whether a non-Emscripten tool could
|
||||
# realistically use that info to provide proper implementations.
|
||||
#
|
||||
# Sidebar: some of the imports are used soley by the Emscripten glue,
|
||||
# which the sqlite3 JS code does not rely on.
|
||||
#
|
||||
# 2025-09-04: the most significant WASM imports sqlite3.wasm relies on
|
||||
# are (A) sqlite3_malloc/sqlite3_free() (the memory-management APIs
|
||||
# used by the whole library) and (B) the libc proxies for POSIX I/O
|
||||
# emulation (arguably one of Emscripten's most convenient features
|
||||
# when building C code for WASM). If we eliminate the POSIX I/O
|
||||
# emulation then we could hypothetically eliminate all, or maybe all
|
||||
# but one, Emscripten import dependency. We would either need to add
|
||||
# our own POSIX emulation layer (not a trivial effort) or restrict the
|
||||
# library to use of only in-memory VFSes and the JS-side VFSes.
|
||||
#
|
||||
# sqlite3-api.js.in = the amalgamated sqlite3-api.js before it gets
|
||||
# preprocessed. It contains all of $(sqlite3-api.jses) but none of the
|
||||
# Emscripten-specific headers and footers.
|
||||
@@ -648,26 +663,27 @@ emcc.jsflags += -sSTRICT_JS=0
|
||||
# -sSTRICT=1 Causes failures about unknown symbols which the build
|
||||
# tools should be installing, e.g. __syscall_geteuid32
|
||||
|
||||
# -sENVIRONMENT values for the various build modes:
|
||||
# emcc -sENVIRONMENT values for the various build modes:
|
||||
emcc.environment.vanilla = web,worker
|
||||
emcc.environment.bundler-friendly = $(emcc.environment.vanilla)
|
||||
emcc.environment.esm = $(emcc.environment.vanilla)
|
||||
emcc.environment.node = node
|
||||
# Note that adding ",node" to the list for the other builds causes
|
||||
# Emscripten to generate code which confuses node: it cannot reliably
|
||||
# determine whether the build is for a browser or for node.
|
||||
# Adding ",node" to the list for the other builds causes Emscripten to
|
||||
# generate code which confuses node: it cannot reliably determine
|
||||
# whether the build is for a browser or for node. We neither build nor
|
||||
# test node builds on a regular basis. They are fully unsupported.
|
||||
|
||||
########################################################################
|
||||
# -sINITIAL_MEMORY: How much memory we need to start with is governed
|
||||
# at least in part by whether -sALLOW_MEMORY_GROWTH is enabled. If so,
|
||||
# we can start with less. If not, we need as much as we'll ever
|
||||
# possibly use (which, of course, we can't know for sure). Note,
|
||||
# however, that speedtest1 shows that performance for even moderate
|
||||
# workloads MAY suffer considerably if we start small and have to grow
|
||||
# at runtime. e.g. OPFS-backed (speedtest1 --size 75) take MAY take X
|
||||
# time with 16mb+ memory and 3X time when starting with 8MB. However,
|
||||
# such test results are inconsistent due to browser internals which
|
||||
# are opaque to us.
|
||||
# possibly use (which, of course, we can't know for sure). speedtest1
|
||||
# shows that performance for even moderate workloads MAY suffer
|
||||
# considerably if we start small and have to grow at runtime.
|
||||
# e.g. OPFS-backed (speedtest1 --size 75) take MAY take X time with
|
||||
# 16mb+ memory and 3X time when starting with 8MB. However, such test
|
||||
# results are inconsistent due to browser internals which are opaque
|
||||
# to us.
|
||||
#
|
||||
# 2024-03-04: emsdk 3.1.55 replaces INITIAL_MEMORY with INITIAL_HEAP,
|
||||
# but also says (in its changelog): "Note that it is currently not
|
||||
@@ -892,6 +908,8 @@ EXPORTED_FUNCTIONS.fiddle = $(dir.tmp)/EXPORTED_FUNCTIONS.fiddle
|
||||
# part, as it's unable to reliably determine whether the target is
|
||||
# a browser or node.
|
||||
#
|
||||
# We repeat: all node.js builds are 100% untested and unsupported.
|
||||
#
|
||||
########################################################################
|
||||
########################################################################
|
||||
# We have to ensure that we do not build $(sqlite3*.*js) in parallel
|
||||
@@ -921,8 +939,8 @@ ifneq (1,$(MAKING_CLEAN))
|
||||
# native makefile code. Somewhat surprisingly, moving that code generation
|
||||
# to C makes it slightly less illegible than the previous 3 options.
|
||||
#
|
||||
# Maintenance note: the various $(c-pp.D.XYZ) vars are defined in this
|
||||
# step.
|
||||
# Maintenance note: the various $(c-pp.D.XYZ) vars are defined via
|
||||
# $(bin.mkwb).
|
||||
bin.mkwb = ./mkwasmbuilds
|
||||
$(bin.mkwb): $(bin.mkwb).c $(MAKEFILE)
|
||||
$(CC) -o $@ $<
|
||||
@@ -1101,7 +1119,7 @@ $(eval $(call SQLITE.CALL.C-PP.FILTER,tester1.c-pp.js,tester1.mjs,$(c-pp.D.sqlit
|
||||
$(eval $(call SQLITE.CALL.C-PP.FILTER,tester1.c-pp.html,tester1.html))
|
||||
$(eval $(call SQLITE.CALL.C-PP.FILTER,tester1.c-pp.html,tester1-esm.html,$(c-pp.D.sqlite3-esm)))
|
||||
tester1: tester1.js tester1.mjs tester1.html tester1-esm.html
|
||||
# Note that we do not include $(dir.dout)/sqlite3-bundler-friendly.mjs in this
|
||||
# We do not include $(dir.dout)/sqlite3-bundler-friendly.mjs in this
|
||||
# because bundlers are client-specific.
|
||||
all quick: tester1
|
||||
quick: $(sqlite3.js)
|
||||
@@ -1140,7 +1158,7 @@ oz: clean
|
||||
########################################################################
|
||||
# Sub-makes...
|
||||
|
||||
# sqlite.org/fiddle application...
|
||||
# https://sqlite.org/fiddle application...
|
||||
include $(MAKEFILE.fiddle)
|
||||
|
||||
# Only add wasmfs if wasmfs.enable=1 or we're running (dist)clean
|
||||
@@ -1195,8 +1213,8 @@ push-testing:
|
||||
echo "SSH failed: it's likely that stale content will be served via old gzip files."
|
||||
|
||||
########################################################################
|
||||
# If we find a copy of the sqlite.org/wasm docs checked out, copy
|
||||
# certain files over to it, noting that some need automatable edits...
|
||||
# If we find a copy of https://sqlite.org/wasm checked out, copy
|
||||
# certain files over to it, applying some automated edits...
|
||||
wasm.docs.home ?= ../../../wasm
|
||||
wasm.docs.found = $(if $(wildcard $(wasm.docs.home)/api-index.md),\
|
||||
$(wildcard $(wasm.docs.home)),)
|
||||
|
||||
+4
-4
@@ -98,10 +98,10 @@ which (almost) all of the test and demo applications can be accessed.
|
||||
real utility when it's used in conjunction with the project's
|
||||
proprietary test suite, which most users don't have access to.)
|
||||
|
||||
Note that when serving this app via [althttpd][], it must be a version
|
||||
from 2022-09-26 or newer so that it recognizes the `--enable-sab`
|
||||
flag, which causes althttpd to emit two HTTP response headers which
|
||||
are required to enable JavaScript's `SharedArrayBuffer` and `Atomics`
|
||||
When serving this app via [althttpd][], it must be a version from
|
||||
2022-09-26 or newer so that it recognizes the `--enable-sab` flag,
|
||||
which causes althttpd to emit two HTTP response headers which are
|
||||
required to enable JavaScript's `SharedArrayBuffer` and `Atomics`
|
||||
APIs. Those APIs are required in order to enable the [OPFS][]-related
|
||||
features in the apps which use them.
|
||||
|
||||
|
||||
+25
-20
@@ -16,9 +16,9 @@ multiple JS files because:
|
||||
3. Certain components must be in their own standalone files in order
|
||||
to be loaded as JS Workers.
|
||||
|
||||
Note that the structure described here is the current state of things,
|
||||
as of this writing, but is not set in stone forever and may change
|
||||
at any time.
|
||||
The structure described here is the current state of things, as of
|
||||
this writing, but is not set in stone forever and may change at any
|
||||
time.
|
||||
|
||||
The overall idea is that the following files get concatenated
|
||||
together, in the listed order, the resulting file is loaded by a
|
||||
@@ -29,13 +29,15 @@ browser client:
|
||||
objects. This is exposed as a function, rather than objects, so that
|
||||
the next step can pass in a config object which abstracts away parts
|
||||
of the WASM environment, to facilitate plugging it in to arbitrary
|
||||
WASM toolchains.
|
||||
WASM toolchains. The bootstrapping function gets removed from the
|
||||
global scope in a later stage of the bootstrapping process.
|
||||
- **`../common/whwasmutil.js`**\
|
||||
A semi-third-party collection of JS/WASM utility code intended to
|
||||
replace much of the Emscripten glue. The sqlite3 APIs internally use
|
||||
these APIs instead of their Emscripten counterparts, in order to be
|
||||
more portable to arbitrary WASM toolchains. This API is
|
||||
configurable, in principle, for use with arbitrary WASM
|
||||
more portable to arbitrary WASM toolchains and help reduce
|
||||
regressions caused by toolchain-level behavioral changes. This API
|
||||
is configurable, in principle, for use with arbitrary WASM
|
||||
toolchains. It is "semi-third-party" in that it was created in order
|
||||
to support this tree but is standalone and maintained together
|
||||
with...
|
||||
@@ -48,8 +50,8 @@ browser client:
|
||||
- **`sqlite3-api-glue.js`**\
|
||||
Invokes functionality exposed by the previous two files to flesh out
|
||||
low-level parts of `sqlite3-api-prologue.js`. Most of these pieces
|
||||
related to populating the `sqlite3.capi.wasm` object. This file
|
||||
also deletes most global-scope symbols the above files create,
|
||||
involve populating the `sqlite3.capi.wasm` object. This file also
|
||||
deletes most global-scope symbols the above files create,
|
||||
effectively moving them into the scope being used for initializing
|
||||
the API.
|
||||
- **`<build>/sqlite3-api-build-version.js`**\
|
||||
@@ -60,8 +62,8 @@ browser client:
|
||||
Provides a high-level object-oriented wrapper to the lower-level C
|
||||
API, colloquially known as OO API #1. Its API is similar to other
|
||||
high-level sqlite3 JS wrappers and should feel relatively familiar
|
||||
to anyone familiar with such APIs. That said, it is not a "required
|
||||
component" and can be elided from builds which do not want it.
|
||||
to anyone familiar with such APIs. It is not a "required component"
|
||||
and can be elided from builds which do not want it.
|
||||
- **`sqlite3-api-worker1.js`**\
|
||||
A Worker-thread-based API which uses OO API #1 to provide an
|
||||
interface to a database which can be driven from the main Window
|
||||
@@ -96,7 +98,7 @@ browser client:
|
||||
amalgamation.
|
||||
- **`sqlite3-vfs-opfs-sahpool.c-pp.js`**\
|
||||
is another sqlite3 VFS supporting the [OPFS][], but uses a
|
||||
completely different approach that the above-listed one.
|
||||
completely different approach than the above-listed one.
|
||||
- **`sqlite3-api-cleanup.js`**\
|
||||
The previous files do not immediately extend the library. Instead
|
||||
they add callback functions to be called during its
|
||||
@@ -106,8 +108,11 @@ browser client:
|
||||
process, which is what finally executes the initialization code
|
||||
installed by the previous files. As of this writing, this code
|
||||
ensures that the previous files leave no more than a single global
|
||||
symbol installed. When adapting the API for non-Emscripten
|
||||
toolchains, this "should" be the only file where changes are needed.
|
||||
symbol installed - `sqlite3InitModule()`. When adapting the API for
|
||||
non-Emscripten toolchains, this "should" be the only file, of those
|
||||
in this list, where changes are needed. The Emscripten-specific
|
||||
pieces described below may also require counterparts in any as-yet
|
||||
hypothetical alternative build.
|
||||
|
||||
|
||||
**Files with the extension `.c-pp.js`** are intended [to be processed
|
||||
@@ -130,25 +135,25 @@ WASM-specific helper functions, at least one of which requires access
|
||||
to private/static `sqlite3.c` internals. `sqlite3.wasm` is compiled
|
||||
from this file rather than `sqlite3.c`.
|
||||
|
||||
The following files are part of the build process but are injected
|
||||
into the build-generated `sqlite3.js` along with `sqlite3-api.js`.
|
||||
The following Emscripten-specific files are injected into the
|
||||
build-generated `sqlite3.js` along with `sqlite3-api.js`.
|
||||
|
||||
- `extern-pre-js.js`\
|
||||
- **`extern-pre-js.js`**\
|
||||
Emscripten-specific header for Emscripten's `--extern-pre-js`
|
||||
flag. As of this writing, that file is only used for experimentation
|
||||
purposes and holds no code relevant to the production deliverables.
|
||||
- `pre-js.c-pp.js`\
|
||||
- **`pre-js.c-pp.js`**\
|
||||
Emscripten-specific header for Emscripten's `--pre-js` flag. This
|
||||
file is intended as a place to override certain Emscripten behavior
|
||||
before it starts up, but corner-case Emscripten bugs keep that from
|
||||
being a reality.
|
||||
- `post-js-header.js`\
|
||||
- **`post-js-header.js`**\
|
||||
Emscripten-specific header for the `--post-js` input. It opens up
|
||||
a lexical scope by starting a post-run handler for Emscripten.
|
||||
- `post-js-footer.js`\
|
||||
- **`post-js-footer.js`**\
|
||||
Emscripten-specific footer for the `--post-js` input. This closes
|
||||
off the lexical scope opened by `post-js-header.js`.
|
||||
- `extern-post-js.c-pp.js`\
|
||||
- **`extern-post-js.c-pp.js`**\
|
||||
Emscripten-specific header for Emscripten's `--extern-post-js`
|
||||
flag. This file overwrites the Emscripten-installed
|
||||
`sqlite3InitModule()` function with one which, after the module is
|
||||
|
||||
@@ -4,10 +4,9 @@
|
||||
a blank line for a sed-based kludge for the ES6 build. */
|
||||
/* extern-post-js.js must be appended to the resulting sqlite3.js
|
||||
file. It gets its name from being used as the value for the
|
||||
--extern-post-js=... Emscripten flag. Note that this code, unlike
|
||||
most of the associated JS code, runs outside of the
|
||||
Emscripten-generated module init scope, in the current
|
||||
global scope. */
|
||||
--extern-post-js=... Emscripten flag. This code, unlike most of the
|
||||
associated JS code, runs outside of the Emscripten-generated module
|
||||
init scope, in the current global scope. */
|
||||
//#if target=es6-module
|
||||
const toExportForESM =
|
||||
//#endif
|
||||
@@ -78,9 +77,9 @@ const toExportForESM =
|
||||
EmscriptenModule['ENVIRONMENT_IS_PTHREAD']){
|
||||
/** Workaround for wasmfs-generated worker, which calls this
|
||||
routine from each individual thread and requires that its
|
||||
argument be returned. The conditional criteria above are
|
||||
fragile, based solely on inspection of the offending code,
|
||||
not public Emscripten details. */
|
||||
argument be returned. The if() condition above is fragile,
|
||||
based solely on inspection of the offending code, not
|
||||
public Emscripten details. */
|
||||
//console.warn("sqlite3InitModule() returning E-module.",EmscriptenModule);
|
||||
return EmscriptenModule;
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ sqlite3InitModuleState.debugModule('globalThis.location =',globalThis.location);
|
||||
1) If URL param named the same as `path` is set, it is returned.
|
||||
|
||||
2) If sqlite3InitModuleState.sqlite3Dir is set, then (thatName + path)
|
||||
is returned (note that it's assumed to end with '/').
|
||||
is returned (it's assumed to end with '/').
|
||||
|
||||
3) If this code is running in the main UI thread AND it was loaded
|
||||
from a SCRIPT tag, the directory part of that URL is used
|
||||
|
||||
+25
-27
@@ -3,12 +3,11 @@
|
||||
#
|
||||
# Intended to include'd by ./GNUmakefile.
|
||||
#
|
||||
# 'make dist' rules for creating a distribution archive of the WASM/JS
|
||||
# pieces, noting that we only build a dist of the built files, not the
|
||||
# numerous pieces required to build them.
|
||||
# 'make dist' rules for creating a distribution archive of the SQLite
|
||||
# WASM/JS deliverables.
|
||||
#
|
||||
# Use 'make snapshot' to create "snapshot" releases. They use a
|
||||
# distinctly different zip file and top directory name to distinguish
|
||||
# Use 'make snapshot' to create "snapshot" releases. They use
|
||||
# distinctly different zip file and top directory names to distinguish
|
||||
# them from release builds.
|
||||
#######################################################################
|
||||
MAKEFILE.dist = $(lastword $(MAKEFILE_LIST))
|
||||
@@ -32,17 +31,17 @@ endif
|
||||
dist-name = $(dist-name-prefix)-TEMP
|
||||
|
||||
########################################################################
|
||||
# dist.build must be the name of a target which triggers the build of
|
||||
# the files to be packed into the dist archive. The intention is that
|
||||
# it be one of (o0, o1, o2, o3, os, oz), each of which uses like-named
|
||||
# -Ox optimization level flags. The o2 target provides the best
|
||||
# overall runtime speeds. The oz target provides slightly slower
|
||||
# speeds (roughly 10%) with significantly smaller WASM file
|
||||
# sizes. Note that -O2 (the o2 target) results in faster binaries than
|
||||
# both -O3 and -Os (the o3 and os targets) in all tests run to
|
||||
# date. Our general policy is that we want the smallest binaries for
|
||||
# dist zip files, so use the oz build unless there is a compelling
|
||||
# reason not to.
|
||||
# $(dist.build) must be the name of a target which triggers the build
|
||||
# of the files to be packed into the dist archive. The intention is
|
||||
# that it be one of (o0, o1, o2, o3, os, oz), each of which uses
|
||||
# like-named -Ox optimization level flags. The o2 target provides the
|
||||
# best overall runtime speeds. The oz target provides slightly slower
|
||||
# speeds (roughly 10%) with significantly smaller WASM file sizes. -O2
|
||||
# (the o2 target) consistently results in faster binaries than both
|
||||
# -O3 and -Os (the o3 and os targets) in all tests run to date. Our
|
||||
# general policy is that we want the smallest binaries for dist zip
|
||||
# files, so use the oz build unless there is a compelling reason not
|
||||
# to.
|
||||
dist.build ?= oz
|
||||
|
||||
dist-dir.top = $(dist-name)
|
||||
@@ -62,10 +61,6 @@ dist.common.extras = \
|
||||
$(wildcard $(dir.common)/*.css) \
|
||||
$(dir.common)/SqliteTestUtil.js
|
||||
|
||||
#$(info sqlite3-worker1-promiser.mjs = $(sqlite3-worker1-promiser.mjs))
|
||||
#$(info sqlite3-worker1.js = $(sqlite3-worker1.js))
|
||||
#$(info sqlite3-api.ext.jses = $(sqlite3-api.ext.jses))
|
||||
#$(info dist.jswasm.extras = $(dist.jswasm.extras))
|
||||
.PHONY: dist snapshot
|
||||
# DIST_STRIP_COMMENTS $(call)able to be used in stripping C-style
|
||||
# from the dist copies of certain files.
|
||||
@@ -94,16 +89,19 @@ STRIP_K2.js = $(sqlite3.js) $(sqlite3.mjs) \
|
||||
# dist's deps must be trimmed to non-generated files or
|
||||
# files which are _not_ cleaned up by the clean target.
|
||||
#
|
||||
# Note that we require $(bin.version-info) in order to figure out the
|
||||
# dist file's name, so cannot (without a recursive make) have the
|
||||
# target name equal to the archive name.
|
||||
# We require $(bin.version-info) in order to figure out the dist
|
||||
# file's name, so cannot (without a recursive make) have the target
|
||||
# name equal to the archive name.
|
||||
#
|
||||
# 2025-01-15: Emsdk 4.0.0 introduces, in its generated code, a regex
|
||||
# which contains the pattern /*. That, of course, confuses any C-style
|
||||
# comment-stripper which is not specifically JS-aware and smart enough
|
||||
# to know that it's in a regex or string literal. Because of that,
|
||||
# comment-stripping is currently disabled, which means the builds will
|
||||
# be significantly larger than before.
|
||||
# comment-stripping was briefly disabled, resulting in functionally
|
||||
# identical but significantly larger JS files. That issue with the
|
||||
# comment-stripper has been resolved, but $(apply_comment_stripper)
|
||||
# can be set to false to disable it if a similar problem arises.
|
||||
#
|
||||
#apply_comment_stripper = false
|
||||
apply_comment_stripper = true
|
||||
# ^^^ shell command true or false
|
||||
@@ -138,7 +136,7 @@ ifeq (,$(wasm.docs.found))
|
||||
snapshot: dist
|
||||
@echo "To upload the snapshot build to the wasm docs server:"; \
|
||||
echo "1) move $(dist-name-prefix)*.zip to the top of a wasm docs checkout."; \
|
||||
echo "2) run 'make uv-sync'"
|
||||
echo "2) From that checkout run 'make uv-sync'"
|
||||
else
|
||||
snapshot: dist
|
||||
@echo "Moving snapshot to [$(wasm.docs.found)]..."; \
|
||||
@@ -150,5 +148,5 @@ endif
|
||||
# copied into the new $(dist-name) dir.
|
||||
.PHONY: dist-clean
|
||||
clean: dist-clean
|
||||
dist-clean:
|
||||
dist-clean: # not to be confused with distclean
|
||||
rm -fr $(dist-name) $(wildcard sqlite-wasm-*.zip)
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
# POSIX Make compatible. "bmake" (BSD make) is available on most
|
||||
# Linux systems, so compatibility is relatively easy to test. As a
|
||||
# harmless exception, this file sometimes uses $(MAKEFILE_LIST) as a
|
||||
# dependency. That var, in GNU Make, lists all of the makefile
|
||||
# currently loaded.
|
||||
# dependency. That var, in GNU Make, holds a list of all of the
|
||||
# makefiles currently loaded.
|
||||
#
|
||||
# The variables listed below must be defined before this script is
|
||||
# invoked. This file will use defaults, very possibly invalid, for any
|
||||
@@ -62,8 +62,8 @@ AR.flags ?= cr
|
||||
#
|
||||
# $(B.exe) =
|
||||
#
|
||||
# File extension for executables on the build platform. ".exe" for
|
||||
# Windows and "" everywhere else.
|
||||
# File extension for executables on the build platform:. .exe for
|
||||
# Windows and empty everywhere else.
|
||||
#
|
||||
B.exe ?=
|
||||
#
|
||||
@@ -76,8 +76,8 @@ B.lib ?= .a
|
||||
#
|
||||
# $(T.exe) =
|
||||
#
|
||||
# File extension for executables on the target platform. ".exe" for
|
||||
# Windows and "" everywhere else.
|
||||
# File extension for executables on the target platform: .exe for
|
||||
# Windows and empty everywhere else.
|
||||
#
|
||||
T.exe ?= $(B.exe)
|
||||
#
|
||||
@@ -100,7 +100,7 @@ TCLSH_CMD ?= tclsh
|
||||
#
|
||||
# JimTCL is part of the autosetup suite and is suitable for all
|
||||
# current in-tree code-generation TCL jobs, but it requires that we
|
||||
# build it with non-default flags. Note that the build tree will, if
|
||||
# build it with non-default flags. The canonical build tree will, if
|
||||
# no system-level tclsh is found, also have a ./jimsh0 binary. That
|
||||
# one is a bare-bones build for the configure process, whereas we need
|
||||
# to build it with another option enabled for use with the various
|
||||
@@ -118,9 +118,10 @@ JIMSH ?= ./jimsh$(T.exe)
|
||||
# $(B.tclsh) =
|
||||
#
|
||||
# The TCL interpreter for in-tree code generation. May be either the
|
||||
# in-tree JimTCL ($(JIMSH)) or the canonical TCL ($(TCLSH_CMD). If
|
||||
# in-tree JimTCL ($(JIMSH)) or the canonical TCL ($(TCLSH_CMD)). If
|
||||
# it's JimTCL, it must be compiled with -DHAVE_REALPATH (Unix) or
|
||||
# -DHAVE__FULLPATH (Windows).
|
||||
# -DHAVE__FULLPATH (Windows) so that the Tcl function [file normalize]
|
||||
# can work.
|
||||
#
|
||||
B.tclsh ?= $(JIMSH)
|
||||
|
||||
@@ -253,20 +254,20 @@ EXTRA_SRC ?=
|
||||
# and ENABLE flags must be passed to the LEMON parser generator and
|
||||
# the mkkeywordhash tool as well. This is normally set by the
|
||||
# configure process, and passing a custom value to a
|
||||
# coonfigure-filtered Makefile may not work.
|
||||
# configure-filtered Makefile may not work.
|
||||
#
|
||||
# When using the canonical makefile, add $(OPTIONS)=... on the make
|
||||
# command line to append additional options to the
|
||||
# $(OPT_FEATURE_FLAGS). Note that some flags, because they influence
|
||||
# generation of the SQL parser, only work if the build is specifically
|
||||
# configured to account for them. Adding them later, when compiling
|
||||
# the amalgamation separately, may or may not work.
|
||||
# $(OPT_FEATURE_FLAGS). Some flags, because they influence generation
|
||||
# of the SQL parser, only work if the build is specifically configured
|
||||
# to account for them. Adding them later, when compiling the
|
||||
# amalgamation separately, may or may not work.
|
||||
#
|
||||
# $(OPTS)=... is another way of influencing C compilation. It is
|
||||
# distinctly separate from $(OPTIONS) and $(OPT_FEATURE_FLAGS) but,
|
||||
# like those, $(OPTS) applies to all invocations of $(T.cc) (and some
|
||||
# invocations of $(B.cc). The configure process does not set either of
|
||||
# $(OPTIONS) or $(OPTS).
|
||||
# invocations of $(B.cc)). The configure process does not set either
|
||||
# of $(OPTIONS) or $(OPTS).
|
||||
#
|
||||
OPT_FEATURE_FLAGS ?=
|
||||
#
|
||||
@@ -1123,7 +1124,9 @@ libsqlite3.LIB = libsqlite3$(T.lib)
|
||||
|
||||
#
|
||||
# libsqlite3.DLL.install-rules => the suffix of the symoblic name of
|
||||
# the makefile rules for installing the DLL.
|
||||
# the makefile rules for installing the DLL. Must be one of
|
||||
# (unix-generic, msys, mingw, cygwin, darwin) and a target named
|
||||
# install-dll-THATNAME is responsible for DLL installation.
|
||||
libsqlite3.DLL.install-rules ?= unix-generic
|
||||
|
||||
# Rules to build the LEMON compiler generator
|
||||
@@ -1686,7 +1689,7 @@ CFLAGS.tclextension = $(CFLAGS.intree_includes) $(CFLAGS.env) $(OPT_FEATURE_FLAG
|
||||
#
|
||||
# Build the SQLite TCL extension in a way that make it compatible
|
||||
# with whatever version of TCL is running as $TCLSH_CMD, possibly defined
|
||||
# by --with-tclsh=
|
||||
# by --with-tclsh=/path/to/tclsh.
|
||||
#
|
||||
tclextension: tclsqlite3.c
|
||||
$(TCLSH_CMD) $(TOP)/tool/buildtclext.tcl --build-only \
|
||||
@@ -1798,7 +1801,7 @@ TESTFIXTURE_SRC += $(TESTFIXTURE_SRC$(USE_AMALGAMATION))
|
||||
testfixture$(T.exe): $(T.tcl.env.sh) has_tclsh85 $(TESTFIXTURE_SRC)
|
||||
$(T.link.tcl) -DSQLITE_NO_SYNC=1 $(TESTFIXTURE_FLAGS) \
|
||||
-o $@ $(TESTFIXTURE_SRC) \
|
||||
$$TCL_LIB_SPEC $$TCL_INCLUDE_SPEC \
|
||||
$$TCL_LIB_SPEC $$TCL_INCLUDE_SPEC $$TCL_LIBS \
|
||||
$(LDFLAGS.libsqlite3)
|
||||
|
||||
coretestprogs: testfixture$(B.exe) sqlite3$(B.exe)
|
||||
@@ -1960,7 +1963,7 @@ xbin: sqltclsh$(T.exe) sqlite3_analyzer$(T.exe)
|
||||
|
||||
sqlite3_expert$(T.exe): $(TOP)/ext/expert/sqlite3expert.h $(TOP)/ext/expert/sqlite3expert.c \
|
||||
$(TOP)/ext/expert/expert.c sqlite3.c
|
||||
$(T.link) $(TOP)/ext/expert/sqlite3expert.h $(TOP)/ext/expert/sqlite3expert.c \
|
||||
$(T.link) $(TOP)/ext/expert/sqlite3expert.c \
|
||||
$(TOP)/ext/expert/expert.c sqlite3.c -o sqlite3_expert $(LDFLAGS.libsqlite3)
|
||||
xbin: sqlite3_expert$(T.exe)
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
C Fix\sa\sproblem\sbuilding\stestfixture\son\snon\sSQLITE_OS_WIN\splatforms.
|
||||
D 2025-08-12T18:57:02.694
|
||||
C Typo\sfixes.\s\sMake\ssqlite3_set_errmsg()\saccessible\sto\srun-time\sloadable\nextensions.
|
||||
D 2025-09-12T15:31:33.770
|
||||
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
|
||||
F Makefile.in a6c14b6906f5322920dd5d1ff9a84808337911068f2a6e777ec7088a87cbc3a8
|
||||
F Makefile.in 3ce07126d7e87c7464301482e161fdae6a51d0a2aa06b200b8f0000ef4d6163b
|
||||
F Makefile.linux-generic bd3e3cacd369821a6241d4ea1967395c962dfe3057e38cb0a435cee0e8b789d0
|
||||
F Makefile.msc b87ac9041d87f61fabd6074e6d8b71dd7f78c884a2307bbb9301f9d436ce9242
|
||||
F README.md e28077cfbef795e99c9c75ed95aa7257a1166709b562076441a8506ac421b7c1
|
||||
@@ -15,9 +15,9 @@ F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
|
||||
F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90
|
||||
F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2
|
||||
F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531
|
||||
F auto.def 82c32443a91c1062f7a48beec37dbb2d8d03447b1286bce8df5ebb6d8d353f8a
|
||||
F auto.def 44a0d1bf09d78355fc88251ccbf8e64e6341fd89c11de68a01c3645e53a2bade
|
||||
F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac
|
||||
F autoconf/Makefile.in d0926d2309e563b5ebdfd711e5c218533acab79829a05eef4e97c3a92e17bf42
|
||||
F autoconf/Makefile.in 306f500fce8cae9e1af9459f1ac7fe89ce46999594ef3fdc62dc9d7d651fb091
|
||||
F autoconf/Makefile.msc f15ad424ca2820df8e39d9157965710af0a64d87773706706a12ea4f96e3a0d8
|
||||
F autoconf/README.first f1d3876e9a7852c22f275a6f06814e64934cecbc0b5b9617d64849094c1fd136
|
||||
F autoconf/README.txt b749816b8452b3af994dc6d607394bef3df1736d7e09359f1087de8439a52807
|
||||
@@ -33,21 +33,21 @@ F autoconf/tea/teaish.tcl 81feb417e718ed75cdd7e2fdf6771f3da80dae97377a90c4d5b62b
|
||||
F autoconf/tea/teaish.test.tcl cfe94e1fb79dd078f650295be59843d470125e0cc3a17a1414c1fb8d77f4aea6
|
||||
F autosetup/LICENSE 41a26aebdd2cd185d1e2b210f71b7ce234496979f6b35aef2cbf6b80cbed4ce4
|
||||
F autosetup/README.autosetup a78ff8c4a3d2636a4268736672a74bf14a82f42687fcf0631a70c516075c031e
|
||||
F autosetup/README.md f324bb9f9bf1cc787122034df53fbfdfed28ee2657e6652b763d992ab0d04829
|
||||
F autosetup/autosetup 74a9782b68d07934510190fbd03fc6ad92e63f0ea3b5cbffa5f0bd271ad60f01 x
|
||||
F autosetup/README.md ce0f95980a687bb861bd830b76bc4b48513567be5cf5ee7004f4f3439ffe3841
|
||||
F autosetup/autosetup b16e44924c197783df67366762dda985b45d49ebc4af15f4054e3ee0e3b65169 x
|
||||
F autosetup/autosetup-config.guess dfa101c5e8220e864d5e9c72a85e87110df60260d36cb951ad0a85d6d9eaa463 x
|
||||
F autosetup/autosetup-config.sub a38fb074d0dece01cf919e9fb534a26011608aa8fa606490864295328526cd73 x
|
||||
F autosetup/autosetup-find-tclsh b08f883f5753cfff1ecb8581f98b314e190b7e3f3059798e274ae5f5aad571af x
|
||||
F autosetup/autosetup-test-tclsh 749d20defee533a3842139df47d700fc7a334a5da7bdbd444ae5331744b06c5f
|
||||
F autosetup/cc-db.tcl 6e0ed90146197a5a05b245e649975c07c548e30926b218ca3e1d4dc034b10a7b
|
||||
F autosetup/cc-lib.tcl 493c5935b5dd3bf9bd4eca89b07c8b1b1a9356d61783035144e21795facf7360
|
||||
F autosetup/cc-shared.tcl 4f024e94a47f427ba61de1739f6381ef0080210f9fae89112d5c1de1e5460d78
|
||||
F autosetup/cc-shared.tcl 163eda58c14cd662fd8a504bd2ad8a716ef4db7015dc1de0095d5de8dd601a4b
|
||||
F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e45f
|
||||
F autosetup/find_tclconfig.tcl e64886ffe3b982d4df42cd28ed91fe0b5940c2c5785e126c1821baf61bc86a7e
|
||||
F autosetup/jimsh0.c 563b966c137a4ce3c9333e5196723b7ac0919140a9d7989eb440463cd855c367
|
||||
F autosetup/jimsh0.c a57c16e65dcffc9c76e496757cb3f7fb47e01ecbd1631a0a5e01751fc856f049
|
||||
F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba
|
||||
F autosetup/proj.tcl 7eaa83ccb6f5b250ee9192fa914918b0e2075edacf984c75fbf82cc2a6449c6c
|
||||
F autosetup/sqlite-config.tcl abf71bdc45b136e9210034c8c8402d021cab5923b5d22e4773b24ee7e1f479b5
|
||||
F autosetup/proj.tcl ec30c4bc301b6e9eb937655744a7315f863f804fc66400d975bcf9352ac96a1d
|
||||
F autosetup/sqlite-config.tcl e06b0f64079c4b303a0544f0619f95a1f1f164cddca4068372949eac4149b6ee
|
||||
F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9
|
||||
F autosetup/teaish/README.txt b40071e6f8506500a2f7f71d5fc69e0bf87b9d7678dd9da1e5b4d0acbf40b1ca
|
||||
F autosetup/teaish/core.tcl aee092fc71986d1272b835ea7492bb55ffc213a289502e4f14da80cf67b7e3c3
|
||||
@@ -81,7 +81,7 @@ F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f
|
||||
F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d
|
||||
F ext/fts3/fts3.c 4f02858ab845a97bedf06e6cc1fba49a81fe5e00a26df68d0ad0f00a5814fa70
|
||||
F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe
|
||||
F ext/fts3/fts3Int.h d0f70d602be987501cf6eff86a06a0b5d0389929c6abe24972d59594e6f4cb03
|
||||
F ext/fts3/fts3Int.h ed9b8bc5ed5be402069651e49d4855cb849af706cf3fe68548f58a2c21eefc7f
|
||||
F ext/fts3/fts3_aux.c 7eab82a9cf0830f6551ba3abfdbe73ed39e322a4d3940ee82fbf723674ecd9f3
|
||||
F ext/fts3/fts3_expr.c 5c13796638d8192c388777166075cdc8bc4b6712024cd5b72c31acdbefce5984
|
||||
F ext/fts3/fts3_hash.c d9dba473741445789330c7513d4f65737c92df23c3212784312931641814672a
|
||||
@@ -107,7 +107,7 @@ F ext/fts3/unicode/mkunicode.tcl cbf5f7b5c8ce8014bad731f246f2e520eece908465de477
|
||||
F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb
|
||||
F ext/fts5/extract_api_docs.tcl 009cf59c77afa86d137b0cca3e3b1a5efbe2264faa2df233f9a7aa8563926d15
|
||||
F ext/fts5/fts5.h ff5d3cc88b29e41612bfb29eb723e29e38973de62ca75ba3e8f94ccb67f5b5f2
|
||||
F ext/fts5/fts5Int.h cc1e6ed28e1fbde71e4427ba6d15b0c73a4f8f119adeb4f7bcc97e3336fbbeac
|
||||
F ext/fts5/fts5Int.h 97f373ecedf024fa7bf23989c3e529132225c169e440fe1f48e9b28dfed05ddc
|
||||
F ext/fts5/fts5_aux.c da4a7a9a11ec15c6df0699d908915a209bcde48f0b04101461316b59f71abffb
|
||||
F ext/fts5/fts5_buffer.c f1e6d0324d7c55329d340673befc26681a372a4d36086caa8d1ec7d7c53066c7
|
||||
F ext/fts5/fts5_config.c e7d8dd062b44a66cd77e5a0f74f23a2354cd1f3f8575afb967b2773c3384f7f8
|
||||
@@ -361,9 +361,9 @@ F ext/misc/base85.c a70c885c5c9350261ea6e7b166038eab21a09cf4fceae856ce41fae9c221
|
||||
F ext/misc/basexx.c 89ad6b76558efbceb627afd5e2ef1d84b2e96d9aaf9b7ecb20e3d00b51be6fcf
|
||||
F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a
|
||||
F ext/misc/btreeinfo.c 8f5e6da2c82ec2f06ee0216e922370a436dafdbb06ffa7a552203515ff9e7ddf
|
||||
F ext/misc/carray.c 34fac63770971611c5285de0a9f0ac67d504eaf66be891f637add9290f1c76a5
|
||||
F ext/misc/carray.h 503209952ccf2431c7fd899ebb92bf46bf7635b38aace42ec8aa1b8d7b6e98a5
|
||||
F ext/misc/cksumvfs.c 3a7931dd30667be6348af919f3f9e6188dfd7646b42af8e399a499b327f5bd63
|
||||
F ext/misc/carray.c 1d32a060f60127ad38d5abd071b28443b77885b143da946a10ca16812e0f851e
|
||||
F ext/misc/carray.h 4bef8af4e9ddda024f5540cc4d456c3e4a4a7624d6315edf85dce1ce8419beb8
|
||||
F ext/misc/cksumvfs.c 9d7d0cf1a8893ac5d48922bfe9f3f217b4a61a6265f559263a02bb2001259913
|
||||
F ext/misc/closure.c 5559daf1daf742228431db929d1aa86dd535a4224cc634a81d2fd0d1e6ad7839
|
||||
F ext/misc/completion.c c3c8b3cc1293c34f04f8746a3adfbfedb43f00d113f8c984a1ed09433317e507
|
||||
F ext/misc/compress.c 2c79a74330e0e0ba6cb3f7397f8ba5af12d46377ef5d3ee075e12dd8a6ed57f0
|
||||
@@ -540,7 +540,7 @@ F ext/session/session4.test 823f6f018fcbb8dacf61e2960f8b3b848d492b094f8b495eae1d
|
||||
F ext/session/session5.test 716bc6fafd625ce60dfa62ae128971628c1a1169
|
||||
F ext/session/session6.test 35279f2ec45448cd2e24a61688219dc6cf7871757716063acf4a8b5455e1e926
|
||||
F ext/session/session8.test 326f3273abf9d5d2d7d559eee8f5994c4ea74a5d935562454605e6607ee29904
|
||||
F ext/session/session9.test 4e3aff62d6b4294498ddbe309076de06f4fddffad4fe5f5a6c033358b01df083
|
||||
F ext/session/session9.test 0c4a8fbe7a5031f50855f020f3408e1f07fd7859f1daa1629eadcec3422072d6
|
||||
F ext/session/sessionA.test 1feeab0b8e03527f08f2f1defb442da25480138f
|
||||
F ext/session/sessionB.test c4fb7f8a688787111606e123a555f18ee04f65bb9f2a4bb2aa71d55ce4e6d02c
|
||||
F ext/session/sessionC.test f8a5508bc059ae646e5ec9bdbca66ad24bc92fe99fda5790ac57e1f59fce2fdf
|
||||
@@ -567,19 +567,19 @@ F ext/session/sessioninvert.test 9018f6a7387ac745084b6374c5e1aa14d648b372e6e1181
|
||||
F ext/session/sessionmem.test f2a735db84a3e9e19f571033b725b0b2daf847f3f28b1da55a0c1a4e74f1de09
|
||||
F ext/session/sessionnoact.test 4c7ae5c7d351cb5323bca62b6b095592ad24bd90a6713c178b62ab0063d23e19
|
||||
F ext/session/sessionnoop.test a9366a36a95ef85f8a3687856ebef46983df399541174cb1ede2ee53b8011bc7
|
||||
F ext/session/sessionnoop2.test de4672dce88464396ec9f30ed08c6c01643a69c53ae540fadbbf6d30642d64e8
|
||||
F ext/session/sessionnoop2.test 5beecd3ffcfbc1ef199d3536e91cc3186b438d587531ff334b6b0fc9b7d8ef10
|
||||
F ext/session/sessionrebase.test 702378bdcb5062f1106e74457beca8797d09c113a81768734a58b197b5b334e2
|
||||
F ext/session/sessionrowid.test 85187c2f1b38861a5844868126f69f9ec62223a03449a98a80600a44396f7363
|
||||
F ext/session/sessionsize.test 8fcf4685993c3dbaa46a24183940ab9f5aa9ed0d23e5fb63bfffbdb56134b795
|
||||
F ext/session/sessionstat1.test 5e718d5888c0c49bbb33a7a4f816366db85f59f6a4f97544a806421b85dc2dec
|
||||
F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc
|
||||
F ext/session/sqlite3session.c 19e14bcca2fbc63a8022ffd708ea6e6986c4003a1e9bbca9b2989fd230362e15
|
||||
F ext/session/sqlite3session.h b81e8536ce4b83babafd700f4ff67017804b6c1d71df963b30d3972958e7f4a7
|
||||
F ext/session/sqlite3session.c 9cd47bfefb23c114b7a5d9ee5822d941398902f30516bf0ddfb131d94f8bb840
|
||||
F ext/session/sqlite3session.h 6641184274b1d46594e450793d39aa96053916043234fb9e653c661160a166a7
|
||||
F ext/session/test_session.c 8766b5973a6323934cb51248f621c3dc87ad2a98f023c3cc280d79e7d78d36fb
|
||||
F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c
|
||||
F ext/wasm/GNUmakefile 35e730a01b32481f5483ea5bd72c3d4609e25f34cb5aab9f85eb3eba6f0c4935
|
||||
F ext/wasm/GNUmakefile 89e18d6e4783841a5236930b988df27e02317b3ac440a1a5571de4a79df3c8e7
|
||||
F ext/wasm/README-dist.txt f01081a850ce38a56706af6b481e3a7878e24e42b314cfcd4b129f0f8427066a
|
||||
F ext/wasm/README.md b89605f65661cf35bf034ff6d43e448cc169b8017fc105d498e33b81218b482c
|
||||
F ext/wasm/README.md 66ace67ae98a45e4116f2ca5425b716887bcee4d64febee804ff6398e1ae9ec7
|
||||
F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff
|
||||
F ext/wasm/SQLTester/SQLTester.mjs 66e1adc3d79467b68e3e40614fd42c1a577c7e219ec0985db966eded52a941e5
|
||||
F ext/wasm/SQLTester/SQLTester.run.mjs 57f2adb33f43f2784abbf8026c1bfd049d8013af1998e7dcb8b50c89ffc332e0
|
||||
@@ -589,12 +589,12 @@ F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-core 2bcbbfe3b95c043ed6037e2708a2ee078
|
||||
F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-extras cb4fa8842c875b6ee99381523792975c5ebb7371bd27fbd1bd863a43c7f3505a
|
||||
F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-see fb29e62082a658f0d81102488414d422c393c4b20cc2f685b216bc566237957b
|
||||
F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287
|
||||
F ext/wasm/api/README.md c64ec8e84449c069e0217706d9d7d31b3bd53627228b2ba0c3cddbdc2350ca66
|
||||
F ext/wasm/api/extern-post-js.c-pp.js 3fcd904f1204685dea84e5ae90d8b7e65a1dcebab1e838386d8328b74cce46c9
|
||||
F ext/wasm/api/README.md 7f029c5fe83b3493931d2fb915e2febd3536267d538a56408a6fef284ea38d29
|
||||
F ext/wasm/api/extern-post-js.c-pp.js d8f5ffa354c790d89681d0a23594c02347d28046d60151bd598712fbdff6056c
|
||||
F ext/wasm/api/extern-pre-js.js cc61c09c7a24a07dbecb4c352453c3985170cec12b4e7e7e7a4d11d43c5c8f41
|
||||
F ext/wasm/api/post-js-footer.js 365405929f41ca0e6d389ed8a8da3f3c93e11d3ef43a90ae151e37fa9f75bf41
|
||||
F ext/wasm/api/post-js-header.js 53740d824e5d9027eb1e6fd59e216abbd2136740ce260ea5f0699ff2acb0a701
|
||||
F ext/wasm/api/pre-js.c-pp.js a614a2c82b12c4d96d8e3ba77330329efc53c4d56a8a7e60ade900f341866cfb
|
||||
F ext/wasm/api/pre-js.c-pp.js 58f823de197e2c10d76179aa05410a593b7ae03e1ece983bb42ffd818e8857e1
|
||||
F ext/wasm/api/sqlite3-api-cleanup.js 3ac1786e461ada63033143be8c3b00b26b939540661f3e839515bb92f2e35359
|
||||
F ext/wasm/api/sqlite3-api-glue.c-pp.js 0b76510f3650053bac67ca8947cb6ab9d050ad2218118a2e7796dd37be832ffa
|
||||
F ext/wasm/api/sqlite3-api-oo1.c-pp.js 852f2cd6acddbae487fc4f1c3ec952e6c1e2033aa4e6c7091d330d983c87c032
|
||||
@@ -628,7 +628,7 @@ F ext/wasm/demo-worker1-promiser.c-pp.html 635cf90685805e21772a5f7a35d1ace80f98a
|
||||
F ext/wasm/demo-worker1-promiser.c-pp.js af168699d3cab1c27ad2364ebe06cd49db300bdbf404e23b00d5742ed52816ba
|
||||
F ext/wasm/demo-worker1.html 2c178c1890a2beb5a5fecb1453e796d067a4b8d3d2a04d65ca2eb1ab2c68ef5d
|
||||
F ext/wasm/demo-worker1.js 08720227e98fa5b44761cf6e219269cee3e9dd0421d8d91459535da776950314
|
||||
F ext/wasm/dist.make c29018b4db479a4c170569393e5399f0625446123a7eb6ffb0677495292bb954
|
||||
F ext/wasm/dist.make 57f5da2f0de5a297b5a0bc39ffec736380050578240ab24d864c2ff1b3634a3b
|
||||
F ext/wasm/example_extra_init.c 2347cd69d19d839ef4e5e77b7855103a7fe3ef2af86f2e8c95839afd8b05862f
|
||||
F ext/wasm/fiddle.make ea505d11aa2a89551e1693ed4c71ee6a163364ca14f806dda295d0beb26ec0ea
|
||||
F ext/wasm/fiddle/fiddle-worker.js 50d3edf54c0c0e3657e876724ec2c10069f55f3e40af20864d72f6f6e9ad00f8
|
||||
@@ -665,7 +665,7 @@ F ext/wasm/tests/opfs/sahpool/sahpool-pausing.js f264925cfc82155de38cecb3d204c36
|
||||
F ext/wasm/tests/opfs/sahpool/sahpool-worker.js bd25a43fc2ab2d1bafd8f2854ad3943ef673f7c3be03e95ecf1612ff6e8e2a61
|
||||
F ext/wasm/wasmfs.make 411dd94b40406572caddf88392a1ccc4deed0f88d260516e59ca6e0c887ee861
|
||||
F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0
|
||||
F main.mk db007da34d6529993138c8445ef9610318ba3db5ef5166b545072b93ab27f5c5
|
||||
F main.mk d865589aa95918787659459f7dddd0680f99034e7b111fc161035d736c670a47
|
||||
F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271
|
||||
F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504
|
||||
F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421
|
||||
@@ -685,11 +685,11 @@ F src/btmutex.c 30dada73a819a1ef5b7583786370dce1842e12e1ad941e4d05ac29695528daea
|
||||
F src/btree.c cb5b8ceb9baa02a63a2f83dec09c4153e1cfbdf9c2adef5c62c26d2160eeb067
|
||||
F src/btree.h e823c46d87f63d904d735a24b76146d19f51f04445ea561f71cc3382fd1307f0
|
||||
F src/btreeInt.h 9c0f9ea5c9b5f4dcaea18111d43efe95f2ac276cd86d770dce10fd99ccc93886
|
||||
F src/build.c cc4f287348790bbb7219f7e8dee13b1c345c3377fcdd98eca866e7457ecd07e7
|
||||
F src/build.c 213a9d24c931ef4694564894cda8dac8dbeb1519d428fd2d7ae622ac357c05a5
|
||||
F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859
|
||||
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
||||
F src/date.c 9db4d604e699a73e10b8e85a44db074a1f04c0591a77e2abfd77703f50dce1e9
|
||||
F src/dbpage.c b3e218f8ed74fcbb7fa805df8ca669a3718d397617b3d8a8aac3307dc315c4d6
|
||||
F src/dbpage.c a6f7f16fde5656686b05705d41a4cb339db8262dc4d11699b7b40ba503db624e
|
||||
F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c
|
||||
F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42
|
||||
F src/expr.c 0cad74107489c688449d7fec47b605c61a75c6da707031dfc4c76d1ac75667b3
|
||||
@@ -705,7 +705,7 @@ F src/insert.c dfd311b0ac2d4f6359e62013db67799757f4d2cc56cca5c10f4888acfbbfa3fd
|
||||
F src/json.c cb87977b1ee25ee7d27505d65a9261b687395bf895342c8ba566b7c01aee2047
|
||||
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
|
||||
F src/loadext.c d7edd8e671237539d795d30daaf888908a2c82e99bade4c78f3be021e8b7d655
|
||||
F src/main.c eb46066bf2f0bec2dd89229572de5a9c479c47da134e2422e7a0056e9510cbee
|
||||
F src/main.c 8faccfa7dc8a470ac57f060948ff703da1f2dbedcd4cebc0a21caeb7facf7eef
|
||||
F src/malloc.c 410e570b30c26cc36e3372577df50f7a96ee3eed5b2b161c6b6b48773c650c5e
|
||||
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
||||
F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
|
||||
@@ -726,32 +726,32 @@ F src/os.h 1ff5ae51d339d0e30d8a9d814f4b8f8e448169304d83a7ed9db66a65732f3e63
|
||||
F src/os_common.h 6c0eb8dd40ef3e12fe585a13e709710267a258e2c8dd1c40b1948a1d14582e06
|
||||
F src/os_kv.c 4d39e1f1c180b11162c6dc4aa8ad34053873a639bac6baae23272fc03349986a
|
||||
F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d872107
|
||||
F src/os_unix.c 690107e26cc4e9809eeb9826c0efdbff4a42b9cc59d0f0b855ca3e6021e1ae73
|
||||
F src/os_unix.c b3da55bc4bb214b2bfb1e430b10e9d3ebcf6b11741921ab044c9b9539c8fcc4f
|
||||
F src/os_win.c f81a7cffdfe8c593a840895b3f64290714f0186b06302d2c397012252d830374
|
||||
F src/os_win.h 4c247cdb6d407c75186c94a1e84d5a22cbae4adcec93fcae8d2bc1f956fd1f19
|
||||
F src/pager.c 23c0f17deb892da6b32fef1f465507df7ab5cd01d774288cb43695658a649259
|
||||
F src/pager.c ee48e0cc9ae4abfd7c37b838bff62a14d520a9fa311007fa57929ac7cc5d609c
|
||||
F src/pager.h 6137149346e6c8a3ddc1eeb40aee46381e9bc8b0fcc6dda8a1efde993c2275b8
|
||||
F src/parse.y 619c3e92a54686c5e47923688c4b9bf7ec534a4690db5677acc28b299c403250
|
||||
F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484
|
||||
F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5
|
||||
F src/pcache1.c 131ca0daf4e66b4608d2945ae76d6ed90de3f60539afbd5ef9ec65667a5f2fcd
|
||||
F src/pragma.c 30b535d0a66348df844ee36f890617b4cf45e9a22dcbc47ec3ca92909c50aaf1
|
||||
F src/prepare.c 1832be043fce7d489959aae6f994c452d023914714c4d5457beaed51c0f3d126
|
||||
F src/pragma.c 20847ce727fa0efe64de13f54427d44d25df7a00c806f198463dc37041aeeed0
|
||||
F src/prepare.c 2af0b5c1ec787c8eebd21baa9d79caf4a4dc3a18e76ce2edbf2027d706bca37a
|
||||
F src/printf.c 5f0c957af9699e849d786e8fbaa3baab648ca5612230dc17916434c14bc8698f
|
||||
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
|
||||
F src/resolve.c f8d1d011aba0964ff1bdccd049d4d2c2fec217efd90d202a4bb775e926b2c25d
|
||||
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
|
||||
F src/select.c 639bac342c1fdc6be97ee806f5e9e4b0ed325889a3f24a17e955a6e9be99f510
|
||||
F src/shell.c.in 7918c9355667b3b348e5850f0dad9095476ef942ee3b96ee9b8bc2710adda1da
|
||||
F src/sqlite.h.in b526a1eaa60096c9c043d7b128daf2764571e77413873888ee5582ca0141804c
|
||||
F src/select.c b95181711d59c36d9789e67f76c4cfec64b99f9629a50be5e6566e117b87d957
|
||||
F src/shell.c.in c309e6e95b4de2be9dd0fbe4d40f729199a85bcc54d66759a0aef3b3e6504b22
|
||||
F src/sqlite.h.in 5732519a2acb09066032ceac21f25996eb3f28f807a4468e30633c7c70faae1c
|
||||
F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
|
||||
F src/sqlite3ext.h 0bfd049bb2088cc44c2ad54f2079d1c6e43091a4e1ce8868779b75f6c1484f1e
|
||||
F src/sqliteInt.h a54f83985985655d1276e9e356dd6ae19b8d0b62c2abc75cc9e8f402ea141207
|
||||
F src/sqlite3ext.h 3f0c4ed6934e7309a61c6f3c30f70a30a5b869f785bb3d9f721a36c5e4359126
|
||||
F src/sqliteInt.h 27c73e48878d31ef230ba867d1f8c3af6aed357fd93ccc605d3f1aae007ea62b
|
||||
F src/sqliteLimit.h fe70bd8983e5d317a264f2ea97473b359faf3ebb0827877a76813f5cf0cdc364
|
||||
F src/status.c 0e72e4f6be6ccfde2488eb63210297e75f569f3ce9920f6c3d77590ec6ce5ffd
|
||||
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
|
||||
F src/tclsqlite.c 3c604c49e6cf4211960a9ddb9505280fd22cde32175f40884c641c0f5a286036
|
||||
F src/tclsqlite.h 65e2c761446e1c9fa0342b7d2612a703483643c8b6a316d12a65b745a4727395
|
||||
F src/tclsqlite.h 614b3780a62522bc9f8f2b9fb22689e8009958e7aa77e572d0f3149050af348a
|
||||
F src/test1.c 82d8aab7162a758d030728cab6ae6011785234854b7d6d2aebd877f985d1016a
|
||||
F src/test2.c 62f0830958f9075692c29c6de51b495ae8969e1bef85f239ffcd9ba5fb44a5ff
|
||||
F src/test3.c 432646f581d8af1bb495e58fc98234380250954f5d5535e507fc785eccc3987a
|
||||
@@ -801,14 +801,14 @@ F src/test_window.c 6d80e11fba89a1796525e6f0048ff0c7789aa2c6b0b11c80827dc1437bd8
|
||||
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
||||
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
|
||||
F src/tokenize.c 8400646d2830afc2f2dc465a75e3a92e4bedeea623f19dbd79c0c12d0dd6dda2
|
||||
F src/treeview.c d85ce76e6d1498d781957c07cb234da6d77ce0ed2d196480d516f54dabc62279
|
||||
F src/treeview.c 3ce7ac9835d2d70cc1c868b01b747ae8a062322e155701e58e3d62ca79aada7a
|
||||
F src/trigger.c d5cf2541ff048f30b6a0507eb3d1ec4e695c53584e3b2298a5bf248714fe185e
|
||||
F src/update.c 3e5e7ff66fa19ebe4d1b113d480639a24cc1175adbefabbd1a948a07f28e37cf
|
||||
F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1
|
||||
F src/utf.c 7267c3fb9e2467020507601af3354c2446c61f444387e094c779dccd5ca62165
|
||||
F src/util.c 36fb1150062957280777655976f3f9a75db236cb8207a0770ceae8d5ec17fcd3
|
||||
F src/vacuum.c 1bacdd0a81d2b5dc1c508fbf0d938c89fa78dd8d5b46ec92686d44030d4f4789
|
||||
F src/vdbe.c a5873cd566a0e2a0344a86dd946add9d34fae3feeae8b126277ef7af8dc11f91
|
||||
F src/vdbe.c 07084aa0152c8d4e74e7b86c0cf744732f0f9b1fd62bd7098252cadb741c630a
|
||||
F src/vdbe.h ea1f1b52f0efe422f80d88da3c57e4eadc72856e29a22f1ff08e502ec6ba5f08
|
||||
F src/vdbeInt.h 52896dd4d5b62190c53db14b09fc2484434eb594c963df0fa66eb8a94527b02e
|
||||
F src/vdbeapi.c f9a4881a9674fec3fa13da35044a1484d3c4b95f9ec891cc8ffb02ef2b7a41df
|
||||
@@ -819,14 +819,14 @@ F src/vdbesort.c cb6f472e83ca12c46aa7de0ac0a9d11458b357986f2617a1c90dfb19a542ecb
|
||||
F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823
|
||||
F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3
|
||||
F src/vtab.c 828221bdbeaaa6d62126ee6d07fd4ec0d09dcaea846f87ad01944d8b7e548859
|
||||
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
|
||||
F src/wal.c 20be6f0a25a80b7897cf2a5369bfd37ef198e6f0b6cdef16d83eee856056b159
|
||||
F src/vxworks.h 9d18819c5235b49c2340a8a4d48195ec5d5afb637b152406de95a9436beeaeab
|
||||
F src/wal.c a278339ecf5f194fd71fff1f0da1368de50e3a32edc3e9944e1ee1f4610476ff
|
||||
F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452
|
||||
F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014
|
||||
F src/where.c f2f075bd17065922235632feb368efe92a7f03d42797eb575267574fbf6d4218
|
||||
F src/whereInt.h 8d94cb116c9e06205c3d5ac87af065fc044f8cf08bfdccd94b6ea1c1308e65da
|
||||
F src/wherecode.c 71c5c6804b7f882dec8ec858758accae02fcfca13df3cc720f1f258e663ec7c5
|
||||
F src/whereexpr.c 78c28a8da187816d5d82049f2e343fb39f4a8e30b5bf1bda9b96cecde40ca8bd
|
||||
F src/whereexpr.c 403a44eeec1a0f0914fccc6a59376b6924bc00ef6728fe6ffce4cf3051b320fc
|
||||
F src/window.c d01227141f622f24fbe36ca105fbe6ef023f9fd98f1ccd65da95f88886565db5
|
||||
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
|
||||
F test/affinity2.test 4d7a34d328e58ca2a2d78fd76c27614a41ca7ddf4312ded9c68c04f430b3b47d
|
||||
@@ -920,6 +920,7 @@ F test/bestindexA.test e1b5def6b190797cacf008e6815ffb78fb30261999030d60a728d572e
|
||||
F test/bestindexB.test 328b97b69cd1a20928d5997f9ecb04d2e00f1d18e19ab27f9e9adb44d7bc51ce
|
||||
F test/bestindexC.test 95b4a527b1a5d07951d731604a6d4cf7e5a806b39cea0e7819d4c9667e11c3fc
|
||||
F test/bestindexD.test 6a8f6f84990bcf17dfa59652a1f935beddb7afd96f8302830fbc86b0a13df3c3
|
||||
F test/bestindexE.test f0c7105d1e7facaa8f5e6c498849cc6dcadd533b35ea9e5e1176e54a9a2d70f1
|
||||
F test/between.test e7587149796101cbe8d5f8abae8d2a7b87f04d8226610aa1091615005dcf4d54
|
||||
F test/bigfile.test aa74f4e5db51c8e54a1d9de9fa65d01d1eb20b59
|
||||
F test/bigfile2.test 1b489a3a39ae90c7f027b79110d6b4e1dbc71bfc
|
||||
@@ -962,7 +963,7 @@ F test/changes2.test 07949edcc732af28cb54276bfb7d99723bccc1e905a423648bf57ac5cb0
|
||||
F test/check.test 3a7972ccbaad80d496833da8714d69d9d5d4ce9e7211af1cd2a06ae488a7de12
|
||||
F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014
|
||||
F test/chunksize.test faea11c5d6df9d392252a8dd879e1b1d68c9d3e8b7909cbed8bcec3b60c706f1
|
||||
F test/cksumvfs.test 6f05dc95847c06a3dc10eee6b5ab1351d78314a52d0db15717c9388f4cb96646
|
||||
F test/cksumvfs.test 38748166f486c59e8d94f3ee705040031ed3790a4dd69c4a9eef64f623a30ad4
|
||||
F test/close.test eccbad8ecd611d974cbf47278c3d4e5874faf02d811338d5d348af42d56d647c
|
||||
F test/closure01.test 9905883f1b171a4638f98fc764879f154e214a306d3d8daf412a15e7f3a9b1e0
|
||||
F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91
|
||||
@@ -1146,6 +1147,7 @@ F test/fts3am.test 218aa6ba0dfc50c7c16b2022aac5c6be593d08d8
|
||||
F test/fts3an.test a49ccadc07a2f7d646ec1b81bc09da2d85a85b18
|
||||
F test/fts3ao.test 266989148fec6d9f1bb6c5382f7aa3dcea0e9cd444576e28dd2b9287ac7dd220
|
||||
F test/fts3atoken.test dc2078ce464914efe3a8dfc545dd034a0fc14f2ab425c240471d5a5f1c721400
|
||||
F test/fts3atoken2.test aa6664d26277064844ead962f5988c28b091c51b112f36d30fa33bd83fecf906
|
||||
F test/fts3auto.test 649aa4c198d7acc5cd6355e19ee073d051c40d9e88a43fc3d88af46bdf3e99d5
|
||||
F test/fts3aux1.test 1880eaa75c586cd10f53080479a2b819b3915ae7ce55c4e0ba8f1fe05ac0a6a7
|
||||
F test/fts3aux2.test 2459e7fa3e22734aed237d1e2ae192f5541c4d8b218956ad2d90754977bf907f
|
||||
@@ -1335,6 +1337,7 @@ F test/joinD.test 2ce62e7353a0702ca5e70008faf319c1d4686aa19fba34275c6d1da0e960be
|
||||
F test/joinE.test d5d182f3812771e2c0d97c9dcf5dbe4c41c8e21c82560e59358731c4a3981d6b
|
||||
F test/joinF.test 53dd66158806823ea680dd7543b5406af151b5aafa5cd06a7f3231cd94938127
|
||||
F test/joinH.test fd76024ff104baec16417db5cafc0894ad4e0863e70803e63c1bba0322706339
|
||||
F test/joinI.test fc7d24a2b1e444979b83bd92c30ebb975cebb5b9eae4442ce94969bd8d083053
|
||||
F test/journal1.test bc61a4228db11bffca118bd358ba4b868524bf080f3532749de6c539656e20fa
|
||||
F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4
|
||||
F test/journal3.test e5aeff93a7776cf644dbc48dec277655cff80a1cd24689036abc87869b120ea6
|
||||
@@ -1524,6 +1527,7 @@ F test/recover.test c76d05f33f0271fba0f0752170e03b0ab5952dc61dcea7ab3ba40df03c4c
|
||||
F test/regexp1.test 8f2a8bc1569666e29a4cee6c1a666cd224eb6d50e2470d1dc1df995170f3e0f1
|
||||
F test/regexp2.test 55ed41da802b0e284ac7e2fe944be3948f93ff25abbca0361a609acfed1368b5
|
||||
F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d
|
||||
F test/reservebytes.test 6163640b5a5120c0dee6591481e673a0fa0bf0d12d4da7513bad692c1a49a162
|
||||
F test/resetdb.test 54c06f18bc832ac6d6319e5ab23d5c8dd49fdbeec7c696d791682a8006bd5fc3
|
||||
F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb
|
||||
F test/returning1.test 212cd4111bb941a60abf608f20250db666c21eb1bc4d49217e96c87ff3ab9d1a
|
||||
@@ -1974,6 +1978,7 @@ F test/wal_common.tcl 204d1721ac13c5e0c7fae6380315b5ab7f4e8423f580d826c5e9df1995
|
||||
F test/walbak.test 018d4e5a3d45c6298d11b99f09a8ef6876527946
|
||||
F test/walbig.test f437473a16cfb314867c6b5d1dbcd519e73e3434
|
||||
F test/walblock.test 6bb472e82730e7e4e81395e907a01d8cfc2bd9e1f01f8a9184ca572e2955a4bf
|
||||
F test/walckptnoop.test 5d40e7959a6ef4bdc7aaf773f86c8f210e2a1e6d0ca5c9ad1389311665741bef
|
||||
F test/walcksum.test 50e204500eed9c691b6045e467bb2923f49aa93d8adf315e2be135fdb202c1c2
|
||||
F test/walcrash.test 21038858cc552077b0522f50b0fa87e38139306a
|
||||
F test/walcrash2.test a0edab4e5390f03b99a790de89aad15d6ec70b36
|
||||
@@ -2070,7 +2075,7 @@ F test/without_rowid3.test 39ab0dd773eaa62e59b17093f875327630f54c4145458f6d2b053
|
||||
F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a
|
||||
F test/without_rowid5.test f14298eb5ac8013894b75141c3f4f5f325a6ad0eded55516eef72c49e60a67cb
|
||||
F test/without_rowid6.test efbd7add62c59bf5ca97bf8da674e734e6a70ef979234e816166824b4d258f68
|
||||
F test/without_rowid7.test d7c59a93d726b55812d620f8f284e01904a5b85f9ee9eea8f2f68571a5e8c40e
|
||||
F test/without_rowid7.test 747d3fbef7108d416d6416694b03d8ff046dc9cc82b3d911715feb472444b95a
|
||||
F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912adec66
|
||||
F test/writecrash.test 13520af28f376bfc8c0bcd130efc1fff20bb165198e8b94cf153f1f754154bb9
|
||||
F test/zeroblob.test 7b74cefc7b281dfa2b07cd237987fbe94b4a2037a7771e9e83f2d5f608b1d99e
|
||||
@@ -2112,7 +2117,7 @@ F tool/logest.c c34e5944318415de513d29a6098df247a9618c96d83c38d4abd88641fe46e669
|
||||
F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439
|
||||
F tool/merge-test.tcl de76b62f2de2a92d4c1ca4f976bce0aea6899e0229e250479b229b2a1914b176
|
||||
F tool/mkamalzip.tcl 8aa5ebe7973c8b8774062d34e15fea9815c4cc2ceea3a9b184695f005910876a
|
||||
F tool/mkautoconfamal.sh cf72166369d9d1df9df1ae9fcad03a7939808d7273784b56fd78b913587637a1
|
||||
F tool/mkautoconfamal.sh 647dada5e34c466bef62a4408e1c99a7e5e1922805479dd57944f33f9803f2f8
|
||||
F tool/mkccode.tcl c42a8f8cf78f92e83795d5447460dbce7aaf78a3bbf9082f1507dc71a3665f3c x
|
||||
F tool/mkctimec.tcl 11c9eda4a8d18c74b79280b30506d832849fd1855e6d9e95e1fd506f1d211c37 x
|
||||
F tool/mkkeywordhash.c 6b0be901c47f9ad42215fc995eb2f4384ac49213b1fba395102ec3e999acf559
|
||||
@@ -2125,7 +2130,7 @@ F tool/mkshellc.tcl bab0a72a68384181a5706712dfdf6815f6526446d4e8aacace2de5e80cda
|
||||
F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9
|
||||
F tool/mksqlite3c-noext.tcl 351c55256213154cabb051a3c870ef9f4487de905015141ae50dc7578a901b84
|
||||
F tool/mksqlite3c.tcl f11b63445c4840509248bd4aa151a81aea25d5415fef71943c8d436eba4f3b3c
|
||||
F tool/mksqlite3h.tcl 989948c6a26e188e673d7c2f2f093ea3acd816ad6ac65bab596280075c8f3a45
|
||||
F tool/mksqlite3h.tcl 7b8de72c29b17b338acde81c389f3af04bf34fd25e96c5f29743d1dd285ed49e
|
||||
F tool/mksqlite3internalh.tcl 46ef6ed6ccd3c36e23051109dd25085d8edef3887635cea25afa81c4adf4d4db
|
||||
F tool/mksrczip.tcl 81efd9974dbb36005383f2cd655520057a2ae5aa85ac2441a80c7c28f803ac52
|
||||
F tool/mktoolzip.tcl c9f388b2b0751982aef29a0c1d80f7959dbe38065ebb4421c39844e92622b086
|
||||
@@ -2151,7 +2156,7 @@ F tool/spellsift.tcl 52b4b04dc4333c7ab024f09d9d66ed6b6f7c6eb00b38497a09f338fa55d
|
||||
F tool/split-sqlite3c.tcl 4969fd642dad0ea483e4e104163021d92baf98f6a8eac981fe48525f9b873430
|
||||
F tool/sqldiff.c 134be7866be19f8beb32043d5aea5657f01aaeae2df8d33d758ff722c78666b9
|
||||
F tool/sqlite3_analyzer.c.in 14f02cb5ec3c264cd6107d1f1dad77092b1cf440fc196c30b69ae87b56a1a43b
|
||||
F tool/sqlite3_rsync.c 0a47e601bdca0d300cbd53834bc59848b787bf3bfe3099b4eb27d08c81d571db
|
||||
F tool/sqlite3_rsync.c d0e58a1e49fe2192c3ee0b697aed182d502bebfe5b4b406ba6b2baa52a04ecbe
|
||||
F tool/sqltclsh.c.in 1bcc2e9da58fadf17b0bf6a50e68c1159e602ce057210b655d50bad5aaaef898
|
||||
F tool/sqltclsh.tcl 862f4cf1418df5e1315b5db3b5ebe88969e2a784525af5fbf9596592f14ed848
|
||||
F tool/src-verify.c 6c655d9a8d6b30f3648fc78a79bf3838ed68f8543869d380c43ea9f17b3b8501
|
||||
@@ -2169,8 +2174,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
|
||||
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
|
||||
F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd
|
||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||
P 5c0202d96c3a20a2cbcd38eba5e62371606894a0cbc2da4f60e10a1b5fa7bd04
|
||||
R 57aa9619c0758306406e2ed77b97a234
|
||||
U dan
|
||||
Z c231b421c1351ad11aaf295d66bfc2c6
|
||||
P ed36b3aa4b68c6bb347b6851ea61bcad9712c4a9ed39e3fb4f84cb9b9ee48dc2
|
||||
R e746890c0ffada398be86dcbb8bb6216
|
||||
U drh
|
||||
Z 649b29c859d66a30049be3851479ddc7
|
||||
# Remove this line to create a well-formed Fossil manifest.
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
branch sqlite3-set-errmsg
|
||||
tag sqlite3-set-errmsg
|
||||
+1
-1
@@ -1 +1 @@
|
||||
9e6fa73467892eb2333c0a94ca38b66b7cc0432326de93ff131ecde4c165114e
|
||||
93a41e31322eec70476f7d81f4af7fb8476cad21a56d6b1048a9e0c0c440bf72
|
||||
|
||||
+8
-3
@@ -1071,7 +1071,7 @@ int sqlite3TableColumnToIndex(Index *pIdx, int iCol){
|
||||
int i;
|
||||
i16 iCol16;
|
||||
assert( iCol>=(-1) && iCol<=SQLITE_MAX_COLUMN );
|
||||
assert( pIdx->nColumn<=SQLITE_MAX_COLUMN+1 );
|
||||
assert( pIdx->nColumn<=SQLITE_MAX_COLUMN*2 );
|
||||
iCol16 = iCol;
|
||||
for(i=0; i<pIdx->nColumn; i++){
|
||||
if( iCol16==pIdx->aiColumn[i] ){
|
||||
@@ -5663,14 +5663,19 @@ KeyInfo *sqlite3KeyInfoOfIndex(Parse *pParse, Index *pIdx){
|
||||
}
|
||||
if( pParse->nErr ){
|
||||
assert( pParse->rc==SQLITE_ERROR_MISSING_COLLSEQ );
|
||||
if( pIdx->bNoQuery==0 ){
|
||||
if( pIdx->bNoQuery==0
|
||||
&& sqlite3HashFind(&pIdx->pSchema->idxHash, pIdx->zName)
|
||||
){
|
||||
/* Deactivate the index because it contains an unknown collating
|
||||
** sequence. The only way to reactive the index is to reload the
|
||||
** schema. Adding the missing collating sequence later does not
|
||||
** reactive the index. The application had the chance to register
|
||||
** the missing index using the collation-needed callback. For
|
||||
** simplicity, SQLite will not give the application a second chance.
|
||||
*/
|
||||
**
|
||||
** Except, do not do this if the index is not in the schema hash
|
||||
** table. In this case the index is currently being constructed
|
||||
** by a CREATE INDEX statement, and retrying will not help. */
|
||||
pIdx->bNoQuery = 1;
|
||||
pParse->rc = SQLITE_ERROR_RETRY;
|
||||
}
|
||||
|
||||
+6
-6
@@ -46,7 +46,7 @@ typedef struct DbpageCursor DbpageCursor;
|
||||
|
||||
struct DbpageCursor {
|
||||
sqlite3_vtab_cursor base; /* Base class. Must be first */
|
||||
int pgno; /* Current page number */
|
||||
Pgno pgno; /* Current page number */
|
||||
int mxPgno; /* Last page to visit on this scan */
|
||||
Pager *pPager; /* Pager being read/written */
|
||||
DbPage *pPage1; /* Page 1 of the database */
|
||||
@@ -184,7 +184,7 @@ static int dbpageOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
|
||||
}else{
|
||||
memset(pCsr, 0, sizeof(DbpageCursor));
|
||||
pCsr->base.pVtab = pVTab;
|
||||
pCsr->pgno = -1;
|
||||
pCsr->pgno = 0;
|
||||
}
|
||||
|
||||
*ppCursor = (sqlite3_vtab_cursor *)pCsr;
|
||||
@@ -284,12 +284,12 @@ static int dbpageColumn(
|
||||
int rc = SQLITE_OK;
|
||||
switch( i ){
|
||||
case 0: { /* pgno */
|
||||
sqlite3_result_int(ctx, pCsr->pgno);
|
||||
sqlite3_result_int64(ctx, (sqlite3_int64)pCsr->pgno);
|
||||
break;
|
||||
}
|
||||
case 1: { /* data */
|
||||
DbPage *pDbPage = 0;
|
||||
if( pCsr->pgno==((PENDING_BYTE/pCsr->szPage)+1) ){
|
||||
if( pCsr->pgno==(Pgno)((PENDING_BYTE/pCsr->szPage)+1) ){
|
||||
/* The pending byte page. Assume it is zeroed out. Attempting to
|
||||
** request this page from the page is an SQLITE_CORRUPT error. */
|
||||
sqlite3_result_zeroblob(ctx, pCsr->szPage);
|
||||
@@ -363,10 +363,10 @@ static int dbpageUpdate(
|
||||
goto update_fail;
|
||||
}
|
||||
if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
|
||||
pgno = (Pgno)sqlite3_value_int(argv[2]);
|
||||
pgno = (Pgno)sqlite3_value_int64(argv[2]);
|
||||
isInsert = 1;
|
||||
}else{
|
||||
pgno = sqlite3_value_int(argv[0]);
|
||||
pgno = (Pgno)sqlite3_value_int64(argv[0]);
|
||||
if( (Pgno)sqlite3_value_int(argv[1])!=pgno ){
|
||||
zErr = "cannot insert";
|
||||
goto update_fail;
|
||||
|
||||
+26
@@ -1532,6 +1532,9 @@ const char *sqlite3ErrName(int rc){
|
||||
case SQLITE_OK: zName = "SQLITE_OK"; break;
|
||||
case SQLITE_ERROR: zName = "SQLITE_ERROR"; break;
|
||||
case SQLITE_ERROR_SNAPSHOT: zName = "SQLITE_ERROR_SNAPSHOT"; break;
|
||||
case SQLITE_ERROR_RETRY: zName = "SQLITE_ERROR_RETRY"; break;
|
||||
case SQLITE_ERROR_MISSING_COLLSEQ:
|
||||
zName = "SQLITE_ERROR_MISSING_COLLSEQ"; break;
|
||||
case SQLITE_INTERNAL: zName = "SQLITE_INTERNAL"; break;
|
||||
case SQLITE_PERM: zName = "SQLITE_PERM"; break;
|
||||
case SQLITE_ABORT: zName = "SQLITE_ABORT"; break;
|
||||
@@ -2713,6 +2716,29 @@ const char *sqlite3_errmsg(sqlite3 *db){
|
||||
return z;
|
||||
}
|
||||
|
||||
/*
|
||||
** Set the error code and error message associated with the database handle.
|
||||
**
|
||||
** This routine is intended to be called by outside extensions (ex: the
|
||||
** Session extension). Internal logic should invoke sqlite3Error() or
|
||||
** sqlite3ErrorWithMsg() directly.
|
||||
*/
|
||||
int sqlite3_set_errmsg(sqlite3 *db, int errcode, const char *zMsg){
|
||||
int rc = SQLITE_OK;
|
||||
if( !sqlite3SafetyCheckSickOrOk(db) ){
|
||||
return SQLITE_MISUSE_BKPT;
|
||||
}
|
||||
sqlite3_mutex_enter(db->mutex);
|
||||
if( zMsg ){
|
||||
sqlite3ErrorWithMsg(db, errcode, "%s", zMsg);
|
||||
}else{
|
||||
sqlite3Error(db, errcode);
|
||||
}
|
||||
rc = sqlite3ApiExit(db, rc);
|
||||
sqlite3_mutex_leave(db->mutex);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
** Return the byte offset of the most recent error
|
||||
*/
|
||||
|
||||
+75
-25
@@ -498,10 +498,11 @@ static struct unix_syscall {
|
||||
|
||||
#if defined(HAVE_FCHMOD)
|
||||
{ "fchmod", (sqlite3_syscall_ptr)fchmod, 0 },
|
||||
#define osFchmod ((int(*)(int,mode_t))aSyscall[14].pCurrent)
|
||||
#else
|
||||
{ "fchmod", (sqlite3_syscall_ptr)0, 0 },
|
||||
#define osFchmod(FID,MODE) 0
|
||||
#endif
|
||||
#define osFchmod ((int(*)(int,mode_t))aSyscall[14].pCurrent)
|
||||
|
||||
#if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE
|
||||
{ "fallocate", (sqlite3_syscall_ptr)posix_fallocate, 0 },
|
||||
@@ -759,9 +760,8 @@ static int robust_open(const char *z, int f, mode_t m){
|
||||
|
||||
/*
|
||||
** Helper functions to obtain and relinquish the global mutex. The
|
||||
** global mutex is used to protect the unixInodeInfo and
|
||||
** vxworksFileId objects used by this file, all of which may be
|
||||
** shared by multiple threads.
|
||||
** global mutex is used to protect the unixInodeInfo objects used by
|
||||
** this file, all of which may be shared by multiple threads.
|
||||
**
|
||||
** Function unixMutexHeld() is used to assert() that the global mutex
|
||||
** is held when required. This function is only used as part of assert()
|
||||
@@ -963,6 +963,7 @@ struct vxworksFileId {
|
||||
** variable:
|
||||
*/
|
||||
static struct vxworksFileId *vxworksFileList = 0;
|
||||
static sqlite3_mutex *vxworksMutex = 0;
|
||||
|
||||
/*
|
||||
** Simplify a filename into its canonical form
|
||||
@@ -1028,14 +1029,14 @@ static struct vxworksFileId *vxworksFindFileId(const char *zAbsoluteName){
|
||||
** If found, increment the reference count and return a pointer to
|
||||
** the existing file ID.
|
||||
*/
|
||||
unixEnterMutex();
|
||||
sqlite3_mutex_enter(vxworksMutex);
|
||||
for(pCandidate=vxworksFileList; pCandidate; pCandidate=pCandidate->pNext){
|
||||
if( pCandidate->nName==n
|
||||
&& memcmp(pCandidate->zCanonicalName, pNew->zCanonicalName, n)==0
|
||||
){
|
||||
sqlite3_free(pNew);
|
||||
pCandidate->nRef++;
|
||||
unixLeaveMutex();
|
||||
sqlite3_mutex_leave(vxworksMutex);
|
||||
return pCandidate;
|
||||
}
|
||||
}
|
||||
@@ -1045,7 +1046,7 @@ static struct vxworksFileId *vxworksFindFileId(const char *zAbsoluteName){
|
||||
pNew->nName = n;
|
||||
pNew->pNext = vxworksFileList;
|
||||
vxworksFileList = pNew;
|
||||
unixLeaveMutex();
|
||||
sqlite3_mutex_leave(vxworksMutex);
|
||||
return pNew;
|
||||
}
|
||||
|
||||
@@ -1054,7 +1055,7 @@ static struct vxworksFileId *vxworksFindFileId(const char *zAbsoluteName){
|
||||
** the object when the reference count reaches zero.
|
||||
*/
|
||||
static void vxworksReleaseFileId(struct vxworksFileId *pId){
|
||||
unixEnterMutex();
|
||||
sqlite3_mutex_enter(vxworksMutex);
|
||||
assert( pId->nRef>0 );
|
||||
pId->nRef--;
|
||||
if( pId->nRef==0 ){
|
||||
@@ -1064,7 +1065,7 @@ static void vxworksReleaseFileId(struct vxworksFileId *pId){
|
||||
*pp = pId->pNext;
|
||||
sqlite3_free(pId);
|
||||
}
|
||||
unixLeaveMutex();
|
||||
sqlite3_mutex_leave(vxworksMutex);
|
||||
}
|
||||
#endif /* OS_VXWORKS */
|
||||
/*************** End of Unique File ID Utility Used By VxWorks ****************
|
||||
@@ -1625,18 +1626,42 @@ static int osSetPosixAdvisoryLock(
|
||||
struct flock *pLock, /* The description of the lock */
|
||||
unixFile *pFile /* Structure holding timeout value */
|
||||
){
|
||||
int tm = pFile->iBusyTimeout;
|
||||
int rc = osFcntl(h,F_SETLK,pLock);
|
||||
while( rc<0 && tm>0 ){
|
||||
/* On systems that support some kind of blocking file lock with a timeout,
|
||||
** make appropriate changes here to invoke that blocking file lock. On
|
||||
** generic posix, however, there is no such API. So we simply try the
|
||||
** lock once every millisecond until either the timeout expires, or until
|
||||
** the lock is obtained. */
|
||||
unixSleep(0,1000);
|
||||
int rc = 0;
|
||||
|
||||
if( pFile->iBusyTimeout==0 ){
|
||||
/* unixFile->iBusyTimeout is set to 0. In this case, attempt a
|
||||
** non-blocking lock. */
|
||||
rc = osFcntl(h,F_SETLK,pLock);
|
||||
tm--;
|
||||
}else{
|
||||
/* unixFile->iBusyTimeout is set to greater than zero. In this case,
|
||||
** attempt a blocking-lock with a unixFile->iBusyTimeout ms timeout.
|
||||
**
|
||||
** On systems that support some kind of blocking file lock operation,
|
||||
** this block should be replaced by code to attempt a blocking lock
|
||||
** with a timeout of unixFile->iBusyTimeout ms. The code below is
|
||||
** placeholder code. If SQLITE_TEST is defined, the placeholder code
|
||||
** retries the lock once every 1ms until it succeeds or the timeout
|
||||
** is reached. Or, if SQLITE_TEST is not defined, the placeholder
|
||||
** code attempts a non-blocking lock and sets unixFile->iBusyTimeout
|
||||
** to 0. This causes the caller to return SQLITE_BUSY, instead of
|
||||
** SQLITE_BUSY_TIMEOUT to SQLite - as required by a VFS that does not
|
||||
** support blocking locks.
|
||||
*/
|
||||
#ifdef SQLITE_TEST
|
||||
int tm = pFile->iBusyTimeout;
|
||||
while( tm>0 ){
|
||||
rc = osFcntl(h,F_SETLK,pLock);
|
||||
if( rc==0 ) break;
|
||||
unixSleep(0,1000);
|
||||
tm--;
|
||||
}
|
||||
#else
|
||||
rc = osFcntl(h,F_SETLK,pLock);
|
||||
pFile->iBusyTimeout = 0;
|
||||
#endif
|
||||
/* End of code to replace with real blocking-locks code. */
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
#endif /* SQLITE_ENABLE_SETLK_TIMEOUT */
|
||||
@@ -5957,10 +5982,17 @@ static int fillInUnixFile(
|
||||
storeLastErrno(pNew, 0);
|
||||
#if OS_VXWORKS
|
||||
if( rc!=SQLITE_OK ){
|
||||
if( h>=0 ) robust_close(pNew, h, __LINE__);
|
||||
h = -1;
|
||||
osUnlink(zFilename);
|
||||
pNew->ctrlFlags |= UNIXFILE_DELETE;
|
||||
if( h>=0 ){
|
||||
robust_close(pNew, h, __LINE__);
|
||||
h = -1;
|
||||
}
|
||||
if( pNew->ctrlFlags & UNIXFILE_DELETE ){
|
||||
osUnlink(zFilename);
|
||||
}
|
||||
if( pNew->pId ){
|
||||
vxworksReleaseFileId(pNew->pId);
|
||||
pNew->pId = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if( rc!=SQLITE_OK ){
|
||||
@@ -6004,6 +6036,9 @@ static const char *unixTempFileDir(void){
|
||||
|
||||
while(1){
|
||||
if( zDir!=0
|
||||
#if OS_VXWORKS
|
||||
&& zDir[0]=='/'
|
||||
#endif
|
||||
&& osStat(zDir, &buf)==0
|
||||
&& S_ISDIR(buf.st_mode)
|
||||
&& osAccess(zDir, 03)==0
|
||||
@@ -6318,6 +6353,12 @@ static int unixOpen(
|
||||
|| eType==SQLITE_OPEN_TRANSIENT_DB || eType==SQLITE_OPEN_WAL
|
||||
);
|
||||
|
||||
#if OS_VXWORKS
|
||||
/* The file-ID mechanism used in Vxworks requires that all pathnames
|
||||
** provided to unixOpen must be absolute pathnames. */
|
||||
if( zPath!=0 && zPath[0]!='/' ){ return SQLITE_CANTOPEN; }
|
||||
#endif
|
||||
|
||||
/* Detect a pid change and reset the PRNG. There is a race condition
|
||||
** here such that two or more threads all trying to open databases at
|
||||
** the same instant might all reset the PRNG. But multiple resets
|
||||
@@ -6518,8 +6559,11 @@ static int unixOpen(
|
||||
}
|
||||
#endif
|
||||
|
||||
assert( zPath==0 || zPath[0]=='/'
|
||||
|| eType==SQLITE_OPEN_SUPER_JOURNAL || eType==SQLITE_OPEN_MAIN_JOURNAL
|
||||
assert( zPath==0
|
||||
|| zPath[0]=='/'
|
||||
|| eType==SQLITE_OPEN_SUPER_JOURNAL
|
||||
|| eType==SQLITE_OPEN_MAIN_JOURNAL
|
||||
|| eType==SQLITE_OPEN_TEMP_JOURNAL
|
||||
);
|
||||
rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags);
|
||||
|
||||
@@ -8248,6 +8292,9 @@ int sqlite3_os_init(void){
|
||||
sqlite3KvvfsInit();
|
||||
#endif
|
||||
unixBigLock = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1);
|
||||
#if OS_VXWORKS
|
||||
vxworksMutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS2);
|
||||
#endif
|
||||
|
||||
#ifndef SQLITE_OMIT_WAL
|
||||
/* Validate lock assumptions */
|
||||
@@ -8282,6 +8329,9 @@ int sqlite3_os_init(void){
|
||||
*/
|
||||
int sqlite3_os_end(void){
|
||||
unixBigLock = 0;
|
||||
#if OS_VXWORKS
|
||||
vxworksMutex = 0;
|
||||
#endif
|
||||
return SQLITE_OK;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -7512,7 +7512,7 @@ int sqlite3PagerCheckpoint(
|
||||
}
|
||||
if( pPager->pWal ){
|
||||
rc = sqlite3WalCheckpoint(pPager->pWal, db, eMode,
|
||||
(eMode==SQLITE_CHECKPOINT_PASSIVE ? 0 : pPager->xBusyHandler),
|
||||
(eMode<=SQLITE_CHECKPOINT_PASSIVE ? 0 : pPager->xBusyHandler),
|
||||
pPager->pBusyHandlerArg,
|
||||
pPager->walSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace,
|
||||
pnLog, pnCkpt
|
||||
|
||||
@@ -2372,6 +2372,8 @@ void sqlite3Pragma(
|
||||
eMode = SQLITE_CHECKPOINT_RESTART;
|
||||
}else if( sqlite3StrICmp(zRight, "truncate")==0 ){
|
||||
eMode = SQLITE_CHECKPOINT_TRUNCATE;
|
||||
}else if( sqlite3StrICmp(zRight, "noop")==0 ){
|
||||
eMode = SQLITE_CHECKPOINT_NOOP;
|
||||
}
|
||||
}
|
||||
pParse->nMem = 3;
|
||||
|
||||
+4
-2
@@ -860,9 +860,11 @@ static int sqlite3LockAndPrepare(
|
||||
rc = sqlite3Prepare(db, zSql, nBytes, prepFlags, pOld, ppStmt, pzTail);
|
||||
assert( rc==SQLITE_OK || *ppStmt==0 );
|
||||
if( rc==SQLITE_OK || db->mallocFailed ) break;
|
||||
}while( (rc==SQLITE_ERROR_RETRY && (cnt++)<SQLITE_MAX_PREPARE_RETRY)
|
||||
|| (rc==SQLITE_SCHEMA && (sqlite3ResetOneSchema(db,-1), cnt++)==0) );
|
||||
cnt++;
|
||||
}while( (rc==SQLITE_ERROR_RETRY && ALWAYS(cnt<=SQLITE_MAX_PREPARE_RETRY))
|
||||
|| (rc==SQLITE_SCHEMA && (sqlite3ResetOneSchema(db,-1), cnt)==1) );
|
||||
sqlite3BtreeLeaveAll(db);
|
||||
assert( rc!=SQLITE_ERROR_RETRY );
|
||||
rc = sqlite3ApiExit(db, rc);
|
||||
assert( (rc&db->errMask)==rc );
|
||||
db->busyHandler.nBusy = 0;
|
||||
|
||||
+128
-12
@@ -443,8 +443,7 @@ void sqlite3SetJoinExpr(Expr *p, int iTable, u32 joinFlag){
|
||||
assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) );
|
||||
ExprSetVVAProperty(p, EP_NoReduce);
|
||||
p->w.iJoin = iTable;
|
||||
if( p->op==TK_FUNCTION ){
|
||||
assert( ExprUseXList(p) );
|
||||
if( ExprUseXList(p) ){
|
||||
if( p->x.pList ){
|
||||
int i;
|
||||
for(i=0; i<p->x.pList->nExpr; i++){
|
||||
@@ -660,6 +659,7 @@ static int sqlite3ProcessJoin(Parse *pParse, Select *p){
|
||||
p->pWhere = sqlite3ExprAnd(pParse, p->pWhere, pRight->u3.pOn);
|
||||
pRight->u3.pOn = 0;
|
||||
pRight->fg.isOn = 1;
|
||||
p->selFlags |= SF_OnToWhere;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -3868,7 +3868,7 @@ static int multiSelectOrderBy(
|
||||
** ## About "isOuterJoin":
|
||||
**
|
||||
** The isOuterJoin column indicates that the replacement will occur into a
|
||||
** position in the parent that NULL-able due to an OUTER JOIN. Either the
|
||||
** position in the parent that is NULL-able due to an OUTER JOIN. Either the
|
||||
** target slot in the parent is the right operand of a LEFT JOIN, or one of
|
||||
** the left operands of a RIGHT JOIN. In either case, we need to potentially
|
||||
** bypass the substituted expression with OP_IfNullRow.
|
||||
@@ -4706,17 +4706,12 @@ static int flattenSubquery(
|
||||
pSub = pSub1;
|
||||
for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){
|
||||
int nSubSrc;
|
||||
u8 jointype = 0;
|
||||
u8 ltorj = pSrc->a[iFrom].fg.jointype & JT_LTORJ;
|
||||
u8 jointype = pSubitem->fg.jointype;
|
||||
assert( pSub!=0 );
|
||||
pSubSrc = pSub->pSrc; /* FROM clause of subquery */
|
||||
nSubSrc = pSubSrc->nSrc; /* Number of terms in subquery FROM clause */
|
||||
pSrc = pParent->pSrc; /* FROM clause of the outer query */
|
||||
|
||||
if( pParent==p ){
|
||||
jointype = pSubitem->fg.jointype; /* First time through the loop */
|
||||
}
|
||||
|
||||
/* The subquery uses a single slot of the FROM clause of the outer
|
||||
** query. If the subquery has more than one element in its FROM clause,
|
||||
** then expand the outer query to make space for it to hold all elements
|
||||
@@ -4736,6 +4731,7 @@ static int flattenSubquery(
|
||||
pSrc = sqlite3SrcListEnlarge(pParse, pSrc, nSubSrc-1,iFrom+1);
|
||||
if( pSrc==0 ) break;
|
||||
pParent->pSrc = pSrc;
|
||||
pSubitem = &pSrc->a[iFrom];
|
||||
}
|
||||
|
||||
/* Transfer the FROM clause terms from the subquery into the
|
||||
@@ -4750,11 +4746,10 @@ static int flattenSubquery(
|
||||
|| pItem->u4.zDatabase==0 );
|
||||
if( pItem->fg.isUsing ) sqlite3IdListDelete(db, pItem->u3.pUsing);
|
||||
*pItem = pSubSrc->a[i];
|
||||
pItem->fg.jointype |= ltorj;
|
||||
pItem->fg.jointype |= (jointype & JT_LTORJ);
|
||||
memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i]));
|
||||
}
|
||||
pSrc->a[iFrom].fg.jointype &= JT_LTORJ;
|
||||
pSrc->a[iFrom].fg.jointype |= jointype | ltorj;
|
||||
pSubitem->fg.jointype |= jointype;
|
||||
|
||||
/* Now begin substituting subquery result set expressions for
|
||||
** references to the iParent in the outer query.
|
||||
@@ -7495,6 +7490,115 @@ static SQLITE_NOINLINE void existsToJoin(
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** Type used for Walker callbacks by selectCheckOnClauses().
|
||||
*/
|
||||
typedef struct CheckOnCtx CheckOnCtx;
|
||||
struct CheckOnCtx {
|
||||
SrcList *pSrc; /* SrcList for this context */
|
||||
int iJoin; /* Cursor numbers must be =< than this */
|
||||
CheckOnCtx *pParent; /* Parent context */
|
||||
};
|
||||
|
||||
/*
|
||||
** True if the SrcList passed as the only argument contains at least
|
||||
** one RIGHT or FULL JOIN. False otherwise.
|
||||
*/
|
||||
#define hasRightJoin(pSrc) (((pSrc)->a[0].fg.jointype & JT_LTORJ)!=0)
|
||||
|
||||
/*
|
||||
** The xExpr callback for the search of invalid ON clause terms.
|
||||
*/
|
||||
static int selectCheckOnClausesExpr(Walker *pWalker, Expr *pExpr){
|
||||
CheckOnCtx *pCtx = pWalker->u.pCheckOnCtx;
|
||||
|
||||
/* Check if pExpr is root or near-root of an ON clause constraint that needs
|
||||
** to be checked to ensure that it does not refer to tables in its FROM
|
||||
** clause to the right of itself. i.e. it is either:
|
||||
**
|
||||
** + an ON clause on an OUTER join, or
|
||||
** + an ON clause on an INNER join within a FROM that features at
|
||||
** least one RIGHT or FULL join.
|
||||
*/
|
||||
if( (ExprHasProperty(pExpr, EP_OuterON))
|
||||
|| (ExprHasProperty(pExpr, EP_InnerON) && hasRightJoin(pCtx->pSrc))
|
||||
){
|
||||
/* If CheckOnCtx.iJoin is already set, then fall through and process
|
||||
** this expression node as normal. Or, if CheckOnCtx.iJoin is still 0,
|
||||
** set it to the cursor number of the RHS of the join to which this
|
||||
** ON expression was attached and then iterate through the entire
|
||||
** expression. */
|
||||
assert( pCtx->iJoin==0 || pCtx->iJoin==pExpr->w.iJoin );
|
||||
if( pCtx->iJoin==0 ){
|
||||
pCtx->iJoin = pExpr->w.iJoin;
|
||||
sqlite3WalkExprNN(pWalker, pExpr);
|
||||
pCtx->iJoin = 0;
|
||||
return WRC_Prune;
|
||||
}
|
||||
}
|
||||
|
||||
if( pExpr->op==TK_COLUMN ){
|
||||
/* A column expression. Find the SrcList (if any) to which it refers.
|
||||
** Then, if CheckOnCtx.iJoin indicates that this expression is part of an
|
||||
** ON clause from that SrcList (i.e. if iJoin is non-zero), check that it
|
||||
** does not refer to a table to the right of CheckOnCtx.iJoin. */
|
||||
do {
|
||||
SrcList *pSrc = pCtx->pSrc;
|
||||
int iTab = pExpr->iTable;
|
||||
if( iTab>=pSrc->a[0].iCursor && iTab<=pSrc->a[pSrc->nSrc-1].iCursor ){
|
||||
if( pCtx->iJoin && iTab>pCtx->iJoin ){
|
||||
sqlite3ErrorMsg(pWalker->pParse,
|
||||
"ON clause references tables to its right");
|
||||
return WRC_Abort;
|
||||
}
|
||||
break;
|
||||
}
|
||||
pCtx = pCtx->pParent;
|
||||
}while( pCtx );
|
||||
}
|
||||
return WRC_Continue;
|
||||
}
|
||||
|
||||
/*
|
||||
** The xSelect callback for the search of invalid ON clause terms.
|
||||
*/
|
||||
static int selectCheckOnClausesSelect(Walker *pWalker, Select *pSelect){
|
||||
CheckOnCtx *pCtx = pWalker->u.pCheckOnCtx;
|
||||
if( pSelect->pSrc==pCtx->pSrc || pSelect->pSrc->nSrc==0 ){
|
||||
return WRC_Continue;
|
||||
}else{
|
||||
CheckOnCtx sCtx;
|
||||
memset(&sCtx, 0, sizeof(sCtx));
|
||||
sCtx.pSrc = pSelect->pSrc;
|
||||
sCtx.pParent = pCtx;
|
||||
pWalker->u.pCheckOnCtx = &sCtx;
|
||||
sqlite3WalkSelect(pWalker, pSelect);
|
||||
pWalker->u.pCheckOnCtx = pCtx;
|
||||
pSelect->selFlags &= ~SF_OnToWhere;
|
||||
return WRC_Prune;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** Check all ON clauses in pSelect to verify that they do not reference
|
||||
** columns to the right.
|
||||
*/
|
||||
static void selectCheckOnClauses(Parse *pParse, Select *pSelect){
|
||||
Walker w;
|
||||
CheckOnCtx sCtx;
|
||||
assert( pSelect->selFlags & SF_OnToWhere );
|
||||
assert( pSelect->pSrc!=0 && pSelect->pSrc->nSrc>=2 );
|
||||
memset(&w, 0, sizeof(w));
|
||||
w.pParse = pParse;
|
||||
w.xExprCallback = selectCheckOnClausesExpr;
|
||||
w.xSelectCallback = selectCheckOnClausesSelect;
|
||||
w.u.pCheckOnCtx = &sCtx;
|
||||
memset(&sCtx, 0, sizeof(sCtx));
|
||||
sCtx.pSrc = pSelect->pSrc;
|
||||
sqlite3WalkExprNN(&w, pSelect->pWhere);
|
||||
pSelect->selFlags &= ~SF_OnToWhere;
|
||||
}
|
||||
|
||||
/*
|
||||
** Generate byte-code for the SELECT statement given in the p argument.
|
||||
**
|
||||
@@ -7622,6 +7726,18 @@ int sqlite3Select(
|
||||
}
|
||||
#endif
|
||||
|
||||
/* If the SELECT statement contains ON clauses that were moved into
|
||||
** the WHERE clause, go through and verify that none of the terms
|
||||
** in the ON clauses reference tables to the right of the ON clause.
|
||||
** Do this now, after name resolution, but before query flattening
|
||||
*/
|
||||
if( p->selFlags & SF_OnToWhere ){
|
||||
selectCheckOnClauses(pParse, p);
|
||||
if( pParse->nErr ){
|
||||
goto select_end;
|
||||
}
|
||||
}
|
||||
|
||||
/* If the SF_UFSrcCheck flag is set, then this function is being called
|
||||
** as part of populating the temp table for an UPDATE...FROM statement.
|
||||
** In this case, it is an error if the target object (pSrc->a[0]) name
|
||||
|
||||
+45
-8
@@ -274,7 +274,7 @@ static int cli_strncmp(const char *a, const char *b, size_t n){
|
||||
** Unix epoch (1970-01-01T00:00:00Z)
|
||||
*/
|
||||
static sqlite3_int64 timeOfDay(void){
|
||||
#if defined(_WIN32)
|
||||
#if defined(_WIN64)
|
||||
sqlite3_uint64 t;
|
||||
FILETIME tm;
|
||||
GetSystemTimePreciseAsFileTime(&tm);
|
||||
@@ -282,6 +282,19 @@ static sqlite3_int64 timeOfDay(void){
|
||||
t += 116444736000000000LL;
|
||||
t /= 10;
|
||||
return t;
|
||||
#elif defined(_WIN32)
|
||||
static sqlite3_vfs *clockVfs = 0;
|
||||
sqlite3_int64 t;
|
||||
if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0);
|
||||
if( clockVfs==0 ) return 0; /* Never actually happens */
|
||||
if( clockVfs->iVersion>=2 && clockVfs->xCurrentTimeInt64!=0 ){
|
||||
clockVfs->xCurrentTimeInt64(clockVfs, &t);
|
||||
}else{
|
||||
double r;
|
||||
clockVfs->xCurrentTime(clockVfs, &r);
|
||||
t = (sqlite3_int64)(r*86400000.0);
|
||||
}
|
||||
return t*1000;
|
||||
#else
|
||||
struct timeval sNow;
|
||||
(void)gettimeofday(&sNow,0);
|
||||
@@ -331,7 +344,7 @@ static void endTimer(FILE *out){
|
||||
sqlite3_int64 iEnd = timeOfDay();
|
||||
struct rusage sEnd;
|
||||
getrusage(RUSAGE_SELF, &sEnd);
|
||||
sqlite3_fprintf(out, "Run Time: real %.6f user %f sys %f\n",
|
||||
sqlite3_fprintf(out, "Run Time: real %.6f user %.6f sys %.6f\n",
|
||||
(iEnd - iBegin)*0.000001,
|
||||
timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
|
||||
timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
|
||||
@@ -410,10 +423,19 @@ static void endTimer(FILE *out){
|
||||
FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd;
|
||||
sqlite3_int64 ftWallEnd = timeOfDay();
|
||||
getProcessTimesAddr(hProcess,&ftCreation,&ftExit,&ftKernelEnd,&ftUserEnd);
|
||||
#ifdef _WIN64
|
||||
/* microsecond precision on 64-bit windows */
|
||||
sqlite3_fprintf(out, "Run Time: real %.6f user %f sys %f\n",
|
||||
(ftWallEnd - ftWallBegin)*0.000001,
|
||||
timeDiff(&ftUserBegin, &ftUserEnd),
|
||||
timeDiff(&ftKernelBegin, &ftKernelEnd));
|
||||
#else
|
||||
/* millisecond precisino on 32-bit windows */
|
||||
sqlite3_fprintf(out, "Run Time: real %.3f user %.3f sys %.3f\n",
|
||||
(ftWallEnd - ftWallBegin)*0.000001,
|
||||
timeDiff(&ftUserBegin, &ftUserEnd),
|
||||
timeDiff(&ftKernelBegin, &ftKernelEnd));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -950,7 +972,7 @@ static FILE * openChrSource(const char *zFile){
|
||||
** This routine reads a line of text from FILE in, stores
|
||||
** the text in memory obtained from malloc() and returns a pointer
|
||||
** to the text. NULL is returned at end of file, or if malloc()
|
||||
** fails.
|
||||
** fails, or if the length of the line is longer than about a gigabyte.
|
||||
**
|
||||
** If zLine is not NULL then it is a malloced buffer returned from
|
||||
** a previous call to this routine that may be reused.
|
||||
@@ -961,6 +983,10 @@ static char *local_getline(char *zLine, FILE *in){
|
||||
|
||||
while( 1 ){
|
||||
if( n+100>nLine ){
|
||||
if( nLine>=1073741773 ){
|
||||
free(zLine);
|
||||
return 0;
|
||||
}
|
||||
nLine = nLine*2 + 100;
|
||||
zLine = realloc(zLine, nLine);
|
||||
shell_check_oom(zLine);
|
||||
@@ -1905,7 +1931,7 @@ static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
|
||||
** Output the given string as a quoted string using SQL quoting conventions:
|
||||
**
|
||||
** (1) Single quotes (') within the string are doubled
|
||||
** (2) The whle string is enclosed in '...'
|
||||
** (2) The while string is enclosed in '...'
|
||||
** (3) Control characters other than \n, \t, and \r\n are escaped
|
||||
** using \u00XX notation and if such substitutions occur,
|
||||
** the whole string is enclosed in unistr('...') instead of '...'.
|
||||
@@ -2151,7 +2177,7 @@ static void output_json_string(FILE *out, const char *z, i64 n){
|
||||
** other than \t, \n, and \r\n
|
||||
**
|
||||
** If no escaping is needed (the common case) then set *ppFree to NULL
|
||||
** and return the original string. If escapingn is needed, write the
|
||||
** and return the original string. If escaping is needed, write the
|
||||
** escaped string into memory obtained from sqlite3_malloc64() or the
|
||||
** equivalent, and return the new string and set *ppFree to the new string
|
||||
** as well.
|
||||
@@ -6707,10 +6733,13 @@ static int db_int(sqlite3 *db, const char *zSql, ...){
|
||||
** Convert a 2-byte or 4-byte big-endian integer into a native integer
|
||||
*/
|
||||
static unsigned int get2byteInt(unsigned char *a){
|
||||
return (a[0]<<8) + a[1];
|
||||
return ((unsigned int)a[0]<<8) + (unsigned int)a[1];
|
||||
}
|
||||
static unsigned int get4byteInt(unsigned char *a){
|
||||
return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + a[3];
|
||||
return ((unsigned int)a[0]<<24)
|
||||
+ ((unsigned int)a[1]<<16)
|
||||
+ ((unsigned int)a[2]<<8)
|
||||
+ (unsigned int)a[3];
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -13240,12 +13269,20 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
|
||||
}else if( cli_strcmp(z,"-pagecache")==0 ){
|
||||
sqlite3_int64 n, sz;
|
||||
sz = integerValue(cmdline_option_value(argc,argv,++i));
|
||||
if( sz>70000 ) sz = 70000;
|
||||
if( sz>65536 ) sz = 65536;
|
||||
if( sz<0 ) sz = 0;
|
||||
n = integerValue(cmdline_option_value(argc,argv,++i));
|
||||
if( sz>0 && n>0 && 0xffffffffffffLL/sz<n ){
|
||||
n = 0xffffffffffffLL/sz;
|
||||
}
|
||||
if( sz>0 && (sz & (sz-1))==0 ){
|
||||
/* If SIZE is a power of two, round it up by the PCACHE_HDRSZ */
|
||||
int szHdr = 0;
|
||||
sqlite3_config(SQLITE_CONFIG_PCACHE_HDRSZ, &szHdr);
|
||||
sz += szHdr;
|
||||
sqlite3_fprintf(stdout, "Page cache size increased to %d to accommodate"
|
||||
" the %d-byte headers\n", (int)sz, szHdr);
|
||||
}
|
||||
verify_uninitialized();
|
||||
sqlite3_config(SQLITE_CONFIG_PAGECACHE,
|
||||
(n>0 && sz>0) ? malloc(n*sz) : 0, sz, n);
|
||||
|
||||
+88
-33
@@ -149,6 +149,9 @@ extern "C" {
|
||||
#define SQLITE_VERSION "--VERS--"
|
||||
#define SQLITE_VERSION_NUMBER --VERSION-NUMBER--
|
||||
#define SQLITE_SOURCE_ID "--SOURCE-ID--"
|
||||
#define SQLITE_SCM_BRANCH "--SCM-BRANCH--"
|
||||
#define SQLITE_SCM_TAGS "--SCM-TAGS--"
|
||||
#define SQLITE_SCM_DATETIME "--SCM-DATETIME--"
|
||||
|
||||
/*
|
||||
** CAPI3REF: Run-Time Library Version Numbers
|
||||
@@ -2340,17 +2343,20 @@ struct sqlite3_mem_methods {
|
||||
**
|
||||
** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]]
|
||||
** <dt>SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER</dt>
|
||||
** <dd> ^This option is used to enable or disable the
|
||||
** [fts3_tokenizer()] function which is part of the
|
||||
** [FTS3] full-text search engine extension.
|
||||
** There must be two additional arguments.
|
||||
** The first argument is an integer which is 0 to disable fts3_tokenizer() or
|
||||
** positive to enable fts3_tokenizer() or negative to leave the setting
|
||||
** unchanged.
|
||||
** The second parameter is a pointer to an integer into which
|
||||
** is written 0 or 1 to indicate whether fts3_tokenizer is disabled or enabled
|
||||
** following this call. The second parameter may be a NULL pointer, in
|
||||
** which case the new setting is not reported back. </dd>
|
||||
** <dd> ^This option is used to enable or disable using the
|
||||
** [fts3_tokenizer()] function - part of the [FTS3] full-text search engine
|
||||
** extension - without using bound parameters as the parameters. Doing so
|
||||
** is disabled by default. There must be two additional arguments. The first
|
||||
** argument is an integer. If it is passed 0, then using fts3_tokenizer()
|
||||
** without bound parameters is disabled. If it is passed a positive value,
|
||||
** then calling fts3_tokenizer without bound parameters is enabled. If it
|
||||
** is passed a negative value, this setting is not modified - this can be
|
||||
** used to query for the current setting. The second parameter is a pointer
|
||||
** to an integer into which is written 0 or 1 to indicate the current value
|
||||
** of this setting (after it is modified, if applicable). The second
|
||||
** parameter may be a NULL pointer, in which case the value of the setting
|
||||
** is not reported back. Refer to [FTS3] documentation for further details.
|
||||
** </dd>
|
||||
**
|
||||
** [[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION]]
|
||||
** <dt>SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION</dt>
|
||||
@@ -4200,6 +4206,34 @@ const void *sqlite3_errmsg16(sqlite3*);
|
||||
const char *sqlite3_errstr(int);
|
||||
int sqlite3_error_offset(sqlite3 *db);
|
||||
|
||||
/*
|
||||
** CAPI3REF: Set Error Codes And Message
|
||||
** METHOD: sqlite3
|
||||
**
|
||||
** Set the error code of the database handle passed as the first argument
|
||||
** to errcode, and the error message to a copy of nul-terminated string
|
||||
** zErrMsg. If zErrMsg is passed NULL, then the error message is set to
|
||||
** the default message associated with the supplied error code. Subsequent
|
||||
** calls to [sqlite3_errcode()] and [sqlite3_errmsg()] and similar will
|
||||
** return the values set by this routine in place of what was previously
|
||||
** set by SQLite itself.
|
||||
**
|
||||
** This function returns SQLITE_OK if the error code and error message are
|
||||
** successfully set, SQLITE_NOMEM if an OOM occurs, and SQLITE_MISUSE if
|
||||
** the database handle is NULL or invalid.
|
||||
**
|
||||
** The error code and message set by this routine remains in effect until
|
||||
** they are changed, either by another call to this routine or until they are
|
||||
** changed to by SQLite itself to reflect the result of some subsquent
|
||||
** API call.
|
||||
**
|
||||
** This function is intended for use by SQLite extensions or wrappers. The
|
||||
** idea is that an extension or wrapper can use this routine to set error
|
||||
** messages and error codes and thus behave more like a core SQLite
|
||||
** feature from the point of view of an application.
|
||||
*/
|
||||
int sqlite3_set_errmsg(sqlite3 *db, int errcode, const char *zErrMsg);
|
||||
|
||||
/*
|
||||
** CAPI3REF: Prepared Statement Object
|
||||
** KEYWORDS: {prepared statement} {prepared statements}
|
||||
@@ -6210,6 +6244,7 @@ void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*));
|
||||
** or a NULL pointer if there were no prior calls to
|
||||
** sqlite3_set_clientdata() with the same values of D and N.
|
||||
** Names are compared using strcmp() and are thus case sensitive.
|
||||
** It returns 0 on success and SQLITE_NOMEM on allocation failure.
|
||||
**
|
||||
** If P and X are both non-NULL, then the destructor X is invoked with
|
||||
** argument P on the first of the following occurrences:
|
||||
@@ -6245,7 +6280,7 @@ void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*));
|
||||
** languages or in other circumstances where it might be possible for an
|
||||
** attacker to invoke them. Any agent that can invoke these interfaces
|
||||
** can probably also take control of the process.
|
||||
**
|
||||
**
|
||||
** Database connection client data is only available for SQLite
|
||||
** version 3.44.0 ([dateof:3.44.0]) and later.
|
||||
**
|
||||
@@ -9781,7 +9816,7 @@ void sqlite3_log(int iErrCode, const char *zFormat, ...);
|
||||
** is the number of pages currently in the write-ahead log file,
|
||||
** including those that were just committed.
|
||||
**
|
||||
** The callback function should normally return [SQLITE_OK]. ^If an error
|
||||
** ^The callback function should normally return [SQLITE_OK]. ^If an error
|
||||
** code is returned, that error will propagate back up through the
|
||||
** SQLite code base to cause the statement that provoked the callback
|
||||
** to report an error, though the commit will have still occurred. If the
|
||||
@@ -9789,13 +9824,26 @@ void sqlite3_log(int iErrCode, const char *zFormat, ...);
|
||||
** that does not correspond to any valid SQLite error code, the results
|
||||
** are undefined.
|
||||
**
|
||||
** A single database handle may have at most a single write-ahead log callback
|
||||
** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any
|
||||
** previously registered write-ahead log callback. ^The return value is
|
||||
** a copy of the third parameter from the previous call, if any, or 0.
|
||||
** ^Note that the [sqlite3_wal_autocheckpoint()] interface and the
|
||||
** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will
|
||||
** overwrite any prior [sqlite3_wal_hook()] settings.
|
||||
** ^A single database handle may have at most a single write-ahead log
|
||||
** callback registered at one time. ^Calling [sqlite3_wal_hook()]
|
||||
** replaces the default behavior or previously registered write-ahead
|
||||
** log callback.
|
||||
**
|
||||
** ^The return value is a copy of the third parameter from the
|
||||
** previous call, if any, or 0.
|
||||
**
|
||||
** ^The [sqlite3_wal_autocheckpoint()] interface and the
|
||||
** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and
|
||||
** will overwrite any prior [sqlite3_wal_hook()] settings.
|
||||
**
|
||||
** ^If a write-ahead log callback is set using this function then
|
||||
** [sqlite3_wal_checkpoint_v2()] or [PRAGMA wal_checkpoint]
|
||||
** should be invoked periodically to keep the write-ahead log file
|
||||
** from growing without bound.
|
||||
**
|
||||
** ^Passing a NULL pointer for the callback disables automatic
|
||||
** checkpointing entirely. To re-enable the default behavior, call
|
||||
** sqlite3_wal_autocheckpoint(db,1000) or use [PRAGMA wal_checkpoint].
|
||||
*/
|
||||
void *sqlite3_wal_hook(
|
||||
sqlite3*,
|
||||
@@ -9812,7 +9860,7 @@ void *sqlite3_wal_hook(
|
||||
** to automatically [checkpoint]
|
||||
** after committing a transaction if there are N or
|
||||
** more frames in the [write-ahead log] file. ^Passing zero or
|
||||
** a negative value as the nFrame parameter disables automatic
|
||||
** a negative value as the N parameter disables automatic
|
||||
** checkpoints entirely.
|
||||
**
|
||||
** ^The callback registered by this function replaces any existing callback
|
||||
@@ -9828,9 +9876,10 @@ void *sqlite3_wal_hook(
|
||||
**
|
||||
** ^Every new [database connection] defaults to having the auto-checkpoint
|
||||
** enabled with a threshold of 1000 or [SQLITE_DEFAULT_WAL_AUTOCHECKPOINT]
|
||||
** pages. The use of this interface
|
||||
** is only necessary if the default setting is found to be suboptimal
|
||||
** for a particular application.
|
||||
** pages.
|
||||
**
|
||||
** ^The use of this interface is only necessary if the default setting
|
||||
** is found to be suboptimal for a particular application.
|
||||
*/
|
||||
int sqlite3_wal_autocheckpoint(sqlite3 *db, int N);
|
||||
|
||||
@@ -9895,6 +9944,11 @@ int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb);
|
||||
** ^This mode works the same way as SQLITE_CHECKPOINT_RESTART with the
|
||||
** addition that it also truncates the log file to zero bytes just prior
|
||||
** to a successful return.
|
||||
**
|
||||
** <dt>SQLITE_CHECKPOINT_NOOP<dd>
|
||||
** ^This mode always checkpoints zero frames. The only reason to invoke
|
||||
** a NOOP checkpoint is to access the values returned by
|
||||
** sqlite3_wal_checkpoint_v2() via output parameters *pnLog and *pnCkpt.
|
||||
** </dl>
|
||||
**
|
||||
** ^If pnLog is not NULL, then *pnLog is set to the total number of frames in
|
||||
@@ -9965,6 +10019,7 @@ int sqlite3_wal_checkpoint_v2(
|
||||
** See the [sqlite3_wal_checkpoint_v2()] documentation for details on the
|
||||
** meaning of each of these checkpoint modes.
|
||||
*/
|
||||
#define SQLITE_CHECKPOINT_NOOP -1 /* Do no work at all */
|
||||
#define SQLITE_CHECKPOINT_PASSIVE 0 /* Do as much as possible w/o blocking */
|
||||
#define SQLITE_CHECKPOINT_FULL 1 /* Wait for writers, then checkpoint */
|
||||
#define SQLITE_CHECKPOINT_RESTART 2 /* Like FULL but wait for readers */
|
||||
@@ -10985,15 +11040,15 @@ unsigned char *sqlite3_serialize(
|
||||
/*
|
||||
** CAPI3REF: Deserialize a database
|
||||
**
|
||||
** The sqlite3_deserialize(D,S,P,N,M,F) interface causes the [database
|
||||
** connection] D to disconnect from database S and then reopen S as an
|
||||
** in-memory database based on the serialization contained in P. If S
|
||||
** is a NULL pointer, the main database is used. The serialized
|
||||
** database P is N bytes in size. M is the size of the buffer P,
|
||||
** which might be larger than N. If M is larger than N, and the
|
||||
** SQLITE_DESERIALIZE_READONLY bit is not set in F, then SQLite is
|
||||
** permitted to add content to the in-memory database as long as the
|
||||
** total size does not exceed M bytes.
|
||||
** The sqlite3_deserialize(D,S,P,N,M,F) interface causes the
|
||||
** [database connection] D to disconnect from database S and then
|
||||
** reopen S as an in-memory database based on the serialization
|
||||
** contained in P. If S is a NULL pointer, the main database is
|
||||
** used. The serialized database P is N bytes in size. M is the size
|
||||
** of the buffer P, which might be larger than N. If M is larger than
|
||||
** N, and the SQLITE_DESERIALIZE_READONLY bit is not set in F, then
|
||||
** SQLite is permitted to add content to the in-memory database as
|
||||
** long as the total size does not exceed M bytes.
|
||||
**
|
||||
** If the SQLITE_DESERIALIZE_FREEONCLOSE bit is set in F, then SQLite will
|
||||
** invoke sqlite3_free() on the serialization buffer when the database
|
||||
|
||||
@@ -368,6 +368,8 @@ struct sqlite3_api_routines {
|
||||
int (*set_clientdata)(sqlite3*, const char*, void*, void(*)(void*));
|
||||
/* Version 3.50.0 and later */
|
||||
int (*setlk_timeout)(sqlite3*,int,int);
|
||||
/* Version 3.51.0 and later */
|
||||
int (*set_errmsg)(sqlite3*,int,const char*);
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -703,6 +705,8 @@ typedef int (*sqlite3_loadext_entry)(
|
||||
#define sqlite3_set_clientdata sqlite3_api->set_clientdata
|
||||
/* Version 3.50.0 and later */
|
||||
#define sqlite3_setlk_timeout sqlite3_api->setlk_timeout
|
||||
/* Version 3.51.0 and later */
|
||||
#define sqlite3_set_errmsg sqlite3_api->set_errmsg
|
||||
#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
|
||||
|
||||
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
|
||||
|
||||
@@ -3660,6 +3660,7 @@ struct Select {
|
||||
#define SF_OrderByReqd 0x8000000 /* The ORDER BY clause may not be omitted */
|
||||
#define SF_UpdateFrom 0x10000000 /* Query originates with UPDATE FROM */
|
||||
#define SF_Correlated 0x20000000 /* True if references the outer context */
|
||||
#define SF_OnToWhere 0x40000000 /* One or more ON clauses moved to WHERE */
|
||||
|
||||
/* True if SrcItem X is a subquery that has SF_NestedFrom */
|
||||
#define IsNestedFrom(X) \
|
||||
@@ -4413,6 +4414,7 @@ struct Walker {
|
||||
SrcItem *pSrcItem; /* A single FROM clause item */
|
||||
DbFixer *pFix; /* See sqlite3FixSelect() */
|
||||
Mem *aMem; /* See sqlite3BtreeCursorHint() */
|
||||
struct CheckOnCtx *pCheckOnCtx; /* See selectCheckOnClauses() */
|
||||
} u;
|
||||
};
|
||||
|
||||
|
||||
+1
-1
@@ -32,7 +32,7 @@
|
||||
|
||||
/****** Any edits to this file must mirrored in tclsqlite.c ***********/
|
||||
|
||||
/* Compatability between Tcl8.6 and Tcl9.0 */
|
||||
/* Compatibility between Tcl8.6 and Tcl9.0 */
|
||||
#if TCL_MAJOR_VERSION==9
|
||||
# define CONST const
|
||||
#elif !defined(Tcl_Size)
|
||||
|
||||
+5
-1
@@ -238,9 +238,13 @@ void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){
|
||||
n = 0;
|
||||
if( pItem->fg.isSubquery ) n++;
|
||||
if( pItem->fg.isTabFunc ) n++;
|
||||
if( pItem->fg.isUsing ) n++;
|
||||
if( pItem->fg.isUsing || pItem->u3.pOn!=0 ) n++;
|
||||
if( pItem->fg.isUsing ){
|
||||
sqlite3TreeViewIdList(pView, pItem->u3.pUsing, (--n)>0, "USING");
|
||||
}else if( pItem->u3.pOn!=0 ){
|
||||
sqlite3TreeViewItem(pView, "ON", (--n)>0);
|
||||
sqlite3TreeViewExpr(pView, pItem->u3.pOn, 0);
|
||||
sqlite3TreeViewPop(&pView);
|
||||
}
|
||||
if( pItem->fg.isSubquery ){
|
||||
assert( n==1 );
|
||||
|
||||
@@ -7960,6 +7960,7 @@ case OP_Checkpoint: {
|
||||
|| pOp->p2==SQLITE_CHECKPOINT_FULL
|
||||
|| pOp->p2==SQLITE_CHECKPOINT_RESTART
|
||||
|| pOp->p2==SQLITE_CHECKPOINT_TRUNCATE
|
||||
|| pOp->p2==SQLITE_CHECKPOINT_NOOP
|
||||
);
|
||||
rc = sqlite3Checkpoint(db, pOp->p1, pOp->p2, &aRes[1], &aRes[2]);
|
||||
if( rc ){
|
||||
|
||||
+3
-1
@@ -25,7 +25,9 @@
|
||||
#define HAVE_UTIME 1
|
||||
#else
|
||||
/* This is not VxWorks. */
|
||||
#define OS_VXWORKS 0
|
||||
#ifndef OS_VXWORKS
|
||||
# define OS_VXWORKS 0
|
||||
#endif
|
||||
#define HAVE_FCHOWN 1
|
||||
#define HAVE_READLINK 1
|
||||
#define HAVE_LSTAT 1
|
||||
|
||||
@@ -4297,7 +4297,8 @@ int sqlite3WalCheckpoint(
|
||||
|
||||
/* EVIDENCE-OF: R-62920-47450 The busy-handler callback is never invoked
|
||||
** in the SQLITE_CHECKPOINT_PASSIVE mode. */
|
||||
assert( eMode!=SQLITE_CHECKPOINT_PASSIVE || xBusy==0 );
|
||||
assert( SQLITE_CHECKPOINT_NOOP<SQLITE_CHECKPOINT_PASSIVE );
|
||||
assert( eMode>SQLITE_CHECKPOINT_PASSIVE || xBusy==0 );
|
||||
|
||||
if( pWal->readOnly ) return SQLITE_READONLY;
|
||||
WALTRACE(("WAL%p: checkpoint begins\n", pWal));
|
||||
@@ -4314,31 +4315,35 @@ int sqlite3WalCheckpoint(
|
||||
** EVIDENCE-OF: R-53820-33897 Even if there is a busy-handler configured,
|
||||
** it will not be invoked in this case.
|
||||
*/
|
||||
rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1);
|
||||
testcase( rc==SQLITE_BUSY );
|
||||
testcase( rc!=SQLITE_OK && xBusy2!=0 );
|
||||
if( rc==SQLITE_OK ){
|
||||
pWal->ckptLock = 1;
|
||||
if( eMode!=SQLITE_CHECKPOINT_NOOP ){
|
||||
rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1);
|
||||
testcase( rc==SQLITE_BUSY );
|
||||
testcase( rc!=SQLITE_OK && xBusy2!=0 );
|
||||
if( rc==SQLITE_OK ){
|
||||
pWal->ckptLock = 1;
|
||||
|
||||
/* IMPLEMENTATION-OF: R-59782-36818 The SQLITE_CHECKPOINT_FULL, RESTART and
|
||||
** TRUNCATE modes also obtain the exclusive "writer" lock on the database
|
||||
** file.
|
||||
**
|
||||
** EVIDENCE-OF: R-60642-04082 If the writer lock cannot be obtained
|
||||
** immediately, and a busy-handler is configured, it is invoked and the
|
||||
** writer lock retried until either the busy-handler returns 0 or the
|
||||
** lock is successfully obtained.
|
||||
*/
|
||||
if( eMode!=SQLITE_CHECKPOINT_PASSIVE ){
|
||||
rc = walBusyLock(pWal, xBusy2, pBusyArg, WAL_WRITE_LOCK, 1);
|
||||
if( rc==SQLITE_OK ){
|
||||
pWal->writeLock = 1;
|
||||
}else if( rc==SQLITE_BUSY ){
|
||||
eMode2 = SQLITE_CHECKPOINT_PASSIVE;
|
||||
xBusy2 = 0;
|
||||
rc = SQLITE_OK;
|
||||
/* IMPLEMENTATION-OF: R-59782-36818 The SQLITE_CHECKPOINT_FULL, RESTART
|
||||
** and TRUNCATE modes also obtain the exclusive "writer" lock on the
|
||||
** database file.
|
||||
**
|
||||
** EVIDENCE-OF: R-60642-04082 If the writer lock cannot be obtained
|
||||
** immediately, and a busy-handler is configured, it is invoked and the
|
||||
** writer lock retried until either the busy-handler returns 0 or the
|
||||
** lock is successfully obtained.
|
||||
*/
|
||||
if( eMode!=SQLITE_CHECKPOINT_PASSIVE ){
|
||||
rc = walBusyLock(pWal, xBusy2, pBusyArg, WAL_WRITE_LOCK, 1);
|
||||
if( rc==SQLITE_OK ){
|
||||
pWal->writeLock = 1;
|
||||
}else if( rc==SQLITE_BUSY ){
|
||||
eMode2 = SQLITE_CHECKPOINT_PASSIVE;
|
||||
xBusy2 = 0;
|
||||
rc = SQLITE_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
}else{
|
||||
rc = SQLITE_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -4352,7 +4357,7 @@ int sqlite3WalCheckpoint(
|
||||
** immediately and do a partial checkpoint if it cannot obtain it. */
|
||||
walDisableBlocking(pWal);
|
||||
rc = walIndexReadHdr(pWal, &isChanged);
|
||||
if( eMode2!=SQLITE_CHECKPOINT_PASSIVE ) (void)walEnableBlocking(pWal);
|
||||
if( eMode2>SQLITE_CHECKPOINT_PASSIVE ) (void)walEnableBlocking(pWal);
|
||||
if( isChanged && pWal->pDbFd->pMethods->iVersion>=3 ){
|
||||
sqlite3OsUnfetch(pWal->pDbFd, 0, 0);
|
||||
}
|
||||
@@ -4362,7 +4367,7 @@ int sqlite3WalCheckpoint(
|
||||
if( rc==SQLITE_OK ){
|
||||
if( pWal->hdr.mxFrame && walPagesize(pWal)!=nBuf ){
|
||||
rc = SQLITE_CORRUPT_BKPT;
|
||||
}else{
|
||||
}else if( eMode2!=SQLITE_CHECKPOINT_NOOP ){
|
||||
rc = walCheckpoint(pWal, db, eMode2, xBusy2, pBusyArg, sync_flags,zBuf);
|
||||
}
|
||||
|
||||
|
||||
@@ -1170,21 +1170,7 @@ static void exprAnalyze(
|
||||
prereqAll |= x;
|
||||
extraRight = x-1; /* ON clause terms may not be used with an index
|
||||
** on left table of a LEFT JOIN. Ticket #3015 */
|
||||
if( (prereqAll>>1)>=x ){
|
||||
sqlite3ErrorMsg(pParse, "ON clause references tables to its right");
|
||||
return;
|
||||
}
|
||||
}else if( (prereqAll>>1)>=x ){
|
||||
/* The ON clause of an INNER JOIN references a table to its right.
|
||||
** Most other SQL database engines raise an error. But SQLite versions
|
||||
** 3.0 through 3.38 just put the ON clause constraint into the WHERE
|
||||
** clause and carried on. Beginning with 3.39, raise an error only
|
||||
** if there is a RIGHT or FULL JOIN in the query. This makes SQLite
|
||||
** more like other systems, and also preserves legacy. */
|
||||
if( ALWAYS(pSrc->nSrc>0) && (pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){
|
||||
sqlite3ErrorMsg(pParse, "ON clause references tables to its right");
|
||||
return;
|
||||
}
|
||||
ExprClearProperty(pExpr, EP_InnerON);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
# 2025-09-02
|
||||
#
|
||||
# The author disclaims copyright to this source code. In place of
|
||||
# a legal notice, here is a blessing:
|
||||
#
|
||||
# May you do good and not evil.
|
||||
# May you find forgiveness for yourself and forgive others.
|
||||
# May you share freely, never taking more than you give.
|
||||
#
|
||||
#***********************************************************************
|
||||
#
|
||||
#
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
set testprefix bestindex1
|
||||
|
||||
ifcapable !vtab {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
|
||||
register_tcl_module db
|
||||
|
||||
proc pretty_constraint {lCol cons} {
|
||||
array set C $cons
|
||||
|
||||
set ret ""
|
||||
if {$C(usable)} {
|
||||
set OP(eq) =
|
||||
set ret "[lindex $lCol $C(column)]$OP($C(op))?"
|
||||
}
|
||||
|
||||
return $ret
|
||||
}
|
||||
|
||||
proc vtab_command {zName lCol method args} {
|
||||
switch -- $method {
|
||||
xConnect {
|
||||
return "CREATE TABLE $zName ([join $lCol ,]) "
|
||||
}
|
||||
|
||||
xBestIndex {
|
||||
set hdl [lindex $args 0]
|
||||
set conslist [$hdl constraints]
|
||||
|
||||
set ret [list]
|
||||
foreach cons $conslist {
|
||||
set pretty [pretty_constraint $lCol $cons]
|
||||
if {$pretty != ""} { lappend ret $pretty }
|
||||
}
|
||||
|
||||
lappend ::xBestIndex "$zName: [join $ret { AND }]"
|
||||
|
||||
return "cost 1000 rows 1000 idxnum 555"
|
||||
}
|
||||
}
|
||||
|
||||
return {}
|
||||
}
|
||||
|
||||
proc do_bestindex_test {tn sql lCons} {
|
||||
set ::xBestIndex [list]
|
||||
do_execsql_test $tn.1 $sql
|
||||
uplevel [list do_test $tn.2 [list set ::xBestIndex] [list {*}$lCons]]
|
||||
}
|
||||
|
||||
proc create_vtab {tname clist} {
|
||||
set cmd [list vtab_command $tname $clist]
|
||||
execsql "
|
||||
CREATE VIRTUAL TABLE $tname USING tcl('$cmd')
|
||||
"
|
||||
}
|
||||
|
||||
do_test 1.0 {
|
||||
create_vtab x1 {a b c}
|
||||
} {}
|
||||
|
||||
do_bestindex_test 1.1 {
|
||||
SELECT * FROM x1 WHERE a=?
|
||||
} {{x1: a=?}}
|
||||
|
||||
do_bestindex_test 1.2 {
|
||||
SELECT * FROM x1 WHERE a=? AND b=?
|
||||
} {{x1: a=? AND b=?}}
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
reset_db
|
||||
register_tcl_module db
|
||||
|
||||
do_test 2.0 {
|
||||
create_vtab Delivery {id customer}
|
||||
create_vtab ReturnDelivery {id customer}
|
||||
create_vtab Customer {oid name}
|
||||
} {}
|
||||
|
||||
do_bestindex_test 2.1 {
|
||||
SELECT Delivery.ID, Customer.Name
|
||||
FROM Delivery LEFT JOIN
|
||||
Customer ON Delivery.Customer = Customer.OID
|
||||
} {
|
||||
{Delivery: }
|
||||
{Customer: oid=?}
|
||||
}
|
||||
|
||||
do_bestindex_test 2.2 {
|
||||
SELECT * FROM
|
||||
(
|
||||
SELECT Delivery.ID, Customer.Name
|
||||
FROM Delivery LEFT JOIN
|
||||
Customer ON Delivery.Customer = Customer.OID
|
||||
|
||||
UNION
|
||||
|
||||
SELECT ReturnDelivery.ID, Customer.Name
|
||||
FROM ReturnDelivery LEFT JOIN
|
||||
Customer ON ReturnDelivery.Customer = Customer.OID
|
||||
)
|
||||
WHERE ID = 1
|
||||
} {
|
||||
{Delivery: id=?}
|
||||
{Customer: oid=?}
|
||||
{ReturnDelivery: id=?}
|
||||
{Customer: oid=?}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
finish_test
|
||||
+64
-4
@@ -14,20 +14,80 @@ set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
set testprefix cksumvfs
|
||||
|
||||
sqlite3_register_cksumvfs
|
||||
|
||||
db close
|
||||
sqlite3_shutdown
|
||||
#test_sqlite3_log logfunc
|
||||
sqlite3_initialize
|
||||
|
||||
proc logfunc {args} {
|
||||
puts "LOG: $args"
|
||||
}
|
||||
|
||||
sqlite3_register_cksumvfs
|
||||
sqlite3 db test.db
|
||||
|
||||
file_control_reservebytes db 8
|
||||
execsql {
|
||||
PRAGMA page_size = 4096;
|
||||
}
|
||||
|
||||
set text [db one "SELECT hex(randomblob(5000))"]
|
||||
|
||||
do_execsql_test 1.0 {
|
||||
CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
|
||||
INSERT INTO t1 VALUES(1, $text);
|
||||
CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
|
||||
INSERT INTO t1 VALUES(1, $text, NULL);
|
||||
}
|
||||
|
||||
do_execsql_test 1.1 {
|
||||
SELECT * FROM t1;
|
||||
} [list 1 $text]
|
||||
} [list 1 $text {}]
|
||||
|
||||
do_execsql_test 1.2 {
|
||||
DELETE FROM t1;
|
||||
}
|
||||
|
||||
do_test 1.3 {
|
||||
execsql BEGIN
|
||||
for {set ii 1500} {$ii < 10000} {incr ii} {
|
||||
execsql { INSERT INTO t1 VALUES(NULL, randomblob(5000), randomblob($ii)) }
|
||||
}
|
||||
execsql COMMIT
|
||||
} {}
|
||||
|
||||
do_execsql_test 1.4 {
|
||||
SELECT count(b) FROM t1
|
||||
} {8500}
|
||||
|
||||
do_execsql_test 1.5 {
|
||||
PRAGMA journal_mode = wal;
|
||||
DELETE FROM t1;
|
||||
} {wal}
|
||||
|
||||
do_execsql_test 1.6 {
|
||||
PRAGMA wal_checkpoint;
|
||||
} {/0 # #/}
|
||||
|
||||
do_execsql_test 1.7 {
|
||||
WITH s(i) AS (
|
||||
VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<100
|
||||
)
|
||||
INSERT INTO t1 SELECT NULL, randomblob(5000), randomblob(i) FROM s;
|
||||
SELECT count(*) FROM t1;
|
||||
} {100}
|
||||
|
||||
db_save_and_close
|
||||
db_restore_and_reopen
|
||||
|
||||
do_execsql_test 1.8 {
|
||||
SELECT count(*) FROM t1;
|
||||
} {100}
|
||||
|
||||
db close
|
||||
sqlite3 db test.db
|
||||
|
||||
do_execsql_test 1.9 {
|
||||
SELECT count(*) FROM t1;
|
||||
} {100}
|
||||
|
||||
finish_test
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
# 2025 September 5
|
||||
#
|
||||
# The author disclaims copyright to this source code. In place of
|
||||
# a legal notice, here is a blessing:
|
||||
#
|
||||
# May you do good and not evil.
|
||||
# May you find forgiveness for yourself and forgive others.
|
||||
# May you share freely, never taking more than you give.
|
||||
#
|
||||
#*************************************************************************
|
||||
# This file implements regression tests for SQLite library. The focus
|
||||
# of this script is testing the pluggable tokeniser feature of the
|
||||
# FTS3 module.
|
||||
#
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
|
||||
# If SQLITE_ENABLE_FTS3 is defined, omit this file.
|
||||
ifcapable !fts3 {
|
||||
finish_test
|
||||
return
|
||||
}
|
||||
|
||||
set ::testprefix fts3atoken2
|
||||
|
||||
|
||||
reset_db
|
||||
sqlite3_db_config db SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 0
|
||||
|
||||
# With ENABLE_FTS3_TOKENIZER set to 0:
|
||||
#
|
||||
# * It is not possible to get a pointer to a token implementation
|
||||
# using single arg fts3_tokenize() unless the name of the tokenizer
|
||||
# is a bound paramter - function should return NULL.
|
||||
#
|
||||
# * But it is possible with a bound parameter.
|
||||
#
|
||||
do_execsql_test 1.1.1 {
|
||||
SELECT typeof( fts3_tokenizer('simple') );
|
||||
} {null}
|
||||
set bound "simple"
|
||||
do_execsql_test 1.1.2 {
|
||||
SELECT typeof( fts3_tokenizer($bound) );
|
||||
} {blob}
|
||||
|
||||
# With ENABLE_FTS3_TOKENIZER set to 0:
|
||||
#
|
||||
# * It is not possible to create a token implementation using anything
|
||||
# other than a bound parameter.
|
||||
#
|
||||
# * But it is possible with a bound parameter.
|
||||
#
|
||||
set literal [db one {SELECT quote( fts3_tokenizer($bound) )}]
|
||||
set blob [db one {SELECT fts3_tokenizer($bound) }]
|
||||
|
||||
do_catchsql_test 1.2.1 "
|
||||
SELECT fts3_tokenizer('mytok', $literal)
|
||||
" {1 {fts3tokenize disabled}}
|
||||
do_catchsql_test 1.2.2 {
|
||||
CREATE VIRTUAL TABLE x1 USING fts3(col, tokenize=mytok);
|
||||
} {1 {unknown tokenizer: mytok}}
|
||||
do_catchsql_test 1.2.3 {
|
||||
SELECT fts3_tokenizer('mytok', $blob)
|
||||
} {0 {{}}}
|
||||
do_execsql_test 1.2.4 {
|
||||
CREATE VIRTUAL TABLE x1 USING fts3(col, tokenize=mytok);
|
||||
}
|
||||
|
||||
# With ENABLE_FTS3_TOKENIZER set to 1:
|
||||
#
|
||||
# * It is possible to get a pointer to a token implementation with either
|
||||
# a bound parameter or a literal.
|
||||
#
|
||||
sqlite3_db_config db SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1
|
||||
set bound "simple"
|
||||
do_execsql_test 1.3.1 {
|
||||
SELECT typeof( fts3_tokenizer('simple') );
|
||||
} {blob}
|
||||
do_execsql_test 1.3.2 {
|
||||
SELECT typeof( fts3_tokenizer($bound) );
|
||||
} {blob}
|
||||
|
||||
# With ENABLE_FTS3_TOKENIZER set to 1:
|
||||
#
|
||||
# * It is not possible to create a token implementation using either
|
||||
# a bound parameter or a literal.
|
||||
#
|
||||
set literal [db one {SELECT quote( fts3_tokenizer($bound) )}]
|
||||
set blob [db one {SELECT fts3_tokenizer($bound) }]
|
||||
|
||||
do_execsql_test 1.4.1 "
|
||||
SELECT typeof( fts3_tokenizer('mytok2', $literal) );
|
||||
" {blob}
|
||||
do_execsql_test 1.4.2 {
|
||||
CREATE VIRTUAL TABLE x2 USING fts3(col, tokenize=mytok2);
|
||||
}
|
||||
do_execsql_test 1.4.3 {
|
||||
SELECT typeof( fts3_tokenizer('mytok3', $blob) );
|
||||
} {blob}
|
||||
do_execsql_test 1.4.4 {
|
||||
CREATE VIRTUAL TABLE x3 USING fts3(col, tokenize=mytok3);
|
||||
}
|
||||
|
||||
finish_test
|
||||
|
||||
+125
@@ -0,0 +1,125 @@
|
||||
# 2022 May 17
|
||||
#
|
||||
# The author disclaims copyright to this source code. In place of
|
||||
# a legal notice, here is a blessing:
|
||||
#
|
||||
# May you do good and not evil.
|
||||
# May you find forgiveness for yourself and forgive others.
|
||||
# May you share freely, never taking more than you give.
|
||||
#
|
||||
#***********************************************************************
|
||||
# This file implements regression tests for SQLite library.
|
||||
#
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
set testprefix joinI
|
||||
|
||||
do_execsql_test 1.0 {
|
||||
CREATE TABLE t1(a INT);
|
||||
CREATE TABLE t2(b INT);
|
||||
CREATE TABLE t3(c INT);
|
||||
}
|
||||
|
||||
foreach {tn sql} {
|
||||
1 "SELECT * FROM t1 RIGHT JOIN t2 ON t2.b=t3.c CROSS JOIN t3"
|
||||
2 "SELECT * FROM t1 RIGHT JOIN t2 ON t2.b=(SELECT t3.c) CROSS JOIN t3"
|
||||
3 "SELECT * FROM t1 RIGHT JOIN t2 ON CASE WHEN t2.b THEN t3.c ELSE 1 END CROSS JOIN t3"
|
||||
} {
|
||||
do_catchsql_test 1.1.$tn $sql {1 {ON clause references tables to its right}}
|
||||
}
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
|
||||
do_execsql_test 2.0 {
|
||||
CREATE TABLE t0(c0 INT, c1 INT);
|
||||
CREATE TABLE t1 (c0 INT);
|
||||
|
||||
CREATE VIEW v1(c0) AS SELECT t0.c0 FROM t0 NATURAL RIGHT JOIN t1;
|
||||
CREATE VIEW v2(c0) AS SELECT 0 FROM v1;
|
||||
|
||||
INSERT INTO t0(c0, c1) VALUES (-1, 0);
|
||||
INSERT INTO t1(c0) VALUES (NULL);
|
||||
|
||||
SELECT * FROM v1 INNER JOIN (v2 CROSS JOIN t0) ON (t0.c0 < t0.c1);
|
||||
} {{} 0 -1 0}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
do_execsql_test 3.0 {
|
||||
CREATE TABLE t0(c0, c1);
|
||||
CREATE TABLE t1(v);
|
||||
CREATE TABLE t2(w);
|
||||
CREATE TABLE t3(x);
|
||||
CREATE TABLE t4(y);
|
||||
CREATE TABLE t5(z);
|
||||
}
|
||||
|
||||
do_execsql_test 3.1 {
|
||||
SELECT 1234 FROM t4
|
||||
RIGHT JOIN t5
|
||||
CROSS JOIN (t2 CROSS JOIN t0) AS a1 ON (a1.c0 < a1.c1);
|
||||
}
|
||||
|
||||
do_execsql_test 3.2 {
|
||||
SELECT 1234 FROM t4
|
||||
RIGHT JOIN t5
|
||||
CROSS JOIN (t2 CROSS JOIN t1 CROSS JOIN t0) AS a1 ON (a1.c0 < a1.c1);
|
||||
}
|
||||
|
||||
do_execsql_test 3.3 {
|
||||
SELECT 5678 FROM t0 RIGHT JOIN t1 ON (
|
||||
SELECT 1 FROM t2 RIGHT JOIN t3 ON t2.w
|
||||
) CROSS JOIN t4;
|
||||
}
|
||||
|
||||
do_catchsql_test 3.4 {
|
||||
SELECT 5678 FROM t0 RIGHT JOIN t1 ON (
|
||||
SELECT 1 FROM t2 RIGHT JOIN t3 ON t4.y
|
||||
) CROSS JOIN t4;
|
||||
} {1 {ON clause references tables to its right}}
|
||||
|
||||
do_execsql_test 3.5 {
|
||||
SELECT 5678 FROM t0 RIGHT JOIN t1 ON (
|
||||
SELECT 1 FROM t2 RIGHT JOIN t3 ON 0=t1.v
|
||||
) CROSS JOIN t4;
|
||||
}
|
||||
|
||||
do_catchsql_test 3.6 {
|
||||
SELECT 5678 FROM t0 RIGHT JOIN t1 ON (
|
||||
SELECT 1 FROM t2 RIGHT JOIN t3 ON max(0,t5.z) CROSS JOIN t5
|
||||
) CROSS JOIN t4;
|
||||
} {1 {ON clause references tables to its right}}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
do_execsql_test 4.0 {
|
||||
CREATE TABLE t1(a);
|
||||
CREATE TABLE t2(b);
|
||||
CREATE TABLE t3(c, d);
|
||||
}
|
||||
|
||||
do_catchsql_test 4.1 {
|
||||
SELECT c+d AS cd FROM t1 LEFT JOIN t2 ON (cd=5) CROSS JOIN t3;
|
||||
} {1 {ON clause references tables to its right}}
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
do_execsql_test 5.0 {
|
||||
CREATE TABLE parent1(parent1key, child1key, Child2key, child3key);
|
||||
CREATE TABLE child1 ( child1key NVARCHAR, value NVARCHAR );
|
||||
CREATE TABLE child2 ( child2key NVARCHAR, value NVARCHAR );
|
||||
}
|
||||
|
||||
do_execsql_test 5.1 {
|
||||
SELECT parent1.parent1key, child1.value, child2.value
|
||||
FROM parent1
|
||||
LEFT OUTER JOIN child1 ON child1.child1key = parent1.child1key
|
||||
INNER JOIN child2 ON child2.child2key = parent1.child2key;
|
||||
}
|
||||
|
||||
finish_test
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
# 2025 August 27
|
||||
#
|
||||
# The author disclaims copyright to this source code. In place of
|
||||
# a legal notice, here is a blessing:
|
||||
#
|
||||
# May you do good and not evil.
|
||||
# May you find forgiveness for yourself and forgive others.
|
||||
# May you share freely, never taking more than you give.
|
||||
#
|
||||
#***********************************************************************
|
||||
#
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
set testprefix reservebytes
|
||||
|
||||
|
||||
|
||||
reset_db
|
||||
file_control_reservebytes db 0
|
||||
|
||||
|
||||
do_execsql_test 1.0 {
|
||||
CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
|
||||
CREATE INDEX i1 ON t1(b, c);
|
||||
WITH s(i) AS (
|
||||
VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<1000
|
||||
)
|
||||
INSERT INTO t1 SELECT NULL, i, hex(randomblob(500)) FROM s;
|
||||
}
|
||||
|
||||
sqlite3 db2 test.db
|
||||
if {[permutation]=="prepare"} { db2 cache size 0 }
|
||||
|
||||
do_execsql_test -db db2 1.1 { PRAGMA integrity_check } {ok}
|
||||
|
||||
file_control_reservebytes db 8
|
||||
do_test 1.2.1 { hexio_read test.db 20 1 } {00}
|
||||
do_execsql_test -db db2 1.2.2 { PRAGMA integrity_check } {ok}
|
||||
|
||||
do_execsql_test 1.3.2 { VACUUM }
|
||||
do_execsql_test -db db2 1.3.4 { PRAGMA integrity_check } {ok}
|
||||
do_test 1.3.5 { hexio_read test.db 20 1 } {08}
|
||||
|
||||
file_control_reservebytes db 16
|
||||
do_test 1.4.1 { hexio_read test.db 20 1 } {08}
|
||||
do_execsql_test 1.4.2 { VACUUM }
|
||||
do_execsql_test -db db2 1.4.3 { PRAGMA integrity_check } {ok}
|
||||
do_test 1.4.4 { hexio_read test.db 20 1 } {10}
|
||||
|
||||
finish_test
|
||||
@@ -0,0 +1,83 @@
|
||||
# 2025 September 5
|
||||
#
|
||||
# The author disclaims copyright to this source code. In place of
|
||||
# a legal notice, here is a blessing:
|
||||
#
|
||||
# May you do good and not evil.
|
||||
# May you find forgiveness for yourself and forgive others.
|
||||
# May you share freely, never taking more than you give.
|
||||
#
|
||||
#***********************************************************************
|
||||
# This file implements regression tests for SQLite library. The
|
||||
# focus of this file is testing the operation of the library in
|
||||
# "PRAGMA wal_checkpoint = noop" mode.
|
||||
#
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
source $testdir/lock_common.tcl
|
||||
source $testdir/malloc_common.tcl
|
||||
source $testdir/wal_common.tcl
|
||||
|
||||
set testprefix walckpotnoop
|
||||
|
||||
ifcapable !wal {finish_test ; return }
|
||||
|
||||
do_execsql_test 1.0 {
|
||||
CREATE TABLE t1(x INTEGER PRIMARY KEY, y TEXT);
|
||||
CREATE INDEX i1 ON t1(y);
|
||||
PRAGMA journal_mode = wal;
|
||||
|
||||
WITH s(i) AS (
|
||||
SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000
|
||||
)
|
||||
INSERT INTO t1 SELECT NULL, hex(randomblob(64)) FROM s;
|
||||
} {wal}
|
||||
|
||||
do_execsql_test 1.1 {
|
||||
PRAGMA wal_checkpoint = noop;
|
||||
} {0 320 0}
|
||||
do_execsql_test 1.2 {
|
||||
PRAGMA wal_checkpoint = noop;
|
||||
} {0 320 0}
|
||||
do_execsql_test 1.3 {
|
||||
PRAGMA wal_checkpoint = passive;
|
||||
} {0 320 320}
|
||||
do_execsql_test 1.4 {
|
||||
PRAGMA wal_checkpoint = noop;
|
||||
} {0 320 320}
|
||||
|
||||
db_save_and_close
|
||||
db_restore_and_reopen
|
||||
do_execsql_test 1.5 {
|
||||
PRAGMA wal_checkpoint = noop;
|
||||
} {0 320 0}
|
||||
|
||||
db close
|
||||
sqlite3 db test.db
|
||||
do_execsql_test 1.6 {
|
||||
PRAGMA wal_checkpoint = noop;
|
||||
} {0 0 0}
|
||||
|
||||
do_catchsql_test 1.7 {
|
||||
BEGIN;
|
||||
DELETE FROM t1;
|
||||
PRAGMA wal_checkpoint = noop;
|
||||
} {1 {database table is locked}}
|
||||
|
||||
do_catchsql_test 1.8 {
|
||||
COMMIT;
|
||||
PRAGMA wal_checkpoint = noop;
|
||||
} {0 {0 5 0}}
|
||||
|
||||
explain_i {
|
||||
PRAGMA wal_checkpoint = noop;
|
||||
}
|
||||
|
||||
do_execsql_test 1.9 {
|
||||
PRAGMA journal_mode = delete;
|
||||
PRAGMA wal_checkpoint = noop;
|
||||
} {delete 0 -1 -1}
|
||||
|
||||
finish_test
|
||||
|
||||
@@ -55,6 +55,69 @@ do_execsql_test 2.4 {
|
||||
PRAGMA index_info(t3);
|
||||
} {}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
db collate mysort mysort
|
||||
db collate mysort2 mysort
|
||||
proc mysort {a b} { string compare $a $b }
|
||||
do_execsql_test 3.0 {
|
||||
CREATE TABLE t1(
|
||||
a PRIMARY KEY COLLATE mysort, b COLLATE mysort2
|
||||
) WITHOUT ROWID;
|
||||
INSERT INTO t1 VALUES(1, 2);
|
||||
}
|
||||
|
||||
db close
|
||||
sqlite3 db test.db
|
||||
|
||||
do_catchsql_test 3.1.1 {
|
||||
SELECT * FROM t1 WHERE a=1;
|
||||
} {1 {no such collation sequence: mysort}}
|
||||
do_test 3.1.2 {
|
||||
sqlite3_extended_errcode db
|
||||
} {SQLITE_ERROR_MISSING_COLLSEQ}
|
||||
|
||||
db collate mysort mysort
|
||||
|
||||
do_catchsql_test 3.2.1 {
|
||||
CREATE UNIQUE INDEX i1 ON t1(b);
|
||||
} {1 {no such collation sequence: mysort2}}
|
||||
do_test 3.2.2 {
|
||||
sqlite3_extended_errcode db
|
||||
} {SQLITE_ERROR_MISSING_COLLSEQ}
|
||||
|
||||
db close
|
||||
sqlite3 db test.db
|
||||
|
||||
do_catchsql_test 3.3.1 {
|
||||
CREATE UNIQUE INDEX i1 ON t1(1);
|
||||
} {1 {no such collation sequence: mysort}}
|
||||
do_test 3.3.2 {
|
||||
sqlite3_extended_errcode db
|
||||
} {SQLITE_ERROR_MISSING_COLLSEQ}
|
||||
|
||||
do_test 3.4.1 {
|
||||
list [catch {
|
||||
sqlite3_prepare_v3 db "CREATE UNIQUE INDEX i1 ON t1(1)" -1 0
|
||||
} msg] $msg
|
||||
} {1 {(1) no such collation sequence: mysort}}
|
||||
do_test 3.4.2 {
|
||||
sqlite3_extended_errcode db
|
||||
} {SQLITE_ERROR_MISSING_COLLSEQ}
|
||||
|
||||
sqlite3_extended_result_codes db 1
|
||||
|
||||
do_test 3.5.1 {
|
||||
list [catch {
|
||||
sqlite3_prepare_v3 db "CREATE UNIQUE INDEX i1 ON t1(1)" -1 0
|
||||
} msg] $msg
|
||||
} {1 {(257) no such collation sequence: mysort}}
|
||||
do_test 3.5.2 {
|
||||
sqlite3_extended_errcode db
|
||||
} {SQLITE_ERROR_MISSING_COLLSEQ}
|
||||
|
||||
do_catchsql_test 3.6 {
|
||||
SELECT * FROM t1 WHERE a=1;
|
||||
} {1 {no such collation sequence: mysort}}
|
||||
|
||||
finish_test
|
||||
|
||||
@@ -86,7 +86,7 @@ find . -type f -name '#*#' -exec rm -f \{} \; # emacs lock files
|
||||
find . -type f -name '*.o' -exec rm -f \{} \;
|
||||
find . -type f -name '*.so' -exec rm -f \{} \;
|
||||
|
||||
./configure && make dist
|
||||
./configure && ${MAKE-make} dist
|
||||
tar xzf sqlite-$VERSION.tar.gz
|
||||
mv sqlite-$VERSION $TARBALLNAME
|
||||
tar czf $TARBALLNAME.tar.gz $TARBALLNAME
|
||||
|
||||
+32
-3
@@ -79,6 +79,13 @@ set nVersion [eval format "%d%03d%03d" [split $zVersion .]]
|
||||
|
||||
# Get the source-id
|
||||
#
|
||||
proc file-content {fn} {
|
||||
set fd [open $fn rb]
|
||||
set rv [string trim [read $fd]]
|
||||
close $fd
|
||||
return $rv
|
||||
}
|
||||
|
||||
set PWD [pwd]
|
||||
cd $TOP
|
||||
set tmpfile $PWD/tmp-[clock millisec]-[expr {int(rand()*100000000000)}].txt
|
||||
@@ -89,12 +96,31 @@ if {![file exists $mksourceid] && [file exists ${mksourceid}.exe]} {
|
||||
set mksourceid ${mksourceid}.exe
|
||||
}
|
||||
exec $mksourceid manifest > $tmpfile
|
||||
set fd [open $tmpfile rb]
|
||||
set zSourceId [string trim [read $fd]]
|
||||
close $fd
|
||||
set zSourceId [file-content $tmpfile]
|
||||
file delete -force $tmpfile
|
||||
cd $PWD
|
||||
|
||||
# Collect SQLITE_SCM_BRANCH, SQLITE_SCM_TAGS, and SQLITE_SCM_DATETIME
|
||||
set zVerTime [lindex [lindex [split [file-content $TOP/manifest] "\n"] 1] 1]Z; # D-card
|
||||
if {![file exists $TOP/manifest.tags]} {
|
||||
puts stderr "WARNING: building sqlite3.h without manifest.tags, which is generated by the SCM."
|
||||
puts stderr "This means that we cannot record the tag/branch info. We will continue with "
|
||||
puts stderr "a placeholder value. To remedy this, run the following command from a "
|
||||
puts stderr "check-out:\n"
|
||||
puts stderr " fossil set manifest urt\n"
|
||||
set zSourceId [string range $zSourceId 1 end-13]-experimental; # Keep SHA3 hash length
|
||||
set zBranch "unknown"
|
||||
set zTags "unknown"
|
||||
} else {
|
||||
# Read the list of branch/tags from manifest.tags
|
||||
set content [file-content $TOP/manifest.tags];
|
||||
set zTags {}
|
||||
foreach {x tag} [lassign $content - zBranch] {
|
||||
if {$tag eq $zBranch} continue
|
||||
lappend zTags $tag
|
||||
}
|
||||
}
|
||||
|
||||
# Set up patterns for recognizing API declarations.
|
||||
#
|
||||
set varpattern {^[a-zA-Z][a-zA-Z_0-9 *]+sqlite3_[_a-zA-Z0-9]+(\[|;| =)}
|
||||
@@ -157,6 +183,9 @@ foreach file $filelist {
|
||||
regsub -- --VERS-- $line $zVersion line
|
||||
regsub -- --VERSION-NUMBER-- $line $nVersion line
|
||||
regsub -- --SOURCE-ID-- $line "$zSourceId" line
|
||||
regsub -- --SCM-BRANCH-- $line "$zBranch" line
|
||||
regsub -- --SCM-TAGS-- $line "$zTags" line
|
||||
regsub -- --SCM-DATETIME-- $line "$zVerTime" line
|
||||
|
||||
if {[regexp $varpattern $line] && ![regexp {^ *typedef} $line]} {
|
||||
set line "SQLITE_API $line"
|
||||
|
||||
@@ -1854,7 +1854,7 @@ static void replicaSide(SQLiteRsync *p){
|
||||
nRPage);
|
||||
}else{
|
||||
runSql(p,"INSERT INTO sendHash VALUES(1,1)");
|
||||
subdivideHashRange(p, 2, nRPage);
|
||||
subdivideHashRange(p, 2, nRPage-1);
|
||||
}
|
||||
sendHashMessages(p, 1, 1);
|
||||
runSql(p, "PRAGMA writable_schema=ON");
|
||||
|
||||
Reference in New Issue
Block a user