Kim Jin Chul has posted comments on this change. ( http://gerrit.cloudera.org:8080/8851 )
Change subject: IMPALA-3193: Show table's comment on show tables ...................................................................... Patch Set 6: (22 comments) Applied the update. http://gerrit.cloudera.org:8080/#/c/8851/6//COMMIT_MSG Commit Message: http://gerrit.cloudera.org:8080/#/c/8851/6//COMMIT_MSG@13 PS6, Line 13: table's comment can be displayed if catalog table : owns Hive metastore table(HMS) object > There is no notion of ownership here. A loaded table is always associated w Done http://gerrit.cloudera.org:8080/#/c/8851/6//COMMIT_MSG@14 PS6, Line 14: There is not any HMS call : due to performance concern, so table's comment can be empty even : though table has a comment. > Rewrite as: "If the table is not loaded, an empty comment is returned." Done http://gerrit.cloudera.org:8080/#/c/8851/6//COMMIT_MSG@18 PS6, Line 18: There is a change in thrift part: a list of table comments is added to : TGetTablesResult struct as an optional element. > Remove this sentence. Done http://gerrit.cloudera.org:8080/#/c/8851/6/be/src/catalog/catalog-server.cc File be/src/catalog/catalog-server.cc: http://gerrit.cloudera.org:8080/#/c/8851/6/be/src/catalog/catalog-server.cc@381 PS6, Line 381: for (const TTableInfo& table_info: get_tables_info_result.tableinfos) { : Value table_obj(kObjectType); : Value fq_name(Substitute("$0.$1", db.db_name, table_info.tbl_name).c_str(), : document->GetAllocator()); : table_obj.AddMember("fqtn", fq_name, document->GetAllocator()); : Value table_name(table_info.tbl_name.c_str(), document->GetAllocator()); : table_obj.AddMember("name", table_name, document->GetAllocator()); : table_array.PushBack(table_obj, document->GetAllocator()); : } > Why not returning the table comments as well? Done http://gerrit.cloudera.org:8080/#/c/8851/6/be/src/catalog/catalog.h File be/src/catalog/catalog.h: http://gerrit.cloudera.org:8080/#/c/8851/6/be/src/catalog/catalog.h@83 PS6, Line 83: Hive metastore was not loaded for a table > "table is not loaded". Done http://gerrit.cloudera.org:8080/#/c/8851/6/be/src/catalog/catalog.cc File be/src/catalog/catalog.cc: http://gerrit.cloudera.org:8080/#/c/8851/6/be/src/catalog/catalog.cc@140 PS6, Line 140: return JniUtil::CallJniMethod(catalog_, get_table_names_id_, params, tables_info_result); > long line Done http://gerrit.cloudera.org:8080/#/c/8851/6/be/src/service/client-request-state.cc File be/src/service/client-request-state.cc: http://gerrit.cloudera.org:8080/#/c/8851/6/be/src/service/client-request-state.cc@275 PS6, Line 275: for (const TTableInfo& tbl_info: tables_info_result.tableinfos) { : names.push_back(tbl_info.tbl_name); : comments.push_back(tbl_info.comment); : } : SetResultSet(names, comments); > This code will result to DCHECK being hit if some table doesn't have the co Done http://gerrit.cloudera.org:8080/#/c/8851/6/be/src/service/frontend.cc File be/src/service/frontend.cc: http://gerrit.cloudera.org:8080/#/c/8851/6/be/src/service/frontend.cc@139 PS6, Line 139: Status Frontend::GetTableNames(const string& db, const string* pattern, : const TSessionState* session, TGetTablesInfoResult* tables_info_result) { : TGetTablesInfoParams params; : params.__set_db(db); : if (pattern != NULL) params.__set_pattern(*pattern); : if (session != NULL) params.__set_session(*session); : return JniUtil::CallJniMethod(fe_, get_table_names_id_, params, tables_info_result); : } : : Status Frontend::GetTableNamesAndComments(const string& db, const string* pattern, : const TSessionState* session, TGetTablesInfoResult* tables_info_result) { : TGetTablesInfoParams params; : params.__set_db(db); : if (pattern != NULL) params.__set_pattern(*pattern); : if (session != NULL) params.__set_session(*session); : return JniUtil::CallJniMethod(fe_, get_table_names_and_comments_id_, params, : tables_info_result); : } > Should be a single call Frontend::GetTablesInfo() Done http://gerrit.cloudera.org:8080/#/c/8851/6/be/src/service/impala-http-handler.cc File be/src/service/impala-http-handler.cc: http://gerrit.cloudera.org:8080/#/c/8851/6/be/src/service/impala-http-handler.cc@522 PS6, Line 522: for (const TTableInfo& tbl_info: get_tables_info_result.tableinfos) { : Value table_obj(kObjectType); : Value fq_name(Substitute("$0.$1", db.db_name, tbl_info.tbl_name).c_str(), : document->GetAllocator()); : table_obj.AddMember("fqtn", fq_name, document->GetAllocator()); : Value table_name(tbl_info.tbl_name.c_str(), document->GetAllocator()); : table_obj.AddMember("name", table_name, document->GetAllocator()); : table_array.PushBack(table_obj, document->GetAllocator()); : } > Populate the comment, if it's there. Done http://gerrit.cloudera.org:8080/#/c/8851/6/common/thrift/Frontend.thrift File common/thrift/Frontend.thrift: http://gerrit.cloudera.org:8080/#/c/8851/6/common/thrift/Frontend.thrift@85 PS6, Line 85: a result of show table for a table > information about a table including table name and optionally, a table comm Done http://gerrit.cloudera.org:8080/#/c/8851/6/common/thrift/Frontend.thrift@90 PS6, Line 90: May not be set if the database metastore was not loaded. > Comment needs to indicate when and if this is set. For instance, it's not c Done http://gerrit.cloudera.org:8080/#/c/8851/6/fe/src/main/java/org/apache/impala/catalog/Table.java File fe/src/main/java/org/apache/impala/catalog/Table.java: http://gerrit.cloudera.org:8080/#/c/8851/6/fe/src/main/java/org/apache/impala/catalog/Table.java@406 PS6, Line 406: / Not found comment if metastore table is a view > remove comment Done http://gerrit.cloudera.org:8080/#/c/8851/6/fe/src/main/java/org/apache/impala/catalog/Table.java@407 PS6, Line 407: final > remove Done. By the way, may I know why you would not prefer final keyword here? I usually prefer to use const in C++ and final in Java to represent the variable should be immutable. http://gerrit.cloudera.org:8080/#/c/8851/6/fe/src/main/java/org/apache/impala/service/Frontend.java File fe/src/main/java/org/apache/impala/service/Frontend.java: http://gerrit.cloudera.org:8080/#/c/8851/6/fe/src/main/java/org/apache/impala/service/Frontend.java@624 PS6, Line 624: tables > table names Done http://gerrit.cloudera.org:8080/#/c/8851/6/fe/src/main/java/org/apache/impala/service/JniCatalog.java File fe/src/main/java/org/apache/impala/service/JniCatalog.java: http://gerrit.cloudera.org:8080/#/c/8851/6/fe/src/main/java/org/apache/impala/service/JniCatalog.java@167 PS6, Line 167: thriftGetTablesInfoParams > This name doesn't make sense. Can you change it to thriftGetDbsParams? Done http://gerrit.cloudera.org:8080/#/c/8851/6/fe/src/main/java/org/apache/impala/service/JniCatalog.java@191 PS6, Line 191: tableinfos > nit: tablesInfo Done http://gerrit.cloudera.org:8080/#/c/8851/6/fe/src/main/java/org/apache/impala/service/JniCatalog.java@193 PS6, Line 193: tableinfo > tableInfo (camel-case) Done http://gerrit.cloudera.org:8080/#/c/8851/6/fe/src/main/java/org/apache/impala/service/JniFrontend.java File fe/src/main/java/org/apache/impala/service/JniFrontend.java: http://gerrit.cloudera.org:8080/#/c/8851/6/fe/src/main/java/org/apache/impala/service/JniFrontend.java@45 PS6, Line 45: import org.apache.impala.catalog.MetaStoreClientPool.MetaStoreClient; > Do you still need this? Done http://gerrit.cloudera.org:8080/#/c/8851/6/fe/src/main/java/org/apache/impala/service/JniFrontend.java@253 PS6, Line 253: public byte[] getTableNames(byte[] thriftGetTablesInfoParams) throws ImpalaException { : return getTableNamesAndComments(thriftGetTablesInfoParams, false); : } : : /** : * Implement Hive's pattern-matching semantics for "SHOW TABLE [[LIKE] 'pattern']", and : * return a list of table names and table comments matching an optional pattern. : * The only metacharacters are '*' which matches any string of characters, and '|' : * which denotes choice. Doing the work here saves loading tables or databases from the : * metastore (which Hive would do if we passed the call through to the metastore : * client). If the pattern is null, all strings are considered to match. If it is an : * empty string, no strings match. : * : * Note: There is a cost to get a comment because a communication happens between : * Impala and Hive's metastore at a first time. In the first request, the metastore : * table is cached. : * : * The argument is a serialized TGetTablesInfoParams object. : * The return type is a serialised TGetTablesInfoResult object. : */ : public byte[] getTableNamesAndComments(byte[] thriftGetTablesInfoParams) : throws ImpalaException { : return getTableNamesAndComments(thriftGetTablesInfoParams, true); : } : : /** : * Internal method to return a list of table names and table comments : * matching on optional pattern. : * : * @see Frontend#getTables : */ : private byte[] getTableNamesAndComments(byte[] thriftGetTablesInfoParams, : boolean collectComments) throws ImpalaException { : TGetTablesInfoParams params = new TGetTablesInfoParams(); : JniUtil.deserializeThrift(protocolFactory_, params, thriftGetTablesInfoParams); : // If the session was not set it indicates this is an internal Impala call. : User user = params.isSetSession() ? : new User(TSessionStateUtil.getEffectiveUser(params.getSession())) : : ImpalaInternalAdminUser.getInstance(); : : Preconditions.checkState(!params.isSetSession() || user != null ); : List<Table> tables = frontend_.getTables(params.db, : PatternMatcher.createHivePatternMatcher(params.pattern), user); : : TGetTablesInfoResult result = new TGetTablesInfoResult(); : List<TTableInfo> tableinfos = Lists.newArrayListWithCapacity(tables.size()); : for (Table table: tables) { : TTableInfo tableinfo = new TTableInfo(); : tableinfo.setTbl_name(table.getName()); : if (collectComments) tableinfo.setComment(table.getComment()); : tableinfos.add(tableinfo); : } : result.setTableinfos(tableinfos); : : TSerializer serializer = new TSerializer(protocolFactory_); : try { : return serializer.serialize(result); : } catch (TException e) { : throw new InternalException(e.getMessage()); : } : } > Replace with single getTablesInfo() call. If you want to control whether co Done http://gerrit.cloudera.org:8080/#/c/8851/6/fe/src/main/java/org/apache/impala/service/MetadataOp.java File fe/src/main/java/org/apache/impala/service/MetadataOp.java: http://gerrit.cloudera.org:8080/#/c/8851/6/fe/src/main/java/org/apache/impala/service/MetadataOp.java@267 PS6, Line 267: ImpaladCatalog catalog = fe.getCatalog(); > Do you still need that? Done http://gerrit.cloudera.org:8080/#/c/8851/6/fe/src/main/java/org/apache/impala/service/MetadataOp.java@280 PS6, Line 280: final > no need for that Done http://gerrit.cloudera.org:8080/#/c/8851/6/tests/query_test/test_queries.py File tests/query_test/test_queries.py: http://gerrit.cloudera.org:8080/#/c/8851/6/tests/query_test/test_queries.py@214 PS6, Line 214: class TestShowTables(TestQueries): : @classmethod : def get_workload(cls): : return 'functional-query' : : def testTableCommentVisibility(self, unique_database): : self.execute_query("create table {db}.t1(a int) comment 'bla bla bla'".format( : db=unique_database)) : self.execute_query("select * from {db}.t1".format(db=unique_database)) : result = self.execute_query("show tables in {db}".format(db=unique_database)) : assert "bla bla bla" in result.data[0] > Tests for this should be in test_metadata_query_statements.py (see show.tes Done -- To view, visit http://gerrit.cloudera.org:8080/8851 To unsubscribe, visit http://gerrit.cloudera.org:8080/settings Gerrit-Project: Impala-ASF Gerrit-Branch: master Gerrit-MessageType: comment Gerrit-Change-Id: I44f814af05db6f3c027718ade9f474f8b8153bcd Gerrit-Change-Number: 8851 Gerrit-PatchSet: 6 Gerrit-Owner: Kim Jin Chul <jinc...@gmail.com> Gerrit-Reviewer: Dimitris Tsirogiannis <dtsirogian...@cloudera.com> Gerrit-Reviewer: Kim Jin Chul <jinc...@gmail.com> Gerrit-Comment-Date: Tue, 23 Jan 2018 15:03:57 +0000 Gerrit-HasComments: Yes