diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/TimestampUtils.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/TimestampUtils.java index b9b7744..12fb132 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/TimestampUtils.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/TimestampUtils.java @@ -23,8 +23,14 @@ public final class TimestampUtils { public static void assignTimeInNanoSec(long timeInNanoSec, Timestamp t) { - t.setTime((timeInNanoSec)/1000000); - t.setNanos((int)((t.getNanos()) + (timeInNanoSec % 1000000))); + long integralSecInMillis = (timeInNanoSec/1000000000) * 1000; + long nanos = timeInNanoSec % 1000000000; + if (nanos < 0) { + nanos = 1000000000 + nanos; + integralSecInMillis = ((timeInNanoSec/1000000000) - 1) * 1000; + } + t.setTime(integralSecInMillis); + t.setNanos((int) nanos); } public static long getTimeNanoSec(Timestamp t) { diff --git ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorExpressionWriters.java ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorExpressionWriters.java index 8ec38f0..c08681b 100644 --- ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorExpressionWriters.java +++ ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorExpressionWriters.java @@ -418,4 +418,52 @@ public void testVectorExpressionWriterBinary() throws HiveException { public void testVectorExpressionSetterBinary() throws HiveException { testSetterText(TypeInfoFactory.binaryTypeInfo); } + + @Test + public void testTimeStampUtils(){ + Timestamp ts = new Timestamp(0); + TimestampUtils.assignTimeInNanoSec(1234567891, ts); + Assert.assertEquals(234567891, ts.getNanos()); + Assert.assertEquals(1234567891, TimestampUtils.getTimeNanoSec(ts)); + + TimestampUtils.assignTimeInNanoSec(-1234567891, ts); + Assert.assertEquals((1000000000-234567891), ts.getNanos()); + Assert.assertEquals(-1234567891, TimestampUtils.getTimeNanoSec(ts)); + + TimestampUtils.assignTimeInNanoSec(234567891, ts); + Assert.assertEquals(234567891, ts.getNanos()); + Assert.assertEquals(234567891, TimestampUtils.getTimeNanoSec(ts)); + + TimestampUtils.assignTimeInNanoSec(-234567891, ts); + Assert.assertEquals((1000000000-234567891), ts.getNanos()); + Assert.assertEquals(-234567891, TimestampUtils.getTimeNanoSec(ts)); + + long big = 152414813551296L; + TimestampUtils.assignTimeInNanoSec(big, ts); + Assert.assertEquals(big % 1000000000, ts.getNanos()); + Assert.assertEquals(big, TimestampUtils.getTimeNanoSec(ts)); + + big = -152414813551296L; + TimestampUtils.assignTimeInNanoSec(big, ts); + Assert.assertEquals((1000000000 + (big % 1000000000)), ts.getNanos()); + Assert.assertEquals(big, TimestampUtils.getTimeNanoSec(ts)); + + big = -1794750230000828416L; + ts = new Timestamp(0); + TimestampUtils.assignTimeInNanoSec(big, ts); + Assert.assertEquals((1000000000 + big % 1000000000), ts.getNanos()); + Assert.assertEquals(big, TimestampUtils.getTimeNanoSec(ts)); + + big = 1700000000000000016L; + ts = new Timestamp(0); + TimestampUtils.assignTimeInNanoSec(big, ts); + Assert.assertEquals(big % 1000000000, ts.getNanos()); + Assert.assertEquals(big, TimestampUtils.getTimeNanoSec(ts)); + + big = -1700000000000000016L; + ts = new Timestamp(0); + TimestampUtils.assignTimeInNanoSec(big, ts); + Assert.assertEquals((1000000000 + big % 1000000000), ts.getNanos()); + Assert.assertEquals(big, TimestampUtils.getTimeNanoSec(ts)); + } }