Escape the closing quote character when quoting indentifiers
Dagfinn Ilmari Mannsåker [Sun, 29 Jun 2014 17:36:33 +0000 (18:36 +0100)]
lib/SQL/Translator/Generator/DDL/PostgreSQL.pm
lib/SQL/Translator/Generator/Role/Quote.pm
lib/SQL/Translator/Producer/Oracle.pm

index b3cc1b8..cdf5049 100644 (file)
@@ -12,7 +12,11 @@ I<documentation volunteers needed>
 =cut
 use Moo;
 
-has quote_chars => (is => 'rw', default => sub { +[qw(" ")] } );
+has quote_chars => (
+  is => 'rw',
+  default => sub { +[qw(" ")] },
+  trigger => sub { $_[0]->clear_escape_char },
+);
 
 with 'SQL::Translator::Generator::Role::Quote';
 
index 56a02f2..33725c3 100644 (file)
@@ -15,6 +15,13 @@ I<documentation volunteers needed>
 
 requires qw(quote_chars name_sep);
 
+has escape_char => (
+  is => 'ro',
+  lazy => 1,
+  clearer => 1,
+  default => sub { $_[0]->quote_chars->[-1] },
+);
+
 sub quote {
   my ($self, $label) = @_;
 
@@ -34,8 +41,10 @@ sub quote {
   }
 
   my $sep = $self->name_sep || '';
+  my $esc = $self->escape_char;
+
   # parts containing * are naturally unquoted
-  join $sep, map "$l$_$r", ( $sep ? split (/\Q$sep\E/, $label ) : $label )
+  join $sep, map { (my $n = $_) =~ s/\Q$r/$esc$r/g; "$l$n$r" } ( $sep ? split (/\Q$sep\E/, $label ) : $label )
 }
 
 1;
index 9b8adbc..34a9be8 100644 (file)
@@ -787,7 +787,9 @@ sub mk_name {
 
 sub quote {
   my ($name, $q) = @_;
-  $q && $name ? "$quote_char$name$quote_char" : $name;
+  return $name unless $q && $name;
+  $name =~ s/\Q$quote_char/$quote_char$quote_char/g;
+  return "$quote_char$name$quote_char";
 }