=item * Support of C<...FOR UPDATE> type of select statement modifiers
+=item * The -ident operator
+
=back
=cut
# as the value to abuse with MSSQL ordered subqueries)
sub __max_int { 0xFFFFFFFF };
+sub new {
+ my $self = shift->next::method(@_);
+
+ # use the same coderef, it is prepared to handle both cases
+ push @{$self->{special_ops}}, {
+ regex => qr/^ ident $/xi, handler => '_where_op_IDENT',
+ };
+ push @{$self->{unary_ops}}, {
+ regex => qr/^ ident $/xi, handler => '_where_op_IDENT',
+ };
+
+ $self;
+}
+
+sub _where_op_IDENT {
+ my $self = shift;
+ my ($op, $rhs) = splice @_, -2;
+ if (ref $rhs) {
+ croak "-$op takes a single scalar argument (a quotable identifier)";
+ }
+
+ # in case we are called as a top level special op
+ my $lhs = shift;
+
+ $_ = $self->_convert($self->_quote($_)) for ($lhs, $rhs);
+
+ return $lhs
+ ? "$lhs = $rhs"
+ : $rhs
+ ;
+}
+
# Handle limit-dialect selection
sub select {
my ($self, $table, $fields, $where, $rs_attrs, $limit, $offset) = @_;
# which is sadly understood only by MySQL. Change default behavior here,
# until SQLA2 comes with proper dialect support
if (! $_[2] or (ref $_[2] eq 'HASH' and !keys %{$_[2]} ) ) {
- my $sql = "INSERT INTO $_[1] DEFAULT VALUES";
+ my $sql = sprintf(
+ 'INSERT INTO %s DEFAULT VALUES', $_[0]->_quote($_[1])
+ );
if (my $ret = ($_[3]||{})->{returning} ) {
$sql .= $_[0]->_insert_returning ($ret);