You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ji...@apache.org on 2020/11/06 02:47:18 UTC

[iotdb] branch cluster_new updated: fix thrift NPE caused by null alias

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

jiangtian pushed a commit to branch cluster_new
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/cluster_new by this push:
     new 1f98b72  fix thrift NPE caused by null alias
     new bfd787b  Merge pull request #1923 from LebronAl/cluster_new_fix_thrift_NPE
1f98b72 is described below

commit 1f98b72c7ed045ee82983cdf68894673f5e4ee1d
Author: LebronAl <TX...@gmail.com>
AuthorDate: Tue Nov 3 16:00:05 2020 +0800

    fix thrift NPE caused by null alias
---
 .../org/apache/iotdb/db/metadata/PartialPath.java     | 12 ++++++++++--
 .../iotdb/db/qp/strategy/PhysicalGenerator.java       | 19 +++++++++++--------
 .../db/qp/strategy/optimizer/ConcatPathOptimizer.java |  4 ++--
 .../iotdb/db/query/executor/LastQueryExecutor.java    |  4 ++--
 .../org/apache/iotdb/db/service/TSServiceImpl.java    | 18 +++++++++++-------
 .../java/org/apache/iotdb/db/metadata/MTreeTest.java  |  5 ++---
 6 files changed, 38 insertions(+), 24 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/PartialPath.java b/server/src/main/java/org/apache/iotdb/db/metadata/PartialPath.java
index 015d15d..1c1c0f0 100755
--- a/server/src/main/java/org/apache/iotdb/db/metadata/PartialPath.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/PartialPath.java
@@ -40,9 +40,9 @@ public class PartialPath extends Path implements Comparable<Path> {
 
   private String[] nodes;
   // alias of measurement
-  private String measurementAlias = null;
+  private String measurementAlias = "";
   // alias of time series used in SELECT AS
-  private String tsAlias = null;
+  private String tsAlias = "";
 
   /**
    * Construct the PartialPath using a String, will split the given String into String[]
@@ -227,6 +227,10 @@ public class PartialPath extends Path implements Comparable<Path> {
     this.measurementAlias = measurementAlias;
   }
 
+  public boolean isMeasurementAliasExists(){
+    return measurementAlias != null && !measurementAlias.isEmpty();
+  }
+
   public String getTsAlias() {
     return tsAlias;
   }
@@ -235,6 +239,10 @@ public class PartialPath extends Path implements Comparable<Path> {
     this.tsAlias = tsAlias;
   }
 
+  public boolean isTsAliasExists() {
+    return tsAlias != null && !tsAlias.isEmpty();
+  }
+
   @Override
   public String getFullPathWithAlias() {
     return getDevice() + IoTDBConstant.PATH_SEPARATOR + measurementAlias;
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
index 0044134..c168394 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
@@ -437,7 +437,7 @@ public class PhysicalGenerator {
           try {
             // remove stars in SELECT to get actual paths
             List<PartialPath> actualPaths = getMatchedTimeseries(fullPath);
-            if (suffixPath.getTsAlias() != null) {
+            if (suffixPath.isTsAliasExists()) {
               if (actualPaths.size() == 1) {
                 String columnName = actualPaths.get(0).getMeasurement();
                 if (originAggregations != null && !originAggregations.isEmpty()) {
@@ -700,10 +700,11 @@ public class PhysicalGenerator {
     if (queryPlan instanceof LastQueryPlan) {
       for (int i = 0; i < paths.size(); i++) {
         PartialPath path = paths.get(i);
-        String column = path.getTsAlias();
-        if (column == null) {
-          column =
-              path.getMeasurementAlias() != null ? path.getFullPathWithAlias() : path.toString();
+        String column;
+        if (path.isTsAliasExists()) {
+          column = path.getTsAlias();
+        } else {
+          column = path.isMeasurementAliasExists() ? path.getFullPathWithAlias() : path.toString();
         }
         if (!columnSet.contains(column)) {
           TSDataType seriesType = dataTypes.get(i);
@@ -727,10 +728,12 @@ public class PhysicalGenerator {
     int deduplicatedPathNum = 0;
     int index = 0;
     for (Pair<PartialPath, Integer> indexedPath : indexedPaths) {
-      String column = indexedPath.left.getTsAlias();
-      if (column == null) {
+      String column;
+      if (indexedPath.left.isTsAliasExists()) {
+        column = indexedPath.left.getTsAlias();
+      } else {
         column =
-            indexedPath.left.getMeasurementAlias() != null ? indexedPath.left.getFullPathWithAlias()
+            indexedPath.left.isMeasurementAliasExists() ? indexedPath.left.getFullPathWithAlias()
                 : indexedPath.left.toString();
         if (queryPlan instanceof AggregationPlan) {
           column = queryPlan.getAggregations().get(indexedPath.right) + "(" + column + ")";
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java b/server/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
index eee1974..1171b2a 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/strategy/optimizer/ConcatPathOptimizer.java
@@ -172,7 +172,7 @@ public class ConcatPathOptimizer implements ILogicalOptimizer {
       PartialPath selectPath = suffixPaths.get(i);
       for (PartialPath fromPath : fromPaths) {
         PartialPath fullPath = fromPath.concatPath(selectPath);
-        if (selectPath.getTsAlias() != null) {
+        if (selectPath.isTsAliasExists()) {
           fullPath.setTsAlias(selectPath.getTsAlias());
         }
         allPaths.add(fullPath);
@@ -284,7 +284,7 @@ public class ConcatPathOptimizer implements ILogicalOptimizer {
         Pair<List<PartialPath>, Integer> pair = removeWildcard(paths.get(i), limit, offset);
 
         List<PartialPath> actualPaths = pair.left;
-        if (paths.get(i).getTsAlias() != null) {
+        if (paths.get(i).isTsAliasExists()) {
           if (actualPaths.size() == 1) {
             actualPaths.get(0).setTsAlias(paths.get(i).getTsAlias());
           } else if (actualPaths.size() >= 2) {
diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java b/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
index 81e2a22..d467935 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/LastQueryExecutor.java
@@ -89,10 +89,10 @@ public class LastQueryExecutor {
       if (lastTimeValuePair != null && lastTimeValuePair.getValue() != null) {
         RowRecord resultRecord = new RowRecord(lastTimeValuePair.getTimestamp());
         Field pathField = new Field(TSDataType.TEXT);
-        if (selectedSeries.get(i).getTsAlias() != null) {
+        if (selectedSeries.get(i).isTsAliasExists()) {
           pathField.setBinaryV(new Binary(selectedSeries.get(i).getTsAlias()));
         } else {
-          if (selectedSeries.get(i).getMeasurementAlias() != null) {
+          if (selectedSeries.get(i).isMeasurementAliasExists()) {
             pathField.setBinaryV(new Binary(selectedSeries.get(i).getFullPathWithAlias()));
           } else {
             pathField.setBinaryV(new Binary(selectedSeries.get(i).getFullPath()));
diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index f17a891..33a4761 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -889,9 +889,11 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
       case QUERY:
       case FILL:
         for (PartialPath path : paths) {
-          String column = path.getTsAlias();
-          if (column == null) {
-            column = path.getMeasurementAlias() != null ? path.getFullPathWithAlias()
+          String column;
+          if (path.isTsAliasExists()) {
+            column = path.getTsAlias();
+          } else {
+            column = path.isMeasurementAliasExists() ? path.getFullPathWithAlias()
                 : path.getFullPath();
           }
           respColumns.add(column);
@@ -909,9 +911,11 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
         }
         for (int i = 0; i < paths.size(); i++) {
           PartialPath path = paths.get(i);
-          String column = path.getTsAlias();
-          if (column == null) {
-            column = path.getMeasurementAlias() != null
+          String column;
+          if (path.isTsAliasExists()) {
+            column = path.getTsAlias();
+          } else {
+            column = path.isMeasurementAliasExists()
                 ? aggregations.get(i) + "(" + paths.get(i).getFullPathWithAlias() + ")"
                 : aggregations.get(i) + "(" + paths.get(i).getFullPath() + ")";
           }
@@ -1747,7 +1751,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     } catch (QueryProcessException e) {
       logger.error("meet error while processing non-query. ", e);
       Throwable cause = e;
-      while (cause.getCause() != null){
+      while (cause.getCause() != null) {
         cause = cause.getCause();
       }
       return RpcUtils.getStatus(e.getErrorCode(), cause.getMessage());
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
index 877be29..090fce7 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
@@ -20,7 +20,6 @@ package org.apache.iotdb.db.metadata;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -188,9 +187,9 @@ public class MTreeTest {
           .getAllTimeseriesPathWithAlias(new PartialPath("root.a.*.s0"), 0, 0).left;
       assertEquals(2, result2.size());
       assertEquals("root.a.d0.s0", result2.get(0).getFullPath());
-      assertNull(result2.get(0).getMeasurementAlias());
+      assertFalse(result2.get(0).isMeasurementAliasExists());
       assertEquals("root.a.d1.s0", result2.get(1).getFullPath());
-      assertNull(result2.get(1).getMeasurementAlias());
+      assertFalse(result2.get(1).isMeasurementAliasExists());
 
       result2 = root.getAllTimeseriesPathWithAlias(new PartialPath("root.a.*.temperature"), 0, 0).left;
       assertEquals(2, result2.size());