This is an automated email from the ASF dual-hosted git repository. morrysnow pushed a commit to branch fix_decimal_256 in repository https://gitbox.apache.org/repos/asf/doris.git
commit d9e3286765f4ffa572b8d74d40bb1552b9159670 Author: morrySnow <[email protected]> AuthorDate: Wed Jul 16 13:30:13 2025 +0800 [fix](decimal256) some ddl could not run or get wrong result on decimal256 - alter table add column - alter table modify column - create aggregate model table with decimal256 value column --- .../org/apache/doris/catalog/AggregateType.java | 3 + .../java/org/apache/doris/catalog/FunctionSet.java | 44 +++++++ .../java/org/apache/doris/qe/SessionVariable.java | 10 +- .../datatype_p0/decimalv3/test_decimal256_ddl.out | Bin 0 -> 441 bytes .../decimalv3/test_decimal256_ddl.groovy | 144 +++++++++++++++++++++ 5 files changed, 199 insertions(+), 2 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateType.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateType.java index 94a788f0b9a..12f3d16fbd3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateType.java @@ -70,6 +70,7 @@ public enum AggregateType { primitiveTypeList.add(PrimitiveType.DECIMAL32); primitiveTypeList.add(PrimitiveType.DECIMAL64); primitiveTypeList.add(PrimitiveType.DECIMAL128); + primitiveTypeList.add(PrimitiveType.DECIMAL256); compatibilityMap.put(SUM, EnumSet.copyOf(primitiveTypeList)); primitiveTypeList.clear(); @@ -84,6 +85,7 @@ public enum AggregateType { primitiveTypeList.add(PrimitiveType.DECIMAL32); primitiveTypeList.add(PrimitiveType.DECIMAL64); primitiveTypeList.add(PrimitiveType.DECIMAL128); + primitiveTypeList.add(PrimitiveType.DECIMAL256); primitiveTypeList.add(PrimitiveType.DATE); primitiveTypeList.add(PrimitiveType.DATETIME); primitiveTypeList.add(PrimitiveType.DATEV2); @@ -105,6 +107,7 @@ public enum AggregateType { primitiveTypeList.add(PrimitiveType.DECIMAL32); primitiveTypeList.add(PrimitiveType.DECIMAL64); primitiveTypeList.add(PrimitiveType.DECIMAL128); + primitiveTypeList.add(PrimitiveType.DECIMAL256); primitiveTypeList.add(PrimitiveType.DATE); primitiveTypeList.add(PrimitiveType.DATETIME); primitiveTypeList.add(PrimitiveType.DATEV2); diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java index de1d1178ed6..54125ce4ac3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java @@ -139,6 +139,7 @@ public class FunctionSet<T> { .put(Type.DECIMAL32, Type.DECIMAL32) .put(Type.DECIMAL64, Type.DECIMAL64) .put(Type.DECIMAL128, Type.DECIMAL128) + .put(Type.DECIMAL256, Type.DECIMAL256) .build(); private static final Map<Type, Type> STDDEV_RETTYPE_SYMBOL = @@ -953,6 +954,19 @@ public class FunctionSet<T> { null, "", false, true, true, true)); + } else if (t.equals(Type.DECIMAL256)) { + // vectorized + addBuiltin(AggregateFunction.createBuiltin("multi_distinct_count", Lists.newArrayList(t), + Type.BIGINT, + Type.DECIMAL256, + "", + "", + "", + "", + null, + null, + "", + false, true, true, true)); } // sum in multi distinct @@ -1073,6 +1087,29 @@ public class FunctionSet<T> { null, "", false, true, true, true)); + } else if (t.equals(Type.DECIMAL256)) { + addBuiltin(AggregateFunction.createBuiltin("multi_distinct_sum", Lists.newArrayList(t), + MULTI_DISTINCT_SUM_RETURN_TYPE.get(t), + Type.DECIMAL256, + "", + "", + "", + "", + null, + null, + "", + false, true, false, true)); + addBuiltin(AggregateFunction.createBuiltin("multi_distinct_sum0", Lists.newArrayList(t), + MULTI_DISTINCT_SUM_RETURN_TYPE.get(t), + Type.DECIMAL256, + "", + "", + "", + "", + null, + null, + "", + false, true, true, true)); } // Min addBuiltin(AggregateFunction.createBuiltin("min", @@ -1349,6 +1386,13 @@ public class FunctionSet<T> { null, null, "", null, false, true, nameWithReturn.getValue(), true)); + addBuiltin(AggregateFunction.createBuiltin(nameWithReturn.getKey(), + Lists.<Type>newArrayList(Type.DECIMAL256), Type.DECIMAL256, Type.DECIMAL256, "", + "", + "", + null, null, + "", + null, false, true, nameWithReturn.getValue(), true)); addBuiltin(AggregateFunction.createBuiltin(nameWithReturn.getKey(), Lists.<Type>newArrayList(Type.LARGEINT), Type.LARGEINT, Type.LARGEINT, "", "", diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java index a036b18cd7e..3a7ee7c8f2e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java @@ -4487,10 +4487,16 @@ public class SessionVariable implements Serializable, Writable { public static boolean getEnableDecimal256() { ConnectContext connectContext = ConnectContext.get(); if (connectContext == null) { - return false; + return VariableMgr.getDefaultSessionVariable().enableDecimal256; } SessionVariable sessionVariable = connectContext.getSessionVariable(); - return connectContext.getState().isNereids() && sessionVariable.isEnableDecimal256(); + if (!sessionVariable.isEnableDecimal256()) { + return false; + } + if (connectContext.getState().isQuery()) { + return connectContext.getState().isNereids(); + } + return true; } public boolean isEnableDecimal256() { diff --git a/regression-test/data/datatype_p0/decimalv3/test_decimal256_ddl.out b/regression-test/data/datatype_p0/decimalv3/test_decimal256_ddl.out new file mode 100644 index 00000000000..aa3d3f760f3 Binary files /dev/null and b/regression-test/data/datatype_p0/decimalv3/test_decimal256_ddl.out differ diff --git a/regression-test/suites/datatype_p0/decimalv3/test_decimal256_ddl.groovy b/regression-test/suites/datatype_p0/decimalv3/test_decimal256_ddl.groovy new file mode 100644 index 00000000000..e50925ad27c --- /dev/null +++ b/regression-test/suites/datatype_p0/decimalv3/test_decimal256_ddl.groovy @@ -0,0 +1,144 @@ +// 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("test_decimal256_ddl") { + def getJobState = { tableName -> + def jobStateResult = sql """ SHOW ALTER TABLE COLUMN WHERE IndexName='${tableName}' ORDER BY createtime DESC LIMIT 1 """ + return jobStateResult[0][9] + } + + def waitSchemaChangeFinish = { table -> + while (true) { + String result = getJobState(table) + if (result == "FINISHED") { + break + } else if (result == "CANCELLED") { + sucess.set(false) + logger.error("schema change was cancelled") + assertTrue(false) + } else { + sleep(2000) + } + } + } + + def table1 = "test_decimal256_ddl" + + sql "set enable_decimal256=true" + + sql "drop table if exists ${table1}" + + sql """ + CREATE TABLE IF NOT EXISTS `${table1}` ( + id int, + dcl1 decimal(40, 5) + ) ENGINE=OLAP + DUPLICATE KEY(`id`, `dcl1`) + DISTRIBUTED BY HASH(`id`, `dcl1`) BUCKETS 8 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + ) + """ + + sql """ + alter table ${table1} add column (dcl2 decimal(60,15)); + """ + + waitSchemaChangeFinish(table1) + + + sql """ + alter table ${table1} add column (dcl3 decimal(60,15) default '0'); + """ + + waitSchemaChangeFinish(table1) + + + sql """ + alter table ${table1} modify column dcl2 decimal(48, 5); + """ + + waitSchemaChangeFinish(table1) + + + sql """ + alter table ${table1} modify column dcl3 decimal(48, 5) default '0'; + """ + + waitSchemaChangeFinish(table1) + + + sql """ + create materialized view ${table1}mv as select id, sum(dcl1), min(dcl2), max(dcl3) from ${table1} group by id; + """ + + + sql """ + insert into ${table1} values + (1,1.1,1.2,1.3), + (1,11.1,11.2,11.3), + (1,12.1,12.2,12.3), + (2,2.1,2.2,2.3), + (2,21.1,21.2,21.3), + (2,22.1,22.2,22.3) + """ + + sql """sync""" + + order_qt_select """ + select * from ${table1} order by id + """ + + order_qt_agg """ + select sum(dcl1), min(dcl2), max(dcl3) from ${table1} group by id + """ + + sql "drop table if exists ${table1} force" + + sql """ + create table ${table1} (id int, dcl1 decimal(60,3) sum, dcl2 decimal(70,0) min, dcl3 decimal(70,4) max) + AGGREGATE KEY(`id`) + DISTRIBUTED BY hash(id) + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + ) + """ + + sql """ + insert into ${table1} values + (1,1.1,1.2,1.3), + (1,11.1,11.2,11.3), + (1,12.1,12.2,12.3), + (2,2.1,2.2,2.3), + (2,21.1,21.2,21.3), + (2,22.1,22.2,22.3) + """ + + sql """sync""" + + order_qt_select """ + select * from ${table1} order by id + """ + + order_qt_agg """ + select sum(dcl1), min(dcl2), max(dcl3) from ${table1} group by id + """ + + sql "drop table if exists ${table1} force" + + +} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
