You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by ya...@apache.org on 2021/07/15 02:55:25 UTC

[incubator-doris] branch master updated: [Bug-Fix] Fix bug that show view report "Unresolved table reference" error (#6184)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 7c34dbb  [Bug-Fix] Fix bug that show view report "Unresolved table reference" error (#6184)
7c34dbb is described below

commit 7c34dbbc5b5d155e08ee912a0a18dff3bfd63901
Author: xy720 <22...@users.noreply.github.com>
AuthorDate: Thu Jul 15 10:55:15 2021 +0800

    [Bug-Fix] Fix bug that show view report "Unresolved table reference" error (#6184)
---
 .../Data Manipulation/SHOW STREAM LOAD.md          |  10 +-
 .../Data Manipulation/SHOW STREAM LOAD.md          |  10 +-
 .../java/org/apache/doris/analysis/QueryStmt.java  |   6 +-
 .../java/org/apache/doris/analysis/SelectStmt.java |  23 +-
 .../apache/doris/analysis/SetOperationStmt.java    |   6 +-
 .../org/apache/doris/analysis/ShowViewStmt.java    |   8 +-
 .../java/org/apache/doris/analysis/WithClause.java |   4 +-
 .../org/apache/doris/analysis/SelectStmtTest.java  |  15 +-
 .../apache/doris/analysis/ShowViewStmtTest.java    | 238 +++++++++++++++++----
 .../java/org/apache/doris/utframe/DorisAssert.java |  14 ++
 10 files changed, 255 insertions(+), 79 deletions(-)

diff --git a/docs/en/sql-reference/sql-statements/Data Manipulation/SHOW STREAM LOAD.md b/docs/en/sql-reference/sql-statements/Data Manipulation/SHOW STREAM LOAD.md
index fc870e7..b2704e3 100644
--- a/docs/en/sql-reference/sql-statements/Data Manipulation/SHOW STREAM LOAD.md	
+++ b/docs/en/sql-reference/sql-statements/Data Manipulation/SHOW STREAM LOAD.md	
@@ -57,12 +57,12 @@ SHOW STREAM LOAD FROM example_db WHERE LABEL LIKE "2014_01_02" LIMIT 10;
 3. Show the STREAM LOAD task of the specified db, specify label as "load_example_db_20140102"
 SHOW STREAM LOAD FROM example_db WHERE LABEL = "load_example_db_20140102";
 
-4. Show the STREAM LOAD task of the specified db, specify status as "success", and sort it in descending order by LoadStartTime
-SHOW STREAM LOAD FROM example_db WHERE STATUS = "success" ORDER BY LoadStartTime DESC;
+4. Show the STREAM LOAD task of the specified db, specify status as "success", and sort it in descending order by StartTime
+SHOW STREAM LOAD FROM example_db WHERE STATUS = "success" ORDER BY StartTime DESC;
 
-5. Show the STREAM LOAD task of the specified dB and sort it in descending order by LoadStartTime, and display 10 query results starting with offset 5
-SHOW STREAM LOAD FROM example_db ORDER BY LoadStartTime DESC limit 5,10;
-SHOW STREAM LOAD FROM example_db ORDER BY LoadStartTime DESC limit 10 offset 5;
+5. Show the STREAM LOAD task of the specified dB and sort it in descending order by StartTime, and display 10 query results starting with offset 5
+SHOW STREAM LOAD FROM example_db ORDER BY StartTime DESC limit 5,10;
+SHOW STREAM LOAD FROM example_db ORDER BY StartTime DESC limit 10 offset 5;
 
 ## keyword
 SHOW,STREAM LOAD
diff --git a/docs/zh-CN/sql-reference/sql-statements/Data Manipulation/SHOW STREAM LOAD.md b/docs/zh-CN/sql-reference/sql-statements/Data Manipulation/SHOW STREAM LOAD.md
index ec9f570..53f077d 100644
--- a/docs/zh-CN/sql-reference/sql-statements/Data Manipulation/SHOW STREAM LOAD.md	
+++ b/docs/zh-CN/sql-reference/sql-statements/Data Manipulation/SHOW STREAM LOAD.md	
@@ -57,12 +57,12 @@ under the License.
     3. 展示指定 db 的Stream Load任务,指定 label 为 "load_example_db_20140102"
         SHOW STREAM LOAD FROM example_db WHERE LABEL = "load_example_db_20140102";
         
-    4. 展示指定 db 的Stream Load任务,指定 status 为 "success", 并按 LoadStartTime 降序排序
-        SHOW STREAM LOAD FROM example_db WHERE STATUS = "success" ORDER BY LoadStartTime DESC;
+    4. 展示指定 db 的Stream Load任务,指定 status 为 "success", 并按 StartTime 降序排序
+        SHOW STREAM LOAD FROM example_db WHERE STATUS = "success" ORDER BY StartTime DESC;
         
-    5. 展示指定 db 的导入任务 并按 LoadStartTime 降序排序,并从偏移量5开始显示10条查询结果
-        SHOW STREAM LOAD FROM example_db ORDER BY LoadStartTime DESC limit 5,10;
-        SHOW STREAM LOAD FROM example_db ORDER BY LoadStartTime DESC limit 10 offset 5;
+    5. 展示指定 db 的导入任务 并按 StartTime 降序排序,并从偏移量5开始显示10条查询结果
+        SHOW STREAM LOAD FROM example_db ORDER BY StartTime DESC limit 5,10;
+        SHOW STREAM LOAD FROM example_db ORDER BY StartTime DESC limit 10 offset 5;
 
 ## keyword
     SHOW,STREAM LOAD
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 3460cd5..15bc170 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
@@ -429,9 +429,9 @@ public abstract class QueryStmt extends StatementBase {
         }
     }
 
-    public void getWithClauseTableRefs(List<TableRef> tblRefs, Set<String> parentViewNameSet) {
+    public void getWithClauseTableRefs(Analyzer analyzer, List<TableRef> tblRefs, Set<String> parentViewNameSet) {
         if (withClause_ != null) {
-            withClause_.getTableRefs(tblRefs, parentViewNameSet);
+            withClause_.getTableRefs(analyzer, tblRefs, parentViewNameSet);
         }
     }
 
@@ -446,7 +446,7 @@ public abstract class QueryStmt extends StatementBase {
 
     // get TableRefs in this query, including physical TableRefs of this statement and
     // nested statements of inline views and with_Clause.
-    public abstract void getTableRefs(List<TableRef> tblRefs, Set<String> parentViewNameSet);
+    public abstract void getTableRefs(Analyzer analyzer, List<TableRef> tblRefs, Set<String> parentViewNameSet);
 
     /**
      * UnionStmt and SelectStmt have different implementations.
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
index da37283..05569a7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
@@ -324,17 +324,22 @@ public class SelectStmt extends QueryStmt {
     }
 
     @Override
-    public void getTableRefs(List<TableRef> tblRefs, Set<String> parentViewNameSet) {
-        getWithClauseTableRefs(tblRefs, parentViewNameSet);
+    public void getTableRefs(Analyzer analyzer, List<TableRef> tblRefs, Set<String> parentViewNameSet) {
+        getWithClauseTableRefs(analyzer, tblRefs, parentViewNameSet);
         for (TableRef tblRef : fromClause_) {
-            if (tblRef instanceof InlineViewRef) {
-                QueryStmt inlineStmt = ((InlineViewRef) tblRef).getViewStmt();
-                inlineStmt.getTableRefs(tblRefs, parentViewNameSet);
-            } else {
-                if (isViewTableRef(tblRef.getName().toString(), parentViewNameSet)) {
-                    continue;
+            try {
+                TableRef tmpTblRef = analyzer.resolveTableRef(tblRef);
+                if (tmpTblRef instanceof InlineViewRef) {
+                    QueryStmt inlineStmt = ((InlineViewRef) tmpTblRef).getViewStmt();
+                    inlineStmt.getTableRefs(analyzer, tblRefs, parentViewNameSet);
+                } else {
+                    if (isViewTableRef(tmpTblRef.getName().toString(), parentViewNameSet)) {
+                        continue;
+                    }
+                    tblRefs.add(tmpTblRef);
                 }
-                tblRefs.add(tblRef);
+            } catch (AnalysisException e) {
+                // This table may have been dropped, ignore it.
             }
         }
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SetOperationStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SetOperationStmt.java
index 194cc1e..a0908fb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SetOperationStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SetOperationStmt.java
@@ -180,10 +180,10 @@ public class SetOperationStmt extends QueryStmt {
     }
 
     @Override
-    public void getTableRefs(List<TableRef> tblRefs, Set<String> parentViewNameSet) {
-        getWithClauseTableRefs(tblRefs, parentViewNameSet);
+    public void getTableRefs(Analyzer analyzer, List<TableRef> tblRefs, Set<String> parentViewNameSet) {
+        getWithClauseTableRefs(analyzer, tblRefs, parentViewNameSet);
         for (SetOperand op : operands) {
-            op.getQueryStmt().getTableRefs(tblRefs, parentViewNameSet);
+            op.getQueryStmt().getTableRefs(analyzer, tblRefs, parentViewNameSet);
         }
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowViewStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowViewStmt.java
index e7acf6c..d43f008 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowViewStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowViewStmt.java
@@ -114,9 +114,9 @@ public class ShowViewStmt extends ShowStmt {
             View view = (View) table;
             List<TableRef> tblRefs = Lists.newArrayList();
             // get table refs instead of get tables because it don't need to check table's validity
-            getTableRefs(view, tblRefs);
+            getTableRefs(analyzer, view, tblRefs);
             for (TableRef tblRef : tblRefs) {
-                tblRef.analyze(analyzer);
+                tblRef.getName().analyze(analyzer);
                 if (tblRef.getName().equals(tbl)) {
                     matchViews.add(view);
                 }
@@ -124,10 +124,10 @@ public class ShowViewStmt extends ShowStmt {
         }
     }
 
-    private void getTableRefs(View view, List<TableRef> tblRefs) {
+    private void getTableRefs(Analyzer analyzer, View view, List<TableRef> tblRefs) {
         Set<String> parentViewNameSet = Sets.newHashSet();
         QueryStmt queryStmt = view.getQueryStmt();
-        queryStmt.getTableRefs(tblRefs, parentViewNameSet);
+        queryStmt.getTableRefs(analyzer, tblRefs, parentViewNameSet);
     }
 
     @Override
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/WithClause.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/WithClause.java
index 6e90b8e..57710eb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/WithClause.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/WithClause.java
@@ -113,11 +113,11 @@ public class WithClause implements ParseNode {
         }
     }
 
-    public void getTableRefs(List<TableRef> tblRefs, Set<String> parentViewNameSet) {
+    public void getTableRefs(Analyzer analyzer, List<TableRef> tblRefs, Set<String> parentViewNameSet) {
         for (View view : views_) {
             QueryStmt stmt = view.getQueryStmt();
             parentViewNameSet.add(view.getName());
-            stmt.getTableRefs(tblRefs, parentViewNameSet);
+            stmt.getTableRefs(analyzer, tblRefs, parentViewNameSet);
         }
     }
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/SelectStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/SelectStmtTest.java
index 17b107c..ddc4771 100755
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/SelectStmtTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/SelectStmtTest.java
@@ -25,16 +25,9 @@ import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.qe.VariableMgr;
 import org.apache.doris.utframe.DorisAssert;
 import org.apache.doris.utframe.UtFrameUtils;
-
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
-import java.util.List;
-import java.util.Set;
-import java.util.UUID;
-
-import mockit.Mock;
-import mockit.MockUp;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -42,6 +35,12 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+import mockit.Mock;
+import mockit.MockUp;
+
 public class SelectStmtTest {
     private static String runningDir = "fe/mocked/DemoTest/" + UUID.randomUUID().toString() + "/";
     private static DorisAssert dorisAssert;
@@ -581,7 +580,7 @@ public class SelectStmtTest {
         QueryStmt stmt = (QueryStmt) UtFrameUtils.parseAndAnalyzeStmt(sql, ctx);
         List<TableRef> tblRefs = Lists.newArrayList();
         Set<String> parentViewNameSet = Sets.newHashSet();
-        stmt.getTableRefs(tblRefs, parentViewNameSet);
+        stmt.getTableRefs(new Analyzer(ctx.getCatalog(), ctx), tblRefs, parentViewNameSet);
 
         Assert.assertEquals(2, tblRefs.size());
         Assert.assertEquals("table1", tblRefs.get(0).getName().getTbl());
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowViewStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowViewStmtTest.java
index 3a521f6..479727d 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowViewStmtTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowViewStmtTest.java
@@ -1,80 +1,238 @@
 package org.apache.doris.analysis;
 
-import org.apache.doris.catalog.Catalog;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.util.SqlParserUtils;
-import org.apache.doris.mysql.privilege.MockedAuth;
-import org.apache.doris.mysql.privilege.PaloAuth;
 import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.ShowExecutor;
+import org.apache.doris.qe.ShowResultSet;
+import org.apache.doris.utframe.DorisAssert;
+import org.apache.doris.utframe.UtFrameUtils;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
+import org.junit.AfterClass;
 import org.junit.Assert;
-import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 import java.io.StringReader;
 import java.util.List;
 import java.util.Set;
-import mockit.Expectations;
-import mockit.Mocked;
+import java.util.UUID;
 
 public class ShowViewStmtTest {
-    private Analyzer analyzer;
-    private Catalog catalog;
-
-    @Mocked
-    private PaloAuth auth;
-    @Mocked
-    private ConnectContext ctx;
-
-    @Before
-    public void setUp() {
-        analyzer = AccessTestUtil.fetchAdminAnalyzer(true);
-        catalog = AccessTestUtil.fetchAdminCatalog();
-        MockedAuth.mockedAuth(auth);
-        MockedAuth.mockedConnectContext(ctx, "root", "192.168.1.1");
+    private static String runningDir = "fe/mocked/ShowViewTest/" + UUID.randomUUID().toString() + "/";
+    private static DorisAssert dorisAssert;
+
+    @AfterClass
+    public static void tearDown() throws Exception {
+        UtFrameUtils.cleanDorisFeDir(runningDir);
+    }
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        UtFrameUtils.createMinDorisCluster(runningDir);
+        String testTbl1 = "CREATE TABLE `test1` (\n" +
+                "  `a` int(11) NOT NULL COMMENT \"\",\n" +
+                "  `b` int(11) NOT NULL COMMENT \"\"\n" +
+                ") ENGINE=OLAP\n" +
+                "UNIQUE KEY(`a`)\n" +
+                "COMMENT \"OLAP\"\n" +
+                "DISTRIBUTED BY HASH(`a`) BUCKETS 8\n" +
+                "PROPERTIES (\n" +
+                "\"replication_num\" = \"1\",\n" +
+                "\"in_memory\" = \"false\",\n" +
+                "\"storage_format\" = \"V2\"\n" +
+                ");";
+        String testTbl2 = "CREATE TABLE `test2` (\n" +
+                "  `c` int(11) NOT NULL COMMENT \"\",\n" +
+                "  `d` int(11) NOT NULL COMMENT \"\"\n" +
+                ") ENGINE=OLAP\n" +
+                "UNIQUE KEY(`c`)\n" +
+                "COMMENT \"OLAP\"\n" +
+                "DISTRIBUTED BY HASH(`c`) BUCKETS 8\n" +
+                "PROPERTIES (\n" +
+                "\"replication_num\" = \"1\",\n" +
+                "\"in_memory\" = \"false\",\n" +
+                "\"storage_format\" = \"V2\"\n" +
+                ");";
+        String testTbl3 = "CREATE TABLE `test3` (\n" +
+                "  `e` int(11) NOT NULL COMMENT \"\",\n" +
+                "  `f` int(11) NOT NULL COMMENT \"\"\n" +
+                ") ENGINE=OLAP\n" +
+                "UNIQUE KEY(`e`)\n" +
+                "COMMENT \"OLAP\"\n" +
+                "DISTRIBUTED BY HASH(`e`) BUCKETS 8\n" +
+                "PROPERTIES (\n" +
+                "\"replication_num\" = \"1\",\n" +
+                "\"in_memory\" = \"false\",\n" +
+                "\"storage_format\" = \"V2\"\n" +
+                ");";
+
+        dorisAssert = new DorisAssert();
+        dorisAssert.withDatabase("testDb").useDatabase("testDb");
+        dorisAssert.withTable(testTbl1)
+                   .withTable(testTbl2)
+                   .withTable(testTbl3);
     }
 
     @Test
-    public void testNormal() throws UserException {
-        new Expectations(catalog) {
-            {
-                Catalog.getCurrentCatalog();
-                result = catalog;
-            }
-        };
-
-        ShowViewStmt stmt = new ShowViewStmt("", new TableName("testDb", "testTbl"));
-        stmt.analyze(analyzer);
-        Assert.assertEquals("SHOW VIEW FROM `testCluster:testDb`.`testTbl`", stmt.toString());
-        Assert.assertEquals("testCluster:testDb", stmt.getDb());
-        Assert.assertEquals("testTbl", stmt.getTbl());
+    public void testNormal() throws Exception {
+        ConnectContext ctx = UtFrameUtils.createDefaultCtx();
+        ShowViewStmt stmt = new ShowViewStmt("", new TableName("testDb", "test1"));
+        stmt.analyze(new Analyzer(ctx.getCatalog(), ctx));
+        Assert.assertEquals("SHOW VIEW FROM `default_cluster:testDb`.`test1`", stmt.toString());
+        Assert.assertEquals("default_cluster:testDb", stmt.getDb());
+        Assert.assertEquals("test1", stmt.getTbl());
         Assert.assertEquals(2, stmt.getMetaData().getColumnCount());
         Assert.assertEquals("View", stmt.getMetaData().getColumn(0).getName());
         Assert.assertEquals("Create View", stmt.getMetaData().getColumn(1).getName());
     }
 
     @Test(expected = UserException.class)
-    public void testNoDb() throws UserException {
+    public void testNoDb() throws Exception {
+        ConnectContext ctx = UtFrameUtils.createDefaultCtx();
         ShowViewStmt stmt = new ShowViewStmt("", new TableName("", "testTbl"));
-        stmt.analyze(analyzer);
+        stmt.analyze(new Analyzer(ctx.getCatalog(), ctx));
         Assert.fail();
     }
 
     @Test
+    public void testShowView() throws Exception {
+        ConnectContext ctx = UtFrameUtils.createDefaultCtx();
+        String testView1 = "CREATE VIEW `view1` as \n" +
+                "SELECT a, b FROM test1;";
+        dorisAssert.withView(testView1);
+
+        ShowViewStmt stmt = new ShowViewStmt("", new TableName("testDb", "test1"));
+        stmt.analyze(new Analyzer(ctx.getCatalog(), ctx));
+        ShowExecutor executor = new ShowExecutor(ctx, stmt);
+        ShowResultSet resultSet = executor.execute();
+        System.out.println(resultSet.getResultRows());
+        Assert.assertEquals(1, resultSet.getResultRows().size());
+        Assert.assertTrue(resultSet.next());
+        Assert.assertEquals("view1", resultSet.getString(0));
+        Assert.assertFalse(resultSet.next());
+
+        dorisAssert.dropView("view1");
+    }
+
+    @Test
+    public void testShowViewWithJoin() throws Exception {
+        ConnectContext ctx = UtFrameUtils.createDefaultCtx();
+        String testView2 = "CREATE VIEW `view2` as \n" +
+                "SELECT a, c FROM test1 \n" +
+                "LEFT OUTER JOIN test2 \n" +
+                "ON test1.a = test2.c;";
+        dorisAssert.withView(testView2);
+
+        ShowViewStmt stmt = new ShowViewStmt("", new TableName("testDb", "test1"));
+        stmt.analyze(new Analyzer(ctx.getCatalog(), ctx));
+        ShowExecutor executor = new ShowExecutor(ctx, stmt);
+        ShowResultSet resultSet = executor.execute();
+        System.out.println(resultSet.getResultRows());
+        Assert.assertEquals(1, resultSet.getResultRows().size());
+        Assert.assertTrue(resultSet.next());
+        Assert.assertEquals("view2", resultSet.getString(0));
+        Assert.assertFalse(resultSet.next());
+
+        stmt = new ShowViewStmt("", new TableName("testDb", "test2"));
+        stmt.analyze(new Analyzer(ctx.getCatalog(), ctx));
+        executor = new ShowExecutor(ctx, stmt);
+        resultSet = executor.execute();
+        System.out.println(resultSet.getResultRows());
+        Assert.assertEquals(1, resultSet.getResultRows().size());
+        Assert.assertTrue(resultSet.next());
+        Assert.assertEquals("view2", resultSet.getString(0));
+        Assert.assertFalse(resultSet.next());
+
+        dorisAssert.dropView("view2");
+    }
+
+    @Test
+    public void testShowViewWithNestedSqlView() throws Exception {
+        ConnectContext ctx = UtFrameUtils.createDefaultCtx();
+        String testView3 = "CREATE VIEW `view3` as \n" +
+                "SELECT a, d FROM test1 \n" +
+                "LEFT OUTER JOIN \n" +
+                "(SELECT d, e FROM test3 LEFT OUTER JOIN test2 ON test3.e = test2.c) test4 \n" +
+                "ON test1.a = test4.e;";
+        dorisAssert.withView(testView3);
+
+        ShowViewStmt stmt = new ShowViewStmt("", new TableName("testDb", "test1"));
+        stmt.analyze(new Analyzer(ctx.getCatalog(), ctx));
+        ShowExecutor executor = new ShowExecutor(ctx, stmt);
+        ShowResultSet resultSet = executor.execute();
+        System.out.println(resultSet.getResultRows());
+        Assert.assertEquals(1, resultSet.getResultRows().size());
+        Assert.assertTrue(resultSet.next());
+        Assert.assertEquals("view3", resultSet.getString(0));
+        Assert.assertFalse(resultSet.next());
+
+        stmt = new ShowViewStmt("", new TableName("testDb", "test2"));
+        stmt.analyze(new Analyzer(ctx.getCatalog(), ctx));
+        executor = new ShowExecutor(ctx, stmt);
+        resultSet = executor.execute();
+        System.out.println(resultSet.getResultRows());
+        Assert.assertEquals(1, resultSet.getResultRows().size());
+        Assert.assertTrue(resultSet.next());
+        Assert.assertEquals("view3", resultSet.getString(0));
+        Assert.assertFalse(resultSet.next());
+
+        stmt = new ShowViewStmt("", new TableName("testDb", "test3"));
+        stmt.analyze(new Analyzer(ctx.getCatalog(), ctx));
+        executor = new ShowExecutor(ctx, stmt);
+        resultSet = executor.execute();
+        System.out.println(resultSet.getResultRows());
+        Assert.assertEquals(1, resultSet.getResultRows().size());
+        Assert.assertTrue(resultSet.next());
+        Assert.assertEquals("view3", resultSet.getString(0));
+        Assert.assertFalse(resultSet.next());
+
+        dorisAssert.dropView("view3");
+    }
+
+    @Test
+    public void testShowViewWithNestedView() throws Exception {
+        ConnectContext ctx = UtFrameUtils.createDefaultCtx();
+        String testView4 = "CREATE VIEW `view4` as \n" +
+                "SELECT a, b FROM test1;";
+        String testView5 = "CREATE VIEW `view5` as \n" +
+                "SELECT c FROM test2 \n" +
+                "LEFT OUTER JOIN view4 \n" +
+                "ON test2.c = view4.a;";
+        dorisAssert.withView(testView4);
+        dorisAssert.withView(testView5);
+
+        ShowViewStmt stmt = new ShowViewStmt("", new TableName("testDb", "test1"));
+        stmt.analyze(new Analyzer(ctx.getCatalog(), ctx));
+        ShowExecutor executor = new ShowExecutor(ctx, stmt);
+        ShowResultSet resultSet = executor.execute();
+        System.out.println(resultSet.getResultRows());
+        Assert.assertEquals(2, resultSet.getResultRows().size());
+        Assert.assertTrue(resultSet.next());
+        Assert.assertEquals("view4", resultSet.getString(0));
+        Assert.assertTrue(resultSet.next());
+        Assert.assertEquals("view5", resultSet.getString(0));
+
+        dorisAssert.dropView("view4")
+                   .dropView("view5");
+    }
+
+    @Test
     public void testGetTableRefs() throws Exception {
-        String sql = "with w as (select a from db1.test1) " +
-                "select b, c from db1.test2 " +
+        ConnectContext ctx = UtFrameUtils.createDefaultCtx();
+        String sql = "with w as (select a from testDb.test1) " +
+                "select c, d from testDb.test2 " +
                 "left outer join " +
-                "(select d from db1.test3 join w on db1.test3.e = w.a) test4 " +
-                "on test1.f = test4.d";
+                "(select e from testDb.test3 join w on testDb.test3.e = w.a) test4 " +
+                "on test1.b = test4.d";
         SqlScanner input = new SqlScanner(new StringReader(sql));
         SqlParser parser = new SqlParser(input);
         QueryStmt queryStmt = (QueryStmt) SqlParserUtils.getFirstStmt(parser);
         List<TableRef> tblRefs = Lists.newArrayList();
         Set<String> parentViewNameSet = Sets.newHashSet();
-        queryStmt.getTableRefs(tblRefs, parentViewNameSet);
+        queryStmt.getTableRefs(new Analyzer(ctx.getCatalog(), ctx), tblRefs, parentViewNameSet);
 
         Assert.assertEquals(3, tblRefs.size());
         Assert.assertEquals("test1", tblRefs.get(0).getName().getTbl());
diff --git a/fe/fe-core/src/test/java/org/apache/doris/utframe/DorisAssert.java b/fe/fe-core/src/test/java/org/apache/doris/utframe/DorisAssert.java
index 91de909..758a81e 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/utframe/DorisAssert.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/utframe/DorisAssert.java
@@ -22,6 +22,7 @@ import org.apache.doris.analysis.AlterTableStmt;
 import org.apache.doris.analysis.CreateDbStmt;
 import org.apache.doris.analysis.CreateMaterializedViewStmt;
 import org.apache.doris.analysis.CreateTableStmt;
+import org.apache.doris.analysis.CreateViewStmt;
 import org.apache.doris.analysis.DropTableStmt;
 import org.apache.doris.analysis.ExplainOptions;
 import org.apache.doris.analysis.SqlParser;
@@ -93,6 +94,19 @@ public class DorisAssert {
         return this;
     }
 
+    public DorisAssert withView(String sql) throws Exception {
+        CreateViewStmt createViewStmt = (CreateViewStmt) UtFrameUtils.parseAndAnalyzeStmt(sql, ctx);
+        Catalog.getCurrentCatalog().createView(createViewStmt);
+        return this;
+    }
+
+    public DorisAssert dropView(String tableName) throws Exception {
+        DropTableStmt dropTableStmt =
+                (DropTableStmt) UtFrameUtils.parseAndAnalyzeStmt("drop view " + tableName + ";", ctx);
+        Catalog.getCurrentCatalog().dropTable(dropTableStmt);
+        return this;
+    }
+
     // Add materialized view to the schema
     public DorisAssert withMaterializedView(String sql) throws Exception {
         CreateMaterializedViewStmt createMaterializedViewStmt =

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