diff --git a/lib/SQL/Abstract.pm b/lib/SQL/Abstract.pm index 81503966..b17b8804 100644 --- a/lib/SQL/Abstract.pm +++ b/lib/SQL/Abstract.pm @@ -1596,6 +1596,8 @@ sub _render_op_between { unless $low->{-literal}; $low; } else { + puke "Arguments to between must be defined" + unless defined $low && defined $high; +($low, { -keyword => 'and' }, $high); } }; @@ -1609,13 +1611,17 @@ sub _render_op_in { my ($lhs, @rhs) = @$args; return $self->join_query_parts(' ', - $lhs, - { -keyword => $op }, - $self->join_query_parts(' ', - '(', - $self->join_query_parts(', ', @rhs), - ')' - ), + @rhs + ? ( + $lhs, + { -keyword => $op }, + $self->join_query_parts(' ', + '(', + $self->join_query_parts(', ', @rhs), + ')' + ) + ) + : $self->${\($op =~ /^not/ ? 'sqltrue' : 'sqlfalse')} ); } diff --git a/t/05in_between.t b/t/05in_between.t index f32c57aa..f56f682a 100644 --- a/t/05in_between.t +++ b/t/05in_between.t @@ -419,4 +419,57 @@ for my $case (@in_between_tests) { } } +package SubClass { + use parent 'SQL::Abstract'; + use mro 'c3'; +} + +package SubClass::OverrideIn { + our @ISA = 'SubClass'; + sub _where_field_IN { shift->next::method(@_) } +} + +package SubClass::OverrideBetween { + our @ISA = 'SubClass'; + sub _where_field_BETWEEN { shift->next::method(@_) } +} + +for ( + { + class => 'SubClass::OverrideIn', + where => { foo => { -in => [] } }, + stmt => 'WHERE 0=1', + label => 'Subclass overriding _where_field_IN with empty array ref for -in', + }, + { + class => 'SubClass::OverrideIn', + where => { foo => { -not_in => [] } }, + stmt => 'WHERE 1=1', + label => 'Subclass overriding _where_field_IN with empty array ref for -not_in', + }, + { + class => 'SubClass::OverrideBetween', + where => { foo => { -between => [] } }, + throws => qr/Fatal: Arguments to between must be defined/, + label => 'Subclass overriding _where_field_BETWEEN with empty array ref for -between', + }, + { + class => 'SubClass::OverrideBetween', + where => { foo => { -not_between => [] } }, + throws => qr/Fatal: Arguments to between must be defined/, + label => 'Subclass overriding _where_field_BETWEEN with empty array ref for -not_between', + }, +) { + if (my $e = $_->{throws}) { + my $stmt; + throws_ok { ($stmt) = $_->{class}->new->select(table => ['*'], $_->{where}) } $e, + $_->{label} . ' throws correctly' + or diag dumper ({ where => $_->{where}, result => $stmt }); + } else { + $_->{stmt} = 'SELECT * FROM table ' . $_->{stmt}; + is +SubClass->new->select( table => ['*'], $_->{where}), $_->{stmt}, $_->{label} . ': parent'; + is +$_->{class}->new->select( table => ['*'], $_->{where}), $_->{stmt}, $_->{label}; + } +} + done_testing;