X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FAbstract.pm;h=4a2d3d1e20950ab0241bbfbfe99a5efff4ca849c;hb=e5feec9f0925378912ad77c51469425b0908a310;hp=934459b2ac2469ac9b0cce06f121695a179dadba;hpb=4d8650614d3866beb43f746b8492dab446400be5;p=scpubgit%2FQ-Branch.git diff --git a/lib/SQL/Abstract.pm b/lib/SQL/Abstract.pm index 934459b..4a2d3d1 100644 --- a/lib/SQL/Abstract.pm +++ b/lib/SQL/Abstract.pm @@ -264,47 +264,54 @@ sub insert { my $data = shift || return; my $options = shift; - my ($sql, @bind) = do { - if (is_literal_value($data)) { - $self->render_expr($data); - } else { - my ($fields, $values) = ( - ref($data) eq 'HASH' ? - ([ sort keys %$data ], [ @{$data}{sort keys %$data} ]) - : (undef, $data) - ); + my $fields; - # no names (arrayref) means can't generate bindtype - !($fields) && $self->{bindtype} eq 'columns' - && belch "can't do 'columns' bindtype when called with arrayref"; + my ($f_aqt, $v_aqt) = $self->_expand_insert_values($data); - my $fields_sql = ($fields - ? ' '.($self->render_expr({ -row => $fields }, '-ident'))[0] - : '' - ); - my ($values_sql, @bind) = $self->render_aqt( - { -row => [ - map { - local our $Cur_Col_Meta = $fields->[$_]; - $self->_expand_insert_value($values->[$_]) - } 0..$#$values - ] } - ); - ($fields_sql.' '.$self->_sqlcase('values').' '.$values_sql, @bind); - } - }; - - $sql = (join " ", $self->_sqlcase('insert into'), $table).$sql; + my @parts = ([ $self->_sqlcase('insert into').' '.$table ]); + push @parts, [ $self->render_aqt($f_aqt) ] if $f_aqt; + push @parts, [ $self->render_aqt($v_aqt) ]; + $parts[-1][0] =~ s/^/VALUES /; if ($options->{returning}) { - my ($s, @b) = $self->_insert_returning($options); - $sql .= $s; - push @bind, @b; + push @parts, [ $self->_insert_returning($options) ]; } + my ($sql, @bind) = $self->_join_parts(' ', @parts); + return wantarray ? ($sql, @bind) : $sql; } +sub _expand_insert_values { + my ($self, $data) = @_; + if (is_literal_value($data)) { + (undef, $self->expand_expr($data)); + } else { + my ($fields, $values) = ( + ref($data) eq 'HASH' ? + ([ sort keys %$data ], [ @{$data}{sort keys %$data} ]) + : ([], $data) + ); + + # no names (arrayref) means can't generate bindtype + !($fields) && $self->{bindtype} eq 'columns' + && belch "can't do 'columns' bindtype when called with arrayref"; + + +( + (@$fields + ? $self->expand_expr({ -row => $fields }, -ident) + : undef + ), + +{ -row => [ + map { + local our $Cur_Col_Meta = $fields->[$_]; + $self->_expand_insert_value($values->[$_]) + } 0..$#$values + ] }, + ); + } +} + # So that subclasses can override INSERT ... RETURNING separately from # UPDATE and DELETE (e.g. DBIx::Class::SQLMaker::Oracle does this) sub _insert_returning { shift->_returning(@_) } @@ -1251,6 +1258,8 @@ sub _expand_order_by { return unless defined($arg) and not (ref($arg) eq 'ARRAY' and !@$arg); + return $arg if ref($arg) eq 'HASH' and ($arg->{-op}||[''])->[0] eq ','; + my $expander = sub { my ($self, $dir, $expr) = @_; my @to_expand = ref($expr) eq 'ARRAY' ? @$expr : $expr; @@ -1336,6 +1345,7 @@ sub _table { sub _expand_maybe_list_expr { my ($self, $expr, $default) = @_; + return $expr if ref($expr) eq 'HASH' and ($expr->{-op}||[''])->[0] eq ','; return +{ -op => [ ',', map $self->expand_expr($_, $default), ref($expr) eq 'ARRAY' ? @$expr : $expr