1 # Test to ensure we get a consistent result set wether or not we use the
2 # prefetch option in combination rows (LIMIT).
10 plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 2);
12 my $schema = DBICTest->init_schema();
13 $schema->storage->debug(1);
14 my $no_prefetch = $schema->resultset('Artist')->search(
19 my $use_prefetch = $schema->resultset('Artist')->search(
27 my $no_prefetch_count = 0;
28 my $use_prefetch_count = 0;
30 is($no_prefetch->count, $use_prefetch->count, '$no_prefetch->count == $use_prefetch->count');
33 local $TODO = "This is a difficult bug to fix, workaround is not to use prefetch with rows";
34 $no_prefetch_count++ while $no_prefetch->next;
35 $use_prefetch_count++ while $use_prefetch->next;
39 "manual row count confirms consistency"
40 . " (\$no_prefetch_count == $no_prefetch_count, "
41 . " \$use_prefetch_count == $use_prefetch_count)"
46 The fix is to, when using prefetch, take the query and put it into a subquery
47 joined to the tables we're prefetching from. This might result in the same
48 table being joined once in the main subquery and once in the main query. This
49 may actually resolve other, unknown edgecase bugs. It is also the right way
50 to do prefetching. Optimizations can come later.
62 my $temp = $foo_rs->search(
69 $foo_rs->storage->schema->resultset('foo')->search(
73 { me => $temp->as_query },
80 * The prefetch->join change needs to happen ONLY IF there are conditions
81 that depend on bar being joined.