current commit
261014.6 · sqlite: use shared-shape objects for result rows
'use strict';
const common = require('../common.js');
const sqlite = require('node:sqlite');
const assert = require('assert');

const bench = common.createBenchmark(main, {
  n: [1e4],
  rows: [1, 100],
  method: ['all', 'iterate', 'get'],
  returnArrays: [0, 1],
});

function main(conf) {
  const db = new sqlite.Database(':memory:');
  db.exec(
    'CREATE TABLE foo (text_column TEXT, integer_column INTEGER, real_column REAL, blob_column BLOB)',
  );
  const insert = db.prepare('INSERT INTO foo VALUES (?, ?, ?, ?)');
  for (let i = 0; i < conf.rows; i++) {
    insert.run(`text ${i}`, i, i / 3, Buffer.from('example blob data'));
  }

  const stmt = db.prepare(`SELECT * FROM foo LIMIT ${conf.rows}`);
  stmt.setReturnArrays(conf.returnArrays === 1);

  // Each row is built and then has every column read once.
  const read = conf.returnArrays ?
    (row) => row[0].length + row[1] + row[2] + row[3].length :
    (row) => row.text_column.length + row.integer_column +
             row.real_column + row.blob_column.length;

  let sum = 0;
  bench.start();
  for (let i = 0; i < conf.n; i++) {
    if (conf.method === 'get') {
      sum += read(stmt.get());
    } else {
      for (const row of stmt[conf.method]()) sum += read(row);
    }
  }
  bench.end(conf.n);

  assert.ok(sum > 0);
}