This is an automated email from the ASF dual-hosted git repository.
chenyz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 42e76346c3e Set timestamp precision same as time column (#12681)
42e76346c3e is described below
commit 42e76346c3e323cbd7f202775129b4c656faf325
Author: Chen YZ <[email protected]>
AuthorDate: Fri Jun 7 23:01:19 2024 +0800
Set timestamp precision same as time column (#12681)
* done
* done
* rollback change
* fix IT
* fix IT
---
.../org/apache/iotdb/db/it/IoTDBSimpleQueryIT.java | 5 ++--
.../db/it/aggregation/IoTDBAggregationIT.java | 15 ++++------
.../db/it/aggregation/maxby/IoTDBMaxByIT.java | 3 +-
.../db/it/aggregation/minby/IoTDBMinByIT.java | 3 +-
.../db/it/udf/IoTDBUDTFBuiltinFunctionIT.java | 4 +--
.../java/org/apache/iotdb/cli/AbstractCli.java | 35 +++++++++++++++++++++-
.../org/apache/iotdb/jdbc/IoTDBJDBCResultSet.java | 8 +++++
.../org/apache/iotdb/rpc/IoTDBJDBCDataSet.java | 4 +--
.../java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java | 4 +--
.../org/apache/iotdb/db/utils/DateTimeUtils.java | 4 ++-
10 files changed, 59 insertions(+), 26 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBSimpleQueryIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBSimpleQueryIT.java
index fe8c9c6c39e..19b48719383 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBSimpleQueryIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBSimpleQueryIT.java
@@ -39,7 +39,6 @@ import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
-import java.sql.Timestamp;
import java.sql.Types;
import java.time.LocalDate;
import java.util.ArrayList;
@@ -1173,13 +1172,13 @@ public class IoTDBSimpleQueryIT {
while (resultSet.next()) {
long time = resultSet.getLong(1);
Date date = resultSet.getDate(2);
- Timestamp timestamp = resultSet.getTimestamp(3);
+ long timestamp = resultSet.getLong(3);
byte[] blob = resultSet.getBytes(4);
String text = resultSet.getString(5);
assertEquals(2024 - 1900, date.getYear());
assertEquals(5 - 1, date.getMonth());
assertEquals(time % 31 + 1, date.getDate());
- assertEquals(time, timestamp.getTime());
+ assertEquals(time, timestamp);
assertArrayEquals(byteArray, blob);
assertEquals(String.valueOf(time), text);
}
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/IoTDBAggregationIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/IoTDBAggregationIT.java
index bb2b1d539bf..8eb1026121a 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/IoTDBAggregationIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/IoTDBAggregationIT.java
@@ -348,8 +348,8 @@ public class IoTDBAggregationIT {
public void firstTest() {
String[] retArray =
new String[] {
-
"0,2000,2000,2000.0,2000,2000,0x2000,2000-01-01,1970-01-01T00:00:02.000Z",
- "0,500,500,500.0,500,500,0x0500,1500-01-01,1970-01-01T00:00:00.500Z"
+ "0,2000,2000,2000.0,2000,2000,0x2000,2000-01-01,2000",
+ "0,500,500,500.0,500,500,0x0500,1500-01-01,500"
};
try (Connection connection = EnvFactory.getEnv().getConnection();
Statement statement = connection.createStatement()) {
@@ -453,9 +453,9 @@ public class IoTDBAggregationIT {
public void lastTest() {
String[] retArray =
new String[] {
- "0,8499,8499.0,8499,0x8499,8499-01-01,1970-01-01T00:00:08.499Z",
- "0,1499,1499.0,1499,0x1499,1499-01-01,1970-01-01T00:00:01.499Z",
- "0,2200,2200.0,2200,0x2200,2200-01-01,1970-01-01T00:00:02.200Z"
+ "0,8499,8499.0,8499,0x8499,8499-01-01,8499",
+ "0,1499,1499.0,1499,0x1499,1499-01-01,1499",
+ "0,2200,2200.0,2200,0x2200,2200-01-01,2200"
};
try (Connection connection = EnvFactory.getEnv().getConnection();
Statement statement = connection.createStatement()) {
@@ -727,10 +727,7 @@ public class IoTDBAggregationIT {
@Test
public void maxminValueTest() {
String[] retArray =
- new String[] {
-
"0,8499,500.0,999,1000,8499-01-01,1000-01-01,1970-01-01T00:00:08.499Z,1970-01-01T00:00:00.500Z",
- "0,2499,500.0"
- };
+ new String[] {"0,8499,500.0,999,1000,8499-01-01,1000-01-01,8499,500",
"0,2499,500.0"};
try (Connection connection = EnvFactory.getEnv().getConnection();
Statement statement = connection.createStatement()) {
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/maxby/IoTDBMaxByIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/maxby/IoTDBMaxByIT.java
index 1ccdc8c1195..ccf435f8362 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/maxby/IoTDBMaxByIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/maxby/IoTDBMaxByIT.java
@@ -210,8 +210,7 @@ public class IoTDBMaxByIT {
"root.db.d1",
new String[] {"x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8",
"x9", "x10"},
new String[] {"y1", "y2", "y3", "y4", "y7", "y9", "y10"});
- String[] retArray =
- new String[]
{"3,3,3.0,3.0,false,3,3,0x33,2024-01-03,1970-01-01T00:00:00.003Z,"};
+ String[] retArray = new String[]
{"3,3,3.0,3.0,false,3,3,0x33,2024-01-03,3,"};
for (Map.Entry<String, String[]> expectedHeader :
expectedHeaders.entrySet()) {
String y = expectedHeader.getKey();
resultSetEqualTest(
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/minby/IoTDBMinByIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/minby/IoTDBMinByIT.java
index 82867e782cc..77cb86e62d4 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/minby/IoTDBMinByIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/aggregation/minby/IoTDBMinByIT.java
@@ -210,8 +210,7 @@ public class IoTDBMinByIT {
"root.db.d1",
new String[] {"x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8",
"x9", "x10"},
new String[] {"y1", "y2", "y3", "y4", "y7", "y9", "y10"});
- String[] retArray =
- new String[]
{"3,3,3.0,3.0,false,3,3,0x33,2024-01-03,1970-01-01T00:00:00.003Z,"};
+ String[] retArray = new String[]
{"3,3,3.0,3.0,false,3,3,0x33,2024-01-03,3,"};
for (Map.Entry<String, String[]> expectedHeader :
expectedHeaders.entrySet()) {
String y = expectedHeader.getKey();
resultSetEqualTest(
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDTFBuiltinFunctionIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDTFBuiltinFunctionIT.java
index 61de72829cc..2ddc99f6ead 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDTFBuiltinFunctionIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDTFBuiltinFunctionIT.java
@@ -205,7 +205,7 @@ public class IoTDBUDTFBuiltinFunctionIT {
} else if (j == 5) {
assertEquals("2024-01-0" + (i + 1), resultSet.getString(7));
} else if (j == 6) {
- assertEquals(String.format("1970-01-01T00:00:00.00%dZ", i),
resultSet.getString(8));
+ assertEquals(String.valueOf(i), resultSet.getString(8));
}
}
}
@@ -251,7 +251,7 @@ public class IoTDBUDTFBuiltinFunctionIT {
} else if (j == 5) {
assertEquals("2024-01-0" + (i + 1), resultSet.getString(7));
} else if (j == 6) {
- assertEquals(String.format("1970-01-01T00:00:00.00%dZ", i),
resultSet.getString(8));
+ assertEquals(String.valueOf(i), resultSet.getString(8));
}
}
}
diff --git
a/iotdb-client/cli/src/main/java/org/apache/iotdb/cli/AbstractCli.java
b/iotdb-client/cli/src/main/java/org/apache/iotdb/cli/AbstractCli.java
index 113b712e7f8..66085e78592 100644
--- a/iotdb-client/cli/src/main/java/org/apache/iotdb/cli/AbstractCli.java
+++ b/iotdb-client/cli/src/main/java/org/apache/iotdb/cli/AbstractCli.java
@@ -32,6 +32,9 @@ import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.lang3.ArrayUtils;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.utils.BytesUtils;
+import org.apache.tsfile.utils.DateUtils;
import java.io.BufferedReader;
import java.io.IOException;
@@ -598,6 +601,7 @@ public abstract class AbstractCli {
ctx.getPrinter().println("Msg: " + SUCCESS_MESSAGE);
}
} catch (Exception e) {
+ e.printStackTrace();
ctx.getPrinter().println("Msg: " + e);
executeStatus = CODE_ERROR;
} finally {
@@ -663,7 +667,7 @@ public abstract class AbstractCli {
RpcUtils.formatDatetime(
timeFormat, timestampPrecision, resultSet.getLong(i),
zoneId);
} else {
- tmp = resultSet.getString(i);
+ tmp = getStringByColumnIndex(ioTDBJDBCResultSet, i, zoneId);
}
if (tmp == null) {
tmp = NULL;
@@ -713,6 +717,35 @@ public abstract class AbstractCli {
return lists;
}
+ private static String getStringByColumnIndex(
+ IoTDBJDBCResultSet resultSet, int columnIndex, ZoneId zoneId) throws
SQLException {
+ TSDataType type =
TSDataType.valueOf(resultSet.getColumnTypeByIndex(columnIndex));
+ switch (type) {
+ case BOOLEAN:
+ return String.valueOf(resultSet.getBoolean(columnIndex));
+ case INT32:
+ return String.valueOf(resultSet.getInt(columnIndex));
+ case INT64:
+ return String.valueOf(resultSet.getLong(columnIndex));
+ case FLOAT:
+ return String.valueOf(resultSet.getFloat(columnIndex));
+ case DOUBLE:
+ return String.valueOf(resultSet.getDouble(columnIndex));
+ case TEXT:
+ case STRING:
+ return resultSet.getString(columnIndex);
+ case BLOB:
+ return
BytesUtils.parseBlobByteArrayToString(resultSet.getBytes(columnIndex));
+ case DATE:
+ return DateUtils.formatDate(resultSet.getInt(columnIndex));
+ case TIMESTAMP:
+ return RpcUtils.formatDatetime(
+ timeFormat, timestampPrecision, resultSet.getLong(columnIndex),
zoneId);
+ default:
+ return null;
+ }
+ }
+
private static List<List<String>> cacheTracingInfo(ResultSet resultSet,
List<Integer> maxSizeList)
throws Exception {
List<List<String>> lists = new ArrayList<>(2);
diff --git
a/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBJDBCResultSet.java
b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBJDBCResultSet.java
index ab6009343aa..a854ad62a4a 100644
---
a/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBJDBCResultSet.java
+++
b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBJDBCResultSet.java
@@ -1338,4 +1338,12 @@ public class IoTDBJDBCResultSet implements ResultSet {
public List<String> getSgColumns() {
return sgColumns;
}
+
+ public String getColumnTypeByIndex(int columnIndex) {
+ if (columnIndex == 1) {
+ // time column
+ return TSDataType.TIMESTAMP.name();
+ }
+ return columnTypeList.get(columnIndex - 2);
+ }
}
diff --git
a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBJDBCDataSet.java
b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBJDBCDataSet.java
index cca84cc8c33..5bba6d0ea71 100644
---
a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBJDBCDataSet.java
+++
b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBJDBCDataSet.java
@@ -587,6 +587,7 @@ public class IoTDBJDBCDataSet {
case INT32:
return String.valueOf(BytesUtils.bytesToInt(values[index]));
case INT64:
+ case TIMESTAMP:
return String.valueOf(BytesUtils.bytesToLong(values[index]));
case FLOAT:
return String.valueOf(BytesUtils.bytesToFloat(values[index]));
@@ -597,9 +598,6 @@ public class IoTDBJDBCDataSet {
return new String(values[index], StandardCharsets.UTF_8);
case BLOB:
return BytesUtils.parseBlobByteArrayToString(values[index]);
- case TIMESTAMP:
- return RpcUtils.formatDatetime(
- RpcUtils.DEFAULT_TIME_FORMAT, "ms",
BytesUtils.bytesToLong(values[index]), zoneId);
case DATE:
return DateUtils.formatDate(BytesUtils.bytesToInt(values[index]));
default:
diff --git
a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
index 014c5eedae1..9eb33fc36b2 100644
---
a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
+++
b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
@@ -562,6 +562,7 @@ public class IoTDBRpcDataSet {
case INT32:
return
String.valueOf(curTsBlock.getColumn(index).getInt(tsBlockIndex));
case INT64:
+ case TIMESTAMP:
return
String.valueOf(curTsBlock.getColumn(index).getLong(tsBlockIndex));
case FLOAT:
return
String.valueOf(curTsBlock.getColumn(index).getFloat(tsBlockIndex));
@@ -576,9 +577,6 @@ public class IoTDBRpcDataSet {
case BLOB:
return BytesUtils.parseBlobByteArrayToString(
curTsBlock.getColumn(index).getBinary(tsBlockIndex).getValues());
- case TIMESTAMP:
- return RpcUtils.formatDatetime(
- timeFormat, "ms",
curTsBlock.getColumn(index).getLong(tsBlockIndex), zoneId);
case DATE:
return
DateUtils.formatDate(curTsBlock.getColumn(index).getInt(tsBlockIndex));
default:
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DateTimeUtils.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DateTimeUtils.java
index 90e3c94305b..1a3c394af7d 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DateTimeUtils.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DateTimeUtils.java
@@ -54,6 +54,8 @@ public class DateTimeUtils {
// forbidding instantiation
}
+ private static final String TIMESTAMP_PRECISION =
+ CommonDescriptor.getInstance().getConfig().getTimestampPrecision();
private static Function<Long, Long> CAST_TIMESTAMP_TO_MS;
static {
@@ -825,7 +827,7 @@ public class DateTimeUtils {
parser1.getInterpreter().setPredictionMode(PredictionMode.SLL);
parser1.removeErrorListeners();
parser1.addErrorListener(SqlParseError.INSTANCE);
- return astVisitor.parseDateExpression(parser1.dateExpression(), "ms");
+ return astVisitor.parseDateExpression(parser1.dateExpression(),
TIMESTAMP_PRECISION);
}
public static Integer parseDateExpressionToInt(String dateExpression) {