From ad9ec08a8f602cb279dc34df4478a090fd6d4c33 Mon Sep 17 00:00:00 2001 From: Mario564 Date: Wed, 4 Sep 2024 19:57:40 -0700 Subject: [PATCH 1/8] (Pg) Fix $onUpdate with sql value --- drizzle-orm/src/pg-core/columns/date.ts | 5 ++- drizzle-orm/src/pg-core/columns/json.ts | 7 ++-- drizzle-orm/src/pg-core/columns/jsonb.ts | 7 ++-- drizzle-orm/src/pg-core/columns/line.ts | 14 ++++--- drizzle-orm/src/pg-core/columns/point.ts | 12 +++--- .../columns/postgis_extension/geometry.ts | 12 +++--- drizzle-orm/src/pg-core/columns/timestamp.ts | 7 ++-- .../columns/vector_extension/halfvec.ts | 5 ++- .../columns/vector_extension/vector.ts | 5 ++- integration-tests/tests/pg/pg-common.ts | 37 +++++++++++++++++++ 10 files changed, 78 insertions(+), 33 deletions(-) diff --git a/drizzle-orm/src/pg-core/columns/date.ts b/drizzle-orm/src/pg-core/columns/date.ts index 3c0107c3cd..819cffd971 100644 --- a/drizzle-orm/src/pg-core/columns/date.ts +++ b/drizzle-orm/src/pg-core/columns/date.ts @@ -4,6 +4,7 @@ import { entityKind } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; import { PgColumn } from './common.ts'; import { PgDateColumnBaseBuilder } from './date.common.ts'; +import type { Placeholder, SQL } from '~/sql/sql.ts'; export type PgDateBuilderInitial = PgDateBuilder<{ name: TName; @@ -41,8 +42,8 @@ export class PgDate> extends PgColu return new Date(value); } - override mapToDriverValue(value: Date): string { - return value.toISOString(); + override mapToDriverValue(value: Date | SQL | Placeholder): string | SQL | Placeholder { + return value instanceof Date ? value.toISOString() : value; } } diff --git a/drizzle-orm/src/pg-core/columns/json.ts b/drizzle-orm/src/pg-core/columns/json.ts index ddb97b67e0..b054a4a800 100644 --- a/drizzle-orm/src/pg-core/columns/json.ts +++ b/drizzle-orm/src/pg-core/columns/json.ts @@ -1,8 +1,9 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts'; import type { ColumnBaseConfig } from '~/column.ts'; -import { entityKind } from '~/entity.ts'; +import { entityKind, is } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; import { PgColumn, PgColumnBuilder } from './common.ts'; +import { Placeholder, SQL } from '~/sql/sql.ts'; export type PgJsonBuilderInitial = PgJsonBuilder<{ name: TName; @@ -42,8 +43,8 @@ export class PgJson> extends PgColu return 'json'; } - override mapToDriverValue(value: T['data']): string { - return JSON.stringify(value); + override mapToDriverValue(value: T['data'] | SQL | Placeholder): string | SQL | Placeholder { + return is(value, SQL) || is(value, Placeholder) ? value : JSON.stringify(value); } override mapFromDriverValue(value: T['data'] | string): T['data'] { diff --git a/drizzle-orm/src/pg-core/columns/jsonb.ts b/drizzle-orm/src/pg-core/columns/jsonb.ts index a44b26fd04..5942254cd0 100644 --- a/drizzle-orm/src/pg-core/columns/jsonb.ts +++ b/drizzle-orm/src/pg-core/columns/jsonb.ts @@ -1,8 +1,9 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts'; import type { ColumnBaseConfig } from '~/column.ts'; -import { entityKind } from '~/entity.ts'; +import { entityKind, is } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; import { PgColumn, PgColumnBuilder } from './common.ts'; +import { Placeholder, SQL } from '~/sql/sql.ts'; export type PgJsonbBuilderInitial = PgJsonbBuilder<{ name: TName; @@ -40,8 +41,8 @@ export class PgJsonb> extends PgCo return 'jsonb'; } - override mapToDriverValue(value: T['data']): string { - return JSON.stringify(value); + override mapToDriverValue(value: T['data'] | SQL | Placeholder): string | SQL | Placeholder { + return is(value, SQL) || is(value, Placeholder) ? value : JSON.stringify(value); } override mapFromDriverValue(value: T['data'] | string): T['data'] { diff --git a/drizzle-orm/src/pg-core/columns/line.ts b/drizzle-orm/src/pg-core/columns/line.ts index bf4e653ad1..be2143ef9b 100644 --- a/drizzle-orm/src/pg-core/columns/line.ts +++ b/drizzle-orm/src/pg-core/columns/line.ts @@ -1,10 +1,10 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts'; import type { ColumnBaseConfig } from '~/column.ts'; -import { entityKind } from '~/entity.ts'; +import { entityKind, is } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; - import type { Equal } from '~/utils.ts'; import { PgColumn, PgColumnBuilder } from './common.ts'; +import { Placeholder, SQL } from '~/sql/sql.ts'; export type PgLineBuilderInitial = PgLineBuilder<{ name: TName; @@ -46,8 +46,8 @@ export class PgLineTuple> extends return [Number.parseFloat(a!), Number.parseFloat(b!), Number.parseFloat(c!)]; } - override mapToDriverValue(value: [number, number, number]): string { - return `{${value[0]},${value[1]},${value[2]}}`; + override mapToDriverValue(value: [number, number, number] | SQL | Placeholder): string | SQL | Placeholder { + return Array.isArray(value) ? `{${value[0]},${value[1]},${value[2]}}` : value; } } @@ -91,8 +91,10 @@ export class PgLineABC> extends return { a: Number.parseFloat(a!), b: Number.parseFloat(b!), c: Number.parseFloat(c!) }; } - override mapToDriverValue(value: { a: number; b: number; c: number }): string { - return `{${value.a},${value.b},${value.c}}`; + override mapToDriverValue(value: { a: number; b: number; c: number } | SQL | Placeholder): string | SQL | Placeholder { + return is(value, SQL) || is(value, Placeholder) + ? value + : `{${(value as any).a},${(value as any).b},${(value as any).c}}`; } } diff --git a/drizzle-orm/src/pg-core/columns/point.ts b/drizzle-orm/src/pg-core/columns/point.ts index 7bff25e55b..da90a7c16f 100644 --- a/drizzle-orm/src/pg-core/columns/point.ts +++ b/drizzle-orm/src/pg-core/columns/point.ts @@ -1,10 +1,10 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts'; import type { ColumnBaseConfig } from '~/column.ts'; -import { entityKind } from '~/entity.ts'; +import { entityKind, is } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; - import type { Equal } from '~/utils.ts'; import { PgColumn, PgColumnBuilder } from './common.ts'; +import { Placeholder, SQL } from '~/sql/sql.ts'; export type PgPointTupleBuilderInitial = PgPointTupleBuilder<{ name: TName; @@ -51,8 +51,8 @@ export class PgPointTuple> e return [value.x, value.y]; } - override mapToDriverValue(value: [number, number]): string { - return `(${value[0]},${value[1]})`; + override mapToDriverValue(value: [number, number] | SQL | Placeholder): string | SQL | Placeholder { + return Array.isArray(value) ? `(${value[0]},${value[1]})` : value; } } @@ -101,8 +101,8 @@ export class PgPointObject> return value; } - override mapToDriverValue(value: { x: number; y: number }): string { - return `(${value.x},${value.y})`; + override mapToDriverValue(value: { x: number; y: number } | SQL | Placeholder): string | SQL | Placeholder { + return is(value, SQL) || is(value, Placeholder) ? value : `(${(value as any).x},${(value as any).y})`; } } diff --git a/drizzle-orm/src/pg-core/columns/postgis_extension/geometry.ts b/drizzle-orm/src/pg-core/columns/postgis_extension/geometry.ts index 5dc2b8955e..e0aa15fc38 100644 --- a/drizzle-orm/src/pg-core/columns/postgis_extension/geometry.ts +++ b/drizzle-orm/src/pg-core/columns/postgis_extension/geometry.ts @@ -1,11 +1,11 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts'; import type { ColumnBaseConfig } from '~/column.ts'; -import { entityKind } from '~/entity.ts'; +import { entityKind, is } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; - import type { Equal } from '~/utils.ts'; import { PgColumn, PgColumnBuilder } from '../common.ts'; import { parseEWKB } from './utils.ts'; +import { Placeholder, SQL } from '~/sql/sql.ts'; export type PgGeometryBuilderInitial = PgGeometryBuilder<{ name: TName; @@ -46,8 +46,8 @@ export class PgGeometry> exten return parseEWKB(value); } - override mapToDriverValue(value: [number, number]): string { - return `point(${value[0]} ${value[1]})`; + override mapToDriverValue(value: [number, number] | SQL | Placeholder): string | SQL | Placeholder { + return Array.isArray(value) ? `point(${value[0]} ${value[1]})` : value; } } @@ -93,8 +93,8 @@ export class PgGeometryObject = PgTimestampBuilder<{ name: TName; @@ -59,12 +60,12 @@ export class PgTimestamp> exte return `timestamp${precision}${this.withTimezone ? ' with time zone' : ''}`; } - override mapFromDriverValue = (value: string): Date | null => { + override mapFromDriverValue = (value: string): Date => { return new Date(this.withTimezone ? value : value + '+0000'); }; - override mapToDriverValue = (value: Date): string => { - return value.toISOString(); + override mapToDriverValue = (value: Date | SQL | Placeholder): string | SQL | Placeholder => { + return value instanceof Date ? value.toISOString() : value; }; } diff --git a/drizzle-orm/src/pg-core/columns/vector_extension/halfvec.ts b/drizzle-orm/src/pg-core/columns/vector_extension/halfvec.ts index 182beda7e6..f7138edc9d 100644 --- a/drizzle-orm/src/pg-core/columns/vector_extension/halfvec.ts +++ b/drizzle-orm/src/pg-core/columns/vector_extension/halfvec.ts @@ -1,8 +1,9 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts'; import type { ColumnBaseConfig } from '~/column.ts'; -import { entityKind } from '~/entity.ts'; +import { entityKind, is } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; import { PgColumn, PgColumnBuilder } from '../common.ts'; +import { Placeholder, SQL } from '~/sql/sql.ts'; export type PgHalfVectorBuilderInitial = PgHalfVectorBuilder<{ name: TName; @@ -48,7 +49,7 @@ export class PgHalfVector> } override mapToDriverValue(value: unknown): unknown { - return JSON.stringify(value); + return is(value, SQL) || is(value, Placeholder) ? value : JSON.stringify(value); } override mapFromDriverValue(value: string): unknown { diff --git a/drizzle-orm/src/pg-core/columns/vector_extension/vector.ts b/drizzle-orm/src/pg-core/columns/vector_extension/vector.ts index c7099b5dc3..79fd8e3cd9 100644 --- a/drizzle-orm/src/pg-core/columns/vector_extension/vector.ts +++ b/drizzle-orm/src/pg-core/columns/vector_extension/vector.ts @@ -1,8 +1,9 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts'; import type { ColumnBaseConfig } from '~/column.ts'; -import { entityKind } from '~/entity.ts'; +import { entityKind, is } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; import { PgColumn, PgColumnBuilder } from '../common.ts'; +import { Placeholder, SQL } from '~/sql/sql.ts'; export type PgVectorBuilderInitial = PgVectorBuilder<{ name: TName; @@ -45,7 +46,7 @@ export class PgVector> } override mapToDriverValue(value: unknown): unknown { - return JSON.stringify(value); + return is(value, SQL) || is(value, Placeholder) ? value : JSON.stringify(value); } override mapFromDriverValue(value: string): unknown { diff --git a/integration-tests/tests/pg/pg-common.ts b/integration-tests/tests/pg/pg-common.ts index fb69c58774..5901e70d35 100644 --- a/integration-tests/tests/pg/pg-common.ts +++ b/integration-tests/tests/pg/pg-common.ts @@ -3800,6 +3800,43 @@ export function tests() { } }); + test('test $onUpdateFn and $onUpdate with sql value', async (ctx) => { + const { db } = ctx.pg; + + const users = pgTable('users', { + id: serial('id').primaryKey(), + name: text('name').notNull(), + updatedAt: timestamp('updated_at', { mode: 'date' }).notNull().$onUpdate(() => sql`now()`), + }); + + await db.execute(sql`drop table if exists ${users}`); + await db.execute( + sql` + create table ${users} ( + "id" serial primary key, + "name" text not null, + "updated_at" timestamp(3) + ) + `, + ); + + const insertResp = await db.insert(users).values({ + name: 'John' + }).returning({ + updatedAt: users.updatedAt + }); + + const now = new Date().getTime(); + const updateResp = await db.update(users).set({ + name: 'John' + }).returning({ + updatedAt: users.updatedAt + }); + + expect(insertResp[0]?.updatedAt.getTime() ?? 0).lessThan(now); + expect(updateResp[0]?.updatedAt.getTime() ?? 0).greaterThan(now); + }); + test('test if method with sql operators', async (ctx) => { const { db } = ctx.pg; From bc3aaf5149a12cfd8b467a83756f1ace1a555915 Mon Sep 17 00:00:00 2001 From: Mario564 Date: Thu, 5 Sep 2024 08:57:04 -0700 Subject: [PATCH 2/8] (SQLite) Fix $onUpdate with sql value --- drizzle-orm/src/sqlite-core/columns/blob.ts | 11 ++--- .../src/sqlite-core/columns/integer.ts | 17 +++++--- drizzle-orm/src/sqlite-core/columns/text.ts | 7 ++-- integration-tests/tests/pg/pg-common.ts | 2 +- .../tests/sqlite/sqlite-common.ts | 41 +++++++++++++++++++ 5 files changed, 63 insertions(+), 15 deletions(-) diff --git a/drizzle-orm/src/sqlite-core/columns/blob.ts b/drizzle-orm/src/sqlite-core/columns/blob.ts index 7371eb299e..b2a4fa2e14 100644 --- a/drizzle-orm/src/sqlite-core/columns/blob.ts +++ b/drizzle-orm/src/sqlite-core/columns/blob.ts @@ -1,9 +1,10 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts'; import type { ColumnBaseConfig } from '~/column.ts'; -import { entityKind } from '~/entity.ts'; +import { entityKind, is } from '~/entity.ts'; import type { AnySQLiteTable } from '~/sqlite-core/table.ts'; import type { Equal } from '~/utils.ts'; import { SQLiteColumn, SQLiteColumnBuilder } from './common.ts'; +import { Placeholder, SQL } from '~/sql/sql.ts'; type BlobMode = 'buffer' | 'json' | 'bigint'; @@ -45,8 +46,8 @@ export class SQLiteBigInt> return BigInt(value.toString()); } - override mapToDriverValue(value: bigint): Buffer { - return Buffer.from(value.toString()); + override mapToDriverValue(value: bigint | SQL | Placeholder): Buffer | SQL | Placeholder { + return typeof value === 'bigint' ? Buffer.from(value.toString()) : value; } } @@ -91,8 +92,8 @@ export class SQLiteBlobJson return JSON.parse(value.toString()); } - override mapToDriverValue(value: T['data']): Buffer { - return Buffer.from(JSON.stringify(value)); + override mapToDriverValue(value: T['data'] | SQL | Placeholder): Buffer | SQL | Placeholder { + return is(value, SQL) || is(value, Placeholder) ? value : Buffer.from(JSON.stringify(value)); } } diff --git a/drizzle-orm/src/sqlite-core/columns/integer.ts b/drizzle-orm/src/sqlite-core/columns/integer.ts index 1c839837d8..4935b52250 100644 --- a/drizzle-orm/src/sqlite-core/columns/integer.ts +++ b/drizzle-orm/src/sqlite-core/columns/integer.ts @@ -8,8 +8,8 @@ import type { NotNull, } from '~/column-builder.ts'; import type { ColumnBaseConfig } from '~/column.ts'; -import { entityKind } from '~/entity.ts'; -import { sql } from '~/sql/sql.ts'; +import { entityKind, is } from '~/entity.ts'; +import { sql, SQL, Placeholder } from '~/sql/sql.ts'; import type { OnConflict } from '~/sqlite-core/utils.ts'; import type { Equal, Or } from '~/utils.ts'; import type { AnySQLiteTable } from '../table.ts'; @@ -149,8 +149,11 @@ export class SQLiteTimestamp = SQLiteTextBuilder<{ name: TName; @@ -99,8 +100,8 @@ export class SQLiteTextJson return JSON.parse(value); } - override mapToDriverValue(value: T['data']): string { - return JSON.stringify(value); + override mapToDriverValue(value: T['data'] | SQL | Placeholder): string | SQL | Placeholder { + return is(value, SQL) || is(value, Placeholder) ? value : JSON.stringify(value); } } diff --git a/integration-tests/tests/pg/pg-common.ts b/integration-tests/tests/pg/pg-common.ts index 5901e70d35..279abab89a 100644 --- a/integration-tests/tests/pg/pg-common.ts +++ b/integration-tests/tests/pg/pg-common.ts @@ -3800,7 +3800,7 @@ export function tests() { } }); - test('test $onUpdateFn and $onUpdate with sql value', async (ctx) => { + test('test $onUpdateFn and $onUpdate works with sql value', async (ctx) => { const { db } = ctx.pg; const users = pgTable('users', { diff --git a/integration-tests/tests/sqlite/sqlite-common.ts b/integration-tests/tests/sqlite/sqlite-common.ts index 49c6099412..7640a5405b 100644 --- a/integration-tests/tests/sqlite/sqlite-common.ts +++ b/integration-tests/tests/sqlite/sqlite-common.ts @@ -2661,6 +2661,47 @@ export function tests() { expect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay); } }); + + test('test $onUpdateFn and $onUpdate works with sql value', async (ctx) => { + const { db } = ctx.sqlite; + + const users = sqliteTable('users', { + id: integer('id').primaryKey({ autoIncrement: true }), + name: text('name').notNull(), + updatedAt: integer('updated_at') + .notNull() + .$onUpdate(() => sql`(strftime('%s', 'now') * 1000) + (strftime('%f', 'now') - strftime('%S', 'now')) * 1000`), + }); + + await db.run(sql`drop table if exists ${users}`); + await db.run( + sql` + create table ${users} ( + \`id\` integer primary key autoincrement, + \`name\` text not null, + \`updated_at\` integer not null + ) + `, + ); + + const insertResp = await db.insert(users).values({ + name: 'John' + }).returning({ + updatedAt: users.updatedAt + }); + await new Promise((resolve) => setTimeout(resolve, 50)); + + const now = new Date().getTime(); + await new Promise((resolve) => setTimeout(resolve, 50)); + const updateResp = await db.update(users).set({ + name: 'John' + }).returning({ + updatedAt: users.updatedAt + }); + + expect(insertResp[0]?.updatedAt ?? 0).lessThan(now); + expect(updateResp[0]?.updatedAt ?? 0).greaterThan(now); + }); }); test('table configs: unique third param', () => { From 6c153e3507cc166d65951005bfcb876ee2d67321 Mon Sep 17 00:00:00 2001 From: Mario564 Date: Thu, 5 Sep 2024 09:30:44 -0700 Subject: [PATCH 3/8] (MySQL) Fix $onUpdate with sql value --- .../src/mysql-core/columns/datetime.ts | 5 ++- drizzle-orm/src/mysql-core/columns/json.ts | 7 ++-- .../src/mysql-core/columns/timestamp.ts | 5 ++- integration-tests/tests/mysql/mysql-common.ts | 41 +++++++++++++++++++ integration-tests/tests/pg/pg-common.ts | 2 + 5 files changed, 53 insertions(+), 7 deletions(-) diff --git a/drizzle-orm/src/mysql-core/columns/datetime.ts b/drizzle-orm/src/mysql-core/columns/datetime.ts index 040c571302..8bbd1b6048 100644 --- a/drizzle-orm/src/mysql-core/columns/datetime.ts +++ b/drizzle-orm/src/mysql-core/columns/datetime.ts @@ -4,6 +4,7 @@ import { entityKind } from '~/entity.ts'; import type { AnyMySqlTable } from '~/mysql-core/table.ts'; import type { Equal } from '~/utils.ts'; import { MySqlColumn, MySqlColumnBuilder } from './common.ts'; +import type { Placeholder, SQL } from '~/sql/sql.ts'; export type MySqlDateTimeBuilderInitial = MySqlDateTimeBuilder<{ name: TName; @@ -54,8 +55,8 @@ export class MySqlDateTime> return `datetime${precision}`; } - override mapToDriverValue(value: Date): unknown { - return value.toISOString().replace('T', ' ').replace('Z', ''); + override mapToDriverValue(value: Date | SQL | Placeholder): unknown { + return value instanceof Date ? value.toISOString().replace('T', ' ').replace('Z', '') : value; } override mapFromDriverValue(value: string): Date { diff --git a/drizzle-orm/src/mysql-core/columns/json.ts b/drizzle-orm/src/mysql-core/columns/json.ts index f30ea1534a..f6c8df15c2 100644 --- a/drizzle-orm/src/mysql-core/columns/json.ts +++ b/drizzle-orm/src/mysql-core/columns/json.ts @@ -1,8 +1,9 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts'; import type { ColumnBaseConfig } from '~/column.ts'; -import { entityKind } from '~/entity.ts'; +import { entityKind, is } from '~/entity.ts'; import type { AnyMySqlTable } from '~/mysql-core/table.ts'; import { MySqlColumn, MySqlColumnBuilder } from './common.ts'; +import { Placeholder, SQL } from '~/sql/sql.ts'; export type MySqlJsonBuilderInitial = MySqlJsonBuilder<{ name: TName; @@ -36,8 +37,8 @@ export class MySqlJson> extends return 'json'; } - override mapToDriverValue(value: T['data']): string { - return JSON.stringify(value); + override mapToDriverValue(value: T['data'] | SQL | Placeholder): string | SQL | Placeholder { + return is(value, SQL) || is(value, Placeholder) ? value : JSON.stringify(value); } } diff --git a/drizzle-orm/src/mysql-core/columns/timestamp.ts b/drizzle-orm/src/mysql-core/columns/timestamp.ts index 24e3b26508..6ea967d5cd 100644 --- a/drizzle-orm/src/mysql-core/columns/timestamp.ts +++ b/drizzle-orm/src/mysql-core/columns/timestamp.ts @@ -4,6 +4,7 @@ import { entityKind } from '~/entity.ts'; import type { AnyMySqlTable } from '~/mysql-core/table.ts'; import type { Equal } from '~/utils.ts'; import { MySqlDateBaseColumn, MySqlDateColumnBaseBuilder } from './date.common.ts'; +import type { Placeholder, SQL } from '~/sql/sql.ts'; export type MySqlTimestampBuilderInitial = MySqlTimestampBuilder<{ name: TName; @@ -52,8 +53,8 @@ export class MySqlTimestamp return new Date(value + '+0000'); } - override mapToDriverValue(value: Date): string { - return value.toISOString().slice(0, -1).replace('T', ' '); + override mapToDriverValue(value: Date | SQL | Placeholder): string | SQL | Placeholder { + return value instanceof Date ? value.toISOString().slice(0, -1).replace('T', ' ') : value; } } diff --git a/integration-tests/tests/mysql/mysql-common.ts b/integration-tests/tests/mysql/mysql-common.ts index c96ae93198..465f5ec78d 100644 --- a/integration-tests/tests/mysql/mysql-common.ts +++ b/integration-tests/tests/mysql/mysql-common.ts @@ -3095,6 +3095,47 @@ export function tests(driver?: string) { } }); + test('test $onUpdateFn and $onUpdate works with sql value', async (ctx) => { + const { db } = ctx.mysql; + + const users = mysqlTable('users', { + id: serial('id').primaryKey(), + name: text('name').notNull(), + updatedAt: timestamp('updated_at', { + fsp: 6 + }) + .notNull() + .$onUpdate(() => sql`current_timestamp`), + }); + + await db.execute(sql`drop table if exists ${users}`); + await db.execute( + sql` + create table ${users} ( + \`id\` serial primary key, + \`name\` text not null, + \`updated_at\` timestamp not null + ) + `, + ); + + await db.insert(users).values({ + name: 'John' + }); + const insertResp = await db.select({ updatedAt: users.updatedAt }).from(users); + await new Promise((resolve) => setTimeout(resolve, 50)); + + const now = new Date().getTime(); + await new Promise((resolve) => setTimeout(resolve, 50)); + await db.update(users).set({ + name: 'John' + }); + const updateResp = await db.select({ updatedAt: users.updatedAt }).from(users); + + expect(insertResp[0]?.updatedAt.getTime() ?? 0).lessThan(now); + expect(updateResp[0]?.updatedAt.getTime() ?? 0).greaterThan(now); + }); + // mySchema tests test('mySchema :: select all fields', async (ctx) => { const { db } = ctx.mysql; diff --git a/integration-tests/tests/pg/pg-common.ts b/integration-tests/tests/pg/pg-common.ts index 279abab89a..e8dd46de45 100644 --- a/integration-tests/tests/pg/pg-common.ts +++ b/integration-tests/tests/pg/pg-common.ts @@ -3825,8 +3825,10 @@ export function tests() { }).returning({ updatedAt: users.updatedAt }); + await new Promise((resolve) => setTimeout(resolve, 50)); const now = new Date().getTime(); + await new Promise((resolve) => setTimeout(resolve, 50)); const updateResp = await db.update(users).set({ name: 'John' }).returning({ From ceec0129dba92715d65fd462aa6dce58b0e54685 Mon Sep 17 00:00:00 2001 From: Mario564 Date: Thu, 5 Sep 2024 09:31:09 -0700 Subject: [PATCH 4/8] Format --- drizzle-orm/src/mysql-core/columns/datetime.ts | 2 +- drizzle-orm/src/mysql-core/columns/json.ts | 2 +- drizzle-orm/src/mysql-core/columns/timestamp.ts | 2 +- drizzle-orm/src/pg-core/columns/date.ts | 2 +- drizzle-orm/src/pg-core/columns/json.ts | 2 +- drizzle-orm/src/pg-core/columns/jsonb.ts | 2 +- drizzle-orm/src/pg-core/columns/line.ts | 6 ++++-- drizzle-orm/src/pg-core/columns/point.ts | 2 +- .../pg-core/columns/postgis_extension/geometry.ts | 2 +- drizzle-orm/src/pg-core/columns/timestamp.ts | 2 +- .../src/pg-core/columns/vector_extension/halfvec.ts | 2 +- .../src/pg-core/columns/vector_extension/vector.ts | 2 +- drizzle-orm/src/sqlite-core/columns/blob.ts | 2 +- drizzle-orm/src/sqlite-core/columns/integer.ts | 2 +- drizzle-orm/src/sqlite-core/columns/text.ts | 2 +- integration-tests/tests/mysql/mysql-common.ts | 6 +++--- integration-tests/tests/pg/pg-common.ts | 8 ++++---- integration-tests/tests/sqlite/sqlite-common.ts | 12 +++++++----- 18 files changed, 32 insertions(+), 28 deletions(-) diff --git a/drizzle-orm/src/mysql-core/columns/datetime.ts b/drizzle-orm/src/mysql-core/columns/datetime.ts index 8bbd1b6048..65c0998b0a 100644 --- a/drizzle-orm/src/mysql-core/columns/datetime.ts +++ b/drizzle-orm/src/mysql-core/columns/datetime.ts @@ -2,9 +2,9 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnCon import type { ColumnBaseConfig } from '~/column.ts'; import { entityKind } from '~/entity.ts'; import type { AnyMySqlTable } from '~/mysql-core/table.ts'; +import type { Placeholder, SQL } from '~/sql/sql.ts'; import type { Equal } from '~/utils.ts'; import { MySqlColumn, MySqlColumnBuilder } from './common.ts'; -import type { Placeholder, SQL } from '~/sql/sql.ts'; export type MySqlDateTimeBuilderInitial = MySqlDateTimeBuilder<{ name: TName; diff --git a/drizzle-orm/src/mysql-core/columns/json.ts b/drizzle-orm/src/mysql-core/columns/json.ts index f6c8df15c2..8ed742ec42 100644 --- a/drizzle-orm/src/mysql-core/columns/json.ts +++ b/drizzle-orm/src/mysql-core/columns/json.ts @@ -2,8 +2,8 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnCon import type { ColumnBaseConfig } from '~/column.ts'; import { entityKind, is } from '~/entity.ts'; import type { AnyMySqlTable } from '~/mysql-core/table.ts'; -import { MySqlColumn, MySqlColumnBuilder } from './common.ts'; import { Placeholder, SQL } from '~/sql/sql.ts'; +import { MySqlColumn, MySqlColumnBuilder } from './common.ts'; export type MySqlJsonBuilderInitial = MySqlJsonBuilder<{ name: TName; diff --git a/drizzle-orm/src/mysql-core/columns/timestamp.ts b/drizzle-orm/src/mysql-core/columns/timestamp.ts index 6ea967d5cd..2ee8d2d7e1 100644 --- a/drizzle-orm/src/mysql-core/columns/timestamp.ts +++ b/drizzle-orm/src/mysql-core/columns/timestamp.ts @@ -2,9 +2,9 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnCon import type { ColumnBaseConfig } from '~/column.ts'; import { entityKind } from '~/entity.ts'; import type { AnyMySqlTable } from '~/mysql-core/table.ts'; +import type { Placeholder, SQL } from '~/sql/sql.ts'; import type { Equal } from '~/utils.ts'; import { MySqlDateBaseColumn, MySqlDateColumnBaseBuilder } from './date.common.ts'; -import type { Placeholder, SQL } from '~/sql/sql.ts'; export type MySqlTimestampBuilderInitial = MySqlTimestampBuilder<{ name: TName; diff --git a/drizzle-orm/src/pg-core/columns/date.ts b/drizzle-orm/src/pg-core/columns/date.ts index 819cffd971..d412790714 100644 --- a/drizzle-orm/src/pg-core/columns/date.ts +++ b/drizzle-orm/src/pg-core/columns/date.ts @@ -2,9 +2,9 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnCon import type { ColumnBaseConfig } from '~/column.ts'; import { entityKind } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; +import type { Placeholder, SQL } from '~/sql/sql.ts'; import { PgColumn } from './common.ts'; import { PgDateColumnBaseBuilder } from './date.common.ts'; -import type { Placeholder, SQL } from '~/sql/sql.ts'; export type PgDateBuilderInitial = PgDateBuilder<{ name: TName; diff --git a/drizzle-orm/src/pg-core/columns/json.ts b/drizzle-orm/src/pg-core/columns/json.ts index b054a4a800..878dbb9a60 100644 --- a/drizzle-orm/src/pg-core/columns/json.ts +++ b/drizzle-orm/src/pg-core/columns/json.ts @@ -2,8 +2,8 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnCon import type { ColumnBaseConfig } from '~/column.ts'; import { entityKind, is } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; -import { PgColumn, PgColumnBuilder } from './common.ts'; import { Placeholder, SQL } from '~/sql/sql.ts'; +import { PgColumn, PgColumnBuilder } from './common.ts'; export type PgJsonBuilderInitial = PgJsonBuilder<{ name: TName; diff --git a/drizzle-orm/src/pg-core/columns/jsonb.ts b/drizzle-orm/src/pg-core/columns/jsonb.ts index 5942254cd0..caf3e59669 100644 --- a/drizzle-orm/src/pg-core/columns/jsonb.ts +++ b/drizzle-orm/src/pg-core/columns/jsonb.ts @@ -2,8 +2,8 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnCon import type { ColumnBaseConfig } from '~/column.ts'; import { entityKind, is } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; -import { PgColumn, PgColumnBuilder } from './common.ts'; import { Placeholder, SQL } from '~/sql/sql.ts'; +import { PgColumn, PgColumnBuilder } from './common.ts'; export type PgJsonbBuilderInitial = PgJsonbBuilder<{ name: TName; diff --git a/drizzle-orm/src/pg-core/columns/line.ts b/drizzle-orm/src/pg-core/columns/line.ts index be2143ef9b..27f24f65eb 100644 --- a/drizzle-orm/src/pg-core/columns/line.ts +++ b/drizzle-orm/src/pg-core/columns/line.ts @@ -2,9 +2,9 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnCon import type { ColumnBaseConfig } from '~/column.ts'; import { entityKind, is } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; +import { Placeholder, SQL } from '~/sql/sql.ts'; import type { Equal } from '~/utils.ts'; import { PgColumn, PgColumnBuilder } from './common.ts'; -import { Placeholder, SQL } from '~/sql/sql.ts'; export type PgLineBuilderInitial = PgLineBuilder<{ name: TName; @@ -91,7 +91,9 @@ export class PgLineABC> extends return { a: Number.parseFloat(a!), b: Number.parseFloat(b!), c: Number.parseFloat(c!) }; } - override mapToDriverValue(value: { a: number; b: number; c: number } | SQL | Placeholder): string | SQL | Placeholder { + override mapToDriverValue( + value: { a: number; b: number; c: number } | SQL | Placeholder, + ): string | SQL | Placeholder { return is(value, SQL) || is(value, Placeholder) ? value : `{${(value as any).a},${(value as any).b},${(value as any).c}}`; diff --git a/drizzle-orm/src/pg-core/columns/point.ts b/drizzle-orm/src/pg-core/columns/point.ts index da90a7c16f..41c1763c1d 100644 --- a/drizzle-orm/src/pg-core/columns/point.ts +++ b/drizzle-orm/src/pg-core/columns/point.ts @@ -2,9 +2,9 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnCon import type { ColumnBaseConfig } from '~/column.ts'; import { entityKind, is } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; +import { Placeholder, SQL } from '~/sql/sql.ts'; import type { Equal } from '~/utils.ts'; import { PgColumn, PgColumnBuilder } from './common.ts'; -import { Placeholder, SQL } from '~/sql/sql.ts'; export type PgPointTupleBuilderInitial = PgPointTupleBuilder<{ name: TName; diff --git a/drizzle-orm/src/pg-core/columns/postgis_extension/geometry.ts b/drizzle-orm/src/pg-core/columns/postgis_extension/geometry.ts index e0aa15fc38..97135fcc0e 100644 --- a/drizzle-orm/src/pg-core/columns/postgis_extension/geometry.ts +++ b/drizzle-orm/src/pg-core/columns/postgis_extension/geometry.ts @@ -2,10 +2,10 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnCon import type { ColumnBaseConfig } from '~/column.ts'; import { entityKind, is } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; +import { Placeholder, SQL } from '~/sql/sql.ts'; import type { Equal } from '~/utils.ts'; import { PgColumn, PgColumnBuilder } from '../common.ts'; import { parseEWKB } from './utils.ts'; -import { Placeholder, SQL } from '~/sql/sql.ts'; export type PgGeometryBuilderInitial = PgGeometryBuilder<{ name: TName; diff --git a/drizzle-orm/src/pg-core/columns/timestamp.ts b/drizzle-orm/src/pg-core/columns/timestamp.ts index 3a7625c995..0fd6b4810b 100644 --- a/drizzle-orm/src/pg-core/columns/timestamp.ts +++ b/drizzle-orm/src/pg-core/columns/timestamp.ts @@ -2,10 +2,10 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnCon import type { ColumnBaseConfig } from '~/column.ts'; import { entityKind } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; +import type { Placeholder, SQL } from '~/sql/sql.ts'; import type { Equal } from '~/utils.ts'; import { PgColumn } from './common.ts'; import { PgDateColumnBaseBuilder } from './date.common.ts'; -import type { Placeholder, SQL } from '~/sql/sql.ts'; export type PgTimestampBuilderInitial = PgTimestampBuilder<{ name: TName; diff --git a/drizzle-orm/src/pg-core/columns/vector_extension/halfvec.ts b/drizzle-orm/src/pg-core/columns/vector_extension/halfvec.ts index f7138edc9d..978320a6b2 100644 --- a/drizzle-orm/src/pg-core/columns/vector_extension/halfvec.ts +++ b/drizzle-orm/src/pg-core/columns/vector_extension/halfvec.ts @@ -2,8 +2,8 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnCon import type { ColumnBaseConfig } from '~/column.ts'; import { entityKind, is } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; -import { PgColumn, PgColumnBuilder } from '../common.ts'; import { Placeholder, SQL } from '~/sql/sql.ts'; +import { PgColumn, PgColumnBuilder } from '../common.ts'; export type PgHalfVectorBuilderInitial = PgHalfVectorBuilder<{ name: TName; diff --git a/drizzle-orm/src/pg-core/columns/vector_extension/vector.ts b/drizzle-orm/src/pg-core/columns/vector_extension/vector.ts index 79fd8e3cd9..a963684a17 100644 --- a/drizzle-orm/src/pg-core/columns/vector_extension/vector.ts +++ b/drizzle-orm/src/pg-core/columns/vector_extension/vector.ts @@ -2,8 +2,8 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnCon import type { ColumnBaseConfig } from '~/column.ts'; import { entityKind, is } from '~/entity.ts'; import type { AnyPgTable } from '~/pg-core/table.ts'; -import { PgColumn, PgColumnBuilder } from '../common.ts'; import { Placeholder, SQL } from '~/sql/sql.ts'; +import { PgColumn, PgColumnBuilder } from '../common.ts'; export type PgVectorBuilderInitial = PgVectorBuilder<{ name: TName; diff --git a/drizzle-orm/src/sqlite-core/columns/blob.ts b/drizzle-orm/src/sqlite-core/columns/blob.ts index b2a4fa2e14..8931621c22 100644 --- a/drizzle-orm/src/sqlite-core/columns/blob.ts +++ b/drizzle-orm/src/sqlite-core/columns/blob.ts @@ -1,10 +1,10 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts'; import type { ColumnBaseConfig } from '~/column.ts'; import { entityKind, is } from '~/entity.ts'; +import { Placeholder, SQL } from '~/sql/sql.ts'; import type { AnySQLiteTable } from '~/sqlite-core/table.ts'; import type { Equal } from '~/utils.ts'; import { SQLiteColumn, SQLiteColumnBuilder } from './common.ts'; -import { Placeholder, SQL } from '~/sql/sql.ts'; type BlobMode = 'buffer' | 'json' | 'bigint'; diff --git a/drizzle-orm/src/sqlite-core/columns/integer.ts b/drizzle-orm/src/sqlite-core/columns/integer.ts index 4935b52250..71991fe171 100644 --- a/drizzle-orm/src/sqlite-core/columns/integer.ts +++ b/drizzle-orm/src/sqlite-core/columns/integer.ts @@ -9,7 +9,7 @@ import type { } from '~/column-builder.ts'; import type { ColumnBaseConfig } from '~/column.ts'; import { entityKind, is } from '~/entity.ts'; -import { sql, SQL, Placeholder } from '~/sql/sql.ts'; +import { Placeholder, SQL, sql } from '~/sql/sql.ts'; import type { OnConflict } from '~/sqlite-core/utils.ts'; import type { Equal, Or } from '~/utils.ts'; import type { AnySQLiteTable } from '../table.ts'; diff --git a/drizzle-orm/src/sqlite-core/columns/text.ts b/drizzle-orm/src/sqlite-core/columns/text.ts index 43583a60da..c918a20937 100644 --- a/drizzle-orm/src/sqlite-core/columns/text.ts +++ b/drizzle-orm/src/sqlite-core/columns/text.ts @@ -1,10 +1,10 @@ import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts'; import type { ColumnBaseConfig } from '~/column.ts'; import { entityKind, is } from '~/entity.ts'; +import { Placeholder, SQL } from '~/sql/sql.ts'; import type { AnySQLiteTable } from '~/sqlite-core/table.ts'; import type { Equal, Writable } from '~/utils.ts'; import { SQLiteColumn, SQLiteColumnBuilder } from './common.ts'; -import { SQL, Placeholder } from '~/sql/sql.ts'; export type SQLiteTextBuilderInitial = SQLiteTextBuilder<{ name: TName; diff --git a/integration-tests/tests/mysql/mysql-common.ts b/integration-tests/tests/mysql/mysql-common.ts index 465f5ec78d..2a7a93ff8d 100644 --- a/integration-tests/tests/mysql/mysql-common.ts +++ b/integration-tests/tests/mysql/mysql-common.ts @@ -3102,7 +3102,7 @@ export function tests(driver?: string) { id: serial('id').primaryKey(), name: text('name').notNull(), updatedAt: timestamp('updated_at', { - fsp: 6 + fsp: 6, }) .notNull() .$onUpdate(() => sql`current_timestamp`), @@ -3120,7 +3120,7 @@ export function tests(driver?: string) { ); await db.insert(users).values({ - name: 'John' + name: 'John', }); const insertResp = await db.select({ updatedAt: users.updatedAt }).from(users); await new Promise((resolve) => setTimeout(resolve, 50)); @@ -3128,7 +3128,7 @@ export function tests(driver?: string) { const now = new Date().getTime(); await new Promise((resolve) => setTimeout(resolve, 50)); await db.update(users).set({ - name: 'John' + name: 'John', }); const updateResp = await db.select({ updatedAt: users.updatedAt }).from(users); diff --git a/integration-tests/tests/pg/pg-common.ts b/integration-tests/tests/pg/pg-common.ts index e8dd46de45..f5761fbb52 100644 --- a/integration-tests/tests/pg/pg-common.ts +++ b/integration-tests/tests/pg/pg-common.ts @@ -3821,18 +3821,18 @@ export function tests() { ); const insertResp = await db.insert(users).values({ - name: 'John' + name: 'John', }).returning({ - updatedAt: users.updatedAt + updatedAt: users.updatedAt, }); await new Promise((resolve) => setTimeout(resolve, 50)); const now = new Date().getTime(); await new Promise((resolve) => setTimeout(resolve, 50)); const updateResp = await db.update(users).set({ - name: 'John' + name: 'John', }).returning({ - updatedAt: users.updatedAt + updatedAt: users.updatedAt, }); expect(insertResp[0]?.updatedAt.getTime() ?? 0).lessThan(now); diff --git a/integration-tests/tests/sqlite/sqlite-common.ts b/integration-tests/tests/sqlite/sqlite-common.ts index 7640a5405b..50ff99061d 100644 --- a/integration-tests/tests/sqlite/sqlite-common.ts +++ b/integration-tests/tests/sqlite/sqlite-common.ts @@ -2670,7 +2670,9 @@ export function tests() { name: text('name').notNull(), updatedAt: integer('updated_at') .notNull() - .$onUpdate(() => sql`(strftime('%s', 'now') * 1000) + (strftime('%f', 'now') - strftime('%S', 'now')) * 1000`), + .$onUpdate(() => + sql`(strftime('%s', 'now') * 1000) + (strftime('%f', 'now') - strftime('%S', 'now')) * 1000` + ), }); await db.run(sql`drop table if exists ${users}`); @@ -2685,18 +2687,18 @@ export function tests() { ); const insertResp = await db.insert(users).values({ - name: 'John' + name: 'John', }).returning({ - updatedAt: users.updatedAt + updatedAt: users.updatedAt, }); await new Promise((resolve) => setTimeout(resolve, 50)); const now = new Date().getTime(); await new Promise((resolve) => setTimeout(resolve, 50)); const updateResp = await db.update(users).set({ - name: 'John' + name: 'John', }).returning({ - updatedAt: users.updatedAt + updatedAt: users.updatedAt, }); expect(insertResp[0]?.updatedAt ?? 0).lessThan(now); From c4d34df8aa31ac5d6142c673b3b3a0983d0228a3 Mon Sep 17 00:00:00 2001 From: Mario564 Date: Thu, 5 Sep 2024 09:52:34 -0700 Subject: [PATCH 5/8] Fix unrelated type error --- drizzle-orm/src/libsql/session.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drizzle-orm/src/libsql/session.ts b/drizzle-orm/src/libsql/session.ts index 6409777348..2da99f8e6d 100644 --- a/drizzle-orm/src/libsql/session.ts +++ b/drizzle-orm/src/libsql/session.ts @@ -87,7 +87,7 @@ export class LibSQLSession< builtQueries.push({ sql: builtQuery.sql, args: builtQuery.params as InArgs }); } - const batchResults = await this.client.migrate(builtQueries); + const batchResults = await this.client.batch(builtQueries); return batchResults.map((result, i) => preparedQueries[i]!.mapResult(result, true)); } From a198ff54f90b5c9f220df56091fc2acaa1941177 Mon Sep 17 00:00:00 2001 From: Mario564 Date: Thu, 5 Sep 2024 10:12:09 -0700 Subject: [PATCH 6/8] Fix lint issues --- drizzle-orm/src/mysql-core/columns/datetime.ts | 1 + drizzle-orm/src/mysql-core/columns/timestamp.ts | 1 + drizzle-orm/src/pg-core/columns/date.ts | 1 + drizzle-orm/src/pg-core/columns/timestamp.ts | 1 + integration-tests/tests/mysql/mysql-common.ts | 2 +- integration-tests/tests/pg/pg-common.ts | 2 +- integration-tests/tests/sqlite/sqlite-common.ts | 2 +- 7 files changed, 7 insertions(+), 3 deletions(-) diff --git a/drizzle-orm/src/mysql-core/columns/datetime.ts b/drizzle-orm/src/mysql-core/columns/datetime.ts index 65c0998b0a..6b9f25c858 100644 --- a/drizzle-orm/src/mysql-core/columns/datetime.ts +++ b/drizzle-orm/src/mysql-core/columns/datetime.ts @@ -56,6 +56,7 @@ export class MySqlDateTime> } override mapToDriverValue(value: Date | SQL | Placeholder): unknown { + // eslint-disable-next-line no-instanceof/no-instanceof return value instanceof Date ? value.toISOString().replace('T', ' ').replace('Z', '') : value; } diff --git a/drizzle-orm/src/mysql-core/columns/timestamp.ts b/drizzle-orm/src/mysql-core/columns/timestamp.ts index 2ee8d2d7e1..ddb6f1069f 100644 --- a/drizzle-orm/src/mysql-core/columns/timestamp.ts +++ b/drizzle-orm/src/mysql-core/columns/timestamp.ts @@ -54,6 +54,7 @@ export class MySqlTimestamp } override mapToDriverValue(value: Date | SQL | Placeholder): string | SQL | Placeholder { + // eslint-disable-next-line no-instanceof/no-instanceof return value instanceof Date ? value.toISOString().slice(0, -1).replace('T', ' ') : value; } } diff --git a/drizzle-orm/src/pg-core/columns/date.ts b/drizzle-orm/src/pg-core/columns/date.ts index d412790714..dfb4d2b53f 100644 --- a/drizzle-orm/src/pg-core/columns/date.ts +++ b/drizzle-orm/src/pg-core/columns/date.ts @@ -43,6 +43,7 @@ export class PgDate> extends PgColu } override mapToDriverValue(value: Date | SQL | Placeholder): string | SQL | Placeholder { + // eslint-disable-next-line no-instanceof/no-instanceof return value instanceof Date ? value.toISOString() : value; } } diff --git a/drizzle-orm/src/pg-core/columns/timestamp.ts b/drizzle-orm/src/pg-core/columns/timestamp.ts index 0fd6b4810b..97ac5d1ccb 100644 --- a/drizzle-orm/src/pg-core/columns/timestamp.ts +++ b/drizzle-orm/src/pg-core/columns/timestamp.ts @@ -65,6 +65,7 @@ export class PgTimestamp> exte }; override mapToDriverValue = (value: Date | SQL | Placeholder): string | SQL | Placeholder => { + // eslint-disable-next-line no-instanceof/no-instanceof return value instanceof Date ? value.toISOString() : value; }; } diff --git a/integration-tests/tests/mysql/mysql-common.ts b/integration-tests/tests/mysql/mysql-common.ts index 91d71b67ac..cd211cf2e5 100644 --- a/integration-tests/tests/mysql/mysql-common.ts +++ b/integration-tests/tests/mysql/mysql-common.ts @@ -3188,7 +3188,7 @@ export function tests(driver?: string) { const insertResp = await db.select({ updatedAt: users.updatedAt }).from(users); await new Promise((resolve) => setTimeout(resolve, 50)); - const now = new Date().getTime(); + const now = Date.now(); await new Promise((resolve) => setTimeout(resolve, 50)); await db.update(users).set({ name: 'John', diff --git a/integration-tests/tests/pg/pg-common.ts b/integration-tests/tests/pg/pg-common.ts index ba2aa99f25..5d925bfc5a 100644 --- a/integration-tests/tests/pg/pg-common.ts +++ b/integration-tests/tests/pg/pg-common.ts @@ -3866,7 +3866,7 @@ export function tests() { }); await new Promise((resolve) => setTimeout(resolve, 50)); - const now = new Date().getTime(); + const now = Date.now(); await new Promise((resolve) => setTimeout(resolve, 50)); const updateResp = await db.update(users).set({ name: 'John', diff --git a/integration-tests/tests/sqlite/sqlite-common.ts b/integration-tests/tests/sqlite/sqlite-common.ts index 36c23cb196..71f0967878 100644 --- a/integration-tests/tests/sqlite/sqlite-common.ts +++ b/integration-tests/tests/sqlite/sqlite-common.ts @@ -2711,7 +2711,7 @@ export function tests() { }); await new Promise((resolve) => setTimeout(resolve, 50)); - const now = new Date().getTime(); + const now = Date.now(); await new Promise((resolve) => setTimeout(resolve, 50)); const updateResp = await db.update(users).set({ name: 'John', From 6c206e31676fd7d1f2fd0c3686356d0ab33a86f8 Mon Sep 17 00:00:00 2001 From: Mario564 Date: Thu, 5 Sep 2024 10:20:56 -0700 Subject: [PATCH 7/8] Update tests --- integration-tests/tests/mysql/mysql-common.ts | 4 ++-- integration-tests/tests/pg/pg-common.ts | 4 ++-- integration-tests/tests/sqlite/sqlite-common.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/integration-tests/tests/mysql/mysql-common.ts b/integration-tests/tests/mysql/mysql-common.ts index cd211cf2e5..bb7c5dabe2 100644 --- a/integration-tests/tests/mysql/mysql-common.ts +++ b/integration-tests/tests/mysql/mysql-common.ts @@ -3186,10 +3186,10 @@ export function tests(driver?: string) { name: 'John', }); const insertResp = await db.select({ updatedAt: users.updatedAt }).from(users); - await new Promise((resolve) => setTimeout(resolve, 50)); + await new Promise((resolve) => setTimeout(resolve, 1000)); const now = Date.now(); - await new Promise((resolve) => setTimeout(resolve, 50)); + await new Promise((resolve) => setTimeout(resolve, 1000)); await db.update(users).set({ name: 'John', }); diff --git a/integration-tests/tests/pg/pg-common.ts b/integration-tests/tests/pg/pg-common.ts index 5d925bfc5a..68b2f349c9 100644 --- a/integration-tests/tests/pg/pg-common.ts +++ b/integration-tests/tests/pg/pg-common.ts @@ -3864,10 +3864,10 @@ export function tests() { }).returning({ updatedAt: users.updatedAt, }); - await new Promise((resolve) => setTimeout(resolve, 50)); + await new Promise((resolve) => setTimeout(resolve, 1000)); const now = Date.now(); - await new Promise((resolve) => setTimeout(resolve, 50)); + await new Promise((resolve) => setTimeout(resolve, 1000)); const updateResp = await db.update(users).set({ name: 'John', }).returning({ diff --git a/integration-tests/tests/sqlite/sqlite-common.ts b/integration-tests/tests/sqlite/sqlite-common.ts index 71f0967878..fa6ae2cb79 100644 --- a/integration-tests/tests/sqlite/sqlite-common.ts +++ b/integration-tests/tests/sqlite/sqlite-common.ts @@ -2709,10 +2709,10 @@ export function tests() { }).returning({ updatedAt: users.updatedAt, }); - await new Promise((resolve) => setTimeout(resolve, 50)); + await new Promise((resolve) => setTimeout(resolve, 1000)); const now = Date.now(); - await new Promise((resolve) => setTimeout(resolve, 50)); + await new Promise((resolve) => setTimeout(resolve, 1000)); const updateResp = await db.update(users).set({ name: 'John', }).returning({ From 5532067aa57e0e08574809a616568f8f2f678cf3 Mon Sep 17 00:00:00 2001 From: Mario564 Date: Fri, 6 Sep 2024 10:47:29 -0700 Subject: [PATCH 8/8] Undo change --- drizzle-orm/src/libsql/session.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drizzle-orm/src/libsql/session.ts b/drizzle-orm/src/libsql/session.ts index 2da99f8e6d..6409777348 100644 --- a/drizzle-orm/src/libsql/session.ts +++ b/drizzle-orm/src/libsql/session.ts @@ -87,7 +87,7 @@ export class LibSQLSession< builtQueries.push({ sql: builtQuery.sql, args: builtQuery.params as InArgs }); } - const batchResults = await this.client.batch(builtQueries); + const batchResults = await this.client.migrate(builtQueries); return batchResults.map((result, i) => preparedQueries[i]!.mapResult(result, true)); }