You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by br...@apache.org on 2013/11/06 17:39:41 UTC
svn commit: r1539390 - in /hive/trunk:
itests/hive-unit/src/test/java/org/apache/hive/jdbc/
jdbc/src/java/org/apache/hive/jdbc/ service/if/
service/src/gen/thrift/gen-javabean/org/apache/hive/service/cli/thrift/
service/src/java/org/apache/hive/service...
Author: brock
Date: Wed Nov 6 16:39:40 2013
New Revision: 1539390
URL: http://svn.apache.org/r1539390
Log:
HIVE-5355 - JDBC support for decimal precision/scale
Modified:
hive/trunk/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java
hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java
hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HiveQueryResultSet.java
hive/trunk/jdbc/src/java/org/apache/hive/jdbc/JdbcColumn.java
hive/trunk/jdbc/src/java/org/apache/hive/jdbc/JdbcColumnAttributes.java
hive/trunk/service/if/TCLIService.thrift
hive/trunk/service/src/gen/thrift/gen-javabean/org/apache/hive/service/cli/thrift/TCLIServiceConstants.java
hive/trunk/service/src/gen/thrift/gen-javabean/org/apache/hive/service/cli/thrift/TProtocolVersion.java
hive/trunk/service/src/java/org/apache/hive/service/cli/ColumnValue.java
hive/trunk/service/src/java/org/apache/hive/service/cli/TypeQualifiers.java
Modified: hive/trunk/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java
URL: http://svn.apache.org/viewvc/hive/trunk/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java?rev=1539390&r1=1539389&r2=1539390&view=diff
==============================================================================
--- hive/trunk/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java (original)
+++ hive/trunk/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java Wed Nov 6 16:39:40 2013
@@ -400,34 +400,34 @@ public class TestJdbcDriver2 {
for (int i = 1; i < meta.getColumnCount(); i++) {
assertNull(res.getObject(i));
}
-
}
@Test
public void testErrorDiag() throws SQLException {
Statement stmt = con.createStatement();
-
// verify syntax error
try {
- ResultSet res = stmt.executeQuery("select from " + dataTypeTableName);
+ stmt.executeQuery("select from " + dataTypeTableName);
+ fail("SQLException is expected");
} catch (SQLException e) {
assertEquals("42000", e.getSQLState());
}
// verify table not fuond error
try {
- ResultSet res = stmt.executeQuery("select * from nonTable");
+ stmt.executeQuery("select * from nonTable");
+ fail("SQLException is expected");
} catch (SQLException e) {
assertEquals("42S02", e.getSQLState());
}
// verify invalid column error
try {
- ResultSet res = stmt.executeQuery("select zzzz from " + dataTypeTableName);
+ stmt.executeQuery("select zzzz from " + dataTypeTableName);
+ fail("SQLException is expected");
} catch (SQLException e) {
assertEquals("42000", e.getSQLState());
}
-
}
/**
@@ -1523,9 +1523,9 @@ public class TestJdbcDriver2 {
assertEquals("c18", meta.getColumnName(16));
assertEquals(Types.DECIMAL, meta.getColumnType(16));
assertEquals("decimal", meta.getColumnTypeName(16));
- assertEquals(Integer.MAX_VALUE, meta.getColumnDisplaySize(16));
- assertEquals(Integer.MAX_VALUE, meta.getPrecision(16));
- assertEquals(Integer.MAX_VALUE, meta.getScale(16));
+ assertEquals(18, meta.getColumnDisplaySize(16));
+ assertEquals(16, meta.getPrecision(16));
+ assertEquals(7, meta.getScale(16));
assertEquals("c20", meta.getColumnName(17));
assertEquals(Types.DATE, meta.getColumnType(17));
@@ -1589,7 +1589,7 @@ public class TestJdbcDriver2 {
@Test
public void testParseUrlHttpMode() throws SQLException {
- HiveDriver driver = new HiveDriver();
+ new HiveDriver();
for (String[] testValues : HTTP_URL_PROPERTIES) {
JdbcConnectionParams params = Utils.parseURL(testValues[0]);
assertEquals(params.getHost(), testValues[1]);
Modified: hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java
URL: http://svn.apache.org/viewvc/hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java?rev=1539390&r1=1539389&r2=1539390&view=diff
==============================================================================
--- hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java (original)
+++ hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java Wed Nov 6 16:39:40 2013
@@ -127,6 +127,7 @@ public class HiveConnection implements j
supportedProtocols.add(TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V1);
supportedProtocols.add(TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V2);
supportedProtocols.add(TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V3);
+ supportedProtocols.add(TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V4);
// open client session
openSession();
Modified: hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HiveQueryResultSet.java
URL: http://svn.apache.org/viewvc/hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HiveQueryResultSet.java?rev=1539390&r1=1539389&r2=1539390&view=diff
==============================================================================
--- hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HiveQueryResultSet.java (original)
+++ hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HiveQueryResultSet.java Wed Nov 6 16:39:40 2013
@@ -29,6 +29,7 @@ import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hive.common.type.HiveDecimal;
import org.apache.hive.service.cli.TableSchema;
import org.apache.hive.service.cli.thrift.TCLIService;
import org.apache.hive.service.cli.thrift.TCLIServiceConstants;
@@ -188,6 +189,12 @@ public class HiveQueryResultSet extends
ret = new JdbcColumnAttributes(val.getI32Value(), 0);
}
break;
+ case DECIMAL_TYPE:
+ TTypeQualifierValue prec = tq.getQualifiers().get(TCLIServiceConstants.PRECISION);
+ TTypeQualifierValue scale = tq.getQualifiers().get(TCLIServiceConstants.SCALE);
+ ret = new JdbcColumnAttributes(prec == null ? HiveDecimal.DEFAULT_PRECISION : prec.getI32Value(),
+ scale == null ? HiveDecimal.DEFAULT_SCALE : scale.getI32Value());
+ break;
default:
break;
}
Modified: hive/trunk/jdbc/src/java/org/apache/hive/jdbc/JdbcColumn.java
URL: http://svn.apache.org/viewvc/hive/trunk/jdbc/src/java/org/apache/hive/jdbc/JdbcColumn.java?rev=1539390&r1=1539389&r2=1539390&view=diff
==============================================================================
--- hive/trunk/jdbc/src/java/org/apache/hive/jdbc/JdbcColumn.java (original)
+++ hive/trunk/jdbc/src/java/org/apache/hive/jdbc/JdbcColumn.java Wed Nov 6 16:39:40 2013
@@ -70,10 +70,7 @@ public class JdbcColumn {
case Types.BOOLEAN:
return columnPrecision(columnType, columnAttributes);
case Types.VARCHAR:
- if (columnAttributes != null) {
- return columnAttributes.precision;
- }
- return Integer.MAX_VALUE; // hive has no max limit for strings
+ return columnPrecision(columnType, columnAttributes);
case Types.TINYINT:
case Types.SMALLINT:
case Types.INTEGER:
@@ -91,10 +88,7 @@ public class JdbcColumn {
case Types.DOUBLE:
return 25; // e.g. -(17#).e-####
case Types.DECIMAL:
- if (columnAttributes != null) {
- return columnAttributes.precision + 2; // '-' sign and '.'
- }
- return Integer.MAX_VALUE;
+ return columnPrecision(columnType, columnAttributes) + 2; // '-' sign and '.'
default:
throw new SQLException("Invalid column type: " + columnType);
}
@@ -128,10 +122,7 @@ public class JdbcColumn {
case Types.TIMESTAMP:
return 29;
case Types.DECIMAL:
- if (columnAttributes != null) {
- return columnAttributes.precision;
- }
- return Integer.MAX_VALUE;
+ return columnAttributes.precision;
default:
throw new SQLException("Invalid column type: " + columnType);
}
@@ -156,10 +147,7 @@ public class JdbcColumn {
case Types.TIMESTAMP:
return 9;
case Types.DECIMAL:
- if (columnAttributes != null) {
- return columnAttributes.scale;
- }
- return Integer.MAX_VALUE;
+ return columnAttributes.scale;
default:
throw new SQLException("Invalid column type: " + columnType);
}
Modified: hive/trunk/jdbc/src/java/org/apache/hive/jdbc/JdbcColumnAttributes.java
URL: http://svn.apache.org/viewvc/hive/trunk/jdbc/src/java/org/apache/hive/jdbc/JdbcColumnAttributes.java?rev=1539390&r1=1539389&r2=1539390&view=diff
==============================================================================
--- hive/trunk/jdbc/src/java/org/apache/hive/jdbc/JdbcColumnAttributes.java (original)
+++ hive/trunk/jdbc/src/java/org/apache/hive/jdbc/JdbcColumnAttributes.java Wed Nov 6 16:39:40 2013
@@ -29,4 +29,10 @@ class JdbcColumnAttributes {
this.precision = precision;
this.scale = scale;
}
+
+ @Override
+ public String toString() {
+ return "(" + precision + "," + scale + ")";
+ }
+
}
\ No newline at end of file
Modified: hive/trunk/service/if/TCLIService.thrift
URL: http://svn.apache.org/viewvc/hive/trunk/service/if/TCLIService.thrift?rev=1539390&r1=1539389&r2=1539390&view=diff
==============================================================================
--- hive/trunk/service/if/TCLIService.thrift (original)
+++ hive/trunk/service/if/TCLIService.thrift Wed Nov 6 16:39:40 2013
@@ -168,6 +168,10 @@ typedef i32 TTypeEntryPtr
// Valid TTypeQualifiers key names
const string CHARACTER_MAXIMUM_LENGTH = "characterMaximumLength"
+// Type qualifier key name for decimal
+const string PRECISION = "precision"
+const string SCALE = "scale"
+
union TTypeQualifierValue {
1: optional i32 i32Value
2: optional string stringValue
@@ -497,7 +501,7 @@ struct TOpenSessionResp {
1: required TStatus status
// The protocol version that the server is using.
- 2: required TProtocolVersion serverProtocolVersion = TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V3
+ 2: required TProtocolVersion serverProtocolVersion = TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V4
// Session Handle
3: optional TSessionHandle sessionHandle
Modified: hive/trunk/service/src/gen/thrift/gen-javabean/org/apache/hive/service/cli/thrift/TCLIServiceConstants.java
URL: http://svn.apache.org/viewvc/hive/trunk/service/src/gen/thrift/gen-javabean/org/apache/hive/service/cli/thrift/TCLIServiceConstants.java?rev=1539390&r1=1539389&r2=1539390&view=diff
==============================================================================
--- hive/trunk/service/src/gen/thrift/gen-javabean/org/apache/hive/service/cli/thrift/TCLIServiceConstants.java (original)
+++ hive/trunk/service/src/gen/thrift/gen-javabean/org/apache/hive/service/cli/thrift/TCLIServiceConstants.java Wed Nov 6 16:39:40 2013
@@ -6,30 +6,10 @@
*/
package org.apache.hive.service.cli.thrift;
-import org.apache.commons.lang.builder.HashCodeBuilder;
-import org.apache.thrift.scheme.IScheme;
-import org.apache.thrift.scheme.SchemeFactory;
-import org.apache.thrift.scheme.StandardScheme;
-
-import org.apache.thrift.scheme.TupleScheme;
-import org.apache.thrift.protocol.TTupleProtocol;
-import org.apache.thrift.protocol.TProtocolException;
-import org.apache.thrift.EncodingUtils;
-import org.apache.thrift.TException;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Map;
import java.util.HashMap;
-import java.util.EnumMap;
-import java.util.Set;
import java.util.HashSet;
-import java.util.EnumSet;
-import java.util.Collections;
-import java.util.BitSet;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.util.Map;
+import java.util.Set;
public class TCLIServiceConstants {
@@ -88,6 +68,9 @@ public class TCLIServiceConstants {
TYPE_NAMES.put(org.apache.hive.service.cli.thrift.TTypeId.VARCHAR_TYPE, "VARCHAR");
}
+ // Constants for column type attributes.
public static final String CHARACTER_MAXIMUM_LENGTH = "characterMaximumLength";
+ public static final String PRECISION = "precision";
+ public static final String SCALE = "scale";
}
Modified: hive/trunk/service/src/gen/thrift/gen-javabean/org/apache/hive/service/cli/thrift/TProtocolVersion.java
URL: http://svn.apache.org/viewvc/hive/trunk/service/src/gen/thrift/gen-javabean/org/apache/hive/service/cli/thrift/TProtocolVersion.java?rev=1539390&r1=1539389&r2=1539390&view=diff
==============================================================================
--- hive/trunk/service/src/gen/thrift/gen-javabean/org/apache/hive/service/cli/thrift/TProtocolVersion.java (original)
+++ hive/trunk/service/src/gen/thrift/gen-javabean/org/apache/hive/service/cli/thrift/TProtocolVersion.java Wed Nov 6 16:39:40 2013
@@ -7,14 +7,12 @@
package org.apache.hive.service.cli.thrift;
-import java.util.Map;
-import java.util.HashMap;
-import org.apache.thrift.TEnum;
public enum TProtocolVersion implements org.apache.thrift.TEnum {
HIVE_CLI_SERVICE_PROTOCOL_V1(0),
HIVE_CLI_SERVICE_PROTOCOL_V2(1),
- HIVE_CLI_SERVICE_PROTOCOL_V3(2);
+ HIVE_CLI_SERVICE_PROTOCOL_V3(2),
+ HIVE_CLI_SERVICE_PROTOCOL_V4(3);
private final int value;
@@ -33,7 +31,7 @@ public enum TProtocolVersion implements
* Find a the enum type by its integer value, as defined in the Thrift IDL.
* @return null if the value is not found.
*/
- public static TProtocolVersion findByValue(int value) {
+ public static TProtocolVersion findByValue(int value) {
switch (value) {
case 0:
return HIVE_CLI_SERVICE_PROTOCOL_V1;
@@ -41,6 +39,8 @@ public enum TProtocolVersion implements
return HIVE_CLI_SERVICE_PROTOCOL_V2;
case 2:
return HIVE_CLI_SERVICE_PROTOCOL_V3;
+ case 3:
+ return HIVE_CLI_SERVICE_PROTOCOL_V4;
default:
return null;
}
Modified: hive/trunk/service/src/java/org/apache/hive/service/cli/ColumnValue.java
URL: http://svn.apache.org/viewvc/hive/trunk/service/src/java/org/apache/hive/service/cli/ColumnValue.java?rev=1539390&r1=1539389&r2=1539390&view=diff
==============================================================================
--- hive/trunk/service/src/java/org/apache/hive/service/cli/ColumnValue.java (original)
+++ hive/trunk/service/src/java/org/apache/hive/service/cli/ColumnValue.java Wed Nov 6 16:39:40 2013
@@ -146,7 +146,7 @@ public class ColumnValue {
public static ColumnValue stringValue(HiveDecimal value) {
TStringValue tStrValue = new TStringValue();
if (value != null) {
- tStrValue.setValue(((HiveDecimal)value).toString());
+ tStrValue.setValue(value.toString());
}
return new ColumnValue(TColumnValue.stringVal(tStrValue));
}
Modified: hive/trunk/service/src/java/org/apache/hive/service/cli/TypeQualifiers.java
URL: http://svn.apache.org/viewvc/hive/trunk/service/src/java/org/apache/hive/service/cli/TypeQualifiers.java?rev=1539390&r1=1539389&r2=1539390&view=diff
==============================================================================
--- hive/trunk/service/src/java/org/apache/hive/service/cli/TypeQualifiers.java (original)
+++ hive/trunk/service/src/java/org/apache/hive/service/cli/TypeQualifiers.java Wed Nov 6 16:39:40 2013
@@ -21,6 +21,7 @@ package org.apache.hive.service.cli;
import java.util.HashMap;
import java.util.Map;
+import org.apache.hadoop.hive.serde2.typeinfo.DecimalTypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.VarcharTypeInfo;
import org.apache.hive.service.cli.thrift.TCLIServiceConstants;
@@ -33,6 +34,8 @@ import org.apache.hive.service.cli.thrif
*/
public class TypeQualifiers {
private Integer characterMaximumLength;
+ private Integer precision;
+ private Integer scale;
public TypeQualifiers() {}
@@ -53,6 +56,18 @@ public class TypeQualifiers {
qMap.put(TCLIServiceConstants.CHARACTER_MAXIMUM_LENGTH, val);
}
+ if (precision != null) {
+ TTypeQualifierValue val = new TTypeQualifierValue();
+ val.setI32Value(precision.intValue());
+ qMap.put(TCLIServiceConstants.PRECISION, val);
+ }
+
+ if (scale != null) {
+ TTypeQualifierValue val = new TTypeQualifierValue();
+ val.setI32Value(scale.intValue());
+ qMap.put(TCLIServiceConstants.SCALE, val);
+ }
+
if (qMap.size() > 0) {
ret = new TTypeQualifiers(qMap);
}
@@ -70,18 +85,46 @@ public class TypeQualifiers {
ret.setCharacterMaximumLength(
tqMap.get(TCLIServiceConstants.CHARACTER_MAXIMUM_LENGTH).getI32Value());
}
+
+ if (tqMap.containsKey(TCLIServiceConstants.PRECISION)) {
+ ret.setPrecision(tqMap.get(TCLIServiceConstants.PRECISION).getI32Value());
+ }
+
+ if (tqMap.containsKey(TCLIServiceConstants.SCALE)) {
+ ret.setScale(tqMap.get(TCLIServiceConstants.SCALE).getI32Value());
+ }
}
return ret;
}
public static TypeQualifiers fromTypeInfo(PrimitiveTypeInfo pti) {
+ TypeQualifiers result = null;
if (pti instanceof VarcharTypeInfo) {
- TypeQualifiers ret = new TypeQualifiers();
- ret.setCharacterMaximumLength(((VarcharTypeInfo)pti).getLength());
- return ret;
- } else {
- return null;
+ result = new TypeQualifiers();
+ result.setCharacterMaximumLength(((VarcharTypeInfo)pti).getLength());
+
+ } else if (pti instanceof DecimalTypeInfo) {
+ result = new TypeQualifiers();
+ result.setPrecision(((DecimalTypeInfo)pti).precision());
+ result.setScale(((DecimalTypeInfo)pti).scale());
}
+ return result;
+ }
+
+ public Integer getPrecision() {
+ return precision;
+ }
+
+ public void setPrecision(Integer precision) {
+ this.precision = precision;
+ }
+
+ public Integer getScale() {
+ return scale;
+ }
+
+ public void setScale(Integer scale) {
+ this.scale = scale;
}
}