@@ -155,18 +155,40 @@ def get_columns(self, connection, table_name, schema=None, **kw):
155155 dblink
156156
157157 """
158- resolve_synonyms = kw .get ("oracle_resolve_synonyms" , False )
159158 dblink = kw .get ("dblink" , "" )
159+ resolve_synonyms = kw .get ("oracle_resolve_synonyms" , False )
160160 info_cache = kw .get ("info_cache" )
161161
162- (table_name , schema , dblink , _ ) = self ._prepare_reflection_args (
163- connection ,
164- table_name ,
165- schema ,
166- resolve_synonyms ,
167- dblink ,
168- info_cache = info_cache ,
169- )
162+ if resolve_synonyms :
163+ try :
164+ rows = list (
165+ self ._get_synonyms (
166+ connection , schema , [table_name ], dblink , info_cache = info_cache
167+ )
168+ )
169+ except Exception :
170+ rows = []
171+
172+ if rows :
173+ row = rows [0 ]
174+ actual_name = getattr (row , "table_name" , None )
175+ actual_owner = getattr (row , "table_owner" , None )
176+ db_link_val = getattr (row , "db_link" , None )
177+
178+ if actual_name :
179+ table_name = self .denormalize_name (actual_name )
180+ if actual_owner :
181+ schema = self .denormalize_name (actual_owner )
182+ if db_link_val :
183+ if not db_link_val .startswith ("@" ):
184+ dblink = "@" + db_link_val
185+ else :
186+ dblink = db_link_val
187+ else :
188+ table_name = self .denormalize_name (table_name )
189+ if schema is not None :
190+ schema = self .denormalize_name (schema )
191+
170192 columns = []
171193
172194 char_length_col = "data_length"
@@ -395,22 +417,51 @@ def get_indexes_preserve_case(
395417 ** kw ,
396418):
397419 """Override get_indexes to fix two issues when preserveIdentifierCase=True:
398- 1. Use original table_name (before _prepare_reflection_args uppercases it)
420+ 1. Use original table_name (before denormalize_name uppercases it)
399421 so quoted lowercase identifiers are found in ALL_IND_COLUMNS.
400422 2. Access result row columns case-insensitively — Oracle thick mode returns
401423 INDEX_NAME (uppercase) while thin mode returns index_name (lowercase).
402424 A lowercased dict handles both without branching.
403425 """
404426 original_table_name = table_name
405- info_cache = kw .get ("info_cache" )
406- (table_name , schema , dblink , _ ) = self ._prepare_reflection_args (
407- connection ,
408- table_name ,
409- schema ,
410- resolve_synonyms ,
411- dblink ,
412- info_cache = info_cache ,
413- )
427+ resolve_synonyms = kw .get ("oracle_resolve_synonyms" , False )
428+
429+ # SQLAlchemy 2.0 removed _prepare_reflection_args; denormalize schema/table
430+ # for the pk_constraint lookup while the index query itself uses
431+ # original_table_name (preserve-case mode keeps identifiers as-is).
432+ table_name = self .denormalize_name (table_name )
433+ if schema is not None :
434+ schema = self .denormalize_name (schema )
435+ if dblink and not dblink .startswith ("@" ):
436+ dblink = "@" + dblink
437+
438+ if resolve_synonyms :
439+ try :
440+ rows = list (
441+ self ._get_synonyms (
442+ connection ,
443+ schema ,
444+ [table_name ],
445+ dblink ,
446+ info_cache = kw .get ("info_cache" ),
447+ )
448+ )
449+ except Exception :
450+ rows = []
451+ if rows :
452+ row = rows [0 ]
453+ actual_name = getattr (row , "table_name" , None )
454+ actual_owner = getattr (row , "table_owner" , None )
455+ db_link_val = getattr (row , "db_link" , None )
456+ if actual_name :
457+ table_name = self .denormalize_name (actual_name )
458+ if actual_owner :
459+ schema = self .denormalize_name (actual_owner )
460+ if db_link_val :
461+ if not db_link_val .startswith ("@" ):
462+ dblink = "@" + db_link_val
463+ else :
464+ dblink = db_link_val
414465
415466 params = {"table_name" : original_table_name }
416467 text = (
0 commit comments