Subject: | IN (…) mishandles nested subqueries with bind parameters |
Using multiple ResultSetcolumns with bind variables in an IN (…) via ->as_query
treats the subqueries' bind parameters as if they were directly in the -in => […]
list and wraps them in another layer of [ \%attr => $value ].
Reported by simbabque on IRC.
Adding the following test case to t/search/subquery.t fails:
{
rs => $cdrs,
search => {
artistid => {
'-in' => [
$art_rs->search({ name => 'Foo' }, { rows => 1 })->get_column( 'artistid' )->as_query,
$art_rs->search({ name => 'Bar' }, { rows => 1 })->get_column( 'artistid' )->as_query,
],
}
},
sqlbind => \[
"( SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE artistid IN ( (SELECT me.artistid FROM artist me WHERE name = ? LIMIT ? ), (SELECT me.artistid FROM artist me WHERE name = ? LIMIT ?) ) )",
[ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'name' } => 'Foo' ],
[ $ROWS => 1 ],
[ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'name' } => 'Bar' ],
[ $ROWS => 1 ],
],
},
with:
BIND values differ {
got => [
[
{ dbic_colname => "artistid" },
[
{ dbic_colname => "name", sqlt_datatype => "varchar", sqlt_size => 100 },
"Foo"
]
],
[
{ dbic_colname => "artistid" },
[
{ sqlt_datatype => "integer" },
1
]
],
[
{ dbic_colname => "artistid" },
[
{ dbic_colname => "name", sqlt_datatype => "varchar", sqlt_size => 100 },
"Bar"
]
],
[
{ dbic_colname => "artistid" },
[
{ sqlt_datatype => "integer" },
1
]
]
],
want => [
[
{ dbic_colname => "name", sqlt_datatype => "varchar", sqlt_size => 100 },
"Foo"
],
[
{ sqlt_datatype => "integer" },
1
],
[
{ dbic_colname => "name", sqlt_datatype => "varchar", sqlt_size => 100 },
"Bar"
],
[
{ sqlt_datatype => "integer" },
1
],
]
}