[Dbix-class] [PATCH] Correctly propagate forced left joins through arrayrefs and hashrefs

Peter Collingbourne peter at pcc.me.uk
Fri Mar 20 03:29:20 GMT 2009


Fixes a bug in DBIC::ResultSource::resolve_join whereby forced left
joins are not propagated through an arrayref or hashref.  Thus if
relationship t1 has a left join_type and t2 has inner join_type,
either of the two clauses:

join => { t1 => [ 't2' ] }
join => { t1 => { t2 => {} } }

would incorrectly use an inner join for t2.
---
 lib/DBIx/Class/ResultSource.pm |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/lib/DBIx/Class/ResultSource.pm b/lib/DBIx/Class/ResultSource.pm
index 0d49c00..c3a5d87 100644
--- a/lib/DBIx/Class/ResultSource.pm
+++ b/lib/DBIx/Class/ResultSource.pm
@@ -1085,12 +1085,16 @@ sub resolve_join {
   $seen ||= {};
   $force_left ||= { force => 0 };
   if (ref $join eq 'ARRAY') {
-    return map { $self->resolve_join($_, $alias, $seen) } @$join;
+    return
+      map {
+        local $force_left->{force} = $force_left->{force};
+        $self->resolve_join($_, $alias, $seen, $force_left);
+      } @$join;
   } elsif (ref $join eq 'HASH') {
     return
       map {
         my $as = ($seen->{$_} ? $_.'_'.($seen->{$_}+1) : $_);
-        local $force_left->{force};
+        local $force_left->{force} = $force_left->{force};
         (
           $self->resolve_join($_, $alias, $seen, $force_left),
           $self->related_source($_)->resolve_join(
-- 
1.5.6.5


-- 
Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: Digital signature
Url : http://lists.scsys.co.uk/pipermail/dbix-class/attachments/20090320/299d48d0/attachment.pgp


More information about the DBIx-Class mailing list