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;
   }
 
 }