Fix the join/prefetch resolver when dealing with ''/undef/()
Peter Rabbitson [Sat, 26 Nov 2011 01:41:16 +0000 (02:41 +0100)]
Changes
lib/DBIx/Class/ResultSet.pm
lib/DBIx/Class/ResultSource.pm
t/prefetch/diamond.t

diff --git a/Changes b/Changes
index 895bb70..69fc7ba 100644 (file)
--- a/Changes
+++ b/Changes
@@ -17,6 +17,8 @@ Revision history for DBIx::Class
         - Fix test failures on perl < 5.8.7 and new Package::Stash::XS
         - Fix TxnScopeGuard not behaving correctly when $@ is set at the
           time of $guard instantiation
+        - Fix the join/prefetch resolver when dealing with ''/undef/()
+          relation specifications
 
     * Misc
         - No longer depend on Variable::Magic now that a pure-perl
index dee7c30..d883551 100644 (file)
@@ -3440,6 +3440,7 @@ sub _merge_joinpref_attr {
       $position++;
     }
     my ($import_key) = ( ref $import_element eq 'HASH' ) ? keys %{$import_element} : ($import_element);
+    $import_key = '' if not defined $import_key;
 
     if ($best_candidate->{score} == 0 || exists $seen_keys->{$import_key}) {
       push( @{$orig}, $import_element );
index 75287bd..c523745 100644 (file)
@@ -1461,7 +1461,7 @@ sub _resolve_join {
 
   $jpath = [@$jpath]; # copy
 
-  if (not defined $join) {
+  if (not defined $join or not length $join) {
     return ();
   }
   elsif (ref $join eq 'ARRAY') {
@@ -1728,7 +1728,7 @@ sub _resolve_prefetch {
   my ($self, $pre, $alias, $alias_map, $order, $collapse, $pref_path) = @_;
   $pref_path ||= [];
 
-  if (not defined $pre) {
+  if (not defined $pre or not length $pre) {
     return ();
   }
   elsif( ref $pre eq 'ARRAY' ) {
index 0de8009..9dbea1a 100644 (file)
@@ -38,11 +38,21 @@ my $ars = $schema->resultset ('Artwork');
 
 my $cd_paths = {
   'no cd' => [],
+  'no cd empty' => [ '' ],
+  'no cd undef' => [ undef ],
+  'no cd href' => [ {} ],
+  'no cd aoh' => [ [{}] ],
+  'no cd complex' => [ [ [ undef ] ] ],
   'cd' => ['cd'],
   'cd->artist1' => [{'cd' => 'artist'}]
 };
 my $a2a_paths = {
   'no a2a' => [],
+  'no a2a empty ' => [ '' ],
+  'no a2a undef' => [ undef ],
+  'no a2a href' => [ {} ],
+  'no a2a aoh' => [ [{}] ],
+  'no a2a complex' => [ [ '' ] ],
   'a2a' => ['artwork_to_artist'],
   'a2a->artist2' => [{'artwork_to_artist' => 'artist'}]
 };