源码阅读
1.首先安装goland
下载地址:Other Versions - GoLand (jetbrains.com)
我安装的时2023.2版本,原因不多说,你也可以用最新版,30天内免费,过期了买license
2.安装go
下载地址:All releases - The Go Programming Language (google.cn)
最新版就可以
3.下载tidb源码
下载地址:Releases · pingcap/tidb · GitHub
我下载的是6.5.10,因为我正在用这个版本,你想研究哪个版本就下载哪个版本
4.配置goland
设置-go-goroot配置你下载的go安装的地址,我的是F:\go\go
5.配置完成之后会自动下载modules dependencies
下载慢的话,打开powershell窗口设置goproxy
$env:GOPROXY = "https://goproxy.io,direct"
重新打开goland等待下载完成
完成之后大概是这样的
6.项目跑起来
找到tidb-server下的main.go文件
找到主函数
点击绿色的箭头,debug模式跑起来
7.本地连接tidb-server
注意root是没有密码的,直接连接就行
连接成功之后,你会发现执行
SELECT * FROM INFORMATION_SCHEMA.`TIKV_REGION_STATUS`;是无法查询到数据的,因为这个表必须要调用pd的api接口,而你的pd api并没有启动所以无法查询
而像这个就可以了,SELECT * FROM INFORMATION_SCHEMA.tables;
8.照官网的源码阅读攻略开始研究
9.发现bug,进行调试
参考链接分区表 decimal精度无法扩容 - TiDB 的问答社区 (asktug.com)
下载6.5.0版本的源码
然后按照上面的步骤开始调试,debug模式跑起来
然后开始执行对应bug的sql
查看日志:
最后发现是ddl/ddl_api.go对应内容
当执行列修改时,首先会检查是否需要改变列数据,具体的检查是通过 needChangeColumnData
函数来确定的。在这个函数中,如果检测到目标表是分区表(通过 t.Meta().Partition != nil
来判断),就会直接返回一个错误 ErrUnsupportedModifyColumn
,提示不支持修改列。
而调用的ddl/column.go下面的函数needChangeColumnData呢
其中对应内容是这样的
对于 DECIMAL 类型的列
- 检查精度 (
GetFlen()
)、小数位数 (GetDecimal()
) 是否发生变化,以及是否从有符号改为无符号 (toUnsigned != originUnsigned
)。 - 如果任何一个条件不满足,返回
true
,表示需要进行数据重组或变更。
也就是说,当你执行ALTER TABLE employees4 MODIFY COLUMN lid DECIMAL(20,4);对一个分区表的DECIMAL字段进行变更时,只要你精度、小数位数、以及符号有变化,即表示需要数据重组(实际像我测试的情况应该是不需要重组的),而当你需要数据重组时,只要检测对应的表示分区表,直接会返回报错,table is partition table,不允许修改,这样就确定了这个bug的源头。
这时我们看下6.5.10版本的对应代码:
说明这个bug还在,这时就只能提个issue等待tidb人员修复这个bug了。。。