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 {