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 32c6e72..1d31151 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; + } } diff --git a/ql/src/test/queries/clientpositive/database.q b/ql/src/test/queries/clientpositive/database.q index 2b6c911..e808e4f 100644 --- a/ql/src/test/queries/clientpositive/database.q +++ b/ql/src/test/queries/clientpositive/database.q @@ -43,6 +43,7 @@ SHOW DATABASES; -- CREATE table in non-default DB CREATE TABLE test_table (col1 STRING) STORED AS TEXTFILE; SHOW TABLES; +SHOW TABLES FROM default; -- DESCRIBE table in non-default DB DESCRIBE test_table; @@ -72,6 +73,7 @@ SELECT * FROM test_table; USE test_db; CREATE TABLE src (col1 STRING) STORED AS TEXTFILE; SHOW TABLES; +SHOW TABLES FROM test_db; SELECT * FROM src LIMIT 10; diff --git a/ql/src/test/queries/clientpositive/show_tables.q b/ql/src/test/queries/clientpositive/show_tables.q index 1fa78bf..e49dceb 100644 --- a/ql/src/test/queries/clientpositive/show_tables.q +++ b/ql/src/test/queries/clientpositive/show_tables.q @@ -11,5 +11,29 @@ SHOW TABLES 'shtb_test1|shtb_test2'; SHOW TABLES 'shtb_test1|shtb_test2'; +-- SHOW TABLES FROM/IN database +CREATE DATABASE test_db; +USE test_db; +CREATE TABLE foo(a INT); +CREATE TABLE bar(a INT); +CREATE TABLE baz(a INT); + +USE default; +SHOW TABLES FROM test_db; +SHOW TABLES FROM default; +SHOW TABLES IN test_db; +SHOW TABLES IN default; +SHOW TABLES IN test_db "test*"; +SHOW TABLES IN test_db "nomatch"; +SHOW TABLES FROM non_existent; +SHOW TABLES FROM non_existent "nomatch"; + +USE test_db; +DROP TABLE foo; +DROP TABLE bar; +DROP TABLE baz; +USE default; +DROP DATABASE test_db; + diff --git a/ql/src/test/results/clientpositive/database.q.out b/ql/src/test/results/clientpositive/database.q.out index a74f9ea..16bea60 100644 --- a/ql/src/test/results/clientpositive/database.q.out +++ b/ql/src/test/results/clientpositive/database.q.out @@ -123,6 +123,18 @@ PREHOOK: type: SHOWTABLES POSTHOOK: query: SHOW TABLES POSTHOOK: type: SHOWTABLES test_table +PREHOOK: query: SHOW TABLES FROM default +PREHOOK: type: SHOWTABLES +POSTHOOK: query: SHOW TABLES FROM default +POSTHOOK: type: SHOWTABLES +src +src1 +src_json +src_sequencefile +src_thrift +srcbucket +srcbucket2 +srcpart PREHOOK: query: -- DESCRIBE table in non-default DB DESCRIBE test_table PREHOOK: type: DESCTABLE @@ -138,7 +150,7 @@ DESCRIBE EXTENDED test_table POSTHOOK: type: DESCTABLE col1 string -Detailed Table Information Table(tableName:test_table, dbName:test_db, owner:thiruvel, createTime:1286799523, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:col1, type:string, comment:null)], location:pfile:/home/thiruvel/projects/hive/hive.unsecure/build/ql/test/data/warehouse/test_db.db/test_table, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}), partitionKeys:[], parameters:{transient_lastDdlTime=1286799523}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) +Detailed Table Information Table(tableName:test_table, dbName:test_db, owner:natty, createTime:1295497053, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:col1, type:string, comment:null)], location:pfile:/home/natty/apache/hive/build/ql/test/data/warehouse/test_db.db/test_table, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}), partitionKeys:[], parameters:{transient_lastDdlTime=1295497053}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) PREHOOK: query: -- CREATE LIKE in non-default DB CREATE TABLE test_table_like LIKE test_table PREHOOK: type: CREATETABLE @@ -158,7 +170,7 @@ POSTHOOK: query: DESCRIBE EXTENDED test_table_like POSTHOOK: type: DESCTABLE col1 string -Detailed Table Information Table(tableName:test_table_like, dbName:test_db, owner:thiruvel, createTime:1286799523, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:col1, type:string, comment:null)], location:pfile:/home/thiruvel/projects/hive/hive.unsecure/build/ql/test/data/warehouse/test_db.db/test_table_like, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}), partitionKeys:[], parameters:{EXTERNAL=FALSE, transient_lastDdlTime=1286799523}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) +Detailed Table Information Table(tableName:test_table_like, dbName:test_db, owner:natty, createTime:1295497053, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:col1, type:string, comment:null)], location:pfile:/home/natty/apache/hive/build/ql/test/data/warehouse/test_db.db/test_table_like, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}), partitionKeys:[], parameters:{transient_lastDdlTime=1295497053}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) PREHOOK: query: -- LOAD and SELECT LOAD DATA LOCAL INPATH '../data/files/test.dat' OVERWRITE INTO TABLE test_table PREHOOK: type: LOAD @@ -169,11 +181,11 @@ POSTHOOK: Output: test_db@test_table PREHOOK: query: SELECT * FROM test_table PREHOOK: type: QUERY PREHOOK: Input: test_db@test_table -PREHOOK: Output: file:/tmp/thiruvel/hive_2010-10-11_05-18-43_571_8452529108735420754/-mr-10000 +PREHOOK: Output: file:/tmp/natty/hive_2011-01-19_20-17-33_910_8849955411961165388/-mr-10000 POSTHOOK: query: SELECT * FROM test_table POSTHOOK: type: QUERY POSTHOOK: Input: test_db@test_table -POSTHOOK: Output: file:/tmp/thiruvel/hive_2010-10-11_05-18-43_571_8452529108735420754/-mr-10000 +POSTHOOK: Output: file:/tmp/natty/hive_2011-01-19_20-17-33_910_8849955411961165388/-mr-10000 1 2 3 @@ -209,11 +221,11 @@ test_table_like PREHOOK: query: SELECT * FROM test_table PREHOOK: type: QUERY PREHOOK: Input: test_db@test_table -PREHOOK: Output: file:/tmp/thiruvel/hive_2010-10-11_05-18-44_152_630231966460953295/-mr-10000 +PREHOOK: Output: file:/tmp/natty/hive_2011-01-19_20-17-38_129_5112535169216391173/-mr-10000 POSTHOOK: query: SELECT * FROM test_table POSTHOOK: type: QUERY POSTHOOK: Input: test_db@test_table -POSTHOOK: Output: file:/tmp/thiruvel/hive_2010-10-11_05-18-44_152_630231966460953295/-mr-10000 +POSTHOOK: Output: file:/tmp/natty/hive_2011-01-19_20-17-38_129_5112535169216391173/-mr-10000 PREHOOK: query: -- CREATE table that already exists in DEFAULT USE test_db PREHOOK: type: SWITCHDATABASE @@ -232,14 +244,21 @@ POSTHOOK: type: SHOWTABLES src test_table test_table_like +PREHOOK: query: SHOW TABLES FROM test_db +PREHOOK: type: SHOWTABLES +POSTHOOK: query: SHOW TABLES FROM test_db +POSTHOOK: type: SHOWTABLES +src +test_table +test_table_like PREHOOK: query: SELECT * FROM src LIMIT 10 PREHOOK: type: QUERY PREHOOK: Input: test_db@src -PREHOOK: Output: file:/tmp/thiruvel/hive_2010-10-11_05-18-44_291_2571902017670449671/-mr-10000 +PREHOOK: Output: file:/tmp/natty/hive_2011-01-19_20-17-38_467_8075768514275581965/-mr-10000 POSTHOOK: query: SELECT * FROM src LIMIT 10 POSTHOOK: type: QUERY POSTHOOK: Input: test_db@src -POSTHOOK: Output: file:/tmp/thiruvel/hive_2010-10-11_05-18-44_291_2571902017670449671/-mr-10000 +POSTHOOK: Output: file:/tmp/natty/hive_2011-01-19_20-17-38_467_8075768514275581965/-mr-10000 PREHOOK: query: USE default PREHOOK: type: SWITCHDATABASE POSTHOOK: query: USE default @@ -247,11 +266,11 @@ POSTHOOK: type: SWITCHDATABASE PREHOOK: query: SELECT * FROM src LIMIT 10 PREHOOK: type: QUERY PREHOOK: Input: default@src -PREHOOK: Output: file:/tmp/thiruvel/hive_2010-10-11_05-18-44_347_2889860459217553704/-mr-10000 +PREHOOK: Output: file:/tmp/natty/hive_2011-01-19_20-17-38_757_329306949772765592/-mr-10000 POSTHOOK: query: SELECT * FROM src LIMIT 10 POSTHOOK: type: QUERY POSTHOOK: Input: default@src -POSTHOOK: Output: file:/tmp/thiruvel/hive_2010-10-11_05-18-44_347_2889860459217553704/-mr-10000 +POSTHOOK: Output: file:/tmp/natty/hive_2011-01-19_20-17-38_757_329306949772765592/-mr-10000 238 val_238 86 val_86 311 val_311 diff --git a/ql/src/test/results/clientpositive/show_tables.q.out b/ql/src/test/results/clientpositive/show_tables.q.out index 0bbd81b..5b20200 100644 --- a/ql/src/test/results/clientpositive/show_tables.q.out +++ b/ql/src/test/results/clientpositive/show_tables.q.out @@ -25,6 +25,7 @@ STAGE PLANS: Stage: Stage-0 Show Table Operator: Show Tables + database name: default pattern: shtb_* Stage: Stage-1 @@ -55,6 +56,7 @@ STAGE PLANS: Stage: Stage-0 Show Table Operator: Show Tables + database name: default pattern: shtb_test1|shtb_test2 Stage: Stage-1 @@ -68,3 +70,126 @@ POSTHOOK: query: SHOW TABLES 'shtb_test1|shtb_test2' POSTHOOK: type: SHOWTABLES shtb_test1 shtb_test2 +PREHOOK: query: -- SHOW TABLES FROM/IN database +CREATE DATABASE test_db +PREHOOK: type: CREATEDATABASE +POSTHOOK: query: -- SHOW TABLES FROM/IN database +CREATE DATABASE test_db +POSTHOOK: type: CREATEDATABASE +PREHOOK: query: USE test_db +PREHOOK: type: SWITCHDATABASE +POSTHOOK: query: USE test_db +POSTHOOK: type: SWITCHDATABASE +PREHOOK: query: CREATE TABLE foo(a INT) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE foo(a INT) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: test_db@foo +PREHOOK: query: CREATE TABLE bar(a INT) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE bar(a INT) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: test_db@bar +PREHOOK: query: CREATE TABLE baz(a INT) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE baz(a INT) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: test_db@baz +PREHOOK: query: USE default +PREHOOK: type: SWITCHDATABASE +POSTHOOK: query: USE default +POSTHOOK: type: SWITCHDATABASE +PREHOOK: query: SHOW TABLES FROM test_db +PREHOOK: type: SHOWTABLES +POSTHOOK: query: SHOW TABLES FROM test_db +POSTHOOK: type: SHOWTABLES +bar +baz +foo +PREHOOK: query: SHOW TABLES FROM default +PREHOOK: type: SHOWTABLES +POSTHOOK: query: SHOW TABLES FROM default +POSTHOOK: type: SHOWTABLES +shtb_test1 +shtb_test2 +src +src1 +src_json +src_sequencefile +src_thrift +srcbucket +srcbucket2 +srcpart +PREHOOK: query: SHOW TABLES IN test_db +PREHOOK: type: SHOWTABLES +POSTHOOK: query: SHOW TABLES IN test_db +POSTHOOK: type: SHOWTABLES +bar +baz +foo +PREHOOK: query: SHOW TABLES IN default +PREHOOK: type: SHOWTABLES +POSTHOOK: query: SHOW TABLES IN default +POSTHOOK: type: SHOWTABLES +shtb_test1 +shtb_test2 +src +src1 +src_json +src_sequencefile +src_thrift +srcbucket +srcbucket2 +srcpart +PREHOOK: query: SHOW TABLES IN test_db "test*" +PREHOOK: type: SHOWTABLES +POSTHOOK: query: SHOW TABLES IN test_db "test*" +POSTHOOK: type: SHOWTABLES +PREHOOK: query: SHOW TABLES IN test_db "nomatch" +PREHOOK: type: SHOWTABLES +POSTHOOK: query: SHOW TABLES IN test_db "nomatch" +POSTHOOK: type: SHOWTABLES +PREHOOK: query: SHOW TABLES FROM non_existent +PREHOOK: type: SHOWTABLES +POSTHOOK: query: SHOW TABLES FROM non_existent +POSTHOOK: type: SHOWTABLES +PREHOOK: query: SHOW TABLES FROM non_existent "nomatch" +PREHOOK: type: SHOWTABLES +POSTHOOK: query: SHOW TABLES FROM non_existent "nomatch" +POSTHOOK: type: SHOWTABLES +PREHOOK: query: USE test_db +PREHOOK: type: SWITCHDATABASE +POSTHOOK: query: USE test_db +POSTHOOK: type: SWITCHDATABASE +PREHOOK: query: DROP TABLE foo +PREHOOK: type: DROPTABLE +PREHOOK: Input: test_db@foo +PREHOOK: Output: test_db@foo +POSTHOOK: query: DROP TABLE foo +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: test_db@foo +POSTHOOK: Output: test_db@foo +PREHOOK: query: DROP TABLE bar +PREHOOK: type: DROPTABLE +PREHOOK: Input: test_db@bar +PREHOOK: Output: test_db@bar +POSTHOOK: query: DROP TABLE bar +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: test_db@bar +POSTHOOK: Output: test_db@bar +PREHOOK: query: DROP TABLE baz +PREHOOK: type: DROPTABLE +PREHOOK: Input: test_db@baz +PREHOOK: Output: test_db@baz +POSTHOOK: query: DROP TABLE baz +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: test_db@baz +POSTHOOK: Output: test_db@baz +PREHOOK: query: USE default +PREHOOK: type: SWITCHDATABASE +POSTHOOK: query: USE default +POSTHOOK: type: SWITCHDATABASE +PREHOOK: query: DROP DATABASE test_db +PREHOOK: type: DROPDATABASE +POSTHOOK: query: DROP DATABASE test_db +POSTHOOK: type: DROPDATABASE