From 3890bba0d5e0462582a6077830bec5856e393b63 Mon Sep 17 00:00:00 2001 From: Wes Garland Date: Tue, 1 Mar 2022 15:47:15 -0500 Subject: [PATCH 1/3] Fix precision bug in parseFloat affecting select(DOUBLE) in prepared statements --- lib/packets/packet.js | 41 +++++++---------------------------------- 1 file changed, 7 insertions(+), 34 deletions(-) diff --git a/lib/packets/packet.js b/lib/packets/packet.js index ccf3a8458c..69250e7c1b 100644 --- a/lib/packets/packet.js +++ b/lib/packets/packet.js @@ -645,44 +645,17 @@ class Packet { return new Date(`${str}${timezone}`); } - parseFloat(len) { - if (len === null) { - return null; - } - let result = 0; + parseFloat(len) + { + const start = this.offset; const end = this.offset + len; - let factor = 1; - let pastDot = false; - let charCode = 0; + this.offset += len; + if (len === 0) { return 0; // TODO: assert? exception? } - if (this.buffer[this.offset] === minus) { - this.offset++; - factor = -1; - } - if (this.buffer[this.offset] === plus) { - this.offset++; // just ignore - } - while (this.offset < end) { - charCode = this.buffer[this.offset]; - if (charCode === dot) { - pastDot = true; - this.offset++; - } else if (charCode === exponent || charCode === exponentCapital) { - this.offset++; - const exponentValue = this.parseInt(end - this.offset); - return (result / factor) * Math.pow(10, exponentValue); - } else { - result *= 10; - result += this.buffer[this.offset] - 48; - this.offset++; - if (pastDot) { - factor = factor * 10; - } - } - } - return result / factor; + + return parseFloat(this.buffer.slice(start, end).toString('ascii')); } parseLengthCodedIntNoBigCheck() { From 8669cc6aa7b643d0c322a5efec55e7f34824e5ed Mon Sep 17 00:00:00 2001 From: Wes Garland Date: Tue, 1 Mar 2022 15:54:00 -0500 Subject: [PATCH 2/3] packet.js - style nit to minimize diff --- lib/packets/packet.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/packets/packet.js b/lib/packets/packet.js index 69250e7c1b..f9ee70e7d9 100644 --- a/lib/packets/packet.js +++ b/lib/packets/packet.js @@ -645,8 +645,7 @@ class Packet { return new Date(`${str}${timezone}`); } - parseFloat(len) - { + parseFloat(len) { const start = this.offset; const end = this.offset + len; this.offset += len; From f4698d277d349393e78d40e5d5bcffb0ccf4bc3b Mon Sep 17 00:00:00 2001 From: Wes Garland Date: Tue, 1 Mar 2022 20:55:30 -0500 Subject: [PATCH 3/3] packet.js parseFloat - eliminate unnecessary Buffer.slice() --- lib/packets/packet.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/packets/packet.js b/lib/packets/packet.js index f9ee70e7d9..e3c3a562d1 100644 --- a/lib/packets/packet.js +++ b/lib/packets/packet.js @@ -653,8 +653,8 @@ class Packet { if (len === 0) { return 0; // TODO: assert? exception? } - - return parseFloat(this.buffer.slice(start, end).toString('ascii')); + + return parseFloat(this.buffer.toString('ascii', start, end)); } parseLengthCodedIntNoBigCheck() {