From aeb318aeaacbc471690d116bf127a059512f21f9 Mon Sep 17 00:00:00 2001 From: Shahar Hadas Date: Sat, 27 Jun 2020 07:57:13 +0300 Subject: [PATCH] fix(mssql): insert/upsert operations do not return all fields (#12433) --- lib/dialects/mssql/query.js | 13 +++++++++++++ test/integration/model/create.test.js | 17 +++++++++++++++++ test/integration/model/upsert.test.js | 20 ++++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/lib/dialects/mssql/query.js b/lib/dialects/mssql/query.js index 81cb22dddaf4..e95aac6f6f66 100644 --- a/lib/dialects/mssql/query.js +++ b/lib/dialects/mssql/query.js @@ -380,6 +380,19 @@ class Query extends AbstractQuery { id = id || autoIncrementAttributeAlias && results && results[0][autoIncrementAttributeAlias]; this.instance[autoIncrementAttribute] = id; + + if (this.instance.dataValues) { + for (const key in results[0]) { + if (Object.prototype.hasOwnProperty.call(results[0], key)) { + const record = results[0][key]; + + const attr = _.find(this.model.rawAttributes, attribute => attribute.fieldName === key || attribute.field === key); + + this.instance.dataValues[attr && attr.fieldName || key] = record; + } + } + } + } } } diff --git a/test/integration/model/create.test.js b/test/integration/model/create.test.js index 81ded27d43a9..ee7007f116e3 100644 --- a/test/integration/model/create.test.js +++ b/test/integration/model/create.test.js @@ -1420,4 +1420,21 @@ describe(Support.getTestDialectTeaser('Model'), () => { expect(spy.called).to.be.ok; }); + + if (current.dialect.supports.returnValues) { + it('should return default value set by the database (create)', async function() { + + const User = this.sequelize.define('User', { + name: DataTypes.STRING, + code: { type: Sequelize.INTEGER, defaultValue: Sequelize.literal(2020) } + }); + + await User.sync({ force: true }); + + const user = await User.create({ name: 'FooBar' }); + + expect(user.name).to.be.equal('FooBar'); + expect(user.code).to.be.equal(2020); + }); + } }); diff --git a/test/integration/model/upsert.test.js b/test/integration/model/upsert.test.js index 2f22c0dee1f9..7187b5f7aaf9 100644 --- a/test/integration/model/upsert.test.js +++ b/test/integration/model/upsert.test.js @@ -577,6 +577,26 @@ describe(Support.getTestDialectTeaser('Model'), () => { } }); }); + + it('should return default value set by the database (upsert)', async function() { + const User = this.sequelize.define('User', { + name: { type: DataTypes.STRING, primaryKey: true }, + code: { type: Sequelize.INTEGER, defaultValue: Sequelize.literal(2020) } + }); + + await User.sync({ force: true }); + + const [user, created] = await User.upsert({ name: 'Test default value' }, { returning: true }); + + expect(user.name).to.be.equal('Test default value'); + expect(user.code).to.be.equal(2020); + + if (dialect === 'sqlite' || dialect === 'postgres') { + expect(created).to.be.null; + } else { + expect(created).to.be.true; + } + }); } }); }