@@ -2342,3 +2342,86 @@ fn test_unparse_right_anti_join() -> Result<()> {
2342
2342
) ;
2343
2343
Ok ( ( ) )
2344
2344
}
2345
+
2346
+ #[ test]
2347
+ fn test_unparse_cross_join_with_table_scan_projection ( ) -> Result < ( ) > {
2348
+ let schema = Schema :: new ( vec ! [
2349
+ Field :: new( "k" , DataType :: Int32 , false ) ,
2350
+ Field :: new( "v" , DataType :: Int32 , false ) ,
2351
+ ] ) ;
2352
+ // Cross Join:
2353
+ // SubqueryAlias: t1
2354
+ // TableScan: test projection=[v]
2355
+ // SubqueryAlias: t2
2356
+ // TableScan: test projection=[v]
2357
+ let table_scan1 = table_scan ( Some ( "test" ) , & schema, Some ( vec ! [ 1 ] ) ) ?. build ( ) ?;
2358
+ let table_scan2 = table_scan ( Some ( "test" ) , & schema, Some ( vec ! [ 1 ] ) ) ?. build ( ) ?;
2359
+ let plan = LogicalPlanBuilder :: from ( subquery_alias ( table_scan1, "t1" ) ?)
2360
+ . cross_join ( subquery_alias ( table_scan2, "t2" ) ?) ?
2361
+ . build ( ) ?;
2362
+ let unparser = Unparser :: new ( & UnparserPostgreSqlDialect { } ) ;
2363
+ let sql = unparser. plan_to_sql ( & plan) ?;
2364
+ assert_snapshot ! (
2365
+ sql,
2366
+ @r#"SELECT "t1"."v", "t2"."v" FROM "test" AS "t1" CROSS JOIN "test" AS "t2""#
2367
+ ) ;
2368
+ Ok ( ( ) )
2369
+ }
2370
+
2371
+ #[ test]
2372
+ fn test_unparse_inner_join_with_table_scan_projection ( ) -> Result < ( ) > {
2373
+ let schema = Schema :: new ( vec ! [
2374
+ Field :: new( "k" , DataType :: Int32 , false ) ,
2375
+ Field :: new( "v" , DataType :: Int32 , false ) ,
2376
+ ] ) ;
2377
+ // Inner Join:
2378
+ // SubqueryAlias: t1
2379
+ // TableScan: test projection=[v]
2380
+ // SubqueryAlias: t2
2381
+ // TableScan: test projection=[v]
2382
+ let table_scan1 = table_scan ( Some ( "test" ) , & schema, Some ( vec ! [ 1 ] ) ) ?. build ( ) ?;
2383
+ let table_scan2 = table_scan ( Some ( "test" ) , & schema, Some ( vec ! [ 1 ] ) ) ?. build ( ) ?;
2384
+ let plan = LogicalPlanBuilder :: from ( subquery_alias ( table_scan1, "t1" ) ?)
2385
+ . join_on (
2386
+ subquery_alias ( table_scan2, "t2" ) ?,
2387
+ datafusion_expr:: JoinType :: Inner ,
2388
+ vec ! [ col( "t1.v" ) . eq( col( "t2.v" ) ) ] ,
2389
+ ) ?
2390
+ . build ( ) ?;
2391
+ let unparser = Unparser :: new ( & UnparserPostgreSqlDialect { } ) ;
2392
+ let sql = unparser. plan_to_sql ( & plan) ?;
2393
+ assert_snapshot ! (
2394
+ sql,
2395
+ @r#"SELECT "t1"."v", "t2"."v" FROM "test" AS "t1" INNER JOIN "test" AS "t2" ON ("t1"."v" = "t2"."v")"#
2396
+ ) ;
2397
+ Ok ( ( ) )
2398
+ }
2399
+
2400
+ #[ test]
2401
+ fn test_unparse_left_semi_join_with_table_scan_projection ( ) -> Result < ( ) > {
2402
+ let schema = Schema :: new ( vec ! [
2403
+ Field :: new( "k" , DataType :: Int32 , false ) ,
2404
+ Field :: new( "v" , DataType :: Int32 , false ) ,
2405
+ ] ) ;
2406
+ // LeftSemi Join:
2407
+ // SubqueryAlias: t1
2408
+ // TableScan: test projection=[v]
2409
+ // SubqueryAlias: t2
2410
+ // TableScan: test projection=[v]
2411
+ let table_scan1 = table_scan ( Some ( "test" ) , & schema, Some ( vec ! [ 1 ] ) ) ?. build ( ) ?;
2412
+ let table_scan2 = table_scan ( Some ( "test" ) , & schema, Some ( vec ! [ 1 ] ) ) ?. build ( ) ?;
2413
+ let plan = LogicalPlanBuilder :: from ( subquery_alias ( table_scan1, "t1" ) ?)
2414
+ . join_on (
2415
+ subquery_alias ( table_scan2, "t2" ) ?,
2416
+ datafusion_expr:: JoinType :: LeftSemi ,
2417
+ vec ! [ col( "t1.v" ) . eq( col( "t2.v" ) ) ] ,
2418
+ ) ?
2419
+ . build ( ) ?;
2420
+ let unparser = Unparser :: new ( & UnparserPostgreSqlDialect { } ) ;
2421
+ let sql = unparser. plan_to_sql ( & plan) ?;
2422
+ assert_snapshot ! (
2423
+ sql,
2424
+ @r#"SELECT "t1"."v" FROM "test" AS "t1" WHERE EXISTS (SELECT 1 FROM "test" AS "t2" WHERE ("t1"."v" = "t2"."v"))"#
2425
+ ) ;
2426
+ Ok ( ( ) )
2427
+ }
0 commit comments