notreached at base of expand_expr
[dbsrgits/SQL-Abstract.git] / lib / SQL / Abstract.pm
index 9725b00..01bf68b 100644 (file)
@@ -37,11 +37,11 @@ our $AUTOLOAD;
 # special operators (-in, -between). May be extended/overridden by user.
 # See section WHERE: BUILTIN SPECIAL OPERATORS below for implementation
 my @BUILTIN_SPECIAL_OPS = (
-  {regex => qr/^ (?: not \s )? between $/ix, handler => '_where_field_BETWEEN'},
-  {regex => qr/^ (?: not \s )? in      $/ix, handler => '_where_field_IN'},
-  {regex => qr/^ ident                 $/ix, handler => '_where_op_IDENT'},
-  {regex => qr/^ value                 $/ix, handler => '_where_op_VALUE'},
-  {regex => qr/^ is (?: \s+ not )?     $/ix, handler => '_where_field_IS'},
+  {regex => qr/^ (?: not \s )? between $/ix, handler => sub { die "NOPE" }},
+  {regex => qr/^ (?: not \s )? in      $/ix, handler => sub { die "NOPE" }},
+  {regex => qr/^ ident                 $/ix, handler => sub { die "NOPE" }},
+  {regex => qr/^ value                 $/ix, handler => sub { die "NOPE" }},
+  {regex => qr/^ is (?: \s+ not )?     $/ix, handler => sub { die "NOPE" }},
 );
 
 # unaryish operators - key maps to handler
@@ -540,6 +540,7 @@ sub where {
 
 sub _expand_expr {
   my ($self, $expr, $logic) = @_;
+  return undef unless defined($expr);
   if (ref($expr) eq 'HASH') {
     if (keys %$expr > 1) {
       $logic ||= 'and';
@@ -579,7 +580,11 @@ sub _expand_expr {
   if (my $literal = is_literal_value($expr)) {
     return +{ -literal => $literal };
   }
-  return $expr;
+  if (!ref($expr)) {
+    return +{ -value => $expr };
+  }
+  #::Ddie([ HUH => $expr ]);
+  die "notreached";
 }
 
 sub _expand_expr_hashpair {
@@ -691,6 +696,35 @@ sub _expand_expr_hashpair {
           \@rhs
         ] };
       }
+      if ($vk eq 'ident') {
+        if (! defined $vv or ref $vv) {
+          puke "-$vk requires a single plain scalar argument (a quotable identifier)";
+        }
+        return +{ -op => [
+          $self->{cmp},
+          { -ident => $k },
+          { -ident => $vv }
+        ] };
+      }
+      if ($vk eq 'value') {
+        return $self->_expand_expr_hashpair($k, undef) unless defined($vv);
+        return +{ -op => [
+          $self->{cmp},
+          { -ident => $k },
+          { -bind => [ $k, $vv ] }
+        ] };
+      }
+      if ($vk =~ /^is(?:[ _]not)?$/) {
+        puke "$vk can only take undef as argument"
+          if defined($vv)
+             and not (
+               ref($vv) eq 'HASH'
+               and exists($vv->{-value})
+               and !defined($vv->{-value})
+             );
+        $vk =~ s/_/ /g;
+        return +{ -op => [ $vk.' null', { -ident => $k } ] };
+      }
     }
     if (ref($v) eq 'ARRAY') {
       return $self->{sqlfalse} unless @$v;