From 8d1a7832d2ff19c5364ce64addc3a9d48f3d4b78 Mon Sep 17 00:00:00 2001 From: wubzz Date: Fri, 1 Apr 2016 23:28:15 +0200 Subject: [PATCH] .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 ee97a72afc..f1934e4b7d 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 1645fec947..27cd694eb5 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(colInfo.colnameint.defaultValue).to.equal('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(columnInfo.colnameintchanged.defaultValue).to.equal('1'); + expect(columnInfo.colnamestringchanged.defaultValue).to.contain('knex'); + expect(columnInfo.colnamestringchanged.nullable).to.equal(false); + }); + }); + }); }); });