X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits%2FDBIx-Class.git;a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSQLMaker.pm;h=fe701ca6c214fd6be46cd2e3d2d44097ad5f5e3b;hp=f43aa0b0abb19719d595b8ffcd6c0560ecbbacc3;hb=e66002835945589b7174d524ba5add64e714abd2;hpb=4783a9a4721bc599e46de0ef2eed00a900325396 diff --git a/lib/DBIx/Class/SQLMaker.pm b/lib/DBIx/Class/SQLMaker.pm index f43aa0b..fe701ca 100644 --- a/lib/DBIx/Class/SQLMaker.pm +++ b/lib/DBIx/Class/SQLMaker.pm @@ -24,6 +24,8 @@ Currently the enhancements to L are: =item * Support of C<...FOR UPDATE> type of select statement modifiers +=item * The -ident operator + =back =cut @@ -79,6 +81,38 @@ BEGIN { # 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) = @_;