@@ -45,7 +45,7 @@ use self::{
4545 },
4646 parser::parse_sql_to_statement,
4747 qtrace::Qtrace,
48- rewrite::converter::LogicalPlanToLanguageConverter,
48+ rewrite::converter::{LogicalPlanToLanguageContext, LogicalPlanToLanguageConverter} ,
4949};
5050use crate::{
5151 sql::{
@@ -1313,7 +1313,11 @@ WHERE `TABLE_SCHEMA` = '{}'",
13131313 let mut converter = LogicalPlanToLanguageConverter::new(cube_ctx.clone());
13141314 let mut query_params = Some(HashMap::new());
13151315 let root = converter
1316- .add_logical_plan_replace_params(&optimized_plan, &mut query_params)
1316+ .add_logical_plan_replace_params(
1317+ &optimized_plan,
1318+ &mut query_params,
1319+ &mut LogicalPlanToLanguageContext::default(),
1320+ )
13171321 .map_err(|e| CompilationError::internal(e.to_string()))?;
13181322
13191323 let mut finalized_graph = self
@@ -20115,14 +20119,149 @@ ORDER BY "source"."str0" ASC
2011520119 }
2011620120
2011720121 #[tokio::test]
20118- async fn test_simple_subquery_wrapper_projection() {
20122+ async fn test_simple_subquery_wrapper_projection_empty_source() {
20123+ if !Rewriter::sql_push_down_enabled() {
20124+ return;
20125+ }
20126+ init_logger();
20127+
20128+ let query_plan = convert_select_to_query_plan(
20129+ "SELECT (SELECT 'male' where 1 group by 'male' having 1 order by 'male' limit 1) as gender, avgPrice FROM KibanaSampleDataEcommerce a"
20130+ .to_string(),
20131+ DatabaseProtocol::PostgreSQL,
20132+ )
20133+ .await;
20134+
20135+ let logical_plan = query_plan.as_logical_plan();
20136+ let sql = logical_plan
20137+ .find_cube_scan_wrapper()
20138+ .wrapped_sql
20139+ .unwrap()
20140+ .sql;
20141+ assert!(sql.contains("(SELECT"));
20142+ assert!(sql.contains("utf8__male__"));
20143+
20144+ let _physical_plan = query_plan.as_physical_plan().await.unwrap();
20145+ //println!("phys plan {:?}", physical_plan);
20146+ }
20147+
20148+ #[tokio::test]
20149+ async fn test_simple_subquery_wrapper_filter_empty_source() {
2011920150 if !Rewriter::sql_push_down_enabled() {
2012020151 return;
2012120152 }
2012220153 init_logger();
2012320154
2012420155 let query_plan = convert_select_to_query_plan(
20125- "SELECT (SELECT customer_gender FROM KibanaSampleDataEcommerce WHERE customer_gender = 'male' LIMIT 1) as gender, avgPrice FROM KibanaSampleDataEcommerce a"
20156+ "SELECT avgPrice FROM KibanaSampleDataEcommerce a where customer_gender = (SELECT 'male' )"
20157+ .to_string(),
20158+ DatabaseProtocol::PostgreSQL,
20159+ )
20160+ .await;
20161+
20162+ let logical_plan = query_plan.as_logical_plan();
20163+ let sql = logical_plan
20164+ .find_cube_scan_wrapper()
20165+ .wrapped_sql
20166+ .unwrap()
20167+ .sql;
20168+ assert!(sql.contains("(SELECT"));
20169+ assert!(sql.contains("utf8__male__"));
20170+
20171+ let _physical_plan = query_plan.as_physical_plan().await.unwrap();
20172+ //println!("phys plan {:?}", physical_plan);
20173+ }
20174+
20175+ #[tokio::test]
20176+ async fn test_simple_subquery_wrapper_projection_aggregate_empty_source() {
20177+ if !Rewriter::sql_push_down_enabled() {
20178+ return;
20179+ }
20180+ init_logger();
20181+
20182+ let query_plan = convert_select_to_query_plan(
20183+ "SELECT (SELECT 'male'), avg(avgPrice) FROM KibanaSampleDataEcommerce a GROUP BY 1"
20184+ .to_string(),
20185+ DatabaseProtocol::PostgreSQL,
20186+ )
20187+ .await;
20188+
20189+ let logical_plan = query_plan.as_logical_plan();
20190+ let sql = logical_plan
20191+ .find_cube_scan_wrapper()
20192+ .wrapped_sql
20193+ .unwrap()
20194+ .sql;
20195+ assert!(sql.contains("(SELECT"));
20196+ assert!(sql.contains("utf8__male__"));
20197+
20198+ let _physical_plan = query_plan.as_physical_plan().await.unwrap();
20199+ }
20200+
20201+ #[tokio::test]
20202+ async fn test_simple_subquery_wrapper_filter_in_empty_source() {
20203+ if !Rewriter::sql_push_down_enabled() {
20204+ return;
20205+ }
20206+ init_logger();
20207+
20208+ let query_plan = convert_select_to_query_plan(
20209+ "SELECT customer_gender, avgPrice FROM KibanaSampleDataEcommerce a where customer_gender in (select 'male')"
20210+ .to_string(),
20211+ DatabaseProtocol::PostgreSQL,
20212+ )
20213+ .await;
20214+
20215+ let logical_plan = query_plan.as_logical_plan();
20216+ let sql = logical_plan
20217+ .find_cube_scan_wrapper()
20218+ .wrapped_sql
20219+ .unwrap()
20220+ .sql;
20221+ assert!(sql.contains("IN (SELECT"));
20222+ assert!(sql.contains("utf8__male__"));
20223+
20224+ let _physical_plan = query_plan.as_physical_plan().await.unwrap();
20225+ }
20226+
20227+ #[tokio::test]
20228+ async fn test_simple_subquery_wrapper_filter_and_projection_empty_source() {
20229+ if !Rewriter::sql_push_down_enabled() {
20230+ return;
20231+ }
20232+ init_logger();
20233+
20234+ let query_plan = convert_select_to_query_plan(
20235+ "SELECT (select 'male'), avgPrice FROM KibanaSampleDataEcommerce a where customer_gender in (select 'female')"
20236+ .to_string(),
20237+ DatabaseProtocol::PostgreSQL,
20238+ )
20239+ .await;
20240+
20241+ let logical_plan = query_plan.as_logical_plan();
20242+
20243+ let sql = logical_plan
20244+ .find_cube_scan_wrapper()
20245+ .wrapped_sql
20246+ .unwrap()
20247+ .sql;
20248+ assert!(sql.contains("IN (SELECT"));
20249+ assert!(sql.contains("(SELECT"));
20250+ assert!(sql.contains("utf8__male__"));
20251+ assert!(sql.contains("utf8__female__"));
20252+
20253+ let _physical_plan = query_plan.as_physical_plan().await.unwrap();
20254+ }
20255+
20256+ #[tokio::test]
20257+ async fn test_simple_subquery_wrapper_projection_1() {
20258+ if !Rewriter::sql_push_down_enabled() {
20259+ return;
20260+ }
20261+ init_logger();
20262+
20263+ let query_plan = convert_select_to_query_plan(
20264+ "SELECT (SELECT customer_gender FROM KibanaSampleDataEcommerce LIMIT 1) as gender, avgPrice FROM KibanaSampleDataEcommerce a"
2012620265 .to_string(),
2012720266 DatabaseProtocol::PostgreSQL,
2012820267 )
@@ -20166,12 +20305,6 @@ ORDER BY "source"."str0" ASC
2016620305 .unwrap()
2016720306 .sql
2016820307 .contains("(SELECT"));
20169- assert!(logical_plan
20170- .find_cube_scan_wrapper()
20171- .wrapped_sql
20172- .unwrap()
20173- .sql
20174- .contains("LIMIT 1"));
2017520308
2017620309 let _physical_plan = query_plan.as_physical_plan().await.unwrap();
2017720310 }
0 commit comments