You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by do...@apache.org on 2025/11/13 20:07:47 UTC
(spark) branch branch-4.1 updated: [SPARK-54336][SQL] Fix `BloomFilterMightContain` input type check with `ScalarSubqueryReference`
This is an automated email from the ASF dual-hosted git repository.
dongjoon pushed a commit to branch branch-4.1
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/branch-4.1 by this push:
new 0c0390468ce3 [SPARK-54336][SQL] Fix `BloomFilterMightContain` input type check with `ScalarSubqueryReference`
0c0390468ce3 is described below
commit 0c0390468ce3d73f54a04f15885c99f39e4847f2
Author: Peter Toth <pe...@gmail.com>
AuthorDate: Thu Nov 13 12:04:34 2025 -0800
[SPARK-54336][SQL] Fix `BloomFilterMightContain` input type check with `ScalarSubqueryReference`
### What changes were proposed in this pull request?
This PR fixes the case when a scalar subquery with a `BloomFilterMightContain` expression is added to `PlanMerger`, but its `bloomFilterExpression` contains a merged scalar subquery which was replaced to a `ScalarSubqueryReference` before.
In this case `BloomFilterMightContain` was unresolved due to its `checkInputDataTypes()` failure.
### Why are the changes needed?
To
### Does this PR introduce _any_ user-facing change?
No.
### How was this patch tested?
New UT.
### Was this patch authored or co-authored using generative AI tooling?
No.
Closes #53038 from peter-toth/SPARK-54336-fix-bloomfiltermightcontain-type-check.
Authored-by: Peter Toth <pe...@gmail.com>
Signed-off-by: Dongjoon Hyun <do...@apache.org>
(cherry picked from commit 06b3d4c4e7166c3107c7cc95ff0da2d9f256eabd)
Signed-off-by: Dongjoon Hyun <do...@apache.org>
---
.../expressions/BloomFilterMightContain.scala | 2 ++
.../spark/sql/BloomFilterAggregateQuerySuite.scala | 19 +++++++++++++++++++
2 files changed, 21 insertions(+)
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/BloomFilterMightContain.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/BloomFilterMightContain.scala
index 784bea899c4c..e3ff7c5f05f0 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/BloomFilterMightContain.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/BloomFilterMightContain.scala
@@ -23,6 +23,7 @@ import org.apache.spark.sql.catalyst.analysis.TypeCheckResult.DataTypeMismatch
import org.apache.spark.sql.catalyst.expressions.Cast.{toSQLExpr, toSQLId, toSQLType}
import org.apache.spark.sql.catalyst.expressions.codegen.{CodegenContext, CodeGenerator, ExprCode, JavaCode, TrueLiteral}
import org.apache.spark.sql.catalyst.expressions.codegen.Block.BlockHelper
+import org.apache.spark.sql.catalyst.optimizer.ScalarSubqueryReference
import org.apache.spark.sql.catalyst.trees.TreePattern.OUTER_REFERENCE
import org.apache.spark.sql.types._
import org.apache.spark.util.sketch.BloomFilter
@@ -58,6 +59,7 @@ case class BloomFilterMightContain(
case GetStructField(subquery: PlanExpression[_], _, _)
if !subquery.containsPattern(OUTER_REFERENCE) =>
TypeCheckResult.TypeCheckSuccess
+ case _: ScalarSubqueryReference => TypeCheckResult.TypeCheckSuccess
case _ =>
DataTypeMismatch(
errorSubClass = "BLOOM_FILTER_BINARY_OP_WRONG_TYPE",
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/BloomFilterAggregateQuerySuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/BloomFilterAggregateQuerySuite.scala
index fb279b1db6fc..0a8e31b6bac4 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/BloomFilterAggregateQuerySuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/BloomFilterAggregateQuerySuite.scala
@@ -367,4 +367,23 @@ class BloomFilterAggregateQuerySuite extends QueryTest with SharedSparkSession {
checkNumBits(100, 2935)
checkNumBits(1, 38)
}
+
+ test("SPARK-54336: Fix BloomFilterMightContain type check with ScalarSubqueryReference") {
+ val table = "bloom_filter_test"
+ withTempView(table) {
+ Seq(0).toDF("col").createOrReplaceTempView(table)
+ val df = sql(
+ s"""
+ |SELECT
+ | (SELECT
+ | first(might_contain(
+ | (SELECT bloom_filter_agg(col) FROM $table),
+ | 0L
+ | ))
+ | FROM $table)
+ |FROM $table
+ |""".stripMargin)
+ checkAnswer(df, Row(true))
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org