make -is work at top level
Matt S Trout [Mon, 1 Apr 2019 01:52:15 +0000 (01:52 +0000)]
lib/SQL/Abstract.pm
t/05in_between.t

index 0f524ff..6973f21 100644 (file)
@@ -215,6 +215,7 @@ sub new {
       my ($op, @opargs) = @$args;
       +{ $node => [ $op, map $self->expand_expr($_), @opargs ] };
     },
+    (map +($_ => '_expand_op_is'), ('-is', '-is_not')),
   };
 
   $opt{expand_op} = {
@@ -977,6 +978,8 @@ sub _expand_op_andor {
 
 sub _expand_op_is {
   my ($self, $op, $vv, $k) = @_;
+  $op =~ s/^-//;
+  ($k, $vv) = @$vv unless defined $k;
   puke "$op can only take undef as argument"
     if defined($vv)
        and not (
@@ -984,7 +987,7 @@ sub _expand_op_is {
          and exists($vv->{-value})
          and !defined($vv->{-value})
        );
-  return +{ -op => [ $op.'_null', $self->_expand_ident(-ident => $k) ] };
+  return +{ -op => [ $op.'_null', $self->expand_expr($k, -ident) ] };
 }
 
 sub _expand_between {
index bb98f11..a3e7656 100644 (file)
@@ -317,7 +317,13 @@ my @in_between_tests = (
     },
     stmt => ' WHERE (x, y) IN ((?, ?), (?, ?))',
     bind => [ 1..4 ],
-    test => 'Complex IN',
+    test => 'Complex top-level -in',
+  },
+  {
+    where => { -is => [ 'bob', undef ] },
+    stmt => ' WHERE bob IS NULL',
+    bind => [],
+    test => 'Top level -is ok',
   },
 );