File Coverage

blib/lib/Alzabo/SQLMaker/MySQL.pm
Criterion Covered Total %
statement 48 75 64.0
branch 1 10 10.0
condition 0 12 0.0
subroutine 8 14 57.1
pod 4 6 66.6
total 61 117 52.1


line stmt bran cond sub pod time code
1             package Alzabo::SQLMaker::MySQL;
2              
3 1     1   655 use strict;
  1         3  
  1         169  
4 1     1   6 use vars qw($VERSION $AUTOLOAD @EXPORT_OK %EXPORT_TAGS);
  1         2  
  1         71  
5              
6 1     1   5 use Alzabo::Exceptions;
  1         1  
  1         12  
7 1     1   5 use Alzabo::Utils;
  1         3  
  1         16  
8              
9 1     1   4 use Alzabo::SQLMaker;
  1         2  
  1         21  
10 1     1   5 use base qw(Alzabo::SQLMaker);
  1         1  
  1         1680  
11              
12             $VERSION = 2.0;
13              
14             my $MADE_FUNCTIONS;
15              
16             sub import
17             {
18 1 50   1   15 _make_functions() unless $MADE_FUNCTIONS;
19              
20             # used to export function functions
21 1         12 require Exporter;
22 1         6 *_import = \&Exporter::import;
23              
24 1         63 goto &_import;
25             }
26              
27             sub _make_functions
28             {
29 1     1   3 local *make_function = \&Alzabo::SQLMaker::make_function;
30              
31 1         17 foreach ( [ PI => [ 'math' ] ],
32              
33             [ CURDATE => [ 'datetime' ] ],
34             [ CURRENT_DATE => [ 'datetime' ] ],
35             [ CURTIME => [ 'datetime' ] ],
36             [ CURRENT_TIME => [ 'datetime' ] ],
37             [ NOW => [ 'datetime', 'common' ] ],
38             [ SYSDATE => [ 'datetime' ] ],
39             [ CURRENT_TIMESTAMP => [ 'datetime' ] ],
40              
41             [ DATABASE => [ 'system' ] ],
42             [ USER => [ 'system' ] ],
43             [ SYSTEM_USER => [ 'system' ] ],
44             [ SESSION_USER => [ 'system' ] ],
45             [ VERSION => [ 'system' ] ],
46             [ CONNECTION_ID => [ 'system' ] ],
47             )
48             {
49 14         49 make_function( function => $_->[0],
50             min => 0,
51             max => 0,
52             groups => $_->[1]
53             );
54             }
55              
56 1         9 foreach ( [ RAND => [ 'math' ] ],
57             [ UNIX_TIMESTAMP => [ 'datetime' ] ],
58             [ LAST_INSERT_ID => [ 'system' ] ],
59             )
60             {
61 3         14 make_function( function => $_->[0],
62             min => 0,
63             max => 1,
64             quote => [0],
65             groups => $_->[1]
66             );
67             }
68              
69 1         7 make_function( function => 'CHAR',
70             min => 1,
71             max => undef,
72             quote => [0],
73             groups => [ 'string' ],
74             );
75              
76 1         5 foreach ( [ ENCRYPT => [1,1], [ 'misc' ] ] )
77             {
78 1         7 make_function( function => $_->[0],
79             min => 0,
80             max => 1,
81             quote => $_->[1],
82             groups => $_->[2],
83             );
84             }
85              
86 1         56 foreach ( [ MOD => [0,0], [ 'math' ] ],
87             [ ROUND => [0,0], [ 'math' ] ],
88             [ POW => [0,0], [ 'math' ] ],
89             [ POWER => [0,0], [ 'math' ] ],
90             [ ATAN2 => [0,0], [ 'math' ] ],
91              
92             [ POSITION => [1,1], [ 'string' ] ],
93             [ INSTR => [1,1], [ 'string' ] ],
94             [ LEFT => [1,1], [ 'string' ] ],
95             [ RIGHT => [1,1], [ 'string' ] ],
96             [ FIND_IN_SET => [1,1], [ 'string' ] ],
97             [ REPEAT => [1,0], [ 'string' ] ],
98              
99             [ ENCODE => [1,1], [ 'misc' ] ],
100             [ DECODE => [1,1], [ 'misc' ] ],
101             [ FORMAT => [0,0], [ 'misc' ] ],
102              
103             [ PERIOD_ADD => [0,0], [ 'datetime' ] ],
104             [ PERIOD_DIFF => [0,0], [ 'datetime' ] ],
105             [ DATE_ADD => [1,0], [ 'datetime' ] ],
106             [ DATE_SUB => [1,0] , [ 'datetime' ]],
107             [ ADDDATE => [1,0], [ 'datetime' ] ],
108             [ SUBDATE => [1,0], [ 'datetime' ] ],
109             [ DATE_FORMAT => [1,1], [ 'datetime' ] ],
110             [ TIME_FORMAT => [1,1], [ 'datetime' ] ],
111             [ FROM_UNIXTIME => [0,1], [ 'datetime' ] ],
112              
113             [ GET_LOCK => [1,0], [ 'system' ] ],
114             [ BENCHMARK => [0,1], [ 'system' ] ],
115             [ MASTER_POS_WAIT => [1,0], [ 'system' ] ],
116              
117             [ IFNULL => [0,1], [ 'control' ] ],
118             [ NULLIF => [0,0], [ 'control' ] ],
119             )
120             {
121 28         92 make_function( function => $_->[0],
122             min => 2,
123             max => 2,
124             quote => $_->[1],
125             groups => $_->[2],
126             );
127             }
128              
129 1         84 foreach ( [ LEAST => [1,1,1], [ 'string' ] ],
130             [ GREATEST => [1,1,1], [ 'string' ] ],
131             [ CONCAT => [1,1,1], [ 'string' ] ],
132             [ ELT => [0,1.1], [ 'string' ] ],
133             [ FIELD => [1,1,1], [ 'string' ] ],
134             [ MAKE_SET => [0,1,1], [ 'string' ] ],
135             )
136             {
137 6         20 make_function( function => $_->[0],
138             min => 2,
139             max => undef,
140             quote => $_->[1],
141             groups => $_->[2],
142             );
143             }
144              
145 1         23 foreach ( [ LOCATE => [1,1,0], [ 'string' ] ],
146             [ SUBSTRING => [1,0,0], [ 'string' ] ],
147             [ CONV => [1,0,0], [ 'string' ] ],
148             [ LPAD => [1,0,1], [ 'string' ] ],
149             [ RPAD => [1,0,1], [ 'string' ] ],
150             [ MID => [1,0,0], [ 'string' ] ],
151             [ SUBSTRING_INDEX => [1,1,0], [ 'string' ] ],
152             [ REPLACE => [1,1,1], [ 'string' ] ],
153              
154             [ IF => [0,1,1], [ 'control' ] ],
155             )
156             {
157 9         34 make_function( function => $_->[0],
158             min => 3,
159             max => 3,
160             quote => $_->[1],
161             groups => $_->[2],
162             );
163             }
164              
165 1         12 foreach ( [ WEEK => [1,0], [ 'datetime' ] ],
166             [ YEARWEEK => [1,0], [ 'datetime' ] ],
167             )
168             {
169 2         9 make_function( function => $_->[0],
170             min => 1,
171             max => 2,
172             quote => $_->[1],
173             groups => $_->[2],
174             );
175             }
176              
177 1         9 make_function( function => 'CONCAT_WS',
178             min => 3,
179             max => undef,
180             quote => [1,1,1,1],
181             groups => [ 'string' ],
182             );
183              
184 1         10 make_function( function => 'EXPORT_SET',
185             min => 3,
186             max => 5,
187             quote => [0,1,1,1,0],
188             groups => [ 'string' ],
189             );
190              
191 1         6 make_function( function => 'INSERT',
192             min => 3,
193             max => 5,
194             quote => [1,0,0,1],
195             groups => [ 'string' ],
196             );
197              
198 1         99 foreach ( [ ABS => [0], [ 'math' ] ],
199             [ SIGN => [0], [ 'math' ] ],
200             [ FLOOR => [0], [ 'math' ] ],
201             [ CEILING => [0], [ 'math' ] ],
202             [ EXP => [0], [ 'math' ] ],
203             [ LOG => [0], [ 'math' ] ],
204             [ LOG10 => [0], [ 'math' ] ],
205             [ SQRT => [0], [ 'math' ] ],
206             [ COS => [0], [ 'math' ] ],
207             [ SIN => [0], [ 'math' ] ],
208             [ TAN => [0], [ 'math' ] ],
209             [ ACOS => [0], [ 'math' ] ],
210             [ ASIN => [0], [ 'math' ] ],
211             [ ATAN => [0], [ 'math' ] ],
212             [ COT => [0], [ 'math' ] ],
213             [ DEGREES => [0], [ 'math' ] ],
214             [ RADIANS => [0], [ 'math' ] ],
215             [ TRUNCATE => [0], [ 'math' ] ],
216              
217             [ ASCII => [1], [ 'string' ] ],
218             [ ORD => [1], [ 'string' ] ],
219             [ BIN => [0], [ 'string' ] ],
220             [ OCT => [0], [ 'string' ] ],
221             [ HEX => [0], [ 'string' ] ],
222             [ LENGTH => [1], [ 'string' ] ],
223             [ OCTET_LENGTH => [1], [ 'string' ] ],
224             [ CHAR_LENGTH => [1], [ 'string' ] ],
225             [ CHARACTER_LENGTH => [1], [ 'string' ] ],
226             [ TRIM => [1], [ 'string' ] ],
227             [ LTRIM => [1], [ 'string' ] ],
228             [ RTRIM => [1], [ 'string' ] ],
229             [ SOUNDEX => [1], [ 'string' ] ],
230             [ SPACE => [0], [ 'string' ] ],
231             [ REVERSE => [1], [ 'string' ] ],
232             [ LCASE => [1], [ 'string' ] ],
233             [ LOWER => [1], [ 'string' ] ],
234             [ UCASE => [1], [ 'string' ] ],
235             [ UPPER => [1], [ 'string' ] ],
236              
237             [ RELEASE_LOCK => [1], [ 'system' ] ],
238              
239             [ DAYOFWEEK => [1], [ 'datetime' ] ],
240             [ WEEKDAY => [1], [ 'datetime' ] ],
241             [ DAYOFYEAR => [1], [ 'datetime' ] ],
242             [ MONTH => [1], [ 'datetime' ] ],
243             [ DAYNAME => [1], [ 'datetime' ] ],
244             [ MONTHNAME => [1], [ 'datetime' ] ],
245             [ QUARTER => [1], [ 'datetime' ] ],
246             [ YEAR => [1], [ 'datetime' ] ],
247             [ HOUR => [1], [ 'datetime' ] ],
248             [ MINUTE => [1], [ 'datetime' ] ],
249             [ SECOND => [1], [ 'datetime' ] ],
250             [ TO_DAYS => [1], [ 'datetime' ] ],
251             [ FROM_DAYS => [0], [ 'datetime' ] ],
252             [ SEC_TO_TIME => [0], [ 'datetime' ] ],
253             [ TIME_TO_SEC => [1], [ 'datetime' ] ],
254              
255             [ INET_NTOA => [0], [ 'misc' ] ],
256             [ INET_ATON => [1], [ 'misc' ] ],
257              
258             [ COUNT => [0], [ 'aggregate', 'common' ] ],
259             [ AVG => [0], [ 'aggregate', 'common' ] ],
260             [ MIN => [0], [ 'aggregate', 'common' ] ],
261             [ MAX => [0], [ 'aggregate', 'common' ] ],
262             [ SUM => [0], [ 'aggregate', 'common' ] ],
263             [ STD => [0], [ 'aggregate' ] ],
264             [ STDDEV => [0], [ 'aggregate' ] ],
265              
266             [ BIT_OR => [0], [ 'misc' ] ],
267             [ PASSWORD => [1], [ 'misc' ] ],
268             [ MD5 => [1], [ 'misc' ] ],
269             [ BIT_AND => [0], [ 'misc' ] ],
270             [ LOAD_FILE => [1], [ 'misc' ] ],
271              
272             [ AGAINST => [1], [ 'fulltext' ] ],
273             )
274             {
275 68         568 make_function( function => $_->[0],
276             min => 1,
277             max => 1,
278             quote => $_->[1],
279             groups => $_->[2],
280             );
281             }
282              
283 1         57 foreach ( [ MATCH => [0], [ 'fulltext' ] ],
284             )
285             {
286 1         7 make_function( function => $_->[0],
287             min => 1,
288             max => undef,
289             quote => $_->[1],
290             groups => $_->[2],
291             );
292             }
293              
294 1         9 make_function( function => 'DISTINCT',
295             min => 1,
296             max => undef,
297             quote => [0],
298             groups => [ 'common' ],
299             allows_alias => 0,
300             );
301              
302 1         6 make_function( function => 'IN_BOOLEAN_MODE',
303             is_modifier => 1,
304             groups => [ 'fulltext' ],
305             );
306              
307 1         3 $MADE_FUNCTIONS = 1;
308             }
309              
310             sub init
311             {
312 0     0 0   1;
313             }
314              
315             sub select
316             {
317 0     0 1   my $self = shift;
318              
319             #
320             # Special check for [ MATCH( $foo_col, $bar_col ), AGAINST('foo bar') ]
321             # IN_BOOLEAN_MODE is optional
322             #
323 0           for ( my $i = 0; $i <= $#_; $i++ )
324             {
325 0 0 0       if ( Alzabo::Utils::safe_isa( $_[$i], 'Alzabo::SQLMaker::Function' ) &&
326             $_[$i]->as_string( $self->{driver}, $self->{quote_identifiers} ) =~ /^\s*MATCH/i )
327             {
328 0           $_[$i] = $_[$i]->as_string( $self->{driver}, $self->{quote_identifiers} );
329              
330 0           $_[$i] .= ' ' . $_[$i + 1]->as_string( $self->{driver}, $self->{quote_identifiers} );
331              
332 0           splice @_, $i + 1, 1;
333              
334 0 0 0       if ( defined $_[ $i + 1 ] &&
      0        
335             Alzabo::Utils::safe_isa( $_[ $i + 1 ], 'Alzabo::SQLMaker::Function' ) &&
336             $_[ $i + 1 ]->as_string( $self->{driver}, $self->{quote_identifiers} ) =~
337             /^\s*IN BOOLEAN MODE/i )
338             {
339 0           $_[$i] .= ' ' . $_[$i + 1]->as_string( $self->{driver}, $self->{quote_identifiers} );
340 0           splice @_, $i + 1, 1;
341             }
342             }
343             }
344              
345 0           $self->SUPER::select(@_);
346             }
347              
348             sub condition
349             {
350 0     0 0   my $self = shift;
351              
352             #
353             # Special check for [ MATCH( $foo_col, $bar_col ), AGAINST('foo bar') ]
354             # IN_BOOLEAN_MODE is optional
355             #
356 0 0 0       if ( Alzabo::Utils::safe_isa( $_[0], 'Alzabo::SQLMaker::Function' ) &&
357             $_[0]->as_string( $self->{driver}, $self->{quote_identifiers} ) =~ /^\s*MATCH/i )
358             {
359 0           $self->{last_op} = 'condition';
360 0           $self->{sql} .=
361 0           join ' ', map { $_->as_string( $self->{driver}, $self->{quote_identifiers} ) } @_;
362             }
363             else
364             {
365 0           $self->SUPER::condition(@_);
366             }
367             }
368              
369             sub limit
370             {
371 0     0 1   my $self = shift;
372 0           my ($max, $offset) = @_;
373              
374 0           $self->_assert_last_op( qw( from function where and or condition order_by group_by ) );
375              
376 0 0         if ($offset)
377             {
378 0           $self->{sql} .= " LIMIT $offset, $max";
379             }
380             else
381             {
382 0           $self->{sql} .= " LIMIT $max";
383             }
384              
385 0           $self->{last_op} = 'limit';
386              
387 0           return $self;
388             }
389              
390             sub get_limit
391             {
392 0     0 1   return undef;
393             }
394              
395             sub sqlmaker_id
396             {
397 0     0 1   return 'MySQL';
398             }
399              
400             1;
401              
402             __END__