Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
93a9602
Improve JDBC driver metadata
Caideyipi Jun 8, 2026
7e01b4e
Fix JDBC URL parsing defaults
Caideyipi Jun 8, 2026
d49e183
Handle null JDBC data source properties
Caideyipi Jun 8, 2026
dfcd589
Improve JDBC URL parameter parsing
Caideyipi Jun 8, 2026
11be88c
Validate JDBC URL query parameters
Caideyipi Jun 8, 2026
10fe581
Clean up legacy TsFile JDBC wording
Caideyipi Jun 8, 2026
14c92f3
Improve JDBC DataSource standard behavior
Caideyipi Jun 8, 2026
e180e1f
Improve JDBC standard interface behavior
Caideyipi Jun 8, 2026
66e88f2
Fix JDBC URL and DataSource edge cases
Caideyipi Jun 9, 2026
bc18c42
Fix JDBC edge case handling
Caideyipi Jun 9, 2026
12d609f
Improve JDBC result set edge cases
Caideyipi Jun 9, 2026
b679589
Fix JDBC parameter and result set edge cases
Caideyipi Jun 9, 2026
c23ff58
Fix JDBC statement and metadata edge cases
Caideyipi Jun 9, 2026
02884ff
Reject JDBC operations after close
Caideyipi Jun 9, 2026
764db05
Reject closed JDBC wrapper and result set operations
Caideyipi Jun 9, 2026
30ca82e
Reject closed JDBC connection operations
Caideyipi Jun 9, 2026
871a995
Reject more closed JDBC connection entry points
Caideyipi Jun 9, 2026
2eb2652
Reject closed JDBC unsupported operations
Caideyipi Jun 9, 2026
b1522a9
Reject additional closed JDBC entry points
Caideyipi Jun 9, 2026
ebe1117
Fix JDBC metadata result set close handling
Caideyipi Jun 9, 2026
164931f
Fix JDBC resource lifecycle cleanup
Caideyipi Jun 10, 2026
49f8b0b
JDBC IT Fix
Caideyipi Jun 12, 2026
b7abc79
Fix closed ResultSet in load tsfile IT
Caideyipi Jun 15, 2026
1e0fd5e
Merge branch 'master' of https://github.com/apache/iotdb into codex/j…
Caideyipi Jun 22, 2026
28ac6f0
Fix filter IT result set lifecycle
Caideyipi Jun 22, 2026
677db0c
Merge branch 'master' of https://github.com/apache/iotdb into codex/j…
Caideyipi Jul 3, 2026
69759c9
Merge branch 'master' of https://github.com/apache/iotdb into codex/j…
Caideyipi Jul 6, 2026
2fee9a8
Merge branch 'master' of https://github.com/apache/iotdb into codex/j…
Caideyipi Jul 20, 2026
d4389c6
Merge origin/master into codex/jdbc-driver-info
Caideyipi Oct 26, 2026
8cf00e1
Fix JDBC driver metadata and query cleanup
Caideyipi Oct 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -215,21 +215,23 @@ public void testMismatchedDataTypes() {
@Test
public void testFilterWithUDTF() {
try (Connection connection = EnvFactory.getEnv().getConnection();
Statement statement = connection.createStatement();
ResultSet containsResultSet =
statement.executeQuery(
"select s1 from root.vehicle.testUDTF where STRING_CONTAINS(s1, 's'='s')");
ResultSet sinResultSet =
statement.executeQuery("select s1 from root.vehicle.testUDTF where sin(s2) = 0")) {
Statement statement = connection.createStatement()) {
int containsCnt = 0;
while (containsResultSet.next()) {
++containsCnt;
try (ResultSet containsResultSet =
statement.executeQuery(
"select s1 from root.vehicle.testUDTF where STRING_CONTAINS(s1, 's'='s')")) {
while (containsResultSet.next()) {
++containsCnt;
}
}
assertEquals(1, containsCnt);

int sinCnt = 0;
while (sinResultSet.next()) {
++sinCnt;
try (ResultSet sinResultSet =
statement.executeQuery("select s1 from root.vehicle.testUDTF where sin(s2) = 0")) {
while (sinResultSet.next()) {
++sinCnt;
}
}
assertEquals(1, sinCnt);
assertTestFail(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1326,31 +1326,26 @@ public void testUseSameStatement() throws SQLException {
statement.execute("insert into root.sg1.d1(timestamp,s0,s1) values(1000,1000,1000)");
statement.execute("insert into root.sg1.d0(timestamp,s0,s1) values(10,10,10)");

List<ResultSet> resultSetList = new ArrayList<>();

ResultSet r1 = statement.executeQuery("select * from root.sg1.d0 where time <= 1");
resultSetList.add(r1);

ResultSet r2 = statement.executeQuery("select * from root.sg1.d1 where s0 == 1000");
resultSetList.add(r2);

ResultSet r3 = statement.executeQuery("select * from root.sg1.d0 where s1 == 10");
resultSetList.add(r3);

r1.next();
Assert.assertEquals(r1.getLong(1), 1L);
Assert.assertEquals(r1.getLong(2), 1L);
Assert.assertEquals(r1.getLong(3), 1L);
try (ResultSet r1 = statement.executeQuery("select * from root.sg1.d0 where time <= 1")) {
Assert.assertTrue(r1.next());
Assert.assertEquals(r1.getLong(1), 1L);
Assert.assertEquals(r1.getLong(2), 1L);
Assert.assertEquals(r1.getLong(3), 1L);
}

r2.next();
Assert.assertEquals(r2.getLong(1), 1000L);
Assert.assertEquals(r2.getLong(2), 1000L);
Assert.assertEquals(r2.getLong(3), 1000L);
try (ResultSet r2 = statement.executeQuery("select * from root.sg1.d1 where s0 == 1000")) {
Assert.assertTrue(r2.next());
Assert.assertEquals(r2.getLong(1), 1000L);
Assert.assertEquals(r2.getLong(2), 1000L);
Assert.assertEquals(r2.getLong(3), 1000L);
}

r3.next();
Assert.assertEquals(r3.getLong(1), 10L);
Assert.assertEquals(r3.getLong(2), 10L);
Assert.assertEquals(r3.getLong(3), 10L);
try (ResultSet r3 = statement.executeQuery("select * from root.sg1.d0 where s1 == 10")) {
Assert.assertTrue(r3.next());
Assert.assertEquals(r3.getLong(1), 10L);
Assert.assertEquals(r3.getLong(2), 10L);
Assert.assertEquals(r3.getLong(3), 10L);
}
} finally {
executeQuietly(statement, "DELETE DATABASE root.sg1");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -410,10 +410,10 @@ private void testWithTimeColumn(
final Statement statement = connection.createStatement()) {
statement.execute(String.format("create database if not exists %s", SchemaConfig.DATABASE_0));
statement.execute(String.format("use %s", SchemaConfig.DATABASE_0));
ResultSet resultSetOld = null;
List<List<String>> oldTableDescription = null;
if (Objects.nonNull(schemaList1)) {
statement.execute(convert2TableSQL(SchemaConfig.TABLE_0, schemaList1, columnCategories));
resultSetOld = statement.executeQuery("desc " + SchemaConfig.TABLE_0);
oldTableDescription = getTableDescription(statement, SchemaConfig.TABLE_0);
}
statement.execute(
String.format(
Expand All @@ -433,23 +433,29 @@ private void testWithTimeColumn(
}

// Time column's difference shall not affect the old column
if (Objects.nonNull(resultSetOld)) {
try (final ResultSet resultSet = statement.executeQuery("desc " + SchemaConfig.TABLE_0)) {
while (resultSet.next() && resultSetOld.next()) {
Assert.assertEquals(resultSet.getString(1), resultSetOld.getString(1));
Assert.assertEquals(resultSet.getString(2), resultSetOld.getString(2));
Assert.assertEquals(resultSet.getString(3), resultSetOld.getString(3));
}
if (resultSet.next() || resultSetOld.next()) {
Assert.fail("The table schema has changed after load.");
}
}
if (Objects.nonNull(oldTableDescription)) {
final List<List<String>> newTableDescription =
getTableDescription(statement, SchemaConfig.TABLE_0);
Assert.assertEquals(
"The table schema has changed after load.", oldTableDescription, newTableDescription);
}

statement.execute(String.format("drop database %s", SchemaConfig.DATABASE_0));
}
}

private List<List<String>> getTableDescription(final Statement statement, final String tableName)
throws Exception {
final List<List<String>> tableDescription = new ArrayList<>();
try (final ResultSet resultSet = statement.executeQuery("desc " + tableName)) {
while (resultSet.next()) {
tableDescription.add(
Arrays.asList(resultSet.getString(1), resultSet.getString(2), resultSet.getString(3)));
}
}
return tableDescription;
}

private List<ColumnCategory> generateTabletColumnCategory(final int fieldNum) {
return generateTabletColumnCategory(0, fieldNum, -1);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -212,20 +212,22 @@ public void testMismatchedDataTypes() {
@Test
public void testFilterWithUDTF() {
try (Connection connection = EnvFactory.getEnv().getConnection();
Statement statement = connection.createStatement();
ResultSet containsResultSet =
statement.executeQuery("select s1 from testUDTF where STRING_CONTAINS(s1, 's'='s')");
ResultSet sinResultSet =
statement.executeQuery("select s1 from testUDTF where sin(s2) = 0")) {
Statement statement = connection.createStatement()) {
int containsCnt = 0;
while (containsResultSet.next()) {
++containsCnt;
try (ResultSet containsResultSet =
statement.executeQuery("select s1 from testUDTF where STRING_CONTAINS(s1, 's'='s')")) {
while (containsResultSet.next()) {
++containsCnt;
}
}
assertEquals(1, containsCnt);

int sinCnt = 0;
while (sinResultSet.next()) {
++sinCnt;
try (ResultSet sinResultSet =
statement.executeQuery("select s1 from testUDTF where sin(s2) = 0")) {
while (sinResultSet.next()) {
++sinCnt;
}
}
assertEquals(1, sinCnt);
assertTestFail(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -601,31 +601,29 @@ public void testUseSameStatement() throws SQLException {
statement.execute("insert into table1(time,device,s0,s1) values(1000,'d1',1000,1000)");
statement.execute("insert into table1(time,device,s0,s1) values(10,'d0',10,10)");

List<ResultSet> resultSetList = new ArrayList<>();

ResultSet r1 = statement.executeQuery("select * from table1 where device='d0' and time <= 1");
resultSetList.add(r1);

ResultSet r2 = statement.executeQuery("select * from table1 where device='d1' and s0 = 1000");
resultSetList.add(r2);

ResultSet r3 = statement.executeQuery("select * from table1 where device='d0' and s1 = 10");
resultSetList.add(r3);

r1.next();
Assert.assertEquals(r1.getLong(1), 1L);
Assert.assertEquals(r1.getLong(3), 1L);
Assert.assertEquals(r1.getLong(4), 1L);
try (ResultSet r1 =
statement.executeQuery("select * from table1 where device='d0' and time <= 1")) {
Assert.assertTrue(r1.next());
Assert.assertEquals(r1.getLong(1), 1L);
Assert.assertEquals(r1.getLong(3), 1L);
Assert.assertEquals(r1.getLong(4), 1L);
}

r2.next();
Assert.assertEquals(r2.getLong(1), 1000L);
Assert.assertEquals(r2.getLong(3), 1000L);
Assert.assertEquals(r2.getLong(4), 1000L);
try (ResultSet r2 =
statement.executeQuery("select * from table1 where device='d1' and s0 = 1000")) {
Assert.assertTrue(r2.next());
Assert.assertEquals(r2.getLong(1), 1000L);
Assert.assertEquals(r2.getLong(3), 1000L);
Assert.assertEquals(r2.getLong(4), 1000L);
}

r3.next();
Assert.assertEquals(r3.getLong(1), 10L);
Assert.assertEquals(r3.getLong(3), 10L);
Assert.assertEquals(r3.getLong(4), 10L);
try (ResultSet r3 =
statement.executeQuery("select * from table1 where device='d0' and s1 = 10")) {
Assert.assertTrue(r3.next());
Assert.assertEquals(r3.getLong(1), 10L);
Assert.assertEquals(r3.getLong(3), 10L);
Assert.assertEquals(r3.getLong(4), 10L);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,8 @@
import java.sql.Statement;
import java.sql.Types;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import static org.apache.iotdb.db.it.utils.TestUtils.defaultFormatDataTime;
import static org.apache.iotdb.db.it.utils.TestUtils.tableResultSetEqualTest;
Expand Down Expand Up @@ -453,31 +451,29 @@ public void testUseSameStatement() throws SQLException {
statement.execute(
"CREATE VIEW table1(device STRING TAG, s0 INT64 FIELD, s1 INT64 FIELD) as root.sg1.**");

List<ResultSet> resultSetList = new ArrayList<>();

ResultSet r1 = statement.executeQuery("select * from table1 where device='d0' and time <= 1");
resultSetList.add(r1);

ResultSet r2 = statement.executeQuery("select * from table1 where device='d1' and s0 = 1000");
resultSetList.add(r2);

ResultSet r3 = statement.executeQuery("select * from table1 where device='d0' and s1 = 10");
resultSetList.add(r3);

r1.next();
Assert.assertEquals(r1.getLong(1), 1L);
Assert.assertEquals(r1.getLong(3), 1L);
Assert.assertEquals(r1.getLong(4), 1L);
try (ResultSet r1 =
statement.executeQuery("select * from table1 where device='d0' and time <= 1")) {
Assert.assertTrue(r1.next());
Assert.assertEquals(r1.getLong(1), 1L);
Assert.assertEquals(r1.getLong(3), 1L);
Assert.assertEquals(r1.getLong(4), 1L);
}

r2.next();
Assert.assertEquals(r2.getLong(1), 1000L);
Assert.assertEquals(r2.getLong(3), 1000L);
Assert.assertEquals(r2.getLong(4), 1000L);
try (ResultSet r2 =
statement.executeQuery("select * from table1 where device='d1' and s0 = 1000")) {
Assert.assertTrue(r2.next());
Assert.assertEquals(r2.getLong(1), 1000L);
Assert.assertEquals(r2.getLong(3), 1000L);
Assert.assertEquals(r2.getLong(4), 1000L);
}

r3.next();
Assert.assertEquals(r3.getLong(1), 10L);
Assert.assertEquals(r3.getLong(3), 10L);
Assert.assertEquals(r3.getLong(4), 10L);
try (ResultSet r3 =
statement.executeQuery("select * from table1 where device='d0' and s1 = 10")) {
Assert.assertTrue(r3.next());
Assert.assertEquals(r3.getLong(1), 10L);
Assert.assertEquals(r3.getLong(3), 10L);
Assert.assertEquals(r3.getLong(4), 10L);
}
}
}

Expand Down
9 changes: 9 additions & 0 deletions iotdb-client/jdbc/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,15 @@
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/resources-filtered</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public final class JdbcMessages {

// IoTDBDriver
public static final String REGISTER_DRIVER_ERROR =
"Error occurs when registering TsFile driver";
"Error occurs when registering IoTDB driver";
public static final String METHOD_NOT_SUPPORTED = "Method not supported";

// StringUtils
Expand Down Expand Up @@ -180,6 +180,65 @@ public final class JdbcMessages {
public static final String SINGLE_QUOTE = "'";
public static final String RIGHT_PARENTHESIS = ")";

public static final String EXCEPTION_SCHEMA_CANNOT_BE_NULL_E93264A3 =
"schema cannot be null";
public static final String EXCEPTION_TIMEOUT_MUST_BE_0_80BF04B8 =
"timeout must be >= 0";
public static final String EXCEPTION_SQL_STATEMENT_CANNOT_BE_NULL_163667FF =
"SQL statement cannot be null";
public static final String EXCEPTION_INVALID_TIME_ZONE_ARG_625F2BE2 =
"Invalid time_zone: %s";
public static final String EXCEPTION_PORT_MUST_BE_BETWEEN_0_AND_65535_F641E74D =
"port must be between 0 and 65535";
public static final String EXCEPTION_LOGINTIMEOUT_MUST_BE_0_A213D684 =
"loginTimeout must be >= 0";
public static final String EXCEPTION_CONNECTION_ERROR_PLEASE_CHECK_WHETHER_THE_NETWORK_IS_AVAILABLE_OR_THE_SERVER_HAS_STARTED_64F1DA01 =
"Connection Error, please check whether the network is available or the server has started.";
public static final String EXCEPTION_RESULTSET_HAS_BEEN_CLOSED_45F3BF52 =
"ResultSet has been closed";
public static final String EXCEPTION_PARAMETER_INDEX_OUT_OF_RANGE_ARG_EXPECTED_1_ARG_65BF83C6 =
"Parameter index out of range: %d (expected 1-%d)";
public static final String EXCEPTION_LENGTH_MUST_BE_0_53AF26C8 =
"length must be >= 0";
public static final String EXCEPTION_CANNOT_ARG_AFTER_STATEMENT_HAS_BEEN_CLOSED_A35AD40C =
"Cannot %s after statement has been closed!";
public static final String EXCEPTION_INVALID_VALUE_FOR_JDBC_CONNECTION_PROPERTY_ARG_ARG_2193D0EE =
"Invalid value for JDBC connection property %s: %s";
public static final String MESSAGE_SET_PARAMETER_CFE301D0 =
"set parameter";
public static final String MESSAGE_USER_NAME_FOR_AUTHENTICATION_77DCB7F1 =
"User name for authentication.";
public static final String MESSAGE_PASSWORD_FOR_AUTHENTICATION_4D6EDD1E =
"Password for authentication.";
public static final String MESSAGE_THRIFT_DEFAULT_BUFFER_CAPACITY_IN_BYTES_58ED1E5F =
"Thrift default buffer capacity in bytes.";
public static final String MESSAGE_THRIFT_MAX_FRAME_SIZE_IN_BYTES_158D5D1C =
"Thrift max frame size in bytes.";
public static final String MESSAGE_CLIENT_COMPATIBILITY_VERSION_9EE5FB89 =
"Client compatibility version.";
public static final String MESSAGE_NETWORK_TIMEOUT_IN_MILLISECONDS_2443578F =
"Network timeout in milliseconds.";
public static final String MESSAGE_CONNECTION_TIME_ZONE_9B0E092D =
"Connection time zone.";
public static final String MESSAGE_CONNECTION_CHARSET_F72FB844 =
"Connection charset.";
public static final String MESSAGE_WHETHER_TO_ENABLE_SSL_F2608B05 =
"Whether to enable SSL.";
public static final String MESSAGE_WHETHER_TO_ENABLE_RPC_THRIFT_COMPRESSION_C65D1138 =
"Whether to enable RPC thrift compression.";
public static final String MESSAGE_SSL_TRUST_STORE_PATH_1D832EA9 =
"SSL trust store path.";
public static final String MESSAGE_SSL_TRUST_STORE_PASSWORD_CDFFB811 =
"SSL trust store password.";
public static final String MESSAGE_SSL_KEY_STORE_PATH_24E4E925 =
"SSL key store path.";
public static final String MESSAGE_SSL_KEY_STORE_PASSWORD_8D36E9E7 =
"SSL key store password.";
public static final String MESSAGE_SSL_PROTOCOL_7ED42B2B =
"SSL protocol.";
public static final String MESSAGE_SQL_DIALECT_FOR_THE_CONNECTION_35A5F380 =
"SQL dialect for the connection.";

private JdbcMessages() {}
// ---------------------------------------------------------------------------
// Additional auto-collected messages
Expand Down
Loading
Loading