Commit | Line | Data |
7d0fb8c0 |
1 | package Data::Query::Renderer::SQL::MySQL; |
2 | |
944c72bc |
3 | use Data::Query::Constants; |
4 | use Data::Query::ExprHelpers; |
7d0fb8c0 |
5 | use Moo; |
6 | |
7 | extends 'Data::Query::Renderer::SQL::Naive'; |
8 | |
9 | with 'Data::Query::Renderer::SQL::Slice::LimitXY'; |
10 | |
9ee59b74 |
11 | has needs_inner_join => (is => 'ro', default => sub { 0 }); |
12 | |
13 | around _format_join_keyword => sub { |
14 | my ($orig, $self) = (shift, shift); |
15 | my ($dq) = @_; |
16 | if ($self->needs_inner_join and $dq->{on} and !$dq->{outer}) { |
17 | return $self->_format_keyword('INNER JOIN'); |
18 | } |
19 | return $self->$orig(@_); |
20 | }; |
21 | |
7d0fb8c0 |
22 | sub _insert_default_values { |
23 | my ($self) = @_; |
24 | $self->_format_keyword('VALUES'), qw( ( ) ); |
25 | } |
26 | |
944c72bc |
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(@_)); |
31 | }; |
32 | } |
33 | |
34 | sub _maybe_double_subquery { |
35 | my ($self, $dq) = @_; |
36 | my $target = $dq->{target}; |
37 | my $new = { %$dq }; |
38 | foreach my $key (qw(set where)) { |
39 | next unless $dq->{$key}; |
fd6e1f4c |
40 | $new->{$key} = map_dq_tree { |
944c72bc |
41 | if (is_Select) { |
42 | my $found; |
43 | scan_dq_nodes(do { |
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; |
49 | } |
50 | }; |
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; |
56 | } |
57 | }; |
58 | } else { |
59 | die "Can't handle target type ".$target->{type}; |
60 | } |
61 | }, $_); |
62 | if ($found) { |
63 | \Select([ Identifier('*') ], Alias('_forced_double_subquery', $_)); |
64 | } else { |
65 | $_ |
66 | } |
67 | } else { |
68 | $_ |
69 | } |
70 | } $dq->{$key}; |
71 | } |
72 | $new; |
73 | } |
74 | |
7d0fb8c0 |
75 | 1; |