分区表 decimal精度无法扩容

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】V6.5.0+
【复现路径】将分区表的decimal类型的字段从decimal(10,0) 变更到decimal(20,4) 报错:Unsupported modify column: table is partition table。按照官方文档的说明,好像也没有列类型变更呀

测试了下,还真的不可以,但是varchar类型是可以修改长度的,decimal类型比较特殊?

MySQL 我记得分区表 decimal 精度也不能直接修改吧。

普通表应该可以,分区表不行

varchar 只能变大,不能变小

decimal(10,0) 变更到decimal(20,4),也是精度变得更大了,字段是没有被截断的

原本想找源码看看,但是无从找起 :sweat_smile:

我还试了一下,从decimal(10,0) 到decimal(11,0) 也是不支持的。

但是varchar(20)改成varchar(30)是可以的,改成varchar(10)不行

这个本来就是标准预期 :joy:,字段只能扩不能缩

mark,之前真不知道有这个限制

所以说可能真是decimal这个字段类型比较特殊

mysql试了可以,tidb对于decimal的内部格式在pkg/types/mydecimal,看到有add方法,可能是还没完善?

根据你说的源码位置我看了,这个pkg/types/mydecimal 里面都是decimal类型的计算函数,我觉得应该实在ddl/column.go这个里面把

学习了

恩,应该是在您说的文件,onModifyColumn这个方法了。看看mysql是怎么做的去。

不支持,只能增加一列,然后update,删除那一列。在change

当前的产品限制,可以作为一个 enhancement 跟踪,Decimal type fields cannot be resized or precision improved within the partition table · Issue #54441 · pingcap/tidb · GitHub
后续产品会逐渐优化这个。限制分区表修改 partition 的 pr 是:ddl: restricting MODIFY COLUMN on partitioning columns. by mjonss · Pull Request #38670 · pingcap/tidb · GitHub

这个就是我提交的issue。 :joy:收到相关回复后 ,看过代码了 源码pkg/ddl/ddl_api.go 这边报错拦截了


去看needChangeColumnData函数,发现实际上源码应该是做了decimal扩容检验的。然后再判断相同类型变更的时候,直接return true了。看了注释,那非分区表怎么变更的呢?

主要是这里


如果needChangeColumnData是真就走到这里了,只要是分区表,直接就返回table is partition table报错了,非分区表才能正常走下去