From f1d61349aa0bfb75525c225cfc2ad9a5316522f6 Mon Sep 17 00:00:00 2001 From: Max Gekk Date: Wed, 16 Aug 2023 20:57:37 +0300 Subject: [PATCH] Redefine ToCharacter as RuntimeReplaceable --- .../expressions/numberFormatExpressions.scala | 30 +++++++++++-------- .../analyzer-results/postgreSQL/int8.sql.out | 12 ++++---- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/numberFormatExpressions.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/numberFormatExpressions.scala index ad55e00f3382e..20da173ee58e6 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/numberFormatExpressions.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/numberFormatExpressions.scala @@ -222,6 +222,23 @@ case class TryToNumber(left: Expression, right: Expression) """, since = "3.4.0", group = "string_funcs") +case class ToCharacter(left: Expression, right: Expression, replacement: Expression) + extends RuntimeReplaceable with InheritAnalysisRules { + def this(left: Expression, right: Expression) = this(left, right, + left.dataType match { + case _: DatetimeType => DateFormatClass(left, right) + case _ => NumberToCharacter(left, right) + } + ) + + override def prettyName: String = "to_char" + + override def parameters: Seq[Expression] = Seq(left, right) + + override protected def withNewChildInternal(newChild: Expression): Expression = + this.copy(replacement = newChild) +} + case class NumberToCharacter(left: Expression, right: Expression) extends BinaryExpression with ImplicitCastInputTypes with NullIntolerant { private lazy val numberFormatter = { @@ -256,7 +273,6 @@ case class NumberToCharacter(left: Expression, right: Expression) inputTypeCheck } } - override def prettyName: String = "to_char" override def nullSafeEval(decimal: Any, format: Any): Any = { val input = decimal.asInstanceOf[Decimal] numberFormatter.format(input) @@ -281,15 +297,3 @@ case class NumberToCharacter(left: Expression, right: Expression) newLeft: Expression, newRight: Expression): NumberToCharacter = copy(left = newLeft, right = newRight) } - -case class ToCharacter(left: Expression, right: Expression) extends RuntimeReplaceable { - override def children: Seq[Expression] = Seq(left, right) - override def replacement: Expression = left.dataType match { - case _: DatetimeType => DateFormatClass(left, right) - case _ => NumberToCharacter(left, right) - } - - override def withNewChildrenInternal(newChildren: IndexedSeq[Expression]): Expression = { - copy(left = newChildren(0), right = newChildren(1)) - } -} diff --git a/sql/core/src/test/resources/sql-tests/analyzer-results/postgreSQL/int8.sql.out b/sql/core/src/test/resources/sql-tests/analyzer-results/postgreSQL/int8.sql.out index c7f3f7bdbbb80..5e277da95a1de 100644 --- a/sql/core/src/test/resources/sql-tests/analyzer-results/postgreSQL/int8.sql.out +++ b/sql/core/src/test/resources/sql-tests/analyzer-results/postgreSQL/int8.sql.out @@ -481,7 +481,7 @@ Aggregate [max(q1#xL) AS max(q1)#xL, max(q2#xL) AS max(q2)#xL] SELECT '' AS to_char_1, to_char(q1, '9G999G999G999G999G999'), to_char(q2, '9,999,999,999,999,999') FROM INT8_TBL -- !query analysis -Project [ AS to_char_1#x, to_char(cast(q1#xL as decimal(20,0)), 9G999G999G999G999G999) AS to_char(q1, 9G999G999G999G999G999)#x, to_char(cast(q2#xL as decimal(20,0)), 9,999,999,999,999,999) AS to_char(q2, 9,999,999,999,999,999)#x] +Project [ AS to_char_1#x, to_char(q1#xL, 9G999G999G999G999G999) AS to_char(q1, 9G999G999G999G999G999)#x, to_char(q2#xL, 9,999,999,999,999,999) AS to_char(q2, 9,999,999,999,999,999)#x] +- SubqueryAlias spark_catalog.default.int8_tbl +- Relation spark_catalog.default.int8_tbl[q1#xL,q2#xL] parquet @@ -490,7 +490,7 @@ Project [ AS to_char_1#x, to_char(cast(q1#xL as decimal(20,0)), 9G999G999G999G99 SELECT '' AS to_char_3, to_char( (q1 * -1), '9999999999999999PR'), to_char( (q2 * -1), '9999999999999999.999PR') FROM INT8_TBL -- !query analysis -Project [ AS to_char_3#x, to_char(cast((q1#xL * cast(-1 as bigint)) as decimal(20,0)), 9999999999999999PR) AS to_char((q1 * -1), 9999999999999999PR)#x, to_char(cast((q2#xL * cast(-1 as bigint)) as decimal(20,0)), 9999999999999999.999PR) AS to_char((q2 * -1), 9999999999999999.999PR)#x] +Project [ AS to_char_3#x, to_char((q1#xL * cast(-1 as bigint)), 9999999999999999PR) AS to_char((q1 * -1), 9999999999999999PR)#x, to_char((q2#xL * cast(-1 as bigint)), 9999999999999999.999PR) AS to_char((q2 * -1), 9999999999999999.999PR)#x] +- SubqueryAlias spark_catalog.default.int8_tbl +- Relation spark_catalog.default.int8_tbl[q1#xL,q2#xL] parquet @@ -499,7 +499,7 @@ Project [ AS to_char_3#x, to_char(cast((q1#xL * cast(-1 as bigint)) as decimal(2 SELECT '' AS to_char_4, to_char( (q1 * -1), '9999999999999999S'), to_char( (q2 * -1), 'S9999999999999999') FROM INT8_TBL -- !query analysis -Project [ AS to_char_4#x, to_char(cast((q1#xL * cast(-1 as bigint)) as decimal(20,0)), 9999999999999999S) AS to_char((q1 * -1), 9999999999999999S)#x, to_char(cast((q2#xL * cast(-1 as bigint)) as decimal(20,0)), S9999999999999999) AS to_char((q2 * -1), S9999999999999999)#x] +Project [ AS to_char_4#x, to_char((q1#xL * cast(-1 as bigint)), 9999999999999999S) AS to_char((q1 * -1), 9999999999999999S)#x, to_char((q2#xL * cast(-1 as bigint)), S9999999999999999) AS to_char((q2 * -1), S9999999999999999)#x] +- SubqueryAlias spark_catalog.default.int8_tbl +- Relation spark_catalog.default.int8_tbl[q1#xL,q2#xL] parquet @@ -507,7 +507,7 @@ Project [ AS to_char_4#x, to_char(cast((q1#xL * cast(-1 as bigint)) as decimal(2 -- !query SELECT '' AS to_char_5, to_char(q2, 'MI9999999999999999') FROM INT8_TBL -- !query analysis -Project [ AS to_char_5#x, to_char(cast(q2#xL as decimal(20,0)), MI9999999999999999) AS to_char(q2, MI9999999999999999)#x] +Project [ AS to_char_5#x, to_char(q2#xL, MI9999999999999999) AS to_char(q2, MI9999999999999999)#x] +- SubqueryAlias spark_catalog.default.int8_tbl +- Relation spark_catalog.default.int8_tbl[q1#xL,q2#xL] parquet @@ -515,7 +515,7 @@ Project [ AS to_char_5#x, to_char(cast(q2#xL as decimal(20,0)), MI99999999999999 -- !query SELECT '' AS to_char_9, to_char(q2, '0999999999999999') FROM INT8_TBL -- !query analysis -Project [ AS to_char_9#x, to_char(cast(q2#xL as decimal(20,0)), 0999999999999999) AS to_char(q2, 0999999999999999)#x] +Project [ AS to_char_9#x, to_char(q2#xL, 0999999999999999) AS to_char(q2, 0999999999999999)#x] +- SubqueryAlias spark_catalog.default.int8_tbl +- Relation spark_catalog.default.int8_tbl[q1#xL,q2#xL] parquet @@ -523,7 +523,7 @@ Project [ AS to_char_9#x, to_char(cast(q2#xL as decimal(20,0)), 0999999999999999 -- !query SELECT '' AS to_char_10, to_char(q2, 'S0999999999999999') FROM INT8_TBL -- !query analysis -Project [ AS to_char_10#x, to_char(cast(q2#xL as decimal(20,0)), S0999999999999999) AS to_char(q2, S0999999999999999)#x] +Project [ AS to_char_10#x, to_char(q2#xL, S0999999999999999) AS to_char(q2, S0999999999999999)#x] +- SubqueryAlias spark_catalog.default.int8_tbl +- Relation spark_catalog.default.int8_tbl[q1#xL,q2#xL] parquet