diff --git a/integration-tests/__tests__/alter-database.spec.js b/integration-tests/__tests__/alter-database.spec.js new file mode 100644 index 000000000..3dd21dedc --- /dev/null +++ b/integration-tests/__tests__/alter-database.spec.js @@ -0,0 +1,44 @@ +const stableStringify = require('json-stable-stringify'); +const _ = require('lodash'); +const fp = require('lodash/fp'); +const uuidv1 = require('uuid/v1'); +const { testWrapper } = require('../tools'); +const engines = require('../engines'); +const { getAlterDatabaseScript, extendDatabaseInfo, generateDbPairingId } = require('dbgate-tools'); + +async function testDatabaseDiff(conn, driver, mangle) { + await driver.query(conn, `create table t0 (id int not null primary key)`); + + await driver.query( + conn, + `create table t1 ( + col_pk int not null primary key, + col_fk int null references t0(id) + )` + ); + + const structure1 = generateDbPairingId(extendDatabaseInfo(await driver.analyseFull(conn))); + let structure2 = _.cloneDeep(structure1); + mangle(structure2); + structure2 = extendDatabaseInfo(structure2); + + const sql = getAlterDatabaseScript(structure1, structure2, {}, structure2, driver); + console.log('RUNNING ALTER SQL', driver.engine, ':', sql); + + await driver.script(conn, sql); + + const structure2Real = extendDatabaseInfo(await driver.analyseFull(conn)); + + expect(structure2Real.tables.length).toEqual(structure2.tables.length); +} + +describe('Alter database', () => { + test.each(engines.map(engine => [engine.label, engine]))( + 'Drop referenced table - %s', + testWrapper(async (conn, driver, engine) => { + await testDatabaseDiff(conn, driver, db => { + _.remove(db.tables, x => x.pureName == 't0'); + }); + }) + ); +}); diff --git a/integration-tests/__tests__/alter-processor.spec.js b/integration-tests/__tests__/alter-table.spec.js similarity index 99% rename from integration-tests/__tests__/alter-processor.spec.js rename to integration-tests/__tests__/alter-table.spec.js index ffc1d0e7b..e1db13bd4 100644 --- a/integration-tests/__tests__/alter-processor.spec.js +++ b/integration-tests/__tests__/alter-table.spec.js @@ -68,7 +68,7 @@ function engines_columns_source() { return _.flatten(engines.map(engine => TESTED_COLUMNS.map(column => [engine.label, column, engine]))); } -describe('Alter processor', () => { +describe('Alter table', () => { test.each(engines.map(engine => [engine.label, engine]))( 'Add column - %s', testWrapper(async (conn, driver, engine) => { diff --git a/integration-tests/engines.js b/integration-tests/engines.js index bbaa86ad4..b11d40cb2 100644 --- a/integration-tests/engines.js +++ b/integration-tests/engines.js @@ -116,11 +116,11 @@ const engines = [ const filterLocal = [ // filter local testing - '-MySQL', - '-PostgreSQL', + 'MySQL', + 'PostgreSQL', 'SQL Server', - '-SQLite', - '-CockroachDB', + 'SQLite', + 'CockroachDB', ]; module.exports = process.env.CITEST diff --git a/packages/tools/src/alterPlan.ts b/packages/tools/src/alterPlan.ts index a74e3b8f1..20ca2e1d6 100644 --- a/packages/tools/src/alterPlan.ts +++ b/packages/tools/src/alterPlan.ts @@ -248,13 +248,15 @@ export class AlterPlan { if (op.operationType == 'dropTable') { return [ - ...(op.oldObject.dependencies || []).map(oldObject => { - const opRes: AlterOperation = { - operationType: 'dropConstraint', - oldObject, - }; - return opRes; - }), + ...(this.dialect.dropReferencesWhenDropTable + ? (op.oldObject.dependencies || []).map(oldObject => { + const opRes: AlterOperation = { + operationType: 'dropConstraint', + oldObject, + }; + return opRes; + }) + : []), op, ]; } diff --git a/packages/types/dialect.d.ts b/packages/types/dialect.d.ts index 90597b34d..137a14be0 100644 --- a/packages/types/dialect.d.ts +++ b/packages/types/dialect.d.ts @@ -30,4 +30,6 @@ export interface SqlDialect { dropUnique?: boolean; createCheck?: boolean; dropCheck?: boolean; + + dropReferencesWhenDropTable?: boolean; } diff --git a/plugins/dbgate-plugin-mssql/src/frontend/driver.js b/plugins/dbgate-plugin-mssql/src/frontend/driver.js index 7626e4ec5..17a2f61ec 100644 --- a/plugins/dbgate-plugin-mssql/src/frontend/driver.js +++ b/plugins/dbgate-plugin-mssql/src/frontend/driver.js @@ -33,6 +33,8 @@ const dialect = { dropUnique: true, createCheck: true, dropCheck: true, + + dropReferencesWhenDropTable: true, }; /** @type {import('dbgate-types').EngineDriver} */ diff --git a/plugins/dbgate-plugin-mysql/src/frontend/drivers.js b/plugins/dbgate-plugin-mysql/src/frontend/drivers.js index 74204ea94..8ee0cb767 100644 --- a/plugins/dbgate-plugin-mysql/src/frontend/drivers.js +++ b/plugins/dbgate-plugin-mysql/src/frontend/drivers.js @@ -28,6 +28,8 @@ const dialect = { dropUnique: true, createCheck: true, dropCheck: true, + + dropReferencesWhenDropTable: false, }; const mysqlDriverBase = { diff --git a/plugins/dbgate-plugin-postgres/src/frontend/drivers.js b/plugins/dbgate-plugin-postgres/src/frontend/drivers.js index d7262cde2..79409b831 100644 --- a/plugins/dbgate-plugin-postgres/src/frontend/drivers.js +++ b/plugins/dbgate-plugin-postgres/src/frontend/drivers.js @@ -30,6 +30,8 @@ const dialect = { dropUnique: true, createCheck: true, dropCheck: true, + + dropReferencesWhenDropTable: true, }; const postgresDriverBase = { diff --git a/plugins/dbgate-plugin-sqlite/src/frontend/driver.js b/plugins/dbgate-plugin-sqlite/src/frontend/driver.js index 25ab833b2..f51f8c92e 100644 --- a/plugins/dbgate-plugin-sqlite/src/frontend/driver.js +++ b/plugins/dbgate-plugin-sqlite/src/frontend/driver.js @@ -30,6 +30,7 @@ const dialect = { dropForeignKey: false, createPrimaryKey: false, dropPrimaryKey: false, + dropReferencesWhenDropTable: false, }; /** @type {import('dbgate-types').EngineDriver} */