mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-06-09 07:59:33 +08:00
- 问题根因:GetTables 在 dbName 为空时走 user_tables 分支返回纯表名,下游 SQL 缺少 owner 前缀,引用未授权 schema 的表时报 ORA-00942 - SQL 修复:user_tables 分支改用 USER 伪列拼接 owner,确保始终返回 OWNER.TABLE_NAME 格式 - 驱动兼容:列别名用双引号包裹强制大写(AS "OWNER" / AS "TABLE_NAME"),避免不同驱动返回不一致 case 导致 row map 取值失败 - 边界保护:增加 TABLE_NAME 为 NULL 的跳过逻辑,避免污染表名输出 - 达梦对齐:DamengDB.GetTables 同步修复,保持与 Oracle 实现一致 - 测试覆盖:新增 3 个回归用例(all_tables 路径、user_tables 路径、NULL 值跳过),扩展 recording driver 支持 mock 任意查询结果 Refs #445
85 lines
2.3 KiB
Go
85 lines
2.3 KiB
Go
package db
|
||
|
||
import (
|
||
"database/sql/driver"
|
||
"reflect"
|
||
"testing"
|
||
)
|
||
|
||
func TestOracleGetTablesPrefixesOwnerForAllTablesQuery(t *testing.T) {
|
||
t.Parallel()
|
||
|
||
dbConn, state := openOracleRecordingDB(t)
|
||
state.mu.Lock()
|
||
state.queryResults[`SELECT owner AS "OWNER", table_name AS "TABLE_NAME" FROM all_tables WHERE owner = 'MYCIMLED' ORDER BY table_name`] = oracleRecordingQueryResult{
|
||
columns: []string{"OWNER", "TABLE_NAME"},
|
||
rows: [][]driver.Value{
|
||
{"MYCIMLED", "T_ADS"},
|
||
{"MYCIMLED", "T_USERS"},
|
||
},
|
||
}
|
||
state.mu.Unlock()
|
||
|
||
oracleDB := &OracleDB{conn: dbConn}
|
||
tables, err := oracleDB.GetTables("MYCIMLED")
|
||
if err != nil {
|
||
t.Fatalf("GetTables 返回错误: %v", err)
|
||
}
|
||
|
||
want := []string{"MYCIMLED.T_ADS", "MYCIMLED.T_USERS"}
|
||
if !reflect.DeepEqual(tables, want) {
|
||
t.Fatalf("期望返回带 OWNER 前缀的表名 %v,实际 %v", want, tables)
|
||
}
|
||
}
|
||
|
||
func TestOracleGetTablesPrefixesCurrentUserForUserTablesQuery(t *testing.T) {
|
||
t.Parallel()
|
||
|
||
dbConn, state := openOracleRecordingDB(t)
|
||
state.mu.Lock()
|
||
state.queryResults[`SELECT USER AS "OWNER", table_name AS "TABLE_NAME" FROM user_tables ORDER BY table_name`] = oracleRecordingQueryResult{
|
||
columns: []string{"OWNER", "TABLE_NAME"},
|
||
rows: [][]driver.Value{
|
||
{"LOGIN_USER", "T_ADS"},
|
||
},
|
||
}
|
||
state.mu.Unlock()
|
||
|
||
oracleDB := &OracleDB{conn: dbConn}
|
||
tables, err := oracleDB.GetTables("")
|
||
if err != nil {
|
||
t.Fatalf("GetTables 返回错误: %v", err)
|
||
}
|
||
|
||
want := []string{"LOGIN_USER.T_ADS"}
|
||
if !reflect.DeepEqual(tables, want) {
|
||
t.Fatalf("空 dbName 也应带 OWNER 前缀,期望 %v,实际 %v", want, tables)
|
||
}
|
||
}
|
||
|
||
func TestOracleGetTablesSkipsRowsWithNullTableName(t *testing.T) {
|
||
t.Parallel()
|
||
|
||
dbConn, state := openOracleRecordingDB(t)
|
||
state.mu.Lock()
|
||
state.queryResults[`SELECT owner AS "OWNER", table_name AS "TABLE_NAME" FROM all_tables WHERE owner = 'MYCIMLED' ORDER BY table_name`] = oracleRecordingQueryResult{
|
||
columns: []string{"OWNER", "TABLE_NAME"},
|
||
rows: [][]driver.Value{
|
||
{"MYCIMLED", nil},
|
||
{"MYCIMLED", "T_ADS"},
|
||
},
|
||
}
|
||
state.mu.Unlock()
|
||
|
||
oracleDB := &OracleDB{conn: dbConn}
|
||
tables, err := oracleDB.GetTables("MYCIMLED")
|
||
if err != nil {
|
||
t.Fatalf("GetTables 返回错误: %v", err)
|
||
}
|
||
|
||
want := []string{"MYCIMLED.T_ADS"}
|
||
if !reflect.DeepEqual(tables, want) {
|
||
t.Fatalf("NULL TABLE_NAME 应被跳过,期望 %v,实际 %v", want, tables)
|
||
}
|
||
}
|