From abf0fc7942eac27be90d0bd94db9321e420e56dc Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Thu, 27 Nov 2025 14:06:48 +0100 Subject: [PATCH] incremental analysis in alter table tests --- .../__tests__/alter-table.spec.js | 72 ++++++++++++++++++- integration-tests/engines.js | 4 +- 2 files changed, 71 insertions(+), 5 deletions(-) diff --git a/integration-tests/__tests__/alter-table.spec.js b/integration-tests/__tests__/alter-table.spec.js index 65e1b2d3f..21e0e4310 100644 --- a/integration-tests/__tests__/alter-table.spec.js +++ b/integration-tests/__tests__/alter-table.spec.js @@ -25,6 +25,13 @@ function pickImportantTableInfo(engine, table) { .map(props => _.omitBy(props, (v, k) => k == 'defaultValue' && v == 'NULL' && engine.setNullDefaultInsteadOfDrop) ), + foreignKeys: table.foreignKeys + .sort((a, b) => a.refTableName.localeCompare(b.refTableName)) + .map(fk => ({ + constraintType: fk.constraintType, + refTableName: fk.refTableName, + columns: fk.columns.map(col => ({ columnName: col.columnName, refColumnName: col.refColumnName })), + })), }; } @@ -33,7 +40,7 @@ function checkTableStructure(engine, t1, t2) { expect(pickImportantTableInfo(engine, t1)).toEqual(pickImportantTableInfo(engine, t2)); } -async function testTableDiff(engine, conn, driver, mangle) { +async function testTableDiff(engine, conn, driver, mangle, changedTable = 't1') { const initQuery = formatQueryWithoutParams(driver, `create table ~t0 (~id int not null primary key)`); await driver.query(conn, transformSqlForEngine(engine, initQuery)); @@ -68,8 +75,20 @@ async function testTableDiff(engine, conn, driver, mangle) { await driver.query(conn, transformSqlForEngine(engine, query)); } - const tget = x => x.tables.find(y => y.pureName == 't1'); - const structure1 = generateDbPairingId(extendDatabaseInfo(await driver.analyseFull(conn))); + if (!engine.skipReferences) { + const query = formatQueryWithoutParams( + driver, + `create table ~t3 (~id int not null primary key, ~fkval int ${ + driver.dialect.implicitNullDeclaration ? '' : 'null' + })` + ); + + await driver.query(conn, transformSqlForEngine(engine, query)); + } + + const tget = x => x.tables.find(y => y.pureName == changedTable); + const structure1Source = await driver.analyseFull(conn); + const structure1 = generateDbPairingId(extendDatabaseInfo(structure1Source)); let structure2 = _.cloneDeep(structure1); mangle(tget(structure2)); structure2 = extendDatabaseInfo(structure2); @@ -79,6 +98,11 @@ async function testTableDiff(engine, conn, driver, mangle) { await driver.script(conn, sql); + if (!engine.skipIncrementalAnalysis) { + const structure2RealIncremental = await driver.analyseIncremental(conn, structure1Source); + checkTableStructure(engine, tget(structure2RealIncremental), tget(structure2)); + } + const structure2Real = extendDatabaseInfo(await driver.analyseFull(conn)); checkTableStructure(engine, tget(structure2Real), tget(structure2)); @@ -214,6 +238,48 @@ describe('Alter table', () => { }) ); + test.each(engines.filter(x => !x.skipReferences).map(engine => [engine.label, engine]))( + 'Drop FK - %s', + testWrapper(async (conn, driver, engine) => { + await testTableDiff( + engine, + conn, + driver, + tbl => { + tbl.foreignKeys = []; + }, + 't2' + ); + }) + ); + + test.each(engines.filter(x => !x.skipReferences).map(engine => [engine.label, engine]))( + 'Create FK - %s', + testWrapper(async (conn, driver, engine) => { + await testTableDiff( + engine, + conn, + driver, + tbl => { + tbl.foreignKeys = [ + { + constraintType: 'foreignKey', + pureName: 't2', + refTableName: 't1', + columns: [ + { + columnName: 'fkval', + refColumnName: 'col_ref', + }, + ], + }, + ]; + }, + 't3' + ); + }) + ); + // test.each(engines.map(engine => [engine.label, engine]))( // 'Change autoincrement - %s', // testWrapper(async (conn, driver, engine) => { diff --git a/integration-tests/engines.js b/integration-tests/engines.js index 99b1308ea..94700af94 100644 --- a/integration-tests/engines.js +++ b/integration-tests/engines.js @@ -759,9 +759,9 @@ const enginesOnLocal = [ // cassandraEngine, //mysqlEngine, // mariaDbEngine, - //postgreSqlEngine, + postgreSqlEngine, //sqlServerEngine, - sqliteEngine, + // sqliteEngine, // cockroachDbEngine, // clickhouseEngine, // libsqlFileEngine,