X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FAbstract.pm;h=d8b7e96ae8e33b01c82bd7952bdf0cef65a8bd5f;hb=7a8e09eeec71ff0be4bd110804bf412d70d5687c;hp=720f378d15d7e2736a8f009a4eb7b6121939aa9f;hpb=3921487a16c552c021260afadba59f884fd438ef;p=scpubgit%2FQ-Branch.git diff --git a/lib/SQL/Abstract.pm b/lib/SQL/Abstract.pm index 720f378..d8b7e96 100644 --- a/lib/SQL/Abstract.pm +++ b/lib/SQL/Abstract.pm @@ -144,15 +144,14 @@ our %Defaults = ( op => '_expand_op', func => '_expand_func', values => '_expand_values', - bind => '_expand_noop', - literal => '_expand_noop', - keyword => '_expand_noop', }, expand_op => { - 'between' => '_expand_between', - 'not_between' => '_expand_between', - 'in' => '_expand_in', - 'not_in' => '_expand_in', + (map +($_ => __PACKAGE__->make_binop_expander('_expand_between')), + qw(between not_between)), + #(map +($_ => __PACKAGE__->make_binop_expander('_expand_in')), + # qw(in not_in)), + in => '_expand_in', + not_in => '_expand_in', 'nest' => '_expand_nest', (map +($_ => '_expand_op_andor'), ('and', 'or')), (map +($_ => '_expand_op_is'), ('is', 'is_not')), @@ -310,6 +309,26 @@ sub _ext_rw { return $self; } +sub make_unop_expander { + my (undef, $exp) = @_; + sub { + my ($self, $name, $body, $k) = @_; + return $self->_expand_hashpair_cmp($k, { "-${name}" => $body }) + if defined($k); + return $self->$exp($name, $body); + } +} + +sub make_binop_expander { + my (undef, $exp) = @_; + sub { + my ($self, $name, $body, $k) = @_; + $k = shift @{$body = [ @$body ]} unless defined $k; + $k = ref($k) ? $k : { -ident => $k }; + return $self->$exp($name, $body, $k); + } +} + BEGIN { foreach my $type (qw( expand op_expand render op_render clause_expand clause_render @@ -427,7 +446,6 @@ sub _expand_insert_clause_from { if (ref($data) eq 'HASH' and (keys(%$data))[0] =~ /^-/) { return $self->expand_expr($data); } - return $data if ref($data) eq 'HASH' and $data->{-row}; my ($f_aqt, $v_aqt) = $self->_expand_insert_values($data); return ( from => { -values => [ $v_aqt ] }, @@ -992,23 +1010,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'" } } @@ -1016,6 +1037,10 @@ sub _expand_hashpair_op { return $self->$exp($op, $v); } + if ($self->{render}{$op}) { + return { "-${op}" => $v }; + } + # Ops prefixed with -not_ get converted if (my ($rest) = $op =~/^not_(.*)$/) { @@ -1036,27 +1061,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; } } @@ -1289,7 +1309,6 @@ sub _expand_op_is { sub _expand_between { my ($self, $op, $vv, $k) = @_; - $k = shift @{$vv = [ @$vv ]} unless defined $k; my @rhs = map $self->_expand_expr($_), ref($vv) eq 'ARRAY' ? @$vv : $vv; unless ( @@ -1301,7 +1320,7 @@ sub _expand_between { } return +{ -op => [ $op, - $self->expand_expr(ref($k) ? $k : { -ident => $k }), + $self->expand_expr($k), map $self->expand_expr($_, -value), @rhs ] } } @@ -1353,11 +1372,6 @@ sub _expand_nest { return $self->_expand_expr($v); } -sub _expand_noop { - my ($self, $type, $v) = @_; - return { "-${type}" => $v }; -} - sub _expand_values { my ($self, undef, $values) = @_; return { -values => [ @@ -1568,8 +1582,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] ); }