This is an automated email from the ASF dual-hosted git repository.
rong 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 08006e2ae0 [IOTDB-3360] Fix precision loss bug due to float converted
to double (#6192)
08006e2ae0 is described below
commit 08006e2ae0109ff97fd0d3f6b861be6f0967dd97
Author: Liao Lanyu <[email protected]>
AuthorDate: Thu Jun 9 11:29:59 2022 +0800
[IOTDB-3360] Fix precision loss bug due to float converted to double (#6192)
---
.../org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java | 14 +++++++++++++-
.../java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java | 14 +++++++++++++-
2 files changed, 26 insertions(+), 2 deletions(-)
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
index d8d05d70fe..d3f4ce8028 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
@@ -22,6 +22,7 @@ package org.apache.iotdb.db.mpp.plan.parser;
import org.apache.iotdb.commons.conf.IoTDBConstant;
import org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.exception.sql.SQLParserException;
import org.apache.iotdb.db.exception.sql.SemanticException;
@@ -138,6 +139,8 @@ import java.util.regex.Pattern;
/** Parse AST to Statement. */
public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
+ private static final IoTDBConfig CONFIG =
IoTDBDescriptor.getInstance().getConfig();
+
private static final String DELETE_RANGE_ERROR_MSG =
"For delete statement, where clause can only contain atomic expressions
like : "
+ "time > XXX, time <= XXX, or two atomic expressions connected by
'AND'";
@@ -2058,7 +2061,7 @@ public class ASTVisitor extends
IoTDBSqlParserBaseVisitor<Statement> {
} else if (constantContext.INTEGER_LITERAL() != null) {
return new ConstantOperand(TSDataType.INT64, text);
} else if (constantContext.realLiteral() != null) {
- return new ConstantOperand(TSDataType.DOUBLE, text);
+ return parseRealLiteral(text);
} else if (constantContext.dateExpression() != null) {
return new ConstantOperand(
TSDataType.INT64,
String.valueOf(parseDateExpression(constantContext.dateExpression())));
@@ -2067,6 +2070,15 @@ public class ASTVisitor extends
IoTDBSqlParserBaseVisitor<Statement> {
}
}
+ private Expression parseRealLiteral(String value) {
+ // 3.33 is float by default
+ return new ConstantOperand(
+ CONFIG.getFloatingStringInferType().equals(TSDataType.DOUBLE)
+ ? TSDataType.DOUBLE
+ : TSDataType.FLOAT,
+ value);
+ }
+
/**
* parse time expression, which is addition and subtraction expression of
duration time, now() or
* DataTimeFormat time.
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
index d6008497e5..aaa7c2e6c0 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.qp.sql;
import org.apache.iotdb.commons.conf.IoTDBConstant;
import org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.engine.trigger.executor.TriggerEvent;
import org.apache.iotdb.db.exception.sql.SQLParserException;
@@ -183,6 +184,8 @@ import static
org.apache.iotdb.db.qp.constant.SQLConstant.TOK_KILL_QUERY;
public class IoTDBSqlVisitor extends IoTDBSqlParserBaseVisitor<Operator> {
+ private static final IoTDBConfig CONFIG =
IoTDBDescriptor.getInstance().getConfig();
+
private static final String DELETE_RANGE_ERROR_MSG =
"For delete statement, where clause can only contain atomic expressions
like : "
+ "time > XXX, time <= XXX, or two atomic expressions connected by
'AND'";
@@ -3296,7 +3299,7 @@ public class IoTDBSqlVisitor extends
IoTDBSqlParserBaseVisitor<Operator> {
} else if (constantContext.INTEGER_LITERAL() != null) {
return new ConstantOperand(TSDataType.INT64, text);
} else if (constantContext.realLiteral() != null) {
- return new ConstantOperand(TSDataType.DOUBLE, text);
+ return parseRealLiteral(text);
} else if (constantContext.dateExpression() != null) {
return new ConstantOperand(
TSDataType.INT64,
@@ -3315,6 +3318,15 @@ public class IoTDBSqlVisitor extends
IoTDBSqlParserBaseVisitor<Operator> {
}
}
+ private Expression parseRealLiteral(String value) {
+ // 3.33 is float by default
+ return new ConstantOperand(
+ CONFIG.getFloatingStringInferType().equals(TSDataType.DOUBLE)
+ ? TSDataType.DOUBLE
+ : TSDataType.FLOAT,
+ value);
+ }
+
private void setMap(IoTDBSqlParser.AlterClauseContext ctx, Map<String,
String> alterMap) {
List<IoTDBSqlParser.AttributePairContext> tagsList = ctx.attributePair();
if (ctx.attributePair(0) != null) {