Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 47 additions & 2 deletions drizzle-orm/src/sqlite-core/columns/integer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -201,12 +201,52 @@ export class SQLiteBoolean<T extends ColumnBaseConfig<'boolean', 'SQLiteBoolean'
}
}

export type SQLiteIntegerBigIntBuilderInitial<TName extends string> = SQLiteIntegerBigIntBuilder<{
name: TName;
dataType: 'bigint';
columnType: 'SQLiteIntegerBigInt';
data: bigint;
driverParam: string;
enumValues: undefined;
}>;

export class SQLiteIntegerBigIntBuilder<T extends ColumnBuilderBaseConfig<'bigint', 'SQLiteIntegerBigInt'>>
extends SQLiteBaseIntegerBuilder<T>
{
static override readonly [entityKind]: string = 'SQLiteIntegerBigIntBuilder';

constructor(name: T['name']) {
super(name, 'bigint', 'SQLiteIntegerBigInt');
}

/** @internal */
override build<TTableName extends string>(
table: AnySQLiteTable<{ name: TTableName }>,
): SQLiteIntegerBigInt<MakeColumnConfig<T, TTableName>> {
return new SQLiteIntegerBigInt<MakeColumnConfig<T, TTableName>>(
table,
this.config as ColumnBuilderRuntimeConfig<any, any>,
);
}
}

export class SQLiteIntegerBigInt<T extends ColumnBaseConfig<'bigint', 'SQLiteIntegerBigInt'>>
extends SQLiteBaseInteger<T>
{
static override readonly [entityKind]: string = 'SQLiteIntegerBigInt';

override mapFromDriverValue = BigInt;

override mapToDriverValue = String;
}

export interface IntegerConfig<
TMode extends 'number' | 'timestamp' | 'timestamp_ms' | 'boolean' =
TMode extends 'number' | 'timestamp' | 'timestamp_ms' | 'boolean' | 'bigint' =
| 'number'
| 'timestamp'
| 'timestamp_ms'
| 'boolean',
| 'boolean'
| 'bigint',
> {
mode: TMode;
}
Expand All @@ -216,12 +256,14 @@ export function integer<TMode extends IntegerConfig['mode']>(
config?: IntegerConfig<TMode>,
): Or<Equal<TMode, 'timestamp'>, Equal<TMode, 'timestamp_ms'>> extends true ? SQLiteTimestampBuilderInitial<''>
: Equal<TMode, 'boolean'> extends true ? SQLiteBooleanBuilderInitial<''>
: Equal<TMode, 'bigint'> extends true ? SQLiteIntegerBigIntBuilderInitial<''>
: SQLiteIntegerBuilderInitial<''>;
export function integer<TName extends string, TMode extends IntegerConfig['mode']>(
name: TName,
config?: IntegerConfig<TMode>,
): Or<Equal<TMode, 'timestamp'>, Equal<TMode, 'timestamp_ms'>> extends true ? SQLiteTimestampBuilderInitial<TName>
: Equal<TMode, 'boolean'> extends true ? SQLiteBooleanBuilderInitial<TName>
: Equal<TMode, 'bigint'> extends true ? SQLiteIntegerBigIntBuilderInitial<TName>
: SQLiteIntegerBuilderInitial<TName>;
export function integer(a?: string | IntegerConfig, b?: IntegerConfig) {
const { name, config } = getColumnNameAndConfig<IntegerConfig | undefined>(a, b);
Expand All @@ -231,6 +273,9 @@ export function integer(a?: string | IntegerConfig, b?: IntegerConfig) {
if (config?.mode === 'boolean') {
return new SQLiteBooleanBuilder(name, config.mode);
}
if (config?.mode === 'bigint') {
return new SQLiteIntegerBigIntBuilder(name);
}
return new SQLiteIntegerBuilder(name);
}

Expand Down
2 changes: 1 addition & 1 deletion drizzle-orm/src/sqlite-core/dialect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ export abstract class SQLiteDialect {
}
} else if (is(field, Column)) {
const tableName = field.table[Table.Symbol.Name];
if (field.columnType === 'SQLiteNumericBigInt') {
if (field.columnType === 'SQLiteNumericBigInt' || field.columnType === 'SQLiteIntegerBigInt') {
if (isSingleTable) {
chunk.push(sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`);
} else {
Expand Down
7 changes: 7 additions & 0 deletions integration-tests/tests/sqlite/sqlite-common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ const allTypesTable = sqliteTable('all_types', {
timeMs: integer('time_ms', {
mode: 'timestamp_ms',
}),
integerBig: integer('integer_big', {
mode: 'bigint',
}),
bigint: blob('bigint', {
mode: 'bigint',
}),
Expand Down Expand Up @@ -3283,6 +3286,7 @@ export function tests() {
\`bool\` integer,
\`time\` integer,
\`time_ms\` integer,
\`integer_big\` integer,
\`bigint\` blob,
\`buffer\` blob,
\`json\` blob,
Expand Down Expand Up @@ -3336,6 +3340,7 @@ export function tests() {
text: 'TEXT STRING',
time: new Date(1741743161623),
timeMs: new Date(1741743161623),
integerBig: 5044565289845416380n,
});

const rawRes = await db.select().from(allTypesTable);
Expand All @@ -3347,6 +3352,7 @@ export function tests() {
bool: boolean | null;
time: Date | null;
timeMs: Date | null;
integerBig: bigint | null;
bigint: bigint | null;
buffer: Buffer | null;
json: unknown;
Expand All @@ -3364,6 +3370,7 @@ export function tests() {
bool: true,
time: new Date('2025-03-12T01:32:41.000Z'),
timeMs: new Date('2025-03-12T01:32:41.623Z'),
integerBig: 5044565289845416380n,
bigint: 5044565289845416380n,
buffer: Buffer.from([
0x44,
Expand Down