This is an automated email from the ASF dual-hosted git repository.
philo-he pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gluten.git
The following commit(s) were added to refs/heads/main by this push:
new 0c7dcc6333 [VL] Support format_number function (#12754)
0c7dcc6333 is described below
commit 0c7dcc6333ed3f9ad2d5e7bf2184717e7ce48120
Author: Kaifei Yi <[email protected]>
AuthorDate: Sat Aug 15 00:41:05 2026 +0800
[VL] Support format_number function (#12754)
---
.../org/apache/gluten/utils/CHExpressionUtil.scala | 3 ++-
.../gluten/expression/ExpressionRestrictions.scala | 18 ++++++++++++-
.../functions/ScalarFunctionsValidateSuite.scala | 30 ++++++++++++++++++++++
docs/velox-backend-scalar-function-support.md | 4 +--
.../gluten/expression/ExpressionMappings.scala | 1 +
.../apache/gluten/expression/ExpressionNames.scala | 1 +
6 files changed, 53 insertions(+), 4 deletions(-)
diff --git
a/backends-clickhouse/src/main/scala/org/apache/gluten/utils/CHExpressionUtil.scala
b/backends-clickhouse/src/main/scala/org/apache/gluten/utils/CHExpressionUtil.scala
index 76f8d6c1f1..1a7dc3aa13 100644
---
a/backends-clickhouse/src/main/scala/org/apache/gluten/utils/CHExpressionUtil.scala
+++
b/backends-clickhouse/src/main/scala/org/apache/gluten/utils/CHExpressionUtil.scala
@@ -214,6 +214,7 @@ object CHExpressionUtil {
DIV -> DefaultValidator(),
REGEXP_INSTR -> DefaultValidator(),
DAY_NAME -> DefaultValidator(),
- MONTH_NAME -> DefaultValidator()
+ MONTH_NAME -> DefaultValidator(),
+ FORMAT_NUMBER -> DefaultValidator()
)
}
diff --git
a/backends-velox/src/main/scala/org/apache/gluten/expression/ExpressionRestrictions.scala
b/backends-velox/src/main/scala/org/apache/gluten/expression/ExpressionRestrictions.scala
index 04f776fa42..b6bfd4119b 100644
---
a/backends-velox/src/main/scala/org/apache/gluten/expression/ExpressionRestrictions.scala
+++
b/backends-velox/src/main/scala/org/apache/gluten/expression/ExpressionRestrictions.scala
@@ -101,6 +101,21 @@ object RaiseErrorRestrictions extends
ExpressionRestrictions {
override val restrictionMessages: Array[String] =
Array(ONLY_SUPPORT_ERROR_MESSAGE)
}
+object FormatNumberRestrictions extends ExpressionRestrictions {
+ val NOT_SUPPORT_DECIMAL_INPUT: String =
+ s"${ExpressionNames.FORMAT_NUMBER} only supports tinyint, smallint,
integer, bigint, " +
+ s"float and double input; DecimalType input is not supported in Velox"
+
+ val NOT_SUPPORT_STRING_FORMAT: String =
+ s"${ExpressionNames.FORMAT_NUMBER} with a string format argument (e.g.
'#,###.##') is not " +
+ s"supported in Velox; only an integer number of decimal places is
supported"
+
+ override val functionName: String = ExpressionNames.FORMAT_NUMBER
+
+ override val restrictionMessages: Array[String] =
+ Array(NOT_SUPPORT_DECIMAL_INPUT, NOT_SUPPORT_STRING_FORMAT)
+}
+
object ExpressionRestrictions {
// Called by gen-function-support-docs.py to get all restrictions.
def listAllRestrictions(): Array[ExpressionRestrictions] = {
@@ -109,7 +124,8 @@ object ExpressionRestrictions {
FromJsonRestrictions,
ToJsonRestrictions,
Unbase64Restrictions,
- Base64Restrictions
+ Base64Restrictions,
+ FormatNumberRestrictions
)
}
}
diff --git
a/backends-velox/src/test/scala/org/apache/gluten/functions/ScalarFunctionsValidateSuite.scala
b/backends-velox/src/test/scala/org/apache/gluten/functions/ScalarFunctionsValidateSuite.scala
index 418cae1b9b..557b86a17d 100644
---
a/backends-velox/src/test/scala/org/apache/gluten/functions/ScalarFunctionsValidateSuite.scala
+++
b/backends-velox/src/test/scala/org/apache/gluten/functions/ScalarFunctionsValidateSuite.scala
@@ -749,6 +749,36 @@ class ScalarFunctionsValidateSuite extends
FunctionsValidateSuite {
}
}
+ test("format_number") {
+ // Integer / bigint input with different decimal places.
+ runQueryAndCompare("SELECT format_number(l_partkey, 0) FROM lineitem limit
50") {
+ checkGlutenPlan[ProjectExecTransformer]
+ }
+ runQueryAndCompare("SELECT format_number(l_orderkey, 2) FROM lineitem
limit 50") {
+ checkGlutenPlan[ProjectExecTransformer]
+ }
+ // Floating-point input, exercising HALF_EVEN rounding and thousands
separators.
+ runQueryAndCompare(
+ "SELECT format_number(cast(l_quantity as double), 1) FROM lineitem limit
50") {
+ checkGlutenPlan[ProjectExecTransformer]
+ }
+ runQueryAndCompare(
+ "SELECT format_number(cast(l_discount as double), 3) FROM lineitem limit
50") {
+ checkGlutenPlan[ProjectExecTransformer]
+ }
+ // Velox format_number only supports
tinyint/smallint/integer/bigint/float/double.
+ // Decimal input has no matching signature, so it must fall back to
vanilla Spark.
+ runQueryAndCompare("SELECT format_number(l_quantity, 1) FROM lineitem
limit 50") {
+ checkSparkPlan[ProjectExec]
+ }
+ // Velox only implements the integer decimal-places form. The
string-format form
+ // (e.g. '#,###.##') has no matching signature, so it must fall back to
vanilla Spark.
+ runQueryAndCompare(
+ "SELECT format_number(cast(l_quantity as double), '#,###.##') FROM
lineitem limit 50") {
+ checkSparkPlan[ProjectExec]
+ }
+ }
+
testWithMinSparkVersion("mask", "3.4") {
runQueryAndCompare("SELECT mask(c_comment) FROM customer limit 50") {
checkGlutenPlan[ProjectExecTransformer]
diff --git a/docs/velox-backend-scalar-function-support.md
b/docs/velox-backend-scalar-function-support.md
index 8732d4ed4d..6924767eea 100644
--- a/docs/velox-backend-scalar-function-support.md
+++ b/docs/velox-backend-scalar-function-support.md
@@ -1,6 +1,6 @@
# Scalar Functions Support Status
-**Out of 357 scalar functions in Spark 3.5, Gluten currently fully supports
245 functions and partially supports 27 functions.**
+**Out of 357 scalar functions in Spark 3.5, Gluten currently fully supports
245 functions and partially supports 28 functions.**
## Array Functions
@@ -370,7 +370,7 @@
| encode | Encode | |
|
| endswith | EndsWithExpressionBuilder | PS | BinaryType
unsupported |
| find_in_set | FindInSet | S |
|
-| format_number | FormatNumber | |
|
+| format_number | FormatNumber | PS | format_number
only supports tinyint, smallint, integer, bigint, float and double input;
DecimalType input is not supported in Velox<br>format_number with a string
format argument (e.g. '#,###.##') is not supported in Velox; only an integer
number of decimal places is supported |
| format_string | FormatString | |
|
| initcap | InitCap | S |
|
| instr | StringInstr | S |
|
diff --git
a/gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala
b/gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala
index d0ed9347b6..5193f31d66 100644
---
a/gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala
+++
b/gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala
@@ -107,6 +107,7 @@ object ExpressionMappings {
Sig[UnBase64](UNBASE64),
Sig[Base64](BASE64),
Sig[FormatString](FORMAT_STRING),
+ Sig[FormatNumber](FORMAT_NUMBER),
// URL functions
Sig[ParseUrl](PARSE_URL),
diff --git
a/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala
b/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala
index def43746c1..a6b1818ff9 100644
---
a/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala
+++
b/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala
@@ -143,6 +143,7 @@ object ExpressionNames {
final val BASE64 = "base64"
final val MASK = "mask"
final val FORMAT_STRING = "format_string"
+ final val FORMAT_NUMBER = "format_number"
final val LUHN_CHECK = "luhn_check"
final val TO_PRETTY_STRING = "to_pretty_string"
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]