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);
   }

Reply via email to