Skip to content

Commit

Permalink
Make compiling SQL in error message optional (#5282)
Browse files Browse the repository at this point in the history
  • Loading branch information
JakobJoonas committed Sep 23, 2022
1 parent 82610ca commit f7ccde8
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 4 deletions.
12 changes: 8 additions & 4 deletions lib/execution/internal/query-executioner.js
Expand Up @@ -35,10 +35,14 @@ function enrichQueryObject(connection, queryParam, client) {

function executeQuery(connection, queryObject, client) {
return client._query(connection, queryObject).catch((err) => {
err.message =
formatQuery(queryObject.sql, queryObject.bindings, undefined, client) +
' - ' +
err.message;
if (client.config && client.config.compileSqlOnError === false) {
err.message = queryObject.sql + ' - ' + err.message;
} else {
err.message =
formatQuery(queryObject.sql, queryObject.bindings, undefined, client) +
' - ' +
err.message;
}
client.emit(
'query-error',
err,
Expand Down
38 changes: 38 additions & 0 deletions test/unit/knex.js
Expand Up @@ -753,6 +753,44 @@ describe('knex', () => {
expect(errorArgs.queryContext).to.equal(context);
});

it('should show compiled sql on error message when compileSqlOnError is true', async function () {
const spy = sinon.spy();
const knex = Knex({ ...sqliteConfig, compileSqlOnError: true })
.from('test')
.on('query-error', spy);

try {
await knex.insert({ foo: 'bar' });
// eslint-disable-next-line no-empty
} catch (_e) {}

expect(spy).to.be.calledOnce;
const [[error]] = spy.args;
expect(error).to.be.instanceOf(Error);
expect(error.message).to.equal(
"insert into `test` (`foo`) values ('bar') - SQLITE_ERROR: no such table: test"
);
});

it('should show parameterized sql on error message when compileSqlOnError is false', async function () {
const spy = sinon.spy();
const knex = Knex({ ...sqliteConfig, compileSqlOnError: false })
.from('test')
.on('query-error', spy);

try {
await knex.insert({ foo: 'bar' });
// eslint-disable-next-line no-empty
} catch (_e) {}

expect(spy).to.be.calledOnce;
const [[error]] = spy.args;
expect(error).to.be.instanceOf(Error);
expect(error.message).to.equal(
'insert into `test` (`foo`) values (?) - SQLITE_ERROR: no such table: test'
);
});

// TODO: Consider moving these somewhere that tests the
// QueryBuilder interface more directly.
context('qb = knex.select(1)', function () {
Expand Down
1 change: 1 addition & 0 deletions types/index.d.ts
Expand Up @@ -2717,6 +2717,7 @@ export declare namespace Knex {
searchPath?: string | readonly string[];
asyncStackTraces?: boolean;
log?: Logger;
compileSqlOnError?: boolean;
}

type StaticConnectionConfig =
Expand Down

0 comments on commit f7ccde8

Please sign in to comment.