mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-12 06:00:14 +00:00
Don't quote FLOAT or DOUBLE in Quoter::quote_val().
This commit is contained in:
@@ -1873,6 +1873,8 @@ sub quote_val {
|
|||||||
return $val if $val =~ m/^0x[0-9a-fA-F]+$/ # quote hex data
|
return $val if $val =~ m/^0x[0-9a-fA-F]+$/ # quote hex data
|
||||||
&& !$args{is_char}; # unless is_char is true
|
&& !$args{is_char}; # unless is_char is true
|
||||||
|
|
||||||
|
return $val if $args{is_float};
|
||||||
|
|
||||||
$val =~ s/(['\\])/\\$1/g;
|
$val =~ s/(['\\])/\\$1/g;
|
||||||
return "'$val'";
|
return "'$val'";
|
||||||
}
|
}
|
||||||
@@ -3511,9 +3513,14 @@ sub make_UPDATE {
|
|||||||
return "UPDATE $self->{dst_db_tbl} SET "
|
return "UPDATE $self->{dst_db_tbl} SET "
|
||||||
. join(', ', map {
|
. join(', ', map {
|
||||||
my $is_char = ($types->{$_} || '') =~ m/char|text/i;
|
my $is_char = ($types->{$_} || '') =~ m/char|text/i;
|
||||||
|
my $is_float = ($types->{$_} || '') =~ m/float|double/i;
|
||||||
$self->{Quoter}->quote($_)
|
$self->{Quoter}->quote($_)
|
||||||
. '=' . $self->{Quoter}->quote_val($row->{$_},
|
. '='
|
||||||
is_char => $is_char);
|
. $self->{Quoter}->quote_val(
|
||||||
|
$row->{$_},
|
||||||
|
is_char => $is_char,
|
||||||
|
is_float => $is_float,
|
||||||
|
);
|
||||||
} grep { !$in_where{$_} } @cols)
|
} grep { !$in_where{$_} } @cols)
|
||||||
. " WHERE $where LIMIT 1";
|
. " WHERE $where LIMIT 1";
|
||||||
}
|
}
|
||||||
@@ -3552,10 +3559,16 @@ sub make_row {
|
|||||||
return "$verb INTO $self->{dst_db_tbl}("
|
return "$verb INTO $self->{dst_db_tbl}("
|
||||||
. join(', ', map { $q->quote($_) } @cols)
|
. join(', ', map { $q->quote($_) } @cols)
|
||||||
. ') VALUES ('
|
. ') VALUES ('
|
||||||
. join(', ', map {
|
. join(', ',
|
||||||
|
map {
|
||||||
my $is_char = ($type_for->{$_} || '') =~ m/char|text/i;
|
my $is_char = ($type_for->{$_} || '') =~ m/char|text/i;
|
||||||
$q->quote_val($row->{$_},
|
my $is_float = ($type_for->{$_} || '') =~ m/float|double/i;
|
||||||
is_char => $is_char) } @cols )
|
$q->quote_val(
|
||||||
|
$row->{$_},
|
||||||
|
is_char => $is_char,
|
||||||
|
is_float => $is_float,
|
||||||
|
)
|
||||||
|
} @cols)
|
||||||
. ')';
|
. ')';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3565,8 +3578,10 @@ sub make_where_clause {
|
|||||||
my $val = $row->{$_};
|
my $val = $row->{$_};
|
||||||
my $sep = defined $val ? '=' : ' IS ';
|
my $sep = defined $val ? '=' : ' IS ';
|
||||||
my $is_char = ($self->{tbl_struct}->{type_for}->{$_} || '') =~ m/char|text/i;
|
my $is_char = ($self->{tbl_struct}->{type_for}->{$_} || '') =~ m/char|text/i;
|
||||||
|
my $is_float = ($self->{tbl_struct}->{type_for}->{$_} || '') =~ m/float|double/i;
|
||||||
$self->{Quoter}->quote($_) . $sep . $self->{Quoter}->quote_val($val,
|
$self->{Quoter}->quote($_) . $sep . $self->{Quoter}->quote_val($val,
|
||||||
is_char => $is_char);
|
is_char => $is_char,
|
||||||
|
is_float => $is_float);
|
||||||
} @$cols;
|
} @$cols;
|
||||||
return join(' AND ', @clauses);
|
return join(' AND ', @clauses);
|
||||||
}
|
}
|
||||||
|
@@ -327,9 +327,14 @@ sub make_UPDATE {
|
|||||||
return "UPDATE $self->{dst_db_tbl} SET "
|
return "UPDATE $self->{dst_db_tbl} SET "
|
||||||
. join(', ', map {
|
. join(', ', map {
|
||||||
my $is_char = ($types->{$_} || '') =~ m/char|text/i;
|
my $is_char = ($types->{$_} || '') =~ m/char|text/i;
|
||||||
|
my $is_float = ($types->{$_} || '') =~ m/float|double/i;
|
||||||
$self->{Quoter}->quote($_)
|
$self->{Quoter}->quote($_)
|
||||||
. '=' . $self->{Quoter}->quote_val($row->{$_},
|
. '='
|
||||||
is_char => $is_char);
|
. $self->{Quoter}->quote_val(
|
||||||
|
$row->{$_},
|
||||||
|
is_char => $is_char,
|
||||||
|
is_float => $is_float,
|
||||||
|
);
|
||||||
} grep { !$in_where{$_} } @cols)
|
} grep { !$in_where{$_} } @cols)
|
||||||
. " WHERE $where LIMIT 1";
|
. " WHERE $where LIMIT 1";
|
||||||
}
|
}
|
||||||
@@ -399,10 +404,16 @@ sub make_row {
|
|||||||
return "$verb INTO $self->{dst_db_tbl}("
|
return "$verb INTO $self->{dst_db_tbl}("
|
||||||
. join(', ', map { $q->quote($_) } @cols)
|
. join(', ', map { $q->quote($_) } @cols)
|
||||||
. ') VALUES ('
|
. ') VALUES ('
|
||||||
. join(', ', map {
|
. join(', ',
|
||||||
|
map {
|
||||||
my $is_char = ($type_for->{$_} || '') =~ m/char|text/i;
|
my $is_char = ($type_for->{$_} || '') =~ m/char|text/i;
|
||||||
$q->quote_val($row->{$_},
|
my $is_float = ($type_for->{$_} || '') =~ m/float|double/i;
|
||||||
is_char => $is_char) } @cols )
|
$q->quote_val(
|
||||||
|
$row->{$_},
|
||||||
|
is_char => $is_char,
|
||||||
|
is_float => $is_float,
|
||||||
|
)
|
||||||
|
} @cols)
|
||||||
. ')';
|
. ')';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -421,8 +432,10 @@ sub make_where_clause {
|
|||||||
my $val = $row->{$_};
|
my $val = $row->{$_};
|
||||||
my $sep = defined $val ? '=' : ' IS ';
|
my $sep = defined $val ? '=' : ' IS ';
|
||||||
my $is_char = ($self->{tbl_struct}->{type_for}->{$_} || '') =~ m/char|text/i;
|
my $is_char = ($self->{tbl_struct}->{type_for}->{$_} || '') =~ m/char|text/i;
|
||||||
|
my $is_float = ($self->{tbl_struct}->{type_for}->{$_} || '') =~ m/float|double/i;
|
||||||
$self->{Quoter}->quote($_) . $sep . $self->{Quoter}->quote_val($val,
|
$self->{Quoter}->quote($_) . $sep . $self->{Quoter}->quote_val($val,
|
||||||
is_char => $is_char);
|
is_char => $is_char,
|
||||||
|
is_float => $is_float);
|
||||||
} @$cols;
|
} @$cols;
|
||||||
return join(' AND ', @clauses);
|
return join(' AND ', @clauses);
|
||||||
}
|
}
|
||||||
|
@@ -77,6 +77,9 @@ sub quote_val {
|
|||||||
return $val if $val =~ m/^0x[0-9a-fA-F]+$/ # quote hex data
|
return $val if $val =~ m/^0x[0-9a-fA-F]+$/ # quote hex data
|
||||||
&& !$args{is_char}; # unless is_char is true
|
&& !$args{is_char}; # unless is_char is true
|
||||||
|
|
||||||
|
# https://bugs.launchpad.net/percona-toolkit/+bug/1229861
|
||||||
|
return $val if $args{is_float};
|
||||||
|
|
||||||
# Quote and return non-numeric vals.
|
# Quote and return non-numeric vals.
|
||||||
$val =~ s/(['\\])/\\$1/g;
|
$val =~ s/(['\\])/\\$1/g;
|
||||||
return "'$val'";
|
return "'$val'";
|
||||||
|
@@ -48,7 +48,7 @@ $output = `$trunk/bin/pt-table-sync --sync-to-master h=127.1,P=12346,u=msandbox,
|
|||||||
$output = remove_traces($output);
|
$output = remove_traces($output);
|
||||||
is(
|
is(
|
||||||
$output,
|
$output,
|
||||||
"REPLACE INTO `test`.`fl`(`id`, `f`, `d`) VALUES ('1', '1.0000011921', '2.0000012');
|
"REPLACE INTO `test`.`fl`(`id`, `f`, `d`) VALUES ('1', 1.0000011921, 2.0000012);
|
||||||
",
|
",
|
||||||
'No --float-precision so double col diff at high precision (issue 410)'
|
'No --float-precision so double col diff at high precision (issue 410)'
|
||||||
);
|
);
|
||||||
|
Reference in New Issue
Block a user