decimal相乘结果为null

【详述】一个表里有两个类型为decimal(38,18)的字段,select相乘的结果为null
【StarRocks版本】例如:2.1.6
【复现sql】

CREATE TABLE tmp.issue_tmp (
id varchar(1048576) NULL COMMENT “”,
left_value decimal128(38, 18) NULL COMMENT “”,
right_value decimal128(38, 18) NULL COMMENT “”
) ENGINE=OLAP
DUPLICATE KEY(id)
COMMENT “OLAP”
DISTRIBUTED BY HASH(id) BUCKETS 10
PROPERTIES (
“replication_num” = “1”,
“in_memory” = “false”,
“storage_format” = “DEFAULT”,
“enable_persistent_index” = “false”
);

INSERT INTO tmp.issue_tmp (id, left_value, right_value) VALUES (‘te12312312344’, 1104.061225000000000000, 3.141592600000000000);
INSERT INTO tmp.issue_tmp (id, left_value, right_value) VALUES (‘test1’, 1104.061225000000000000, 2.000000000000000000);
INSERT INTO tmp.issue_tmp (id, left_value, right_value) VALUES (‘test1’, 1104.061225000000000000, 2.000000000000000000);
INSERT INTO tmp.issue_tmp (id, left_value, right_value) VALUES (‘test1’, 1104.061225000000000000, 2.000000000000000000);
INSERT INTO tmp.issue_tmp (id, left_value, right_value) VALUES (‘te12312312345’, 1104.061225000000000000, 3.141592600000000000);
INSERT INTO tmp.issue_tmp (id, left_value, right_value) VALUES (‘te123123123’, 1104.061225000000000000, 2.000000000000000000);
INSERT INTO tmp.issue_tmp (id, left_value, right_value) VALUES (‘test’, 19104.061225000000000000, 1.000000000000000000);

select left_value * issue_tmp.right_value
from issue_tmp;

结果全部为null

我查询了文档貌似是精度溢出的问题,但是实际上用例几个的计算结果不会有溢出的情况,在mysql中也能正常查出结果。

请问下咱们的场景是强需求这种高精度么?如果不是的话可以

select cast(left_value as double) * issue_tmp.right_value
from issue_tmp;

确实是强需求高精度。属于交易相关业务。

目前现状是这样的,后续我们也会做精度更高的。这个可以去github上面提个issue。

我理解的实际用例里面的计算结果是没有超出decimal(38,18)这个限制的。但是为什么也是得到了null的结果呢?有没有一个方法或者配置可以达到即使超出了限制也保留有效位数的效果吗?

decimal 乘法是看schema的,跟具体数据无关。
比如 decimal(4, 2) * decimal(4, 3)
22.22 x 2.222 = 49.37284 -> decimal(7, 5)
你的数据假如是 1.1 * 2.2 那在这个schema 下也是看成 1.10 * 2.200 了
所以当你的两个列是 decimal(38, 18) * decimal(38, 18) 需要最少 decimal(38 + 18, 18) 才能装下精确的结果,自然就溢出了

是的,溢出的这个是理解的。但是我觉得如果小数部分溢出的话,其实可以考虑有个配置可以保留最大的位数的有效数字或者为null。比如假设数据库最大是decimal(4,4)。我这个时候有一个22.22*22.222的计算,本来等于49.37284。因为最大限制是decimal(4,4),这个时候sql结果应该返回49.3728。
我在aws的rds里执行这种类似的查询,他就是这样做的。
这个是rds里执行的sql和结果