Majorly cleanup $rs->update/delete (no $rs-aware code should be in ::Storages)
[dbsrgits/DBIx-Class.git] / t / resultset / update_delete.t
index 4a9eab4..3de8bdb 100644 (file)
@@ -8,7 +8,12 @@ use DBICTest;
 use DBIC::DebugObj;
 use DBIC::SqlMakerTest;
 
-my $schema = DBICTest->init_schema();
+my $schema = DBICTest->init_schema;
+
+my ($sql, @bind);
+my $debugobj = DBIC::DebugObj->new (\$sql, \@bind);
+my $orig_debugobj = $schema->storage->debugobj;
+my $orig_debug = $schema->storage->debug;
 
 my $tkfks = $schema->resultset('FourKeys_to_TwoKeys');
 
@@ -47,15 +52,54 @@ my $fks = $schema->resultset ('FourKeys')
                   ->search ({ map { $_ => [1, 2] } qw/foo bar hello goodbye/}, { join => 'fourkeys_to_twokeys' });
 
 is ($fks->count, 4, 'Joined FourKey count correct (2x2)');
+
+$schema->storage->debugobj ($debugobj);
+$schema->storage->debug (1);
 $fks->update ({ read_count => \ 'read_count + 1' });
-$_->discard_changes for ($fa, $fb);
+$schema->storage->debugobj ($orig_debugobj);
+$schema->storage->debug ($orig_debug);
 
-is ($fa->read_count, 11, 'Update ran only once on joined resultset');
-is ($fb->read_count, 21, 'Update ran only once on joined resultset');
+is_same_sql_bind (
+  $sql,
+  \@bind,
+  'UPDATE fourkeys
+   SET read_count = read_count + 1
+   WHERE ( bar = ? AND foo = ? AND goodbye = ? AND hello = ? ) OR ( bar = ? AND foo = ? AND goodbye = ? AND hello = ? )',
+  [ map { "'$_'" } ( (1) x 4, (2) x 4 ) ],
+  'Correct update-SQL without multicolumn in support',
+);
 
+is ($fa->discard_changes->read_count, 11, 'Update ran only once on joined resultset');
+is ($fb->discard_changes->read_count, 21, 'Update ran only once on joined resultset');
+
+# try the same sql with forced multicolumn in
+$schema->storage->_use_multicolumn_in (1);
+$schema->storage->debugobj ($debugobj);
+$schema->storage->debug (1);
+eval { $fks->update ({ read_count => \ 'read_count + 1' }) }; # this can't actually execute, we just need the "as_query"
+$schema->storage->_use_multicolumn_in (undef);
+$schema->storage->debugobj ($orig_debugobj);
+$schema->storage->debug ($orig_debug);
+
+is_same_sql_bind (
+  $sql,
+  \@bind,
+  'UPDATE fourkeys
+    SET read_count = read_count + 1
+    WHERE (
+      (foo, bar, hello, goodbye) IN (
+        SELECT me.foo, me.bar, me.hello, me.goodbye
+          FROM fourkeys me
+        WHERE ( bar = ? OR bar = ? ) AND ( foo = ? OR foo = ? ) AND ( goodbye = ? OR goodbye = ? ) AND ( hello = ? OR hello = ? )
+      )
+    )
+  ',
+  [ map { "'$_'" } ( (1, 2) x 4 ) ],
+  'Correct update-SQL with multicolumn in support',
+);
 
 #
-# Make sure multicolumn in or the equivalen functions correctly
+# Make sure multicolumn in or the equivalent functions correctly
 #
 
 my $sub_rs = $tkfks->search (
@@ -81,7 +125,7 @@ throws_ok (
 $sub_rs->search (
   {},
   {
-    group_by => [ reverse $sub_rs->result_source->primary_columns ],     # reverse to make sure the PK-list comaprison works
+    group_by => [ reverse $sub_rs->result_source->primary_columns ],     # reverse to make sure the PK-list comparison works
   },
 )->update ({ pilot_sequence => \ 'pilot_sequence + 1' });
 
@@ -138,11 +182,7 @@ is ($tkfks->count, $tkfk_cnt -= 1, 'Only one row deleted');
 
 # Make sure prefetch is properly stripped too
 # check with sql-equality, as sqlite will accept bad sql just fine
-my ($sql, @bind);
-my $orig_debugobj = $schema->storage->debugobj;
-my $orig_debug = $schema->storage->debug;
-
-$schema->storage->debugobj (DBIC::DebugObj->new (\$sql, \@bind) );
+$schema->storage->debugobj ($debugobj);
 $schema->storage->debug (1);
 $schema->resultset('CD')->search(
   { year => { '!=' => 2010 } },
@@ -155,7 +195,7 @@ $schema->storage->debug ($orig_debug);
 is_same_sql_bind (
   $sql,
   \@bind,
-  'DELETE FROM cd WHERE ( cdid IN ( SELECT me.cdid FROM cd me WHERE ( year != ? ) GROUP BY me.cdid ) )',
+  'DELETE FROM cd WHERE ( cdid IN ( SELECT me.cdid FROM cd me WHERE ( year != ? ) ) )',
   ["'2010'"],
   'Update on prefetching resultset strips prefetch correctly'
 );