HeliosDB Nano v3.14.0 Release Notes
HeliosDB Nano v3.14.0 Release Notes
Release Date: 2026-04-20 (subsequent patches: v3.14.1 – v3.14.10 through 2026-04-23)
Theme: Drizzle / Prisma / TypeORM compatibility — 15 fixes from BUGS_TIMETRACKER_DRIZZLE_COMPAT.md
Highlights
A real-world TimeTracker app on Drizzle + Postgres-js produced 15 distinct compatibility failures. v3.14.0 closes all of them, plus the v3.14.1 – v3.14.10 patches add ten more reporter-surfaced fixes. Every Drizzle-shaped query (quoted identifiers, mixed qualifier styles, RETURNING, EXTRACT, gte() / lte() on Date, parameterized LIMIT/OFFSET) now executes correctly.
heliosdb_capability_report() ships so migration tools can probe supported features before bisecting failures.
What’s New
heliosdb_capability_report() Scalar Function
SELECT heliosdb_capability_report();Returns a human-readable summary of what the server version supports vs. stock Postgres — drives migration tool discovery.
CREATE SEQUENCE + nextval / currval / setval
CREATE SEQUENCE order_seq START 1000;SELECT nextval('order_seq'); -- 1000SELECT currval('order_seq'); -- 1000SELECT setval('order_seq', 5000); -- 5000DDL is accepted and registers a named counter in the new process-scoped sql::sequences store. Persistent sequences are a follow-up; for now sequences reset on restart.
gen_random_uuid() / uuid_generate_v4()
INSERT INTO users (id, email) VALUES (gen_random_uuid(), 'alice@example.com');Both return Value::Uuid.
EXTRACT(EPOCH | YEAR | MONTH | … FROM …)
Full coverage — Epoch returns Float8 (Unix seconds); calendar fields return Int4. TIMESTAMP '2026-01-01' and friends now parse via a new TypedString planner arm that lowers to a CAST.
DO $$ … END $$ Blocks
Accepted at the wire layer. The PG handler unwraps the dollar-quoted body and executes plain-SQL statements inside as a single DO CommandComplete. PL/pgSQL control flow (IF / LOOP / RAISE) is not interpreted — documented as out of scope.
Multi-Statement Simple Queries
Q message now accepts ;-separated statements and emits one response per statement with a single trailing ReadyForQuery, matching PG protocol.
Fixed
Drizzle / Prisma / TypeORM compatibility (15 reporter cases)
- B2
GENERATED ALWAYS AS IDENTITY— recognised as a SQL-standard alternative toSERIAL; same auto-fill path. - B3
DEFAULTkeyword inINSERT … VALUES— sqlparser classifiesDEFAULTasExpr::Identifier; planner now rewrites to NULL inside VALUES so the SERIAL / default-value path fires. - B4 RETURNING field-count mismatch — INSERT rows with omitted columns produced short tuples; PG wire protocol then emitted
DataRowwith a different field count thanRowDescription. Affected every.returning()call. - B5
EXTRACT(EPOCH FROM ts)— full coverage (see “What’s New”). - B7
CREATE SEQUENCE— DDL accepted (see “What’s New”). - B8
nextval/currval/setval— scalar functions backed by sequence store. - B9
DO $$ … END $$— wrapped block execution (see “What’s New”). - B10 dollar-quoted string literals —
$$text$$and$tag$text$tag$map toValue::String. - B11 multi-statement simple queries — see “What’s New”.
- B14 identifier case-folding —
Planner::normalize_identandnormalize_object_namestrip surrounding quotes (preserving case) and lower-case unquoted identifiers. Applied at every DDL and reference site.CREATE TABLE FoomatchesSELECT FROM foomatchesSELECT FROM FOO; quoted"Foo"stays case-sensitive (PG-compliant). - B15
gen_random_uuid()/uuid_generate_v4()— see “What’s New”. - B17 startup banner — points to
docs/compatibility/, the FTS doc, and the newheliosdb_capability_report()probe.
Result-cache safety
Result cache now skips SQL containing non-deterministic functions (nextval, setval, currval, gen_random_uuid, random(, now(, clock_timestamp). Previously, a second call returned the first result verbatim — visibly broken for any sequence or UUID generation.
Patches v3.14.1 – v3.14.10
Ten reporter-driven fixes spanning the next three days:
- v3.14.1 —
ParseComplete/BindCompleteordering on extended-Q. - v3.14.2 —
Flush(H/ 0x48) message handling for pipelined drivers. - v3.14.3 —
DEFAULT now()/DEFAULT CURRENT_USERliteral default expressions. - v3.14.4 — UPDATE/DELETE preserve
source_table_namefor qualified WHERE columns. - v3.14.5 — Subquery in INSERT/UPDATE evaluates correctly on the same connection.
- v3.14.6 — Drizzle login read-by-unique-key fast path.
- v3.14.7 — UPDATE/DELETE qualified WHERE columns (
"t"."col" = $1); Timestamp/Date↔ISO-string comparison. - v3.14.8 — Parameterized
LIMIT $1 OFFSET $2propagation; UPDATE SET param type coercion (TIMESTAMP fix). - v3.14.9 — GROUP BY with mixed qualifier styles + DATE keys (
compare_valuesarms for Date/Time/Interval/Numeric). - v3.14.10 — Foreign key validation with quoted identifiers; fast-path bypass plugged.
Migration
No breaking changes. v3.14.x is fully wire-compatible with v3.13.x.
If you were working around any of these bugs (manual identifier lowercasing, avoiding RETURNING, client-side LIMIT clamping), those workarounds can be removed.
Compatibility Matrix
| Component | Version |
|---|---|
| PostgreSQL wire | 14, 15, 16 |
| MySQL wire | 5.7, 8.0 |
| Drizzle ORM | 0.30+ (verified) |
| Prisma | 5.x (verified) |
| TypeORM | 0.3.x (verified) |
| psycopg2 / postgres-js / pg | all current |