my %extra_order_sel;
if ($scan_order) {
- for my $chunk ($self->_order_by_chunks (
- ref $rs_attrs->{order_by} eq 'ARRAY'
- ? @{$rs_attrs->{order_by}}
- : $rs_attrs->{order_by}
- )) {
+ for my $chunk ($self->_order_by_chunks ($rs_attrs->{order_by})) {
# order with bind
$chunk = $chunk->[0] if (ref $chunk) eq 'ARRAY';
$chunk =~ s/\s+ (?: ASC|DESC ) \s* $//ix;
next if $in_sel_index->{$chunk};
$extra_order_sel{$chunk} ||= $self->_quote (
- '__ORDER_BY_' . scalar keys %extra_order_sel
+ 'ORDER__BY__' . scalar keys %extra_order_sel
);
}
}
# this is the order supplement magic
my $mid_sel = $out_sel;
if ($extra_order_sel) {
- for my $extra_col (keys %$extra_order_sel) {
+ for my $extra_col (sort
+ { $extra_order_sel->{$a} cmp $extra_order_sel->{$b} }
+ keys %$extra_order_sel
+ ) {
$in_sel .= sprintf (', %s AS %s',
$extra_col,
$extra_order_sel->{$extra_col},
my @out_chunks;
for my $ch ($self->_order_by_chunks ($inner_order)) {
$ch = $ch->[0] if ref $ch eq 'ARRAY';
+
$ch =~ s/\s+ ( ASC|DESC ) \s* $//ix;
my $dir = uc ($1||'ASC');
push @out_chunks, \join (' ', $ch, $dir eq 'ASC' ? 'DESC' : 'ASC' );
}
- $order_by_reversed = $self->_order_by (@out_chunks);
+ $order_by_reversed = $self->_order_by (\@out_chunks);
}
# this is the order supplement magic
my $mid_sel = $out_sel;
if ($extra_order_sel) {
- for my $extra_col (keys %$extra_order_sel) {
+ for my $extra_col (sort
+ { $extra_order_sel->{$a} cmp $extra_order_sel->{$b} }
+ keys %$extra_order_sel
+ ) {
$in_sel .= sprintf (', %s AS %s',
$extra_col,
$extra_order_sel->{$extra_col},
$sql = sprintf ('SELECT TOP %d %s FROM ( %s ) %s %s',
$rows,
- $mid_sel,
- $sql,
- $quoted_rs_alias,
- $order_by_requested,
- ) if $order_by_requested;
-
- $sql = sprintf ('SELECT TOP %d %s FROM ( %s ) %s',
- $rows,
$out_sel,
$sql,
$quoted_rs_alias,
- ) if ($mid_sel ne $out_sel);
+ $order_by_requested,
+ ) if ( ($offset && $order_by_requested) || ($mid_sel ne $out_sel) );
return $sql;
}
$table = $self->_quote($table);
}
- local $self->{rownum_hack_count} = 1
- if (defined $rest[0] && $self->{limit_dialect} eq 'RowNum');
@rest = (-1) unless defined $rest[0];
croak "LIMIT 0 Does Not Compute" if $rest[0] == 0;
# and anyway, SQL::Abstract::Limit will cause a barf if we don't first
my $sql = '';
- if (my $g = $self->_recurse_fields($arg->{group_by}, { no_rownum_hack => 1 }) ) {
+ if (my $g = $self->_recurse_fields($arg->{group_by}) ) {
$sql .= $self->_sqlcase(' group by ') . $g;
}