Pass options to _insert_returning and allow bind rvs
[dbsrgits/SQL-Abstract.git] / lib / SQL / Abstract.pm
index 0e29467..238d869 100644 (file)
@@ -118,22 +118,26 @@ sub insert {
   my ($sql, @bind) = $self->$method($data);
   $sql = join " ", $self->_sqlcase('insert into'), $table, $sql;
 
-  if (my $ret = $options->{returning}) {
-    $sql .= $self->_insert_returning ($ret);
+  if ($options->{returning}) {
+    my ($s, @b) = $self->_insert_returning ($options);
+    $sql .= $s;
+    push @bind, @b;
   }
 
   return wantarray ? ($sql, @bind) : $sql;
 }
 
 sub _insert_returning {
-  my ($self, $fields) = @_;
+  my ($self, $options) = @_;
 
-  my $f = $self->_SWITCH_refkind($fields, {
-    ARRAYREF     => sub {join ', ', map { $self->_quote($_) } @$fields;},
-    SCALAR       => sub {$self->_quote($fields)},
-    SCALARREF    => sub {$$fields},
+  my $f = $options->{returning};
+
+  my $fieldlist = $self->_SWITCH_refkind($f, {
+    ARRAYREF     => sub {join ', ', map { $self->_quote($_) } @$f;},
+    SCALAR       => sub {$self->_quote($f)},
+    SCALARREF    => sub {$$f},
   });
-  return join (' ', $self->_sqlcase(' returning'), $f);
+  return $self->_sqlcase(' returning ') . $fieldlist;
 }
 
 sub _insert_HASHREF { # explicit list of fields and then values
@@ -890,7 +894,7 @@ sub _where_field_BETWEEN {
       foreach my $val (@$vals) {
         my ($sql, @bind) = $self->_SWITCH_refkind($val, {
            SCALAR => sub {
-             return ($placeholder, $val);
+             return ($placeholder, $self->_bindtype($k, $val) );
            },
            SCALARREF => sub {
              return $$val;
@@ -914,7 +918,7 @@ sub _where_field_BETWEEN {
 
       return (
         (join $and, @all_sql),
-        $self->_bindtype($k, @all_bind),
+        @all_bind
       );
     },
     FALLBACK => sub {
@@ -961,7 +965,10 @@ sub _where_field_IN {
                 if (@rest or $func !~ /^ \- (.+)/x);
               local $self->{_nested_func_lhs} = $k;
               $self->_where_unary_op ($1 => $arg);
-            }
+            },
+            UNDEF => sub {
+              return $self->_sqlcase('null');
+            },
           });
           push @all_sql, $sql;
           push @all_bind, @bind;