7c8a8eee2660e9381283e973acab61d01dd9660b
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / SQLMaker / MySQL.pm
1 package # Hide from PAUSE
2   DBIx::Class::SQLMaker::MySQL;
3
4 use base qw( DBIx::Class::SQLMaker );
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
13   if (! $_[1] or (ref $_[1] eq 'HASH' and !keys %{$_[1]} ) ) {
14     my $table = $self->_quote($_[0]);
15     return "INSERT INTO ${table} () VALUES ()"
16   }
17
18   return $self->next::method (@_);
19 }
20
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
29     return $self->next::method($join_type);
30 }
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
41    my $sql = $for_syntax->{$type}
42     || $self->throw_exception("Unknown SELECT .. FOR type '$type' requested");
43
44    return " $sql";
45 }
46
47 {
48   my %part_map = (
49     microsecond        => 'MICROSECOND',
50     second             => 'SECOND',
51     minute             => 'MINUTE',
52     hour               => 'HOUR',
53     day_of_month       => 'DAY',
54     week               => 'WEEK',
55     month              => 'MONTH',
56     quarter            => 'QUARTER',
57     year               => 'YEAR',
58     second_microsecond => 'SECOND_MICROSECOND',
59     minute_microsecond => 'MINUTE_MICROSECOND',
60     minute_second      => 'MINUTE_SECOND',
61     hour_microsecond   => 'HOUR_MICROSECOND',
62     hour_second        => 'HOUR_SECOND',
63     hour_minute        => 'HOUR_MINUTE',
64     day_microsecond    => 'DAY_MICROSECOND',
65     day_second         => 'DAY_SECOND',
66     day_minute         => 'DAY_MINUTE',
67     day_hour           => 'DAY_HOUR',
68     year_month         => 'YEAR_MONTH',
69   );
70
71   my %diff_part_map = %part_map;
72   $diff_part_map{day} = delete $diff_part_map{day_of_month};
73
74   sub _datetime_sql {
75     die $_[0]->_unsupported_date_extraction($_[1], 'MySQL')
76        unless exists $part_map{$_[1]};
77     "EXTRACT($part_map{$_[1]} FROM $_[2])"
78   }
79   sub _datetime_diff_sql {
80     die $_[0]->_unsupported_date_diff($_[1], 'MySQL')
81        unless exists $diff_part_map{$_[1]};
82     "TIMESTAMPDIFF($diff_part_map{$_[1]}, $_[2], $_[3])"
83   }
84 }
85
86 =head1 DATE FUNCTION IMPLEMENTATION
87
88 =head1 DATE FUNCTION IMPLEMENTATION
89
90 The function used to extract date information is C<DATEPART>, which supports
91
92  microsecond
93  second
94  minute
95  hour
96  day_of_month
97  week
98  month
99  quarter
100  year
101  second_microsecond
102  minute_microsecond
103  minute_second
104  hour_microsecond
105  hour_second
106  hour_minute
107  day_microsecond
108  day_second
109  day_minute
110  day_hour
111  year_month
112
113 The function used to diff dates is C<TIMESTAMPDIFF>, which supports
114
115  microsecond
116  second
117  minute
118  hour
119  day
120  week
121  month
122  quarter
123  year
124  second_microsecond
125  minute_microsecond
126  minute_second
127  hour_microsecond
128  hour_second
129  hour_minute
130  day_microsecond
131  day_second
132  day_minute
133  day_hour
134  year_month
135
136 =cut
137
138 1;