From 0b453564567074fc3e00ba1a6c9ac1c1c1f49fe7 Mon Sep 17 00:00:00 2001 From: wubzz Date: Fri, 1 Apr 2016 23:28:15 +0200 Subject: [PATCH 1/2] .renameColumn should not drop defaultValue or nullable state. Currently this happens for mysql. Fixes #933 --- src/dialects/mysql/schema/tablecompiler.js | 11 ++++++++- test/integration/schema/index.js | 27 ++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/dialects/mysql/schema/tablecompiler.js b/src/dialects/mysql/schema/tablecompiler.js index ee97a72a..f1934e4b 100644 --- a/src/dialects/mysql/schema/tablecompiler.js +++ b/src/dialects/mysql/schema/tablecompiler.js @@ -77,8 +77,17 @@ assign(TableCompiler_MySQL.prototype, { if (!refs.length) { return; } return compiler.dropFKRefs(runner, refs); }).then(function () { + let sql = `alter table ${table} change ${wrapped} ${column.Type}`; + + if(String(column.Null).toUpperCase() !== 'YES') { + sql += ` NOT NULL` + } + if(column.Default !== void 0 && column.Default !== null) { + sql += ` DEFAULT '${column.Default}'` + } + return runner.query({ - sql: 'alter table ' + table + ' change ' + wrapped + ' ' + column.Type + sql: sql }); }).then(function () { if (!refs.length) { return; } diff --git a/test/integration/schema/index.js b/test/integration/schema/index.js index 1645fec9..d947d58a 100644 --- a/test/integration/schema/index.js +++ b/test/integration/schema/index.js @@ -438,6 +438,33 @@ module.exports = function(knex) { tbl.renameColumn('id', 'id_new'); }); }); + + it('#933 - .renameColumn should not drop null or default value', function() { + return knex.transaction((tr) => { + let getColInfo = () => tr('renameColTest').columnInfo(); + return tr.schema.dropTableIfExists('renameColTest') + .createTable('renameColTest', (table) => { + table.integer('colnameint').defaultTo(1); + table.string('colnamestring').defaultTo('knex').notNullable(); + }) + .then(getColInfo) + .then((colInfo) => { + expect(String(colInfo.colnameint.defaultValue)).to.contain('1'); + expect(colInfo.colnamestring.defaultValue).to.contain('knex'); //Using contain because of different response per dialect. IE mysql 'knex', postgres 'knex::character varying' + expect(colInfo.colnamestring.nullable).to.equal(false); + return tr.schema.table('renameColTest', (table) => { + table.renameColumn('colnameint', 'colnameintchanged'); + table.renameColumn('colnamestring', 'colnamestringchanged'); + }) + }) + .then(getColInfo) + .then((columnInfo) => { + expect(String(columnInfo.colnameintchanged.defaultValue)).to.contain('1'); + expect(columnInfo.colnamestringchanged.defaultValue).to.contain('knex'); + expect(columnInfo.colnamestringchanged.nullable).to.equal(false); + }); + }); + }); }); }); From d3b1fcc4b8ac56059dc5d4f272d6fb2af2917a14 Mon Sep 17 00:00:00 2001 From: wubzz Date: Fri, 1 Apr 2016 23:39:04 +0200 Subject: [PATCH 2/2] Fixed test, forgot ES6 is not supported in the test suite. --- test/integration/schema/index.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/integration/schema/index.js b/test/integration/schema/index.js index d947d58a..92016f1d 100644 --- a/test/integration/schema/index.js +++ b/test/integration/schema/index.js @@ -440,25 +440,25 @@ module.exports = function(knex) { }); it('#933 - .renameColumn should not drop null or default value', function() { - return knex.transaction((tr) => { - let getColInfo = () => tr('renameColTest').columnInfo(); + return knex.transaction(function (tr) { + var getColInfo = function() { return tr('renameColTest').columnInfo()}; return tr.schema.dropTableIfExists('renameColTest') - .createTable('renameColTest', (table) => { + .createTable('renameColTest', function (table) { table.integer('colnameint').defaultTo(1); table.string('colnamestring').defaultTo('knex').notNullable(); }) .then(getColInfo) - .then((colInfo) => { + .then(function (colInfo) { expect(String(colInfo.colnameint.defaultValue)).to.contain('1'); expect(colInfo.colnamestring.defaultValue).to.contain('knex'); //Using contain because of different response per dialect. IE mysql 'knex', postgres 'knex::character varying' expect(colInfo.colnamestring.nullable).to.equal(false); - return tr.schema.table('renameColTest', (table) => { + return tr.schema.table('renameColTest', function (table) { table.renameColumn('colnameint', 'colnameintchanged'); table.renameColumn('colnamestring', 'colnamestringchanged'); }) }) .then(getColInfo) - .then((columnInfo) => { + .then(function (columnInfo) { expect(String(columnInfo.colnameintchanged.defaultValue)).to.contain('1'); expect(columnInfo.colnamestringchanged.defaultValue).to.contain('knex'); expect(columnInfo.colnamestringchanged.nullable).to.equal(false);