MaxGekk commented on code in PR #56288:
URL: https://github.com/apache/spark/pull/56288#discussion_r3347034659
##########
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/Cast.scala:
##########
@@ -1772,6 +1809,62 @@ case class Cast(
code"$evPrim = $dateTimeUtilsCls.convertTz($c,
java.time.ZoneOffset.UTC, $zid);"
}
+ private[this] def castToTimestampLTZNanosCode(
+ from: DataType,
+ precision: Int,
+ ctx: CodegenContext): CastFunction = from match {
+ case _: StringType =>
+ val zoneIdClass = classOf[ZoneId]
+ val zid = JavaCode.global(
+ ctx.addReferenceObj("zoneId", zoneId, zoneIdClass.getName),
+ zoneIdClass)
+ val tsOpt = ctx.freshVariable("tsOpt",
classOf[Option[TimestampNanosVal]])
+ (c, evPrim, evNull) =>
+ if (ansiEnabled) {
+ val errorContext = getContextOrNullCode(ctx)
+ code"""
+ $evPrim = $dateTimeUtilsCls.stringToTimestampLTZNanosAnsi(
+ $c, $precision, $zid, $errorContext);
+ """
+ } else {
+ code"""
+ scala.Option<TimestampNanosVal> $tsOpt =
+ $dateTimeUtilsCls.stringToTimestampLTZNanos($c, $precision,
$zid);
+ if ($tsOpt.isDefined()) {
+ $evPrim = (TimestampNanosVal) $tsOpt.get();
+ } else {
+ $evNull = true;
+ }
+ """
+ }
+ }
+
+ private[this] def castToTimestampNTZNanosCode(
+ from: DataType,
+ precision: Int,
+ ctx: CodegenContext): CastFunction = from match {
+ case _: StringType =>
+ val tsOpt = ctx.freshVariable("tsOpt",
classOf[Option[TimestampNanosVal]])
+ (c, evPrim, evNull) =>
+ if (ansiEnabled) {
+ val errorContext = getContextOrNullCode(ctx)
+ code"""
+ $evPrim = $dateTimeUtilsCls.stringToTimestampNTZNanosAnsi(
+ $c, $precision, $errorContext);
+ """
+ } else {
+ code"""
+ scala.Option<TimestampNanosVal> $tsOpt =
+ $dateTimeUtilsCls.stringToTimestampNTZNanos($c, $precision,
true);
Review Comment:
Good catch. Made the interpreted NTZ parse pass `allowTimeZone = true`
explicitly so it matches the codegen path. (The consistency had to go this
direction: generated Java can't rely on the Scala default arg, so codegen must
pass it.) Addressed in 63b58906b94.
##########
sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CastWithAnsiOffSuite.scala:
##########
@@ -56,6 +56,18 @@ class CastWithAnsiOffSuite extends CastSuiteBase {
checkEvaluation(cast(123L, DecimalType(2, 0)), null)
}
+ test("SPARK-57211: legacy mode cast malformed string to nanosecond timestamp
returns null") {
+ Seq("123", "2015-03-18 123142", "2015-03-18X", "abdef").foreach { str =>
+
org.apache.spark.sql.catalyst.util.TimestampNanosTestUtils.foreachNanosPrecision
{
Review Comment:
Done. Imported `foreachNanosPrecision` and dropped the fully-qualified
inline name, consistent with CastWithAnsiOnSuite/CastSuiteBase. Addressed in
63b58906b94.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]