}
sub _where_hashpair_HASHREF {
- my ($self, $k, $v) = @_;
+ my ($self, $k, $v, $logic) = @_;
+ $logic ||= 'and';
- my (@all_sql, @all_bind);
+ my ($all_sql, @all_bind);
for my $op (sort keys %$v) {
my $val = $v->{$op};
@bind = @sub_bind;
},
+ HASHREF => sub {
+ ($sql, @bind) = $self->_where_hashpair_HASHREF($k, $val, $op);
+ },
+
UNDEF => sub { # CASE: col => {op => undef} : sql "IS (NOT)? NULL"
my $is = ($op =~ $self->{equality_op}) ? 'is' :
($op =~ $self->{inequality_op}) ? 'is not' :
});
}
- push @all_sql, $sql;
+ ($all_sql) = (defined $all_sql and $all_sql) ? $self->_join_sql_clauses($logic, [$all_sql, $sql], []) : $sql;
push @all_bind, @bind;
}
-
- return $self->_join_sql_clauses('and', \@all_sql, \@all_bind);
+ return ($all_sql, @all_bind);
}
bind => [1..3],
},
# test column multi-cond in arrayref (even more useful)
- {
+# {
# todo => 'Clarify semantics in 1.52',
- where => { x => { '!=' => [ -and => (1 .. 3) ] } },
- stmt => 'WHERE x != ? AND x != ? AND x != ?',
- bind => [1..3],
- },
+# where => { x => { '!=' => [ -and => (1 .. 3) ] } },
+# stmt => 'WHERE x != ? AND x != ? AND x != ?',
+# bind => [1..3],
+# },
# the -or should affect only the inner hashref, as we are not in an outer arrayref
{
-# todo => 'Clarify semantics in 1.52',
where => { x => {
-or => { '!=', 1, '>=', 2 }, -like => 'x%'
}},
- stmt => 'WHERE (x != ? OR x >= ?) AND x LIKE ?',
- bind => [qw/1 2 x%/],
+ stmt => 'WHERE ( ( x LIKE ? AND ( x != ? OR x >= ? ) ) )',
+ bind => [qw/x% 1 2/],
},
# the -and should affect the OUTER arrayref, while the internal structures remain intact