From: Peter Rabbitson Date: Thu, 19 May 2016 18:49:55 +0000 (+0200) Subject: Properly fix corner case of non-comparing overload X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=59d017a017e04267fddc5c90ac474032614cf5dd;p=dbsrgits%2FDBIx-Class-Historic.git Properly fix corner case of non-comparing overload 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 :/ --- diff --git a/Changes b/Changes index 6a70384..b002e57 100644 --- 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) diff --git a/lib/DBIx/Class/Row.pm b/lib/DBIx/Class/Row.pm index f42092a..40d6fbd 100644 --- a/lib/DBIx/Class/Row.pm +++ b/lib/DBIx/Class/Row.pm @@ -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 diff --git a/lib/DBIx/Class/Storage/DBI.pm b/lib/DBIx/Class/Storage/DBI.pm index 71c57da..302bcca 100644 --- a/lib/DBIx/Class/Storage/DBI.pm +++ b/lib/DBIx/Class/Storage/DBI.pm @@ -1812,7 +1812,7 @@ sub _format_for_trace { map { defined( $_ && $_->[1] ) - ? qq{'$_->[1]'} + ? sprintf( "'%s'", "$_->[1]" ) # because overload : q{NULL} } @{$_[1] || []}; }