Commit | Line | Data |
87aa29e2 |
1 | package # Hide from PAUSE |
d5dedbd6 |
2 | DBIx::Class::SQLMaker::MySQL; |
87aa29e2 |
3 | |
5e7a0b00 |
4 | use warnings; |
5 | use strict; |
6 | |
d5dedbd6 |
7 | use base qw( DBIx::Class::SQLMaker ); |
87aa29e2 |
8 | |
9 | # |
10 | # MySQL does not understand the standard INSERT INTO $table DEFAULT VALUES |
11 | # Adjust SQL here instead |
12 | # |
13 | sub insert { |
14 | my $self = shift; |
15 | |
87aa29e2 |
16 | if (! $_[1] or (ref $_[1] eq 'HASH' and !keys %{$_[1]} ) ) { |
70551c3d |
17 | my $table = $self->_quote($_[0]); |
87aa29e2 |
18 | return "INSERT INTO ${table} () VALUES ()" |
19 | } |
20 | |
70551c3d |
21 | return $self->next::method (@_); |
87aa29e2 |
22 | } |
23 | |
b8391c87 |
24 | # Allow STRAIGHT_JOIN's |
25 | sub _generate_join_clause { |
26 | my ($self, $join_type) = @_; |
27 | |
28 | if( $join_type && $join_type =~ /^STRAIGHT\z/i ) { |
29 | return ' STRAIGHT_JOIN ' |
30 | } |
31 | |
70551c3d |
32 | return $self->next::method($join_type); |
b8391c87 |
33 | } |
4e0a89e4 |
34 | |
35 | # LOCK IN SHARE MODE |
36 | my $for_syntax = { |
37 | update => 'FOR UPDATE', |
38 | shared => 'LOCK IN SHARE MODE' |
39 | }; |
40 | |
41 | sub _lock_select { |
42 | my ($self, $type) = @_; |
43 | |
70c28808 |
44 | my $sql = $for_syntax->{$type} |
45 | || $self->throw_exception("Unknown SELECT .. FOR type '$type' requested"); |
4e0a89e4 |
46 | |
47 | return " $sql"; |
48 | } |
49 | |
905dee87 |
50 | sub _datetime_now_sql { 'NOW()' } |
76145305 |
51 | { |
52 | my %part_map = ( |
37256abd |
53 | microsecond => 'MICROSECOND', |
54 | second => 'SECOND', |
55 | minute => 'MINUTE', |
56 | hour => 'HOUR', |
57 | day_of_month => 'DAY', |
58 | week => 'WEEK', |
59 | month => 'MONTH', |
60 | quarter => 'QUARTER', |
61 | year => 'YEAR', |
37256abd |
62 | second_microsecond => 'SECOND_MICROSECOND', |
63 | minute_microsecond => 'MINUTE_MICROSECOND', |
64 | minute_second => 'MINUTE_SECOND', |
65 | hour_microsecond => 'HOUR_MICROSECOND', |
66 | hour_second => 'HOUR_SECOND', |
67 | hour_minute => 'HOUR_MINUTE', |
68 | day_microsecond => 'DAY_MICROSECOND', |
69 | day_second => 'DAY_SECOND', |
70 | day_minute => 'DAY_MINUTE', |
71 | day_hour => 'DAY_HOUR', |
72 | year_month => 'YEAR_MONTH', |
76145305 |
73 | ); |
74 | |
2aedbd3d |
75 | my %diff_part_map = %part_map; |
76 | $diff_part_map{day} = delete $diff_part_map{day_of_month}; |
77 | |
c33937bf |
78 | sub _datetime_sql { |
79 | die $_[0]->_unsupported_date_extraction($_[1], 'MySQL') |
80 | unless exists $part_map{$_[1]}; |
81 | "EXTRACT($part_map{$_[1]} FROM $_[2])" |
82 | } |
a53284b5 |
83 | sub _reorder_add_datetime_vars { |
84 | my ($self, $amount, $date) = @_; |
85 | |
86 | return ($date, $amount); |
87 | } |
905dee87 |
88 | sub _datetime_add_sql { |
89 | die $_[0]->_unsupported_date_adding($_[1], 'MySQL') |
90 | unless exists $diff_part_map{$_[1]}; |
91 | "DATE_ADD($_[2], INTERVAL $_[3] $diff_part_map{$_[1]})" |
92 | } |
a53284b5 |
93 | sub _reorder_diff_datetime_vars { |
94 | my ($self, $d1, $d2) = @_; |
95 | |
96 | return ($d2, $d1); |
97 | } |
98 | |
c33937bf |
99 | sub _datetime_diff_sql { |
100 | die $_[0]->_unsupported_date_diff($_[1], 'MySQL') |
101 | unless exists $diff_part_map{$_[1]}; |
102 | "TIMESTAMPDIFF($diff_part_map{$_[1]}, $_[2], $_[3])" |
103 | } |
76145305 |
104 | } |
105 | |
dff53b7e |
106 | =head1 DATE FUNCTION IMPLEMENTATION |
107 | |
108 | =head1 DATE FUNCTION IMPLEMENTATION |
109 | |
110 | The function used to extract date information is C<DATEPART>, which supports |
111 | |
112 | microsecond |
113 | second |
114 | minute |
115 | hour |
116 | day_of_month |
117 | week |
118 | month |
119 | quarter |
120 | year |
121 | second_microsecond |
122 | minute_microsecond |
123 | minute_second |
124 | hour_microsecond |
125 | hour_second |
126 | hour_minute |
127 | day_microsecond |
128 | day_second |
129 | day_minute |
130 | day_hour |
131 | year_month |
132 | |
133 | The function used to diff dates is C<TIMESTAMPDIFF>, which supports |
134 | |
135 | microsecond |
136 | second |
137 | minute |
138 | hour |
139 | day |
140 | week |
141 | month |
142 | quarter |
143 | year |
144 | second_microsecond |
145 | minute_microsecond |
146 | minute_second |
147 | hour_microsecond |
148 | hour_second |
149 | hour_minute |
150 | day_microsecond |
151 | day_second |
152 | day_minute |
153 | day_hour |
154 | year_month |
155 | |
156 | =cut |
157 | |
87aa29e2 |
158 | 1; |