no warnings qw/redefine/;
no strict qw/refs/;
for my $f (qw/carp croak/) {
+
my $orig = \&{"SQL::Abstract::$f"};
*{"SQL::Abstract::$f"} = sub {
local $Carp::CarpLevel = 1; # even though Carp::Clan ignores this, $orig will not
- if (Carp::longmess() =~ /DBIx::Class::SQLAHacks::[\w]+\(\) called/) {
+ if (Carp::longmess() =~ /DBIx::Class::SQLAHacks::[\w]+ .+? called \s at/x) {
__PACKAGE__->can($f)->(@_);
}
else {
$order = { %$order }; #copy
- my $req_order = [ $self->_order_by_chunks ($order->{order_by}) ];
- my $limit_order = [ @$req_order ? @$req_order : $self->_order_by_chunks ($order->{_virtual_order_by}) ];
+ my $req_order = $order->{order_by};
+ my $limit_order =
+ scalar $self->_order_by_chunks ($req_order) # examine normalized version, collapses nesting
+ ? $req_order
+ : $order->{_virtual_order_by}
+ ;
my ( $order_by_inner, $order_by_outer ) = $self->_order_directions($limit_order);
my $order_by_requested = $self->_order_by ($req_order);
+ # generate the rest
+ delete $order->{$_} for qw/order_by _virtual_order_by/;
+ my $grpby_having = $self->_order_by ($order);
+
+ # short circuit for counts - the ordering complexity is needless
+ if ($self->{_dbic_rs_attrs}{-for_count_only}) {
+ return "SELECT TOP $rows $inner_select $sql $grpby_having $order_by_outer";
+ }
+
# we can't really adjust the order_by columns, as introspection is lacking
# resort to simple substitution
for my $col (keys %outer_col_aliases) {
}
- # generate the rest
- delete $order->{$_} for qw/order_by _virtual_order_by/;
- my $grpby_having = $self->_order_by ($order);
-
-
my $inner_lim = $rows + $offset;
$sql = "SELECT TOP $inner_lim $inner_select $sql $grpby_having $order_by_inner";
SELECT TOP $rows $outer_select FROM
(
$sql
- ) AS inner_sel
+ ) AS me
$order_by_outer
SQL
$sql = <<"SQL";
SELECT $outer_select FROM
- ( $sql ) AS outer_sel
+ ( $sql ) AS me
$order_by_requested;
SQL