You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by jc...@apache.org on 2019/02/22 19:52:59 UTC

[hive] branch branch-3 updated: HIVE-21301: Show tables statement to include views and materialized views (Jesus Camacho Rodriguez, reviewed by Ashutosh Chauhan)

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

jcamacho pushed a commit to branch branch-3
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/branch-3 by this push:
     new 510da5b  HIVE-21301: Show tables statement to include views and materialized views (Jesus Camacho Rodriguez, reviewed by Ashutosh Chauhan)
510da5b is described below

commit 510da5bd4d9f50cd353517fe6172b566d4a8ebd1
Author: Jesus Camacho Rodriguez <jc...@apache.org>
AuthorDate: Wed Feb 20 18:39:26 2019 -0800

    HIVE-21301: Show tables statement to include views and materialized views (Jesus Camacho Rodriguez, reviewed by Ashutosh Chauhan)
---
 .../org/apache/hadoop/hive/ql/exec/DDLTask.java    | 49 ++++++-----
 .../org/apache/hadoop/hive/ql/metadata/Hive.java   | 12 +++
 .../metadata/formatting/JsonMetaDataFormatter.java | 24 ++++++
 .../ql/metadata/formatting/MetaDataFormatter.java  |  6 ++
 .../metadata/formatting/TextMetaDataFormatter.java | 27 ++++++
 .../hadoop/hive/ql/parse/DDLSemanticAnalyzer.java  | 43 +++++-----
 .../org/apache/hadoop/hive/ql/parse/HiveParser.g   | 12 ++-
 .../apache/hadoop/hive/ql/plan/ShowTablesDesc.java | 49 ++++++++++-
 .../test/queries/clientnegative/show_tables_bad3.q |  1 +
 ql/src/test/queries/clientpositive/show_tables.q   |  7 +-
 .../results/clientnegative/show_tables_bad3.q.out  |  1 +
 .../test/results/clientpositive/create_view.q.out  |  3 +
 .../results/clientpositive/dbtxnmgr_query5.q.out   |  1 +
 .../test/results/clientpositive/show_tables.q.out  | 96 ++++++++++++----------
 14 files changed, 239 insertions(+), 92 deletions(-)

diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
index c072133..5d07b1b 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
@@ -2780,31 +2780,38 @@ public class DDLTask extends Task<DDLWork> implements Serializable {
    */
   private int showTablesOrViews(Hive db, ShowTablesDesc showDesc) throws HiveException {
     // get the tables/views for the desired pattern - populate the output stream
-    List<String> tablesOrViews = null;
-    List<Table> materializedViews = null;
+    List<String> tableNames  = null;
+    List<Table> tableObjects = null;
 
-    String dbName      = showDesc.getDbName();
-    String pattern     = showDesc.getPattern(); // if null, all tables/views are returned
-    String resultsFile = showDesc.getResFile();
-    TableType type     = showDesc.getType(); // null for tables, VIRTUAL_VIEW for views, MATERIALIZED_VIEW for MVs
+    TableType type       = showDesc.getType(); // null for tables, VIRTUAL_VIEW for views, MATERIALIZED_VIEW for MVs
+    String dbName        = showDesc.getDbName();
+    String pattern       = showDesc.getPattern(); // if null, all tables/views are returned
+    TableType typeFilter = showDesc.getTypeFilter();
+    String resultsFile   = showDesc.getResFile();
+    boolean isExtended   = showDesc.isExtended();
 
     if (!db.databaseExists(dbName)) {
       throw new HiveException(ErrorMsg.DATABASE_NOT_EXISTS, dbName);
     }
 
     LOG.debug("pattern: {}", pattern);
+    LOG.debug("typeFilter: {}", typeFilter);
     if (type == null) {
-      tablesOrViews = new ArrayList<>();
-      tablesOrViews.addAll(db.getTablesByType(dbName, pattern, TableType.MANAGED_TABLE));
-      tablesOrViews.addAll(db.getTablesByType(dbName, pattern, TableType.EXTERNAL_TABLE));
-      LOG.debug("Found {} table(s) matching the SHOW TABLES statement.", tablesOrViews.size());
+      if (isExtended) {
+        tableObjects = new ArrayList<>();
+        tableObjects.addAll(db.getTableObjectsByType(dbName, pattern, typeFilter));
+        LOG.debug("Found {} table(s) matching the SHOW EXTENDED TABLES statement.", tableObjects.size());
+      } else {
+        tableNames = db.getTablesByType(dbName, pattern, typeFilter);
+        LOG.debug("Found {} table(s) matching the SHOW TABLES statement.", tableNames.size());
+      }
     } else if (type == TableType.MATERIALIZED_VIEW) {
-      materializedViews = new ArrayList<>();
-      materializedViews.addAll(db.getMaterializedViewObjectsByPattern(dbName, pattern));
-      LOG.debug("Found {} materialized view(s) matching the SHOW MATERIALIZED VIEWS statement.", materializedViews.size());
+      tableObjects = new ArrayList<>();
+      tableObjects.addAll(db.getMaterializedViewObjectsByPattern(dbName, pattern));
+      LOG.debug("Found {} materialized view(s) matching the SHOW MATERIALIZED VIEWS statement.", tableObjects.size());
     } else if (type == TableType.VIRTUAL_VIEW) {
-      tablesOrViews = db.getTablesByType(dbName, pattern, type);
-      LOG.debug("Found {} view(s) matching the SHOW VIEWS statement.", tablesOrViews.size());
+      tableNames = db.getTablesByType(dbName, pattern, type);
+      LOG.debug("Found {} view(s) matching the SHOW VIEWS statement.", tableNames.size());
     } else {
       throw new HiveException("Option not recognized in SHOW TABLES/VIEWS/MATERIALIZED VIEWS");
     }
@@ -2816,12 +2823,16 @@ public class DDLTask extends Task<DDLWork> implements Serializable {
       FileSystem fs = resFile.getFileSystem(conf);
       outStream = fs.create(resFile);
       // Sort by name and print
-      if (tablesOrViews != null) {
-        SortedSet<String> sortedSet = new TreeSet<String>(tablesOrViews);
+      if (tableNames != null) {
+        SortedSet<String> sortedSet = new TreeSet<String>(tableNames);
         formatter.showTables(outStream, sortedSet);
       } else {
-        Collections.sort(materializedViews, Comparator.comparing(Table::getTableName));
-        formatter.showMaterializedViews(outStream, materializedViews);
+        Collections.sort(tableObjects, Comparator.comparing(Table::getTableName));
+        if (isExtended) {
+          formatter.showTablesExtended(outStream, tableObjects);
+        } else {
+          formatter.showMaterializedViews(outStream, tableObjects);
+        }
       }
       outStream.close();
     } catch (Exception e) {
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java b/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java
index d4f824e..08d257d 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java
@@ -1207,6 +1207,18 @@ public class Hive {
   }
 
   /**
+   * Get tables for the specified database that match the provided regex pattern and table type.
+   * @param dbName
+   * @param pattern
+   * @param tableType
+   * @return List of table objects
+   * @throws HiveException
+   */
+  public List<Table> getTableObjectsByType(String dbName, String pattern, TableType tableType) throws HiveException {
+    return getTableObjects(dbName, pattern, tableType);
+  }
+
+  /**
    * Get all materialized view names for the specified database.
    * @param dbName
    * @return List of materialized view table names
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/JsonMetaDataFormatter.java b/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/JsonMetaDataFormatter.java
index 4c4f9c1..014a805 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/JsonMetaDataFormatter.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/JsonMetaDataFormatter.java
@@ -113,6 +113,30 @@ public class JsonMetaDataFormatter implements MetaDataFormatter {
   }
 
   /**
+   * Show a list of tables including table types.
+   */
+  @Override
+  public void showTablesExtended(DataOutputStream out, List<Table> tables)
+      throws HiveException {
+    if (tables.isEmpty()) {
+      // Nothing to do
+      return;
+    }
+
+    MapBuilder builder = MapBuilder.create();
+    ArrayList<Map<String, Object>> res = new ArrayList<Map<String, Object>>();
+    for (Table table : tables) {
+      final String tableName = table.getTableName();
+      final String tableType = table.getTableType().toString();
+      res.add(builder
+          .put("Table Name", tableName)
+          .put("Table Type", tableType)
+          .build());
+    }
+    asJson(out, builder.put("tables", res).build());
+  }
+
+  /**
    * Show a list of materialized views.
    */
   @Override
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/MetaDataFormatter.java b/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/MetaDataFormatter.java
index 936a808..0f53ae4 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/MetaDataFormatter.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/MetaDataFormatter.java
@@ -71,6 +71,12 @@ public interface MetaDataFormatter {
       throws HiveException;
 
   /**
+   * Show a list of tables including table types.
+   */
+  public void showTablesExtended(DataOutputStream out, List<Table> tables)
+      throws HiveException;
+
+  /**
    * Show a list of materialized views.
    */
   public void showMaterializedViews(DataOutputStream out, List<Table> materializedViews)
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/TextMetaDataFormatter.java b/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/TextMetaDataFormatter.java
index dab538f..8498311 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/TextMetaDataFormatter.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/metadata/formatting/TextMetaDataFormatter.java
@@ -133,6 +133,33 @@ class TextMetaDataFormatter implements MetaDataFormatter {
   }
 
   /**
+   * Show a list of tables including table types.
+   */
+  public void showTablesExtended(DataOutputStream out, List<Table> tables)
+      throws HiveException {
+    if (tables.isEmpty()) {
+      // Nothing to do
+      return;
+    }
+
+    try {
+      TextMetaDataTable mdt = new TextMetaDataTable();
+      mdt.addRow("# Table Name", "Table Type");
+      for (Table table : tables) {
+        final String tableName = table.getTableName();
+        final String tableType = table.getTableType().toString();
+        mdt.addRow(tableName, tableType);
+      }
+      // In case the query is served by HiveServer2, don't pad it with spaces,
+      // as HiveServer2 output is consumed by JDBC/ODBC clients.
+      out.write(mdt.renderTable(!SessionState.get().isHiveServerQuery()).getBytes("UTF-8"));
+      out.write(terminator);
+    } catch (IOException e) {
+      throw new HiveException(e);
+    }
+  }
+
+  /**
    * Show a list of materialized views.
    */
   @Override
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
index b14648a..c553529 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
@@ -2620,33 +2620,32 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer {
     ShowTablesDesc showTblsDesc;
     String dbName = SessionState.get().getCurrentDatabase();
     String tableNames = null;
+    TableType tableTypeFilter = null;
+    boolean isExtended = false;
 
-    if (ast.getChildCount() > 3) {
+    if (ast.getChildCount() > 4) {
       throw new SemanticException(ErrorMsg.INVALID_AST_TREE.getMsg(ast.toStringTree()));
     }
 
-    switch (ast.getChildCount()) {
-    case 1: // Uses a pattern
-      tableNames = unescapeSQLString(ast.getChild(0).getText());
-      showTblsDesc = new ShowTablesDesc(ctx.getResFile(), dbName, tableNames);
-      break;
-    case 2: // Specifies a DB
-      assert (ast.getChild(0).getType() == HiveParser.TOK_FROM);
-      dbName = unescapeIdentifier(ast.getChild(1).getText());
-      validateDatabase(dbName);
-      showTblsDesc = new ShowTablesDesc(ctx.getResFile(), dbName);
-      break;
-    case 3: // Uses a pattern and specifies a DB
-      assert (ast.getChild(0).getType() == HiveParser.TOK_FROM);
-      dbName = unescapeIdentifier(ast.getChild(1).getText());
-      tableNames = unescapeSQLString(ast.getChild(2).getText());
-      validateDatabase(dbName);
-      showTblsDesc = new ShowTablesDesc(ctx.getResFile(), dbName, tableNames);
-      break;
-    default: // No pattern or DB
-      showTblsDesc = new ShowTablesDesc(ctx.getResFile(), dbName);
-      break;
+    for (int i = 0; i < ast.getChildCount(); i++) {
+      ASTNode child = (ASTNode) ast.getChild(i);
+      if (child.getType() == HiveParser.TOK_FROM) { // Specifies a DB
+        dbName = unescapeIdentifier(ast.getChild(++i).getText());
+        validateDatabase(dbName);
+      } else if (child.getType() == HiveParser.TOK_TABLE_TYPE) { // Filter on table type
+        String tableType = unescapeIdentifier(child.getChild(0).getText());
+        if (!tableType.equalsIgnoreCase("table_type")) {
+          throw new SemanticException("SHOW TABLES statement only allows equality filter on table_type value");
+        }
+        tableTypeFilter = TableType.valueOf(unescapeSQLString(child.getChild(1).getText()));
+      } else if (child.getType() == HiveParser.KW_EXTENDED) { // Include table type
+        isExtended = true;
+      } else { // Uses a pattern
+        tableNames = unescapeSQLString(child.getText());
+      }
     }
+
+    showTblsDesc = new ShowTablesDesc(ctx.getResFile(), dbName, tableNames, tableTypeFilter, isExtended);
     inputs.add(new ReadEntity(getDatabase(dbName)));
     rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(),
         showTblsDesc)));
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
index f12991f..fad258e 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
@@ -1574,7 +1574,8 @@ showStatement
 @init { pushMsg("show statement", state); }
 @after { popMsg(state); }
     : KW_SHOW (KW_DATABASES|KW_SCHEMAS) (KW_LIKE showStmtIdentifier)? -> ^(TOK_SHOWDATABASES showStmtIdentifier?)
-    | KW_SHOW KW_TABLES ((KW_FROM|KW_IN) db_name=identifier)? (KW_LIKE showStmtIdentifier|showStmtIdentifier)?  -> ^(TOK_SHOWTABLES (TOK_FROM $db_name)? showStmtIdentifier?)
+    | KW_SHOW (isExtended=KW_EXTENDED)? KW_TABLES ((KW_FROM|KW_IN) db_name=identifier)? (filter=showTablesFilterExpr)?
+    -> ^(TOK_SHOWTABLES (TOK_FROM $db_name)? $filter? $isExtended?)
     | KW_SHOW KW_VIEWS ((KW_FROM|KW_IN) db_name=identifier)? (KW_LIKE showStmtIdentifier|showStmtIdentifier)?  -> ^(TOK_SHOWVIEWS (TOK_FROM $db_name)? showStmtIdentifier?)
     | KW_SHOW KW_MATERIALIZED KW_VIEWS ((KW_FROM|KW_IN) db_name=identifier)? (KW_LIKE showStmtIdentifier|showStmtIdentifier)?  -> ^(TOK_SHOWMATERIALIZEDVIEWS (TOK_FROM $db_name)? showStmtIdentifier?)
     | KW_SHOW KW_COLUMNS (KW_FROM|KW_IN) tableName ((KW_FROM|KW_IN) db_name=identifier)? (KW_LIKE showStmtIdentifier|showStmtIdentifier)?
@@ -1605,6 +1606,15 @@ showStatement
       )
     ;
 
+showTablesFilterExpr
+@init { pushMsg("show tables filter expr", state); }
+@after { popMsg(state); }
+    : KW_WHERE identifier EQUAL StringLiteral
+    -> ^(TOK_TABLE_TYPE identifier StringLiteral)
+    | KW_LIKE showStmtIdentifier|showStmtIdentifier
+    -> showStmtIdentifier
+    ;
+
 lockStatement
 @init { pushMsg("lock statement", state); }
 @after { popMsg(state); }
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/ShowTablesDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/ShowTablesDesc.java
index 1c16252..0f7a3cd 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/plan/ShowTablesDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/ShowTablesDesc.java
@@ -39,21 +39,28 @@ public class ShowTablesDesc extends DDLDesc implements Serializable {
   private static final String table = "show";
 
   /**
-   * thrift ddl for the result of show tables.
+   * thrift ddl for the result of show tables and show views.
    */
   private static final String TABLES_VIEWS_SCHEMA = "tab_name#string";
 
   /**
+   * thrift ddl for the result of show extended tables.
+   */
+  private static final String EXTENDED_TABLES_SCHEMA = "tab_name,table_type#string,string";
+
+  /**
    * thrift ddl for the result of show tables.
    */
   private static final String MATERIALIZED_VIEWS_SCHEMA =
       "mv_name,rewrite_enabled,mode#string:string:string";
 
 
+  TableType type;
   String pattern;
+  TableType typeFilter;
   String dbName;
   String resFile;
-  TableType type;
+  boolean isExtended;
 
   public String getTable() {
     return table;
@@ -63,7 +70,7 @@ public class ShowTablesDesc extends DDLDesc implements Serializable {
     if (type != null && type == TableType.MATERIALIZED_VIEW) {
       return MATERIALIZED_VIEWS_SCHEMA;
     }
-    return TABLES_VIEWS_SCHEMA;
+    return isExtended ? EXTENDED_TABLES_SCHEMA : TABLES_VIEWS_SCHEMA;
   }
 
   public ShowTablesDesc() {
@@ -90,10 +97,12 @@ public class ShowTablesDesc extends DDLDesc implements Serializable {
    * @param pattern
    *          names of tables to show
    */
-  public ShowTablesDesc(Path resFile, String dbName, String pattern) {
+  public ShowTablesDesc(Path resFile, String dbName, String pattern, TableType typeFilter, boolean isExtended) {
     this.resFile = resFile.toString();
     this.dbName = dbName;
     this.pattern = pattern;
+    this.typeFilter = typeFilter;
+    this.isExtended = isExtended;
   }
 
   /**
@@ -170,4 +179,36 @@ public class ShowTablesDesc extends DDLDesc implements Serializable {
   public void setDbName(String dbName) {
     this.dbName = dbName;
   }
+
+  /**
+   * @return is extended
+   */
+  @Explain(displayName = "extended", explainLevels = { Level.USER, Level.DEFAULT, Level.EXTENDED }, displayOnlyOnTrue = true)
+  public boolean isExtended() {
+    return isExtended;
+  }
+
+  /**
+   * @param isExtended
+   *          whether extended modifier is enabled
+   */
+  public void setIsExtended(boolean isExtended) {
+    this.isExtended = isExtended;
+  }
+
+  /**
+   * @return table type filter, null if it is not filtered
+   */
+  @Explain(displayName = "table type filter", explainLevels = { Level.USER, Level.DEFAULT, Level.EXTENDED })
+  public TableType getTypeFilter() {
+    return typeFilter;
+  }
+
+  /**
+   * @param typeFilter
+   *          table type filter for show statement
+   */
+  public void setTypeFilter(TableType typeFilter) {
+    this.typeFilter = typeFilter;
+  }
 }
diff --git a/ql/src/test/queries/clientnegative/show_tables_bad3.q b/ql/src/test/queries/clientnegative/show_tables_bad3.q
new file mode 100644
index 0000000..aa93a98
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/show_tables_bad3.q
@@ -0,0 +1 @@
+SHOW TABLES FROM default WHERE `other_column` = 'MANAGED_TABLE';
diff --git a/ql/src/test/queries/clientpositive/show_tables.q b/ql/src/test/queries/clientpositive/show_tables.q
index a6e3837..087d40f 100644
--- a/ql/src/test/queries/clientpositive/show_tables.q
+++ b/ql/src/test/queries/clientpositive/show_tables.q
@@ -17,15 +17,18 @@ USE test_db;
 CREATE TABLE foo_n4(a INT);
 CREATE TABLE bar_n0(a INT);
 CREATE TABLE baz(a INT);
+CREATE VIEW test_view_n100 AS SELECT * FROM foo_n4;
 
 -- SHOW TABLES basic syntax tests
 USE default;
 SHOW TABLES FROM test_db;
-SHOW TABLES FROM default;
+SHOW EXTENDED TABLES FROM test_db;
 SHOW TABLES IN test_db;
-SHOW TABLES IN default;
+SHOW EXTENDED TABLES IN test_db;
 SHOW TABLES IN test_db "test*";
 SHOW TABLES IN test_db LIKE "nomatch";
+SHOW TABLES IN test_db WHERE `table_type` = "MANAGED_TABLE";
+SHOW EXTENDED TABLES IN test_db WHERE `table_type` = "VIRTUAL_VIEW";
 
 -- SHOW TABLE EXTENDED basic syntax tests and wildcard
 SHOW TABLE EXTENDED IN test_db LIKE foo_n4;
diff --git a/ql/src/test/results/clientnegative/show_tables_bad3.q.out b/ql/src/test/results/clientnegative/show_tables_bad3.q.out
new file mode 100644
index 0000000..06a1add
--- /dev/null
+++ b/ql/src/test/results/clientnegative/show_tables_bad3.q.out
@@ -0,0 +1 @@
+FAILED: SemanticException SHOW TABLES statement only allows equality filter on table_type value
diff --git a/ql/src/test/results/clientpositive/create_view.q.out b/ql/src/test/results/clientpositive/create_view.q.out
index f565e76..5cb7755 100644
--- a/ql/src/test/results/clientpositive/create_view.q.out
+++ b/ql/src/test/results/clientpositive/create_view.q.out
@@ -232,6 +232,9 @@ PREHOOK: Input: database:default
 POSTHOOK: query: SHOW TABLES 'view.*'
 POSTHOOK: type: SHOWTABLES
 POSTHOOK: Input: database:default
+view1
+view2
+view3
 PREHOOK: query: SHOW VIEWS 'view.*'
 PREHOOK: type: SHOWVIEWS
 POSTHOOK: query: SHOW VIEWS 'view.*'
diff --git a/ql/src/test/results/clientpositive/dbtxnmgr_query5.q.out b/ql/src/test/results/clientpositive/dbtxnmgr_query5.q.out
index 37ff3ec..ea76a37 100644
--- a/ql/src/test/results/clientpositive/dbtxnmgr_query5.q.out
+++ b/ql/src/test/results/clientpositive/dbtxnmgr_query5.q.out
@@ -43,6 +43,7 @@ POSTHOOK: query: show tables
 POSTHOOK: type: SHOWTABLES
 POSTHOOK: Input: database:foo
 t1_n40
+v1_n3
 PREHOOK: query: describe T1_n40
 PREHOOK: type: DESCTABLE
 PREHOOK: Input: foo@t1_n40
diff --git a/ql/src/test/results/clientpositive/show_tables.q.out b/ql/src/test/results/clientpositive/show_tables.q.out
index e1016aa..18d7c59 100644
--- a/ql/src/test/results/clientpositive/show_tables.q.out
+++ b/ql/src/test/results/clientpositive/show_tables.q.out
@@ -116,6 +116,17 @@ POSTHOOK: query: CREATE TABLE baz(a INT)
 POSTHOOK: type: CREATETABLE
 POSTHOOK: Output: database:test_db
 POSTHOOK: Output: test_db@baz
+PREHOOK: query: CREATE VIEW test_view_n100 AS SELECT * FROM foo_n4
+PREHOOK: type: CREATEVIEW
+PREHOOK: Input: test_db@foo_n4
+PREHOOK: Output: database:test_db
+PREHOOK: Output: test_db@test_view_n100
+POSTHOOK: query: CREATE VIEW test_view_n100 AS SELECT * FROM foo_n4
+POSTHOOK: type: CREATEVIEW
+POSTHOOK: Input: test_db@foo_n4
+POSTHOOK: Output: database:test_db
+POSTHOOK: Output: test_db@test_view_n100
+POSTHOOK: Lineage: test_view_n100.a SIMPLE [(foo_n4)foo_n4.FieldSchema(name:a, type:int, comment:null), ]
 PREHOOK: query: USE default
 PREHOOK: type: SWITCHDATABASE
 PREHOOK: Input: database:default
@@ -131,30 +142,19 @@ POSTHOOK: Input: database:test_db
 bar_n0
 baz
 foo_n4
-PREHOOK: query: SHOW TABLES FROM default
+test_view_n100
+PREHOOK: query: SHOW EXTENDED TABLES FROM test_db
 PREHOOK: type: SHOWTABLES
-PREHOOK: Input: database:default
-POSTHOOK: query: SHOW TABLES FROM default
+PREHOOK: Input: database:test_db
+POSTHOOK: query: SHOW EXTENDED TABLES FROM test_db
 POSTHOOK: type: SHOWTABLES
-POSTHOOK: Input: database:default
-alltypesorc
-alltypesparquet
-cbo_t1
-cbo_t2
-cbo_t3
-lineitem
-part
-shtb_test1_n0
-shtb_test2_n0
-src
-src1
-src_cbo
-src_json
-src_sequencefile
-src_thrift
-srcbucket
-srcbucket2
-srcpart
+POSTHOOK: Input: database:test_db
+# Table Name        	Table Type          
+bar_n0              	MANAGED_TABLE       
+baz                 	MANAGED_TABLE       
+foo_n4              	MANAGED_TABLE       
+test_view_n100      	VIRTUAL_VIEW        
+	 
 PREHOOK: query: SHOW TABLES IN test_db
 PREHOOK: type: SHOWTABLES
 PREHOOK: Input: database:test_db
@@ -164,42 +164,50 @@ POSTHOOK: Input: database:test_db
 bar_n0
 baz
 foo_n4
-PREHOOK: query: SHOW TABLES IN default
+test_view_n100
+PREHOOK: query: SHOW EXTENDED TABLES IN test_db
 PREHOOK: type: SHOWTABLES
-PREHOOK: Input: database:default
-POSTHOOK: query: SHOW TABLES IN default
+PREHOOK: Input: database:test_db
+POSTHOOK: query: SHOW EXTENDED TABLES IN test_db
 POSTHOOK: type: SHOWTABLES
-POSTHOOK: Input: database:default
-alltypesorc
-alltypesparquet
-cbo_t1
-cbo_t2
-cbo_t3
-lineitem
-part
-shtb_test1_n0
-shtb_test2_n0
-src
-src1
-src_cbo
-src_json
-src_sequencefile
-src_thrift
-srcbucket
-srcbucket2
-srcpart
+POSTHOOK: Input: database:test_db
+# Table Name        	Table Type          
+bar_n0              	MANAGED_TABLE       
+baz                 	MANAGED_TABLE       
+foo_n4              	MANAGED_TABLE       
+test_view_n100      	VIRTUAL_VIEW        
+	 
 PREHOOK: query: SHOW TABLES IN test_db "test*"
 PREHOOK: type: SHOWTABLES
 PREHOOK: Input: database:test_db
 POSTHOOK: query: SHOW TABLES IN test_db "test*"
 POSTHOOK: type: SHOWTABLES
 POSTHOOK: Input: database:test_db
+test_view_n100
 PREHOOK: query: SHOW TABLES IN test_db LIKE "nomatch"
 PREHOOK: type: SHOWTABLES
 PREHOOK: Input: database:test_db
 POSTHOOK: query: SHOW TABLES IN test_db LIKE "nomatch"
 POSTHOOK: type: SHOWTABLES
 POSTHOOK: Input: database:test_db
+PREHOOK: query: SHOW TABLES IN test_db WHERE `table_type` = "MANAGED_TABLE"
+PREHOOK: type: SHOWTABLES
+PREHOOK: Input: database:test_db
+POSTHOOK: query: SHOW TABLES IN test_db WHERE `table_type` = "MANAGED_TABLE"
+POSTHOOK: type: SHOWTABLES
+POSTHOOK: Input: database:test_db
+bar_n0
+baz
+foo_n4
+PREHOOK: query: SHOW EXTENDED TABLES IN test_db WHERE `table_type` = "VIRTUAL_VIEW"
+PREHOOK: type: SHOWTABLES
+PREHOOK: Input: database:test_db
+POSTHOOK: query: SHOW EXTENDED TABLES IN test_db WHERE `table_type` = "VIRTUAL_VIEW"
+POSTHOOK: type: SHOWTABLES
+POSTHOOK: Input: database:test_db
+# Table Name        	Table Type          
+test_view_n100      	VIRTUAL_VIEW        
+	 
 PREHOOK: query: SHOW TABLE EXTENDED IN test_db LIKE foo_n4
 PREHOOK: type: SHOW_TABLESTATUS
 POSTHOOK: query: SHOW TABLE EXTENDED IN test_db LIKE foo_n4