Skip to content

Commit 2ad497d

Browse files
author
Bhargava Vadlamani
committed
address_review_comments
1 parent f43bd8b commit 2ad497d

4 files changed

Lines changed: 36 additions & 4 deletions

File tree

spark/src/main/scala/org/apache/comet/serde/strings.scala

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,21 @@ import org.apache.comet.serde.QueryPlanSerde.{createBinaryExpr, exprToProtoInter
3333

3434
object CometStringRepeat extends CometExpressionSerde[StringRepeat] {
3535

36-
override def getIncompatibleReasons(): Seq[String] = Seq(
37-
"A negative argument for the number of times to repeat throws an exception" +
38-
" instead of returning an empty string as Spark does")
39-
4036
override def convert(
4137
expr: StringRepeat,
4238
inputs: Seq[Attribute],
4339
binding: Boolean): Option[ExprOuterClass.Expr] = {
4440
val children = expr.children
41+
children(1) match {
42+
case Literal(count: Number, _) if count.longValue() <= 0 =>
43+
// Match Spark: repeat(s, n) with n <= 0 returns "" (or NULL if s is NULL)
44+
val ifExpr = If(
45+
IsNull(children(0)),
46+
Literal.create(null, StringType),
47+
Literal(UTF8String.EMPTY_UTF8, StringType))
48+
return exprToProtoInternal(ifExpr, inputs, binding)
49+
case _ =>
50+
}
4551
val leftCast = Cast(children(0), StringType)
4652
val rightCast = Cast(children(1), LongType)
4753
val leftExpr = exprToProtoInternal(leftCast, inputs, binding)

spark/src/main/scala/org/apache/comet/serde/unixtime.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ object CometFromUnixTime extends CometExpressionSerde[FromUnixTime] {
3838

3939
override def getSupportLevel(expr: FromUnixTime): SupportLevel = {
4040
expr.format match {
41+
case Literal(null, _) =>
42+
Compatible(None)
4143
case Literal(fmt, _) =>
4244
val formatStr = fmt.toString
4345
val defaultPattern = TimestampFormatter.defaultPattern
@@ -55,6 +57,12 @@ object CometFromUnixTime extends CometExpressionSerde[FromUnixTime] {
5557
expr: FromUnixTime,
5658
inputs: Seq[Attribute],
5759
binding: Boolean): Option[ExprOuterClass.Expr] = {
60+
expr.format match {
61+
case Literal(null, _) =>
62+
// from_unixtime is null-intolerant, so NULL format yields NULL
63+
return exprToProtoInternal(Literal.create(null, StringType), inputs, binding)
64+
case _ =>
65+
}
5866
val secExpr = exprToProtoInternal(expr.sec, inputs, binding)
5967
// TODO: DataFusion toChar does not support Spark datetime pattern format
6068
// https://github.com/apache/datafusion/issues/16577

spark/src/test/resources/sql-tests/expressions/datetime/from_unix_time.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,13 @@ SELECT from_unixtime(0)
3333

3434
query expect_fallback(Datetime pattern format: yyyy-MM-dd is unsupported)
3535
SELECT from_unixtime(1718451045, 'yyyy-MM-dd')
36+
37+
-- null format literal
38+
query
39+
SELECT from_unixtime(t, NULL) FROM test_from_unix_time
40+
41+
query
42+
SELECT from_unixtime(1718451045, NULL)
43+
44+
query
45+
SELECT from_unixtime(1718451045, CAST(NULL AS STRING))

spark/src/test/resources/sql-tests/expressions/string/string_repeat.sql

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,11 @@ SELECT repeat('hi', n) FROM test_repeat
3535
-- literal + literal
3636
query
3737
SELECT repeat('hi', 3), repeat('', 5), repeat('a', 0), repeat(NULL, 3)
38+
39+
-- non-positive literal count
40+
query
41+
SELECT repeat('namaste', -1), repeat('namaste', -100), repeat('a', 0), repeat(NULL, -1)
42+
43+
-- non-positive literal count over a column
44+
query
45+
SELECT repeat(s, -1), repeat(s, 0) FROM test_repeat

0 commit comments

Comments
 (0)