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

lihaopeng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new acda4ed98ee [Bug](fix) Fix core problem about argument number in 
concat_ws and log function (#53835)
acda4ed98ee is described below

commit acda4ed98eef94ea9d86d65c3c9868ee837085a8
Author: dwdwqfwe <[email protected]>
AuthorDate: Thu Jul 31 23:00:26 2025 +0800

    [Bug](fix) Fix core problem about argument number in concat_ws and log 
function (#53835)
    
    Related PR: #53084
    
    Problem Summary:
    
    concat_ws:
    Exception in nereids_function_p0/scalar_function/concat_ws.groovy(line
    21):
    
    // 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.
    
    suite("nereids_scalar_fn_concat_ws") {
    
        sql 'use regression_test_nereids_function_p0_scalar_function'
    qt_concat_ws_ArrayWithNullElement "select
    concat_ws('-',['a','b'],['css',null,'d'],['g','f'],['s'])"
    ^^^^^^^^^^^^^^^^^^^^^^^^^^ERROR LINE^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    qt_concat_ws_ArrayWithEmptyString "select
    concat_ws('-',['a',''],['','css'],['d',''])"
    qt_concat_ws_WithEmptyArray "select
    concat_ws('-',['a','b'],[],['css','d'],[])"
    qt_concat_ws_SeparatorSpecial "select
    concat_ws('|',['x','y'],['m',null,'n'],['p'])"
    
    qt_concat_ws_SeparatorEmpty "select
    concat_ws('',['a','b'],['c',null],['d'])"
    
    qt_concat_ws_ArrayWithNumber "select
    concat_ws('-',['1','2'],['3',null,'4'],['5','6'])"
    qt_concat_ws_WithNullArray "select concat_ws('-',['a'],null,['b','c'])"
    
    Exception:
    java.lang.IllegalStateException: Check tag
    'concat_ws_ArrayWithNullElement' failed:
    Check tag 'concat_ws_ArrayWithNullElement' failed, line 1, CHAR result
    mismatch.
    Expect cell is: a-b-css-d-g-f-s
    But real is   : a-b
    line 1 mismatch
    ExpectRow: [a-b-css-d-g-f-s]
    RealRow  : [a-b]
    
    
    
    log:
    F20250718 14:48:11.367244 2162790 function.cpp:260] Check failed:
    number_of_arguments == expected_number_of_arguments (1 vs. 2) Number of
    arguments for function log doesn't match: passed 1 , should be 2
    *** Check failure stack trace: ***
        @     0x55e565c5ba8f  google::LogMessage::SendToLog()
        @     0x55e565c520a0  google::LogMessage::Flush()
        @     0x55e565c55799  google::LogMessageFatal::~LogMessageFatal()
        @     0x55e55db7b9df
     doris::vectorized::FunctionBuilderImpl::check_number_of_arguments()
        @     0x55e55db7bc6a
     doris::vectorized::FunctionBuilderImpl::get_return_type()
        @     0x55e55b872e9b
     doris::vectorized::FunctionBuilderImpl::build()
        @     0x55e54372776a
     doris::vectorized::SimpleFunctionFactory::get_function()
        @     0x55e55b86c039  doris::vectorized::VectorizedFnCall::prepare()
        @     0x55e55b914f76  doris::vectorized::VExprContext::prepare()
        @     0x55e5441556f5
     doris::FoldConstantExecutor::_prepare_and_open<>()
        @     0x55e54414924c
     doris::FoldConstantExecutor::fold_constant_vexpr()
        @     0x55e5440cf118  std::_Function_handler<>::_M_invoke()
        @     0x55e54410c32f  doris::WorkThreadPool<>::work_thread()
        @     0x55e5693a65b0  execute_native_thread_routine
        @     0x55e53ffded27  asan_thread_start()
        @     0x7fc629dd1ac3  (unknown)
        @     0x7fc629e63850  (unknown)
        @              (nil)  (unknown)
    *** Query id: 387c7bbf2f246a1-bbe43b979f986fd2 ***
    *** is nereids: 0 ***
    *** tablet id: 0 ***
    *** Aborted at 1752821291 (unix time) try "date -d @1752821291" if you
    are using GNU date ***
    *** Current BE git commitID: cec8d27649 ***
    *** SIGABRT unknown detail explain (@0x20fd42) received by PID 2161986
    (TID 2162790 OR 0x7bc25acf1640) from PID 2161986; stack trace: ***
     0# doris::signal::(anonymous namespace)::FailureSignalHandler(int,
    siginfo_t*, void*) at
    /home/zcp/repo_center/doris_master/doris/be/src/common/signal_handler.h:420
     1# 0x00007FC629D7F520 in /lib/x86_64-linux-gnu/libc.so.6
     2# pthread_kill at ./nptl/pthread_kill.c:89
     3# raise at ../sysdeps/posix/raise.c:27
     4# abort at ./stdlib/abort.c:81
     5# 0x000055E565C60AC5 in
    /mnt/disk1/doris-clusters/doris-master-asan/output/be/lib/doris_be
     6# 0x000055E565C5237A in
    /mnt/disk1/doris-clusters/doris-master-asan/output/be/lib/doris_be
     7# google::LogMessage::SendToLog() in
    /mnt/disk1/doris-clusters/doris-master-asan/output/be/lib/doris_be
     8# google::LogMessage::Flush() in
    /mnt/disk1/doris-clusters/doris-master-asan/output/be/lib/doris_be
     9# google::LogMessageFatal::~LogMessageFatal() in
    /mnt/disk1/doris-clusters/doris-master-asan/output/be/lib/doris_be
    10#
    doris::vectorized::FunctionBuilderImpl::check_number_of_arguments(unsigned
    long) const at
    
/home/zcp/repo_center/doris_master/doris/be/src/vec/functions/function.cpp:260
    11#
    
doris::vectorized::FunctionBuilderImpl::get_return_type(std::vector<doris::vectorized::ColumnWithTypeAndName,
    std::allocator<doris::vectorized::ColumnWithTypeAndName> > const&) const
    in /mnt/disk1/doris-clusters/doris-master-asan/output/be/lib/doris_be
    12#
    
doris::vectorized::FunctionBuilderImpl::build(std::vector<doris::vectorized::ColumnWithTypeAndName,
    std::allocator<doris::vectorized::ColumnWithTypeAndName> > const&,
    std::shared_ptr<doris::vectorized::IDataType const> const&) const in
    /mnt/disk1/doris-clusters/doris-master-asan/output/be/lib/doris_be
    13#
    
doris::vectorized::SimpleFunctionFactory::get_function(std::__cxx11::basic_string<char,
    std::char_traits<char>, std::allocator<char> > const&,
    std::vector<doris::vectorized::ColumnWithTypeAndName,
    std::allocator<doris::vectorized::ColumnWithTypeAndName> > const&,
    std::shared_ptr<doris::vectorized::IDataType const> const&,
    doris::vectorized::FunctionAttr const&, int) at
    
/home/zcp/repo_center/doris_master/doris/be/src/vec/functions/simple_function_factory.h:216
    14# doris::vectorized::VectorizedFnCall::prepare(doris::RuntimeState*,
    doris::RowDescriptor const&, doris::vectorized::VExprContext*) at
    
/home/zcp/repo_center/doris_master/doris/be/src/vec/exprs/vectorized_fn_call.cpp:108
    15# doris::vectorized::VExprContext::prepare(doris::RuntimeState*,
    doris::RowDescriptor const&) at
    
/home/zcp/repo_center/doris_master/doris/be/src/vec/exprs/vexpr_context.cpp:75
    16# doris::Status
    
doris::FoldConstantExecutor::_prepare_and_open<doris::vectorized::VExprContext>(doris::vectorized::VExprContext*)
    at
    
/home/zcp/repo_center/doris_master/doris/be/src/runtime/fold_constant_executor.cpp:191
    17#
    doris::FoldConstantExecutor::fold_constant_vexpr(doris::TFoldConstantParams
    const&, doris::PConstantExprResult*) at
    
/home/zcp/repo_center/doris_master/doris/be/src/runtime/fold_constant_executor.cpp:95
    18# std::_Function_handler<void (),
    
doris::PInternalService::fold_constant_expr(google::protobuf::RpcController*,
    doris::PConstantExprRequest const*, doris::PConstantExprResult*,
    google::protobuf::Closure*)::$_0>::_M_invoke(std::_Any_data const&) at
    
/usr/local/ldb-toolchain-v0.25/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/std_function.h:292
    19# doris::WorkThreadPool<false>::work_thread(int) in
    /mnt/disk1/doris-clusters/doris-master-asan/output/be/lib/doris_be
    20# execute_native_thread_routine in
    /mnt/disk1/doris-clusters/doris-master-asan/output/be/lib/doris_be
    21# asan_thread_start(void*) in
    /mnt/disk1/doris-clusters/doris-master-asan/output/be/lib/doris_be
    22# start_thread at ./nptl/pthread_create.c:442
    23# 0x00007FC629E63850 at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:83
    
    case 
    
    set enable_fold_constant_by_be=true;
    select log(100);
---
 .../rules/expression/ExpressionNormalization.java  |   6 +++
 .../rules/expression/ExpressionOptimization.java   |   6 +--
 .../scalar_function/FixConcatWsAndLog.out          | Bin 0 -> 987 bytes
 .../scalar_function/FixConcatWsAndLog.groovy       |  48 +++++++++++++++++++++
 4 files changed, 55 insertions(+), 5 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionNormalization.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionNormalization.java
index 837d3ac84f9..2e24f7895e6 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionNormalization.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionNormalization.java
@@ -18,6 +18,7 @@
 package org.apache.doris.nereids.rules.expression;
 
 import org.apache.doris.nereids.rules.expression.check.CheckCast;
+import org.apache.doris.nereids.rules.expression.rules.ConcatWsMultiArrayToOne;
 import org.apache.doris.nereids.rules.expression.rules.ConvertAggStateCast;
 import org.apache.doris.nereids.rules.expression.rules.DigitalMaskingConvert;
 import org.apache.doris.nereids.rules.expression.rules.FoldConstantRule;
@@ -25,6 +26,7 @@ import 
org.apache.doris.nereids.rules.expression.rules.InPredicateDedup;
 import 
org.apache.doris.nereids.rules.expression.rules.InPredicateExtractNonConstant;
 import 
org.apache.doris.nereids.rules.expression.rules.InPredicateToEqualToRule;
 import org.apache.doris.nereids.rules.expression.rules.JsonFunctionRewrite;
+import org.apache.doris.nereids.rules.expression.rules.LogToLn;
 import org.apache.doris.nereids.rules.expression.rules.MedianConvert;
 import org.apache.doris.nereids.rules.expression.rules.MergeDateTrunc;
 import 
org.apache.doris.nereids.rules.expression.rules.NormalizeBinaryPredicatesRule;
@@ -45,6 +47,8 @@ import java.util.List;
 public class ExpressionNormalization extends ExpressionRewrite {
     // we should run supportJavaDateFormatter before foldConstantRule or be 
will fold
     // from_unixtime(timestamp, 'yyyyMMdd') to 'yyyyMMdd'
+    // specically note: LogToLn and ConcatWsMultiArrayToOne must  before 
FoldConstantRule,otherwise log will core when
+    // input single argument like log(100),and concat_ws will retuen a wrong 
result when input multi array
     public static final List<ExpressionRewriteRule<ExpressionRewriteContext>> 
NORMALIZE_REWRITE_RULES
                 = ImmutableList.of(
             bottomUp(
@@ -55,6 +59,8 @@ public class ExpressionNormalization extends 
ExpressionRewrite {
                 InPredicateToEqualToRule.INSTANCE,
                 SimplifyNotExprRule.INSTANCE,
                 SimplifyArithmeticRule.INSTANCE,
+                LogToLn.INSTANCE,
+                ConcatWsMultiArrayToOne.INSTANCE,
                 FoldConstantRule.INSTANCE,
                 SimplifyCastRule.INSTANCE,
                 DigitalMaskingConvert.INSTANCE,
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionOptimization.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionOptimization.java
index a983f152ffa..489af4b331c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionOptimization.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionOptimization.java
@@ -21,12 +21,10 @@ import 
org.apache.doris.nereids.rules.expression.rules.AddMinMax;
 import 
org.apache.doris.nereids.rules.expression.rules.ArrayContainToArrayOverlap;
 import org.apache.doris.nereids.rules.expression.rules.BetweenToEqual;
 import org.apache.doris.nereids.rules.expression.rules.CaseWhenToIf;
-import org.apache.doris.nereids.rules.expression.rules.ConcatWsMultiArrayToOne;
 import org.apache.doris.nereids.rules.expression.rules.DateFunctionRewrite;
 import org.apache.doris.nereids.rules.expression.rules.DistinctPredicatesRule;
 import org.apache.doris.nereids.rules.expression.rules.ExtractCommonFactorRule;
 import org.apache.doris.nereids.rules.expression.rules.LikeToEqualRewrite;
-import org.apache.doris.nereids.rules.expression.rules.LogToLn;
 import org.apache.doris.nereids.rules.expression.rules.NullSafeEqualToEqual;
 import 
org.apache.doris.nereids.rules.expression.rules.SimplifyComparisonPredicate;
 import 
org.apache.doris.nereids.rules.expression.rules.SimplifyConflictCompound;
@@ -63,9 +61,7 @@ public class ExpressionOptimization extends ExpressionRewrite 
{
                     TopnToMax.INSTANCE,
                     NullSafeEqualToEqual.INSTANCE,
                     LikeToEqualRewrite.INSTANCE,
-                    BetweenToEqual.INSTANCE,
-                    LogToLn.INSTANCE,
-                    ConcatWsMultiArrayToOne.INSTANCE
+                    BetweenToEqual.INSTANCE
             )
     );
 
diff --git 
a/regression-test/data/nereids_function_p0/scalar_function/FixConcatWsAndLog.out
 
b/regression-test/data/nereids_function_p0/scalar_function/FixConcatWsAndLog.out
new file mode 100644
index 00000000000..8f5795ed341
Binary files /dev/null and 
b/regression-test/data/nereids_function_p0/scalar_function/FixConcatWsAndLog.out
 differ
diff --git 
a/regression-test/suites/nereids_function_p0/scalar_function/FixConcatWsAndLog.groovy
 
b/regression-test/suites/nereids_function_p0/scalar_function/FixConcatWsAndLog.groovy
new file mode 100644
index 00000000000..150f8d46f41
--- /dev/null
+++ 
b/regression-test/suites/nereids_function_p0/scalar_function/FixConcatWsAndLog.groovy
@@ -0,0 +1,48 @@
+// 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.
+
+
+suite("nereids_scalar_fn_concat_ws_and_log") {
+
+    sql 'set enable_fold_constant_by_be=true'
+    qt_concat_ws_ArrayWithNullElement "select 
concat_ws('-',['a','b'],['css',null,'d'],['g','f'],['s'])"
+
+
+    qt_concat_ws_ArrayWithEmptyString "select 
concat_ws('-',['a',''],['','css'],['d',''])"
+    qt_concat_ws_WithEmptyArray "select 
concat_ws('-',['a','b'],[],['css','d'],[])"
+    qt_concat_ws_SeparatorSpecial "select 
concat_ws('|',['x','y'],['m',null,'n'],['p'])"
+
+    qt_concat_ws_SeparatorEmpty "select 
concat_ws('',['a','b'],['c',null],['d'])"
+
+    qt_concat_ws_ArrayWithNumber "select 
concat_ws('-',['1','2'],['3',null,'4'],['5','6'])"
+    qt_concat_ws_WithNullArray "select concat_ws('-',['a'],null,['b','c'])"
+    qt_concat_ws_SingleArray "select concat_ws(',',['x','y','z'])"
+    qt_concat_ws_ArrayAllNull "select concat_ws('-',['a'],[null,null],['b'])"
+    qt_concat_ws_MixedTypeElement "select 
concat_ws('|',['a','123'],['456',null,'b'])"
+    qt_concat_ws_chinese "select 
concat_ws(',',['你好','世界'],['Doris',null,'Nereids'],['测试'])"
+
+    sql "DROP TABLE IF EXISTS test_concat_ws_1"
+    sql "CREATE TABLE test_concat_ws_1 (id INT, a ARRAY<VARCHAR>, b 
ARRAY<VARCHAR>) ENGINE=OLAP DISTRIBUTED BY HASH(id) BUCKETS 1 PROPERTIES 
('replication_num' = '1')"
+    sql "INSERT INTO test_concat_ws_1 VALUES (1, ['a','b'], ['css',null,'d']), 
(2, ['x',null], ['y','z']),(3,['你好','世界'],['Doris',null,'Nereids'])"
+    qt_concat_ws_insert_1 "SELECT concat_ws('-', a, b) FROM test_concat_ws_1 
ORDER BY id"
+
+
+    qt_log_function "SELECT log(10, 100), log(2, 8), log(3, 27), log(5, 125), 
log(10, 1000)"
+    qt_log_function_with_null "SELECT log(10, NULL), log(NULL, 100), log(NULL, 
NULL), log(10, 0), log(0, 10)"
+    qt_log_function_wiht_one_argument "SELECT log(100), log(8), log(27), 
log(125), log(1000)"
+    qt_log_function_with_null_and_one_argument "SELECT log(NULL), log(0), 
log(1), log(10)"
+}
\ No newline at end of file


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

Reply via email to