There is no point of ordering the insides of a complex prefetch without a limit
Peter Rabbitson [Sat, 9 Mar 2013 18:41:41 +0000 (19:41 +0100)]
Changes
lib/DBIx/Class/Storage/DBIHacks.pm
t/prefetch/grouped.t

diff --git a/Changes b/Changes
index 995dc25..24dd469 100644 (file)
--- a/Changes
+++ b/Changes
@@ -10,6 +10,8 @@ Revision history for DBIx::Class
           invalid relationship graph
         - Warn in case of iterative collapse being upgraded to an eager
           cursor slurp
+        - No longer order the insides of a complex prefetch subquery,
+          unless required to satisfy a limit
 
     * Fixes
         - Properly consider unselected order_by criteria during complex
index e5a0d83..75a8fb2 100644 (file)
@@ -85,8 +85,12 @@ sub _adjust_select_args_for_complex_prefetch {
   my $inner_attrs = { %$attrs };
   delete $inner_attrs->{$_} for qw/for collapse _prefetch_selector_range select as/;
 
-  # if the user did not request it, there is no point using it inside
-  delete $inner_attrs->{order_by} if delete $inner_attrs->{_order_is_artificial};
+  # there is no point of ordering the insides if there is no limit
+  delete $inner_attrs->{order_by} if (
+    delete $inner_attrs->{_order_is_artificial}
+      or
+    ! $inner_attrs->{rows}
+  );
 
   # generate the inner/outer select lists
   # for inside we consider only stuff *not* brought in by the prefetch
index 40ac923..f5d56bb 100644 (file)
@@ -224,7 +224,6 @@ for ($cd_rs->all) {
           SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track
             FROM cd me
           GROUP BY me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track
-          ORDER BY cdid
         ) me
         LEFT JOIN tags tags ON tags.cd = me.cdid
       ORDER BY cdid