Properly fix corner case of non-comparing overload
Peter Rabbitson [Thu, 19 May 2016 18:49:55 +0000 (20:49 +0200)]
Back in 096ab902a I stupidly introduced a distinction between blessed and
non-blessed structures in store_column. In retrospect this makes absolutely
no sense. It took me an embarrasingly long time to get my clue on, including
sending a bogus bugrport (with a patch FFS!!!) and wasting SYBER's time:
https://rt.cpan.org/Ticket/Display.html?id=114424

At least that shit never shipped :/

Changes
lib/DBIx/Class/Row.pm
lib/DBIx/Class/Storage/DBI.pm

diff --git a/Changes b/Changes
index 6a70384..b002e57 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,5 +1,4 @@
 Current Known Issues / Regressions
-  - Breaks DBIx::Class::FrozenColumns (fix pending in RT#114424)
   - Breaks DBIx::Class::ResultSet::WithMetaData (fix pending in RT#104602)
   - Breaks DBIx::Class::Tree::NestedSet (fix pending in RT#114440)
 
index f42092a..40d6fbd 100644 (file)
@@ -417,7 +417,14 @@ sub insert {
           or
         (defined $current_rowdata{$_} xor defined $returned_cols->{$_})
           or
-        (defined $current_rowdata{$_} and $current_rowdata{$_} ne $returned_cols->{$_})
+        (
+          defined $current_rowdata{$_}
+            and
+          # one of the few spots doing forced-stringification
+          # needed to work around objects with defined stringification
+          # but *without* overloaded comparison (ugh!)
+          "$current_rowdata{$_}" ne "$returned_cols->{$_}"
+        )
       );
   }
 
@@ -1225,17 +1232,13 @@ sub store_column {
   $self->throw_exception( "set_column called for ${column} without value" )
     if @_ < 3;
 
-  return $self->{_column_data}{$column} = $value
-    unless length ref $value and my $vref = is_plain_value( $value );
-
-  # if we are dealing with a value/ref - there are a couple possibilities
-  # unpack the underlying piece of data and stringify all objects explicitly
-  # ( to accomodate { -value => ... } and guard against overloaded objects
-  # with defined stringification AND fallback => 0 (ugh!)
-  $self->{_column_data}{$column} = defined blessed $$vref
-    ? "$$vref"
-    : $$vref
-  ;
+  my $vref;
+  $self->{_column_data}{$column} = (
+    # unpack potential { -value => "foo" }
+    ( length ref $value and $vref = is_plain_value( $value ) )
+      ? $$vref
+      : $value
+  );
 }
 
 =head2 inflate_result
index 71c57da..302bcca 100644 (file)
@@ -1812,7 +1812,7 @@ sub _format_for_trace {
 
   map {
     defined( $_ && $_->[1] )
-      ? qq{'$_->[1]'}
+      ? sprintf( "'%s'", "$_->[1]" )  # because overload
       : q{NULL}
   } @{$_[1] || []};
 }