You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by qi...@apache.org on 2020/12/02 13:10:40 UTC
[iotdb] branch rel/0.11 updated: add MAX_POINT_NUMBER format check
(#2148) (#2163)
This is an automated email from the ASF dual-hosted git repository.
qiaojialin pushed a commit to branch rel/0.11
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/rel/0.11 by this push:
new 3085ed4 add MAX_POINT_NUMBER format check (#2148) (#2163)
3085ed4 is described below
commit 3085ed49d4be3b566accbdf8124d702ee8a75dd2
Author: Haonan <hh...@outlook.com>
AuthorDate: Wed Dec 2 21:10:27 2020 +0800
add MAX_POINT_NUMBER format check (#2148) (#2163)
---
.../db/engine/querycontext/ReadOnlyMemChunk.java | 16 +++++++-
.../iotdb/db/integration/IoTDBSimpleQueryIT.java | 43 ++++++++++++++++++++++
.../tsfile/encoding/encoder/TSEncodingBuilder.java | 14 ++++++-
3 files changed, 70 insertions(+), 3 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/querycontext/ReadOnlyMemChunk.java b/server/src/main/java/org/apache/iotdb/db/engine/querycontext/ReadOnlyMemChunk.java
index 5be7104..8890923 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/querycontext/ReadOnlyMemChunk.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/querycontext/ReadOnlyMemChunk.java
@@ -31,6 +31,8 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
import org.apache.iotdb.tsfile.read.TimeValuePair;
import org.apache.iotdb.tsfile.read.reader.IPointReader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class ReadOnlyMemChunk {
@@ -38,6 +40,7 @@ public class ReadOnlyMemChunk {
private TSDataType dataType;
private TSEncoding encoding;
+ private static final Logger logger = LoggerFactory.getLogger(ReadOnlyMemChunk.class);
private long version;
private int floatPrecision = TSFileDescriptor.getInstance().getConfig().getFloatPrecision();
@@ -56,7 +59,18 @@ public class ReadOnlyMemChunk {
this.encoding = encoding;
this.version = version;
if (props != null && props.containsKey(Encoder.MAX_POINT_NUMBER)) {
- this.floatPrecision = Integer.parseInt(props.get(Encoder.MAX_POINT_NUMBER));
+ try {
+ this.floatPrecision = Integer.parseInt(props.get(Encoder.MAX_POINT_NUMBER));
+ } catch (NumberFormatException e) {
+ logger.warn("The format of MAX_POINT_NUMBER {} is not correct."
+ + " Using default float precision.", props.get(Encoder.MAX_POINT_NUMBER));
+ }
+ if (floatPrecision < 0) {
+ logger.warn("The MAX_POINT_NUMBER shouldn't be less than 0."
+ + " Using default float precision {}.",
+ TSFileDescriptor.getInstance().getConfig().getFloatPrecision());
+ floatPrecision = TSFileDescriptor.getInstance().getConfig().getFloatPrecision();
+ }
}
tvList.sort();
this.chunkData = tvList;
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSimpleQueryIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSimpleQueryIT.java
index be8bbf8..4afa443 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSimpleQueryIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSimpleQueryIT.java
@@ -639,4 +639,47 @@ public class IoTDBSimpleQueryIT {
Assert.assertEquals(r3.getLong(3), 10L);
}
}
+
+ @Test
+ public void testInvalidMaxPointNumber() throws ClassNotFoundException {
+ Class.forName(Config.JDBC_DRIVER_NAME);
+ try (Connection connection = DriverManager
+ .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/",
+ "root", "root");
+ Statement statement = connection.createStatement()) {
+ statement.execute("SET STORAGE GROUP TO root.sg1");
+ statement.execute("CREATE TIMESERIES root.sg1.d1.s1 with datatype=FLOAT, encoding=TS_2DIFF, "
+ + "max_point_number=4");
+ statement.execute("CREATE TIMESERIES root.sg1.d1.s2 with datatype=FLOAT, encoding=TS_2DIFF, "
+ + "max_point_number=2.5");
+ statement.execute("CREATE TIMESERIES root.sg1.d1.s3 with datatype=FLOAT, encoding=RLE, "
+ + "max_point_number=q");
+ statement.execute("CREATE TIMESERIES root.sg1.d1.s4 with datatype=FLOAT, encoding=RLE, "
+ + "max_point_number=-1");
+ statement.execute("insert into root.sg1.d1(timestamp,s1,s2,s3,s4) values(1,1.1234,1.1234,1.1234,1.1234)");
+
+ try (ResultSet r1 = statement.executeQuery("select s1 from root.sg1.d1")) {
+ r1.next();
+ Assert.assertEquals(1.1234f, r1.getFloat(2), 0);
+ }
+
+ try (ResultSet r2 = statement.executeQuery("select s3 from root.sg1.d1")) {
+ r2.next();
+ Assert.assertEquals(1.12f, r2.getFloat(2), 0);
+ }
+
+ try (ResultSet r3 = statement.executeQuery("select s3 from root.sg1.d1")) {
+ r3.next();
+ Assert.assertEquals(1.12f, r3.getFloat(2), 0);
+ }
+
+ try (ResultSet r4 = statement.executeQuery("select s4 from root.sg1.d1")) {
+ r4.next();
+ Assert.assertEquals(1.12f, r4.getFloat(2), 0);
+ }
+
+ } catch (SQLException e) {
+ fail();
+ }
+ }
}
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/encoder/TSEncodingBuilder.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/encoder/TSEncodingBuilder.java
index 0f6cd7c..0903cd1 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/encoder/TSEncodingBuilder.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/encoder/TSEncodingBuilder.java
@@ -158,7 +158,12 @@ public abstract class TSEncodingBuilder {
if (props == null || !props.containsKey(Encoder.MAX_POINT_NUMBER)) {
maxPointNumber = TSFileDescriptor.getInstance().getConfig().getFloatPrecision();
} else {
- maxPointNumber = Integer.valueOf(props.get(Encoder.MAX_POINT_NUMBER));
+ try {
+ this.maxPointNumber = Integer.parseInt(props.get(Encoder.MAX_POINT_NUMBER));
+ } catch (NumberFormatException e) {
+ logger.warn("The format of max point number {} is not correct."
+ + " Using default float precision.", props.get(Encoder.MAX_POINT_NUMBER));
+ }
if (maxPointNumber < 0) {
maxPointNumber = TSFileDescriptor.getInstance().getConfig().getFloatPrecision();
logger
@@ -206,7 +211,12 @@ public abstract class TSEncodingBuilder {
if (props == null || !props.containsKey(Encoder.MAX_POINT_NUMBER)) {
maxPointNumber = TSFileDescriptor.getInstance().getConfig().getFloatPrecision();
} else {
- maxPointNumber = Integer.valueOf(props.get(Encoder.MAX_POINT_NUMBER));
+ try {
+ this.maxPointNumber = Integer.parseInt(props.get(Encoder.MAX_POINT_NUMBER));
+ } catch (NumberFormatException e) {
+ logger.warn("The format of max point number {} is not correct."
+ + " Using default float precision.", props.get(Encoder.MAX_POINT_NUMBER));
+ }
if (maxPointNumber < 0) {
maxPointNumber = TSFileDescriptor.getInstance().getConfig().getFloatPrecision();
logger