X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F05in_between.t;h=ae66b90b97c7c49ccd9f18c5959ca5b1f76894b0;hb=03e6883c5f3918df6a5b6cb7fad8e1e5131e3876;hp=11119984faa88d2cb607122f1be6828fa396f3f5;hpb=db8e4588960f73fc9da7994bc3021821b3b17334;p=scpubgit%2FQ-Branch.git diff --git a/t/05in_between.t b/t/05in_between.t index 1111998..ae66b90 100644 --- a/t/05in_between.t +++ b/t/05in_between.t @@ -93,6 +93,26 @@ my @in_between_tests = ( ] }, }, 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 => [1, 2, 1, 2, 'stuff'], + test => '-between POD test', + }, + { + args => { restore_old_unop_handling => 1 }, + where => { + start0 => { -between => [ 1, { -upper => 2 } ] }, + start1 => { -between => \["? AND ?", 1, 2] }, + start2 => { -between => \"lower(x) AND upper(y)" }, + start3 => { -between => [ + \"lower(x)", + \["upper(?)", 'stuff' ], + ] }, + }, + stmt => "WHERE ( ( start0 BETWEEN ? AND UPPER ? ) AND ( start1 BETWEEN ? AND ? ) AND ( start2 BETWEEN lower(x) AND upper(y) ) @@ -113,6 +133,32 @@ my @in_between_tests = ( ] }, }, 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', + }, + { + args => { restore_old_unop_handling => 1, 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) ) @@ -174,6 +220,17 @@ my @in_between_tests = ( bind => [], test => '-in multi-line subquery test', }, + + # check that the outer paren opener is not too agressive + # note: this syntax *is not legal* on SQLite (maybe others) + # see end of https://rt.cpan.org/Ticket/Display.html?id=99503 + { + where => { foo => { -in => \ '(SELECT 1) UNION (SELECT 2)' } }, + stmt => 'WHERE foo IN ( (SELECT 1) UNION (SELECT 2) )', + bind => [], + test => '-in paren-opening works on balanced pairs only', + }, + { where => { customer => { -in => \[ @@ -193,6 +250,13 @@ my @in_between_tests = ( { 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', + }, + { + args => { restore_old_unop_handling => 1 }, + 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', @@ -266,6 +330,61 @@ my @in_between_tests = ( throws => qr/Argument passed to the 'IN' operator can not be undefined/, test => '-in with undef argument', }, + + { + where => { -in => [ 'bob', 4, 2 ] }, + stmt => ' WHERE (bob IN (?, ?))', + bind => [ 4, 2 ], + test => 'Top level -in', + }, +# This works but then SQL::Abstract::Tree breaks - something for a later commit +# { +# where => { -in => [ { -list => [ qw(x y) ] }, { -list => [ 1, 3 ] }, { -list => [ 2, 4 ] } ] }, +# stmt => ' WHERE ((x, y) IN ((?, ?), (?, ?))', +# bind => [ 1, 3, 2, 4 ], +# test => 'Top level -in with list args', +# }, + { + where => { -between => [42, 69] }, + throws => qr/Fatal: Operator 'BETWEEN' requires/, + test => 'Top level -between with broken args', + }, + { + where => { + -between => [ + { -op => [ '+', { -ident => 'foo' }, 2 ] }, + 3, 4 + ], + }, + stmt => ' WHERE (foo + ? BETWEEN ? AND ?)', + bind => [ 2, 3, 4 ], + test => 'Top level -between with useful LHS', + }, + { + where => { + -in => [ + { -row => [ 'x', 'y' ] }, + { -row => [ 1, 2 ] }, + { -row => [ 3, 4 ] }, + ], + }, + stmt => ' WHERE (x, y) IN ((?, ?), (?, ?))', + bind => [ 1..4 ], + test => 'Complex top-level -in', + }, + { + where => { -is => [ 'bob', undef ] }, + stmt => ' WHERE bob IS NULL', + bind => [], + test => 'Top level -is ok', + }, + { + where => { -op => [ in => x => 1, 2, 3 ] }, + stmt => ' WHERE x IN (?, ?, ?)', + bind => [ 1, 2, 3 ], + test => 'Raw -op passes through correctly' + }, + ); for my $case (@in_between_tests) { @@ -274,7 +393,7 @@ for my $case (@in_between_tests) { local $SQL::Abstract::Test::parenthesis_significant = $case->{parenthesis_significant}; my $label = $case->{test} || 'in-between test'; - my $sql = SQL::Abstract->new ($case->{args} || {}); + my $sql = SQL::Abstract->new($case->{args} || {}); if (my $e = $case->{throws}) { my $stmt; @@ -283,17 +402,19 @@ for my $case (@in_between_tests) { } else { my ($stmt, @bind); - warnings_are { - ($stmt, @bind) = $sql->where($case->{where}); - } [], "$label gives no warnings"; - - is_same_sql_bind( - $stmt, - \@bind, - $case->{stmt}, - $case->{bind}, - "$label generates correct SQL and bind", - ) || diag_where ( $case->{where} ); + lives_ok { + warnings_are { + ($stmt, @bind) = $sql->where($case->{where}); + } [], "$label gives no warnings"; + + is_same_sql_bind( + $stmt, + \@bind, + $case->{stmt}, + $case->{bind}, + "$label generates correct SQL and bind", + ) || diag dumper ({ where => $case->{where}, exp => $sql->_expand_expr($case->{where}) }); + } || diag dumper ({ where => $case->{where}, exp => $sql->_expand_expr($case->{where}) }); } } }