less generous literal parsing
[dbsrgits/SQL-Abstract.git] / lib / SQL / Abstract / Converter.pm
index 1cac53a..eab3e4e 100644 (file)
@@ -277,6 +277,9 @@ sub _where_to_dq {
 
   return undef unless defined($where);
 
+  # if we're given a simple string assume it's a literal
+  return $self->_literal_to_dq($where) if !ref($where);
+
   # turn the convert misfeature on - only used in WHERE clauses
   local $self->{where_convert} = $self->convert;
 
@@ -549,7 +552,7 @@ sub _order_by_to_dq {
 
   my $dq = {
     type => DQ_ORDER,
-    ($dir ? (direction => $dir) : ()),
+    (defined($dir) ? (reverse => !!($dir =~ /desc/i)) : ()),
     ($from ? (from => $from) : ()),
   };
 
@@ -572,7 +575,12 @@ sub _order_by_to_dq {
   } elsif (ref($arg) eq 'REF' and ref($$arg) eq 'ARRAY') {
     $dq->{by} = $self->_literal_to_dq($$arg);
   } elsif (ref($arg) eq 'SCALAR') {
-    $dq->{by} = $self->_literal_to_dq($$arg);
+    if (my ($ident, $dir) = $$arg =~ /^(\w+)(?:\s+(desc|asc))?$/i) {
+      $dq->{by} = $self->_ident_to_dq($ident);
+      $dq->{reverse} = 1 if $dir and lc($dir) eq 'desc';
+    } else {
+      $dq->{by} = $self->_literal_to_dq($$arg);
+    }
   } elsif (ref($arg) eq 'HASH') {
     my ($key, $val, @rest) = %$arg;