diff --git a/packages/orm/src/client/crud/dialects/sqlite.ts b/packages/orm/src/client/crud/dialects/sqlite.ts index 00927f510..a7ceac7b2 100644 --- a/packages/orm/src/client/crud/dialects/sqlite.ts +++ b/packages/orm/src/client/crud/dialects/sqlite.ts @@ -99,7 +99,7 @@ export class SqliteCrudDialect extends BaseCrudDialect ? new Date(value).toISOString() : value; case 'Decimal': - return (value as Decimal).toString(); + return value !== null ? value.toString() : value; case 'Bytes': return Buffer.from(value as Uint8Array); default: diff --git a/tests/e2e/orm/client-api/sqlite-null.test.ts b/tests/e2e/orm/client-api/sqlite-null.test.ts new file mode 100644 index 000000000..912788d04 --- /dev/null +++ b/tests/e2e/orm/client-api/sqlite-null.test.ts @@ -0,0 +1,52 @@ +import { createTestClient, getTestDbProvider } from '@zenstackhq/testtools'; +import { describe, expect, it } from 'vitest'; +import Decimal from 'decimal.js'; + +const provider = getTestDbProvider(); + +describe.skipIf(provider !== 'sqlite')('sqlite null tests', () => { + it('allows writing null to optional Decimal fields', async () => { + const db = await createTestClient( + ` +model User { + id Int @id @default(autoincrement()) + balance Decimal? +} +`, + ); + + const user = await db.user.create({ + data: { + balance: null, + }, + }); + + expect(user).toMatchObject({ + balance: null, + }); + + await db.user.update({ + data: { + balance: Decimal(1), + }, + + where: { + id: user.id, + }, + }); + + await expect( + db.user.update({ + data: { + balance: null, + }, + + where: { + id: user.id, + }, + }), + ).resolves.toMatchObject({ + balance: null, + }); + }); +});