diff --git a/lib/protocol/packets/RowDataPacket.js b/lib/protocol/packets/RowDataPacket.js index 0912ce047..008c2b1de 100644 --- a/lib/protocol/packets/RowDataPacket.js +++ b/lib/protocol/packets/RowDataPacket.js @@ -100,7 +100,7 @@ function typeCast(field, parser, timeZone, supportBigNumbers, bigNumberStrings, numberString = parser.parseLengthCodedString(); return (numberString === null || (field.zeroFill && numberString[0] == "0")) ? numberString - : ((supportBigNumbers && (bigNumberStrings || (Number(numberString) > IEEE_754_BINARY_64_PRECISION))) + : ((supportBigNumbers && (bigNumberStrings || (Number(numberString) >= IEEE_754_BINARY_64_PRECISION) || (Number(numberString) <= -IEEE_754_BINARY_64_PRECISION))) ? numberString : Number(numberString)); case Types.BIT: diff --git a/test/integration/connection/test-query-bigint.js b/test/integration/connection/test-query-bigint.js new file mode 100644 index 000000000..831a03143 --- /dev/null +++ b/test/integration/connection/test-query-bigint.js @@ -0,0 +1,37 @@ +var assert = require('assert'); +var common = require('../../common'); + +var table = 'bigint_test'; + +common.getTestConnection({supportBigNumbers: true}, function (err, connection) { + assert.ifError(err); + + common.useTestDb(connection); + + connection.query([ + 'CREATE TEMPORARY TABLE ?? (', + '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,', + '`big` bigint,', + 'PRIMARY KEY (`id`)', + ') ENGINE=InnoDB DEFAULT CHARSET=utf8' + ].join('\n'), [table], assert.ifError); + + connection.query('INSERT INTO ?? SET ?', [table, {big: '9223372036854775807'}]); + connection.query('INSERT INTO ?? SET ?', [table, {big: '-9223372036854775807'}]); + connection.query('INSERT INTO ?? SET ?', [table, {big: '1111111111111111111'}]); + connection.query('INSERT INTO ?? SET ?', [table, {big: '-1111111111111111111'}]); + connection.query('INSERT INTO ?? SET ?', [table, {big: '9007199254740993'}]); + connection.query('INSERT INTO ?? SET ?', [table, {big: '-9007199254740993'}]); + + connection.query('SELECT * FROM ??', [table], function (err, rows) { + assert.ifError(err); + assert.equal(rows.length, 6); + assert.strictEqual(rows[0].big, '9223372036854775807'); + assert.strictEqual(rows[1].big, '-9223372036854775807'); + assert.strictEqual(rows[2].big, '1111111111111111111'); + assert.strictEqual(rows[3].big, '-1111111111111111111'); + assert.strictEqual(rows[4].big, '9007199254740993'); + assert.strictEqual(rows[5].big, '-9007199254740993'); + connection.end(assert.ifError); + }); +});