You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2022/04/27 01:43:33 UTC

[iotdb] branch master updated: [IOTDB-3017] Reorder expression priority according to standard (#5669)

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 5708dfd192 [IOTDB-3017] Reorder expression priority according to standard (#5669)
5708dfd192 is described below

commit 5708dfd192dd7a91cab5948b0d8d50cb62ab007a
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Wed Apr 27 09:43:26 2022 +0800

    [IOTDB-3017] Reorder expression priority according to standard (#5669)
---
 .../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4   | 14 ++---
 docs/UserGuide/Query-Data/Select-Expression.md     |  7 ++-
 docs/zh/UserGuide/Query-Data/Select-Expression.md  |  7 ++-
 .../iotdb/db/integration/IoTDBSelectSchemaIT.java  |  9 ++--
 .../apache/iotdb/db/mpp/sql/parser/ASTVisitor.java | 58 +++++++++-----------
 .../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java    | 58 +++++++++-----------
 .../iotdb/db/query/expression/Expression.java      |  5 +-
 .../iotdb/db/query/expression/ExpressionType.java  | 61 ++++++++++++++--------
 .../expression/binary/AdditionExpression.java      |  4 +-
 .../query/expression/binary/BinaryExpression.java  |  5 +-
 .../expression/binary/DivisionExpression.java      |  4 +-
 .../query/expression/binary/EqualToExpression.java |  4 +-
 .../expression/binary/GreaterEqualExpression.java  |  4 +-
 .../expression/binary/GreaterThanExpression.java   |  4 +-
 .../expression/binary/LessEqualExpression.java     |  4 +-
 .../expression/binary/LessThanExpression.java      |  4 +-
 .../expression/binary/LogicAndExpression.java      |  4 +-
 .../query/expression/binary/LogicOrExpression.java |  4 +-
 .../query/expression/binary/ModuloExpression.java  |  4 +-
 .../binary/MultiplicationExpression.java           |  4 +-
 .../expression/binary/NonEqualExpression.java      |  4 +-
 .../expression/binary/SubtractionExpression.java   |  4 +-
 .../db/query/expression/unary/ConstantOperand.java | 10 +++-
 .../query/expression/unary/FunctionExpression.java |  4 +-
 .../query/expression/unary/LogicNotExpression.java | 16 +++---
 .../query/expression/unary/NegationExpression.java | 17 +++---
 .../query/expression/unary/RegularExpression.java  |  7 ++-
 .../query/expression/unary/TimeSeriesOperand.java  |  4 +-
 28 files changed, 172 insertions(+), 162 deletions(-)

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 24c8dfb88c..e5f1ea3e62 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
@@ -840,18 +840,18 @@ dateExpression
 // multiplication, division, and modulus higher than that of addition and substraction.
 expression
     : LR_BRACKET unaryInBracket=expression RR_BRACKET
-    | (PLUS | MINUS) unaryAfterSign=expression
-    | OPERATOR_NOT unaryAfterNot=expression
+    | constant
+    | time=(TIME | TIMESTAMP)
+    | suffixPathCanInExpr
+    | functionName LR_BRACKET expression (COMMA expression)* functionAttribute* RR_BRACKET
+    | (PLUS | MINUS | OPERATOR_NOT) expressionAfterUnaryOperator=expression
     | leftExpression=expression (STAR | DIV | MOD) rightExpression=expression
     | leftExpression=expression (PLUS | MINUS) rightExpression=expression
     | leftExpression=expression (OPERATOR_GT | OPERATOR_GTE | OPERATOR_LT | OPERATOR_LTE | OPERATOR_DEQ | OPERATOR_NEQ) rightExpression=expression
     | unaryBeforeRegularExpression=expression (REGEXP | LIKE) STRING_LITERAL
     | unaryBeforeInExpression=expression OPERATOR_IN LR_BRACKET constant (COMMA constant)* RR_BRACKET
-    | leftExpression=expression (OPERATOR_AND | OPERATOR_OR) rightExpression=expression
-    | functionName LR_BRACKET expression (COMMA expression)* functionAttribute* RR_BRACKET
-    | suffixPathCanInExpr
-    | time=(TIME | TIMESTAMP)
-    | constant
+    | leftExpression=expression OPERATOR_AND rightExpression=expression
+    | leftExpression=expression OPERATOR_OR rightExpression=expression
     ;
 
 functionName
diff --git a/docs/UserGuide/Query-Data/Select-Expression.md b/docs/UserGuide/Query-Data/Select-Expression.md
index 6ab41d2b46..e3cf02c00b 100644
--- a/docs/UserGuide/Query-Data/Select-Expression.md
+++ b/docs/UserGuide/Query-Data/Select-Expression.md
@@ -176,8 +176,11 @@ IoTDB> select a, b, a > 10, a <= b, !(a <= b), a > 10 && a > b from root.test;
 |4    |`<=`         |Binary compare operator less or equal to|
 |4    |`==`         |Binary compare operator equal to|
 |4    |`!=`/`<>`    |Binary compare operator non-equal to|
-|5    |`and`/`&`/`&&`               |Binary logic operator and|
-|5    |`or`/ &#124; / &#124;&#124;  |Binary logic operator or|
+|5      |`REGEXP`   |`REGEXP` operator|
+|5      |`LIKE`    |`LIKE` operator|
+|6      |`IN`    |`IN` operator|
+|7    |`and`/`&`/`&&`               |Binary logic operator and|
+|8    |`or`/ &#124; / &#124;&#124;  |Binary logic operator or|
 
 ## Time Series Generating Functions
 
diff --git a/docs/zh/UserGuide/Query-Data/Select-Expression.md b/docs/zh/UserGuide/Query-Data/Select-Expression.md
index 0e1ca6f8ab..316fe113bd 100644
--- a/docs/zh/UserGuide/Query-Data/Select-Expression.md
+++ b/docs/zh/UserGuide/Query-Data/Select-Expression.md
@@ -178,8 +178,11 @@ IoTDB> select a, b, a > 10, a <= b, !(a <= b), a > 10 && a > b from root.test;
 |4      |`<=`    |双目比较运算符小于等于|
 |4      |`==`    |双目比较运算符等于|
 |4      |`!=`/`<>`    |双目比较运算符不等于|
-|5      |`and`/`&`/`&&`|双目逻辑运算符与|
-|5      |`or`/ &#124; / &#124;&#124;|双目逻辑运算符或|
+|5      |`REGEXP`   |`REGEXP`运算符|
+|5      |`LIKE`    |`LIKE`运算符|
+|6      |`IN`    |`IN`运算符|
+|7      |`and`/`&`/`&&`|双目逻辑运算符与|
+|8      |`or`/ &#124; / &#124;&#124;|双目逻辑运算符或|
 <!--- &#124;即管道符 转义不能用在``里, 表格内不允许使用管道符 -->
 
 ## 内置时间序列生成函数
diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectSchemaIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectSchemaIT.java
index a266768166..efbcf2db3e 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectSchemaIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectSchemaIT.java
@@ -86,6 +86,7 @@ public class IoTDBSelectSchemaIT {
       "-2+s1",
       "!true||s1>0",
       "-(-1)+s1",
+      "sin(s1)+s1",
     };
     String[] completeExpressions = {
       "root.sg.d1.s1+root.sg.d1.s2",
@@ -95,15 +96,16 @@ public class IoTDBSelectSchemaIT {
       "-(-root.sg.d1.s1)",
       "(root.sg.d1.s1+root.sg.d1.s2)*root.sg.d1.s3",
       "-2+root.sg.d1.s1",
-      "!true|(root.sg.d1.s1>0)",
+      "!true|root.sg.d1.s1>0",
       "-(-1)+root.sg.d1.s1",
+      "sin(root.sg.d1.s1)+root.sg.d1.s1",
     };
     try (Connection connection = EnvFactory.getEnv().getConnection();
         Statement statement = connection.createStatement()) {
       ResultSet resultSet =
           statement.executeQuery(
               String.format(
-                  "select %s, %s, %s, %s, %s, %s, %s, %s, %s from root.sg.d1",
+                  "select %s, %s, %s, %s, %s, %s, %s, %s, %s, %s from root.sg.d1",
                   expressions[0],
                   expressions[1],
                   expressions[2],
@@ -112,7 +114,8 @@ public class IoTDBSelectSchemaIT {
                   expressions[5],
                   expressions[6],
                   expressions[7],
-                  expressions[8]));
+                  expressions[8],
+                  expressions[9]));
       int columnCount = resultSet.getMetaData().getColumnCount();
       assertEquals(1 + expressions.length, columnCount);
 
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/sql/parser/ASTVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/sql/parser/ASTVisitor.java
index 69b1439040..2f4a4d8f8a 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/sql/parser/ASTVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/sql/parser/ASTVisitor.java
@@ -1604,25 +1604,32 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
   // Expression & Predicate ========================================================================
 
   private Expression parseExpression(IoTDBSqlParser.ExpressionContext context) {
-    // LR_BRACKET unaryInBracket=expression RR_BRACKET
     if (context.unaryInBracket != null) {
       return parseExpression(context.unaryInBracket);
     }
 
-    // (PLUS | MINUS) unaryAfterSign=expression
-    if (context.unaryAfterSign != null) {
-      return context.MINUS() != null
-          ? new NegationExpression(parseExpression(context.unaryAfterSign))
-          : parseExpression(context.unaryAfterSign);
+    if (context.constant() != null && !context.constant().isEmpty()) {
+      return parseConstantOperand(context.constant(0));
     }
 
-    // OPERATOR_NOT unaryAfterNot=expression
-    if (context.OPERATOR_NOT() != null) {
-      return new LogicNotExpression(parseExpression(context.unaryAfterNot));
+    if (context.time != null) {
+      throw new UnsupportedOperationException();
+    }
+
+    if (context.suffixPathCanInExpr() != null) {
+      return new TimeSeriesOperand(parseSuffixPathCanInExpr(context.suffixPathCanInExpr()));
+    }
+
+    if (context.expressionAfterUnaryOperator != null) {
+      if (context.MINUS() != null) {
+        return new NegationExpression(parseExpression(context.expressionAfterUnaryOperator));
+      }
+      if (context.OPERATOR_NOT() != null) {
+        return new LogicNotExpression(parseExpression(context.expressionAfterUnaryOperator));
+      }
+      return parseExpression(context.expressionAfterUnaryOperator);
     }
 
-    // leftExpression=expression (STAR | DIV | MOD) rightExpression=expression
-    // leftExpression=expression (PLUS | MINUS) rightExpression=expression
     if (context.leftExpression != null && context.rightExpression != null) {
       Expression leftExpression = parseExpression(context.leftExpression);
       Expression rightExpression = parseExpression(context.rightExpression);
@@ -1667,33 +1674,18 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
       }
     }
 
-    // functionName=suffixPath LR_BRACKET expression (COMMA expression)* functionAttribute*
-    // RR_BRACKET
     if (context.functionName() != null) {
       return parseFunctionExpression(context);
     }
 
-    // unaryBeforeRegularExpression=expression (REGEXP | LIKE) STRING_LITERAL
     if (context.unaryBeforeRegularExpression != null) {
       return parseRegularExpression(context);
     }
 
-    // unaryBeforeInExpression=expression OPERATOR_IN LR_BRACKET constant (COMMA constant)*
-    // RR_BRACKET
     if (context.unaryBeforeInExpression != null) {
       return parseInExpression(context);
     }
 
-    // suffixPath
-    if (context.suffixPathCanInExpr() != null) {
-      return new TimeSeriesOperand(parseSuffixPathCanInExpr(context.suffixPathCanInExpr()));
-    }
-
-    // constant
-    if (context.constant() != null && !context.constant().isEmpty()) {
-      return parseConstantOperand(context.constant(0));
-    }
-
     throw new UnsupportedOperationException();
   }
 
@@ -1740,24 +1732,22 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
 
   private Expression parseConstantOperand(ConstantContext constantContext) {
     try {
+      String text = constantContext.getText();
       if (clientVersion.equals(IoTDBConstant.ClientVersion.V_0_13)) {
         if (constantContext.BOOLEAN_LITERAL() != null) {
-          return new ConstantOperand(
-              TSDataType.BOOLEAN, constantContext.BOOLEAN_LITERAL().getText());
+          return new ConstantOperand(TSDataType.BOOLEAN, text);
         } else if (constantContext.STRING_LITERAL() != null) {
-          String text = constantContext.STRING_LITERAL().getText();
           return new ConstantOperand(TSDataType.TEXT, parseStringLiteral(text));
         } else if (constantContext.INTEGER_LITERAL() != null) {
-          return new ConstantOperand(TSDataType.INT64, constantContext.INTEGER_LITERAL().getText());
+          return new ConstantOperand(TSDataType.INT64, text);
         } else if (constantContext.realLiteral() != null) {
-          return new ConstantOperand(TSDataType.DOUBLE, constantContext.realLiteral().getText());
+          return new ConstantOperand(TSDataType.DOUBLE, text);
         } else {
-          throw new SQLParserException(
-              "Unsupported constant operand: " + constantContext.getText());
+          throw new SQLParserException("Unsupported constant operand: " + text);
         }
       } else if (clientVersion.equals(IoTDBConstant.ClientVersion.V_0_12)) {
         // if client version is before 0.13, node name in expression may be a constant
-        return new TimeSeriesOperand(convertConstantToPath(constantContext.getText()));
+        return new TimeSeriesOperand(convertConstantToPath(text));
       } else {
         throw new UnsupportedOperationException();
       }
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 4c1c8319ab..c384720ed8 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
@@ -2508,25 +2508,32 @@ public class IoTDBSqlVisitor extends IoTDBSqlParserBaseVisitor<Operator> {
 
   @SuppressWarnings("squid:S3776")
   private Expression parseExpression(IoTDBSqlParser.ExpressionContext context) {
-    // LR_BRACKET unaryInBracket=expression RR_BRACKET
     if (context.unaryInBracket != null) {
       return parseExpression(context.unaryInBracket);
     }
 
-    // (PLUS | MINUS) unaryAfterSign=expression
-    if (context.unaryAfterSign != null) {
-      return context.MINUS() != null
-          ? new NegationExpression(parseExpression(context.unaryAfterSign))
-          : parseExpression(context.unaryAfterSign);
+    if (context.constant() != null && !context.constant().isEmpty()) {
+      return parseConstantOperand(context.constant(0));
+    }
+
+    if (context.time != null) {
+      throw new UnsupportedOperationException();
+    }
+
+    if (context.suffixPathCanInExpr() != null) {
+      return new TimeSeriesOperand(parseSuffixPathCanInExpr(context.suffixPathCanInExpr()));
     }
 
-    // OPERATOR_NOT unaryAfterNot=expression
-    if (context.OPERATOR_NOT() != null) {
-      return new LogicNotExpression(parseExpression(context.unaryAfterNot));
+    if (context.expressionAfterUnaryOperator != null) {
+      if (context.MINUS() != null) {
+        return new NegationExpression(parseExpression(context.expressionAfterUnaryOperator));
+      }
+      if (context.OPERATOR_NOT() != null) {
+        return new LogicNotExpression(parseExpression(context.expressionAfterUnaryOperator));
+      }
+      return parseExpression(context.expressionAfterUnaryOperator);
     }
 
-    // leftExpression=expression (STAR | DIV | MOD) rightExpression=expression
-    // leftExpression=expression (PLUS | MINUS) rightExpression=expression
     if (context.leftExpression != null && context.rightExpression != null) {
       Expression leftExpression = parseExpression(context.leftExpression);
       Expression rightExpression = parseExpression(context.rightExpression);
@@ -2571,33 +2578,18 @@ public class IoTDBSqlVisitor extends IoTDBSqlParserBaseVisitor<Operator> {
       }
     }
 
-    // functionName=suffixPath LR_BRACKET expression (COMMA expression)* functionAttribute*
-    // RR_BRACKET
     if (context.functionName() != null) {
       return parseFunctionExpression(context);
     }
 
-    // unaryBeforeRegularExpression=expression (REGEXP | LIKE) STRING_LITERAL
     if (context.unaryBeforeRegularExpression != null) {
       return parseRegularExpression(context);
     }
 
-    // unaryBeforeInExpression=expression OPERATOR_IN LR_BRACKET constant (COMMA constant)*
-    // RR_BRACKET
     if (context.unaryBeforeInExpression != null) {
       return parseInExpression(context);
     }
 
-    // suffixPath
-    if (context.suffixPathCanInExpr() != null) {
-      return new TimeSeriesOperand(parseSuffixPathCanInExpr(context.suffixPathCanInExpr()));
-    }
-
-    // constant
-    if (context.constant() != null && !context.constant().isEmpty()) {
-      return parseConstantOperand(context.constant(0));
-    }
-
     throw new UnsupportedOperationException();
   }
 
@@ -2644,24 +2636,22 @@ public class IoTDBSqlVisitor extends IoTDBSqlParserBaseVisitor<Operator> {
 
   private Expression parseConstantOperand(ConstantContext constantContext) {
     try {
+      String text = constantContext.getText();
       if (clientVersion.equals(IoTDBConstant.ClientVersion.V_0_13)) {
         if (constantContext.BOOLEAN_LITERAL() != null) {
-          return new ConstantOperand(
-              TSDataType.BOOLEAN, constantContext.BOOLEAN_LITERAL().getText());
+          return new ConstantOperand(TSDataType.BOOLEAN, text);
         } else if (constantContext.STRING_LITERAL() != null) {
-          String text = constantContext.STRING_LITERAL().getText();
           return new ConstantOperand(TSDataType.TEXT, parseStringLiteral(text));
         } else if (constantContext.INTEGER_LITERAL() != null) {
-          return new ConstantOperand(TSDataType.INT64, constantContext.INTEGER_LITERAL().getText());
+          return new ConstantOperand(TSDataType.INT64, text);
         } else if (constantContext.realLiteral() != null) {
-          return new ConstantOperand(TSDataType.DOUBLE, constantContext.realLiteral().getText());
+          return new ConstantOperand(TSDataType.DOUBLE, text);
         } else {
-          throw new SQLParserException(
-              "Unsupported constant operand: " + constantContext.getText());
+          throw new SQLParserException("Unsupported constant operand: " + text);
         }
       } else if (clientVersion.equals(IoTDBConstant.ClientVersion.V_0_12)) {
         // if client version is before 0.13, node name in expression may be a constant
-        return new TimeSeriesOperand(convertConstantToPath(constantContext.getText()));
+        return new TimeSeriesOperand(convertConstantToPath(text));
       } else {
         throw new UnsupportedOperationException();
       }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java
index 8f202932e7..b79c145b62 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/Expression.java
@@ -215,10 +215,11 @@ public abstract class Expression {
     }
   }
 
-  protected abstract short getExpressionType();
+  public abstract ExpressionType getExpressionType();
 
   public static void serialize(Expression expression, ByteBuffer byteBuffer) {
-    ReadWriteIOUtils.write(expression.getExpressionType(), byteBuffer);
+    ReadWriteIOUtils.write(
+        expression.getExpressionType().getExpressionTypeInShortEnum(), byteBuffer);
 
     expression.serialize(byteBuffer);
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/ExpressionType.java b/server/src/main/java/org/apache/iotdb/db/query/expression/ExpressionType.java
index 4510f4a4a1..d53f55a689 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/ExpressionType.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/ExpressionType.java
@@ -19,34 +19,51 @@
 package org.apache.iotdb.db.query.expression;
 
 public enum ExpressionType {
-  ADDITION((short) 0),
-  DIVISION((short) 1),
-  EQUAL_TO((short) 2),
-  GREATER_EQUAL((short) 3),
-  GREATER_THAN((short) 4),
-  LESS_EQUAL((short) 5),
-  LESS_THAN((short) 6),
-  LOGIC_AND((short) 7),
-  LOGIC_OR((short) 8),
-  MODULO((short) 9),
-  MULTIPLICATION((short) 10),
-  NON_EQUAL((short) 11),
-  SUBTRACTION((short) 12),
-  FUNCTION((short) 13),
-  LOGIC_NOT((short) 14),
-  NEGATION((short) 15),
-  TIME_SERIES((short) 16),
-  CONSTANT((short) 17),
-  IN((short) 18),
-  REGULAR((short) 19);
+  CONSTANT((short) -4, (short) 1400),
+  TIME_COLUMN((short) -3, (short) 1300),
+  TIME_SERIES((short) -2, (short) 1200),
+  FUNCTION((short) -1, (short) 1100),
+
+  NEGATION((short) 0, (short) 1000),
+  LOGIC_NOT((short) 1, (short) 1000),
+
+  MULTIPLICATION((short) 2, (short) 900),
+  DIVISION((short) 3, (short) 900),
+  MODULO((short) 4, (short) 900),
+
+  ADDITION((short) 5, (short) 800),
+  SUBTRACTION((short) 6, (short) 800),
+
+  EQUAL_TO((short) 7, (short) 600),
+  NON_EQUAL((short) 8, (short) 600),
+  GREATER_EQUAL((short) 9, (short) 600),
+  GREATER_THAN((short) 10, (short) 600),
+  LESS_EQUAL((short) 11, (short) 600),
+  LESS_THAN((short) 12, (short) 600),
+
+  REGEXP((short) 13, (short) 500),
+  LIKE((short) 14, (short) 500),
+
+  IN((short) 15, (short) 400),
+
+  LOGIC_AND((short) 16, (short) 300),
+
+  LOGIC_OR((short) 17, (short) 200),
+  ;
 
   private final short expressionType;
+  private final short priority;
 
-  ExpressionType(short expressionType) {
+  ExpressionType(short expressionType, short priority) {
     this.expressionType = expressionType;
+    this.priority = priority;
   }
 
-  public short getExpressionType() {
+  public short getExpressionTypeInShortEnum() {
     return expressionType;
   }
+
+  public short getPriority() {
+    return priority;
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/AdditionExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/AdditionExpression.java
index 9ad079daf1..a4ba44b3c7 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/AdditionExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/AdditionExpression.java
@@ -50,7 +50,7 @@ public class AdditionExpression extends BinaryExpression {
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.ADDITION.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.ADDITION;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java
index d822a00801..c535d97faa 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java
@@ -281,13 +281,14 @@ public abstract class BinaryExpression extends Expression {
   @Override
   public final String getExpressionStringInternal() {
     StringBuilder builder = new StringBuilder();
-    if (leftExpression instanceof BinaryExpression) {
+    if (leftExpression.getExpressionType().getPriority() < this.getExpressionType().getPriority()) {
       builder.append("(").append(leftExpression.getExpressionString()).append(")");
     } else {
       builder.append(leftExpression.getExpressionString());
     }
     builder.append(" ").append(operator()).append(" ");
-    if (rightExpression instanceof BinaryExpression) {
+    if (rightExpression.getExpressionType().getPriority()
+        < this.getExpressionType().getPriority()) {
       builder.append("(").append(rightExpression.getExpressionString()).append(")");
     } else {
       builder.append(rightExpression.getExpressionString());
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/DivisionExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/DivisionExpression.java
index e72fe7ea86..b73e156a07 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/DivisionExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/DivisionExpression.java
@@ -50,7 +50,7 @@ public class DivisionExpression extends BinaryExpression {
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.DIVISION.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.DIVISION;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/EqualToExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/EqualToExpression.java
index d506f15ae6..5edc7e8ae8 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/EqualToExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/EqualToExpression.java
@@ -49,7 +49,7 @@ public class EqualToExpression extends BinaryExpression {
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.EQUAL_TO.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.EQUAL_TO;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/GreaterEqualExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/GreaterEqualExpression.java
index 2a7944dfb1..2e7594d403 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/GreaterEqualExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/GreaterEqualExpression.java
@@ -50,7 +50,7 @@ public class GreaterEqualExpression extends BinaryExpression {
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.GREATER_EQUAL.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.GREATER_EQUAL;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/GreaterThanExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/GreaterThanExpression.java
index 40e3c26ae0..14f2e4321d 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/GreaterThanExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/GreaterThanExpression.java
@@ -50,7 +50,7 @@ public class GreaterThanExpression extends BinaryExpression {
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.GREATER_THAN.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.GREATER_THAN;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LessEqualExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LessEqualExpression.java
index 9fe0213afa..0368c02290 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LessEqualExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LessEqualExpression.java
@@ -49,7 +49,7 @@ public class LessEqualExpression extends BinaryExpression {
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.LESS_EQUAL.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.LESS_EQUAL;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LessThanExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LessThanExpression.java
index e0a9e2e4f5..2a05a80c4a 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LessThanExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LessThanExpression.java
@@ -49,7 +49,7 @@ public class LessThanExpression extends BinaryExpression {
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.LESS_THAN.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.LESS_THAN;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LogicAndExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LogicAndExpression.java
index a35ef9cf8c..a7f905ad1f 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LogicAndExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LogicAndExpression.java
@@ -49,7 +49,7 @@ public class LogicAndExpression extends BinaryExpression {
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.LOGIC_AND.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.LOGIC_AND;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LogicOrExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LogicOrExpression.java
index 2c031fb746..e0a7e1437d 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LogicOrExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LogicOrExpression.java
@@ -49,7 +49,7 @@ public class LogicOrExpression extends BinaryExpression {
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.LOGIC_OR.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.LOGIC_OR;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/ModuloExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/ModuloExpression.java
index 39f1b90a3f..44d7d01b02 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/ModuloExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/ModuloExpression.java
@@ -49,7 +49,7 @@ public class ModuloExpression extends BinaryExpression {
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.MODULO.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.MODULO;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/MultiplicationExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/MultiplicationExpression.java
index 86a3539c10..1a52b209c8 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/MultiplicationExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/MultiplicationExpression.java
@@ -50,7 +50,7 @@ public class MultiplicationExpression extends BinaryExpression {
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.MULTIPLICATION.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.MULTIPLICATION;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/NonEqualExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/NonEqualExpression.java
index 159ff11522..3169ed1834 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/NonEqualExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/NonEqualExpression.java
@@ -49,7 +49,7 @@ public class NonEqualExpression extends BinaryExpression {
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.NON_EQUAL.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.NON_EQUAL;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/SubtractionExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/SubtractionExpression.java
index dd91f9e7d5..b2a0fd6151 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/SubtractionExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/SubtractionExpression.java
@@ -50,7 +50,7 @@ public class SubtractionExpression extends BinaryExpression {
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.SUBTRACTION.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.SUBTRACTION;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/ConstantOperand.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/ConstantOperand.java
index 8da3c75ee7..b50c3c06f9 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/ConstantOperand.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/ConstantOperand.java
@@ -64,6 +64,12 @@ public class ConstantOperand extends Expression {
     return dataType;
   }
 
+  public boolean isNegativeNumber() {
+    return !dataType.equals(TSDataType.TEXT)
+        && !dataType.equals(TSDataType.BOOLEAN)
+        && Double.parseDouble(valueString) < 0;
+  }
+
   @Override
   public boolean isConstantOperandInternal() {
     return true;
@@ -146,8 +152,8 @@ public class ConstantOperand extends Expression {
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.CONSTANT.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.CONSTANT;
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
index 43ff8c5162..892ef2e1ec 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/FunctionExpression.java
@@ -458,8 +458,8 @@ public class FunctionExpression extends Expression {
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.FUNCTION.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.FUNCTION;
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/LogicNotExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/LogicNotExpression.java
index 9c36b3a810..cd657230a9 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/LogicNotExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/LogicNotExpression.java
@@ -192,18 +192,16 @@ public class LogicNotExpression extends Expression {
 
   @Override
   public String getExpressionStringInternal() {
-    if (expression instanceof FunctionExpression
-        || expression instanceof ConstantOperand
-        || expression instanceof TimeSeriesOperand) {
-      return "!" + expression.toString();
-    } else {
-      return "!(" + expression.toString() + ")";
-    }
+    return expression instanceof FunctionExpression
+            || expression instanceof ConstantOperand
+            || expression instanceof TimeSeriesOperand
+        ? "!" + expression
+        : "!(" + expression + ")";
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.LOGIC_NOT.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.LOGIC_NOT;
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java
index 28ed84613e..101c1b1795 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java
@@ -192,18 +192,17 @@ public class NegationExpression extends Expression {
 
   @Override
   public String getExpressionStringInternal() {
-    if (expression instanceof FunctionExpression
-        || expression instanceof ConstantOperand
-        || expression instanceof TimeSeriesOperand) {
-      return "-" + expression.toString();
-    } else {
-      return "-(" + expression.toString() + ")";
-    }
+    return expression instanceof TimeSeriesOperand
+            || expression instanceof FunctionExpression
+            || (expression instanceof ConstantOperand
+                && !((ConstantOperand) expression).isNegativeNumber())
+        ? "-" + expression
+        : "-(" + expression + ")";
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.NEGATION.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.NEGATION;
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/RegularExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/RegularExpression.java
index 0ce8f8589f..2bdafb1804 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/RegularExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/RegularExpression.java
@@ -163,13 +163,12 @@ public class RegularExpression extends Expression {
 
   @Override
   protected String getExpressionStringInternal() {
-    // TODO
-    throw new RuntimeException();
+    return expression + " REGEXP " + patternString;
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.REGULAR.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.REGEXP;
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
index e8cf2566d1..ea83b01c32 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/TimeSeriesOperand.java
@@ -167,8 +167,8 @@ public class TimeSeriesOperand extends Expression {
   }
 
   @Override
-  protected short getExpressionType() {
-    return ExpressionType.TIME_SERIES.getExpressionType();
+  public ExpressionType getExpressionType() {
+    return ExpressionType.TIME_SERIES;
   }
 
   @Override