Skip to content

Commit 642cf54

Browse files
authored
Fix that table deletion will be mistakenly merged together
1 parent 6eb576c commit 642cf54

File tree

3 files changed

+68
-1
lines changed

3 files changed

+68
-1
lines changed

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,49 @@ public void testIllegalRange() {
671671
}
672672
}
673673

674+
@Test
675+
public void testMergeDeletion() throws SQLException {
676+
try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
677+
Statement statement = connection.createStatement()) {
678+
statement.execute("create database db1");
679+
statement.execute("use db1");
680+
statement.execute(
681+
"create table t1(country id,region id, city id, device id, ab1 ATTRIBUTE, s1 int32, s2 float, s3 boolean, s4 string)");
682+
statement.execute(
683+
"INSERT INTO t1(time,country,region,city,device,ab1,s1,s2,s3,s4) values (100,'china','hebei','shijiazhuang','d1','ab1',1,1,1,1),(200,null,'hebei','shijiazhuang','d2','ab2',1,1,1,1),(300,'china','beijing','beijing','d1','ab3',1,1,1,1),(400,'china','tianjin','tianjin','d1','ab4',1,1,1,1),(500,'china','sichuan','chengdu','d1',null,1,1,1,1),(600,'china','zhejiang','hangzhou','d1','ab6',1,1,1,1),(700,'japan','dao','tokyo','d1','ab7',1,1,1,1),(800,'canada','tronto','shijiazhuang','d1','ab8',null,1,1,1),(900,'usa','ca','oldmountain','d1','ab9',1,1,1,1),(1000,'tailand',null,'mangu','d1','ab10',1,1,1,1),(1100,'china','hebei','','d1','ab11',1,1,1,1),(1200,'','hebei','','d1','ab12',1,1,1,1),(1300,'china','','','d1','ab13',1,1,1,1)");
684+
statement.execute("flush");
685+
int cnt = 0;
686+
try (ResultSet set =
687+
statement.executeQuery(
688+
"select time,country,region,city,device,ab1,s1,s2,s3,s4 from t1 order by time")) {
689+
while (set.next()) {
690+
cnt++;
691+
}
692+
assertEquals(13, cnt);
693+
}
694+
cnt = 0;
695+
statement.execute("delete from t1 where country='japan'");
696+
try (ResultSet set =
697+
statement.executeQuery(
698+
"select time,country,region,city,device,ab1,s1,s2,s3,s4 from t1 order by time")) {
699+
while (set.next()) {
700+
cnt++;
701+
}
702+
assertEquals(12, cnt);
703+
}
704+
cnt = 0;
705+
statement.execute("delete from t1 where country='china' and region='beijing'");
706+
try (ResultSet set =
707+
statement.executeQuery(
708+
"select time,country,region,city,device,ab1,s1,s2,s3,s4 from t1 order by time")) {
709+
while (set.next()) {
710+
cnt++;
711+
}
712+
assertEquals(11, cnt);
713+
}
714+
}
715+
}
716+
674717
@Ignore
675718
@Test
676719
public void testDeletionWritePerformance() throws SQLException, IOException {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,4 +148,8 @@ public boolean equals(Object o) {
148148
public int hashCode() {
149149
return Objects.hash(predicate, timeRange);
150150
}
151+
152+
public DeletionPredicate getPredicate() {
153+
return predicate;
154+
}
151155
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import org.apache.iotdb.db.storageengine.dataregion.compaction.selector.impl.SettleSelectorImpl;
2323
import org.apache.iotdb.db.storageengine.dataregion.memtable.IMemTable;
2424
import org.apache.iotdb.db.storageengine.dataregion.modification.ModEntry;
25+
import org.apache.iotdb.db.storageengine.dataregion.modification.TableDeletionEntry;
26+
import org.apache.iotdb.db.storageengine.dataregion.modification.TreeDeletionEntry;
2527

2628
import org.apache.tsfile.file.metadata.AlignedChunkMetadata;
2729
import org.apache.tsfile.file.metadata.IChunkMetadata;
@@ -34,6 +36,7 @@
3436
import java.util.Collections;
3537
import java.util.Comparator;
3638
import java.util.List;
39+
import java.util.Objects;
3740

3841
public class ModificationUtils {
3942

@@ -360,14 +363,31 @@ public static boolean canMerge(TimeRange left, TimeRange right) {
360363
return extendedRightMin <= left.getMax();
361364
}
362365

366+
public static boolean canMerge(ModEntry left, ModEntry right) {
367+
if (!Objects.equals(left.getClass(), right.getClass())
368+
|| !canMerge(left.getTimeRange(), right.getTimeRange())) {
369+
return false;
370+
}
371+
372+
if (left instanceof TreeDeletionEntry) {
373+
return Objects.equals(
374+
((TreeDeletionEntry) left).getPathPattern(),
375+
((TreeDeletionEntry) right).getPathPattern());
376+
} else if (left instanceof TableDeletionEntry) {
377+
return Objects.equals(
378+
((TableDeletionEntry) left).getPredicate(), ((TableDeletionEntry) right).getPredicate());
379+
}
380+
return false;
381+
}
382+
363383
public static List<ModEntry> sortAndMerge(List<ModEntry> modifications) {
364384
modifications.sort(Comparator.comparing(ModEntry::getTimeRange));
365385
List<ModEntry> result = new ArrayList<>();
366386
if (!modifications.isEmpty()) {
367387
ModEntry current = modifications.get(0).clone();
368388
for (int i = 1; i < modifications.size(); i++) {
369389
ModEntry next = modifications.get(i);
370-
if (canMerge(current.getTimeRange(), next.getTimeRange())) {
390+
if (canMerge(current, next)) {
371391
current.getTimeRange().merge(next.getTimeRange());
372392
} else {
373393
result.add(current);

0 commit comments

Comments
 (0)