ensure _order_by_chunks returns what it used to
[scpubgit/Q-Branch.git] / lib / SQL / Abstract.pm
index 506d723..9e1a135 100644 (file)
@@ -510,14 +510,19 @@ sub _expand_expr {
           sort keys %$expr
       ] };
     }
-    return unless %$expr;
+    return { -literal => [ '' ] } unless keys %$expr;
     return $self->_expand_expr_hashpair(%$expr, $logic);
   }
   if (ref($expr) eq 'ARRAY') {
     my $logic = lc($logic || $self->{logic});
     $logic eq 'and' or $logic eq 'or' or puke "unknown logic: $logic";
 
-    my @expr = @$expr;
+    #my @expr = @$expr;
+    my @expr = grep {
+      (ref($_) eq 'ARRAY' and @$_)
+      or (ref($_) eq 'HASH' and %$_)
+      or 1
+    } @$expr;
 
     my @res;
 
@@ -532,7 +537,7 @@ sub _expand_expr {
       } elsif (my $l = is_literal_value($el)) {
         push @res, { -literal => $l };
       } elsif ($elref eq 'HASH') {
-        push @res, $self->_expand_expr($el);
+        push @res, $self->_expand_expr($el) if %$el;
       } else {
         die "notreached";
       }
@@ -861,9 +866,7 @@ sub _expand_expr_hashpair {
     my ($sql, @bind) = @$literal;
     if ($self->{bindtype} eq 'columns') {
       for (@bind) {
-        if (!defined $_ || ref($_) ne 'ARRAY' || @$_ != 2) {
-          puke "bindtype 'columns' selected, you need to pass: [column_name => bind_value]"
-        }
+        $self->_assert_bindval_matches_bindtype($_);
       }
     }
     return +{ -literal => [ $self->_quote($k).' '.$sql, @bind ] };
@@ -891,6 +894,7 @@ sub _recurse_where {
   my $where_exp = (ref($where)
                     ? $self->_expand_expr($where, $logic)
                     : { -literal => [ $where ] });
+#::Dwarn([ EXPANDED => $where_exp ]);
 
 #print STDERR Data::Dumper::Concise::Dumper([ EXP => $where_exp ]);
 
@@ -900,7 +904,6 @@ sub _recurse_where {
 #  my ($sql, @bind) =  $self->$method($where_exp, $logic);
 
   my ($sql, @bind) = defined($where_exp) ? $self->_render_expr($where_exp) : (undef);
-
   # DBIx::Class used to call _recurse_where in scalar context
   # something else might too...
   if (wantarray) {
@@ -1002,9 +1005,14 @@ sub _render_op {
         : "${op_sql} ${expr_sql}"
     );
     return (($op eq 'not' || $us ? '('.$final_sql.')' : $final_sql), @bind);
+  #} elsif (@args == 0) {
+  #  return '';
   } else {
-     my @parts = map [ $self->_render_expr($_) ], @args;
-     my ($final_sql) = map +($op =~ /^(and|or)$/ ? "( ${_} )" : $_), join(
+     my @parts = grep length($_->[0]), map [ $self->_render_expr($_) ], @args;
+     return '' unless @parts;
+     my $is_andor = !!($op =~ /^(and|or)$/);
+     return @{$parts[0]} if $is_andor and @parts == 1;
+     my ($final_sql) = map +($is_andor ? "( ${_} )" : $_), join(
        ($final_op eq ',' ? '' : ' ').$self->_sqlcase($final_op).' ',
        map $_->[0], @parts
      );
@@ -1129,6 +1137,10 @@ sub _order_by_chunks {
 
 sub _chunkify_order_by {
   my ($self, $expanded) = @_;
+
+  return $self->_render_expr($expanded)
+    if $expanded->{-ident} or @{$expanded->{-literal}||[]} == 1;
+
   for ($expanded) {
     if (ref() eq 'HASH' and my $op = $_->{-op}) {
       if ($op->[0] eq ',') {