[Bast-commits] r7555 - in SQL-Abstract/1.x/trunk: lib/SQL/Abstract t

ribasushi at dev.catalyst.perl.org ribasushi at dev.catalyst.perl.org
Fri Sep 4 15:14:01 GMT 2009


Author: ribasushi
Date: 2009-09-04 15:13:57 +0000 (Fri, 04 Sep 2009)
New Revision: 7555

Modified:
   SQL-Abstract/1.x/trunk/lib/SQL/Abstract/Test.pm
   SQL-Abstract/1.x/trunk/t/10test.t
Log:
Fix Tester to deal properly with NOT and single parenthesized expressions

Modified: SQL-Abstract/1.x/trunk/lib/SQL/Abstract/Test.pm
===================================================================
--- SQL-Abstract/1.x/trunk/lib/SQL/Abstract/Test.pm	2009-09-04 14:36:20 UTC (rev 7554)
+++ SQL-Abstract/1.x/trunk/lib/SQL/Abstract/Test.pm	2009-09-04 15:13:57 UTC (rev 7555)
@@ -53,6 +53,7 @@
 
 # These are binary operator keywords always a single LHS and RHS
 # * AND/OR are handled separately as they are N-ary
+# * so is NOT as being unary
 # * BETWEEN without paranthesis around the ANDed arguments (which
 #   makes it a non-binary op) is detected and accomodated in 
 #   _recurse_parse()
@@ -63,7 +64,7 @@
 );
 
 my $tokenizer_re_str = join("\n\t|\n",
-  ( map { '\b' . $_ . '\b' } @expression_terminator_sql_keywords, 'AND', 'OR' ),
+  ( map { '\b' . $_ . '\b' } @expression_terminator_sql_keywords, 'AND', 'OR', 'NOT'),
   ( map { q! (?<= [\w\s\`\'\)] ) ! . $_ . q! (?= [\w\s\`\'\(] ) ! } @binary_op_keywords ),
 );
 
@@ -261,7 +262,7 @@
           or
         ($state == PARSE_IN_EXPR && grep { $lookahead =~ /^ $_ $/xi } ('\)', @expression_terminator_sql_keywords ) )
           or
-        ($state == PARSE_RHS && grep { $lookahead =~ /^ $_ $/xi } ('\)', @expression_terminator_sql_keywords, @binary_op_keywords, 'AND', 'OR' ) )
+        ($state == PARSE_RHS && grep { $lookahead =~ /^ $_ $/xi } ('\)', @expression_terminator_sql_keywords, @binary_op_keywords, 'AND', 'OR', 'NOT' ) )
     ) {
       return $left;
     }
@@ -310,6 +311,14 @@
       $left = $left ? [@$left,  [$op => [$right] ]]
                     : [[ $op => [$right] ]];
     }
+    # NOT (last as to allow all other NOT X pieces first)
+    elsif ( $token =~ /^ not $/ix ) {
+      my $op = uc $token;
+      my $right = _recurse_parse ($tokens, PARSE_RHS);
+      $left = $left ? [ @$left, [$op => [$right] ]]
+                    : [[ $op => [$right] ]];
+
+    }
     # leaf expression
     else {
       $left = $left ? [@$left, [EXPR => [$token] ] ]
@@ -357,6 +366,14 @@
         $changes++;
       }
 
+      # only one EXPR element in the parenthesis
+      elsif (
+        @{$child->[1]} == 1 && $child->[1][0][0] eq 'EXPR'
+      ) {
+        push @children, $child->[1][0];
+        $changes++;
+      }
+
       # only one element in the parenthesis which is a binary op with two EXPR sub-children
       elsif (
         @{$child->[1]} == 1

Modified: SQL-Abstract/1.x/trunk/t/10test.t
===================================================================
--- SQL-Abstract/1.x/trunk/t/10test.t	2009-09-04 14:36:20 UTC (rev 7554)
+++ SQL-Abstract/1.x/trunk/t/10test.t	2009-09-04 15:13:57 UTC (rev 7555)
@@ -136,7 +136,23 @@
         ]
       },
       {
+        equal => 1,
+        statements => [
+          q/SELECT foo FROM bar WHERE (a) AND (b = 2)/,
+          q/SELECT foo FROM bar WHERE (a AND b = 2)/,
+          q/SELECT foo FROM bar WHERE (a AND (b = 2))/,
+          q/SELECT foo FROM bar WHERE a AND (b = 2)/,
+        ]
+      },
+      {
         equal => 0,
+        statements => [
+          q/SELECT foo FROM bar WHERE NOT a AND (b = 2)/,
+          q/SELECT foo FROM bar WHERE (NOT a) AND (b = 2)/,
+        ]
+      },
+      {
+        equal => 0,
         parenthesis_significant => 1,
         statements => [
           q/SELECT foo FROM bar WHERE a = 1 AND b = 1 AND c = 1/,




More information about the Bast-commits mailing list