node-sqlite3 icon indicating copy to clipboard operation
node-sqlite3 copied to clipboard

node-sqlite3 adds decimal 0 to large numbers

Open jabaa opened this issue 4 years ago • 1 comments

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.

jabaa avatar Aug 08 '21 17:08 jabaa

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);

daniellockyer avatar Sep 16 '22 09:09 daniellockyer