Skip to content

FIX:rule_00112 中bigint和整数误触发 #3051

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

huajianxiaowanzi
Copy link

@huajianxiaowanzi huajianxiaowanzi commented May 23, 2025

关联的 issue

#3049

描述你的变更

  • 简化类型判断逻辑:将对常量类型的判断(parserdriver.ValueExpr)由原来的 Datum.Kind() 方式,统一改为直接取 node.Type.Tp。
  • 增加了整数类型宽松判断:对于比较类型不同的场景,如果两个类型都属于整数类型(如 tinyint, int, bigint 等),则认为通过,不再报违规。
  • 新增了单元测试:将issue中误触发的sql加入测试用例

确认项(pr提交后操作)

Tip

请在指定复审人之前,确认并完成以下事项,完成后✅


  • 我已完成自测
  • 我已记录完整日志方便进行诊断
  • 我已在关联的issue里补充了实现方案
  • 我已在关联的issue里补充了测试影响面
  • 我已确认了变更的兼容性,如果不兼容则在issue里标记 not_compatible
  • 我已确认了是否要更新文档,如果要更新则在issue里标记 need_update_doc

@CLAassistant
Copy link

CLAassistant commented May 23, 2025

CLA assistant check
All committers have signed the CLA.

@ColdWaterLW ColdWaterLW requested a review from BugsGuru June 17, 2025 02:53
Comment on lines -134 to -159
switch node.Datum.Kind() {
case types.KindInt64, types.KindUint64:
return mysql.TypeLong, nil
case types.KindFloat32, types.KindFloat64:
return mysql.TypeDouble, nil
case types.KindString:
return mysql.TypeVarchar, nil
case types.KindBytes:
return mysql.TypeBlob, nil
case types.KindBinaryLiteral:
return mysql.TypeBit, nil
case types.KindMysqlDecimal:
return mysql.TypeNewDecimal, nil
case types.KindMysqlDuration:
return mysql.TypeDuration, nil
case types.KindMysqlTime:
return mysql.TypeDatetime, nil
case types.KindMysqlEnum:
return mysql.TypeEnum, nil
case types.KindMysqlSet:
return mysql.TypeSet, nil
case types.KindMysqlJSON:
return mysql.TypeJSON, nil
default:
return 0, fmt.Errorf("不支持的常量类型: %d", node.Datum.Kind())
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

我们来理解一下这一条规则的用意:
在 MySQL 中,禁止WHERE子句中条件字段与值的数据类型不一致的一个原因有一些:

  1. 避免隐式类型转换带来的性能问题:SELECT * FROM users WHERE user_id = '123'; -- 索引失效
  2. 导致结果不准确或难以预料:SELECT * FROM users WHERE name = 123; -- 结果可能是错误的

从原始的代码上看,如:types.KindInt64, types.KindUint64,这两种类型都被认为是同一种,需要确认:

  1. 整数类型之间的比较一定不产生隐式转换吗?

@winfredLIN winfredLIN requested review from winfredLIN and removed request for BugsGuru June 17, 2025 07:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants