1 package Data::Query::Renderer::SQL::MySQL;
3 use Data::Query::Constants;
4 use Data::Query::ExprHelpers;
7 extends 'Data::Query::Renderer::SQL::Naive';
9 with 'Data::Query::Renderer::SQL::Slice::LimitXY';
11 has needs_inner_join => (is => 'ro', default => sub { 0 });
13 around _format_join_keyword => sub {
14 my ($orig, $self) = (shift, shift);
16 if ($self->needs_inner_join and $dq->{on} and !$dq->{outer}) {
17 return $self->_format_keyword('INNER JOIN');
19 return $self->$orig(@_);
22 sub _insert_default_values {
24 $self->_format_keyword('VALUES'), qw( ( ) );
27 foreach my $type (qw(update delete)) {
28 around "_render_${type}" => sub {
29 my ($orig, $self) = (shift, shift);
30 $self->$orig($self->_maybe_double_subquery(@_));
34 sub _maybe_double_subquery {
36 my $target = $dq->{target};
38 foreach my $key (qw(set where)) {
39 next unless $dq->{$key};
40 $new->{$key} = map_dq_tree {
44 if (is_Identifier($target)) {
45 my $ident = $target->{elements}[0];
46 +{ DQ_IDENTIFIER ,=> sub {
47 my @el = @{$_[0]->{elements}};
48 $found = 1 if @el == 1 and $el[0] eq $ident;
51 } elsif (is_Literal($target)) {
52 my $ident = $target->{literal} or die "Can't handle complex literal";
53 +{ DQ_LITERAL ,=> sub {
54 my $lit = $_[0]->{literal};
55 $found = 1 if $lit and $lit eq $ident;
59 die "Can't handle target type ".$target->{type};
63 \Select([ Identifier('*') ], Alias('_forced_double_subquery', $_));