Merge branch 'current/for_cpan_index' into current/dq
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / ResultSetColumn.pm
index 40cf73e..b64eec2 100644 (file)
@@ -59,7 +59,7 @@ sub new {
   my $as_index = List::Util::first { ($as_list->[$_] || "") eq $column } 0..$#$as_list;
   my $select = defined $as_index ? $select_list->[$as_index] : $column;
 
-  my ($new_parent_rs, $colmap);
+  my $colmap;
   for ($rsrc->columns, $column) {
     if ($_ =~ /^ \Q$alias\E \. ([^\.]+) $ /x) {
       $colmap->{$_} = $1;
@@ -70,6 +70,7 @@ sub new {
     }
   }
 
+  my $new_parent_rs;
   # analyze the order_by, and see if it is done over a function/nonexistentcolumn
   # if this is the case we will need to wrap a subquery since the result of RSC
   # *must* be a single column select
@@ -79,7 +80,7 @@ sub new {
       ( $rsrc->schema->storage->_extract_order_criteria ($orig_attrs->{order_by} ) )
   ) {
     # nuke the prefetch before collapsing to sql
-    my $subq_rs = $rs->search;
+    my $subq_rs = $rs->search_rs;
     $subq_rs->{attrs}{join} = $subq_rs->_merge_joinpref_attr( $subq_rs->{attrs}{join}, delete $subq_rs->{attrs}{prefetch} );
     $new_parent_rs = $subq_rs->as_subselect_rs;
   }
@@ -109,8 +110,11 @@ sub new {
     }
   }
 
-  my $new = bless { _select => $select, _as => $column, _parent_resultset => $new_parent_rs }, $class;
-  return $new;
+  return bless {
+    _select => $select,
+    _as => $column,
+    _parent_resultset => $new_parent_rs
+  }, $class;
 }
 
 =head2 as_query
@@ -471,12 +475,33 @@ sub throw_exception {
 sub _resultset {
   my $self = shift;
 
-  return $self->{_resultset} ||= $self->{_parent_resultset}->search(undef,
-    {
-      select => [$self->{_select}],
-      as => [$self->{_as}]
+  return $self->{_resultset} ||= do {
+
+    my $select = $self->{_select};
+
+    if ($self->{_parent_resultset}{attrs}{distinct}) {
+      my $alias = $self->{_parent_resultset}->current_source_alias;
+      my $rsrc = $self->{_parent_resultset}->result_source;
+      my %cols = map { $_ => 1, "$alias.$_" => 1 } $rsrc->columns;
+
+      unless( $cols{$select} ) {
+        carp_unique(
+          'Use of distinct => 1 while selecting anything other than a column '
+        . 'declared on the primary ResultSource is deprecated - please supply '
+        . 'an explicit group_by instead'
+        );
+
+        # collapse the selector to a literal so that it survives the distinct parse
+        # if it turns out to be an aggregate - at least the user will get a proper exception
+        # instead of silent drop of the group_by altogether
+        $select = \ ($rsrc->storage->sql_maker->_render_sqla(select_select => $select) =~ /^\s*SELECT\s*(.+)/i)[0],
+      }
     }
-  );
+
+    $self->{_parent_resultset}->search(undef, {
+      columns => { $self->{_as} => $select }
+    });
+  };
 }
 
 1;