P5.1: vendor SQLite 3.53.2 + sx bindings

Subplan 02 Slice 2 foundation. vendor/sqlite/ holds the amalgamation
(provenance + upgrade notes in its README); make build compiles it into
build/vendor/libsqlite3.a (statically linked into dist via -L) and
build/vendor/jit/libsqlite3.dylib (dlopen'd by sx run via tests/run.sh's
-L flag) — separate directories because the macOS linker prefers a dylib
over an archive in one search dir.

The sx JIT resolves #foreign symbols via dlsym(RTLD_DEFAULT), where the
already-loaded OS libsqlite3 wins by load order — so the vendored build
renames its API to dist_sqlite3_* (vendor/sqlite/rename.h, -include'd),
making resolution unambiguous in both modes: those symbols exist only in
the vendored products.

src/db/sqlite.sx binds the renamed surface behind Sqlite/SqliteStmt
(open/exec/prepare/bind/step/column/finalize, errmsg, last_insert_rowid,
changes, libversion); opaque handles cross the FFI as usize, strings
read from sqlite are copied before its buffers die.

make test 20/20 (new: sqlite_smoke.sx — pins the loaded version to the
vendored 3.53.2, round trip, reopen persistence, BEGIN/ROLLBACK, errmsg;
also verified as an AOT binary with no libsqlite3 in otool -L).
This commit is contained in:
agra
2026-06-12 12:07:22 +03:00
parent aea3d62b60
commit afec94a113
8 changed files with 284184 additions and 4 deletions

View File

@@ -7,10 +7,16 @@
# process.assert — and exits non-zero on failure.
#
# Locate the compiler via SX (overridable); defaults to the sibling sx repo.
#
# `-L build/vendor/jit` lets the JIT dlopen the VENDORED libsqlite3.dylib
# (built by `make build`) instead of falling back to the OS copy — the
# version assert in tests/sqlite_smoke.sx depends on it.
set -u
SX="${SX:-/Users/agra/projects/sx/zig-out/bin/sx}"
TESTS_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
REPO_DIR=$(CDPATH= cd -- "$TESTS_DIR/.." && pwd)
SX_RUN_FLAGS="-L $REPO_DIR/build/vendor/jit"
pass=0
fail=0
@@ -20,7 +26,7 @@ fail=0
# pass/fail counters survive).
for t in $(find "$TESTS_DIR" -name '*.sx' -type f | sort); do
name=${t#"$TESTS_DIR"/}
if "$SX" run "$t" >/dev/null 2>&1; then
if "$SX" run "$t" $SX_RUN_FLAGS >/dev/null 2>&1; then
printf ' %-44s ok\n' "$name"
pass=$((pass + 1))
else