You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by zy...@apache.org on 2023/04/24 00:59:22 UTC

[iotdb] branch master updated: Fix NPE when using template and executing select into (#9679)

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

zyk 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 3412975a4a Fix NPE when using template and executing select into (#9679)
3412975a4a is described below

commit 3412975a4af46fbb0b3dd7f3d76a4b7428278d8f
Author: Marcos_Zyk <38...@users.noreply.github.com>
AuthorDate: Mon Apr 24 08:59:14 2023 +0800

    Fix NPE when using template and executing select into (#9679)
---
 .../iotdb/db/it/schema/IoTDBExtendTemplateIT.java  | 45 ++++++++++++++++++++++
 .../cache/DataNodeTemplateSchemaCache.java         | 17 ++++----
 2 files changed, 55 insertions(+), 7 deletions(-)

diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBExtendTemplateIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBExtendTemplateIT.java
index faefd2995f..011a7082de 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBExtendTemplateIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBExtendTemplateIT.java
@@ -174,4 +174,49 @@ public class IoTDBExtendTemplateIT extends AbstractSchemaIT {
       }
     }
   }
+
+  @Test
+  public void testSelectInto() throws SQLException {
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      // create database
+      statement.execute("CREATE DATABASE root.db");
+
+      // create schema template
+      statement.execute(
+          "CREATE SCHEMA TEMPLATE t1 (s1 INT64 ENCODING=PLAIN, s2 DOUBLE ENCODING=RLE)");
+
+      statement.execute("SET SCHEMA TEMPLATE t1 to root.db");
+
+      statement.execute("INSERT INTO root.db.d1(time, s1, s2) values(1, 1, 1)");
+
+      statement.execute("SELECT s1, s2 into root.::(t1, t2) from root.db.d1");
+
+      String[] sqls =
+          new String[] {
+            "show timeseries",
+          };
+      Set<String>[] standards =
+          new Set[] {
+            new HashSet<>(
+                Arrays.asList("root.db.d1.s1", "root.db.d1.s2", "root.db.d1.t1", "root.db.d1.t2"))
+          };
+      for (int n = 0; n < sqls.length; n++) {
+        String sql = sqls[n];
+        Set<String> standard = standards[n];
+        try (ResultSet resultSet = statement.executeQuery(sql)) {
+          ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+          while (resultSet.next()) {
+            String string = resultSet.getString(1);
+            Assert.assertTrue(standard.contains(string));
+            standard.remove(string);
+          }
+          assertEquals(0, standard.size());
+        } catch (SQLException e) {
+          e.printStackTrace();
+          fail(e.getMessage());
+        }
+      }
+    }
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/cache/DataNodeTemplateSchemaCache.java b/server/src/main/java/org/apache/iotdb/db/metadata/cache/DataNodeTemplateSchemaCache.java
index 39837a504c..52730b7dfa 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/cache/DataNodeTemplateSchemaCache.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/cache/DataNodeTemplateSchemaCache.java
@@ -96,13 +96,16 @@ public class DataNodeTemplateSchemaCache {
     ClusterSchemaTree schemaTree = new ClusterSchemaTree();
     if (deviceCacheEntry != null) {
       Template template = templateManager.getTemplate(deviceCacheEntry.getTemplateId());
-      schemaTree.appendSingleMeasurement(
-          fullPath,
-          (MeasurementSchema) template.getSchema(fullPath.getMeasurement()),
-          null,
-          null,
-          template.isDirectAligned());
-      schemaTree.setDatabases(Collections.singleton(deviceCacheEntry.getDatabase()));
+      IMeasurementSchema measurementSchema = template.getSchema(fullPath.getMeasurement());
+      if (measurementSchema != null) {
+        schemaTree.appendSingleMeasurement(
+            fullPath,
+            (MeasurementSchema) measurementSchema,
+            null,
+            null,
+            template.isDirectAligned());
+        schemaTree.setDatabases(Collections.singleton(deviceCacheEntry.getDatabase()));
+      }
     }
     return schemaTree;
   }