1291 lines
29 KiB
TypeScript
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;",
|
|
]);
|
|
});
|