Skip to content

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'); -- 1000
SELECT currval('order_seq'); -- 1000
SELECT setval('order_seq', 5000); -- 5000

DDL 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 to SERIAL; same auto-fill path.
  • B3 DEFAULT keyword in INSERT … VALUES — sqlparser classifies DEFAULT as Expr::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 DataRow with a different field count than RowDescription. 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 to Value::String.
  • B11 multi-statement simple queries — see “What’s New”.
  • B14 identifier case-foldingPlanner::normalize_ident and normalize_object_name strip surrounding quotes (preserving case) and lower-case unquoted identifiers. Applied at every DDL and reference site. CREATE TABLE Foo matches SELECT FROM foo matches SELECT 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 new heliosdb_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.1ParseComplete/BindComplete ordering on extended-Q.
  • v3.14.2Flush (H / 0x48) message handling for pipelined drivers.
  • v3.14.3DEFAULT now() / DEFAULT CURRENT_USER literal default expressions.
  • v3.14.4 — UPDATE/DELETE preserve source_table_name for 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 $2 propagation; UPDATE SET param type coercion (TIMESTAMP fix).
  • v3.14.9 — GROUP BY with mixed qualifier styles + DATE keys (compare_values arms 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

ComponentVersion
PostgreSQL wire14, 15, 16
MySQL wire5.7, 8.0
Drizzle ORM0.30+ (verified)
Prisma5.x (verified)
TypeORM0.3.x (verified)
psycopg2 / postgres-js / pgall current