Skip to content

Commit 131aaa9

Browse files
committed
Isolate writes to the internal system database root.__system
1 parent b652ddd commit 131aaa9

25 files changed

Lines changed: 438 additions & 42 deletions

File tree

‎example/trigger/src/main/java/org/apache/iotdb/trigger/StatisticsUpdaterTrigger.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public class StatisticsUpdaterTrigger implements Trigger {
4545

4646
private static final Logger LOGGER = LoggerFactory.getLogger(StatisticsUpdaterTrigger.class);
4747

48-
private static final String TARGET_DEVICE = "root.__system.statistics";
48+
private static final String TARGET_DEVICE = "root.statistics";
4949

5050
private static final String TARGET_SERIES = "total_count";
5151
private String ip;

‎iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -889,7 +889,7 @@ public TSchemaPartitionTableResp getSchemaPartition(
889889
Iterator<String> iterator = allDatabases.iterator();
890890
while (iterator.hasNext()) {
891891
String database = iterator.next();
892-
if (!needAuditDB && TREE_MODEL_AUDIT_DATABASE.equalsIgnoreCase(database)) {
892+
if (!needAuditDB && TREE_MODEL_AUDIT_DATABASE.equals(database)) {
893893
iterator.remove();
894894
continue;
895895
}

‎iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/partition/PartitionInfo.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ public DataSet getSchemaNodeManagementPartition(
542542
.filter(this::isDatabaseExisted)
543543
.forEach(
544544
database -> {
545-
if (!canSeeAuditDB && Audit.TREE_MODEL_AUDIT_DATABASE.equalsIgnoreCase(database)) {
545+
if (!canSeeAuditDB && Audit.TREE_MODEL_AUDIT_DATABASE.equals(database)) {
546546
return;
547547
}
548548
schemaPartitionMap.put(database, new SchemaPartitionTable());

‎iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/subscription/SubscriptionInfo.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ private static boolean onlySelectsAuditTableDatabase(final TopicConfig topicConf
450450
sourceAttributes.putAll(topicConfig.getAttributesWithSourcePrefix());
451451

452452
try {
453-
return TABLE_MODEL_AUDIT_DATABASE.equalsIgnoreCase(
453+
return TABLE_MODEL_AUDIT_DATABASE.equals(
454454
TablePattern.parsePipePatternFromSourceParameters(new TopicConfig(sourceAttributes))
455455
.getDatabasePattern());
456456
} catch (final PipeException ignored) {

‎iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/subscription/SubscriptionInfoTopicValidationTest.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ public void testRejectTopicThatOnlySelectsAuditDatabase() {
164164
assertCreateRejected(subscriptionInfo, tableAttributes, "only to the __audit database");
165165

166166
tableAttributes.put(TopicConstant.DATABASE_KEY, "__AUDIT");
167-
assertCreateRejected(subscriptionInfo, tableAttributes, "only to the __audit database");
167+
assertCreateAccepted(subscriptionInfo, "table_uppercase_audit_topic", tableAttributes);
168168

169169
tableAttributes.put(TopicConstant.DATABASE_KEY, "__audit_data");
170170
assertCreateAccepted(subscriptionInfo, "table_topic", tableAttributes);

‎iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ public static TSStatus checkAuthority(Statement statement, IAuditEntity auditEnt
226226
auditEntity.getUserId(),
227227
auditEntity.getUsername(),
228228
auditEntity.getCliHostname())
229+
.setInternal(auditEntity.isInternal())
229230
.setSqlString(auditEntity.getSqlString()));
230231
}
231232
return status;

‎iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java‎

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3557,12 +3557,13 @@ public TSStatus insertRecord(TSInsertRecordReq req) throws TException {
35573557
InsertRowStatement statement = StatementGenerator.createStatement(req);
35583558
SessionInfo sessionInfo =
35593559
new SessionInfo(
3560-
0,
3561-
new UserEntity(
3562-
AuthorityChecker.SUPER_USER_ID,
3563-
AuthorityChecker.SUPER_USER,
3564-
IoTDBDescriptor.getInstance().getConfig().getInternalAddress()),
3565-
ZoneId.systemDefault());
3560+
0,
3561+
new UserEntity(
3562+
AuthorityChecker.SUPER_USER_ID,
3563+
AuthorityChecker.SUPER_USER,
3564+
IoTDBDescriptor.getInstance().getConfig().getInternalAddress()),
3565+
ZoneId.systemDefault())
3566+
.setInternal(true);
35663567

35673568
long queryId = SESSION_MANAGER.requestQueryId();
35683569
ExecutionResult result =

‎iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,6 +1086,11 @@ public String getUsername() {
10861086
return session.getUserName();
10871087
}
10881088

1089+
@Override
1090+
public boolean isInternal() {
1091+
return session != null && session.isInternal();
1092+
}
1093+
10891094
@Override
10901095
public String getCliHostname() {
10911096
if (session == null || session.getCliHostname() == null) {

‎iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java‎

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
package org.apache.iotdb.db.queryengine.plan.analyze;
2121

2222
import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
23+
import org.apache.iotdb.common.rpc.thrift.TSStatus;
2324
import org.apache.iotdb.common.rpc.thrift.TTimePartitionSlot;
25+
import org.apache.iotdb.commons.audit.IAuditEntity;
2426
import org.apache.iotdb.commons.exception.IoTDBException;
2527
import org.apache.iotdb.commons.exception.IoTDBRuntimeException;
2628
import org.apache.iotdb.commons.exception.SemanticException;
@@ -56,6 +58,7 @@
5658
import org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.TableDeviceSchemaFetcher;
5759
import org.apache.iotdb.db.queryengine.plan.relational.planner.ir.ExpressionRewriter;
5860
import org.apache.iotdb.db.queryengine.plan.relational.planner.ir.ExpressionTreeRewriter;
61+
import org.apache.iotdb.db.queryengine.plan.relational.security.TreeAccessCheckVisitor;
5962
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Delete;
6063
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.TimeRange;
6164
import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertBaseStatement;
@@ -168,7 +171,9 @@ public static InsertBaseStatement analyzeInsert(
168171
validateSchema(analysis, insertBaseStatement, schemaValidation);
169172

170173
InsertBaseStatement realStatement =
171-
removeLogicalView ? removeLogicalView(analysis, insertBaseStatement) : insertBaseStatement;
174+
removeLogicalView
175+
? removeLogicalView(analysis, insertBaseStatement, context)
176+
: insertBaseStatement;
172177
if (analysis.isFinishQueryAfterAnalyze()) {
173178
return realStatement;
174179
}
@@ -343,9 +348,19 @@ public static void validateSchema(
343348
}
344349

345350
public static InsertBaseStatement removeLogicalView(
346-
IAnalysis analysis, InsertBaseStatement insertBaseStatement) {
351+
IAnalysis analysis, InsertBaseStatement insertBaseStatement, IAuditEntity context) {
347352
try {
348-
return insertBaseStatement.removeLogicalView();
353+
final InsertBaseStatement realStatement = insertBaseStatement.removeLogicalView();
354+
// Inserts into a logical view are rewritten to the view's source series. Check the real
355+
// target paths so a view created before this restriction cannot write root.__system.
356+
final TSStatus systemDatabaseStatus =
357+
TreeAccessCheckVisitor.checkSystemDatabaseWrite(
358+
context, realStatement.getDevicePathsStream().toList());
359+
if (systemDatabaseStatus != null) {
360+
analysis.setFinishQueryAfterAnalyze(true);
361+
analysis.setFailStatus(systemDatabaseStatus);
362+
}
363+
return realStatement;
349364
} catch (SemanticException e) {
350365
analysis.setFinishQueryAfterAnalyze(true);
351366
if (e.getCause() instanceof IoTDBException) {

‎iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java‎

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.GroupByVariationParameter;
8888
import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.IntoPathDescriptor;
8989
import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.OrderByParameter;
90+
import org.apache.iotdb.db.queryengine.plan.relational.security.TreeAccessCheckVisitor;
9091
import org.apache.iotdb.db.queryengine.plan.statement.StatementNode;
9192
import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor;
9293
import org.apache.iotdb.db.queryengine.plan.statement.component.FillComponent;
@@ -2903,7 +2904,8 @@ public Analysis visitInsertRow(InsertRowStatement insertRowStatement, MPPQueryCo
29032904
analysis,
29042905
insertRowStatement,
29052906
() -> SchemaValidator.validate(schemaFetcher, insertRowStatement, context));
2906-
InsertBaseStatement realInsertStatement = removeLogicalView(analysis, insertRowStatement);
2907+
InsertBaseStatement realInsertStatement =
2908+
removeLogicalView(analysis, insertRowStatement, context);
29072909
if (analysis.isFinishQueryAfterAnalyze()) {
29082910
return analysis;
29092911
}
@@ -2943,7 +2945,7 @@ public Analysis visitInsertRows(
29432945
insertRowsStatement,
29442946
() -> SchemaValidator.validate(schemaFetcher, insertRowsStatement, context));
29452947
InsertRowsStatement realInsertRowsStatement =
2946-
(InsertRowsStatement) removeLogicalView(analysis, insertRowsStatement);
2948+
(InsertRowsStatement) removeLogicalView(analysis, insertRowsStatement, context);
29472949
if (analysis.isFinishQueryAfterAnalyze()) {
29482950
return analysis;
29492951
}
@@ -2968,7 +2970,8 @@ public Analysis visitInsertMultiTablets(
29682970
insertMultiTabletsStatement,
29692971
() -> SchemaValidator.validate(schemaFetcher, insertMultiTabletsStatement, context));
29702972
InsertMultiTabletsStatement realStatement =
2971-
(InsertMultiTabletsStatement) removeLogicalView(analysis, insertMultiTabletsStatement);
2973+
(InsertMultiTabletsStatement)
2974+
removeLogicalView(analysis, insertMultiTabletsStatement, context);
29722975
if (analysis.isFinishQueryAfterAnalyze()) {
29732976
return analysis;
29742977
}
@@ -2993,7 +2996,7 @@ public Analysis visitInsertRowsOfOneDevice(
29932996
insertRowsOfOneDeviceStatement,
29942997
() -> SchemaValidator.validate(schemaFetcher, insertRowsOfOneDeviceStatement, context));
29952998
InsertBaseStatement realInsertStatement =
2996-
removeLogicalView(analysis, insertRowsOfOneDeviceStatement);
2999+
removeLogicalView(analysis, insertRowsOfOneDeviceStatement, context);
29973000
if (analysis.isFinishQueryAfterAnalyze()) {
29983001
return analysis;
29993002
}
@@ -3725,6 +3728,15 @@ public Analysis visitDeleteData(
37253728
}
37263729
}
37273730
deleteDataStatement.setPathList(new ArrayList<>(deletePatternSet));
3731+
// Deletes through a writable view are rewritten to the view's source series as well.
3732+
final TSStatus systemDatabaseStatus =
3733+
TreeAccessCheckVisitor.checkSystemDatabaseWrite(
3734+
context, deleteDataStatement.getPathList());
3735+
if (systemDatabaseStatus != null) {
3736+
analysis.setFinishQueryAfterAnalyze(true);
3737+
analysis.setFailStatus(systemDatabaseStatus);
3738+
return analysis;
3739+
}
37283740
} else {
37293741
for (PartialPath devicePattern : patternTree.getAllDevicePaths()) {
37303742
schemaTree

0 commit comments

Comments
 (0)