mirror of
https://github.com/ncruces/go-sqlite3.git
synced 2026-01-11 21:49:13 +00:00
SQLite 3.51.0.
This commit is contained in:
4
.github/workflows/test.yml
vendored
4
.github/workflows/test.yml
vendored
@@ -112,7 +112,7 @@ jobs:
|
|||||||
version: '10.1'
|
version: '10.1'
|
||||||
flags: '-test.v -test.short'
|
flags: '-test.v -test.short'
|
||||||
- name: openbsd
|
- name: openbsd
|
||||||
version: '7.7'
|
version: '7.8'
|
||||||
flags: '-test.v -test.short'
|
flags: '-test.v -test.short'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: test
|
needs: test
|
||||||
@@ -128,7 +128,7 @@ jobs:
|
|||||||
run: .github/workflows/build-test.sh
|
run: .github/workflows/build-test.sh
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
uses: cross-platform-actions/action@v0.29.0
|
uses: cross-platform-actions/action@v0.30.0
|
||||||
with:
|
with:
|
||||||
operating_system: ${{ matrix.os.name }}
|
operating_system: ${{ matrix.os.name }}
|
||||||
architecture: ${{ matrix.os.arch }}
|
architecture: ${{ matrix.os.arch }}
|
||||||
|
|||||||
12
conn.go
12
conn.go
@@ -420,21 +420,21 @@ func busyCallback(ctx context.Context, mod api.Module, pDB ptr_t, count int32) (
|
|||||||
// Status retrieves runtime status information about a database connection.
|
// Status retrieves runtime status information about a database connection.
|
||||||
//
|
//
|
||||||
// https://sqlite.org/c3ref/db_status.html
|
// https://sqlite.org/c3ref/db_status.html
|
||||||
func (c *Conn) Status(op DBStatus, reset bool) (current, highwater int, err error) {
|
func (c *Conn) Status(op DBStatus, reset bool) (current, highwater int64, err error) {
|
||||||
defer c.arena.mark()()
|
defer c.arena.mark()()
|
||||||
hiPtr := c.arena.new(intlen)
|
hiPtr := c.arena.new(8)
|
||||||
curPtr := c.arena.new(intlen)
|
curPtr := c.arena.new(8)
|
||||||
|
|
||||||
var i int32
|
var i int32
|
||||||
if reset {
|
if reset {
|
||||||
i = 1
|
i = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
rc := res_t(c.call("sqlite3_db_status", stk_t(c.handle),
|
rc := res_t(c.call("sqlite3_db_status64", stk_t(c.handle),
|
||||||
stk_t(op), stk_t(curPtr), stk_t(hiPtr), stk_t(i)))
|
stk_t(op), stk_t(curPtr), stk_t(hiPtr), stk_t(i)))
|
||||||
if err = c.error(rc); err == nil {
|
if err = c.error(rc); err == nil {
|
||||||
current = int(util.Read32[int32](c.mod, curPtr))
|
current = util.Read64[int64](c.mod, curPtr)
|
||||||
highwater = int(util.Read32[int32](c.mod, hiPtr))
|
highwater = util.Read64[int64](c.mod, hiPtr)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
3
const.go
3
const.go
@@ -234,7 +234,8 @@ const (
|
|||||||
DBSTATUS_DEFERRED_FKS DBStatus = 10
|
DBSTATUS_DEFERRED_FKS DBStatus = 10
|
||||||
DBSTATUS_CACHE_USED_SHARED DBStatus = 11
|
DBSTATUS_CACHE_USED_SHARED DBStatus = 11
|
||||||
DBSTATUS_CACHE_SPILL DBStatus = 12
|
DBSTATUS_CACHE_SPILL DBStatus = 12
|
||||||
// DBSTATUS_MAX DBStatus = 12
|
DBSTATUS_TEMPBUF_SPILL DBStatus = 13
|
||||||
|
// DBSTATUS_MAX DBStatus = 13
|
||||||
)
|
)
|
||||||
|
|
||||||
// DBConfig are the available database connection configuration options.
|
// DBConfig are the available database connection configuration options.
|
||||||
|
|||||||
Binary file not shown.
@@ -15,9 +15,9 @@ cp "$ROOT"/sqlite3/*.[ch] build/
|
|||||||
cp "$ROOT"/sqlite3/*.patch build/
|
cp "$ROOT"/sqlite3/*.patch build/
|
||||||
cd sqlite/
|
cd sqlite/
|
||||||
|
|
||||||
# https://sqlite.org/src/info/ba2174bdca7d1d1a
|
# https://sqlite.org/src/info/0e862bc9ed7aa9ae
|
||||||
curl -#L https://github.com/sqlite/sqlite/archive/b46738f.tar.gz | tar xz --strip-components=1
|
curl -#L https://github.com/sqlite/sqlite/archive/0b99392.tar.gz | tar xz --strip-components=1
|
||||||
# curl -#L https://sqlite.org/src/tarball/sqlite.tar.gz?r=ba2174bdca | tar xz --strip-components=1
|
# curl -#L https://sqlite.org/src/tarball/sqlite.tar.gz?r=0e862bc9ed | tar xz --strip-components=1
|
||||||
|
|
||||||
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
|
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
|
||||||
MSYS_NO_PATHCONV=1 nmake /f makefile.msc sqlite3.c "OPTS=-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT -DSQLITE_ENABLE_ORDERED_SET_AGGREGATES"
|
MSYS_NO_PATHCONV=1 nmake /f makefile.msc sqlite3.c "OPTS=-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT -DSQLITE_ENABLE_ORDERED_SET_AGGREGATES"
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ sqlite3_db_filename
|
|||||||
sqlite3_db_name
|
sqlite3_db_name
|
||||||
sqlite3_db_readonly
|
sqlite3_db_readonly
|
||||||
sqlite3_db_release_memory
|
sqlite3_db_release_memory
|
||||||
sqlite3_db_status
|
sqlite3_db_status64
|
||||||
sqlite3_declare_vtab
|
sqlite3_declare_vtab
|
||||||
sqlite3_errcode
|
sqlite3_errcode
|
||||||
sqlite3_errmsg
|
sqlite3_errmsg
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ func Test_init(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if version != "3.50.4" {
|
if version != "3.51.0" {
|
||||||
t.Error(version)
|
t.Error(version)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@@ -26,11 +26,16 @@ func NewContext(ctx context.Context) context.Context {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetSystemError(ctx context.Context) error {
|
func GetSystemError(ctx context.Context) error {
|
||||||
s := ctx.Value(moduleKey{}).(*moduleState)
|
// Test needed to simplify testing.
|
||||||
|
s, ok := ctx.Value(moduleKey{}).(*moduleState)
|
||||||
|
if ok {
|
||||||
return s.sysError
|
return s.sysError
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func SetSystemError(ctx context.Context, err error) {
|
func SetSystemError(ctx context.Context, err error) {
|
||||||
|
// Test needed to simplify testing.
|
||||||
s, ok := ctx.Value(moduleKey{}).(*moduleState)
|
s, ok := ctx.Value(moduleKey{}).(*moduleState)
|
||||||
if ok {
|
if ok {
|
||||||
s.sysError = err
|
s.sysError = err
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
# handle, and interrupt, sqlite3_busy_timeout.
|
# handle, and interrupt, sqlite3_busy_timeout.
|
||||||
--- sqlite3.c.orig
|
--- sqlite3.c.orig
|
||||||
+++ sqlite3.c
|
+++ sqlite3.c
|
||||||
@@ -184474,7 +184474,7 @@
|
@@ -186667,7 +186667,7 @@
|
||||||
if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
|
if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
|
||||||
#endif
|
#endif
|
||||||
if( ms>0 ){
|
if( ms>0 ){
|
||||||
|
|||||||
@@ -3,55 +3,54 @@ set -euo pipefail
|
|||||||
|
|
||||||
cd -P -- "$(dirname -- "$0")"
|
cd -P -- "$(dirname -- "$0")"
|
||||||
|
|
||||||
curl -#OL "https://sqlite.org/2025/sqlite-amalgamation-3500400.zip"
|
curl -#OL "https://sqlite.org/2025/sqlite-autoconf-3510000.tar.gz"
|
||||||
|
|
||||||
# Verify download.
|
# Verify download.
|
||||||
if hash=$(openssl dgst -sha3-256 sqlite-amalgamation-*.zip); then
|
if hash=$(openssl dgst -sha3-256 sqlite-autoconf-*.tar.gz); then
|
||||||
if ! [[ $hash =~ f131b68e6ba5fb891cc13ebb5ff9555054c77294cb92d8d1268bad5dba4fa2a1 ]]; then
|
if ! [[ $hash =~ fa52f9cc74dbca004aa650ae698036a3350611f672649e165078f4eae21d6a2e ]]; then
|
||||||
echo $hash
|
echo $hash
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi 2> /dev/null
|
fi 2> /dev/null
|
||||||
|
|
||||||
unzip -d . sqlite-amalgamation-*.zip
|
tar xzf sqlite-autoconf-*.tar.gz
|
||||||
mv sqlite-amalgamation-*/sqlite3.c .
|
|
||||||
mv sqlite-amalgamation-*/sqlite3.h .
|
|
||||||
mv sqlite-amalgamation-*/sqlite3ext.h .
|
|
||||||
rm -rf sqlite-amalgamation-*
|
|
||||||
|
|
||||||
# To test a snapshot:
|
# To test a snapshot instead:
|
||||||
# curl -# https://sqlite.org/snapshot/sqlite-snapshot-202410081727.tar.gz | tar xz
|
# curl -# https://sqlite.org/snapshot/sqlite-snapshot-202410081727.tar.gz | tar xz
|
||||||
# mv sqlite-snapshot-*/sqlite3.c .
|
|
||||||
# mv sqlite-snapshot-*/sqlite3.h .
|
mv sqlite-*/sqlite3.c .
|
||||||
# mv sqlite-snapshot-*/sqlite3ext.h .
|
mv sqlite-*/sqlite3.h .
|
||||||
# rm -rf sqlite-snapshot-*
|
mv sqlite-*/sqlite3ext.h .
|
||||||
|
rm -r sqlite-*
|
||||||
|
|
||||||
|
GITHUB_TAG="https://github.com/sqlite/sqlite/raw/version-3.51.0"
|
||||||
|
|
||||||
mkdir -p ext/
|
mkdir -p ext/
|
||||||
cd ext/
|
cd ext/
|
||||||
curl -#OL "https://github.com/sqlite/sqlite/raw/version-3.50.4/ext/misc/anycollseq.c"
|
curl -#OL "$GITHUB_TAG/ext/misc/anycollseq.c"
|
||||||
curl -#OL "https://github.com/sqlite/sqlite/raw/version-3.50.4/ext/misc/base64.c"
|
curl -#OL "$GITHUB_TAG/ext/misc/base64.c"
|
||||||
curl -#OL "https://github.com/sqlite/sqlite/raw/version-3.50.4/ext/misc/decimal.c"
|
curl -#OL "$GITHUB_TAG/ext/misc/decimal.c"
|
||||||
curl -#OL "https://github.com/sqlite/sqlite/raw/version-3.50.4/ext/misc/ieee754.c"
|
curl -#OL "$GITHUB_TAG/ext/misc/ieee754.c"
|
||||||
curl -#OL "https://github.com/sqlite/sqlite/raw/version-3.50.4/ext/misc/regexp.c"
|
curl -#OL "$GITHUB_TAG/ext/misc/regexp.c"
|
||||||
curl -#OL "https://github.com/sqlite/sqlite/raw/version-3.50.4/ext/misc/series.c"
|
curl -#OL "$GITHUB_TAG/ext/misc/series.c"
|
||||||
curl -#OL "https://github.com/sqlite/sqlite/raw/version-3.50.4/ext/misc/spellfix.c"
|
curl -#OL "$GITHUB_TAG/ext/misc/spellfix.c"
|
||||||
curl -#OL "https://github.com/sqlite/sqlite/raw/version-3.50.4/ext/misc/uint.c"
|
curl -#OL "$GITHUB_TAG/ext/misc/uint.c"
|
||||||
cd ~-
|
cd ~-
|
||||||
|
|
||||||
cd ../vfs/tests/mptest/testdata/
|
cd ../vfs/tests/mptest/testdata/
|
||||||
curl -#OL "https://github.com/sqlite/sqlite/raw/version-3.50.4/mptest/config01.test"
|
curl -#OL "$GITHUB_TAG/mptest/config01.test"
|
||||||
curl -#OL "https://github.com/sqlite/sqlite/raw/version-3.50.4/mptest/config02.test"
|
curl -#OL "$GITHUB_TAG/mptest/config02.test"
|
||||||
curl -#OL "https://github.com/sqlite/sqlite/raw/version-3.50.4/mptest/crash01.test"
|
curl -#OL "$GITHUB_TAG/mptest/crash01.test"
|
||||||
curl -#OL "https://github.com/sqlite/sqlite/raw/version-3.50.4/mptest/crash02.subtest"
|
curl -#OL "$GITHUB_TAG/mptest/crash02.subtest"
|
||||||
curl -#OL "https://github.com/sqlite/sqlite/raw/version-3.50.4/mptest/multiwrite01.test"
|
curl -#OL "$GITHUB_TAG/mptest/multiwrite01.test"
|
||||||
cd ~-
|
cd ~-
|
||||||
|
|
||||||
cd ../vfs/tests/mptest/wasm/
|
cd ../vfs/tests/mptest/wasm/
|
||||||
curl -#OL "https://github.com/sqlite/sqlite/raw/version-3.50.4/mptest/mptest.c"
|
curl -#OL "$GITHUB_TAG/mptest/mptest.c"
|
||||||
cd ~-
|
cd ~-
|
||||||
|
|
||||||
cd ../vfs/tests/speedtest1/wasm/
|
cd ../vfs/tests/speedtest1/wasm/
|
||||||
curl -#OL "https://github.com/sqlite/sqlite/raw/version-3.50.4/test/speedtest1.c"
|
curl -#OL "$GITHUB_TAG/test/speedtest1.c"
|
||||||
cd ~-
|
cd ~-
|
||||||
|
|
||||||
cat *.patch | patch -p0 --no-backup-if-mismatch
|
cat *.patch | patch -p0 --no-backup-if-mismatch
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# Remove VFS registration. Go handles it.
|
# Remove VFS registration. Go handles it.
|
||||||
--- sqlite3.c.orig
|
--- sqlite3.c.orig
|
||||||
+++ sqlite3.c
|
+++ sqlite3.c
|
||||||
@@ -26884,7 +26884,7 @@
|
@@ -27176,7 +27176,7 @@
|
||||||
sqlite3_free(p);
|
sqlite3_free(p);
|
||||||
return sqlite3_os_init();
|
return sqlite3_os_init();
|
||||||
}
|
}
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
/*
|
/*
|
||||||
** The list of all registered VFS implementations.
|
** The list of all registered VFS implementations.
|
||||||
*/
|
*/
|
||||||
@@ -26981,7 +26981,7 @@
|
@@ -27273,7 +27273,7 @@
|
||||||
sqlite3_mutex_leave(mutex);
|
sqlite3_mutex_leave(mutex);
|
||||||
return SQLITE_OK;
|
return SQLITE_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@@ -20,11 +20,12 @@ The main differences to be aware of are
|
|||||||
### File Locking
|
### File Locking
|
||||||
|
|
||||||
POSIX advisory locks,
|
POSIX advisory locks,
|
||||||
which SQLite uses on [Unix](https://github.com/sqlite/sqlite/blob/5d60f4/src/os_unix.c#L13-L14),
|
which SQLite uses on [Unix](https://github.com/sqlite/sqlite/blob/41fda52/src/os_unix.c#L13-L14),
|
||||||
are [broken by design](https://github.com/sqlite/sqlite/blob/5d60f4/src/os_unix.c#L1074-L1162).
|
are [broken by design](https://github.com/sqlite/sqlite/blob/41fda52/src/os_unix.c#L1188-L1276).
|
||||||
Instead, on Linux and macOS, this package uses
|
Instead, on Linux and macOS, this package uses
|
||||||
[OFD locks](https://gnu.org/software/libc/manual/html_node/Open-File-Description-Locks.html)
|
[OFD locks](https://sourceware.org/glibc/manual/2.25/html_node/Open-File-Description-Locks.html)
|
||||||
to synchronize access to database files.
|
to synchronize access to database files.
|
||||||
|
OFD locks require [Linux 3.15](https://lwn.net/Articles/586904/).
|
||||||
|
|
||||||
This package can also use
|
This package can also use
|
||||||
[BSD locks](https://man.freebsd.org/cgi/man.cgi?query=flock&sektion=2),
|
[BSD locks](https://man.freebsd.org/cgi/man.cgi?query=flock&sektion=2),
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ func (h *hbshVFS) OpenFilename(name *vfs.Filename, flags vfs.OpenFlag) (file vfs
|
|||||||
|
|
||||||
if hbsh == nil {
|
if hbsh == nil {
|
||||||
file.Close()
|
file.Close()
|
||||||
return nil, flags, sqlite3.CANTOPEN
|
return nil, flags, sqlite3.IOERR_BADKEY
|
||||||
}
|
}
|
||||||
return &hbshFile{File: file, hbsh: hbsh, init: h.init}, flags, nil
|
return &hbshFile{File: file, hbsh: hbsh, init: h.init}, flags, nil
|
||||||
}
|
}
|
||||||
@@ -108,7 +108,7 @@ func (h *hbshFile) Pragma(name string, value string) (string, error) {
|
|||||||
if h.hbsh = h.init.HBSH(key); h.hbsh != nil {
|
if h.hbsh = h.init.HBSH(key); h.hbsh != nil {
|
||||||
return "ok", nil
|
return "ok", nil
|
||||||
}
|
}
|
||||||
return "", sqlite3.CANTOPEN
|
return "", sqlite3.IOERR_BADKEY
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *hbshFile) ReadAt(p []byte, off int64) (n int, err error) {
|
func (h *hbshFile) ReadAt(p []byte, off int64) (n int, err error) {
|
||||||
|
|||||||
@@ -207,6 +207,10 @@ type blockingSharedMemory interface {
|
|||||||
shmEnableBlocking(block bool)
|
shmEnableBlocking(block bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FileControl makes it easy to forward all fileControl methods,
|
||||||
|
// which we want to do for the checksum VFS.
|
||||||
|
// However, this is not a safe default, and other VFSes
|
||||||
|
// should explicitly wrap the methods they want to wrap.
|
||||||
type fileControl interface {
|
type fileControl interface {
|
||||||
File
|
File
|
||||||
fileControl(ctx context.Context, mod api.Module, op _FcntlOpcode, pArg ptr_t) _ErrorCode
|
fileControl(ctx context.Context, mod api.Module, op _FcntlOpcode, pArg ptr_t) _ErrorCode
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ func (n *Filename) URIParameter(key string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parse the format from:
|
// Parse the format from:
|
||||||
// https://github.com/sqlite/sqlite/blob/b74eb0/src/pager.c#L4797-L4840
|
// https://github.com/sqlite/sqlite/blob/41fda52/src/pager.c#L4821-L4864
|
||||||
// This avoids having to alloc/free the key just to find a value.
|
// This avoids having to alloc/free the key just to find a value.
|
||||||
for {
|
for {
|
||||||
k := util.ReadString(n.mod, ptr, _MAX_NAME)
|
k := util.ReadString(n.mod, ptr, _MAX_NAME)
|
||||||
@@ -160,7 +160,7 @@ func (n *Filename) URIParameters() url.Values {
|
|||||||
var params url.Values
|
var params url.Values
|
||||||
|
|
||||||
// Parse the format from:
|
// Parse the format from:
|
||||||
// https://github.com/sqlite/sqlite/blob/b74eb0/src/pager.c#L4797-L4840
|
// https://github.com/sqlite/sqlite/blob/41fda52/src/pager.c#L4821-L4864
|
||||||
// This is the only way to support multiple valued keys.
|
// This is the only way to support multiple valued keys.
|
||||||
for {
|
for {
|
||||||
k := util.ReadString(n.mod, ptr, _MAX_NAME)
|
k := util.ReadString(n.mod, ptr, _MAX_NAME)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -55,7 +55,7 @@ func (x *xtsVFS) OpenFilename(name *vfs.Filename, flags vfs.OpenFlag) (file vfs.
|
|||||||
|
|
||||||
if cipher == nil {
|
if cipher == nil {
|
||||||
file.Close()
|
file.Close()
|
||||||
return nil, flags, sqlite3.CANTOPEN
|
return nil, flags, sqlite3.IOERR_BADKEY
|
||||||
}
|
}
|
||||||
return &xtsFile{File: file, cipher: cipher, init: x.init}, flags, nil
|
return &xtsFile{File: file, cipher: cipher, init: x.init}, flags, nil
|
||||||
}
|
}
|
||||||
@@ -103,7 +103,7 @@ func (x *xtsFile) Pragma(name string, value string) (string, error) {
|
|||||||
if x.cipher = x.init.XTS(key); x.cipher != nil {
|
if x.cipher = x.init.XTS(key); x.cipher != nil {
|
||||||
return "ok", nil
|
return "ok", nil
|
||||||
}
|
}
|
||||||
return "", sqlite3.CANTOPEN
|
return "", sqlite3.IOERR_BADKEY
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *xtsFile) ReadAt(p []byte, off int64) (n int, err error) {
|
func (x *xtsFile) ReadAt(p []byte, off int64) (n int, err error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user