---
title: "HeliosDB Nano v3.14.0 Release Notes"
---

# HeliosDB Nano v3.14.0 Release Notes

**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

```sql
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`

```sql
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()`

```sql
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-folding** — `Planner::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.1** — `ParseComplete`/`BindComplete` ordering on extended-Q.
- **v3.14.2** — `Flush` (`H` / 0x48) message handling for pipelined drivers.
- **v3.14.3** — `DEFAULT 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

| 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 |
