The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

use strict;
no warnings qw/qw/;
use SQL::Abstract::Test import => ['is_same_sql_bind'];
my ($sql, @bind);
# test multicols with SQL support
my $sqla = SQL::Abstract::More->new(
# multicols_sep => '/',
multicols_sep => qr[\s*/\s*],
has_multicols_in_SQL => 1,
);
($sql, @bind) = $sqla->where({
one_col => 999,
"foo/bar" => {-in => ["1/a", "2/b"]},
"x/y/z" => {-not_in => ["X/Y/Z"]},
});
my @expected = ("WHERE (foo, bar) IN ((?, ?), (?, ?)) "
."AND one_col = ? "
."AND (x, y, z) NOT IN ((?, ?, ?))",
[qw/1 a 2 b 999 X Y Z/]);
is_same_sql_bind($sql, \@bind, @expected);
# same test, but with values passed as arrayrefs
($sql, @bind) = $sqla->where({
one_col => 999,
"foo/bar" => {-in => [[1, "a"], [2, "b"]]},
"x/y/z" => {-not_in => [[qw/X Y Z/]]},
});
is_same_sql_bind($sql, \@bind, @expected);
# right-hand side as a subquery
($sql, @bind) = $sqla->where({
one_col => 999,
"foo/bar" => {-in => \"SELECT (a, b) FROM FOOBAR"},
});
is_same_sql_bind($sql, \@bind,
"WHERE (foo, bar) IN (SELECT (a, b) FROM FOOBAR)"
."AND one_col = ? ",
[999]);
# right-hand side as a subquery with bind values
($sql, @bind) = $sqla->where({
one_col => 999,
"foo/bar" => {-in => \["SELECT (a, b) FROM FOOBAR WHERE a > ?", 1234]},
});
is_same_sql_bind($sql, \@bind,
"WHERE (foo, bar) IN (SELECT (a, b) FROM FOOBAR WHERE a > ?)"
."AND one_col = ? ",
[1234, 999]);
# test multicols without SQL support
$sqla = SQL::Abstract::More->new(
# multicols_sep => '/',
multicols_sep => qr[\s*/\s*],
has_multicols_in_SQL => 0,
);
($sql, @bind) = $sqla->where({
one_col => 999,
"foo/bar" => {-in => ["1/a", "2/b"]},
"x/y/z" => {-not_in => ["X/Y/Z"]},
});
is_same_sql_bind(
$sql, \@bind,
"WHERE ((foo = ? AND bar = ?) OR (foo = ? AND bar = ?)) "
."AND one_col = ? "
."AND NOT (x = ? AND y = ? AND z = ?)",
[qw/1 a 2 b 999 X Y Z/],
);
done_testing();