@@ -111,37 +111,39 @@ pub fn try_resolve_database(api: &ApiClient, id_or_name: &str) -> Result<Databas
111111 return Ok ( db) ;
112112 }
113113
114- // Fall back to listing and matching by name or catalog alias .
114+ // Fall back to listing — prefer catalog alias match, then name .
115115 let body: ListDatabasesResponse = api. get ( "/databases" ) ;
116- let name_matches: Vec < & DatabaseSummary > = body
116+
117+ let catalog_matches: Vec < & DatabaseSummary > = body
117118 . databases
118119 . iter ( )
119- . filter ( |d| d. name . as_deref ( ) == Some ( id_or_name) )
120+ . filter ( |d| d. default_catalog . as_deref ( ) == Some ( id_or_name) )
120121 . collect ( ) ;
121122
122- if !name_matches . is_empty ( ) {
123- return match name_matches . len ( ) {
124- 1 => Ok ( fetch_database ( api, & name_matches [ 0 ] . id ) ) ,
123+ if !catalog_matches . is_empty ( ) {
124+ return match catalog_matches . len ( ) {
125+ 1 => Ok ( fetch_database ( api, & catalog_matches [ 0 ] . id ) ) ,
125126 _ => Err ( format ! (
126- "multiple databases have name '{}' — use the database id instead" ,
127+ "multiple databases have catalog '{}' — use the database id instead" ,
127128 id_or_name
128129 ) ) ,
129130 } ;
130131 }
131132
132- let catalog_matches: Vec < & DatabaseSummary > = body
133+
134+ let name_matches: Vec < & DatabaseSummary > = body
133135 . databases
134136 . iter ( )
135- . filter ( |d| d. default_catalog . as_deref ( ) == Some ( id_or_name) )
137+ . filter ( |d| d. name . as_deref ( ) == Some ( id_or_name) )
136138 . collect ( ) ;
137139
138- match catalog_matches . len ( ) {
140+ match name_matches . len ( ) {
139141 0 => Err ( format ! (
140- "no database with id, name , or catalog '{id_or_name}'"
142+ "no database with id, catalog , or name '{id_or_name}'"
141143 ) ) ,
142- 1 => Ok ( fetch_database ( api, & catalog_matches [ 0 ] . id ) ) ,
144+ 1 => Ok ( fetch_database ( api, & name_matches [ 0 ] . id ) ) ,
143145 _ => Err ( format ! (
144- "multiple databases have catalog '{}' — use the database id instead" ,
146+ "multiple databases have name '{}' — use the database id instead" ,
145147 id_or_name
146148 ) ) ,
147149 }
@@ -777,7 +779,26 @@ pub fn tables_load(
777779
778780 let database = resolve_current_database ( database, workspace_id) ;
779781 let api = ApiClient :: new ( Some ( workspace_id) ) ;
780- let db = resolve_database ( & api, & database) ;
782+ // Prefer the active database when its catalog or name matches the lookup key,
783+ // avoiding ambiguity when multiple databases share the same catalog name.
784+ let active_id = crate :: config:: load_current_database ( "default" , workspace_id) ;
785+ let lookup_key = match active_id. as_deref ( ) {
786+ Some ( id) => {
787+ if let Some ( active) = api. get_none_if_not_found :: < Database > ( & format ! ( "/databases/{id}" ) ) {
788+ if active. default_catalog . as_deref ( ) == Some ( database. as_str ( ) )
789+ || active. name . as_deref ( ) == Some ( database. as_str ( ) )
790+ {
791+ id. to_string ( )
792+ } else {
793+ database. clone ( )
794+ }
795+ } else {
796+ database. clone ( )
797+ }
798+ }
799+ None => database. clone ( ) ,
800+ } ;
801+ let db = resolve_database ( & api, & lookup_key) ;
781802 let schema = schema_name ( schema) ;
782803
783804 // clap enforces mutual exclusion; only one of these is ever Some.
@@ -1036,7 +1057,7 @@ mod tests {
10361057
10371058 let api = ApiClient :: test_new ( & server. url ( ) , "k" , None ) ;
10381059 let err = try_resolve_database ( & api, "missing" ) . unwrap_err ( ) ;
1039- assert ! ( err. contains( "no database with id or name " ) ) ;
1060+ assert ! ( err. contains( "no database with id" ) ) ;
10401061 }
10411062
10421063 #[ test]
0 commit comments