From c181f414e154be16fd6dd858c81be48769d3a63e Mon Sep 17 00:00:00 2001 From: Mario564 Date: Thu, 30 Jan 2025 12:03:12 -0800 Subject: [PATCH] Fix serialization issue when a bigint has a default value --- drizzle-kit/src/serializer/mysqlSerializer.ts | 4 ++++ drizzle-kit/src/serializer/pgSerializer.ts | 4 ++++ .../src/serializer/singlestoreSerializer.ts | 4 ++++ .../src/serializer/sqliteSerializer.ts | 4 ++++ drizzle-kit/tests/mysql.test.ts | 19 +++++++++++++++++ drizzle-kit/tests/pg-columns.test.ts | 21 ++++++++++++++++++- drizzle-kit/tests/singlestore.test.ts | 19 +++++++++++++++++ drizzle-kit/tests/sqlite-columns.test.ts | 19 +++++++++++++++++ 8 files changed, 93 insertions(+), 1 deletion(-) diff --git a/drizzle-kit/src/serializer/mysqlSerializer.ts b/drizzle-kit/src/serializer/mysqlSerializer.ts index 3f09a54f4..979021cbd 100644 --- a/drizzle-kit/src/serializer/mysqlSerializer.ts +++ b/drizzle-kit/src/serializer/mysqlSerializer.ts @@ -167,6 +167,8 @@ export const generateMySqlSnapshot = ( .slice(0, 23) }'`; } + } else if (typeof column.default === 'bigint') { + columnToSet.default = column.default.toString(); } else { columnToSet.default = column.default; } @@ -486,6 +488,8 @@ export const generateMySqlSnapshot = ( } else { if (typeof column.default === 'string') { columnToSet.default = `'${column.default}'`; + } else if (typeof column.default === 'bigint') { + columnToSet.default = column.default.toString(); } else { if (sqlTypeLowered === 'json') { columnToSet.default = `'${JSON.stringify(column.default)}'`; diff --git a/drizzle-kit/src/serializer/pgSerializer.ts b/drizzle-kit/src/serializer/pgSerializer.ts index a16743b53..14422d26b 100644 --- a/drizzle-kit/src/serializer/pgSerializer.ts +++ b/drizzle-kit/src/serializer/pgSerializer.ts @@ -255,6 +255,8 @@ export const generatePgSnapshot = ( } } else if (isPgArrayType(sqlTypeLowered) && Array.isArray(column.default)) { columnToSet.default = `'${buildArrayString(column.default, sqlTypeLowered)}'`; + } else if (typeof column.default === 'bigint') { + columnToSet.default = column.default.toString(); } else { // Should do for all types // columnToSet.default = `'${column.default}'::${sqlTypeLowered}`; @@ -822,6 +824,8 @@ export const generatePgSnapshot = ( } else { if (typeof column.default === 'string') { columnToSet.default = `'${column.default}'`; + } else if (typeof column.default === 'bigint') { + columnToSet.default = column.default.toString(); } else { if (sqlTypeLowered === 'jsonb' || sqlTypeLowered === 'json') { columnToSet.default = `'${JSON.stringify(column.default)}'::${sqlTypeLowered}`; diff --git a/drizzle-kit/src/serializer/singlestoreSerializer.ts b/drizzle-kit/src/serializer/singlestoreSerializer.ts index e65f53d25..12fb35574 100644 --- a/drizzle-kit/src/serializer/singlestoreSerializer.ts +++ b/drizzle-kit/src/serializer/singlestoreSerializer.ts @@ -129,6 +129,8 @@ export const generateSingleStoreSnapshot = ( } else { if (typeof column.default === 'string') { columnToSet.default = `'${column.default}'`; + } else if (typeof column.default === 'bigint') { + columnToSet.default = column.default.toString(); } else { if (sqlTypeLowered === 'json' || Array.isArray(column.default)) { columnToSet.default = `'${JSON.stringify(column.default)}'`; @@ -359,6 +361,8 @@ export const generateSingleStoreSnapshot = ( } else { if (typeof column.default === 'string') { columnToSet.default = `'${column.default}'`; + } else if (typeof column.default === 'bigint') { + columnToSet.default = column.default.toString(); } else { if (sqlTypeLowered === 'json') { columnToSet.default = `'${JSON.stringify(column.default)}'`; diff --git a/drizzle-kit/src/serializer/sqliteSerializer.ts b/drizzle-kit/src/serializer/sqliteSerializer.ts index b14e22931..afdd8554f 100644 --- a/drizzle-kit/src/serializer/sqliteSerializer.ts +++ b/drizzle-kit/src/serializer/sqliteSerializer.ts @@ -91,6 +91,8 @@ export const generateSqliteSnapshot = ( } else { columnToSet.default = typeof column.default === 'string' ? `'${escapeSingleQuotes(column.default)}'` + : typeof column.default === 'bigint' + ? column.default.toString() : typeof column.default === 'object' || Array.isArray(column.default) ? `'${JSON.stringify(column.default)}'` @@ -378,6 +380,8 @@ export const generateSqliteSnapshot = ( } else { columnToSet.default = typeof column.default === 'string' ? `'${column.default}'` + : typeof column.default === 'bigint' + ? column.default.toString() : typeof column.default === 'object' || Array.isArray(column.default) ? `'${JSON.stringify(column.default)}'` diff --git a/drizzle-kit/tests/mysql.test.ts b/drizzle-kit/tests/mysql.test.ts index 100a778e4..6e826ea66 100644 --- a/drizzle-kit/tests/mysql.test.ts +++ b/drizzle-kit/tests/mysql.test.ts @@ -1,5 +1,6 @@ import { sql } from 'drizzle-orm'; import { + bigint, foreignKey, index, int, @@ -861,3 +862,21 @@ test('optional db aliases (camel case)', async () => { expect(sqlStatements).toStrictEqual([st1, st2, st3, st4, st5, st6]); }); + +test('bigint with default', async (t) => { + const schema1 = {}; + + const schema2 = { + table: mysqlTable('table', { + bigint1: bigint('bigint1', { mode: 'bigint' }).default(0n), + bigint2: bigint('bigint2', { mode: 'bigint' }).default(10n), + }), + }; + + const { sqlStatements } = await diffTestSchemasMysql(schema1, schema2, []); + + expect(sqlStatements.length).toBe(1); + expect(sqlStatements[0]).toStrictEqual( + 'CREATE TABLE \`table\` (\n\t\`bigint1\` bigint DEFAULT 0,\n\t\`bigint2\` bigint DEFAULT 10\n);\n', + ); +}); diff --git a/drizzle-kit/tests/pg-columns.test.ts b/drizzle-kit/tests/pg-columns.test.ts index dfc5e27f3..290488317 100644 --- a/drizzle-kit/tests/pg-columns.test.ts +++ b/drizzle-kit/tests/pg-columns.test.ts @@ -1,4 +1,4 @@ -import { bit, integer, pgTable, primaryKey, serial, text, uuid, varchar } from 'drizzle-orm/pg-core'; +import { bigint, bit, integer, pgTable, primaryKey, serial, text, uuid, varchar } from 'drizzle-orm/pg-core'; import { expect, test } from 'vitest'; import { diffTestSchemas } from './schemaDiffer'; @@ -502,3 +502,22 @@ test('bit type', async (t) => { 'CREATE TABLE "table" (\n\t"id" serial PRIMARY KEY NOT NULL,\n\t"bit" bit(10)\n);\n', ); }); + +test('bigint with default', async (t) => { + const schema1 = {}; + + const schema2 = { + table: pgTable('table', { + id: serial('id').primaryKey(), + bigint1: bigint('bigint1', { mode: 'bigint' }).default(0n), + bigint2: bigint('bigint2', { mode: 'bigint' }).default(10n), + }), + }; + + const { sqlStatements } = await diffTestSchemas(schema1, schema2, []); + + expect(sqlStatements.length).toBe(1); + expect(sqlStatements[0]).toStrictEqual( + 'CREATE TABLE "table" (\n\t"id" serial PRIMARY KEY NOT NULL,\n\t"bigint1" bigint DEFAULT 0,\n\t"bigint2" bigint DEFAULT 10\n);\n', + ); +}); diff --git a/drizzle-kit/tests/singlestore.test.ts b/drizzle-kit/tests/singlestore.test.ts index dca99ad2d..75d592d6f 100644 --- a/drizzle-kit/tests/singlestore.test.ts +++ b/drizzle-kit/tests/singlestore.test.ts @@ -1,5 +1,6 @@ import { sql } from 'drizzle-orm'; import { + bigint, index, int, json, @@ -976,3 +977,21 @@ test('set not null + rename table on table with indexes', async () => { 'ALTER TABLE `__new_table1` RENAME TO `table1`;', ); }); + +test('bigint with default', async (t) => { + const schema1 = {}; + + const schema2 = { + table: singlestoreTable('table', { + bigint1: bigint('bigint1', { mode: 'bigint' }).default(0n), + bigint2: bigint('bigint2', { mode: 'bigint' }).default(10n), + }), + }; + + const { sqlStatements } = await diffTestSchemasSingleStore(schema1, schema2, []); + + expect(sqlStatements.length).toBe(1); + expect(sqlStatements[0]).toStrictEqual( + 'CREATE TABLE \`table\` (\n\t\`bigint1\` bigint DEFAULT 0,\n\t\`bigint2\` bigint DEFAULT 10\n);\n', + ); +}); diff --git a/drizzle-kit/tests/sqlite-columns.test.ts b/drizzle-kit/tests/sqlite-columns.test.ts index 0078e8aae..d52ab1570 100644 --- a/drizzle-kit/tests/sqlite-columns.test.ts +++ b/drizzle-kit/tests/sqlite-columns.test.ts @@ -1,5 +1,6 @@ import { AnySQLiteColumn, + blob, foreignKey, index, int, @@ -1049,3 +1050,21 @@ test('text default values escape single quotes', async (t) => { "ALTER TABLE `table` ADD `text2` text DEFAULT '';", ]); }); + +test('bigint with default', async (t) => { + const schema1 = {}; + + const schema2 = { + table: sqliteTable('table', { + bigint1: blob('bigint1', { mode: 'bigint' }).default(0n), + bigint2: blob('bigint2', { mode: 'bigint' }).default(10n), + }), + }; + + const { sqlStatements } = await diffTestSchemasSqlite(schema1, schema2, []); + + expect(sqlStatements.length).toBe(1); + expect(sqlStatements[0]).toStrictEqual( + 'CREATE TABLE \`table\` (\n\t\`bigint1\` blob DEFAULT 0,\n\t\`bigint2\` blob DEFAULT 10\n);\n', + ); +});