diff --git a/package.json b/package.json index 5aaa5c6..d9f4432 100644 --- a/package.json +++ b/package.json @@ -92,5 +92,5 @@ "test": "mocha --bail --timeout 60000 --slow 5000" }, "types": "index.d.ts", - "version": "2.0.1" + "version": "2.0.2" } diff --git a/test/cert/server.crt b/test/cert/server.crt index 91229ff..613d84e 100644 --- a/test/cert/server.crt +++ b/test/cert/server.crt @@ -1,18 +1,23 @@ -----BEGIN CERTIFICATE----- -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 +vypgPujlakjsqPUbsl0CU0ibHQ== -----END CERTIFICATE----- diff --git a/test/cert/server.key b/test/cert/server.key index f9beb5a..997a509 100644 --- a/test/cert/server.key +++ b/test/cert/server.key @@ -1,28 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCcAoP95PPsROYI -8jnik7IXo+5/HXor3NrkcO/JawCJ1Kx54vdG54hdKkaBp9F6SO2gZPRDhi/jG1NR -+vMW4YbL4HMxDfaOW7Y60q2ontC0IQowolxR+HYBZDBzydBcnXlGTq895zt7nYNg -esJ6zI0tnnniA3lYLKq0nQEPpPXPgcgVILD75uMwj/Ixh0fy3rsVTiIauUuKGMRX -pKBHdW2h7my9LRox4H77w4cfQrNLBvWGM7fgZkvcYOzC1hj0u87oHv1SSI7Q6wYP -Q7MN5pz1u1oD9VEJdKftJzFaJ9R8cmkiiIy1V5y4+64eMIQjUMcT1zcanKzQ7pLu -8wBz0EvhAgMBAAECggEAExnbv0JA+zSUVZQSskMTEwHnOXkKdEReKIoLUcXgEwAO -/f1j+TJv57g9WbKKW0aCkZjKr1nGky/NS8RF7w89ych5UhA7l8Jy1VDmIjcPpn5F -GR9H3mFlUVZK+GJFOJGvP4RywEmHZuMqKq3dEdvpjSRSF/IE8V7Gp8ZxUtEHp5gz -TumtkjWVSifCenBQdtwylQCotzcBDijFzq7ZdHUuXNSCDhHCXleWmqyUkQqBIXhR -AO81jSazgCRXwohLeX7l+4fTV6kVFhkZFCqHTMX8F7wbRrli/0rSKigIPL8Hf92l -yMem4wAB4yAreMxiLvZVYcT5fBmf+ncXHD8QwXMAAQKBgQDJX5qpBPTLPtdHQ2TI -YW328dZav3uc/Yyn5ZPSKmqRahz4MkXexGiVZRK7DFWeZRgzajEYHTF0LTtzDOAP -sXWo1mv0KAdepxZU2umSzqiaZFbuqKK1HVvKrJ1/gnNrUxglfepbUOHvbdIZQ8SD -uoos0lJKkN2P4I9zHlXa06GkAQKBgQDGVKF0D1j4DFwgAzrofuo2MKL8cvyWpcHW -yLJdMcKJ9+sDpZTHCZv/d3NPVxpxrTl2hSj1IHyK5ULUnC5AVhXtEwujV8zns/hz -hmwjE68NGvUKiFmzYdRqPOT+AVTRVRazvbZzadrZWWPR0sT7tVRfzdKqp0EnBJCW -5yH25sMn4QKBgQCalG0gudFAA6k15yICP+gt3E7zsnGtfWTvrWffuPe9UHuUeuLv -sk2mAMR0GW/P+0KslSPCowZHbEFqe8OzyEHNrWuJLQEbQ5/8217ZdxIuEkA5S/I6 -naLM3dy4+OaoyEyM2y9/kYMeTGsvQbokdJmE9p585t9thrAXan31UOeQAQKBgAKN -3HZuLCslnZob8IpF+CYygibWJEKcZ96oPwPMPEEinDgzzbKygPvNQgLnkEOeg3rv -RBPEE1aGlVG/oSja8vVWpXO5Eb56Jtz2AjaBbmOw0S8Ninow7Fdh6WEMC1eWzPAL -pWnfFx5tdEejez3ym9+P+wKPnNsvx9zppRpU5naBAoGAaIvKSp4yaiHybrYMGObq -Sr7cOC7G1KwBwwE0WuRM8hu1zJXL8LSPP1ivS2NanjF/cS/bkp/XfOMDz/97hmp6 -005iYp8EBmRCrn1AhANJWT4onv5ey9slPsCxf7VfXjamI8phAL90HvYvQdxHuwa9 -MAGYdH/KB1lZQa6qp+pmiV4= +MIIEuwIBADANBgkqhkiG9w0BAQEFAASCBKUwggShAgEAAoIBAQCtnQ64A8UVUzl4 +61WLtLCKjDxDEFDsOzzNReEFv8MVKyowlIJvaPw1GZTPuQ1pmcII8q8L5hDWzPHo +VQJdnY5W33XupUBnC2MT+TsmuoxfI+mboN6BhqbDBQSewT/+ZEaLZ6JrTAJGcK8x +sRxhVUl3hhCTqivgS0rr4tBfbQHHj+mtUPpVLXhlCYaceuIlFrge63gg292va8tP +Gf0mixnIbRiDzq3XZPEJudPg98ZzIgz4m7n1e41AT3AuXNk/LWjE+CTu6lkwJGXJ +EBxBEkQ4YsZyWY8P9vq00gjfsKEHqqi4W/KmNmaLGLOcDIkHfjFfnhwVHmOvxmXL +fX4k4jLFAgMBAAECgf9QBhTCvPoa2kGjetXzj1XQhtNAFkU2nhdohs0x2TISj9Li +kZGNyNZ3o1L0bFfCVR0bAsGsul8Io27dqFFu1TDG2jmBxqno1VbV3gtlzpblQ6hq +E7x795TmT2nRw0G8AHyDxUEYM/DYhxg5z2lFdAppDWKWrdmLiSj/kYx6b8RiNzCU +6sFrYAyAkF0a9zMhJlypUIO+Oi0Oezwa8tL7UYSYK6+p6tm+060Yn3TEoAwmn3xd +gS68sdBcVEiQ+rgwh7MPQD8vRFo+QdDc1Bso9T6/8PeK/cssGLZKiWOxO+CEnc1d +lu4yYtkvz291FPqLS04AteDS2VScvZ1BQpE9+4ECgYEA439jaSaLcye7ujEHlwoN +X0h1MmlIJ7rvHFW3Xtbl8uxZo15fn528cOGioQrmbelW6+RTgnj3n/uio9QG1ZyB +MLYY8wXHq0j4zPklTUt59oi7j9FKTDhsaBNAvHFVlejXzaKrVJ4UiUcxks0m3FUM +DMXdxfv7iE2YM3J7shxVJ/UCgYEAw11s1eA/YJ/FaVc14sN/mlT+kYY9G04t8yAJ +0oe+GggkNGu3s9aPuLr3oKHS1K9jyCfUC5J6DbDWymjzxFqJv3TyDkD4SytFgLAl +c92XbLFrFQlJG2+k242AorbEHQO4IIwpd3HAI52XrT6WoH3JQCjnpTXudGq0NrI6 +luBOrZECgYAg14INawAUprbGIU/cMRpPGBG7LlG5UpY0O/eV3GYj1JT4LaaWT1ol +3ZzxrLYpRddDhJm9qyLsWJJZHkHCUq6fzpn5c2sowgcQ6CLHbs7zlTemgms8Z6TW +vXjJ+36EfrGwwPwE4jFKxBlW/QDQLALqUSI7862TNshzHOLYipiMhQKBgFcz63Go +EAIMLuzvTZEznFCCIcNJPRtkESSVp2y+xH8QJUD01+HBIxPc+M1NjjL7OrnL9V1Y ++3wC9E0S/cQmeZfpFmaAX5QF85cWiREn1wBgTSDtrSE++0I47jMzC2S8FUMJ7TRw +pMgA/wQIjOmEXAF0gLmA0jhKrLhBY9+WrefRAoGBAKMn2FaNoa1qYXPFblPnu7Cy +eXY84lPwMPlFXH2rsBbfCe2DzJ3hRdPNP+EwkfcnxDp6tOLzaDXZlYMTOgdRtAUa +9n7rNwFrmKkzvYCKz0Xjxky2rGuq7sLp/1KWBVG3GRlSrenjTEJToQjYJJ5ySKMW +WkN4m2opC8z7GxpjJvRO -----END PRIVATE KEY----- diff --git a/test/test.js b/test/test.js index 2e1d872..0335e20 100644 --- a/test/test.js +++ b/test/test.js @@ -158,7 +158,6 @@ describe('Select', () => { }); } - it('select with external', async () => { const result = await clickhouse.query( 'SELECT count(*) AS count FROM temp_table', @@ -178,6 +177,36 @@ describe('Select', () => { expect(result[0].count).to.be(rowCount); }); + it('select with external && join', async () => { + const result = await clickhouse.query( + ` + SELECT + * + FROM system.numbers AS i + LEFT JOIN ( + SELECT + number + FROM system.numbers + WHERE number IN temp_table + LIMIT 10 + ) AS n ON(n.number = i.number) + LIMIT 100 + `, + { + external: [ + { + name: 'temp_table', + data: _.range(0, 10), + structure: 'i UInt64' + }, + ] + } + ).toPromise(); + + expect(result).to.be.ok(); + expect(result).to.have.length(100); + }); + it('catch error', async () => { try { await clickhouse.query(sql + '1').toPromise(); @@ -271,6 +300,8 @@ describe('session', () => { }); // You can use all settings from request library (https://github.com/request/request#tlsssl-protocol) +// Generate ssl file with: +// sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout test/cert/server.key -out test/cert/server.crt describe('TLS/SSL Protocol', () => { it('use TLS/SSL Protocol', async () => { let server = null; @@ -631,37 +662,6 @@ describe('Exec system queries', () => { }); }); - -describe('Abort query', () => { - it('exec & abort', cb => { - const $q = clickhouse.query(`SELECT number FROM system.numbers LIMIT ${rowCount}`); - - let i = 0, - error = null; - - const stream = $q.stream() - .on('data', () => { - ++i; - - if (i > minRnd) { - stream.pause(); - } - }) - .on('error', err => error = err) - .on('close', () => { - expect(error).to.not.be.ok(); - expect(i).to.be.below(rowCount); - - cb(); - }) - .on('end', () => { - cb(new Error('no way!')); - }); - - setTimeout(() => $q.destroy(), 10 * 1000); - }); -}); - describe('Select and WITH TOTALS statement', () => { [false, true].forEach(withTotals => { it(`is ${withTotals}`, async () => { @@ -690,6 +690,59 @@ describe('Select and WITH TOTALS statement', () => { expect(result).to.have.key('statistics'); }); }); + + it('WITH TOTALS #2', async () => { + const result = await clickhouse.query(` + SELECT + rowNumberInAllBlocks() AS i, + SUM(number) + FROM ( + SELECT + number + FROM + system.numbers + LIMIT 1000 + ) + GROUP BY i WITH TOTALS LIMIT 10 + `).toPromise(); + + expect(result).to.have.key('meta'); + expect(result).to.have.key('data'); + expect(result).to.have.key('totals'); + expect(result).to.have.key('rows'); + expect(result).to.have.key('statistics'); + }) +}); + +describe('Abort query', () => { + it('exec & abort', cb => { + const $q = clickhouse.query(`SELECT number FROM system.numbers LIMIT ${rowCount}`); + + let i = 0, + error = null; + + const stream = $q.stream() + .on('data', () => { + ++i; + + if (i > minRnd) { + stream.pause(); + } + }) + .on('error', err => error = err) + .on('close', () => { + expect(error).to.not.be.ok(); + expect(i).to.be.below(rowCount); + + // Take some time for waiting of cancel query + setTimeout(() => cb(), 4 * 1000); + }) + .on('end', () => { + cb(new Error('no way!')); + }); + + setTimeout(() => $q.destroy(), 10 * 1000); + }); }); after(async () => {