diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java index cae02941b93fe1..fd0d424d90aacb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java @@ -113,7 +113,9 @@ public class Analyzer { // UniqueAlias used to check whether the table ref or the alias is unique // table/view used db.table, inline use alias private final Set uniqueTableAliasSet = Sets.newHashSet(); - private final Multimap tupleByAlias = ArrayListMultimap.create(); + + // alias name -> + private final Multimap> tupleByAlias = ArrayListMultimap.create(); // NOTE: Alias of column is case ignorance // map from lowercase table alias to descriptor. @@ -624,10 +626,14 @@ public void substitute(ExprSubstitutionMap sMap) { if (globalState.conjuncts.get(id).substitute(sMap) instanceof BoolLiteral) { continue; } - globalState.conjuncts.put(id, (Predicate) globalState.conjuncts.get(id).substitute(sMap)); + globalState.conjuncts.put(id, globalState.conjuncts.get(id).substitute(sMap)); } } + public TupleDescriptor registerTableRef(TableRef ref) throws AnalysisException { + return registerTableRef(ref, false); + } + /** * Creates an returns an empty TupleDescriptor for the given table ref and registers * it against all its legal aliases. For tables refs with an explicit alias, only the @@ -638,7 +644,7 @@ public void substitute(ExprSubstitutionMap sMap) { * Throws if an existing explicit alias or implicit fully-qualified alias * has already been registered for another table ref. */ - public TupleDescriptor registerTableRef(TableRef ref) throws AnalysisException { + public TupleDescriptor registerTableRef(TableRef ref, boolean fromChild) throws AnalysisException { String uniqueAlias = ref.getUniqueAlias(); if (uniqueTableAliasSet.contains(uniqueAlias)) { ErrorReport.reportAnalysisException(ErrorCode.ERR_NONUNIQ_TABLE, uniqueAlias); @@ -671,7 +677,7 @@ public TupleDescriptor registerTableRef(TableRef ref) throws AnalysisException { for (String alias : aliases) { // TODO(zc) // aliasMap_.put(alias, result); - tupleByAlias.put(alias, result); + tupleByAlias.put(alias, Pair.of(fromChild, result)); } tableRefMap.put(result.getId(), ref); @@ -715,7 +721,7 @@ public TupleDescriptor registerOlapTable(Table table, TableName tableName, List< globalState.descTbl.computeStatAndMemLayout(); tableRefMap.put(result.getId(), ref); for (String alias : tableRef.getAliases()) { - tupleByAlias.put(alias, result); + tupleByAlias.put(alias, Pair.of(false, result)); } return result; } @@ -829,7 +835,7 @@ public ExprRewriter getMVExprRewriter() { * @return null if not registered. */ public Collection getDescriptor(TableName name) { - return tupleByAlias.get(name.toString()); + return tupleByAlias.get(name.toString()).stream().map(p -> p.second).collect(Collectors.toList()); } public TupleDescriptor getTupleDesc(TupleId id) { @@ -896,9 +902,9 @@ public SlotDescriptor registerColumnRef(TableName tblName, String colName) throw if (d == null && hasAncestors() && isSubquery) { // analyzer father for subquery if (newTblName == null) { - d = getParentAnalyzer().resolveColumnRef(colName); + d = getParentAnalyzer().resolveColumnRef(colName, true); } else { - d = getParentAnalyzer().resolveColumnRef(newTblName, colName); + d = getParentAnalyzer().resolveColumnRef(newTblName, colName, true); } } if (d == null) { @@ -955,15 +961,24 @@ public SlotDescriptor registerVirtualColumnRef(String colName, Type type, TupleD return result; } + TupleDescriptor resolveColumnRef(TableName tblName, String colName) throws AnalysisException { + return resolveColumnRef(tblName, colName, false); + } + /** * Resolves column name in context of any of the registered table aliases. * Returns null if not found or multiple bindings to different tables exist, * otherwise returns the table alias. */ - private TupleDescriptor resolveColumnRef(TableName tblName, String colName) throws AnalysisException { + private TupleDescriptor resolveColumnRef(TableName tblName, String colName, + boolean requestByChild) throws AnalysisException { TupleDescriptor result = null; // find table all name - for (TupleDescriptor desc : tupleByAlias.get(tblName.toString())) { + for (Pair p : tupleByAlias.get(tblName.toString())) { + if (p.first && requestByChild) { + continue; + } + TupleDescriptor desc = p.second; //result = desc; if (!colName.equalsIgnoreCase(Column.DELETE_SIGN) && !isVisible(desc.getId())) { ErrorReport.reportAnalysisException(ErrorCode.ERR_ILLEGAL_COLUMN_REFERENCE_ERROR, @@ -982,8 +997,16 @@ private TupleDescriptor resolveColumnRef(TableName tblName, String colName) thro } private TupleDescriptor resolveColumnRef(String colName) throws AnalysisException { + return resolveColumnRef(colName, false); + } + + private TupleDescriptor resolveColumnRef(String colName, boolean requestFromChild) throws AnalysisException { TupleDescriptor result = null; - for (TupleDescriptor desc : tupleByAlias.values()) { + for (Pair p : tupleByAlias.values()) { + if (p.first && requestFromChild) { + continue; + } + TupleDescriptor desc = p.second; if (!isVisible(desc.getId())) { continue; } 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 cf7b459005b1b2..b16130c237a532 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 @@ -200,7 +200,7 @@ public void analyze(Analyzer analyzer) throws AnalysisException, UserException { } //TODO(chenhao16): fix TableName in Db.Table style // name.analyze(analyzer); - desc = analyzer.registerTableRef(this); + desc = analyzer.registerTableRef(this, true); isAnalyzed = true; // true now that we have assigned desc // For constant selects we materialize its exprs into a tuple. diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/GroupByClauseTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/GroupByClauseTest.java index 09208b307a6ead..d294be5505d7cb 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/GroupByClauseTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/GroupByClauseTest.java @@ -18,6 +18,7 @@ package org.apache.doris.analysis; import org.apache.doris.common.AnalysisException; +import org.apache.doris.common.Pair; import org.apache.doris.datasource.InternalCatalog; import com.google.common.collect.ArrayListMultimap; @@ -46,10 +47,10 @@ public void setUp() throws AnalysisException { try { Field f = analyzer.getClass().getDeclaredField("tupleByAlias"); f.setAccessible(true); - Multimap tupleByAlias = ArrayListMultimap.create(); + Multimap> tupleByAlias = ArrayListMultimap.create(); TupleDescriptor td = new TupleDescriptor(new TupleId(0)); td.setTable(analyzerBase.getTableOrAnalysisException(new TableName(internalCtl, "testdb", "t"))); - tupleByAlias.put("testdb.t", td); + tupleByAlias.put("testdb.t", Pair.of(false, td)); f.set(analyzer, tupleByAlias); } catch (NoSuchFieldException e) { e.printStackTrace(); diff --git a/regression-test/data/query_p0/subquery/test_subquery.out b/regression-test/data/query_p0/subquery/test_subquery.out index b42216c62d7a9f..c03006700292c8 100644 --- a/regression-test/data/query_p0/subquery/test_subquery.out +++ b/regression-test/data/query_p0/subquery/test_subquery.out @@ -36,3 +36,8 @@ true 9 1991 -2147483647 11011902 -654.654 true 1991-08-11 1989-03-21T13:11 wangj -- !sql8 -- +-- !sql_same_alias_in_subquery -- +1001 11011902 +1001 11011903 +1002 11011905 + diff --git a/regression-test/suites/query_p0/subquery/test_subquery.groovy b/regression-test/suites/query_p0/subquery/test_subquery.groovy index d22aada105cb54..d59f0aef760935 100644 --- a/regression-test/suites/query_p0/subquery/test_subquery.groovy +++ b/regression-test/suites/query_p0/subquery/test_subquery.groovy @@ -54,4 +54,28 @@ suite("test_subquery") { select * from (select k1, -1 as c from test_query_db.test union all select k1, -2 as c from test_query_db.baseall) t where t.c > 0; """ + + qt_sql_same_alias_in_subquery """ + SELECT + k3, k4 + FROM + test_query_db.test + WHERE + EXISTS( SELECT + d.* + FROM + (SELECT + k1 AS _1234, SUM(k2) + FROM + test_query_db.`test` d + GROUP BY _1234) d + LEFT JOIN + (SELECT + k1 AS _1234, + SUM(k2) + FROM + test_query_db.`test` + GROUP BY _1234) temp ON d._1234 = temp._1234) + ORDER BY k3, k4 + """ } \ No newline at end of file