diff --git a/packages/core/src/database/drizzle/sqlite-core/effect/update.ts b/packages/core/src/database/drizzle/sqlite-core/effect/update.ts index 5a39708a100..e81c90ff754 100644 --- a/packages/core/src/database/drizzle/sqlite-core/effect/update.ts +++ b/packages/core/src/database/drizzle/sqlite-core/effect/update.ts @@ -279,7 +279,7 @@ export class SQLiteEffectUpdateBase< : undefined on = on( new Proxy( - this.config.table._.columns, + getTableColumnsRuntime(this.config.table), new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" }), ) as any, from && diff --git a/packages/core/test/database-drizzle.test.ts b/packages/core/test/database-drizzle.test.ts index d07efaad144..1e81f9e096a 100644 --- a/packages/core/test/database-drizzle.test.ts +++ b/packages/core/test/database-drizzle.test.ts @@ -15,6 +15,14 @@ const users = sqliteTable("users", { id: integer().primaryKey({ autoIncrement: true }), name: text().notNull(), }) +const teams = sqliteTable("teams", { + id: integer().primaryKey(), + name: text().notNull(), +}) +const memberships = sqliteTable("memberships", { + user_id: integer().notNull(), + team_id: integer().notNull(), +}) const run = (effect: Effect.Effect) => Effect.runPromise( @@ -163,3 +171,41 @@ test("supports returning and rejects empty update sets", async () => { }), ) }) + +test("supports function-valued update joins with runtime table columns", async () => { + await run( + Effect.gen(function* () { + const db = yield* makeDb + const query = db + .update(users) + .set({ name: "Grace" }) + .from(teams) + .innerJoin(memberships, (update) => eq(update.id, memberships.user_id)) + .where(eq(teams.name, "Core")) + + expect(query.toSQL()).toEqual({ + sql: 'update "users" set "name" = ? from "teams" inner join "memberships" on "users"."id" = "memberships"."user_id" where "teams"."name" = ?', + params: ["Grace", "Core"], + }) + }), + ) +}) + +test("supports SQL-valued update joins", async () => { + await run( + Effect.gen(function* () { + const db = yield* makeDb + const query = db + .update(users) + .set({ name: "Lin" }) + .from(teams) + .innerJoin(memberships, eq(users.id, memberships.user_id)) + .where(eq(teams.name, "Core")) + + expect(query.toSQL()).toEqual({ + sql: 'update "users" set "name" = ? from "teams" inner join "memberships" on "users"."id" = "memberships"."user_id" where "teams"."name" = ?', + params: ["Lin", "Core"], + }) + }), + ) +})