The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

use strict;
use SQL::Abstract::Test import => ['is_same_sql_bind'];
my @cases = (
[
undef,
[
\"colA DESC"
],
[
"colA DESC"
]
],
[
"`",
[
\"colA DESC"
],
[
"colA DESC"
]
],
[
undef,
[
"colA"
],
[
"colA"
]
],
[
"`",
[
"colA"
],
[
"`colA`"
]
],
[
undef,
[
"colA DESC"
],
[
"colA DESC"
]
],
[
"`",
[
"colA DESC"
],
[
"`colA DESC`"
]
],
[
undef,
[
"colA"
],
[
"colA"
]
],
[
undef,
[
"colB"
],
[
"colB"
]
],
[
undef,
[
[
"colA",
"colB"
]
],
[
"colA",
"colB"
]
],
[
"`",
[
"colA"
],
[
"`colA`"
]
],
[
"`",
[
"colB"
],
[
"`colB`"
]
],
[
"`",
[
[
"colA",
"colB"
]
],
[
"`colA`",
"`colB`"
]
],
[
undef,
[
"colA ASC"
],
[
"colA ASC"
]
],
[
undef,
[
"colB DESC"
],
[
"colB DESC"
]
],
[
undef,
[
[
"colA ASC",
"colB DESC"
]
],
[
"colA ASC",
"colB DESC"
]
],
[
"`",
[
"colA ASC"
],
[
"`colA ASC`"
]
],
[
"`",
[
"colB DESC"
],
[
"`colB DESC`"
]
],
[
"`",
[
[
"colA ASC",
"colB DESC"
]
],
[
"`colA ASC`",
"`colB DESC`"
]
],
[
undef,
[
"colA"
],
[
"colA"
]
],
[
undef,
[
{
"-asc" => "colA"
}
],
[
[
"colA ASC"
]
]
],
[
"`",
[
"colA"
],
[
"`colA`"
]
],
[
"`",
[
{
"-asc" => "colA"
}
],
[
[
"`colA` ASC"
]
]
],
[
undef,
[
"colB"
],
[
"colB"
]
],
[
undef,
[
{
"-desc" => "colB"
}
],
[
[
"colB DESC"
]
]
],
[
"`",
[
"colB"
],
[
"`colB`"
]
],
[
"`",
[
{
"-desc" => "colB"
}
],
[
[
"`colB` DESC"
]
]
],
[
undef,
[
"colA"
],
[
"colA"
]
],
[
undef,
[
{
"-asc" => "colA"
}
],
[
[
"colA ASC"
]
]
],
[
undef,
[
"colB"
],
[
"colB"
]
],
[
undef,
[
{
"-desc" => "colB"
}
],
[
[
"colB DESC"
]
]
],
[
undef,
[
[
{
"-asc" => "colA"
},
{
"-desc" => "colB"
}
]
],
[
[
"colA ASC"
],
[
"colB DESC"
]
]
],
[
"`",
[
"colA"
],
[
"`colA`"
]
],
[
"`",
[
{
"-asc" => "colA"
}
],
[
[
"`colA` ASC"
]
]
],
[
"`",
[
"colB"
],
[
"`colB`"
]
],
[
"`",
[
{
"-desc" => "colB"
}
],
[
[
"`colB` DESC"
]
]
],
[
"`",
[
[
{
"-asc" => "colA"
},
{
"-desc" => "colB"
}
]
],
[
[
"`colA` ASC"
],
[
"`colB` DESC"
]
]
],
[
undef,
[
"colA"
],
[
"colA"
]
],
[
undef,
[
"colB"
],
[
"colB"
]
],
[
undef,
[
{
"-desc" => "colB"
}
],
[
[
"colB DESC"
]
]
],
[
undef,
[
[
"colA",
{
"-desc" => "colB"
}
]
],
[
"colA",
[
"colB DESC"
]
]
],
[
"`",
[
"colA"
],
[
"`colA`"
]
],
[
"`",
[
"colB"
],
[
"`colB`"
]
],
[
"`",
[
{
"-desc" => "colB"
}
],
[
[
"`colB` DESC"
]
]
],
[
"`",
[
[
"colA",
{
"-desc" => "colB"
}
]
],
[
"`colA`",
[
"`colB` DESC"
]
]
],
[
undef,
[
"colA"
],
[
"colA"
]
],
[
undef,
[
"colB"
],
[
"colB"
]
],
[
undef,
[
[
"colA",
"colB"
]
],
[
"colA",
"colB"
]
],
[
undef,
[
{
"-desc" => [
"colA",
"colB"
]
}
],
[
[
"colA DESC"
],
[
"colB DESC"
]
]
],
[
undef,
[
[
{
"-desc" => [
"colA",
"colB"
]
}
]
],
[
[
"colA DESC"
],
[
"colB DESC"
]
]
],
[
"`",
[
"colA"
],
[
"`colA`"
]
],
[
"`",
[
"colB"
],
[
"`colB`"
]
],
[
"`",
[
[
"colA",
"colB"
]
],
[
"`colA`",
"`colB`"
]
],
[
"`",
[
{
"-desc" => [
"colA",
"colB"
]
}
],
[
[
"`colA` DESC"
],
[
"`colB` DESC"
]
]
],
[
"`",
[
[
{
"-desc" => [
"colA",
"colB"
]
}
]
],
[
[
"`colA` DESC"
],
[
"`colB` DESC"
]
]
],
[
undef,
[
"colA"
],
[
"colA"
]
],
[
undef,
[
"colB"
],
[
"colB"
]
],
[
undef,
[
[
"colA",
"colB"
]
],
[
"colA",
"colB"
]
],
[
undef,
[
{
"-desc" => [
"colA",
"colB"
]
}
],
[
[
"colA DESC"
],
[
"colB DESC"
]
]
],
[
undef,
[
"colC"
],
[
"colC"
]
],
[
undef,
[
{
"-asc" => "colC"
}
],
[
[
"colC ASC"
]
]
],
[
undef,
[
[
{
"-desc" => [
"colA",
"colB"
]
},
{
"-asc" => "colC"
}
]
],
[
[
"colA DESC"
],
[
"colB DESC"
],
[
"colC ASC"
]
]
],
[
"`",
[
"colA"
],
[
"`colA`"
]
],
[
"`",
[
"colB"
],
[
"`colB`"
]
],
[
"`",
[
[
"colA",
"colB"
]
],
[
"`colA`",
"`colB`"
]
],
[
"`",
[
{
"-desc" => [
"colA",
"colB"
]
}
],
[
[
"`colA` DESC"
],
[
"`colB` DESC"
]
]
],
[
"`",
[
"colC"
],
[
"`colC`"
]
],
[
"`",
[
{
"-asc" => "colC"
}
],
[
[
"`colC` ASC"
]
]
],
[
"`",
[
[
{
"-desc" => [
"colA",
"colB"
]
},
{
"-asc" => "colC"
}
]
],
[
[
"`colA` DESC"
],
[
"`colB` DESC"
],
[
"`colC` ASC"
]
]
],
[
undef,
[
"colA"
],
[
"colA"
]
],
[
undef,
[
"colB"
],
[
"colB"
]
],
[
undef,
[
[
"colA",
"colB"
]
],
[
"colA",
"colB"
]
],
[
undef,
[
{
"-desc" => [
"colA",
"colB"
]
}
],
[
[
"colA DESC"
],
[
"colB DESC"
]
]
],
[
undef,
[
"colC"
],
[
"colC"
]
],
[
undef,
[
"colD"
],
[
"colD"
]
],
[
undef,
[
[
"colC",
"colD"
]
],
[
"colC",
"colD"
]
],
[
undef,
[
{
"-asc" => [
"colC",
"colD"
]
}
],
[
[
"colC ASC"
],
[
"colD ASC"
]
]
],
[
undef,
[
[
{
"-desc" => [
"colA",
"colB"
]
},
{
"-asc" => [
"colC",
"colD"
]
}
]
],
[
[
"colA DESC"
],
[
"colB DESC"
],
[
"colC ASC"
],
[
"colD ASC"
]
]
],
[
"`",
[
"colA"
],
[
"`colA`"
]
],
[
"`",
[
"colB"
],
[
"`colB`"
]
],
[
"`",
[
[
"colA",
"colB"
]
],
[
"`colA`",
"`colB`"
]
],
[
"`",
[
{
"-desc" => [
"colA",
"colB"
]
}
],
[
[
"`colA` DESC"
],
[
"`colB` DESC"
]
]
],
[
"`",
[
"colC"
],
[
"`colC`"
]
],
[
"`",
[
"colD"
],
[
"`colD`"
]
],
[
"`",
[
[
"colC",
"colD"
]
],
[
"`colC`",
"`colD`"
]
],
[
"`",
[
{
"-asc" => [
"colC",
"colD"
]
}
],
[
[
"`colC` ASC"
],
[
"`colD` ASC"
]
]
],
[
"`",
[
[
{
"-desc" => [
"colA",
"colB"
]
},
{
"-asc" => [
"colC",
"colD"
]
}
]
],
[
[
"`colA` DESC"
],
[
"`colB` DESC"
],
[
"`colC` ASC"
],
[
"`colD` ASC"
]
]
],
[
undef,
[
"colA"
],
[
"colA"
]
],
[
undef,
[
"colB"
],
[
"colB"
]
],
[
undef,
[
[
"colA",
"colB"
]
],
[
"colA",
"colB"
]
],
[
undef,
[
{
"-desc" => [
"colA",
"colB"
]
}
],
[
[
"colA DESC"
],
[
"colB DESC"
]
]
],
[
undef,
[
"colC"
],
[
"colC"
]
],
[
undef,
[
{
"-desc" => "colC"
}
],
[
[
"colC DESC"
]
]
],
[
undef,
[
[
{
"-desc" => [
"colA",
"colB"
]
},
{
"-desc" => "colC"
}
]
],
[
[
"colA DESC"
],
[
"colB DESC"
],
[
"colC DESC"
]
]
],
[
"`",
[
"colA"
],
[
"`colA`"
]
],
[
"`",
[
"colB"
],
[
"`colB`"
]
],
[
"`",
[
[
"colA",
"colB"
]
],
[
"`colA`",
"`colB`"
]
],
[
"`",
[
{
"-desc" => [
"colA",
"colB"
]
}
],
[
[
"`colA` DESC"
],
[
"`colB` DESC"
]
]
],
[
"`",
[
"colC"
],
[
"`colC`"
]
],
[
"`",
[
{
"-desc" => "colC"
}
],
[
[
"`colC` DESC"
]
]
],
[
"`",
[
[
{
"-desc" => [
"colA",
"colB"
]
},
{
"-desc" => "colC"
}
]
],
[
[
"`colA` DESC"
],
[
"`colB` DESC"
],
[
"`colC` DESC"
]
]
],
[
undef,
[
"colA"
],
[
"colA"
]
],
[
undef,
[
{
"-asc" => "colA"
}
],
[
[
"colA ASC"
]
]
],
[
undef,
[
"colB"
],
[
"colB"
]
],
[
undef,
[
[
"colB"
]
],
[
"colB"
]
],
[
undef,
[
{
"-desc" => [
"colB"
]
}
],
[
[
"colB DESC"
]
]
],
[
undef,
[
"colC"
],
[
"colC"
]
],
[
undef,
[
"colD"
],
[
"colD"
]
],
[
undef,
[
[
"colC",
"colD"
]
],
[
"colC",
"colD"
]
],
[
undef,
[
{
"-asc" => [
"colC",
"colD"
]
}
],
[
[
"colC ASC"
],
[
"colD ASC"
]
]
],
[
undef,
[
[
{
"-asc" => "colA"
},
{
"-desc" => [
"colB"
]
},
{
"-asc" => [
"colC",
"colD"
]
}
]
],
[
[
"colA ASC"
],
[
"colB DESC"
],
[
"colC ASC"
],
[
"colD ASC"
]
]
],
[
"`",
[
"colA"
],
[
"`colA`"
]
],
[
"`",
[
{
"-asc" => "colA"
}
],
[
[
"`colA` ASC"
]
]
],
[
"`",
[
"colB"
],
[
"`colB`"
]
],
[
"`",
[
[
"colB"
]
],
[
"`colB`"
]
],
[
"`",
[
{
"-desc" => [
"colB"
]
}
],
[
[
"`colB` DESC"
]
]
],
[
"`",
[
"colC"
],
[
"`colC`"
]
],
[
"`",
[
"colD"
],
[
"`colD`"
]
],
[
"`",
[
[
"colC",
"colD"
]
],
[
"`colC`",
"`colD`"
]
],
[
"`",
[
{
"-asc" => [
"colC",
"colD"
]
}
],
[
[
"`colC` ASC"
],
[
"`colD` ASC"
]
]
],
[
"`",
[
[
{
"-asc" => "colA"
},
{
"-desc" => [
"colB"
]
},
{
"-asc" => [
"colC",
"colD"
]
}
]
],
[
[
"`colA` ASC"
],
[
"`colB` DESC"
],
[
"`colC` ASC"
],
[
"`colD` ASC"
]
]
],
[
undef,
[
\[
"colA LIKE ?",
"test"
]
],
[
[
"colA LIKE ?",
"test"
]
]
],
[
undef,
[
{
"-desc" => \[
"colA LIKE ?",
"test"
]
}
],
[
[
"colA LIKE ? DESC",
"test"
]
]
],
[
"`",
[
\[
"colA LIKE ?",
"test"
]
],
[
[
"colA LIKE ?",
"test"
]
]
],
[
"`",
[
{
"-desc" => \[
"colA LIKE ?",
"test"
]
}
],
[
[
"colA LIKE ? DESC",
"test"
]
]
],
[
undef,
[
\[
"colA LIKE ? DESC",
"test"
]
],
[
[
"colA LIKE ? DESC",
"test"
]
]
],
[
"`",
[
\[
"colA LIKE ? DESC",
"test"
]
],
[
[
"colA LIKE ? DESC",
"test"
]
]
],
[
undef,
[
\[
"colA"
]
],
[
[
"colA"
]
]
],
[
undef,
[
{
"-asc" => \[
"colA"
]
}
],
[
[
"colA ASC"
]
]
],
[
undef,
[
\[
"colB LIKE ?",
"test"
]
],
[
[
"colB LIKE ?",
"test"
]
]
],
[
undef,
[
{
"-desc" => \[
"colB LIKE ?",
"test"
]
}
],
[
[
"colB LIKE ? DESC",
"test"
]
]
],
[
undef,
[
\[
"colC LIKE ?",
"tost"
]
],
[
[
"colC LIKE ?",
"tost"
]
]
],
[
undef,
[
{
"-asc" => \[
"colC LIKE ?",
"tost"
]
}
],
[
[
"colC LIKE ? ASC",
"tost"
]
]
],
[
undef,
[
[
{
"-asc" => \[
"colA"
]
},
{
"-desc" => \[
"colB LIKE ?",
"test"
]
},
{
"-asc" => \[
"colC LIKE ?",
"tost"
]
}
]
],
[
[
"colA ASC"
],
[
"colB LIKE ? DESC",
"test"
],
[
"colC LIKE ? ASC",
"tost"
]
]
],
[
"`",
[
\[
"colA"
]
],
[
[
"colA"
]
]
],
[
"`",
[
{
"-asc" => \[
"colA"
]
}
],
[
[
"colA ASC"
]
]
],
[
"`",
[
\[
"colB LIKE ?",
"test"
]
],
[
[
"colB LIKE ?",
"test"
]
]
],
[
"`",
[
{
"-desc" => \[
"colB LIKE ?",
"test"
]
}
],
[
[
"colB LIKE ? DESC",
"test"
]
]
],
[
"`",
[
\[
"colC LIKE ?",
"tost"
]
],
[
[
"colC LIKE ?",
"tost"
]
]
],
[
"`",
[
{
"-asc" => \[
"colC LIKE ?",
"tost"
]
}
],
[
[
"colC LIKE ? ASC",
"tost"
]
]
],
[
"`",
[
[
{
"-asc" => \[
"colA"
]
},
{
"-desc" => \[
"colB LIKE ?",
"test"
]
},
{
"-asc" => \[
"colC LIKE ?",
"tost"
]
}
]
],
[
[
"colA ASC"
],
[
"colB LIKE ? DESC",
"test"
],
[
"colC LIKE ? ASC",
"tost"
]
],
],
[
undef,
[{}],
[],
],
);
for my $case (@cases) {
my ($quote, $expr, $out) = @$case;
my $sqla = SQL::Abstract->new({ quote_char => $quote });
if (
@$expr == 1
and ref($expr->[0]) eq 'REF'
and ref(${$expr->[0]}) eq 'ARRAY'
and @${$expr->[0]} == 1
) {
# \[ 'foo' ] is exactly equivalent to \'foo' and the new code knows that
$out = $out->[0];
}
my @chunks = $sqla->_order_by_chunks($expr);
unless (is(Dumper(\@chunks), Dumper($out))) {
diag("Above failure from expr: ".Dumper($expr));
}
}
done_testing;