From: Peter Rabbitson Date: Fri, 19 Sep 2014 15:54:52 +0000 (+0200) Subject: Well how about them apples?! Add temporary overload-madness escape hatch X-Git-Tag: v1.79~11 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits%2FSQL-Abstract.git;a=commitdiff_plain;h=843a94b5a440baaea0b5cd7d751f8995a1657421 Well how about them apples?! Add temporary overload-madness escape hatch --- diff --git a/lib/SQL/Abstract.pm b/lib/SQL/Abstract.pm index c88d0c2..08f6011 100644 --- a/lib/SQL/Abstract.pm +++ b/lib/SQL/Abstract.pm @@ -16,6 +16,11 @@ BEGIN { else { require mro; } + + *SQL::Abstract::_ENV_::DETECT_AUTOGENERATED_STRINGIFICATION = $ENV{SQLA_ISVALUE_IGNORE_AUTOGENERATED_STRINGIFICATION} + ? sub () { 0 } + : sub () { 1 } + ; } #====================================================================== @@ -108,6 +113,8 @@ sub is_plain_value ($) { or # has nummification or boolification, AND fallback is *not* disabled ( + SQL::Abstract::_ENV_::DETECT_AUTOGENERATED_STRINGIFICATION + and ( grep { *{"${_}::(0+"}{CODE} } @{$_[2]} or @@ -2153,6 +2160,48 @@ module: On failure returns C, on sucess returns a B reference to the original supplied argument. +=over + +=item * Note + +The stringification overloading detection is rather advanced: it takes +into consideration not only the presence of a C<""> overload, but if that +fails also checks for enabled +L|overload/Magic Autogeneration>, based +on either C<0+> or C. + +Unfortunately testing in the field indicates that this +detection B<< may tickle a latent bug in perl versions before 5.018 >>, +but only when very large numbers of stringifying objects are involved. +At the time of writing ( Sep 2014 ) there is no clear explanation of +the direct cause, nor is there a manageably small test case that reliably +reproduces the problem. + +If you encounter any of the following exceptions in B - this module may be to blame: + + Operation "ne": no method found, + left argument in overloaded package , + right argument in overloaded package + +or perhaps even + + Stub found while resolving method "???" overloading """" in package + +If you fall victim to the above - please attempt to reduce the problem +to something that could be sent to the L +(either publicly or privately). As a workaround in the meantime you can +set C<$ENV{SQLA_ISVALUE_IGNORE_AUTOGENERATED_STRINGIFICATION}> to a true +value, which will most likely eliminate your problem (at the expense of +not being able to properly detect exotic forms of stringification). + +This notice and environment variable will be removed in a future version, +as soon as the underlying problem is found and a reliable workaround is +devised. + +=back + =head2 is_literal_value Determines if the supplied argument is a literal value as understood by this diff --git a/t/23_is_X_value.t b/t/23_is_X_value.t index 98bf9f2..b06501e 100644 --- a/t/23_is_X_value.t +++ b/t/23_is_X_value.t @@ -6,6 +6,8 @@ use Test::Exception; use Scalar::Util 'refaddr'; use Storable 'nfreeze'; +BEGIN { $ENV{SQLA_ISVALUE_IGNORE_AUTOGENERATED_STRINGIFICATION} = 0 } + use SQL::Abstract qw(is_plain_value is_literal_value); # fallback setting is inheriting starting p5 50853fa9 (run up to 5.17.0) diff --git a/xt/91podcoverage.t b/xt/91podcoverage.t index 427f0cb..3c02c82 100644 --- a/xt/91podcoverage.t +++ b/xt/91podcoverage.t @@ -23,12 +23,11 @@ my @modules = sort { $a cmp $b } ( Test::Pod::Coverage::all_modules() ); # ignore => array ref containing list of methods which # do not need to be documented. my $exceptions = { - 'SQL::Abstract' => { - ignore => [ - qw/belch - puke/ - ] - }, + 'SQL::Abstract' => { ignore => [qw( + belch + puke + DETECT_AUTOGENERATED_STRINGIFICATION + )]}, 'SQL::Abstract::Tree' => { ignore => [qw(BUILDARGS)] }, 'SQL::Abstract::Test' => { skip => 1 }, 'DBIx::Class::Storage::Debug::PrettyPrint' => { skip => 1 },