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 784aa53a47 [Fix](multi catalog statistics)Improve external table 
statistics collection (#22224) (#22343)
784aa53a47 is described below

commit 784aa53a47b225d7d2718e7274fda790023d49b2
Author: Jibing-Li <64681310+jibing...@users.noreply.github.com>
AuthorDate: Fri Jul 28 23:08:14 2023 +0800

    [Fix](multi catalog statistics)Improve external table statistics collection 
(#22224) (#22343)
---
 .../org/apache/doris/analysis/AnalyzeTblStmt.java  |   8 +
 .../org/apache/doris/analysis/ShowAnalyzeStmt.java |   1 +
 .../doris/analysis/ShowAnalyzeTaskStatus.java      |   3 +-
 .../java/org/apache/doris/qe/ShowExecutor.java     |   2 +
 .../java/org/apache/doris/qe/StmtExecutor.java     |  11 +-
 .../org/apache/doris/statistics/AnalysisInfo.java  |  14 +-
 .../doris/statistics/AnalysisInfoBuilder.java      |  10 +-
 .../apache/doris/statistics/AnalysisManager.java   | 138 ++++++++-----
 .../doris/statistics/AnalysisTaskExecutor.java     |   4 -
 .../doris/statistics/AnalysisTaskWrapper.java      |   8 +-
 .../apache/doris/statistics/BaseAnalysisTask.java  |  17 +-
 .../apache/doris/statistics/HMSAnalysisTask.java   |  33 +++-
 .../org/apache/doris/statistics/HistogramTask.java |   1 +
 .../apache/doris/statistics/MVAnalysisTask.java    |   1 +
 .../apache/doris/statistics/OlapAnalysisTask.java  |   1 +
 .../apache/doris/statistics/StatisticsCache.java   |   6 +-
 .../doris/statistics/util/StatisticsUtil.java      |   2 +
 .../doris/statistics/AnalysisManagerTest.java      |  73 +++++++
 .../hive/test_hive_analyze_db.out                  |  20 --
 .../hive/test_hive_statistic.out                   |  57 ------
 .../hive/test_hive_statistic_cache.out             |  58 ------
 .../hive/test_hive_analyze_db.groovy               | 157 ++++++++++++++-
 .../hive/test_hive_statistic.groovy                | 215 +++++++++++++++++++--
 .../hive/test_hive_statistic_cache.groovy          | 191 ++++++++++++++++--
 24 files changed, 779 insertions(+), 252 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyzeTblStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyzeTblStmt.java
index ddf2c417c4..5ca1e7a870 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyzeTblStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyzeTblStmt.java
@@ -85,6 +85,7 @@ public class AnalyzeTblStmt extends AnalyzeStmt {
     private final TableName tableName;
     private List<String> columnNames;
     private List<String> partitionNames;
+    private boolean isAllColumns;
 
     // after analyzed
     private long dbId;
@@ -99,6 +100,7 @@ public class AnalyzeTblStmt extends AnalyzeStmt {
         this.partitionNames = partitionNames == null ? null : 
partitionNames.getPartitionNames();
         this.columnNames = columnNames;
         this.analyzeProperties = properties;
+        this.isAllColumns = columnNames == null;
     }
 
     public AnalyzeTblStmt(AnalyzeProperties analyzeProperties, TableName 
tableName, List<String> columnNames, long dbId,
@@ -108,6 +110,7 @@ public class AnalyzeTblStmt extends AnalyzeStmt {
         this.columnNames = columnNames;
         this.dbId = dbId;
         this.table = table;
+        this.isAllColumns = columnNames == null;
     }
 
     @Override
@@ -129,6 +132,7 @@ public class AnalyzeTblStmt extends AnalyzeStmt {
         DatabaseIf db = catalog.getDbOrAnalysisException(dbName);
         dbId = db.getId();
         table = db.getTableOrAnalysisException(tblName);
+        isAllColumns = columnNames == null;
         check();
     }
 
@@ -296,4 +300,8 @@ public class AnalyzeTblStmt extends AnalyzeStmt {
     public Database getDb() throws AnalysisException {
         return 
analyzer.getEnv().getInternalCatalog().getDbOrAnalysisException(dbId);
     }
+
+    public boolean isAllColumns() {
+        return isAllColumns;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAnalyzeStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAnalyzeStmt.java
index 73bf77b23c..3a0aa05a7d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAnalyzeStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAnalyzeStmt.java
@@ -64,6 +64,7 @@ public class ShowAnalyzeStmt extends ShowStmt {
             .add("message")
             .add("last_exec_time_in_ms")
             .add("state")
+            .add("progress")
             .add("schedule_type")
             .build();
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAnalyzeTaskStatus.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAnalyzeTaskStatus.java
index 03d304f393..927a56d19d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAnalyzeTaskStatus.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAnalyzeTaskStatus.java
@@ -33,7 +33,8 @@ public class ShowAnalyzeTaskStatus extends ShowStmt {
                     .addColumn(new Column("task_id", 
ScalarType.createVarchar(100)))
                     .addColumn(new Column("col_name", 
ScalarType.createVarchar(1000)))
                     .addColumn(new Column("message", 
ScalarType.createVarchar(1000)))
-                    .addColumn(new Column("last_exec_time_in_ms", 
ScalarType.createVarchar(1000)))
+                    .addColumn(new Column("last_state_change_time", 
ScalarType.createVarchar(1000)))
+                    .addColumn(new Column("time_cost_in_ms", 
ScalarType.createVarchar(1000)))
                     .addColumn(new Column("state", 
ScalarType.createVarchar(1000))).build();
 
     private final long jobId;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
index 7f5d197723..59bfbada21 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
@@ -2562,6 +2562,7 @@ public class ShowExecutor {
                     
LocalDateTime.ofInstant(Instant.ofEpochMilli(analysisInfo.lastExecTimeInMs),
                             ZoneId.systemDefault())));
             row.add(analysisInfo.state.toString());
+            
row.add(Env.getCurrentEnv().getAnalysisManager().getJobProgress(analysisInfo.jobId));
             row.add(analysisInfo.scheduleType.toString());
             resultRows.add(row);
         }
@@ -2762,6 +2763,7 @@ public class ShowExecutor {
             row.add(TimeUtils.DATETIME_FORMAT.format(
                     
LocalDateTime.ofInstant(Instant.ofEpochMilli(analysisInfo.lastExecTimeInMs),
                             ZoneId.systemDefault())));
+            row.add(String.valueOf(analysisInfo.timeCostInMs));
             row.add(analysisInfo.state.toString());
             rows.add(row);
         }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
index b84ebfa007..2c7039ac82 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
@@ -20,6 +20,7 @@ package org.apache.doris.qe;
 import org.apache.doris.analysis.AddPartitionLikeClause;
 import org.apache.doris.analysis.AlterClause;
 import org.apache.doris.analysis.AlterTableStmt;
+import org.apache.doris.analysis.AnalyzeDBStmt;
 import org.apache.doris.analysis.AnalyzeStmt;
 import org.apache.doris.analysis.AnalyzeTblStmt;
 import org.apache.doris.analysis.Analyzer;
@@ -1148,7 +1149,7 @@ public class StmtExecutor {
         if (mysqlLoadId != null) {
             
Env.getCurrentEnv().getLoadManager().getMysqlLoadManager().cancelMySqlLoad(mysqlLoadId);
         }
-        if (parsedStmt instanceof AnalyzeTblStmt) {
+        if (parsedStmt instanceof AnalyzeTblStmt || parsedStmt instanceof 
AnalyzeDBStmt) {
             Env.getCurrentEnv().getAnalysisManager().cancelSyncTask(context);
         }
     }
@@ -2484,7 +2485,7 @@ public class StmtExecutor {
                     analyze(context.getSessionVariable().toThrift());
                 }
             } catch (Exception e) {
-                throw new RuntimeException("Failed to execute internal SQL", 
e);
+                throw new RuntimeException("Failed to execute internal SQL. " 
+ Util.getRootCauseMessage(e), e);
             }
             planner.getFragments();
             RowBatch batch;
@@ -2494,7 +2495,7 @@ public class StmtExecutor {
                 QeProcessorImpl.INSTANCE.registerQuery(context.queryId(),
                         new QeProcessorImpl.QueryInfo(context, 
originStmt.originStmt, coord));
             } catch (UserException e) {
-                throw new RuntimeException("Failed to execute internal SQL", 
e);
+                throw new RuntimeException("Failed to execute internal SQL. " 
+ Util.getRootCauseMessage(e), e);
             }
 
             Span queryScheduleSpan = context.getTracer()
@@ -2503,7 +2504,7 @@ public class StmtExecutor {
                 coord.exec();
             } catch (Exception e) {
                 queryScheduleSpan.recordException(e);
-                throw new RuntimeException("Failed to execute internal SQL", 
e);
+                throw new RuntimeException("Failed to execute internal SQL. " 
+ Util.getRootCauseMessage(e), e);
             } finally {
                 queryScheduleSpan.end();
             }
@@ -2520,7 +2521,7 @@ public class StmtExecutor {
                 }
             } catch (Exception e) {
                 fetchResultSpan.recordException(e);
-                throw new RuntimeException("Failed to execute internal SQL", 
e);
+                throw new RuntimeException("Failed to execute internal SQL. " 
+ Util.getRootCauseMessage(e), e);
             } finally {
                 fetchResultSpan.end();
             }
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 5a00e3471e..592fb4a99b 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
@@ -129,6 +129,10 @@ public class AnalysisInfo implements Writable {
     @SerializedName("lastExecTimeInMs")
     public long lastExecTimeInMs;
 
+    // finished or failed
+    @SerializedName("timeCostInMs")
+    public long timeCostInMs;
+
     @SerializedName("state")
     public AnalysisState state;
 
@@ -153,8 +157,8 @@ public class AnalysisInfo implements Writable {
             Map<String, Set<String>> colToPartitions, Set<String> 
partitionNames, String colName, Long indexId,
             JobType jobType, AnalysisMode analysisMode, AnalysisMethod 
analysisMethod, AnalysisType analysisType,
             int samplePercent, int sampleRows, int maxBucketNum, long 
periodTimeInMs, String message,
-            long lastExecTimeInMs, AnalysisState state, ScheduleType 
scheduleType, boolean isExternalTableLevelTask,
-            boolean partitionOnly, boolean samplingPartition) {
+            long lastExecTimeInMs, long timeCostInMs, AnalysisState state, 
ScheduleType scheduleType,
+            boolean isExternalTableLevelTask, boolean partitionOnly, boolean 
samplingPartition) {
         this.jobId = jobId;
         this.taskId = taskId;
         this.catalogName = catalogName;
@@ -174,6 +178,7 @@ public class AnalysisInfo implements Writable {
         this.periodTimeInMs = periodTimeInMs;
         this.message = message;
         this.lastExecTimeInMs = lastExecTimeInMs;
+        this.timeCostInMs = timeCostInMs;
         this.state = state;
         this.scheduleType = scheduleType;
         this.externalTableLevelTask = isExternalTableLevelTask;
@@ -209,6 +214,9 @@ public class AnalysisInfo implements Writable {
         if (lastExecTimeInMs > 0) {
             sj.add("LastExecTime: " + 
StatisticsUtil.getReadableTime(lastExecTimeInMs));
         }
+        if (timeCostInMs > 0) {
+            sj.add("timeCost: " + timeCostInMs);
+        }
         if (periodTimeInMs > 0) {
             sj.add("periodTimeInMs: " + 
StatisticsUtil.getReadableTime(periodTimeInMs));
         }
@@ -266,6 +274,8 @@ public class AnalysisInfo implements Writable {
             
analysisInfoBuilder.setPeriodTimeInMs(StatisticsUtil.convertStrToInt(periodTimeInMs));
             String lastExecTimeInMs = 
resultRow.getColumnValue("last_exec_time_in_ms");
             
analysisInfoBuilder.setLastExecTimeInMs(StatisticsUtil.convertStrToLong(lastExecTimeInMs));
+            String timeCostInMs = resultRow.getColumnValue("time_cost_in_ms");
+            
analysisInfoBuilder.setTimeCostInMs(StatisticsUtil.convertStrToLong(timeCostInMs));
             String message = resultRow.getColumnValue("message");
             analysisInfoBuilder.setMessage(message);
             return analysisInfoBuilder.build();
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 a14f262edc..7d8b99502c 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
@@ -45,6 +45,7 @@ public class AnalysisInfoBuilder {
     private int sampleRows;
     private long periodTimeInMs;
     private long lastExecTimeInMs;
+    private long timeCostInMs;
     private AnalysisState state;
     private ScheduleType scheduleType;
     private String message = "";
@@ -75,6 +76,7 @@ public class AnalysisInfoBuilder {
         maxBucketNum = info.maxBucketNum;
         message = info.message;
         lastExecTimeInMs = info.lastExecTimeInMs;
+        timeCostInMs = info.timeCostInMs;
         state = info.state;
         scheduleType = info.scheduleType;
         externalTableLevelTask = info.externalTableLevelTask;
@@ -177,6 +179,11 @@ public class AnalysisInfoBuilder {
         return this;
     }
 
+    public AnalysisInfoBuilder setTimeCostInMs(long timeCostInMs) {
+        this.timeCostInMs = timeCostInMs;
+        return this;
+    }
+
     public AnalysisInfoBuilder setState(AnalysisState state) {
         this.state = state;
         return this;
@@ -205,7 +212,7 @@ public class AnalysisInfoBuilder {
     public AnalysisInfo build() {
         return new AnalysisInfo(jobId, taskId, catalogName, dbName, tblName, 
colToPartitions, partitionNames,
                 colName, indexId, jobType, analysisMode, analysisMethod, 
analysisType, samplePercent,
-                sampleRows, maxBucketNum, periodTimeInMs, message, 
lastExecTimeInMs, state, scheduleType,
+                sampleRows, maxBucketNum, periodTimeInMs, message, 
lastExecTimeInMs, timeCostInMs, state, scheduleType,
                 externalTableLevelTask, partitionOnly, samplingPartition);
     }
 
@@ -229,6 +236,7 @@ public class AnalysisInfoBuilder {
                 .setMaxBucketNum(maxBucketNum)
                 .setMessage(message)
                 .setLastExecTimeInMs(lastExecTimeInMs)
+                .setTimeCostInMs(timeCostInMs)
                 .setState(state)
                 .setScheduleType(scheduleType)
                 .setExternalTableLevelTask(externalTableLevelTask);
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 91052404d4..d5135ecacb 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
@@ -42,6 +42,7 @@ import org.apache.doris.common.DdlException;
 import org.apache.doris.common.FeConstants;
 import org.apache.doris.common.io.Writable;
 import org.apache.doris.common.util.Daemon;
+import org.apache.doris.common.util.Util;
 import org.apache.doris.datasource.CatalogIf;
 import org.apache.doris.mysql.privilege.PrivPredicate;
 import org.apache.doris.persist.AnalyzeDeletionLog;
@@ -174,9 +175,7 @@ public class AnalysisManager extends Daemon implements 
Writable {
                 TableName tableName = new 
TableName(analyzeDBStmt.getCtlIf().getName(), db.getFullName(),
                         table.getName());
                 AnalyzeTblStmt analyzeTblStmt = new 
AnalyzeTblStmt(analyzeDBStmt.getAnalyzeProperties(), tableName,
-                        table.getBaseSchema().stream().map(
-                                Column::getName).collect(
-                                Collectors.toList()), db.getId(), table);
+                        null, db.getId(), table);
                 try {
                     analyzeTblStmt.check();
                 } catch (AnalysisException analysisException) {
@@ -221,8 +220,9 @@ public class AnalysisManager extends Daemon implements 
Writable {
         Map<Long, BaseAnalysisTask> analysisTaskInfos = new HashMap<>();
         createTaskForEachColumns(jobInfo, analysisTaskInfos, isSync);
         createTaskForMVIdx(jobInfo, analysisTaskInfos, isSync);
-        createTaskForExternalTable(jobInfo, analysisTaskInfos, isSync);
-
+        if (stmt.isAllColumns()) {
+            createTaskForExternalTable(jobInfo, analysisTaskInfos, isSync);
+        }
         if (!isSync) {
             persistAnalysisJob(jobInfo);
             analysisJobIdToTaskMap.put(jobInfo.jobId, analysisTaskInfos);
@@ -505,12 +505,12 @@ public class AnalysisManager extends Daemon implements 
Writable {
                 long taskId = Env.getCurrentEnv().getNextId();
                 AnalysisInfoBuilder indexTaskInfoBuilder = new 
AnalysisInfoBuilder(jobInfo);
                 AnalysisInfo analysisInfo = 
indexTaskInfoBuilder.setIndexId(indexId)
-                        .setTaskId(taskId).build();
+                        
.setTaskId(taskId).setLastExecTimeInMs(System.currentTimeMillis()).build();
                 if (isSync) {
                     return;
                 }
                 analysisTasks.put(taskId, createTask(analysisInfo));
-                logCreateAnalysisJob(analysisInfo);
+                logCreateAnalysisTask(analysisInfo);
             }
         } finally {
             olapTable.readUnlock();
@@ -530,7 +530,7 @@ public class AnalysisManager extends Daemon implements 
Writable {
                 
colTaskInfoBuilder.setColToPartitions(Collections.singletonMap(colName, 
entry.getValue()));
             }
             AnalysisInfo analysisInfo = 
colTaskInfoBuilder.setColName(colName).setIndexId(indexId)
-                    .setTaskId(taskId).build();
+                    
.setTaskId(taskId).setLastExecTimeInMs(System.currentTimeMillis()).build();
             analysisTasks.put(taskId, createTask(analysisInfo));
             if (isSync) {
                 continue;
@@ -545,13 +545,15 @@ public class AnalysisManager extends Daemon implements 
Writable {
         }
     }
 
-    private void logCreateAnalysisTask(AnalysisInfo analysisInfo) {
-        analysisTaskInfoMap.put(analysisInfo.taskId, analysisInfo);
+    // Change to public for unit test.
+    public void logCreateAnalysisTask(AnalysisInfo analysisInfo) {
+        replayCreateAnalysisTask(analysisInfo);
         Env.getCurrentEnv().getEditLog().logCreateAnalysisTasks(analysisInfo);
     }
 
-    private void logCreateAnalysisJob(AnalysisInfo analysisJob) {
-        analysisJobInfoMap.put(analysisJob.jobId, analysisJob);
+    // Change to public for unit test.
+    public void logCreateAnalysisJob(AnalysisInfo analysisJob) {
+        replayCreateAnalysisJob(analysisJob);
         Env.getCurrentEnv().getEditLog().logCreateAnalysisJob(analysisJob);
     }
 
@@ -570,63 +572,71 @@ public class AnalysisManager extends Daemon implements 
Writable {
         }
         AnalysisInfoBuilder colTaskInfoBuilder = new 
AnalysisInfoBuilder(jobInfo);
         long taskId = Env.getCurrentEnv().getNextId();
-        AnalysisInfo analysisInfo = colTaskInfoBuilder.setIndexId(-1L)
-                .setTaskId(taskId).setExternalTableLevelTask(true).build();
+        AnalysisInfo analysisInfo = 
colTaskInfoBuilder.setIndexId(-1L).setLastExecTimeInMs(System.currentTimeMillis())
+                
.setTaskId(taskId).setColName("TableRowCount").setExternalTableLevelTask(true).build();
         analysisTasks.put(taskId, createTask(analysisInfo));
         if (isSync) {
             // For sync job, don't need to persist, return here and execute it 
immediately.
             return;
         }
         try {
-            logCreateAnalysisJob(analysisInfo);
+            logCreateAnalysisTask(analysisInfo);
         } catch (Exception e) {
             throw new DdlException("Failed to create analysis task", e);
         }
     }
 
-    public void updateTaskStatus(AnalysisInfo info, AnalysisState jobState, 
String message, long time) {
+    public void updateTaskStatus(AnalysisInfo info, AnalysisState taskState, 
String message, long time) {
         if (analysisJobIdToTaskMap.get(info.jobId) == null) {
             return;
         }
-        info.state = jobState;
+        info.state = taskState;
         info.message = message;
+        // Update the task cost time when task finished or failed. And only 
log the final state.
+        if (taskState.equals(AnalysisState.FINISHED) || 
taskState.equals(AnalysisState.FAILED)) {
+            info.timeCostInMs = time - info.lastExecTimeInMs;
+            info.lastExecTimeInMs = time;
+            logCreateAnalysisTask(info);
+        }
         info.lastExecTimeInMs = time;
-        logCreateAnalysisTask(info);
-
         AnalysisInfo job = analysisJobInfoMap.get(info.jobId);
-        job.lastExecTimeInMs = time;
-        if (info.state.equals(AnalysisState.RUNNING) && 
!job.state.equals(AnalysisState.PENDING)) {
-            job.state = AnalysisState.RUNNING;
-            Env.getCurrentEnv().getEditLog().logCreateAnalysisTasks(job);
-        }
-        boolean allFinished = true;
-        boolean hasFailure = false;
-        for (BaseAnalysisTask task : 
analysisJobIdToTaskMap.get(info.jobId).values()) {
-            AnalysisInfo taskInfo = task.info;
-            if (taskInfo.state.equals(AnalysisState.RUNNING) || 
taskInfo.state.equals(AnalysisState.PENDING)) {
-                allFinished = false;
-                break;
+        // Synchronize the job state change in job level.
+        synchronized (job) {
+            job.lastExecTimeInMs = time;
+            // Set the job state to RUNNING when its first task becomes 
RUNNING.
+            if (info.state.equals(AnalysisState.RUNNING) && 
job.state.equals(AnalysisState.PENDING)) {
+                job.state = AnalysisState.RUNNING;
+                replayCreateAnalysisJob(job);
             }
-            if (taskInfo.state.equals(AnalysisState.FAILED)) {
-                hasFailure = true;
+            boolean allFinished = true;
+            boolean hasFailure = false;
+            for (BaseAnalysisTask task : 
analysisJobIdToTaskMap.get(info.jobId).values()) {
+                AnalysisInfo taskInfo = task.info;
+                if (taskInfo.state.equals(AnalysisState.RUNNING) || 
taskInfo.state.equals(AnalysisState.PENDING)) {
+                    allFinished = false;
+                    break;
+                }
+                if (taskInfo.state.equals(AnalysisState.FAILED)) {
+                    hasFailure = true;
+                }
             }
-        }
-        if (allFinished) {
-            if (hasFailure) {
-                job.state = AnalysisState.FAILED;
-                logCreateAnalysisJob(job);
-            } else {
-                job.state = AnalysisState.FINISHED;
-                if (job.jobType.equals(JobType.SYSTEM)) {
-                    try {
-                        updateTableStats(job);
-                    } catch (Throwable e) {
-                        LOG.warn("Failed to update Table statistics in job: 
{}", info.toString());
+            if (allFinished) {
+                if (hasFailure) {
+                    job.state = AnalysisState.FAILED;
+                    logCreateAnalysisJob(job);
+                } else {
+                    job.state = AnalysisState.FINISHED;
+                    if (job.jobType.equals(JobType.SYSTEM)) {
+                        try {
+                            updateTableStats(job);
+                        } catch (Throwable e) {
+                            LOG.warn("Failed to update Table statistics in 
job: {}", info.toString(), e);
+                        }
                     }
+                    logCreateAnalysisJob(job);
                 }
-                logCreateAnalysisJob(job);
+                analysisJobIdToTaskMap.remove(job.jobId);
             }
-            analysisJobIdToTaskMap.remove(job.jobId);
         }
     }
 
@@ -692,6 +702,28 @@ public class AnalysisManager extends Daemon implements 
Writable {
                 .collect(Collectors.toList());
     }
 
+    public String getJobProgress(long jobId) {
+        List<AnalysisInfo> tasks = findTasks(jobId);
+        int finished = 0;
+        int failed = 0;
+        int inProgress = 0;
+        int total = tasks.size();
+        for (AnalysisInfo info : tasks) {
+            switch (info.state) {
+                case FINISHED:
+                    finished++;
+                    break;
+                case FAILED:
+                    failed++;
+                    break;
+                default:
+                    inProgress++;
+                    break;
+            }
+        }
+        return String.format("%d Finished/%d Failed/%d In Progress/%d Total", 
finished, failed, inProgress, total);
+    }
+
     private void syncExecute(Collection<BaseAnalysisTask> tasks) {
         SyncTaskCollection syncTaskCollection = new SyncTaskCollection(tasks);
         ConnectContext ctx = ConnectContext.get();
@@ -805,8 +837,11 @@ public class AnalysisManager extends Daemon implements 
Writable {
 
         public void execute() {
             List<String> colNames = new ArrayList<>();
+            List<String> errorMessages = new ArrayList<>();
             for (BaseAnalysisTask task : tasks) {
                 if (cancelled) {
+                    colNames.add(task.info.colName);
+                    errorMessages.add("Cancelled");
                     continue;
                 }
                 try {
@@ -814,12 +849,14 @@ public class AnalysisManager extends Daemon implements 
Writable {
                     updateSyncTaskStatus(task, AnalysisState.FINISHED);
                 } catch (Throwable t) {
                     colNames.add(task.info.colName);
+                    errorMessages.add(Util.getRootCauseMessage(t));
                     updateSyncTaskStatus(task, AnalysisState.FAILED);
                     LOG.warn("Failed to analyze, info: {}", task, t);
                 }
             }
             if (!colNames.isEmpty()) {
-                throw new RuntimeException("Failed to analyze following 
columns: " + String.join(",", colNames));
+                throw new RuntimeException("Failed to analyze following 
columns:[" + String.join(",", colNames)
+                    + "] Reasons: " + String.join(",", errorMessages));
             }
         }
 
@@ -904,4 +941,9 @@ public class AnalysisManager extends Daemon implements 
Writable {
             entry.getValue().write(out);
         }
     }
+
+    // For unit test use only.
+    public void addToJobIdTasksMap(long jobId, Map<Long, BaseAnalysisTask> 
tasks) {
+        analysisJobIdToTaskMap.put(jobId, tasks);
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisTaskExecutor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisTaskExecutor.java
index 11f244afd8..b5ec7aeb87 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisTaskExecutor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisTaskExecutor.java
@@ -17,7 +17,6 @@
 
 package org.apache.doris.statistics;
 
-import org.apache.doris.catalog.Env;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.ThreadPoolManager;
 import org.apache.doris.common.ThreadPoolManager.BlockedPolicy;
@@ -101,9 +100,6 @@ public class AnalysisTaskExecutor extends Thread {
         BaseAnalysisTask task = taskScheduler.getPendingTasks();
         AnalysisTaskWrapper taskWrapper = new AnalysisTaskWrapper(this, task);
         executors.submit(taskWrapper);
-        Env.getCurrentEnv().getAnalysisManager()
-                .updateTaskStatus(task.info,
-                        AnalysisState.RUNNING, "", System.currentTimeMillis());
     }
 
     public void putJob(AnalysisTaskWrapper wrapper) throws Exception {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisTaskWrapper.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisTaskWrapper.java
index 9a0d6ec2fc..7f55469f53 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisTaskWrapper.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisTaskWrapper.java
@@ -18,6 +18,7 @@
 package org.apache.doris.statistics;
 
 import org.apache.doris.catalog.Env;
+import org.apache.doris.common.util.Util;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -62,16 +63,17 @@ public class AnalysisTaskWrapper extends FutureTask<Void> {
         } finally {
             if (!task.killed) {
                 if (except != null) {
-                    LOG.warn("Failed to execute task", except);
+                    LOG.warn("Analyze {} failed.", task.toString(), except);
                     Env.getCurrentEnv().getAnalysisManager()
                             .updateTaskStatus(task.info,
-                                    AnalysisState.FAILED, except.getMessage(), 
System.currentTimeMillis());
+                                    AnalysisState.FAILED, 
Util.getRootCauseMessage(except), System.currentTimeMillis());
                 } else {
+                    LOG.debug("Analyze {} finished, cost time:{}", 
task.toString(),
+                            System.currentTimeMillis() - startTime);
                     Env.getCurrentEnv().getAnalysisManager()
                             .updateTaskStatus(task.info,
                                     AnalysisState.FINISHED, "", 
System.currentTimeMillis());
                 }
-                LOG.warn("{} finished, cost time:{}", task.toString(), 
System.currentTimeMillis() - startTime);
             }
         }
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/BaseAnalysisTask.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/BaseAnalysisTask.java
index aca18bd05f..9c15c49c38 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/BaseAnalysisTask.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/BaseAnalysisTask.java
@@ -171,12 +171,20 @@ public abstract class BaseAnalysisTask {
                 break;
             } catch (Throwable t) {
                 LOG.warn("Failed to execute analysis task, retried times: {}", 
retriedTimes++, t);
+                if (retriedTimes > 
StatisticConstants.ANALYZE_TASK_RETRY_TIMES) {
+                    throw new RuntimeException(t);
+                }
             }
         }
     }
 
     public abstract void doExecute() throws Exception;
 
+    protected void setTaskStateToRunning() {
+        Env.getCurrentEnv().getAnalysisManager()
+            .updateTaskStatus(info, AnalysisState.RUNNING, "", 
System.currentTimeMillis());
+    }
+
     public void cancel() {
         killed = true;
         if (stmtExecutor != null) {
@@ -184,7 +192,7 @@ public abstract class BaseAnalysisTask {
         }
         Env.getCurrentEnv().getAnalysisManager()
                 .updateTaskStatus(info, AnalysisState.FAILED,
-                        String.format("Job has been cancelled: %s", 
info.toString()), -1);
+                        String.format("Job has been cancelled: %s", 
info.message), System.currentTimeMillis());
     }
 
     public long getLastExecTime() {
@@ -215,4 +223,11 @@ public abstract class BaseAnalysisTask {
             return String.format("TABLESAMPLE(%d ROWS)", info.sampleRows);
         }
     }
+
+    @Override
+    public String toString() {
+        return String.format("Job id [%d], Task id [%d], catalog [%s], db 
[%s], table [%s], column [%s]",
+            info.jobId, info.taskId, catalog.getName(), db.getFullName(), 
tbl.getName(),
+            col == null ? "TableRowCount" : col.getName());
+    }
 }
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 87e7bbe1b5..03840f091d 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
@@ -22,6 +22,7 @@ import org.apache.doris.catalog.external.HMSExternalTable;
 import org.apache.doris.common.FeConstants;
 import org.apache.doris.common.util.TimeUtils;
 import org.apache.doris.qe.AutoCloseConnectContext;
+import org.apache.doris.qe.QueryState;
 import org.apache.doris.qe.StmtExecutor;
 import org.apache.doris.statistics.util.InternalQueryResult;
 import org.apache.doris.statistics.util.StatisticsUtil;
@@ -105,6 +106,7 @@ public class HMSAnalysisTask extends BaseAnalysisTask {
     }
 
     public void doExecute() throws Exception {
+        setTaskStateToRunning();
         if (isTableLevelTask) {
             getTableStats();
         } else {
@@ -190,11 +192,7 @@ public class HMSAnalysisTask extends BaseAnalysisTask {
                 params.put("dataSizeFunction", getDataSizeFunction(col));
                 StringSubstitutor stringSubstitutor = new 
StringSubstitutor(params);
                 String sql = stringSubstitutor.replace(sb.toString());
-                try (AutoCloseConnectContext r = 
StatisticsUtil.buildConnectContext()) {
-                    
r.connectContext.getSessionVariable().disableNereidsPlannerOnce();
-                    this.stmtExecutor = new StmtExecutor(r.connectContext, 
sql);
-                    this.stmtExecutor.execute();
-                }
+                executeInsertSql(sql);
             }
         } else {
             StringBuilder sb = new StringBuilder();
@@ -233,12 +231,27 @@ public class HMSAnalysisTask extends BaseAnalysisTask {
             params.put("dataSizeFunction", getDataSizeFunction(col));
             StringSubstitutor stringSubstitutor = new 
StringSubstitutor(params);
             String sql = stringSubstitutor.replace(sb.toString());
-            try (AutoCloseConnectContext r = 
StatisticsUtil.buildConnectContext()) {
-                
r.connectContext.getSessionVariable().disableNereidsPlannerOnce();
-                this.stmtExecutor = new StmtExecutor(r.connectContext, sql);
-                this.stmtExecutor.execute();
+            executeInsertSql(sql);
+            Env.getCurrentEnv().getStatisticsCache().refreshColStatsSync(
+                    catalog.getId(), db.getId(), tbl.getId(), -1, 
col.getName());
+        }
+    }
+
+    private void executeInsertSql(String sql) throws Exception {
+        long startTime = System.currentTimeMillis();
+        try (AutoCloseConnectContext r = StatisticsUtil.buildConnectContext()) 
{
+            r.connectContext.getSessionVariable().disableNereidsPlannerOnce();
+            this.stmtExecutor = new StmtExecutor(r.connectContext, sql);
+            r.connectContext.setExecutor(stmtExecutor);
+            this.stmtExecutor.execute();
+            QueryState queryState = r.connectContext.getState();
+            if 
(queryState.getStateType().equals(QueryState.MysqlStateType.ERR)) {
+                LOG.warn(String.format("Failed to analyze %s.%s.%s, sql: [%s], 
error: [%s]",
+                        info.catalogName, info.dbName, info.colName, sql, 
queryState.getErrorMessage()));
+                throw new RuntimeException(queryState.getErrorMessage());
             }
-            
Env.getCurrentEnv().getStatisticsCache().refreshColStatsSync(tbl.getId(), -1, 
col.getName());
+            LOG.debug(String.format("Analyze %s.%s.%s done. SQL: [%s]. Cost %d 
ms.",
+                    info.catalogName, info.dbName, info.colName, sql, 
(System.currentTimeMillis() - startTime)));
         }
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/HistogramTask.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/HistogramTask.java
index a0b6e6d9a5..a1b53cb3be 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/HistogramTask.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/HistogramTask.java
@@ -59,6 +59,7 @@ public class HistogramTask extends BaseAnalysisTask {
 
     @Override
     public void doExecute() throws Exception {
+        setTaskStateToRunning();
         Map<String, String> params = new HashMap<>();
         params.put("internalDB", FeConstants.INTERNAL_DB_NAME);
         params.put("histogramStatTbl", StatisticConstants.HISTOGRAM_TBL_NAME);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/MVAnalysisTask.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/MVAnalysisTask.java
index 31b3b76d5d..ed33252172 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/MVAnalysisTask.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/MVAnalysisTask.java
@@ -87,6 +87,7 @@ public class MVAnalysisTask extends BaseAnalysisTask {
 
     @Override
     public void doExecute() throws Exception {
+        setTaskStateToRunning();
         for (Column column : meta.getSchema()) {
             SelectStmt selectOne = (SelectStmt) selectStmt.clone();
             TableRef tableRef = selectOne.getTableRefs().get(0);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java
index f23c90f798..9fb04f9394 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java
@@ -60,6 +60,7 @@ public class OlapAnalysisTask extends BaseAnalysisTask {
     }
 
     public void doExecute() throws Exception {
+        setTaskStateToRunning();
         Map<String, String> params = new HashMap<>();
         params.put("internalDB", FeConstants.INTERNAL_DB_NAME);
         params.put("columnStatTbl", StatisticConstants.STATISTIC_TBL_NAME);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCache.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCache.java
index 284083ac01..1149ecdd5a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCache.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCache.java
@@ -169,7 +169,11 @@ public class StatisticsCache {
     }
 
     public void refreshColStatsSync(long tblId, long idxId, String colName) {
-        columnStatisticsCache.synchronous().refresh(new 
StatisticsCacheKey(tblId, idxId, colName));
+        columnStatisticsCache.synchronous().refresh(new StatisticsCacheKey(-1, 
-1, tblId, idxId, colName));
+    }
+
+    public void refreshColStatsSync(long catalogId, long dbId, long tblId, 
long idxId, String colName) {
+        columnStatisticsCache.synchronous().refresh(new 
StatisticsCacheKey(catalogId, dbId, tblId, idxId, colName));
     }
 
     public void refreshHistogramSync(long tblId, long idxId, String colName) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/util/StatisticsUtil.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/util/StatisticsUtil.java
index 0797a7e10f..61551b4f20 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/util/StatisticsUtil.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/util/StatisticsUtil.java
@@ -178,6 +178,8 @@ public class StatisticsUtil {
         sessionVariable.parallelPipelineTaskNum = 
Config.statistics_sql_parallel_exec_instance_num;
         sessionVariable.setEnableNereidsPlanner(false);
         sessionVariable.enableProfile = false;
+        sessionVariable.queryTimeoutS = Config.analyze_task_timeout_in_hours * 
60 * 60;
+        sessionVariable.insertTimeoutS = Config.analyze_task_timeout_in_hours 
* 60 * 60;
         connectContext.setEnv(Env.getCurrentEnv());
         connectContext.setDatabase(FeConstants.INTERNAL_DB_NAME);
         connectContext.setQualifiedUser(UserIdentity.ROOT.getQualifiedUser());
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
new file mode 100644
index 0000000000..253f9c9332
--- /dev/null
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/statistics/AnalysisManagerTest.java
@@ -0,0 +1,73 @@
+// 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.
+
+package org.apache.doris.statistics;
+
+import mockit.Mock;
+import mockit.MockUp;
+import mockit.Mocked;
+import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class AnalysisManagerTest {
+    @Test
+    public void testUpdateTaskStatus(@Mocked BaseAnalysisTask task1,
+                                     @Mocked BaseAnalysisTask task2) {
+
+        new MockUp<AnalysisManager>() {
+            @Mock
+            public void logCreateAnalysisTask(AnalysisInfo job) {
+            }
+
+            @Mock
+            public void logCreateAnalysisJob(AnalysisInfo job) {
+            }
+
+        };
+
+        AnalysisInfo job = new AnalysisInfoBuilder().setJobId(1)
+                
.setState(AnalysisState.PENDING).setJobType(AnalysisInfo.JobType.MANUAL).build();
+        AnalysisInfo taskInfo1 = new AnalysisInfoBuilder().setJobId(1)
+                .setTaskId(2).setState(AnalysisState.PENDING).build();
+        AnalysisInfo taskInfo2 = new AnalysisInfoBuilder().setJobId(1)
+                .setTaskId(3).setState(AnalysisState.PENDING).build();
+        AnalysisManager manager = new AnalysisManager();
+        manager.replayCreateAnalysisJob(job);
+        manager.replayCreateAnalysisTask(taskInfo1);
+        manager.replayCreateAnalysisTask(taskInfo2);
+        Map<Long, BaseAnalysisTask> tasks = new HashMap<>();
+
+        task1.info = taskInfo1;
+        task2.info = taskInfo2;
+        tasks.put(2L, task1);
+        tasks.put(3L, task2);
+        manager.addToJobIdTasksMap(1, tasks);
+
+        Assertions.assertEquals(job.state, AnalysisState.PENDING);
+        manager.updateTaskStatus(taskInfo1, AnalysisState.RUNNING, "", 0);
+        Assertions.assertEquals(job.state, AnalysisState.RUNNING);
+        manager.updateTaskStatus(taskInfo2, AnalysisState.RUNNING, "", 0);
+        Assertions.assertEquals(job.state, AnalysisState.RUNNING);
+        manager.updateTaskStatus(taskInfo1, AnalysisState.FINISHED, "", 0);
+        Assertions.assertEquals(job.state, AnalysisState.RUNNING);
+        manager.updateTaskStatus(taskInfo2, AnalysisState.FINISHED, "", 0);
+        Assertions.assertEquals(job.state, AnalysisState.FINISHED);
+    }
+}
diff --git 
a/regression-test/data/external_table_emr_p2/hive/test_hive_analyze_db.out 
b/regression-test/data/external_table_emr_p2/hive/test_hive_analyze_db.out
deleted file mode 100644
index 0b75316476..0000000000
--- a/regression-test/data/external_table_emr_p2/hive/test_hive_analyze_db.out
+++ /dev/null
@@ -1,20 +0,0 @@
--- This file is automatically generated. You should know what you did if you 
want to edit this
--- !1 --
-lo_orderpriority       100.0   5.0     0.0     888.8000000000001       8.8     
'1-URGENT'      '5-LOW'
-lo_custkey     100.0   26.0    0.0     404.0   4.0     67423   2735521
-lo_partkey     100.0   100.0   0.0     404.0   4.0     2250    989601
-lo_revenue     100.0   100.0   0.0     404.0   4.0     101171  8703450
-lo_commitdate  100.0   95.0    0.0     404.0   4.0     19920515        19981016
-lo_quantity    100.0   46.0    0.0     404.0   4.0     1       50
-lo_orderkey    100.0   26.0    0.0     404.0   4.0     1       98
-lo_suppkey     100.0   100.0   0.0     404.0   4.0     4167    195845
-lo_supplycost  100.0   100.0   0.0     404.0   4.0     58023   121374
-lo_shipmode    100.0   7.0     0.0     425.21  4.21    'AIR'   'TRUCK'
-lo_orderdate   100.0   26.0    0.0     404.0   4.0     19920221        19980721
-lo_linenumber  100.0   7.0     0.0     404.0   4.0     1       7
-lo_shippriority        100.0   1.0     0.0     404.0   4.0     0       0
-lo_ordtotalprice       100.0   26.0    0.0     404.0   4.0     3428256 36771805
-lo_extendedprice       100.0   100.0   0.0     404.0   4.0     104300  9066094
-lo_tax 100.0   9.0     0.0     404.0   4.0     0       8
-lo_discount    100.0   11.0    0.0     404.0   4.0     0       10
-
diff --git 
a/regression-test/data/external_table_emr_p2/hive/test_hive_statistic.out 
b/regression-test/data/external_table_emr_p2/hive/test_hive_statistic.out
deleted file mode 100644
index ad8b494c00..0000000000
--- a/regression-test/data/external_table_emr_p2/hive/test_hive_statistic.out
+++ /dev/null
@@ -1,57 +0,0 @@
--- This file is automatically generated. You should know what you did if you 
want to edit this
--- !1 --
-lo_quantity    100.0   46.0    0.0     404.0   4.0     1       50
-
--- !2 --
-lo_orderkey    100.0   26.0    0.0     404.0   4.0     1       98
-
--- !3 --
-lo_linenumber  100.0   7.0     0.0     404.0   4.0     1       7
-
--- !4 --
-lo_custkey     100.0   26.0    0.0     404.0   4.0     67423   2735521
-
--- !5 --
-lo_partkey     100.0   100.0   0.0     404.0   4.0     2250    989601
-
--- !6 --
-lo_suppkey     100.0   100.0   0.0     404.0   4.0     4167    195845
-
--- !7 --
-lo_orderdate   100.0   26.0    0.0     404.0   4.0     19920221        19980721
-
--- !8 --
-lo_orderpriority       100.0   5.0     0.0     888.8000000000001       8.8     
'1-URGENT'      '5-LOW'
-
--- !9 --
-lo_shippriority        100.0   1.0     0.0     404.0   4.0     0       0
-
--- !10 --
-lo_extendedprice       100.0   100.0   0.0     404.0   4.0     104300  9066094
-
--- !11 --
-lo_ordtotalprice       100.0   26.0    0.0     404.0   4.0     3428256 36771805
-
--- !12 --
-lo_discount    100.0   11.0    0.0     404.0   4.0     0       10
-
--- !13 --
-lo_revenue     100.0   100.0   0.0     404.0   4.0     101171  8703450
-
--- !14 --
-lo_supplycost  100.0   100.0   0.0     404.0   4.0     58023   121374
-
--- !15 --
-lo_tax 100.0   9.0     0.0     404.0   4.0     0       8
-
--- !16 --
-lo_commitdate  100.0   95.0    0.0     404.0   4.0     19920515        19981016
-
--- !17 --
-lo_shipmode    100.0   7.0     0.0     425.21  4.21    'AIR'   'TRUCK'
-
--- !18 --
-lo_shipmode    6001215.0       0.0     0.0     0.0     0.0     'NULL'  'NULL'
-
--- !19 --
-
diff --git 
a/regression-test/data/external_table_emr_p2/hive/test_hive_statistic_cache.out 
b/regression-test/data/external_table_emr_p2/hive/test_hive_statistic_cache.out
deleted file mode 100644
index dc5ded3837..0000000000
--- 
a/regression-test/data/external_table_emr_p2/hive/test_hive_statistic_cache.out
+++ /dev/null
@@ -1,58 +0,0 @@
--- This file is automatically generated. You should know what you did if you 
want to edit this
--- !1 --
-100
-
--- !2 --
-lo_orderkey    100.0   26.0    0.0     404.0   4.0     1       98
-
--- !3 --
-lo_linenumber  100.0   6.0     0.0     404.0   4.0     1       7
-
--- !4 --
-lo_custkey     100.0   30.0    0.0     404.0   4.0     67423   2735521
-
--- !5 --
-lo_partkey     100.0   107.0   0.0     404.0   4.0     2250    989601
-
--- !6 --
-lo_suppkey     100.0   90.0    0.0     404.0   4.0     4167    195845
-
--- !7 --
-lo_orderdate   100.0   22.0    0.0     404.0   4.0     19920221        19980721
-
--- !8 --
-lo_orderpriority       100.0   5.0     0.0     888.8000000000001       8.8     
N/A     N/A
-
--- !9 --
-lo_shippriority        100.0   2.0     0.0     404.0   4.0     0       0
-
--- !10 --
-lo_extendedprice       100.0   112.0   0.0     404.0   4.0     104300  9066094
-
--- !11 --
-lo_ordtotalprice       100.0   31.0    0.0     404.0   4.0     3428256 36771805
-
--- !12 --
-lo_discount    100.0   11.0    0.0     404.0   4.0     0       10
-
--- !13 --
-lo_revenue     100.0   127.0   0.0     404.0   4.0     101171  8703450
-
--- !14 --
-lo_supplycost  100.0   112.0   0.0     404.0   4.0     58023   121374
-
--- !15 --
-lo_tax 100.0   9.0     0.0     404.0   4.0     0       8
-
--- !16 --
-lo_commitdate  100.0   122.0   0.0     404.0   4.0     19920515        19981016
-
--- !17 --
-lo_shipmode    100.0   7.0     0.0     425.21  4.21    N/A     N/A
-
--- !18 --
-lo_orderkey    100.0   26.0    0.0     404.0   4.0     1       98
-
--- !19 --
-lo_quantity    100.0   34.0    0.0     404.0   4.0     1       50
-
diff --git 
a/regression-test/suites/external_table_emr_p2/hive/test_hive_analyze_db.groovy 
b/regression-test/suites/external_table_emr_p2/hive/test_hive_analyze_db.groovy
index a30c87275b..fd724a67f8 100644
--- 
a/regression-test/suites/external_table_emr_p2/hive/test_hive_analyze_db.groovy
+++ 
b/regression-test/suites/external_table_emr_p2/hive/test_hive_analyze_db.groovy
@@ -33,8 +33,163 @@ suite("test_hive_analyze_db", "p2") {
         sql """switch ${catalog_name};"""
         logger.info("switched to catalog " + catalog_name)
         sql """use statistics;"""
+        sql """set query_timeout=300"""
         sql """analyze database statistics with sync"""
-        qt_1 "show column stats statistics"
+        def result = sql """show column stats statistics"""
+        assertTrue(result.size() == 17)
+
+        assertTrue(result[0][0] == "lo_orderpriority")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "5.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "888.8000000000001")
+        assertTrue(result[0][5] == "8.8")
+        assertTrue(result[0][6] == "'1-URGENT'")
+        assertTrue(result[0][7] == "'5-LOW'")
+        
+        assertTrue(result[1][0] == "lo_custkey")
+        assertTrue(result[1][1] == "100.0")
+        assertTrue(result[1][2] == "26.0")
+        assertTrue(result[1][3] == "0.0")
+        assertTrue(result[1][4] == "404.0")
+        assertTrue(result[1][5] == "4.0")
+        assertTrue(result[1][6] == "67423")
+        assertTrue(result[1][7] == "2735521")
+
+        assertTrue(result[2][0] == "lo_partkey")
+        assertTrue(result[2][1] == "100.0")
+        assertTrue(result[2][2] == "100.0")
+        assertTrue(result[2][3] == "0.0")
+        assertTrue(result[2][4] == "404.0")
+        assertTrue(result[2][5] == "4.0")
+        assertTrue(result[2][6] == "2250")
+        assertTrue(result[2][7] == "989601")
+
+        assertTrue(result[3][0] == "lo_revenue")
+        assertTrue(result[3][1] == "100.0")
+        assertTrue(result[3][2] == "100.0")
+        assertTrue(result[3][3] == "0.0")
+        assertTrue(result[3][4] == "404.0")
+        assertTrue(result[3][5] == "4.0")
+        assertTrue(result[3][6] == "101171")
+        assertTrue(result[3][7] == "8703450")
+
+        assertTrue(result[4][0] == "lo_commitdate")
+        assertTrue(result[4][1] == "100.0")
+        assertTrue(result[4][2] == "95.0")
+        assertTrue(result[4][3] == "0.0")
+        assertTrue(result[4][4] == "404.0")
+        assertTrue(result[4][5] == "4.0")
+        assertTrue(result[4][6] == "19920515")
+        assertTrue(result[4][7] == "19981016")
+        
+        assertTrue(result[5][0] == "lo_quantity")
+        assertTrue(result[5][1] == "100.0")
+        assertTrue(result[5][2] == "46.0")
+        assertTrue(result[5][3] == "0.0")
+        assertTrue(result[5][4] == "404.0")
+        assertTrue(result[5][5] == "4.0")
+        assertTrue(result[5][6] == "1")
+        assertTrue(result[5][7] == "50")
+
+        assertTrue(result[6][0] == "lo_orderkey")
+        assertTrue(result[6][1] == "100.0")
+        assertTrue(result[6][2] == "26.0")
+        assertTrue(result[6][3] == "0.0")
+        assertTrue(result[6][4] == "404.0")
+        assertTrue(result[6][5] == "4.0")
+        assertTrue(result[6][6] == "1")
+        assertTrue(result[6][7] == "98")
+
+        assertTrue(result[7][0] == "lo_suppkey")
+        assertTrue(result[7][1] == "100.0")
+        assertTrue(result[7][2] == "100.0")
+        assertTrue(result[7][3] == "0.0")
+        assertTrue(result[7][4] == "404.0")
+        assertTrue(result[7][5] == "4.0")
+        assertTrue(result[7][6] == "4167")
+        assertTrue(result[7][7] == "195845")
+
+        assertTrue(result[8][0] == "lo_supplycost")
+        assertTrue(result[8][1] == "100.0")
+        assertTrue(result[8][2] == "100.0")
+        assertTrue(result[8][3] == "0.0")
+        assertTrue(result[8][4] == "404.0")
+        assertTrue(result[8][5] == "4.0")
+        assertTrue(result[8][6] == "58023")
+        assertTrue(result[8][7] == "121374")
+
+        assertTrue(result[9][0] == "lo_shipmode")
+        assertTrue(result[9][1] == "100.0")
+        assertTrue(result[9][2] == "7.0")
+        assertTrue(result[9][3] == "0.0")
+        assertTrue(result[9][4] == "425.21")
+        assertTrue(result[9][5] == "4.21")
+        assertTrue(result[9][6] == "'AIR'")
+        assertTrue(result[9][7] == "'TRUCK'")
+
+        assertTrue(result[10][0] == "lo_orderdate")
+        assertTrue(result[10][1] == "100.0")
+        assertTrue(result[10][2] == "26.0")
+        assertTrue(result[10][3] == "0.0")
+        assertTrue(result[10][4] == "404.0")
+        assertTrue(result[10][5] == "4.0")
+        assertTrue(result[10][6] == "19920221")
+        assertTrue(result[10][7] == "19980721")
+
+        assertTrue(result[11][0] == "lo_linenumber")
+        assertTrue(result[11][1] == "100.0")
+        assertTrue(result[11][2] == "7.0")
+        assertTrue(result[11][3] == "0.0")
+        assertTrue(result[11][4] == "404.0")
+        assertTrue(result[11][5] == "4.0")
+        assertTrue(result[11][6] == "1")
+        assertTrue(result[11][7] == "7")
+
+        assertTrue(result[12][0] == "lo_shippriority")
+        assertTrue(result[12][1] == "100.0")
+        assertTrue(result[12][2] == "1.0")
+        assertTrue(result[12][3] == "0.0")
+        assertTrue(result[12][4] == "404.0")
+        assertTrue(result[12][5] == "4.0")
+        assertTrue(result[12][6] == "0")
+        assertTrue(result[12][7] == "0")
+
+        assertTrue(result[13][0] == "lo_ordtotalprice")
+        assertTrue(result[13][1] == "100.0")
+        assertTrue(result[13][2] == "26.0")
+        assertTrue(result[13][3] == "0.0")
+        assertTrue(result[13][4] == "404.0")
+        assertTrue(result[13][5] == "4.0")
+        assertTrue(result[13][6] == "3428256")
+        assertTrue(result[13][7] == "36771805")
+
+        assertTrue(result[14][0] == "lo_extendedprice")
+        assertTrue(result[14][1] == "100.0")
+        assertTrue(result[14][2] == "100.0")
+        assertTrue(result[14][3] == "0.0")
+        assertTrue(result[14][4] == "404.0")
+        assertTrue(result[14][5] == "4.0")
+        assertTrue(result[14][6] == "104300")
+        assertTrue(result[14][7] == "9066094")
+
+        assertTrue(result[15][0] == "lo_tax")
+        assertTrue(result[15][1] == "100.0")
+        assertTrue(result[15][2] == "9.0")
+        assertTrue(result[15][3] == "0.0")
+        assertTrue(result[15][4] == "404.0")
+        assertTrue(result[15][5] == "4.0")
+        assertTrue(result[15][6] == "0")
+        assertTrue(result[15][7] == "8")
+
+        assertTrue(result[16][0] == "lo_discount")
+        assertTrue(result[16][1] == "100.0")
+        assertTrue(result[16][2] == "11.0")
+        assertTrue(result[16][3] == "0.0")
+        assertTrue(result[16][4] == "404.0")
+        assertTrue(result[16][5] == "4.0")
+        assertTrue(result[16][6] == "0")
+        assertTrue(result[16][7] == "10")
     }
 }
 
diff --git 
a/regression-test/suites/external_table_emr_p2/hive/test_hive_statistic.groovy 
b/regression-test/suites/external_table_emr_p2/hive/test_hive_statistic.groovy
index ff184e4506..c6df0b0eaa 100644
--- 
a/regression-test/suites/external_table_emr_p2/hive/test_hive_statistic.groovy
+++ 
b/regression-test/suites/external_table_emr_p2/hive/test_hive_statistic.groovy
@@ -34,29 +34,202 @@ suite("test_hive_statistic", "p2") {
         logger.info("switched to catalog " + catalog_name)
         sql """use statistics;"""
         sql """analyze table `statistics` with sync"""
-        qt_1 "show column stats `statistics` (lo_quantity)"
-        qt_2 "show column stats `statistics` (lo_orderkey)"
-        qt_3 "show column stats `statistics` (lo_linenumber)"
-        qt_4 "show column stats `statistics` (lo_custkey)"
-        qt_5 "show column stats `statistics` (lo_partkey)"
-        qt_6 "show column stats `statistics` (lo_suppkey)"
-        qt_7 "show column stats `statistics` (lo_orderdate)"
-        qt_8 "show column stats `statistics` (lo_orderpriority)"
-        qt_9 "show column stats `statistics` (lo_shippriority)"
-        qt_10 "show column stats `statistics` (lo_extendedprice)"
-        qt_11 "show column stats `statistics` (lo_ordtotalprice)"
-        qt_12 "show column stats `statistics` (lo_discount)"
-        qt_13 "show column stats `statistics` (lo_revenue)"
-        qt_14 "show column stats `statistics` (lo_supplycost)"
-        qt_15 "show column stats `statistics` (lo_tax)"
-        qt_16 "show column stats `statistics` (lo_commitdate)"
-        qt_17 "show column stats `statistics` (lo_shipmode)"
-
-        sql """ALTER TABLE statistics MODIFY COLUMN lo_shipmode SET STATS 
('row_count'='6001215')"""
-        qt_18 "show column stats `statistics` (lo_shipmode)"
+        def result = sql """show column stats `statistics` (lo_quantity)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_quantity")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "46.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "1")
+        assertTrue(result[0][7] == "50")
+
+        result = sql """show column stats `statistics` (lo_orderkey)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_orderkey")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "26.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "1")
+        assertTrue(result[0][7] == "98")
+
+        result = sql """show column stats `statistics` (lo_linenumber)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_linenumber")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "7.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "1")
+        assertTrue(result[0][7] == "7")
+
+        result = sql """show column stats `statistics` (lo_custkey)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_custkey")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "26.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "67423")
+        assertTrue(result[0][7] == "2735521")
+
+        result = sql """show column stats `statistics` (lo_partkey)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_partkey")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "100.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "2250")
+        assertTrue(result[0][7] == "989601")
+
+        result = sql """show column stats `statistics` (lo_suppkey)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_suppkey")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "100.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "4167")
+        assertTrue(result[0][7] == "195845")
+
+        result = sql """show column stats `statistics` (lo_orderdate)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_orderdate")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "26.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "19920221")
+        assertTrue(result[0][7] == "19980721")
+
+        result = sql """show column stats `statistics` (lo_orderpriority)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_orderpriority")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "5.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "888.8000000000001")
+        assertTrue(result[0][5] == "8.8")
+        assertTrue(result[0][6] == "'1-URGENT'")
+        assertTrue(result[0][7] == "'5-LOW'")
+
+        result = sql """show column stats `statistics` (lo_shippriority)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_shippriority")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "1.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "0")
+        assertTrue(result[0][7] == "0")
+
+        result = sql """show column stats `statistics` (lo_extendedprice)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_extendedprice")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "100.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "104300")
+        assertTrue(result[0][7] == "9066094")
+
+        result = sql """show column stats `statistics` (lo_ordtotalprice)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_ordtotalprice")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "26.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "3428256")
+        assertTrue(result[0][7] == "36771805")
+
+        result = sql """show column stats `statistics` (lo_discount)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_discount")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "11.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "0")
+        assertTrue(result[0][7] == "10")
+
+        result = sql """show column stats `statistics` (lo_revenue)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_revenue")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "100.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "101171")
+        assertTrue(result[0][7] == "8703450")
+
+        result = sql """show column stats `statistics` (lo_supplycost)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_supplycost")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "100.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "58023")
+        assertTrue(result[0][7] == "121374")
+
+        result = sql """show column stats `statistics` (lo_tax)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_tax")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "9.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "0")
+        assertTrue(result[0][7] == "8")
+
+        result = sql """show column stats `statistics` (lo_commitdate)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_commitdate")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "95.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "19920515")
+        assertTrue(result[0][7] == "19981016")
+
+        result = sql """show column stats `statistics` (lo_shipmode)"""
+        assertTrue(result.size() == 1)
+        assertTrue(result[0][0] == "lo_shipmode")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "7.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "425.21")
+        assertTrue(result[0][5] == "4.21")
+        assertTrue(result[0][6] == "'AIR'")
+        assertTrue(result[0][7] == "'TRUCK'")
+
+        // sql """ALTER TABLE statistics MODIFY COLUMN lo_shipmode SET STATS 
('row_count'='6001215')"""
+        // result = sql "show column stats `statistics` (lo_shipmode)"
+        // assertTrue(result.size() == 1)
+        // assertTrue(result[0][0] == "lo_shipmode")
+        // assertTrue(result[0][1] == "6001215.0")
 
         sql """drop stats statistics"""
-        qt_19 "show column stats statistics"
+        result = sql """show column stats statistics"""
+        assertTrue(result.size() == 0)
     }
 }
 
diff --git 
a/regression-test/suites/external_table_emr_p2/hive/test_hive_statistic_cache.groovy
 
b/regression-test/suites/external_table_emr_p2/hive/test_hive_statistic_cache.groovy
index 2fb574a0da..d1399ef49b 100644
--- 
a/regression-test/suites/external_table_emr_p2/hive/test_hive_statistic_cache.groovy
+++ 
b/regression-test/suites/external_table_emr_p2/hive/test_hive_statistic_cache.groovy
@@ -33,26 +33,179 @@ suite("test_hive_statistic_cache", "p2") {
         sql """switch ${catalog_name};"""
         logger.info("switched to catalog " + catalog_name)
         sql """use statistics;"""
-        qt_1 "select count(*) from stats"
+        sql """set query_timeout=300;"""
+        sql """analyze table `stats` with sync;"""
+        sql """select count(*) from stats"""
         Thread.sleep(5000);
-        qt_2 "show column cached stats `stats` (lo_orderkey)"
-        qt_3 "show column cached stats `stats` (lo_linenumber)"
-        qt_4 "show column cached stats `stats` (lo_custkey)"
-        qt_5 "show column cached stats `stats` (lo_partkey)"
-        qt_6 "show column cached stats `stats` (lo_suppkey)"
-        qt_7 "show column cached stats `stats` (lo_orderdate)"
-        qt_8 "show column cached stats `stats` (lo_orderpriority)"
-        qt_9 "show column cached stats `stats` (lo_shippriority)"
-        qt_10 "show column cached stats `stats` (lo_extendedprice)"
-        qt_11 "show column cached stats `stats` (lo_ordtotalprice)"
-        qt_12 "show column cached stats `stats` (lo_discount)"
-        qt_13 "show column cached stats `stats` (lo_revenue)"
-        qt_14 "show column cached stats `stats` (lo_supplycost)"
-        qt_15 "show column cached stats `stats` (lo_tax)"
-        qt_16 "show column cached stats `stats` (lo_commitdate)"
-        qt_17 "show column cached stats `stats` (lo_shipmode)"
-        qt_18 "show column cached stats `stats` (lo_orderkey)"
-        qt_19 "show column cached stats `stats` (lo_quantity)"
+        def result = sql """show column cached stats `stats` (lo_orderkey)"""
+        assertTrue(result[0][0] == "lo_orderkey")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "26.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "1")
+        assertTrue(result[0][7] == "98")
+
+        result = sql """show column cached stats `stats` (lo_linenumber)"""
+        assertTrue(result[0][0] == "lo_linenumber")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "7.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "1")
+        assertTrue(result[0][7] == "7")
+
+        result = sql """show column cached stats `stats` (lo_custkey)"""
+        assertTrue(result[0][0] == "lo_custkey")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "26.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "67423")
+        assertTrue(result[0][7] == "2735521")
+
+        result = sql """show column cached stats `stats` (lo_partkey)"""
+        assertTrue(result[0][0] == "lo_partkey")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "100.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "2250")
+        assertTrue(result[0][7] == "989601")
+
+        result = sql """show column cached stats `stats` (lo_suppkey)"""
+        assertTrue(result[0][0] == "lo_suppkey")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "100.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "4167")
+        assertTrue(result[0][7] == "195845")
+
+        result = sql """show column cached stats `stats` (lo_orderdate)"""
+        assertTrue(result[0][0] == "lo_orderdate")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "26.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "19920221")
+        assertTrue(result[0][7] == "19980721")
+
+        result = sql """show column cached stats `stats` (lo_orderpriority)"""
+        assertTrue(result[0][0] == "lo_orderpriority")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "5.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "888.8000000000001")
+        assertTrue(result[0][5] == "8.8")
+        assertTrue(result[0][6] == "'1-URGENT'")
+        assertTrue(result[0][7] == "'5-LOW'")
+
+        result = sql """show column cached stats `stats` (lo_shippriority)"""
+        assertTrue(result[0][0] == "lo_shippriority")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "1.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "0")
+        assertTrue(result[0][7] == "0")
+
+        result = sql """show column cached stats `stats` (lo_extendedprice)"""
+        assertTrue(result[0][0] == "lo_extendedprice")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "100.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "104300")
+        assertTrue(result[0][7] == "9066094")
+
+        result = sql """show column cached stats `stats` (lo_ordtotalprice)"""
+        assertTrue(result[0][0] == "lo_ordtotalprice")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "26.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "3428256")
+        assertTrue(result[0][7] == "36771805")
+
+        result = sql """show column cached stats `stats` (lo_discount)"""
+        assertTrue(result[0][0] == "lo_discount")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "11.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "0")
+        assertTrue(result[0][7] == "10")
+
+        result = sql """show column cached stats `stats` (lo_revenue)"""
+        assertTrue(result[0][0] == "lo_revenue")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "100.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "101171")
+        assertTrue(result[0][7] == "8703450")
+
+        result = sql """show column cached stats `stats` (lo_supplycost)"""
+        assertTrue(result[0][0] == "lo_supplycost")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "100.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "58023")
+        assertTrue(result[0][7] == "121374")
+
+        result = sql """show column cached stats `stats` (lo_tax)"""
+        assertTrue(result[0][0] == "lo_tax")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "9.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "0")
+        assertTrue(result[0][7] == "8")
+
+        result = sql """show column cached stats `stats` (lo_commitdate)"""
+        assertTrue(result[0][0] == "lo_commitdate")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "95.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "19920515")
+        assertTrue(result[0][7] == "19981016")
+
+        result = sql """show column cached stats `stats` (lo_shipmode)"""
+        assertTrue(result[0][0] == "lo_shipmode")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "7.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "425.21")
+        assertTrue(result[0][5] == "4.21")
+        assertTrue(result[0][6] == "'AIR'")
+        assertTrue(result[0][7] == "'TRUCK'")
+
+        result = sql """show column cached stats `stats` (lo_quantity)"""
+        assertTrue(result[0][0] == "lo_quantity")
+        assertTrue(result[0][1] == "100.0")
+        assertTrue(result[0][2] == "46.0")
+        assertTrue(result[0][3] == "0.0")
+        assertTrue(result[0][4] == "404.0")
+        assertTrue(result[0][5] == "4.0")
+        assertTrue(result[0][6] == "1")
+        assertTrue(result[0][7] == "50")
     }
 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to