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/service/src/java/org/apache/hive/service/cli/Column.java b/service/src/java/org/apache/hive/service/cli/Column.java index adb269a..03ba02a 100644 --- a/service/src/java/org/apache/hive/service/cli/Column.java +++ b/service/src/java/org/apache/hive/service/cli/Column.java @@ -31,6 +31,9 @@ import com.google.common.primitives.Ints; import com.google.common.primitives.Longs; import com.google.common.primitives.Shorts; + +import org.apache.hadoop.hive.common.type.HiveDecimal; + import org.apache.hive.service.cli.thrift.TBinaryColumn; import org.apache.hive.service.cli.thrift.TBoolColumn; import org.apache.hive.service.cli.thrift.TByteColumn; @@ -325,6 +328,14 @@ public TColumn toTColumn() { private static final ByteBuffer EMPTY_BINARY = ByteBuffer.allocate(0); private static final String EMPTY_STRING = ""; + public void addValue(ColumnDescriptor columnDescriptor, Object field) { + if (field != null && columnDescriptor.getType() == Type.DECIMAL_TYPE) { + int scale = columnDescriptor.getTypeDescriptor().getDecimalDigits(); + field = ((HiveDecimal) field).toFormatString(scale); + } + addValue(columnDescriptor.getType(), field); + } + public void addValue(Type type, Object field) { switch (type) { case BOOLEAN_TYPE: diff --git a/service/src/java/org/apache/hive/service/cli/ColumnBasedSet.java b/service/src/java/org/apache/hive/service/cli/ColumnBasedSet.java index 47a582e..9b92c53 100644 --- a/service/src/java/org/apache/hive/service/cli/ColumnBasedSet.java +++ b/service/src/java/org/apache/hive/service/cli/ColumnBasedSet.java @@ -33,11 +33,11 @@ private long startOffset; - private final Type[] types; // non-null only for writing (server-side) + private final ColumnDescriptor[] descriptors; // non-null only for writing (server-side) private final List columns; public ColumnBasedSet(TableSchema schema) { - types = schema.toTypes(); + descriptors = schema.toColumnDescriptors(); columns = new ArrayList(); for (ColumnDescriptor colDesc : schema.getColumnDescriptors()) { columns.add(new Column(colDesc.getType())); @@ -45,7 +45,7 @@ public ColumnBasedSet(TableSchema schema) { } public ColumnBasedSet(TRowSet tRowSet) { - types = null; + descriptors = null; columns = new ArrayList(); for (TColumn tvalue : tRowSet.getColumns()) { columns.add(new Column(tvalue)); @@ -53,8 +53,8 @@ public ColumnBasedSet(TRowSet tRowSet) { startOffset = tRowSet.getStartRowOffset(); } - private ColumnBasedSet(Type[] types, List columns, long startOffset) { - this.types = types; + private ColumnBasedSet(ColumnDescriptor[] descriptors, List columns, long startOffset) { + this.descriptors = descriptors; this.columns = columns; this.startOffset = startOffset; } @@ -62,7 +62,7 @@ private ColumnBasedSet(Type[] types, List columns, long startOffset) { @Override public ColumnBasedSet addRow(Object[] fields) { for (int i = 0; i < fields.length; i++) { - columns.get(i).addValue(types[i], fields[i]); + columns.get(i).addValue(descriptors[i], fields[i]); } return this; } @@ -89,7 +89,7 @@ public ColumnBasedSet extractSubset(int maxRows) { for (int i = 0; i < columns.size(); i++) { subset.add(columns.get(i).extractSubset(0, numRows)); } - ColumnBasedSet result = new ColumnBasedSet(types, subset, startOffset); + ColumnBasedSet result = new ColumnBasedSet(descriptors, subset, startOffset); startOffset += numRows; return result; } diff --git a/service/src/java/org/apache/hive/service/cli/ColumnValue.java b/service/src/java/org/apache/hive/service/cli/ColumnValue.java index 662bd93..22b021d 100644 --- a/service/src/java/org/apache/hive/service/cli/ColumnValue.java +++ b/service/src/java/org/apache/hive/service/cli/ColumnValue.java @@ -138,10 +138,11 @@ private static TColumnValue timestampValue(Timestamp value) { return TColumnValue.stringVal(tStringValue); } - private static TColumnValue stringValue(HiveDecimal value) { + private static TColumnValue stringValue(HiveDecimal value, ColumnDescriptor columnDescriptor) { TStringValue tStrValue = new TStringValue(); if (value != null) { - tStrValue.setValue(value.toString()); + int scale = columnDescriptor.getTypeDescriptor().getDecimalDigits(); + tStrValue.setValue(value.toFormatString(scale)); } return TColumnValue.stringVal(tStrValue); } @@ -162,7 +163,9 @@ private static TColumnValue stringValue(HiveIntervalDayTime value) { return TColumnValue.stringVal(tStrValue); } - public static TColumnValue toTColumnValue(Type type, Object value) { + public static TColumnValue toTColumnValue(ColumnDescriptor columnDescriptor, Object value) { + Type type = columnDescriptor.getType(); + switch (type) { case BOOLEAN_TYPE: return booleanValue((Boolean)value); @@ -193,7 +196,7 @@ public static TColumnValue toTColumnValue(Type type, Object value) { case INTERVAL_DAY_TIME_TYPE: return stringValue((HiveIntervalDayTime) value); case DECIMAL_TYPE: - return stringValue(((HiveDecimal)value)); + return stringValue((HiveDecimal)value, columnDescriptor); case BINARY_TYPE: return stringValue((String)value); case ARRAY_TYPE: diff --git a/service/src/java/org/apache/hive/service/cli/RowBasedSet.java b/service/src/java/org/apache/hive/service/cli/RowBasedSet.java index a0ee210..6e765c2 100644 --- a/service/src/java/org/apache/hive/service/cli/RowBasedSet.java +++ b/service/src/java/org/apache/hive/service/cli/RowBasedSet.java @@ -33,22 +33,22 @@ private long startOffset; - private final Type[] types; // non-null only for writing (server-side) + private final ColumnDescriptor[] descriptors; // non-null only for writing (server-side) private final RemovableList rows; public RowBasedSet(TableSchema schema) { - types = schema.toTypes(); + descriptors = schema.toColumnDescriptors(); rows = new RemovableList(); } public RowBasedSet(TRowSet tRowSet) { - types = null; + descriptors = null; rows = new RemovableList(tRowSet.getRows()); startOffset = tRowSet.getStartRowOffset(); } - private RowBasedSet(Type[] types, List rows, long startOffset) { - this.types = types; + private RowBasedSet(ColumnDescriptor[] descriptors, List rows, long startOffset) { + this.descriptors = descriptors; this.rows = new RemovableList(rows); this.startOffset = startOffset; } @@ -57,7 +57,7 @@ private RowBasedSet(Type[] types, List rows, long startOffset) { public RowBasedSet addRow(Object[] fields) { TRow tRow = new TRow(); for (int i = 0; i < fields.length; i++) { - tRow.addToColVals(ColumnValue.toTColumnValue(types[i], fields[i])); + tRow.addToColVals(ColumnValue.toTColumnValue(descriptors[i], fields[i])); } rows.add(tRow); return this; @@ -75,7 +75,7 @@ public int numRows() { public RowBasedSet extractSubset(int maxRows) { int numRows = Math.min(numRows(), maxRows); - RowBasedSet result = new RowBasedSet(types, rows.subList(0, numRows), startOffset); + RowBasedSet result = new RowBasedSet(descriptors, rows.subList(0, numRows), startOffset); rows.removeRange(0, numRows); startOffset += numRows; return result; diff --git a/service/src/java/org/apache/hive/service/cli/TableSchema.java b/service/src/java/org/apache/hive/service/cli/TableSchema.java index ee019bc..190359a 100644 --- a/service/src/java/org/apache/hive/service/cli/TableSchema.java +++ b/service/src/java/org/apache/hive/service/cli/TableSchema.java @@ -82,10 +82,10 @@ public TTableSchema toTTableSchema() { return tTableSchema; } - public Type[] toTypes() { - Type[] types = new Type[columns.size()]; + public ColumnDescriptor[] toColumnDescriptors() { + ColumnDescriptor[] types = new ColumnDescriptor[columns.size()]; for (int i = 0; i < types.length; i++) { - types[i] = columns.get(i).getType(); + types[i] = columns.get(i); } return types; }