From 4c3fc5d3e6eceddd38b2f66b9afaeff72a9ed88e Mon Sep 17 00:00:00 2001 From: llh <1695316070@qq.com> Date: Fri, 23 May 2025 01:05:04 +0800 Subject: [PATCH 1/2] =?UTF-8?q?FIX=EF=BC=9Arule=5F00112=20=E4=B8=ADbigint?= =?UTF-8?q?=E5=92=8C=E6=95=B4=E6=95=B0=E8=AF=AF=E8=A7=A6=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sqle/driver/mysql/rule/ai/rule_00112.go | 64 ++++++++++++------------- sqle/driver/mysql/rule_00112_test.go | 6 +++ 2 files changed, 37 insertions(+), 33 deletions(-) diff --git a/sqle/driver/mysql/rule/ai/rule_00112.go b/sqle/driver/mysql/rule/ai/rule_00112.go index 7aa93cbb35..bc1e906f72 100644 --- a/sqle/driver/mysql/rule/ai/rule_00112.go +++ b/sqle/driver/mysql/rule/ai/rule_00112.go @@ -12,7 +12,6 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/opcode" - "github.com/pingcap/tidb/types" parserdriver "github.com/pingcap/tidb/types/parser_driver" "github.com/actiontech/sqle/sqle/driver/mysql/plocale" @@ -96,6 +95,16 @@ func RuleSQLE00112(input *rulepkg.RuleHandlerInput) error { return defaultTable } + // 内部辅助函数:判断TP是否为整数类型 + isIntegerType := func(tp byte) bool { + switch tp { + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: + return true + default: + return false + } + } + // 内部辅助函数:获取表达式的类型 getExprType := func(expr ast.ExprNode) (byte, error) { switch node := expr.(type) { @@ -131,32 +140,9 @@ func RuleSQLE00112(input *rulepkg.RuleHandlerInput) error { } return 0, fmt.Errorf("不支持的函数: %s", strings.Join(names, ".")) case *parserdriver.ValueExpr: - 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()) - } + // 处理常量表达式 + return node.Type.Tp, nil + default: return 0, fmt.Errorf("不支持的表达式类型: %T", expr) } @@ -225,8 +211,12 @@ func RuleSQLE00112(input *rulepkg.RuleHandlerInput) error { // 比较类型是否一致 if leftType != rightType { - // 报告违规 - rulepkg.AddResult(input.Res, input.Rule, SQLE00112) + //如果不都是整数类型 + if !(isIntegerType(leftType) && isIntegerType(rightType)) { + // 报告违规 + rulepkg.AddResult(input.Res, input.Rule, SQLE00112) + } + } return false }, expr) @@ -311,8 +301,12 @@ func RuleSQLE00112(input *rulepkg.RuleHandlerInput) error { // 比较类型是否一致 if leftType != rightType { - // 报告违规 - rulepkg.AddResult(input.Res, input.Rule, SQLE00112) + //如果不都是整数类型 + if !(isIntegerType(leftType) && isIntegerType(rightType)) { + // 报告违规 + rulepkg.AddResult(input.Res, input.Rule, SQLE00112) + } + } return false }, expr) @@ -368,8 +362,12 @@ func RuleSQLE00112(input *rulepkg.RuleHandlerInput) error { // 比较类型是否一致 if leftType != rightType { - // 报告违规 - rulepkg.AddResult(input.Res, input.Rule, SQLE00112) + //如果不都是整数类型 + if !(isIntegerType(leftType) && isIntegerType(rightType)) { + // 报告违规 + rulepkg.AddResult(input.Res, input.Rule, SQLE00112) + } + } return false }, expr) diff --git a/sqle/driver/mysql/rule_00112_test.go b/sqle/driver/mysql/rule_00112_test.go index 70fea00f62..b6f4fd1472 100644 --- a/sqle/driver/mysql/rule_00112_test.go +++ b/sqle/driver/mysql/rule_00112_test.go @@ -185,6 +185,12 @@ func TestRuleSQLE00112(t *testing.T) { session.NewAIMockContext().WithSQL("CREATE TABLE orders (c_id VARCHAR(100), order_date DATE);"). WithSQL("CREATE TABLE customers (c_id INT, name VARCHAR(100));"), nil, newTestResult().addResult(ruleName)) + + runAIRuleCase(rule, t, "case 33: UPDATE语句中WHERE子句比较t1.id (bigint)与常量2838923,预期通过", + "UPDATE t1 SET name = 'jack' WHERE id = 2838923;", + session.NewAIMockContext().WithSQL("CREATE TABLE t1 (id BIGINT UNSIGNED not null, name VARCHAR(100));"), + nil, newTestResult()) + } // ==== Rule test code end ==== From 0afe7c941103af4a0c78019032d22d460a23967d Mon Sep 17 00:00:00 2001 From: llh <1695316070@qq.com> Date: Tue, 3 Jun 2025 15:41:15 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix=EF=BC=9A=E5=8D=95=E5=85=83=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=8F=8F=E8=BF=B0=E4=B8=8D=E6=AD=A3=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sqle/driver/mysql/rule_00108_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqle/driver/mysql/rule_00108_test.go b/sqle/driver/mysql/rule_00108_test.go index 32fa2bad9e..ebfa931bc2 100644 --- a/sqle/driver/mysql/rule_00108_test.go +++ b/sqle/driver/mysql/rule_00108_test.go @@ -61,7 +61,7 @@ func TestRuleSQLE00108(t *testing.T) { // "WITH CTE AS (SELECT * FROM exist_db.exist_tb_1 WHERE id IN (SELECT id FROM exist_db.exist_tb_1 WHERE id IN (SELECT id FROM exist_db.exist_tb_1 WHERE id IN (SELECT id FROM exist_db.exist_tb_1 WHERE id IN (SELECT id FROM exist_db.exist_tb_1 WHERE id = 'value'))))) SELECT * FROM CTE", // nil, nil, newTestResult()) - runAIRuleCase(rule, t, "case 13_tes: SELECT语句where中包含6层嵌套子查询,使用示例中的表结构", + runAIRuleCase(rule, t, "case 13: SELECT语句from中包含2层嵌套子查询,使用示例中的表结构", "SELECT AVG(subquery_middle.subquery_grade) AS subquery_middle_avg FROM (SELECT grade AS subquery_grade FROM st1 WHERE st1.cid IN (SELECT cid FROM st_class WHERE cname = 'class2')) subquery_middle;", session.NewAIMockContext().WithSQL("CREATE TABLE st1 (id bigint, name VARCHAR(32), cid bigint, grade NUMERIC); CREATE TABLE st_class (cid bigint, cname VARCHAR(32));"), nil, newTestResult())