From a438e61e2abad5edf49bcdadd0d7a113e55a7b77 Mon Sep 17 00:00:00 2001 From: Sergey Tatarintsev Date: Mon, 6 Nov 2023 15:26:42 +0100 Subject: [PATCH] fix: Precision loss on extremely large floating-point numbers Sets `extra_float_digits` setting to 1 when connecting to DB. For older (<12) Postgres, this should be enough to cover all values JS can store preciesely. For 12+ postgres this setting should have no effect. Fix #3092 --- packages/pg-protocol/src/serializer.ts | 1 + packages/pg/test/integration/client/type-coercion-tests.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/pg-protocol/src/serializer.ts b/packages/pg-protocol/src/serializer.ts index 07e2fe498..4adb3f331 100644 --- a/packages/pg-protocol/src/serializer.ts +++ b/packages/pg-protocol/src/serializer.ts @@ -26,6 +26,7 @@ const startup = (opts: Record): Buffer => { } writer.addCString('client_encoding').addCString('UTF8') + writer.addCString('extra_float_digits').addCString('1') var bodyBuffer = writer.addCString('').flush() // this message is sent without a code diff --git a/packages/pg/test/integration/client/type-coercion-tests.js b/packages/pg/test/integration/client/type-coercion-tests.js index 3bc6273c4..581511e5a 100644 --- a/packages/pg/test/integration/client/type-coercion-tests.js +++ b/packages/pg/test/integration/client/type-coercion-tests.js @@ -108,7 +108,7 @@ var types = [ }, { name: 'double precision', - values: [-101.3, -1.2, 0, 1.2, 101.1, null], + values: [-101.3, -1.2, 0, 1.2, 101.1, Number.MAX_SAFE_INTEGER, null], }, { name: 'timestamptz',