Skip to content

Commit

Permalink
[CONJS-285] DECIMAL field wrong decoding with deprecated option 'supp…
Browse files Browse the repository at this point in the history
…ortBigNumbers' set
  • Loading branch information
rusher committed Mar 18, 2024
1 parent f4452f7 commit 8f88f9d
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 11 deletions.
12 changes: 8 additions & 4 deletions lib/cmd/decoder/binary-decoder.js
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ const readDecimalAsIntBinary = (packet, opts, throwUnexpectedError, nullBitmap,
);
}
if (opts.supportBigNumbers && (opts.bigNumberStrings || !Number.isSafeInteger(Number(valDec)))) {
return valDec.toString();
return valDec;
}
return Number(valDec);
}
Expand All @@ -237,10 +237,14 @@ const readDecimalBinary = (packet, opts, throwUnexpectedError, nullBitmap, index
if (isNullBitmap(index, nullBitmap)) return null;
const valDec = packet.readDecimalLengthEncoded();
if (valDec != null && (opts.decimalAsNumber || opts.supportBigNumbers)) {
if (opts.supportBigNumbers && (opts.bigNumberStrings || !Number.isSafeInteger(Number(valDec)))) {
return valDec.toString();
const numberValue = Number(valDec);
if (
opts.supportBigNumbers &&
(opts.bigNumberStrings || (Number.isInteger(numberValue) && !Number.isSafeInteger(numberValue)))
) {
return valDec;
}
return Number(valDec);
return numberValue;
}
return valDec;
};
Expand Down
12 changes: 8 additions & 4 deletions lib/cmd/decoder/text-decoder.js
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ const readDecimalAsIntLengthCoded = (packet, opts, throwUnexpectedError) => {
);
}
if (opts.supportBigNumbers && (opts.bigNumberStrings || !Number.isSafeInteger(Number(valDec)))) {
return valDec.toString();
return valDec;
}
return Number(valDec);
}
Expand All @@ -152,10 +152,14 @@ const readDecimalAsIntLengthCoded = (packet, opts, throwUnexpectedError) => {
const readDecimalLengthCoded = (packet, opts, throwUnexpectedError) => {
const valDec = packet.readDecimalLengthEncoded();
if (valDec != null && (opts.decimalAsNumber || opts.supportBigNumbers)) {
if (opts.supportBigNumbers && (opts.bigNumberStrings || !Number.isSafeInteger(Number(valDec)))) {
return valDec.toString();
const numberValue = Number(valDec);
if (
opts.supportBigNumbers &&
(opts.bigNumberStrings || (Number.isInteger(numberValue) && !Number.isSafeInteger(numberValue)))
) {
return valDec;
}
return Number(valDec);
return numberValue;
}
return valDec;
};
Expand Down
24 changes: 21 additions & 3 deletions test/integration/datatype/test-integer.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ describe('integer with big value', () => {
after(async () => {
await shareConn.query('DROP TABLE IF EXISTS testBigint');
await shareConn.query('DROP TABLE IF EXISTS testInt');
await shareConn.query('DROP TABLE IF EXISTS floatTest');
// await shareConn.query('DROP TABLE IF EXISTS floatTest');
await shareConn.query('DROP TABLE IF EXISTS floatTestUnsigned');
});

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

const expectedNumberConvert = [
{
t: -0.1,
t2: 128.3,
t3: 129
},
{
t: -0.9999237060546875,
t2: '9999237060546875.9999237060546875',
t3: '9999237060546875'
}
];
rows = await shareConn.query({ sql: 'SELECT * FROM floatTest', decimalAsNumber: true, supportBigNumbers: true });
assert.deepEqual(rows, expectedNumberConvert);

rows = await shareConn.execute({ sql: 'SELECT * FROM floatTest', decimalAsNumber: true, supportBigNumbers: true });
assert.deepEqual(rows, expectedNumberConvert);

try {
await shareConn.query({ sql: 'SELECT * FROM floatTest', decimalAsNumber: true, checkNumberRange: true });
throw new Error('Expected to have failed');
Expand All @@ -94,7 +112,7 @@ describe('integer with big value', () => {
const expectedBigNumber = [
{
t: -0.1,
t2: '128.3000000000000000',
t2: 128.3,
t3: 129
},
{ t: -0.9999237060546875, t2: '9999237060546875.9999237060546875', t3: '9999237060546875' }
Expand Down Expand Up @@ -181,7 +199,7 @@ describe('integer with big value', () => {
const expectedBigNumber = [
{
t: 0.1,
t2: '128.3000000000000000',
t2: 128.3,
t3: 129
},
{ t: 0.9999237060546875, t2: '9999237060546875.9999237060546875', t3: '9999237060546875' }
Expand Down

0 comments on commit 8f88f9d

Please sign in to comment.