Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 34 additions & 11 deletions fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> uniqueTableAliasSet = Sets.newHashSet();
private final Multimap<String, TupleDescriptor> tupleByAlias = ArrayListMultimap.create();

// alias name -> <from child, tupleDesc>
private final Multimap<String, Pair<Boolean, TupleDescriptor>> tupleByAlias = ArrayListMultimap.create();

// NOTE: Alias of column is case ignorance
// map from lowercase table alias to descriptor.
Expand Down Expand Up @@ -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
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -829,7 +835,7 @@ public ExprRewriter getMVExprRewriter() {
* @return null if not registered.
*/
public Collection<TupleDescriptor> 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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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<Boolean, TupleDescriptor> 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,
Expand All @@ -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<Boolean, TupleDescriptor> p : tupleByAlias.values()) {
if (p.first && requestFromChild) {
continue;
}
TupleDescriptor desc = p.second;
if (!isVisible(desc.getId())) {
continue;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -46,10 +47,10 @@ public void setUp() throws AnalysisException {
try {
Field f = analyzer.getClass().getDeclaredField("tupleByAlias");
f.setAccessible(true);
Multimap<String, TupleDescriptor> tupleByAlias = ArrayListMultimap.create();
Multimap<String, Pair<Boolean, TupleDescriptor>> 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();
Expand Down
5 changes: 5 additions & 0 deletions regression-test/data/query_p0/subquery/test_subquery.out
Original file line number Diff line number Diff line change
Expand Up @@ -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

24 changes: 24 additions & 0 deletions regression-test/suites/query_p0/subquery/test_subquery.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -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
"""
}