1- use datafusion:: physical_plan:: displayable;
2- use std:: sync:: Arc ;
3-
41use crate :: {
52 compile:: {
63 rewrite:: rewriter:: Rewriter ,
@@ -12,6 +9,9 @@ use crate::{
129 } ,
1310 config:: ConfigObjImpl ,
1411} ;
12+ use datafusion:: physical_plan:: displayable;
13+ use regex:: Regex ;
14+ use std:: sync:: Arc ;
1515
1616#[ tokio:: test]
1717async fn test_simple_wrapper ( ) {
@@ -965,6 +965,92 @@ async fn test_case_wrapper_escaping() {
965965 . contains( "\\ \\ \\ \\ \\ \\ `" ) ) ;
966966}
967967
968+ /// Test aliases for grouped CubeScan in wrapper
969+ /// qualifiers from join should get remapped to single from alias
970+ /// long generated aliases from Datafusion should get shortened
971+ #[ tokio:: test]
972+ async fn test_join_wrapper_cubescan_aliasing ( ) {
973+ if !Rewriter :: sql_push_down_enabled ( ) {
974+ return ;
975+ }
976+ init_testing_logger ( ) ;
977+
978+ let query_plan = convert_select_to_query_plan (
979+ // language=PostgreSQL
980+ r#"
981+ WITH
982+ -- This subquery should be represented as CubeScan(ungrouped=false) inside CubeScanWrapper
983+ cube_scan_subq AS (
984+ SELECT
985+ logs_alias.content logs_content,
986+ DATE_TRUNC('month', kibana_alias.last_mod) last_mod_month,
987+ CASE
988+ WHEN sum(kibana_alias."sumPrice") IS NOT NULL
989+ THEN sum(kibana_alias."sumPrice")
990+ ELSE 0
991+ END sum_price
992+ FROM KibanaSampleDataEcommerce kibana_alias
993+ JOIN Logs logs_alias
994+ ON kibana_alias.__cubeJoinField = logs_alias.__cubeJoinField
995+ GROUP BY
996+ logs_content,
997+ last_mod_month
998+ ),
999+ filter_subq AS (
1000+ SELECT
1001+ Logs.content logs_content_filter
1002+ FROM Logs
1003+ GROUP BY
1004+ logs_content_filter
1005+ )
1006+ SELECT
1007+ logs_content
1008+ FROM cube_scan_subq
1009+ WHERE
1010+ -- This subquery filter should trigger wrapping of whole query
1011+ logs_content IN (
1012+ SELECT
1013+ logs_content_filter
1014+ FROM filter_subq
1015+ )
1016+ GROUP BY
1017+ logs_content
1018+ ORDER BY
1019+ logs_content ASC
1020+ ;
1021+ "#
1022+ . to_string ( ) ,
1023+ DatabaseProtocol :: PostgreSQL ,
1024+ )
1025+ . await ;
1026+
1027+ let physical_plan = query_plan. as_physical_plan ( ) . await . unwrap ( ) ;
1028+ println ! (
1029+ "Physical plan: {}" ,
1030+ displayable( physical_plan. as_ref( ) ) . indent( )
1031+ ) ;
1032+
1033+ let logical_plan = query_plan. as_logical_plan ( ) ;
1034+ let sql = logical_plan
1035+ . find_cube_scan_wrapper ( )
1036+ . wrapped_sql
1037+ . unwrap ( )
1038+ . sql ;
1039+
1040+ // Check that all aliases from different tables have same qualifier, and that names are simple and short
1041+ // logs_content => logs_alias.content
1042+ // last_mod_month => DATE_TRUNC('month', kibana_alias.last_mod),
1043+ // sum_price => CASE WHEN sum(kibana_alias."sumPrice") ... END
1044+ let content_re = Regex :: new ( r#""logs_alias"."[a-zA-Z0-9_]{1,16}" "logs_content""# ) . unwrap ( ) ;
1045+ assert ! ( content_re. is_match( & sql) ) ;
1046+ let last_mod_month_re =
1047+ Regex :: new ( r#""logs_alias"."[a-zA-Z0-9_]{1,16}" "last_mod_month""# ) . unwrap ( ) ;
1048+ assert ! ( last_mod_month_re. is_match( & sql) ) ;
1049+ let sum_price_re = Regex :: new ( r#"CASE WHEN "logs_alias"."[a-zA-Z0-9_]{1,16}" IS NOT NULL THEN "logs_alias"."[a-zA-Z0-9_]{1,16}" ELSE 0 END "sum_price""# )
1050+ . unwrap ( ) ;
1051+ assert ! ( sum_price_re. is_match( & sql) ) ;
1052+ }
1053+
9681054/// Test that WrappedSelect(... limit=Some(0) ...) will render it correctly
9691055#[ tokio:: test]
9701056async fn test_wrapper_limit_zero ( ) {
0 commit comments