X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSQLMaker.pm;h=3cd017dbc158638627e360eb083b5007ab957165;hb=9aae35666a35bad290f55e574d053a074c1d6757;hp=287dcc83154bbf245299f436d0371afb2c48529f;hpb=a126983e43f896c64e0ae7ba01c8a3d690d8125a;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/SQLMaker.pm b/lib/DBIx/Class/SQLMaker.pm index 287dcc8..3cd017d 100644 --- a/lib/DBIx/Class/SQLMaker.pm +++ b/lib/DBIx/Class/SQLMaker.pm @@ -183,7 +183,7 @@ sub select { if ($limit) { # this is legacy code-flow from SQLA::Limit, it is not set in stone - ($sql, @bind) = $self->next::method ($table, $fields, $where); + ($sql, @bind) = $self->__overriden_select($table, $fields, $where); my $limiter = $self->can ('emulate_limit') # also backcompat hook from SQLA::Limit @@ -199,7 +199,7 @@ sub select { $sql = $self->$limiter ($sql, $rs_attrs, $limit, $offset); } else { - ($sql, @bind) = $self->next::method ($table, $fields, $where, $rs_attrs); + ($sql, @bind) = $self->__overriden_select($table, $fields, $where, $rs_attrs); } push @{$self->{where_bind}}, @bind; @@ -213,6 +213,25 @@ sub select { return wantarray ? ($sql, @all_bind) : $sql; } +sub __overriden_select { + my $self = shift; + my ($table, @bind) = $self->_table(shift); + my $fields = shift || '*'; + my $where = shift; + my $order = shift; + + my($where_sql, @morebind) = $self->where($where, $order); + push @bind, @morebind; + + my $f = (ref $fields eq 'ARRAY') ? join ', ', map { $self->_quote($_) } @$fields + : $fields; + my $sql = join(' ', $self->_sqlcase('select'), $f, + $self->_sqlcase('from'), $table) + . $where_sql; + + return wantarray ? ($sql, @bind) : $sql; +} + sub _assemble_binds { my $self = shift; return map { @{ (delete $self->{"${_}_bind"}) || [] } } (qw/select from where group having order/); @@ -378,7 +397,7 @@ sub _generate_join_clause { sub _recurse_from { my ($self, $from, @join) = @_; - my @sqlf; + my (@sqlf, @binds); push @sqlf, $self->_from_chunk_to_sql($from); for (@join) { @@ -397,13 +416,17 @@ sub _recurse_from { push @sqlf, $self->_generate_join_clause( $join_type ); if (ref $to eq 'ARRAY') { - push(@sqlf, '(', $self->_recurse_from(@$to), ')'); + my ($sql, @local_bind) = $self->_recurse_from(@$to); + push(@sqlf, '(', $sql , ')'); + push @binds, @local_bind; } else { push(@sqlf, $self->_from_chunk_to_sql($to)); } - push(@sqlf, ' ON ', $self->_join_condition($on)); + my ($sql, @local_bind) = $self->_join_condition($on); + push(@sqlf, ' ON ', $sql); + push @binds, @local_bind; } - return join('', @sqlf); + return join('', @sqlf), @binds; } sub _from_chunk_to_sql { @@ -450,9 +473,16 @@ sub _join_condition { my $x = '= '.$self->_quote($v); $j{$_} = \$x; } }; - return scalar($self->_recurse_where(\%j)); + return $self->_recurse_where(\%j); } elsif (ref $cond eq 'ARRAY') { - return join(' OR ', map { $self->_join_condition($_) } @$cond); + my @parts; + my @binds; + foreach my $c (@$cond) { + my ($sql, @bind) = $self->_join_condition($c); + push @binds, @bind; + push @parts, $sql; + } + return join(' OR ', @parts), @binds; } else { croak "Can't handle this yet!"; }