@@ -1023,7 +1023,8 @@ impl<'a> Parser<'a> {
10231023 self . parse_time_functions ( ObjectName ( vec ! [ w. to_ident( ) ] ) )
10241024 }
10251025 Keyword :: CASE => self . parse_case_expr ( ) ,
1026- Keyword :: CONVERT => self . parse_convert_expr ( ) ,
1026+ Keyword :: CONVERT => self . parse_convert_expr ( false ) ,
1027+ Keyword :: TRY_CONVERT if self . dialect . supports_try_convert ( ) => self . parse_convert_expr ( true ) ,
10271028 Keyword :: CAST => self . parse_cast_expr ( CastKind :: Cast ) ,
10281029 Keyword :: TRY_CAST => self . parse_cast_expr ( CastKind :: TryCast ) ,
10291030 Keyword :: SAFE_CAST => self . parse_cast_expr ( CastKind :: SafeCast ) ,
@@ -1614,7 +1615,7 @@ impl<'a> Parser<'a> {
16141615 }
16151616
16161617 /// mssql-like convert function
1617- fn parse_mssql_convert ( & mut self ) -> Result < Expr , ParserError > {
1618+ fn parse_mssql_convert ( & mut self , is_try : bool ) -> Result < Expr , ParserError > {
16181619 self . expect_token ( & Token :: LParen ) ?;
16191620 let data_type = self . parse_data_type ( ) ?;
16201621 self . expect_token ( & Token :: Comma ) ?;
@@ -1626,6 +1627,7 @@ impl<'a> Parser<'a> {
16261627 } ;
16271628 self . expect_token ( & Token :: RParen ) ?;
16281629 Ok ( Expr :: Convert {
1630+ is_try,
16291631 expr : Box :: new ( expr) ,
16301632 data_type : Some ( data_type) ,
16311633 charset : None ,
@@ -1638,16 +1640,17 @@ impl<'a> Parser<'a> {
16381640 /// - `CONVERT('héhé' USING utf8mb4)` (MySQL)
16391641 /// - `CONVERT('héhé', CHAR CHARACTER SET utf8mb4)` (MySQL)
16401642 /// - `CONVERT(DECIMAL(10, 5), 42)` (MSSQL) - the type comes first
1641- pub fn parse_convert_expr ( & mut self ) -> Result < Expr , ParserError > {
1643+ pub fn parse_convert_expr ( & mut self , is_try : bool ) -> Result < Expr , ParserError > {
16421644 if self . dialect . convert_type_before_value ( ) {
1643- return self . parse_mssql_convert ( ) ;
1645+ return self . parse_mssql_convert ( is_try ) ;
16441646 }
16451647 self . expect_token ( & Token :: LParen ) ?;
16461648 let expr = self . parse_expr ( ) ?;
16471649 if self . parse_keyword ( Keyword :: USING ) {
16481650 let charset = self . parse_object_name ( false ) ?;
16491651 self . expect_token ( & Token :: RParen ) ?;
16501652 return Ok ( Expr :: Convert {
1653+ is_try,
16511654 expr : Box :: new ( expr) ,
16521655 data_type : None ,
16531656 charset : Some ( charset) ,
@@ -1664,6 +1667,7 @@ impl<'a> Parser<'a> {
16641667 } ;
16651668 self . expect_token ( & Token :: RParen ) ?;
16661669 Ok ( Expr :: Convert {
1670+ is_try,
16671671 expr : Box :: new ( expr) ,
16681672 data_type : Some ( data_type) ,
16691673 charset,
0 commit comments