Handle undef -> NULL for more operators
[dbsrgits/SQL-Abstract.git] / lib / SQL / Abstract / Converter.pm
index ec12707..0d7e064 100644 (file)
@@ -506,6 +506,18 @@ sub _where_hashpair_to_dq {
           $op, $self->_ident_to_dq($k), $self->_literal_to_dq($$rhs)
         );
       }
+      if (grep !defined, @$rhs) {
+        my ($inop, $logic, $nullop) = $op =~ /^NOT/
+          ? (-not_in => AND => { '!=' => undef })
+          : (-in => OR => undef);
+        if (my @defined = grep defined, @$rhs) {
+          return $self->_expr_to_dq_ARRAYREF([
+            { $k => { $inop => \@defined } },
+            { $k => $nullop },
+          ], $logic);
+        }
+        return $self->_expr_to_dq_HASHREF({ $k => $nullop });
+      }
       return $self->_literal_to_dq(
         $op =~ /^NOT/ ? $self->{sqltrue} : $self->{sqlfalse}
       ) unless @$rhs;
@@ -524,9 +536,9 @@ sub _where_hashpair_to_dq {
       );
     } elsif (!defined($rhs)) {
       my $null_op = do {
-        if ($op eq '=' or $op eq 'LIKE') {
+        if ($op eq '=' or $op eq 'LIKE' or $op eq 'IS') {
           'IS NULL'
-        } elsif ($op eq '!=') {
+        } elsif ($op eq '!=' or $op eq 'NOT LIKE' or $op eq 'IS NOT') {
           'IS NOT NULL'
         } else {
           die "Can't do undef -> NULL transform for operator ${op}";