mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-11 22:19:39 +08:00
- 安全加固:TruncateTables 增加审计日志(Warnf 级别)和参数校验(上限 200 张) - 容错增强:批量清空部分失败时返回已执行 SQL 列表并提示已清空表不可恢复 - 错误优化:DBQueryMulti 逐条执行失败时附带语句序号和已成功条数 - 性能优化:splitSQLStatements 从 string 拼接改为 strings.Builder,消除 O(n²) 分配 - 转义修复:splitSQLStatements 支持 SQL 标准转义单引号 '' 防止误拆分 - 前端修复:handleBatchClear 统一取消判断字符串为 '已取消' 并移除冗余变量声明 - refs #244
114 lines
3.5 KiB
Go
114 lines
3.5 KiB
Go
package app
|
||
|
||
import (
|
||
"reflect"
|
||
"testing"
|
||
)
|
||
|
||
func TestSplitSQLStatements_BasicSplit(t *testing.T) {
|
||
input := "SELECT 1; SELECT 2; SELECT 3"
|
||
got := splitSQLStatements(input)
|
||
want := []string{"SELECT 1", "SELECT 2", "SELECT 3"}
|
||
if !reflect.DeepEqual(got, want) {
|
||
t.Errorf("splitSQLStatements(%q) = %v, want %v", input, got, want)
|
||
}
|
||
}
|
||
|
||
func TestSplitSQLStatements_QuotedSemicolon(t *testing.T) {
|
||
input := `SELECT 'hello;world'; SELECT 2`
|
||
got := splitSQLStatements(input)
|
||
want := []string{`SELECT 'hello;world'`, "SELECT 2"}
|
||
if !reflect.DeepEqual(got, want) {
|
||
t.Errorf("splitSQLStatements(%q) = %v, want %v", input, got, want)
|
||
}
|
||
}
|
||
|
||
func TestSplitSQLStatements_LineComment(t *testing.T) {
|
||
input := "SELECT 1; -- this is a comment;\nSELECT 2"
|
||
got := splitSQLStatements(input)
|
||
want := []string{"SELECT 1", "-- this is a comment;\nSELECT 2"}
|
||
if !reflect.DeepEqual(got, want) {
|
||
t.Errorf("splitSQLStatements(%q) = %v, want %v", input, got, want)
|
||
}
|
||
}
|
||
|
||
func TestSplitSQLStatements_BlockComment(t *testing.T) {
|
||
input := "SELECT /* ; */ 1; SELECT 2"
|
||
got := splitSQLStatements(input)
|
||
want := []string{"SELECT /* ; */ 1", "SELECT 2"}
|
||
if !reflect.DeepEqual(got, want) {
|
||
t.Errorf("splitSQLStatements(%q) = %v, want %v", input, got, want)
|
||
}
|
||
}
|
||
|
||
func TestSplitSQLStatements_EmptyInput(t *testing.T) {
|
||
got := splitSQLStatements("")
|
||
if len(got) != 0 {
|
||
t.Errorf("splitSQLStatements(\"\") = %v, want empty slice", got)
|
||
}
|
||
}
|
||
|
||
func TestSplitSQLStatements_SingleStatement(t *testing.T) {
|
||
input := "SELECT * FROM users WHERE id = 1"
|
||
got := splitSQLStatements(input)
|
||
want := []string{"SELECT * FROM users WHERE id = 1"}
|
||
if !reflect.DeepEqual(got, want) {
|
||
t.Errorf("splitSQLStatements(%q) = %v, want %v", input, got, want)
|
||
}
|
||
}
|
||
|
||
func TestSplitSQLStatements_DollarQuoting(t *testing.T) {
|
||
input := "SELECT $tag$hello;world$tag$; SELECT 2"
|
||
got := splitSQLStatements(input)
|
||
want := []string{"SELECT $tag$hello;world$tag$", "SELECT 2"}
|
||
if !reflect.DeepEqual(got, want) {
|
||
t.Errorf("splitSQLStatements(%q) = %v, want %v", input, got, want)
|
||
}
|
||
}
|
||
|
||
func TestSplitSQLStatements_FullWidthSemicolon(t *testing.T) {
|
||
input := "SELECT 1;SELECT 2"
|
||
got := splitSQLStatements(input)
|
||
want := []string{"SELECT 1", "SELECT 2"}
|
||
if !reflect.DeepEqual(got, want) {
|
||
t.Errorf("splitSQLStatements(%q) = %v, want %v", input, got, want)
|
||
}
|
||
}
|
||
|
||
func TestSplitSQLStatements_Backtick(t *testing.T) {
|
||
input := "SELECT `col;name` FROM t; SELECT 2"
|
||
got := splitSQLStatements(input)
|
||
want := []string{"SELECT `col;name` FROM t", "SELECT 2"}
|
||
if !reflect.DeepEqual(got, want) {
|
||
t.Errorf("splitSQLStatements(%q) = %v, want %v", input, got, want)
|
||
}
|
||
}
|
||
|
||
func TestSplitSQLStatements_TrailingSemicolon(t *testing.T) {
|
||
input := "SELECT 1; SELECT 2;"
|
||
got := splitSQLStatements(input)
|
||
want := []string{"SELECT 1", "SELECT 2"}
|
||
if !reflect.DeepEqual(got, want) {
|
||
t.Errorf("splitSQLStatements(%q) = %v, want %v", input, got, want)
|
||
}
|
||
}
|
||
|
||
func TestSplitSQLStatements_SQLEscapedQuote(t *testing.T) {
|
||
input := "SELECT 'it''s a test'; SELECT 2"
|
||
got := splitSQLStatements(input)
|
||
want := []string{"SELECT 'it''s a test'", "SELECT 2"}
|
||
if !reflect.DeepEqual(got, want) {
|
||
t.Errorf("splitSQLStatements(%q) = %v, want %v", input, got, want)
|
||
}
|
||
}
|
||
|
||
func TestSplitSQLStatements_SQLEscapedQuoteMultiple(t *testing.T) {
|
||
input := "INSERT INTO t VALUES ('O''Brien', 'it''s OK'); SELECT 1"
|
||
got := splitSQLStatements(input)
|
||
want := []string{"INSERT INTO t VALUES ('O''Brien', 'it''s OK')", "SELECT 1"}
|
||
if !reflect.DeepEqual(got, want) {
|
||
t.Errorf("splitSQLStatements(%q) = %v, want %v", input, got, want)
|
||
}
|
||
}
|
||
|