This is an automated email from the ASF dual-hosted git repository.

chaow pushed a commit to branch rel/0.12
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/0.12 by this push:
     new 75dbdb0  Some basic operators should not be applied to text time 
series (#3723)
75dbdb0 is described below

commit 75dbdb0417b9bde8d3621e7292103cf81df994c9
Author: Hang Ji <[email protected]>
AuthorDate: Wed Aug 11 19:38:02 2021 +0800

    Some basic operators should not be applied to text time series (#3723)
---
 .../db/qp/logical/crud/BasicFunctionOperator.java  | 21 +++++---
 .../iotdb/db/integration/IoTDBQueryDemoIT.java     | 62 ++++++++++++++++++++++
 .../dataset/groupby/GroupByFillDataSetTest.java    |  2 +-
 3 files changed, 76 insertions(+), 9 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/BasicFunctionOperator.java
 
b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/BasicFunctionOperator.java
index 41fc1cd..c0f73b5 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/BasicFunctionOperator.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/BasicFunctionOperator.java
@@ -36,7 +36,7 @@ import org.slf4j.LoggerFactory;
 import java.util.Map;
 import java.util.Objects;
 
-/** basic operator includes < > >= <= !=. */
+/** basic operator includes = < > >= <= !=. */
 public class BasicFunctionOperator extends FunctionOperator {
 
   protected String value;
@@ -101,13 +101,18 @@ public class BasicFunctionOperator extends 
FunctionOperator {
         ret = funcToken.getUnaryExpression(singlePath, Double.valueOf(value));
         break;
       case TEXT:
-        ret =
-            funcToken.getUnaryExpression(
-                singlePath,
-                (value.startsWith("'") && value.endsWith("'"))
-                        || (value.startsWith("\"") && value.endsWith("\""))
-                    ? new Binary(value.substring(1, value.length() - 1))
-                    : new Binary(value));
+        if (funcToken.name().equals("EQ") || 
funcToken.name().equals("NOTEQUAL")) {
+          ret =
+              funcToken.getUnaryExpression(
+                  singlePath,
+                  (value.startsWith("'") && value.endsWith("'"))
+                          || (value.startsWith("\"") && value.endsWith("\""))
+                      ? new Binary(value.substring(1, value.length() - 1))
+                      : new Binary(value));
+        } else {
+          throw new LogicalOperatorException(
+              "For Basic operator,TEXT type only support EQUAL or NOTEQUAL 
operator");
+        }
         break;
       default:
         throw new LogicalOperatorException(type.toString(), "");
diff --git 
a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBQueryDemoIT.java 
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBQueryDemoIT.java
index ba247fc..b041b3e 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBQueryDemoIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBQueryDemoIT.java
@@ -483,4 +483,66 @@ public class IoTDBQueryDemoIT {
     }
     return actualIndexToExpectedIndexList;
   }
+
+  @Test
+  public void testWrongTextQuery() 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("select * from root.ln.wf02.wt02 where hardware > 
'v1'");
+    } catch (Exception e) {
+      Assert.assertEquals(
+          e.getMessage(),
+          "411: Error occurred in query process: For Basic operator,TEXT type 
only support EQUAL or NOTEQUAL operator");
+    }
+  }
+
+  @Test
+  public void testRightTextQuery() throws ClassNotFoundException {
+    // Text type uses the equal operator to query the correct result
+    String[] retArray =
+        new String[] {
+          "1509465600000,v2,", "1509465660000,v2,",
+        };
+    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()) {
+      boolean hasResultSet =
+          statement.execute("select hardware from root.ln.wf02.wt02 where 
hardware = 'v2'");
+      Assert.assertTrue(hasResultSet);
+      try (ResultSet resultSet = statement.getResultSet()) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        List<Integer> actualIndexToExpectedIndexList =
+            checkHeader(
+                resultSetMetaData,
+                "Time,root.ln.wf02.wt02.hardware,",
+                new int[] {
+                  Types.TIMESTAMP, Types.VARCHAR,
+                });
+
+        int cnt = 0;
+        while (resultSet.next()) {
+          String[] expectedStrings = retArray[cnt].split(",");
+          StringBuilder expectedBuilder = new StringBuilder();
+          StringBuilder actualBuilder = new StringBuilder();
+          for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+            actualBuilder.append(resultSet.getString(i)).append(",");
+            expectedBuilder
+                .append(expectedStrings[actualIndexToExpectedIndexList.get(i - 
1)])
+                .append(",");
+          }
+          Assert.assertEquals(expectedBuilder.toString(), 
actualBuilder.toString());
+          cnt++;
+        }
+        Assert.assertEquals(2, cnt);
+      }
+
+    } catch (Exception e) {
+      Assert.assertNull(e.getMessage());
+    }
+  }
 }
diff --git 
a/server/src/test/java/org/apache/iotdb/db/query/dataset/groupby/GroupByFillDataSetTest.java
 
b/server/src/test/java/org/apache/iotdb/db/query/dataset/groupby/GroupByFillDataSetTest.java
index 341b56c..9e658e6 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/query/dataset/groupby/GroupByFillDataSetTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/query/dataset/groupby/GroupByFillDataSetTest.java
@@ -42,7 +42,7 @@ public class GroupByFillDataSetTest {
   private String[] sqls = {
     "SET STORAGE GROUP TO root.vehicle",
     "CREATE TIMESERIES root.vehicle.d0.s0 WITH DATATYPE=INT32, ENCODING=RLE",
-    "CREATE TIMESERIES root.vehicle.d0.s1 WITH DATATYPE=TEXT, ENCODING=PLAIN",
+    "CREATE TIMESERIES root.vehicle.d0.s1 WITH DATATYPE=INT32, ENCODING=RLE",
     "CREATE TIMESERIES root.vehicle.d0.s2 WITH DATATYPE=INT32, ENCODING=RLE",
     "insert into root.vehicle.d0(timestamp,s0) values(1,1)",
     "insert into root.vehicle.d0(timestamp,s1) values(1,1)",

Reply via email to