Fix oracle (I am so stupid)
Peter Rabbitson [Wed, 27 Jul 2011 15:37:44 +0000 (17:37 +0200)]
Changes
lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm
t/73oracle.t

diff --git a/Changes b/Changes
index a808b1f..b87ec9c 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,5 +1,9 @@
 Revision history for DBIx::Class
 
+    * Fixes
+        - Fix horrible oversight in the Oracle sqlmaker when dealing with
+          queries updating blobs (RT#69829)
+
 0.08194 2011-07-20 16:10 (UTC)
     * Fixes
         - Fix $rs->populate([]) to be a no-op rather than an exception
index cfefc77..f582b94 100644 (file)
@@ -515,7 +515,8 @@ sub _prep_for_execute {
     $self->throw_exception('Update with complex WHERE clauses currently not supported')
       if $sql =~ /\bWHERE\b .+ \bWHERE\b/xs;
 
-    ($final_sql, $sql) = $sql =~ /^ (.+?) ( \bWHERE\b .+) /xs;
+    my $where_sql;
+    ($final_sql, $where_sql) = $sql =~ /^ (.+?) ( \bWHERE\b .+) /xs;
 
     if (my $set_bind_count = $final_sql =~ y/?//) {
 
@@ -530,6 +531,10 @@ sub _prep_for_execute {
         keys %$lob_bind_indices
       };
     }
+
+    # if we got that far - assume the where SQL is all we got
+    # (the first part is already shoved into $final_sql)
+    $sql = $where_sql;
   }
   elsif ($op ne 'select' and $op ne 'delete') {
     $self->throw_exception("Unsupported \$op: $op");
index 8ac87ee..907c278 100644 (file)
@@ -449,7 +449,7 @@ sub _run_tests {
       lives_ok {
         $rs->search({ id => $id, blob => "blob:$str", clob => "clob:$str" })
           ->update({ blob => 'updated blob', clob => 'updated clob' });
-      } 'blob UPDATE with WHERE clause survived';
+      } 'blob UPDATE with blobs in WHERE clause survived';
 
       @objs = $rs->search({ blob => "updated blob", clob => 'updated clob' })->all;
       is @objs, 1, 'found updated row';
@@ -457,10 +457,20 @@ sub _run_tests {
       ok (try { $objs[0]->clob }||'' eq "updated clob", 'clob updated/retrieved correctly');
 
       lives_ok {
-        $rs->search({ blob => "updated blob", clob => "updated clob" })
+        $rs->search({ id => $id  })
+          ->update({ blob => 're-updated blob', clob => 're-updated clob' });
+      } 'blob UPDATE without blobs in WHERE clause survived';
+
+      @objs = $rs->search({ blob => 're-updated blob', clob => 're-updated clob' })->all;
+      is @objs, 1, 'found updated row';
+      ok (try { $objs[0]->blob }||'' eq 're-updated blob', 'blob updated/retrieved correctly');
+      ok (try { $objs[0]->clob }||'' eq 're-updated clob', 'clob updated/retrieved correctly');
+
+      lives_ok {
+        $rs->search({ blob => "re-updated blob", clob => "re-updated clob" })
           ->delete;
       } 'blob DELETE with WHERE clause survived';
-      @objs = $rs->search({ blob => "updated blob", clob => 'updated clob' })->all;
+      @objs = $rs->search({ blob => "re-updated blob", clob => 're-updated clob' })->all;
       is @objs, 0, 'row deleted successfully';
     }