Skip to content

Fix mysql procedure audit#3093

Merged
Jarvis1105 merged 3 commits intomainfrom
fix_mysql_procedure_audit
Jul 23, 2025
Merged

Fix mysql procedure audit#3093
Jarvis1105 merged 3 commits intomainfrom
fix_mysql_procedure_audit

Conversation

@iwanghc
Copy link
Copy Markdown
Collaborator

@iwanghc iwanghc commented Jul 23, 2025

User description

关联的 issue

issue:#3092

描述你的变更

  1. 修复MySQL存储过程上线审核报错,使用Splitter Parse来获取SQL指纹
  2. 增强MySQL 拆分器中的 CASE 块匹配逻辑以处理嵌套控制流语句

确认项(pr提交后操作)

Tip

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


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


Description

  • 修改Fingerprint调用,确保正确指纹解析

  • 优化CASE块匹配逻辑处理嵌套

  • 改进BEGIN...END块及IF判断逻辑

  • 添加单元测试验证CASE语句处理


Diagram Walkthrough

flowchart LR
  A["修改Fingerprint方法"]
  B["优化CASE匹配逻辑"]
  C["改进嵌套块处理"]
  D["添加单元测试"]
  A --> B
  B --> C
  C --> D
Loading

File Walkthrough

Relevant files
Enhancement
mysql.go
修改Fingerprint调用方式                                                                               

sqle/driver/mysql/mysql.go

  • 替换Fingerprint为FingerprintByParser
  • 提高SQL指纹解析准确性
+1/-1     
block.go
CASE块判断逻辑优化                                                                                           

sqle/driver/mysql/splitter/block.go

  • 优化CASE块结束判断逻辑
  • 增加对嵌套控制流判断支持
+24/-2   
splitter.go
嵌套块处理及IF判断优化                                                                                         

sqle/driver/mysql/splitter/splitter.go

  • 新增IF块判断逻辑及Token回滚
  • 改进BEGIN...END块嵌套处理
+24/-1   
parser_helper.go
添加FingerprintByParser函数                                                                   

sqle/driver/mysql/util/parser_helper.go

  • 新增FingerprintByParser函数
  • 使用Parser节点进行SQL恢复
+16/-0   
Tests
splitter_test.go
新增CASE块单元测试                                                                                           

sqle/driver/mysql/splitter/splitter_test.go

  • 添加多种CASE语句处理测试
  • 验证BEGIN块内CASE和多语句分割
+75/-0   

@github-actions
Copy link
Copy Markdown

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
Possible issue
添加空值检查

建议在调用 nextToken.Ident() 之前先判断 nextToken 是否为 nil,防止潜在的空指针解引用导致 panic。可以在获取 token
后立即进行非空检查,并针对获取不到 token 的情况设计合理的处理方法。

sqle/driver/mysql/splitter/splitter.go [189-199]

 if _, ok := matchedBlock.(IfEndIfBlock); ok {
     // 向前看一个 token
     nextToken := s.scanner.NextToken()
     // **非常重要**:将扫描器位置恢复,以便后续逻辑可以重新处理这个 token
     s.scanner.SetCursor(currentOffset)
 
-    if nextToken.Ident() == "(" {
+    if nextToken != nil && nextToken.Ident() == "(" {
         // 如果 IF 后面是 '(',说明是 IF() 函数,而不是块语句,继续处理下一个 token。
+    } else if nextToken != nil {
+        blockStack = append(blockStack, matchedBlock)
     } else {
+        // 根据业务需求处理获取不到 token 的情况,比如直接加入块或返回错误
         blockStack = append(blockStack, matchedBlock)
     }
 }
Suggestion importance[1-10]: 7

__

Why: The suggestion enhances robustness by adding a nil check before calling nextToken.Ident(), preventing a potential panic. This is a minor error handling improvement without drastically altering the existing logic.

Medium

@Jarvis1105 Jarvis1105 merged commit 85e0c80 into main Jul 23, 2025
4 checks passed
@Jarvis1105 Jarvis1105 deleted the fix_mysql_procedure_audit branch July 23, 2025 08:00
@iwanghc iwanghc restored the fix_mysql_procedure_audit branch July 23, 2025 08:13
@iwanghc iwanghc deleted the fix_mysql_procedure_audit branch July 23, 2025 08:14
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.

2 participants