my
$sql
= SQL::Abstract->new;
my
(
@tests
,
$sub_stmt
,
@sub_bind
,
$where
);
(
$sub_stmt
,
@sub_bind
) = (
"SELECT c1 FROM t1 WHERE c2 < ? AND c3 LIKE ?"
,
100,
"foo%"
);
$where
= {
foo
=> 1234,
bar
=> \[
"IN ($sub_stmt)"
=>
@sub_bind
],
};
push
@tests
, {
where
=>
$where
,
stmt
=>
" WHERE ( bar IN (SELECT c1 FROM t1 WHERE c2 < ? AND c3 LIKE ?) AND foo = ? )"
,
bind
=> [100,
"foo%"
, 1234],
};
(
$sub_stmt
,
@sub_bind
)
=
$sql
->
select
(
"t1"
,
"c1"
, {
c2
=> {
"<"
=> 100},
c3
=> {
-like
=>
"foo%"
}});
$where
= {
foo
=> 1234,
bar
=> \[
"> ALL ($sub_stmt)"
=>
@sub_bind
],
};
push
@tests
, {
where
=>
$where
,
stmt
=>
" WHERE ( bar > ALL (SELECT c1 FROM t1 WHERE (( c2 < ? AND c3 LIKE ? )) ) AND foo = ? )"
,
bind
=> [100,
"foo%"
, 1234],
};
(
$sub_stmt
,
@sub_bind
)
=
$sql
->
select
(
"t1"
,
"*"
, {
c1
=> 1,
c2
=> \
"> t0.c0"
});
$where
= {
foo
=> 1234,
-nest
=> \[
"EXISTS ($sub_stmt)"
=>
@sub_bind
],
};
push
@tests
, {
where
=>
$where
,
stmt
=>
" WHERE ( EXISTS (SELECT * FROM t1 WHERE ( c1 = ? AND c2 > t0.c0 )) AND foo = ? )"
,
bind
=> [1, 1234],
};
$where
= {
-nest
=> \[
"MATCH (col1, col2) AGAINST (?)"
=>
"apples"
],
};
push
@tests
, {
where
=>
$where
,
stmt
=>
" WHERE ( MATCH (col1, col2) AGAINST (?) )"
,
bind
=> [
"apples"
],
};
(
$sub_stmt
,
@sub_bind
)
=
$sql
->where({
age
=> [{
"<"
=> 10}, {
">"
=> 20}]});
$sub_stmt
=~ s/^ where //i;
$where
= {
lname
=> {
-like
=>
'%son%'
},
-nest
=> \[
"NOT ( $sub_stmt )"
=>
@sub_bind
],
};
push
@tests
, {
where
=>
$where
,
stmt
=>
" WHERE ( NOT ( ( ( ( age < ? ) OR ( age > ? ) ) ) ) AND lname LIKE ? )"
,
bind
=> [10, 20,
'%son%'
],
};
(
$sub_stmt
,
@sub_bind
) = (
"SELECT c1 FROM t1 WHERE c2 < ? AND c3 LIKE ?"
,
100,
"foo%"
);
$where
= {
foo
=> 1234,
bar
=> {
-in
=> \[
$sub_stmt
=>
@sub_bind
] },
};
push
@tests
, {
where
=>
$where
,
stmt
=>
" WHERE ( bar IN (SELECT c1 FROM t1 WHERE c2 < ? AND c3 LIKE ?) AND foo = ? )"
,
bind
=> [100,
"foo%"
, 1234],
};
for
(
@tests
) {
my
(
$stmt
,
@bind
) =
$sql
->where(
$_
->{where},
$_
->{order});
is_same_sql_bind(
$stmt
, \
@bind
,
$_
->{stmt},
$_
->{
bind
});
}
done_testing;