X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FData%2FQuery%2FRenderer%2FSQL%2FNaive.pm;h=19c22884d0917e0fd83756c75259ab7125e79faf;hb=a4ccc49e8243dff6809b2327960721ab696bbce9;hp=7b3a9413bc158dc789f084228afbb106838ba5f7;hpb=fdd10824bebc6621cb33c023c3cbebb8b907376b;p=dbsrgits%2FData-Query.git diff --git a/lib/Data/Query/Renderer/SQL/Naive.pm b/lib/Data/Query/Renderer/SQL/Naive.pm index 7b3a941..19c2288 100644 --- a/lib/Data/Query/Renderer/SQL/Naive.pm +++ b/lib/Data/Query/Renderer/SQL/Naive.pm @@ -79,7 +79,9 @@ sub _flatten_structure { sub _format_keyword { $_[0]->lc_keywords ? lc($_[1]) : $_[1] } sub _render { - die "Expected hashref, got $_[1]" unless ref($_[1]) eq 'HASH'; + unless (ref($_[1]) eq 'HASH') { + die "Expected hashref, got ".(defined($_[1])?$_[1]:'undef'); + } $_[0]->${\"_render_${\(lc($_[1]->{type})||'broken')}"}($_[1]); } @@ -142,7 +144,7 @@ sub _render_operator { sub _maybe_parenthesise { my ($self, $dq) = @_; for ($dq) { - return is_Select() || is_Slice() + return is_Select() || is_Group() || is_Slice() || is_Having() ? [ '(', $self->_render($dq), ')' ] : $self->_render($dq); } @@ -232,7 +234,7 @@ sub _handle_op_type_between { if (@args == 3) { my ($lhs, $rhs1, $rhs2) = (map $self->_maybe_parenthesise($_), @args); [ '(', $lhs, $op_name, $rhs1, 'AND', $rhs2, ')' ]; - } elsif (@args == 2 and is_Literal $args[1]->{type}) { + } elsif (@args == 2 and is_Literal $args[1]) { my ($lhs, $rhs) = (map $self->_render($_), @args); [ '(', $lhs, $op_name, $rhs, ')' ]; } else { @@ -311,7 +313,7 @@ sub _render_alias { } return [ $self->_maybe_parenthesise($dq->{from}), - $as || ' ', + $as || '', $self->_render_identifier({ elements => [ $dq->{to} ] }) ]; } @@ -357,6 +359,10 @@ sub _render_join { sub _render_where { my ($self, $dq) = @_; my ($from, $where) = @{$dq}{qw(from where)}; + while (is_Where $from) { + $where = Operator({ 'SQL.Naive' => 'and' }, [ $where, $from->{where} ]); + $from = $from->{from}; + } my $keyword = (is_Group($from) ? 'HAVING' : 'WHERE'); [ ($from ? $self->_render($from) : ()),