From 04441ddc33ac5aefb779a7999a9c9b1d221ac6f0 Mon Sep 17 00:00:00 2001 From: foredstudio Date: Tue, 1 Sep 2026 05:03:33 +0200 Subject: [PATCH] fix: sync rows query after error --- packages/pg/lib/query.js | 7 +++- .../unit/client/query-error-sync-tests.js | 36 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 packages/pg/test/unit/client/query-error-sync-tests.js diff --git a/packages/pg/lib/query.js b/packages/pg/lib/query.js index 6b9214199..74792b50c 100644 --- a/packages/pg/lib/query.js +++ b/packages/pg/lib/query.js @@ -120,7 +120,12 @@ class Query extends EventEmitter { } handleError(err, connection) { - // need to sync after error during a prepared statement + // rows-mode uses Flush instead of pipelining Sync in _getRows. After an + // ErrorResponse the backend ignores messages until Sync, so send one here + // to ensure ReadyForQuery arrives and the client can process later queries. + if (this.rows) { + connection.sync() + } if (this._canceledDueToError) { err = this._canceledDueToError this._canceledDueToError = false diff --git a/packages/pg/test/unit/client/query-error-sync-tests.js b/packages/pg/test/unit/client/query-error-sync-tests.js new file mode 100644 index 000000000..9b1671d8b --- /dev/null +++ b/packages/pg/test/unit/client/query-error-sync-tests.js @@ -0,0 +1,36 @@ +'use strict' +const helper = require('./test-helper') +const Query = require('../../../lib/query') +const assert = require('assert') +const suite = new helper.Suite() +const test = suite.test.bind(suite) + +test('rows-mode query syncs after an error', function () { + let syncCalls = 0 + const query = new Query({ text: 'select 1', rows: 2 }, function (err) { + assert.equal(err.message, 'boom') + }) + + query.handleError(new Error('boom'), { + sync: function () { + syncCalls++ + }, + }) + + assert.equal(syncCalls, 1) +}) + +test('normal query does not send an extra sync after an error', function () { + let syncCalls = 0 + const query = new Query({ text: 'select 1' }, function (err) { + assert.equal(err.message, 'boom') + }) + + query.handleError(new Error('boom'), { + sync: function () { + syncCalls++ + }, + }) + + assert.equal(syncCalls, 0) +})