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 b02cdf8a61..1ab4d62da2 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 @@ -2552,31 +2552,38 @@ private int showDatabases(Hive db, ShowDatabasesDesc showDatabasesDesc) throws H */ private int showTablesOrViews(Hive db, ShowTablesDesc showDesc) throws HiveException { // get the tables/views for the desired pattern - populate the output stream - List tablesOrViews = null; - List materializedViews = null; + List tableNames = null; + List
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"); } @@ -2588,12 +2595,16 @@ private int showTablesOrViews(Hive db, ShowTablesDesc showDesc) throws HiveExcep FileSystem fs = resFile.getFileSystem(conf); outStream = fs.create(resFile); // Sort by name and print - if (tablesOrViews != null) { - SortedSet sortedSet = new TreeSet(tablesOrViews); + if (tableNames != null) { + SortedSet sortedSet = new TreeSet(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 7343eed261..3a313b0024 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 @@ -1357,6 +1357,18 @@ public Table getTable(final String dbName, final String tableName, boolean throw return getTableObjects(dbName, ".*", null); } + /** + * 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
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 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 6488c0998d..a3ae886c6e 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 void showTables(DataOutputStream out, Set tables) asJson(out, MapBuilder.create().put("tables", tables).build()); } + /** + * Show a list of tables including table types. + */ + @Override + public void showTablesExtended(DataOutputStream out, List
tables) + throws HiveException { + if (tables.isEmpty()) { + // Nothing to do + return; + } + + MapBuilder builder = MapBuilder.create(); + ArrayList> res = new ArrayList>(); + 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. */ 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 936a80870d..0f53ae4f94 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 @@ -70,6 +70,12 @@ public void error(OutputStream out, String errorMessage, int errorCode, String s public void showTables(DataOutputStream out, Set tables) throws HiveException; + /** + * Show a list of tables including table types. + */ + public void showTablesExtended(DataOutputStream out, List
tables) + throws HiveException; + /** * Show a list of materialized views. */ 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 2ff1d94e74..fbeb9c8f64 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 @@ -132,6 +132,33 @@ public void showTables(DataOutputStream out, Set tables) } } + /** + * Show a list of tables including table types. + */ + public void showTablesExtended(DataOutputStream out, List
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. */ 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 adfa4316c2..d27a913c74 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 @@ -2666,33 +2666,32 @@ private void analyzeShowTables(ASTNode ast) throws SemanticException { 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 7f8c178c96..46fa5635eb 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 @@ -1593,7 +1593,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)? @@ -1624,6 +1625,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 1c162526b1..0f7a3cdc32 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,10 +39,15 @@ 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. */ @@ -50,10 +55,12 @@ "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 String getSchema() { 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 ShowTablesDesc(Path resFile, String dbName) { * @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 String getDbName() { 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 0000000000..aa93a9809b --- /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 772d63ac9e..087d40f267 100644 --- a/ql/src/test/queries/clientpositive/show_tables.q +++ b/ql/src/test/queries/clientpositive/show_tables.q @@ -17,13 +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 EXTENDED TABLES FROM test_db; SHOW TABLES IN test_db; +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 0000000000..06a1addb75 --- /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 39088363d3..081ac6f9d3 100644 --- a/ql/src/test/results/clientpositive/create_view.q.out +++ b/ql/src/test/results/clientpositive/create_view.q.out @@ -233,6 +233,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 37ff3ec649..ea76a37512 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 63dda4e582..18d7c599cf 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,6 +142,19 @@ POSTHOOK: Input: database:test_db bar_n0 baz foo_n4 +test_view_n100 +PREHOOK: query: SHOW EXTENDED TABLES FROM test_db +PREHOOK: type: SHOWTABLES +PREHOOK: Input: database:test_db +POSTHOOK: query: SHOW EXTENDED TABLES FROM test_db +POSTHOOK: type: SHOWTABLES +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 @@ -140,18 +164,50 @@ POSTHOOK: Input: database:test_db bar_n0 baz foo_n4 +test_view_n100 +PREHOOK: query: SHOW EXTENDED TABLES IN test_db +PREHOOK: type: SHOWTABLES +PREHOOK: Input: database:test_db +POSTHOOK: query: SHOW EXTENDED TABLES IN test_db +POSTHOOK: type: SHOWTABLES +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