From: Ash Berlin Date: Tue, 9 Jun 2009 10:20:34 +0000 (+0000) Subject: Addjust bug to show problem with rows => 1 + child rel X-Git-Tag: v0.08106~23 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=5624ba1f2ca3c8b47b9dd9472dff0081ddb4ac78;p=dbsrgits%2FDBIx-Class.git Addjust bug to show problem with rows => 1 + child rel --- diff --git a/t/prefetch/rows_bug.t b/t/prefetch/rows_bug.t index 1457013..7f13872 100644 --- a/t/prefetch/rows_bug.t +++ b/t/prefetch/rows_bug.t @@ -7,7 +7,7 @@ use Test::More; use lib qw(t/lib); use DBICTest; -plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 2); +plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 3); my $schema = DBICTest->init_schema(); my $no_prefetch = $schema->resultset('Artist')->search( @@ -28,18 +28,37 @@ my $use_prefetch_count = 0; is($no_prefetch->count, $use_prefetch->count, '$no_prefetch->count == $use_prefetch->count'); -TODO: { - local $TODO = "This is a difficult bug to fix, workaround is not to use prefetch with rows"; - $no_prefetch_count++ while $no_prefetch->next; - $use_prefetch_count++ while $use_prefetch->next; - is( - $no_prefetch_count, - $use_prefetch_count, - "manual row count confirms consistency" - . " (\$no_prefetch_count == $no_prefetch_count, " - . " \$use_prefetch_count == $use_prefetch_count)" - ); -} +$no_prefetch_count++ while $no_prefetch->next; +$use_prefetch_count++ while $use_prefetch->next; +is( + $no_prefetch_count, + $use_prefetch_count, + "manual row count confirms consistency" + . " (\$no_prefetch_count == $no_prefetch_count, " + . " \$use_prefetch_count == $use_prefetch_count)" +); + +$no_prefetch = $schema->resultset('Artist')->search( + undef, + { rows => 1 } +); + +$use_prefetch = $schema->resultset('Artist')->search( + undef, + { + prefetch => 'cds', + rows => 1 + } +); + +my $prefetch_artist = $use_prefetch->first; +my $normal_artist = $no_prefetch->first; + +is( + $prefetch_artist->cds->count, + $normal_artist->cds->count, + "Count of child rel with prefetch + rows => 1 is right" +); __END__ The fix is to, when using prefetch, take the query and put it into a subquery @@ -78,6 +97,7 @@ becomes: Problem: * The prefetch->join change needs to happen ONLY IF there are conditions that depend on bar being joined. + * Count of child rel. * How will this work when the $rs is further searched on? Those clauses need to be added to the subquery, not the outer one. This is particularly true if rows is added in the attribute later per the Pager.