This is an automated email from the ASF dual-hosted git repository.
zhouyuan 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 0f716e18e9 [GLUTEN-6887][VL] Daily Update Velox Version (2026_11_01)
(#13514)
0f716e18e9 is described below
commit 0f716e18e92d7ded83f1ca2fe5f78ada457b3f60
Author: Gluten Performance Bot
<[email protected]>
AuthorDate: Tue Nov 3 06:33:32 2026 +0000
[GLUTEN-6887][VL] Daily Update Velox Version (2026_11_01) (#13514)
* [GLUTEN-6887][VL] Daily Update Velox Version (dft-2026_11_01)
Upstream Velox's New Commits:
2cd961b5b by Rex(Hui) An, feat: Support UNKNOWN in Spark first and last
aggregates
8a97c9ed4 by GALI PREM SAGAR, fix(build): Pin macOS builds to Homebrew
OpenSSL 3
d8c3273e6 by Natasha Sehgal, refactor: Rename timestamp zone-label config
c853cce26 by Natasha Sehgal, feat(datetime)!: Unify AT TIME ZONE overloads
(#19632)
10d88f912 by Maria Basmanova, refactor(dwio)!: Move SortingWriter to the
Hive connector (#19930)
9bc5d6225 by rdtr, feat(spark): Add try_add, try_subtract and try_multiply
4404091da by Ke, perf(nimble): Defer loadNextChunk() on indexed skips
(#19899)
0bb70293a by shanhao-203, perf(nimble): Index Hybrid FlatMap writer keys
(#19924)
944677660 by Xiaoxuan, refactor(nimble): Remove BitRangeSplit encoding
(#19927)
a328dc713 by XiaoDu, fix(nimble): Reject corrupt bytes in encoding views
(#19911)
1e83dafc8 by Minni Mittal, feat(spark): Add right function
a618ba520 by XiaoDu, feat(nimble): Make hierarchical key encoding
configurable (#19904)
3c2d934df by shanhao-203, feat(nimble): Write and read Hybrid FlatMap
Default key lists (#19874)
c3976bc98 by Ke, perf(nimble): Skip chunks with no kept rows in sparse
reads (#19898)
3e6ec0221 by Reema, fix(cudf): Support Spark isnull expressions
71670679f by Rui Mo, test: Remove ORC decimal filter test
b0f990750 by Devavret Makkar, fix(cudf): Compare cast target types, not
kinds, in the AST evaluator
938be1cb7 by Rui Mo, misc: Update email
9e8ab84fa by oerling, feat(torchwave): Run and fuse the ads preproc graphs
(#19838)
6819f685d by Ke, fix(nimble): Keep row-size estimates at the end of a
stream (#19895)
4bb779018 by Maria Basmanova, test(exec): Add end-to-end vector search test
(#19915)
7b36d192e by shanhao-203, feat(nimble): Let the Hybrid FlatMap Default
group list its keys (#19873)
4eb621c7c by Maria Basmanova, feat(functions): Add vector_index_build
aggregate (#19886)
9d30a14c4 by XiaoDu, fix(nimble): Store one sequence per hierarchical key
level (#19902)
22f161ad3 by Pedro Pedreira, fix(vector): Copy struct rows whose children
are shorter
c957b8146 by Maria Basmanova, feat(exec): Add VectorSearchJoin (#19908)
35ec688bd by Richard Barnes, refactor(parquet): Remove unreachable returns
(#19810)
bcdab35c8 by RindsSchei225e, refactor(nimble): Move Hybrid FlatMap
configuration checks into common components (#19828)
fcdb1dec8 by Richard Barnes, refactor(velox): Remove unreachable returns
(#19811)
8ebb2ae28 by Maria Basmanova, fix(fuzzer): Give empty split groups a split
in JoinFuzzer
aeecbbab5 by macduan, fix: Reenable barrier tests
d79858715 by Xiaoxuan, Index RocksDB internal keys and decode entries in
read-ahead (#19878)
c7f56f6c3 by RindsSchei225e, fix(nimble): Fix NimbleEncodingRunner view
validation crash on nullable encodings (#19693)
b8e1609fe by peterenescu, fix(sparksql): Register unsuffixed
collect_set_merge_extract companion function (#19894)
45e4659d4 by peterenescu, refactor(sparksql): Split map functions into one
file each
310a576de by Krishna Pai, misc(rpc): Reconcile rate limiter floor with
fbcode (#19893)
f568730b9 by Maria Basmanova, refactor(exec): Check simple aggregates with
a concept (#19882)
1daffe2cd by XiaoDu, feat(nimble): Add PartitionedEliasFano encoding
(#19868)
6b05c9cf3 by Kevin Tang, fix(dwio): Share duplicate direct-read buffers
b6cb14e83 by Richard Barnes, refactor(cleanup): Remove unused constants in
Velox and storage code [unused-const-variable] (#19872)
37931b32a by Devavret Makkar, fix(fuzzer): Suspend drivers that grow the
aggregation fuzzer pool
d715f9e57 by Zhu, Lipeng, perf(functions): Force-inline Murmur3 hashInt64
to vectorize hash
f9a97a15b by mohsaka, fix(iceberg): Record null_value_count for NullType
Parquet columns
e583cd482 by GALI PREM SAGAR, fix(cudf): Give injected Iceberg TIMESTAMP
columns the reader's type
794626e2a by Maria Basmanova, feat(functions): Add vector_index_pack
aggregate (#19879)
73aeb82d4 by Wannuc-M, fix(rpc): Don't count a failed BATCH flush as a
success (#19875)
4861e3950 by RindsSchei225e, feat(nimble): Decode serde bool streams as
bits (#19800)
5df6f9b01 by tanjialiang, docs(nimble): Add a guide for adding required
features
1843f5237 by tanjialiang, feat(nimble): Load each stripe group once per
projection (#19826)
1bbf531de by zhichenxu-meta, feat(rpc): Cap paced probe gap and recover
with time (#19860)
07a9110ba by Pedro Pedreira, feat(functions): Support flat maps in
MakeRowFromMap (#19870)
5471326c1 by peterenescu, feat(sparksql): Implement native map_from_entries
(#19771)
75cce7758 by Amit Dutta, fix(serde): Revert size estimation and spill page
split
374848018 by Chandrashekhar Kumar Singh, feat(core): Copy registries
between query contexts (#19789)
43bd521ee by peterenescu, refactor(sparksql): Resolve map keys with LastWin
(#19770)
9268c48f6 by abhinavmuk04, fix(rpc): Honor each query's own rate-limiter
limits (#19794)
958e34532 by Bowei Xu, fix(from_json): Match Spark JSON semantics (#19725)
ded9ec4ee by tanjialiang, refactor(nimble): Retire stripe-group stream
checksums
99fb890dd by shanhao-203, feat(nimble): Make decompression verification
opt-in (#19829)
5beb2dfea by Maria Basmanova, fix(exec): Wake waiting consumers on buffer
terminate
e01ab9e8b by Maria Basmanova, fix(json): Fix json_parse buffer overflow on
constants
6b1f5a2b0 by dependabot[bot], build(ci): Bump astral-sh/setup-uv from 9.0.0
to 10.3.0
ba1dcdeed by Sahil Gandhi, feat(exec): Report each fixed-point iteration's
statistics (#19820)
655b5a9cc by Pramod Satya, fix(exec): Keep TopNRowNumber rank() correct
when a new row follows tied peers
04bd8fd23 by Xiaoxuan, fix(nimble): Keep null flat map values in scattered
reads
4e114bc08 by dependabot[bot], build(ci): Bump actions/cache/restore from
5.0.5 to 6.1.0
fa73c964c by dependabot[bot], build(ci): Bump docker/bake-action from 7.4.0
to 7.5.0
5cc68f4be by Maria Basmanova, fix(exec): Release splits when consumers
close early (#19831)
---
.../backendsapi/velox/VeloxSparkPlanExecApi.scala | 2 +-
.../gluten/expression/ExpressionTransformer.scala | 21 +++++++++++++
.../functions/JsonFunctionsValidateSuite.scala | 22 ++++++++++++++
ep/build-velox/src/get-velox.sh | 4 +--
.../apache/gluten/expression/ConverterUtils.scala | 34 ++++++++++++++++++----
.../gluten/utils/velox/VeloxTestSettings.scala | 4 +++
.../gluten/utils/velox/VeloxTestSettings.scala | 5 ++++
.../gluten/utils/velox/VeloxTestSettings.scala | 5 ++++
.../gluten/utils/velox/VeloxTestSettings.scala | 5 ++++
.../gluten/utils/velox/VeloxTestSettings.scala | 5 ++++
10 files changed, 98 insertions(+), 9 deletions(-)
diff --git
a/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxSparkPlanExecApi.scala
b/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxSparkPlanExecApi.scala
index 3a7497482f..0377d23c72 100644
---
a/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxSparkPlanExecApi.scala
+++
b/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxSparkPlanExecApi.scala
@@ -1276,7 +1276,7 @@ class VeloxSparkPlanExecApi extends SparkPlanExecApi with
Logging {
ExpressionNames.FROM_JSON,
FromJsonRestrictions.NOT_SUPPORT_COLUMN_CORRUPT_RECORD)
}
- GenericExpressionTransformer(substraitExprName, children, expr)
+ VeloxFromJsonTransformer(substraitExprName, children, expr)
}
/** Generate an expression transformer to transform StructsToJson to
Substrait. */
diff --git
a/backends-velox/src/main/scala/org/apache/gluten/expression/ExpressionTransformer.scala
b/backends-velox/src/main/scala/org/apache/gluten/expression/ExpressionTransformer.scala
index 7567a35663..cd51205c8d 100644
---
a/backends-velox/src/main/scala/org/apache/gluten/expression/ExpressionTransformer.scala
+++
b/backends-velox/src/main/scala/org/apache/gluten/expression/ExpressionTransformer.scala
@@ -124,3 +124,24 @@ case class ToUnixTimestampTransformer(
}
}
}
+
+/**
+ * Transformer for Spark's `from_json`. Velox matches JSON keys against the
field names of the
+ * result type exactly (as Spark does), so the struct field names must not be
lowercased.
+ */
+case class VeloxFromJsonTransformer(
+ substraitExprName: String,
+ children: Seq[ExpressionTransformer],
+ original: Expression)
+ extends ExpressionTransformer {
+ override def doTransform(context: SubstraitContext): ExpressionNode = {
+ val funcName: String =
+ ConverterUtils.makeFuncName(substraitExprName,
original.children.map(_.dataType))
+ val functionId = context.registerFunction(funcName)
+ val childNodes = new JArrayList[ExpressionNode]()
+ children.foreach(c => childNodes.add(c.doTransform(context)))
+ val typeNode =
+ ConverterUtils.getTypeNode(dataType, nullable, preserveStructFieldNames
= true)
+ ExpressionBuilder.makeScalarFunction(functionId, childNodes, typeNode)
+ }
+}
diff --git
a/backends-velox/src/test/scala/org/apache/gluten/functions/JsonFunctionsValidateSuite.scala
b/backends-velox/src/test/scala/org/apache/gluten/functions/JsonFunctionsValidateSuite.scala
index d7566f5e93..785e5996b7 100644
---
a/backends-velox/src/test/scala/org/apache/gluten/functions/JsonFunctionsValidateSuite.scala
+++
b/backends-velox/src/test/scala/org/apache/gluten/functions/JsonFunctionsValidateSuite.scala
@@ -301,6 +301,28 @@ class JsonFunctionsValidateSuite extends
FunctionsValidateSuite {
}
}
+ test("from_json function with mixed-case field names") {
+ withTempPath {
+ path =>
+ Seq[String](
+ """{"Id":"10", "Nested":{"InnerA":1, "innerB":[{"DeepX":2}]}}""",
+ """{"id":"11", "Nested":{"innera":3, "innerB":[{"deepx":4}]}}""",
+ """{"Id":"12", "nested":{"InnerA":5}}"""
+ )
+ .toDF("txt")
+ .write
+ .parquet(path.getCanonicalPath)
+
+
spark.read.parquet(path.getCanonicalPath).createOrReplaceTempView("tbl")
+
+ runQueryAndCompare(
+ "select from_json(txt, 'Id STRING, " +
+ "Nested STRUCT<InnerA: INT, innerB: ARRAY<STRUCT<DeepX: INT>>>')
from tbl") {
+ checkGlutenPlan[ProjectExecTransformer]
+ }
+ }
+ }
+
test("from_json function CORRUPT_RECORD") {
withTempPath {
path =>
diff --git a/ep/build-velox/src/get-velox.sh b/ep/build-velox/src/get-velox.sh
index 920909c809..284f9b92a3 100755
--- a/ep/build-velox/src/get-velox.sh
+++ b/ep/build-velox/src/get-velox.sh
@@ -18,8 +18,8 @@ set -exu
CURRENT_DIR=$(cd "$(dirname "$BASH_SOURCE")"; pwd)
VELOX_REPO=https://github.com/IBM/velox.git
-VELOX_BRANCH=dft-2026_10_30
-VELOX_ENHANCED_BRANCH=ibm-2026_10_30
+VELOX_BRANCH=dft-2026_11_01
+VELOX_ENHANCED_BRANCH=ibm-2026_11_01
VELOX_HOME=""
RUN_SETUP_SCRIPT=ON
ENABLE_ENHANCED_FEATURES=OFF
diff --git
a/gluten-substrait/src/main/scala/org/apache/gluten/expression/ConverterUtils.scala
b/gluten-substrait/src/main/scala/org/apache/gluten/expression/ConverterUtils.scala
index 3fc420ed55..2cd0fa9c06 100644
---
a/gluten-substrait/src/main/scala/org/apache/gluten/expression/ConverterUtils.scala
+++
b/gluten-substrait/src/main/scala/org/apache/gluten/expression/ConverterUtils.scala
@@ -222,7 +222,22 @@ object ConverterUtils extends Logging {
}
}
- def getTypeNode(datatype: DataType, nullable: Boolean): TypeNode = {
+ def getTypeNode(datatype: DataType, nullable: Boolean): TypeNode =
+ getTypeNode(datatype, nullable, preserveStructFieldNames = false)
+
+ /**
+ * Converts a Spark data type to a Substrait type node.
+ *
+ * @param preserveStructFieldNames
+ * If true, struct field names (including nested ones) are emitted as is,
regardless of
+ * `spark.sql.caseSensitive`. Needed by expressions whose semantics depend
on the exact field
+ * names of their result type, e.g. `from_json`, which matches JSON keys
against the schema
+ * field names case-sensitively.
+ */
+ def getTypeNode(
+ datatype: DataType,
+ nullable: Boolean,
+ preserveStructFieldNames: Boolean): TypeNode = {
datatype match {
case BooleanType =>
TypeBuilder.makeBoolean(nullable)
@@ -258,17 +273,24 @@ object ConverterUtils extends Logging {
case m: MapType =>
TypeBuilder.makeMap(
nullable,
- getTypeNode(m.keyType, nullable = false),
- getTypeNode(m.valueType, m.valueContainsNull))
+ getTypeNode(m.keyType, nullable = false, preserveStructFieldNames),
+ getTypeNode(m.valueType, m.valueContainsNull,
preserveStructFieldNames))
case a: ArrayType =>
- TypeBuilder.makeList(nullable, getTypeNode(a.elementType,
a.containsNull))
+ TypeBuilder.makeList(
+ nullable,
+ getTypeNode(a.elementType, a.containsNull, preserveStructFieldNames))
case s: StructType =>
val normalizeStructFieldName: String => String =
- if (BackendsApiManager.getSettings.structFieldToLowerCase()) {
+ if (
+ !preserveStructFieldNames &&
BackendsApiManager.getSettings.structFieldToLowerCase()
+ ) {
(name: String) => normalizeColName(name)
} else { (name: String) => name }
val (fieldNodes, fieldNames) = s.map {
- f => (getTypeNode(f.dataType, f.nullable),
normalizeStructFieldName(f.name))
+ f =>
+ (
+ getTypeNode(f.dataType, f.nullable, preserveStructFieldNames),
+ normalizeStructFieldName(f.name))
}.unzip
TypeBuilder.makeStruct(nullable, fieldNodes.asJava, fieldNames.asJava)
case _: NullType =>
diff --git
a/gluten-ut/spark34/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
b/gluten-ut/spark34/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
index cfb895a79b..104461c2a3 100644
---
a/gluten-ut/spark34/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
+++
b/gluten-ut/spark34/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
@@ -169,6 +169,10 @@ class VeloxTestSettings extends BackendTestSettings {
// Exception class different.
.exclude("from_json - invalid data")
enableSuite[GlutenJsonFunctionsSuite]
+ // Velox nulls the whole nested struct on a conversion error instead of
returning
+ // partial results for it (facebookincubator/velox#19725).
+ .exclude("SPARK-33134: return partial results only for root JSON objects")
+ .exclude("SPARK-40646: return partial results for objects with values as
JSON arrays")
// Velox does not support single quotes in get_json_object function.
.exclude("function get_json_object - support single quotes")
enableSuite[GlutenLiteralExpressionSuite]
diff --git
a/gluten-ut/spark35/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
b/gluten-ut/spark35/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
index 08c584714a..c97b6adaa0 100644
---
a/gluten-ut/spark35/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
+++
b/gluten-ut/spark35/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
@@ -173,6 +173,11 @@ class VeloxTestSettings extends BackendTestSettings {
// Exception class different.
.exclude("from_json - invalid data")
enableSuite[GlutenJsonFunctionsSuite]
+ // Velox nulls the whole nested struct on a conversion error instead of
returning
+ // partial results for it (facebookincubator/velox#19725).
+ .exclude("SPARK-33134: return partial results only for root JSON objects")
+ .exclude("SPARK-40646: return partial results for objects with values as
JSON arrays")
+ .exclude("SPARK-48863: parse object as an array with partial results
enabled")
// * in get_json_object expression not supported in velox
.exclude("SPARK-42782: Hive compatibility check for get_json_object")
// Velox does not support single quotes in get_json_object function.
diff --git
a/gluten-ut/spark40/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
b/gluten-ut/spark40/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
index 5693a36a62..50198c58ab 100644
---
a/gluten-ut/spark40/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
+++
b/gluten-ut/spark40/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
@@ -183,6 +183,11 @@ class VeloxTestSettings extends BackendTestSettings {
// Exception class different.
.exclude("from_json - invalid data")
enableSuite[GlutenJsonFunctionsSuite]
+ // Velox nulls the whole nested struct on a conversion error instead of
returning
+ // partial results for it (facebookincubator/velox#19725).
+ .exclude("SPARK-33134: return partial results only for root JSON objects")
+ .exclude("SPARK-40646: return partial results for objects with values as
JSON arrays")
+ .exclude("SPARK-48863: parse object as an array with partial results
enabled")
// * in get_json_object expression not supported in velox
.exclude("SPARK-42782: Hive compatibility check for get_json_object")
// Velox does not support single quotes in get_json_object function.
diff --git
a/gluten-ut/spark41/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
b/gluten-ut/spark41/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
index 781cfb2eee..d96a2b0bd8 100644
---
a/gluten-ut/spark41/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
+++
b/gluten-ut/spark41/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
@@ -189,6 +189,11 @@ class VeloxTestSettings extends BackendTestSettings {
// Exception class different.
.exclude("from_json - invalid data")
enableSuite[GlutenJsonFunctionsSuite]
+ // Velox nulls the whole nested struct on a conversion error instead of
returning
+ // partial results for it (facebookincubator/velox#19725).
+ .exclude("SPARK-33134: return partial results only for root JSON objects")
+ .exclude("SPARK-40646: return partial results for objects with values as
JSON arrays")
+ .exclude("SPARK-48863: parse object as an array with partial results
enabled")
// * in get_json_object expression not supported in velox
.exclude("SPARK-42782: Hive compatibility check for get_json_object")
// Velox does not support single quotes in get_json_object function.
diff --git
a/gluten-ut/spark42/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
b/gluten-ut/spark42/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
index b3ed0b3783..f39b80e634 100644
---
a/gluten-ut/spark42/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
+++
b/gluten-ut/spark42/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala
@@ -214,6 +214,11 @@ class VeloxTestSettings extends BackendTestSettings {
// Exception class different.
.exclude("from_json - invalid data")
enableSuite[GlutenJsonFunctionsSuite]
+ // Velox nulls the whole nested struct on a conversion error instead of
returning
+ // partial results for it (facebookincubator/velox#19725).
+ .exclude("SPARK-33134: return partial results only for root JSON objects")
+ .exclude("SPARK-40646: return partial results for objects with values as
JSON arrays")
+ .exclude("SPARK-48863: parse object as an array with partial results
enabled")
// * in get_json_object expression not supported in velox
.exclude("SPARK-42782: Hive compatibility check for get_json_object")
// Velox does not support single quotes in get_json_object function.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]