This is an automated email from the ASF dual-hosted git repository. kxiao pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push: new b1075446af9 [fix](stats) fix auto collector always create sample job no matter the table size #26968 (#26972) b1075446af9 is described below commit b1075446af96bd2f57eb11ca1a6a2590f96c0145 Author: AKIRA <33112463+kikyou1...@users.noreply.github.com> AuthorDate: Wed Nov 15 09:37:30 2023 +0900 [fix](stats) fix auto collector always create sample job no matter the table size #26968 (#26972) --- .../apache/doris/analysis/ShowColumnStatsStmt.java | 11 ++ .../org/apache/doris/statistics/AnalysisInfo.java | 8 +- .../doris/statistics/AnalysisInfoBuilder.java | 45 ++----- .../apache/doris/statistics/AnalysisManager.java | 22 +--- .../apache/doris/statistics/HMSAnalysisTask.java | 2 +- .../apache/doris/statistics/JdbcAnalysisTask.java | 2 +- .../doris/statistics/StatisticsAutoCollector.java | 9 +- .../apache/doris/statistics/TableStatsMeta.java | 17 ++- .../doris/statistics/AnalysisManagerTest.java | 17 ++- .../statistics/StatisticsAutoCollectorTest.java | 138 ++++++++++++++++++++- 10 files changed, 200 insertions(+), 71 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStatsStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStatsStmt.java index f82c644b538..d88b024fffa 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStatsStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStatsStmt.java @@ -32,6 +32,7 @@ import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; import org.apache.doris.qe.ShowResultSet; import org.apache.doris.qe.ShowResultSetMetaData; +import org.apache.doris.statistics.ColStatsMeta; import org.apache.doris.statistics.ColumnStatistic; import com.google.common.collect.ImmutableList; @@ -54,6 +55,10 @@ public class ShowColumnStatsStmt extends ShowStmt { .add("avg_size_byte") .add("min") .add("max") + .add("method") + .add("type") + .add("trigger") + .add("query_times") .add("updated_time") .build(); @@ -145,6 +150,12 @@ public class ShowColumnStatsStmt extends ShowStmt { row.add(String.valueOf(p.second.avgSizeByte)); row.add(String.valueOf(p.second.minExpr == null ? "N/A" : p.second.minExpr.toSql())); row.add(String.valueOf(p.second.maxExpr == null ? "N/A" : p.second.maxExpr.toSql())); + ColStatsMeta colStatsMeta = Env.getCurrentEnv().getAnalysisManager().findColStatsMeta(table.getId(), + p.first); + row.add(String.valueOf(colStatsMeta == null ? "N/A" : colStatsMeta.analysisMethod)); + row.add(String.valueOf(colStatsMeta == null ? "N/A" : colStatsMeta.analysisType)); + row.add(String.valueOf(colStatsMeta == null ? "N/A" : colStatsMeta.jobType)); + row.add(String.valueOf(colStatsMeta == null ? "N/A" : colStatsMeta.queriedTimes)); row.add(String.valueOf(p.second.updatedTime)); result.add(row); }); diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfo.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfo.java index 9c298a6ea88..82dd036c3ab 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfo.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfo.java @@ -182,6 +182,11 @@ public class AnalysisInfo implements Writable { @SerializedName("usingSqlForPartitionColumn") public final boolean usingSqlForPartitionColumn; + /** + * Used to store the newest partition version of tbl when creating this job. + */ + public final long tblUpdateTime; + public AnalysisInfo(long jobId, long taskId, List<Long> taskIds, long catalogId, long dbId, long tblId, Map<String, Set<String>> colToPartitions, Set<String> partitionNames, String colName, Long indexId, JobType jobType, AnalysisMode analysisMode, AnalysisMethod analysisMethod, AnalysisType analysisType, @@ -189,7 +194,7 @@ public class AnalysisInfo implements Writable { long lastExecTimeInMs, long timeCostInMs, AnalysisState state, ScheduleType scheduleType, boolean isExternalTableLevelTask, boolean partitionOnly, boolean samplingPartition, boolean isAllPartition, long partitionCount, CronExpression cronExpression, boolean forceFull, - boolean usingSqlForPartitionColumn) { + boolean usingSqlForPartitionColumn, long tblUpdateTime) { this.jobId = jobId; this.taskId = taskId; this.taskIds = taskIds; @@ -224,6 +229,7 @@ public class AnalysisInfo implements Writable { } this.forceFull = forceFull; this.usingSqlForPartitionColumn = usingSqlForPartitionColumn; + this.tblUpdateTime = tblUpdateTime; } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfoBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfoBuilder.java index 18cf3e30792..204aba6d0f8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfoBuilder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfoBuilder.java @@ -62,6 +62,8 @@ public class AnalysisInfoBuilder { private boolean forceFull; private boolean usingSqlForPartitionColumn; + private long tblUpdateTime; + public AnalysisInfoBuilder() { } @@ -97,6 +99,7 @@ public class AnalysisInfoBuilder { cronExpression = info.cronExpression; forceFull = info.forceFull; usingSqlForPartitionColumn = info.usingSqlForPartitionColumn; + tblUpdateTime = info.tblUpdateTime; } public AnalysisInfoBuilder setJobId(long jobId) { @@ -254,45 +257,17 @@ public class AnalysisInfoBuilder { return this; } + public AnalysisInfoBuilder setTblUpdateTime(long tblUpdateTime) { + this.tblUpdateTime = tblUpdateTime; + return this; + } + public AnalysisInfo build() { return new AnalysisInfo(jobId, taskId, taskIds, catalogId, dbId, tblId, colToPartitions, partitionNames, colName, indexId, jobType, analysisMode, analysisMethod, analysisType, samplePercent, sampleRows, maxBucketNum, periodTimeInMs, message, lastExecTimeInMs, timeCostInMs, state, scheduleType, externalTableLevelTask, partitionOnly, samplingPartition, isAllPartition, partitionCount, - cronExpression, forceFull, usingSqlForPartitionColumn); - } - - public AnalysisInfoBuilder copy() { - return new AnalysisInfoBuilder() - .setJobId(jobId) - .setTaskId(taskId) - .setTaskIds(taskIds) - .setCatalogId(catalogId) - .setDBId(dbId) - .setTblId(tblId) - .setColToPartitions(colToPartitions) - .setColName(colName) - .setIndexId(indexId) - .setJobType(jobType) - .setAnalysisMode(analysisMode) - .setAnalysisMethod(analysisMethod) - .setAnalysisType(analysisType) - .setSamplePercent(samplePercent) - .setSampleRows(sampleRows) - .setPeriodTimeInMs(periodTimeInMs) - .setMaxBucketNum(maxBucketNum) - .setMessage(message) - .setLastExecTimeInMs(lastExecTimeInMs) - .setTimeCostInMs(timeCostInMs) - .setState(state) - .setScheduleType(scheduleType) - .setExternalTableLevelTask(externalTableLevelTask) - .setSamplingPartition(samplingPartition) - .setPartitionOnly(partitionOnly) - .setAllPartition(isAllPartition) - .setPartitionCount(partitionCount) - .setCronExpression(cronExpression) - .setForceFull(forceFull) - .setUsingSqlForPartitionColumn(usingSqlForPartitionColumn); + cronExpression, forceFull, usingSqlForPartitionColumn, tblUpdateTime); } + } diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java index c21f57eb098..d5b85bfaca6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java @@ -29,7 +29,6 @@ import org.apache.doris.analysis.TableName; import org.apache.doris.catalog.Column; import org.apache.doris.catalog.DatabaseIf; import org.apache.doris.catalog.Env; -import org.apache.doris.catalog.Partition; import org.apache.doris.catalog.ScalarType; import org.apache.doris.catalog.TableIf; import org.apache.doris.catalog.View; @@ -505,7 +504,7 @@ public class AnalysisManager implements Writable { partitionNames, analysisType); infoBuilder.setColToPartitions(colToPartitions); infoBuilder.setTaskIds(Lists.newArrayList()); - + infoBuilder.setTblUpdateTime(table.getUpdateTime()); return infoBuilder.build(); } @@ -601,9 +600,9 @@ public class AnalysisManager implements Writable { } TableStatsMeta tableStats = findTableStatsStatus(tbl.getId()); if (tableStats == null) { - updateTableStatsStatus(new TableStatsMeta(tbl.getId(), tbl.estimatedRowCount(), jobInfo)); + updateTableStatsStatus(new TableStatsMeta(tbl.estimatedRowCount(), jobInfo, tbl)); } else { - tableStats.updateByJob(jobInfo); + tableStats.update(jobInfo, tbl); logCreateTableStats(tableStats); } } @@ -1004,21 +1003,6 @@ public class AnalysisManager implements Writable { analysisJobIdToTaskMap.put(jobInfo.jobId, taskInfos); } - @VisibleForTesting - protected Set<String> findReAnalyzeNeededPartitions(TableIf table) { - TableStatsMeta tableStats = findTableStatsStatus(table.getId()); - if (tableStats == null) { - return table.getPartitionNames().stream().map(table::getPartition) - .filter(Partition::hasData).map(Partition::getName).collect(Collectors.toSet()); - } - return table.getPartitionNames().stream() - .map(table::getPartition) - .filter(Partition::hasData) - .filter(partition -> - partition.getVisibleVersionTime() >= tableStats.updatedTime).map(Partition::getName) - .collect(Collectors.toSet()); - } - protected void logAutoJob(AnalysisInfo autoJob) { Env.getCurrentEnv().getEditLog().logAutoJob(autoJob); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/HMSAnalysisTask.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/HMSAnalysisTask.java index 812bd615a69..5be026e2acf 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/HMSAnalysisTask.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/HMSAnalysisTask.java @@ -81,7 +81,7 @@ public class HMSAnalysisTask extends BaseAnalysisTask { String rowCount = columnResult.get(0).get(0); Env.getCurrentEnv().getAnalysisManager() .updateTableStatsStatus( - new TableStatsMeta(table.getId(), Long.parseLong(rowCount), info)); + new TableStatsMeta(Long.parseLong(rowCount), info, tbl)); job.rowCountDone(this); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/JdbcAnalysisTask.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/JdbcAnalysisTask.java index 700710f6e42..e2e83aa8fa6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/JdbcAnalysisTask.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/JdbcAnalysisTask.java @@ -76,7 +76,7 @@ public class JdbcAnalysisTask extends BaseAnalysisTask { StatisticsUtil.execStatisticQuery(new StringSubstitutor(params).replace(ANALYZE_TABLE_COUNT_TEMPLATE)); String rowCount = columnResult.get(0).get(0); Env.getCurrentEnv().getAnalysisManager() - .updateTableStatsStatus(new TableStatsMeta(table.getId(), Long.parseLong(rowCount), info)); + .updateTableStatsStatus(new TableStatsMeta(Long.parseLong(rowCount), info, table)); job.rowCountDone(this); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsAutoCollector.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsAutoCollector.java index 32cf5cfb24b..02248fd9476 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsAutoCollector.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsAutoCollector.java @@ -50,7 +50,7 @@ public class StatisticsAutoCollector extends StatisticsCollector { public StatisticsAutoCollector() { super("Automatic Analyzer", - TimeUnit.MINUTES.toMillis(Config.auto_check_statistics_in_minutes), + TimeUnit.SECONDS.toMillis(Config.auto_check_statistics_in_minutes), new AnalysisTaskExecutor(Config.full_auto_analyze_simultaneously_running_task_num)); } @@ -142,12 +142,15 @@ public class StatisticsAutoCollector extends StatisticsCollector { .setAnalysisType(AnalysisInfo.AnalysisType.FUNDAMENTALS) .setAnalysisMode(AnalysisInfo.AnalysisMode.INCREMENTAL) .setAnalysisMethod(analysisMethod) - .setSampleRows(StatisticsUtil.getHugeTableSampleRows()) + .setSampleRows(analysisMethod.equals(AnalysisMethod.SAMPLE) + ? StatisticsUtil.getHugeTableSampleRows() : -1) .setScheduleType(ScheduleType.AUTOMATIC) .setState(AnalysisState.PENDING) .setTaskIds(new ArrayList<>()) .setLastExecTimeInMs(System.currentTimeMillis()) - .setJobType(JobType.SYSTEM).build(); + .setJobType(JobType.SYSTEM) + .setTblUpdateTime(table.getUpdateTime()) + .build(); analysisInfos.add(jobInfo); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java index 17ca61e9da5..0e32d030393 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java @@ -17,6 +17,8 @@ package org.apache.doris.statistics; +import org.apache.doris.catalog.Column; +import org.apache.doris.catalog.TableIf; import org.apache.doris.common.io.Text; import org.apache.doris.common.io.Writable; import org.apache.doris.persist.gson.GsonUtils; @@ -64,11 +66,11 @@ public class TableStatsMeta implements Writable { // It's necessary to store these fields separately from AnalysisInfo, since the lifecycle between AnalysisInfo // and TableStats is quite different. - public TableStatsMeta(long tblId, long rowCount, AnalysisInfo analyzedJob) { - this.tblId = tblId; + public TableStatsMeta(long rowCount, AnalysisInfo analyzedJob, TableIf table) { + this.tblId = table.getId(); this.idxId = -1; this.rowCount = rowCount; - updateByJob(analyzedJob); + update(analyzedJob, table); } @Override @@ -112,8 +114,8 @@ public class TableStatsMeta implements Writable { colNameToColStatsMeta.values().forEach(ColStatsMeta::clear); } - public void updateByJob(AnalysisInfo analyzedJob) { - updatedTime = System.currentTimeMillis(); + public void update(AnalysisInfo analyzedJob, TableIf tableIf) { + updatedTime = analyzedJob.tblUpdateTime; String colNameStr = analyzedJob.colName; // colName field AnalyzeJob's format likes: "[col1, col2]", we need to remove brackets here // TODO: Refactor this later @@ -133,5 +135,10 @@ public class TableStatsMeta implements Writable { } } jobType = analyzedJob.jobType; + if (tableIf != null && analyzedJob.colToPartitions.keySet() + .containsAll(tableIf.getColumns().stream().map(Column::getName).collect( + Collectors.toSet()))) { + updatedRows.set(0); + } } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/statistics/AnalysisManagerTest.java b/fe/fe-core/src/test/java/org/apache/doris/statistics/AnalysisManagerTest.java index 6372ce97d6e..f33a16f9b78 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/statistics/AnalysisManagerTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/statistics/AnalysisManagerTest.java @@ -328,6 +328,8 @@ public class AnalysisManagerTest { int count = 0; int[] rowCount = new int[]{100, 200}; + + final Column c = new Column("col1", PrimitiveType.INT); @Mock public long getRowCount() { return rowCount[count++]; @@ -335,16 +337,25 @@ public class AnalysisManagerTest { @Mock public List<Column> getBaseSchema() { - return Lists.newArrayList(new Column("col1", PrimitiveType.INT)); + return Lists.newArrayList(c); + } + + @Mock + public List<Column> getColumns() { + return Lists.newArrayList(c); } }; OlapTable olapTable = new OlapTable(); - TableStatsMeta stats1 = new TableStatsMeta(0, 50, new AnalysisInfoBuilder().setColName("col1").build()); + TableStatsMeta stats1 = new TableStatsMeta( + 50, new AnalysisInfoBuilder().setColToPartitions(new HashMap<>()) + .setColName("col1").build(), olapTable); stats1.updatedRows.addAndGet(50); Assertions.assertTrue(olapTable.needReAnalyzeTable(stats1)); - TableStatsMeta stats2 = new TableStatsMeta(0, 190, new AnalysisInfoBuilder().setColName("col1").build()); + TableStatsMeta stats2 = new TableStatsMeta( + 190, new AnalysisInfoBuilder() + .setColToPartitions(new HashMap<>()).setColName("col1").build(), olapTable); stats2.updatedRows.addAndGet(20); Assertions.assertFalse(olapTable.needReAnalyzeTable(stats2)); diff --git a/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java b/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java index d441ce5b09d..00a68e204ab 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java @@ -20,6 +20,7 @@ package org.apache.doris.statistics; import org.apache.doris.catalog.Column; import org.apache.doris.catalog.Database; import org.apache.doris.catalog.DatabaseIf; +import org.apache.doris.catalog.Env; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.PrimitiveType; import org.apache.doris.catalog.Table; @@ -179,15 +180,16 @@ public class StatisticsAutoCollectorTest { return tableIf; } }; - AnalysisInfo analysisInfo = new AnalysisInfoBuilder().setAnalysisMethod(AnalysisMethod.FULL).setAnalysisType( + AnalysisInfo analysisInfo = new AnalysisInfoBuilder().setAnalysisMethod(AnalysisMethod.FULL) + .setColToPartitions(new HashMap<>()).setAnalysisType( AnalysisType.FUNDAMENTALS).setColName("col1").setJobType(JobType.SYSTEM).build(); new MockUp<AnalysisManager>() { int count = 0; TableStatsMeta[] tableStatsArr = - new TableStatsMeta[] {new TableStatsMeta(0, 0, analysisInfo), - new TableStatsMeta(0, 0, analysisInfo), null}; + new TableStatsMeta[] {new TableStatsMeta(0, analysisInfo, tableIf), + new TableStatsMeta(0, analysisInfo, tableIf), null}; { tableStatsArr[0].updatedRows.addAndGet(100); @@ -286,4 +288,134 @@ public class StatisticsAutoCollectorTest { // this is not olap table nor external table, so we should skip it this time Assertions.assertTrue(autoCollector.skip(anyOtherTable)); } + + // For small table, use full + @Test + public void testCreateAnalyzeJobForTbl1( + @Injectable OlapTable t1, + @Injectable Database db + ) throws Exception { + new MockUp<Database>() { + + @Mock + public CatalogIf getCatalog() { + return Env.getCurrentInternalCatalog(); + } + + @Mock + public long getId() { + return 0; + } + }; + new MockUp<OlapTable>() { + + int count = 0; + + @Mock + public List<Column> getBaseSchema() { + return Lists.newArrayList(new Column("test", PrimitiveType.INT)); + } + + @Mock + public long getDataSize(boolean singleReplica) { + return 1000; + } + + @Mock + public BaseAnalysisTask createAnalysisTask(AnalysisInfo info) { + return new OlapAnalysisTask(info); + } + }; + + new MockUp<StatisticsUtil>() { + @Mock + public TableIf findTable(long catalogId, long dbId, long tblId) { + return t1; + } + }; + + StatisticsAutoCollector sac = new StatisticsAutoCollector(); + List<AnalysisInfo> jobInfos = new ArrayList<>(); + sac.createAnalyzeJobForTbl(db, jobInfos, t1); + AnalysisInfo jobInfo = jobInfos.get(0); + Map<String, Set<String>> colToPartitions = new HashMap<>(); + colToPartitions.put("test", new HashSet<String>() { + { + add("p1"); + } + }); + jobInfo = new AnalysisInfoBuilder(jobInfo).setColToPartitions(colToPartitions).build(); + Map<Long, BaseAnalysisTask> analysisTasks = new HashMap<>(); + AnalysisManager analysisManager = Env.getCurrentEnv().getAnalysisManager(); + analysisManager.createTaskForEachColumns(jobInfo, analysisTasks, false); + Assertions.assertEquals(1, analysisTasks.size()); + for (BaseAnalysisTask task : analysisTasks.values()) { + Assertions.assertNull(task.getTableSample()); + } + } + + // for big table, use sample + @Test + public void testCreateAnalyzeJobForTbl2( + @Injectable OlapTable t1, + @Injectable Database db + ) throws Exception { + new MockUp<Database>() { + + @Mock + public CatalogIf getCatalog() { + return Env.getCurrentInternalCatalog(); + } + + @Mock + public long getId() { + return 0; + } + }; + new MockUp<OlapTable>() { + + int count = 0; + + @Mock + public List<Column> getBaseSchema() { + return Lists.newArrayList(new Column("test", PrimitiveType.INT)); + } + + @Mock + public long getDataSize(boolean singleReplica) { + return StatisticsUtil.getHugeTableLowerBoundSizeInBytes() * 2; + } + + @Mock + public BaseAnalysisTask createAnalysisTask(AnalysisInfo info) { + return new OlapAnalysisTask(info); + } + }; + + new MockUp<StatisticsUtil>() { + @Mock + public TableIf findTable(long catalogId, long dbId, long tblId) { + return t1; + } + }; + + StatisticsAutoCollector sac = new StatisticsAutoCollector(); + List<AnalysisInfo> jobInfos = new ArrayList<>(); + sac.createAnalyzeJobForTbl(db, jobInfos, t1); + AnalysisInfo jobInfo = jobInfos.get(0); + Map<String, Set<String>> colToPartitions = new HashMap<>(); + colToPartitions.put("test", new HashSet<String>() { + { + add("p1"); + } + }); + jobInfo = new AnalysisInfoBuilder(jobInfo).setColToPartitions(colToPartitions).build(); + Map<Long, BaseAnalysisTask> analysisTasks = new HashMap<>(); + AnalysisManager analysisManager = Env.getCurrentEnv().getAnalysisManager(); + analysisManager.createTaskForEachColumns(jobInfo, analysisTasks, false); + Assertions.assertEquals(1, analysisTasks.size()); + for (BaseAnalysisTask task : analysisTasks.values()) { + Assertions.assertNotNull(task.getTableSample()); + } + } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org