From b6b983173f6d5ab981ca872339965aad32f25bf2 Mon Sep 17 00:00:00 2001 From: nuno-faria Date: Sat, 3 Oct 2026 19:24:53 +0100 Subject: [PATCH 1/3] fix: Unparse random as rand for some dialects --- datafusion/sql/src/unparser/dialect.rs | 8 +++++++ datafusion/sql/src/unparser/expr.rs | 29 +++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/datafusion/sql/src/unparser/dialect.rs b/datafusion/sql/src/unparser/dialect.rs index bea4e353001cd..16861fd8323bd 100644 --- a/datafusion/sql/src/unparser/dialect.rs +++ b/datafusion/sql/src/unparser/dialect.rs @@ -620,6 +620,10 @@ impl Dialect for MySqlDialect { return date_part_to_sql(unparser, self.date_field_extract_style(), args); } + if func_name == "random" { + return Ok(Some(unparser.scalar_function_to_sql("rand", args)?)); + } + Ok(None) } } @@ -760,6 +764,10 @@ impl Dialect for BigQueryDialect { return date_part_to_sql(unparser, self.date_field_extract_style(), args); } + if func_name == "random" { + return Ok(Some(unparser.scalar_function_to_sql("rand", args)?)); + } + Ok(None) } } diff --git a/datafusion/sql/src/unparser/expr.rs b/datafusion/sql/src/unparser/expr.rs index 3fb349f5ed2a1..107334905da68 100644 --- a/datafusion/sql/src/unparser/expr.rs +++ b/datafusion/sql/src/unparser/expr.rs @@ -1957,7 +1957,7 @@ mod tests { use std::ops::{Add, Sub}; use std::{sync::Arc, vec}; - use crate::unparser::dialect::{MySqlDialect, SqliteDialect}; + use crate::unparser::dialect::{MySqlDialect, SnowflakeDialect, SqliteDialect}; use arrow::array::{LargeListArray, LargeListViewArray, ListArray, ListViewArray}; use arrow::datatypes::{DataType::Int8, Field, Int32Type, Schema, TimeUnit}; use ast::ObjectName; @@ -3966,4 +3966,31 @@ mod tests { "NULL" ); } + + #[test] + fn test_random_function() -> Result<()> { + let duckdb_dialect = DuckDBDialect::new(); + let dialects = vec![ + (Unparser::new(&DefaultDialect {}), "random()"), + (Unparser::new(&PostgreSqlDialect {}), "random()"), + (Unparser::new(&duckdb_dialect), "random()"), + (Unparser::new(&MySqlDialect {}), "rand()"), + (Unparser::new(&SqliteDialect {}), "random()"), + (Unparser::new(&BigQueryDialect {}), "rand()"), + (Unparser::new(&SnowflakeDialect {}), "random()"), + ]; + + let expr = Expr::ScalarFunction(ScalarFunction { + func: Arc::new(ScalarUDF::from( + datafusion_functions::math::random::RandomFunc::new(), + )), + args: vec![], + }); + + for (unparser, result) in dialects { + assert_eq!(unparser.expr_to_sql(&expr)?.to_string(), result); + } + + Ok(()) + } } From 855067720bea18adf4fb6845d41aeb5307ee7582 Mon Sep 17 00:00:00 2001 From: nuno-faria Date: Sat, 3 Oct 2026 20:06:10 +0100 Subject: [PATCH 2/3] Fix test --- datafusion/core/tests/sql/unparser.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datafusion/core/tests/sql/unparser.rs b/datafusion/core/tests/sql/unparser.rs index 14c04789e206f..345070e51444f 100644 --- a/datafusion/core/tests/sql/unparser.rs +++ b/datafusion/core/tests/sql/unparser.rs @@ -889,7 +889,7 @@ async fn optimized_filter_after_projection() -> Result<()> { let sql = unparser.plan_to_sql(&plan)?.to_string(); assert_eq!( sql, - "SELECT * FROM (SELECT `t`.`a`, random() AS `x` FROM `t`) AS `derived_projection` WHERE (`x` > CAST(`derived_projection`.`a` AS DOUBLE))" + "SELECT * FROM (SELECT `t`.`a`, rand() AS `x` FROM `t`) AS `derived_projection` WHERE (`x` > CAST(`derived_projection`.`a` AS DOUBLE))" ); Ok(()) From db420080aaaada7a49b00a53c4b7e952b475f88c Mon Sep 17 00:00:00 2001 From: nuno-faria Date: Sun, 4 Oct 2026 11:16:41 +0100 Subject: [PATCH 3/3] Add links to docs --- datafusion/sql/src/unparser/dialect.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/datafusion/sql/src/unparser/dialect.rs b/datafusion/sql/src/unparser/dialect.rs index 16861fd8323bd..fbe7323bc98a9 100644 --- a/datafusion/sql/src/unparser/dialect.rs +++ b/datafusion/sql/src/unparser/dialect.rs @@ -620,6 +620,7 @@ impl Dialect for MySqlDialect { return date_part_to_sql(unparser, self.date_field_extract_style(), args); } + // https://dev.mysql.com/doc/refman/9.7/en/mathematical-functions.html#function_rand if func_name == "random" { return Ok(Some(unparser.scalar_function_to_sql("rand", args)?)); } @@ -764,6 +765,7 @@ impl Dialect for BigQueryDialect { return date_part_to_sql(unparser, self.date_field_extract_style(), args); } + // https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/mathematical_functions#rand if func_name == "random" { return Ok(Some(unparser.scalar_function_to_sql("rand", args)?)); }