Skip to content

Commit 8b91c88

Browse files
committed
Don't delete tsfile when use tag as a where clause in the delete statement on table model.
1 parent 8c92be6 commit 8b91c88

File tree

3 files changed

+72
-10
lines changed

3 files changed

+72
-10
lines changed

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

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2273,6 +2273,59 @@ public void testMultiDeviceCompletelyDeleteTable() throws SQLException {
22732273
cleanData(testNum);
22742274
}
22752275

2276+
@Test
2277+
public void testDeleteDataByTag() throws IoTDBConnectionException, StatementExecutionException {
2278+
try (ITableSession session = EnvFactory.getEnv().getTableSessionConnectionWithDB("test")) {
2279+
session.executeNonQueryStatement(
2280+
"CREATE TABLE IF NOT EXISTS delete_by_tag (deviceId STRING TAG, s1 INT32 FIELD)");
2281+
2282+
session.executeNonQueryStatement(
2283+
"insert into delete_by_tag (time, deviceId, s1) values (1, 'sensor', 1)");
2284+
session.executeNonQueryStatement(
2285+
"insert into delete_by_tag (time, deviceId, s1) values (2, 'sensor', 2)");
2286+
session.executeNonQueryStatement(
2287+
"insert into delete_by_tag (time, deviceId, s1) values (3, 'sensor', 3)");
2288+
session.executeNonQueryStatement(
2289+
"insert into delete_by_tag (time, deviceId, s1) values (4, 'sensor', 4)");
2290+
2291+
session.executeNonQueryStatement("DELETE FROM delete_by_tag WHERE deviceId = 'sensor'");
2292+
2293+
SessionDataSet dataSet =
2294+
session.executeQueryStatement("select * from delete_by_tag order by time");
2295+
assertFalse(dataSet.hasNext());
2296+
2297+
session.executeNonQueryStatement(
2298+
"insert into delete_by_tag (time, deviceId, s1) values (1, 'sensor', 1)");
2299+
session.executeNonQueryStatement(
2300+
"insert into delete_by_tag (time, deviceId, s1) values (2, 'sensor', 2)");
2301+
session.executeNonQueryStatement(
2302+
"insert into delete_by_tag (time, deviceId, s1) values (3, 'sensor', 3)");
2303+
session.executeNonQueryStatement(
2304+
"insert into delete_by_tag (time, deviceId, s1) values (4, 'sensor', 4)");
2305+
session.executeNonQueryStatement("FLUSH");
2306+
2307+
session.executeNonQueryStatement("DELETE FROM delete_by_tag WHERE deviceId = 'sensor'");
2308+
2309+
dataSet = session.executeQueryStatement("select * from delete_by_tag order by time");
2310+
2311+
RowRecord rec;
2312+
int cnt = 0;
2313+
for (int i = 1; i < 5; i++) {
2314+
rec = dataSet.next();
2315+
assertEquals(i, rec.getFields().get(0).getLongV());
2316+
Assert.assertEquals(i, rec.getFields().get(2).getIntV());
2317+
Assert.assertEquals(TSDataType.INT32, rec.getFields().get(2).getDataType());
2318+
cnt++;
2319+
}
2320+
Assert.assertEquals(4, cnt);
2321+
assertFalse(dataSet.hasNext());
2322+
} finally {
2323+
try (ITableSession session = EnvFactory.getEnv().getTableSessionConnectionWithDB("test")) {
2324+
session.executeNonQueryStatement("DROP TABLE IF EXISTS delete_by_tag");
2325+
}
2326+
}
2327+
}
2328+
22762329
@Test
22772330
public void testDropAndAlter() throws IoTDBConnectionException, StatementExecutionException {
22782331
try (ITableSession session = EnvFactory.getEnv().getTableSessionConnectionWithDB("test")) {
@@ -2366,6 +2419,13 @@ public void testDropAndAlter() throws IoTDBConnectionException, StatementExecuti
23662419
for (int i = 1; i < 7; i++) {
23672420
rec = dataSet.next();
23682421
assertEquals(i, rec.getFields().get(0).getLongV());
2422+
LOGGER.error(
2423+
"time is {}, value is {}, value type is {}",
2424+
rec.getFields().get(0).getLongV(),
2425+
rec.getFields().get(1),
2426+
rec.getFields().get(1).getDataType());
2427+
// assertNull(rec.getFields().get(1).getDataType());
2428+
// Assert.assertEquals(TSDataType.TEXT, rec.getFields().get(1).getDataType());
23692429
cnt++;
23702430
}
23712431
Assert.assertEquals(6, cnt);

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@
114114
import org.apache.iotdb.db.storageengine.dataregion.memtable.IMemTable;
115115
import org.apache.iotdb.db.storageengine.dataregion.memtable.TsFileProcessor;
116116
import org.apache.iotdb.db.storageengine.dataregion.memtable.TsFileProcessorInfo;
117+
import org.apache.iotdb.db.storageengine.dataregion.modification.IDPredicate;
117118
import org.apache.iotdb.db.storageengine.dataregion.modification.ModEntry;
118119
import org.apache.iotdb.db.storageengine.dataregion.modification.ModificationFile;
119120
import org.apache.iotdb.db.storageengine.dataregion.modification.TableDeletionEntry;
@@ -3031,17 +3032,12 @@ private void deleteDataInSealedFiles(Collection<TsFileResource> sealedTsFiles, M
30313032
List<TsFileResource> deletedByMods = new ArrayList<>();
30323033
List<TsFileResource> deletedByFiles = new ArrayList<>();
30333034
boolean isDropMeasurementExist = false;
3034-
boolean isDropTagExist = false;
3035+
IDPredicate.IDPredicateType idPredicateType = null;
30353036

30363037
if (deletion instanceof TableDeletionEntry) {
3037-
TableDeletionEntry entry = (TableDeletionEntry) deletion;
3038-
isDropMeasurementExist = !entry.getPredicate().getMeasurementNames().isEmpty();
3039-
} else {
3040-
TreeDeletionEntry entry = (TreeDeletionEntry) deletion;
3041-
if (entry.getPathPattern() instanceof MeasurementPath) {
3042-
Map<String, String> tagMap = ((MeasurementPath) entry.getPathPattern()).getTagMap();
3043-
isDropTagExist = (tagMap != null) && !tagMap.isEmpty();
3044-
}
3038+
TableDeletionEntry tableDeletionEntry = (TableDeletionEntry) deletion;
3039+
isDropMeasurementExist = !tableDeletionEntry.getPredicate().getMeasurementNames().isEmpty();
3040+
idPredicateType = tableDeletionEntry.getPredicate().getIdPredicateType();
30453041
}
30463042

30473043
for (TsFileResource sealedTsFile : sealedTsFiles) {
@@ -3140,7 +3136,9 @@ private void deleteDataInSealedFiles(Collection<TsFileResource> sealedTsFiles, M
31403136
} // else do nothing
31413137
}
31423138

3143-
if (!deletedByFiles.isEmpty() && !isDropMeasurementExist && !isDropTagExist) {
3139+
if (!deletedByFiles.isEmpty()
3140+
&& !isDropMeasurementExist
3141+
&& idPredicateType.equals(IDPredicate.IDPredicateType.NOP)) {
31443142
deleteTsFileCompletely(deletedByFiles);
31453143
if (logger.isDebugEnabled()) {
31463144
logger.debug(

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/DeletionPredicate.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ public void setIdPredicate(IDPredicate idPredicate) {
7272
this.idPredicate = idPredicate;
7373
}
7474

75+
public IDPredicate.IDPredicateType getIdPredicateType() {
76+
return this.idPredicate.type;
77+
}
78+
7579
public String getTableName() {
7680
return tableName;
7781
}

0 commit comments

Comments
 (0)