From d544e07a711d609f3fe1c5263f5ef7e0f6a44be0 Mon Sep 17 00:00:00 2001 From: Ryan Staples <42743016+Srayman@users.noreply.github.com> Date: Tue, 15 Nov 2022 10:08:46 -0500 Subject: [PATCH 1/6] change instanceof to isDate --- packages/pg/lib/utils.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/pg/lib/utils.js b/packages/pg/lib/utils.js index d63fe68f1..697d5f950 100644 --- a/packages/pg/lib/utils.js +++ b/packages/pg/lib/utils.js @@ -4,6 +4,8 @@ const crypto = require('crypto') const defaults = require('./defaults') +const util = require('util') + function escapeElement(elementRepresentation) { var escaped = elementRepresentation.replace(/\\/g, '\\\\').replace(/"/g, '\\"') @@ -52,7 +54,7 @@ var prepareValue = function (val, seen) { } return buf.slice(val.byteOffset, val.byteOffset + val.byteLength) // Node.js v4 does not support those Buffer.from params } - if (val instanceof Date) { + if (util.types.isDate(val)) { if (defaults.parseInputDatesAsUTC) { return dateToStringUTC(val) } else { From d3749de203ab8525210176c6f02e4275685d41d3 Mon Sep 17 00:00:00 2001 From: Ryan Staples <42743016+Srayman@users.noreply.github.com> Date: Thu, 24 Nov 2022 12:58:00 -0500 Subject: [PATCH 2/6] use both methods to check for valid Date --- packages/pg/lib/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pg/lib/utils.js b/packages/pg/lib/utils.js index 697d5f950..ec523aba6 100644 --- a/packages/pg/lib/utils.js +++ b/packages/pg/lib/utils.js @@ -54,7 +54,7 @@ var prepareValue = function (val, seen) { } return buf.slice(val.byteOffset, val.byteOffset + val.byteLength) // Node.js v4 does not support those Buffer.from params } - if (util.types.isDate(val)) { + if (val instanceof Date || util.types.isDate(val)) { if (defaults.parseInputDatesAsUTC) { return dateToStringUTC(val) } else { From 91c696939c92dfa9c36a222e9695314889257597 Mon Sep 17 00:00:00 2001 From: Ryan Staples <42743016+Srayman@users.noreply.github.com> Date: Thu, 24 Nov 2022 13:17:24 -0500 Subject: [PATCH 3/6] add test for PR 2862 --- .../test/integration/gh-issues/2862-tests.js | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 packages/pg/test/integration/gh-issues/2862-tests.js diff --git a/packages/pg/test/integration/gh-issues/2862-tests.js b/packages/pg/test/integration/gh-issues/2862-tests.js new file mode 100644 index 000000000..d04117779 --- /dev/null +++ b/packages/pg/test/integration/gh-issues/2862-tests.js @@ -0,0 +1,27 @@ +'use strict' +var helper = require('./../test-helper') +var assert = require('assert') +var util = require('util') +var vm = require('vm'); + +const suite = new helper.Suite() + +suite.test('Handle date objects as Date', async (done) => { + const date = new Date(); + const dateObj = await vm.runInNewContext('new Date()'); + assert(!(dateObj instanceof Date)) + assert(util.types.isDate(dateObj)) + const client = new helper.pg.Client() + client.connect() + + await client.query('CREATE TEMP TABLE foo(bar TIMESTAMP, bar2 TIMESTAMP)') + await client.query('INSERT INTO foo(bar, bar2) VALUES($1, $2)', [date, dateObj]) + const results = await client.query('SELECT * FROM foo') + const row = results.rows[0] + const dbDate = row.bar + const dbDateObj = row.bar2 + assert.deepEqual(dbDate, date) + assert.deepEqual(dbDateObj, dateObj) + await client.end() + done() +}) From fbd2138ce89f3f4feab9fda6e7910c59d0a95038 Mon Sep 17 00:00:00 2001 From: Ryan Staples <42743016+Srayman@users.noreply.github.com> Date: Fri, 9 Dec 2022 08:56:58 -0500 Subject: [PATCH 4/6] use only isDate(date) in place of instanceof Date --- packages/pg/lib/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pg/lib/utils.js b/packages/pg/lib/utils.js index ec523aba6..697d5f950 100644 --- a/packages/pg/lib/utils.js +++ b/packages/pg/lib/utils.js @@ -54,7 +54,7 @@ var prepareValue = function (val, seen) { } return buf.slice(val.byteOffset, val.byteOffset + val.byteLength) // Node.js v4 does not support those Buffer.from params } - if (val instanceof Date || util.types.isDate(val)) { + if (util.types.isDate(val)) { if (defaults.parseInputDatesAsUTC) { return dateToStringUTC(val) } else { From 2348a10ce850cc6189873f62513c3708891aac59 Mon Sep 17 00:00:00 2001 From: Charmander <~@charmander.me> Date: Wed, 14 May 2025 15:35:27 -0700 Subject: [PATCH 5/6] Extend compatibility of `isDate` use back to Node 8 --- packages/pg/lib/utils.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/pg/lib/utils.js b/packages/pg/lib/utils.js index b26f6c696..1d3f5aa85 100644 --- a/packages/pg/lib/utils.js +++ b/packages/pg/lib/utils.js @@ -3,6 +3,7 @@ const defaults = require('./defaults') const util = require('util') +const { isDate } = util.types || util // Node 8 doesn't have `util.types` function escapeElement(elementRepresentation) { const escaped = elementRepresentation.replace(/\\/g, '\\\\').replace(/"/g, '\\"') @@ -62,7 +63,7 @@ const prepareValue = function (val, seen) { } return buf.slice(val.byteOffset, val.byteOffset + val.byteLength) // Node.js v4 does not support those Buffer.from params } - if (util.types.isDate(val)) { + if (isDate(val)) { if (defaults.parseInputDatesAsUTC) { return dateToStringUTC(val) } else { From 69c7bfb73a275370472e1c85cba576e4077472df Mon Sep 17 00:00:00 2001 From: Charmander <~@charmander.me> Date: Wed, 14 May 2025 15:31:57 -0700 Subject: [PATCH 6/6] Clean up test --- .../test/integration/gh-issues/2862-tests.js | 30 ++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/packages/pg/test/integration/gh-issues/2862-tests.js b/packages/pg/test/integration/gh-issues/2862-tests.js index d04117779..5e36d21ef 100644 --- a/packages/pg/test/integration/gh-issues/2862-tests.js +++ b/packages/pg/test/integration/gh-issues/2862-tests.js @@ -1,27 +1,23 @@ 'use strict' -var helper = require('./../test-helper') -var assert = require('assert') -var util = require('util') -var vm = require('vm'); + +const helper = require('../test-helper') +const assert = require('assert') +const vm = require('vm') const suite = new helper.Suite() -suite.test('Handle date objects as Date', async (done) => { - const date = new Date(); - const dateObj = await vm.runInNewContext('new Date()'); - assert(!(dateObj instanceof Date)) - assert(util.types.isDate(dateObj)) +suite.testAsync('Handle date objects as Date', async () => { + const crossRealmDate = await vm.runInNewContext('new Date()') + assert(!(crossRealmDate instanceof Date)) + const date = new Date(crossRealmDate.getTime()) const client = new helper.pg.Client() - client.connect() + await client.connect() - await client.query('CREATE TEMP TABLE foo(bar TIMESTAMP, bar2 TIMESTAMP)') - await client.query('INSERT INTO foo(bar, bar2) VALUES($1, $2)', [date, dateObj]) + await client.query('CREATE TEMP TABLE foo(bar timestamptz, bar2 timestamptz)') + await client.query('INSERT INTO foo(bar, bar2) VALUES($1, $2)', [date, crossRealmDate]) const results = await client.query('SELECT * FROM foo') const row = results.rows[0] - const dbDate = row.bar - const dbDateObj = row.bar2 - assert.deepEqual(dbDate, date) - assert.deepEqual(dbDateObj, dateObj) + assert.deepStrictEqual(row.bar, date) + assert.deepStrictEqual(row.bar2, date) await client.end() - done() })