fixups for HAVING clauses
Matt S Trout [Sat, 25 Aug 2012 18:47:08 +0000 (18:47 +0000)]
lib/Data/Query/ExprHelpers.pm
lib/Data/Query/Renderer/SQL/Naive.pm
lib/Data/Query/Renderer/SQL/Slice/GenericSubquery.pm

index ad1f529..6020be6 100644 (file)
@@ -68,7 +68,7 @@ foreach my $name (values %Data::Query::Constants::CONST) {
   my $sub = "is_${name}";
   *$sub = sub {
     my $dq = $_[0]||$_;
-    $dq->{type} eq $name
+    $dq->{type} and $dq->{type} eq $name
   };
   push @EXPORT, $sub;
   if ($map{$name}) {
@@ -84,6 +84,10 @@ foreach my $name (values %Data::Query::Constants::CONST) {
   }
 }
 
+sub is_Having { is_Where($_[0]) and is_Group($_[0]->{from}) }
+
+push @EXPORT, 'is_Having';
+
 sub compose (&@) {
   my $code = shift;
   require Scalar::Util;
index 96abe9c..492323b 100644 (file)
@@ -144,7 +144,7 @@ sub _render_operator {
 sub _maybe_parenthesise {
   my ($self, $dq) = @_;
   for ($dq) {
-    return is_Select() || is_Group() || is_Slice()
+    return is_Select() || is_Group() || is_Slice() || is_Having()
       ? [ '(', $self->_render($dq), ')' ]
       : $self->_render($dq);
   }
index c637729..4caeabf 100644 (file)
@@ -11,6 +11,8 @@ sub _render_slice {
     unless is_Select my $orig_select = $dq->{from};
   my %remapped = $self->_subquery_remap($orig_select);
   my $first_from = $remapped{inner_body};
+  # Should we simply strip until we reach a join/alias/etc. here?
+  $first_from = $first_from->{from}{from} if is_Having($first_from);
   $first_from = $first_from->{from} if is_Where($first_from);
   while (is_Join $first_from) {
     $first_from = $first_from->{left};