From 1df1edc8a36a041a904447f28f06e9f6bbef7ffe Mon Sep 17 00:00:00 2001 From: kmr-rohit Date: Tue, 2 Jul 2024 07:17:25 +0530 Subject: [PATCH] fix insertion of empty objects with union all statements --- src/38query.js | 12 ++++++++++-- test/test1684.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 test/test1684.js diff --git a/src/38query.js b/src/38query.js index d3acdf4784..81de5bf31d 100755 --- a/src/38query.js +++ b/src/38query.js @@ -167,8 +167,16 @@ function queryfn3(query) { ilen = nd.data.length; for (var i = 0; i < ilen; i++) { var r = {}; - for (var j = Math.min(query.columns.length, nd.columns.length) - 1; 0 <= j; j--) { - r[query.columns[j].columnid] = nd.data[i][nd.columns[j].columnid]; + if (query.columns.length) { + jlen = Math.min(query.columns.length, nd.columns.length); + for (var j = 0; j < jlen; j++) { + r[query.columns[j].columnid] = nd.data[i][nd.columns[j].columnid]; + } + } else { + jlen = nd.columns.length; + for (var j = 0; j < jlen; j++) { + r[nd.columns[j].columnid] = nd.data[i][nd.columns[j].columnid]; + } } ud.push(r); } diff --git a/test/test1684.js b/test/test1684.js new file mode 100644 index 0000000000..96e4b5d488 --- /dev/null +++ b/test/test1684.js @@ -0,0 +1,31 @@ +if (typeof exports === 'object') { + var assert = require('assert'); + var alasql = require('..'); +} else { + __dirname = '.'; +} + +describe('Test 1684 - UNION ALL still not returning correct results bug', function () { + it('1. should not insert empty objects in results when using UNION ALL Expression', function (done) { + var data = [ + { "city": "Madrid", "population": 3041579 }, + { "city": "Rome", "population": 2863223 }, + { "city": "Paris", "population": 2249975 } + ] + var sql = "SELECT city FROM :data WHERE city = 'Madrid' \ + UNION ALL SELECT city FROM :data WHERE city = 'Rome' \ + UNION ALL SELECT city FROM :data WHERE city = 'Paris' \ + " + var res = alasql(sql, { data }); + assert.deepEqual(res, [{ city: 'Madrid' }, { city: 'Rome' }, { city: 'Paris' }]); + + var sql = "SELECT * FROM :data WHERE city = 'Madrid' \ + UNION ALL SELECT * FROM :data WHERE city = 'Rome' \ + UNION ALL SELECT * FROM :data WHERE city = 'Paris' \ + " + var res = alasql(sql, { data }); + assert.deepEqual(res, [{ city: 'Madrid', population: 3041579 }, { city: 'Rome', population: 2863223 }, { city: 'Paris', population: 2249975 }]); + + done(); + }); +});