Skip to content

Commit

Permalink
.renameColumn should not drop defaultValue or nullable state. Current…
Browse files Browse the repository at this point in the history
…ly this happens for mysql. Fixes #933
  • Loading branch information
wubzz committed Apr 1, 2016
1 parent b8c8572 commit 8d1a783
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/dialects/mysql/schema/tablecompiler.js
Expand Up @@ -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; }
Expand Down
27 changes: 27 additions & 0 deletions test/integration/schema/index.js
Expand Up @@ -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);
});
});
});
});

});
Expand Down

0 comments on commit 8d1a783

Please sign in to comment.