Skip to content

Commit 8f88f9d

Browse files
committed
[CONJS-285] DECIMAL field wrong decoding with deprecated option 'supportBigNumbers' set
1 parent f4452f7 commit 8f88f9d

File tree

3 files changed

+37
-11
lines changed

3 files changed

+37
-11
lines changed

lib/cmd/decoder/binary-decoder.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ const readDecimalAsIntBinary = (packet, opts, throwUnexpectedError, nullBitmap,
227227
);
228228
}
229229
if (opts.supportBigNumbers && (opts.bigNumberStrings || !Number.isSafeInteger(Number(valDec)))) {
230-
return valDec.toString();
230+
return valDec;
231231
}
232232
return Number(valDec);
233233
}
@@ -237,10 +237,14 @@ const readDecimalBinary = (packet, opts, throwUnexpectedError, nullBitmap, index
237237
if (isNullBitmap(index, nullBitmap)) return null;
238238
const valDec = packet.readDecimalLengthEncoded();
239239
if (valDec != null && (opts.decimalAsNumber || opts.supportBigNumbers)) {
240-
if (opts.supportBigNumbers && (opts.bigNumberStrings || !Number.isSafeInteger(Number(valDec)))) {
241-
return valDec.toString();
240+
const numberValue = Number(valDec);
241+
if (
242+
opts.supportBigNumbers &&
243+
(opts.bigNumberStrings || (Number.isInteger(numberValue) && !Number.isSafeInteger(numberValue)))
244+
) {
245+
return valDec;
242246
}
243-
return Number(valDec);
247+
return numberValue;
244248
}
245249
return valDec;
246250
};

lib/cmd/decoder/text-decoder.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ const readDecimalAsIntLengthCoded = (packet, opts, throwUnexpectedError) => {
143143
);
144144
}
145145
if (opts.supportBigNumbers && (opts.bigNumberStrings || !Number.isSafeInteger(Number(valDec)))) {
146-
return valDec.toString();
146+
return valDec;
147147
}
148148
return Number(valDec);
149149
}
@@ -152,10 +152,14 @@ const readDecimalAsIntLengthCoded = (packet, opts, throwUnexpectedError) => {
152152
const readDecimalLengthCoded = (packet, opts, throwUnexpectedError) => {
153153
const valDec = packet.readDecimalLengthEncoded();
154154
if (valDec != null && (opts.decimalAsNumber || opts.supportBigNumbers)) {
155-
if (opts.supportBigNumbers && (opts.bigNumberStrings || !Number.isSafeInteger(Number(valDec)))) {
156-
return valDec.toString();
155+
const numberValue = Number(valDec);
156+
if (
157+
opts.supportBigNumbers &&
158+
(opts.bigNumberStrings || (Number.isInteger(numberValue) && !Number.isSafeInteger(numberValue)))
159+
) {
160+
return valDec;
157161
}
158-
return Number(valDec);
162+
return numberValue;
159163
}
160164
return valDec;
161165
};

test/integration/datatype/test-integer.js

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ describe('integer with big value', () => {
2222
after(async () => {
2323
await shareConn.query('DROP TABLE IF EXISTS testBigint');
2424
await shareConn.query('DROP TABLE IF EXISTS testInt');
25-
await shareConn.query('DROP TABLE IF EXISTS floatTest');
25+
// await shareConn.query('DROP TABLE IF EXISTS floatTest');
2626
await shareConn.query('DROP TABLE IF EXISTS floatTestUnsigned');
2727
});
2828

@@ -77,6 +77,24 @@ describe('integer with big value', () => {
7777
rows = await shareConn.execute({ sql: 'SELECT * FROM floatTest', decimalAsNumber: true });
7878
assert.deepEqual(rows, expectedNumber);
7979

80+
const expectedNumberConvert = [
81+
{
82+
t: -0.1,
83+
t2: 128.3,
84+
t3: 129
85+
},
86+
{
87+
t: -0.9999237060546875,
88+
t2: '9999237060546875.9999237060546875',
89+
t3: '9999237060546875'
90+
}
91+
];
92+
rows = await shareConn.query({ sql: 'SELECT * FROM floatTest', decimalAsNumber: true, supportBigNumbers: true });
93+
assert.deepEqual(rows, expectedNumberConvert);
94+
95+
rows = await shareConn.execute({ sql: 'SELECT * FROM floatTest', decimalAsNumber: true, supportBigNumbers: true });
96+
assert.deepEqual(rows, expectedNumberConvert);
97+
8098
try {
8199
await shareConn.query({ sql: 'SELECT * FROM floatTest', decimalAsNumber: true, checkNumberRange: true });
82100
throw new Error('Expected to have failed');
@@ -94,7 +112,7 @@ describe('integer with big value', () => {
94112
const expectedBigNumber = [
95113
{
96114
t: -0.1,
97-
t2: '128.3000000000000000',
115+
t2: 128.3,
98116
t3: 129
99117
},
100118
{ t: -0.9999237060546875, t2: '9999237060546875.9999237060546875', t3: '9999237060546875' }
@@ -181,7 +199,7 @@ describe('integer with big value', () => {
181199
const expectedBigNumber = [
182200
{
183201
t: 0.1,
184-
t2: '128.3000000000000000',
202+
t2: 128.3,
185203
t3: 129
186204
},
187205
{ t: 0.9999237060546875, t2: '9999237060546875.9999237060546875', t3: '9999237060546875' }

0 commit comments

Comments
 (0)