This is an automated email from the ASF dual-hosted git repository. liyang pushed a commit to branch kylin5 in repository https://gitbox.apache.org/repos/asf/kylin.git
commit 148d8f61aaafbca0c207d76f0747a85ed0b11fbb Author: Pengfei Zhan <dethr...@gmail.com> AuthorDate: Mon Sep 11 14:43:04 2023 +0800 KYLIN-5837 Support only reusing user defined computedColumns --- .../java/org/apache/kylin/common/KapConfig.java | 27 +++------- .../org/apache/kylin/common/KylinConfigBase.java | 25 ++++++--- .../org/apache/kylin/common/KapConfigTest.java | 15 ++---- .../apache/kylin/common/KylinConfigBaseTest.java | 8 +++ .../kylin/query/util/ComputedColumnRewriter.java | 17 +++--- .../kylin/query/util/ConvertToComputedColumn.java | 60 ++++++++-------------- .../query/util/RestoreFromComputedColumn.java | 19 +++---- 7 files changed, 79 insertions(+), 92 deletions(-) diff --git a/src/core-common/src/main/java/org/apache/kylin/common/KapConfig.java b/src/core-common/src/main/java/org/apache/kylin/common/KapConfig.java index c7c10c500d..c79a588c95 100644 --- a/src/core-common/src/main/java/org/apache/kylin/common/KapConfig.java +++ b/src/core-common/src/main/java/org/apache/kylin/common/KapConfig.java @@ -22,13 +22,14 @@ import java.io.File; import java.io.IOException; import java.util.Map; -import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.fs.Path; import org.apache.kylin.common.annotation.Clarification; import org.apache.kylin.common.util.EncryptUtil; import org.apache.kylin.common.util.FileUtils; +import lombok.extern.slf4j.Slf4j; + @Slf4j @Clarification(priority = Clarification.Priority.MAJOR, msg = "Enterprise") public class KapConfig { @@ -233,21 +234,6 @@ public class KapConfig { return config.getOptional("kylin.smart.conf." + conf, null); } - /** - * Query - */ - public boolean isImplicitComputedColumnConvertEnabled() { - return Boolean.parseBoolean(config.getOptional("kylin.query.implicit-computed-column-convert", "true")); - } - - public boolean isAggComputedColumnRewriteEnabled() { - return Boolean.parseBoolean(config.getOptional("kylin.query.agg-computed-column-rewrite", "true")); - } - - public int getComputedColumnMaxRecursionTimes() { - return Integer.parseInt(config.getOptional("kylin.query.computed-column-max-recursion-times", "10")); - } - public boolean isJdbcEscapeEnabled() { return Boolean.parseBoolean(config.getOptional("kylin.query.jdbc-escape-enabled", "true")); } @@ -266,7 +252,8 @@ public class KapConfig { } public Boolean isConstraintPropagationEnabled() { - return Boolean.parseBoolean(config.getOptional("kylin.query.engine.spark-constraint-propagation-enabled", FALSE)); + return Boolean + .parseBoolean(config.getOptional("kylin.query.engine.spark-constraint-propagation-enabled", FALSE)); } /** @@ -716,11 +703,13 @@ public class KapConfig { } public boolean isApplyLimitInfoToSourceScanRowsEnabled() { - return Boolean.parseBoolean(config.getOptional("kylin.query.apply-limit-info-to-source-scan-rows-enabled", FALSE)); + return Boolean + .parseBoolean(config.getOptional("kylin.query.apply-limit-info-to-source-scan-rows-enabled", FALSE)); } public boolean isAutoAdjustBigQueryRowsThresholdEnabled() { - return Boolean.parseBoolean(config.getOptional("kylin.query.auto-adjust-big-query-rows-threshold-enabled", FALSE)); + return Boolean + .parseBoolean(config.getOptional("kylin.query.auto-adjust-big-query-rows-threshold-enabled", FALSE)); } public long getBigQuerySecond() { diff --git a/src/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java b/src/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java index a2518358a9..3042b23c58 100644 --- a/src/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java +++ b/src/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java @@ -793,6 +793,18 @@ public abstract class KylinConfigBase implements Serializable { return Boolean.parseBoolean(getOptional("kylin.metadata.only-reuse-user-defined-computed-column", FALSE)); } + public boolean isConvertExpressionToCcEnabled() { + return Boolean.parseBoolean(getOptional("kylin.query.implicit-computed-column-convert", TRUE)); + } + + public boolean isAggComputedColumnRewriteEnabled() { + return Boolean.parseBoolean(getOptional("kylin.query.agg-computed-column-rewrite", TRUE)); + } + + public int getConvertCcMaxIterations() { + return Integer.parseInt(getOptional("kylin.query.computed-column-max-recursion-times", "10")); + } + /** * expose computed column in the table metadata and select * queries */ @@ -1941,14 +1953,14 @@ public abstract class KylinConfigBase implements Serializable { } public String getMppOnTheFlyLayoutsProvider() { - return this.getOptional("kylin.query.mpp-on-the-fly-layouts-provider", "io.kyligence.kap.engine.spark.job.MppOnTheFlyImpl"); + return this.getOptional("kylin.query.mpp-on-the-fly-layouts-provider", + "io.kyligence.kap.engine.spark.job.MppOnTheFlyImpl"); } public boolean enableReplaceDynamicParams() { return Boolean.parseBoolean(this.getOptional("kylin.query.replace-dynamic-params-enabled", FALSE)); } - public String getPercentileApproxAlgorithm() { // Valid values: t-digest return this.getOptional("kylin.query.percentile-approx-algorithm", ""); @@ -2870,8 +2882,7 @@ public abstract class KylinConfigBase implements Serializable { } public long getTableAccessCacheTTL() { - return TimeUtil.timeStringAs(getOptional("kylin.source.hive.table-access-cache-ttl", "7d"), - TimeUnit.MINUTES); + return TimeUtil.timeStringAs(getOptional("kylin.source.hive.table-access-cache-ttl", "7d"), TimeUnit.MINUTES); } public String[] getHiveDatabases() { @@ -4126,11 +4137,13 @@ public abstract class KylinConfigBase implements Serializable { } public boolean isKylinLocalCacheEnabled() { - return Boolean.parseBoolean(getOptional("kylin.storage.columnar.spark-conf.spark.kylin.local-cache.enabled", FALSE)); + return Boolean + .parseBoolean(getOptional("kylin.storage.columnar.spark-conf.spark.kylin.local-cache.enabled", FALSE)); } public boolean isKylinFileStatusCacheEnabled() { - return Boolean.parseBoolean(getOptional("kylin.storage.columnar.spark-conf.spark.hadoop.spark.kylin.file-status-cache.enabled", FALSE)); + return Boolean.parseBoolean(getOptional( + "kylin.storage.columnar.spark-conf.spark.hadoop.spark.kylin.file-status-cache.enabled", FALSE)); } public boolean isSupportPushdownHiveCsvEnhancement() { diff --git a/src/core-common/src/test/java/org/apache/kylin/common/KapConfigTest.java b/src/core-common/src/test/java/org/apache/kylin/common/KapConfigTest.java index ba98e66eab..ed20497851 100644 --- a/src/core-common/src/test/java/org/apache/kylin/common/KapConfigTest.java +++ b/src/core-common/src/test/java/org/apache/kylin/common/KapConfigTest.java @@ -70,15 +70,6 @@ public class KapConfigTest { map.put("getChannelUser", new PropertiesEntity("kylin.env.channel", "on-premises", "on-premises")); - map.put("isImplicitComputedColumnConvertEnabled", - new PropertiesEntity("kylin.query.implicit-computed-column-convert", "true", true)); - - map.put("isAggComputedColumnRewriteEnabled", - new PropertiesEntity("kylin.query.agg-computed-column-rewrite", "true", true)); - - map.put("getComputedColumnMaxRecursionTimes", - new PropertiesEntity("kylin.query.computed-column-max-recursion-times", "10", 10)); - map.put("isJdbcEscapeEnabled", new PropertiesEntity("kylin.query.jdbc-escape-enabled", "true", true)); map.put("getListenerBusBusyThreshold", @@ -258,8 +249,10 @@ public class KapConfigTest { new PropertiesEntity("kylin.query.spark-job-trace-parallel-max", "50", 50)); map.put("isSourceUsageUnwrapComputedColumn", new PropertiesEntity("kylin.metadata.history-source-usage-unwrap-computed-column", "true", true)); - map.put("getKerberosTGTRenewalInterval", new PropertiesEntity("kylin.kerberos.tgt-renewal-interval-minutes", "10", 10L)); - map.put("getKerberosTGTRetryInterval", new PropertiesEntity("kylin.kerberos.tgt-retry-interval-minutes", "60", 60L)); + map.put("getKerberosTGTRenewalInterval", + new PropertiesEntity("kylin.kerberos.tgt-renewal-interval-minutes", "10", 10L)); + map.put("getKerberosTGTRetryInterval", + new PropertiesEntity("kylin.kerberos.tgt-retry-interval-minutes", "60", 60L)); } @Test diff --git a/src/core-common/src/test/java/org/apache/kylin/common/KylinConfigBaseTest.java b/src/core-common/src/test/java/org/apache/kylin/common/KylinConfigBaseTest.java index 59e4a3fc9b..f01a4ab8a1 100644 --- a/src/core-common/src/test/java/org/apache/kylin/common/KylinConfigBaseTest.java +++ b/src/core-common/src/test/java/org/apache/kylin/common/KylinConfigBaseTest.java @@ -105,6 +105,14 @@ class KylinConfigBaseTest { new PropertiesEntity("kylin.metrics.system-cube-sink-default-class", "org.apache.kylin.metrics.lib.impl.hive.HiveSink", "org.apache.kylin.metrics.lib.impl.hive.HiveSink")); + map.put("isConvertExpressionToCcEnabled", + new PropertiesEntity("kylin.query.implicit-computed-column-convert", "true", true)); + + map.put("isAggComputedColumnRewriteEnabled", + new PropertiesEntity("kylin.query.agg-computed-column-rewrite", "true", true)); + + map.put("getConvertCcMaxIterations", + new PropertiesEntity("kylin.query.computed-column-max-recursion-times", "10", 10)); map.put("isKylinMetricsMonitorEnabled", new PropertiesEntity("kylin.metrics.monitor-enabled", "false", false)); diff --git a/src/query-common/src/main/java/org/apache/kylin/query/util/ComputedColumnRewriter.java b/src/query-common/src/main/java/org/apache/kylin/query/util/ComputedColumnRewriter.java index 1e198f87db..ea4878190e 100644 --- a/src/query-common/src/main/java/org/apache/kylin/query/util/ComputedColumnRewriter.java +++ b/src/query-common/src/main/java/org/apache/kylin/query/util/ComputedColumnRewriter.java @@ -24,9 +24,9 @@ import java.util.Map; import org.apache.calcite.sql.SqlNode; import org.apache.commons.collections.CollectionUtils; -import org.apache.kylin.common.KapConfig; import org.apache.kylin.common.KylinConfig; import org.apache.kylin.common.util.CollectionUtil; +import org.apache.kylin.guava30.shaded.common.collect.Lists; import org.apache.kylin.metadata.model.ComputedColumnDesc; import org.apache.kylin.metadata.model.NDataModel; import org.apache.kylin.metadata.model.ParameterDesc; @@ -41,8 +41,6 @@ import org.apache.kylin.query.relnode.TableColRefWithRel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.kylin.guava30.shaded.common.collect.Lists; - import lombok.val; import lombok.var; @@ -65,7 +63,7 @@ public class ComputedColumnRewriter { private static void rewriteAggInnerCol(KylinConfig kylinConfig, OLAPContext context, NDataModel model, QueryAliasMatchInfo matchInfo) { - if (!KapConfig.getInstanceFromEnv().isAggComputedColumnRewriteEnabled() + if (!kylinConfig.isConvertExpressionToCcEnabled() || !kylinConfig.isAggComputedColumnRewriteEnabled() || CollectionUtils.isEmpty(model.getComputedColumnDescs())) { return; } @@ -102,8 +100,9 @@ public class ComputedColumnRewriter { return null; } + boolean onlyReuseUserDefinedCC = kylinConfig.onlyReuseUserDefinedCC(); for (ComputedColumnDesc cc : model.getComputedColumnDescs()) { - if (kylinConfig.isTableExclusionEnabled() && kylinConfig.onlyReuseUserDefinedCC() && cc.isAutoCC()) { + if (onlyReuseUserDefinedCC && cc.isAutoCC()) { continue; } @@ -122,7 +121,7 @@ public class ComputedColumnRewriter { private static void rewriteTopNInnerCol(KylinConfig kylinConfig, OLAPContext context, NDataModel model, QueryAliasMatchInfo matchInfo) { - if (CollectionUtils.isEmpty(model.getComputedColumnDescs())) + if (CollectionUtils.isEmpty(model.getComputedColumnDescs()) || !kylinConfig.isConvertExpressionToCcEnabled()) return; context.getSortColumns().stream().filter(TblColRef::isInnerColumn).forEach(column -> { @@ -146,7 +145,7 @@ public class ComputedColumnRewriter { private static void rewriteGroupByInnerCol(KylinConfig kylinConfig, OLAPContext ctx, NDataModel model, QueryAliasMatchInfo matchInfo) { - if (CollectionUtils.isEmpty(model.getComputedColumnDescs())) { + if (CollectionUtils.isEmpty(model.getComputedColumnDescs()) || !kylinConfig.isConvertExpressionToCcEnabled()) { return; } @@ -161,8 +160,10 @@ public class ComputedColumnRewriter { tableColRefWIthRel.getTblColRef().getParserDescription(), e); continue; } + + boolean onlyReuseUserDefinedCC = kylinConfig.onlyReuseUserDefinedCC(); for (ComputedColumnDesc cc : model.getComputedColumnDescs()) { - if (kylinConfig.isTableExclusionEnabled() && kylinConfig.onlyReuseUserDefinedCC() && cc.isAutoCC()) { + if (onlyReuseUserDefinedCC && cc.isAutoCC()) { continue; } SqlNode ccExpressionNode = CalciteParser.getExpNode(cc.getExpression()); diff --git a/src/query-common/src/main/java/org/apache/kylin/query/util/ConvertToComputedColumn.java b/src/query-common/src/main/java/org/apache/kylin/query/util/ConvertToComputedColumn.java index ba1f57a832..1c4fa5a287 100644 --- a/src/query-common/src/main/java/org/apache/kylin/query/util/ConvertToComputedColumn.java +++ b/src/query-common/src/main/java/org/apache/kylin/query/util/ConvertToComputedColumn.java @@ -51,7 +51,6 @@ import org.apache.calcite.sql.util.SqlVisitor; import org.apache.calcite.util.Litmus; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.kylin.common.KapConfig; import org.apache.kylin.common.KylinConfig; import org.apache.kylin.common.util.Pair; import org.apache.kylin.common.util.ThreadUtil; @@ -70,7 +69,6 @@ import org.apache.kylin.metadata.project.NProjectManager; import org.apache.kylin.query.IQueryTransformer; import lombok.SneakyThrows; -import lombok.val; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -259,32 +257,22 @@ public class ConvertToComputedColumn implements IQueryTransformer { return transformImpl(originSql, project, defaultSchema, dataModelDescs); } - private String transformImpl(String originSql, String project, String defaultSchema, - List<NDataModel> dataModelDescs) throws SqlParseException { - + private String transformImpl(String originSql, String project, String defaultSchema, List<NDataModel> models) + throws SqlParseException { if (project == null || originSql == null) { return originSql; } - return transformImpl(originSql, new QueryAliasMatcher(project, defaultSchema), dataModelDescs); - } - - private String transformImpl(String originSql, QueryAliasMatcher queryAliasMatcher, List<NDataModel> dataModelDescs) - throws SqlParseException { - if (!KapConfig.getInstanceFromEnv().isImplicitComputedColumnConvertEnabled()) { + KylinConfig projectConfig = NProjectManager.getProjectConfig(project); + QueryAliasMatcher queryAliasMatcher = new QueryAliasMatcher(project, defaultSchema); + if (!projectConfig.isConvertExpressionToCcEnabled()) { return originSql; } + int maxRecursionTimes = projectConfig.getConvertCcMaxIterations(); String sql = originSql; - if (queryAliasMatcher == null || sql == null) { - return sql; - } - - int recursionTimes = 0; - int maxRecursionTimes = KapConfig.getInstanceFromEnv().getComputedColumnMaxRecursionTimes(); - - while ((recursionTimes++) < maxRecursionTimes) { - Pair<String, Boolean> result = transformImplRecursive(sql, queryAliasMatcher, dataModelDescs, false); + for (int i = 0; i < maxRecursionTimes; i++) { + Pair<String, Boolean> result = transformImplRecursive(sql, queryAliasMatcher, models); sql = result.getFirst(); boolean recursionCompleted = result.getSecond(); if (recursionCompleted) { @@ -296,7 +284,7 @@ public class ConvertToComputedColumn implements IQueryTransformer { } private Pair<String, Boolean> transformImplRecursive(String sql, QueryAliasMatcher queryAliasMatcher, - List<NDataModel> dataModelDescs, boolean replaceCcName) throws SqlParseException { + List<NDataModel> models) throws SqlParseException { boolean recursionCompleted = true; List<SqlCall> selectOrOrderbys = SqlSubqueryFinder.getSubqueries(sql); Pair<String, Integer> choiceForCurrentSubquery = null; //<new sql, number of changes by the model> @@ -309,9 +297,9 @@ public class ConvertToComputedColumn implements IQueryTransformer { SqlCall selectOrOrderby = selectOrOrderbys.get(i); - ComputedColumnReplacer rewriteChecker = new ComputedColumnReplacer(queryAliasMatcher, dataModelDescs, + ComputedColumnReplacer rewriteChecker = new ComputedColumnReplacer(queryAliasMatcher, models, recursionCompleted, choiceForCurrentSubquery, selectOrOrderby); - rewriteChecker.replace(sql, replaceCcName); + rewriteChecker.replace(sql, false); recursionCompleted = rewriteChecker.isRecursionCompleted(); choiceForCurrentSubquery = rewriteChecker.getChoiceForCurrentSubquery(); @@ -402,16 +390,9 @@ public class ConvertToComputedColumn implements IQueryTransformer { Pair<Integer, Integer> startEndPos = CalciteParser.getReplacePos(node, inputSql); int start = startEndPos.getFirst(); int end = startEndPos.getSecond(); - - boolean conflict = false; - for (val pair : toBeReplacedExp) { - Pair<Integer, Integer> replaced = pair.getSecond(); - if (!(replaced.getFirst() >= end || replaced.getSecond() <= start)) { - // overlap with chosen areas - conflict = true; - break; - } - } + boolean conflict = toBeReplacedExp.stream().map(Pair::getSecond) + .anyMatch(replaced -> !(replaced.getFirst() >= end || replaced.getSecond() <= start)); + // overlap with chosen areas if (conflict) { continue; } @@ -421,7 +402,8 @@ public class ConvertToComputedColumn implements IQueryTransformer { return toBeReplacedExp; } - //Return matched node's position and its alias(if exists).If can not find matches, return an empty list + // Return matched node's position and its alias(if exists). + // If we can not find matches, return an empty list private List<SqlNode> getMatchedNodes(SqlCall selectOrOrderby, String ccExp, QueryAliasMatchInfo matchInfo) { if (ccExp == null || ccExp.equals(StringUtils.EMPTY)) { return Collections.emptyList(); @@ -473,7 +455,7 @@ public class ConvertToComputedColumn implements IQueryTransformer { } static class SqlTreeVisitor implements SqlVisitor<SqlNode> { - private List<SqlNode> sqlNodes; + private final List<SqlNode> sqlNodes; SqlTreeVisitor() { this.sqlNodes = new ArrayList<>(); @@ -537,11 +519,11 @@ public class ConvertToComputedColumn implements IQueryTransformer { } private class ComputedColumnReplacer { - private QueryAliasMatcher queryAliasMatcher; - private List<NDataModel> dataModels; + private final QueryAliasMatcher queryAliasMatcher; + private final List<NDataModel> dataModels; private boolean recursionCompleted; private Pair<String, Integer> choiceForCurrentSubquery; - private SqlCall selectOrOrderby; + private final SqlCall selectOrOrderby; ComputedColumnReplacer(QueryAliasMatcher queryAliasMatcher, List<NDataModel> dataModels, boolean recursionCompleted, Pair<String, Integer> choiceForCurrentSubquery, SqlCall selectOrOrderby) { @@ -597,7 +579,7 @@ public class ConvertToComputedColumn implements IQueryTransformer { private List<ComputedColumnDesc> getSortedComputedColumnWithModel(NDataModel model) { List<ComputedColumnDesc> ccList = model.getComputedColumnDescs(); KylinConfig projectConfig = NProjectManager.getProjectConfig(model.getProject()); - if (projectConfig.isTableExclusionEnabled() && projectConfig.onlyReuseUserDefinedCC()) { + if (projectConfig.onlyReuseUserDefinedCC()) { ccList = ccList.stream().filter(cc -> !cc.isAutoCC()).collect(Collectors.toList()); } return getCCListSortByLength(ccList); diff --git a/src/query-common/src/main/java/org/apache/kylin/query/util/RestoreFromComputedColumn.java b/src/query-common/src/main/java/org/apache/kylin/query/util/RestoreFromComputedColumn.java index 148f40fb6c..cfb58dcab7 100644 --- a/src/query-common/src/main/java/org/apache/kylin/query/util/RestoreFromComputedColumn.java +++ b/src/query-common/src/main/java/org/apache/kylin/query/util/RestoreFromComputedColumn.java @@ -35,23 +35,22 @@ import org.apache.calcite.sql.parser.SqlParseException; import org.apache.calcite.sql.util.SqlBasicVisitor; import org.apache.calcite.util.Litmus; import org.apache.commons.collections.MapUtils; -import org.apache.kylin.common.KapConfig; import org.apache.kylin.common.KylinConfig; import org.apache.kylin.common.util.Pair; import org.apache.kylin.common.util.Unsafe; +import org.apache.kylin.guava30.shaded.common.base.Preconditions; +import org.apache.kylin.guava30.shaded.common.collect.Iterables; +import org.apache.kylin.guava30.shaded.common.collect.Lists; +import org.apache.kylin.guava30.shaded.common.collect.Sets; import org.apache.kylin.metadata.cube.model.NDataflowManager; import org.apache.kylin.metadata.model.ComputedColumnDesc; import org.apache.kylin.metadata.model.NDataModel; import org.apache.kylin.metadata.model.tool.CalciteParser; +import org.apache.kylin.metadata.project.NProjectManager; import org.apache.kylin.source.adhocquery.IPushDownConverter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.kylin.guava30.shaded.common.base.Preconditions; -import org.apache.kylin.guava30.shaded.common.collect.Iterables; -import org.apache.kylin.guava30.shaded.common.collect.Lists; -import org.apache.kylin.guava30.shaded.common.collect.Sets; - //very similar to ConvertToComputedColumn in structure, maybe we should extract a common base class? public class RestoreFromComputedColumn implements IPushDownConverter { @@ -78,10 +77,11 @@ public class RestoreFromComputedColumn implements IPushDownConverter { QueryAliasMatcher queryAliasMatcher = new QueryAliasMatcher(project, defaultSchema); int recursionTimes = 0; - int maxRecursionTimes = KapConfig.getInstanceFromEnv().getComputedColumnMaxRecursionTimes(); + int maxRecursionTimes = NProjectManager.getProjectConfig(project).getConvertCcMaxIterations(); while (recursionTimes < maxRecursionTimes) { - QueryInterruptChecker.checkThreadInterrupted("Interrupted sql transformation at the stage of RestoreFromComputedColumn", + QueryInterruptChecker.checkThreadInterrupted( + "Interrupted sql transformation at the stage of RestoreFromComputedColumn", "Current step: SQL transformation"); recursionTimes++; boolean recursionCompleted = true; @@ -181,7 +181,8 @@ public class RestoreFromComputedColumn implements IPushDownConverter { for (NDataModel model : modelMap.values()) { QueryAliasMatchInfo info = model.getComputedColumnDescs().isEmpty() ? null : queryAliasMatcher.match(model, sqlSelect); - QueryInterruptChecker.checkThreadInterrupted("Interrupted sql transformation at the stage of RestoreFromComputedColumn", + QueryInterruptChecker.checkThreadInterrupted( + "Interrupted sql transformation at the stage of RestoreFromComputedColumn", "Current step: SQL transformation"); if (info == null) { continue;