mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-12 04:09:40 +08:00
- 新增 ResultSetData 结构体承载单个结果集数据 - 新增 MultiResultQuerier/MultiResultQuerierContext 可选接口 - 新增 scanMultiRows 函数利用 NextResultSet() 遍历所有结果集 - MySQL 驱动 DSN 开启 multiStatements=true 并实现多结果集接口 - 新增 DBQueryMulti Wails 方法,支持驱动原生多结果集及自动回退逐条执行 - 新增 Go 版 SQL 拆分函数 splitSQLStatements 及 10 个单元测试 - 前端 QueryEditor handleRun 改为一次性调用 DBQueryMulti - MongoDB 保持独立的逐条执行路径不受影响 - refs #235
95 lines
2.9 KiB
Go
95 lines
2.9 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)
|
||
}
|
||
}
|