X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FAbstract.pm;h=9b29b5e6489de87fdec2bdffb75056bd263f7db9;hb=b137b0744a3aaea3df1ba497345378e9d3f8da40;hp=80f1ccb61725c8e347cb9c7c319500ebb7917981;hpb=b4bd7d311e694c5ccafcfde1dc43aed5b8c5c520;p=dbsrgits%2FSQL-Abstract.git diff --git a/lib/SQL/Abstract.pm b/lib/SQL/Abstract.pm index 80f1ccb..9b29b5e 100644 --- a/lib/SQL/Abstract.pm +++ b/lib/SQL/Abstract.pm @@ -15,7 +15,7 @@ use Scalar::Util (); # GLOBALS #====================================================================== -our $VERSION = '1.73_01'; +our $VERSION = '1.73'; # This would confuse some packagers $VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases @@ -1150,16 +1150,24 @@ sub _order_by_chunks { SCALARREF => sub {$$arg}, # literal SQL, no quoting HASHREF => sub { - # get first pair in hash - my ($key, $val, @rest) = %$arg; - - return () unless $key; - - if ( @rest or not $key =~ /^-(desc|asc)/i ) { - puke "hash passed to _order_by must have exactly one key (-desc or -asc)"; + return () unless %$arg; + + my ($direction, $nulls, $val); + foreach my $key (keys %$arg) { + if ( $key =~ /^-(desc|asc)/i ) { + puke "hash passed to _order_by must have exactly one of -desc or -asc" + if defined $direction; + $direction = $1; + $val = $arg->{$key}; + } elsif ($key =~ /^-nulls$/i) { + $nulls = $arg->{$key}; + puke "invalid value for -nulls" unless $nulls =~ /^(?:first|last)$/i; + } else { + puke "invalid key in hash passed to _order_by"; + } } - - my $direction = $1; + puke "hash passed to _order_by must have exactly one of -desc or -asc" + unless defined $direction; my @ret; for my $c ($self->_order_by_chunks ($val)) { @@ -1174,7 +1182,9 @@ sub _order_by_chunks { }, }); - $sql = $sql . ' ' . $self->_sqlcase($direction); + $sql .= ' ' . $self->_sqlcase($direction); + $sql .= ' ' . $self->_sqlcase("nulls $nulls") + if defined $nulls; push @ret, [ $sql, @bind]; } @@ -2621,6 +2631,7 @@ script. Some functions take an order by clause. This can either be a scalar (just a column name,) a hash of C<< { -desc => 'col' } >> or C<< { -asc => 'col' } >>, +optionally with C<< -nulls => 'first' >> or C<< -nulls => 'last' >>, or an array of either of the two previous forms. Examples: Given | Will Generate @@ -2636,10 +2647,20 @@ or an array of either of the two previous forms. Examples: | {-desc => 'colB'} | ORDER BY colB DESC | + { | + -asc => 'colA', | ORDER BY colA ASC NULLS LAST + -nulls => 'last', | + } | + | ['colA', {-asc => 'colB'}] | ORDER BY colA, colB ASC | { -asc => [qw/colA colB/] } | ORDER BY colA ASC, colB ASC | + { | + -asc => [qw/colA colB/] | ORDER BY colA ASC NULLS FIRST, + -nulls => 'first' | colB ASC NULLS FIRST + } | + | [ | { -asc => 'colA' }, | ORDER BY colA ASC, colB DESC, { -desc => [qw/colB/], | colC ASC, colD ASC