AsaDB v1.3.1 Release Candidate
Pre-releaseAsaDB v1.3.1 Release Candidate Notes
Released: 2026-07-21
Status: Release Candidate (Linux, source, and Windows source-launcher archives verified; portable Windows executable rebuild pending)
Publication summary: RELEASE.md
Compatibility matrix: COMPATIBILITY.md
1.3.1 editor completion and query stability
What changed from 1.3.0
| Area | 1.3.0 baseline | 1.3.1 improvement | Why it matters |
|---|---|---|---|
| SQL authoring | Users had to remember spelling and local schema names. | The editor proposes supported keywords, types, functions, database/table/view names, aliases, and columns from the local catalog. | Fewer avoidable syntax and identifier mistakes without an external editor dependency. |
| Syntax feedback | Some supported token classes remained plain, and analysis could briefly show an obsolete semicolon warning. | Modern and legacy bundles share complete supported-syntax coloring; an edit invalidates stale analysis immediately. | The editor gives a consistent, current explanation of what AsaDB will parse. |
| Interface typography | ID and EN could use a different family from JP. | ID, JP, and EN use the same Noto Sans JP family. | Labels, SQL-adjacent feedback, and CJK text align consistently across language changes. |
| Bounded query window | ORDER BY * performed needless whole-result sorting even though it has compatible no-op semantics. |
The executor recognizes it as a no-op before materialization/sort work. | A limited result can stop at its window instead of spending time sorting rows that will never be shown. |
| Operational resilience | Source snapshots and a supervised external command required manual tooling. | Asa Process Guardian adds opt-in SHA-256 mirrors, state/log records, heartbeat auditing, and bounded recovery. | Operations can observe and recover a launcher process without changing the SQL executor or storage engine. |
| Windows access | A native executable rebuild requires a Windows toolchain. | A checksummed Windows source-launcher ZIP now ships the same source and .bat launchers. |
Windows users can run the current source with an installed SWI-Prolog while the embedded executable remains a separate native build. |
What is in the 1.3.1 set
- Linux x86_64 source/runtime-target archive with SHA-256.
- Windows source-launcher ZIP with SHA-256,
run_asadb.bat, and
run_panel.bat; it requires a compatible SWI-Prolog onPATH. - Main-repository source archive with SHA-256 and an unpacked source tree.
- Core SQL, storage, Reservoir, browser bundles, localization assets, tests,
POSIX launchers, Windows batch launchers, build scripts, GPL notices, and
the opt-in Asa Process Guardian launcher.
Why the release is stronger
The editor improvements reuse existing catalog data and checked-in browser
bundles rather than adding a heavyweight framework or a request per keystroke.
The executor fix removes work that cannot affect the result, while the
operational companion is deliberately outside the database execution path.
Together, the changes improve guidance and observability without widening the
SQL/storage compatibility contract.
v1.3.1 adds a lightweight schema-aware SQL completion
popup to AsAPanel. It reuses the already-refreshed local catalog rather than
adding an editor framework or a network request per keystroke. Completion
covers the AsaDB lexer keywords, supported types, scalar/aggregate functions,
database/table/view names, table columns, and aliases declared in FROM and
JOIN. Keyboard selection uses Up/Down, Enter or Tab; Esc closes it and
Ctrl+Space opens it on demand. The checked-in Firefox-38 bundle contains the
same implementation and the UI regression gate covers both bundles. It also
aligns ID/JP/EN interface font selection to Noto Sans JP, completes lexer-based
syntax coloring across the supported command surface, treats ORDER BY * as
the historical no-op without sorting the full result set, and invalidates stale
semicolon diagnostics as soon as the SQL text changes.
Asa Process Guardian is now available as an opt-in operational companion. It
creates a SHA-256-tracked rolling source mirror, preserves a bounded audit log,
and can supervise an external child process with heartbeat checks and bounded
crash recovery. It remains outside the SQL execution path.
The Windows source-launcher ZIP now ships the same 1.3.1 source tree with
run_asadb.bat and run_panel.bat, plus its own SHA-256 file. It requires an
installed compatible SWI-Prolog; the separately embedded portable executable
remains pending a native Windows rebuild.
1.3.0 cumulative release validation
This is a maintenance and stability release carried forward from v1.2.1 with
no SQL feature-surface break. The cumulative package fixes the Reservoir live
metadata/reload/cancel path, removes the 500-row table/result ceiling, keeps
large SQL gutters populated, adds the single-worker karyawan.pl adviser, and
reduces stress-import overhead with bounded batching. The final package set was
validated on 4MLinux 51.2 (Linux 6.12.94, Intel Core i5-6300U, 8 GB RAM).
Linux and source archives were checksum-verified and the Windows portable
archive was rebuilt from the same sources and smoke-tested under Wine.
v1.2.1 -> v1.3.0 capability jump
The GitHub AsaDB v1.2.1 line is the comparison baseline; no intermediate
release is being claimed. AsaDB 1.3.0 keeps the v1.2.1 SQL/storage contract
while adding the operational pieces needed for large, interactive workloads:
| Area | v1.2.1 baseline | v1.3.0 release strength |
|---|---|---|
| Large imports | Multi-minute scripts and bounded batching | Reservoir admission, live progress, rollback/cancel, 256-statement parsing, and bounded storage appends |
| Reservoir | No durable live-job recovery path | Single-worker queue, spool safety, idempotency, reload recovery, adaptive metadata polling, and Windows-safe cancellation |
| Karyawan | Not present | Pure-Prolog ingress/egress adviser for chunk sizing, pressure, health, and result-page bounds; no R runtime |
| SQL editor | Large paste could lose gutter/scroll state | Virtualized gutter, caret/scroll preservation, legacy Firefox-compatible loader, and full paste visibility |
| Results/catalog | Practical 500-row display ceiling | Paged SQL results, table previews, searchable Show-more table chooser, and metadata-backed COUNT |
| JOIN execution | Qualified JOINs could materialize too much or fall back to quadratic work | AVL equality JOINs plus source predicate pushdown and unique-key lookup for filtered 250k-row joins |
| Release portability | Linux/source workflow only | Linux x86_64 tar.Z, Win32 portable ZIP, main-repo tar.Z, each with SHA-256 and synchronized sources |
Release-host stress audit
Measured on 4MLinux 6.12.94, Intel Core i5-6300U @ 2.40 GHz, with
8,022,200 kB RAM visible. A clean 250,000-row audit completed with zero import
errors: the best interactive run reported by the maintainer was
Double_Company.sql 04:01.87 and Double_Company_Status.sql 00:31.60;
the cold fresh rerun in this audit measured 06:58.32 and 01:03.45.
The spread is recorded honestly because disk/cache and panel-vs-direct-stream
conditions materially affect a write-heavy import.
In both runs, the analysis view was created successfully, the filtered
qualified JOIN returned its 20 matching rows, and the view query returned its
20 rows. The maintainer's measured query windows were 83–89 ms for view
creation, 122–138 ms for the filtered JOIN, and 320–353 ms for the
analysis-view SELECT; the cold direct audit measured 91 ms and 852 ms
for the two SELECTs.
The repeatable storage stress suite on the same host passed at every size:
| Rows | Wall time | Import | Indexed lookup | ORDER/LIMIT | Update | Delete | Limited result | Peak RSS |
|---|---|---|---|---|---|---|---|---|
| 10,000 | 4.59 s | 2.02 s | 1.60 s | 43 ms | 54 ms | 50 ms | 254 ms | 166.1 MiB |
| 50,000 | 33.00 s | 11.93 s | 19.15 s | 48 ms | 346 ms | 330 ms | 622 ms | 387.7 MiB |
| 100,000 | 59.21 s | 32.20 s | 24.31 s | 22 ms | 617 ms | 572 ms | 576 ms | 387.6 MiB |
Against the published v1.2.1 reference of approximately 247 s for the
100,000-row full scenario, the current 4MLinux run is approximately 76%
faster wall-clock. The reference was recorded on a different Windows host;
the comparison is directional, while the 1.3.0 numbers above are the actual
release-host measurements. Peak RSS is reported rather than marketed as an
improvement: this native 4MLinux run measured about 387.6 MiB.
Table paging and Karyawan adviser
- Removed the panel's practical 500-row dead end. SQL command results expose a
Show moreaction that requests the next ordered page from/api/query
using a boundedLIMIT/OFFSETpath, then appends rows without rerunning the
first page. Multi-statement commands keep their existing result behavior. - Table detail previews use the same page loader for large backend tables and
views. Stale requests are ignored when the user switches tables, and the
control is disabled while a page is in flight. - The sidebar table chooser keeps its text filter and now renders a small
Show more tablescontrol at the end. Clicking it or reaching it during
scrolling reveals another bounded slice, so a large catalog does not build a
huge DOM all at once. - Added
src/bridge/karyawan.pl, a pure-Prolog helper. It advises ingress chunk size, queue
pressure, backend health, and bounded egress page size while preserving the
Reservoir's one-worker execution invariant. No R runtime is required. - Added release/package coverage for the helper and page-aware frontend bytes;
Linux, Windows portable, and main-repo archives are rebuilt from these
current sources with separate SHA-256 manifests.
Large SQL paste and stress-import audit
- Fixed the large-script line-number gutter. Its virtualized top/bottom
padding now belongs to an inner content layer instead of the clipped gutter
viewport; pasting thousands of lines no longer leaves the numbers above the
visible area blank. - Increased the default import parser batch to 256 statements and bounded
record appends to 8,192 rows per storage pass. The larger parser batches
reduce repeated execution overhead, while the storage chunk keeps generated
Double_Companyworkloads below the Prolog stack limit. - The allowed Linux stress-file resolver now accepts the checked-in
Double_Company.sqlcasing even though request paths are normalized for
safe comparison.
Stable AsAPanel update
- Added a compact ID / JP / EN language switch alongside Save and Delete. It updates every
static page, dynamic counters and status text, metadata, confirmations,
results, diagnostics, execution logs, and Asa success/correction/error copy.
The choice persists in local browser storage. - Fixed large SQL paste scroll anchoring. The editor now retains the caret and
viewport through highlight/gutter rerenders, uses a paste-specific restore,
disables browser scroll anchoring, contains overscroll, and reserves stable
scrollbar space. - Hardened DROP TABLE and DROP DATABASE in AsAPanel: an error result no longer
removes the item only from the browser sidebar, and a successful backend drop
is verified with SHOW TABLES / SHOW DATABASES before local catalog removal. - Added a core DROP TABLE regression that checks SHOW TABLES immediately and
after restart, accepts repeated IF EXISTS, and confirms that the table heap
and persistent B+Tree files were physically removed. - Added dependency-free UI regression checks for duplicate IDs, complete
three-language key coverage, the language controls, and long-paste scroll
safeguards. - Removed stale Windows-case
Test/Stress Testfilesystem references from
the Linux import path. Historicaltest/...input is still accepted but is
resolved to the canonical case-sensitivestress testsdirectory. - Removed the fixed 3.5-second AsAPanel startup overlay and the duplicate
browser-side warmup request. The overlay is now only a 650 ms visual cue and
is explicitly non-interactive, so it cannot swallow clicks or keyboard focus. - Added
app-loader.jsplus a checked-in Firefox-38-compatible
app.legacy.jsbuild. The loader adds the small needed polyfills and shows a
direct diagnostic if the UI bundle cannot boot, instead of leaving a static
panel whose buttons appear dead. - Added missing old-Firefox DOM polyfills for
NodeList.forEachand
Element.append. Both are used while the panel first renders; without them,
a pre-Firefox-50 browser stopped before attaching every button listener. - Fixed a 4MLinux/C-locale HTTP 500 when loading
app.legacy.js: static UI
assets are read as UTF-8 and streamed once, so Japanese translations cannot
fail or become double-encoded while the web server formats the response. - Added a declared PNG favicon and a
/favicon.icofallback handler to remove
the noisy 404 generated by older Firefox releases. - Bundled Noto Sans JP under the SIL Open Font License 1.1 in WOFF2 and WOFF
formats. JP now renders on minimal 4MLinux installs even when the operating
system itself has no Japanese font package.
Stabilization validation completed on the available SWI-Prolog WASM and DOM
test runtimes: all 15 core assertion groups passed; DROP TABLE removed its
catalog entry plus heap/B+Tree files and stayed removed after restart; 165 UI
translation/runtime keys passed in all three languages; interactive language,
Asa output, 6,000-line paste, failed-drop preservation, and verified-drop
scenarios passed; and the 15,000 + 15,000 aliased JOIN returned all 15,000 rows
through the indexed path.
Reservoir realtime, reload, and cancellation
- Added
GET /api/reservoir/jobsfor reload recovery. It returns only active
receiving,queued,processing, andcancellingjobs, ordered by newest
update first; retained terminal jobs remain available through the ID endpoint
but are excluded from discovery. - AsAPanel now persists the admitted job ID and a small display descriptor,
resumes that exact job after reload, and falls back to active-job discovery
when browser storage or the admission response is unavailable. Recovery
resumes progress, result, and Cancel monitoring without resubmitting SQL. - Fixed the Database metadata view so Reservoir status updates live through
cache-bypassing, single-flight polling: 500 ms during an active job, 1.5
seconds while the metadata panel is open, and 5 seconds while idle. Hidden
documents skip network refreshes and refresh immediately on visibility or
focus. - Fixed cancellation racing an in-progress upload. The lifecycle is now
receiving -> cancelling -> cancelled; the receiver closes its writer before
spool deletion, the job never reachesqueued, and terminal cancellation is
idempotent. This removes reliance on POSIX unlink-while-open behavior and
avoids the corresponding Windows open-file deletion failure. - Reservoir regressions cover active-only newest-first discovery, moving live
progress/statistics, receiving/queued/processing cancellation, single-count
cancellation, and spool cleanup. UI regressions cover reload recovery,
Cancel wiring, adaptive metadata polling, and matching modern/legacy bundles.
Linux packaging compares the shipped backend/web bytes and statically checks
that the Windows build uses the same sources and shared realtime preflight.
The Windows x86 portable executable was rebuilt from the same source tree and
validated under Wine with --help startup, live Reservoir progress, metadata
polling, active-job discovery, cancellation, and rollback checks. A native
Windows x64 build remains a separate optional target.
JOIN correctness and performance
-
Fixed qualified alias evaluation for queries such as:
SELECT m.No, m.Depth, m.Water_Cut, z.Zone_Name FROM field m INNER JOIN zone z ON m.No = z.No ORDER BY m.No LIMIT 100;
-
Replaced the quadratic nested-loop implementation for simple qualified
equality joins with an AVL-backed lookup index. The old 15,000 by 15,000 case
could evaluate 225,000,000 row pairs before filtering; the new path builds
one lookup index and probes it once per row. -
Enabled the same optimized equality path for INNER, LEFT, and RIGHT joins.
-
Pushed source-local
WHEREconjuncts into paged JOIN inputs before rows are
materialized. Small filtered left sides now probe a unique right key without
forcing a fresh persistent index build, so the 250,000-row
Double_Company+Double_Company_Statusquery withLIMIT 20remains
bounded and responsive immediately after import. -
Kept view execution bounded by the existing result window when a view is
selected withORDER BY ... LIMIT, so a JOIN statement followed by the
analysis-view statement returns both result sets instead of tripping the
generic error path. -
Kept nested loops as a compatibility fallback for complex
ONexpressions. -
Added planner counters and the
tests/join_15000_regression.plperformance
and correctness regression, including a combined JOIN + VIEW multi-statement
assertion.
Linux and 4MLinux
- Replaced Bash-specific launchers with POSIX
/bin/shlaunchers. - Added explicit runtime errors when
swiplis unavailable. - Added
scripts/check_linux_runtime.shand dedicated 4MLinux guidance. - Added GitHub Actions coverage for core, Reservoir, JOIN, dash, and BusyBox
shell checks. - Added a Linux x86_64 release packager producing
AsaDB-1.3.0-linux-x86_64.tar.Zplus
AsaDB-1.3.0-linux-x86_64.tar.Z.sha256. The archive is a gzip-compressed tar
stream retained under the requested.tar.Zfilename. - Added a package regression that verifies the checksum, archive root,
executable modes, GPL source files, required engine/UI/tests, and absence of
runtime databases, logs, spools, build output, and Windows executables. - Added launcher regression coverage for quoted database/SQL paths containing
spaces. - Expanded the runtime probe to verify x86_64 Linux plus SWI-Prolog HTTP,
crypto, UUID, thread, core, Reservoir, and web capabilities.
Open-source release hygiene
- Versioned all runtime metadata as 1.3.0.
- Added Git attributes and ignores for runtime databases and build output.
- Fixed the Windows-only
Stress Test/Linuxstress testscase mismatch in
benchmark, web import, and packaging paths, including the last stale server
import alias. - Source archives exclude database state, generated SQL, logs, and binary
build output while retaining source, tests, documentation, license notices,
and build scripts.
Historical v1.2.1 baseline and lineage
Reservoir system included in v1.3.0
The source includes a durable, bounded bridge between AsAPanel and the Prolog
executor. The historical v1.2.1 baseline below is retained for comparison.
Boundary and reliability changes
- Added
src/bridge/reservoir.plwith explicit receiving, queued, processing,
cancelling, completed, delivered, failed, cancelled, and interrupted states. - Write commands and SQL payloads above 250 KB use a disk spool and one backend
worker. Small read-only queries retain the direct low-latency path. - Input is copied in 256 KB chunks. Capacity is checked while bytes arrive, so
an understated or absent size hint cannot bypassreservoir_max_spool_bytes. - Queue admission and initial job persistence are atomic under one mutex,
preventing concurrent requests from racing past the configured job limit. - Idempotency keys and SHA-256 payload fingerprints return an existing safe job
instead of executing a retry twice. - Job snapshots use append-only event files; result publication uses a temporary
file followed by rename. - Queued jobs can resume after restart. A job interrupted while processing is
markedinterruptedand is not automatically replayed, avoiding accidental
duplicate writes. - Added polling, cancellation, statistics, and paged-result endpoints under
/api/reservoir/*. - AsAPanel reports active jobs, queued jobs, and spool bytes in database
metadata. - Run SQL remains single-flight from the first click, and its one shared audio
channel cancels stale playback.
Validation completed
- Core SQL regression suite: PASS.
- Reservoir lifecycle, paging, retry deduplication, cancellation, restart,
queue backpressure, and false-size capacity tests: PASS. - Real browser single-click test: one click produced one inserted row, the
following read completed in 64 ms, and no JavaScript exception was recorded. - HTTP retry test: the duplicate admission returned the same job and executed
one write. public_safety_archive_5500.sql: 5,500 rows, 62 statements, zero errors,
287,058 bytes, 15.132 seconds in that measured Reservoir run.- Portable executable Reservoir test: a 3,116,915-byte SQL stream imported
100,000 rows through 1,003 statements with zero errors in 48.628 seconds.
Peak process working set was 196.5 MB, and a restart check returned the same
100,000 persisted rows.
Detailed behavior and non-goals are documented in
docs/reservoir.md.
Summary
The v1.2.1 baseline was a panel-to-storage performance and persistence release. It
keeps the SQL surface introduced by earlier versions while removing the main
causes of multi-minute SQL Command runs: full DOM rendering of very large SQL,
thousands of sequential HTTP requests, repeated column resolution and record
copying, per-batch catalog checkpoints, and list-heavy page cache entries.
The release also adds persistent database metadata, an exact metadata-backed
COUNT(*) path, and stricter single-flight Run SQL/audio behavior.
Root Causes Found
The delay was not one isolated function. It was the combined cost of several
layers:
- AsAPanel created one line-number element for every line and attempted live
highlighting/diagnostics for SQL files with tens of thousands of lines. - Large pasted write scripts could be split into many sequential requests,
adding browser/backend synchronization overhead between statements. - Archive preview logic repeatedly rescanned the complete SQL editor value.
- Multi-row INSERT repeatedly matched source columns for each value and copied
record/page lists more than necessary. - A 4 KB page was cached as a 4,096-element Prolog integer list inside dynamic
facts, which consumed far more heap than the 4 KB disk payload. - Catalog persistence and dirty-page flushing happened too often inside large
transactional batches. - Unfiltered
COUNT(*)scanned every record even though the catalog already
maintained the exact row count.
That baseline addressed each layer instead of increasing the RAM limit; 1.3.0
extends the same discipline to Reservoir, JOIN planning, live metadata, and
cross-platform packaging.
AsAPanel And HTTP Pipeline
- Large SQL mode starts at 180,000 characters or 4,000 lines.
- Large mode renders only the visible line-number window and leaves the
syntax-highlight overlay empty. - Live auto-correction, client diagnostics, and backend analysis are skipped for
large scripts. Normal-sized SQL keeps the existing assistance. - Large write scripts are sent as one
application/sqlBlob to
/api/execute_streamrather than as thousands of sequential form requests. - The stream endpoint accepts bounded request bodies up to 512 MB and reports
progress through/api/import_progress. - SQL Command and file import now share the same 256 KB incremental UTF-8
reader, statement parser, transaction, bounded batch executor, and rollback
behavior. - The browser yields one animation frame after locking Run so the button paints
Running...before backend work starts. - Post-run catalog and metadata refresh happen in parallel and do not download
the complete database state. - Archive preview scans only a bounded tail of the editor instead of the whole
script on every refresh. - Web result rows remain bounded by
max_result_rows.
One-click Run And Audio
- Run SQL creates one in-flight promise before any asynchronous query work.
- The button is disabled synchronously on the first click.
- Repeated clicks while the request is active reuse the same promise and cannot
duplicate INSERT, UPDATE, DELETE, or DDL execution. - Success and failure sounds now use exactly one shared
Audioelement. - A generation guard invalidates stale prime/play callbacks.
- Starting a run or a new result always pauses and rewinds the previous sound.
- Muted media priming remains non-blocking and cannot delay query execution.
Storage And Execution Optimizations
- The Clock buffer pool stores page payloads internally as compact SWI-Prolog
strings instead of integer lists in dynamic facts. - Public pager interfaces still expose byte lists where required, preserving
module compatibility. - Clock hits no longer retract and re-assert an entry when its reference bit is
already set. - Pager page counts combine disk and dirty cached pages without forcing a full
flush. - Exact 4 KB pages bypass redundant padding/copy paths.
- Slotted-page checksum calculation traverses the page once instead of copying
a second page with a zeroed checksum field. - Batch record packing is linear rather than repeated append-based copying.
- INSERT builds one source-column map per batch instead of resolving every cell
against every destination column. - The core uses a no-RID-return batch insert path when callers do not consume
inserted record identifiers. - Transactional INSERT, UPDATE, and DELETE defer dirty-page flushing to bounded
transaction/checkpoint boundaries. Rollback remains protected by snapshots
and mutation recovery data. - The historical baseline used an import batch of 8; 1.3.0 uses 256 parser
statements with bounded storage appends while preserving rollback barriers.
Exact COUNT Fast Path
SELECT COUNT(*) FROM table without a filter, grouping, or extra projection
now reads the exact row count stored in paged_rows catalog metadata. This
path:
- preserves the requested output alias;
- respects
LIMIT 0semantics; - requires normal SELECT privilege;
- records a
metadata_count_scanplanner statistic; - does not open every heap page.
Filtered counts, grouped counts, COUNT(column), and other aggregates continue
to evaluate records normally.
On the final warm panel check, an exact count over 100,000 persisted rows took
4 ms through the local HTTP API. The same database returned an empty table in
8 ms.
Persistent Database Metadata
Every database catalog now has a matching atomic .asa.meta sidecar containing:
- stable database identity;
- metadata format and storage format versions;
- engine version;
- creation, update, and last checkpoint timestamps;
- checkpoint count;
- last durable summary.
The metadata API and AsAPanel add live information for:
- current database, database/table/view counts, and exact total rows;
- catalog, page-store, and WAL sizes;
- transaction and dirty checkpoint state;
- atomic catalog replacement and page checksum support;
- page size, import batch size, result limit, and cache policy;
- buffer pool pages, bytes, hits, misses, evictions, flushes, dirty pages, and
pinned pages; - B+Tree cache entries and planner path counters.
Metadata writes use .tmp plus .bak replacement and startup recovery. Keep
the .asa, .asa.store, .asa.meta, WAL, and journal artifacts together when
moving a database.
Persistence And Recovery
1.3.0 retains the v1.2.1 recovery design:
- fixed 4 KB slotted heap pages with checksums;
- append undo records;
- page-mutation backups;
- transaction snapshots;
- temporary and backup catalog files;
- atomic catalog replacement;
- startup handling for interrupted append, mutation, checkpoint, and open
transaction artifacts; - import rollback when a statement batch fails.
Transactional batching was optimized without removing these recovery barriers.
The engine still does not claim ARIES or MVCC semantics.
Runtime Configuration
The portable package includes:
page_size = 4096
buffer_pool_pages = 64
import_batch_size = 256
flush_interval = 32
max_result_rows = 500
cache_policy = clockpage_size remains fixed for format compatibility. Other values are loaded at
boot and can be tuned without rebuilding the executable.
Measured 1.3.0 Benchmark
Environment: 4MLinux 6.12.94, Intel Core i5-6300U (2 cores / 4 threads),
8,022,200 kB visible RAM, SWI-Prolog 10.0.2 x86_64. Workloads use 100-row
multi-value INSERT statements and verify exact count, index build/lookup,
indexed ordering, UPDATE, DELETE, bounded results, shutdown, reopen, and
persisted count.
| Rows | Wall time | Import | Indexed lookup | ORDER/LIMIT | UPDATE | DELETE | Limited result | Peak RSS | Result |
|---|---|---|---|---|---|---|---|---|---|
| 10,000 | 4.59 s | 2.02 s | 1.60 s | 43 ms | 54 ms | 50 ms | 254 ms | 166.1 MiB | PASS |
| 50,000 | 33.00 s | 11.93 s | 19.15 s | 48 ms | 346 ms | 330 ms | 622 ms | 387.7 MiB | PASS |
| 100,000 | 59.21 s | 32.20 s | 24.31 s | 22 ms | 617 ms | 572 ms | 576 ms | 387.6 MiB | PASS |
The published GitHub v1.2.1 reference for the complete 100,000-row scenario
was approximately 247 seconds and 229.8 MB on a different Windows host. The
1.3.0 release-host run is approximately 76% faster wall-clock; this is a
directional cross-platform comparison, not a claim that peak RSS is lower.
The native 4MLinux run measured about 387.6 MiB peak RSS. Disk/cache state can
move import timings substantially, as documented in the release-host audit
above.
Validation
Regression suite:
swipl -q -s tests\run_tests.plStorage benchmark:
powershell -NoProfile -ExecutionPolicy Bypass -File tests\run_storage_benchmarks.ps1Validation completed for:
- CREATE/INSERT/SELECT/UPDATE/DELETE and ALTER flows;
- delete targeting and duplicate-column normalization;
- transactions, rollback, journal/WAL recovery, and restart persistence;
- JOIN, GROUP BY, aggregates, subqueries, views, users, and grants;
- exact metadata count with no sequential scan;
- bounded results and catalog synchronization;
- UTF-8 stream input;
- 10,000, 50,000, and 100,000-row full scenarios;
- AsAPanel boot, metadata rendering, empty SELECT, and 100,000-row COUNT through
the local HTTP API.
Compatibility And Migration
- Existing v1.2.1 SQL commands remain available.
- Page storage remains format 3; no row-store rewrite is required when moving
from v1.2.1. - A missing
.asa.metafile is created automatically at boot. - Compatible v2 list-backed user tables can still migrate to v3 page storage.
- Back up important databases before upgrading.
Known Limits
- AsaDB is not performance-equivalent to SQLite, CouchDB, PostgreSQL, or MySQL.
- Some mutations invalidate persistent indexes and rebuild them lazily instead
of applying a fully incremental B+Tree split/merge path. - Complex JOIN, GROUP BY, and expression plans may materialize more intermediate
data than simple indexed queries. - Recovery is not ARIES and does not provide MVCC.
- The optimizer and planner statistics remain intentionally small.
- AsAPanel is intended for localhost use, not direct public exposure.
License
The source distribution is licensed under GNU GPL v3.0 only. Distributors of
binaries or modified builds must provide complete corresponding source under
the same license. See LICENSE, LICENSE_HISTORY.md, TRADEMARKS.md, and
THIRD_PARTY_NOTICES.md.