From fe4bc694cfcc72ce32b6ad3a7a4c83d7fcd7446e Mon Sep 17 00:00:00 2001 From: Arthur Schreiber Date: Mon, 20 Sep 2021 21:44:49 +0000 Subject: [PATCH] fix: do not specify `handle` as an output parameter when calling `sp_execute`/`sp_unprepare` This was causing unexpected `returnValue` events. --- src/connection.ts | 4 +- .../prepare-execute-statements-test.js | 46 +++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/connection.ts b/src/connection.ts index 01fca91c5..08fe459fe 100644 --- a/src/connection.ts +++ b/src/connection.ts @@ -3011,7 +3011,7 @@ class Connection extends EventEmitter { name: 'handle', // TODO: Abort if `request.handle` is not set value: request.handle, - output: true, + output: false, length: undefined, precision: undefined, scale: undefined @@ -3037,7 +3037,7 @@ class Connection extends EventEmitter { name: 'handle', // TODO: Abort if `request.handle` is not set value: request.handle, - output: true, + output: false, length: undefined, precision: undefined, scale: undefined diff --git a/test/integration/prepare-execute-statements-test.js b/test/integration/prepare-execute-statements-test.js index 3e9fd3e07..56a55689b 100644 --- a/test/integration/prepare-execute-statements-test.js +++ b/test/integration/prepare-execute-statements-test.js @@ -63,6 +63,52 @@ describe('Prepare Execute Statement', function() { }); }); + it('does not cause unexpected `returnValue` events to be emitted', function(done) { + const config = getConfig(); + + const connection = new Connection(config); + connection.connect(function(err) { + if (err) { + return done(err); + } + + /** + * @type {{ parameterName: string, value: unknown, metadata: import('../../src/metadata-parser').Metadata }[]} + */ + const returnValues = []; + + const request = new Request('select @param', function(err) { + if (err) { + return done(err); + } + + assert.lengthOf(returnValues, 1); + + connection.close(); + }); + request.addParameter('param', TYPES.Int); + + request.on('prepared', function() { + assert.ok(request.handle); + + assert.lengthOf(returnValues, 1); + assert.strictEqual(returnValues[0].parameterName, 'handle'); + + connection.execute(request, { param: 8 }); + }); + + request.on('returnValue', (parameterName, value, metadata) => { + returnValues.push({ parameterName, value, metadata }); + }); + + connection.prepare(request); + }); + + connection.on('end', function() { + done(); + }); + }); + it('does not leak memory via EventEmitter listeners when reusing a request many times', function(done) { const config = getConfig();