package app import "strings" // SQLStatementInspection 描述一条拆分后的 SQL 语句的基础特征。 type SQLStatementInspection struct { Index int `json:"index"` Keyword string `json:"keyword,omitempty"` ReadOnly bool `json:"readOnly"` } // SQLInspection 描述一段 SQL 文本的整体执行特征。 type SQLInspection struct { StatementCount int `json:"statementCount"` ReadOnly bool `json:"readOnly"` Statements []SQLStatementInspection `json:"statements"` } // InspectSQL 基于现有 SQL 拆分与只读判定逻辑,为外部调用方提供安全边界判断。 func InspectSQL(dbType string, sql string) SQLInspection { statements := splitSQLStatements(sql) result := SQLInspection{ ReadOnly: true, Statements: make([]SQLStatementInspection, 0, len(statements)), } for _, stmt := range statements { trimmed := strings.TrimSpace(stmt) if trimmed == "" { continue } item := SQLStatementInspection{ Index: len(result.Statements) + 1, Keyword: leadingSQLKeyword(trimmed), ReadOnly: isReadOnlySQLQuery(dbType, trimmed), } if !item.ReadOnly { result.ReadOnly = false } result.Statements = append(result.Statements, item) } result.StatementCount = len(result.Statements) if result.StatementCount == 0 { result.ReadOnly = true } return result }