4.1.x版本遇到Decimal数据类型报错[NOT_IMPLEMENTED_ERROR]Wrong precision 0, min: 1, max: 76

Viewed 37

数据库表是从2.x升级到3.1.x,最近升级到4.1.x,然后所有decimal类型的字段,查询都报错:
[NOT_IMPLEMENTED_ERROR]Wrong precision 0, min: 1, max: 76

可能类似这个问题:4.1.2 ReleaseNote中提到的

处理缺失 precision/frac 的遗留 DecimalV2 segment (#63569)

现在无法对其这个表有任何补救措施,试过备份、恢复等等,无法解决,一查询就报这个错误。

盼修复,谢谢!

2 Answers

查询的时候,比如手动cast(xxx as decimal(x,y)) 这种,可行吗?

您可以加我主页微信,把fe.log和建表语句,都发我一下的

检查了fe的metaData,字符类型是decimal(18,3),建表也没错,确认是BE中的问题。
使用cast转换查询也不行。export导出也是报这个错误,备份后还原到另外一个新表也是这个报错,尝试各种方法,结论就是没办法以任何方式读取出来数据,整个表只要查询包含decimal类型就报错,不含则可以查询查出。

重点就是这个表是从老版本一路升级过来的,be中保存的字段属性可能有缺失,在4.x版本中没有没有被兼容处理,和那个issue#63569类似。

环境

  • Doris 版本: 4.1.2-rc01
  • 升级路径: 3.1.4 → 4.0.4 → 4.1.2

问题描述

从 3.1.4 升级到 4.1.2 后,对包含 DECIMAL32/64/128I/256 列的表执行查询时报错:

[NOT_IMPLEMENTED_ERROR] Wrong precision 0, min: 1, max: 76

所有数据访问路径均受影响:SELECT、INSERT INTO ... SELECT、ALTER TABLE MODIFY COLUMN、ADMIN COMPACT TABLE。

根因

Doris 2.1.0 之前版本(PR #26572 之前)写入的段文件中,ColumnMetaPB 不持久化 precision/frac 字段,protobuf 反序列化时默认为 0。

PR #63569 针对 OLAP_FIELD_TYPE_DECIMAL (DECIMALV2) 增加了兼容修复(传入 UINT32_MAX 表示"未知精度")。但 #26572 引入的新 Decimal 类型(DECIMAL32/64/128I/256)存在同样问题,且未被 PR #63569 覆盖。

修复建议

在 data_type_factory.cpp 的 _create_primitive_data_type() 和 create_data_type(PrimitiveType, ...) 中,当 DECIMAL32/64/128I/256 的 precision ≤ 0 时,回退为对应类型的最大精度(9/18/38/76)。