From a9653f00bb7ea7a0d3d03bd4cea44e3ca0fc6aa4 Mon Sep 17 00:00:00 2001 From: EmmyMiao87 <522274284@qq.com> Date: Sat, 14 May 2022 09:57:08 +0800 Subject: [PATCH] [fix](lateral-view) Error view includes lateral view (#9530) Fixed #9529 When the lateral view based on a inline view which belongs to a view, Doris could not resolve the column of lateral view in query. When a query uses a view, it mainly refers to the string representation of the view. That is, if the view's string representation is wrong, the view is wrong. The string representation of the inline view lacks the handling of the lateral view. This leads to query errors when using such views. This PR mainly fixes the string representation of inline views. --- .../apache/doris/analysis/InlineViewRef.java | 21 ++++++-------- .../org/apache/doris/analysis/QueryStmt.java | 3 +- .../org/apache/doris/analysis/TableRef.java | 28 ++++++++++--------- 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/InlineViewRef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/InlineViewRef.java index da1195f58f..f576f02bd8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/InlineViewRef.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/InlineViewRef.java @@ -439,26 +439,23 @@ public class InlineViewRef extends TableRef { } @Override - public String tableRefToSql() { + public String tableNameToSql() { // Enclose the alias in quotes if Hive cannot parse it without quotes. // This is needed for view compatibility between Impala and Hive. + if (view != null) { + // FIXME: this may result in a sql cache problem + // See pr #6736 and issue #6735 + return super.tableNameToSql(); + } + String aliasSql = null; String alias = getExplicitAlias(); if (alias != null) { aliasSql = ToSqlUtils.getIdentSql(alias); } - - if (view != null) { - // FIXME: this may result in a sql cache problem - // See pr #6736 and issue #6735 - return name.toSql() + (aliasSql == null ? "" : " " + aliasSql); - } - StringBuilder sb = new StringBuilder(); - sb.append("(") - .append(queryStmt.toSql()) - .append(") ") - .append(aliasSql); + sb.append("(").append(queryStmt.toSql()).append(") ") + .append(aliasSql); return sb.toString(); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java index 676380bbb9..c6fc843b7c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java @@ -205,8 +205,7 @@ public abstract class QueryStmt extends StatementBase { * (3) a mix of correlated table refs and table refs rooted at those refs * (the statement is 'self-contained' with respect to correlation) */ - public List getCorrelatedTupleIds(Analyzer analyzer) - throws AnalysisException { + public List getCorrelatedTupleIds(Analyzer analyzer) throws AnalysisException { // Correlated tuple ids of this stmt. List correlatedTupleIds = Lists.newArrayList(); // First correlated and absolute table refs. Used for error detection/reporting. diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/TableRef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/TableRef.java index d178f44fa5..7bf3790584 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/TableRef.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/TableRef.java @@ -626,20 +626,12 @@ public class TableRef implements ParseNode, Writable { /** * Return the table ref presentation to be used in the toSql string */ + // tbl1 + // tbl1 alias_tbl1 + // tbl1 alias_tbl1 lateral view explode_split(k1, ",") tmp1 as e1 + // (select xxx from xxx) t1 alias_tbl1 xxx public String tableRefToSql() { - String aliasSql = null; - String alias = getExplicitAlias(); - if (alias != null) aliasSql = ToSqlUtils.getIdentSql(alias); - - // TODO(zc): - // List path = rawPath_; - // if (resolvedPath_ != null) path = resolvedPath_.getFullyQualifiedRawPath(); - // return ToSqlUtils.getPathSql(path) + ((aliasSql != null) ? " " + aliasSql : ""); - - // tbl1 - // tbl1 alias_tbl1 - // tbl1 alias_tbl1 lateral view explode_split(k1, ",") tmp1 as e1 - String tblName = name.toSql() + ((aliasSql != null) ? " " + aliasSql : ""); + String tblName = tableNameToSql(); if (lateralViewRefs != null) { for (LateralViewRef viewRef : lateralViewRefs) { tblName += " " + viewRef.toSql(); @@ -648,6 +640,16 @@ public class TableRef implements ParseNode, Writable { return tblName; } + protected String tableNameToSql() { + String aliasSql = null; + String alias = getExplicitAlias(); + if (alias != null) { + aliasSql = ToSqlUtils.getIdentSql(alias); + } + String tblName = name.toSql() + ((aliasSql != null) ? " " + aliasSql : ""); + return tblName; + } + public String tableRefToDigest() { return tableRefToSql(); }