Fix NOT IN empty list optimisation
Dagfinn Ilmari Mannsåker [Tue, 3 Dec 2013 17:17:29 +0000 (17:17 +0000)]
lib/SQL/Abstract/Converter.pm
t/01generate.t

index d3cce0a..5dad2b7 100644 (file)
@@ -505,7 +505,9 @@ sub _where_hashpair_to_dq {
           $op, $self->_ident_to_dq($k), $self->_literal_to_dq($$rhs)
         );
       }
-      return $self->_literal_to_dq($self->{sqlfalse}) unless @$rhs;
+      return $self->_literal_to_dq(
+        $op =~ /^NOT/ ? $self->{sqltrue} : $self->{sqlfalse}
+      ) unless @$rhs;
       return $self->_op_to_dq(
         $op, $self->_ident_to_dq($k), map $self->_expr_to_dq($_), @$rhs
       )
index 62047c6..df83661 100644 (file)
@@ -545,6 +545,13 @@ my @tests = (
               stmt_q => 'SELECT * FROM `test` WHERE ( `Y` = ( MAX( LENGTH( MIN ? ) ) ) )',
               bind   => [[Y => 'x']],
       },
+      {
+              func => 'select',
+              args => ['test', '*', { a => { -in => [] }, b => { -not_in => [] } }],
+              stmt => 'SELECT * FROM test WHERE ( 0=1 AND 1=1 )',
+              stmt_q => 'SELECT * FROM `test` WHERE ( 0=1 AND 1=1 )',
+              bind => [],
+      },
 );
 
 for my $t (@tests) {