mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-06-20 21:43:56 +08:00
- 统一处理 SQL Server Exec 路径的 RowsAffected 返回 - 兼容 BEGIN/COMMIT/ROLLBACK/SAVE 等事务控制语句无影响行数场景 - 补充 SQL Server 事务控制语句与 DML 的回归测试
68 lines
1.7 KiB
Go
68 lines
1.7 KiB
Go
//go:build gonavi_full_drivers || gonavi_sqlserver_driver
|
|
|
|
package db
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
)
|
|
|
|
type fakeSQLServerExecResult struct {
|
|
affected int64
|
|
rowErr error
|
|
}
|
|
|
|
func (r fakeSQLServerExecResult) LastInsertId() (int64, error) {
|
|
return 0, errors.New("not implemented")
|
|
}
|
|
|
|
func (r fakeSQLServerExecResult) RowsAffected() (int64, error) {
|
|
if r.rowErr != nil {
|
|
return 0, r.rowErr
|
|
}
|
|
return r.affected, nil
|
|
}
|
|
|
|
func TestSQLServerRowsAffectedIgnoresTransactionControlErrors(t *testing.T) {
|
|
rowErr := errors.New("不支持的方法")
|
|
for _, query := range []string{
|
|
"BEGIN TRANSACTION",
|
|
"COMMIT TRANSACTION",
|
|
"ROLLBACK TRANSACTION",
|
|
"SAVE TRANSACTION before_update",
|
|
"BEGIN TRY\nSELECT 1\nEND TRY",
|
|
} {
|
|
affected, err := sqlServerRowsAffected(query, fakeSQLServerExecResult{rowErr: rowErr})
|
|
if err != nil {
|
|
t.Fatalf("sqlServerRowsAffected(%q) returned unexpected error: %v", query, err)
|
|
}
|
|
if affected != 0 {
|
|
t.Fatalf("sqlServerRowsAffected(%q) = %d, want 0", query, affected)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestSQLServerRowsAffectedPreservesDMLCount(t *testing.T) {
|
|
affected, err := sqlServerRowsAffected(
|
|
"UPDATE dbo.users SET name = 'neo' WHERE id = 1",
|
|
fakeSQLServerExecResult{affected: 3},
|
|
)
|
|
if err != nil {
|
|
t.Fatalf("sqlServerRowsAffected returned unexpected error: %v", err)
|
|
}
|
|
if affected != 3 {
|
|
t.Fatalf("sqlServerRowsAffected = %d, want 3", affected)
|
|
}
|
|
}
|
|
|
|
func TestSQLServerRowsAffectedDoesNotHideDMLRowsAffectedErrors(t *testing.T) {
|
|
rowErr := errors.New("rows affected unsupported")
|
|
_, err := sqlServerRowsAffected(
|
|
"UPDATE dbo.users SET name = 'neo' WHERE id = 1",
|
|
fakeSQLServerExecResult{rowErr: rowErr},
|
|
)
|
|
if !errors.Is(err, rowErr) {
|
|
t.Fatalf("expected rows affected error to propagate for DML, got %v", err)
|
|
}
|
|
}
|