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]