fix(oracle): align index discovery and constraint owner matching
This commit is contained in:
1 parent
e0a685f5c0
commit
563a0306e8
3 files changed
+29
-1
No files matched your search
@@ -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`
|
||||
|
||||
|
||||
@@ -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"}}},
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user