From a221d7c73e821d2609221762faa149607dbb6491 Mon Sep 17 00:00:00 2001 From: Brian Carlson Date: Thu, 1 Aug 2024 14:41:24 -0500 Subject: [PATCH 01/11] Handle bad message ordering - make it catchable. Fixes 3174 --- packages/pg/lib/client.js | 6 +- packages/pg/script/create-test-tables.js | 57 +++---- .../test/integration/gh-issues/3174-tests.js | 147 ++++++++++++++++++ 3 files changed, 173 insertions(+), 37 deletions(-) create mode 100644 packages/pg/test/integration/gh-issues/3174-tests.js diff --git a/packages/pg/lib/client.js b/packages/pg/lib/client.js index e4720114e..22bded0e2 100644 --- a/packages/pg/lib/client.js +++ b/packages/pg/lib/client.js @@ -381,7 +381,11 @@ class Client extends EventEmitter { this.activeQuery.handleCommandComplete(msg, this.connection) } - _handleParseComplete(msg) { + _handleParseComplete() { + if (this.activeQuery == null) { + this.emit('error', new Error('Received parseComplete when not in parsing state')) + return + } // if a prepared statement has a name and properly parses // we track that its already been executed so we don't parse // it again on the same client diff --git a/packages/pg/script/create-test-tables.js b/packages/pg/script/create-test-tables.js index c4ec99f23..622b0cd20 100644 --- a/packages/pg/script/create-test-tables.js +++ b/packages/pg/script/create-test-tables.js @@ -31,41 +31,26 @@ var people = [ { name: 'Zanzabar', age: 260 }, ] -var con = new pg.Client({ - user: args.user, - password: args.password, - host: args.host, - port: args.port, - database: args.database, -}) - -con.connect((err) => { - if (err) { - throw err - } - - con.query( - 'DROP TABLE IF EXISTS person;' + ' CREATE TABLE person (id serial, name varchar(10), age integer)', - (err) => { - if (err) { - throw err - } - - console.log('Created table person') - console.log('Filling it with people') - - con.query( - 'INSERT INTO person (name, age) VALUES' + - people.map((person) => ` ('${person.name}', ${person.age})`).join(','), - (err, result) => { - if (err) { - throw err - } - - console.log(`Inserted ${result.rowCount} people`) - con.end() - } - ) - } +async function run() { + var con = new pg.Client({ + user: args.user, + password: args.password, + host: args.host, + port: args.port, + database: args.database, + }) + console.log('creating test dataset') + await con.connect() + await con.query('DROP TABLE IF EXISTS person') + await con.query('CREATE TABLE person (id serial, name varchar(10), age integer)') + await con.query( + 'INSERT INTO person (name, age) VALUES' + people.map((person) => ` ('${person.name}', ${person.age})`).join(',') ) + await con.end() + console.log('created test dataset') +} + +run().catch((e) => { + console.log('setup failed', e) + process.exit(255) }) diff --git a/packages/pg/test/integration/gh-issues/3174-tests.js b/packages/pg/test/integration/gh-issues/3174-tests.js new file mode 100644 index 000000000..23bc2c4ea --- /dev/null +++ b/packages/pg/test/integration/gh-issues/3174-tests.js @@ -0,0 +1,147 @@ +const net = require('net') +const buffers = require('../../test-buffers') +const helper = require('../test-helper') +const assert = require('assert') +const cli = require('../../cli') + +const suite = new helper.Suite() + +const options = { + host: 'localhost', + port: Math.floor(Math.random() * 2000) + 2000, + connectionTimeoutMillis: 2000, + user: 'not', + database: 'existing', +} + +const startMockServer = (port, timeout, callback) => { + const sockets = new Set() + + const server = net.createServer((socket) => { + sockets.add(socket) + socket.once('end', () => sockets.delete(socket)) + + socket.on('data', (data) => { + // deny request for SSL + if (data.length === 8) { + socket.write(Buffer.from('N', 'utf8')) + return + // consider all authentication requests as good + } + // the initial message coming in has a 0 message type for authentication negotiation + if (!data[0]) { + socket.write(buffers.authenticationOk()) + // send ReadyForQuery `timeout` ms after authentication + socket.write(buffers.readyForQuery()) + return + // respond with our canned response + } + const code = data.toString('utf8', 0, 1) + switch (code) { + // parse + case 'P': + socket.write(buffers.parseComplete()) + socket.write(buffers.bindComplete()) + socket.write(buffers.rowDescription()) + socket.write(buffers.dataRow()) + socket.write(buffers.commandComplete('FOO BAR')) + socket.write(buffers.readyForQuery()) + // this message is invalid, but sometimes sent out of order when using proxies or pg-bouncer + setImmediate(() => { + socket.write(buffers.parseComplete()) + }) + break + case 'Q': + socket.write(buffers.rowDescription()) + socket.write(buffers.dataRow()) + socket.write(buffers.commandComplete('FOO BAR')) + socket.write(buffers.readyForQuery()) + // this message is invalid, but sometimes sent out of order when using proxies or pg-bouncer + setImmediate(() => { + socket.write(buffers.parseComplete()) + }) + default: + // console.log('got code', code) + } + }) + }) + + const closeServer = () => { + for (const socket of sockets) { + socket.destroy() + } + return new Promise((resolve) => { + server.close(resolve) + }) + } + + server.listen(port, options.host, () => callback(closeServer)) +} + +const delay = (ms) => + new Promise((resolve) => { + setTimeout(resolve, ms) + }) + +suite.testAsync('Out of order parseComplete on simple query is catchable', async () => { + const closeServer = await new Promise((resolve, reject) => { + return startMockServer(options.port, 0, (closeServer) => resolve(closeServer)) + }) + const client = new helper.Client(options) + await client.connect() + + let errorHit = false + client.on('error', () => { + errorHit = true + }) + + await client.query('SELECT NOW') + await delay(50) + await client.query('SELECT NOW') + await delay(50) + await client.query('SELECT NOW') + await delay(50) + await client.end() + assert(cli.native || errorHit) + + await closeServer() +}) + +suite.testAsync('Out of order parseComplete on extended query is catchable', async () => { + const closeServer = await new Promise((resolve, reject) => { + return startMockServer(options.port, 0, (closeServer) => resolve(closeServer)) + }) + const client = new helper.Client(options) + await client.connect() + + let errorHit = false + client.on('error', () => { + errorHit = true + }) + + await client.query('SELECT $1', ['foo']) + // await client.end() + await delay(100) + assert(cli.native || errorHit) + + await closeServer() +}) + +suite.testAsync('Out of order parseComplete on pool is catchable', async () => { + const closeServer = await new Promise((resolve, reject) => { + return startMockServer(options.port, 0, (closeServer) => resolve(closeServer)) + }) + const pool = new helper.pg.Pool(options) + + let errorHit = false + pool.on('error', () => { + errorHit = true + }) + + await pool.query('SELECT $1', ['foo']) + await delay(100) + assert(cli.native || errorHit) + + await pool.end() + await closeServer() +}) From e57c95ffe83f98fc49c3bc3ddd1d2572a8c84b78 Mon Sep 17 00:00:00 2001 From: Brian Carlson Date: Thu, 1 Aug 2024 14:55:52 -0500 Subject: [PATCH 02/11] Close client in test --- packages/pg/test/integration/gh-issues/3174-tests.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/pg/test/integration/gh-issues/3174-tests.js b/packages/pg/test/integration/gh-issues/3174-tests.js index 23bc2c4ea..bfef61245 100644 --- a/packages/pg/test/integration/gh-issues/3174-tests.js +++ b/packages/pg/test/integration/gh-issues/3174-tests.js @@ -120,9 +120,9 @@ suite.testAsync('Out of order parseComplete on extended query is catchable', asy }) await client.query('SELECT $1', ['foo']) - // await client.end() - await delay(100) + await delay(40) assert(cli.native || errorHit) + await client.end() await closeServer() }) From 1b5741e468b66f622346011dea2489bbdd199850 Mon Sep 17 00:00:00 2001 From: Brian Carlson Date: Thu, 1 Aug 2024 15:32:32 -0500 Subject: [PATCH 03/11] Mess w/ github action settings --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4ad39305b..7106e6d33 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,8 @@ jobs: - run: yarn install --frozen-lockfile - run: yarn lint build: - timeout-minutes: 10 + timeout-minutes: 15 + runs-on: ubuntu-latest needs: lint services: postgres: From a9248f685b108a2426dcfa146c70bd5f8a3f642c Mon Sep 17 00:00:00 2001 From: Brian Carlson Date: Thu, 1 Aug 2024 15:36:05 -0500 Subject: [PATCH 04/11] update ci config --- .github/workflows/ci.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7106e6d33..f6e93d71e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,6 @@ jobs: - run: yarn lint build: timeout-minutes: 15 - runs-on: ubuntu-latest needs: lint services: postgres: @@ -45,8 +44,8 @@ jobs: - '22' os: - ubuntu-latest - name: Node.js ${{ matrix.node }} (${{ matrix.os }}) - runs-on: ${{ matrix.os }} + name: Node.js ${{ matrix.node }} + runs-on: ubuntu-latest env: PGUSER: postgres PGPASSWORD: postgres @@ -72,5 +71,4 @@ jobs: node-version: ${{ matrix.node }} cache: yarn - run: yarn install --frozen-lockfile - # TODO(bmc): get ssl tests working in ci - run: yarn test From 4ed2bcce7091d8b94a820202b7a9ff1e83f49cfb Mon Sep 17 00:00:00 2001 From: Brian Carlson Date: Thu, 1 Aug 2024 16:03:34 -0500 Subject: [PATCH 05/11] Remove redundant tests --- packages/pg-native/test/many-connections.js | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/packages/pg-native/test/many-connections.js b/packages/pg-native/test/many-connections.js index 204199666..fe32ede16 100644 --- a/packages/pg-native/test/many-connections.js +++ b/packages/pg-native/test/many-connections.js @@ -6,7 +6,7 @@ var bytes = require('crypto').pseudoRandomBytes describe('many connections', function () { describe('async', function () { var test = function (count, times) { - it('connecting ' + count + ' clients ' + times, function (done) { + it(`connecting ${count} clients ${times} times`, function (done) { this.timeout(200000) var connectClient = function (n, cb) { @@ -38,20 +38,9 @@ describe('many connections', function () { } test(1, 1) - test(1, 1) - test(1, 1) - test(5, 5) test(5, 5) - test(5, 5) - test(5, 5) - test(10, 10) test(10, 10) - test(10, 10) - test(20, 20) - test(20, 20) test(20, 20) test(30, 10) - test(30, 10) - test(30, 10) }) }) From 54dc7afaf5b9947beb45824fc2ae8d26999bfc78 Mon Sep 17 00:00:00 2001 From: "Brian M. Carlson" Date: Mon, 12 Aug 2024 16:14:08 -0400 Subject: [PATCH 06/11] Update code to use handle error event --- packages/pg/lib/client.js | 3 ++- .../pg/test/integration/gh-issues/3174-tests.js | 17 +++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/pg/lib/client.js b/packages/pg/lib/client.js index 22bded0e2..637b2f4b3 100644 --- a/packages/pg/lib/client.js +++ b/packages/pg/lib/client.js @@ -383,7 +383,8 @@ class Client extends EventEmitter { _handleParseComplete() { if (this.activeQuery == null) { - this.emit('error', new Error('Received parseComplete when not in parsing state')) + const error =new Error('Received parseComplete when not in parsing state') + this._handleErrorEvent(error) return } // if a prepared statement has a name and properly parses diff --git a/packages/pg/test/integration/gh-issues/3174-tests.js b/packages/pg/test/integration/gh-issues/3174-tests.js index bfef61245..bce3e755e 100644 --- a/packages/pg/test/integration/gh-issues/3174-tests.js +++ b/packages/pg/test/integration/gh-issues/3174-tests.js @@ -95,15 +95,13 @@ suite.testAsync('Out of order parseComplete on simple query is catchable', async errorHit = true }) - await client.query('SELECT NOW') + await client.query('SELECT NOW()') await delay(50) - await client.query('SELECT NOW') - await delay(50) - await client.query('SELECT NOW') - await delay(50) - await client.end() assert(cli.native || errorHit) + // further queries on the client should fail since its in an invalid state + await assert.rejects(() => client.query('SELECTR NOW()'), 'Further queries on the client should reject') + await closeServer() }) @@ -122,6 +120,10 @@ suite.testAsync('Out of order parseComplete on extended query is catchable', asy await client.query('SELECT $1', ['foo']) await delay(40) assert(cli.native || errorHit) + + // further queries on the client should fail since its in an invalid state + await assert.rejects(() => client.query('SELECTR NOW()'), 'Further queries on the client should reject') + await client.end() await closeServer() @@ -142,6 +144,9 @@ suite.testAsync('Out of order parseComplete on pool is catchable', async () => { await delay(100) assert(cli.native || errorHit) + assert.strictEqual(pool.idleCount, 0, 'Pool should have no idle clients') + assert.strictEqual(pool.totalCount, 0, 'Pool should have no connected clients') + await pool.end() await closeServer() }) From 2d67ef6f42444148cf108a5ea9b67ed1e81615a2 Mon Sep 17 00:00:00 2001 From: "Brian M. Carlson" Date: Mon, 12 Aug 2024 16:25:46 -0400 Subject: [PATCH 07/11] Add tests for commandComplete message being out of order --- packages/pg/lib/client.js | 7 +++++- .../test/integration/gh-issues/3174-tests.js | 25 ++++++++++++------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/pg/lib/client.js b/packages/pg/lib/client.js index 637b2f4b3..03ac7d918 100644 --- a/packages/pg/lib/client.js +++ b/packages/pg/lib/client.js @@ -377,13 +377,18 @@ class Client extends EventEmitter { } _handleCommandComplete(msg) { + if (this.activeQuery == null) { + const error = new Error('Received unexpected commandComplete message from backend.') + this._handleErrorEvent(error) + return + } // delegate commandComplete to active query this.activeQuery.handleCommandComplete(msg, this.connection) } _handleParseComplete() { if (this.activeQuery == null) { - const error =new Error('Received parseComplete when not in parsing state') + const error = new Error('Received unexpected parseComplete message from backend.') this._handleErrorEvent(error) return } diff --git a/packages/pg/test/integration/gh-issues/3174-tests.js b/packages/pg/test/integration/gh-issues/3174-tests.js index bce3e755e..a3f065007 100644 --- a/packages/pg/test/integration/gh-issues/3174-tests.js +++ b/packages/pg/test/integration/gh-issues/3174-tests.js @@ -14,7 +14,7 @@ const options = { database: 'existing', } -const startMockServer = (port, timeout, callback) => { +const startMockServer = (port, badBuffer, callback) => { const sockets = new Set() const server = net.createServer((socket) => { @@ -48,7 +48,7 @@ const startMockServer = (port, timeout, callback) => { socket.write(buffers.readyForQuery()) // this message is invalid, but sometimes sent out of order when using proxies or pg-bouncer setImmediate(() => { - socket.write(buffers.parseComplete()) + socket.write(badBuffer) }) break case 'Q': @@ -58,7 +58,7 @@ const startMockServer = (port, timeout, callback) => { socket.write(buffers.readyForQuery()) // this message is invalid, but sometimes sent out of order when using proxies or pg-bouncer setImmediate(() => { - socket.write(buffers.parseComplete()) + socket.write(badBuffer) }) default: // console.log('got code', code) @@ -83,9 +83,11 @@ const delay = (ms) => setTimeout(resolve, ms) }) -suite.testAsync('Out of order parseComplete on simple query is catchable', async () => { +const testErrorBuffer = (bufferName, errorBuffer) => { + +suite.testAsync(`Out of order ${bufferName} on simple query is catchable`, async () => { const closeServer = await new Promise((resolve, reject) => { - return startMockServer(options.port, 0, (closeServer) => resolve(closeServer)) + return startMockServer(options.port, errorBuffer, (closeServer) => resolve(closeServer)) }) const client = new helper.Client(options) await client.connect() @@ -105,9 +107,9 @@ suite.testAsync('Out of order parseComplete on simple query is catchable', async await closeServer() }) -suite.testAsync('Out of order parseComplete on extended query is catchable', async () => { +suite.testAsync(`Out of order ${bufferName} on extended query is catchable`, async () => { const closeServer = await new Promise((resolve, reject) => { - return startMockServer(options.port, 0, (closeServer) => resolve(closeServer)) + return startMockServer(options.port, errorBuffer, (closeServer) => resolve(closeServer)) }) const client = new helper.Client(options) await client.connect() @@ -129,9 +131,9 @@ suite.testAsync('Out of order parseComplete on extended query is catchable', asy await closeServer() }) -suite.testAsync('Out of order parseComplete on pool is catchable', async () => { +suite.testAsync(`Out of order ${bufferName} on pool is catchable`, async () => { const closeServer = await new Promise((resolve, reject) => { - return startMockServer(options.port, 0, (closeServer) => resolve(closeServer)) + return startMockServer(options.port, errorBuffer, (closeServer) => resolve(closeServer)) }) const pool = new helper.pg.Pool(options) @@ -150,3 +152,8 @@ suite.testAsync('Out of order parseComplete on pool is catchable', async () => { await pool.end() await closeServer() }) + +} + +testErrorBuffer('parseComplete', buffers.parseComplete()) +testErrorBuffer('commandComplete', buffers.commandComplete('f')) From 50306bc76395ee1c4673a4ccc5feb269fe10637d Mon Sep 17 00:00:00 2001 From: "Brian M. Carlson" Date: Mon, 12 Aug 2024 16:30:57 -0400 Subject: [PATCH 08/11] Lint fix --- packages/pg/lib/client.js | 4 +- .../test/integration/gh-issues/3174-tests.js | 102 +++++++++--------- 2 files changed, 52 insertions(+), 54 deletions(-) diff --git a/packages/pg/lib/client.js b/packages/pg/lib/client.js index 03ac7d918..527f62e4f 100644 --- a/packages/pg/lib/client.js +++ b/packages/pg/lib/client.js @@ -378,7 +378,7 @@ class Client extends EventEmitter { _handleCommandComplete(msg) { if (this.activeQuery == null) { - const error = new Error('Received unexpected commandComplete message from backend.') + const error = new Error('Received unexpected commandComplete message from backend.') this._handleErrorEvent(error) return } @@ -388,7 +388,7 @@ class Client extends EventEmitter { _handleParseComplete() { if (this.activeQuery == null) { - const error = new Error('Received unexpected parseComplete message from backend.') + const error = new Error('Received unexpected parseComplete message from backend.') this._handleErrorEvent(error) return } diff --git a/packages/pg/test/integration/gh-issues/3174-tests.js b/packages/pg/test/integration/gh-issues/3174-tests.js index a3f065007..da5cbafb5 100644 --- a/packages/pg/test/integration/gh-issues/3174-tests.js +++ b/packages/pg/test/integration/gh-issues/3174-tests.js @@ -84,75 +84,73 @@ const delay = (ms) => }) const testErrorBuffer = (bufferName, errorBuffer) => { + suite.testAsync(`Out of order ${bufferName} on simple query is catchable`, async () => { + const closeServer = await new Promise((resolve, reject) => { + return startMockServer(options.port, errorBuffer, (closeServer) => resolve(closeServer)) + }) + const client = new helper.Client(options) + await client.connect() -suite.testAsync(`Out of order ${bufferName} on simple query is catchable`, async () => { - const closeServer = await new Promise((resolve, reject) => { - return startMockServer(options.port, errorBuffer, (closeServer) => resolve(closeServer)) - }) - const client = new helper.Client(options) - await client.connect() - - let errorHit = false - client.on('error', () => { - errorHit = true - }) - - await client.query('SELECT NOW()') - await delay(50) - assert(cli.native || errorHit) + let errorHit = false + client.on('error', () => { + errorHit = true + }) - // further queries on the client should fail since its in an invalid state - await assert.rejects(() => client.query('SELECTR NOW()'), 'Further queries on the client should reject') + await client.query('SELECT NOW()') + await delay(50) + assert(cli.native || errorHit) - await closeServer() -}) + // further queries on the client should fail since its in an invalid state + await assert.rejects(() => client.query('SELECTR NOW()'), 'Further queries on the client should reject') -suite.testAsync(`Out of order ${bufferName} on extended query is catchable`, async () => { - const closeServer = await new Promise((resolve, reject) => { - return startMockServer(options.port, errorBuffer, (closeServer) => resolve(closeServer)) + await closeServer() }) - const client = new helper.Client(options) - await client.connect() - let errorHit = false - client.on('error', () => { - errorHit = true - }) + suite.testAsync(`Out of order ${bufferName} on extended query is catchable`, async () => { + const closeServer = await new Promise((resolve, reject) => { + return startMockServer(options.port, errorBuffer, (closeServer) => resolve(closeServer)) + }) + const client = new helper.Client(options) + await client.connect() - await client.query('SELECT $1', ['foo']) - await delay(40) - assert(cli.native || errorHit) + let errorHit = false + client.on('error', () => { + errorHit = true + }) - // further queries on the client should fail since its in an invalid state - await assert.rejects(() => client.query('SELECTR NOW()'), 'Further queries on the client should reject') + await client.query('SELECT $1', ['foo']) + await delay(40) + assert(cli.native || errorHit) - await client.end() + // further queries on the client should fail since its in an invalid state + await assert.rejects(() => client.query('SELECTR NOW()'), 'Further queries on the client should reject') - await closeServer() -}) + await client.end() -suite.testAsync(`Out of order ${bufferName} on pool is catchable`, async () => { - const closeServer = await new Promise((resolve, reject) => { - return startMockServer(options.port, errorBuffer, (closeServer) => resolve(closeServer)) + await closeServer() }) - const pool = new helper.pg.Pool(options) - let errorHit = false - pool.on('error', () => { - errorHit = true - }) + suite.testAsync(`Out of order ${bufferName} on pool is catchable`, async () => { + const closeServer = await new Promise((resolve, reject) => { + return startMockServer(options.port, errorBuffer, (closeServer) => resolve(closeServer)) + }) + const pool = new helper.pg.Pool(options) - await pool.query('SELECT $1', ['foo']) - await delay(100) - assert(cli.native || errorHit) + let errorHit = false + pool.on('error', () => { + errorHit = true + }) - assert.strictEqual(pool.idleCount, 0, 'Pool should have no idle clients') - assert.strictEqual(pool.totalCount, 0, 'Pool should have no connected clients') + await pool.query('SELECT $1', ['foo']) + await delay(100) + assert(cli.native || errorHit) - await pool.end() - await closeServer() -}) + assert.strictEqual(pool.idleCount, 0, 'Pool should have no idle clients') + assert.strictEqual(pool.totalCount, 0, 'Pool should have no connected clients') + await pool.end() + await closeServer() + }) } testErrorBuffer('parseComplete', buffers.parseComplete()) From e10bf645c8a1a8e4f95902f638490f101711151d Mon Sep 17 00:00:00 2001 From: "Brian M. Carlson" Date: Mon, 12 Aug 2024 16:38:43 -0400 Subject: [PATCH 09/11] Fix native tests --- .../test/integration/gh-issues/3174-tests.js | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/pg/test/integration/gh-issues/3174-tests.js b/packages/pg/test/integration/gh-issues/3174-tests.js index da5cbafb5..fab9c0338 100644 --- a/packages/pg/test/integration/gh-issues/3174-tests.js +++ b/packages/pg/test/integration/gh-issues/3174-tests.js @@ -98,10 +98,13 @@ const testErrorBuffer = (bufferName, errorBuffer) => { await client.query('SELECT NOW()') await delay(50) - assert(cli.native || errorHit) - // further queries on the client should fail since its in an invalid state - await assert.rejects(() => client.query('SELECTR NOW()'), 'Further queries on the client should reject') + // the native client only emits a notice message and keeps on its merry way + if (!cli.native) { + assert(errorHit) + // further queries on the client should fail since its in an invalid state + await assert.rejects(() => client.query('SELECTR NOW()'), 'Further queries on the client should reject') + } await closeServer() }) @@ -120,10 +123,13 @@ const testErrorBuffer = (bufferName, errorBuffer) => { await client.query('SELECT $1', ['foo']) await delay(40) - assert(cli.native || errorHit) - // further queries on the client should fail since its in an invalid state - await assert.rejects(() => client.query('SELECTR NOW()'), 'Further queries on the client should reject') + // the native client only emits a notice message and keeps on its merry way + if (!cli.native) { + assert(errorHit) + // further queries on the client should fail since its in an invalid state + await assert.rejects(() => client.query('SELECTR NOW()'), 'Further queries on the client should reject') + } await client.end() @@ -143,10 +149,13 @@ const testErrorBuffer = (bufferName, errorBuffer) => { await pool.query('SELECT $1', ['foo']) await delay(100) - assert(cli.native || errorHit) - assert.strictEqual(pool.idleCount, 0, 'Pool should have no idle clients') - assert.strictEqual(pool.totalCount, 0, 'Pool should have no connected clients') + if (!cli.native) { + assert(errorHit) + assert.strictEqual(pool.idleCount, 0, 'Pool should have no idle clients') + assert.strictEqual(pool.totalCount, 0, 'Pool should have no connected clients') + } + await pool.end() await closeServer() From d912cbdfd17194de3897a2320b29d5db1ac54e80 Mon Sep 17 00:00:00 2001 From: "Brian M. Carlson" Date: Mon, 12 Aug 2024 16:40:22 -0400 Subject: [PATCH 10/11] Fix lint again...airport computer not my friend --- packages/pg/test/integration/gh-issues/3174-tests.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/pg/test/integration/gh-issues/3174-tests.js b/packages/pg/test/integration/gh-issues/3174-tests.js index fab9c0338..249f8a61c 100644 --- a/packages/pg/test/integration/gh-issues/3174-tests.js +++ b/packages/pg/test/integration/gh-issues/3174-tests.js @@ -156,7 +156,6 @@ const testErrorBuffer = (bufferName, errorBuffer) => { assert.strictEqual(pool.totalCount, 0, 'Pool should have no connected clients') } - await pool.end() await closeServer() }) From 93b9fadc5e72f991a97d6d65a98452af36c10e83 Mon Sep 17 00:00:00 2001 From: Brian Carlson Date: Tue, 17 Sep 2024 09:38:26 -0500 Subject: [PATCH 11/11] Not a native issue --- packages/pg/test/integration/gh-issues/3174-tests.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/pg/test/integration/gh-issues/3174-tests.js b/packages/pg/test/integration/gh-issues/3174-tests.js index 249f8a61c..49ac5905a 100644 --- a/packages/pg/test/integration/gh-issues/3174-tests.js +++ b/packages/pg/test/integration/gh-issues/3174-tests.js @@ -161,5 +161,7 @@ const testErrorBuffer = (bufferName, errorBuffer) => { }) } -testErrorBuffer('parseComplete', buffers.parseComplete()) -testErrorBuffer('commandComplete', buffers.commandComplete('f')) +if (!helper.args.native) { + testErrorBuffer('parseComplete', buffers.parseComplete()) + testErrorBuffer('commandComplete', buffers.commandComplete('f')) +}