fix(oracle): align index discovery and constraint owner matching

This commit is contained in:
efeire authored and GitHub committed 2026-10-26 11:23:53 +08:00
1 parent e0a685f5c0
commit 563a0306e8
3 files changed
+29 -1

No files matched your search

+1
View File
@@ -3770,6 +3770,7 @@ WHERE i.TABLE_OWNER = :1
AND c.TABLE_NAME = :4
AND c.CONSTRAINT_TYPE IN ('P', 'U')
AND c.INDEX_NAME IS NOT NULL
AND c.INDEX_OWNER = i.OWNER
)
ORDER BY i.INDEX_NAME`
+28
View File
@@ -2379,6 +2379,34 @@ func TestListObjectsSQLUsesSplitDictionaryQuery(t *testing.T) {
}
}
func TestTableIndexDDLExclusionBindsConstraintIndexOwner(t *testing.T) {
for _, fromConnection := range []bool{false, true} {
t.Run(fmt.Sprint(fromConnection), func(t *testing.T) {
ddl := `CREATE INDEX OTHER.IX ON APP.T(ID)`
db, scripted := openOracleViewSourceTestDB(t, []oracleViewSourceQueryStep{
{queryContains: "c.INDEX_OWNER = i.OWNER", args: []driver.Value{"APP", "T", "APP", "T"}, columns: []string{"DDL"}, rows: [][]driver.Value{{ddl}}},
})
var result []string
var err error
if fromConnection {
conn, connectErr := db.Conn(context.Background())
if connectErr != nil {
t.Fatal(connectErr)
}
defer conn.Close()
result, err = loadTableIndexDDLsFromConn(conn, "APP", "T")
} else {
s := newServer()
s.db = db
result, err = s.loadTableIndexDDLs("APP", "T")
}
if err != nil || len(result) != 1 || result[0] != ddl || scripted.next != len(scripted.steps) {
t.Fatalf("exact owner query failed: result=%v error=%v queries=%d", result, err, scripted.next)
}
})
}
}
func TestSchemaIndexObjectsPreserveBothOwnersThroughRPC(t *testing.T) {
db, scripted := openOracleViewSourceTestDB(t, []oracleViewSourceQueryStep{
{queryContains: "SYS_CONTEXT('USERENV', 'SESSION_USER')", args: []driver.Value{}, rows: [][]driver.Value{{"APP"}}},
-1
View File
@@ -12613,7 +12613,6 @@ fn oracle_list_objects_sql_for_owner(owner: &str, type_owner: &str) -> String {
FROM all_objects o LEFT JOIN all_indexes i ON o.object_type = 'INDEX' AND i.owner = o.owner AND i.index_name = o.object_name \
WHERE ((o.owner = {owner} AND o.object_type IN ('TABLE', 'VIEW', 'PROCEDURE', 'FUNCTION', 'TRIGGER', 'SEQUENCE', 'PACKAGE', 'PACKAGE BODY', 'INDEX')) \
OR (o.owner = {type_owner} AND o.object_type IN ('TYPE', 'TYPE BODY'))) \
AND (o.object_type <> 'INDEX' OR i.generated = 'N' OR i.generated IS NULL) \
ORDER BY CASE o.object_type WHEN 'TABLE' THEN 0 WHEN 'VIEW' THEN 1 WHEN 'PROCEDURE' THEN 2 WHEN 'FUNCTION' THEN 3 WHEN 'SEQUENCE' THEN 4 WHEN 'PACKAGE' THEN 5 WHEN 'PACKAGE BODY' THEN 6 ELSE 7 END, o.object_name, o.object_type"
)
}