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); }