TryGhost / node-sqlite3

SQLite3 bindings for Node.js

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Incorrect/broken example in documentation regarding parameter binding

mvduin opened this issue · comments

Issue Summary

The documentation for Database#run states:

      db.run("UPDATE tbl SET name = ?5 WHERE id = ?", {
          1: 2,
          5: "bar"
      });

This binds the first placeholder ($id) to 2 and the placeholder with index 5 to "bar".

This is incorrect, to quote the sqlite documentation:

A question mark that is not followed by a number creates a parameter with a number one greater than the largest parameter number already assigned.

Therefore the ? will be parameter 6, not parameter 1.

Steps to Reproduce

Demonstration:

'use strict';

const { promisify } = require('util');
const events = require('events');
const sqlite3 = require('sqlite3');

(async () => {
	let db = new sqlite3.Database(':memory:');
	await events.once(db, 'open');

	db.get_p = promisify(db.get);

	console.log( await db.get_p(`SELECT ?5, ?`, { 1: 2, 5: "bar" }) );
	console.log( await db.get_p(`SELECT ?5, ?`, { 6: 2, 5: "bar" }) );
	console.log( await db.get_p(`SELECT ?5, ?`, 1, 2, 3, 4, 5, 6) );
})();

output:

{ '?5': 'bar', '?': null }
{ '?5': 'bar', '?': 2 }
{ '?5': 5, '?': 6 }

Version

n/a

Node.js Version

n/a

How did you install the library?

n/a