You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by xu...@apache.org on 2014/01/17 16:07:48 UTC

svn commit: r1559128 - in /hive/trunk: data/files/ itests/hive-unit/src/test/java/org/apache/hive/jdbc/ jdbc/src/java/org/apache/hive/jdbc/

Author: xuefu
Date: Fri Jan 17 15:07:48 2014
New Revision: 1559128

URL: http://svn.apache.org/r1559128
Log:
HIVE-3611: Hive JDBC doesn't support BINARY column (reviewed by Prasad)

Modified:
    hive/trunk/data/files/datatypes.txt
    hive/trunk/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java
    hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HiveBaseResultSet.java
    hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HivePreparedStatement.java
    hive/trunk/jdbc/src/java/org/apache/hive/jdbc/JdbcColumn.java

Modified: hive/trunk/data/files/datatypes.txt
URL: http://svn.apache.org/viewvc/hive/trunk/data/files/datatypes.txt?rev=1559128&r1=1559127&r2=1559128&view=diff
==============================================================================
--- hive/trunk/data/files/datatypes.txt (original)
+++ hive/trunk/data/files/datatypes.txt Fri Jan 17 15:07:48 2014
@@ -1,3 +1,3 @@
 \N\N\N\N\N\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\N\N\N\N\N
-1true1.11121x2ykva92.2111.01abcd1111213142212212x1abcd22012-04-22 09:00:00.123456789123456789.0123456YWJjZA==2013-01-01abc123abc123
+1true1.11121x2ykva92.2111.01abcd1111213142212212x1abcd22012-04-22 09:00:00.123456789123456789.0123456YWJjZA==2013-01-01abc123abc123X'01FF'

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=1559128&r1=1559127&r2=1559128&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 Fri Jan 17 15:07:48 2014
@@ -27,6 +27,7 @@ import static org.junit.Assert.assertNul
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.io.InputStream;
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.DriverManager;
@@ -187,7 +188,8 @@ public class TestJdbcDriver2 {
         + " c19 binary, "
         + " c20 date,"
         + " c21 varchar(20),"
-        + " c22 char(15)"
+        + " c22 char(15),"
+        + " c23 binary"
         + ") comment'" + dataTypeTableComment
         +"' partitioned by (dt STRING)");
 
@@ -443,7 +445,7 @@ public class TestJdbcDriver2 {
 
     ResultSet res = stmt.executeQuery(
         "explain 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, c23 from " + dataTypeTableName + " limit 1");
 
     ResultSetMetaData md = res.getMetaData();
     // only one result column
@@ -821,6 +823,7 @@ public class TestJdbcDriver2 {
     assertEquals(null, res.getDate(20));
     assertEquals(null, res.getString(21));
     assertEquals(null, res.getString(22));
+    assertEquals(null, res.getString(23));
 
     // row 3
     assertTrue(res.next());
@@ -849,6 +852,15 @@ public class TestJdbcDriver2 {
     assertEquals("abc123", res.getString(21));
     assertEquals("abc123         ", res.getString(22));
 
+    byte[] bytes = "X'01FF'".getBytes("UTF-8");
+    InputStream resultSetInputStream = res.getBinaryStream(23);
+    int len = bytes.length;
+    byte[] b = new byte[len];
+    resultSetInputStream.read(b, 0, len);
+    for ( int i = 0; i< len; i++) {
+      assertEquals(bytes[i], b[i]);
+    }
+
     // test getBoolean rules on non-boolean columns
     assertEquals(true, res.getBoolean(1));
     assertEquals(true, res.getBoolean(4));
@@ -1329,14 +1341,14 @@ public class TestJdbcDriver2 {
 
     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, c17, c18, c20, c21, c22 from " + dataTypeTableName +
+            "c1*2, sentences(null, null, null) as b, c17, c18, c20, c21, c22, c23 from " + dataTypeTableName +
         " limit 1");
     ResultSetMetaData meta = res.getMetaData();
 
     ResultSet colRS = con.getMetaData().getColumns(null, null,
         dataTypeTableName.toLowerCase(), null);
 
-    assertEquals(19, meta.getColumnCount());
+    assertEquals(20, meta.getColumnCount());
 
     assertTrue(colRS.next());
 
@@ -1560,6 +1572,13 @@ public class TestJdbcDriver2 {
     assertEquals(15, meta.getPrecision(19));
     assertEquals(0, meta.getScale(19));
 
+    assertEquals("c23", meta.getColumnName(20));
+    assertEquals(Types.BINARY, meta.getColumnType(20));
+    assertEquals("binary", meta.getColumnTypeName(20));
+    assertEquals(Integer.MAX_VALUE, meta.getColumnDisplaySize(20));
+    assertEquals(Integer.MAX_VALUE, meta.getPrecision(20));
+    assertEquals(0, meta.getScale(20));
+
     for (int i = 1; i <= meta.getColumnCount(); i++) {
       assertFalse(meta.isAutoIncrement(i));
       assertFalse(meta.isCurrency(i));

Modified: hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HiveBaseResultSet.java
URL: http://svn.apache.org/viewvc/hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HiveBaseResultSet.java?rev=1559128&r1=1559127&r2=1559128&view=diff
==============================================================================
--- hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HiveBaseResultSet.java (original)
+++ hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HiveBaseResultSet.java Fri Jan 17 15:07:48 2014
@@ -18,8 +18,10 @@
 
 package org.apache.hive.jdbc;
 
+import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.io.Reader;
+import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
 import java.math.MathContext;
 import java.net.URL;
@@ -134,11 +136,31 @@ public abstract class HiveBaseResultSet 
   }
 
   public InputStream getBinaryStream(int columnIndex) throws SQLException {
-    throw new SQLException("Method not supported");
+    Object obj = getObject(columnIndex);
+    if (obj == null) {
+      return null;
+    } else if (obj instanceof InputStream) {
+      return (InputStream)obj;
+    } else if (obj instanceof byte[]) {
+      byte[] byteArray = (byte[])obj;
+      InputStream is = new ByteArrayInputStream(byteArray);
+      return is;
+    } else if (obj instanceof String) {
+      String str = (String)obj;
+      InputStream is = null;
+      try {
+        is = new ByteArrayInputStream(str.getBytes("UTF-8"));
+      } catch (UnsupportedEncodingException e) {
+        throw new SQLException("Illegal conversion to binary stream from column " +
+            columnIndex + " - Unsupported encoding exception");
+      }
+      return is;
+    }
+    throw new SQLException("Illegal conversion to binary stream from column " + columnIndex);
   }
 
   public InputStream getBinaryStream(String columnName) throws SQLException {
-    throw new SQLException("Method not supported");
+	return getBinaryStream(findColumn(columnName));
   }
 
   public Blob getBlob(int i) throws SQLException {

Modified: hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HivePreparedStatement.java
URL: http://svn.apache.org/viewvc/hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HivePreparedStatement.java?rev=1559128&r1=1559127&r2=1559128&view=diff
==============================================================================
--- hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HivePreparedStatement.java (original)
+++ hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HivePreparedStatement.java Fri Jan 17 15:07:48 2014
@@ -39,6 +39,7 @@ import java.sql.Time;
 import java.sql.Timestamp;
 import java.util.Calendar;
 import java.util.HashMap;
+import java.util.Scanner;
 
 import org.apache.hive.service.cli.thrift.TCLIService;
 import org.apache.hive.service.cli.thrift.TSessionHandle;
@@ -263,8 +264,8 @@ public class HivePreparedStatement exten
    */
 
   public void setBinaryStream(int parameterIndex, InputStream x) throws SQLException {
-    // TODO Auto-generated method stub
-    throw new SQLException("Method not supported");
+    String str = new Scanner(x, "UTF-8").useDelimiter("\\A").next();
+    this.parameters.put(parameterIndex, str);
   }
 
   /*

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=1559128&r1=1559127&r2=1559128&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 Fri Jan 17 15:07:48 2014
@@ -194,6 +194,8 @@ public class JdbcColumn {
     case Types.CHAR:
     case Types.VARCHAR:
       return columnPrecision(columnType, columnAttributes);
+    case Types.BINARY:
+      return Integer.MAX_VALUE; // hive has no max limit for binary
     case Types.TINYINT:
     case Types.SMALLINT:
     case Types.INTEGER:
@@ -212,7 +214,6 @@ public class JdbcColumn {
       return 25; // e.g. -(17#).e-####
     case Types.DECIMAL:
       return columnPrecision(columnType, columnAttributes) + 2;  // '-' sign and '.'
-    case Types.BINARY:
     case Types.JAVA_OBJECT:
     case Types.ARRAY:
     case Types.STRUCT:
@@ -234,6 +235,8 @@ public class JdbcColumn {
         return columnAttributes.precision;
       }
       return Integer.MAX_VALUE; // hive has no max limit for strings
+    case Types.BINARY:
+      return Integer.MAX_VALUE; // hive has no max limit for binary
     case Types.TINYINT:
       return 3;
     case Types.SMALLINT:
@@ -252,7 +255,6 @@ public class JdbcColumn {
       return 29;
     case Types.DECIMAL:
       return columnAttributes.precision;
-    case Types.BINARY:
     case Types.JAVA_OBJECT:
     case Types.ARRAY:
     case Types.STRUCT:
@@ -274,6 +276,7 @@ public class JdbcColumn {
     case Types.INTEGER:
     case Types.BIGINT:
     case Types.DATE:
+    case Types.BINARY:
       return 0;
     case Types.FLOAT:
       return 7;
@@ -283,7 +286,6 @@ public class JdbcColumn {
       return 9;
     case Types.DECIMAL:
       return columnAttributes.scale;
-    case Types.BINARY:
     case Types.JAVA_OBJECT:
     case Types.ARRAY:
     case Types.STRUCT: