`rand` and `randn` with an integer seed fall back to Spark without a fallback reason
Maintainers usually reply within 2 days
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 78/100
Research direction
Start in spark/src/main/scala/org/apache/comet/serde/nondetermenistic.scala and trace how seeded rand and randn support checks relate to extractSeedFromExpr. Compare the analyzed IntegerType and LongType seeds described in the issue, then check the relevant conversion tests. Done means integer seeds convert like long seeds, or produce a specific fallback reason, with the strict fallback check passing.
Written by the indexing model from the issue text.
Description
Describe the bug
A Project or Filter that contains rand(<int>) or randn(<int>), for example rand(42), is
not converted, and Comet records no fallback reason on the operator or on any of its expressions.
In SQL, an integer literal seed such as rand(42) has type IntegerType. Only a LongType
seed, such as rand(42L), is converted.
With spark.comet.explain.fallback.strict.enabled=true, which CometTestBase turns on for
Comet's own suites, the query fails with:
java.lang.IllegalStateException: Comet did not convert Filter but recorded no fallback reason on
the operator or any of its expressions. Add a withFallbackReason call stating why conversion
failed.
(or ... did not convert Project ... for a projection). Without the strict check, the only
reason shown is the generic "<operator> is not supported" from
CometExecRule.reportUnexplainedFallback, which does not say what to change.
Steps to reproduce
Run on main (0f7f8e453) with the default profile (Spark 4.1.3), in a CometTestBase suite:
spark.range(0, 200, 1, numPartitions = 1)
.selectExpr("CAST(id AS INT) AS id", "IF(id % 3 = 0, NULL, CAST(id AS INT)) AS y")
.write.parquet(path)
spark.read.parquet(path).createOrReplaceTempView("t")
These four queries each fail with the error above:
SELECT id FROM t WHERE y IS NOT NULL AND rand(42) < 0.5;
SELECT id FROM t WHERE abs(rand(42)) < 0.5;
SELECT id, rand(1) AS r FROM t;
SELECT id, randn(1) AS r FROM t;
The same queries with a Long seed are converted:
| Query | Executed plan |
|---|---|
SELECT id FROM t WHERE y IS NOT NULL AND rand(42L) < 0.5 |
CometProject > CometFilter > CometNativeScan |
SELECT id FROM t WHERE abs(rand(42L)) < 0.5 |
contains CometFilter |
SELECT id, rand(1L) AS r FROM t |
CometProject |
SELECT id, randn(1L) AS r FROM t |
CometProject |
In the analyzed plans, the seed of rand(1) and rand(42) is IntegerType, and the seed of
rand(1L) is LongType.
Cause
In spark/src/main/scala/org/apache/comet/serde/nondetermenistic.scala, the seeded serde's
getSupportLevel returns Compatible() for any Literal seed. But CometRand.convert and
CometRandn.convert build the proto from extractSeedFromExpr:
protected def extractSeedFromExpr(expr: Expression): Option[Long] = {
expr match {
case Literal(seed: Long, _) => Some(seed)
case Literal(null, _) => Some(0L)
case _ => None
}
}
An IntegerType literal matches neither case, so convert returns None without recording a
reason.
Expected behavior
rand and randn with an integer literal seed are converted, as they are with a Long seed.
Spark accepts an IntegerType or LongType seed and widens an integer seed to a long
(RDG.seed in Spark's randomExpressions.scala). If an integer seed is not supported,
the conversion should record a fallback reason that says so.
Additional context
A possible fix: accept an Int literal in extractSeedFromExpr and widen it to a Long, or have
getSupportLevel reject what convert cannot take, with a reason.
🤖 Generated with Claude Code
- Dominant language
- Scala
- Stars
- 1.3k
- Forks
- 405
- Avg merge
- 3d 6h
- Merged PRs (30d)
- 239
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from apache/datafusion-comet
-
area:writer enhancement requires-triage
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
apache/datafusion-comet#7463 ·
Maintainers usually reply within 2 days
-
requires-triage
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
apache/datafusion-comet#7458 ·
Maintainers usually reply within 2 days
-
requires-triage
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
apache/datafusion-comet#7453 ·
Maintainers usually reply within 2 days
-
area:ci enhancement priority:low requires-triage
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
apache/datafusion-comet#7319 · 1 comment ·
Maintainers usually reply within 2 days
-
area:ci bug priority:low requires-triage
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
apache/datafusion-comet#7315 ·
Maintainers usually reply within 2 days
All issues in apache/datafusion-comet
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
canton-network/splice#8342 ·
Maintainers usually reply within 1 day
-
bug genc
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
propensive/soundness#2424 ·
Maintainers usually reply within 1 day
-
bug 🐞 python 🐍
Difficulty 2/5 1-3 hours Newbie friendliness 83/100
valkey-io/valkey-glide#7560 ·
Maintainers usually reply within 1 day
-
enhancement good first issue help wanted
Difficulty 2/5 1-3 hours Newbie friendliness 90/100
Maintainers usually reply within 1 day