From d6c564d392a94cb7b71e59d8843c9c5867275ca1 Mon Sep 17 00:00:00 2001
From: Caideyipi <87789683+Caideyipi@users.noreply.github.com>
Date: Fri, 17 Apr 2026 10:23:43 +0800
Subject: [PATCH 1/5] databases
---
.../queryengine/plan/relational/sql/parser/AstBuilder.java | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
index 8770f6416c52..9bd99771f53b 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
@@ -32,6 +32,7 @@
import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
import org.apache.iotdb.commons.udf.builtin.relational.TableBuiltinScalarFunction;
import org.apache.iotdb.commons.utils.CommonDateTimeUtils;
+import org.apache.iotdb.commons.utils.PathUtils;
import org.apache.iotdb.db.exception.query.QueryProcessException;
import org.apache.iotdb.db.exception.sql.SemanticException;
import org.apache.iotdb.db.protocol.session.IClientSession;
@@ -4136,7 +4137,11 @@ private static String unquote(String value) {
}
private QualifiedName getQualifiedName(RelationalSqlParser.QualifiedNameContext context) {
- return QualifiedName.of(visit(context.identifier(), Identifier.class));
+ final QualifiedName result = QualifiedName.of(visit(context.identifier(), Identifier.class));
+ if (!result.getPrefix().map(s -> PathUtils.isTableModelDatabase(s.toString())).orElse(true)) {
+ throw new SemanticException("The tree model database shall not be specified in table model.");
+ }
+ return result;
}
private static boolean isDistinct(RelationalSqlParser.SetQuantifierContext setQuantifier) {
From b2aa8cbd5bb083fcb46becfda676d064097298b8 Mon Sep 17 00:00:00 2001
From: Caideyipi <87789683+Caideyipi@users.noreply.github.com>
Date: Fri, 17 Apr 2026 10:24:20 +0800
Subject: [PATCH 2/5] cv3
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 4d837399bf7a..1763a519f9ef 100644
--- a/pom.xml
+++ b/pom.xml
@@ -61,7 +61,7 @@
4.2.0
- 1.81
+ 1.84
2.9.3
3.3.0
From 886841b2985d6650d9d40dcdef2bcaed155bba7a Mon Sep 17 00:00:00 2001
From: Caideyipi <87789683+Caideyipi@users.noreply.github.com>
Date: Fri, 17 Apr 2026 10:31:56 +0800
Subject: [PATCH 3/5] fix
---
.../relational/it/db/it/IoTDBInsertTableIT.java | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBInsertTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBInsertTableIT.java
index c223761cd2a2..a3138ee6ea22 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBInsertTableIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBInsertTableIT.java
@@ -1275,6 +1275,23 @@ public void testInsertWithChangedSchema() throws SQLException, IOException {
}
}
+ @Test
+ public void testInsertWithTree() {
+ try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
+ Statement statement = connection.createStatement()) {
+ statement.execute("use \"test\"");
+ statement.execute("create table sg22 (tag1 string tag, s1 int64 field)");
+ statement.execute(
+ String.format(
+ "insert into root.test.sg22(tag1,time,s1) values('d1',%s,2)",
+ System.currentTimeMillis()));
+ fail();
+ } catch (Exception e) {
+ Assert.assertEquals(
+ "701: The tree model database shall not be specified in table model.", e.getMessage());
+ }
+ }
+
private List checkHeader(
ResultSetMetaData resultSetMetaData, String expectedHeaderStrings, int[] expectedTypes)
throws SQLException {
From ef97bc62c0a8aaf151f37a83a99d9465c6ba2cb6 Mon Sep 17 00:00:00 2001
From: Caideyipi <87789683+Caideyipi@users.noreply.github.com>
Date: Fri, 17 Apr 2026 11:24:58 +0800
Subject: [PATCH 4/5] fix
---
.../it/rest/it/IoTDBRestServiceIT.java | 18 ++++++++++++++++++
.../db/protocol/session/IClientSession.java | 11 +++++++++++
2 files changed, 29 insertions(+)
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/rest/it/IoTDBRestServiceIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/rest/it/IoTDBRestServiceIT.java
index 8ffe434db738..05567b886fc7 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/rest/it/IoTDBRestServiceIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/rest/it/IoTDBRestServiceIT.java
@@ -143,6 +143,7 @@ public void test() {
testInsertMultiPartition();
testInsertTablet();
testInsertTabletNoDatabase();
+ testInsertTabletWithTreeDB();
testInsertTablet1();
testInsertTablet2();
testQuery();
@@ -296,6 +297,18 @@ public void testInsertTabletNoDatabase() {
assertEquals(305, Integer.parseInt(result.get("code").toString()));
}
+ public void testInsertTabletWithTreeDB() {
+ List sqls =
+ Collections.singletonList(
+ "create table sg211 (tag1 string tag,t1 STRING ATTRIBUTE, s1 FLOAT field)");
+ for (String sql : sqls) {
+ RestUtils.nonQuery(httpClient, port, sqlHandler("test", sql));
+ }
+ String json =
+ "{\"database\":\"root.test\",\"column_categories\":[\"TAG\",\"ATTRIBUTE\",\"FIELD\"],\"timestamps\":[1635232143960,1635232153960,1635232163960,1635232173960,1635232183960],\"column_names\":[\"tag1\",\"t1\",\"s1\"],\"data_types\":[\"STRING\",\"STRING\",\"FLOAT\"],\"values\":[[\"a11\",\"true\",11],[\"a11\",\"false\",22],[\"a13\",\"false1\",23],[\"a14\",\"false2\",24],[\"a15\",\"false3\",25]],\"table\":\"sg211\"}";
+ wrongInsertTablet(json);
+ }
+
public void testInsertTablet1() {
List sqls =
Collections.singletonList(
@@ -340,6 +353,11 @@ public void rightInsertTablet(String json) {
assertEquals(11f, jsonArray1.get(2).getAsFloat(), 0f);
}
+ public void wrongInsertTablet(String json) {
+ JsonObject result = RestUtils.insertTablet(httpClient, port, json);
+ assertEquals(701, Integer.parseInt(result.get("code").toString()));
+ }
+
public void prepareTableData() {
for (int i = 0; i < sqls.length; i++) {
JsonObject jsonObject = new JsonObject();
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/IClientSession.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/IClientSession.java
index 44db64023756..9054636904ed 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/IClientSession.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/IClientSession.java
@@ -21,7 +21,10 @@
import org.apache.iotdb.commons.conf.IoTDBConstant.ClientVersion;
import org.apache.iotdb.commons.utils.CommonDateTimeUtils;
+import org.apache.iotdb.commons.utils.PathUtils;
+import org.apache.iotdb.db.exception.sql.SemanticException;
import org.apache.iotdb.db.queryengine.common.ConnectionInfo;
+import org.apache.iotdb.rpc.subscription.annotation.TableModel;
import org.apache.iotdb.service.rpc.thrift.TSConnectionInfo;
import org.apache.iotdb.service.rpc.thrift.TSConnectionType;
@@ -33,6 +36,7 @@
import java.io.IOException;
import java.nio.ByteBuffer;
import java.time.ZoneId;
+import java.util.Objects;
import java.util.Set;
import java.util.TimeZone;
@@ -188,8 +192,15 @@ public String getDatabaseName() {
return databaseName;
}
+ @TableModel
public void setDatabaseName(@Nullable String databaseName) {
this.databaseName = databaseName;
+ if (Objects.nonNull(databaseName) && !PathUtils.isTableModelDatabase(databaseName)) {
+ throw new SemanticException(
+ "The database name "
+ + databaseName
+ + " is a tree model database, which is not allowed to set in the client session.");
+ }
}
/**
From ebe14a9213be09f5d583b02354ce94dc61c1548c Mon Sep 17 00:00:00 2001
From: Caideyipi <87789683+Caideyipi@users.noreply.github.com>
Date: Fri, 17 Apr 2026 14:43:39 +0800
Subject: [PATCH 5/5] log
---
.../parser/TsFileInsertionEventParser.java | 17 ++++++++++++++++-
.../query/TsFileInsertionEventQueryParser.java | 4 +++-
.../scan/TsFileInsertionEventScanParser.java | 4 +++-
.../table/TsFileInsertionEventTableParser.java | 4 +++-
4 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/TsFileInsertionEventParser.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/TsFileInsertionEventParser.java
index 678e7a4a62a5..a723adce0dfd 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/TsFileInsertionEventParser.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/TsFileInsertionEventParser.java
@@ -26,6 +26,7 @@
import org.apache.iotdb.commons.pipe.datastructure.pattern.TreePattern;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.pipe.event.common.PipeInsertionEvent;
+import org.apache.iotdb.db.pipe.event.common.tsfile.parser.table.TsFileInsertionEventTableParser;
import org.apache.iotdb.db.pipe.metric.overview.PipeTsFileToTabletsMetrics;
import org.apache.iotdb.db.pipe.resource.PipeDataNodeResourceManager;
import org.apache.iotdb.db.pipe.resource.memory.PipeMemoryBlock;
@@ -41,6 +42,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.io.File;
import java.io.IOException;
public abstract class TsFileInsertionEventParser implements AutoCloseable {
@@ -76,6 +78,7 @@ public abstract class TsFileInsertionEventParser implements AutoCloseable {
protected Iterable tabletInsertionIterable;
protected TsFileInsertionEventParser(
+ final File tsFile,
final String pipeName,
final long creationTime,
final TreePattern treePattern,
@@ -85,7 +88,8 @@ protected TsFileInsertionEventParser(
final PipeTaskMeta pipeTaskMeta,
final IAuditEntity entity,
final boolean skipIfNoPrivileges,
- final PipeInsertionEvent sourceEvent) {
+ final PipeInsertionEvent sourceEvent,
+ final boolean isWithMod) {
this.pipeName = pipeName;
this.creationTime = creationTime;
this.entity = entity;
@@ -107,6 +111,17 @@ protected TsFileInsertionEventParser(
PipeDataNodeResourceManager.memory()
.forceAllocateForTabletWithRetry(
IoTDBDescriptor.getInstance().getConfig().getPipeDataStructureTabletSizeInBytes());
+
+ LOGGER.info(
+ "TsFile {} has initialized {}, pipeName: {}, creation time: {}, pattern: {}, startTime: {}, endTime: {}, withMod: {}",
+ tsFile,
+ getClass().getSimpleName(),
+ pipeName,
+ creationTime,
+ this instanceof TsFileInsertionEventTableParser ? tablePattern : treePattern,
+ startTime,
+ endTime,
+ isWithMod);
}
/**
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/query/TsFileInsertionEventQueryParser.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/query/TsFileInsertionEventQueryParser.java
index cc497635aab3..7e7226a61656 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/query/TsFileInsertionEventQueryParser.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/query/TsFileInsertionEventQueryParser.java
@@ -131,6 +131,7 @@ public TsFileInsertionEventQueryParser(
final boolean isWithMod)
throws IOException, IllegalPathException {
super(
+ tsFile,
pipeName,
creationTime,
pattern,
@@ -140,7 +141,8 @@ public TsFileInsertionEventQueryParser(
pipeTaskMeta,
entity,
skipIfNoPrivileges,
- sourceEvent);
+ sourceEvent,
+ isWithMod);
try {
currentModifications =
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/scan/TsFileInsertionEventScanParser.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/scan/TsFileInsertionEventScanParser.java
index da9d7d00477b..aeb7aaadf286 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/scan/TsFileInsertionEventScanParser.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/scan/TsFileInsertionEventScanParser.java
@@ -118,6 +118,7 @@ public TsFileInsertionEventScanParser(
final boolean isWithMod)
throws IOException, IllegalPathException {
super(
+ tsFile,
pipeName,
creationTime,
pattern,
@@ -127,7 +128,8 @@ public TsFileInsertionEventScanParser(
pipeTaskMeta,
entity,
skipIfNoPrivileges,
- sourceEvent);
+ sourceEvent,
+ isWithMod);
this.startTime = startTime;
this.endTime = endTime;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/table/TsFileInsertionEventTableParser.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/table/TsFileInsertionEventTableParser.java
index af2fd214e4a3..87cf374aeb26 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/table/TsFileInsertionEventTableParser.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/table/TsFileInsertionEventTableParser.java
@@ -71,6 +71,7 @@ public TsFileInsertionEventTableParser(
final boolean isWithMod)
throws IOException {
super(
+ tsFile,
pipeName,
creationTime,
null,
@@ -80,7 +81,8 @@ public TsFileInsertionEventTableParser(
pipeTaskMeta,
entity,
true,
- sourceEvent);
+ sourceEvent,
+ isWithMod);
this.isWithMod = isWithMod;
try {