Quote table name when inserting DEFAULT VALUES
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / SQLMaker.pm
index f041ce6..6ea68ba 100644 (file)
@@ -24,6 +24,8 @@ Currently the enhancements to L<SQL::Abstract> are:
 
 =item * Support of C<...FOR UPDATE> type of select statement modifiers
 
+=item * The -ident operator
+
 =back
 
 =cut
@@ -42,6 +44,14 @@ use namespace::clean;
 
 __PACKAGE__->mk_group_accessors (simple => qw/quote_char name_sep limit_dialect/);
 
+# for when I need a normalized l/r pair
+sub _quote_chars {
+  map
+    { defined $_ ? $_ : '' }
+    ( ref $_[0]->{quote_char} ? (@{$_[0]->{quote_char}}) : ( ($_[0]->{quote_char}) x 2 ) )
+  ;
+}
+
 BEGIN {
   # reinstall the carp()/croak() functions imported into SQL::Abstract
   # as Carp and Carp::Clan do not like each other much
@@ -54,7 +64,7 @@ BEGIN {
     *{"SQL::Abstract::$f"} = subname "SQL::Abstract::$f" =>
       sub {
         if (Carp::longmess() =~ /DBIx::Class::SQLMaker::[\w]+ .+? called \s at/x) {
-          $clan_import->(@_);
+          goto $clan_import;
         }
         else {
           goto $orig;
@@ -71,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) = @_;
@@ -151,7 +193,9 @@ sub insert {
   # 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);