mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-10-20 17:49:56 +00:00
Make TableParser.pm handle ANSI quotes
This commit is contained in:
@@ -129,9 +129,15 @@ sub parse {
|
||||
my ( $self, $ddl, $opts ) = @_;
|
||||
return unless $ddl;
|
||||
|
||||
if ( $ddl !~ m/CREATE (?:TEMPORARY )?TABLE `/ ) {
|
||||
die "Cannot parse table definition; is ANSI quoting "
|
||||
. "enabled or SQL_QUOTE_SHOW_CREATE disabled?";
|
||||
# If ANSI_QUOTES is enabled, we can't parse. But we can translate ANSI_QUOTES
|
||||
# into legacy quoting with backticks. The rules are: an identifier is
|
||||
# surrounded with the quote characters, and embedded quote characters are
|
||||
# doubled.
|
||||
if ( $ddl =~ m/CREATE (?:TEMPORARY )?TABLE "/ ) {
|
||||
$ddl = $self->ansi_to_legacy($ddl);
|
||||
}
|
||||
elsif ( $ddl !~ m/CREATE (?:TEMPORARY )?TABLE `/ ) {
|
||||
die "TableParser doesn't handle CREATE TABLE without quoting.";
|
||||
}
|
||||
|
||||
my ($name) = $ddl =~ m/CREATE (?:TEMPORARY )?TABLE\s+(`.+?`)/;
|
||||
@@ -535,6 +541,28 @@ sub get_table_status {
|
||||
return @tables;
|
||||
}
|
||||
|
||||
# Translates ANSI quoting around SHOW CREATE TABLE (specifically this query's
|
||||
# output, not an arbitrary query) into legacy backtick-quoting.
|
||||
# DOESNT WORK: my $ansi_quote_re = qr/"(?:(?!(?<!")").)*"/;
|
||||
# DOESNT WORK: my $ansi_quote_re = qr/" [^\\"]* (?: (?:\\.|"") [^\\"]* )* "/ismx;
|
||||
my $ansi_quote_re = qr/" [^"]* (?: "" [^"]* )* (?<=.) "/ismx;
|
||||
sub ansi_to_legacy {
|
||||
my ($self, $ddl) = @_;
|
||||
$ddl =~ s/($ansi_quote_re)/ansi_quote_replace($1)/ge;
|
||||
return $ddl;
|
||||
}
|
||||
|
||||
# Translates a single string from ANSI quoting into legacy quoting by
|
||||
# un-doubling embedded double-double quotes, doubling backticks, and replacing
|
||||
# the delimiters.
|
||||
sub ansi_quote_replace {
|
||||
my ($val) = @_;
|
||||
$val =~ s/^"|"$//g;
|
||||
$val =~ s/`/``/g;
|
||||
$val =~ s/""/"/g;
|
||||
return "`$val`";
|
||||
}
|
||||
|
||||
sub _d {
|
||||
my ($package, undef, $line) = caller 0;
|
||||
@_ = map { (my $temp = $_) =~ s/\n/\n# /g; $temp; }
|
||||
|
Reference in New Issue
Block a user