mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-06-14 18:39:54 +08:00
- Oracle 匿名块:识别 BEGIN/DECLARE...END 块,避免按内部分号错误拆分 - 执行路径:PL/SQL 块跳过批量写入路径,保持单条语句语义 - SQL 文件:同步修复流式 SQL 文件拆分逻辑 - 查询结果:系统元数据表保持只读但不再弹业务表主键提示 - 测试覆盖:补充前后端拆分、执行和 information_schema 回归用例
170 lines
5.3 KiB
Go
170 lines
5.3 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)
|
||
}
|
||
}
|
||
|
||
func TestSplitSQLStatements_OracleAnonymousBlock(t *testing.T) {
|
||
input := `BEGIN
|
||
INSERT INTO tmp_disable_trigger (table_name) VALUES ('t_memcard_reg');
|
||
UPDATE t_memcard_reg SET CARDLEVEL = 1 WHERE MEMCARDNO = '8032277312';
|
||
DELETE FROM tmp_disable_trigger WHERE table_name = 't_memcard_reg';
|
||
END;
|
||
SELECT 1 FROM dual;`
|
||
got := splitSQLStatements(input)
|
||
want := []string{
|
||
`BEGIN
|
||
INSERT INTO tmp_disable_trigger (table_name) VALUES ('t_memcard_reg');
|
||
UPDATE t_memcard_reg SET CARDLEVEL = 1 WHERE MEMCARDNO = '8032277312';
|
||
DELETE FROM tmp_disable_trigger WHERE table_name = 't_memcard_reg';
|
||
END;`,
|
||
"SELECT 1 FROM dual",
|
||
}
|
||
if !reflect.DeepEqual(got, want) {
|
||
t.Errorf("splitSQLStatements(%q) = %#v, want %#v", input, got, want)
|
||
}
|
||
}
|
||
|
||
func TestSplitSQLStatements_OracleDeclareBlock(t *testing.T) {
|
||
input := `DECLARE
|
||
v_count NUMBER;
|
||
BEGIN
|
||
SELECT COUNT(*) INTO v_count FROM t_memcard_reg;
|
||
UPDATE t_memcard_reg SET CARDLEVEL = v_count WHERE MEMCARDNO = '8032277312';
|
||
END;
|
||
SELECT 1 FROM dual;`
|
||
got := splitSQLStatements(input)
|
||
want := []string{
|
||
`DECLARE
|
||
v_count NUMBER;
|
||
BEGIN
|
||
SELECT COUNT(*) INTO v_count FROM t_memcard_reg;
|
||
UPDATE t_memcard_reg SET CARDLEVEL = v_count WHERE MEMCARDNO = '8032277312';
|
||
END;`,
|
||
"SELECT 1 FROM dual",
|
||
}
|
||
if !reflect.DeepEqual(got, want) {
|
||
t.Errorf("splitSQLStatements(%q) = %#v, want %#v", input, got, want)
|
||
}
|
||
}
|
||
|
||
func TestSplitSQLStatements_TransactionBeginStillSplits(t *testing.T) {
|
||
input := "BEGIN; UPDATE accounts SET balance = balance - 1 WHERE id = 1; COMMIT;"
|
||
got := splitSQLStatements(input)
|
||
want := []string{
|
||
"BEGIN",
|
||
"UPDATE accounts SET balance = balance - 1 WHERE id = 1",
|
||
"COMMIT",
|
||
}
|
||
if !reflect.DeepEqual(got, want) {
|
||
t.Errorf("splitSQLStatements(%q) = %#v, want %#v", input, got, want)
|
||
}
|
||
}
|