diff --git a/data/files/datatypes.txt b/data/files/datatypes.txt index 458c5bd..0872a1f 100644 --- a/data/files/datatypes.txt +++ b/data/files/datatypes.txt @@ -1,3 +1,3 @@ \N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N\N -1false-1.1\N\N\N-1-1-1.0-1\N\N\N\N\N\N\N\N\N -1true1.11121x2ykva92.2111.01abcd1111213142212212x1abcd22012-04-22 09:00:00.123456789123456789.0123456YWJjZA==2013-01-01abc123abc123X'01FF' +1true1.11121x2ykva92.2111.01abcd1111213142212212x1abcd22012-04-22 09:00:00.123456789123456789.123456YWJjZA==2013-01-01abc123abc123X'01FF' diff --git a/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java b/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java index 7bbacd5..c683b9e 100644 --- a/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java +++ b/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java @@ -896,7 +896,7 @@ public void testDataTypes() throws Exception { assertEquals("[{\"m\":{},\"n\":1},{\"m\":{\"a\":\"b\",\"c\":\"d\"},\"n\":2}]", res.getString(16)); assertEquals("2012-04-22 09:00:00.123456789", res.getString(17)); assertEquals("2012-04-22 09:00:00.123456789", res.getTimestamp(17).toString()); - assertEquals("123456789.0123456", res.getBigDecimal(18).toString()); + assertEquals("123456789.1234560", res.getBigDecimal(18).toString()); assertEquals("abcd", res.getString(19)); assertEquals("2013-01-01", res.getString(20)); assertEquals("2013-01-01", res.getDate(20).toString()); diff --git a/jdbc/src/java/org/apache/hive/jdbc/HiveBaseResultSet.java b/jdbc/src/java/org/apache/hive/jdbc/HiveBaseResultSet.java index 98d0370..574fba1 100644 --- a/jdbc/src/java/org/apache/hive/jdbc/HiveBaseResultSet.java +++ b/jdbc/src/java/org/apache/hive/jdbc/HiveBaseResultSet.java @@ -46,6 +46,7 @@ import org.apache.hadoop.hive.common.type.HiveIntervalDayTime; import org.apache.hadoop.hive.common.type.HiveIntervalYearMonth; +import org.apache.hive.service.cli.ColumnDescriptor; import org.apache.hive.service.cli.TableSchema; import org.apache.hive.service.cli.Type; @@ -417,22 +418,23 @@ private Object getColumnValue(int columnIndex) throws SQLException { if (columnIndex > row.length) { throw new SQLException("Invalid columnIndex: " + columnIndex); } - Type columnType = getSchema().getColumnDescriptorAt(columnIndex - 1).getType(); + ColumnDescriptor columnDescriptor = getSchema().getColumnDescriptorAt(columnIndex - 1); try { - Object evaluated = evaluate(columnType, row[columnIndex - 1]); + Object evaluated = evaluate(columnDescriptor, row[columnIndex - 1]); wasNull = evaluated == null; return evaluated; } catch (Exception e) { e.printStackTrace(); - throw new SQLException("Unrecognized column type:" + columnType, e); + throw new SQLException("Unrecognized column type:" + columnDescriptor.getType(), e); } } - private Object evaluate(Type type, Object value) { + private Object evaluate(ColumnDescriptor columnDescriptor, Object value) { if (value == null) { return null; } + Type type = columnDescriptor.getType(); switch (type) { case BINARY_TYPE: if (value instanceof String) { @@ -442,7 +444,13 @@ private Object evaluate(Type type, Object value) { case TIMESTAMP_TYPE: return Timestamp.valueOf((String) value); case DECIMAL_TYPE: - return new BigDecimal((String)value); + BigDecimal val = new BigDecimal((String)value); + // Value may have truncated trailing 0s. Match the column's specified scale. + int columnScale = columnDescriptor.getTypeDescriptor().getTypeQualifiers().getScale(); + if (val.scale() != columnScale) { + val = val.setScale(columnScale); + } + return val; case DATE_TYPE: return Date.valueOf((String) value); case INTERVAL_YEAR_MONTH_TYPE: