[Bug] 2.0.5版本,table模式下,无模式建的表,再执行insert时,会把已经存在的记录里除了timestamp之外的字段全部覆盖
- Ngôn ngữ chính
- Java
- Star
- 6.4k
- Fork
- 1.2k
- Merge trung bình
- 1 ngày 23 giờ
- Pull request đã merge (30 ngày)
- 115
Mô tả
### Search before asking
- [x] I searched in the [issues](https://github.com/apache/iotdb/issues) and found nothing similar.
### Version
release2.0.5
docker-standalone
### Describe the bug and provide the minimal reproduce step
1、安装2.0.5 docker-standalone版本
2、建表并插入数据
@Test
public void testCreateAndInsert() throws Exception {
log.info("IOTDB Test executed");
try (ITableSession session =
new TableSessionBuilder()
.nodeUrls(Collections.singletonList("127.0.0.1:6667"))
.username("root")
.password("root")
.build()) {
session.executeNonQueryStatement("CREATE DATABASE IF NOT EXISTS db1");
session.executeNonQueryStatement("use db1");
// 不创建表直接写入数据
List columnNameList =
Arrays.asList("region_id", "plant_id", "device_id", "model","kind","weather","birthday", "temperature", "humidity");
List dataTypeList =
Arrays.asList(
TSDataType.STRING,
TSDataType.STRING,
TSDataType.STRING,
TSDataType.STRING,
TSDataType.STRING,
TSDataType.STRING,
TSDataType.STRING,
TSDataType.FLOAT,
TSDataType.DOUBLE);
List columnTypeList =
new ArrayList<>(
Arrays.asList(
ColumnCategory.TAG,
ColumnCategory.TAG,
ColumnCategory.TAG,
ColumnCategory.ATTRIBUTE,
ColumnCategory.ATTRIBUTE,
ColumnCategory.ATTRIBUTE,
ColumnCategory.ATTRIBUTE,
ColumnCategory.FIELD,
ColumnCategory.FIELD));
Tablet tablet = new Tablet("table1", columnNameList, dataTypeList, columnTypeList, 100);
for (int i = 0; i < 100; i++) {
int rowIndex = tablet.getRowSize();
tablet.addTimestamp(rowIndex, System.currentTimeMillis());
tablet.addValue("region_id", rowIndex, "1");
tablet.addValue("plant_id", rowIndex, "5");
tablet.addValue("device_id", rowIndex, "3");
tablet.addValue("model", rowIndex, "A");
tablet.addValue("kind", rowIndex, "west");
tablet.addValue("weather", rowIndex, "cloudy");
tablet.addValue("birthday", rowIndex, "2025-10-17");
tablet.addValue("temperature", rowIndex, 37.6F);
tablet.addValue("humidity", rowIndex, 111.1);
if (tablet.getRowSize() == tablet.getMaxRowNumber()) {
session.insert(tablet);
tablet.reset();
}
log.info("数据" + i);
Thread.sleep(3000L);
}
if (tablet.getRowSize() != 0) {
session.insert(tablet);
tablet.reset();
}
}
log.info("数据插入成功");
}
3、观察数据插入成功
4、再通过命令插入记录
INSERT INTO db1.table1 (region_id, plant_id, device_id, model, kind, weather, birthday, temperature, humidity)
VALUES ('1', '5', '3', 'B', 'north', 'rain', '2025-10-19', 40.6, 121.1)
5、观察发现已经存在的记录里除了timestamp之外的字段全部覆盖了
### What did you expect to see?
2.0.5版本,table模式下,无模式建的表,再执行insert时,会把已经存在的记录里除了timestamp之外的字段全部覆盖。
### What did you see instead?
nothing
### Anything else?
_No response_
### Are you willing to submit a PR?
- [ ] I'm willing to submit a PR!
Hướng dẫn đóng góp
Hướng nghiên cứu
Bắt đầu với bản tái hiện testCreateAndInsert được cung cấp, sử dụng TableSessionBuilder và đường dẫn chèn ở chế độ bảng trên thiết lập docker-standalone 2.0.5. So sánh thao tác chèn schemaless vào tablet với SQL INSERT sau đó vào db1.table1. Hoàn tất khi tái hiện được việc ghi đè và xác minh rằng các bản ghi hiện có vẫn giữ nguyên các giá trị trước đó không phải timestamp.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- java, sql
- Lĩnh vực
- databases
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 35/100