@@ -821,6 +821,7 @@ impl<'a> Parser<'a> {
821821 self . parse_time_functions ( ObjectName ( vec ! [ w. to_ident( ) ] ) )
822822 }
823823 Keyword :: CASE => self . parse_case_expr ( ) ,
824+ Keyword :: CONVERT => self . parse_convert_expr ( ) ,
824825 Keyword :: CAST => self . parse_cast_expr ( ) ,
825826 Keyword :: TRY_CAST => self . parse_try_cast_expr ( ) ,
826827 Keyword :: SAFE_CAST => self . parse_safe_cast_expr ( ) ,
@@ -1227,6 +1228,57 @@ impl<'a> Parser<'a> {
12271228 }
12281229 }
12291230
1231+ /// mssql-like convert function
1232+ fn parse_mssql_convert ( & mut self ) -> Result < Expr , ParserError > {
1233+ self . expect_token ( & Token :: LParen ) ?;
1234+ let data_type = self . parse_data_type ( ) ?;
1235+ self . expect_token ( & Token :: Comma ) ?;
1236+ let expr = self . parse_expr ( ) ?;
1237+ self . expect_token ( & Token :: RParen ) ?;
1238+ Ok ( Expr :: Convert {
1239+ expr : Box :: new ( expr) ,
1240+ data_type : Some ( data_type) ,
1241+ charset : None ,
1242+ target_before_value : true ,
1243+ } )
1244+ }
1245+
1246+ /// Parse a SQL CONVERT function:
1247+ /// - `CONVERT('héhé' USING utf8mb4)` (MySQL)
1248+ /// - `CONVERT('héhé', CHAR CHARACTER SET utf8mb4)` (MySQL)
1249+ /// - `CONVERT(DECIMAL(10, 5), 42)` (MSSQL) - the type comes first
1250+ pub fn parse_convert_expr ( & mut self ) -> Result < Expr , ParserError > {
1251+ if self . dialect . convert_type_before_value ( ) {
1252+ return self . parse_mssql_convert ( ) ;
1253+ }
1254+ self . expect_token ( & Token :: LParen ) ?;
1255+ let expr = self . parse_expr ( ) ?;
1256+ if self . parse_keyword ( Keyword :: USING ) {
1257+ let charset = self . parse_object_name ( ) ?;
1258+ self . expect_token ( & Token :: RParen ) ?;
1259+ return Ok ( Expr :: Convert {
1260+ expr : Box :: new ( expr) ,
1261+ data_type : None ,
1262+ charset : Some ( charset) ,
1263+ target_before_value : false ,
1264+ } ) ;
1265+ }
1266+ self . expect_token ( & Token :: Comma ) ?;
1267+ let data_type = self . parse_data_type ( ) ?;
1268+ let charset = if self . parse_keywords ( & [ Keyword :: CHARACTER , Keyword :: SET ] ) {
1269+ Some ( self . parse_object_name ( ) ?)
1270+ } else {
1271+ None
1272+ } ;
1273+ self . expect_token ( & Token :: RParen ) ?;
1274+ Ok ( Expr :: Convert {
1275+ expr : Box :: new ( expr) ,
1276+ data_type : Some ( data_type) ,
1277+ charset,
1278+ target_before_value : false ,
1279+ } )
1280+ }
1281+
12301282 /// Parse a SQL CAST function e.g. `CAST(expr AS FLOAT)`
12311283 pub fn parse_cast_expr ( & mut self ) -> Result < Expr , ParserError > {
12321284 self . expect_token ( & Token :: LParen ) ?;
0 commit comments