Skip to content

fix: tolerate SQL audit parse and empty input failures#3332

Merged
Seechi-Yolo merged 2 commits into
mainfrom
sqle/investigation-2957
Jun 10, 2026
Merged

fix: tolerate SQL audit parse and empty input failures#3332
Seechi-Yolo merged 2 commits into
mainfrom
sqle/investigation-2957

Conversation

@actiontech-bot

@actiontech-bot actiontech-bot commented Jun 10, 2026

Copy link
Copy Markdown
Member

User description

Summary

  • Tolerate empty SQL input by creating an empty audit task instead of falling into Git URL validation.
  • Preserve unparsable SQL through parse fallback so task creation is not blocked.
  • Degrade batch audit failures to per-SQL audit and skip plugin audit when no SQL remains to audit.

Validation

  • go test ./sqle/model ./sqle/server/auditplan ./sqle/server/task
  • Manual verification on sqle-ee@zjrc_3.2408 with local mysql-for-sqle per task evidence.

Related issue: https://github.com/actiontech/sqle-ee/issues/2957


Description

  • 针对空SQL输入增加提前返回判断

  • 完善SQL解析及分段匹配逻辑

  • 添加原始SQL回退及错误提示机制

  • 扩展单元测试覆盖关键逻辑


Diagram Walkthrough

flowchart LR
  A["输入SQL文本"]
  B["检测空输入或解析错误"]
  C["调用completeParsedNodes"]
  D["回退至原始SQL"]
  E["附加警告信息"]
  F["生成SQL审核任务"]
  A -- "为空则直接返回" --> B
  B -- "解析成功" --> C
  B -- "解析失败或无节点" --> D
  D -- "追加警告信息" --> E
  C --> F
  D --> F
Loading

File Walkthrough

Relevant files
Bug fix
sql_audit_record.go
加强SQL文件解析与空值处理逻辑                                                                                 

sqle/api/controller/v1/sql_audit_record.go

  • 增加空SQL文本判断,避免不必要的处理
  • 定义completeParsedNodes、splitSQLFragments及normalizeSQLFragment函数
  • 在Git URL为空时直接返回空结果
+73/-2   
audit.go
优化审核任务错误回退与警告附加机制                                                                               

sqle/server/audit.go

  • 引入unsupportedSQLWarnMessage变量用于提示解析不支持情况
  • 添加auditSQLsOneByOne函数实现逐条审核回退逻辑
  • 在解析失败时调用appendUnsupportedSQLWarnResult附加警告信息
  • 调整ReplenishTaskStatistics处理空任务情况
+95/-7   
Tests
sql_audit_record_test.go
增加SQL解析及回退机制的测试用例                                                                               

sqle/api/controller/v1/sql_audit_record_test.go

  • 新增针对SQL解析回退的单元测试
  • 验证空SQL输入及部分解析成功场景
+153/-0 
audit_degrade_test.go
增加审核降级回退与统计更新的测试验证                                                                             

sqle/server/audit_degrade_test.go

  • 新增审核降级测试验证批量审核失败后的逐条回退
  • 测试空任务状态及统计指标更新
+155/-0 
Enhancement
task.go
更新任务生成中的空输入处理及工具函数整合                                                                         

sqle/api/controller/v1/task.go

  • 修改空SQL输入返回值逻辑,不再报错
  • 整合并重用SQL分段工具函数
+1/-1     

LordofAvernus and others added 2 commits June 10, 2026 17:32
Split parse-error and empty-node handling so intentional error swallowing is explicit for CI.

Co-authored-by: Cursor <cursoragent@cursor.com>
@github-actions

Copy link
Copy Markdown

PR Reviewer Guide 🔍

🎫 Ticket compliance analysis ✅

2957 - Fully compliant

Compliant requirements:

  • 容错空SQL输入,返回空任务,而不是报错
  • 在解析失败时回退至原始SQL,确保任务能够继续执行
⏱️ Estimated effort to review: 4 🔵🔵🔵🔵⚪
🧪 PR contains tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

代码重复
completeParsedNodes、splitSQLFragments 以及 normalizeSQLFragment 在多个文件中重复定义,建议将这些辅助函数抽取到公共模块中统一管理,便于后续维护和减少冗余代码。

@github-actions

Copy link
Copy Markdown

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
General
提取公共解析函数

建议将这组用于解析 SQL 片段的函数提取到一个公共工具包中,通过复用公共函数来减少代码重复。这样能降低维护成本并减少不同文件间实现不一致的风险。

sqle/api/controller/v1/sql_audit_record.go [304-349]

-func completeParsedNodes(sqlText string, nodes []driverV2.Node) []driverV2.Node {
-	fragments := splitSQLFragments(sqlText)
-	if len(fragments) <= len(nodes) {
-		return nodes
-	}
+// 在当前文件中调用 utils.ParseCompleteNodes(sqlText, nodes) 等公共函数,不再重复定义。
 
-	remainingNodes := append([]driverV2.Node{}, nodes...)
-	completed := make([]driverV2.Node, 0, len(fragments))
-	matchedCount := 0
-	for _, fragment := range fragments {
-		matchedIndex := -1
-		for i, node := range remainingNodes {
-			if normalizeSQLFragment(node.Text) == normalizeSQLFragment(fragment) {
-				matchedIndex = i
-				break
-			}
-		}
-		if matchedIndex >= 0 {
-			completed = append(completed, remainingNodes[matchedIndex])
-			remainingNodes = append(remainingNodes[:matchedIndex], remainingNodes[matchedIndex+1:]...)
-			matchedCount++
-			continue
-		}
-		completed = append(completed, driverV2.Node{Text: strings.TrimSpace(fragment)})
-	}
-	if matchedCount != len(nodes) {
-		return nodes
-	}
-	return completed
-}
-
-func splitSQLFragments(sqlText string) []string {
-	parts := strings.Split(sqlText, ";")
-	fragments := make([]string, 0, len(parts))
-	for _, part := range parts {
-		if strings.TrimSpace(part) == "" {
-			continue
-		}
-		fragments = append(fragments, part)
-	}
-	return fragments
-}
-
-func normalizeSQLFragment(sqlText string) string {
-	return strings.TrimSpace(strings.TrimSuffix(strings.TrimSpace(sqlText), ";"))
-}
-
Suggestion importance[1-10]: 5

__

Why: 该建议通过将用于解析 SQL 片段的函数提取到公共工具包中来减少重复代码,提升了代码的可维护性,但只是一项常规的重构优化。

Low

@Seechi-Yolo Seechi-Yolo merged commit 66c5307 into main Jun 10, 2026
4 checks passed
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