Make sure empty cond collapser works on all positions
[dbsrgits/DBIx-Class.git] / t / sqlmaker / dbihacks_internals.t
index 84abaf1..1ad550a 100644 (file)
@@ -5,7 +5,7 @@ use Test::Warn;
 
 use lib qw(t/lib);
 use DBICTest ':DiffSQL';
-use DBIx::Class::_Util qw(UNRESOLVABLE_CONDITION modver_gt_or_eq);
+use DBIx::Class::_Util 'UNRESOLVABLE_CONDITION';
 
 use Data::Dumper;
 
@@ -94,15 +94,17 @@ for my $t (
     efcc_n_result => { artistid => 1, charfield => undef },
   },
   {
-    where => { artistid => { '=' => [ 1 ], }, charfield => { '=' => [-and => \'1', \['?',2] ] }, rank => { '=' => [ $num, $num ] } },
-    cc_result => { artistid => 1, charfield => [-and => { '=' => \'1' }, { '=' => \['?',2] } ], rank => { '=' => [$num, $num] } },
+    where => { artistid => { '=' => [ 1 ], }, charfield => { '=' => [ -AND => \'1', \['?',2] ] }, rank => { '=' => [ -OR => $num, $num ] } },
+    cc_result => { artistid => 1, charfield => [-and => { '=' => \['?',2] }, { '=' => \'1' } ], rank => { '=' => [$num, $num] } },
     sql => 'WHERE artistid = ? AND charfield = 1 AND charfield = ? AND ( rank = ? OR rank = ? )',
+    collapsed_sql => 'WHERE artistid = ? AND charfield = ? AND charfield = 1 AND ( rank = ? OR rank = ? )',
     efcc_result => { artistid => 1, charfield => UNRESOLVABLE_CONDITION },
   },
   {
     where => { -and => [ artistid => 1, artistid => 2 ], name => [ -and => { '!=', 1 }, 2 ], charfield => [ -or => { '=', 2 } ], rank => [-and => undef, { '=', undef }, { '!=', 2 } ] },
-    cc_result => { artistid => [ -and => 1, 2 ], name => [ -and => { '!=', 1 }, 2 ], charfield => 2, rank => [ -and => undef, undef, { '!=', 2 } ] },
+    cc_result => { artistid => [ -and => 1, 2 ], name => [ -and => { '!=', 1 }, 2 ], charfield => 2, rank => [ -and => { '!=', 2 }, undef ] },
     sql => 'WHERE artistid = ? AND artistid = ? AND charfield = ? AND name != ? AND name = ? AND rank IS NULL AND rank IS NULL AND rank != ?',
+    collapsed_sql => 'WHERE artistid = ? AND artistid = ? AND charfield = ? AND name != ? AND name = ? AND rank != ? AND rank IS NULL',
     efcc_result => {
       artistid => UNRESOLVABLE_CONDITION,
       name => 2,
@@ -132,9 +134,7 @@ for my $t (
     efcc_result => { 'group.is_active' => 1, 'me.is_active' => 1 },
   },
 
-  # need fixed SQLA to correctly work with this
-  #
-  ( modver_gt_or_eq('SQL::Abstract', '1.78_01') ? {
+  {
     where => { -and => [
       artistid => { -value => [1] },
       charfield => { -ident => 'foo' },
@@ -159,7 +159,7 @@ for my $t (
       charfield => { -ident => 'foo' },
       rank => { -ident => 'bar' },
     },
-  } : () ),
+  },
 
   {
     where => { artistid => [] },
@@ -179,6 +179,25 @@ for my $t (
       efcc_result => {},
       sql => '',
     },
+    {
+      where => { -or => [ foo => 1, $_ ] },
+      cc_result => { foo => 1 },
+      efcc_result => { foo => 1 },
+      sql => 'WHERE foo = ?',
+    },
+    {
+      where => { -or => [ $_, foo => 1 ] },
+      cc_result => { foo => 1 },
+      efcc_result => { foo => 1 },
+      sql => 'WHERE foo = ?',
+    },
+    {
+      where => { -and => [ fuu => 2, $_, foo => 1 ] },
+      sql => 'WHERE fuu = ? AND foo = ?',
+      collapsed_sql => 'WHERE foo = ? AND fuu = ?',
+      cc_result => { foo => 1, fuu => 2 },
+      efcc_result => { foo => 1, fuu => 2 },
+    },
   } (
     # bare
     [], {},
@@ -196,8 +215,9 @@ for my $t (
   # batshit insanity, just to be thorough
   {
     where => { -and => [ [ 'artistid' ], [ -and => [ artistid => { '!=', 69 }, artistid => undef, artistid => { '=' => 200 } ]], artistid => [], { -or => [] }, { -and => [] }, [ 'charfield' ], { name => [] }, 'rank' ] },
-    cc_result => { artistid => [ -and => undef, { '!=', 69 }, undef, 200, [] ], charfield => undef, name => [], rank => undef },
+    cc_result => { artistid => [ -and => [], { '!=', 69 }, undef, 200  ], charfield => undef, name => [], rank => undef },
     sql => 'WHERE artistid IS NULL AND artistid != ? AND artistid IS NULL AND artistid = ? AND 0=1 AND charfield IS NULL AND 0=1 AND rank IS NULL',
+    collapsed_sql => 'WHERE 0=1 AND artistid != ? AND artistid IS NULL AND artistid = ? AND charfield IS NULL AND 0=1 AND rank IS NULL',
     efcc_result => { artistid => UNRESOLVABLE_CONDITION },
     efcc_n_result => { artistid => UNRESOLVABLE_CONDITION, charfield => undef, rank => undef },
   },
@@ -226,7 +246,10 @@ for my $t (
 
   for my $w (
     $t->{where},
+    $t->{where},  # do it twice, make sure we didn't destory the condition
     [ -and => $t->{where} ],
+    [ -AND => $t->{where} ],
+    { -OR => [ -AND => $t->{where} ] },
     ( keys %{$t->{where}} <= 1 ? [ %{$t->{where}} ] : () ),
     ( (keys %{$t->{where}} == 1 and $t->{where}{-or})
       ? ( ref $t->{where}{-or} eq 'HASH'
@@ -238,17 +261,17 @@ for my $t (
   ) {
     my $name = do { local ($Data::Dumper::Indent, $Data::Dumper::Terse, $Data::Dumper::Sortkeys) = (0, 1, 1); Dumper $w };
 
-    my @orig_sql_bind = $sm->where($w);
+    my ($generated_sql) = $sm->where($w);
 
-    is_same_sql ( $orig_sql_bind[0], $t->{sql}, "Expected SQL from $name" )
+    is_same_sql ( $generated_sql, $t->{sql}, "Expected SQL from $name" )
       if exists $t->{sql};
 
     my $collapsed_cond = $schema->storage->_collapse_cond($w);
 
-    is_same_sql_bind(
-      \[ $sm->where($collapsed_cond) ],
-      \\@orig_sql_bind,
-      "Collapse did not alter final SQL based on $name",
+    is_same_sql(
+      ($sm->where($collapsed_cond))[0],
+      ( $t->{collapsed_sql} || $t->{sql} || $generated_sql ),
+      "Collapse did not alter *the semantics* of the final SQL based on $name",
     );
 
     is_deeply(