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