X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSQLMaker%2FLimitDialects.pm;h=a5ac4674735db88e4e982398df4bfff26690b1be;hb=28e58e9b79816ecfbb126bc75d284a76c5db7f55;hp=93e9f3f0fed0065a4bcb1249d6818d1e3715dc1f;hpb=833733fef294162648651be27591251ab9d0648c;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/SQLMaker/LimitDialects.pm b/lib/DBIx/Class/SQLMaker/LimitDialects.pm index 93e9f3f..a5ac467 100644 --- a/lib/DBIx/Class/SQLMaker/LimitDialects.pm +++ b/lib/DBIx/Class/SQLMaker/LimitDialects.pm @@ -279,7 +279,7 @@ EOS $rs_attrs->{order_by} and $rs_attrs->{_rsroot_rsrc}->storage->_order_by_is_stable( - $rs_attrs->{from}, $rs_attrs->{order_by} + @{$rs_attrs}{qw/from order_by where/} ) ) { push @{$self->{limit_bind}}, [ $self->__total_bindtype => $offset + $rows ], [ $self->__offset_bindtype => $offset + 1 ]; @@ -331,10 +331,11 @@ sub _prep_for_skimming_limit { if ($sq_attrs->{order_by_requested}) { $self->throw_exception ( 'Unable to safely perform "skimming type" limit with supplied unstable order criteria' - ) unless $rs_attrs->{_rsroot_rsrc}->schema->storage->_order_by_is_stable( + ) unless ($rs_attrs->{_rsroot_rsrc}->schema->storage->_order_by_is_stable( $rs_attrs->{from}, - $requested_order - ); + $requested_order, + $rs_attrs->{where}, + )); $inner_order = $requested_order; } @@ -357,9 +358,12 @@ sub _prep_for_skimming_limit { 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' ); + my $is_desc = ( + $ch =~ s/\s+ ( ASC|DESC ) \s* $//ix + and + uc($1) eq 'DESC' + ) ? 1 : 0; + push @out_chunks, \join (' ', $ch, $is_desc ? 'ASC' : 'DESC' ); } $sq_attrs->{order_by_middle} = $self->_order_by (\@out_chunks); @@ -382,18 +386,6 @@ sub _prep_for_skimming_limit { # Whatever order bindvals there are, they will be realiased and # reselected, and need to show up at end of the initial inner select push @{$self->{select_bind}}, @{$self->{order_bind}}; - - # if this is a part of something bigger, we need to add back all - # the extra order_by's, as they may be relied upon by the outside - # of a prefetch or something - if ($rs_attrs->{_is_internal_subuery}) { - $sq_attrs->{selection_outer} .= sprintf ", $extra_order_sel->{$_} AS $_" - for sort - { $extra_order_sel->{$a} cmp $extra_order_sel->{$b} } - grep { $_ !~ /[^\w\-]/ } # ignore functions - keys %$extra_order_sel - ; - } } # and this is order re-alias magic @@ -517,32 +509,6 @@ sub _FetchFirst { return $sql; } -=head2 RowCountOrGenericSubQ - -This is not exactly a limit dialect, but more of a proxy for B. -If no $offset is supplied the limit is simply performed as: - - SET ROWCOUNT $limit - SELECT ... - SET ROWCOUNT 0 - -Otherwise we fall back to L - -=cut - -sub _RowCountOrGenericSubQ { - my $self = shift; - my ($sql, $rs_attrs, $rows, $offset) = @_; - - return $self->_GenericSubQ(@_) if $offset; - - return sprintf <<"EOF", $rows, $sql; -SET ROWCOUNT %d -%s -SET ROWCOUNT 0 -EOF -} - =head2 GenericSubQ SELECT * FROM ( @@ -556,8 +522,11 @@ This is the most evil limit "dialect" (more of a hack) for I stupid databases. It works by ordering the set by some unique column, and calculating the amount of rows that have a less-er value (thus emulating a L-like index). Of course this implies the set can only be ordered by a single unique -column. Also note that this technique can be and often is B. +column. + +Also note that this technique can be and often is B. You +may have much better luck using L +instead. Currently used by B, due to lack of any other option. @@ -577,8 +546,9 @@ sub _GenericSubQ { . 'unique-column order criteria.' ); - $first_order_by =~ s/\s+ ( ASC|DESC ) \s* $//ix; - my $direction = lc ($1 || 'asc'); + my $direction = ( + $first_order_by =~ s/\s+ ( ASC|DESC ) \s* $//ix + ) ? lc($1) : 'asc'; my ($first_ord_alias, $first_ord_col) = $first_order_by =~ /^ (?: ([^\.]+) \. )? ([^\.]+) $/x; @@ -769,7 +739,7 @@ sub _subqueried_limit_attrs { next if $in_sel_index->{$chunk}; $extra_order_sel->{$chunk} ||= $self->_quote ( - 'ORDER__BY__' . scalar keys %{$extra_order_sel||{}} + 'ORDER__BY__' . sprintf '%03d', scalar keys %{$extra_order_sel||{}} ); }