[Bug] 2.0.5版本,table模式下,无模式建的表,再执行insert时,会把已经存在的记录里除了timestamp之外的字段全部覆盖
- 主要语言
- Java
- 星标
- 6.4k
- 派生
- 1.2k
- 平均合并
- 1 天 23 小时
- 30 天内合并 PR
- 115
描述
### 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!
贡献指南
调研方向
从提供的 testCreateAndInsert 复现开始,使用 TableSessionBuilder 和针对 2.0.5 docker-standalone 设置的 table-mode insert 路径。将 schemaless tablet insert 与随后对 db1.table1 执行的 SQL INSERT 进行比较。完成标准是复现覆盖行为,并验证现有记录保留其先前的非时间戳值。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- java, sql
- 领域
- databases
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100