sqlite3-ruby でプレースホルダの最初の引数が無視される問題について

環境によっては sqlite3-rubyプレースホルダを使うと最初の引数が無視されるという問題が発生することがある.

require 'rubygems'
require 'sqlite3'

db = SQLite3::Database.new("test.db")
db.execute("CREATE TABLE t (a INTEGER PRIMARY KEY, b INTEGER, c INTEGER)")
db.execute("INSERT INTO t (b, c) VALUES (?, ?)", 42, 666)

これを実行すると t には (a, b, c) = (1, 42, 666) という組が挿入されるはずだが,特定の環境では (a, b, c) = (1, NULL, 666) という組が挿入されてしまう.

プレースホルダの引数を配列にして渡すと,この問題は解決できるらしい.

require 'rubygems'
require 'sqlite3'

db = SQLite3::Database.new("test.db")
db.execute("CREATE TABLE t (a INTEGER PRIMARY KEY, b INTEGER, c INTEGER)")
db.execute("INSERT INTO t (b, c) VALUES (?, ?)", [42, 666])      # プレースホルダの引数を配列にした

これは正しく動く.