@@ -2342,3 +2342,86 @@ fn test_unparse_right_anti_join() -> Result<()> {
23422342 ) ;
23432343 Ok ( ( ) )
23442344}
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