diff --git a/packages/pg/lib/client.js b/packages/pg/lib/client.js index 2b13c1de7..7af8d3b57 100644 --- a/packages/pg/lib/client.js +++ b/packages/pg/lib/client.js @@ -438,6 +438,9 @@ class Client extends EventEmitter { if (activeQuery.name) { delete this.connection.submittedNamedStatements[activeQuery.name] } + if (msg.severity === 'FATAL' || msg.severity === 'PANIC') { + this._queryable = false + } activeQuery.handleError(msg, this.connection) } diff --git a/packages/pg/test/unit/client/simple-query-tests.js b/packages/pg/test/unit/client/simple-query-tests.js index 3e3918773..4742d71f9 100644 --- a/packages/pg/test/unit/client/simple-query-tests.js +++ b/packages/pg/test/unit/client/simple-query-tests.js @@ -243,6 +243,52 @@ test('executing query', function () { } ) }) + + test('keeps client queryable after an ERROR message during a query', function (done) { + const errorClient = helper.client() + const con = errorClient.connection + con.emit('readyForQuery') + + errorClient.query('SELECT 1', function (err) { + assert.ok(err) + assert.equal(errorClient._queryable, true) + done() + }) + + const err = new Error('division by zero') + err.severity = 'ERROR' + con.emit('errorMessage', err) + con.emit('readyForQuery') + }) + + test('marks client not queryable after a FATAL or PANIC message during a query', function (done) { + const fatalClient = helper.client() + const con = fatalClient.connection + con.emit('readyForQuery') + + fatalClient.query('SELECT pg_sleep(30)', function (err) { + assert.ok(err) + assert.equal(fatalClient._queryable, false) + + const panicClient = helper.client() + const panicCon = panicClient.connection + panicCon.emit('readyForQuery') + + panicClient.query('SELECT 1', function (panicErr) { + assert.ok(panicErr) + assert.equal(panicClient._queryable, false) + done() + }) + + const panicMsg = new Error('server panic') + panicMsg.severity = 'PANIC' + panicCon.emit('errorMessage', panicMsg) + }) + + const fatalMsg = new Error('terminating connection due to administrator command') + fatalMsg.severity = 'FATAL' + con.emit('errorMessage', fatalMsg) + }) }) test('reusing a config object across calls', function () {