Author: cws
Date: Mon Aug 15 07:23:18 2011
New Revision: 1157728

URL: http://svn.apache.org/viewvc?rev=1157728&view=rev
Log:
HIVE-2358. JDBC DatabaseMetaData and ResultSetMetaData need to match for 
particular types (Patrick Hunt via cws)

Modified:
    
hive/trunk/jdbc/src/java/org/apache/hadoop/hive/jdbc/HiveResultSetMetaData.java
    hive/trunk/jdbc/src/java/org/apache/hadoop/hive/jdbc/JdbcColumn.java
    hive/trunk/jdbc/src/test/org/apache/hadoop/hive/jdbc/TestJdbcDriver.java

Modified: 
hive/trunk/jdbc/src/java/org/apache/hadoop/hive/jdbc/HiveResultSetMetaData.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/jdbc/src/java/org/apache/hadoop/hive/jdbc/HiveResultSetMetaData.java?rev=1157728&r1=1157727&r2=1157728&view=diff
==============================================================================
--- 
hive/trunk/jdbc/src/java/org/apache/hadoop/hive/jdbc/HiveResultSetMetaData.java 
(original)
+++ 
hive/trunk/jdbc/src/java/org/apache/hadoop/hive/jdbc/HiveResultSetMetaData.java 
Mon Aug 15 07:23:18 2011
@@ -54,7 +54,7 @@ public class HiveResultSetMetaData imple
   public int getColumnDisplaySize(int column) throws SQLException {
     int columnType = getColumnType(column);
 
-    return JdbcColumn.columnSize(columnType);
+    return JdbcColumn.columnDisplaySize(columnType);
   }
 
   public String getColumnLabel(int column) throws SQLException {
@@ -131,22 +131,7 @@ public class HiveResultSetMetaData imple
   public int getScale(int column) throws SQLException {
     int columnType = getColumnType(column);
 
-    // according to hiveTypeToSqlType possible options are:
-    switch(columnType) {
-    case Types.BOOLEAN:
-    case Types.VARCHAR:
-    case Types.TINYINT:
-    case Types.SMALLINT:
-    case Types.INTEGER:
-    case Types.BIGINT:
-      return 0;
-    case Types.FLOAT:
-      return 7;
-    case Types.DOUBLE:
-      return 15;
-    default:
-      throw new SQLException("Invalid column value: " + column);
-    }
+    return JdbcColumn.columnScale(columnType);
   }
 
   public String getSchemaName(int column) throws SQLException {

Modified: hive/trunk/jdbc/src/java/org/apache/hadoop/hive/jdbc/JdbcColumn.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/jdbc/src/java/org/apache/hadoop/hive/jdbc/JdbcColumn.java?rev=1157728&r1=1157727&r2=1157728&view=diff
==============================================================================
--- hive/trunk/jdbc/src/java/org/apache/hadoop/hive/jdbc/JdbcColumn.java 
(original)
+++ hive/trunk/jdbc/src/java/org/apache/hadoop/hive/jdbc/JdbcColumn.java Mon 
Aug 15 07:23:18 2011
@@ -62,7 +62,7 @@ public class JdbcColumn {
     return Utils.hiveTypeToSqlType(type);
   }
 
-  static int columnSize(int columnType) throws SQLException {
+  static int columnDisplaySize(int columnType) throws SQLException {
     // according to hiveTypeToSqlType possible options are:
     switch(columnType) {
     case Types.BOOLEAN:
@@ -110,8 +110,33 @@ public class JdbcColumn {
     }
   }
 
+  static int columnScale(int columnType) throws SQLException {
+    // according to hiveTypeToSqlType possible options are:
+    switch(columnType) {
+    case Types.BOOLEAN:
+    case Types.VARCHAR:
+    case Types.TINYINT:
+    case Types.SMALLINT:
+    case Types.INTEGER:
+    case Types.BIGINT:
+      return 0;
+    case Types.FLOAT:
+      return 7;
+    case Types.DOUBLE:
+      return 15;
+    default:
+      throw new SQLException("Invalid column type: " + columnType);
+    }
+  }
+
   public Integer getColumnSize() throws SQLException {
-    return columnSize(Utils.hiveTypeToSqlType(type));
+    int precision = columnPrecision(Utils.hiveTypeToSqlType(type));
+
+    return precision == 0 ? null : precision;
+  }
+
+  public Integer getDecimalDigits() throws SQLException {
+    return columnScale(Utils.hiveTypeToSqlType(type));
   }
 
   public Integer getNumPrecRadix() {
@@ -132,20 +157,6 @@ public class JdbcColumn {
     }
   }
 
-  public Integer getDecimalDigits() {
-    if (type.equalsIgnoreCase("tinyint")) {
-      return 0;
-    } else if (type.equalsIgnoreCase("smallint")) {
-      return 0;
-    } else if (type.equalsIgnoreCase("int")) {
-      return 0;
-    } else if (type.equalsIgnoreCase("bigint")) {
-      return 0;
-    } else { // anything else including float and double is null
-      return null;
-    }
-  }
-
   public String getComment() {
     return comment;
   }

Modified: 
hive/trunk/jdbc/src/test/org/apache/hadoop/hive/jdbc/TestJdbcDriver.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/jdbc/src/test/org/apache/hadoop/hive/jdbc/TestJdbcDriver.java?rev=1157728&r1=1157727&r2=1157728&view=diff
==============================================================================
--- hive/trunk/jdbc/src/test/org/apache/hadoop/hive/jdbc/TestJdbcDriver.java 
(original)
+++ hive/trunk/jdbc/src/test/org/apache/hadoop/hive/jdbc/TestJdbcDriver.java 
Mon Aug 15 07:23:18 2011
@@ -640,8 +640,8 @@ public class TestJdbcDriver extends Test
     tests.put(new String[]{"%jdbcdriver\\_table%", "_%"}, 2);
 
     for (String[] checkPattern: tests.keySet()) {
-      ResultSet rs = (ResultSet)con.getMetaData().getColumns(null, null
-              , checkPattern[0], checkPattern[1]);
+      ResultSet rs = con.getMetaData().getColumns(null, null, checkPattern[0],
+          checkPattern[1]);
 
       // validate the metadata for the getColumns result set
       ResultSetMetaData rsmd = rs.getMetaData();
@@ -764,84 +764,215 @@ public class TestJdbcDriver extends Test
 
   public void testResultSetMetaData() throws SQLException {
     Statement stmt = con.createStatement();
+
     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");
     ResultSetMetaData meta = res.getMetaData();
 
+    ResultSet colRS = con.getMetaData().getColumns(null, null,
+        dataTypeTableName.toLowerCase(), null);
+
     assertEquals(14, meta.getColumnCount());
 
-    assertEquals("c1", meta.getColumnName(1));
-    assertEquals("c2", meta.getColumnName(2));
-    assertEquals("c3", meta.getColumnName(3));
-    assertEquals("c4", meta.getColumnName(4));
-    assertEquals("a", meta.getColumnName(5));
-    assertEquals("c6", meta.getColumnName(6));
-    assertEquals("c7", meta.getColumnName(7));
-    assertEquals("c8", meta.getColumnName(8));
-    assertEquals("c9", meta.getColumnName(9));
-    assertEquals("c10", meta.getColumnName(10));
-    assertEquals("c11", meta.getColumnName(11));
-    assertEquals("c12", meta.getColumnName(12));
-    assertEquals("_c12", meta.getColumnName(13));
-    assertEquals("b", meta.getColumnName(14));
+    assertTrue(colRS.next());
 
+    assertEquals("c1", meta.getColumnName(1));
     assertEquals(Types.INTEGER, meta.getColumnType(1));
-    assertEquals(Types.BOOLEAN, meta.getColumnType(2));
-    assertEquals(Types.DOUBLE, meta.getColumnType(3));
-    assertEquals(Types.VARCHAR, meta.getColumnType(4));
-    assertEquals(Types.VARCHAR, meta.getColumnType(5));
-    assertEquals(Types.VARCHAR, meta.getColumnType(6));
-    assertEquals(Types.VARCHAR, meta.getColumnType(7));
-    assertEquals(Types.VARCHAR, meta.getColumnType(8));
-    assertEquals(Types.TINYINT, meta.getColumnType(9));
-    assertEquals(Types.SMALLINT, meta.getColumnType(10));
-    assertEquals(Types.FLOAT, meta.getColumnType(11));
-    assertEquals(Types.BIGINT, meta.getColumnType(12));
-    assertEquals(Types.INTEGER, meta.getColumnType(13));
-    assertEquals(Types.VARCHAR, meta.getColumnType(14));
-
     assertEquals("int", meta.getColumnTypeName(1));
-    assertEquals("boolean", meta.getColumnTypeName(2));
-    assertEquals("double", meta.getColumnTypeName(3));
-    assertEquals("string", meta.getColumnTypeName(4));
-    assertEquals("string", meta.getColumnTypeName(5));
-    assertEquals("string", meta.getColumnTypeName(6));
-    assertEquals("string", meta.getColumnTypeName(7));
-    assertEquals("string", meta.getColumnTypeName(8));
-    assertEquals("tinyint", meta.getColumnTypeName(9));
-    assertEquals("smallint", meta.getColumnTypeName(10));
-    assertEquals("float", meta.getColumnTypeName(11));
-    assertEquals("bigint", meta.getColumnTypeName(12));
-    assertEquals("int", meta.getColumnTypeName(13));
-    assertEquals("string", meta.getColumnTypeName(14));
-
     assertEquals(11, meta.getColumnDisplaySize(1));
+    assertEquals(10, meta.getPrecision(1));
+    assertEquals(0, meta.getScale(1));
+
+    assertEquals("c1", colRS.getString("COLUMN_NAME"));
+    assertEquals(Types.INTEGER, colRS.getInt("DATA_TYPE"));
+    assertEquals("int", colRS.getString("TYPE_NAME").toLowerCase());
+    assertEquals(meta.getPrecision(1), colRS.getInt("COLUMN_SIZE"));
+    assertEquals(meta.getScale(1), colRS.getInt("DECIMAL_DIGITS"));
+
+    assertTrue(colRS.next());
+
+    assertEquals("c2", meta.getColumnName(2));
+    assertEquals("boolean", meta.getColumnTypeName(2));
+    assertEquals(Types.BOOLEAN, meta.getColumnType(2));
     assertEquals(1, meta.getColumnDisplaySize(2));
+    assertEquals(1, meta.getPrecision(2));
+    assertEquals(0, meta.getScale(2));
+
+    assertEquals("c2", colRS.getString("COLUMN_NAME"));
+    assertEquals(Types.BOOLEAN, colRS.getInt("DATA_TYPE"));
+    assertEquals("boolean", colRS.getString("TYPE_NAME").toLowerCase());
+    assertEquals(meta.getPrecision(2), colRS.getInt("COLUMN_SIZE"));
+    assertEquals(meta.getScale(2), colRS.getInt("DECIMAL_DIGITS"));
+
+    assertTrue(colRS.next());
+
+    assertEquals("c3", meta.getColumnName(3));
+    assertEquals(Types.DOUBLE, meta.getColumnType(3));
+    assertEquals("double", meta.getColumnTypeName(3));
     assertEquals(25, meta.getColumnDisplaySize(3));
+    assertEquals(15, meta.getPrecision(3));
+    assertEquals(15, meta.getScale(3));
+
+    assertEquals("c3", colRS.getString("COLUMN_NAME"));
+    assertEquals(Types.DOUBLE, colRS.getInt("DATA_TYPE"));
+    assertEquals("double", colRS.getString("TYPE_NAME").toLowerCase());
+    assertEquals(meta.getPrecision(3), colRS.getInt("COLUMN_SIZE"));
+    assertEquals(meta.getScale(3), colRS.getInt("DECIMAL_DIGITS"));
+
+    assertTrue(colRS.next());
+
+    assertEquals("c4", meta.getColumnName(4));
+    assertEquals(Types.VARCHAR, meta.getColumnType(4));
+    assertEquals("string", meta.getColumnTypeName(4));
     assertEquals(Integer.MAX_VALUE, meta.getColumnDisplaySize(4));
+    assertEquals(Integer.MAX_VALUE, meta.getPrecision(4));
+    assertEquals(0, meta.getScale(4));
+
+    assertEquals("c4", colRS.getString("COLUMN_NAME"));
+    assertEquals(Types.VARCHAR, colRS.getInt("DATA_TYPE"));
+    assertEquals("string", colRS.getString("TYPE_NAME").toLowerCase());
+    assertEquals(meta.getPrecision(4), colRS.getInt("COLUMN_SIZE"));
+    assertEquals(meta.getScale(4), colRS.getInt("DECIMAL_DIGITS"));
+
+    assertTrue(colRS.next());
+
+    assertEquals("a", meta.getColumnName(5));
+    assertEquals(Types.VARCHAR, meta.getColumnType(5));
+    assertEquals("string", 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("array<int>", colRS.getString("TYPE_NAME").toLowerCase());
+    assertEquals(meta.getPrecision(5), colRS.getInt("COLUMN_SIZE"));
+    assertEquals(meta.getScale(5), colRS.getInt("DECIMAL_DIGITS"));
+
+    assertTrue(colRS.next());
+
+    assertEquals("c6", meta.getColumnName(6));
+    assertEquals(Types.VARCHAR, meta.getColumnType(6));
+    assertEquals("string", 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("map<int,string>", 
colRS.getString("TYPE_NAME").toLowerCase());
+    assertEquals(meta.getPrecision(6), colRS.getInt("COLUMN_SIZE"));
+    assertEquals(meta.getScale(6), colRS.getInt("DECIMAL_DIGITS"));
+
+    assertTrue(colRS.next());
+
+    assertEquals("c7", meta.getColumnName(7));
+    assertEquals(Types.VARCHAR, meta.getColumnType(7));
+    assertEquals("string", 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("map<string,string>", 
colRS.getString("TYPE_NAME").toLowerCase());
+    assertEquals(meta.getPrecision(7), colRS.getInt("COLUMN_SIZE"));
+    assertEquals(meta.getScale(7), colRS.getInt("DECIMAL_DIGITS"));
+
+    assertTrue(colRS.next());
+
+    assertEquals("c8", meta.getColumnName(8));
+    assertEquals(Types.VARCHAR, meta.getColumnType(8));
+    assertEquals("string", 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("struct<r:string,s:int,t:double>", 
colRS.getString("TYPE_NAME").toLowerCase());
+    assertEquals(meta.getPrecision(8), colRS.getInt("COLUMN_SIZE"));
+    assertEquals(meta.getScale(8), colRS.getInt("DECIMAL_DIGITS"));
+
+    assertTrue(colRS.next());
+
+    assertEquals("c9", meta.getColumnName(9));
+    assertEquals(Types.TINYINT, meta.getColumnType(9));
+    assertEquals("tinyint", meta.getColumnTypeName(9));
     assertEquals(4, meta.getColumnDisplaySize(9));
+    assertEquals(3, meta.getPrecision(9));
+    assertEquals(0, meta.getScale(9));
+
+    assertEquals("c9", colRS.getString("COLUMN_NAME"));
+    assertEquals(Types.TINYINT, colRS.getInt("DATA_TYPE"));
+    assertEquals("tinyint", colRS.getString("TYPE_NAME").toLowerCase());
+    assertEquals(meta.getPrecision(9), colRS.getInt("COLUMN_SIZE"));
+    assertEquals(meta.getScale(9), colRS.getInt("DECIMAL_DIGITS"));
+
+    assertTrue(colRS.next());
+
+    assertEquals("c10", meta.getColumnName(10));
+    assertEquals(Types.SMALLINT, meta.getColumnType(10));
+    assertEquals("smallint", meta.getColumnTypeName(10));
     assertEquals(6, meta.getColumnDisplaySize(10));
+    assertEquals(5, meta.getPrecision(10));
+    assertEquals(0, meta.getScale(10));
+
+    assertEquals("c10", colRS.getString("COLUMN_NAME"));
+    assertEquals(Types.SMALLINT, colRS.getInt("DATA_TYPE"));
+    assertEquals("smallint", colRS.getString("TYPE_NAME").toLowerCase());
+    assertEquals(meta.getPrecision(10), colRS.getInt("COLUMN_SIZE"));
+    assertEquals(meta.getScale(10), colRS.getInt("DECIMAL_DIGITS"));
+
+    assertTrue(colRS.next());
+
+    assertEquals("c11", meta.getColumnName(11));
+    assertEquals(Types.FLOAT, meta.getColumnType(11));
+    assertEquals("float", meta.getColumnTypeName(11));
     assertEquals(24, meta.getColumnDisplaySize(11));
+    assertEquals(7, meta.getPrecision(11));
+    assertEquals(7, meta.getScale(11));
+
+    assertEquals("c11", colRS.getString("COLUMN_NAME"));
+    assertEquals(Types.FLOAT, colRS.getInt("DATA_TYPE"));
+    assertEquals("float", colRS.getString("TYPE_NAME").toLowerCase());
+    assertEquals(meta.getPrecision(11), colRS.getInt("COLUMN_SIZE"));
+    assertEquals(meta.getScale(11), colRS.getInt("DECIMAL_DIGITS"));
+
+    assertTrue(colRS.next());
+
+    assertEquals("c12", meta.getColumnName(12));
+    assertEquals(Types.BIGINT, meta.getColumnType(12));
+    assertEquals("bigint", meta.getColumnTypeName(12));
     assertEquals(20, meta.getColumnDisplaySize(12));
+    assertEquals(19, meta.getPrecision(12));
+    assertEquals(0, meta.getScale(12));
+
+    assertEquals("c12", colRS.getString("COLUMN_NAME"));
+    assertEquals(Types.BIGINT, colRS.getInt("DATA_TYPE"));
+    assertEquals("bigint", colRS.getString("TYPE_NAME").toLowerCase());
+    assertEquals(meta.getPrecision(12), colRS.getInt("COLUMN_SIZE"));
+    assertEquals(meta.getScale(12), colRS.getInt("DECIMAL_DIGITS"));
+
+    assertEquals("_c12", meta.getColumnName(13));
+    assertEquals(Types.INTEGER, meta.getColumnType(13));
+    assertEquals("int", meta.getColumnTypeName(13));
     assertEquals(11, meta.getColumnDisplaySize(13));
+    assertEquals(10, meta.getPrecision(13));
+    assertEquals(0, meta.getScale(13));
+
+    assertEquals("b", meta.getColumnName(14));
+    assertEquals(Types.VARCHAR, meta.getColumnType(14));
+    assertEquals("string", meta.getColumnTypeName(14));
     assertEquals(Integer.MAX_VALUE, meta.getColumnDisplaySize(14));
+    assertEquals(Integer.MAX_VALUE, meta.getPrecision(14));
+    assertEquals(0, meta.getScale(14));
 
-    int[] expectedPrecision = {10, 1, 15, Integer.MAX_VALUE, Integer.MAX_VALUE,
-        Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, 3, 5, 7, 19,
-        10, Integer.MAX_VALUE};
-    int[] expectedScale = {0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0};
     for (int i = 1; i <= meta.getColumnCount(); i++) {
       assertFalse(meta.isAutoIncrement(i));
       assertFalse(meta.isCurrency(i));
       assertEquals(ResultSetMetaData.columnNullable, meta.isNullable(i));
-
-      assertEquals(expectedPrecision[i-1], meta.getPrecision(i));
-      assertEquals(expectedScale[i-1], meta.getScale(i));
     }
   }
 


Reply via email to