X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FAbstract.pm;fp=lib%2FSQL%2FAbstract.pm;h=bae86986c989120b91cd57e5bb3fe9a7d719d0af;hb=03e6883c5f3918df6a5b6cb7fad8e1e5131e3876;hp=a88a1490a2ef49eec7989135f52a5162fe9b4b56;hpb=7451b69401d5f8ec69027f4c12bd3d8fcb57cbb0;p=scpubgit%2FQ-Branch.git diff --git a/lib/SQL/Abstract.pm b/lib/SQL/Abstract.pm index a88a149..bae8698 100644 --- a/lib/SQL/Abstract.pm +++ b/lib/SQL/Abstract.pm @@ -989,23 +989,26 @@ sub _expand_hashpair_op { my $op = $self->_normalize_op($k); - { # Old SQLA compat + my $wsop = join(' ', split '_', $op); - my $op = join(' ', split '_', $op); + my $is_special = List::Util::first { $wsop =~ $_->{regex} } + @{$self->{special_ops}}; + + { # Old SQLA compat # the old special op system requires illegality for top-level use if ( (our $Expand_Depth) == 1 and ( - List::Util::first { $op =~ $_->{regex} } @{$self->{special_ops}} + $is_special or ( $self->{disable_old_special_ops} - and List::Util::first { $op =~ $_->{regex} } @BUILTIN_SPECIAL_OPS + and List::Util::first { $wsop =~ $_->{regex} } @BUILTIN_SPECIAL_OPS ) ) ) { - puke "Illegal use of top-level '-$op'" + puke "Illegal use of top-level '-$wsop'" } } @@ -1037,27 +1040,22 @@ sub _expand_hashpair_op { } } - my $type = ( - $self->{unknown_unop_always_func} && !$self->{render_op}{$op} - ? -func - : -op - ); + my $type = $is_special || $self->{render_op}{$op} ? -op : -func; - { # Old SQLA compat + if ($self->{restore_old_unop_handling}) { + + # Old SQLA compat if ( ref($v) eq 'HASH' and keys %$v == 1 and (keys %$v)[0] =~ /^-/ + and not $self->{render_op}{$op} + and not $is_special ) { - $type = ( - ( - (List::Util::first { $op =~ $_->{regex} } @{$self->{special_ops}}) - or $self->{render_op}{$op} - ) - ? -op - : -func - ) + $type = -func; + } else { + $type = -op; } } @@ -1569,8 +1567,14 @@ sub _render_unop_paren { sub _render_unop_prefix { my ($self, $op, $v) = @_; + my $op_sql = $self->{restore_old_unop_handling} + ? $self->_sqlcase($op) + : { -keyword => $op }; return $self->join_query_parts(' ', - { -keyword => \$op }, $v->[0] + ($self->{restore_old_unop_handling} + ? $self->_sqlcase($op) + : { -keyword => \$op }), + $v->[0] ); }