From 10aa38628dc09a9876bea752cd029bf08a5735bc Mon Sep 17 00:00:00 2001 From: xufei Date: Fri, 13 Feb 2026 10:17:08 +0800 Subject: [PATCH 1/3] support sum_int Signed-off-by: xufei --- contrib/tipb | 2 +- .../Debug/MockExecutor/AggregationBinder.cpp | 2 +- dbms/src/Debug/MockExecutor/FuncSigMap.cpp | 1 + .../Coprocessor/DAGExpressionAnalyzer.cpp | 2 +- dbms/src/Flash/Coprocessor/DAGUtils.cpp | 3 + .../tests/gtest_sum_int_agg_func.cpp | 109 ++++++++++++++++++ 6 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 dbms/src/Flash/Coprocessor/tests/gtest_sum_int_agg_func.cpp diff --git a/contrib/tipb b/contrib/tipb index 0607513e7fa..59b3af7d532 160000 --- a/contrib/tipb +++ b/contrib/tipb @@ -1 +1 @@ -Subproject commit 0607513e7fa40f3b564f0b269da76c1c8dc90032 +Subproject commit 59b3af7d5324b197f7d0ea5bce8d213e55784a59 diff --git a/dbms/src/Debug/MockExecutor/AggregationBinder.cpp b/dbms/src/Debug/MockExecutor/AggregationBinder.cpp index 84e9c39d837..af4652e1034 100644 --- a/dbms/src/Debug/MockExecutor/AggregationBinder.cpp +++ b/dbms/src/Debug/MockExecutor/AggregationBinder.cpp @@ -202,7 +202,7 @@ void AggregationBinder::buildAggFunc(tipb::Expr * agg_func, const ASTFunction * auto agg_sig = agg_sig_it->second; agg_func->set_tp(agg_sig); - if (agg_sig == tipb::ExprType::Count || agg_sig == tipb::ExprType::Sum) + if (agg_sig == tipb::ExprType::Count || agg_sig == tipb::ExprType::Sum || agg_sig == tipb::ExprType::SumInt) { auto * ft = agg_func->mutable_field_type(); ft->set_tp(TiDB::TypeLongLong); diff --git a/dbms/src/Debug/MockExecutor/FuncSigMap.cpp b/dbms/src/Debug/MockExecutor/FuncSigMap.cpp index 3a6af062950..e0bc5c6326c 100644 --- a/dbms/src/Debug/MockExecutor/FuncSigMap.cpp +++ b/dbms/src/Debug/MockExecutor/FuncSigMap.cpp @@ -89,6 +89,7 @@ std::unordered_map agg_func_name_to_sig({ {"max", tipb::ExprType::Max}, {"count", tipb::ExprType::Count}, {"sum", tipb::ExprType::Sum}, + {"sum_int", tipb::ExprType::SumInt}, {"first_row", tipb::ExprType::First}, {"uniqRawRes", tipb::ExprType::ApproxCountDistinct}, {"group_concat", tipb::ExprType::GroupConcat}, diff --git a/dbms/src/Flash/Coprocessor/DAGExpressionAnalyzer.cpp b/dbms/src/Flash/Coprocessor/DAGExpressionAnalyzer.cpp index 095d2fc8813..7361ac560d7 100644 --- a/dbms/src/Flash/Coprocessor/DAGExpressionAnalyzer.cpp +++ b/dbms/src/Flash/Coprocessor/DAGExpressionAnalyzer.cpp @@ -1735,7 +1735,7 @@ String DAGExpressionAnalyzer::appendCastForFunctionExpr( return expr_name; } } - LOG_TRACE( + LOG_DEBUG( context.getDAGContext()->log, "Add implicit cast for column {}, expected type {}, actual type {}", expr_name, diff --git a/dbms/src/Flash/Coprocessor/DAGUtils.cpp b/dbms/src/Flash/Coprocessor/DAGUtils.cpp index efacecc9b93..fd9aff4bb8f 100644 --- a/dbms/src/Flash/Coprocessor/DAGUtils.cpp +++ b/dbms/src/Flash/Coprocessor/DAGUtils.cpp @@ -53,6 +53,7 @@ const std::unordered_map window_func_map({ const std::unordered_map agg_func_map({ {tipb::ExprType::Count, "count"}, {tipb::ExprType::Sum, "sum"}, + {tipb::ExprType::SumInt, "sum"}, {tipb::ExprType::Min, "min"}, {tipb::ExprType::Max, "max"}, {tipb::ExprType::First, "first_row"}, @@ -994,6 +995,7 @@ String exprToString(const tipb::Expr & expr, const std::vector return getColumnNameForColumnExpr(expr, input_col); case tipb::ExprType::Count: case tipb::ExprType::Sum: + case tipb::ExprType::SumInt: case tipb::ExprType::Avg: case tipb::ExprType::Min: case tipb::ExprType::Max: @@ -1050,6 +1052,7 @@ bool isAggFunctionExpr(const tipb::Expr & expr) { case tipb::ExprType::Count: case tipb::ExprType::Sum: + case tipb::ExprType::SumInt: case tipb::ExprType::Avg: case tipb::ExprType::Min: case tipb::ExprType::Max: diff --git a/dbms/src/Flash/Coprocessor/tests/gtest_sum_int_agg_func.cpp b/dbms/src/Flash/Coprocessor/tests/gtest_sum_int_agg_func.cpp new file mode 100644 index 00000000000..eb80534a420 --- /dev/null +++ b/dbms/src/Flash/Coprocessor/tests/gtest_sum_int_agg_func.cpp @@ -0,0 +1,109 @@ +// Copyright 2023 PingCAP, Inc. +// +// Licensed 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 +#include +#include +#include +#include +#include +#include +#include +#include + +namespace DB +{ +namespace tests +{ +namespace +{ +template +using AggregateFunctionSumSimple = AggregateFunctionSum< + T, + typename NearestFieldType::Type, + AggregateFunctionSumData::Type>>; + +template +void checkSumIntReturnType(const String & expected_output, const String & expected_output_nullable) +{ + using NestedFunc = AggregateFunctionSumSimple; + auto nested = std::make_shared(); + ASSERT_EQ(nested->getReturnType()->getName(), expected_output); + + auto wrapped + = std::make_shared>(nested); + ASSERT_EQ(wrapped->getReturnType()->getName(), expected_output_nullable); +} +} // namespace + +TEST(SumIntAggFuncTest, DagUtilsMappedToSum) +{ + tipb::Expr expr; + expr.set_tp(tipb::ExprType::SumInt); + + ASSERT_TRUE(isAggFunctionExpr(expr)); + ASSERT_EQ(getAggFunctionName(expr), "sum"); + ASSERT_EQ(getFunctionName(expr), "sum"); +} + +TEST(SumIntAggFuncTest, ExprToStringIsSum) +{ + std::vector input_cols; + input_cols.emplace_back("col0", std::make_shared()); + + tipb::Expr col_ref; + col_ref.set_tp(tipb::ExprType::ColumnRef); + WriteBufferFromOwnString ss; + encodeDAGInt64(0, ss); + col_ref.set_val(ss.releaseStr()); + + tipb::Expr sum_int; + sum_int.set_tp(tipb::ExprType::SumInt); + *sum_int.add_children() = col_ref; + + ASSERT_EQ(exprToString(sum_int, input_cols), "sum(col0)"); +} + +TEST(SumIntAggFuncTest, PartialStageIsTreatedAsSum) +{ + tipb::Expr expr; + expr.set_tp(tipb::ExprType::SumInt); + + ASSERT_FALSE(AggregationInterpreterHelper::isSumOnPartialResults(expr)); + + expr.set_aggfuncmode(tipb::AggFunctionMode::Partial1Mode); + ASSERT_FALSE(AggregationInterpreterHelper::isSumOnPartialResults(expr)); + + expr.set_aggfuncmode(tipb::AggFunctionMode::Partial2Mode); + ASSERT_TRUE(AggregationInterpreterHelper::isSumOnPartialResults(expr)); + + expr.set_aggfuncmode(tipb::AggFunctionMode::FinalMode); + ASSERT_TRUE(AggregationInterpreterHelper::isSumOnPartialResults(expr)); +} + +TEST(SumIntAggFuncTest, ReturnTypeForIntegerInputs) +{ + checkSumIntReturnType("Int64", "Nullable(Int64)"); + checkSumIntReturnType("Int64", "Nullable(Int64)"); + checkSumIntReturnType("Int64", "Nullable(Int64)"); + checkSumIntReturnType("Int64", "Nullable(Int64)"); + + checkSumIntReturnType("UInt64", "Nullable(UInt64)"); + checkSumIntReturnType("UInt64", "Nullable(UInt64)"); + checkSumIntReturnType("UInt64", "Nullable(UInt64)"); + checkSumIntReturnType("UInt64", "Nullable(UInt64)"); +} + +} // namespace tests +} // namespace DB From ee876b3657b100ba3cfa9f5242a0d060442343d1 Mon Sep 17 00:00:00 2001 From: xufei Date: Fri, 13 Feb 2026 10:21:51 +0800 Subject: [PATCH 2/3] fix Signed-off-by: xufei --- dbms/src/Flash/Coprocessor/DAGExpressionAnalyzer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbms/src/Flash/Coprocessor/DAGExpressionAnalyzer.cpp b/dbms/src/Flash/Coprocessor/DAGExpressionAnalyzer.cpp index 7361ac560d7..095d2fc8813 100644 --- a/dbms/src/Flash/Coprocessor/DAGExpressionAnalyzer.cpp +++ b/dbms/src/Flash/Coprocessor/DAGExpressionAnalyzer.cpp @@ -1735,7 +1735,7 @@ String DAGExpressionAnalyzer::appendCastForFunctionExpr( return expr_name; } } - LOG_DEBUG( + LOG_TRACE( context.getDAGContext()->log, "Add implicit cast for column {}, expected type {}, actual type {}", expr_name, From bee8a0f6d3772f2f4348244f1b63e1baf67d2bab Mon Sep 17 00:00:00 2001 From: xufei Date: Fri, 13 Feb 2026 11:49:22 +0800 Subject: [PATCH 3/3] fix ci Signed-off-by: xufei --- tests/docker/cluster.yaml | 6 +++--- tests/docker/cluster_disable_new_collation.yaml | 6 +++--- tests/docker/cluster_new_collation.yaml | 6 +++--- tests/docker/cluster_tidb_fail_point.yaml | 6 +++--- tests/docker/run.sh | 4 ++++ tests/docker/tiflash-tagged-image.yaml | 2 +- tests/docker/util.sh | 3 +++ 7 files changed, 20 insertions(+), 13 deletions(-) diff --git a/tests/docker/cluster.yaml b/tests/docker/cluster.yaml index dd2f1dbf33f..e9037f6f776 100644 --- a/tests/docker/cluster.yaml +++ b/tests/docker/cluster.yaml @@ -16,7 +16,7 @@ version: '2.3' services: pd0: - image: hub.pingcap.net/qa/pd:${PD_BRANCH:-master} + image: us-docker.pkg.dev/pingcap-testing-account/hub/tikv/pd/image:${PD_BRANCH:-master} security_opt: - seccomp:unconfined volumes: @@ -35,7 +35,7 @@ services: - --log-file=/log/pd.log restart: on-failure tikv0: - image: hub.pingcap.net/qa/tikv:${TIKV_BRANCH:-master} + image: us-docker.pkg.dev/pingcap-testing-account/hub/tikv/tikv/image:${TIKV_BRANCH:-master} security_opt: - seccomp:unconfined volumes: @@ -55,7 +55,7 @@ services: - "pd0" restart: on-failure tidb0: - image: hub.pingcap.net/qa/tidb:${TIDB_BRANCH:-master} + image: us-docker.pkg.dev/pingcap-testing-account/hub/pingcap/tidb/images/tidb-server:${TIDB_BRANCH:-master} security_opt: - seccomp:unconfined volumes: diff --git a/tests/docker/cluster_disable_new_collation.yaml b/tests/docker/cluster_disable_new_collation.yaml index 8dd13e2c0a8..c146ad1b66c 100644 --- a/tests/docker/cluster_disable_new_collation.yaml +++ b/tests/docker/cluster_disable_new_collation.yaml @@ -16,7 +16,7 @@ version: '2.3' services: pd0: - image: hub.pingcap.net/qa/pd:${PD_BRANCH:-master} + image: us-docker.pkg.dev/pingcap-testing-account/hub/tikv/pd/image:${PD_BRANCH:-master} security_opt: - seccomp:unconfined volumes: @@ -35,7 +35,7 @@ services: - --log-file=/log/pd.log restart: on-failure tikv0: - image: hub.pingcap.net/qa/tikv:${TIKV_BRANCH:-master} + image: us-docker.pkg.dev/pingcap-testing-account/hub/tikv/tikv/image:${TIKV_BRANCH:-master} security_opt: - seccomp:unconfined volumes: @@ -55,7 +55,7 @@ services: - "pd0" restart: on-failure tidb0: - image: hub.pingcap.net/qa/tidb:${TIDB_BRANCH:-master} + image: us-docker.pkg.dev/pingcap-testing-account/hub/pingcap/tidb/images/tidb-server:${TIDB_BRANCH:-master} security_opt: - seccomp:unconfined volumes: diff --git a/tests/docker/cluster_new_collation.yaml b/tests/docker/cluster_new_collation.yaml index 153b40f327b..3e4f4af6a2e 100644 --- a/tests/docker/cluster_new_collation.yaml +++ b/tests/docker/cluster_new_collation.yaml @@ -16,7 +16,7 @@ version: '2.3' services: pd0: - image: hub.pingcap.net/qa/pd:${PD_BRANCH:-master} + image: us-docker.pkg.dev/pingcap-testing-account/hub/tikv/pd/image:${PD_BRANCH:-master} security_opt: - seccomp:unconfined volumes: @@ -35,7 +35,7 @@ services: - --log-file=/log/pd.log restart: on-failure tikv0: - image: hub.pingcap.net/qa/tikv:${TIKV_BRANCH:-master} + image: us-docker.pkg.dev/pingcap-testing-account/hub/tikv/tikv/image:${TIKV_BRANCH:-master} security_opt: - seccomp:unconfined volumes: @@ -55,7 +55,7 @@ services: - "pd0" restart: on-failure tidb0: - image: hub.pingcap.net/qa/tidb:${TIDB_BRANCH:-master} + image: us-docker.pkg.dev/pingcap-testing-account/hub/pingcap/tidb/images/tidb-server:${TIDB_BRANCH:-master} security_opt: - seccomp:unconfined volumes: diff --git a/tests/docker/cluster_tidb_fail_point.yaml b/tests/docker/cluster_tidb_fail_point.yaml index faec3c48898..2a0a9fb7dcc 100644 --- a/tests/docker/cluster_tidb_fail_point.yaml +++ b/tests/docker/cluster_tidb_fail_point.yaml @@ -16,7 +16,7 @@ version: '2.3' services: pd0: - image: hub.pingcap.net/qa/pd:${PD_BRANCH:-master} + image: us-docker.pkg.dev/pingcap-testing-account/hub/tikv/pd/image:${PD_BRANCH:-master} security_opt: - seccomp:unconfined volumes: @@ -35,7 +35,7 @@ services: - --log-file=/log/pd.log restart: on-failure tikv0: - image: hub.pingcap.net/qa/tikv:${TIKV_BRANCH:-master} + image: us-docker.pkg.dev/pingcap-testing-account/hub/tikv/tikv/image:${TIKV_BRANCH:-master} security_opt: - seccomp:unconfined volumes: @@ -55,7 +55,7 @@ services: - "pd0" restart: on-failure tidb0: - image: hub.pingcap.net/qa/tidb:${TIDB_BRANCH:-master}-failpoint + image: us-docker.pkg.dev/pingcap-testing-account/hub/pingcap/tidb/images/tidb-server:${TIDB_BRANCH:-master}-failpoint security_opt: - seccomp:unconfined environment: diff --git a/tests/docker/run.sh b/tests/docker/run.sh index 9730cdb7c3b..c92c57883ce 100755 --- a/tests/docker/run.sh +++ b/tests/docker/run.sh @@ -71,6 +71,10 @@ if [ -n "$BRANCH" ]; then [ -z "$TIKV_BRANCH" ] && export TIKV_BRANCH="$BRANCH" [ -z "$TIDB_BRANCH" ] && export TIDB_BRANCH="$BRANCH" fi +export PD_BRANCH="${PD_BRANCH//\//-}" +export TIKV_BRANCH="${TIKV_BRANCH//\//-}" +export TIDB_BRANCH="${TIDB_BRANCH//\//-}" +export TAG="${TAG//\//-}" # Stop all docker instances if exist. diff --git a/tests/docker/tiflash-tagged-image.yaml b/tests/docker/tiflash-tagged-image.yaml index 893162c69c3..99b15f451a4 100644 --- a/tests/docker/tiflash-tagged-image.yaml +++ b/tests/docker/tiflash-tagged-image.yaml @@ -18,7 +18,7 @@ services: # for tests under fullstack-test directory # (engine DeltaTree) tiflash0: - image: hub.pingcap.net/tiflash/tics:${TAG:-master} + image: us-docker.pkg.dev/pingcap-testing-account/hub/pingcap/tiflash/image:${TAG:-master} security_opt: - seccomp:unconfined volumes: diff --git a/tests/docker/util.sh b/tests/docker/util.sh index cb050a8cda3..c8c77fdb1b3 100644 --- a/tests/docker/util.sh +++ b/tests/docker/util.sh @@ -97,6 +97,9 @@ function set_branch() { [ -z "$TIKV_BRANCH" ] && export TIKV_BRANCH="$BRANCH" [ -z "$TIDB_BRANCH" ] && export TIDB_BRANCH="$BRANCH" fi + export PD_BRANCH="${PD_BRANCH//\//-}" + export TIKV_BRANCH="${TIKV_BRANCH//\//-}" + export TIDB_BRANCH="${TIDB_BRANCH//\//-}" echo "use branch \`${BRANCH-master}\` for ci test" }