Fix incorrect comparison of malformed lists
[scpubgit/Q-Branch.git] / t / 10test.t
index 8854026..b5d4829 100644 (file)
@@ -6,17 +6,9 @@ use List::Util qw(sum);
 
 use Test::More;
 
-# equivalent to $Module::Install::AUTHOR
-my $author = (
-  ( not -d './inc' )
-    or
-  ( -e ($^O eq 'VMS' ? './inc/_author' : './inc/.author') )
-);
-
-if (not $author and not $ENV{SQLATEST_TESTER} and not $ENV{AUTOMATED_TESTING}) {
-  plan skip_all => 'Skipping resource intensive self-tests, use SQLATEST_TESTER=1 to run';
-}
-
+use Data::Dumper;
+$Data::Dumper::Terse = 1;
+$Data::Dumper::Sortkeys = 1;
 
 my @sql_tests = (
       # WHERE condition - equal
@@ -268,6 +260,15 @@ my @sql_tests = (
       },
       {
         equal => 0,
+        parenthesis_significant => 1,
+        statements => [
+          q/SELECT foo FROM bar WHERE a IN (1,2,3)/,
+          q/SELECT foo FROM bar WHERE a IN (1,3,2)/,
+          q/SELECT foo FROM bar WHERE a IN ((1,2,3))/,
+        ]
+      },
+      {
+        equal => 0,
         statements => [
           # BETWEEN with/without parenthesis around itself/RHS is a sticky business
           # if I made a mistake here, simply rewrite the special BETWEEN handling in
@@ -281,6 +282,17 @@ my @sql_tests = (
         ]
       },
 
+      # IS NULL (special LHS-only op)
+      {
+        equal => 1,
+        statements => [
+          q/WHERE a IS NOT NULL AND b IS NULL/,
+          q/WHERE (a IS NOT NULL) AND b IS NULL/,
+          q/WHERE a IS NOT NULL AND (b IS NULL)/,
+          q/WHERE (a IS NOT NULL) AND ((b IS NULL))/,
+        ],
+      },
+
       # JOIN condition - equal
       {
         equal => 1,
@@ -533,6 +545,13 @@ my @sql_tests = (
       {
         equal => 0,
         statements => [
+          q/DELETE FROM cd WHERE ( cdid IN ( SELECT me.cdid FROM (SELECT * FROM cd me WHERE ( year != ? ) GROUP BY me.cdid) me WHERE ( year != ? ) ) )/,
+          q/DELETE FROM cd WHERE ( cdid IN ( SELECT me.cdid FROM cd me WHERE ( year != ? ) GROUP BY me.cdid ) )/,
+        ],
+      },
+      {
+        equal => 0,
+        statements => [
           q/SELECT * FROM (SELECT * FROM bar WHERE b = 1) AS foo WHERE a = 1/,
           q/SELECT * FROM (SELECT * FROM bar WHERE b = 1) AS foo WHERE a = 2/,
           q/SELECT * FROM (SELECT * FROM bar WHERE b = 1) AS foo WHERE (a = 3)/,
@@ -572,35 +591,118 @@ my @sql_tests = (
           q/SELECT * FROM (SELECT * FROM bar WHERE ((b = 1) AND (c = 10))) AS foo WHERE (a = 2)/,
         ]
       },
+
+      # list permutations
+      {
+        equal => 0,
+        statements => [
+          'SELECT a,b,c FROM foo',
+          'SELECT a,c,b FROM foo',
+          'SELECT b,a,c FROM foo',
+          'SELECT b,c,a FROM foo',
+          'SELECT c,a,b FROM foo',
+          'SELECT c,b,a FROM foo',
+        ],
+      },
+      {
+        equal => 0,
+        statements => [
+          'SELECT * FROM foo WHERE a IN (1,2,3)',
+          'SELECT * FROM foo WHERE a IN (1,3,2)',
+          'SELECT * FROM foo WHERE a IN (2,1,3)',
+          'SELECT * FROM foo WHERE a IN (2,3,1)',
+          'SELECT * FROM foo WHERE a IN (3,1,2)',
+          '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 => [
+          'SELECT count(*) FROM foo',
+          'SELECT count(*) AS bar FROM foo',
+          'SELECT count(*) AS "bar" FROM foo',
+          'SELECT count(a) FROM foo',
+          'SELECT count(1) FROM foo',
+        ]
+      },
+      {
+        equal => 1,
+        statements => [
+          'SELECT foo() bar FROM baz',
+          'SELECT foo (  )bar FROM baz',
+          'SELECT foo (())bar FROM baz',
+          'SELECT foo(( ) ) bar FROM baz',
+        ]
+      },
       {
-        equal => 0,
-        statements => [
-           'SELECT a,b,c FROM foo',
-           'SELECT a,c,b FROM foo',
-           'SELECT b,a,c FROM foo',
-           'SELECT b,c,a FROM foo',
-           'SELECT c,a,b FROM foo',
-           'SELECT c,b,a FROM foo',
-        ]
+        equal => 0,
+        statements => [
+          'SELECT foo() FROM bar',
+          'SELECT foo FROM bar',
+          'SELECT foo FROM bar ()',
+        ]
       },
       {
-        equal => 0,
-        statements => [
-           'SELECT count(*) FROM foo',
-           'SELECT count(a) FROM foo',
-           'SELECT count(1) FROM foo',
-        ]
+        equal => 0,
+        statements => [
+          'SELECT COUNT * FROM foo',
+          'SELECT COUNT( * ) FROM foo',
+        ]
       },
+      # single ? of unknown funcs do not unroll unless
+      # explicitly allowed (e.g. Like)
       {
-        equal => 0,
-        statements => [
-           'SELECT * FROM foo WHERE a IN (1,2,3)',
-           'SELECT * FROM foo WHERE a IN (1,3,2)',
-           'SELECT * FROM foo WHERE a IN (2,1,3)',
-           'SELECT * FROM foo WHERE a IN (2,3,1)',
-           'SELECT * FROM foo WHERE a IN (3,1,2)',
-           'SELECT * FROM foo WHERE a IN (3,2,1)',
-        ]
+        equal => 0,
+        statements => [
+          'SELECT foo FROM bar WHERE bar > foo ?',
+          'SELECT foo FROM bar WHERE bar > foo( ? )',
+        ]
+      },
+      {
+        equal => 1,
+        statements => [
+          'SELECT foo FROM bar WHERE bar LIKE ?',
+          'SELECT foo FROM bar WHERE bar LiKe (?)',
+          'SELECT foo FROM bar WHERE bar lIkE( (?))',
+        ]
+      },
+      # test multival
+      {
+        equal => 0,
+        statements => [
+          'SELECT foo FROM bar WHERE foo IN (?, ?)',
+          'SELECT foo FROM bar WHERE foo IN ?, ?',
+        ]
+      },
+      # math
+      {
+        equal => 0,
+        statements => [
+          'SELECT * FROM foo WHERE 1 = ( a > b)',
+          'SELECT * FROM foo WHERE 1 = a > b',
+          'SELECT * FROM foo WHERE (1 = a) > b',
+        ]
+      },
+      {
+        equal => 1,
+        statements => [
+          'SELECT * FROM foo WHERE bar = baz(buzz)',
+          'SELECT * FROM foo WHERE bar = (baz( buzz ))',
+        ]
       },
 );
 
@@ -834,8 +936,14 @@ for my $test (@sql_tests) {
         }
 
         if ($equal ^ $test->{equal}) {
-          diag("sql1: $sql1");
-          diag("sql2: $sql2");
+          my ($ast1, $ast2) = map { SQL::Abstract::Test::parse ($_) } ($sql1, $sql2);
+          $_ = Dumper $_ for ($ast1, $ast2);
+
+          diag "sql1: $sql1";
+          diag "sql2: $sql2";
+          note $SQL::Abstract::Test::sql_differ;
+          note "ast1: $ast1";
+          note "ast2: $ast2";
         }
       }
     }