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;
