Skip to content

Commit 74f3ec4

Browse files
[kit]: psql + cockroach enum tests
1 parent 48b11bd commit 74f3ec4

File tree

4 files changed

+208
-6
lines changed

4 files changed

+208
-6
lines changed

drizzle-kit/src/dialects/cockroach/convertor.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ const alterColumnConvertor = convertor('alter_column', (st) => {
246246
const key = column.schema !== 'public' ? `"${column.schema}"."${column.table}"` : `"${column.table}"`;
247247

248248
// TODO need to recheck this
249-
const recreateDefault = diff.type && (isEnum || wasEnum) && (column.default || (diff.default && diff.default.from));
249+
const recreateDefault = diff.type && (isEnum || wasEnum) && (diff.$left.default);
250250
if (recreateDefault) {
251251
statements.push(`ALTER TABLE ${key} ALTER COLUMN "${column.name}" DROP DEFAULT;`);
252252
}
@@ -270,7 +270,7 @@ const alterColumnConvertor = convertor('alter_column', (st) => {
270270
}${suffix};`,
271271
);
272272

273-
if (recreateDefault) {
273+
if (recreateDefault && column.default) {
274274
statements.push(`ALTER TABLE ${key} ALTER COLUMN "${column.name}" SET DEFAULT ${defaultToSQL(column)};`);
275275
}
276276
}
@@ -552,6 +552,7 @@ const alterEnumConvertor = convertor('alter_enum', (st) => {
552552

553553
const recreateEnumConvertor = convertor('recreate_enum', (st) => {
554554
const { to, columns } = st;
555+
555556
const statements: string[] = [];
556557
for (const column of columns) {
557558
const key = column.schema !== 'public' ? `"${column.schema}"."${column.table}"` : `"${column.table}"`;

drizzle-kit/src/dialects/postgres/convertor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ const alterColumnConvertor = convertor('alter_column', (st) => {
361361
? `"${column.schema}"."${column.table}"`
362362
: `"${column.table}"`;
363363

364-
const recreateDefault = diff.type && (isEnum || wasEnum) && (column.default || (diff.default && diff.default.from));
364+
const recreateDefault = diff.type && (isEnum || wasEnum) && (diff.$left.default);
365365
if (recreateDefault) {
366366
statements.push(`ALTER TABLE ${key} ALTER COLUMN "${column.name}" DROP DEFAULT;`);
367367
}
@@ -390,7 +390,7 @@ const alterColumnConvertor = convertor('alter_column', (st) => {
390390
}${suffix};`,
391391
);
392392

393-
if (recreateDefault) {
393+
if (recreateDefault && column.default) {
394394
statements.push(
395395
`ALTER TABLE ${key} ALTER COLUMN "${column.name}" SET DEFAULT ${defaultToSQL(column)};`,
396396
);

drizzle-kit/tests/cockroach/enums.test.ts

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2146,3 +2146,138 @@ test.concurrent('enums ordering', async ({ db }) => {
21462146
expect(st4).toStrictEqual([]);
21472147
expect(pst4).toStrictEqual([]);
21482148
});
2149+
2150+
test.concurrent('change data type from standart type to enum. column has default', async ({ db }) => {
2151+
const enum1 = cockroachEnum('enum', ['value1', 'value3']);
2152+
2153+
const from = {
2154+
enum1,
2155+
table: cockroachTable('table', {
2156+
column: varchar('column').default('value2'),
2157+
}),
2158+
};
2159+
2160+
const to = {
2161+
enum1,
2162+
table: cockroachTable('table', {
2163+
column: enum1('column').default('value3'),
2164+
}),
2165+
};
2166+
2167+
const { sqlStatements: st } = await diff(from, to, []);
2168+
2169+
await push({ db, to: from });
2170+
const { sqlStatements: pst } = await push({
2171+
db,
2172+
to,
2173+
});
2174+
2175+
const st0 = [
2176+
'ALTER TABLE "table" ALTER COLUMN "column" DROP DEFAULT;',
2177+
`ALTER TABLE "table" ALTER COLUMN "column" SET DATA TYPE "enum" USING "column"::"enum";`,
2178+
`ALTER TABLE "table" ALTER COLUMN "column" SET DEFAULT 'value3'::"enum";`,
2179+
];
2180+
expect(st).toStrictEqual(st0);
2181+
expect(pst).toStrictEqual(st0);
2182+
});
2183+
2184+
test.concurrent('change data type from standart type to enum. set default', async ({ db }) => {
2185+
const enum1 = cockroachEnum('enum', ['value1', 'value3']);
2186+
2187+
const from = {
2188+
enum1,
2189+
table: cockroachTable('table', {
2190+
column: varchar('column'),
2191+
}),
2192+
};
2193+
2194+
const to = {
2195+
enum1,
2196+
table: cockroachTable('table', {
2197+
column: enum1('column').default('value1'),
2198+
}),
2199+
};
2200+
2201+
const { sqlStatements: st } = await diff(from, to, []);
2202+
2203+
await push({ db, to: from });
2204+
const { sqlStatements: pst } = await push({
2205+
db,
2206+
to,
2207+
});
2208+
2209+
const st0 = [
2210+
'ALTER TABLE "table" ALTER COLUMN "column" SET DATA TYPE "enum" USING "column"::"enum";',
2211+
`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT 'value1'::"enum";`,
2212+
];
2213+
2214+
expect(st).toStrictEqual(st0);
2215+
expect(pst).toStrictEqual(st0);
2216+
});
2217+
2218+
test.concurrent('change data type from standart type to enum. altered column has no default', async ({ db }) => {
2219+
const enum1 = cockroachEnum('enum', ['value1', 'value3']);
2220+
2221+
const from = {
2222+
enum1,
2223+
table: cockroachTable('table', {
2224+
column: varchar('column').default('value2'),
2225+
}),
2226+
};
2227+
2228+
const to = {
2229+
enum1,
2230+
table: cockroachTable('table', {
2231+
column: enum1('column'),
2232+
}),
2233+
};
2234+
2235+
const { sqlStatements: st } = await diff(from, to, []);
2236+
2237+
await push({ db, to: from });
2238+
const { sqlStatements: pst } = await push({
2239+
db,
2240+
to,
2241+
});
2242+
2243+
const st0 = [
2244+
'ALTER TABLE "table" ALTER COLUMN "column" DROP DEFAULT;',
2245+
'ALTER TABLE "table" ALTER COLUMN "column" SET DATA TYPE "enum" USING "column"::"enum";',
2246+
];
2247+
2248+
expect(st).toStrictEqual(st0);
2249+
expect(pst).toStrictEqual(st0);
2250+
});
2251+
2252+
test.concurrent('change data type from standart type to enum. column has no default', async ({ db }) => {
2253+
const enum1 = cockroachEnum('enum', ['value1', 'value3']);
2254+
2255+
const from = {
2256+
enum1,
2257+
table: cockroachTable('table', {
2258+
column: varchar('column'),
2259+
}),
2260+
};
2261+
2262+
const to = {
2263+
enum1,
2264+
table: cockroachTable('table', {
2265+
column: enum1('column'),
2266+
}),
2267+
};
2268+
2269+
const { sqlStatements: st } = await diff(from, to, []);
2270+
2271+
await push({ db, to: from });
2272+
const { sqlStatements: pst } = await push({
2273+
db,
2274+
to,
2275+
});
2276+
2277+
const st0 = [
2278+
'ALTER TABLE "table" ALTER COLUMN "column" SET DATA TYPE "enum" USING "column"::"enum";',
2279+
];
2280+
2281+
expect(st).toStrictEqual(st0);
2282+
expect(pst).toStrictEqual(st0);
2283+
});

drizzle-kit/tests/postgres/pg-enums.test.ts

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1506,7 +1506,41 @@ test('change data type from standart type to enum. column has default', async ()
15061506
expect(pst).toStrictEqual(st0);
15071507
});
15081508

1509-
test('change data type from standart type to enum. column has no default', async () => {
1509+
test('change data type from standart type to enum. set default', async () => {
1510+
const enum1 = pgEnum('enum', ['value1', 'value3']);
1511+
1512+
const from = {
1513+
enum1,
1514+
table: pgTable('table', {
1515+
column: varchar('column'),
1516+
}),
1517+
};
1518+
1519+
const to = {
1520+
enum1,
1521+
table: pgTable('table', {
1522+
column: enum1('column').default('value1'),
1523+
}),
1524+
};
1525+
1526+
const { sqlStatements: st } = await diff(from, to, []);
1527+
1528+
await push({ db, to: from });
1529+
const { sqlStatements: pst } = await push({
1530+
db,
1531+
to,
1532+
});
1533+
1534+
const st0 = [
1535+
'ALTER TABLE "table" ALTER COLUMN "column" SET DATA TYPE "enum" USING "column"::"enum";',
1536+
`ALTER TABLE \"table\" ALTER COLUMN \"column\" SET DEFAULT 'value1'::"enum";`,
1537+
];
1538+
1539+
expect(st).toStrictEqual(st0);
1540+
expect(pst).toStrictEqual(st0);
1541+
});
1542+
1543+
test('change data type from standart type to enum. altered column has no default', async () => {
15101544
const enum1 = pgEnum('enum', ['value1', 'value3']);
15111545

15121546
const from = {
@@ -1524,7 +1558,6 @@ test('change data type from standart type to enum. column has no default', async
15241558
};
15251559

15261560
const { sqlStatements: st } = await diff(from, to, []);
1527-
console.log(st);
15281561

15291562
await push({ db, to: from });
15301563
const { sqlStatements: pst } = await push({
@@ -1541,6 +1574,39 @@ test('change data type from standart type to enum. column has no default', async
15411574
expect(pst).toStrictEqual(st0);
15421575
});
15431576

1577+
test('change data type from standart type to enum. column has no default', async () => {
1578+
const enum1 = pgEnum('enum', ['value1', 'value3']);
1579+
1580+
const from = {
1581+
enum1,
1582+
table: pgTable('table', {
1583+
column: varchar('column'),
1584+
}),
1585+
};
1586+
1587+
const to = {
1588+
enum1,
1589+
table: pgTable('table', {
1590+
column: enum1('column'),
1591+
}),
1592+
};
1593+
1594+
const { sqlStatements: st } = await diff(from, to, []);
1595+
1596+
await push({ db, to: from });
1597+
const { sqlStatements: pst } = await push({
1598+
db,
1599+
to,
1600+
});
1601+
1602+
const st0 = [
1603+
'ALTER TABLE "table" ALTER COLUMN "column" SET DATA TYPE "enum" USING "column"::"enum";',
1604+
];
1605+
1606+
expect(st).toStrictEqual(st0);
1607+
expect(pst).toStrictEqual(st0);
1608+
});
1609+
15441610
// +
15451611
test('change data type from array standart type to array enum. column has default', async () => {
15461612
const enum1 = pgEnum('enum', ['value1', 'value3']);

0 commit comments

Comments
 (0)