From 8d8361337d830f09a1f77a5d91adf64188a78189 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Fri, 6 Nov 2020 09:47:25 -0800 Subject: [PATCH] Group clauses for AND/OR conditions This is required to preserve the order of conditions Signed-off-by: Raymond Feng --- lib/sql.js | 2 +- test/sql.test.js | 21 ++++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/sql.js b/lib/sql.js index 80856d4..4d97a2f 100644 --- a/lib/sql.js +++ b/lib/sql.js @@ -1049,7 +1049,7 @@ SQLConnector.prototype._buildWhere = function(model, where) { } } stmt.merge({ - sql: branches.join(' ' + key.toUpperCase() + ' '), + sql: '(' + branches.join(' ' + key.toUpperCase() + ' ') + ')', params: branchParams, }); whereStmts.push(stmt); diff --git a/test/sql.test.js b/test/sql.test.js index f8a31af..87ea438 100644 --- a/test/sql.test.js +++ b/test/sql.test.js @@ -148,7 +148,7 @@ describe('sql connector', function() { const where = connector.buildWhere('customer', {or: [{name: 'John'}, {name: 'Mary'}]}); expect(where.toJSON()).to.eql({ - sql: 'WHERE (`NAME`=?) OR (`NAME`=?)', + sql: 'WHERE ((`NAME`=?) OR (`NAME`=?))', params: ['John', 'Mary'], }); }); @@ -157,7 +157,7 @@ describe('sql connector', function() { const where = connector.buildWhere('customer', {and: [{name: 'John'}, {vip: true}]}); expect(where.toJSON()).to.eql({ - sql: 'WHERE (`NAME`=?) AND (`VIP`=?)', + sql: 'WHERE ((`NAME`=?) AND (`VIP`=?))', params: ['John', true], }); }); @@ -238,7 +238,7 @@ describe('sql connector', function() { const where = connector.buildWhere('customer', {and: [{name: 'John'}, {or: [{vip: true}, {address: null}]}]}); expect(where.toJSON()).to.eql({ - sql: 'WHERE (`NAME`=?) AND ((`VIP`=?) OR (`ADDRESS` IS NULL))', + sql: 'WHERE ((`NAME`=?) AND (((`VIP`=?) OR (`ADDRESS` IS NULL))))', params: ['John', true], }); }); @@ -341,6 +341,21 @@ describe('sql connector', function() { }); it('builds SELECT', function() { + const sql = connector.buildSelect('customer', { + order: 'name', + limit: 5, + where: {or: [{name: 'Top Cat'}, {address: 'Trash can'}], vip: true}, + }); + expect(sql.toJSON()).to.eql({ + sql: + 'SELECT `NAME`,`middle_name`,`LASTNAME`,`VIP`,`primary_address`,' + + '`ADDRESS` FROM `CUSTOMER` WHERE ((`NAME`=$1) OR (`ADDRESS`=$2)) ' + + 'AND `VIP`=$3 ORDER BY `NAME` LIMIT 5', + params: ['Top Cat', 'Trash can', true], + }); + }); + + it('builds SELECT with where', function() { const sql = connector.buildSelect('customer', {order: 'name', limit: 5, where: {name: 'John'}}); expect(sql.toJSON()).to.eql({