'ON',
'WHERE',
'(?: DEFAULT \s+ )? VALUES',
- 'EXISTS',
+ '(?:NOT \s+)? EXISTS',
'GROUP \s+ BY',
'HAVING',
'ORDER \s+ BY',
elsif ( $token =~ /^ NOT $/ix ) {
my $op = uc $token;
my $right = $self->_recurse_parse ($tokens, PARSE_RHS);
- $left = $left ? [ @$left, [$op => [$right] ]]
- : [ $op => [$right] ];
+ $left = $left ? [ @$left, [$op => [$right||()] ]]
+ : [ $op => [$right||()] ];
}
elsif ( $token =~ $placeholder_re) {
# FIXME - terrible name for a user facing API
sub unparse {
my ($self, $tree, $bindargs) = @_;
- $self->_parenthesis_unroll($tree);
$self->_unparse($tree, [@{$bindargs||[]}], 0);
}
return '';
}
+ $self->_parenthesis_unroll($tree);
my ($car, $cdr) = @{$tree}[0,1];
if (! defined $car or (! ref $car and ! defined $cdr) ) {
'GROUP \s+ BY',
'HAVING',
'ORDER \s+ BY',
+ 'I?LIKE',
);
my $unrollable_ops_re = join ' | ', @unrollable_ops;
$unrollable_ops_re = qr/$unrollable_ops_re/xi;
for my $child (@{$ast->[1]}) {
# the current node in this loop is *always* a PAREN
- if (not ref $child or not $child->[0] eq 'PAREN') {
+ if (! ref $child or ! @$child or $child->[0] ne 'PAREN') {
push @children, $child;
next;
}
}
# only *ONE* LITERAL or placeholder element
+ # as an AND/OR/NOT argument
elsif (
@{$child->[1]} == 1 && (
$child->[1][0][0] eq 'LITERAL'
or
$child->[1][0][0] eq 'PLACEHOLDER'
+ ) && (
+ $ast->[0] eq 'AND' or $ast->[0] eq 'OR' or $ast->[0] eq 'NOT'
)
) {
push @children, $child->[1][0];