【 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),也是精度变得更大了,字段是没有被截断的
原本想找源码看看,但是无从找起
我还试了一下,从decimal(10,0) 到decimal(11,0) 也是不支持的。
但是varchar(20)改成varchar(30)是可以的,改成varchar(10)不行
这个本来就是标准预期 ,字段只能扩不能缩
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。 收到相关回复后 ,看过代码了 源码pkg/ddl/ddl_api.go 这边报错拦截了
去看needChangeColumnData函数,发现实际上源码应该是做了decimal扩容检验的。然后再判断相同类型变更的时候,直接return true了。看了注释,那非分区表怎么变更的呢?