package
DBIx::Class::SQLMaker::MySQL;
sub
insert {
my
$self
=
shift
;
if
(!
$_
[1] or (
ref
$_
[1] eq
'HASH'
and !
keys
%{
$_
[1]} ) ) {
my
$table
=
$self
->_quote(
$_
[0]);
return
"INSERT INTO ${table} () VALUES ()"
}
return
$self
->
next
::method (
@_
);
}
sub
_generate_join_clause {
my
(
$self
,
$join_type
) =
@_
;
if
(
$join_type
&&
$join_type
=~ /^STRAIGHT\z/i ) {
return
' STRAIGHT_JOIN '
}
return
$self
->
next
::method(
$join_type
);
}
my
$force_double_subq
;
$force_double_subq
=
sub
{
my
(
$self
,
$sql
) =
@_
;
my
$new_sql
;
while
(1) {
my
(
$prefix
,
$parenthesized
);
(
$parenthesized
,
$sql
,
$prefix
) =
do
{
local
$@;
Text::Balanced::extract_bracketed(
$sql
,
'()'
,
qr/[^\(]*/
);
};
last
unless
$parenthesized
;
if
(
$parenthesized
=~
$self
->{_modification_target_referenced_re}) {
if
(
$parenthesized
=~ /^ \( \s* SELECT \s+ /xi ) {
$parenthesized
=
"( SELECT * FROM $parenthesized `_forced_double_subquery` )"
;
}
else
{
$parenthesized
=~ s/^ \( (.+) \) $/$1/x;
$parenthesized
=
join
' '
,
'('
,
$self
->
$force_double_subq
(
$parenthesized
),
')'
;
}
}
$new_sql
.=
$prefix
.
$parenthesized
;
}
return
$new_sql
.
$sql
;
};
sub
update {
my
$self
=
shift
;
return
$self
->
next
::method(
@_
)
unless
$self
->{_modification_target_referenced_re};
my
(
$sql
,
@bind
) =
$self
->
next
::method(
@_
);
$sql
=
$self
->
$force_double_subq
(
$sql
)
if
$sql
=~
$self
->{_modification_target_referenced_re};
return
(
$sql
,
@bind
);
}
sub
delete
{
my
$self
=
shift
;
return
$self
->
next
::method(
@_
)
unless
$self
->{_modification_target_referenced_re};
my
(
$sql
,
@bind
) =
$self
->
next
::method(
@_
);
$sql
=
$self
->
$force_double_subq
(
$sql
)
if
$sql
=~
$self
->{_modification_target_referenced_re};
return
(
$sql
,
@bind
);
}
my
$for_syntax
= {
update
=>
'FOR UPDATE'
,
shared
=>
'LOCK IN SHARE MODE'
};
sub
_lock_select {
my
(
$self
,
$type
) =
@_
;
my
$sql
=
$for_syntax
->{
$type
}
||
$self
->throw_exception(
"Unknown SELECT .. FOR type '$type' requested"
);
return
" $sql"
;
}
1;