@@ -14624,19 +14624,19 @@ ORDER BY "source"."str0" ASC
1462414624 assert!(sql.contains("EXTRACT(EPOCH FROM"));
1462514625 }
1462614626
14627- // redshift-dateadd-[literal-date32-]to-interval rewrites DATEADD to DATE_ADD
1462814627 #[tokio::test]
14629- #[ignore]
1463014628 async fn test_dateadd_push_down() {
1463114629 if !Rewriter::sql_push_down_enabled() {
1463214630 return;
1463314631 }
1463414632 init_testing_logger();
1463514633
14634+ // Redshift function DATEADD
1463614635 let query_plan = convert_select_to_query_plan(
1463714636 "
1463814637 SELECT DATEADD(DAY, 7, order_date) AS d
1463914638 FROM KibanaSampleDataEcommerce AS k
14639+ WHERE LOWER(customer_gender) = 'test'
1464014640 GROUP BY 1
1464114641 ORDER BY 1 DESC
1464214642 "
@@ -14652,25 +14652,24 @@ ORDER BY "source"."str0" ASC
1465214652 );
1465314653
1465414654 let logical_plan = query_plan.as_logical_plan();
14655- assert!(logical_plan
14656- .find_cube_scan_wrapped_sql()
14657- .wrapped_sql
14658- .sql
14659- .contains("DATEADD(day, 7,"));
14655+ let sql = logical_plan.find_cube_scan_wrapped_sql().wrapped_sql.sql;
14656+ // redshift-dateadd-[literal-date32-]to-interval rewrites DATEADD to DATE_ADD
14657+ assert!(sql.contains("DATE_ADD("));
14658+ assert!(sql.contains("INTERVAL '7 DAY')"));
1466014659
14661- // BigQuery
14660+ // BigQuery + Postgres DATE_ADD + DAYS
14661+ let bq_templates = vec![("functions/DATE_ADD".to_string(), "{% if date_part|upper in ['YEAR', 'MONTH', 'QUARTER'] %}TIMESTAMP(DATETIME_ADD(DATETIME({{ args[0] }}), INTERVAL {{ interval }} {{ date_part }})){% else %}TIMESTAMP_ADD({{ args[0] }}, INTERVAL {{ interval }} {{ date_part }}){% endif %}".to_string())];
1466214662 let query_plan = convert_select_to_query_plan_customized(
1466314663 "
14664- SELECT DATEADD(DAY, 7, order_date ) AS d
14664+ SELECT DATE_ADD(order_date, INTERVAL '7 DAYS' ) AS d
1466514665 FROM KibanaSampleDataEcommerce AS k
14666+ WHERE LOWER(customer_gender) = 'test'
1466614667 GROUP BY 1
1466714668 ORDER BY 1 DESC
1466814669 "
1466914670 .to_string(),
1467014671 DatabaseProtocol::PostgreSQL,
14671- vec![
14672- ("functions/DATEADD".to_string(), "DATETIME_ADD(CAST({{ args[2] }} AS DATETTIME), INTERVAL {{ interval }} {{ date_part }})".to_string()),
14673- ],
14672+ bq_templates.clone(),
1467414673 )
1467514674 .await;
1467614675
@@ -14682,23 +14681,101 @@ ORDER BY "source"."str0" ASC
1468214681
1468314682 let logical_plan = query_plan.as_logical_plan();
1468414683 let sql = logical_plan.find_cube_scan_wrapped_sql().wrapped_sql.sql;
14685- assert!(sql.contains("DATETIME_ADD(CAST ("));
14686- assert!(sql.contains("INTERVAL 7 day )"));
14684+ assert!(sql.contains("TIMESTAMP_ADD ("));
14685+ assert!(sql.contains("INTERVAL 7 DAY )"));
1468714686
14688- // Postgres
14687+ // BigQuery + Redshift DATEADD + DAYS
14688+ let bq_templates = vec![("functions/DATE_ADD".to_string(), "{% if date_part|upper in ['YEAR', 'MONTH', 'QUARTER'] %}TIMESTAMP(DATETIME_ADD(DATETIME({{ args[0] }}), INTERVAL {{ interval }} {{ date_part }})){% else %}TIMESTAMP_ADD({{ args[0] }}, INTERVAL {{ interval }} {{ date_part }}){% endif %}".to_string())];
1468914689 let query_plan = convert_select_to_query_plan_customized(
1469014690 "
1469114691 SELECT DATEADD(DAY, 7, order_date) AS d
1469214692 FROM KibanaSampleDataEcommerce AS k
14693+ WHERE LOWER(customer_gender) = 'test'
14694+ GROUP BY 1
14695+ ORDER BY 1 DESC
14696+ "
14697+ .to_string(),
14698+ DatabaseProtocol::PostgreSQL,
14699+ bq_templates.clone(),
14700+ )
14701+ .await;
14702+
14703+ let physical_plan = query_plan.as_physical_plan().await.unwrap();
14704+ println!(
14705+ "Physical plan: {}",
14706+ displayable(physical_plan.as_ref()).indent()
14707+ );
14708+
14709+ let logical_plan = query_plan.as_logical_plan();
14710+ let sql = logical_plan.find_cube_scan_wrapped_sql().wrapped_sql.sql;
14711+ assert!(sql.contains("TIMESTAMP_ADD("));
14712+ assert!(sql.contains("INTERVAL 7 DAY)"));
14713+
14714+ // BigQuery + Postgres DATE_ADD + MONTHS
14715+ let query_plan = convert_select_to_query_plan_customized(
14716+ "
14717+ SELECT DATE_ADD(order_date, INTERVAL '7 MONTHS') AS d
14718+ FROM KibanaSampleDataEcommerce AS k
14719+ WHERE LOWER(customer_gender) = 'test'
14720+ GROUP BY 1
14721+ ORDER BY 1 DESC
14722+ "
14723+ .to_string(),
14724+ DatabaseProtocol::PostgreSQL,
14725+ bq_templates,
14726+ )
14727+ .await;
14728+
14729+ let physical_plan = query_plan.as_physical_plan().await.unwrap();
14730+ println!(
14731+ "Physical plan: {}",
14732+ displayable(physical_plan.as_ref()).indent()
14733+ );
14734+
14735+ let logical_plan = query_plan.as_logical_plan();
14736+ let sql = logical_plan.find_cube_scan_wrapped_sql().wrapped_sql.sql;
14737+ assert!(sql.contains("TIMESTAMP(DATETIME_ADD(DATETIME("));
14738+ assert!(sql.contains("INTERVAL 7 MONTH)"));
14739+
14740+ // BigQuery + Redshift DATEADD + MONTHS
14741+ let bq_templates = vec![("functions/DATE_ADD".to_string(), "{% if date_part|upper in ['YEAR', 'MONTH', 'QUARTER'] %}TIMESTAMP(DATETIME_ADD(DATETIME({{ args[0] }}), INTERVAL {{ interval }} {{ date_part }})){% else %}TIMESTAMP_ADD({{ args[0] }}, INTERVAL {{ interval }} {{ date_part }}){% endif %}".to_string())];
14742+ let query_plan = convert_select_to_query_plan_customized(
14743+ "
14744+ SELECT DATEADD(MONTH, 7, order_date) AS d
14745+ FROM KibanaSampleDataEcommerce AS k
14746+ WHERE LOWER(customer_gender) = 'test'
14747+ GROUP BY 1
14748+ ORDER BY 1 DESC
14749+ "
14750+ .to_string(),
14751+ DatabaseProtocol::PostgreSQL,
14752+ bq_templates.clone(),
14753+ )
14754+ .await;
14755+
14756+ let physical_plan = query_plan.as_physical_plan().await.unwrap();
14757+ println!(
14758+ "Physical plan: {}",
14759+ displayable(physical_plan.as_ref()).indent()
14760+ );
14761+
14762+ let logical_plan = query_plan.as_logical_plan();
14763+ let sql = logical_plan.find_cube_scan_wrapped_sql().wrapped_sql.sql;
14764+ assert!(sql.contains("TIMESTAMP(DATETIME_ADD(DATETIME("));
14765+ assert!(sql.contains("INTERVAL 7 MONTH)"));
14766+
14767+ // Postgres DATE_ADD
14768+ let query_plan = convert_select_to_query_plan_customized(
14769+ "
14770+ SELECT DATE_ADD(order_date, INTERVAL '7 DAYS') AS d
14771+ FROM KibanaSampleDataEcommerce AS k
14772+ WHERE LOWER(customer_gender) = 'test'
1469314773 GROUP BY 1
1469414774 ORDER BY 1 DESC
1469514775 "
1469614776 .to_string(),
1469714777 DatabaseProtocol::PostgreSQL,
14698- vec![(
14699- "functions/DATEADD".to_string(),
14700- "({{ args[2] }} + \'{{ interval }} {{ date_part }}\'::interval)".to_string(),
14701- )],
14778+ vec![],
1470214779 )
1470314780 .await;
1470414781
@@ -14710,7 +14787,8 @@ ORDER BY "source"."str0" ASC
1471014787
1471114788 let logical_plan = query_plan.as_logical_plan();
1471214789 let sql = logical_plan.find_cube_scan_wrapped_sql().wrapped_sql.sql;
14713- assert!(sql.contains("+ '7 day'::interval"));
14790+ assert!(sql.contains("DATE_ADD("));
14791+ assert!(sql.contains("INTERVAL '7 DAY'"));
1471414792 }
1471514793
1471614794 #[tokio::test]
0 commit comments