Code review comment: We need to a way to access `StmtExecutor` for the job, so that we could cancel it if it executed too long time

Code under review:
public void execute() throws Exception {
        tbl.readLock();
        Map<String, String> params = new HashMap<>();
        params.put("internalDB", StatisticConstants.STATISTIC_DB_NAME);
        params.put("columnStatTbl", StatisticConstants.STATISTIC_TBL_NAME);
        params.put("catalogId", String.valueOf(catalog.getId()));
        params.put("dbId", String.valueOf(db.getId()));
        params.put("tblId", String.valueOf(tbl.getId()));
        params.put("colId", String.valueOf(info.colName));
        params.put("dataSizeFunction", getDataSizeFunction());
        params.put("dbName", info.dbName);
        params.put("colName", String.valueOf(info.colName));
        params.put("tblName", String.valueOf(info.tblName));
        List<String> partitionAnalysisSQLs = new ArrayList<>();
        try {
            tbl.readLock();
            Set<String> partNames = tbl.getPartitionNames();
            for (String partName : partNames) {
                Partition part = tbl.getPartition(partName);
                if (part == null) {
                    continue;
                }
                params.put("partId", String.valueOf(tbl.getPartition(partName).getId()));
                params.put("partName", String.valueOf(partName));
                StringSubstitutor stringSubstitutor = new StringSubstitutor(params);
                partitionAnalysisSQLs.add(stringSubstitutor.replace(ANALYZE_PARTITION_SQL_TEMPLATE));
            }
        } finally {
            tbl.readUnlock();
        }
        for (String sql : partitionAnalysisSQLs) {
            ConnectContext connectContext = StatisticUtil.buildConnectContext();
            this.stmtExecutor = new StmtExecutor(connectContext, sql);
            this.stmtExecutor.execute();
        }
        params.remove("partId");
        params.put("type", col.getType().toString());
        StringSubstitutor stringSubstitutor = new StringSubstitutor(params);
        String sql = stringSubstitutor.replace(ANALYZE_COLUMN_SQL_TEMPLATE);
        ConnectContext connectContext = StatisticUtil.buildConnectContext();
        this.stmtExecutor = new StmtExecutor(connectContext, sql);
        this.stmtExecutor.execute();
    }

Line commented on: this.stmtExecutor = new StmtExecutor(connectContext, sql);

Revised code:
public void execute() throws Exception {
        Map<String, String> params = new HashMap<>();
        params.put("internalDB", StatisticConstants.STATISTIC_DB_NAME);
        params.put("columnStatTbl", StatisticConstants.STATISTIC_TBL_NAME);
        params.put("catalogId", String.valueOf(catalog.getId()));
        params.put("dbId", String.valueOf(db.getId()));
        params.put("tblId", String.valueOf(tbl.getId()));
        params.put("colId", String.valueOf(info.colName));
        params.put("dataSizeFunction", getDataSizeFunction());
        params.put("dbName", info.dbName);
        params.put("colName", String.valueOf(info.colName));
        params.put("tblName", String.valueOf(info.tblName));
        List<String> partitionAnalysisSQLs = new ArrayList<>();
        try {
            tbl.readLock();
            Set<String> partNames = tbl.getPartitionNames();
            for (String partName : partNames) {
                Partition part = tbl.getPartition(partName);
                if (part == null) {
                    continue;
                }
                params.put("partId", String.valueOf(tbl.getPartition(partName).getId()));
                params.put("partName", String.valueOf(partName));
                StringSubstitutor stringSubstitutor = new StringSubstitutor(params);
                partitionAnalysisSQLs.add(stringSubstitutor.replace(ANALYZE_PARTITION_SQL_TEMPLATE));
            }
        } finally {
            tbl.readUnlock();
        }
        for (String sql : partitionAnalysisSQLs) {
            ConnectContext connectContext = StatisticsUtil.buildConnectContext();
            this.stmtExecutor = new StmtExecutor(connectContext, sql);
            this.stmtExecutor.execute();
        }
        params.remove("partId");
        params.put("type", col.getType().toString());
        StringSubstitutor stringSubstitutor = new StringSubstitutor(params);
        String sql = stringSubstitutor.replace(ANALYZE_COLUMN_SQL_TEMPLATE);
        ConnectContext connectContext = StatisticsUtil.buildConnectContext();
        this.stmtExecutor = new StmtExecutor(connectContext, sql);
        this.stmtExecutor.execute();
    }