This is an automated email from the ASF dual-hosted git repository.

liyang pushed a commit to branch kylin5
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit deb209f5319bc6d2dc0fe727d65202e3b834f55c
Author: Zhimin Wu <596361...@qq.com>
AuthorDate: Wed Aug 30 18:36:05 2023 +0800

    KYLIN-5799 Fix round, bround, lpad, rpad function
---
 .../org/apache/kylin/query/udf/SparkMathUDF.java   |  7 +++++-
 .../org/apache/kylin/query/udf/SparkStringUDF.java | 15 +++++++++++--
 .../kylin/query/runtime/ExpressionConverter.scala  | 25 ++++------------------
 .../kylin/query/runtime/SparderRexVisitor.scala    |  1 -
 4 files changed, 23 insertions(+), 25 deletions(-)

diff --git 
a/src/query/src/main/java/org/apache/kylin/query/udf/SparkMathUDF.java 
b/src/query/src/main/java/org/apache/kylin/query/udf/SparkMathUDF.java
index ae20f7d1a3..38db80697d 100644
--- a/src/query/src/main/java/org/apache/kylin/query/udf/SparkMathUDF.java
+++ b/src/query/src/main/java/org/apache/kylin/query/udf/SparkMathUDF.java
@@ -24,7 +24,12 @@ import 
org.apache.kylin.common.exception.CalciteNotSupportException;
 
 public class SparkMathUDF implements NotConstant {
 
-    public Object BROUND(@Parameter(name = "str1") Double exp1, 
@Parameter(name = "str2") Integer exp2)
+    public Object BROUND(@Parameter(name = "str1") Object exp1, 
@Parameter(name = "str2") Object exp2)
+            throws CalciteNotSupportException {
+        throw new CalciteNotSupportException();
+    }
+
+    public Object BROUND(@Parameter(name = "str1") Object exp1)
             throws CalciteNotSupportException {
         throw new CalciteNotSupportException();
     }
diff --git 
a/src/query/src/main/java/org/apache/kylin/query/udf/SparkStringUDF.java 
b/src/query/src/main/java/org/apache/kylin/query/udf/SparkStringUDF.java
index 867ffbefe1..93c36e6af3 100644
--- a/src/query/src/main/java/org/apache/kylin/query/udf/SparkStringUDF.java
+++ b/src/query/src/main/java/org/apache/kylin/query/udf/SparkStringUDF.java
@@ -64,21 +64,32 @@ public class SparkStringUDF implements NotConstant {
         throw new CalciteNotSupportException();
     }
 
-    public String LPAD(@Parameter(name = "str1") String exp1, @Parameter(name 
= "num2") Integer exp2,
+    public String LPAD(@Parameter(name = "str1") String exp1, @Parameter(name 
= "num2") Object exp2,
             @Parameter(name = "str3") String exp3) throws 
CalciteNotSupportException {
         throw new CalciteNotSupportException();
     }
 
+    public String LPAD(@Parameter(name = "str1") String exp1, @Parameter(name 
= "num2") Object exp2)
+            throws CalciteNotSupportException {
+        throw new CalciteNotSupportException();
+    }
+
     public String REPLACE(@Parameter(name = "str1") String exp1, 
@Parameter(name = "str2") String exp2,
             @Parameter(name = "str3") String exp3) throws 
CalciteNotSupportException {
         throw new CalciteNotSupportException();
     }
 
-    public String RPAD(@Parameter(name = "str1") String exp1, @Parameter(name 
= "num2") Integer exp2,
+    public String RPAD(@Parameter(name = "str1") String exp1, @Parameter(name 
= "num2") Object exp2,
             @Parameter(name = "str3") String exp3) throws 
CalciteNotSupportException {
         throw new CalciteNotSupportException();
     }
 
+    public String RPAD(@Parameter(name = "str1") String exp1, @Parameter(name 
= "num2") Object exp2)
+            throws CalciteNotSupportException {
+        throw new CalciteNotSupportException();
+    }
+
+
     public String RTRIM(@Parameter(name = "str1") String exp1) throws 
CalciteNotSupportException {
         throw new CalciteNotSupportException();
     }
diff --git 
a/src/spark-project/sparder/src/main/scala/org/apache/kylin/query/runtime/ExpressionConverter.scala
 
b/src/spark-project/sparder/src/main/scala/org/apache/kylin/query/runtime/ExpressionConverter.scala
index 04afba3c94..53dc5b25a5 100644
--- 
a/src/spark-project/sparder/src/main/scala/org/apache/kylin/query/runtime/ExpressionConverter.scala
+++ 
b/src/spark-project/sparder/src/main/scala/org/apache/kylin/query/runtime/ExpressionConverter.scala
@@ -45,19 +45,20 @@ object ExpressionConverter {
     "explode"
   )
 
-  private val ternaryParameterFunc = mutable.HashSet("replace", 
"substring_index", "lpad", "rpad", "conv", "regexp_extract")
+  private val ternaryParameterFunc = mutable.HashSet("replace", 
"substring_index", "conv", "regexp_extract")
   private val binaryParameterFunc =
     mutable.HashSet("decode", "encode", "find_in_set", "levenshtein", "sha2",
       "trunc", "add_months", "date_add", "date_sub", "from_utc_timestamp", 
"to_utc_timestamp",
       // math function
-      "bround", "hypot", "log"
+      "hypot", "log"
     )
 
   private val noParameterFunc = mutable.HashSet("current_database", 
"input_file_block_length", "input_file_block_start",
     "input_file_name", "monotonically_increasing_id", "now", 
"spark_partition_id", "uuid"
   )
 
-  private val varArgsFunc = mutable.HashSet("months_between", "locate", 
"rtrim", "from_unixtime", "to_date", "to_timestamp", "split")
+  private val varArgsFunc = mutable.HashSet("months_between", "locate", 
"rtrim", "from_unixtime", "to_date",
+    "to_timestamp", "split", "bround", "lpad", "rpad", "round")
 
   private val bitmapUDF = mutable.HashSet("intersect_count_by_col", 
"subtract_bitmap_value", "subtract_bitmap_uuid");
 
@@ -205,24 +206,6 @@ object ExpressionConverter {
             abs(
               k_lit(children.head).cast(SparderTypeUtil
                 .convertSqlTypeToSparkType(relDataType)))
-          case "round" =>
-            var scale = children.apply(1)
-            if (scale.isInstanceOf[Column]) {
-              val extractConst = (scale: Column) => {
-                val extractCastValue = (child: Literal) => child.value
-                val reduceCast = (expr: Cast) => 
extractCastValue(expr.child.asInstanceOf[Literal])
-                scale.expr.getClass.getSimpleName match {
-                  case "Cast" =>
-                    reduceCast(scale.expr.asInstanceOf[Cast])
-                  case _ =>
-                    throw new UnsupportedOperationException(s"Scale parameter 
of round function doesn't support this expression " + scale.expr.toString())
-                }
-              }
-              scale = extractConst(scale.asInstanceOf[Column])
-            }
-            round(
-              k_lit(children.head),
-              scale.asInstanceOf[Int])
           case "truncate" =>
             if (children.size == 1) {
               k_truncate(k_lit(children.head), 0)
diff --git 
a/src/spark-project/sparder/src/main/scala/org/apache/kylin/query/runtime/SparderRexVisitor.scala
 
b/src/spark-project/sparder/src/main/scala/org/apache/kylin/query/runtime/SparderRexVisitor.scala
index 2adac31699..0b7116a673 100644
--- 
a/src/spark-project/sparder/src/main/scala/org/apache/kylin/query/runtime/SparderRexVisitor.scala
+++ 
b/src/spark-project/sparder/src/main/scala/org/apache/kylin/query/runtime/SparderRexVisitor.scala
@@ -287,7 +287,6 @@ class SparderRexVisitor(val inputFieldNames: Seq[String],
         assert(children.size == 2)
         coalesce(children.apply(0).asInstanceOf[Column], 
k_lit(children.apply(1)))
       case _ =>
-
         ExpressionConverter.convert(call.getType.getSqlTypeName, call.`type`, 
op.getKind, op.getName, children)
     }
   }

Reply via email to