DBD::SQLite 1.34_02

もう一週間近くたってしまいましたが、DBD::SQLite 1.34_02が出ています。今回はいくつか後方非互換な修正が入っているので、簡単に説明しておきます。

まず一点目。従来のDBD::SQLiteではbind_paramで明示的にデータ型を指定しても、その指定はその場限りで次に残らなかったのですが、これはDBIの仕様に反しているということで、一度指定したデータ型はそのまま残るように修正しました。具体的にいうと、このようなコードがあった場合、従来はfooは明示的に指定したBLOB型、barの方はデフォルトのTEXT型となっていたのですが、1.34_02以降は両方ともBLOB型になります。

use strict;
use warnings;
use DBI qw/:sql_types/;
use Data::Dump qw/dump/;

my $dbh = DBI->connect('dbi:SQLite::memory:');
$dbh->do('create table foo (t)');
my $sth = $dbh->prepare('insert into foo values(?)');
$sth->bind_param(1, 'foo', SQL_BLOB);
$sth->execute;
$sth->execute('bar');

dump($dbh->selectall_arrayref('select typeof(t) from foo'));

それから、これもbind_paramまわりの修正ですが、明示的にSQL_INTEGERを指定した場合、従来はたとえテキストを渡してもPerlが微妙な警告とともによしなに数値化した値を入れてくれていたのですが、1.34_02で、数値ではない値を入れた場合はエラーを吐くようになりました。コード例はこちら。

use strict;
use warnings;
use DBI qw/:sql_types/;
use Data::Dump qw/dump/;

my $dbh = DBI->connect('dbi:SQLite::memory:');
$dbh->do('create table foo (t integer)');
my $sth = $dbh->prepare('insert into foo values(?)');
$sth->bind_param(1, 'foo', SQL_INTEGER);
$sth->execute;
dump($dbh->selectall_arrayref('select t from foo'));

実はこの部分、1.34_02では$sth->errstrなどにはエラーが設定されるもののRaiseError=>1でも死なないというバグがあるのですが(リポジトリでは修正済みです)、この変更によってDBIx::Classのテストがこけることがわかっています。この問題はDBIC側でも認識されているので近日中に更新があるかと思います。

その他、エラーが起こったときにステートメントハンドルを再利用するとおかしな挙動をしていた問題や、bind_colにBLOB型の指定をすると値を取り出せなくなっていた問題、MacOSXでは1.34_01のコンパイルが通らなかった問題なども直っています(詳しくはChangesや該当のテストをご確認ください)。

来月22日には1.35をリリースする予定になっています。お使いの方はそれまでに開発版で問題が起こらないかテストをおねがいします。