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

jackietien 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 7ce4545597c Support ResultSetMetaData.getColumnTypeName for new data 
type
7ce4545597c is described below

commit 7ce4545597c5233693b9422e3b5e6d2d0b068211
Author: Jackie Tien <[email protected]>
AuthorDate: Wed Jul 3 13:50:25 2024 +0800

    Support ResultSetMetaData.getColumnTypeName for new data type
---
 .../apache/iotdb/db/it/IoTDBJDBCMetadataIT.java    | 135 +++++++++++++++++++++
 .../apache/iotdb/db/it/query/IoTDBResultSetIT.java |   2 +-
 .../org/apache/iotdb/jdbc/IoTDBResultMetadata.java |  44 ++++++-
 .../apache/iotdb/jdbc/IoTDBJDBCResultSetTest.java  |  19 +--
 .../java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java |   2 +-
 5 files changed, 187 insertions(+), 15 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/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBResultSetIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBResultSetIT.java
index 13ae7263eb8..1385d42872d 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBResultSetIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBResultSetIT.java
@@ -125,7 +125,7 @@ public class IoTDBResultSetIT {
         assertEquals(2, metaData.getColumnCount());
         assertEquals("Time", metaData.getColumnName(1));
         assertEquals(Types.TIMESTAMP, metaData.getColumnType(1));
-        assertEquals("TIME", metaData.getColumnTypeName(1));
+        assertEquals("TIMESTAMP", metaData.getColumnTypeName(1));
         assertEquals("root.sg.dev.status", metaData.getColumnName(2));
         assertEquals(Types.VARCHAR, metaData.getColumnType(2));
         assertEquals("TEXT", metaData.getColumnTypeName(2));
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..6f13179a9b3 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[]";
       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;
@@ -237,7 +263,7 @@ public class IoTDBResultMetadata implements 
ResultSetMetaData {
   public int getPrecision(int column) throws SQLException {
     checkColumnIndex(column);
     if (column == 1 && !ignoreTimestamp) {
-      return 13;
+      return 3;
     }
     String columnType = columnTypeList.get(column - 1);
     switch (columnType.toUpperCase()) {
@@ -252,7 +278,13 @@ public class IoTDBResultMetadata implements 
ResultSetMetaData {
       case DOUBLE:
         return 308;
       case TEXT:
+      case BLOB:
+      case STRING:
         return Integer.MAX_VALUE;
+      case TIMESTAMP:
+        return 3;
+      case DATE:
+        return 0;
       default:
         break;
     }
@@ -271,6 +303,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;
diff --git 
a/iotdb-client/jdbc/src/test/java/org/apache/iotdb/jdbc/IoTDBJDBCResultSetTest.java
 
b/iotdb-client/jdbc/src/test/java/org/apache/iotdb/jdbc/IoTDBJDBCResultSetTest.java
index e69c7673d66..9b5a5174841 100644
--- 
a/iotdb-client/jdbc/src/test/java/org/apache/iotdb/jdbc/IoTDBJDBCResultSetTest.java
+++ 
b/iotdb-client/jdbc/src/test/java/org/apache/iotdb/jdbc/IoTDBJDBCResultSetTest.java
@@ -44,6 +44,7 @@ import java.nio.ByteBuffer;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.Statement;
+import java.sql.Timestamp;
 import java.sql.Types;
 import java.time.ZoneId;
 import java.util.ArrayList;
@@ -251,31 +252,31 @@ public class IoTDBJDBCResultSetTest {
   private void constructObjectList(List<Object> standardObject) {
     Object[][] input = {
       {
-        2L, 2.22F, 40000L, null, 2.22F,
+        new Timestamp(2), 2.22F, 40000L, null, 2.22F,
       },
       {
-        3L, 3.33F, null, null, 3.33F,
+        new Timestamp(3), 3.33F, null, null, 3.33F,
       },
       {
-        4L, 4.44F, null, null, 4.44F,
+        new Timestamp(4), 4.44F, null, null, 4.44F,
       },
       {
-        50L, null, 50000L, null, null,
+        new Timestamp(50), null, 50000L, null, null,
       },
       {
-        100L, null, 199L, null, null,
+        new Timestamp(100), null, 199L, null, null,
       },
       {
-        101L, null, 199L, null, null,
+        new Timestamp(101), null, 199L, null, null,
       },
       {
-        103L, null, 199L, null, null,
+        new Timestamp(103), null, 199L, null, null,
       },
       {
-        105L, 11.11F, 199L, 33333, 11.11F,
+        new Timestamp(105), 11.11F, 199L, 33333, 11.11F,
       },
       {
-        1000L, 1000.11F, 55555L, 22222, 1000.11F,
+        new Timestamp(1000), 1000.11F, 55555L, 22222, 1000.11F,
       }
     };
     for (Object[] row : input) {
diff --git 
a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
 
b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
index 9eb33fc36b2..3e405c95d82 100644
--- 
a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
+++ 
b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
@@ -587,7 +587,7 @@ public class IoTDBRpcDataSet {
   public Object getObjectByName(String columnName) throws 
StatementExecutionException {
     checkRecord();
     if (columnName.equals(TIMESTAMP_STR)) {
-      return curTsBlock.getTimeByIndex(tsBlockIndex);
+      return new Timestamp(curTsBlock.getTimeByIndex(tsBlockIndex));
     }
     int index = columnOrdinalMap.get(columnName) - START_INDEX;
     if (index < 0 || index >= columnTypeDeduplicatedList.size() || 
isNull(index, tsBlockIndex)) {

Reply via email to