# FIXME XSify - this can be done so much more efficiently
sub is_plain_value ($) {
no strict 'refs';
- ! length ref $_[0] ? [ $_[0] ]
+ ! length ref $_[0] ? \($_[0])
: (
ref $_[0] eq 'HASH' and keys %{$_[0]} == 1
and
exists $_[0]->{-value}
- ) ? [ $_[0]->{-value} ]
+ ) ? \($_[0]->{-value})
: (
- Scalar::Util::blessed $_[0]
+ # reuse @_ for even moar speedz
+ defined ( $_[1] = Scalar::Util::blessed $_[0] )
and
# deliberately not using Devel::OverloadInfo - the checks we are
# intersted in are much more limited than the fullblown thing, and
# this is a very hot piece of code
(
- # FIXME - DBI needs fixing to stringify regardless of DBD
+ # simply using ->can('(""') can leave behind stub methods that
+ # break actually using the overload later (see L<perldiag/Stub
+ # found while resolving method "%s" overloading "%s" in package
+ # "%s"> and the source of overload::mycan())
#
# either has stringification which DBI SHOULD prefer out of the box
- $_[0]->can( '(""' )
+ grep { *{ (qq[${_}::(""]) }{CODE} } @{ $_[2] = mro::get_linear_isa( $_[1] ) }
or
- # has nummification and fallback is *not* disabled
- # reuse @_ for even moar speedz
+ # has nummification or boolification, AND fallback is *not* disabled
(
- $_[0]->can('(0+')
+ (
+ grep { *{"${_}::(0+"}{CODE} } @{$_[2]}
+ or
+ grep { *{"${_}::(bool"}{CODE} } @{$_[2]}
+ )
and
(
# no fallback specified at all
- ! ( ($_[1]) = grep { *{"${_}::()"}{CODE} } @{ mro::get_linear_isa( ref $_[0] ) } )
+ ! ( ($_[3]) = grep { *{"${_}::()"}{CODE} } @{$_[2]} )
or
# fallback explicitly undef
- ! defined ${"$_[1]::()"}
+ ! defined ${"$_[3]::()"}
or
# explicitly true
- ${"$_[1]::()"}
+ !! ${"$_[3]::()"}
)
)
)
- ) ? [ "$_[0]" ]
+ ) ? \($_[0])
: undef;
}
sub _where_op_IDENT {
my $self = shift;
my ($op, $rhs) = splice @_, -2;
- if (ref $rhs) {
- puke "-$op takes a single scalar argument (a quotable identifier)";
+ if (! defined $rhs or length ref $rhs) {
+ puke "-$op requires a single plain scalar argument (a quotable identifier)";
}
# in case we are called as a top level special op (no '=')
=back
-On failure returns C<undef>, on sucess returns a reference to a single
-element array containing the string-version of the supplied argument or
-C<[ undef ]> in case of an undefined initial argument.
+On failure returns C<undef>, on sucess returns a B<scalar> reference
+to the original supplied argument.
=head2 is_literal_value
=back
-On failure returns C<undef>, on sucess returns a reference to an array
-cotaining the unpacked version of the supplied literal SQL and bind values.
+On failure returns C<undef>, on sucess returns an B<array> reference
+containing the unpacked version of the supplied literal SQL and bind values.
=head1 WHERE CLAUSES