@@ -11403,6 +11403,76 @@ fn test_try_convert() {
1140311403 dialects. verified_expr ( "TRY_CONVERT('foo', VARCHAR(MAX))" ) ;
1140411404}
1140511405
11406+ #[ test]
11407+ fn parse_method_select ( ) {
11408+ let dialects = all_dialects_where ( |d| d. supports_methods ( ) ) ;
11409+ let _ = dialects. verified_only_select (
11410+ "SELECT LEFT('abc', 1).value('.', 'NVARCHAR(MAX)').value('.', 'NVARCHAR(MAX)') AS T" ,
11411+ ) ;
11412+ let _ = dialects. verified_only_select ( "SELECT STUFF((SELECT ',' + name FROM sys.objects FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS T" ) ;
11413+ let _ = dialects
11414+ . verified_only_select ( "SELECT CAST(column AS XML).value('.', 'NVARCHAR(MAX)') AS T" ) ;
11415+
11416+ // `CONVERT` support
11417+ let dialects = all_dialects_where ( |d| {
11418+ d. supports_methods ( ) && d. supports_try_convert ( ) && d. convert_type_before_value ( )
11419+ } ) ;
11420+ let _ = dialects. verified_only_select ( "SELECT CONVERT(XML, '<Book>abc</Book>').value('.', 'NVARCHAR(MAX)').value('.', 'NVARCHAR(MAX)') AS T" ) ;
11421+ }
11422+
11423+ #[ test]
11424+ fn parse_method_expr ( ) {
11425+ let dialects = all_dialects_where ( |d| d. supports_methods ( ) ) ;
11426+ let expr = dialects
11427+ . verified_expr ( "LEFT('abc', 1).value('.', 'NVARCHAR(MAX)').value('.', 'NVARCHAR(MAX)')" ) ;
11428+ match expr {
11429+ Expr :: Method ( Method { expr, method_chain } ) => {
11430+ assert ! ( matches!( * expr, Expr :: Function ( _) ) ) ;
11431+ assert ! ( matches!(
11432+ method_chain[ ..] ,
11433+ [ Function { .. } , Function { .. } ]
11434+ ) ) ;
11435+ }
11436+ _ => unreachable ! ( ) ,
11437+ }
11438+ let expr = dialects. verified_expr (
11439+ "(SELECT ',' + name FROM sys.objects FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')" ,
11440+ ) ;
11441+ match expr {
11442+ Expr :: Method ( Method { expr, method_chain } ) => {
11443+ assert ! ( matches!( * expr, Expr :: Subquery ( _) ) ) ;
11444+ assert ! ( matches!( method_chain[ ..] , [ Function { .. } ] ) ) ;
11445+ }
11446+ _ => unreachable ! ( ) ,
11447+ }
11448+ let expr = dialects. verified_expr ( "CAST(column AS XML).value('.', 'NVARCHAR(MAX)')" ) ;
11449+ match expr {
11450+ Expr :: Method ( Method { expr, method_chain } ) => {
11451+ assert ! ( matches!( * expr, Expr :: Cast { .. } ) ) ;
11452+ assert ! ( matches!( method_chain[ ..] , [ Function { .. } ] ) ) ;
11453+ }
11454+ _ => unreachable ! ( ) ,
11455+ }
11456+
11457+ // `CONVERT` support
11458+ let dialects = all_dialects_where ( |d| {
11459+ d. supports_methods ( ) && d. supports_try_convert ( ) && d. convert_type_before_value ( )
11460+ } ) ;
11461+ let expr = dialects. verified_expr (
11462+ "CONVERT(XML, '<Book>abc</Book>').value('.', 'NVARCHAR(MAX)').value('.', 'NVARCHAR(MAX)')" ,
11463+ ) ;
11464+ match expr {
11465+ Expr :: Method ( Method { expr, method_chain } ) => {
11466+ assert ! ( matches!( * expr, Expr :: Convert { .. } ) ) ;
11467+ assert ! ( matches!(
11468+ method_chain[ ..] ,
11469+ [ Function { .. } , Function { .. } ]
11470+ ) ) ;
11471+ }
11472+ _ => unreachable ! ( ) ,
11473+ }
11474+ }
11475+
1140611476#[ test]
1140711477fn test_show_dbs_schemas_tables_views ( ) {
1140811478 // These statements are parsed the same by all dialects
0 commit comments