diff --git a/lib/execution/internal/query-executioner.js b/lib/execution/internal/query-executioner.js index 66b3b20c14..8ca9784334 100644 --- a/lib/execution/internal/query-executioner.js +++ b/lib/execution/internal/query-executioner.js @@ -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, diff --git a/test/unit/knex.js b/test/unit/knex.js index a5bf188678..aa030487b8 100644 --- a/test/unit/knex.js +++ b/test/unit/knex.js @@ -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 () { diff --git a/types/index.d.ts b/types/index.d.ts index b246bbe587..a0e308f499 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -2717,6 +2717,7 @@ export declare namespace Knex { searchPath?: string | readonly string[]; asyncStackTraces?: boolean; log?: Logger; + compileSqlOnError?: boolean; } type StaticConnectionConfig =