Make tests pass with more explicit bracketing (but still way less than old SQLA did)
Ash Berlin [Sat, 4 Apr 2009 16:36:47 +0000 (17:36 +0100)]
lib/SQL/Abstract/AST/v1.pm
t/100_expr_basic.t
t/101_expr_funcitons.t

index 53db579..0543330 100644 (file)
@@ -205,7 +205,9 @@ class SQL::Abstract::AST::v1 extends SQL::Abstract {
       if ($_->{-type} eq 'expr' && $_->{op} =~ /^(and|or)$/) {
         my $sub_prio = $SQL::Abstract::PRIO{$1}; 
 
-        if ($sub_prio <= $prio) {
+        if ($sub_prio == $prio) {
+          # When the element below has same priority, i.e. 'or' as a child of
+          # 'or', dont produce extra brackets
           push @output, $self->_recurse_where($_);
         } else {
           push @output, '(' . $self->_recurse_where($_) . ')';
@@ -279,10 +281,13 @@ class SQL::Abstract::AST::v1 extends SQL::Abstract {
     croak "between requires 3 arguments: " . dump($ast)
       unless @values == 2;
 
-    return $self->_expr($field) .
+    # The brackets are to work round an issue with SQL::A::Test
+    return "(" .
+           $self->_expr($field) .
            $not . 
            " BETWEEN " .
-           join(" AND ", map { $self->dispatch($_) } @values );
+           join(" AND ", map { $self->dispatch($_) } @values ) .
+           ")";
   }
 
   # 'constants' that are portable across DBs
index de43e64..0bcdaa4 100644 (file)
@@ -90,7 +90,7 @@ is $sqla->dispatch(
       { -type => 'expr', op => 'and', args => $cols }
     ]
   }
-), "me.name = ? OR me.id > ? AND me.name = ?", 
+), "me.name = ? OR (me.id > ? AND me.name = ?)", 
    "expr clause (inner and)";
 
 is $sqla->dispatch(
index 13ec805..148f3cd 100644 (file)
@@ -46,6 +46,6 @@ is $sqla->dispatch(
       { -type => 'value', value => 599 },
     ],
   }
-), "me.id BETWEEN ? AND ?",
+), "(me.id BETWEEN ? AND ?)",
    "between";