Index: jdbc/src/test/org/apache/hadoop/hive/jdbc/TestJdbcDriver.java =================================================================== --- jdbc/src/test/org/apache/hadoop/hive/jdbc/TestJdbcDriver.java (revision 1328796) +++ jdbc/src/test/org/apache/hadoop/hive/jdbc/TestJdbcDriver.java (working copy) @@ -30,6 +30,7 @@ import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; +import java.sql.Timestamp; import java.sql.Types; import java.util.Arrays; import java.util.HashMap; @@ -147,7 +148,8 @@ + " c13 array>," + " c14 map>," + " c15 struct>," - + " c16 array,n:int>>) comment '"+dataTypeTableComment + + " c16 array,n:int>>," + + " c17 timestamp) comment '"+dataTypeTableComment +"' partitioned by (dt STRING)"); assertFalse(res.next()); @@ -378,6 +380,8 @@ assertEquals("{}", res.getString(14)); assertEquals("[null, null]", res.getString(15)); assertEquals("[]", res.getString(16)); + assertEquals(null, res.getString(17)); + assertEquals(null, res.getTimestamp(17)); // row 3 assertTrue(res.next()); @@ -397,6 +401,10 @@ assertEquals("{1={11=12, 13=14}, 2={21=22}}", res.getString(14)); assertEquals("[1, [2, x]]", res.getString(15)); assertEquals("[[{}, 1], [{c=d, a=b}, 2]]", res.getString(16)); + Timestamp ts = new Timestamp(1335052800000L); + ts.setNanos(123456789); + assertEquals("2012-04-22 09:00:00.123456789", res.getString(17)); + assertEquals(ts, res.getTimestamp(17)); // test getBoolean rules on non-boolean columns assertEquals(true, res.getBoolean(1)); @@ -794,13 +802,13 @@ ResultSet res = stmt.executeQuery( "select c1, c2, c3, c4, c5 as a, c6, c7, c8, c9, c10, c11, c12, " + - "c1*2, sentences(null, null, null) as b from " + dataTypeTableName + " limit 1"); + "c1*2, sentences(null, null, null) as b, c17 from " + dataTypeTableName + " limit 1"); ResultSetMetaData meta = res.getMetaData(); ResultSet colRS = con.getMetaData().getColumns(null, null, dataTypeTableName.toLowerCase(), null); - assertEquals(14, meta.getColumnCount()); + assertEquals(15, meta.getColumnCount()); assertTrue(colRS.next()); @@ -996,6 +1004,13 @@ assertEquals(Integer.MAX_VALUE, meta.getPrecision(14)); assertEquals(0, meta.getScale(14)); + assertEquals("c17", meta.getColumnName(15)); + assertEquals(Types.TIMESTAMP, meta.getColumnType(15)); + assertEquals("timestamp", meta.getColumnTypeName(15)); + assertEquals(29, meta.getColumnDisplaySize(15)); + assertEquals(29, meta.getPrecision(15)); + assertEquals(9, meta.getScale(15)); + for (int i = 1; i <= meta.getColumnCount(); i++) { assertFalse(meta.isAutoIncrement(i)); assertFalse(meta.isCurrency(i)); Index: jdbc/src/java/org/apache/hadoop/hive/jdbc/JdbcColumn.java =================================================================== --- jdbc/src/java/org/apache/hadoop/hive/jdbc/JdbcColumn.java (revision 1328796) +++ jdbc/src/java/org/apache/hadoop/hive/jdbc/JdbcColumn.java (working copy) @@ -74,7 +74,8 @@ case Types.INTEGER: case Types.BIGINT: return columnPrecision(columnType) + 1; // allow +/- - + case Types.TIMESTAMP: + return columnPrecision(columnType); // see http://download.oracle.com/javase/6/docs/api/constant-values.html#java.lang.Float.MAX_EXPONENT case Types.FLOAT: return 24; // e.g. -(17#).e-### @@ -105,6 +106,8 @@ return 7; case Types.DOUBLE: return 15; + case Types.TIMESTAMP: + return 29; default: throw new SQLException("Invalid column type: " + columnType); } @@ -124,6 +127,8 @@ return 7; case Types.DOUBLE: return 15; + case Types.TIMESTAMP: + return 9; default: throw new SQLException("Invalid column type: " + columnType); } Index: jdbc/src/java/org/apache/hadoop/hive/jdbc/Utils.java =================================================================== --- jdbc/src/java/org/apache/hadoop/hive/jdbc/Utils.java (revision 1328796) +++ jdbc/src/java/org/apache/hadoop/hive/jdbc/Utils.java (working copy) @@ -46,6 +46,8 @@ return Types.INTEGER; } else if ("bigint".equalsIgnoreCase(type)) { return Types.BIGINT; + } else if ("timestamp".equalsIgnoreCase(type)) { + return Types.TIMESTAMP; } else if (type.startsWith("map<")) { return Types.VARCHAR; } else if (type.startsWith("array<")) { Index: jdbc/src/java/org/apache/hadoop/hive/jdbc/HiveBaseResultSet.java =================================================================== --- jdbc/src/java/org/apache/hadoop/hive/jdbc/HiveBaseResultSet.java (revision 1328796) +++ jdbc/src/java/org/apache/hadoop/hive/jdbc/HiveBaseResultSet.java (working copy) @@ -467,11 +467,18 @@ } public Timestamp getTimestamp(int columnIndex) throws SQLException { - throw new SQLException("Method not supported"); + Object obj = getObject(columnIndex); + if (obj == null) { + return null; + } + if (obj instanceof Timestamp){ + return (Timestamp) obj; + } + throw new SQLException("Illegal conversion"); } public Timestamp getTimestamp(String columnName) throws SQLException { - throw new SQLException("Method not supported"); + return getTimestamp(findColumn(columnName)); } public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException { Index: jdbc/src/java/org/apache/hadoop/hive/jdbc/HiveResultSetMetaData.java =================================================================== --- jdbc/src/java/org/apache/hadoop/hive/jdbc/HiveResultSetMetaData.java (revision 1328796) +++ jdbc/src/java/org/apache/hadoop/hive/jdbc/HiveResultSetMetaData.java (working copy) @@ -20,7 +20,6 @@ import java.sql.ResultSetMetaData; import java.sql.SQLException; -import java.sql.Types; import java.util.List; import org.apache.hadoop.hive.serde.Constants; @@ -111,6 +110,8 @@ return Constants.INT_TYPE_NAME; } else if ("bigint".equalsIgnoreCase(type)) { return Constants.BIGINT_TYPE_NAME; + } else if ("timestamp".equalsIgnoreCase(type)) { + return Constants.TIMESTAMP_TYPE_NAME; } else if (type.startsWith("map<")) { return Constants.STRING_TYPE_NAME; } else if (type.startsWith("array<")) { Index: data/files/datatypes.txt =================================================================== --- data/files/datatypes.txt (revision 1328796) +++ data/files/datatypes.txt (working copy) @@ -1,3 +1,3 @@ -\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 -1true1.11121x2ykva92.2111.01abcd1111213142212212x1abcd2 +\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 +1true1.11121x2ykva92.2111.01abcd1111213142212212x1abcd22012-04-22 09:00:00.123456789