diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java index 31248d2..0a9cdf4 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java @@ -37,10 +37,10 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; +import java.util.Map.Entry; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -58,6 +58,7 @@ import org.apache.hadoop.hive.metastore.Warehouse; import org.apache.hadoop.hive.metastore.api.AlreadyExistsException; import org.apache.hadoop.hive.metastore.api.Database; import org.apache.hadoop.hive.metastore.api.FieldSchema; +import org.apache.hadoop.hive.metastore.api.Index; import org.apache.hadoop.hive.metastore.api.InvalidOperationException; import org.apache.hadoop.hive.metastore.api.MetaException; import org.apache.hadoop.hive.metastore.api.NoSuchObjectException; @@ -82,7 +83,6 @@ import org.apache.hadoop.hive.ql.metadata.Partition; import org.apache.hadoop.hive.ql.metadata.Table; import org.apache.hadoop.hive.ql.plan.AddPartitionDesc; import org.apache.hadoop.hive.ql.plan.AlterTableDesc; -import org.apache.hadoop.hive.ql.plan.AlterTableDesc.AlterTableTypes; import org.apache.hadoop.hive.ql.plan.AlterTableSimpleDesc; import org.apache.hadoop.hive.ql.plan.CreateDatabaseDesc; import org.apache.hadoop.hive.ql.plan.CreateIndexDesc; @@ -99,12 +99,14 @@ import org.apache.hadoop.hive.ql.plan.LockTableDesc; import org.apache.hadoop.hive.ql.plan.MsckDesc; import org.apache.hadoop.hive.ql.plan.ShowDatabasesDesc; import org.apache.hadoop.hive.ql.plan.ShowFunctionsDesc; +import org.apache.hadoop.hive.ql.plan.ShowIndexesDesc; import org.apache.hadoop.hive.ql.plan.ShowLocksDesc; import org.apache.hadoop.hive.ql.plan.ShowPartitionsDesc; import org.apache.hadoop.hive.ql.plan.ShowTableStatusDesc; import org.apache.hadoop.hive.ql.plan.ShowTablesDesc; import org.apache.hadoop.hive.ql.plan.SwitchDatabaseDesc; import org.apache.hadoop.hive.ql.plan.UnlockTableDesc; +import org.apache.hadoop.hive.ql.plan.AlterTableDesc.AlterTableTypes; import org.apache.hadoop.hive.ql.plan.api.StageType; import org.apache.hadoop.hive.serde.Constants; import org.apache.hadoop.hive.serde2.Deserializer; @@ -281,6 +283,11 @@ public class DDLTask extends Task implements Serializable { return showPartitions(db, showParts); } + ShowIndexesDesc showIndexes = work.getShowIndexesDesc(); + if (showIndexes != null) { + return showIndexes(db, showIndexes); + } + } catch (InvalidTableException e) { console.printError("Table " + e.getTableName() + " does not exist"); LOG.debug(stringifyException(e)); @@ -318,7 +325,7 @@ public class DDLTask extends Task implements Serializable { crtIndex.getInputFormat(), crtIndex.getOutputFormat(), crtIndex.getSerde(), crtIndex.getStorageHandler(), crtIndex.getLocation(), crtIndex.getIdxProps(), crtIndex.getTblProps(), crtIndex.getSerdeProps(), crtIndex.getCollItemDelim(), crtIndex.getFieldDelim(), crtIndex.getFieldEscape(), - crtIndex.getLineDelim(), crtIndex.getMapKeyDelim() + crtIndex.getLineDelim(), crtIndex.getMapKeyDelim(), crtIndex.getIndexComment() ); return 0; } @@ -1084,6 +1091,60 @@ public class DDLTask extends Task implements Serializable { } /** + * Write a list of indexes to a file. + * + * @param db + * The database in question. + * @param showIndexes + * These are the indexes we're interested in. + * @return Returns 0 when execution succeeds and above 0 if it fails. + * @throws HiveException + * Throws this exception if an unexpected error occurs. + */ + private int showIndexes(Hive db, ShowIndexesDesc showIndexes) throws HiveException { + // get the indexes for the table and populate the output + String tableName = showIndexes.getTableName(); + Table tbl = null; + List indexes = null; + + tbl = db.getTable(tableName); + + indexes = db.getIndexes(db.getCurrentDatabase(), tbl.getTableName(), (short) -1); + + // write the results in the file + try { + Path resFile = new Path(showIndexes.getResFile()); + FileSystem fs = resFile.getFileSystem(conf); + DataOutput outStream = fs.create(resFile); + + if (showIndexes.isFormatted()) { + // column headers + outStream.writeBytes(MetaDataFormatUtils.getIndexColumnsHeader()); + outStream.write(terminator); + outStream.write(terminator); + } + + for (Index index : indexes) + { + outStream.writeBytes(MetaDataFormatUtils.getAllColumnsInformation(index)); + } + + ((FSDataOutputStream) outStream).close(); + + } catch (FileNotFoundException e) { + LOG.info("show indexes: " + stringifyException(e)); + throw new HiveException(e.toString()); + } catch (IOException e) { + LOG.info("show indexes: " + stringifyException(e)); + throw new HiveException(e.toString()); + } catch (Exception e) { + throw new HiveException(e.toString()); + } + + return 0; + } + + /** * Write a list of the available databases to a file. * * @param showDatabases diff --git ql/src/java/org/apache/hadoop/hive/ql/index/HiveIndex.java ql/src/java/org/apache/hadoop/hive/ql/index/HiveIndex.java index 86e3bd7..308d985 100644 --- ql/src/java/org/apache/hadoop/hive/ql/index/HiveIndex.java +++ ql/src/java/org/apache/hadoop/hive/ql/index/HiveIndex.java @@ -26,9 +26,9 @@ import org.apache.commons.logging.LogFactory; public class HiveIndex { public static final Log l4j = LogFactory.getLog("HiveIndex"); - + public static String INDEX_TABLE_CREATETIME = "hive.index.basetbl.dfs.lastModifiedTime"; - + public static enum IndexType { COMPACT_SUMMARY_TABLE("compact", "org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler"); @@ -37,23 +37,34 @@ public class HiveIndex { this.handlerClsName = className; } - private String indexTypeName; - private String handlerClsName; + private final String indexTypeName; + private final String handlerClsName; public String getName() { return indexTypeName; } - + public String getHandlerClsName() { return handlerClsName; } } - + public static IndexType getIndexType(String name) { IndexType[] types = IndexType.values(); for (IndexType type : types) { - if(type.getName().equals(name.toLowerCase())) + if(type.getName().equals(name.toLowerCase())) { + return type; + } + } + return null; + } + + public static IndexType getIndexTypeByClassName(String className) { + IndexType[] types = IndexType.values(); + for (IndexType type : types) { + if(type.getHandlerClsName().equals(className)) { return type; + } } return null; } diff --git ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java index ac24595..c5fb22b 100644 --- ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java +++ ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java @@ -460,7 +460,7 @@ public class Hive { String storageHandler, String location, Map idxProps, Map tblProps, Map serdeProps, String collItemDelim, String fieldDelim, String fieldEscape, - String lineDelim, String mapKeyDelim) + String lineDelim, String mapKeyDelim, String indexComment) throws HiveException { try { @@ -583,6 +583,7 @@ public class Hive { Index indexDesc = new Index(indexName, indexHandlerClass, dbName, tableName, time, time, indexTblName, storageDescriptor, params, deferredRebuild); + indexDesc.getParameters().put("comment", indexComment); indexHandler.analyzeIndexDefinition(baseTbl, indexDesc, tt); if (idxProps != null) @@ -1617,4 +1618,14 @@ public class Hive { } } + public List getIndexes(String dbName, String tblName, short max) throws HiveException { + List indexes = null; + try { + indexes = getMSC().listIndexes(dbName, tblName, max); + } catch (Exception e) { + LOG.error(StringUtils.stringifyException(e)); + throw new HiveException(e); + } + return indexes; + } }; diff --git ql/src/java/org/apache/hadoop/hive/ql/metadata/MetaDataFormatUtils.java ql/src/java/org/apache/hadoop/hive/ql/metadata/MetaDataFormatUtils.java index 1de8172..83408eb 100644 --- ql/src/java/org/apache/hadoop/hive/ql/metadata/MetaDataFormatUtils.java +++ ql/src/java/org/apache/hadoop/hive/ql/metadata/MetaDataFormatUtils.java @@ -18,19 +18,23 @@ package org.apache.hadoop.hive.ql.metadata; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; + import org.apache.commons.lang.StringEscapeUtils; import org.apache.hadoop.hive.metastore.api.FieldSchema; +import org.apache.hadoop.hive.metastore.api.Index; import org.apache.hadoop.hive.metastore.api.StorageDescriptor; +import org.apache.hadoop.hive.ql.index.HiveIndex; +import org.apache.hadoop.hive.ql.index.HiveIndex.IndexType; import org.apache.hadoop.hive.ql.plan.DescTableDesc; - -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Collections; -import java.util.ArrayList; +import org.apache.hadoop.hive.ql.plan.ShowIndexesDesc; /** - * This class provides methods to format table information. + * This class provides methods to format table and index information. * */ public final class MetaDataFormatUtils { @@ -79,6 +83,32 @@ public final class MetaDataFormatUtils { } } + + public static String getAllColumnsInformation(Index index) { + StringBuilder indexInfo = new StringBuilder(DEFAULT_STRINGBUILDER_SIZE); + + String[] indexColumns = new String[6]; + + indexColumns[0] = index.getIndexName(); + indexColumns[1] = index.getOrigTableName(); + + // add column name + indexColumns[2] = index.getSd().getCols().get(0).getName(); + + indexColumns[3] = index.getIndexTableName(); + + // index type + String indexHandlerClass = index.getIndexHandlerClass(); + IndexType indexType = HiveIndex.getIndexTypeByClassName(indexHandlerClass); + indexColumns[4] = indexType.getName(); + + indexColumns[5] = index.getParameters().get("comment"); + + formatOutput(indexColumns, indexInfo); + + return indexInfo.toString(); +} + /* Displaying columns unformatted for backward compatibility. */ @@ -210,6 +240,10 @@ public final class MetaDataFormatUtils { private static void formatOutput(String[] fields, StringBuilder tableInfo) { for (String field : fields) { + if (field == null) { + tableInfo.append(FIELD_DELIM); + continue; + } tableInfo.append(String.format("%-" + ALIGNMENT + "s", field)).append(FIELD_DELIM); } tableInfo.append(LINE_DELIM); @@ -231,4 +265,10 @@ public final class MetaDataFormatUtils { public static String[] getColumnsHeader() { return DescTableDesc.getSchema().split("#")[0].split(","); } + + public static String getIndexColumnsHeader() { + StringBuilder indexCols = new StringBuilder(DEFAULT_STRINGBUILDER_SIZE); + formatOutput(ShowIndexesDesc.getSchema().split("#")[0].split(","), indexCols); + return indexCols.toString(); + } } diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java index 8fee318..e7e1d34 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java @@ -79,6 +79,7 @@ import org.apache.hadoop.hive.ql.plan.LockTableDesc; import org.apache.hadoop.hive.ql.plan.MsckDesc; import org.apache.hadoop.hive.ql.plan.ShowDatabasesDesc; import org.apache.hadoop.hive.ql.plan.ShowFunctionsDesc; +import org.apache.hadoop.hive.ql.plan.ShowIndexesDesc; import org.apache.hadoop.hive.ql.plan.ShowLocksDesc; import org.apache.hadoop.hive.ql.plan.ShowPartitionsDesc; import org.apache.hadoop.hive.ql.plan.ShowTableStatusDesc; @@ -232,6 +233,9 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer { } else if (ast.getToken().getType() == HiveParser.TOK_SHOWPARTITIONS) { ctx.setResFile(new Path(ctx.getLocalTmpFileURI())); analyzeShowPartitions(ast); + } else if (ast.getToken().getType() == HiveParser.TOK_SHOWINDEXES) { + ctx.setResFile(new Path(ctx.getLocalTmpFileURI())); + analyzeShowIndexes(ast); } else if (ast.getToken().getType() == HiveParser.TOK_LOCKTABLE) { analyzeLockTable(ast); } else if (ast.getToken().getType() == HiveParser.TOK_UNLOCKTABLE) { @@ -338,6 +342,7 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer { String location = null; Map tblProps = null; Map idxProps = null; + String indexComment = null; RowFormatParams rowFormatParams = new RowFormatParams(); StorageFormat storageFormat = new StorageFormat(); @@ -376,6 +381,9 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer { shared.serdeProps); } break; + case HiveParser.TOK_INDEXCOMMENT: + child = (ASTNode) child.getChild(0); + indexComment = unescapeSQLString(child.getText()); } } @@ -386,7 +394,7 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer { storageFormat.storageHandler, typeName, location, idxProps, tblProps, shared.serde, shared.serdeProps, rowFormatParams.collItemDelim, rowFormatParams.fieldDelim, rowFormatParams.fieldEscape, - rowFormatParams.lineDelim, rowFormatParams.mapKeyDelim); + rowFormatParams.lineDelim, rowFormatParams.mapKeyDelim, indexComment); Task createIndex = TaskFactory.get(new DDLWork(crtIndexDesc), conf); rootTasks.add(createIndex); } @@ -887,6 +895,21 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer { setFetchTask(createFetchTask(showTblStatusDesc.getSchema())); } + private void analyzeShowIndexes(ASTNode ast) throws SemanticException { + ShowIndexesDesc showIndexesDesc; + String tableName = unescapeIdentifier(ast.getChild(0).getText()); + showIndexesDesc = new ShowIndexesDesc(tableName, ctx.getResFile()); + + if (ast.getChildCount() == 2) { + int descOptions = ast.getChild(1).getType(); + showIndexesDesc.setFormatted(descOptions == HiveParser.KW_FORMATTED); + } + + rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), + showIndexesDesc), conf)); + setFetchTask(createFetchTask(showIndexesDesc.getSchema())); + } + /** * Add the task according to the parsed command tree. This is used for the CLI * command "SHOW FUNCTIONS;". diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g index accf7b1..87ed234 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g +++ ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g @@ -188,6 +188,8 @@ TOK_LEFTSEMIJOIN; TOK_LATERAL_VIEW; TOK_TABALIAS; TOK_ANALYZE; +TOK_SHOWINDEXES; +TOK_INDEXCOMMENT; } @@ -349,16 +351,25 @@ createIndexStatement tableFileFormat? tableLocation? tablePropertiesPrefixed? - ->^(TOK_CREATEINDEX $indexName $typeName $tab $indexedCols + indexComment? + ->^(TOK_CREATEINDEX $indexName $typeName $tab $indexedCols autoRebuild? indexPropertiesPrefixed? indexTblName? tableRowFormat? tableFileFormat? tableLocation? - tablePropertiesPrefixed?) + tablePropertiesPrefixed? + indexComment?) ; +indexComment +@init { msgs.push("comment on an index");} +@after {msgs.pop();} + : + KW_COMMENT comment=StringLiteral -> ^(TOK_INDEXCOMMENT $comment) + ; + autoRebuild @init { msgs.push("auto rebuild index");} @after {msgs.pop();} @@ -661,6 +672,8 @@ showStatement -> ^(TOK_SHOW_TABLESTATUS showStmtIdentifier $db_name? partitionSpec?) | KW_SHOW KW_LOCKS -> ^(TOK_SHOWLOCKS) | KW_SHOW KW_LOCKS (parttype=partTypeExpr) (isExtended=KW_EXTENDED)? -> ^(TOK_SHOWLOCKS $parttype $isExtended?) + | KW_SHOW (showOptions=KW_FORMATTED)? (KW_INDEX|KW_INDEXES) KW_ON showStmtIdentifier ((KW_FROM|KW_IN) db_name=Identifier)? + -> ^(TOK_SHOWINDEXES showStmtIdentifier $showOptions? $db_name?) ; lockStatement @@ -1762,6 +1775,7 @@ KW_PARTITIONS : 'PARTITIONS'; KW_TABLE: 'TABLE'; KW_TABLES: 'TABLES'; KW_INDEX: 'INDEX'; +KW_INDEXES: 'INDEXES'; KW_REBUILD: 'REBUILD'; KW_FUNCTIONS: 'FUNCTIONS'; KW_SHOW: 'SHOW'; diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java index 3b78d25..6f25aea 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java @@ -30,7 +30,7 @@ import org.apache.hadoop.hive.ql.session.SessionState; public final class SemanticAnalyzerFactory { static HashMap commandType = new HashMap(); - static HashMap tablePartitionCommandType = new HashMap(); + static HashMap tablePartitionCommandType = new HashMap(); static { commandType.put(HiveParser.TOK_EXPLAIN, "EXPLAIN"); @@ -60,6 +60,7 @@ public final class SemanticAnalyzerFactory { commandType.put(HiveParser.TOK_SHOW_TABLESTATUS, "SHOW_TABLESTATUS"); commandType.put(HiveParser.TOK_SHOWFUNCTIONS, "SHOWFUNCTIONS"); commandType.put(HiveParser.TOK_SHOWPARTITIONS, "SHOWPARTITIONS"); + commandType.put(HiveParser.TOK_SHOWINDEXES, "SHOWINDEXES"); commandType.put(HiveParser.TOK_SHOWLOCKS, "SHOWLOCKS"); commandType.put(HiveParser.TOK_CREATEFUNCTION, "CREATEFUNCTION"); commandType.put(HiveParser.TOK_DROPFUNCTION, "DROPFUNCTION"); @@ -73,16 +74,16 @@ public final class SemanticAnalyzerFactory { commandType.put(HiveParser.TOK_LOCKTABLE, "LOCKTABLE"); commandType.put(HiveParser.TOK_UNLOCKTABLE, "UNLOCKTABLE"); } - + static { - tablePartitionCommandType.put(HiveParser.TOK_ALTERTABLE_ALTERPARTS_PROTECTMODE, + tablePartitionCommandType.put(HiveParser.TOK_ALTERTABLE_ALTERPARTS_PROTECTMODE, new String[] { "ALTERTABLE_PROTECTMODE", "ALTERPARTITION_PROTECTMODE" }); tablePartitionCommandType.put(HiveParser.TOK_ALTERTABLE_FILEFORMAT, new String[] { "ALTERTABLE_FILEFORMAT", "ALTERPARTITION_FILEFORMAT" }); tablePartitionCommandType.put(HiveParser.TOK_ALTERTABLE_LOCATION, new String[] { "ALTERTABLE_LOCATION", "ALTERPARTITION_LOCATION" }); } - + public static BaseSemanticAnalyzer get(HiveConf conf, ASTNode tree) throws SemanticException { @@ -120,6 +121,7 @@ public final class SemanticAnalyzerFactory { case HiveParser.TOK_SHOW_TABLESTATUS: case HiveParser.TOK_SHOWFUNCTIONS: case HiveParser.TOK_SHOWPARTITIONS: + case HiveParser.TOK_SHOWINDEXES: case HiveParser.TOK_SHOWLOCKS: case HiveParser.TOK_CREATEINDEX: case HiveParser.TOK_DROPINDEX: diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/CreateIndexDesc.java ql/src/java/org/apache/hadoop/hive/ql/plan/CreateIndexDesc.java index eb9f453..9a4c12c 100644 --- ql/src/java/org/apache/hadoop/hive/ql/plan/CreateIndexDesc.java +++ ql/src/java/org/apache/hadoop/hive/ql/plan/CreateIndexDesc.java @@ -48,6 +48,7 @@ public class CreateIndexDesc extends DDLDesc implements Serializable { String lineDelim; String mapKeyDelim; + String indexComment; public CreateIndexDesc() { super(); @@ -59,7 +60,7 @@ public class CreateIndexDesc extends DDLDesc implements Serializable { String typeName, String location, Map idxProps, Map tblProps, String serde, Map serdeProps, String collItemDelim, String fieldDelim, String fieldEscape, String lineDelim, - String mapKeyDelim) { + String mapKeyDelim, String indexComment) { super(); this.tableName = tableName; this.indexName = indexName; @@ -81,6 +82,7 @@ public class CreateIndexDesc extends DDLDesc implements Serializable { this.fieldEscape = fieldEscape; this.lineDelim = lineDelim; this.mapKeyDelim = mapKeyDelim; + this.indexComment = indexComment; } public String getTableName() { @@ -239,4 +241,12 @@ public class CreateIndexDesc extends DDLDesc implements Serializable { this.indexTypeHandlerClass = indexTypeHandlerClass; } -} \ No newline at end of file + public String getIndexComment() { + return indexComment; + } + + public void setIndexComment(String indexComment) { + this.indexComment = indexComment; + } + +} diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/DDLWork.java ql/src/java/org/apache/hadoop/hive/ql/plan/DDLWork.java index d445be1..53aa1e5 100644 --- ql/src/java/org/apache/hadoop/hive/ql/plan/DDLWork.java +++ ql/src/java/org/apache/hadoop/hive/ql/plan/DDLWork.java @@ -53,6 +53,7 @@ public class DDLWork implements Serializable { private AlterTableSimpleDesc alterTblSimpleDesc; private MsckDesc msckDesc; private ShowTableStatusDesc showTblStatusDesc; + private ShowIndexesDesc showIndexesDesc; /** * ReadEntitites that are passed to the hooks. @@ -74,7 +75,7 @@ public class DDLWork implements Serializable { public DDLWork(CreateIndexDesc createIndex) { this.createIndexDesc = createIndex; } - + /** * @param createDatabaseDesc * Create Database descriptor @@ -295,6 +296,12 @@ public class DDLWork implements Serializable { this.dropIdxDesc = dropIndexDesc; } + public DDLWork(HashSet inputs, HashSet outputs, + ShowIndexesDesc showIndexesDesc) { + this(inputs, outputs); + this.showIndexesDesc = showIndexesDesc; + } + /** * @return Create Database descriptor */ @@ -355,7 +362,7 @@ public class DDLWork implements Serializable { public void setCreateTblDesc(CreateTableDesc createTblDesc) { this.createTblDesc = createTblDesc; } - + public CreateIndexDesc getCreateIndexDesc() { return createIndexDesc; } @@ -557,6 +564,18 @@ public class DDLWork implements Serializable { } /** + * @return the showIndexesDesc + */ + @Explain(displayName = "Show Index Operator") + public ShowIndexesDesc getShowIndexesDesc() { + return showIndexesDesc; + } + + public void setShowIndexesDesc(ShowIndexesDesc showIndexesDesc) { + this.showIndexesDesc = showIndexesDesc; + } + + /** * @return the descTblDesc */ @Explain(displayName = "Describe Table Operator") @@ -659,7 +678,7 @@ public class DDLWork implements Serializable { public void setOutputs(HashSet outputs) { this.outputs = outputs; } - + public DropIndexDesc getDropIdxDesc() { return dropIdxDesc; } diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/ShowIndexesDesc.java ql/src/java/org/apache/hadoop/hive/ql/plan/ShowIndexesDesc.java new file mode 100644 index 0000000..78262c6 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/plan/ShowIndexesDesc.java @@ -0,0 +1,73 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hive.ql.plan; + +import java.io.Serializable; + +import org.apache.hadoop.fs.Path; + +/** + * ShowIndexesDesc. + * Returns table index information per SQL syntax. + */ +@Explain(displayName = "Show Indexes") +public class ShowIndexesDesc extends DDLDesc implements Serializable { + private static final long serialVersionUID = 1L; + String tableName; + String resFile; + boolean isFormatted; + + /** + * thrift ddl for the result of show indexes. + */ + private static final String schema = "idx_name,tab_name,col_names,idx_tab_name,idx_type,comment" + + "#string:string:string:string:string:string"; + + public static String getSchema() { + return schema; + } + + public String getTableName() { + return tableName; + } + + public String getResFile() { + return resFile; + } + + public boolean isFormatted() { + return isFormatted; + } + + public void setFormatted(boolean isFormatted) { + this.isFormatted = isFormatted; + } + + /** + * + * @param tableName + * Name of the table whose indexes need to be listed. + * @param resFile + * File to store the results in. + */ + public ShowIndexesDesc(String tableName, Path resFile) { + this.tableName = tableName; + this.resFile = resFile.toString(); + } +} diff --git ql/src/test/queries/clientpositive/show_indexes_edge_cases.q ql/src/test/queries/clientpositive/show_indexes_edge_cases.q new file mode 100644 index 0000000..c1a1229 --- /dev/null +++ ql/src/test/queries/clientpositive/show_indexes_edge_cases.q @@ -0,0 +1,25 @@ +DROP TABLE show_idx_empty; +DROP TABLE show_idx_full; + +CREATE TABLE show_idx_empty(KEY STRING, VALUE STRING); +CREATE TABLE show_idx_full(KEY STRING, VALUE1 STRING, VALUE2 STRING); + +CREATE INDEX idx_1 ON TABLE show_idx_full(KEY) AS "COMPACT" WITH DEFERRED REBUILD; +CREATE INDEX idx_2 ON TABLE show_idx_full(VALUE1) AS "COMPACT" WITH DEFERRED REBUILD; + +CREATE INDEX idx_comment ON TABLE show_idx_full(VALUE2) AS "COMPACT" WITH DEFERRED REBUILD COMMENT "index comment"; +CREATE INDEX idx_compound ON TABLE show_idx_full(KEY, VALUE1) AS "COMPACT" WITH DEFERRED REBUILD; + +ALTER INDEX idx_1 ON show_idx_full REBUILD; +ALTER INDEX idx_2 ON show_idx_full REBUILD; +ALTER INDEX idx_comment ON show_idx_full REBUILD; +ALTER INDEX idx_compound ON show_idx_full REBUILD; + +EXPLAIN SHOW INDEXES ON show_idx_full; +SHOW INDEXES ON show_idx_full; + +EXPLAIN SHOW INDEXES ON show_idx_empty; +SHOW INDEXES ON show_idx_empty; + +DROP TABLE show_idx_empty; +DROP TABLE show_idx_full; \ No newline at end of file diff --git ql/src/test/queries/clientpositive/show_indexes_syntax.q ql/src/test/queries/clientpositive/show_indexes_syntax.q new file mode 100644 index 0000000..ab58893 --- /dev/null +++ ql/src/test/queries/clientpositive/show_indexes_syntax.q @@ -0,0 +1,23 @@ +DROP TABLE show_idx_t1; + +CREATE TABLE show_idx_t1(KEY STRING, VALUE STRING); + +CREATE INDEX idx_t1 ON TABLE show_idx_t1(KEY) AS "COMPACT" WITH DEFERRED REBUILD; +ALTER INDEX idx_t1 ON show_idx_t1 REBUILD; + +EXPLAIN +SHOW INDEX ON show_idx_t1; + +SHOW INDEX ON show_idx_t1; + +EXPLAIN +SHOW INDEXES ON show_idx_t1; + +SHOW INDEXES ON show_idx_t1; + +EXPLAIN +SHOW FORMATTED INDEXES ON show_idx_t1; + +SHOW FORMATTED INDEXES ON show_idx_t1; + +DROP TABLE show_idx_t1; diff --git ql/src/test/results/clientpositive/show_indexes_edge_cases.q.out ql/src/test/results/clientpositive/show_indexes_edge_cases.q.out new file mode 100644 index 0000000..d02154a --- /dev/null +++ ql/src/test/results/clientpositive/show_indexes_edge_cases.q.out @@ -0,0 +1,245 @@ +PREHOOK: query: DROP TABLE show_idx_empty +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE show_idx_empty +POSTHOOK: type: DROPTABLE +PREHOOK: query: DROP TABLE show_idx_full +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE show_idx_full +POSTHOOK: type: DROPTABLE +PREHOOK: query: CREATE TABLE show_idx_empty(KEY STRING, VALUE STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE show_idx_empty(KEY STRING, VALUE STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@show_idx_empty +PREHOOK: query: CREATE TABLE show_idx_full(KEY STRING, VALUE1 STRING, VALUE2 STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE show_idx_full(KEY STRING, VALUE1 STRING, VALUE2 STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@show_idx_full +PREHOOK: query: CREATE INDEX idx_1 ON TABLE show_idx_full(KEY) AS "COMPACT" WITH DEFERRED REBUILD +PREHOOK: type: CREATEINDEX +POSTHOOK: query: CREATE INDEX idx_1 ON TABLE show_idx_full(KEY) AS "COMPACT" WITH DEFERRED REBUILD +POSTHOOK: type: CREATEINDEX +PREHOOK: query: CREATE INDEX idx_2 ON TABLE show_idx_full(VALUE1) AS "COMPACT" WITH DEFERRED REBUILD +PREHOOK: type: CREATEINDEX +POSTHOOK: query: CREATE INDEX idx_2 ON TABLE show_idx_full(VALUE1) AS "COMPACT" WITH DEFERRED REBUILD +POSTHOOK: type: CREATEINDEX +PREHOOK: query: CREATE INDEX idx_comment ON TABLE show_idx_full(VALUE2) AS "COMPACT" WITH DEFERRED REBUILD COMMENT "index comment" +PREHOOK: type: CREATEINDEX +POSTHOOK: query: CREATE INDEX idx_comment ON TABLE show_idx_full(VALUE2) AS "COMPACT" WITH DEFERRED REBUILD COMMENT "index comment" +POSTHOOK: type: CREATEINDEX +PREHOOK: query: CREATE INDEX idx_compound ON TABLE show_idx_full(KEY, VALUE1) AS "COMPACT" WITH DEFERRED REBUILD +PREHOOK: type: CREATEINDEX +POSTHOOK: query: CREATE INDEX idx_compound ON TABLE show_idx_full(KEY, VALUE1) AS "COMPACT" WITH DEFERRED REBUILD +POSTHOOK: type: CREATEINDEX +PREHOOK: query: ALTER INDEX idx_1 ON show_idx_full REBUILD +PREHOOK: type: QUERY +PREHOOK: Input: default@show_idx_full +PREHOOK: Output: default@default__show_idx_full_idx_1__ +POSTHOOK: query: ALTER INDEX idx_1 ON show_idx_full REBUILD +POSTHOOK: type: QUERY +POSTHOOK: Input: default@show_idx_full +POSTHOOK: Output: default@default__show_idx_full_idx_1__ +POSTHOOK: Lineage: default__show_idx_full_idx_1__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +PREHOOK: query: ALTER INDEX idx_2 ON show_idx_full REBUILD +PREHOOK: type: QUERY +PREHOOK: Input: default@show_idx_full +PREHOOK: Output: default@default__show_idx_full_idx_2__ +POSTHOOK: query: ALTER INDEX idx_2 ON show_idx_full REBUILD +POSTHOOK: type: QUERY +POSTHOOK: Input: default@show_idx_full +POSTHOOK: Output: default@default__show_idx_full_idx_2__ +POSTHOOK: Lineage: default__show_idx_full_idx_1__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__.value1 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value1, type:string, comment:null), ] +PREHOOK: query: ALTER INDEX idx_comment ON show_idx_full REBUILD +PREHOOK: type: QUERY +PREHOOK: Input: default@show_idx_full +PREHOOK: Output: default@default__show_idx_full_idx_comment__ +POSTHOOK: query: ALTER INDEX idx_comment ON show_idx_full REBUILD +POSTHOOK: type: QUERY +POSTHOOK: Input: default@show_idx_full +POSTHOOK: Output: default@default__show_idx_full_idx_comment__ +POSTHOOK: Lineage: default__show_idx_full_idx_1__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__.value1 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value1, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__.value2 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value2, type:string, comment:null), ] +PREHOOK: query: ALTER INDEX idx_compound ON show_idx_full REBUILD +PREHOOK: type: QUERY +PREHOOK: Input: default@show_idx_full +PREHOOK: Output: default@default__show_idx_full_idx_compound__ +POSTHOOK: query: ALTER INDEX idx_compound ON show_idx_full REBUILD +POSTHOOK: type: QUERY +POSTHOOK: Input: default@show_idx_full +POSTHOOK: Output: default@default__show_idx_full_idx_compound__ +POSTHOOK: Lineage: default__show_idx_full_idx_1__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__.value1 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value1, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__.value2 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value2, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__.value1 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value1, type:string, comment:null), ] +PREHOOK: query: EXPLAIN SHOW INDEXES ON show_idx_full +PREHOOK: type: SHOWINDEXES +POSTHOOK: query: EXPLAIN SHOW INDEXES ON show_idx_full +POSTHOOK: type: SHOWINDEXES +POSTHOOK: Lineage: default__show_idx_full_idx_1__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__.value1 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value1, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__.value2 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value2, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__.value1 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value1, type:string, comment:null), ] +ABSTRACT SYNTAX TREE: + (TOK_SHOWINDEXES show_idx_full) + +STAGE DEPENDENCIES: + Stage-0 is a root stage + Stage-1 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Show Index Operator: + Show Indexes + + Stage: Stage-1 + Fetch Operator + limit: -1 + + +PREHOOK: query: SHOW INDEXES ON show_idx_full +PREHOOK: type: SHOWINDEXES +POSTHOOK: query: SHOW INDEXES ON show_idx_full +POSTHOOK: type: SHOWINDEXES +POSTHOOK: Lineage: default__show_idx_full_idx_1__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__.value1 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value1, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__.value2 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value2, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__.value1 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value1, type:string, comment:null), ] +idx_1 show_idx_full key default__show_idx_full_idx_1__ compact +idx_2 show_idx_full value1 default__show_idx_full_idx_2__ compact +idx_comment show_idx_full value2 default__show_idx_full_idx_comment__ compact index comment +idx_compound show_idx_full key default__show_idx_full_idx_compound__ compact +PREHOOK: query: EXPLAIN SHOW INDEXES ON show_idx_empty +PREHOOK: type: SHOWINDEXES +POSTHOOK: query: EXPLAIN SHOW INDEXES ON show_idx_empty +POSTHOOK: type: SHOWINDEXES +POSTHOOK: Lineage: default__show_idx_full_idx_1__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__.value1 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value1, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__.value2 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value2, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__.value1 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value1, type:string, comment:null), ] +ABSTRACT SYNTAX TREE: + (TOK_SHOWINDEXES show_idx_empty) + +STAGE DEPENDENCIES: + Stage-0 is a root stage + Stage-1 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Show Index Operator: + Show Indexes + + Stage: Stage-1 + Fetch Operator + limit: -1 + + +PREHOOK: query: SHOW INDEXES ON show_idx_empty +PREHOOK: type: SHOWINDEXES +POSTHOOK: query: SHOW INDEXES ON show_idx_empty +POSTHOOK: type: SHOWINDEXES +POSTHOOK: Lineage: default__show_idx_full_idx_1__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__.value1 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value1, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__.value2 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value2, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__.value1 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value1, type:string, comment:null), ] +PREHOOK: query: DROP TABLE show_idx_empty +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@show_idx_empty +PREHOOK: Output: default@show_idx_empty +POSTHOOK: query: DROP TABLE show_idx_empty +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@show_idx_empty +POSTHOOK: Output: default@show_idx_empty +POSTHOOK: Lineage: default__show_idx_full_idx_1__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__.value1 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value1, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__.value2 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value2, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__.value1 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value1, type:string, comment:null), ] +PREHOOK: query: DROP TABLE show_idx_full +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@show_idx_full +PREHOOK: Output: default@show_idx_full +POSTHOOK: query: DROP TABLE show_idx_full +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@show_idx_full +POSTHOOK: Output: default@show_idx_full +POSTHOOK: Lineage: default__show_idx_full_idx_1__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_1__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_2__.value1 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value1, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_comment__.value2 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value2, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__._bucketname SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__._offsets EXPRESSION [(show_idx_full)show_idx_full.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__.key SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:key, type:string, comment:null), ] +POSTHOOK: Lineage: default__show_idx_full_idx_compound__.value1 SIMPLE [(show_idx_full)show_idx_full.FieldSchema(name:value1, type:string, comment:null), ] diff --git ql/src/test/results/clientpositive/show_indexes_syntax.q.out ql/src/test/results/clientpositive/show_indexes_syntax.q.out new file mode 100644 index 0000000..095a0eb --- /dev/null +++ ql/src/test/results/clientpositive/show_indexes_syntax.q.out @@ -0,0 +1,140 @@ +PREHOOK: query: DROP TABLE show_idx_t1 +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE show_idx_t1 +POSTHOOK: type: DROPTABLE +PREHOOK: query: CREATE TABLE show_idx_t1(KEY STRING, VALUE STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE show_idx_t1(KEY STRING, VALUE STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@show_idx_t1 +PREHOOK: query: CREATE INDEX idx_t1 ON TABLE show_idx_t1(KEY) AS "COMPACT" WITH DEFERRED REBUILD +PREHOOK: type: CREATEINDEX +POSTHOOK: query: CREATE INDEX idx_t1 ON TABLE show_idx_t1(KEY) AS "COMPACT" WITH DEFERRED REBUILD +POSTHOOK: type: CREATEINDEX +PREHOOK: query: ALTER INDEX idx_t1 ON show_idx_t1 REBUILD +PREHOOK: type: QUERY +PREHOOK: Input: default@show_idx_t1 +PREHOOK: Output: default@default__show_idx_t1_idx_t1__ +POSTHOOK: query: ALTER INDEX idx_t1 ON show_idx_t1 REBUILD +POSTHOOK: type: QUERY +POSTHOOK: Input: default@show_idx_t1 +POSTHOOK: Output: default@default__show_idx_t1_idx_t1__ +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__._bucketname SIMPLE [(show_idx_t1)show_idx_t1.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__._offsets EXPRESSION [(show_idx_t1)show_idx_t1.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__.key SIMPLE [(show_idx_t1)show_idx_t1.FieldSchema(name:key, type:string, comment:null), ] +PREHOOK: query: EXPLAIN +SHOW INDEX ON show_idx_t1 +PREHOOK: type: SHOWINDEXES +POSTHOOK: query: EXPLAIN +SHOW INDEX ON show_idx_t1 +POSTHOOK: type: SHOWINDEXES +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__._bucketname SIMPLE [(show_idx_t1)show_idx_t1.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__._offsets EXPRESSION [(show_idx_t1)show_idx_t1.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__.key SIMPLE [(show_idx_t1)show_idx_t1.FieldSchema(name:key, type:string, comment:null), ] +ABSTRACT SYNTAX TREE: + (TOK_SHOWINDEXES show_idx_t1) + +STAGE DEPENDENCIES: + Stage-0 is a root stage + Stage-1 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Show Index Operator: + Show Indexes + + Stage: Stage-1 + Fetch Operator + limit: -1 + + +PREHOOK: query: SHOW INDEX ON show_idx_t1 +PREHOOK: type: SHOWINDEXES +POSTHOOK: query: SHOW INDEX ON show_idx_t1 +POSTHOOK: type: SHOWINDEXES +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__._bucketname SIMPLE [(show_idx_t1)show_idx_t1.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__._offsets EXPRESSION [(show_idx_t1)show_idx_t1.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__.key SIMPLE [(show_idx_t1)show_idx_t1.FieldSchema(name:key, type:string, comment:null), ] +idx_t1 show_idx_t1 key default__show_idx_t1_idx_t1__ compact +PREHOOK: query: EXPLAIN +SHOW INDEXES ON show_idx_t1 +PREHOOK: type: SHOWINDEXES +POSTHOOK: query: EXPLAIN +SHOW INDEXES ON show_idx_t1 +POSTHOOK: type: SHOWINDEXES +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__._bucketname SIMPLE [(show_idx_t1)show_idx_t1.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__._offsets EXPRESSION [(show_idx_t1)show_idx_t1.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__.key SIMPLE [(show_idx_t1)show_idx_t1.FieldSchema(name:key, type:string, comment:null), ] +ABSTRACT SYNTAX TREE: + (TOK_SHOWINDEXES show_idx_t1) + +STAGE DEPENDENCIES: + Stage-0 is a root stage + Stage-1 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Show Index Operator: + Show Indexes + + Stage: Stage-1 + Fetch Operator + limit: -1 + + +PREHOOK: query: SHOW INDEXES ON show_idx_t1 +PREHOOK: type: SHOWINDEXES +POSTHOOK: query: SHOW INDEXES ON show_idx_t1 +POSTHOOK: type: SHOWINDEXES +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__._bucketname SIMPLE [(show_idx_t1)show_idx_t1.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__._offsets EXPRESSION [(show_idx_t1)show_idx_t1.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__.key SIMPLE [(show_idx_t1)show_idx_t1.FieldSchema(name:key, type:string, comment:null), ] +idx_t1 show_idx_t1 key default__show_idx_t1_idx_t1__ compact +PREHOOK: query: EXPLAIN +SHOW FORMATTED INDEXES ON show_idx_t1 +PREHOOK: type: SHOWINDEXES +POSTHOOK: query: EXPLAIN +SHOW FORMATTED INDEXES ON show_idx_t1 +POSTHOOK: type: SHOWINDEXES +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__._bucketname SIMPLE [(show_idx_t1)show_idx_t1.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__._offsets EXPRESSION [(show_idx_t1)show_idx_t1.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__.key SIMPLE [(show_idx_t1)show_idx_t1.FieldSchema(name:key, type:string, comment:null), ] +ABSTRACT SYNTAX TREE: + (TOK_SHOWINDEXES show_idx_t1 FORMATTED) + +STAGE DEPENDENCIES: + Stage-0 is a root stage + Stage-1 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Show Index Operator: + Show Indexes + + Stage: Stage-1 + Fetch Operator + limit: -1 + + +PREHOOK: query: SHOW FORMATTED INDEXES ON show_idx_t1 +PREHOOK: type: SHOWINDEXES +POSTHOOK: query: SHOW FORMATTED INDEXES ON show_idx_t1 +POSTHOOK: type: SHOWINDEXES +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__._bucketname SIMPLE [(show_idx_t1)show_idx_t1.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__._offsets EXPRESSION [(show_idx_t1)show_idx_t1.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__.key SIMPLE [(show_idx_t1)show_idx_t1.FieldSchema(name:key, type:string, comment:null), ] +idx_name tab_name col_names idx_tab_name idx_type comment + + +idx_t1 show_idx_t1 key default__show_idx_t1_idx_t1__ compact +PREHOOK: query: DROP TABLE show_idx_t1 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@show_idx_t1 +PREHOOK: Output: default@show_idx_t1 +POSTHOOK: query: DROP TABLE show_idx_t1 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@show_idx_t1 +POSTHOOK: Output: default@show_idx_t1 +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__._bucketname SIMPLE [(show_idx_t1)show_idx_t1.FieldSchema(name:INPUT__FILE__NAME, type:string, comment:), ] +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__._offsets EXPRESSION [(show_idx_t1)show_idx_t1.FieldSchema(name:BLOCK__OFFSET__INSIDE__FILE, type:bigint, comment:), ] +POSTHOOK: Lineage: default__show_idx_t1_idx_t1__.key SIMPLE [(show_idx_t1)show_idx_t1.FieldSchema(name:key, type:string, comment:null), ]