X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FAbstract%2FExtraClauses.pm;h=c9b332a6534f37afc070ad37a1069d8ebcf00a47;hb=ac7992be3a110ecee594f667f67755e2182fbf94;hp=386d1e37058cd7b9de958850db721bbf9d9f473d;hpb=51ccda04f35c44d4556c003d162ebcec72352230;p=scpubgit%2FQ-Branch.git diff --git a/lib/SQL/Abstract/ExtraClauses.pm b/lib/SQL/Abstract/ExtraClauses.pm index 386d1e3..c9b332a 100644 --- a/lib/SQL/Abstract/ExtraClauses.pm +++ b/lib/SQL/Abstract/ExtraClauses.pm @@ -153,7 +153,7 @@ sub register_defaults { return +(with => { ($type ? (type => $type) : ()), queries => \@exp }); }); $self->clause_expander('select.with_recursive', $with_expander); - $self->clause_renderer('select.with' => sub { + $self->clause_renderer('select.with' => my $with_renderer = sub { my ($self, undef, $with) = @_; my $q_part = $self->join_query_parts(', ', map { @@ -170,6 +170,20 @@ sub register_defaults { $q_part, ); }); + foreach my $stmt (qw(insert update delete)) { + $self->clauses_of($stmt => 'with', $self->clauses_of($stmt)); + $self->clause_expander("${stmt}.$_", $with_expander) + for qw(with with_recursive); + $self->clause_renderer("${stmt}.with", $with_renderer); + } + $self->expander(cast => sub { + return { -func => [ cast => $_[2] ] } if ref($_[2]) eq 'HASH'; + my ($cast, $to) = @{$_[2]}; + +{ -func => [ cast => { -as => [ + $self->expand_expr($cast), + $self->expand_expr($to, -ident), + ] } ] }; + }); return $self; } @@ -217,10 +231,10 @@ sub _expand_join { $proto{to} = $self->expand_expr({ -as => [ $proto{to}, $as ] }); } if (defined($proto{using}) and ref(my $using = $proto{using}) ne 'HASH') { - $proto{using} = { -row => [ + $proto{using} = [ map [ $self->expand_expr($_, -ident) ], ref($using) eq 'ARRAY' ? @$using: $using - ] }; + ]; } my %ret = map +($_ => $self->expand_expr($proto{$_}, -ident)), sort keys %proto; @@ -245,7 +259,7 @@ sub _render_join { ) : ()), ($args->{using} ? ( $self->format_keyword('using'), - $args->{using}, + '(', $args->{using}, ')', ) : ()), ); return $self->join_query_parts(' ', @parts);