node-sqlite3
node-sqlite3 copied to clipboard
node-sqlite3 adds decimal 0 to large numbers
I've encountered different behavior regarding large numbers with node-sqlite3. I have a table like
CREATE TABLE IF NOT EXISTS test (
number TEXT NOT NULL
);
and a code like
const sqlite = require('sqlite3');
const sql1 = 'INSERT INTO test (number) VALUES ($number)';
const sql2 = 'INSERT INTO test (number) VALUES (4937380689)';
const database = new (sqlite.verbose().Database)('/tmp/data.db', () => {
const stmt = database.prepare(sql1);
stmt.run({ $number: 4937380689 }, function (err) {
if (err) {
console.log('Error');
return;
}
console.log('Success');
});
stmt.run({ $number: 49373806 }, function (err) {
if (err) {
console.log('Error');
return;
}
console.log('Success');
});
database.prepare(sql2).run(function (err) {
if (err) {
console.log('Error');
return;
}
console.log('Success');
});
});
This code inserts 3 numbers as text into a table. The actual result is
4937380689.0
4937380689
49373806
but the expected result is
4937380689
4937380689
49373806
Why does node-sqlite3 add .0 in the first case? Is this a bug or a (undocumented?) feature? It only happens for numbers with at least 9 digits and only in prepared statements with variables.
Minimal repro:
const sqlite3 = require('./').verbose();
const db = new sqlite3.Database(':memory:');
db.serialize();
db.exec('CREATE TABLE IF NOT EXISTS test (number TEXT NOT NULL);');
db.run('INSERT INTO test (number) VALUES ($number)', {$number: 4937380689}, console.log);
db.all('SELECT * FROM test', console.log);