[Dbix-class] DBIx-Class-Schema-Loader bug: SQLite schema w/ "extra" newline bombs out the Loader

Jay Hannah jay at jays.net
Sat Mar 22 00:56:19 GMT 2008


Hola --

Penfold and I think we found a bug. sqlite3 doesn't care about an extra 
newline when creating a table, but DBIx-Class-Schema-Loader pukes.

I haven't patched it (yet?), but it's pretty easy to reproduce.


Straight from a fresh download, everything goes OK (ignoring a couple warnings):

$ pwd
/home/jhannah/src/DBIx-Class-Schema-Loader-0.04004
$ prove t/10sqlite_common.t
t/10sqlite_common....ok 1/88DBI::db=HASH(0x87767ec)->disconnect invalidates 1 active statement handle (either destroy statement handles or call finish on them before disconnecting) at /usr/lib/perl5/site_perl/5.8.8/DBIx/Class/Storage/DBI.pm line 691.
closing dbh with active statement handles at /usr/lib/perl5/site_perl/5.8.8/DBIx/Class/Storage/DBI.pm line 691.
t/10sqlite_common....ok
         8/88 skipped: SQLite cannot do the advanced tests
All tests successful, 8 subtests skipped.
Files=1, Tests=88,  1 wallclock secs ( 0.76 cusr +  0.21 csys =  0.97 CPU)


Let's demonstrate the bug.

$ vi t/lib/dbixcsl_common_tests.pm

hop down to line 531, and add a newline before the paren:

Before:
             CREATE TABLE loader_test1 (

After:
             CREATE TABLE loader_test1
             (


Now when we run the same tests, things go horribly wrong:


prove t/10sqlite_common.t
t/10sqlite_common....NOK 1
#   Failed test 'Loader initialization'
#   at t/lib/dbixcsl_common_tests.pm line 87.
# DBIx::Class::Schema::Loader::connection(): No such column create on table loader_test1 at (eval 19) line 6
t/10sqlite_common....NOK 2
#   Failed test at t/lib/dbixcsl_common_tests.pm line 95.
#          got: '0'
#     expected: '1'
# Did not get the expected 1 warning.  Warnings are:
t/10sqlite_common....NOK 3
#   Failed test at t/lib/dbixcsl_common_tests.pm line 98.
#                   undef
#     doesn't match '(?i-xsm:loader_test9 has no primary key)'
Use of uninitialized value in exists at /usr/lib/perl5/site_perl/5.8.8/DBIx/Class/Schema.pm line 170.
Use of uninitialized value in hash element at /usr/lib/perl5/site_perl/5.8.8/DBIx/Class/Schema.pm line 173.
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/site_perl/5.8.8/DBIx/Class/Schema.pm line 174.
DBIx::Class::Schema::resultset(): Can't find source for  at t/lib/dbixcsl_common_tests.pm line 113
# Looks like you planned 88 tests but only ran 3.
# Looks like you failed 3 tests of 3 run.
# Looks like your test died just after 3.
t/10sqlite_common....dubious
         Test returned status 255 (wstat 65280, 0xff00)
DIED. FAILED tests 1-88
         Failed 88/88 tests, 0.00% okay
Failed Test         Stat Wstat Total Fail  Failed  List of Failed
-------------------------------------------------------------------------------
t/10sqlite_common.t  255 65280    88  173 196.59%  1-88
Failed 1/1 test scripts, 0.00% okay. 88/88 subtests failed, 0.00% okay.


sqlite3 is perfectly happy with that create table syntax, but DBIx-Class-Schema-Loader is not.

This is bad, since valid .schema's inside SQLite render 
DBIx-Class-Schema-Loader useless. And hopefully this is an easy fix for an 
eye more trained than mine?


So where's the bug?

Maybe it's around _sqlite_parse_table() in DBIx/Class/Schema/Loader/DBI/SQLite.pm line 65?:

     # Cut "CREATE TABLE ( )" blabla...
     $sql =~ /^[\w\s']+\((.*)\)$/si;

I tried a couple patch attempts but didn't seem to figure it out...

Want me to keep chasing a patch?

Thanks all,

j
http://clab.ist.unomaha.edu/CLAB/index.php/User:Jhannah




More information about the DBIx-Class mailing list