<URL: https://rt.cpan.org/Ticket/Display.html?id=82814 >
A little more information about this long-standing bug (RT ticket #82814). First, the change in behavior in SQL::Translator probably happened about 2008 and involved wrapping transaction commit statements around the return value. The problem was that if SQL::Translator's SQLite output module didn't find any actionable statements, it would still return begin transaction/commit statements, so your groovy fall-back code that would just use the INSERT didn't get a chance to work - it made it appear that SQL::Translator had translated them. I didn't like the idea of cluttering your code with an explicit INSERT detector, so I've submitted a patch to the SQLite output module (with the agreement of the SQL::Translator maintainers) and hopefully that will be cleared up next time they post a new version to CPAN. Once that was working, though, it revealed another problem with the tests - your scheme of letting the error for reinvocation of the setup fall through to the caller doesn't work any more. I added a flag (already_called) and an explicit check for the flag, which also allows us to return a better error message. Once the SQL::Translator patch is in the CPAN distro, this patch will allow Class::DBI::DATA::Schema to install cleanly again. I've attached a patch to this bug report; alternatively, I've also set up a version update to 1.01 on Github at https://github.com/Vivtek/Class-DBI-DATA-Schema if you don't want to mess with it (in other words, I'm offering to take over co-maintainer status, which shouldn't make much difference, since honestly very little should ever need much maintenance in this module.)
*** Class-DBI-DATA-Schema-1.00/lib/Class/DBI/DATA/Schema.pm 2005-09-03 22:19:23.000000000 +0200 --- Class-DBI-DATA-Schema/lib/Class/DBI/DATA/Schema.pm 2013-03-16 20:39:41.744198600 +0100 *************** *** 120,134 **** --- 120,139 ---- chomp(my $sql = <$h>); return grep /\S/, split /;/, $translating ? $transform->($sql) : $sql; }; my %cache; + + my $already_run = 0; no strict 'refs'; *{"$caller\::run_data_sql"} = sub { my $class = shift; + die "Data SQL already run" if $already_run; no strict 'refs'; $cache{$class} ||= [ $get_statements->(*{"$class\::DATA"}{IO}) ]; $class->db_Main->do($_) foreach @{ $cache{$class} }; + $already_run = 1; return 1; }