sugar for select and multi-row insert
[scpubgit/Q-Branch.git] / lib / SQL / Abstract / Clauses.pm
index 2f6619a..86f74b9 100644 (file)
@@ -42,7 +42,7 @@ sub register_defaults {
     ($self->_sqlcase('delete from ').$sql, @bind);
   };
   $self->{clauses_of}{insert} = [
-    'target', 'fields', 'values', 'returning'
+    'target', 'fields', 'from', 'returning'
   ];
   $self->{expand}{insert} = sub { shift->_expand_statement(@_) };
   $self->{render}{insert} = sub { shift->_render_statement(insert => @_) };
@@ -66,6 +66,9 @@ sub register_defaults {
     my ($sql, @bind) = $self->render_aqt($from);
     ($self->_sqlcase('insert into ').$sql, @bind);
   };
+  $self->{render_clause}{'insert.from'} = sub {
+    return $_[0]->render_aqt($_[1]);
+  };
   return $self;
 }
 
@@ -91,7 +94,7 @@ sub _expand_select_clause_order_by {
 
 sub _expand_update_clause_target {
   my ($self, $target) = @_;
-  +(target => $self->expand_expr($target, -ident));
+  +(target => $self->_expand_maybe_list_expr($target, -ident));
 }
 
 sub _expand_update_clause_set {
@@ -130,7 +133,7 @@ sub _expand_statement {
           @exp
         }
       } else {
-        ($_ => $val)
+        ($_ => $self->expand_expr($val))
       }
     } sort keys %$args
   } };
@@ -213,9 +216,12 @@ sub _expand_insert_clause_target {
 
 sub _expand_insert_clause_values {
   my ($self, $data) = @_;
+  if (ref($data) eq 'HASH' and (keys(%$data))[0] =~ /^-/) {
+    return $self->expand_expr($data);
+  }
   return $data if ref($data) eq 'HASH' and $data->{-row};
   my ($f_aqt, $v_aqt) = $self->_expand_insert_values($data);
-  return (values => $v_aqt, ($f_aqt ? (fields => $f_aqt) : ()));
+  return (from => { -values => $v_aqt }, ($f_aqt ? (fields => $f_aqt) : ()));
 }
 
 1;