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

jackietien pushed a commit to branch ty/NewDataTypeMetadata
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 9ebbef37df3ca71a600a637d24b3a604087326af
Author: JackieTien97 <[email protected]>
AuthorDate: Mon Jul 1 21:03:18 2024 +0800

    Support ResultSetMetaData.getColumnTypeName for new data type
---
 .../apache/iotdb/db/it/IoTDBJDBCMetadataIT.java    | 135 +++++++++++++++++++++
 .../org/apache/iotdb/jdbc/IoTDBResultMetadata.java |  38 +++++-
 2 files changed, 170 insertions(+), 3 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBJDBCMetadataIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBJDBCMetadataIT.java
new file mode 100644
index 00000000000..8e82865f8c2
--- /dev/null
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBJDBCMetadataIT.java
@@ -0,0 +1,135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.it;
+
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.framework.IoTDBTestRunner;
+import org.apache.iotdb.itbase.category.ClusterIT;
+import org.apache.iotdb.itbase.category.LocalStandaloneIT;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import static org.apache.iotdb.db.it.utils.TestUtils.prepareData;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+@RunWith(IoTDBTestRunner.class)
+@Category({LocalStandaloneIT.class, ClusterIT.class})
+public class IoTDBJDBCMetadataIT {
+
+  protected static final String[] SQLs =
+      new String[] {
+        "CREATE DATABASE root.sg_type;",
+        "CREATE TIMESERIES root.sg_type.d_0.s_boolean BOOLEAN;",
+        "CREATE TIMESERIES root.sg_type.d_0.s_int32 INT32;",
+        "CREATE TIMESERIES root.sg_type.d_0.s_int64 INT64;",
+        "CREATE TIMESERIES root.sg_type.d_0.s_float FLOAT;",
+        "CREATE TIMESERIES root.sg_type.d_0.s_double DOUBLE;",
+        "CREATE TIMESERIES root.sg_type.d_0.s_text TEXT;",
+        "CREATE TIMESERIES root.sg_type.d_0.s_timestamp TIMESTAMP;",
+        "CREATE TIMESERIES root.sg_type.d_0.s_date DATE;",
+        "CREATE TIMESERIES root.sg_type.d_0.s_blob BLOB;",
+        "CREATE TIMESERIES root.sg_type.d_0.s_string STRING;",
+        "INSERT INTO root.sg_type.d_0(time, s_int32, s_int64, s_float, 
s_double, s_text) VALUES (0, 0, 0, 0.000000, 0.000000, 'text0');"
+      };
+
+  @BeforeClass
+  public static void setUp() throws Exception {
+    // without lastCache
+    EnvFactory.getEnv().initClusterEnvironment();
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      prepareData(SQLs);
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @AfterClass
+  public static void tearDown() throws Exception {
+    EnvFactory.getEnv().cleanClusterEnvironment();
+  }
+
+  @Test
+  public void testMetadata() throws Exception {
+    String[] columnNames =
+        new String[] {
+          "Time",
+          "Device",
+          "s_boolean",
+          "s_int32",
+          "s_int64",
+          "s_float",
+          "s_double",
+          "s_text",
+          "s_timestamp",
+          "s_date",
+          "s_blob",
+          "s_string"
+        };
+    String[] columnTypes =
+        new String[] {
+          "TIMESTAMP",
+          "TEXT",
+          "BOOLEAN",
+          "INT32",
+          "INT64",
+          "FLOAT",
+          "DOUBLE",
+          "TEXT",
+          "TIMESTAMP",
+          "DATE",
+          "BLOB",
+          "STRING"
+        };
+    String[] values =
+        new String[] {
+          "0", "root.sg_type.d_0", null, "0", "0", "0.0", "0.0", "text0", 
null, null, null, null
+        };
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select s_boolean, s_int32, s_int64, s_float, s_double, s_text, 
s_timestamp, s_date, s_blob, s_string from root.sg_type.d_0 align by device")) {
+        ResultSetMetaData metaData = resultSet.getMetaData();
+        assertEquals(columnNames.length, metaData.getColumnCount());
+        assertTrue(resultSet.next());
+        for (int i = 1; i <= columnNames.length; i++) {
+          assertEquals(columnNames[i - 1], metaData.getColumnName(i));
+          assertEquals(columnTypes[i - 1], metaData.getColumnTypeName(i));
+          assertEquals(values[i - 1], resultSet.getString(i));
+        }
+      }
+    }
+  }
+}
diff --git 
a/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBResultMetadata.java
 
b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBResultMetadata.java
index af97d70d151..389904137d2 100644
--- 
a/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBResultMetadata.java
+++ 
b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBResultMetadata.java
@@ -19,8 +19,10 @@
 
 package org.apache.iotdb.jdbc;
 
+import java.sql.Date;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
+import java.sql.Timestamp;
 import java.sql.Types;
 import java.util.List;
 
@@ -41,6 +43,13 @@ public class IoTDBResultMetadata implements 
ResultSetMetaData {
 
   private static final String TEXT = "TEXT";
 
+  private static final String STRING = "STRING";
+
+  private static final String BLOB = "BLOB";
+
+  private static final String DATE = "DATE";
+  private static final String TIMESTAMP = "TIMESTAMP";
+
   /** Constructor of IoTDBResultMetadata. */
   public IoTDBResultMetadata(
       Boolean nonAlign,
@@ -135,7 +144,8 @@ public class IoTDBResultMetadata implements 
ResultSetMetaData {
   public String getColumnClassName(int column) throws SQLException {
     String columnTypeName = getColumnTypeName(column);
     switch (columnTypeName) {
-      case "TIMESTAMP":
+      case TIMESTAMP:
+        return Timestamp.class.getName();
       case INT64:
         return Long.class.getName();
       case BOOLEAN:
@@ -147,7 +157,12 @@ public class IoTDBResultMetadata implements 
ResultSetMetaData {
       case DOUBLE:
         return Double.class.getName();
       case TEXT:
+      case STRING:
         return String.class.getName();
+      case DATE:
+        return Date.class.getName();
+      case BLOB:
+        return byte[].class.getName();
       default:
         break;
     }
@@ -207,7 +222,14 @@ public class IoTDBResultMetadata implements 
ResultSetMetaData {
       case DOUBLE:
         return Types.DOUBLE;
       case TEXT:
+      case STRING:
         return Types.VARCHAR;
+      case DATE:
+        return Types.DATE;
+      case TIMESTAMP:
+        return Types.TIMESTAMP;
+      case BLOB:
+        return Types.BLOB;
       default:
         break;
     }
@@ -218,7 +240,7 @@ public class IoTDBResultMetadata implements 
ResultSetMetaData {
   public String getColumnTypeName(int column) throws SQLException {
     checkColumnIndex(column);
     if (column == 1 && !ignoreTimestamp) {
-      return "TIME";
+      return TIMESTAMP;
     }
     String columnType = columnTypeList.get(column - 1);
     String typeString = columnType.toUpperCase();
@@ -227,7 +249,11 @@ public class IoTDBResultMetadata implements 
ResultSetMetaData {
         || INT64.equals(typeString)
         || FLOAT.equals(typeString)
         || DOUBLE.equals(typeString)
-        || TEXT.equals(typeString)) {
+        || TEXT.equals(typeString)
+        || STRING.equals(typeString)
+        || BLOB.equals(typeString)
+        || DATE.equals(typeString)
+        || TIMESTAMP.equals(typeString)) {
       return typeString;
     }
     return null;
@@ -252,6 +278,8 @@ public class IoTDBResultMetadata implements 
ResultSetMetaData {
       case DOUBLE:
         return 308;
       case TEXT:
+      case BLOB:
+      case STRING:
         return Integer.MAX_VALUE;
       default:
         break;
@@ -271,6 +299,10 @@ public class IoTDBResultMetadata implements 
ResultSetMetaData {
       case INT32:
       case INT64:
       case TEXT:
+      case BLOB:
+      case STRING:
+      case TIMESTAMP:
+      case DATE:
         return 0;
       case FLOAT:
         return 6;

Reply via email to