[Bug] 2.0.5版本,table模式下,无模式建的表,再执行insert时,会把已经存在的记录里除了timestamp之外的字段全部覆盖
- Langage dominant
- Java
- Étoiles
- 6.4k
- Forks
- 1.2k
- Merge moyen
- 1 j 23 h
- PR mergées (30 j)
- 115
Description
### 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!
Guide de contribution
Ouvrir le guide de contribution
Piste de recherche
Commencez par la reproduction fournie de testCreateAndInsert, en utilisant TableSessionBuilder et le chemin d'insertion en mode table avec la configuration docker-standalone 2.0.5. Comparez l'insertion schemaless dans la tablet avec le SQL INSERT ultérieur dans db1.table1. C'est terminé lorsque vous avez reproduit l'écrasement et vérifié que les enregistrements existants conservent leurs valeurs antérieures autres que l'horodatage.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- java, sql
- Domaine
- databases
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100