fix for x => { '!=' => [ -and => (1 .. 3) ] }
Justin Hunter [Fri, 24 Apr 2009 08:03:45 +0000 (08:03 +0000)]
added parens for test

lib/SQL/Abstract.pm
t/04modifiers.t

index 24a1c87..5b901b0 100644 (file)
@@ -360,11 +360,13 @@ sub _recurse_where {
 
 
 sub _where_ARRAYREF {
-  my ($self, $where, $logic) = @_;
+  my ($self, $where, $_logic) = @_;
 
-  $logic = uc($logic || $self->{logic});
+  my $logic = uc($_logic || $self->{logic});
   $logic eq 'AND' or $logic eq 'OR' or puke "unknown logic: $logic";
 
+  my $orig_logic = $self->{logic};
+
   my @clauses = @$where;
 
   my (@sql_clauses, @all_bind);
@@ -399,6 +401,7 @@ sub _where_ARRAYREF {
       push @all_bind, @bind;
     }
   }
+  $logic = $self->{logic} if $orig_logic ne $self->{logic} and !$_logic;
 
   return $self->_join_sql_clauses($logic, \@sql_clauses, \@all_bind);
 }
@@ -584,6 +587,11 @@ sub _where_hashpair_HASHREF {
         },
         
         FALLBACK => sub {       # CASE: col => {op => $scalar}
+          if ($val =~ /^ - ( AND|OR ) $/ix) {
+            $self->{logic} = uc $1;
+            delete $v->{$op};
+            return '', ();
+          }
           $sql  = join ' ', $self->_convert($self->_quote($k)),
                             $self->_sqlcase($op),
                             $self->_convert('?');
index b365443..f4a0f1d 100644 (file)
@@ -146,7 +146,7 @@ my @and_or_tests = (
   # test column multi-cond in arrayref (even more useful)
   {
     where => { x => { '!=' => [ -and => (1 .. 3) ] } },
-    stmt => 'WHERE x != ? AND x != ? AND x != ?',
+    stmt => 'WHERE ( ( x != ? AND x != ? AND x != ? ) )',
     bind => [1..3],
   },