Fix incorrect comparison of malformed lists
Peter Rabbitson [Fri, 7 Jan 2011 09:18:32 +0000 (10:18 +0100)]
AND OR and , must have both a lhs and a rhs, if neither is
present add a [], which will properly trip the comparison
later on.

Changes
lib/SQL/Abstract/Tree.pm
t/10test.t

diff --git a/Changes b/Changes
index 13b7b1b..890c648 100644 (file)
--- a/Changes
+++ b/Changes
@@ -2,6 +2,7 @@ Revision history for SQL::Abstract
 
     - Fix parsing of NOT EXISTS
     - Fix deep recursion warnings while parsing obnoxiously long sql statements
+    - Fix incorrect comparison of malformed lists
 
 revision 1.72  2010-12-21
 ----------------------------
index 8d7a36a..1da83de 100644 (file)
@@ -348,14 +348,14 @@ sub _recurse_parse {
     elsif ($token =~ /^ (?: OR | AND | \, ) $/xi )  {
       my $op = ($token eq ',') ? 'LIST' : uc $token;
 
-      my $right = $self->_recurse_parse($tokens, PARSE_IN_EXPR);
+      my $right = $self->_recurse_parse($tokens, PARSE_IN_EXPR) || [];
 
       # Merge chunks if logic matches
-      if (ref $right and $op eq $right->[0]) {
-        $left = [ (shift @$right ), [$left||(), map { @$_ } @$right] ];
+      if (ref $right and @$right and $op eq $right->[0]) {
+        $left = [ (shift @$right ), [$left||[], map { @$_ } @$right] ];
       }
       else {
-        $left = [$op => [ $left||(), $right||() ]];
+        $left = [$op => [ $left||[], $right ]];
       }
     }
     # binary operator keywords
index 4d14014..b5d4829 100644 (file)
@@ -615,6 +615,20 @@ my @sql_tests = (
           'SELECT * FROM foo WHERE a IN (3,2,1)',
         ]
       },
+
+      # list consistency
+      {
+        equal => 0,
+        statements => [
+          'SELECT a,b FROM foo',
+          'SELECT a,,b FROM foo',
+          'SELECT a,b, FROM foo',
+          'SELECT ,a,b, FROM foo',
+          'SELECT ,a,,b, FROM foo',
+        ],
+      },
+
+      # misc func
       {
         equal => 0,
         statements => [
@@ -625,7 +639,6 @@ my @sql_tests = (
           'SELECT count(1) FROM foo',
         ]
       },
-      # misc func
       {
         equal => 1,
         statements => [