diff --git a/integration-tests/__tests__/deploy-database.spec.js b/integration-tests/__tests__/deploy-database.spec.js index a83bf0da8..222ff8541 100644 --- a/integration-tests/__tests__/deploy-database.spec.js +++ b/integration-tests/__tests__/deploy-database.spec.js @@ -70,7 +70,7 @@ function checkStructure( } async function testDatabaseDeploy(engine, conn, driver, dbModelsYaml, options) { - const { testEmptyLastScript, finalCheckAgainstModel, dbdiffOptionsExtra } = options || {}; + const { testEmptyLastScript, finalCheckAgainstModel, dbdiffOptionsExtra, allowDropStatements } = options || {}; let index = 0; for (const loadedDbModel of dbModelsYaml) { const { sql, isEmpty } = await generateDeploySql({ @@ -81,7 +81,9 @@ async function testDatabaseDeploy(engine, conn, driver, dbModelsYaml, options) { dbdiffOptionsExtra, }); console.debug('Generated deploy script:', sql); - expect(sql.toUpperCase().includes('DROP ')).toBeFalsy(); + if (!allowDropStatements) { + expect(sql.toUpperCase().includes('DROP ')).toBeFalsy(); + } console.log('dbModelsYaml.length', dbModelsYaml.length, index); if (testEmptyLastScript && index == dbModelsYaml.length - 1) { @@ -561,7 +563,7 @@ describe('Deploy database', () => { deletedSqlObjectPrefix: '_deleted_', }, disallowExtraObjects: true, - finalCheckAgainstModel: [T1, V1], + allowDropStatements: true, }); }) ); diff --git a/packages/tools/src/alterPlan.ts b/packages/tools/src/alterPlan.ts index 6de602ce6..1ad216d8f 100644 --- a/packages/tools/src/alterPlan.ts +++ b/packages/tools/src/alterPlan.ts @@ -1,5 +1,5 @@ import _ from 'lodash'; -import { DbDiffOptions, generateTablePairingId } from './diffTools'; +import { DbDiffOptions, generateTablePairingId, hasDeletedPrefix } from './diffTools'; import { AlterProcessor, ColumnInfo, @@ -548,7 +548,13 @@ export class AlterPlan { if (this.opts.noDropTable && op.operationType == 'dropTable') return false; if (this.opts.noDropTable && op.operationType == 'recreateTable') return false; if (this.opts.noDropConstraint && op.operationType == 'dropConstraint') return false; - if (this.opts.noDropSqlObject && op.operationType == 'dropSqlObject') return false; + if ( + this.opts.noDropSqlObject && + op.operationType == 'dropSqlObject' && + // allow to drop previously deleted SQL objects + !hasDeletedPrefix(op.oldObject.pureName, this.opts, this.opts.deletedSqlObjectPrefix) + ) + return false; return true; }); } diff --git a/packages/tools/src/diffTools.ts b/packages/tools/src/diffTools.ts index 04c5d699d..111d153f7 100644 --- a/packages/tools/src/diffTools.ts +++ b/packages/tools/src/diffTools.ts @@ -156,11 +156,11 @@ function getNameWithoutDeletedPrefix(name: string, opts: DbDiffOptions, deletedP } } } - + return name; } -function hasDeletedPrefix(name: string, opts: DbDiffOptions, deletedPrefix?: string) { +export function hasDeletedPrefix(name: string, opts: DbDiffOptions, deletedPrefix?: string) { if (deletedPrefix) { if (opts.ignoreCase) { return (name || '').toLowerCase().startsWith(deletedPrefix.toLowerCase()); @@ -636,11 +636,9 @@ export function createAlterDatabasePlan( } else if (!opts.noDropSqlObject) { plan.dropSqlObject(oldobj); } - } else if (!testEqualSqlObjects(oldobj.createSql, newobj.createSql, opts)) { + } else if (!testEqualSqlObjects(oldobj, newobj, opts)) { plan.recreates.sqlObjects += 1; - if (!opts.noDropSqlObject) { - plan.dropSqlObject(oldobj); - } + plan.dropSqlObject(oldobj); plan.createSqlObject(newobj); } }