X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FAbstract.pm;h=5b901b093efcc97bc7d5b1fdbd21a3ec01a8b9ff;hb=b182f72c73922f3864a15b926f945b3af0b085cb;hp=24a1c8763ad4db85e24bc4a5139ea17d87d24c3e;hpb=25e4c69385e46884d50f89d5faada6ef1015aa1b;p=scpubgit%2FQ-Branch.git diff --git a/lib/SQL/Abstract.pm b/lib/SQL/Abstract.pm index 24a1c87..5b901b0 100644 --- a/lib/SQL/Abstract.pm +++ b/lib/SQL/Abstract.pm @@ -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('?');