Skip to content

Commit 2ebb0c8

Browse files
mrhhsgseawinde
authored andcommitted
[fix](delete) Incorrect precision detection for the decimal type in condition.​ (apache#37801)
## Proposed changes For precision like Decimal(7,7), the value "0.1234567" should be valid(the integer part is 0).
1 parent f33c384 commit 2ebb0c8

File tree

3 files changed

+23
-9
lines changed

3 files changed

+23
-9
lines changed

be/src/olap/utils.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ bool valid_signed_number<int128_t>(const std::string& value_str) {
537537
}
538538

539539
bool valid_decimal(const std::string& value_str, const uint32_t precision, const uint32_t frac) {
540-
const char* decimal_pattern = "-?\\d+(.\\d+)?";
540+
const char* decimal_pattern = "-?(\\d+)(.\\d+)?";
541541
std::regex e(decimal_pattern);
542542
std::smatch what;
543543
if (!std::regex_match(value_str, what, e) || what[0].str().size() != value_str.size()) {
@@ -562,11 +562,14 @@ bool valid_decimal(const std::string& value_str, const uint32_t precision, const
562562
fractional_len = number_length - point_pos - 1;
563563
}
564564

565-
if (integer_len <= (precision - frac) && fractional_len <= frac) {
566-
return true;
567-
} else {
568-
return false;
565+
/// For value likes "0.xxxxxx", the integer_len should actually be 0.
566+
if (integer_len == 1 && precision - frac == 0) {
567+
if (what[1].str() == "0") {
568+
integer_len = 0;
569+
}
569570
}
571+
572+
return (integer_len <= (precision - frac) && fractional_len <= frac);
570573
}
571574

572575
bool valid_datetime(const std::string& value_str, const uint32_t scale) {

regression-test/data/delete_p0/test_delete.out

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,5 @@ ccc ccc
149149
43 44 46 47 135.200 g t 2023-02-14 2023-02-14T00:01:02 false 22240.106 rr
150150

151151
-- !check_decimal --
152-
true -1.0 10
152+
true -1.0 10 0.7654321
153+

regression-test/suites/delete_p0/test_delete.groovy

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,8 @@ suite("test_delete") {
524524
CREATE TABLE table_decimal (
525525
`k1` BOOLEAN NOT NULL,
526526
`k2` DECIMAL(17, 1) NOT NULL,
527-
`k3` INT NOT NULL
527+
`k3` INT NOT NULL,
528+
`k4` DECIMAL(7, 7)
528529
) ENGINE=OLAP
529530
DUPLICATE KEY(`k1`,`k2`,`k3`)
530531
DISTRIBUTED BY HASH(`k1`,`k2`,`k3`) BUCKETS 4
@@ -535,13 +536,22 @@ suite("test_delete") {
535536
"""
536537
sql """
537538
insert into table_decimal values
538-
(false, '-9999782574499444.2', -20),
539-
(true, '-1', 10);
539+
(false, '-9999782574499444.2', -20, 0.1234567),
540+
(true, '-1', 10, 0.7654321);
540541
"""
541542

542543
sql """
543544
delete from table_decimal where k1 = false and k2 = '-9999782574499444.2' and k3 = '-20';
544545
"""
546+
547+
sql """
548+
delete from table_decimal where k4 = '0.1234567';
549+
"""
550+
551+
sql """
552+
delete from table_decimal where k4 = '-0.123';
553+
"""
554+
545555
qt_check_decimal """
546556
select * from table_decimal;
547557
"""

0 commit comments

Comments
 (0)