Skip to content

Commit b6ef768

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 b6ef768

File tree

3 files changed

+168
-10
lines changed

3 files changed

+168
-10
lines changed

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

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2273,6 +2273,155 @@ 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+
// // time=1 and time=2 are INT32 and deleted by drop column
2282+
// Tablet tablet =
2283+
// new Tablet(
2284+
// "delete_by_tag",
2285+
// Arrays.asList("deviceId", "s1"),
2286+
// Arrays.asList(TSDataType.STRING, TSDataType.INT32),
2287+
// Arrays.asList(ColumnCategory.TAG, ColumnCategory.FIELD));
2288+
// tablet.addTimestamp(0, 1);
2289+
// tablet.addValue("deviceId", 0, "sensor");
2290+
// tablet.addValue("s1", 0, genValue(TSDataType.INT32, 1));
2291+
// session.insert(tablet);
2292+
// tablet.reset();
2293+
//
2294+
// session.executeNonQueryStatement("FLUSH");
2295+
//
2296+
// tablet =
2297+
// new Tablet(
2298+
// "delete_by_tag",
2299+
// Arrays.asList("deviceId", "s1"),
2300+
// Arrays.asList(TSDataType.STRING, TSDataType.INT32),
2301+
// Arrays.asList(ColumnCategory.TAG, ColumnCategory.FIELD));
2302+
// tablet.addTimestamp(0, 2);
2303+
// tablet.addValue("deviceId", 0, "sensor");
2304+
// tablet.addValue("s1", 0, genValue(TSDataType.INT32, 2));
2305+
// session.insert(tablet);
2306+
// tablet.reset();
2307+
//
2308+
// // time=3 and time=4 are STRING
2309+
// tablet =
2310+
// new Tablet(
2311+
// "delete_by_tag",
2312+
// Arrays.asList("deviceId", "s1"),
2313+
// Arrays.asList(TSDataType.STRING, TSDataType.INT32),
2314+
// Arrays.asList(ColumnCategory.TAG, ColumnCategory.FIELD));
2315+
// tablet.addTimestamp(0, 3);
2316+
// tablet.addValue("deviceId", 0, "sensor");
2317+
// tablet.addValue("s1", 0, genValue(TSDataType.INT32, 3));
2318+
// session.insert(tablet);
2319+
// tablet.reset();
2320+
//
2321+
// session.executeNonQueryStatement("FLUSH");
2322+
//
2323+
// tablet =
2324+
// new Tablet(
2325+
// "delete_by_tag",
2326+
// Arrays.asList("deviceId", "s1"),
2327+
// Arrays.asList(TSDataType.STRING, TSDataType.INT32),
2328+
// Arrays.asList(ColumnCategory.TAG, ColumnCategory.FIELD));
2329+
// tablet.addTimestamp(0, 4);
2330+
// tablet.addValue("deviceId", 0, "sensor");
2331+
// tablet.addValue("s1", 0, genValue(TSDataType.INT32, 4));
2332+
// session.insert(tablet);
2333+
// tablet.reset();
2334+
//
2335+
// // time=5 and time=6 are TEXT
2336+
// tablet =
2337+
// new Tablet(
2338+
// "delete_by_tag",
2339+
// Arrays.asList("deviceId", "s1"),
2340+
// Arrays.asList(TSDataType.STRING, TSDataType.INT32),
2341+
// Arrays.asList(ColumnCategory.TAG, ColumnCategory.FIELD));
2342+
// tablet.addTimestamp(0, 5);
2343+
// tablet.addValue("deviceId", 0, "rada");
2344+
// tablet.addValue("s1", 0, genValue(TSDataType.INT32, 5));
2345+
// session.insert(tablet);
2346+
// tablet.reset();
2347+
//
2348+
// session.executeNonQueryStatement("FLUSH");
2349+
//
2350+
// tablet =
2351+
// new Tablet(
2352+
// "delete_by_tag",
2353+
// Arrays.asList("deviceId", "s1"),
2354+
// Arrays.asList(TSDataType.STRING, TSDataType.INT32),
2355+
// Arrays.asList(ColumnCategory.TAG, ColumnCategory.FIELD));
2356+
// tablet.addTimestamp(0, 6);
2357+
// tablet.addValue("deviceId", 0, "rada");
2358+
// tablet.addValue("s1", 0, genValue(TSDataType.INT32, 6));
2359+
// session.insert(tablet);
2360+
// tablet.reset();
2361+
2362+
session.executeNonQueryStatement("SET CONFIGURATION enable_seq_space_compaction='false'");
2363+
session.executeNonQueryStatement("SET CONFIGURATION enable_unseq_space_compaction='false'");
2364+
2365+
session.executeNonQueryStatement(
2366+
"insert into delete_by_tag (time, deviceId, s1) values (1, 'sensor', 1)");
2367+
session.executeNonQueryStatement(
2368+
"insert into delete_by_tag (time, deviceId, s1) values (2, 'sensor', 2)");
2369+
session.executeNonQueryStatement(
2370+
"insert into delete_by_tag (time, deviceId, s1) values (3, 'sensor', 3)");
2371+
session.executeNonQueryStatement(
2372+
"insert into delete_by_tag (time, deviceId, s1) values (4, 'sensor', 4)");
2373+
2374+
session.executeNonQueryStatement("DELETE FROM delete_by_tag WHERE deviceId = 'sensor'");
2375+
2376+
SessionDataSet dataSet =
2377+
session.executeQueryStatement("select * from delete_by_tag order by time");
2378+
assertFalse(dataSet.hasNext());
2379+
2380+
session.executeNonQueryStatement(
2381+
"insert into delete_by_tag (time, deviceId, s1) values (1, 'sensor', 1)");
2382+
session.executeNonQueryStatement(
2383+
"insert into delete_by_tag (time, deviceId, s1) values (2, 'sensor', 2)");
2384+
session.executeNonQueryStatement(
2385+
"insert into delete_by_tag (time, deviceId, s1) values (3, 'sensor', 3)");
2386+
session.executeNonQueryStatement(
2387+
"insert into delete_by_tag (time, deviceId, s1) values (4, 'sensor', 4)");
2388+
session.executeNonQueryStatement("FLUSH");
2389+
2390+
session.executeNonQueryStatement("DELETE FROM delete_by_tag WHERE deviceId = 'sensor'");
2391+
2392+
dataSet = session.executeQueryStatement("select * from delete_by_tag order by time");
2393+
2394+
// while (dataSet.hasNext()) {
2395+
// RowRecord rec = dataSet.next();
2396+
// LOGGER.error(
2397+
// "time is {}, tag is {}, tag type is {}, col is {}, value type is {}, rec is {}",
2398+
// rec.getFields().get(0).getLongV(),
2399+
// rec.getFields().get(1),
2400+
// rec.getFields().get(1).getDataType(),
2401+
// rec.getFields().get(2),
2402+
// rec.getFields().get(2).getDataType(), rec);
2403+
// }
2404+
// System.exit(0);
2405+
2406+
// s1 is dropped but the time should remain
2407+
RowRecord rec;
2408+
int cnt = 0;
2409+
for (int i = 1; i < 5; i++) {
2410+
rec = dataSet.next();
2411+
assertEquals(i, rec.getFields().get(0).getLongV());
2412+
Assert.assertEquals(i, rec.getFields().get(2).getIntV());
2413+
Assert.assertEquals(TSDataType.INT32, rec.getFields().get(2).getDataType());
2414+
cnt++;
2415+
}
2416+
Assert.assertEquals(4, cnt);
2417+
assertFalse(dataSet.hasNext());
2418+
} finally {
2419+
try (ITableSession session = EnvFactory.getEnv().getTableSessionConnectionWithDB("test")) {
2420+
session.executeNonQueryStatement("DROP TABLE IF EXISTS delete_by_tag");
2421+
}
2422+
}
2423+
}
2424+
22762425
@Test
22772426
public void testDropAndAlter() throws IoTDBConnectionException, StatementExecutionException {
22782427
try (ITableSession session = EnvFactory.getEnv().getTableSessionConnectionWithDB("test")) {
@@ -2366,6 +2515,13 @@ public void testDropAndAlter() throws IoTDBConnectionException, StatementExecuti
23662515
for (int i = 1; i < 7; i++) {
23672516
rec = dataSet.next();
23682517
assertEquals(i, rec.getFields().get(0).getLongV());
2518+
LOGGER.error(
2519+
"time is {}, value is {}, value type is {}",
2520+
rec.getFields().get(0).getLongV(),
2521+
rec.getFields().get(1),
2522+
rec.getFields().get(1).getDataType());
2523+
// assertNull(rec.getFields().get(1).getDataType());
2524+
// Assert.assertEquals(TSDataType.TEXT, rec.getFields().get(1).getDataType());
23692525
cnt++;
23702526
}
23712527
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)