From e0dc3fbf1a3a6f84f106c5e296c5f8cd4f60b67b Mon Sep 17 00:00:00 2001 From: jerryjzhang Date: Wed, 5 Mar 2025 16:48:40 +0800 Subject: [PATCH] (improvement)(headless)Optimize compatibility and robustness in ontology query translation. (improvement)(headless)Optimize compatibility and robustness in ontology query translation. --- .../common/jsqlparser/FiledFilterReplaceVisitor.java | 3 ++- .../core/translator/parser/calcite/SemanticNode.java | 9 +++++---- .../core/translator/parser/calcite/SqlBuilder.java | 8 +++++++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/com/tencent/supersonic/common/jsqlparser/FiledFilterReplaceVisitor.java b/common/src/main/java/com/tencent/supersonic/common/jsqlparser/FiledFilterReplaceVisitor.java index 448ac06a4..8758cf9c1 100644 --- a/common/src/main/java/com/tencent/supersonic/common/jsqlparser/FiledFilterReplaceVisitor.java +++ b/common/src/main/java/com/tencent/supersonic/common/jsqlparser/FiledFilterReplaceVisitor.java @@ -91,7 +91,8 @@ public class FiledFilterReplaceVisitor extends ExpressionVisitorAdapter { } ExpressionList leftFunctionParams = leftFunction.getParameters(); - if (CollectionUtils.isEmpty(leftFunctionParams)) { + if (CollectionUtils.isEmpty(leftFunctionParams) + || !(leftFunctionParams.get(0) instanceof Column)) { return result; } diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/SemanticNode.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/SemanticNode.java index 9f85d4abb..8757d3e6d 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/SemanticNode.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/SemanticNode.java @@ -78,7 +78,8 @@ public abstract class SemanticNode { scope.getValidator().getCatalogReader().getRootSchema(), engineType); if (Configuration.getSqlAdvisor(sqlValidatorWithHints, engineType).getReservedAndKeyWords() .contains(expression.toUpperCase())) { - if (engineType == EngineType.HANADB || engineType == EngineType.PRESTO || engineType == EngineType.TRINO) { + if (engineType == EngineType.HANADB || engineType == EngineType.PRESTO + || engineType == EngineType.TRINO) { expression = String.format("\"%s\"", expression); } else { expression = String.format("`%s`", expression); @@ -166,9 +167,9 @@ public abstract class SemanticNode { if (sqlNode instanceof SqlBasicCall) { SqlBasicCall sqlBasicCall = (SqlBasicCall) sqlNode; if (sqlBasicCall.getOperator().getKind().equals(SqlKind.AS)) { - if (sqlBasicCall.getOperandList().get(0) instanceof SqlSelect) { - SqlSelect table = (SqlSelect) sqlBasicCall.getOperandList().get(0); - return table; + SqlNode innerQuery = sqlBasicCall.getOperandList().get(0); + if (innerQuery instanceof SqlCall) { + return innerQuery; } } } diff --git a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/SqlBuilder.java b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/SqlBuilder.java index 3617d6df4..b9db3dc5d 100644 --- a/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/SqlBuilder.java +++ b/headless/core/src/main/java/com/tencent/supersonic/headless/core/translator/parser/calcite/SqlBuilder.java @@ -69,7 +69,13 @@ public class SqlBuilder { SqlNode parserNode = tableView.build(); DatabaseResp database = queryStatement.getOntology().getDatabase(); EngineType engineType = EngineType.fromString(database.getType()); - parserNode = optimizeParseNode(parserNode, engineType); + try { + parserNode = optimizeParseNode(parserNode, engineType); + } catch (Exception e) { + // failure in optimization phase doesn't affect the query result, + // just ignore it + log.error("optimizeParseNode error", e); + } return SemanticNode.getSql(parserNode, engineType); }