mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-11-10 10:29:12 +03:00
console/fix: changing primary key removes the existing PK when failing to create PK
https://github.com/hasura/graphql-engine-mono/pull/1509 GitOrigin-RevId: b4fec58f399b21125dcacf8083b01148778f97b0
This commit is contained in:
parent
0a69080189
commit
12045a827c
@ -454,7 +454,8 @@ const savePrimaryKeys = (tableName, schemaName, constraintName) => {
|
|||||||
return dispatch(showSuccessNotification('No changes'));
|
return dispatch(showSuccessNotification('No changes'));
|
||||||
}
|
}
|
||||||
const migrationUp = [];
|
const migrationUp = [];
|
||||||
if (constraintName) {
|
// droping PK
|
||||||
|
if (constraintName && !numSelectedPkColumns) {
|
||||||
migrationUp.push(
|
migrationUp.push(
|
||||||
getRunSqlQuery(
|
getRunSqlQuery(
|
||||||
dataSource.getDropConstraintSql(
|
dataSource.getDropConstraintSql(
|
||||||
@ -466,8 +467,22 @@ const savePrimaryKeys = (tableName, schemaName, constraintName) => {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// skip creating a new config if no columns were selected
|
// Altering PK
|
||||||
if (numSelectedPkColumns) {
|
else if (constraintName && numSelectedPkColumns) {
|
||||||
|
migrationUp.push(
|
||||||
|
getRunSqlQuery(
|
||||||
|
dataSource.getAlterPkSql({
|
||||||
|
schemaName,
|
||||||
|
tableName,
|
||||||
|
selectedPkColumns,
|
||||||
|
constraintName,
|
||||||
|
}),
|
||||||
|
source
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// Creating a new PK entry
|
||||||
|
else if (!constraintName && numSelectedPkColumns) {
|
||||||
migrationUp.push(
|
migrationUp.push(
|
||||||
getRunSqlQuery(
|
getRunSqlQuery(
|
||||||
dataSource.getCreatePkSql({
|
dataSource.getCreatePkSql({
|
||||||
|
@ -285,6 +285,17 @@ export interface DataSourcesAPI {
|
|||||||
selectedPkColumns: string[];
|
selectedPkColumns: string[];
|
||||||
constraintName?: string;
|
constraintName?: string;
|
||||||
}) => string;
|
}) => string;
|
||||||
|
getAlterPkSql: ({
|
||||||
|
schemaName,
|
||||||
|
tableName,
|
||||||
|
selectedPkColumns,
|
||||||
|
constraintName,
|
||||||
|
}: {
|
||||||
|
schemaName: string;
|
||||||
|
tableName: string;
|
||||||
|
selectedPkColumns: string[];
|
||||||
|
constraintName: string;
|
||||||
|
}) => string;
|
||||||
getFunctionDefinitionSql:
|
getFunctionDefinitionSql:
|
||||||
| null
|
| null
|
||||||
| ((
|
| ((
|
||||||
|
@ -359,6 +359,9 @@ export const bigquery: DataSourcesAPI = {
|
|||||||
getCreatePkSql: () => {
|
getCreatePkSql: () => {
|
||||||
return '';
|
return '';
|
||||||
},
|
},
|
||||||
|
getAlterPkSql: () => {
|
||||||
|
return '';
|
||||||
|
},
|
||||||
getFunctionDefinitionSql: null,
|
getFunctionDefinitionSql: null,
|
||||||
primaryKeysInfoSql: () => {
|
primaryKeysInfoSql: () => {
|
||||||
return 'select []';
|
return 'select []';
|
||||||
|
@ -42,6 +42,24 @@ exports[`mssql datasource tests getAlterFKSql should generate SQL query for alte
|
|||||||
"
|
"
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`mssql datasource tests getAlterPkSql should generate alter operation as a single transaction 1`] = `
|
||||||
|
"BEGIN TRANSACTION;
|
||||||
|
ALTER TABLE \\"public\\".\\"users\\" DROP CONSTRAINT \\"PK__users__1234\\";
|
||||||
|
ALTER TABLE \\"public\\".\\"users\\"
|
||||||
|
ADD CONSTRAINT \\"PK__users__1234\\" PRIMARY KEY (\\"id\\");
|
||||||
|
|
||||||
|
COMMIT TRANSACTION;"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`mssql datasource tests getAlterPkSql should work with multi-column PKs 1`] = `
|
||||||
|
"BEGIN TRANSACTION;
|
||||||
|
ALTER TABLE \\"public\\".\\"users\\" DROP CONSTRAINT \\"test_constraint\\";
|
||||||
|
ALTER TABLE \\"public\\".\\"users\\"
|
||||||
|
ADD CONSTRAINT \\"test_constraint\\" PRIMARY KEY (\\"id\\", \\"account\\");
|
||||||
|
|
||||||
|
COMMIT TRANSACTION;"
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`mssql datasource tests getCreateFKeySql should generate query for create foreign keys with multiple columns 1`] = `
|
exports[`mssql datasource tests getCreateFKeySql should generate query for create foreign keys with multiple columns 1`] = `
|
||||||
"
|
"
|
||||||
ALTER TABLE \\"dbo\\".\\"user\\"
|
ALTER TABLE \\"dbo\\".\\"user\\"
|
||||||
|
@ -138,6 +138,36 @@ describe('mssql datasource tests', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('getAlterPkSql', () => {
|
||||||
|
const { getAlterPkSql } = mssql;
|
||||||
|
it('should generate alter operation as a single transaction ', () => {
|
||||||
|
const query = getAlterPkSql({
|
||||||
|
schemaName: 'public',
|
||||||
|
tableName: 'users',
|
||||||
|
selectedPkColumns: ['id'],
|
||||||
|
constraintName: 'PK__users__1234',
|
||||||
|
});
|
||||||
|
expect(query).toContain('BEGIN TRANSACTION');
|
||||||
|
expect(query).toContain('ALTER TABLE "public"."users"');
|
||||||
|
expect(query).toContain('DROP CONSTRAINT "PK__users__1234"');
|
||||||
|
expect(query).toContain('ADD CONSTRAINT "PK__users__1234"');
|
||||||
|
expect(query).toContain('COMMIT TRANSACTION');
|
||||||
|
expect(query).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
it('should work with multi-column PKs ', () => {
|
||||||
|
const query = getAlterPkSql({
|
||||||
|
schemaName: 'public',
|
||||||
|
tableName: 'users',
|
||||||
|
selectedPkColumns: ['id', 'account'],
|
||||||
|
constraintName: 'test_constraint',
|
||||||
|
});
|
||||||
|
expect(query).toContain(
|
||||||
|
`ADD CONSTRAINT "test_constraint" PRIMARY KEY ("id", "account")`
|
||||||
|
);
|
||||||
|
expect(query).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('getAddColumnSql', () => {
|
describe('getAddColumnSql', () => {
|
||||||
const { getAddColumnSql } = mssql;
|
const { getAddColumnSql } = mssql;
|
||||||
it('should generate SQL query for adding a column with nullable:false, unique:false with default', () => {
|
it('should generate SQL query for adding a column with nullable:false, unique:false with default', () => {
|
||||||
|
@ -708,6 +708,26 @@ FROM sys.objects as obj
|
|||||||
ADD CONSTRAINT "${constraintName}"
|
ADD CONSTRAINT "${constraintName}"
|
||||||
PRIMARY KEY (${selectedPkColumns.map(pkc => `"${pkc}"`).join(',')})`;
|
PRIMARY KEY (${selectedPkColumns.map(pkc => `"${pkc}"`).join(',')})`;
|
||||||
},
|
},
|
||||||
|
getAlterPkSql: ({
|
||||||
|
schemaName,
|
||||||
|
tableName,
|
||||||
|
selectedPkColumns,
|
||||||
|
constraintName,
|
||||||
|
}: {
|
||||||
|
schemaName: string;
|
||||||
|
tableName: string;
|
||||||
|
selectedPkColumns: string[];
|
||||||
|
constraintName: string; // compulsory for PG
|
||||||
|
}) => {
|
||||||
|
return `BEGIN TRANSACTION;
|
||||||
|
ALTER TABLE "${schemaName}"."${tableName}" DROP CONSTRAINT "${constraintName}";
|
||||||
|
ALTER TABLE "${schemaName}"."${tableName}"
|
||||||
|
ADD CONSTRAINT "${constraintName}" PRIMARY KEY (${selectedPkColumns
|
||||||
|
.map(pkc => `"${pkc}"`)
|
||||||
|
.join(', ')});
|
||||||
|
|
||||||
|
COMMIT TRANSACTION;`;
|
||||||
|
},
|
||||||
getFunctionDefinitionSql: null,
|
getFunctionDefinitionSql: null,
|
||||||
primaryKeysInfoSql: ({ schemas }) => {
|
primaryKeysInfoSql: ({ schemas }) => {
|
||||||
let whereClause = '';
|
let whereClause = '';
|
||||||
|
@ -20,6 +20,7 @@ import {
|
|||||||
checkSchemaModification,
|
checkSchemaModification,
|
||||||
getCreateCheckConstraintSql,
|
getCreateCheckConstraintSql,
|
||||||
getCreatePkSql,
|
getCreatePkSql,
|
||||||
|
getAlterPkSql,
|
||||||
getCreateTriggerSql,
|
getCreateTriggerSql,
|
||||||
getDropSql,
|
getDropSql,
|
||||||
getDropSchemaSql,
|
getDropSchemaSql,
|
||||||
@ -232,6 +233,7 @@ WHERE
|
|||||||
checkSchemaModification,
|
checkSchemaModification,
|
||||||
getCreateCheckConstraintSql,
|
getCreateCheckConstraintSql,
|
||||||
getCreatePkSql,
|
getCreatePkSql,
|
||||||
|
getAlterPkSql,
|
||||||
frequentlyUsedColumns: [],
|
frequentlyUsedColumns: [],
|
||||||
primaryKeysInfoSql,
|
primaryKeysInfoSql,
|
||||||
uniqueKeysSql,
|
uniqueKeysSql,
|
||||||
|
@ -307,6 +307,10 @@ export const getCreatePkSql = ({
|
|||||||
)} add primary key (${selectedPkColumns.join(', ')});
|
)} add primary key (${selectedPkColumns.join(', ')});
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
export const getAlterPkSql = () => {
|
||||||
|
return '';
|
||||||
|
};
|
||||||
|
|
||||||
export const getCreateTableQueries = (
|
export const getCreateTableQueries = (
|
||||||
currentSchema: string,
|
currentSchema: string,
|
||||||
tableName: string,
|
tableName: string,
|
||||||
|
@ -0,0 +1,19 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`postgresql datasource tests getAlterPkSql should generate alter operation as a single transaction 1`] = `
|
||||||
|
"BEGIN TRANSACTION;
|
||||||
|
ALTER TABLE \\"public\\".\\"users\\" DROP CONSTRAINT \\"PK__users__1234\\";
|
||||||
|
|
||||||
|
ALTER TABLE \\"public\\".\\"users\\"
|
||||||
|
ADD CONSTRAINT \\"PK__users__1234\\" PRIMARY KEY (\\"id\\");
|
||||||
|
COMMIT TRANSACTION;"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`postgresql datasource tests getAlterPkSql should work with multi-column PKs 1`] = `
|
||||||
|
"BEGIN TRANSACTION;
|
||||||
|
ALTER TABLE \\"public\\".\\"users\\" DROP CONSTRAINT \\"test_constraint\\";
|
||||||
|
|
||||||
|
ALTER TABLE \\"public\\".\\"users\\"
|
||||||
|
ADD CONSTRAINT \\"test_constraint\\" PRIMARY KEY (\\"id\\", \\"account\\");
|
||||||
|
COMMIT TRANSACTION;"
|
||||||
|
`;
|
@ -0,0 +1,33 @@
|
|||||||
|
import { postgres } from '../index';
|
||||||
|
|
||||||
|
describe('postgresql datasource tests', () => {
|
||||||
|
describe('getAlterPkSql', () => {
|
||||||
|
const { getAlterPkSql } = postgres;
|
||||||
|
it('should generate alter operation as a single transaction ', () => {
|
||||||
|
const query = getAlterPkSql({
|
||||||
|
schemaName: 'public',
|
||||||
|
tableName: 'users',
|
||||||
|
selectedPkColumns: ['id'],
|
||||||
|
constraintName: 'PK__users__1234',
|
||||||
|
});
|
||||||
|
expect(query).toContain('BEGIN TRANSACTION');
|
||||||
|
expect(query).toContain('ALTER TABLE "public"."users"');
|
||||||
|
expect(query).toContain('DROP CONSTRAINT "PK__users__1234"');
|
||||||
|
expect(query).toContain('ADD CONSTRAINT "PK__users__1234"');
|
||||||
|
expect(query).toContain('COMMIT TRANSACTION');
|
||||||
|
expect(query).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
it('should work with multi-column PKs ', () => {
|
||||||
|
const query = getAlterPkSql({
|
||||||
|
schemaName: 'public',
|
||||||
|
tableName: 'users',
|
||||||
|
selectedPkColumns: ['id', 'account'],
|
||||||
|
constraintName: 'test_constraint',
|
||||||
|
});
|
||||||
|
expect(query).toContain(
|
||||||
|
`ADD CONSTRAINT "test_constraint" PRIMARY KEY ("id", "account")`
|
||||||
|
);
|
||||||
|
expect(query).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -45,6 +45,7 @@ import {
|
|||||||
checkSchemaModification,
|
checkSchemaModification,
|
||||||
getCreateCheckConstraintSql,
|
getCreateCheckConstraintSql,
|
||||||
getCreatePkSql,
|
getCreatePkSql,
|
||||||
|
getAlterPkSql,
|
||||||
getFunctionDefinitionSql,
|
getFunctionDefinitionSql,
|
||||||
primaryKeysInfoSql,
|
primaryKeysInfoSql,
|
||||||
checkConstraintsSql,
|
checkConstraintsSql,
|
||||||
@ -703,6 +704,7 @@ export const postgres: DataSourcesAPI = {
|
|||||||
checkSchemaModification,
|
checkSchemaModification,
|
||||||
getCreateCheckConstraintSql,
|
getCreateCheckConstraintSql,
|
||||||
getCreatePkSql,
|
getCreatePkSql,
|
||||||
|
getAlterPkSql,
|
||||||
getFunctionDefinitionSql,
|
getFunctionDefinitionSql,
|
||||||
primaryKeysInfoSql,
|
primaryKeysInfoSql,
|
||||||
checkConstraintsSql,
|
checkConstraintsSql,
|
||||||
|
@ -797,6 +797,26 @@ export const getCreatePkSql = ({
|
|||||||
add constraint "${constraintName}"
|
add constraint "${constraintName}"
|
||||||
primary key (${selectedPkColumns.map(pkc => `"${pkc}"`).join(', ')});`;
|
primary key (${selectedPkColumns.map(pkc => `"${pkc}"`).join(', ')});`;
|
||||||
};
|
};
|
||||||
|
export const getAlterPkSql = ({
|
||||||
|
schemaName,
|
||||||
|
tableName,
|
||||||
|
selectedPkColumns,
|
||||||
|
constraintName,
|
||||||
|
}: {
|
||||||
|
schemaName: string;
|
||||||
|
tableName: string;
|
||||||
|
selectedPkColumns: string[];
|
||||||
|
constraintName: string; // compulsory for PG
|
||||||
|
}) => {
|
||||||
|
return `BEGIN TRANSACTION;
|
||||||
|
ALTER TABLE "${schemaName}"."${tableName}" DROP CONSTRAINT "${constraintName}";
|
||||||
|
|
||||||
|
ALTER TABLE "${schemaName}"."${tableName}"
|
||||||
|
ADD CONSTRAINT "${constraintName}" PRIMARY KEY (${selectedPkColumns
|
||||||
|
.map(pkc => `"${pkc}"`)
|
||||||
|
.join(', ')});
|
||||||
|
COMMIT TRANSACTION;`;
|
||||||
|
};
|
||||||
|
|
||||||
const trackableFunctionsWhere = `
|
const trackableFunctionsWhere = `
|
||||||
AND has_variadic = FALSE
|
AND has_variadic = FALSE
|
||||||
|
Loading…
Reference in New Issue
Block a user