This is an automated email from the ASF dual-hosted git repository. lide pushed a commit to branch branch-1.2-lts in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-1.2-lts by this push: new 48f0ff975d1 [fix](catalog) wrong required slot info of iceberg causing BE crash (#26114) 48f0ff975d1 is described below commit 48f0ff975d16ff89b9bf4c74ed453aea4da8eddd Author: xueweizhang <zxw520bl...@163.com> AuthorDate: Tue Oct 31 12:50:08 2023 +0800 [fix](catalog) wrong required slot info of iceberg causing BE crash (#26114) --- .../planner/external/ExternalFileScanNode.java | 3 ++ .../planner/external/iceberg/IcebergApiSource.java | 15 ++++++- .../planner/external/iceberg/IcebergHMSSource.java | 5 +++ .../external/iceberg/IcebergScanProvider.java | 4 ++ .../planner/external/iceberg/IcebergSource.java | 2 + .../test_external_catalog_iceberg_common.out | 3 ++ .../test_external_catalog_iceberg_common.groovy | 50 ++++++++++++++++++++++ 7 files changed, 81 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/external/ExternalFileScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/external/ExternalFileScanNode.java index c94305233ff..124acdb71ac 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/external/ExternalFileScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/external/ExternalFileScanNode.java @@ -355,6 +355,9 @@ public class ExternalFileScanNode extends ExternalScanNode { this.readPartitionNum = ((HiveScanProvider) scanProvider).getReadPartitionNum(); ((HiveScanProvider) scanProvider).updateRequiredSlots(context); } + if (scanProvider instanceof IcebergScanProvider) { + ((IcebergScanProvider) scanProvider).updateRequiredSlots(context); + } } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergApiSource.java b/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergApiSource.java index 35b45282c50..19333a5a2b9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergApiSource.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergApiSource.java @@ -94,6 +94,20 @@ public class IcebergApiSource implements IcebergSource { .map(PartitionField::name).collect(Collectors.toList()); List<Column> columns = icebergExtTable.getBaseSchema(false); context.params.setNumOfColumnsFromFile(columns.size() - partitionKeys.size()); + updateRequiredSlots(context); + return context; + } + + @Override + public void updateRequiredSlots(ExternalFileScanNode.ParamCreateContext context) throws UserException { + updateRequiredSlots(context, null); + } + + public void updateRequiredSlots(ExternalFileScanNode.ParamCreateContext context, List<String> partitionKeys) throws UserException { + context.params.unsetRequiredSlots(); + if (partitionKeys == null) { + partitionKeys = originTable.spec().fields().stream().map(PartitionField::name).collect(Collectors.toList()); + } for (SlotDescriptor slot : desc.getSlots()) { if (!slot.isMaterialized()) { continue; @@ -103,7 +117,6 @@ public class IcebergApiSource implements IcebergSource { slotInfo.setIsFileSlot(!partitionKeys.contains(slot.getColumn().getName())); context.params.addToRequiredSlots(slotInfo); } - return context; } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergHMSSource.java b/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergHMSSource.java index 747d7fd6f67..997a037f2ba 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergHMSSource.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergHMSSource.java @@ -68,6 +68,11 @@ public class IcebergHMSSource implements IcebergSource { return hiveScanProvider.createContext(null); } + @Override + public void updateRequiredSlots(ExternalFileScanNode.ParamCreateContext context) throws UserException { + hiveScanProvider.updateRequiredSlots(context); + } + @Override public TableIf getTargetTable() { return hiveScanProvider.getTargetTable(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergScanProvider.java b/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergScanProvider.java index e8295a3fc33..d0ff1c4d1ca 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergScanProvider.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergScanProvider.java @@ -263,6 +263,10 @@ public class IcebergScanProvider extends QueryScanProvider { return icebergSource.createContext(); } + public void updateRequiredSlots(ExternalFileScanNode.ParamCreateContext context) throws UserException { + icebergSource.updateRequiredSlots(context); + } + @Override public TableIf getTargetTable() { return icebergSource.getTargetTable(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergSource.java b/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergSource.java index ab17c6a4483..b6a8ade6527 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergSource.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/external/iceberg/IcebergSource.java @@ -41,4 +41,6 @@ public interface IcebergSource { ExternalCatalog getCatalog(); String getFileFormat() throws DdlException, MetaNotFoundException; + + void updateRequiredSlots(ExternalFileScanNode.ParamCreateContext context) throws UserException; } diff --git a/regression-test/data/external_table_emr_p2/iceberg/test_external_catalog_iceberg_common.out b/regression-test/data/external_table_emr_p2/iceberg/test_external_catalog_iceberg_common.out new file mode 100644 index 00000000000..9554f1d21f0 --- /dev/null +++ b/regression-test/data/external_table_emr_p2/iceberg/test_external_catalog_iceberg_common.out @@ -0,0 +1,3 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q01 -- +599715 \ No newline at end of file diff --git a/regression-test/suites/external_table_emr_p2/iceberg/test_external_catalog_iceberg_common.groovy b/regression-test/suites/external_table_emr_p2/iceberg/test_external_catalog_iceberg_common.groovy new file mode 100644 index 00000000000..7462afeee2b --- /dev/null +++ b/regression-test/suites/external_table_emr_p2/iceberg/test_external_catalog_iceberg_common.groovy @@ -0,0 +1,50 @@ +// 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_external_catalog_iceberg_common", "p2") { + String enabled = context.config.otherConfigs.get("enableExternalHiveTest") + if (enabled != null && enabled.equalsIgnoreCase("true")) { + String extHiveHmsHost = context.config.otherConfigs.get("extHiveHmsHost") + String extHiveHmsPort = context.config.otherConfigs.get("extHiveHmsPort") + String catalog_name = "test_external_catalog_iceberg" + + sql """drop catalog if exists ${catalog_name};""" + sql """ + create catalog if not exists ${catalog_name} properties ( + 'type'='hms', + 'hive.metastore.uris' = 'thrift://${extHiveHmsHost}:${extHiveHmsPort}' + ); + """ + + sql """switch ${catalog_name};""" + // test parquet format + def q01_parquet = { + qt_q01 """ SELECT COUNT(*) FROM ( + SELECT l_returnflag, l_quantity, l_partkey, l_suppkey, l_discount, l_tax, + case + when l_tax <= 0.15 then '低频' + when l_tax <= 0.85 then '中频' + else '高频' + end + gr, cast(l_discount / 5 as int) * 5 as score_bins, l_comment from lineitem + ) as dc_1; + """ + } + sql """ use `iceberg_catalog`; """ + q01_parquet() + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org