From 8f5293bc6e2e59719e2146d3a6fe65c30b10f5d6 Mon Sep 17 00:00:00 2001 From: AestheticAkhmad Date: Sat, 3 May 2025 17:18:31 +0200 Subject: [PATCH 1/4] fix(MCOL-4628): SET double_col=decimal_col returns an error --- .../columnstore/bugfixes/mcol_4628.result | 53 +++++++++++++++ .../columnstore/bugfixes/mcol_4628.test | 66 +++++++++++++++++++ tests/dataconvert-tests.cpp | 16 ++--- utils/dataconvert/dataconvert.cpp | 28 ++++---- 4 files changed, 144 insertions(+), 19 deletions(-) create mode 100644 mysql-test/columnstore/bugfixes/mcol_4628.result create mode 100644 mysql-test/columnstore/bugfixes/mcol_4628.test diff --git a/mysql-test/columnstore/bugfixes/mcol_4628.result b/mysql-test/columnstore/bugfixes/mcol_4628.result new file mode 100644 index 0000000000..4152067aa4 --- /dev/null +++ b/mysql-test/columnstore/bugfixes/mcol_4628.result @@ -0,0 +1,53 @@ +DROP DATABASE IF EXISTS mcol_4628; +CREATE DATABASE mcol_4628; +USE mcol_4628; +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (i INT, d DOUBLE) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (0, 1.5); +UPDATE t1 SET i=d; +SELECT * FROM t1; +i d +2 1.5 +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (i INT, d DOUBLE) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (0, 1.7); +UPDATE t1 SET i=d; +SELECT * FROM t1; +i d +2 1.7 +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (i INT, d DOUBLE) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (0, 1.4); +UPDATE t1 SET i=d; +SELECT * FROM t1; +i d +1 1.4 +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (i INT, d DOUBLE) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (0, -0.5); +UPDATE t1 SET i=d; +SELECT * FROM t1; +i d +0 -0.5 +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (i INT UNSIGNED, d DOUBLE) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (0, 0.5); +UPDATE t1 SET i=d; +SELECT * FROM t1; +i d +1 0.5 +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (i INT UNSIGNED, d DOUBLE) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (0, 1.5); +UPDATE t1 SET i=d; +SELECT * FROM t1; +i d +2 1.5 +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (i INT UNSIGNED, d DOUBLE) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (0, 1.4); +UPDATE t1 SET i=d; +SELECT * FROM t1; +i d +1 1.4 +DROP DATABASE mcol_4628; diff --git a/mysql-test/columnstore/bugfixes/mcol_4628.test b/mysql-test/columnstore/bugfixes/mcol_4628.test new file mode 100644 index 0000000000..99f04aa5cd --- /dev/null +++ b/mysql-test/columnstore/bugfixes/mcol_4628.test @@ -0,0 +1,66 @@ +-- source ../include/have_columnstore.inc +--disable_warnings +DROP DATABASE IF EXISTS mcol_4628; +--enable_warnings +CREATE DATABASE mcol_4628; +USE mcol_4628; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +CREATE TABLE t1 (i INT, d DOUBLE) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (0, 1.5); +UPDATE t1 SET i=d; +SELECT * FROM t1; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +CREATE TABLE t1 (i INT, d DOUBLE) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (0, 1.7); +UPDATE t1 SET i=d; +SELECT * FROM t1; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +CREATE TABLE t1 (i INT, d DOUBLE) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (0, 1.4); +UPDATE t1 SET i=d; +SELECT * FROM t1; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +CREATE TABLE t1 (i INT, d DOUBLE) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (0, -0.5); +UPDATE t1 SET i=d; +SELECT * FROM t1; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +CREATE TABLE t1 (i INT UNSIGNED, d DOUBLE) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (0, 0.5); +UPDATE t1 SET i=d; +SELECT * FROM t1; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +CREATE TABLE t1 (i INT UNSIGNED, d DOUBLE) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (0, 1.5); +UPDATE t1 SET i=d; +SELECT * FROM t1; + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +CREATE TABLE t1 (i INT UNSIGNED, d DOUBLE) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (0, 1.4); +UPDATE t1 SET i=d; +SELECT * FROM t1; + +--disable_warnings +DROP DATABASE mcol_4628; +--enable_warnings diff --git a/tests/dataconvert-tests.cpp b/tests/dataconvert-tests.cpp index 627f3eed2f..789d846a65 100644 --- a/tests/dataconvert-tests.cpp +++ b/tests/dataconvert-tests.cpp @@ -187,7 +187,7 @@ TEST(DataConvertTest, NumberIntValue) pushWarning = false; number_int_value(data, typecode, ct, pushWarning, noRoundup, res); EXPECT_EQ(res, 12); - EXPECT_TRUE(pushWarning); + EXPECT_FALSE(pushWarning); data = "-1234"; pushWarning = false; number_int_value(data, typecode, ct, pushWarning, noRoundup, res); @@ -197,7 +197,7 @@ TEST(DataConvertTest, NumberIntValue) pushWarning = false; number_int_value(data, typecode, ct, pushWarning, noRoundup, res); EXPECT_EQ(res, -12); - EXPECT_TRUE(pushWarning); + EXPECT_FALSE(pushWarning); // test max data = "99999999999999999999999999999999999999"; valMax = ((((((((int128_t)999999999 * 1000000000) + 999999999) * 1000000000) + 999999999) * 1000000000) + @@ -234,12 +234,12 @@ TEST(DataConvertTest, NumberIntValue) pushWarning = false; number_int_value(data, typecode, ct, pushWarning, noRoundup, res); EXPECT_EQ(res, 13); - EXPECT_TRUE(pushWarning); + EXPECT_FALSE(pushWarning); data = "-12.56"; pushWarning = false; number_int_value(data, typecode, ct, pushWarning, noRoundup, res); EXPECT_EQ(res, -13); - EXPECT_TRUE(pushWarning); + EXPECT_FALSE(pushWarning); // test saturation data = "999999999999999999999999999999999999999"; // data has 39 9's // valMax has 38 9's @@ -367,12 +367,12 @@ TEST(DataConvertTest, NumberIntValue) pushWarning = false; number_int_value(data, typecode, ct, pushWarning, noRoundup, res); EXPECT_EQ(res, 121111111112); - EXPECT_TRUE(pushWarning); + EXPECT_FALSE(pushWarning); data = "-12.11111111119"; pushWarning = false; number_int_value(data, typecode, ct, pushWarning, noRoundup, res); EXPECT_EQ(res, -121111111112); - EXPECT_TRUE(pushWarning); + EXPECT_FALSE(pushWarning); // test saturation data = "99999999999999999999999999999"; // data has 29 9's // valMax has 38 9's @@ -532,7 +532,7 @@ TEST(DataConvertTest, NumberIntValue) b4 = *(reinterpret_cast(&valMax) + 1); EXPECT_EQ(b1, b3); EXPECT_EQ(b2, b4); - EXPECT_TRUE(pushWarning); + EXPECT_FALSE(pushWarning); data = "-0.199999999999999999999999999999999999999"; valMax = ((((((((int128_t)200000000 * 1000000000) + 0) * 1000000000) + 0) * 1000000000) + 0) * 100) + 0; valMax = -valMax; @@ -544,7 +544,7 @@ TEST(DataConvertTest, NumberIntValue) b4 = *(reinterpret_cast(&valMax) + 1); EXPECT_EQ(b1, b3); EXPECT_EQ(b2, b4); - EXPECT_TRUE(pushWarning); + EXPECT_FALSE(pushWarning); // test saturation data = "99999999999999999999999999999"; // data has 29 9's // valMax has 38 9's diff --git a/utils/dataconvert/dataconvert.cpp b/utils/dataconvert/dataconvert.cpp index fb21923dde..878fd9ffe7 100644 --- a/utils/dataconvert/dataconvert.cpp +++ b/utils/dataconvert/dataconvert.cpp @@ -239,6 +239,7 @@ void number_int_value(const string& data, cscDataType typeCode, string frnStr = ""; size_t dp = valStr.find('.'); int roundup = 0; + bool isNegative = valStr.find('-') != string::npos; if (dp != string::npos) { @@ -260,13 +261,16 @@ void number_int_value(const string& data, cscDataType typeCode, } intVal = dataconvert::string_to_ll(intStr, pushwarning); - //@Bug 3350 negative value round up. - intVal += intVal >= 0 ? roundup : -roundup; - bool dummy = false; - T frnVal = (frnStr.length() > 0) ? dataconvert::string_to_ll(frnStr, dummy) : 0; - if (frnVal != 0) - pushwarning = true; + if (intVal == 0 && isNegative) + { + if (roundup == 1) + roundup = 0; + } + else + { + intVal += intVal >= 0 ? roundup : -roundup; + } switch (typeCode) { @@ -593,11 +597,13 @@ uint64_t number_uint_value(const string& data, cscDataType typeCode, uint64_t uintVal = dataconvert::string_to_ull(intStr, pushwarning); - bool dummy = false; - uint64_t frnVal = (frnStr.length() > 0) ? dataconvert::string_to_ull(frnStr, dummy) : 0; - - if (frnVal != 0) - pushwarning = true; + if (!frnStr.empty() && !noRoundup) + { + if (!frnStr.empty() && frnStr[0] >= '5') + { + uintVal += 1; + } + } switch (typeCode) { From 68b2f3ed0ca5f7980b4fd14b7b642d6ab0c4d80b Mon Sep 17 00:00:00 2001 From: AestheticAkhmad Date: Fri, 23 May 2025 12:21:55 +0200 Subject: [PATCH 2/4] Uncomment noRoundup var in number_uint_value --- utils/dataconvert/dataconvert.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/dataconvert/dataconvert.cpp b/utils/dataconvert/dataconvert.cpp index ff135b0fcb..90eee2b175 100644 --- a/utils/dataconvert/dataconvert.cpp +++ b/utils/dataconvert/dataconvert.cpp @@ -500,7 +500,7 @@ template void number_int_value(const std::string& data, cscDataType ty uint64_t number_uint_value(const string& data, cscDataType typeCode, const datatypes::SystemCatalog::TypeAttributesStd& /*ct*/, bool& pushwarning, - bool /*noRoundup*/) + bool noRoundup) { // copy of the original input string valStr(data); From 3000a2d1c7cf6a147c93aaca3188d116388a69f5 Mon Sep 17 00:00:00 2001 From: AestheticAkhmad Date: Sun, 8 Jun 2025 16:11:52 +0200 Subject: [PATCH 3/4] Perform conversion to DECIMAL if constant column has scale > 0 --- dbcon/joblist/jlf_execplantojoblist.cpp | 9 ++++++++- mysql-test/columnstore/bugfixes/mcol_4628.result | 12 ++++++++++++ mysql-test/columnstore/bugfixes/mcol_4628.test | 10 ++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/dbcon/joblist/jlf_execplantojoblist.cpp b/dbcon/joblist/jlf_execplantojoblist.cpp index 91d8d8afca..1ae9b03e19 100644 --- a/dbcon/joblist/jlf_execplantojoblist.cpp +++ b/dbcon/joblist/jlf_execplantojoblist.cpp @@ -1743,11 +1743,18 @@ const JobStepVector doSimpleFilter(SimpleFilter* sf, JobInfo& jobInfo) #else bool isNull = cc->isNull(); - if (ct.isWideDecimalType()) + { convertValueNum(constval.safeString(""), ct, isNull, rf, jobInfo.timeZone, value128); + } + else if (cc->resultType().colDataType == CalpontSystemCatalog::DECIMAL && cc->resultType().scale > 0) + { + convertValueNum(constval.safeString(""), cc->resultType(), isNull, rf, jobInfo.timeZone, value); + } else + { convertValueNum(constval.safeString(""), ct, isNull, rf, jobInfo.timeZone, value); + } if (ct.colDataType == CalpontSystemCatalog::FLOAT && !isNull) { diff --git a/mysql-test/columnstore/bugfixes/mcol_4628.result b/mysql-test/columnstore/bugfixes/mcol_4628.result index 4152067aa4..5179800193 100644 --- a/mysql-test/columnstore/bugfixes/mcol_4628.result +++ b/mysql-test/columnstore/bugfixes/mcol_4628.result @@ -50,4 +50,16 @@ UPDATE t1 SET i=d; SELECT * FROM t1; i d 1 1.4 +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (i SMALLINT) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (-762); +INSERT INTO t1 VALUES (-761); +INSERT INTO t1 VALUES (761); +INSERT INTO t1 VALUES (762); +SELECT * FROM t1 WHERE i > -762.5; +i +-762 +-761 +761 +762 DROP DATABASE mcol_4628; diff --git a/mysql-test/columnstore/bugfixes/mcol_4628.test b/mysql-test/columnstore/bugfixes/mcol_4628.test index 99f04aa5cd..5a3b7421c4 100644 --- a/mysql-test/columnstore/bugfixes/mcol_4628.test +++ b/mysql-test/columnstore/bugfixes/mcol_4628.test @@ -61,6 +61,16 @@ INSERT INTO t1 VALUES (0, 1.4); UPDATE t1 SET i=d; SELECT * FROM t1; +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +CREATE TABLE t1 (i SMALLINT) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (-762); +INSERT INTO t1 VALUES (-761); +INSERT INTO t1 VALUES (761); +INSERT INTO t1 VALUES (762); +SELECT * FROM t1 WHERE i > -762.5; + --disable_warnings DROP DATABASE mcol_4628; --enable_warnings From ac11b01189b8803d9ab53706375f12c3ac97093e Mon Sep 17 00:00:00 2001 From: AestheticAkhmad Date: Mon, 9 Jun 2025 17:58:49 +0200 Subject: [PATCH 4/4] Added additional testcase --- mysql-test/columnstore/bugfixes/mcol_4628.result | 12 ++++++++++++ mysql-test/columnstore/bugfixes/mcol_4628.test | 10 ++++++++++ 2 files changed, 22 insertions(+) diff --git a/mysql-test/columnstore/bugfixes/mcol_4628.result b/mysql-test/columnstore/bugfixes/mcol_4628.result index 5179800193..7750d731a6 100644 --- a/mysql-test/columnstore/bugfixes/mcol_4628.result +++ b/mysql-test/columnstore/bugfixes/mcol_4628.result @@ -62,4 +62,16 @@ i -761 761 762 +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (i SMALLINT) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (-762); +INSERT INTO t1 VALUES (-761); +INSERT INTO t1 VALUES (761); +INSERT INTO t1 VALUES (762); +SELECT * FROM t1 WHERE i > -762.2; +i +-762 +-761 +761 +762 DROP DATABASE mcol_4628; diff --git a/mysql-test/columnstore/bugfixes/mcol_4628.test b/mysql-test/columnstore/bugfixes/mcol_4628.test index 5a3b7421c4..fcc537de4a 100644 --- a/mysql-test/columnstore/bugfixes/mcol_4628.test +++ b/mysql-test/columnstore/bugfixes/mcol_4628.test @@ -71,6 +71,16 @@ INSERT INTO t1 VALUES (761); INSERT INTO t1 VALUES (762); SELECT * FROM t1 WHERE i > -762.5; +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +CREATE TABLE t1 (i SMALLINT) ENGINE=ColumnStore; +INSERT INTO t1 VALUES (-762); +INSERT INTO t1 VALUES (-761); +INSERT INTO t1 VALUES (761); +INSERT INTO t1 VALUES (762); +SELECT * FROM t1 WHERE i > -762.2; + --disable_warnings DROP DATABASE mcol_4628; --enable_warnings