-
Notifications
You must be signed in to change notification settings - Fork 10
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Illegal SQL generated with empty arrayref on IN clause #20
Comments
|
Hi, |
|
Any updates on this by any chance? Or should I maybe raise this up as an issue with SQL::Abstract? |
|
Hi, thanks for the heads up.
Indeed -where_field_IN is mentioned in the doc, so it makes sense to raise up the issue with SQL::Abstract instead of trying to fix it in SQLAM .. so please go ahead with your suggestion |
|
Thanks. I've raised it as an issue with SQL::Abstract: https://rt.cpan.org/Ticket/Display.html?id=142342 Let's see what happens 🍿 |
Subclasses that override `_where_field_IN` and `_where_field_BETWEEN`
and conditionally re-dispatch to the default handlers in SQL::Abstract
were not correctly handling empty array references passed as arguments
to `-in`, `-between`, and their negated counterparts.
This behaviour was broken in the refactor that lead to 2.000000, and
more specifically in 1.90_03, going from
$ perl -Ilib -MSQL::Abstract -E '
say "version " . $SQL::Abstract::VERSION;
package X {
use parent "SQL::Abstract";
use mro "c3";
sub _where_field_IN { shift->next::method(@_) }
}
say X->new->select( table => ["*"], { foo => { -in => [] } } )
'
version 1.9002
SELECT * FROM table WHERE 0=1
to
$ perl -Ilib -MSQL::Abstract -E '
say "version " . $SQL::Abstract::VERSION;
package X {
use parent "SQL::Abstract";
use mro "c3";
sub _where_field_IN { shift->next::method(@_) }
}
say X->new->select( table => ["*"], { foo => { -in => [] } } )
'
version 1.9003
SELECT * FROM table WHERE foo IN ( )
and resulting in illegal SQL.
This was breaking behaviour that resulted in downstream issues affecting
at least SQL::Abstract::More
(see damil/SQL-Abstract-More#20).
Likewise, a class overriding `_where_field_BETWEEN` was not triggering
the parameter validation that disallowed empty array references or
undefined values to be used as parameters to `-between` and its
negation:
$ perl -Ilib -MSQL::Abstract -E '
say "version " . $SQL::Abstract::VERSION;
package X {
use parent "SQL::Abstract";
use mro "c3";
sub _where_field_BETWEEN { shift->next::method(@_) }
}
say X->new->select( table => ["*"], { foo => { -between => [] } } )
'
version 1.9003
SELECT * FROM table WHERE ( foo BETWEEN AND )
This change ensures that the path taken by subclasses that override
those methods triggers equivalent code paths to those that don't.
Fixes https://rt.cpan.org/Ticket/Display.html?id=142341
Subclasses that override `_where_field_IN` and `_where_field_BETWEEN`
and conditionally re-dispatch to the default handlers in SQL::Abstract
were not correctly handling empty array references passed as arguments
to `-in`, `-between`, and their negated counterparts.
This behaviour was broken in the refactor that lead to 2.000000, and
more specifically in 1.90_03, going from
$ perl -Ilib -MSQL::Abstract -E '
say "version " . $SQL::Abstract::VERSION;
package X {
use parent "SQL::Abstract";
use mro "c3";
sub _where_field_IN { shift->next::method(@_) }
}
say X->new->select( table => ["*"], { foo => { -in => [] } } )
'
version 1.9002
SELECT * FROM table WHERE 0=1
to
$ perl -Ilib -MSQL::Abstract -E '
say "version " . $SQL::Abstract::VERSION;
package X {
use parent "SQL::Abstract";
use mro "c3";
sub _where_field_IN { shift->next::method(@_) }
}
say X->new->select( table => ["*"], { foo => { -in => [] } } )
'
version 1.9003
SELECT * FROM table WHERE foo IN ( )
and resulting in illegal SQL.
This was breaking behaviour that resulted in downstream issues affecting
at least SQL::Abstract::More
(see damil/SQL-Abstract-More#20).
Likewise, a class overriding `_where_field_BETWEEN` was not triggering
the parameter validation that disallowed empty array references or
undefined values to be used as parameters to `-between` and its
negation:
$ perl -Ilib -MSQL::Abstract -E '
say "version " . $SQL::Abstract::VERSION;
package X {
use parent "SQL::Abstract";
use mro "c3";
sub _where_field_BETWEEN { shift->next::method(@_) }
}
say X->new->select( table => ["*"], { foo => { -between => [] } } )
'
version 1.9003
SELECT * FROM table WHERE ( foo BETWEEN AND )
This change ensures that the path taken by subclasses that override
those methods triggers equivalent code paths to those that don't.
Fixes https://rt.cpan.org/Ticket/Display.html?id=142341
The following code:
generates the following SQL
which is illegal.
The equivalent code with SQL::Abstract:
generates
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_INoverride in SQL::Abstract::More. When SQL::Abstract runs on its own (or finds no override) it uses its own handler generated bymake_binop_expander, and that generates the correct output. The override from SQL::Abstract::More finishes withbut that passes the buck to the
_where_field_INmethod in SQL::Abstract, which does not do the right thing:Further demonstration of this is that deleting the override in SQL::Abstract::More makes this go back to the old behaviour:
I don't know if this is an issue with SQL::Abstract::More, SQL::Abstract, or something else, though.
The text was updated successfully, but these errors were encountered: