diff --git a/jdbc-handler/src/main/java/org/apache/hive/storage/jdbc/dao/JdbcRecordIterator.java b/jdbc-handler/src/main/java/org/apache/hive/storage/jdbc/dao/JdbcRecordIterator.java index cd7cd4f7b2..0bafb7e4fa 100644 --- a/jdbc-handler/src/main/java/org/apache/hive/storage/jdbc/dao/JdbcRecordIterator.java +++ b/jdbc-handler/src/main/java/org/apache/hive/storage/jdbc/dao/JdbcRecordIterator.java @@ -22,15 +22,19 @@ import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo; import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo; import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils; +import org.apache.hive.storage.jdbc.exception.HiveJdbcDatabaseAccessException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLDataException; import java.sql.SQLException; import java.sql.Types; +import java.util.Arrays; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -49,7 +53,7 @@ private String[] hiveColumnNames; List hiveColumnTypesList; - public JdbcRecordIterator(Connection conn, PreparedStatement ps, ResultSet rs, Configuration conf) { + public JdbcRecordIterator(Connection conn, PreparedStatement ps, ResultSet rs, Configuration conf) throws HiveJdbcDatabaseAccessException { this.conn = conn; this.ps = ps; this.rs = rs; @@ -59,9 +63,26 @@ public JdbcRecordIterator(Connection conn, PreparedStatement ps, ResultSet rs, C fieldNamesProperty = Preconditions.checkNotNull(conf.get(Constants.JDBC_QUERY_FIELD_NAMES)); fieldTypesProperty = Preconditions.checkNotNull(conf.get(Constants.JDBC_QUERY_FIELD_TYPES)); } else { - fieldNamesProperty = Preconditions.checkNotNull(conf.get(serdeConstants.LIST_COLUMNS)); - fieldTypesProperty = Preconditions.checkNotNull(conf.get(serdeConstants.LIST_COLUMN_TYPES)); + try { + if(conf.get(Constants.JDBC_QUERY) == null) { + ResultSetMetaData metadata = rs.getMetaData(); + int numColumns = metadata.getColumnCount(); + List columnNames = new ArrayList(numColumns); + for (int i = 0; i < numColumns; i++) { + columnNames.add(metadata.getColumnName(i + 1)); + } + fieldNamesProperty = String.join(",",columnNames); + } + else + fieldNamesProperty = Preconditions.checkNotNull(conf.get(serdeConstants.LIST_COLUMNS)); + } + catch (Exception e) { + LOGGER.error("Error while trying to get column names.", e); + throw new HiveJdbcDatabaseAccessException("Error while trying to get column names: " + e.getMessage(), e); + } + fieldTypesProperty = Preconditions.checkNotNull(conf.get(serdeConstants.LIST_COLUMN_TYPES)); } + LOGGER.debug("Iterator ColumnNames = "+fieldNamesProperty); hiveColumnNames = fieldNamesProperty.trim().split(","); hiveColumnTypesList = TypeInfoUtils.getTypeInfosFromTypeString(fieldTypesProperty); } diff --git a/ql/src/test/queries/clientpositive/external_jdbc_table4.q b/ql/src/test/queries/clientpositive/external_jdbc_table4.q index 10e22537a0..685bcb3d49 100644 --- a/ql/src/test/queries/clientpositive/external_jdbc_table4.q +++ b/ql/src/test/queries/clientpositive/external_jdbc_table4.q @@ -129,6 +129,17 @@ SELECT db1_ext_auth1.ikey FROM db1_ext_auth1 LIMIT 10; SELECT db1_ext_auth1.ikey FROM db1_ext_auth1 LIMIT 10; +-- Set CBO off to test column names. +set hive.cbo.enable=false; + +SELECT * FROM db1_ext_auth1; + +SELECT * FROM db2_ext_auth2; + +SELECT * FROM db1_ext_auth2; + +set hive.cbo.enable=true; + DROP TABLE db1_ext_auth1; DROP TABLE db2_ext_auth2; DROP TABLE db1_ext_auth2; diff --git a/ql/src/test/results/clientpositive/llap/external_jdbc_table4.q.out b/ql/src/test/results/clientpositive/llap/external_jdbc_table4.q.out index a7b6961d1f..5993da1f82 100644 --- a/ql/src/test/results/clientpositive/llap/external_jdbc_table4.q.out +++ b/ql/src/test/results/clientpositive/llap/external_jdbc_table4.q.out @@ -582,6 +582,42 @@ POSTHOOK: Input: default@db1_ext_auth1 100 20 44 +PREHOOK: query: SELECT * FROM db1_ext_auth1 +PREHOOK: type: QUERY +PREHOOK: Input: default@db1_ext_auth1 +#### A masked pattern was here #### +POSTHOOK: query: SELECT * FROM db1_ext_auth1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@db1_ext_auth1 +#### A masked pattern was here #### +-20 -20 -20.0 -20.0 +100 -15 65.0 -74.0 +20 20 20.0 20.0 +44 53 -455.454 330.76 +PREHOOK: query: SELECT * FROM db2_ext_auth2 +PREHOOK: type: QUERY +PREHOOK: Input: default@db2_ext_auth2 +#### A masked pattern was here #### +POSTHOOK: query: SELECT * FROM db2_ext_auth2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@db2_ext_auth2 +#### A masked pattern was here #### +-20 8 9.0 11.0 +101 -16 66.0 -75.0 +20 20 20.0 20.0 +40 50 -455.4543 330.767 +PREHOOK: query: SELECT * FROM db1_ext_auth2 +PREHOOK: type: QUERY +PREHOOK: Input: default@db1_ext_auth2 +#### A masked pattern was here #### +POSTHOOK: query: SELECT * FROM db1_ext_auth2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@db1_ext_auth2 +#### A masked pattern was here #### +-20 8 9.0 11.0 +101 -16 66.0 -75.0 +20 20 20.0 20.0 +40 50 -455.4543 330.767 PREHOOK: query: DROP TABLE db1_ext_auth1 PREHOOK: type: DROPTABLE PREHOOK: Input: default@db1_ext_auth1