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

taiyangli pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-gluten.git


The following commit(s) were added to refs/heads/main by this push:
     new eeca5729b8 [GLUTE-8279][CH] Fix concat diff while single argument with 
array type is input  (#8280)
eeca5729b8 is described below

commit eeca5729b8612675a88e17ba7ba1f82b1cbd3955
Author: 李扬 <[email protected]>
AuthorDate: Mon Dec 23 09:59:32 2024 +0800

    [GLUTE-8279][CH] Fix concat diff while single argument with array type is 
input  (#8280)
    
    * Revert "remove concat function parser"
    
    This reverts commit dd316812a0907ab8f3dfdb69fe5e7c3242ab4922.
    
    * fix concat diff
    
    * fix concat diff
---
 .../GlutenClickHouseTPCHSaltNullParquetSuite.scala |  2 +-
 .../CommonScalarFunctionParser.cpp                 |  2 +-
 .../Parser/scalar_function_parser/concat.cpp       | 66 ++++++++++++++++++++++
 3 files changed, 68 insertions(+), 2 deletions(-)

diff --git 
a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/tpch/GlutenClickHouseTPCHSaltNullParquetSuite.scala
 
b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/tpch/GlutenClickHouseTPCHSaltNullParquetSuite.scala
index f82acdc415..5dca4ad347 100644
--- 
a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/tpch/GlutenClickHouseTPCHSaltNullParquetSuite.scala
+++ 
b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/tpch/GlutenClickHouseTPCHSaltNullParquetSuite.scala
@@ -1455,7 +1455,7 @@ class GlutenClickHouseTPCHSaltNullParquetSuite extends 
GlutenClickHouseTPCHAbstr
       """
         |select reverse(split(n_comment, ' ')), reverse(n_comment),
         |concat(split(n_comment, ' ')), concat(n_comment), concat(n_comment, 
n_name),
-        |concat(split(n_comment, ' '), split(n_name, ' '))
+        |concat(split(n_comment, ' '), split(n_name, ' ')), concat(array()), 
concat(array(n_name))
         |from nation
         |""".stripMargin
     runQueryAndCompare(sql)(checkGlutenOperatorMatch[ProjectExecTransformer])
diff --git 
a/cpp-ch/local-engine/Parser/scalar_function_parser/CommonScalarFunctionParser.cpp
 
b/cpp-ch/local-engine/Parser/scalar_function_parser/CommonScalarFunctionParser.cpp
index e4a56194c1..ba2129deb1 100644
--- 
a/cpp-ch/local-engine/Parser/scalar_function_parser/CommonScalarFunctionParser.cpp
+++ 
b/cpp-ch/local-engine/Parser/scalar_function_parser/CommonScalarFunctionParser.cpp
@@ -129,9 +129,9 @@ REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Conv, conv, 
sparkConv);
 REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Uuid, uuid, generateUUIDv4);
 REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Levenshtein, levenshtein, 
editDistanceUTF8);
 REGISTER_COMMON_SCALAR_FUNCTION_PARSER(FormatString, format_string, printf);
-REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Concat, concat, concat);
 REGISTER_COMMON_SCALAR_FUNCTION_PARSER(SoundEx, soundex, soundex);
 
+// hash functions
 REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Crc32, crc32, CRC32);
 REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Murmur3Hash, murmur3hash, 
sparkMurmurHash3_32);
 REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Xxhash64, xxhash64, sparkXxHash64);
diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/concat.cpp 
b/cpp-ch/local-engine/Parser/scalar_function_parser/concat.cpp
new file mode 100644
index 0000000000..a3706c7864
--- /dev/null
+++ b/cpp-ch/local-engine/Parser/scalar_function_parser/concat.cpp
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <Parser/FunctionParser.h>
+#include <Common/CHUtil.h>
+#include <Core/Field.h>
+#include <DataTypes/DataTypeNullable.h>
+#include <DataTypes/IDataType.h>
+
+namespace DB
+{
+
+namespace ErrorCodes
+{
+    extern const int BAD_ARGUMENTS;
+    extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH;
+}
+}
+
+namespace local_engine
+{
+
+class FunctionParserConcat : public FunctionParser
+{
+public:
+    explicit FunctionParserConcat(ParserContextPtr ctx) : 
FunctionParser(std::move(ctx)) { }
+    ~FunctionParserConcat() override = default;
+
+    static constexpr auto name = "concat";
+
+    String getName() const override { return name; }
+
+    const ActionsDAG::Node * parse(
+        const substrait::Expression_ScalarFunction & substrait_func,
+        ActionsDAG & actions_dag) const override
+    {
+        /*
+          parse concat(args) as:
+            1. if input single argument is array, then return arrayConcat(args)
+            2. otherwise return concat(args)
+        */
+        String ch_function_name = "concat";
+        auto args = parseFunctionArguments(substrait_func, actions_dag);
+        if (args.size() == 1 && isArray(removeNullable(args[0]->result_type)))
+            ch_function_name = "arrayConcat";
+
+        auto * result_node = toFunctionNode(actions_dag, "concat", args);
+        return convertNodeTypeIfNeeded(substrait_func, result_node, 
actions_dag);
+    }
+};
+
+static FunctionParserRegister<FunctionParserConcat> register_concat;
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to