X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F05in_between.t;h=2ae0172ae3cf61aac6e9e24ddf9c7f2fc29016eb;hb=428975b0e646c0769d7eb530d4f52443471a9a9a;hp=ff6b738dca4b32777d9d312af9055f13b5be44b9;hpb=171a709f3628dad4f66300a49a1340ac41498730;p=dbsrgits%2FSQL-Abstract.git diff --git a/t/05in_between.t b/t/05in_between.t index ff6b738..2ae0172 100644 --- a/t/05in_between.t +++ b/t/05in_between.t @@ -64,9 +64,29 @@ my @in_between_tests = ( bind => [], test => '-between with literal sql with a literal (\"\'this\' AND \'that\'")', }, + + # generate a set of invalid -between tests + ( map { { + where => { x => { -between => $_ } }, + test => 'invalid -between args', + exception => qr|Operator 'BETWEEN' requires either an arrayref with two defined values or expressions, or a single literal scalarref/arrayref-ref|, + } } ( + [ 1, 2, 3 ], + [ 1, undef, 3 ], + [ undef, 2, 3 ], + [ 1, 2, undef ], + [ 1, undef ], + [ undef, 2 ], + [ undef, undef ], + [ 1 ], + [ undef ], + [], + 1, + undef, + )), { where => { - start0 => { -between => [ 1, 2 ] }, + start0 => { -between => [ 1, { -upper => 2 } ] }, start1 => { -between => \["? AND ?", 1, 2] }, start2 => { -between => \"lower(x) AND upper(y)" }, start3 => { -between => [ @@ -75,7 +95,7 @@ my @in_between_tests = ( ] }, }, stmt => "WHERE ( - ( start0 BETWEEN ? AND ? ) + ( start0 BETWEEN ? AND UPPER ? ) AND ( start1 BETWEEN ? AND ? ) AND ( start2 BETWEEN lower(x) AND upper(y) ) AND ( start3 BETWEEN lower(x) AND upper(?) ) @@ -83,6 +103,32 @@ my @in_between_tests = ( bind => [1, 2, 1, 2, 'stuff'], test => '-between POD test', }, + { + args => { bindtype => 'columns' }, + where => { + start0 => { -between => [ 1, { -upper => 2 } ] }, + start1 => { -between => \["? AND ?", [ start1 => 1], [start1 => 2] ] }, + start2 => { -between => \"lower(x) AND upper(y)" }, + start3 => { -between => [ + \"lower(x)", + \["upper(?)", [ start3 => 'stuff'] ], + ] }, + }, + stmt => "WHERE ( + ( start0 BETWEEN ? AND UPPER ? ) + AND ( start1 BETWEEN ? AND ? ) + AND ( start2 BETWEEN lower(x) AND upper(y) ) + AND ( start3 BETWEEN lower(x) AND upper(?) ) + )", + bind => [ + [ start0 => 1 ], + [ start0 => 2 ], + [ start1 => 1 ], + [ start1 => 2 ], + [ start3 => 'stuff' ], + ], + test => '-between POD test', + }, { parenthesis_significant => 1, @@ -140,10 +186,40 @@ my @in_between_tests = ( bind => [2000], test => '-in POD test', }, + { + where => { x => { -in => [ \['LOWER(?)', 'A' ], \'LOWER(b)', { -lower => 'c' } ] } }, + stmt => " WHERE ( x IN ( LOWER(?), LOWER(b), LOWER ? ) )", + bind => [qw/A c/], + test => '-in with an array of function array refs with args', + }, + { + exception => qr/ + \QSQL::Abstract before v1.75 used to generate incorrect SQL \E + \Qwhen the -IN operator was given an undef-containing list: \E + \Q!!!AUDIT YOUR CODE AND DATA!!! (the upcoming Data::Query-based \E + \Qversion of SQL::Abstract will emit the logically correct SQL \E + \Qinstead of raising this exception)\E + /x, + where => { x => { -in => [ 1, undef ] } }, + stmt => " WHERE ( x IN ( ? ) OR x IS NULL )", + bind => [ 1 ], + test => '-in with undef as an element', + }, + { + exception => qr/ + \QSQL::Abstract before v1.75 used to generate incorrect SQL \E + \Qwhen the -IN operator was given an undef-containing list: \E + \Q!!!AUDIT YOUR CODE AND DATA!!! (the upcoming Data::Query-based \E + \Qversion of SQL::Abstract will emit the logically correct SQL \E + \Qinstead of raising this exception)\E + /x, + where => { x => { -in => [ 1, undef, 2, 3, undef ] } }, + stmt => " WHERE ( x IN ( ?, ?, ? ) OR x IS NULL )", + bind => [ 1, 2, 3 ], + test => '-in with multiple undef elements', + }, ); -plan tests => @in_between_tests*4; - for my $case (@in_between_tests) { TODO: { local $TODO = $case->{todo} if $case->{todo}; @@ -151,23 +227,28 @@ for my $case (@in_between_tests) { local $Data::Dumper::Terse = 1; - lives_ok (sub { + my @w; + local $SIG{__WARN__} = sub { push @w, @_ }; + my $sql = SQL::Abstract->new ($case->{args} || {}); - my @w; - local $SIG{__WARN__} = sub { push @w, @_ }; - my $sql = SQL::Abstract->new ($case->{args} || {}); - lives_ok (sub { + if ($case->{exception}) { + throws_ok { $sql->where($case->{where}) } $case->{exception}; + } + else { + lives_ok { my ($stmt, @bind) = $sql->where($case->{where}); is_same_sql_bind( $stmt, \@bind, $case->{stmt}, $case->{bind}, - ) - || diag "Search term:\n" . Dumper $case->{where}; - }); - is (@w, 0, $case->{test} || 'No warnings within in-between tests') - || diag join "\n", 'Emitted warnings:', @w; - }, "$case->{test} doesn't die"); + ) || diag "Search term:\n" . Dumper $case->{where}; + } "$case->{test} doesn't die"; + } + + is (@w, 0, $case->{test} || 'No warnings within in-between tests') + || diag join "\n", 'Emitted warnings:', @w; } } + +done_testing;