Backport undef-with-in tests from DQ, add "roadwork ahead" exceptions
[dbsrgits/SQL-Abstract.git] / t / 05in_between.t
index a40416c..3ca3c67 100644 (file)
@@ -75,7 +75,7 @@ my @in_between_tests = (
       ] },
     },
     stmt => "WHERE (
-          ( start0 BETWEEN ? AND upper ?          )
+          ( 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 +83,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,
@@ -146,10 +172,34 @@ my @in_between_tests = (
     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};
@@ -157,23 +207,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;