Files
2026-07-13 12:10:05 +08:00

1291 lines
29 KiB
TypeScript

import { SQL, sql } from 'drizzle-orm';
import { int, singlestoreTable, text } from 'drizzle-orm/singlestore-core';
import { expect, test } from 'vitest';
import { diffTestSchemasSingleStore } from './schemaDiffer';
test('generated as callback: add column with generated constraint', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
(): SQL => sql`${to.users.name} || 'hello'`,
{ mode: 'stored' },
),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
column: {
generated: {
as: "`users`.`name` || 'hello'",
type: 'stored',
},
autoincrement: false,
name: 'gen_name',
notNull: false,
primaryKey: false,
type: 'text',
},
schema: '',
tableName: 'users',
type: 'alter_table_add_column',
},
]);
expect(sqlStatements).toStrictEqual([
"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;",
]);
});
test('generated as callback: add generated constraint to an exisiting column as stored', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').notNull(),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name')
.notNull()
.generatedAlwaysAs((): SQL => sql`${from.users.name} || 'to add'`, {
mode: 'stored',
}),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnDefault: undefined,
columnGenerated: {
as: "`users`.`name` || 'to add'",
type: 'stored',
},
columnAutoIncrement: false,
columnName: 'gen_name',
columnNotNull: true,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
type: 'alter_table_alter_column_set_generated',
},
]);
expect(sqlStatements).toStrictEqual([
"ALTER TABLE `users` MODIFY COLUMN `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') STORED;",
]);
});
test('generated as callback: add generated constraint to an exisiting column as virtual', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').notNull(),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name')
.notNull()
.generatedAlwaysAs((): SQL => sql`${from.users.name} || 'to add'`, {
mode: 'virtual',
}),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: {
as: "`users`.`name` || 'to add'",
type: 'virtual',
},
columnName: 'gen_name',
columnNotNull: true,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
type: 'alter_table_alter_column_set_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` DROP COLUMN `gen_name`;',
"ALTER TABLE `users` ADD `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') VIRTUAL;",
]);
});
test('generated as callback: drop generated constraint as stored', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
(): SQL => sql`${from.users.name} || 'to delete'`,
{ mode: 'stored' },
),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName1: text('gen_name'),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: undefined,
columnName: 'gen_name',
columnNotNull: false,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
oldColumn: {
autoincrement: false,
generated: {
as: "`users`.`name` || 'to delete'",
type: 'stored',
},
name: 'gen_name',
notNull: false,
onUpdate: undefined,
primaryKey: false,
type: 'text',
},
type: 'alter_table_alter_column_drop_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` MODIFY COLUMN `gen_name` text;',
]);
});
test('generated as callback: drop generated constraint as virtual', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
(): SQL => sql`${from.users.name} || 'to delete'`,
{ mode: 'virtual' },
),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName1: text('gen_name'),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: undefined,
columnName: 'gen_name',
columnNotNull: false,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
oldColumn: {
autoincrement: false,
generated: {
as: "`users`.`name` || 'to delete'",
type: 'virtual',
},
name: 'gen_name',
notNull: false,
onUpdate: undefined,
primaryKey: false,
type: 'text',
},
tableName: 'users',
type: 'alter_table_alter_column_drop_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` DROP COLUMN `gen_name`;',
'ALTER TABLE `users` ADD `gen_name` text;',
]);
});
test('generated as callback: change generated constraint type from virtual to stored', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
(): SQL => sql`${from.users.name}`,
{ mode: 'virtual' },
),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
(): SQL => sql`${to.users.name} || 'hello'`,
{ mode: 'stored' },
),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: {
as: "`users`.`name` || 'hello'",
type: 'stored',
},
columnName: 'gen_name',
columnNotNull: false,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
type: 'alter_table_alter_column_alter_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` drop column `gen_name`;',
"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;",
]);
});
test('generated as callback: change generated constraint type from stored to virtual', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
(): SQL => sql`${from.users.name}`,
),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
(): SQL => sql`${to.users.name} || 'hello'`,
),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: {
as: "`users`.`name` || 'hello'",
type: 'virtual',
},
columnName: 'gen_name',
columnNotNull: false,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
type: 'alter_table_alter_column_alter_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` drop column `gen_name`;',
"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;",
]);
});
test('generated as callback: change generated constraint', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
(): SQL => sql`${from.users.name}`,
),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
(): SQL => sql`${to.users.name} || 'hello'`,
),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: {
as: "`users`.`name` || 'hello'",
type: 'virtual',
},
columnName: 'gen_name',
columnNotNull: false,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
type: 'alter_table_alter_column_alter_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` drop column `gen_name`;',
"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;",
]);
});
// ---
test('generated as sql: add column with generated constraint', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
sql`\`users\`.\`name\` || 'hello'`,
{ mode: 'stored' },
),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
column: {
generated: {
as: "`users`.`name` || 'hello'",
type: 'stored',
},
autoincrement: false,
name: 'gen_name',
notNull: false,
primaryKey: false,
type: 'text',
},
schema: '',
tableName: 'users',
type: 'alter_table_add_column',
},
]);
expect(sqlStatements).toStrictEqual([
"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;",
]);
});
test('generated as sql: add generated constraint to an exisiting column as stored', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').notNull(),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name')
.notNull()
.generatedAlwaysAs(sql`\`users\`.\`name\` || 'to add'`, {
mode: 'stored',
}),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnDefault: undefined,
columnGenerated: {
as: "`users`.`name` || 'to add'",
type: 'stored',
},
columnAutoIncrement: false,
columnName: 'gen_name',
columnNotNull: true,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
type: 'alter_table_alter_column_set_generated',
},
]);
expect(sqlStatements).toStrictEqual([
"ALTER TABLE `users` MODIFY COLUMN `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') STORED;",
]);
});
test('generated as sql: add generated constraint to an exisiting column as virtual', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').notNull(),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name')
.notNull()
.generatedAlwaysAs(sql`\`users\`.\`name\` || 'to add'`, {
mode: 'virtual',
}),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: {
as: "`users`.`name` || 'to add'",
type: 'virtual',
},
columnName: 'gen_name',
columnNotNull: true,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
type: 'alter_table_alter_column_set_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` DROP COLUMN `gen_name`;',
"ALTER TABLE `users` ADD `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') VIRTUAL;",
]);
});
test('generated as sql: drop generated constraint as stored', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
sql`\`users\`.\`name\` || 'to delete'`,
{ mode: 'stored' },
),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName1: text('gen_name'),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: undefined,
columnName: 'gen_name',
columnNotNull: false,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
oldColumn: {
autoincrement: false,
generated: {
as: "`users`.`name` || 'to delete'",
type: 'stored',
},
name: 'gen_name',
notNull: false,
onUpdate: undefined,
primaryKey: false,
type: 'text',
},
type: 'alter_table_alter_column_drop_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` MODIFY COLUMN `gen_name` text;',
]);
});
test('generated as sql: drop generated constraint as virtual', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
sql`\`users\`.\`name\` || 'to delete'`,
{ mode: 'virtual' },
),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName1: text('gen_name'),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: undefined,
columnName: 'gen_name',
columnNotNull: false,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
oldColumn: {
autoincrement: false,
generated: {
as: "`users`.`name` || 'to delete'",
type: 'virtual',
},
name: 'gen_name',
notNull: false,
onUpdate: undefined,
primaryKey: false,
type: 'text',
},
tableName: 'users',
type: 'alter_table_alter_column_drop_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` DROP COLUMN `gen_name`;',
'ALTER TABLE `users` ADD `gen_name` text;',
]);
});
test('generated as sql: change generated constraint type from virtual to stored', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
sql`\`users\`.\`name\``,
{ mode: 'virtual' },
),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
sql`\`users\`.\`name\` || 'hello'`,
{ mode: 'stored' },
),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: {
as: "`users`.`name` || 'hello'",
type: 'stored',
},
columnName: 'gen_name',
columnNotNull: false,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
type: 'alter_table_alter_column_alter_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` drop column `gen_name`;',
"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;",
]);
});
test('generated as sql: change generated constraint type from stored to virtual', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
sql`\`users\`.\`name\``,
),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
sql`\`users\`.\`name\` || 'hello'`,
),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: {
as: "`users`.`name` || 'hello'",
type: 'virtual',
},
columnName: 'gen_name',
columnNotNull: false,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
type: 'alter_table_alter_column_alter_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` drop column `gen_name`;',
"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;",
]);
});
test('generated as sql: change generated constraint', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
sql`\`users\`.\`name\``,
),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
sql`\`users\`.\`name\` || 'hello'`,
),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: {
as: "`users`.`name` || 'hello'",
type: 'virtual',
},
columnName: 'gen_name',
columnNotNull: false,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
type: 'alter_table_alter_column_alter_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` drop column `gen_name`;',
"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;",
]);
});
// ---
test('generated as string: add column with generated constraint', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
`\`users\`.\`name\` || 'hello'`,
{ mode: 'stored' },
),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
column: {
generated: {
as: "`users`.`name` || 'hello'",
type: 'stored',
},
autoincrement: false,
name: 'gen_name',
notNull: false,
primaryKey: false,
type: 'text',
},
schema: '',
tableName: 'users',
type: 'alter_table_add_column',
},
]);
expect(sqlStatements).toStrictEqual([
"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;",
]);
});
test('generated as string: add generated constraint to an exisiting column as stored', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').notNull(),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name')
.notNull()
.generatedAlwaysAs(`\`users\`.\`name\` || 'to add'`, {
mode: 'stored',
}),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnDefault: undefined,
columnGenerated: {
as: "`users`.`name` || 'to add'",
type: 'stored',
},
columnAutoIncrement: false,
columnName: 'gen_name',
columnNotNull: true,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
type: 'alter_table_alter_column_set_generated',
},
]);
expect(sqlStatements).toStrictEqual([
"ALTER TABLE `users` MODIFY COLUMN `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') STORED;",
]);
});
test('generated as string: add generated constraint to an exisiting column as virtual', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').notNull(),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name')
.notNull()
.generatedAlwaysAs(`\`users\`.\`name\` || 'to add'`, {
mode: 'virtual',
}),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: {
as: "`users`.`name` || 'to add'",
type: 'virtual',
},
columnName: 'gen_name',
columnNotNull: true,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
type: 'alter_table_alter_column_set_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` DROP COLUMN `gen_name`;',
"ALTER TABLE `users` ADD `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') VIRTUAL;",
]);
});
test('generated as string: drop generated constraint as stored', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
`\`users\`.\`name\` || 'to delete'`,
{ mode: 'stored' },
),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName1: text('gen_name'),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: undefined,
columnName: 'gen_name',
columnNotNull: false,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
oldColumn: {
autoincrement: false,
generated: {
as: "`users`.`name` || 'to delete'",
type: 'stored',
},
name: 'gen_name',
notNull: false,
onUpdate: undefined,
primaryKey: false,
type: 'text',
},
type: 'alter_table_alter_column_drop_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` MODIFY COLUMN `gen_name` text;',
]);
});
test('generated as string: drop generated constraint as virtual', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
`\`users\`.\`name\` || 'to delete'`,
{ mode: 'virtual' },
),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName1: text('gen_name'),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: undefined,
columnName: 'gen_name',
columnNotNull: false,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
oldColumn: {
autoincrement: false,
generated: {
as: "`users`.`name` || 'to delete'",
type: 'virtual',
},
name: 'gen_name',
notNull: false,
onUpdate: undefined,
primaryKey: false,
type: 'text',
},
tableName: 'users',
type: 'alter_table_alter_column_drop_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` DROP COLUMN `gen_name`;',
'ALTER TABLE `users` ADD `gen_name` text;',
]);
});
test('generated as string: change generated constraint type from virtual to stored', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(`\`users\`.\`name\``, {
mode: 'virtual',
}),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
`\`users\`.\`name\` || 'hello'`,
{ mode: 'stored' },
),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: {
as: "`users`.`name` || 'hello'",
type: 'stored',
},
columnName: 'gen_name',
columnNotNull: false,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
type: 'alter_table_alter_column_alter_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` drop column `gen_name`;',
"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;",
]);
});
test('generated as string: change generated constraint type from stored to virtual', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(`\`users\`.\`name\``),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
`\`users\`.\`name\` || 'hello'`,
),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: {
as: "`users`.`name` || 'hello'",
type: 'virtual',
},
columnName: 'gen_name',
columnNotNull: false,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
type: 'alter_table_alter_column_alter_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` drop column `gen_name`;',
"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;",
]);
});
test('generated as string: change generated constraint', async () => {
const from = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(`\`users\`.\`name\``),
}),
};
const to = {
users: singlestoreTable('users', {
id: int('id'),
id2: int('id2'),
name: text('name'),
generatedName: text('gen_name').generatedAlwaysAs(
`\`users\`.\`name\` || 'hello'`,
),
}),
};
const { statements, sqlStatements } = await diffTestSchemasSingleStore(
from,
to,
[],
);
expect(statements).toStrictEqual([
{
columnAutoIncrement: false,
columnDefault: undefined,
columnGenerated: {
as: "`users`.`name` || 'hello'",
type: 'virtual',
},
columnName: 'gen_name',
columnNotNull: false,
columnOnUpdate: undefined,
columnPk: false,
newDataType: 'text',
schema: '',
tableName: 'users',
type: 'alter_table_alter_column_alter_generated',
},
]);
expect(sqlStatements).toStrictEqual([
'ALTER TABLE `users` drop column `gen_name`;',
"ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;",
]);
});