@@ -9225,8 +9225,63 @@ impl<'a> Parser<'a> {
9225
9225
}
9226
9226
9227
9227
pub fn parse_use ( & mut self ) -> Result < Statement , ParserError > {
9228
- let db_name = self . parse_identifier ( false ) ?;
9229
- Ok ( Statement :: Use { db_name } )
9228
+ // What should be treated as keyword in given dialect
9229
+ let allowed_keywords = if dialect_of ! ( self is HiveDialect ) {
9230
+ vec ! [ Keyword :: DEFAULT ]
9231
+ } else if dialect_of ! ( self is DatabricksDialect ) {
9232
+ vec ! [ Keyword :: CATALOG , Keyword :: DATABASE , Keyword :: SCHEMA ]
9233
+ } else if dialect_of ! ( self is SnowflakeDialect ) {
9234
+ vec ! [ Keyword :: DATABASE , Keyword :: SCHEMA ]
9235
+ } else {
9236
+ vec ! [ ]
9237
+ } ;
9238
+ let parsed_keyword = self . parse_one_of_keywords ( & allowed_keywords) ;
9239
+
9240
+ // Hive dialect accepts USE DEFAULT; statement without any db specified
9241
+ if dialect_of ! ( self is HiveDialect ) && parsed_keyword == Some ( Keyword :: DEFAULT ) {
9242
+ return Ok ( Statement :: Use {
9243
+ db_name : None ,
9244
+ schema_name : None ,
9245
+ keyword : Some ( "DEFAULT" . to_string ( ) ) ,
9246
+ } ) ;
9247
+ }
9248
+
9249
+ // Parse the object name, which might be a single identifier or fully qualified name (e.g., x.y)
9250
+ let parts = self . parse_object_name ( false ) ?. 0 ;
9251
+ let ( db_name, schema_name) = match parts. len ( ) {
9252
+ 1 => {
9253
+ // Single identifier found
9254
+ if dialect_of ! ( self is DatabricksDialect ) {
9255
+ if parsed_keyword == Some ( Keyword :: CATALOG ) {
9256
+ // Databricks: CATALOG keyword provided, treat as database name
9257
+ ( Some ( parts[ 0 ] . clone ( ) ) , None )
9258
+ } else {
9259
+ // Databricks: DATABASE, SCHEMA or no keyword provided, treat as schema name
9260
+ ( None , Some ( parts[ 0 ] . clone ( ) ) )
9261
+ }
9262
+ } else if dialect_of ! ( self is SnowflakeDialect )
9263
+ && parsed_keyword == Some ( Keyword :: SCHEMA )
9264
+ {
9265
+ // Snowflake: SCHEMA keyword provided, treat as schema name
9266
+ ( None , Some ( parts[ 0 ] . clone ( ) ) )
9267
+ } else {
9268
+ // Other dialects: treat as database name by default
9269
+ ( Some ( parts[ 0 ] . clone ( ) ) , None )
9270
+ }
9271
+ }
9272
+ 2 => ( Some ( parts[ 0 ] . clone ( ) ) , Some ( parts[ 1 ] . clone ( ) ) ) ,
9273
+ _ => {
9274
+ return Err ( ParserError :: ParserError (
9275
+ "Invalid format in the USE statement" . to_string ( ) ,
9276
+ ) )
9277
+ }
9278
+ } ;
9279
+
9280
+ Ok ( Statement :: Use {
9281
+ db_name,
9282
+ schema_name,
9283
+ keyword : parsed_keyword. map ( |kw| format ! ( "{:?}" , kw) ) ,
9284
+ } )
9230
9285
}
9231
9286
9232
9287
pub fn parse_table_and_joins ( & mut self ) -> Result < TableWithJoins , ParserError > {
0 commit comments