diff --git a/integration-tests/__tests__/alter-table.spec.js b/integration-tests/__tests__/alter-table.spec.js index afe1c9a61..5687cc612 100644 --- a/integration-tests/__tests__/alter-table.spec.js +++ b/integration-tests/__tests__/alter-table.spec.js @@ -4,7 +4,12 @@ const fp = require('lodash/fp'); const { testWrapper } = require('../tools'); const engines = require('../engines'); const crypto = require('crypto'); -const { getAlterTableScript, extendDatabaseInfo, generateDbPairingId } = require('dbgate-tools'); +const { + getAlterTableScript, + extendDatabaseInfo, + generateDbPairingId, + formatQueryWithoutParams, +} = require('dbgate-tools'); function pickImportantTableInfo(engine, table) { const props = ['columnName', 'defaultValue']; @@ -15,7 +20,10 @@ function pickImportantTableInfo(engine, table) { columns: table.columns .filter(x => x.columnName != 'rowid') .map(fp.pick(props)) - .map(props => _.omitBy(props, x => x == null)), + .map(props => _.omitBy(props, x => x == null)) + .map(props => + _.omitBy(props, (v, k) => k == 'defaultValue' && v == 'NULL' && engine.setNullDefaultInsteadOfDrop) + ), }; } @@ -25,27 +33,36 @@ function checkTableStructure(engine, t1, t2) { } async function testTableDiff(engine, conn, driver, mangle) { - await driver.query(conn, `create table t0 (id int not null primary key)`); + await driver.query(conn, formatQueryWithoutParams(driver, `create table ~t0 (~id int not null primary key)`)); await driver.query( conn, - `create table t1 ( - col_pk int not null primary key, - col_std int, - col_def int default 12, - ${engine.skipReferences ? '' : 'col_fk int references t0(id),'} - col_idx int, - col_uq int ${engine.skipUnique ? '' : 'unique'} , - col_ref int ${engine.skipUnique ? '' : 'unique'} + formatQueryWithoutParams( + driver, + `create table ~t1 ( + ~col_pk int not null primary key, + ~col_std int, + ~col_def int default 12, + ${engine.skipReferences ? '' : '~col_fk int references ~t0(~id),'} + ~col_idx int, + ~col_uq int ${engine.skipUnique ? '' : 'unique'} , + ~col_ref int ${engine.skipUnique ? '' : 'unique'} )` + ) ); if (!engine.skipIndexes) { - await driver.query(conn, `create index idx1 on t1(col_idx)`); + await driver.query(conn, formatQueryWithoutParams(driver, `create index ~idx1 on ~t1(~col_idx)`)); } if (!engine.skipReferences) { - await driver.query(conn, `create table t2 (id int not null primary key, fkval int null references t1(col_ref))`); + await driver.query( + conn, + formatQueryWithoutParams( + driver, + `create table ~t2 (~id int not null primary key, ~fkval int null references ~t1(~col_ref))` + ) + ); } const tget = x => x.tables.find(y => y.pureName == 't1'); @@ -175,5 +192,4 @@ describe('Alter table', () => { // }); // }) // ); - }); diff --git a/integration-tests/engines.js b/integration-tests/engines.js index b1174f11e..ca52d1707 100644 --- a/integration-tests/engines.js +++ b/integration-tests/engines.js @@ -416,6 +416,7 @@ end;$$`, }, skipOnCI: true, dbSnapshotBySeconds: true, + setNullDefaultInsteadOfDrop: true, }, ]; diff --git a/plugins/dbgate-plugin-oracle/src/frontend/Dumper.js b/plugins/dbgate-plugin-oracle/src/frontend/Dumper.js index cbe0becdd..392e9b712 100644 --- a/plugins/dbgate-plugin-oracle/src/frontend/Dumper.js +++ b/plugins/dbgate-plugin-oracle/src/frontend/Dumper.js @@ -60,9 +60,9 @@ class Dumper extends SqlDumper { // this.putCmd('^alter ^table %f ^rename ^to %i', obj, newname); // } - // renameColumn(column, newcol) { - // this.putCmd('^alter ^table %f ^rename ^column %i ^to %i', column, column.columnName, newcol); - // } + renameColumn(column, newcol) { + this.putCmd('^alter ^table %f ^rename ^column %i ^to %i', column, column.columnName, newcol); + } // dropTable(obj, options = {}) { // this.put('^drop ^table'); @@ -87,30 +87,46 @@ class Dumper extends SqlDumper { // super.columnDefinition(col, options); // } - // changeColumn(oldcol, newcol, constraints) { - // if (oldcol.columnName != newcol.columnName) { - // this.putCmd('^alter ^table %f ^rename ^column %i ^to %i', oldcol, oldcol.columnName, newcol.columnName); - // } - // if (!testEqualTypes(oldcol, newcol)) { - // this.putCmd('^alter ^table %f ^alter ^column %i ^type %s', oldcol, newcol.columnName, newcol.dataType); - // } - // if (oldcol.notNull != newcol.notNull) { - // if (newcol.notNull) this.putCmd('^alter ^table %f ^alter ^column %i ^set ^not ^null', newcol, newcol.columnName); - // else this.putCmd('^alter ^table %f ^alter ^column %i ^drop ^not ^null', newcol, newcol.columnName); - // } - // if (oldcol.defaultValue != newcol.defaultValue) { - // if (newcol.defaultValue == null) { - // this.putCmd('^alter ^table %f ^alter ^column %i ^drop ^default', newcol, newcol.columnName); - // } else { - // this.putCmd( - // '^alter ^table %f ^alter ^column %i ^set ^default %s', - // newcol, - // newcol.columnName, - // newcol.defaultValue - // ); - // } - // } - // } + changeColumn(oldcol, newcol, constraints) { + if (oldcol.columnName != newcol.columnName) { + this.putCmd('^alter ^table %f ^rename ^column %i ^to %i', oldcol, oldcol.columnName, newcol.columnName); + } + + if (!testEqualTypes(oldcol, newcol) || oldcol.notNull != newcol.notNull) { + this.putCmd( + '^alter ^table %f ^modify (%i %s %k)', + newcol, + newcol.columnName, + newcol.dataType, + newcol.notNull ? 'not null' : 'null' + ); + } + + if (oldcol.defaultValue != newcol.defaultValue) { + if (newcol.defaultValue?.trim()) { + this.putCmd('^alter ^table %f ^modify (%i ^default %s)', newcol, newcol.columnName, newcol.defaultValue); + } else { + this.putCmd('^alter ^table %f ^modify (%i ^default ^null)', newcol, newcol.columnName); + } + } + + // if (oldcol.notNull != newcol.notNull) { + // if (newcol.notNull) this.putCmd('^alter ^table %f ^alter ^column %i ^set ^not ^null', newcol, newcol.columnName); + // else this.putCmd('^alter ^table %f ^alter ^column %i ^drop ^not ^null', newcol, newcol.columnName); + // } + // if (oldcol.defaultValue != newcol.defaultValue) { + // if (newcol.defaultValue == null) { + // this.putCmd('^alter ^table %f ^alter ^column %i ^drop ^default', newcol, newcol.columnName); + // } else { + // this.putCmd( + // '^alter ^table %f ^alter ^column %i ^set ^default %s', + // newcol, + // newcol.columnName, + // newcol.defaultValue + // ); + // } + // } + } // putValue(value) { // if (value === true) this.putRaw('true');