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"],
+ })
+ }),
+ )
+})