X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FAbstract%2FExtraClauses.pm;h=73e7073a3476a623be22496929b02f84674b7295;hb=a3040091c492c3fca3e8d22b4192572858f7ccf8;hp=0be302110d0299272bc01059e0e25f2ec3e650ef;hpb=13c99dad784e2b300cfad09b22b70bd2d1ede609;p=scpubgit%2FQ-Branch.git diff --git a/lib/SQL/Abstract/ExtraClauses.pm b/lib/SQL/Abstract/ExtraClauses.pm index 0be3021..73e7073 100644 --- a/lib/SQL/Abstract/ExtraClauses.pm +++ b/lib/SQL/Abstract/ExtraClauses.pm @@ -4,13 +4,12 @@ use strict; use warnings; use if $] < '5.010', 'MRO::Compat'; use mro 'c3'; -use base qw(SQL::Abstract::Clauses); +use base qw(SQL::Abstract); BEGIN { *puke = \&SQL::Abstract::puke } -sub register_defaults { - my $self = shift; - $self->next::method(@_); +sub new { + my $self = shift->next::method(@_); my @clauses = $self->clauses_of('select'); my @before_setop; CLAUSE: foreach my $idx (0..$#clauses) { @@ -153,7 +152,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 +169,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; }