X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FAbstract.pm;h=c88d0c2708dd56380d087fcfe4b8960425b4397b;hb=20e178a84a647f5ae98a16a7358496c6dc86caf0;hp=d8251ceab36c6f8560c09c526d4783bb924bce45;hpb=44e54b410631b988e08e25617363a1efeadecd0d;p=dbsrgits%2FSQL-Abstract.git diff --git a/lib/SQL/Abstract.pm b/lib/SQL/Abstract.pm index d8251ce..c88d0c2 100644 --- a/lib/SQL/Abstract.pm +++ b/lib/SQL/Abstract.pm @@ -84,47 +84,49 @@ sub is_literal_value ($) { # 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 - # - # FIXME - simply using ->can('(""') trips up Path::Class in - # inexplicable ways under -T (likely other modules too) + # simply using ->can('(""') can leave behind stub methods that + # break actually using the overload later (see L and the source of overload::mycan()) # # either has stringification which DBI SHOULD prefer out of the box - grep { *{ (qq[${_}::(""]) }{CODE} } @{ mro::get_linear_isa( ref $_[0] ) } + 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 ( - # FIXME - simply using ->can('(0+') trips up Path::Class in - # inexplicable ways under -T (likely other modules too) - grep { *{"${_}::(0+"}{CODE} } @{ mro::get_linear_isa( ref $_[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; } @@ -738,8 +740,8 @@ sub _where_op_BOOL { 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 '=') @@ -2148,9 +2150,8 @@ module: =back -On failure returns C, 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, on sucess returns a B reference +to the original supplied argument. =head2 is_literal_value @@ -2167,8 +2168,8 @@ module: =back -On failure returns C, on sucess returns a reference to an array -cotaining the unpacked version of the supplied literal SQL and bind values. +On failure returns C, on sucess returns an B reference +containing the unpacked version of the supplied literal SQL and bind values. =head1 WHERE CLAUSES