From a465f31ab94c75ac939dfdd15733f22f25281de4 Mon Sep 17 00:00:00 2001 From: Jerry Hu Date: Mon, 15 Jul 2024 15:29:13 +0800 Subject: [PATCH] =?UTF-8?q?[fix](delete)=20Incorrect=20precision=20detecti?= =?UTF-8?q?on=20for=20the=20decimal=20type=20in=20condition.=E2=80=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- be/src/olap/utils.cpp | 13 ++++++++----- regression-test/data/delete_p0/test_delete.out | 3 ++- .../suites/delete_p0/test_delete.groovy | 16 +++++++++++++--- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/be/src/olap/utils.cpp b/be/src/olap/utils.cpp index 019a2f606ce647..aa641207b2329a 100644 --- a/be/src/olap/utils.cpp +++ b/be/src/olap/utils.cpp @@ -537,7 +537,7 @@ bool valid_signed_number(const std::string& value_str) { } bool valid_decimal(const std::string& value_str, const uint32_t precision, const uint32_t frac) { - const char* decimal_pattern = "-?\\d+(.\\d+)?"; + const char* decimal_pattern = "-?(\\d+)(.\\d+)?"; std::regex e(decimal_pattern); std::smatch what; 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 fractional_len = number_length - point_pos - 1; } - if (integer_len <= (precision - frac) && fractional_len <= frac) { - return true; - } else { - return false; + /// For value likes "0.xxxxxx", the integer_len should actually be 0. + if (integer_len == 1 && precision - frac == 0) { + if (what[1].str() == "0") { + integer_len = 0; + } } + + return (integer_len <= (precision - frac) && fractional_len <= frac); } bool valid_datetime(const std::string& value_str, const uint32_t scale) { diff --git a/regression-test/data/delete_p0/test_delete.out b/regression-test/data/delete_p0/test_delete.out index 33c6b773f9b72d..928a37b8c05083 100644 --- a/regression-test/data/delete_p0/test_delete.out +++ b/regression-test/data/delete_p0/test_delete.out @@ -149,4 +149,5 @@ ccc ccc 43 44 46 47 135.200 g t 2023-02-14 2023-02-14T00:01:02 false 22240.106 rr -- !check_decimal -- -true -1.0 10 \ No newline at end of file +true -1.0 10 0.7654321 + diff --git a/regression-test/suites/delete_p0/test_delete.groovy b/regression-test/suites/delete_p0/test_delete.groovy index a73755d2ff5463..77e54fe29153f6 100644 --- a/regression-test/suites/delete_p0/test_delete.groovy +++ b/regression-test/suites/delete_p0/test_delete.groovy @@ -524,7 +524,8 @@ suite("test_delete") { CREATE TABLE table_decimal ( `k1` BOOLEAN NOT NULL, `k2` DECIMAL(17, 1) NOT NULL, - `k3` INT NOT NULL + `k3` INT NOT NULL, + `k4` DECIMAL(7, 7) ) ENGINE=OLAP DUPLICATE KEY(`k1`,`k2`,`k3`) DISTRIBUTED BY HASH(`k1`,`k2`,`k3`) BUCKETS 4 @@ -535,13 +536,22 @@ suite("test_delete") { """ sql """ insert into table_decimal values - (false, '-9999782574499444.2', -20), - (true, '-1', 10); + (false, '-9999782574499444.2', -20, 0.1234567), + (true, '-1', 10, 0.7654321); """ sql """ delete from table_decimal where k1 = false and k2 = '-9999782574499444.2' and k3 = '-20'; """ + + sql """ + delete from table_decimal where k4 = '0.1234567'; + """ + + sql """ + delete from table_decimal where k4 = '-0.123'; + """ + qt_check_decimal """ select * from table_decimal; """