From bec8cc86d9bf6f00e111b1e4c4f6e7f686081eb4 Mon Sep 17 00:00:00 2001 From: "zeli.lwb" Date: Wed, 13 Sep 2023 22:04:54 +0800 Subject: [PATCH 1/3] [Fix] datetime --- .../rpc/protocol/payload/impl/ObObjType.java | 14 +++++---- .../oceanbase/rpc/ObTableClientTest.java | 31 ++++++++----------- 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/ObObjType.java b/src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/ObObjType.java index df150f8f..19672957 100644 --- a/src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/ObObjType.java +++ b/src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/ObObjType.java @@ -26,9 +26,8 @@ import io.netty.buffer.ByteBuf; import java.sql.Timestamp; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; +import java.time.*; +import java.util.*; public enum ObObjType { @@ -893,7 +892,10 @@ public Comparable parseToComparable(Object o, ObCollationType ct) */ @Override public byte[] encode(Object obj) { - return Serialization.encodeVi64(((Date) obj).getTime() * 1000L); + // Date do not have timezone, when we use getTime, system will recognize it as our system timezone and transform it into UTC Time, which will changed the time. + // We should add back the lose part. + long targetTs = ((Date) obj).getTime() + OffsetDateTime.now().getOffset().getTotalSeconds() * 1000L; + return Serialization.encodeVi64(targetTs * 1000L); } /* @@ -901,7 +903,7 @@ public byte[] encode(Object obj) { */ @Override public Object decode(ByteBuf buf, ObCollationType type) { - return new Timestamp(Serialization.decodeVi64(buf) / 1000L); + return new Timestamp(Serialization.decodeVi64(buf) / 1000L - OffsetDateTime.now().getOffset().getTotalSeconds() * 1000L); } /* @@ -947,7 +949,7 @@ public byte[] encode(Object obj) { */ @Override public Object decode(ByteBuf buf, ObCollationType type) { - return new Timestamp(Serialization.decodeVi64(buf) / 1000L); + return new Date(Serialization.decodeVi64(buf) / 1000L); } /* diff --git a/src/test/java/com/alipay/oceanbase/rpc/ObTableClientTest.java b/src/test/java/com/alipay/oceanbase/rpc/ObTableClientTest.java index a21c289e..fe7812fd 100644 --- a/src/test/java/com/alipay/oceanbase/rpc/ObTableClientTest.java +++ b/src/test/java/com/alipay/oceanbase/rpc/ObTableClientTest.java @@ -52,6 +52,8 @@ import org.junit.Test; import java.lang.reflect.Field; +import java.sql.Connection; +import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.*; @@ -2238,27 +2240,20 @@ public void testDateTime() throws Exception { client.addRowKeyElement("test_datetime_table", new String[] { "c1" }); SimpleDateFormat sdf = new SimpleDateFormat(" yyyy-MM-dd HH:mm:ss "); - Date date1 = sdf.parse(" 2001-07-10 19:20:00 "); - Date date2 = sdf.parse(" 2002-07-10 19:20:00 "); - Date date3 = sdf.parse(" 2003-07-10 19:20:00 "); + Date date1 = sdf.parse(" 2022-04-21 12:00:00 "); try { - client.insert("test_datetime_table", "1", new String[] { "c2" }, new Object[] { date1 }); - client.insert("test_datetime_table", "2", new String[] { "c2" }, new Object[] { date2 }); - client.insert("test_datetime_table", "3", new String[] { "c2" }, new Object[] { date3 }); - - Map res = client.get("test_datetime_table", "1", new String[] { "c2" }); - Assert.assertEquals(date1, res.get("c2")); - res = client.get("test_datetime_table", "2", new String[] { "c2" }); - Assert.assertEquals(date2, res.get("c2")); - res = client.get("test_datetime_table", "3", new String[] { "c2" }); - Assert.assertEquals(date3, res.get("c2")); - - + // client.insert("test_datetime_table", "1", new String[] { "c2" }, new Object[] { date1 }); + Connection connection = ObTableClientTestUtil.getConnection(); + Statement statement = connection.createStatement(); + statement.execute("insert into test_datetime_table values (0, FROM_UNIXTIME(1650513600))"); + + // 2022-04-21 12:00:00 = 1650513600000 -> insert by sql, get by obkv client + Map res = client.get("test_datetime_table", "0", new String[] { "c2" }); + Assert.assertEquals(date1.getTime(), ((Date) res.get("c2")).getTime()); + Assert.assertEquals(1650513600000L, ((Date) res.get("c2")).getTime()); } finally { - client.delete("test_datetime_table").setRowKey(colVal("c1", "1")).execute(); - client.delete("test_datetime_table").setRowKey(colVal("c1", "2")).execute(); - client.delete("test_datetime_table").setRowKey(colVal("c1", "3")).execute(); + client.delete("test_datetime_table").setRowKey(colVal("c1", "0")).execute(); } } From 456247a6739d5f91b4eb7998334108e3a6915f88 Mon Sep 17 00:00:00 2001 From: "zeli.lwb" Date: Wed, 13 Sep 2023 22:09:41 +0800 Subject: [PATCH 2/3] [Test] add test cases --- src/test/java/com/alipay/oceanbase/rpc/ObTableClientTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/test/java/com/alipay/oceanbase/rpc/ObTableClientTest.java b/src/test/java/com/alipay/oceanbase/rpc/ObTableClientTest.java index fe7812fd..11814fcc 100644 --- a/src/test/java/com/alipay/oceanbase/rpc/ObTableClientTest.java +++ b/src/test/java/com/alipay/oceanbase/rpc/ObTableClientTest.java @@ -2241,6 +2241,7 @@ public void testDateTime() throws Exception { SimpleDateFormat sdf = new SimpleDateFormat(" yyyy-MM-dd HH:mm:ss "); Date date1 = sdf.parse(" 2022-04-21 12:00:00 "); + Date date2 = new Date(1650513600000L); try { // client.insert("test_datetime_table", "1", new String[] { "c2" }, new Object[] { date1 }); @@ -2250,7 +2251,10 @@ public void testDateTime() throws Exception { // 2022-04-21 12:00:00 = 1650513600000 -> insert by sql, get by obkv client Map res = client.get("test_datetime_table", "0", new String[] { "c2" }); + Assert.assertEquals(date1, res.get("c2")); + Assert.assertEquals(date2, res.get("c2")); Assert.assertEquals(date1.getTime(), ((Date) res.get("c2")).getTime()); + Assert.assertEquals(date2.getTime(), ((Date) res.get("c2")).getTime()); Assert.assertEquals(1650513600000L, ((Date) res.get("c2")).getTime()); } finally { client.delete("test_datetime_table").setRowKey(colVal("c1", "0")).execute(); From 6f045dfdc16c21f90cbb09fa703ea442218d4759 Mon Sep 17 00:00:00 2001 From: "zeli.lwb" Date: Fri, 15 Sep 2023 10:27:20 +0800 Subject: [PATCH 3/3] [Fix] review --- .../rpc/protocol/payload/impl/ObObjType.java | 4 +-- .../oceanbase/rpc/ObTableClientTest.java | 27 ++++++++++++++----- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/ObObjType.java b/src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/ObObjType.java index 19672957..a0dbf8f3 100644 --- a/src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/ObObjType.java +++ b/src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/ObObjType.java @@ -903,7 +903,7 @@ public byte[] encode(Object obj) { */ @Override public Object decode(ByteBuf buf, ObCollationType type) { - return new Timestamp(Serialization.decodeVi64(buf) / 1000L - OffsetDateTime.now().getOffset().getTotalSeconds() * 1000L); + return new Date(Serialization.decodeVi64(buf) / 1000L - OffsetDateTime.now().getOffset().getTotalSeconds() * 1000L); } /* @@ -949,7 +949,7 @@ public byte[] encode(Object obj) { */ @Override public Object decode(ByteBuf buf, ObCollationType type) { - return new Date(Serialization.decodeVi64(buf) / 1000L); + return new Timestamp(Serialization.decodeVi64(buf) / 1000L); } /* diff --git a/src/test/java/com/alipay/oceanbase/rpc/ObTableClientTest.java b/src/test/java/com/alipay/oceanbase/rpc/ObTableClientTest.java index 11814fcc..a81c0fbc 100644 --- a/src/test/java/com/alipay/oceanbase/rpc/ObTableClientTest.java +++ b/src/test/java/com/alipay/oceanbase/rpc/ObTableClientTest.java @@ -53,6 +53,7 @@ import java.lang.reflect.Field; import java.sql.Connection; +import java.sql.ResultSet; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.*; @@ -2241,23 +2242,37 @@ public void testDateTime() throws Exception { SimpleDateFormat sdf = new SimpleDateFormat(" yyyy-MM-dd HH:mm:ss "); Date date1 = sdf.parse(" 2022-04-21 12:00:00 "); - Date date2 = new Date(1650513600000L); - + // 1650513600000 -> 2022-04-21 4:00:00 + Date date11 = new Date(1650513600000L); + Date date2 = sdf.parse(" 2022-04-21 15:00:00 "); try { - // client.insert("test_datetime_table", "1", new String[] { "c2" }, new Object[] { date1 }); + // client.insert("test_datetime_table", "0", new String[] { "c2" }, new Object[] { date1 }); Connection connection = ObTableClientTestUtil.getConnection(); Statement statement = connection.createStatement(); statement.execute("insert into test_datetime_table values (0, FROM_UNIXTIME(1650513600))"); - // 2022-04-21 12:00:00 = 1650513600000 -> insert by sql, get by obkv client + // 2022-04-21 12:00:00 CST = 1650513600000 -> insert by sql, get by obkv client Map res = client.get("test_datetime_table", "0", new String[] { "c2" }); Assert.assertEquals(date1, res.get("c2")); - Assert.assertEquals(date2, res.get("c2")); + Assert.assertEquals(date11, res.get("c2")); Assert.assertEquals(date1.getTime(), ((Date) res.get("c2")).getTime()); - Assert.assertEquals(date2.getTime(), ((Date) res.get("c2")).getTime()); + Assert.assertEquals(date11.getTime(), ((Date) res.get("c2")).getTime()); Assert.assertEquals(1650513600000L, ((Date) res.get("c2")).getTime()); + System.out.println(date1); + System.out.println(date11); + System.out.println(res.get("c2")); + + // 2022-04-21 15:00:00 CST = 1650524400000 -> insert by obkv client, get by sql + client.insert("test_datetime_table", "1", new String[] { "c2" }, new Object[] { date2 }); + ResultSet resultSet = statement.executeQuery("select * from test_datetime_table where c1 = 1"); + resultSet.next(); + Assert.assertEquals(date2, resultSet.getTimestamp("c2")); + Assert.assertEquals(date2.getTime(), resultSet.getDate("c2").getTime()); + Assert.assertEquals(1650524400000L, resultSet.getDate("c2").getTime()); + System.out.println(date2); } finally { client.delete("test_datetime_table").setRowKey(colVal("c1", "0")).execute(); + client.delete("test_datetime_table").setRowKey(colVal("c1", "1")).execute(); } }