mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-28 17:15:44 +00:00
PT-2377 - fixed pt-table-sync for JSON utf8 strings
The MySQL driver DBD::mysql does not decode JSON values as utf8 although MySQL uses utf8mb4 for all JSON strings. This change decodes JSON values as utf8 (when not already done) such that SQL statements are generated correctly.
This commit is contained in:
@@ -7,6 +7,7 @@ BEGIN {
|
||||
};
|
||||
|
||||
use strict;
|
||||
use utf8;
|
||||
use warnings FATAL => 'all';
|
||||
use English qw(-no_match_vars);
|
||||
use Test::More;
|
||||
@@ -538,6 +539,52 @@ SKIP: {
|
||||
);
|
||||
}
|
||||
|
||||
# #############################################################################
|
||||
# PT-2377: pt-table-sync must handle utf8 in JSON columns correctly
|
||||
# #############################################################################
|
||||
SKIP: {
|
||||
skip 'Cannot connect to sandbox master', 1 unless $master_dbh;
|
||||
$master_dbh->do('DROP TABLE IF EXISTS `test`.`pt-2377`');
|
||||
$master_dbh->do('CREATE TABLE `test`.`pt-2377` (id INT, data JSON)');
|
||||
$master_dbh->do(q/INSERT INTO `test`.`pt-2377` VALUES (1, '{"name": "Müller"}')/);
|
||||
$master_dbh->do(q/INSERT INTO `test`.`pt-2377` VALUES (2, NULL)/);
|
||||
|
||||
@rows = ();
|
||||
$tbl_struct = {
|
||||
cols => [qw(id data)],
|
||||
col_posn => {id=>0, data=>1},
|
||||
type_for => {id=>'int', data=>'json'},
|
||||
};
|
||||
$ch = new ChangeHandler(
|
||||
Quoter => $q,
|
||||
left_db => 'test',
|
||||
left_tbl => 'pt-2377',
|
||||
right_db => 'test',
|
||||
right_tbl => 'pt-2377',
|
||||
actions => [ sub { push @rows, $_[0]; } ],
|
||||
replace => 0,
|
||||
queue => 0,
|
||||
tbl_struct => $tbl_struct,
|
||||
);
|
||||
$ch->fetch_back($master_dbh);
|
||||
|
||||
$ch->change('UPDATE', {id=>1}, [qw(id)] );
|
||||
$ch->change('INSERT', {id=>1}, [qw(id)] );
|
||||
$ch->change('UPDATE', {id=>2}, [qw(id)] );
|
||||
$ch->change('INSERT', {id=>2}, [qw(id)] );
|
||||
|
||||
is_deeply(
|
||||
\@rows,
|
||||
[
|
||||
q/UPDATE `test`.`pt-2377` SET `data`='{"name": "Müller"}' WHERE `id`='1' LIMIT 1/,
|
||||
q/INSERT INTO `test`.`pt-2377`(`id`, `data`) VALUES ('1', '{"name": "Müller"}')/,
|
||||
q/UPDATE `test`.`pt-2377` SET `data`=NULL WHERE `id`='2' LIMIT 1/,
|
||||
q/INSERT INTO `test`.`pt-2377`(`id`, `data`) VALUES ('2', NULL)/
|
||||
],
|
||||
"UPDATE and INSERT quote data regardless of how it looks if tbl_struct->quote_val is true"
|
||||
);
|
||||
}
|
||||
|
||||
# #############################################################################
|
||||
# Done.
|
||||
# #############################################################################
|
||||
|
Reference in New Issue
Block a user