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 5ddedd7..3e2ebb7 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 @@ -1690,10 +1690,10 @@ public class DDLTask extends Task implements Serializable { List tbls = null; if (showTbls.getPattern() != null) { LOG.info("pattern: " + showTbls.getPattern()); - tbls = db.getTablesByPattern(showTbls.getPattern()); + tbls = db.getTablesByPattern(showTbls.getDbName(), showTbls.getPattern()); LOG.info("results : " + tbls.size()); } else { - tbls = db.getAllTables(); + tbls = db.getAllTables(showTbls.getDbName()); } // write the results in the file 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 df7e0f9..4d1ba6c 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 @@ -1248,12 +1248,29 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer { private void analyzeShowTables(ASTNode ast) throws SemanticException { ShowTablesDesc showTblsDesc; - if (ast.getChildCount() == 1) { - String tableNames = unescapeSQLString(ast.getChild(0).getText()); - showTblsDesc = new ShowTablesDesc(ctx.getResFile(), tableNames); - } else { - showTblsDesc = new ShowTablesDesc(ctx.getResFile()); + String dbName = db.getCurrentDatabase(); + String tableNames = null; + + if (ast.getChildCount() > 3) { + throw new SemanticException(ErrorMsg.GENERIC_ERROR.getMsg()); } + + if (ast.getChildCount() == 1) { // Uses a pattern + tableNames = unescapeSQLString(ast.getChild(0).getText()); + showTblsDesc = new ShowTablesDesc(ctx.getResFile(), dbName, tableNames); + } else if (ast.getChildCount() == 2) { // Specifies a DB + assert(ast.getChild(0).getType() == HiveParser.TOK_FROM); + dbName = ast.getChild(1).getText(); + showTblsDesc = new ShowTablesDesc(ctx.getResFile(), dbName); + } else if (ast.getChildCount() == 3) { // Uses a pattern and specifies a DB + assert(ast.getChild(0).getType() == HiveParser.TOK_FROM); + dbName = ast.getChild(1).getText(); + tableNames = unescapeSQLString(ast.getChild(2).getText()); + showTblsDesc = new ShowTablesDesc(ctx.getResFile(), dbName, tableNames); + } else { // No pattern or DB + showTblsDesc = new ShowTablesDesc(ctx.getResFile(), dbName); + } + rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), showTblsDesc), conf)); setFetchTask(createFetchTask(showTblsDesc.getSchema())); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g b/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g index 128f3a6..c725bab 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g @@ -735,7 +735,7 @@ showStatement @init { msgs.push("show statement"); } @after { msgs.pop(); } : KW_SHOW (KW_DATABASES|KW_SCHEMAS) (KW_LIKE showStmtIdentifier)? -> ^(TOK_SHOWDATABASES showStmtIdentifier?) - | KW_SHOW KW_TABLES showStmtIdentifier? -> ^(TOK_SHOWTABLES showStmtIdentifier?) + | KW_SHOW KW_TABLES ((KW_FROM|KW_IN) db_name=Identifier)? showStmtIdentifier? -> ^(TOK_SHOWTABLES (TOK_FROM $db_name)? showStmtIdentifier?) | KW_SHOW KW_FUNCTIONS showStmtIdentifier? -> ^(TOK_SHOWFUNCTIONS showStmtIdentifier?) | KW_SHOW KW_PARTITIONS Identifier partitionSpec? -> ^(TOK_SHOWPARTITIONS Identifier partitionSpec?) | KW_SHOW KW_TABLE KW_EXTENDED ((KW_FROM|KW_IN) db_name=Identifier)? KW_LIKE showStmtIdentifier partitionSpec? 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 ec9e933..850e964 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 @@ -30,6 +30,7 @@ import org.apache.hadoop.fs.Path; public class ShowTablesDesc extends DDLDesc implements Serializable { private static final long serialVersionUID = 1L; String pattern; + String dbName; String resFile; /** * table name for the result of show tables. @@ -60,11 +61,21 @@ public class ShowTablesDesc extends DDLDesc implements Serializable { } /** + * @param dbName + * name of database to show tables of + */ + public ShowTablesDesc(Path resFile, String dbName) { + this.resFile = resFile.toString(); + this.dbName = dbName; + } + + /** * @param pattern * names of tables to show */ - public ShowTablesDesc(Path resFile, String pattern) { + public ShowTablesDesc(Path resFile, String dbName, String pattern) { this.resFile = resFile.toString(); + this.dbName = dbName; this.pattern = pattern; } @@ -99,4 +110,20 @@ public class ShowTablesDesc extends DDLDesc implements Serializable { public void setResFile(String resFile) { this.resFile = resFile; } + + /** + * @return the dbName + */ + @Explain(displayName = "database name") + public String getDbName() { + return dbName; + } + + /** + * @param dbName + * the dbName to set + */ + public void setDbName(String dbName) { + this.dbName = dbName; + } }