diff --git a/ROADMAP.html b/ROADMAP.html index 0ed55d87b5..b051526d45 100644 --- a/ROADMAP.html +++ b/ROADMAP.html @@ -200,15 +200,15 @@
Work on this page: 34 tasks — 1 done, 12 in flight, 21 not started
-Work on this page: 35 tasks — 1 done, 12 in flight, 22 not started
+Feature scoreboard: ~1,230 cells (~326 features × 3 databases) — 450 proven, 500 unproven, 30 experimental, 250 not in 8.0
"Raw queries" is a headline row every Prisma 7 user will look for: hand a parameterized SQL string to the client and get rows back, or an affected-row count. Prisma 8 ships part of this today and has to settle the rest before the scoreboard freezes.
+What already works is a raw SQL fragment inside the typed builder — fns.raw`…` for a function or operator the operation registry doesn't expose (array_agg, ts_rank, a vendor extension), composing with the rest of a built query. It's proven by tests on Postgres and SQLite, and MongoDB has its own raw-command escape hatch. What's missing is the statement-level path — running a whole SQL string on its own — and that's the work:
$queryRaw/$executeRaw parity surface: one call that takes a parameterized SQL string and returns rows, another that returns an affected-row count, issued straight to the driver rather than through the query compiler. The substrate all exists — the driver already exposes a query(sql, params) method, there is a raw execution-plan shape, and the guardrail evaluator already runs on it — but nothing surfaces it to users. A real app built on Prisma 8 had to hand-assemble an internal execution plan just to run a truncate, and casting around the missing type then crashed a guardrail (TML-2672). The design is written down (ADR 012); the helper is not built.WHERE/LIMIT), so the existing lint and budget guardrails — mutation-needs-a-filter, result-size limits — apply to raw SQL too, and the missing-metadata crash above is gone. Core does no SQL parsing here by design; the caller states the intent.Prisma.sql/Prisma.join/Prisma.raw/Prisma.empty fragment-composition helpers are currently marked not in 8.0. Whichever way each lands, it gets named on the scoreboard rather than left ambiguous.fns.raw`…` infers a value's database type from its JavaScript runtime type — a guess baked into a public API — so it's replaced with an explicit codec before the surface freezes (TML-2959).The bar for July 24 is a verdict, not necessarily a finished feature: statement-level raw SQL either ships with a proving test or becomes a written-down "not in 8.0" absence — not a reachable-but-untested cell nobody can act on.
+