Skip to content

Commit 4d82907

Browse files
fix(mssql): upsert query with falsey values (#12453) (#12459)
1 parent 9a45509 commit 4d82907

File tree

2 files changed

+53
-1
lines changed

2 files changed

+53
-1
lines changed

lib/dialects/mssql/query-generator.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ class MSSQLQueryGenerator extends AbstractQueryGenerator {
465465
* Exclude NULL Composite PK/UK. Partial Composite clauses should also be excluded as it doesn't guarantee a single row
466466
*/
467467
for (const key in clause) {
468-
if (!clause[key]) {
468+
if (typeof clause[key] === 'undefined' || clause[key] == null) {
469469
valid = false;
470470
break;
471471
}

test/unit/dialects/mssql/query-generator.test.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
const Support = require('../../support');
44
const expectsql = Support.expectsql;
55
const current = Support.sequelize;
6+
const DataTypes = require('../../../../lib/data-types');
7+
const Op = require('../../../../lib/operators');
68
const TableHints = require('../../../../lib/table-hints');
79
const QueryGenerator = require('../../../../lib/dialects/mssql/query-generator');
810

@@ -21,6 +23,56 @@ if (current.dialect.name === 'mssql') {
2123
});
2224
});
2325

26+
it('upsertQuery with falsey values', function() {
27+
const testTable = this.sequelize.define(
28+
'test_table',
29+
{
30+
Name: {
31+
type: DataTypes.STRING,
32+
primaryKey: true
33+
},
34+
Age: {
35+
type: DataTypes.INTEGER
36+
},
37+
IsOnline: {
38+
type: DataTypes.BOOLEAN,
39+
primaryKey: true
40+
}
41+
},
42+
{
43+
freezeTableName: true,
44+
timestamps: false
45+
}
46+
);
47+
48+
const insertValues = {
49+
Name: 'Charlie',
50+
Age: 24,
51+
IsOnline: false
52+
};
53+
54+
const updateValues = {
55+
Age: 24
56+
};
57+
58+
const whereValues = [
59+
{
60+
Name: 'Charlie',
61+
IsOnline: false
62+
}
63+
];
64+
65+
const where = {
66+
[Op.or]: whereValues
67+
};
68+
69+
// the main purpose of this test is to validate this does not throw
70+
expectsql(this.queryGenerator.upsertQuery('test_table', updateValues, insertValues, where, testTable), {
71+
mssql:
72+
"MERGE INTO [test_table] WITH(HOLDLOCK) AS [test_table_target] USING (VALUES(24)) AS [test_table_source]([Age]) ON [test_table_target].[Name] = [test_table_source].[Name] AND [test_table_target].[IsOnline] = [test_table_source].[IsOnline] WHEN MATCHED THEN UPDATE SET [test_table_target].[Name] = N'Charlie', [test_table_target].[Age] = 24, [test_table_target].[IsOnline] = 0 WHEN NOT MATCHED THEN INSERT ([Age]) VALUES(24) OUTPUT $action, INSERTED.*;"
73+
});
74+
});
75+
2476
it('createDatabaseQuery with collate', function() {
2577
expectsql(this.queryGenerator.createDatabaseQuery('myDatabase', { collate: 'Latin1_General_CS_AS_KS_WS' }), {
2678
mssql: "IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'myDatabase' ) BEGIN CREATE DATABASE [myDatabase] COLLATE N'Latin1_General_CS_AS_KS_WS'; END;"

0 commit comments

Comments
 (0)