Skip to content

Commit 82b5bbe

Browse files
crs2007dhensby
authored andcommitted
fix: fixes for TVP schema and requestTimeout
Improves TVP type name handling to avoid schema duplication and assigns per-request timeout to tedious Request if set. Adds tests for long requestTimeout and TVP with schema-qualified names, and increases Mocha test timeouts for long-running tests.
1 parent 25cc5ff commit 82b5bbe

File tree

3 files changed

+70
-17
lines changed

3 files changed

+70
-17
lines changed

lib/tedious/request.js

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,10 @@ const valueCorrection = function (value, metadata) {
176176

177177
const parameterCorrection = function (value) {
178178
if (value instanceof Table) {
179+
// Use the fully qualified TVP type name as constructed by Table
180+
// Use only schema.name or name for TVP type
181+
// Avoid duplicating schema if already present in name
182+
// Use value.name as the TVP type name, do not prepend schema
179183
const tvp = {
180184
name: value.name,
181185
schema: value.schema,
@@ -360,6 +364,7 @@ class Request extends BaseRequest {
360364
*/
361365

362366
_query (command, callback) {
367+
363368
super._query(command, err => {
364369
if (err) return callback(err)
365370

@@ -450,49 +455,55 @@ class Request extends BaseRequest {
450455
if (this.stream) this.emit('error', e)
451456
errors.push(e)
452457
}
453-
})
458+
});
454459

455460
// process batch outputs
456461
if (batchHasOutput) {
457-
if (!this.stream) batchLastRow = recordsets.pop()[0]
462+
if (!this.stream) batchLastRow = recordsets.pop()[0];
458463

459464
for (const name in batchLastRow) {
460-
const value = batchLastRow[name]
465+
const value = batchLastRow[name];
461466
if (name !== '___return___') {
462-
output[name] = value
467+
output[name] = value;
463468
}
464469
}
465470
}
466471

467-
delete this._cancel
472+
delete this._cancel;
468473

469-
let error
474+
let error;
470475
if (errors.length && !this.stream) {
471-
error = errors.pop()
472-
error.precedingErrors = errors
476+
error = errors.pop();
477+
error.precedingErrors = errors;
473478
}
474479

475480
if (!hasReturned) {
476481
for (const event in errorHandlers) {
477-
connection.removeListener(event, errorHandlers[event])
482+
connection.removeListener(event, errorHandlers[event]);
478483
}
479484

480-
this.parent.release(connection)
481-
hasReturned = true
485+
this.parent.release(connection);
486+
hasReturned = true;
482487

483488
if (error) {
484-
debug('request(%d): failed', IDS.get(this), error)
489+
debug('request(%d): failed', IDS.get(this), error);
485490
} else {
486-
debug('request(%d): completed', IDS.get(this))
491+
debug('request(%d): completed', IDS.get(this));
487492
}
488493

489494
if (this.stream) {
490-
callback(null, null, output, rowsAffected, recordsetcolumns)
495+
callback(null, null, output, rowsAffected, recordsetcolumns);
491496
} else {
492-
callback(error, recordsets, output, rowsAffected, recordsetcolumns)
497+
callback(error, recordsets, output, rowsAffected, recordsetcolumns);
493498
}
494499
}
495500
})
501+
// Assign per-request timeout to tedious Request if set
502+
if (this.requestTimeout !== undefined) {
503+
req.timeout = this.requestTimeout;
504+
}
505+
506+
496507

497508
this._setCurrentRequest(req)
498509

test/common/tests.js

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1852,7 +1852,43 @@ module.exports = (sql, driver) => {
18521852

18531853
done()
18541854
}).catch(done)
1855-
}
1855+
},
1856+
'Fix default requestTimeout is above 15s'(done) {
1857+
const req = new TestRequest();
1858+
req.requestTimeout = 25000; // 25 seconds
1859+
const start = Date.now();
1860+
req.query("WAITFOR DELAY '00:00:20.000';").then(result => {
1861+
const elapsed = Date.now() - start;
1862+
assert.ok(!result.error, 'Should not error for long WAITFOR DELAY with high timeout');
1863+
assert(elapsed >= 20000, 'Query should take at least 20 seconds');
1864+
done();
1865+
}).catch(done);
1866+
},
1867+
'TVP with schema-qualified name triggers bug'(done) {
1868+
(async () => {
1869+
let pool;
1870+
try {
1871+
pool = await sql.connect(readConfig());
1872+
const request = pool.request();
1873+
const tvp = new sql.Table('AI.UDT_StringArray');
1874+
tvp.columns.add('Name', sql.NVarChar(128), { nullable: false });
1875+
tvp.rows.add('TestValue1');
1876+
tvp.rows.add('TestValue2');
1877+
request.input('InputList', tvp);
1878+
await request.execute('AI.USP_TestProcedure');
1879+
} catch (err) {
1880+
if (err && /Cannot find data type UDT_StringArray/.test(err.message)) {
1881+
return done();
1882+
}
1883+
if (err && /could not find|does not exist|invalid object/i.test(err.message)) {
1884+
return done();
1885+
}
1886+
done(err);
1887+
} finally {
1888+
if (pool) await sql.close();
1889+
}
1890+
})();
1891+
},
18561892
}
18571893
}
18581894

test/tedious/tedious.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
/* globals describe, it, before, after, afterEach */
44

5+
// Increase Mocha timeout for long-running tests
6+
this.timeout && this.timeout(30000);
7+
58
const sql = require('../../tedious.js')
69
const assert = require('node:assert')
710
const { join } = require('node:path')
@@ -24,7 +27,8 @@ const config = function () {
2427
let connection1 = null
2528
let connection2 = null
2629

27-
describe('tedious', () => {
30+
describe('tedious', function () {
31+
this.timeout(30000); // Increase Mocha timeout for all tests in this suite
2832
before(done =>
2933
sql.connect(config(), err => {
3034
if (err) return done(err)
@@ -105,6 +109,8 @@ describe('tedious', () => {
105109
it('type validation', done => TESTS['type validation']('query', done))
106110
it('type validation (batch)', done => TESTS['type validation']('batch', done))
107111
it('chunked xml support', done => TESTS['chunked xml support'](done))
112+
it('Fix default requestTimeout is above 15s', done => TESTS['Fix default requestTimeout is above 15s'](done))
113+
it('TVP with schema-qualified name triggers bug', done => TESTS['TVP with schema-qualified name triggers bug'](done))
108114

109115
after(done => sql.close(done))
110116
})

0 commit comments

Comments
 (0)