PT-2264 - pt-query-digest Pipeline process 11 (--output slowlog) caused an error: Wide character

- Updated lib/DSNParser.pm, so it sets binmode to character set utf8 since
  MySQL 8.0 if character set is not specified in the DSN
- Added test case
- Run update-modules
This commit is contained in:
Sveta Smirnova
2024-03-19 00:08:42 +03:00
parent 80c266b048
commit 1ad44e04da
22 changed files with 711 additions and 581 deletions

View File

@@ -1389,21 +1389,46 @@ sub get_dbh {
if ( $cxn_string =~ m/mysql/i ) {
my $sql;
if ( my ($charset) = $cxn_string =~ m/charset=([\w]+)/ ) {
my ($charset) = $cxn_string =~ m/charset=([\w]+)/;
if ( $charset ) {
$sql = qq{/*!40101 SET NAMES "$charset"*/};
PTDEBUG && _d($dbh, $sql);
eval { $dbh->do($sql) };
if ( $EVAL_ERROR ) {
die "Error setting NAMES to $charset: $EVAL_ERROR";
}
PTDEBUG && _d('Enabling charset for STDOUT');
if ( $charset eq 'utf8' ) {
binmode(STDOUT, ':utf8')
or die "Can't binmode(STDOUT, ':utf8'): $OS_ERROR";
}
else {
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ( $EVAL_ERROR ) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
else {
binmode(STDOUT) or die "Can't binmode(STDOUT): $OS_ERROR";
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ( $EVAL_ERROR ) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ( $mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/ ) {
if ( $1 >= 8 && $character_set_server =~ m/^utf8/ ) {
$dbh->{mysql_enable_utf8} = 1;
$charset = $character_set_server;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES '$character_set_server'") };
if ( $EVAL_ERROR ) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
}
PTDEBUG && _d('Enabling charset for STDOUT');
if ( $charset && $charset =~ m/^utf8/ ) {
binmode(STDOUT, ':utf8')
or die "Can't binmode(STDOUT, ':utf8'): $OS_ERROR";
}
else {
binmode(STDOUT) or die "Can't binmode(STDOUT): $OS_ERROR";
}
if ( my $vars = $self->prop('set-vars') ) {
@@ -1429,28 +1454,6 @@ sub get_dbh {
. ": $EVAL_ERROR";
}
}
my ($mysql_version) = eval { $dbh->selectrow_array('SELECT VERSION()') };
if ($EVAL_ERROR) {
die "Cannot get MySQL version: $EVAL_ERROR";
}
my (undef, $character_set_server) = eval { $dbh->selectrow_array("SHOW VARIABLES LIKE 'character_set_server'") };
if ($EVAL_ERROR) {
die "Cannot get MySQL var character_set_server: $EVAL_ERROR";
}
if ($mysql_version =~ m/^(\d+)\.(\d)\.(\d+).*/) {
if ($1 >= 8 && $character_set_server =~ m/^utf8/) {
$dbh->{mysql_enable_utf8} = 1;
my $msg = "MySQL version $mysql_version >= 8 and character_set_server = $character_set_server\n".
"Setting: SET NAMES $character_set_server";
PTDEBUG && _d($msg);
eval { $dbh->do("SET NAMES 'utf8mb4'") };
if ($EVAL_ERROR) {
die "Cannot SET NAMES $character_set_server: $EVAL_ERROR";
}
}
}
PTDEBUG && _d('DBH info: ',
$dbh,