@@ -11403,6 +11403,76 @@ fn test_try_convert() {
11403
11403
dialects. verified_expr ( "TRY_CONVERT('foo', VARCHAR(MAX))" ) ;
11404
11404
}
11405
11405
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
+
11406
11476
#[ test]
11407
11477
fn test_show_dbs_schemas_tables_views ( ) {
11408
11478
// These statements are parsed the same by all dialects
0 commit comments