Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix serialization issue when a bigint has a default value
Browse files Browse the repository at this point in the history
L-Mario564 committed Jan 30, 2025
1 parent b220287 commit c181f41
Showing 8 changed files with 93 additions and 1 deletion.
4 changes: 4 additions & 0 deletions drizzle-kit/src/serializer/mysqlSerializer.ts
Original file line number Diff line number Diff line change
@@ -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)}'`;
4 changes: 4 additions & 0 deletions drizzle-kit/src/serializer/pgSerializer.ts
Original file line number Diff line number Diff line change
@@ -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}`;
4 changes: 4 additions & 0 deletions drizzle-kit/src/serializer/singlestoreSerializer.ts
Original file line number Diff line number Diff line change
@@ -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)}'`;
4 changes: 4 additions & 0 deletions drizzle-kit/src/serializer/sqliteSerializer.ts
Original file line number Diff line number Diff line change
@@ -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)}'`
19 changes: 19 additions & 0 deletions drizzle-kit/tests/mysql.test.ts
Original file line number Diff line number Diff line change
@@ -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',
);
});
21 changes: 20 additions & 1 deletion drizzle-kit/tests/pg-columns.test.ts
Original file line number Diff line number Diff line change
@@ -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',
);
});
19 changes: 19 additions & 0 deletions drizzle-kit/tests/singlestore.test.ts
Original file line number Diff line number Diff line change
@@ -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',
);
});
19 changes: 19 additions & 0 deletions drizzle-kit/tests/sqlite-columns.test.ts
Original file line number Diff line number Diff line change
@@ -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',
);
});

0 comments on commit c181f41

Please sign in to comment.