You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by da...@apache.org on 2015/05/30 01:18:29 UTC
hive git commit: HIVE-10819: SearchArgumentImpl for Timestamp is
broken by HIVE-10286 (Daniel Dai)
Repository: hive
Updated Branches:
refs/heads/master fa2dd8391 -> 95aad5410
HIVE-10819: SearchArgumentImpl for Timestamp is broken by HIVE-10286 (Daniel Dai)
Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/95aad541
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/95aad541
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/95aad541
Branch: refs/heads/master
Commit: 95aad54104894ad0a442e7a9aaf3be2e7463781c
Parents: fa2dd83
Author: Daniel Dai <da...@hortonworks.com>
Authored: Fri May 29 16:18:18 2015 -0700
Committer: Daniel Dai <da...@hortonworks.com>
Committed: Fri May 29 16:18:18 2015 -0700
----------------------------------------------------------------------
.../hive/ql/io/sarg/SearchArgumentImpl.java | 6 +++++
.../hive/ql/io/sarg/TestSearchArgumentImpl.java | 27 ++++++++++++++++++++
2 files changed, 33 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hive/blob/95aad541/ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java b/ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java
index efe03ab..63b3ee9 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/io/sarg/SearchArgumentImpl.java
@@ -117,6 +117,12 @@ final class SearchArgumentImpl implements SearchArgument {
@Override
public Object getLiteral() {
+ // To get around a kryo 2.22 bug while deserialize a Timestamp into Date
+ // (https://github.com/EsotericSoftware/kryo/issues/88)
+ // When we see a Date, convert back into Timestamp
+ if (literal instanceof java.util.Date) {
+ return new Timestamp(((java.util.Date)literal).getTime());
+ }
return literal;
}
http://git-wip-us.apache.org/repos/asf/hive/blob/95aad541/ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java
----------------------------------------------------------------------
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java b/ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java
index 5e61aba..51f7f47 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/io/sarg/TestSearchArgumentImpl.java
@@ -30,6 +30,7 @@ import org.apache.hadoop.hive.common.type.HiveVarchar;
import org.apache.hadoop.hive.ql.io.sarg.SearchArgument.TruthValue;
import org.apache.hadoop.hive.ql.io.sarg.SearchArgumentImpl.ExpressionBuilder;
import org.apache.hadoop.hive.ql.io.sarg.SearchArgumentImpl.ExpressionTree;
+import org.apache.hadoop.hive.ql.io.sarg.SearchArgumentImpl.PredicateLeafImpl;
import org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc;
import org.apache.hadoop.hive.serde2.io.DateWritable;
import org.junit.Test;
@@ -37,7 +38,9 @@ import org.junit.Test;
import java.beans.XMLDecoder;
import java.io.ByteArrayInputStream;
import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Field;
import java.math.BigDecimal;
+import java.sql.Timestamp;
import java.util.List;
import java.util.Set;
@@ -3038,4 +3041,28 @@ public class TestSearchArgumentImpl {
"0.22)), eq(z1, 0.22))";
assertEquals(expected, p.toString());
}
+
+ @Test
+ public void testTimestampSerialization() throws Exception {
+ // There is a kryo which after serialize/deserialize,
+ // Timestamp becomes Date. We get around this issue in
+ // SearchArgumentImpl.getLiteral. Once kryo fixed the issue
+ // We can simplify SearchArgumentImpl.getLiteral
+ Timestamp now = new Timestamp(new java.util.Date().getTime());
+ SearchArgument sarg =
+ SearchArgumentFactory.newBuilder()
+ .startAnd()
+ .lessThan("x", now)
+ .end()
+ .build();
+
+ String serializedSarg = sarg.toKryo();
+ SearchArgument sarg2 = SearchArgumentImpl.fromKryo(serializedSarg);
+
+ Field literalField = PredicateLeafImpl.class.getDeclaredField("literal");
+ literalField.setAccessible(true);
+ assertTrue(literalField.get(sarg2.getLeaves().get(0)) instanceof java.util.Date);
+ Timestamp ts = (Timestamp)sarg2.getLeaves().get(0).getLiteral();
+ assertEquals(ts, now);
+ }
}