diff --git itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java index 4090e72..716e608 100644 --- itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java +++ itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java @@ -1400,53 +1400,53 @@ public void testResultSetMetaData() throws SQLException { assertTrue(colRS.next()); assertEquals("a", meta.getColumnName(5)); - assertEquals(Types.VARCHAR, meta.getColumnType(5)); - assertEquals("string", meta.getColumnTypeName(5)); + assertEquals(Types.ARRAY, meta.getColumnType(5)); + assertEquals("array", meta.getColumnTypeName(5)); assertEquals(Integer.MAX_VALUE, meta.getColumnDisplaySize(5)); assertEquals(Integer.MAX_VALUE, meta.getPrecision(5)); assertEquals(0, meta.getScale(5)); assertEquals("c5", colRS.getString("COLUMN_NAME")); - assertEquals(Types.VARCHAR, colRS.getInt("DATA_TYPE")); + assertEquals(Types.ARRAY, colRS.getInt("DATA_TYPE")); assertEquals("array", colRS.getString("TYPE_NAME").toLowerCase()); assertTrue(colRS.next()); assertEquals("c6", meta.getColumnName(6)); - assertEquals(Types.VARCHAR, meta.getColumnType(6)); - assertEquals("string", meta.getColumnTypeName(6)); + assertEquals(Types.JAVA_OBJECT, meta.getColumnType(6)); + assertEquals("map", meta.getColumnTypeName(6)); assertEquals(Integer.MAX_VALUE, meta.getColumnDisplaySize(6)); assertEquals(Integer.MAX_VALUE, meta.getPrecision(6)); assertEquals(0, meta.getScale(6)); assertEquals("c6", colRS.getString("COLUMN_NAME")); - assertEquals(Types.VARCHAR, colRS.getInt("DATA_TYPE")); + assertEquals(Types.JAVA_OBJECT, colRS.getInt("DATA_TYPE")); assertEquals("map", colRS.getString("TYPE_NAME").toLowerCase()); assertTrue(colRS.next()); assertEquals("c7", meta.getColumnName(7)); - assertEquals(Types.VARCHAR, meta.getColumnType(7)); - assertEquals("string", meta.getColumnTypeName(7)); + assertEquals(Types.JAVA_OBJECT, meta.getColumnType(7)); + assertEquals("map", meta.getColumnTypeName(7)); assertEquals(Integer.MAX_VALUE, meta.getColumnDisplaySize(7)); assertEquals(Integer.MAX_VALUE, meta.getPrecision(7)); assertEquals(0, meta.getScale(7)); assertEquals("c7", colRS.getString("COLUMN_NAME")); - assertEquals(Types.VARCHAR, colRS.getInt("DATA_TYPE")); + assertEquals(Types.JAVA_OBJECT, colRS.getInt("DATA_TYPE")); assertEquals("map", colRS.getString("TYPE_NAME").toLowerCase()); assertTrue(colRS.next()); assertEquals("c8", meta.getColumnName(8)); - assertEquals(Types.VARCHAR, meta.getColumnType(8)); - assertEquals("string", meta.getColumnTypeName(8)); + assertEquals(Types.STRUCT, meta.getColumnType(8)); + assertEquals("struct", meta.getColumnTypeName(8)); assertEquals(Integer.MAX_VALUE, meta.getColumnDisplaySize(8)); assertEquals(Integer.MAX_VALUE, meta.getPrecision(8)); assertEquals(0, meta.getScale(8)); assertEquals("c8", colRS.getString("COLUMN_NAME")); - assertEquals(Types.VARCHAR, colRS.getInt("DATA_TYPE")); + assertEquals(Types.STRUCT, colRS.getInt("DATA_TYPE")); assertEquals("struct", colRS.getString("TYPE_NAME").toLowerCase()); assertTrue(colRS.next()); @@ -1517,8 +1517,8 @@ public void testResultSetMetaData() throws SQLException { assertEquals(0, meta.getScale(13)); assertEquals("b", meta.getColumnName(14)); - assertEquals(Types.VARCHAR, meta.getColumnType(14)); - assertEquals("string", meta.getColumnTypeName(14)); + assertEquals(Types.ARRAY, meta.getColumnType(14)); + assertEquals("array", meta.getColumnTypeName(14)); assertEquals(Integer.MAX_VALUE, meta.getColumnDisplaySize(14)); assertEquals(Integer.MAX_VALUE, meta.getPrecision(14)); assertEquals(0, meta.getScale(14)); diff --git jdbc/src/java/org/apache/hive/jdbc/HiveBaseResultSet.java jdbc/src/java/org/apache/hive/jdbc/HiveBaseResultSet.java index 257c88a..fa8eb88 100644 --- jdbc/src/java/org/apache/hive/jdbc/HiveBaseResultSet.java +++ jdbc/src/java/org/apache/hive/jdbc/HiveBaseResultSet.java @@ -410,6 +410,11 @@ private Object evaluate(Type type, Object value) { return new BigDecimal((String)value); case DATE_TYPE: return Date.valueOf((String) value); + case ARRAY_TYPE: + case MAP_TYPE: + case STRUCT_TYPE: + // todo: returns json string. should recreate object from it? + return value; default: return value; } diff --git jdbc/src/java/org/apache/hive/jdbc/HiveResultSetMetaData.java jdbc/src/java/org/apache/hive/jdbc/HiveResultSetMetaData.java index e89571f..ece4317 100644 --- jdbc/src/java/org/apache/hive/jdbc/HiveResultSetMetaData.java +++ jdbc/src/java/org/apache/hive/jdbc/HiveResultSetMetaData.java @@ -20,7 +20,6 @@ import java.sql.ResultSetMetaData; import java.sql.SQLException; -import java.util.Arrays; import java.util.List; import org.apache.hadoop.hive.serde.serdeConstants; @@ -121,12 +120,12 @@ public String getColumnTypeName(int column) throws SQLException { return serdeConstants.BINARY_TYPE_NAME; } else if ("void".equalsIgnoreCase(type)) { return serdeConstants.VOID_TYPE_NAME; - } else if (type.startsWith("map<")) { - return serdeConstants.STRING_TYPE_NAME; - } else if (type.startsWith("array<")) { - return serdeConstants.STRING_TYPE_NAME; - } else if (type.startsWith("struct<")) { - return serdeConstants.STRING_TYPE_NAME; + } else if (type.equalsIgnoreCase("map")) { + return serdeConstants.MAP_TYPE_NAME; + } else if (type.equalsIgnoreCase("array")) { + return serdeConstants.LIST_TYPE_NAME; + } else if (type.equalsIgnoreCase("struct")) { + return serdeConstants.STRUCT_TYPE_NAME; } throw new SQLException("Unrecognized column type: " + type); diff --git jdbc/src/java/org/apache/hive/jdbc/JdbcColumn.java jdbc/src/java/org/apache/hive/jdbc/JdbcColumn.java index 42ec32a..c8a8aa0 100644 --- jdbc/src/java/org/apache/hive/jdbc/JdbcColumn.java +++ jdbc/src/java/org/apache/hive/jdbc/JdbcColumn.java @@ -90,6 +90,10 @@ static int columnDisplaySize(int columnType, JdbcColumnAttributes columnAttribut return 25; // e.g. -(17#).e-#### case Types.DECIMAL: return columnPrecision(columnType, columnAttributes) + 2; // '-' sign and '.' + case Types.JAVA_OBJECT: + case Types.ARRAY: + case Types.STRUCT: + return Integer.MAX_VALUE; default: throw new SQLException("Invalid column type: " + columnType); } @@ -125,6 +129,10 @@ static int columnPrecision(int columnType, JdbcColumnAttributes columnAttributes return 29; case Types.DECIMAL: return columnAttributes.precision; + case Types.JAVA_OBJECT: + case Types.ARRAY: + case Types.STRUCT: + return Integer.MAX_VALUE; default: throw new SQLException("Invalid column type: " + columnType); } @@ -151,6 +159,10 @@ static int columnScale(int columnType, JdbcColumnAttributes columnAttributes) return 9; case Types.DECIMAL: return columnAttributes.scale; + case Types.JAVA_OBJECT: + case Types.ARRAY: + case Types.STRUCT: + return 0; default: throw new SQLException("Invalid column type: " + columnType); } diff --git jdbc/src/java/org/apache/hive/jdbc/Utils.java jdbc/src/java/org/apache/hive/jdbc/Utils.java index 913dc46..1ed1b5b 100644 --- jdbc/src/java/org/apache/hive/jdbc/Utils.java +++ jdbc/src/java/org/apache/hive/jdbc/Utils.java @@ -140,12 +140,12 @@ public static int hiveTypeToSqlType(String type) throws SQLException { return Types.DECIMAL; } else if ("binary".equalsIgnoreCase(type)) { return Types.BINARY; - } else if (type.startsWith("map<")) { - return Types.VARCHAR; - } else if (type.startsWith("array<")) { - return Types.VARCHAR; - } else if (type.startsWith("struct<")) { - return Types.VARCHAR; + } else if ("map".equalsIgnoreCase(type)) { + return Types.JAVA_OBJECT; + } else if ("array".equalsIgnoreCase(type)) { + return Types.ARRAY; + } else if ("struct".equalsIgnoreCase(type)) { + return Types.STRUCT; } throw new SQLException("Unrecognized column type: " + type); } diff --git service/src/java/org/apache/hive/service/cli/Type.java service/src/java/org/apache/hive/service/cli/Type.java index 9329392..90bd39d 100644 --- service/src/java/org/apache/hive/service/cli/Type.java +++ service/src/java/org/apache/hive/service/cli/Type.java @@ -76,24 +76,24 @@ TTypeId.DECIMAL_TYPE, true, false, false), ARRAY_TYPE("ARRAY", - java.sql.Types.VARCHAR, - TTypeId.STRING_TYPE, + java.sql.Types.ARRAY, + TTypeId.ARRAY_TYPE, true, true), MAP_TYPE("MAP", - java.sql.Types.VARCHAR, - TTypeId.STRING_TYPE, + java.sql.Types.JAVA_OBJECT, + TTypeId.MAP_TYPE, true, true), STRUCT_TYPE("STRUCT", - java.sql.Types.VARCHAR, - TTypeId.STRING_TYPE, + java.sql.Types.STRUCT, + TTypeId.STRUCT_TYPE, true, false), UNION_TYPE("UNIONTYPE", - java.sql.Types.VARCHAR, - TTypeId.STRING_TYPE, + java.sql.Types.OTHER, + TTypeId.UNION_TYPE, true, false), USER_DEFINED_TYPE("USER_DEFINED", - java.sql.Types.VARCHAR, - TTypeId.STRING_TYPE, + java.sql.Types.OTHER, + TTypeId.USER_DEFINED_TYPE, true, false); private final String name;