Saner handling of nested_lhs, we now set it in one spot only
[dbsrgits/SQL-Abstract.git] / lib / SQL / Abstract.pm
index a18e493..24a062f 100644 (file)
@@ -27,7 +27,7 @@ BEGIN {
 # GLOBALS
 #======================================================================
 
-our $VERSION  = '1.78';
+our $VERSION  = '1.79';
 
 # This would confuse some packagers
 $VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
@@ -78,11 +78,6 @@ sub puke (@) {
 sub is_literal_value ($) {
     ref $_[0] eq 'SCALAR'                                     ? [ ${$_[0]} ]
   : ( ref $_[0] eq 'REF' and ref ${$_[0]} eq 'ARRAY' )        ? [ @${ $_[0] } ]
-  : (
-    ref $_[0] eq 'HASH' and keys %{$_[0]} == 1
-      and
-    defined $_[0]->{-ident} and ! length ref $_[0]->{-ident}
-  )                                                           ? [ $_[0]->{-ident} ]
   : undef;
 }
 
@@ -605,7 +600,7 @@ sub _where_HASHREF {
         $s = "($s)" unless (
           List::Util::first {$op =~ $_->{regex}} @{$self->{unary_ops}}
             or
-          defined($self->{_nested_func_lhs}) && ($self->{_nested_func_lhs} eq $k)
+          ( defined $self->{_nested_func_lhs} and $self->{_nested_func_lhs} eq $k )
         );
         ($s, @b);
       }
@@ -659,7 +654,7 @@ sub _where_unary_op {
   my ($sql, @bind) = $self->_SWITCH_refkind ($rhs, {
     SCALAR =>   sub {
       puke "Illegal use of top-level '$op'"
-        unless $self->{_nested_func_lhs};
+        unless defined $self->{_nested_func_lhs};
 
       return (
         $self->_convert('?'),
@@ -791,7 +786,7 @@ sub _where_op_VALUE {
 
   # special-case NULL
   if (! defined $rhs) {
-    return $lhs
+    return defined $lhs
       ? $self->_convert($self->_quote($lhs)) . ' IS NULL'
       : undef
     ;
@@ -799,7 +794,7 @@ sub _where_op_VALUE {
 
   my @bind =
     $self->_bindtype (
-      ($lhs || $self->{_nested_func_lhs}),
+      ( defined $lhs ? $lhs : $self->{_nested_func_lhs} ),
       $rhs,
     )
   ;
@@ -850,7 +845,10 @@ sub _where_hashpair_HASHREF {
   my ($self, $k, $v, $logic) = @_;
   $logic ||= 'and';
 
-  local $self->{_nested_func_lhs} = $self->{_nested_func_lhs};
+  local $self->{_nested_func_lhs} = defined $self->{_nested_func_lhs}
+    ? $self->{_nested_func_lhs}
+    : $k
+  ;
 
   my ($all_sql, @all_bind);
 
@@ -929,10 +927,6 @@ sub _where_hashpair_HASHREF {
         },
 
         FALLBACK => sub {       # CASE: col => {op/func => $stuff}
-
-          # retain for proper column type bind
-          $self->{_nested_func_lhs} ||= $k;
-
           ($sql, @bind) = $self->_where_unary_op ($op, $val);
 
           $sql = join (' ',
@@ -1128,7 +1122,6 @@ sub _where_field_BETWEEN {
              my ($func, $arg, @rest) = %$val;
              puke ("Only simple { -func => arg } functions accepted as sub-arguments to BETWEEN")
                if (@rest or $func !~ /^ \- (.+)/x);
-             local $self->{_nested_func_lhs} = $k;
              $self->_where_unary_op ($1 => $arg);
            },
            FALLBACK => sub {
@@ -1186,7 +1179,6 @@ sub _where_field_IN {
               my ($func, $arg, @rest) = %$val;
               puke ("Only simple { -func => arg } functions accepted as sub-arguments to IN")
                 if (@rest or $func !~ /^ \- (.+)/x);
-              local $self->{_nested_func_lhs} = $k;
               $self->_where_unary_op ($1 => $arg);
             },
             UNDEF => sub {
@@ -1966,7 +1958,7 @@ words in your database's SQL dialect.
 This is the character that will be used to escape L</quote_char>s appearing
 in an identifier before it has been quoted.
 
-The paramter default in case of a single L</quote_char> character is the quote
+The parameter default in case of a single L</quote_char> character is the quote
 character itself.
 
 When opening-closing-style quoting is used (L</quote_char> is an arrayref)
@@ -2233,8 +2225,6 @@ module:
 
 =item * C<\[ $sql_string, @bind_values ]>
 
-=item * C<< { -ident => $plain_defined_string } >>
-
 =back
 
 On failure returns C<undef>, on sucess returns an B<array> reference