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)) {