From 36d5107f5667b03d275fba8c34e7111553c24085 Mon Sep 17 00:00:00 2001 From: Sebastian Lorenz Date: Tue, 4 Aug 2026 18:19:32 +0000 Subject: [PATCH 1/2] Keep ordered SQL resolver results aligned after encoding failures --- .../test/unstable/sql/SqlResolver.test.ts | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/effect/test/unstable/sql/SqlResolver.test.ts b/packages/effect/test/unstable/sql/SqlResolver.test.ts index 87743e061f5..90f80da4306 100644 --- a/packages/effect/test/unstable/sql/SqlResolver.test.ts +++ b/packages/effect/test/unstable/sql/SqlResolver.test.ts @@ -1,5 +1,5 @@ import { assert, describe, it } from "@effect/vitest" -import { Effect } from "effect" +import { Effect, Exit } from "effect" import * as Schema from "effect/Schema" import { SqlResolver } from "effect/unstable/sql" @@ -34,4 +34,24 @@ describe("SqlResolver", () => { assert.deepStrictEqual(batches, [[1, 2]]) })) }) + + describe("ordered", () => { + it.effect("keeps valid results aligned when another request fails encoding", () => + Effect.gen(function*() { + const resolver = SqlResolver.ordered({ + Request: Schema.Number.check(Schema.isGreaterThan(0)), + Result: Schema.String, + execute: (inputs) => Effect.succeed(inputs.map((input) => `value-${input}`)) + }) + const execute = SqlResolver.request(resolver) + const [invalid, valid] = yield* Effect.all([ + Effect.exit(execute(-1)), + Effect.exit(execute(2)) + ], { concurrency: "unbounded" }) + + assert(Exit.isFailure(invalid)) + assert(Exit.isSuccess(valid)) + assert.strictEqual(valid.value, "value-2") + })) + }) }) From 4c7d053b07ba866bbce76703cfef169a96d5d757 Mon Sep 17 00:00:00 2001 From: Tim Smart Date: Tue, 4 Aug 2026 22:12:12 +0000 Subject: [PATCH 2/2] Fix ordered SQL resolver result alignment --- .changeset/calm-results-align.md | 5 +++++ packages/effect/src/unstable/sql/SqlResolver.ts | 14 ++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 .changeset/calm-results-align.md diff --git a/.changeset/calm-results-align.md b/.changeset/calm-results-align.md new file mode 100644 index 00000000000..896040c70d5 --- /dev/null +++ b/.changeset/calm-results-align.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +Keep ordered SQL resolver results aligned when batched request encoding fails. diff --git a/packages/effect/src/unstable/sql/SqlResolver.ts b/packages/effect/src/unstable/sql/SqlResolver.ts index 385117a08d8..124a8760677 100644 --- a/packages/effect/src/unstable/sql/SqlResolver.ts +++ b/packages/effect/src/unstable/sql/SqlResolver.ts @@ -121,7 +121,7 @@ export const ordered = ({ key: transactionKey, resolver: Effect.fnUntraced(function*(entries) { - const inputs = yield* partitionRequests(entries, options.Request) + const [inputs, encodedEntries] = yield* partitionRequests(entries, options.Request) const results = yield* options.execute(inputs as any).pipe( Effect.provideContext(entries[0].context) ) @@ -131,8 +131,8 @@ export const ordered = ({ key: transactionKey, resolver: Effect.fnUntraced(function*(entries) { - const inputs = yield* partitionRequests(entries, options.Request) + const [inputs] = yield* partitionRequests(entries, options.Request) const resultMap = MutableHashMap.empty>() const results = yield* options.execute(inputs as any).pipe( Effect.provideContext(entries[0].context) @@ -298,7 +298,7 @@ const void_ = ( >({ key: transactionKey, resolver: Effect.fnUntraced(function*(entries) { - const inputs = yield* partitionRequests(entries, options.Request) + const [inputs] = yield* partitionRequests(entries, options.Request) yield* options.execute(inputs as any).pipe( Effect.provideContext(entries[0].context) ) @@ -326,6 +326,7 @@ const partitionRequests = function*( ) { const len = requests.length const inputs = Arr.empty() + const encodedEntries = Arr.empty>>() let entry!: Request.Entry> const encode = Schema.encodeEffect(schema) const handle = Effect.matchCauseEager({ @@ -334,6 +335,7 @@ const partitionRequests = function*( }, onSuccess(value: InE) { inputs.push(value) + encodedEntries.push(entry) } }) @@ -342,7 +344,7 @@ const partitionRequests = function*( yield (Effect.provideContext(handle(encode(entry.request.payload)), entry.context) as Effect.Effect) } - return inputs + return [inputs, encodedEntries] as const } const partitionRequestsById = function*(