IMPALA-4918: Support getting column comments via HS2 Fill the 'comments'/'remarks' field during HS2 column metadata requests.
To test: - create a JDBC connection to Impala with HS2 driver - call getMetaData().getColumns() for a table with column comments - the returned ResultSet should include column comments in field "REMARKS" Change-Id: I1d33dfd031b5344d7136695b623cec76143ada5c Reviewed-on: http://gerrit.cloudera.org:8080/8315 Reviewed-by: Lars Volker <[email protected]> Reviewed-by: Alex Behm <[email protected]> Tested-by: Impala Public Jenkins Project: http://git-wip-us.apache.org/repos/asf/incubator-impala/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-impala/commit/0bccb3ea Tree: http://git-wip-us.apache.org/repos/asf/incubator-impala/tree/0bccb3ea Diff: http://git-wip-us.apache.org/repos/asf/incubator-impala/diff/0bccb3ea Branch: refs/heads/master Commit: 0bccb3ea02817b7cc67d57458dc9fb341f96d119 Parents: 359b409 Author: Csaba Ringhofer <[email protected]> Authored: Wed Oct 18 15:51:28 2017 +0200 Committer: Impala Public Jenkins <[email protected]> Committed: Fri Oct 20 07:55:18 2017 +0000 ---------------------------------------------------------------------- .../org/apache/impala/service/MetadataOp.java | 2 +- .../apache/impala/common/FrontendTestBase.java | 3 ++- .../org/apache/impala/service/FrontendTest.java | 27 ++++++++++++++++--- .../org/apache/impala/service/JdbcTest.java | 28 ++++++++++++++++++++ 4 files changed, 55 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/0bccb3ea/fe/src/main/java/org/apache/impala/service/MetadataOp.java ---------------------------------------------------------------------- diff --git a/fe/src/main/java/org/apache/impala/service/MetadataOp.java b/fe/src/main/java/org/apache/impala/service/MetadataOp.java index 290720e..c541cc5 100644 --- a/fe/src/main/java/org/apache/impala/service/MetadataOp.java +++ b/fe/src/main/java/org/apache/impala/service/MetadataOp.java @@ -400,7 +400,7 @@ public class MetadataOp { row.colVals.add(createTColumnValue(colType.getNumPrecRadix())); // NULLABLE row.colVals.add(createTColumnValue(DatabaseMetaData.columnNullable)); - row.colVals.add(NULL_COL_VAL); // REMARKS + row.colVals.add(createTColumnValue(column.getComment())); // REMARKS row.colVals.add(NULL_COL_VAL); // COLUMN_DEF row.colVals.add(NULL_COL_VAL); // SQL_DATA_TYPE row.colVals.add(NULL_COL_VAL); // SQL_DATETIME_SUB http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/0bccb3ea/fe/src/test/java/org/apache/impala/common/FrontendTestBase.java ---------------------------------------------------------------------- diff --git a/fe/src/test/java/org/apache/impala/common/FrontendTestBase.java b/fe/src/test/java/org/apache/impala/common/FrontendTestBase.java index aa96490..c014dff 100644 --- a/fe/src/test/java/org/apache/impala/common/FrontendTestBase.java +++ b/fe/src/test/java/org/apache/impala/common/FrontendTestBase.java @@ -186,7 +186,8 @@ public class FrontendTestBase { columnDefs.addAll(createTableStmt.getColumnDefs()); for (int i = 0; i < columnDefs.size(); ++i) { ColumnDef colDef = columnDefs.get(i); - dummyTable.addColumn(new Column(colDef.getColName(), colDef.getType(), i)); + dummyTable.addColumn( + new Column(colDef.getColName(), colDef.getType(), colDef.getComment(), i)); } try { HdfsTable hdfsTable = (HdfsTable) dummyTable; http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/0bccb3ea/fe/src/test/java/org/apache/impala/service/FrontendTest.java ---------------------------------------------------------------------- diff --git a/fe/src/test/java/org/apache/impala/service/FrontendTest.java b/fe/src/test/java/org/apache/impala/service/FrontendTest.java index 54fa302..deab9eb 100644 --- a/fe/src/test/java/org/apache/impala/service/FrontendTest.java +++ b/fe/src/test/java/org/apache/impala/service/FrontendTest.java @@ -223,9 +223,14 @@ public class FrontendTest extends FrontendTestBase { final String dbName = "tbls_with_comments_test_db"; Db testDb = addTestDb(dbName, "Stores tables with comments"); assertNotNull(testDb); - final String commentStr = "this table has a comment"; + final String tableComment = "this table has a comment"; + final String columnComment = "this column has a comment"; + final String columnWithCommentName = "column_with_comment"; + final String columnWithoutCommentName = "column_without_comment"; final String tableWithCommentsStmt = String.format( - "create table %s.tbl_with_comments (a int) comment '%s'", dbName, commentStr); + "create table %s.tbl_with_comments (%s int comment '%s', %s int) comment '%s'", + dbName, columnWithCommentName, columnComment, columnWithoutCommentName, + tableComment); Table tbl = addTestTable(tableWithCommentsStmt); assertNotNull(tbl); final String tableWithoutCommentsStmt = String.format( @@ -242,12 +247,28 @@ public class FrontendTest extends FrontendTestBase { assertEquals(2, resp.rows.size()); for (TResultRow row: resp.rows) { if (row.colVals.get(2).string_val.toLowerCase().equals("tbl_with_comments")) { - assertEquals(commentStr, row.colVals.get(4).string_val.toLowerCase()); + assertEquals(tableComment, row.colVals.get(4).string_val.toLowerCase()); } else { assertEquals("", row.colVals.get(4).string_val); } } + // Test column comments + req = new TMetadataOpRequest(); + req.opcode = TMetadataOpcode.GET_COLUMNS; + req.get_columns_req = new TGetColumnsReq(); + req.get_columns_req.setSchemaName(dbName); + req.get_columns_req.setTableName("tbl_with_comments"); + resp = execMetadataOp(req); + assertEquals(2, resp.rows.size()); + for (TResultRow row: resp.rows) { + if (row.colVals.get(3).string_val.equals(columnWithCommentName)) { + assertEquals(columnComment, row.colVals.get(11).string_val); + } else { + assertEquals(null, row.colVals.get(11).string_val); + } + } + // Make sure tables that can't be loaded don't result in errors in the GetTables // request (see IMPALA-5579) req = new TMetadataOpRequest(); http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/0bccb3ea/fe/src/test/java/org/apache/impala/service/JdbcTest.java ---------------------------------------------------------------------- diff --git a/fe/src/test/java/org/apache/impala/service/JdbcTest.java b/fe/src/test/java/org/apache/impala/service/JdbcTest.java index 4c06cb4..8ee8fba 100644 --- a/fe/src/test/java/org/apache/impala/service/JdbcTest.java +++ b/fe/src/test/java/org/apache/impala/service/JdbcTest.java @@ -445,6 +445,34 @@ public class JdbcTest { } @Test + public void testMetaDataGetColumnComments() throws Exception { + addTestTable("create table default.jdbc_column_comments_test (" + + "a int comment 'column comment') comment 'table comment'"); + + // If a table is not yet loaded before getTables(), then the 'remarks' field + // is left empty. getColumns() loads the table metadata, so later getTables() + // calls will return 'remarks' correctly. + ResultSet rs = con_.getMetaData().getTables( + null, "default", "jdbc_column_comments_test", null); + assertTrue(rs.next()); + assertEquals("Incorrect table name", "jdbc_column_comments_test", + rs.getString("TABLE_NAME")); + assertEquals("Incorrect table comment", "", rs.getString("REMARKS")); + + rs = con_.getMetaData().getColumns( + null, "default", "jdbc_column_comments_test", null); + assertTrue(rs.next()); + assertEquals("Incorrect column comment", "column comment", rs.getString("REMARKS")); + + rs = con_.getMetaData().getTables( + null, "default", "jdbc_column_comments_test", null); + assertTrue(rs.next()); + assertEquals("Incorrect table name", "jdbc_column_comments_test", + rs.getString("TABLE_NAME")); + assertEquals("Incorrect table comment", "table comment", rs.getString("REMARKS")); + } + + @Test public void testDecimalGetColumnTypes() throws SQLException { // Table has 5 decimal columns ResultSet rs = con_.createStatement().executeQuery(
