This is an automated email from the ASF dual-hosted git repository.

morrysnow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 20d26397aa [fix](planner) forbid inline view but not the subquery 
resolve from parent tuples (#18032)
20d26397aa is described below

commit 20d26397aa9ea701a9b90b6217447d9678f9dcf5
Author: morrySnow <101034200+morrys...@users.noreply.github.com>
AuthorDate: Thu Mar 23 16:11:04 2023 +0800

    [fix](planner) forbid inline view but not the subquery resolve from parent 
tuples (#18032)
    
    in PR #17813 , we want to forbid bind slot on brother's column
    howerver the fix is not in correct way.
    the correct way to do that is forbid subquery register itself in parent's 
analyzer.
    
    This reverts commit b91a3b5a72520105638dad1079b71a05f02c10a0.
---
 .../java/org/apache/doris/analysis/Analyzer.java   | 49 +++++++---------------
 .../org/apache/doris/analysis/InlineViewRef.java   |  2 +-
 .../apache/doris/analysis/GroupByClauseTest.java   |  5 +--
 .../data/query_p0/subquery/test_subquery.out       |  5 ---
 .../suites/query_p0/subquery/test_subquery.groovy  | 24 -----------
 5 files changed, 17 insertions(+), 68 deletions(-)

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 fd0d424d90..425249ed01 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,9 +113,7 @@ 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();
-
-    // alias name -> <from child, tupleDesc>
-    private final Multimap<String, Pair<Boolean, TupleDescriptor>> 
tupleByAlias = ArrayListMultimap.create();
+    private final Multimap<String, TupleDescriptor> tupleByAlias = 
ArrayListMultimap.create();
 
     // NOTE: Alias of column is case ignorance
     // map from lowercase table alias to descriptor.
@@ -157,6 +155,7 @@ public class Analyzer {
 
     // Flag indicating if this analyzer instance belongs to a subquery.
     private boolean isSubquery = false;
+    private boolean isFirstScopeInSubquery = false;
     // Flag indicating if this analyzer instance belongs to an inlineview.
     private boolean isInlineView = false;
 
@@ -181,6 +180,7 @@ public class Analyzer {
 
     public void setIsSubquery() {
         isSubquery = true;
+        isFirstScopeInSubquery = true;
         globalState.containsSubquery = true;
     }
 
@@ -626,14 +626,10 @@ public class Analyzer {
             if (globalState.conjuncts.get(id).substitute(sMap) instanceof 
BoolLiteral) {
                 continue;
             }
-            globalState.conjuncts.put(id, 
globalState.conjuncts.get(id).substitute(sMap));
+            globalState.conjuncts.put(id, (Predicate) 
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
@@ -644,7 +640,7 @@ public class Analyzer {
      * Throws if an existing explicit alias or implicit fully-qualified alias
      * has already been registered for another table ref.
      */
-    public TupleDescriptor registerTableRef(TableRef ref, boolean fromChild) 
throws AnalysisException {
+    public TupleDescriptor registerTableRef(TableRef ref) throws 
AnalysisException {
         String uniqueAlias = ref.getUniqueAlias();
         if (uniqueTableAliasSet.contains(uniqueAlias)) {
             ErrorReport.reportAnalysisException(ErrorCode.ERR_NONUNIQ_TABLE, 
uniqueAlias);
@@ -677,7 +673,7 @@ public class Analyzer {
         for (String alias : aliases) {
             // TODO(zc)
             // aliasMap_.put(alias, result);
-            tupleByAlias.put(alias, Pair.of(fromChild, result));
+            tupleByAlias.put(alias, result);
         }
 
         tableRefMap.put(result.getId(), ref);
@@ -721,7 +717,7 @@ public class Analyzer {
         globalState.descTbl.computeStatAndMemLayout();
         tableRefMap.put(result.getId(), ref);
         for (String alias : tableRef.getAliases()) {
-            tupleByAlias.put(alias, Pair.of(false, result));
+            tupleByAlias.put(alias, result);
         }
         return result;
     }
@@ -835,7 +831,7 @@ public class Analyzer {
      * @return null if not registered.
      */
     public Collection<TupleDescriptor> getDescriptor(TableName name) {
-        return tupleByAlias.get(name.toString()).stream().map(p -> 
p.second).collect(Collectors.toList());
+        return tupleByAlias.get(name.toString());
     }
 
     public TupleDescriptor getTupleDesc(TupleId id) {
@@ -899,12 +895,12 @@ public class Analyzer {
          * This column could not be resolved because doris can only resolved 
the parent column instead of grandpa.
          * The exception to this query like that: Unknown column 'k1' in 'a'
          */
-        if (d == null && hasAncestors() && isSubquery) {
+        if (d == null && hasAncestors() && isSubquery && 
isFirstScopeInSubquery) {
             // analyzer father for subquery
             if (newTblName == null) {
-                d = getParentAnalyzer().resolveColumnRef(colName, true);
+                d = getParentAnalyzer().resolveColumnRef(colName);
             } else {
-                d = getParentAnalyzer().resolveColumnRef(newTblName, colName, 
true);
+                d = getParentAnalyzer().resolveColumnRef(newTblName, colName);
             }
         }
         if (d == null) {
@@ -961,24 +957,15 @@ public class Analyzer {
         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,
-            boolean requestByChild) throws AnalysisException {
+    private TupleDescriptor resolveColumnRef(TableName tblName, String 
colName) throws AnalysisException {
         TupleDescriptor result = null;
         // find table all name
-        for (Pair<Boolean, TupleDescriptor> p : 
tupleByAlias.get(tblName.toString())) {
-            if (p.first && requestByChild) {
-                continue;
-            }
-            TupleDescriptor desc = p.second;
+        for (TupleDescriptor desc : tupleByAlias.get(tblName.toString())) {
             //result = desc;
             if (!colName.equalsIgnoreCase(Column.DELETE_SIGN) && 
!isVisible(desc.getId())) {
                 
ErrorReport.reportAnalysisException(ErrorCode.ERR_ILLEGAL_COLUMN_REFERENCE_ERROR,
@@ -997,16 +984,8 @@ public class Analyzer {
     }
 
     private TupleDescriptor resolveColumnRef(String colName) throws 
AnalysisException {
-        return resolveColumnRef(colName, false);
-    }
-
-    private TupleDescriptor resolveColumnRef(String colName, boolean 
requestFromChild) throws AnalysisException {
         TupleDescriptor result = null;
-        for (Pair<Boolean, TupleDescriptor> p : tupleByAlias.values()) {
-            if (p.first && requestFromChild) {
-                continue;
-            }
-            TupleDescriptor desc = p.second;
+        for (TupleDescriptor desc : tupleByAlias.values()) {
             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 b16130c237..cf7b459005 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 class InlineViewRef extends TableRef {
         }
         //TODO(chenhao16): fix TableName in Db.Table style
         // name.analyze(analyzer);
-        desc = analyzer.registerTableRef(this, true);
+        desc = analyzer.registerTableRef(this);
         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 d294be5505..09208b307a 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,7 +18,6 @@
 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;
@@ -47,10 +46,10 @@ public class GroupByClauseTest {
         try {
             Field f = analyzer.getClass().getDeclaredField("tupleByAlias");
             f.setAccessible(true);
-            Multimap<String, Pair<Boolean, TupleDescriptor>> tupleByAlias = 
ArrayListMultimap.create();
+            Multimap<String, TupleDescriptor> tupleByAlias = 
ArrayListMultimap.create();
             TupleDescriptor td = new TupleDescriptor(new TupleId(0));
             td.setTable(analyzerBase.getTableOrAnalysisException(new 
TableName(internalCtl, "testdb", "t")));
-            tupleByAlias.put("testdb.t", Pair.of(false, td));
+            tupleByAlias.put("testdb.t", 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 c030067002..b42216c62d 100644
--- a/regression-test/data/query_p0/subquery/test_subquery.out
+++ b/regression-test/data/query_p0/subquery/test_subquery.out
@@ -36,8 +36,3 @@ 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 d59f0aef76..d22aada105 100644
--- a/regression-test/suites/query_p0/subquery/test_subquery.groovy
+++ b/regression-test/suites/query_p0/subquery/test_subquery.groovy
@@ -54,28 +54,4 @@ 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


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to