From 9ceeb6c2ed1cc3084a7a82a888bb6c7b11b76006 Mon Sep 17 00:00:00 2001 From: Thomas Lin Pedersen Date: Fri, 9 Oct 2026 09:27:44 +0200 Subject: [PATCH 1/2] Fix temporal casting --- src/golden/databricks.sql | 2 +- src/reader/dialects/databricks.rs | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/golden/databricks.sql b/src/golden/databricks.sql index 599a54d6a..733154243 100644 --- a/src/golden/databricks.sql +++ b/src/golden/databricks.sql @@ -80,7 +80,7 @@ SELECT *, `id` AS `__ggsql_aes_pos1__`, `val` AS `__ggsql_aes_pos2__` FROM (SELE -- case: binned_temporal SELECT * FROM (SELECT * FROM ggsql_live_test) AS `__schema__` LIMIT 1; WITH `__ggsql_source__` AS (SELECT *, `day` AS `__ggsql_aes_pos1__`, `val` AS `__ggsql_aes_pos2__` FROM (SELECT * FROM ggsql_live_test) AS `__ggsql_src__`) SELECT MIN(`id`) AS `__ggsql_min_id`, MAX(`id`) AS `__ggsql_max_id`, MIN(`val`) AS `__ggsql_min_val`, MAX(`val`) AS `__ggsql_max_val`, MIN(`grp`) AS `__ggsql_min_grp`, MAX(`grp`) AS `__ggsql_max_grp`, MIN(`day`) AS `__ggsql_min_day`, MAX(`day`) AS `__ggsql_max_day`, MIN(`mixed Case`) AS `__ggsql_min_mixed Case`, MAX(`mixed Case`) AS `__ggsql_max_mixed Case` FROM `__ggsql_source__`; -SELECT `id`, `val`, `grp`, `day`, `mixed Case`, (CASE WHEN CAST(`__ggsql_aes_pos1__` AS DOUBLE) >= 19000 AND CAST(`__ggsql_aes_pos1__` AS DOUBLE) < 19000.2 THEN 19000.1 WHEN CAST(`__ggsql_aes_pos1__` AS DOUBLE) >= 19000.2 AND CAST(`__ggsql_aes_pos1__` AS DOUBLE) < 19000.4 THEN 19000.300000000003 WHEN CAST(`__ggsql_aes_pos1__` AS DOUBLE) >= 19000.4 AND CAST(`__ggsql_aes_pos1__` AS DOUBLE) < 19000.6 THEN 19000.5 WHEN CAST(`__ggsql_aes_pos1__` AS DOUBLE) >= 19000.6 AND CAST(`__ggsql_aes_pos1__` AS DOUBLE) < 19000.8 THEN 19000.699999999997 WHEN CAST(`__ggsql_aes_pos1__` AS DOUBLE) >= 19000.8 AND CAST(`__ggsql_aes_pos1__` AS DOUBLE) < 19001 THEN 19000.9 WHEN CAST(`__ggsql_aes_pos1__` AS DOUBLE) >= 19001 AND CAST(`__ggsql_aes_pos1__` AS DOUBLE) <= 19001.2 THEN 19001.1 ELSE NULL END) AS `__ggsql_aes_pos1__`, `__ggsql_aes_pos2__` FROM (SELECT *, `day` AS `__ggsql_aes_pos1__`, `val` AS `__ggsql_aes_pos2__` FROM (SELECT * FROM ggsql_live_test) AS `__ggsql_src__`) AS `__ggsql_pre__`; +SELECT `id`, `val`, `grp`, `day`, `mixed Case`, (CASE WHEN UNIX_DATE(`__ggsql_aes_pos1__`) >= 19000 AND UNIX_DATE(`__ggsql_aes_pos1__`) < 19000.2 THEN 19000.1 WHEN UNIX_DATE(`__ggsql_aes_pos1__`) >= 19000.2 AND UNIX_DATE(`__ggsql_aes_pos1__`) < 19000.4 THEN 19000.300000000003 WHEN UNIX_DATE(`__ggsql_aes_pos1__`) >= 19000.4 AND UNIX_DATE(`__ggsql_aes_pos1__`) < 19000.6 THEN 19000.5 WHEN UNIX_DATE(`__ggsql_aes_pos1__`) >= 19000.6 AND UNIX_DATE(`__ggsql_aes_pos1__`) < 19000.8 THEN 19000.699999999997 WHEN UNIX_DATE(`__ggsql_aes_pos1__`) >= 19000.8 AND UNIX_DATE(`__ggsql_aes_pos1__`) < 19001 THEN 19000.9 WHEN UNIX_DATE(`__ggsql_aes_pos1__`) >= 19001 AND UNIX_DATE(`__ggsql_aes_pos1__`) <= 19001.2 THEN 19001.1 ELSE NULL END) AS `__ggsql_aes_pos1__`, `__ggsql_aes_pos2__` FROM (SELECT *, `day` AS `__ggsql_aes_pos1__`, `val` AS `__ggsql_aes_pos2__` FROM (SELECT * FROM ggsql_live_test) AS `__ggsql_src__`) AS `__ggsql_pre__`; -- case: binned_temporal_date SELECT * FROM (SELECT * FROM ggsql_live_test) AS `__schema__` LIMIT 1; diff --git a/src/reader/dialects/databricks.rs b/src/reader/dialects/databricks.rs index 8d59e108f..9dcfa9704 100644 --- a/src/reader/dialects/databricks.rs +++ b/src/reader/dialects/databricks.rs @@ -74,6 +74,25 @@ impl SqlDialect for DatabricksDialect { ) } + fn sql_temporal_as_number( + &self, + expr: &str, + kind: crate::plot::types::CastTargetType, + ) -> String { + // Spark rejects temporal → numeric casts outright + // ([DATATYPE_MISMATCH.CAST_WITH_FUNC_SUGGESTION] and suggests the + // unix_* extractors instead). + use crate::plot::types::CastTargetType as C; + match kind { + C::Date => format!("UNIX_DATE({expr})"), + C::DateTime => format!("unix_micros({expr})"), + _ => { + let ty = self.type_names().number.unwrap_or("DOUBLE"); + self.sql_cast(expr, ty) + } + } + } + fn temp_table_style(&self) -> crate::reader::TempTableStyle { crate::reader::TempTableStyle::CreateOrReplaceTempView } From ba016f651971ecf7ce12d5f9a46d05dd334d50f6 Mon Sep 17 00:00:00 2001 From: Thomas Lin Pedersen Date: Fri, 9 Oct 2026 09:36:29 +0200 Subject: [PATCH 2/2] wait for snowflake credentials --- .github/workflows/dialect-live-cloud.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/dialect-live-cloud.yml b/.github/workflows/dialect-live-cloud.yml index e4e7d1342..b10017fcb 100644 --- a/.github/workflows/dialect-live-cloud.yml +++ b/.github/workflows/dialect-live-cloud.yml @@ -53,7 +53,10 @@ jobs: fail-fast: false matrix: include: - - { backend: snowflake, driver: snowflake } + # Disabled until Snowflake credentials are provisioned: without + # the GGSQL_TEST_URI_SNOWFLAKE secret the leg fails the + # missing-secret check on the origin repo. + # - { backend: snowflake, driver: snowflake } - { backend: bigquery, driver: bigquery } - { backend: databricks, driver: databricks }