Skip to content

Commit 2ff8310

Browse files
authored
Avoided "table not exist" related NPEs (apache#16357)
* fix * fix * Update IoTDBDeletionTableIT.java
1 parent 51da71f commit 2ff8310

File tree

14 files changed

+35
-77
lines changed

14 files changed

+35
-77
lines changed

integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBDeletionTableIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ public void testUnsupportedValueFilter() throws SQLException {
280280
statement.execute("DELETE FROM vehicleNonExist");
281281
fail("should not reach here!");
282282
} catch (SQLException e) {
283-
assertEquals("701: Table vehiclenonexist not found", e.getMessage());
283+
assertEquals("550: Table 'test.vehiclenonexist' does not exist.", e.getMessage());
284284
}
285285

286286
try (ResultSet set = statement.executeQuery("SELECT s0 FROM vehicle1")) {

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/dataregion/DataExecutionVisitor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.apache.iotdb.db.exception.WriteProcessRejectException;
2929
import org.apache.iotdb.db.exception.query.OutOfTTLException;
3030
import org.apache.iotdb.db.exception.runtime.TableLostRuntimeException;
31-
import org.apache.iotdb.db.exception.runtime.TableNotExistsRuntimeException;
31+
import org.apache.iotdb.db.exception.sql.SemanticException;
3232
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
3333
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor;
3434
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.pipe.PipeEnrichedDeleteDataNode;
@@ -162,7 +162,7 @@ public TSStatus visitInsertRows(InsertRowsNode node, DataRegion dataRegion) {
162162
}
163163
}
164164
return firstStatus;
165-
} catch (TableNotExistsRuntimeException | TableLostRuntimeException e) {
165+
} catch (SemanticException | TableLostRuntimeException e) {
166166
LOGGER.error("Error in executing plan node: {}, caused by {}", node, e.getMessage());
167167
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
168168
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/runtime/TableNotExistsRuntimeException.java

Lines changed: 0 additions & 36 deletions
This file was deleted.

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -347,9 +347,6 @@ private static void validateSchema(final Delete node, final MPPQueryContext quer
347347
node.setDatabaseName(databaseName);
348348

349349
final TsTable table = DataNodeTableCache.getInstance().getTable(databaseName, tableName);
350-
if (table == null) {
351-
throw new SemanticException("Table " + tableName + " not found");
352-
}
353350

354351
DataNodeTreeViewSchemaUtils.checkTableInWrite(databaseName, table);
355352
// Maybe set by pipe transfer

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/cache/schema/DataNodeTTLCache.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public long getTTLForTree(IDeviceID deviceID) {
8686
}
8787

8888
public long getTTLForTable(final String database, final String table) {
89-
final TsTable tsTable = DataNodeTableCache.getInstance().getTable(database, table);
89+
final TsTable tsTable = DataNodeTableCache.getInstance().getTable(database, table, false);
9090
return tsTable == null ? Long.MAX_VALUE : tsTable.getCachedTableTTL();
9191
}
9292

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -564,9 +564,6 @@ protected Scope visitDeleteDevice(final DeleteDevice node, final Optional<Scope>
564564
new QualifiedObjectName(node.getDatabase(), node.getTableName()));
565565
final TsTable table =
566566
DataNodeTableCache.getInstance().getTable(node.getDatabase(), node.getTableName());
567-
if (Objects.isNull(table)) {
568-
TableMetadataImpl.throwTableNotExistsException(node.getDatabase(), node.getTableName());
569-
}
570567
DataNodeTreeViewSchemaUtils.checkTableInWrite(node.getDatabase(), table);
571568
node.parseModEntries(table);
572569
analyzeTraverseDevice(node, context, node.getWhere().isPresent());
@@ -4448,10 +4445,8 @@ protected Scope visitCreateOrUpdateDevice(
44484445
queryContext.setQueryType(QueryType.WRITE);
44494446
DataNodeSchemaLockManager.getInstance()
44504447
.takeReadLock(queryContext, SchemaLockType.VALIDATE_VS_DELETION_TABLE);
4451-
if (Objects.isNull(
4452-
DataNodeTableCache.getInstance().getTable(node.getDatabase(), node.getTable()))) {
4453-
TableMetadataImpl.throwTableNotExistsException(node.getDatabase(), node.getTable());
4454-
}
4448+
// Check if the table exists
4449+
DataNodeTableCache.getInstance().getTable(node.getDatabase(), node.getTable());
44554450
return null;
44564451
}
44574452

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public class TableMetadataImpl implements Metadata {
101101

102102
@Override
103103
public boolean tableExists(final QualifiedObjectName name) {
104-
return tableCache.getTable(name.getDatabaseName(), name.getObjectName()) != null;
104+
return tableCache.getTable(name.getDatabaseName(), name.getObjectName(), false) != null;
105105
}
106106

107107
@Override
@@ -110,7 +110,7 @@ public Optional<TableSchema> getTableSchema(
110110
final String databaseName = name.getDatabaseName();
111111
final String tableName = name.getObjectName();
112112

113-
final TsTable table = tableCache.getTable(databaseName, tableName);
113+
final TsTable table = tableCache.getTable(databaseName, tableName, false);
114114
if (table == null) {
115115
return Optional.empty();
116116
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import org.apache.iotdb.db.queryengine.plan.relational.metadata.AlignedDeviceEntry;
3939
import org.apache.iotdb.db.queryengine.plan.relational.metadata.DeviceEntry;
4040
import org.apache.iotdb.db.queryengine.plan.relational.metadata.NonAlignedDeviceEntry;
41-
import org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl;
4241
import org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.IDeviceSchema;
4342
import org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.TableDeviceSchemaCache;
4443
import org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.TreeDeviceNormalSchema;
@@ -188,9 +187,6 @@ public Map<String, List<DeviceEntry>> fetchDeviceSchemaForDataQuery(
188187
final Map<String, List<DeviceEntry>> deviceEntryMap = new HashMap<>();
189188
final TsTable tableInstance = DataNodeTableCache.getInstance().getTable(database, table);
190189
final AtomicBoolean mayContainDuplicateDevice = new AtomicBoolean(false);
191-
if (tableInstance == null) {
192-
TableMetadataImpl.throwTableNotExistsException(database, table);
193-
}
194190
if (!TreeViewSchema.isTreeViewTable(tableInstance)) {
195191
deviceEntryMap.put(database, new ArrayList<>());
196192
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,13 +116,13 @@ public Optional<TableSchema> validateTableHeaderSchema(
116116
IoTDBDescriptor.getInstance().getConfig().isAutoCreateSchemaEnabled();
117117
// first round validate, check existing schema
118118
if (table == null) {
119-
// TODO table metadata: authority check for table create
120119
// auto create missing table
121120
// it's ok that many write requests concurrently auto create same table, the thread safety
122121
// will be guaranteed by ProcedureManager.createTable in CN
123122
if (allowCreateTable && isAutoCreateSchemaEnabled) {
124123
autoCreateTable(context, database, tableSchema);
125-
table = DataNodeTableCache.getInstance().getTable(database, tableSchema.getTableName());
124+
table =
125+
DataNodeTableCache.getInstance().getTable(database, tableSchema.getTableName(), false);
126126
if (table == null) {
127127
throw new IllegalStateException(
128128
"auto create table succeed, but cannot get table schema in current node's DataNodeTableCache, may be caused by concurrently auto creating table");

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ public void putAttributes(
150150
try {
151151
// Avoid stale table
152152
if (Objects.isNull(
153-
DataNodeTableCache.getInstance().getTable(database, deviceId.getTableName()))) {
153+
DataNodeTableCache.getInstance().getTable(database, deviceId.getTableName(), false))) {
154154
return;
155155
}
156156
dualKeyCache.update(
@@ -235,7 +235,7 @@ public void initOrInvalidateLastCache(
235235
try {
236236
// Avoid stale table
237237
if (Objects.isNull(
238-
DataNodeTableCache.getInstance().getTable(database, deviceId.getTableName()))) {
238+
DataNodeTableCache.getInstance().getTable(database, deviceId.getTableName(), false))) {
239239
return;
240240
}
241241
dualKeyCache.update(

0 commit comments

Comments
 (0)