This is an automated email from the ASF dual-hosted git repository.
jackietien 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 461d22b [IOTDB-1280] Solve the performance reduction caused by syntax
error in SLL prediction mode (#4234)
461d22b is described below
commit 461d22b51f8c7f4177b4a5d1f8b2d3b6d15240ba
Author: liuminghui233 <[email protected]>
AuthorDate: Sun Oct 31 14:22:26 2021 +0800
[IOTDB-1280] Solve the performance reduction caused by syntax error in SLL
prediction mode (#4234)
---
.../org/apache/iotdb/db/qp/sql/IoTDBSqlLexer.g4 | 1 -
.../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 | 31 +++++++++++++---------
.../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java | 28 +++++++++----------
.../iotdb/db/qp/strategy/LogicalGenerator.java | 19 ++++++++++---
4 files changed, 46 insertions(+), 33 deletions(-)
diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlLexer.g4
b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlLexer.g4
index 5dcf809..e1062e1 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlLexer.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlLexer.g4
@@ -854,7 +854,6 @@ DATETIME_LITERAL
: INTEGER_LITERAL ('-'|'/') INTEGER_LITERAL ('-'|'/') INTEGER_LITERAL ((T
| WS)
INTEGER_LITERAL ':' INTEGER_LITERAL ':' INTEGER_LITERAL (DOT
INTEGER_LITERAL)?
(('+' | '-') INTEGER_LITERAL ':' INTEGER_LITERAL)?)?
- | NOW LR_BRACKET RR_BRACKET
;
diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
index b1b241b..dc8821d 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
@@ -379,8 +379,14 @@ previousUntilLastClause
;
timeInterval
- : LS_BRACKET startTime=datetimeLiteral COMMA endTime=datetimeLiteral
RR_BRACKET
- | LR_BRACKET startTime=datetimeLiteral COMMA endTime=datetimeLiteral
RS_BRACKET
+ : LS_BRACKET startTime=timeValue COMMA endTime=timeValue RR_BRACKET
+ | LR_BRACKET startTime=timeValue COMMA endTime=timeValue RS_BRACKET
+ ;
+
+timeValue
+ : datetimeLiteral
+ | dateExpression
+ | INTEGER_LITERAL
;
// Insert Statement
@@ -397,7 +403,7 @@ insertValuesSpec
;
insertMultiValue
- : LR_BRACKET DATETIME_LITERAL (COMMA measurementValue)+ RR_BRACKET
+ : LR_BRACKET datetimeLiteral (COMMA measurementValue)+ RR_BRACKET
| LR_BRACKET INTEGER_LITERAL (COMMA measurementValue)+ RR_BRACKET
| LR_BRACKET (measurementValue COMMA?)+ RR_BRACKET
;
@@ -676,32 +682,31 @@ wildcard
// Constant & Literal
constant
- : STRING_LITERAL
- | dateExpression
- | (MINUS|PLUS)? INTEGER_LITERAL
+ : dateExpression
| (MINUS|PLUS)? realLiteral
+ | (MINUS|PLUS)? INTEGER_LITERAL
+ | STRING_LITERAL
| BOOLEAN_LITERAL
| NULL_LITERAL
| NAN_LITERAL
;
+datetimeLiteral
+ : DATETIME_LITERAL
+ | NOW LR_BRACKET RR_BRACKET
+ ;
+
realLiteral
: INTEGER_LITERAL DOT (INTEGER_LITERAL|EXPONENT_NUM_PART)?
| DOT (INTEGER_LITERAL|EXPONENT_NUM_PART)
| EXPONENT_NUM_PART
;
-datetimeLiteral
- : DATETIME_LITERAL
- | dateExpression
- | INTEGER_LITERAL
- ;
-
// Expression & Predicate
dateExpression
- : DATETIME_LITERAL ((PLUS | MINUS) DURATION_LITERAL)*
+ : datetimeLiteral ((PLUS | MINUS) DURATION_LITERAL)*
;
expression
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 88dd607..39193cb 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
@@ -1168,24 +1168,20 @@ public class IoTDBSqlVisitor extends
IoTDBSqlParserBaseVisitor<Operator> {
long startTime;
long endTime;
long currentTime = DatetimeUtils.currentTime();
- if (timeInterval.datetimeLiteral(0).INTEGER_LITERAL() != null) {
- startTime =
Long.parseLong(timeInterval.datetimeLiteral(0).INTEGER_LITERAL().getText());
- } else if (timeInterval.datetimeLiteral(0).dateExpression() != null) {
- startTime =
-
parseDateExpression(timeInterval.datetimeLiteral(0).dateExpression(),
currentTime);
+ if (timeInterval.timeValue(0).INTEGER_LITERAL() != null) {
+ startTime =
Long.parseLong(timeInterval.timeValue(0).INTEGER_LITERAL().getText());
+ } else if (timeInterval.timeValue(0).dateExpression() != null) {
+ startTime =
parseDateExpression(timeInterval.timeValue(0).dateExpression(), currentTime);
} else {
startTime =
- parseDateFormat(
- timeInterval.datetimeLiteral(0).DATETIME_LITERAL().getText(),
currentTime);
+
parseDateFormat(timeInterval.timeValue(0).datetimeLiteral().getText(),
currentTime);
}
- if (timeInterval.datetimeLiteral(1).INTEGER_LITERAL() != null) {
- endTime =
Long.parseLong(timeInterval.datetimeLiteral(1).INTEGER_LITERAL().getText());
- } else if (timeInterval.datetimeLiteral(1).dateExpression() != null) {
- endTime =
parseDateExpression(timeInterval.datetimeLiteral(1).dateExpression(),
currentTime);
+ if (timeInterval.timeValue(1).INTEGER_LITERAL() != null) {
+ endTime =
Long.parseLong(timeInterval.timeValue(1).INTEGER_LITERAL().getText());
+ } else if (timeInterval.timeValue(1).dateExpression() != null) {
+ endTime =
parseDateExpression(timeInterval.timeValue(1).dateExpression(), currentTime);
} else {
- endTime =
- parseDateFormat(
- timeInterval.datetimeLiteral(1).DATETIME_LITERAL().getText(),
currentTime);
+ endTime =
parseDateFormat(timeInterval.timeValue(1).datetimeLiteral().getText(),
currentTime);
}
groupByClauseComponent.setStartTime(startTime);
@@ -1332,8 +1328,8 @@ public class IoTDBSqlVisitor extends
IoTDBSqlParserBaseVisitor<Operator> {
long[] timeArray = new long[insertMultiValues.size()];
for (int i = 0; i < insertMultiValues.size(); i++) {
long timestamp;
- if (insertMultiValues.get(i).DATETIME_LITERAL() != null) {
- timestamp =
parseDateFormat(insertMultiValues.get(i).DATETIME_LITERAL().getText());
+ if (insertMultiValues.get(i).datetimeLiteral() != null) {
+ timestamp =
parseDateFormat(insertMultiValues.get(i).datetimeLiteral().getText());
} else if (insertMultiValues.get(i).INTEGER_LITERAL() != null) {
timestamp =
Long.parseLong(insertMultiValues.get(i).INTEGER_LITERAL().getText());
} else if (insertMultiValues.size() != 1) {
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
b/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
index 6c48346..465ba44 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
@@ -56,30 +56,43 @@ public class LogicalGenerator {
public static Operator generate(String sql, ZoneId zoneId) throws
ParseCancellationException {
IoTDBSqlVisitor ioTDBSqlVisitor = new IoTDBSqlVisitor();
ioTDBSqlVisitor.setZoneId(zoneId);
+
CharStream charStream1 = CharStreams.fromString(sql);
+
IoTDBSqlLexer lexer1 = new IoTDBSqlLexer(charStream1);
lexer1.removeErrorListeners();
lexer1.addErrorListener(SQLParseError.INSTANCE);
+
CommonTokenStream tokens1 = new CommonTokenStream(lexer1);
+
IoTDBSqlParser parser1 = new IoTDBSqlParser(tokens1);
parser1.getInterpreter().setPredictionMode(PredictionMode.SLL);
parser1.removeErrorListeners();
parser1.addErrorListener(SQLParseError.INSTANCE);
+
ParseTree tree;
try {
- tree = parser1.singleStatement(); // STAGE 1
+ // STAGE 1: try with simpler/faster SLL(*)
+ tree = parser1.singleStatement();
+ // if we get here, there was no syntax error and SLL(*) was enough;
+ // there is no need to try full LL(*)
} catch (Exception ex) {
CharStream charStream2 = CharStreams.fromString(sql);
+
IoTDBSqlLexer lexer2 = new IoTDBSqlLexer(charStream2);
lexer2.removeErrorListeners();
lexer2.addErrorListener(SQLParseError.INSTANCE);
+
CommonTokenStream tokens2 = new CommonTokenStream(lexer2);
+
IoTDBSqlParser parser2 = new IoTDBSqlParser(tokens2);
parser2.getInterpreter().setPredictionMode(PredictionMode.LL);
parser2.removeErrorListeners();
parser2.addErrorListener(SQLParseError.INSTANCE);
- tree = parser2.singleStatement(); // STAGE 2
- // if we parse ok, it's LL not SLL
+
+ // STAGE 2: parser with full LL(*)
+ tree = parser2.singleStatement();
+ // if we get here, it's LL not SLL
}
return ioTDBSqlVisitor.visit(tree);
}