| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-03-13 | 4.1 kB | |
| v0.3.7 source code.tar.gz | 2026-03-13 | 5.5 MB | |
| v0.3.7 source code.zip | 2026-03-13 | 5.9 MB | |
| Totals: 3 Items | 11.4 MB | 1 | |
What's New in v0.3.7
PostgreSQL-Inspired DISTINCT ON
New DISTINCT ON (expr, ...) syntax for per-group deduplication, returning the first row for each unique combination of the specified expressions.
- Hash-based dedup with O(groups) memory, correctly handles arbitrary ORDER BY patterns including non-leading sort orders
- Pipeline order: ORDER BY, DISTINCT ON, column removal, LIMIT/OFFSET
- Works across all query paths: single-table scans, JOINs, CTEs, subqueries, and complex ORDER BY
- Supports aliased keys, computed expressions, keys not in SELECT, qualified identifiers, and NULL equality
-
Guards distinct index pushdown to prevent bypassing key-based dedup
:::sql -- First (highest) order per customer SELECT DISTINCT ON (customer) customer, amount, order_date FROM orders ORDER BY customer, amount DESC;
-- Per-group dedup on joins with qualified keys SELECT DISTINCT ON (c.name) c.name, p.amount FROM customers c JOIN purchases p ON c.id = p.customer_id ORDER BY c.name, p.amount DESC;
ON CONFLICT Upsert (PostgreSQL-Style)
ON CONFLICT (cols) DO UPDATE SETandDO NOTHINGsyntaxEXCLUDEDpseudo-table to reference attempted insert values- Conflict target matching against PK and composite unique constraints
- CHECK constraint validation during upsert updates
-
RETURNING clause and INSERT ... SELECT support for conflict handling
:::sql INSERT INTO users (id, name, email) VALUES (1, 'Alice', 'alice@example.com') ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, email = EXCLUDED.email;
Constant Folding and Non-Deterministic Function Tracking
- Compile-time constant folding for deterministic column-free expressions
FunctionInfo.deterministicflag with registry-based lookup- NOW, CURRENT_DATE, CURRENT_TIMESTAMP, RANDOM, SLEEP, EMBED marked non-deterministic
- Semantic cache bypass for queries with non-deterministic functions
- Pushdown evaluator for stable expressions like
NOW() - INTERVAL '24h'
GROUP BY and Aggregation Optimizations
- 3-column GROUP BY uses tuple keys (no Vec heap allocation)
- 4+ columns use direct AHashMap (replaces hash-collision approach)
- Early termination extended to 1, 2, and 3-column paths
- FIRST/LAST aggregates support ORDER BY with O(1) sort-key tracking
Snapshot and Persistence
- Persist
default_valuein both WAL and snapshot serialization - Re-record index and view DDL to WAL during snapshots so they survive truncation
- Skip snapshot when WAL has not grown since last snapshot
- Auto-snapshot loop sleeps
min(cleanup, snapshot)interval - HNSW
mandef_constructionexposed on Index trait for persistence
Performance
- Restore
panic = "abort"in release profile, recovering 5-15% across all benchmarks - Dev profile optimizations and thin LTO for faster builds
Parser and SQL Compatibility
- CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP parsed as niladic functions (SQL standard, no parentheses required)
- Keyword identifiers fold to lowercase (PostgreSQL compatibility)
- Parse ISO 8601 timestamps with fractional seconds and UTC
Zsuffix - Keywords accepted as column names in SET assignments
Bug Fixes
- Fix transaction INSERT with partial column lists: delegate to full executor pipeline for correct column mapping, default values, type coercion, and FK validation
- Fix qualified column ambiguity in joins: ORDER BY and DISTINCT ON with qualified identifiers (e.g.,
c.namevsp.name) now correctly resolve when both joined tables have the same column name - Fix DISTINCT ON key resolution after projection: qualified keys resolve correctly when projected as bare names or under aliases
- Fix classification cache: include DISTINCT ON expressions in hash key to prevent stale cache hits
- Fix TimeTruncFunction duration cache miss on zero-duration values
Documentation
- Go driver docs synced with stoolap-go README
- Driver icons with official brand colors in docs sidebar and page headers
Full Changelog: https://github.com/stoolap/stoolap/compare/v0.3.5...v0.3.7