feat: Oracle 驱动完整化——回调体系、版本感知、驱动抽象层与测试套件
- 新增驱动抽象层 driver_adapter(go-ora/godror 双驱动切换) - 新增 Update/Delete/Query 回调,完善 RETURNING INTO 子句 - 修复 create.go 事务悬挂行 BUG、批量 RowsAffected、主键 WHERE 注入 - 版本感知体系:分页/自增/序列默认值/BOOLEAN/32k VARCHAR2 分级能力判定 - 11g 序列+触发器自增、ON UPDATE 触发器、默认值智能转换 - 升级 go-ora v2.8.19 → v2.9.0 - 单元测试+模块测试+集成测试共 96 个,真实 Oracle 11g 全绿 - 测试 DSN 密码移除,改为 ORACLE_DSN 环境变量注入
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
package clauses
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"gorm.io/gorm/clause"
|
||||
)
|
||||
|
||||
func TestMergeName(t *testing.T) {
|
||||
var m Merge
|
||||
if got := m.Name(); got != "MERGE" {
|
||||
t.Errorf("Merge.Name() = %q, want %q", got, "MERGE")
|
||||
}
|
||||
}
|
||||
|
||||
func TestMergeDefaultExcludeName(t *testing.T) {
|
||||
if got := MergeDefaultExcludeName(); got != "exclude" {
|
||||
t.Errorf("MergeDefaultExcludeName() = %q, want %q", got, "exclude")
|
||||
}
|
||||
}
|
||||
|
||||
func TestMergeBuild(t *testing.T) {
|
||||
merge := Merge{
|
||||
Table: clause.Table{Name: "users"},
|
||||
Using: []clause.Interface{
|
||||
clause.Select{Columns: []clause.Column{{Name: "id"}, {Name: "name"}}},
|
||||
clause.From{Tables: []clause.Table{{Name: "users"}}},
|
||||
},
|
||||
On: []clause.Expression{
|
||||
clause.Eq{Column: clause.Column{Name: "a"}, Value: clause.Column{Name: "b"}},
|
||||
},
|
||||
}
|
||||
|
||||
sql := buildClauseSQL(t, "MERGE", merge)
|
||||
|
||||
for _, want := range []string{
|
||||
"MERGE INTO", // 前缀 + Insert 构建
|
||||
"USING (", // USING 子查询
|
||||
"SELECT id,name FROM users", // USING 子查询内容
|
||||
") exclude ON (", // exclude 别名 + ON
|
||||
"a = b", // ON 条件
|
||||
} {
|
||||
if !strings.Contains(sql, want) {
|
||||
t.Errorf("Merge SQL %q does not contain %q", sql, want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestMergeBuildEmpty(t *testing.T) {
|
||||
var merge Merge
|
||||
|
||||
sql := buildClauseSQL(t, "MERGE", merge)
|
||||
if want := "MERGE INTO users USING () exclude ON ()"; sql != want {
|
||||
t.Errorf("empty Merge SQL = %q, want %q", sql, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMergeMergeClause(t *testing.T) {
|
||||
merge := Merge{
|
||||
Table: clause.Table{Name: "users"},
|
||||
On: []clause.Expression{
|
||||
clause.Eq{Column: clause.Column{Name: "a"}, Value: clause.Column{Name: "b"}},
|
||||
},
|
||||
}
|
||||
|
||||
cc := &clause.Clause{}
|
||||
merge.MergeClause(cc)
|
||||
|
||||
if cc.Name != "MERGE" {
|
||||
t.Errorf("MergeClause name = %q, want %q", cc.Name, "MERGE")
|
||||
}
|
||||
|
||||
if got, ok := cc.Expression.(Merge); !ok || !reflect.DeepEqual(got, merge) {
|
||||
t.Errorf("MergeClause expression = %#v, want %#v", cc.Expression, merge)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user