diff --git a/packages/cubejs-schema-compiler/src/adapter/PrestodbQuery.ts b/packages/cubejs-schema-compiler/src/adapter/PrestodbQuery.ts index 962f175c98c52..70505ef1a60e8 100644 --- a/packages/cubejs-schema-compiler/src/adapter/PrestodbQuery.ts +++ b/packages/cubejs-schema-compiler/src/adapter/PrestodbQuery.ts @@ -136,6 +136,7 @@ export class PrestodbQuery extends BaseQuery { const templates = super.sqlTemplates(); templates.functions.DATETRUNC = 'DATE_TRUNC({{ args_concat }})'; templates.functions.DATEPART = 'DATE_PART({{ args_concat }})'; + templates.functions.CURRENTDATE = 'CURRENT_DATE'; delete templates.functions.PERCENTILECONT; templates.statements.select = '{% if ctes %} WITH \n' + '{{ ctes | join(\',\n\') }}\n' + @@ -153,6 +154,10 @@ export class PrestodbQuery extends BaseQuery { templates.expressions.extract = 'EXTRACT({{ date_part }} FROM {{ expr }})'; templates.expressions.interval_single_date_part = 'INTERVAL \'{{ num }}\' {{ date_part }}'; templates.expressions.timestamp_literal = 'from_iso8601_timestamp(\'{{ value }}\')'; + // Presto requires concat types to be VARCHAR + templates.expressions.binary = '{% if op == \'||\' %}' + + 'CAST({{ left }} AS VARCHAR) || CAST({{ right }} AS VARCHAR)' + + '{% else %}{{ left }} {{ op }} {{ right }}{% endif %}'; delete templates.expressions.ilike; templates.types.string = 'VARCHAR'; templates.types.float = 'REAL'; diff --git a/rust/cubesql/cubesql/src/compile/mod.rs b/rust/cubesql/cubesql/src/compile/mod.rs index d2e19faa8e41a..a6df1bdfd217e 100644 --- a/rust/cubesql/cubesql/src/compile/mod.rs +++ b/rust/cubesql/cubesql/src/compile/mod.rs @@ -17223,4 +17223,48 @@ LIMIT {{ limit }}{% endif %}"#.to_string(), } ) } + + #[tokio::test] + async fn test_athena_concat_numbers() { + if !Rewriter::sql_push_down_enabled() { + return; + } + init_testing_logger(); + + let query_plan = convert_select_to_query_plan_customized( + r#" + SELECT + CAST(EXTRACT(YEAR FROM "ta_1"."order_date") || '-' || 1 || '-01' AS DATE) AS "ca_1", + COALESCE(sum("ta_1"."sumPrice"), 0) AS "ca_2" + FROM "ovr"."public"."KibanaSampleDataEcommerce" AS "ta_1" + WHERE (( + EXTRACT(DAY FROM "ta_1"."order_date") <= EXTRACT(DAY FROM CURRENT_DATE) + AND EXTRACT(MONTH FROM "ta_1"."order_date") = EXTRACT(MONTH FROM CURRENT_DATE) + )) + GROUP BY "ca_1" + ORDER BY "ca_1" ASC NULLS LAST + LIMIT 5000 + "# + .to_string(), + DatabaseProtocol::PostgreSQL, + vec![( + "expressions/binary".to_string(), + "'{% if op == \'||\' %}CAST({{ left }} AS VARCHAR) || \ + CAST({{ right }} AS VARCHAR)\ + {% else %}{{ left }} {{ op }} {{ right }}{% endif %}'" + .to_string(), + )], + ) + .await; + + let physical_plan = query_plan.as_physical_plan().await.unwrap(); + println!( + "Physical plan: {}", + displayable(physical_plan.as_ref()).indent() + ); + + let logical_plan = query_plan.as_logical_plan(); + let sql = logical_plan.find_cube_scan_wrapped_sql().wrapped_sql.sql; + assert!(sql.contains("CAST(1 AS VARCHAR)")); + } }