-
Notifications
You must be signed in to change notification settings - Fork 11
Description
The following code:
perl -MSQL::Abstract::More -E '
SQL::Abstract::More->new->select(
-from => "table",
-where => { account => { -in => [] } }
)
'generates the following SQL
SELECT * FROM table WHERE account IN ( )which is illegal.
The equivalent code with SQL::Abstract:
perl -MSQL::Abstract -E '
SQL::Abstract->new->select(
table => ["*"] => { account => { -in => [] } }
)
'generates
SELECT * FROM table WHERE 0=1
which is legal (and is what used to be generated before the SQL::Abstract rewrite in 2.000000).
After tracking this for a while, this seems to be down to the _where_field_IN override in SQL::Abstract::More. When SQL::Abstract runs on its own (or finds no override) it uses its own handler generated by make_binop_expander, and that generates the correct output. The override from SQL::Abstract::More finishes with
$self->next::method($k, $op, $vals)
but that passes the buck to the _where_field_IN method in SQL::Abstract, which does not do the right thing:
perl -MSQL::Abstract -E'
SQL::Abstract->new->_where_field_IN( foo => in => [] )
'
# foo IN ( )Further demonstration of this is that deleting the override in SQL::Abstract::More makes this go back to the old behaviour:
perl -MSQL::Abstract::More -E '
delete $SQL::Abstract::More::{_where_field_IN};
SQL::Abstract::More->new->select(
-from => "table",
-where => { account => { -in => [] } }
)
'
# SELECT * FROM table WHERE 0=1I don't know if this is an issue with SQL::Abstract::More, SQL::Abstract, or something else, though.