This is an automated email from the ASF dual-hosted git repository.
jiangtian pushed a commit to branch force_ci/support_schema_evolution
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to
refs/heads/force_ci/support_schema_evolution by this push:
new 0cd5e6cad1a Fix deviceId reuse when querying data region
0cd5e6cad1a is described below
commit 0cd5e6cad1a78fb994842e1feef196937439b19b
Author: Tian Jiang <[email protected]>
AuthorDate: Wed Jan 21 11:14:06 2026 +0800
Fix deviceId reuse when querying data region
---
.../iotdb/relational/it/schema/IoTDBTableIT.java | 114 +++++++++++++--------
.../db/storageengine/dataregion/DataRegion.java | 23 +++--
2 files changed, 88 insertions(+), 49 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBTableIT.java
b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBTableIT.java
index eea64c75022..67e31341543 100644
---
a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBTableIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBTableIT.java
@@ -39,6 +39,7 @@ import org.apache.tsfile.write.schema.MeasurementSchema;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
@@ -694,7 +695,7 @@ public class IoTDBTableIT {
try (final ITableSession session =
EnvFactory.getEnv().getTableSessionConnection();
final Connection adminCon =
EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
final Statement adminStmt = adminCon.createStatement()) {
- adminStmt.execute("create database db1");
+ adminStmt.execute("create database if not exists db1");
session.executeNonQueryStatement("USE \"db1\"");
final StringBuilder sb = new StringBuilder("CREATE TABLE table8 (tag1
string tag");
@@ -1101,7 +1102,7 @@ public class IoTDBTableIT {
}
@Test
- public void testAlterTableName() throws Exception {
+ public void testAllowAlterTableName() throws Exception {
try (final Connection connection =
EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
final Statement statement = connection.createStatement()) {
@@ -1138,6 +1139,17 @@ public class IoTDBTableIT {
"701: Table 'testdb.alter_table_name_disabled' is created in a old
version and cannot be renamed, please migrate its data to a new table manually",
e.getMessage());
}
+ }
+ }
+
+ @Test
+ public void testAlterTableName() throws Exception {
+ try (final Connection connection =
+ EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
+ final Statement statement = connection.createStatement()) {
+ statement.execute("DROP DATABASE IF EXISTS testdb");
+ statement.execute("CREATE DATABASE IF NOT EXISTS testdb");
+ statement.execute("USE testdb");
// alter once
statement.execute("CREATE TABLE IF NOT EXISTS alter_table_name (s1
int32)");
@@ -1152,9 +1164,15 @@ public class IoTDBTableIT {
statement.execute("INSERT INTO alter_table_named (time, s1) VALUES (2,
2)");
ResultSet resultSet = statement.executeQuery("SELECT * FROM
alter_table_named");
- assertTrue(resultSet.next());
- assertEquals(1, resultSet.getLong(1));
- assertEquals(1, resultSet.getLong(2));
+ for (int i = 1; i <= 2; i++) {
+ assertTrue(resultSet.next());
+ assertEquals(i, resultSet.getLong(1));
+ assertEquals(i, resultSet.getLong(2));
+ }
+ assertFalse(resultSet.next());
+ resultSet =
+ statement.executeQuery(
+ "SELECT time, s1 FROM alter_table_named order by time desc limit
1");
assertTrue(resultSet.next());
assertEquals(2, resultSet.getLong(1));
assertEquals(2, resultSet.getLong(2));
@@ -1177,6 +1195,13 @@ public class IoTDBTableIT {
assertEquals(i, resultSet.getLong(2));
}
assertFalse(resultSet.next());
+ resultSet =
+ statement.executeQuery(
+ "SELECT time, s1 FROM alter_table_named2 order by time desc
limit 1");
+ assertTrue(resultSet.next());
+ assertEquals(3, resultSet.getLong(1));
+ assertEquals(3, resultSet.getLong(2));
+ assertFalse(resultSet.next());
// alter back
statement.execute("ALTER TABLE alter_table_named2 RENAME TO
alter_table_name");
@@ -1195,6 +1220,13 @@ public class IoTDBTableIT {
assertEquals(i, resultSet.getLong(2));
}
assertFalse(resultSet.next());
+ resultSet =
+ statement.executeQuery(
+ "SELECT time, s1 FROM alter_table_name order by time desc limit
1");
+ assertTrue(resultSet.next());
+ assertEquals(4, resultSet.getLong(1));
+ assertEquals(4, resultSet.getLong(2));
+ assertFalse(resultSet.next());
}
}
@@ -1497,9 +1529,7 @@ public class IoTDBTableIT {
statement.execute("ALTER TABLE ttime RENAME COLUMN time TO newtime");
fail();
} catch (final SQLException e) {
- // renaming time column should be forbidden (code 701 or similar)
- assertTrue(
- (e.getMessage().startsWith("701") &&
e.getMessage().toLowerCase().contains("time")));
+ assertEquals("615: The renaming for time column is not supported.",
e.getMessage());
}
}
}
@@ -1740,6 +1770,7 @@ public class IoTDBTableIT {
}
}
+ @Ignore("Performance test, not for regular CI")
@Test
public void testPerformanceWithQuotedSpecialNameRenames() throws Exception {
try (final Connection connection =
@@ -1765,7 +1796,8 @@ public class IoTDBTableIT {
}
createTableTemplate =
new StringBuilder(
- createTableTemplate.substring(0, createTableTemplate.length() -
1) + ")");
+ createTableTemplate.substring(0, createTableTemplate.length() -
1)
+ + ") WITH (allow_alter_name=false)");
List<ColumnSchema> columns = new ArrayList<>();
for (int i = 0; i < colPerTable; i++) {
columns.add(new ColumnSchema("v" + i, TSDataType.INT32,
ColumnCategory.FIELD));
@@ -1823,38 +1855,38 @@ public class IoTDBTableIT {
final double baseline = totalMs / (runs * 0.9);
System.out.println("baseline_total_ms=" + String.format("%.3f",
baseline));
- // rename half of them to quoted special names and measure again
- for (int i = 0; i < tables / 2; i++) {
- final String oldName = names[i];
- final String newName = "\"" + oldName + "-特\""; // quoted name
- stmt.execute(String.format("ALTER TABLE %s RENAME TO %s", oldName,
newName));
- names[i] = newName;
- }
-
- totalMs = 0.0;
- for (int run = 0; run < runs; run++) {
- final long start = System.nanoTime();
- for (int i = 0; i < tables; i++) {
- try (final ResultSet rs = stmt.executeQuery("SELECT count(*) FROM "
+ names[i])) {
- assertTrue(rs.next());
- assertEquals(rows * numFile, rs.getLong(1));
- }
- }
- final long end = System.nanoTime();
- if (run > runs * 0.1) {
- totalMs += (end - start) / 1_000_000.0;
- }
- }
- final double after = totalMs / (runs * 0.9);
- System.out.println("after_quoted_total_ms=" + String.format("%.3f",
after));
-
- // basic sanity: ensure queries still return counts
- for (int i = 0; i < tables; i++) {
- try (final ResultSet rs = stmt.executeQuery("SELECT count(*) FROM " +
names[i])) {
- assertTrue(rs.next());
- assertEquals(rows * numFile, rs.getLong(1));
- }
- }
+ // // rename half of them to quoted special names and measure again
+ // for (int i = 0; i < tables / 2; i++) {
+ // final String oldName = names[i];
+ // final String newName = "\"" + oldName + "-特\""; // quoted name
+ // stmt.execute(String.format("ALTER TABLE %s RENAME TO %s",
oldName, newName));
+ // names[i] = newName;
+ // }
+ //
+ // totalMs = 0.0;
+ // for (int run = 0; run < runs; run++) {
+ // final long start = System.nanoTime();
+ // for (int i = 0; i < tables; i++) {
+ // try (final ResultSet rs = stmt.executeQuery("SELECT count(*)
FROM " + names[i])) {
+ // assertTrue(rs.next());
+ // assertEquals(rows * numFile, rs.getLong(1));
+ // }
+ // }
+ // final long end = System.nanoTime();
+ // if (run > runs * 0.1) {
+ // totalMs += (end - start) / 1_000_000.0;
+ // }
+ // }
+ // final double after = totalMs / (runs * 0.9);
+ // System.out.println("after_quoted_total_ms=" +
String.format("%.3f", after));
+ //
+ // // basic sanity: ensure queries still return counts
+ // for (int i = 0; i < tables; i++) {
+ // try (final ResultSet rs = stmt.executeQuery("SELECT count(*)
FROM " + names[i])) {
+ // assertTrue(rs.next());
+ // assertEquals(rows * numFile, rs.getLong(1));
+ // }
+ // }
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
index cfe711d7a21..6c1bf33aabf 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
@@ -2971,15 +2971,22 @@ public class DataRegion implements IDataRegionForQuery {
tsFileSetsIndex++;
}
}
- // if TsFileSets change, update EvolvedSchema
- if (tsFileSetsChanged && tsFileSetsIndex < tsFileSets.size()) {
- currentEvolvedSchema =
- TsFileSet.getMergedEvolvedSchema(
- tsFileSets.subList(tsFileSetsIndex, tsFileSets.size()));
- // use EvolvedSchema to rewrite deviceId to original deviceId
- if (currentEvolvedSchema != null) {
- originalDeviceId =
currentEvolvedSchema.rewriteToOriginal(singleDeviceId);
+ // if TsFileSets change
+ if (tsFileSetsChanged) {
+ // and there are remaining TsFileSets, update EvolvedSchema
+ if (tsFileSetsIndex < tsFileSets.size()) {
+ currentEvolvedSchema =
+ TsFileSet.getMergedEvolvedSchema(
+ tsFileSets.subList(tsFileSetsIndex, tsFileSets.size()));
+ // use EvolvedSchema to rewrite deviceId to original deviceId
+ if (currentEvolvedSchema != null) {
+ originalDeviceId =
currentEvolvedSchema.rewriteToOriginal(singleDeviceId);
+ } else {
+ // no schema evolution, use the singleDeviceId as originalDeviceId
+ originalDeviceId = singleDeviceId;
+ }
} else {
+ // no remaining TsFileSets, no schema evolution
originalDeviceId = singleDeviceId;
}
}