Skip to content

fix(adapter-mssql): set VarBinary type when null Bytes? argument is passed #29557 - #29630

Merged
aqrln merged 2 commits into
prisma:mainfrom
AnupamKumar-1:fix/mssql-varbinary-null-conversion
Jul 20, 2026
Merged

fix(adapter-mssql): set VarBinary type when null Bytes? argument is passed #29557#29630
aqrln merged 2 commits into
prisma:mainfrom
AnupamKumar-1:fix/mssql-varbinary-null-conversion

Conversation

@AnupamKumar-1

Copy link
Copy Markdown
Contributor

Fixes #29557

When setting a Bytes? (@db.VarBinary(Max)) field to null, the adapter was sending the parameter without a type, causing MSSQL to default to nvarchar and throw an implicit conversion error.

Fixed by explicitly passing sql.VarBinary as the type for null bytes arguments in performIO.

All 87 tests passing locally.

@coderabbitai

coderabbitai Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: ddf6cb5f-fda4-497a-8907-1e21c5df53dd

📥 Commits

Reviewing files that changed from the base of the PR and between 6aaef74 and cc62488.

📒 Files selected for processing (2)
  • packages/adapter-mssql/src/mssql.test.ts
  • packages/adapter-mssql/src/mssql.ts

Summary by CodeRabbit

  • Bug Fixes

    • Improved parameter binding for null binary/bytes values in the MSSQL adapter, ensuring UPDATE statements that set binary columns to NULL execute correctly.
  • Tests

    • Added an integration-style MSSQL test that verifies null bytes behavior using a real database connection, and automatically skips when the required test database connection string isn’t provided.

Walkthrough

This PR fixes a bug where updating a Bytes? field mapped to @db.VarBinary(Max) with null using the MSSQL adapter throws an implicit type conversion error. The fix modifies the performIO method to explicitly bind null byte arguments as VarBinary instead of allowing default type inference, which was incorrectly treating them as nvarchar. An integration test validates the fix by creating a table with a binary column, inserting data, updating the column to null, and confirming the operation succeeds.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and accurately describes the main fix: handling VarBinary type when null Bytes arguments are passed in the MSSQL adapter.
Description check ✅ Passed The description is related to the changeset, explaining the bug fix, root cause, and implementation approach in the MSSQL adapter.
Linked Issues check ✅ Passed The code changes directly address all objectives from issue #29557: fixing null Bytes field updates by explicitly setting VarBinary type in performIO to prevent nvarchar conversion errors.
Out of Scope Changes check ✅ Passed All changes are scoped to the MSSQL adapter and directly related to fixing the null Bytes parameter type issue described in #29557, with no extraneous modifications.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
✨ Simplify code
  • Create PR with simplified code

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/adapter-mssql/src/mssql.test.ts`:
- Around line 176-183: Replace hardcoded MSSQL credentials used to instantiate
PrismaMssql in the test with environment-driven configuration: read server,
port, user, password, database, and options from env vars (e.g., MSSQL_HOST,
MSSQL_USER, MSSQL_PASSWORD, MSSQL_DB) when creating the factory (PrismaMssql),
and if required creds are not set, skip the integration test gracefully (use the
test framework's skip/skipIf mechanism) with a clear message so CI or local runs
without credentials don't fail.
- Around line 219-225: The teardown that drops dbo.PrismaTest and calls
adapter.dispose currently runs inline and will be skipped if the test fails;
move that cleanup into a finally block or a Vitest afterEach hook so it always
executes. Specifically, ensure the adapter.executeRaw({... sql: `DROP TABLE
dbo.PrismaTest` ...}) and adapter.dispose() calls are performed from a finally
block surrounding the test logic (or from an afterEach that has access to the
same adapter instance), so cleanup always runs even on test failures.
- Around line 208-217: The test uses a non-standard Vitest assertion
`.resolves.not.toThrow()` on the promise returned by adapter.executeRaw; change
it to a valid pattern by either awaiting the call (await
adapter.executeRaw({...})) to ensure it doesn't reject, or use the expect
wrapper with a valid matcher like
`expect(adapter.executeRaw({...})).resolves.toBeDefined()` so the async update
via adapter.executeRaw (sql: `UPDATE dbo.PrismaTest...`, args/argTypes) is
correctly asserted.
- Around line 202-205: The test's ArgType objects in
packages/adapter-mssql/src/mssql.test.ts are missing the required arity property
and use unsafe `dbType: null`; update each argTypes array (both the INSERT case
around the first argTypes block and the UPDATE case around the second argTypes
block) to include the correct arity (e.g., arity: 1 for scalar parameters) and
remove the dbType field (or leave it undefined) so the shape matches the ArgType
type; additionally replace any hardcoded MSSQL connection credentials in the
test setup with environment variables (process.env.MSSQL_USER, MSSQL_PASS,
MSSQL_HOST, etc.) so credentials are not embedded in the test.

In `@packages/adapter-mssql/src/mssql.ts`:
- Around line 55-62: The loop handling parameter binding in mssql.ts currently
special-cases null byte parameters only with sql.VarBinary; update the null
handling in the for loop that iterates over query.args and checks
argType.scalarType === 'bytes' so it binds nulls using an explicit binary type
for all binary column types (sql.VarBinary, sql.Binary, sql.Image) rather than
relying on implicit inference; simplest fix: when query.args[i] === null and
argType.scalarType === 'bytes' call req.input with a binary type (default to
sql.VarBinary) instead of letting mapArg decide, or if a dbType is available on
argType use that to choose between sql.VarBinary/sql.Binary/sql.Image before
calling req.input.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 46cbcd79-44da-4b04-b046-a0bd2621df52

📥 Commits

Reviewing files that changed from the base of the PR and between 918cf5d and fc8baf4.

📒 Files selected for processing (2)
  • packages/adapter-mssql/src/mssql.test.ts
  • packages/adapter-mssql/src/mssql.ts

Comment thread packages/adapter-mssql/src/mssql.test.ts Outdated
Comment thread packages/adapter-mssql/src/mssql.test.ts Outdated
Comment thread packages/adapter-mssql/src/mssql.test.ts Outdated
Comment thread packages/adapter-mssql/src/mssql.test.ts Outdated
Comment thread packages/adapter-mssql/src/mssql.ts
@AnupamKumar-1
AnupamKumar-1 force-pushed the fix/mssql-varbinary-null-conversion branch from fc8baf4 to 6aaef74 Compare June 9, 2026 07:42

@daltino daltino left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great fix for a real pain point — implicit conversion errors in MSSQL are notoriously cryptic, and this tackles the root cause cleanly. The approach is correct and the test is a welcome addition. I have a few suggestions worth considering before merging.


Review

packages/adapter-mssql/src/mssql.ts

The core fix is correct. When mssql receives a null value with no type hint, it falls back to nvarchar, which can't be implicitly converted to varbinary. Explicitly passing sql.VarBinary resolves the ambiguity.

Suggestion 1 — generalise the null-type pattern

The same implicit-conversion problem could affect other binary/typed columns when they're null. Right now you're special-casing bytes, but consider whether other scalar types need the same treatment. At minimum, a comment explaining why bytes is special-cased (vs. relying on mapArg for everything else) would help future maintainers:

// mssql cannot infer the correct type for a null binary parameter and
// defaults to nvarchar, causing an implicit conversion error. We must
// supply the type explicitly.
if (query.args[i] === null && argType.scalarType === 'bytes') {
  req.input(`P${i + 1}`, sql.VarBinary, null)
} else {
  req.input(`P${i + 1}`, mapArg(query.args[i], argType))
}

Suggestion 2 — check whether mapArg already receives null and handles it elsewhere

It's worth verifying (and documenting) that mapArg does not already attempt to set a type when the value is null. If it silently passes through null without a type for other scalar types too, there may be a latent issue with e.g. DateTime? or Float? fields. A brief comment or a link to the mapArg implementation would add confidence.

Suggestion 3 — minor: extract the condition

Purely cosmetic, but pulling the special-case into a helper makes the loop body easier to scan:

function inputParam(req, name, arg, argType) {
  if (arg === null && argType.scalarType === 'bytes') {
    req.input(name, sql.VarBinary, null)
  } else {
    req.input(name, mapArg(arg, argType))
  }
}

Not blocking — just a readability nudge.


packages/adapter-mssql/src/mssql.test.ts

The test validates the right behaviour (no throw on null assignment) and has a sensible skip-if-no-connection guard.

Suggestion 4 — the test requires a live DB connection

The existing mutex tests in this file are fully mocked, so they run anywhere. The new test silently skips when TEST_MSSQL_URI is unset, which is fine for local dev but means CI without a real MSSQL instance will never exercise this path. Consider:

  • Adding a comment explaining the skip is intentional and pointing to wherever integration tests are run with a live DB.
  • Or — if this can be mocked — verifying that req.input is called with (name, sql.VarBinary, null) rather than relying on a full round-trip. A unit-style mock test would run in every CI environment.

Suggestion 5 — schema/teardown robustness

await prisma.$executeRawUnsafe(`
  CREATE TABLE TestVarBinary (id INT PRIMARY KEY, data VARBINARY(MAX))
`)

If the test fails before the DROP TABLE, subsequent runs will fail on the CREATE TABLE with "object already exists". Wrap the setup/teardown in a try/finally, or use IF OBJECT_ID(...) IS NOT NULL DROP TABLE ... in the teardown.

Suggestion 6 — disconnect on failure

If any assertion throws before await prisma.$disconnect(), the connection leaks. Wrap the body in try/finally:

try {
  // ... test body
} finally {
  await prisma.$disconnect()
}

Summary

Bug fix correctness
Handles the described regression
Test added
Test isolation (teardown safety) ⚠️ needs try/finally
Coverage in always-on CI ⚠️ worth discussing
Generalisation / future-proofing 💡 optional but worth a comment

The fix itself is solid. Addressing the teardown robustness (Suggestion 5 & 6) would be the main thing I'd want to see before merging. Everything else is optional polish.

@AnupamKumar-1
AnupamKumar-1 force-pushed the fix/mssql-varbinary-null-conversion branch from 6aaef74 to cc62488 Compare June 17, 2026 03:48
@AnupamKumar-1

Copy link
Copy Markdown
Contributor Author

@daltino Thanks for the thorough review!

  • Addressed suggestions 5 & 6: cleanup now uses IF OBJECT_ID(...) IS NOT NULL DROP TABLE to make teardown idempotent, and dispose() is executed in a nested finally block so the connection is always released even if cleanup fails.
  • Addressed suggestion 4: added a comment clarifying that the test is intentionally skipped when TEST_MSSQL_URI is not provided and that MSSQL integration tests run separately against a real MSSQL instance.
  • Addressed suggestion 1: added a comment explaining why bytes requires special handling when the value is null (mssql defaults to nvarchar rather than VARBINARY, which causes the implicit conversion error).

Tested locally against a real MSSQL instance running in Docker; all tests pass, including the new integration test (87/87).

Thanks again for the review.

@aqrln aqrln left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@dosubot dosubot Bot added the lgtm This PR has been approved by a maintainer label Jul 20, 2026
@aqrln
aqrln merged commit a6d0155 into prisma:main Jul 20, 2026
252 of 253 checks passed
OIRNOIR pushed a commit to OIRNOIR/YouTube-Helper-Server that referenced this pull request Jul 28, 2026
This PR contains the following updates:

| Package | Type | Update | Change | Pending |
|---|---|---|---|---|
| [@prisma/adapter-pg](https://github.com/prisma/prisma) ([source](https://github.com/prisma/prisma/tree/HEAD/packages/adapter-pg)) | imports | minor | [`7.8.0` -> `7.9.0`](https://renovatebot.com/diffs/npm/@prisma%2fadapter-pg/7.8.0/7.9.0) | `7.9.1` |
| [@prisma/client](https://www.prisma.io) ([source](https://github.com/prisma/prisma/tree/HEAD/packages/client)) | imports | minor | [`7.8.0` -> `7.9.0`](https://renovatebot.com/diffs/npm/@prisma%2fclient/7.8.0/7.9.0) | `7.9.1` |
| [prisma](https://www.prisma.io) ([source](https://github.com/prisma/prisma/tree/HEAD/packages/cli)) | imports | minor | [`7.8.0` -> `7.9.0`](https://renovatebot.com/diffs/npm/prisma/7.8.0/7.9.0) | `7.9.1` |

---

### Release Notes

<details>
<summary>prisma/prisma (@&#8203;prisma/adapter-pg)</summary>

### [`v7.9.0`](https://github.com/prisma/prisma/releases/tag/7.9.0)

[Compare Source](prisma/orm@7.8.0...7.9.0)

Today, we are excited to share the `7.9.0` stable release 🎉

**🌟 Star this repo for notifications about new releases, bug fixes & features — or [follow us on X](https://pris.ly/x)!**

##### Highlights

##### ORM

##### Tab completions for the Prisma CLI

Typing out CLI commands from memory is now optional. Prisma ships **shell tab completions** for `bash`, `zsh`, `fish`, and PowerShell, covering commands, subcommands, options, flags, and even option values.

**Setting it up.** Most projects run Prisma through a package manager, so completions are enabled through `@bomb.sh/tab`'s package-manager integration — install it once, then source the completion for your package manager and shell:

```bash

# 1. Install @&#8203;bomb.sh/tab globally
npm install -g @&#8203;bomb.sh/tab

# 2. Wire up your package manager + shell (pnpm shown; swap in npm / yarn / bun):
echo 'source <(tab pnpm zsh)'  >> ~/.zshrc            # zsh
echo 'source <(tab pnpm bash)' >> ~/.bashrc           # bash
tab pnpm fish > ~/.config/fish/completions/pnpm.fish  # fish
tab pnpm powershell > ~/.tab-pnpm.ps1                 # PowerShell (then dot-source it from $PROFILE)
```

`@bomb.sh/tab` delegates to any locally-installed CLI that ships completions, so `pnpm prisma <TAB>`, `pnpm exec prisma <TAB>`, `yarn prisma <TAB>`, and `bun x prisma <TAB>` all complete Prisma's commands, options, and values — no per-project setup. (`npx` and `bunx` don't support completion themselves; use `npm exec` and `bun x`.)

If instead you have Prisma installed globally on your `PATH`, source its own completion directly: `source <(prisma complete zsh)` (or the `bash` / `fish` / `powershell` variant).

This is built on [`@bomb.sh/tab`](https://github.com/bombshell-dev/tab/), the same completion library that powers other CLIs in the ecosystem — including Cloudflare, Nuxt, and Vitest — so the package-manager completions you enable for Prisma work for those tools too. A wonderful community contribution from [@&#8203;AmirSa12](https://github.com/AmirSa12) ([#&#8203;28351](prisma/orm#28351)) — thank you!

<https://github.com/user-attachments/assets/1f916a60-ee4d-40be-bb7d-74035d48ca83>

##### Prisma ORM, ready for AI agents

Coding agents are now a first-class audience for Prisma, and 7.9.0 brings the first wave of work to make Prisma projects safe and productive for them to work in.

**Agent skills installed with `prisma init`** ([#&#8203;29689](prisma/orm#29689))

`prisma init` now installs the [prisma/skills](https://github.com/prisma/skills) catalog into freshly scaffolded projects. Agents such as Claude Code, Cursor, Codex, and Windsurf start out with current, version-relevant Prisma knowledge instead of relying on whatever happened to be in their training data. The install is best-effort and never blocks scaffolding; opt out at any time with `--no-skills`.

```terminal
npx prisma@latest init
```

![prisma init scaffolds a project and installs the Prisma agent skills catalog](https://github.com/user-attachments/assets/8244a6dc-cdad-4028-a652-bb5ac6e4b271)

**A safer default around destructive commands** ([#&#8203;29684](prisma/orm#29684), [#&#8203;29691](prisma/orm#29691), [#&#8203;29713](prisma/orm#29713))

Prisma's AI safety checkpoint refuses to run destructive commands when it detects that an AI agent is at the keyboard, unless the user has given explicit consent. In this release we:

- **Broadened agent detection** to cover today's landscape — Codex CLI (now on Linux as well as macOS), Qwen Code, GitHub Copilot CLI, OpenCode, Cline, Goose, Amp, Crush, Augment Code, Antigravity, Replit Agent, and Devin — plus generic `AI_AGENT` / `AGENT` conventions so future agents are caught without a code change.
- **Extended the guard to `db push --accept-data-loss`**, which previously bypassed the checkpoint even though it can drop data.
- **Removed the `migrate-reset` tool from the `prisma mcp` server** entirely — resetting a database drops it, and that is not an operation an agent should be handed as a first-class tool. An agent that needs a reset must run the CLI, where the checkpoint applies.

##### Bug Fixes

Many of the fixes below are **community contributions** — thank you to everyone who reported and fixed these!

**Prisma Client**

- Fixed a severe TypeScript performance regression introduced in Prisma 7: restoring the `OmitOpts` generic default lets `tsc` reuse cached type instantiations again, bringing type-checking on large schemas back from minutes to seconds ([#&#8203;29592](prisma/orm#29592), from [@&#8203;nfl1ryxditimo12](https://github.com/nfl1ryxditimo12)).
- The `XOR` type helper now rejects primitive values such as `data: 5`, which were previously accepted at compile time even though the runtime rejected them ([#&#8203;29735](prisma/orm#29735), from [@&#8203;kyungseopk1m](https://github.com/kyungseopk1m)).
- `$queryRaw` and `$executeRaw` now fail fast with a clear validation error when passed an invalid `Date`, instead of silently serializing it as `null` and corrupting the value sent to the database ([#&#8203;29697](prisma/orm#29697), from [@&#8203;jibin7jose](https://github.com/jibin7jose)).
- The generated client is no longer corrupted by a `///` documentation comment that contains a `*/` sequence; the comment terminator is now escaped when doc comments are emitted, in both the TypeScript and JavaScript generators ([#&#8203;29736](prisma/orm#29736), from [@&#8203;kyungseopk1m](https://github.com/kyungseopk1m)).
- Improved the runtime and TypeScript error messages shown when a driver adapter is missing from the `PrismaClient` constructor; both now include a copy-pasteable example and a link to the [driver adapters docs](https://pris.ly/d/driver-adapters) ([#&#8203;29624](prisma/orm#29624)).
- Unmapped database errors from driver adapters now surface as a user-facing `P2039` (`PrismaClientKnownRequestError`) carrying the original code and message, instead of an opaque failure, which keeps schema-drift-style problems debuggable ([#&#8203;29512](prisma/orm#29512)).
- The `prisma-client-js` generator no longer emits a stray `undefined` statement when generating from a schema that declares only enums or types and no models ([#&#8203;29738](prisma/orm#29738), from [@&#8203;kyungseopk1m](https://github.com/kyungseopk1m)).
- Fixed a connection leak when an interactive transaction times out (`maxWait`) while it is still starting: the discarded transaction now sends an explicit `ROLLBACK` before the connection is returned to the pool, instead of releasing it mid-transaction. Previously, on adapters like `@prisma/adapter-pg` and `@prisma/adapter-neon`, the next query to reuse that connection could fail with `there is already a transaction in progress` — or silently commit the leaked transaction's work ([#&#8203;29727](prisma/orm#29727), from [@&#8203;lazerg](https://github.com/lazerg)).

**CLI**

- `prisma validate` (and other schema-loading commands) no longer hangs forever on a multi-file schema whose directories contain a symlink cycle, and no longer reports the same file twice when a directory is reachable under two spellings (e.g. `/tmp` → `/private/tmp` on macOS) ([#&#8203;29740](prisma/orm#29740), from [@&#8203;kyungseopk1m](https://github.com/kyungseopk1m)).
- On Windows, engine binaries are now cached in a stable, user-level directory (`%APPDATA%\Prisma`) instead of a `cwd`-relative `node_modules\.cache`, which eliminated duplicate cache directories and the bloated Serverless/Docker bundles they caused ([#&#8203;29730](prisma/orm#29730), from [@&#8203;santichausis](https://github.com/santichausis); closes [#&#8203;22574](prisma/orm#22574), [#&#8203;6670](prisma/orm#6670), [#&#8203;11577](prisma/orm#11577)).

**Driver Adapters**

- **[@&#8203;prisma/adapter-pg](https://github.com/prisma/adapter-pg)**, **[@&#8203;prisma/adapter-neon](https://github.com/prisma/adapter-neon)**, **[@&#8203;prisma/adapter-ppg](https://github.com/prisma/adapter-ppg)**: Reading a `Bytes` column no longer emits Node.js' `DEP0005` deprecation warning, thanks to an upstream `postgres-bytea` bump ([#&#8203;29538](prisma/orm#29538), from [@&#8203;kolia-zamnius](https://github.com/kolia-zamnius)).
- **[@&#8203;prisma/adapter-ppg](https://github.com/prisma/adapter-ppg)**: `ColumnNotFound` (`P2022`) errors now parse both quoted and unquoted PostgreSQL column names, including identifiers containing spaces, matching the fix previously applied to `adapter-pg` ([#&#8203;29737](prisma/orm#29737), from [@&#8203;kyungseopk1m](https://github.com/kyungseopk1m)).
- **[@&#8203;prisma/adapter-mssql](https://github.com/prisma/adapter-mssql)**: Setting a `Bytes?` (`@db.VarBinary`) field to `null` no longer fails with an implicit-conversion error; the adapter now sends the parameter typed as `VarBinary` instead of letting SQL Server default it to `nvarchar` ([#&#8203;29630](prisma/orm#29630), from [@&#8203;AnupamKumar-1](https://github.com/AnupamKumar-1)).

**Schema Engine**

- `prisma migrate status` now reports a rolled-back migration that still exists on disk as *unapplied*, instead of incorrectly treating the schema as up to date ([prisma/prisma-engines#5817](prisma/prisma-engines#5817), from [@&#8203;goutamadwant](https://github.com/goutamadwant)).
- Primary-key constraint renames are now rendered as separate `ALTER TABLE` statements on PostgreSQL, avoiding a database error when a single table has multiple changes in one migration ([prisma/prisma-engines#4906](prisma/prisma-engines#4906), from [@&#8203;eruditmorina](https://github.com/eruditmorina)).

##### Security

- Resolved the `hono` security advisories at their source: `@prisma/dev` was updated to a version that no longer depends on `hono` at all, so the CLI is no longer exposed to those advisories through that path. We also patched moderate-severity advisories in `ajv` and `uuid` across production dependencies ([#&#8203;29514](prisma/orm#29514)).
- Hardened the Prisma Platform credentials file (`~/.config/prisma-platform/auth.json`) and its directory to `0o600` / `0o700` so OAuth tokens are no longer world-readable, bringing Prisma in line with the GitHub, AWS, and Google Cloud CLIs ([#&#8203;29568](prisma/orm#29568), from Jaeyoung Yun).
- Bumped the `openssl` crate in the schema engine binaries from 0.10.74 to 0.10.81 ([prisma/prisma-engines#5815](prisma/prisma-engines#5815)).

##### Prisma Studio

The bundled Prisma Studio moves from `0.27.3` to `0.33.0` ([#&#8203;29720](prisma/orm#29720)), gathering up everything shipped in the Studio releases in between.

##### Migrations view

Studio can now visualise your **migration history**. This view is powered by **[Prisma Next](https://www.prisma.io/docs/orm/next)** — the next major version of Prisma ORM, a full TypeScript rewrite (available now in [Early Access](https://www.prisma.io/docs/next/getting-started)) that keeps the schema-first workflow and model-first queries you know, but treats your schema as a versioned, inspectable **contract** instead of compiling it into a heavy generated client. Prisma Next records every migration and its contract snapshots in the database, and Studio reads them to draw the timeline and diff below. Databases managed with classic Prisma Migrate don't carry this ledger, so the view simply stays hidden there.

When the connected database has a Prisma Next migration ledger, a **Migrations** entry appears in the sidebar: a newest-first timeline of every applied migration with its name, apply time, operation count, and compact chips summarizing what changed (`+2 models`, `~2 models +3 fields`, `+1 model`, …). Selecting a migration opens a visual, FigJam-style diff canvas — added, removed, and changed models as colour-coded cards (`NEW` / `UPDATED` / `UNCHANGED`) with per-field before → after details, enum cards, and relation edges — next to a SQL panel of the executed statements and a Prisma-schema line diff. Switching migrations morphs the canvas rather than rebuilding it.

![The Studio Migrations view: walking a Prisma Next migration history, the diff canvas morphing between migrations](https://github.com/user-attachments/assets/2633b77a-b1d9-4c3f-b5c4-c10908f040d9)

<!-- On publishing: drag wip/demos/prisma-studio-migrations.webp into the GitHub release editor so it becomes a user-attachments URL. -->

##### Prisma Streams browser

Studio gains first-class support for Prisma Streams: a dedicated stream browser, live stream aggregations, stream diagnostics, routing-key browsing, and a WAL-history handoff straight from your tables, plus richer stream request observability with concise event-log and OpenTelemetry span summaries.

##### Working with SQL

- SQL execution, linting, and navigation are now **schema-aware**: unqualified identifiers resolve against the schema you've selected instead of always falling back to the adapter's default schema.
- SQL result visualizations are rendered with Studio-owned chart configuration, and there's an optional **Queries** view backed by query-insights snapshots.
- Added copy actions to the Query Details view.

##### Fixes

- Fixed editing PostgreSQL text-array cells when queries are compiled with inline values.
- Avoided cancelling and repeating introspection requests when Studio first mounts, removing duplicate startup work.

##### Thanks to our contributors

A heartfelt thank you to the community members whose contributions shaped this release:

[@&#8203;AmirSa12](https://github.com/AmirSa12), [@&#8203;kyungseopk1m](https://github.com/kyungseopk1m), [@&#8203;nfl1ryxditimo12](https://github.com/nfl1ryxditimo12), [@&#8203;jibin7jose](https://github.com/jibin7jose), [@&#8203;santichausis](https://github.com/santichausis), [@&#8203;kolia-zamnius](https://github.com/kolia-zamnius), [@&#8203;goutamadwant](https://github.com/goutamadwant), [@&#8203;eruditmorina](https://github.com/eruditmorina), [@&#8203;lazerg](https://github.com/lazerg), [@&#8203;AnupamKumar-1](https://github.com/AnupamKumar-1), [@&#8203;Swapanrishi](https://github.com/Swapanrishi), [@&#8203;anupamme](https://github.com/anupamme), and [@&#8203;oyi77](https://github.com/oyi77).

##### Prisma Compute is now in public beta

**"Push code, it runs."** [Prisma Compute](https://www.prisma.io/compute) — managed hosting for TypeScript apps that run right next to your database — is now available in [public beta](https://blog.prisma.io/blog/launching-prisma-compute-public-beta), and free to use while the beta lasts.

Compute deploys your app as a long-lived process on Bun, colocated with your Prisma Postgres database, so there are no cold starts, no request timeouts, and no separate hosting vendor to wire up. It's a fit for REST and GraphQL APIs, full-stack apps, streaming and gRPC, and the long-running, stateful AI agents that keep connections open and hold in-process caches — "self-hosting, without the painful parts".

- **Push-to-deploy** from the CLI or via GitHub integration. Every deployment is an immutable, versioned release with its own preview URL, and rolling back is simply promoting a previous version.
- **Branch-based environments** — each branch gets its own app and database, so you can preview a change before promoting it to production.
- **Auto-wires with Prisma Postgres** (or bring any database), with automatic health checks and self-recovery.
- **[Custom domains](https://blog.prisma.io/blog/prisma-compute-custom-domains)** — point a single CNAME at Prisma and Compute provisions and renews the TLS certificate for you, with no manual certificate uploads or private-key handling.

With Prisma ORM for type-safe data access, Prisma Postgres for the managed database, and now Prisma Compute for hosting, the whole stack lives in one place. Read the full story in the [Prisma Compute blog series](https://blog.prisma.io/blog/series/prisma-compute).

##### Enterprise support

Thousands of teams use Prisma and many of them already tap into our Enterprise & Agency Support Program for hands-on help with everything from schema integrations and performance tuning to security and compliance.

With this program you also get priority issue triage and bug fixes, expert scalability advice, and custom training so that your Prisma-powered apps stay rock-solid at any scale. Learn more or join: <https://prisma.io/enterprise>.

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNzIuMSIsInVwZGF0ZWRJblZlciI6IjQzLjI3Mi4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Server/pulls/30
@AnupamKumar-1
AnupamKumar-1 deleted the fix/mssql-varbinary-null-conversion branch August 6, 2026 12:17
lh0x00 pushed a commit to lh0x00/prisma that referenced this pull request Aug 9, 2026
…assed prisma#29557 (prisma#29630)

Fixes prisma#29557 

When setting a `Bytes?` (`@db.VarBinary(Max)`) field to `null`, the
adapter was sending the parameter without a type, causing MSSQL to
default to `nvarchar` and throw an implicit conversion error.

Fixed by explicitly passing `sql.VarBinary` as the type for null bytes
arguments in `performIO`.

All 87 tests passing locally.
mahenoorsalat pushed a commit to mahenoorsalat/prisma that referenced this pull request Aug 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lgtm This PR has been approved by a maintainer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[MSSQL] Setting Bytes? (@db.VarBinary(Max)) to null throws "Implicit conversion from nvarchar to varbinary(max)"

3 participants