This is an automated email from the ASF dual-hosted git repository.
jt2594838 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new aabf552629b Avoid copying measurements when updating last cache
(#18059)
aabf552629b is described below
commit aabf552629bc03dc7f143d5d5b63c39c89fe5f15
Author: Caideyipi <[email protected]>
AuthorDate: Tue Jun 30 15:33:49 2026 +0800
Avoid copying measurements when updating last cache (#18059)
* Avoid copying measurements when updating last cache
* spotless
---
.../plan/planner/plan/node/write/InsertNode.java | 12 ++++--
.../planner/plan/node/write/InsertRowNode.java | 7 ++--
.../planner/plan/node/write/InsertTabletNode.java | 7 ++--
.../plan/node/write/RelationalInsertRowNode.java | 8 ++--
.../node/write/RelationalInsertTabletNode.java | 9 ++---
.../fetcher/cache/TableDeviceCacheEntry.java | 20 +++++++++-
.../fetcher/cache/TableDeviceLastCache.java | 44 ++++++++++++++++++----
.../fetcher/cache/TableDeviceSchemaCache.java | 26 ++++++++++++-
.../fetcher/cache/TreeDeviceNormalSchema.java | 13 +++++--
.../cache/TreeDeviceSchemaCacheManagerTest.java | 39 +++++++++++++++++++
.../write/InsertNodeIsMeasurementFailedTest.java | 22 +++++++++++
11 files changed, 171 insertions(+), 36 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertNode.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertNode.java
index 0855dbeb63a..9c8e3691883 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertNode.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertNode.java
@@ -478,15 +478,19 @@ public abstract class InsertNode extends SearchNode {
public String[] getRawMeasurements() {
String[] measurements = getMeasurements();
MeasurementSchema[] measurementSchemas = getMeasurementSchemas();
- String[] rawMeasurements = new String[measurements.length];
+ String[] rawMeasurements = measurements;
for (int i = 0; i < measurements.length; i++) {
if (measurementSchemas != null
&& i < measurementSchemas.length
&& measurementSchemas[i] != null) {
// get raw measurement rather than alias
- rawMeasurements[i] = measurementSchemas[i].getMeasurementName();
- } else {
- rawMeasurements[i] = measurements[i];
+ String rawMeasurement = measurementSchemas[i].getMeasurementName();
+ if (!Objects.equals(rawMeasurement, measurements[i])) {
+ if (rawMeasurements == measurements) {
+ rawMeasurements = Arrays.copyOf(measurements, measurements.length);
+ }
+ rawMeasurements[i] = rawMeasurement;
+ }
}
}
return rawMeasurements;
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertRowNode.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertRowNode.java
index 73463864c06..04768c57b50 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertRowNode.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertRowNode.java
@@ -1026,16 +1026,15 @@ public class InsertRowNode extends InsertNode
implements WALEntryValue {
}
public void updateLastCache(String databaseName) {
- String[] rawMeasurements = getRawMeasurements();
- TimeValuePair[] timeValuePairs = new TimeValuePair[rawMeasurements.length];
- for (int i = 0; i < rawMeasurements.length; i++) {
+ TimeValuePair[] timeValuePairs = new TimeValuePair[measurements.length];
+ for (int i = 0; i < measurements.length; i++) {
timeValuePairs[i] = composeTimeValuePair(i);
}
TreeDeviceSchemaCacheManager.getInstance()
.updateLastCacheIfExists(
databaseName,
getDeviceID(),
- rawMeasurements,
+ measurements,
timeValuePairs,
isAligned,
measurementSchemas);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertTabletNode.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertTabletNode.java
index becd347cfee..976223bf2cf 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertTabletNode.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertTabletNode.java
@@ -1570,16 +1570,15 @@ public class InsertTabletNode extends InsertNode
implements WALEntryValue {
}
public void updateLastCache(final String databaseName, final TSStatus[]
results) {
- final String[] rawMeasurements = getRawMeasurements();
- final TimeValuePair[] timeValuePairs = new
TimeValuePair[rawMeasurements.length];
- for (int i = 0; i < rawMeasurements.length; i++) {
+ final TimeValuePair[] timeValuePairs = new
TimeValuePair[measurements.length];
+ for (int i = 0; i < measurements.length; i++) {
timeValuePairs[i] = composeLastTimeValuePair(i, results, 0, rowCount);
}
TreeDeviceSchemaCacheManager.getInstance()
.updateLastCacheIfExists(
databaseName,
getDeviceID(),
- rawMeasurements,
+ measurements,
timeValuePairs,
isAligned,
measurementSchemas);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertRowNode.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertRowNode.java
index d6ae162c6d0..b11c0f6784e 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertRowNode.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertRowNode.java
@@ -281,13 +281,13 @@ public class RelationalInsertRowNode extends
InsertRowNode {
@Override
public void updateLastCache(String databaseName) {
- String[] rawMeasurements = getRawMeasurements();
- TimeValuePair[] timeValuePairs = new TimeValuePair[rawMeasurements.length];
- for (int i = 0; i < rawMeasurements.length; i++) {
+ TimeValuePair[] timeValuePairs = new TimeValuePair[measurements.length];
+ for (int i = 0; i < measurements.length; i++) {
timeValuePairs[i] = composeTimeValuePair(i);
}
TableDeviceSchemaCache.getInstance()
- .updateLastCacheIfExists(databaseName, getDeviceID(), rawMeasurements,
timeValuePairs);
+ .updateLastCacheIfExists(
+ databaseName, getDeviceID(), measurements, measurementSchemas,
timeValuePairs);
}
@Override
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java
index b842cfc5db7..d41b078cb9b 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java
@@ -444,20 +444,19 @@ public class RelationalInsertTabletNode extends
InsertTabletNode {
}
public void updateLastCache(final String databaseName, final TSStatus[]
results) {
- final String[] rawMeasurements = getRawMeasurements();
-
final List<Pair<IDeviceID, Integer>> deviceEndOffsetPairs =
splitByDevice(0, rowCount);
int startOffset = 0;
for (final Pair<IDeviceID, Integer> deviceEndOffsetPair :
deviceEndOffsetPairs) {
final IDeviceID deviceID = deviceEndOffsetPair.getLeft();
final int endOffset = deviceEndOffsetPair.getRight();
- final TimeValuePair[] timeValuePairs = new
TimeValuePair[rawMeasurements.length];
- for (int i = 0; i < rawMeasurements.length; i++) {
+ final TimeValuePair[] timeValuePairs = new
TimeValuePair[measurements.length];
+ for (int i = 0; i < measurements.length; i++) {
timeValuePairs[i] = composeLastTimeValuePair(i, results, startOffset,
endOffset);
}
TableDeviceSchemaCache.getInstance()
- .updateLastCacheIfExists(databaseName, deviceID, rawMeasurements,
timeValuePairs);
+ .updateLastCacheIfExists(
+ databaseName, deviceID, measurements, measurementSchemas,
timeValuePairs);
startOffset = endOffset;
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceCacheEntry.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceCacheEntry.java
index 4f151d15eae..5ea51a5809f 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceCacheEntry.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceCacheEntry.java
@@ -30,6 +30,7 @@ import org.apache.tsfile.utils.TsPrimitiveType;
import org.apache.tsfile.write.schema.IMeasurementSchema;
import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
import javax.annotation.concurrent.ThreadSafe;
import java.util.Collections;
@@ -186,9 +187,19 @@ public class TableDeviceCacheEntry {
int tryUpdateLastCache(
final String[] measurements, final TimeValuePair[] timeValuePairs,
boolean invalidateNull) {
+ return tryUpdateLastCache(measurements, null, timeValuePairs,
invalidateNull);
+ }
+
+ int tryUpdateLastCache(
+ final String[] measurements,
+ final @Nullable IMeasurementSchema[] measurementSchemas,
+ final TimeValuePair[] timeValuePairs,
+ boolean invalidateNull) {
final TableDeviceLastCache cache = lastCache.get();
final int result =
- Objects.nonNull(cache) ? cache.tryUpdate(measurements, timeValuePairs,
invalidateNull) : 0;
+ Objects.nonNull(cache)
+ ? cache.tryUpdate(measurements, measurementSchemas,
timeValuePairs, invalidateNull)
+ : 0;
return Objects.nonNull(lastCache.get()) ? result : 0;
}
@@ -196,6 +207,13 @@ public class TableDeviceCacheEntry {
return tryUpdateLastCache(measurements, timeValuePairs, false);
}
+ int tryUpdateLastCache(
+ final String[] measurements,
+ final @Nullable IMeasurementSchema[] measurementSchemas,
+ final TimeValuePair[] timeValuePairs) {
+ return tryUpdateLastCache(measurements, measurementSchemas,
timeValuePairs, false);
+ }
+
int invalidateLastCache(final String measurement) {
final TableDeviceLastCache cache = lastCache.get();
final int result = Objects.nonNull(cache) ? cache.invalidate(measurement)
: 0;
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceLastCache.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceLastCache.java
index 271051b72b8..325484f6f68 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceLastCache.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceLastCache.java
@@ -25,6 +25,7 @@ import org.apache.tsfile.read.TimeValuePair;
import org.apache.tsfile.utils.Pair;
import org.apache.tsfile.utils.RamUsageEstimator;
import org.apache.tsfile.utils.TsPrimitiveType;
+import org.apache.tsfile.write.schema.IMeasurementSchema;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -134,25 +135,37 @@ public class TableDeviceLastCache {
final @Nonnull String[] measurements,
final @Nonnull TimeValuePair[] timeValuePairs,
final boolean invalidateNull) {
+ return tryUpdate(measurements, null, timeValuePairs, invalidateNull);
+ }
+
+ int tryUpdate(
+ final @Nonnull String[] measurements,
+ final @Nullable IMeasurementSchema[] measurementSchemas,
+ final @Nonnull TimeValuePair[] timeValuePairs,
+ final boolean invalidateNull) {
final AtomicInteger diff = new AtomicInteger(0);
long lastTime = Long.MIN_VALUE;
for (int i = 0; i < measurements.length; ++i) {
+ final String measurement = getRawMeasurement(measurements,
measurementSchemas, i);
+ if (Objects.isNull(measurement)) {
+ continue;
+ }
if (Objects.isNull(timeValuePairs[i])) {
if (invalidateNull) {
- diff.addAndGet(removeKnownNullTime(measurements[i]));
+ diff.addAndGet(removeKnownNullTime(measurement));
diff.addAndGet(
- -((int) RamUsageEstimator.sizeOf(measurements[i])
- +
getTvPairEntrySize(measurement2CachedLastMap.remove(measurements[i]))));
+ -((int) RamUsageEstimator.sizeOf(measurement)
+ +
getTvPairEntrySize(measurement2CachedLastMap.remove(measurement))));
}
continue;
}
- if (isKnownNullAtAlignedTime(measurements[i], timeValuePairs[i])) {
+ if (isKnownNullAtAlignedTime(measurement, timeValuePairs[i])) {
if (lastTime < timeValuePairs[i].getTimestamp()) {
lastTime = timeValuePairs[i].getTimestamp();
}
- diff.addAndGet(tryUpdateKnownNullTime(measurements[i],
timeValuePairs[i].getTimestamp()));
+ diff.addAndGet(tryUpdateKnownNullTime(measurement,
timeValuePairs[i].getTimestamp()));
continue;
}
@@ -161,13 +174,13 @@ public class TableDeviceLastCache {
lastTime = timeValuePairs[i].getTimestamp();
}
measurement2CachedLastMap.computeIfPresent(
- measurements[i],
- (measurement, tvPair) -> {
+ measurement,
+ (measurementName, tvPair) -> {
if (tvPair.getTimestamp() <=
timeValuePairs[finalI].getTimestamp()) {
diff.addAndGet(
getDiffSize(tvPair, timeValuePairs[finalI])
+ clearKnownNullTimeIfCovered(
- measurement, timeValuePairs[finalI].getTimestamp()));
+ measurementName,
timeValuePairs[finalI].getTimestamp()));
return timeValuePairs[finalI];
}
return tvPair;
@@ -183,6 +196,21 @@ public class TableDeviceLastCache {
return diff.get();
}
+ @Nullable
+ private static String getRawMeasurement(
+ final @Nonnull String[] measurements,
+ final @Nullable IMeasurementSchema[] measurementSchemas,
+ final int index) {
+ if (Objects.isNull(measurements[index])) {
+ return null;
+ }
+ return Objects.nonNull(measurementSchemas)
+ && index < measurementSchemas.length
+ && Objects.nonNull(measurementSchemas[index])
+ ? measurementSchemas[index].getMeasurementName()
+ : measurements[index];
+ }
+
@GuardedBy("DataRegionInsertLock#writeLock")
int invalidate(final String measurement) {
final AtomicInteger diff = new AtomicInteger();
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java
index 8e40298e115..a328ffa221d 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java
@@ -273,11 +273,33 @@ public class TableDeviceSchemaCache {
final String[] measurements,
final TimeValuePair[] timeValuePairs,
boolean invalidateNull) {
+ updateLastCacheIfExists(database, deviceId, measurements, null,
timeValuePairs, invalidateNull);
+ }
+
+ public void updateLastCacheIfExists(
+ final String database,
+ final IDeviceID deviceId,
+ final String[] measurements,
+ final @Nullable IMeasurementSchema[] measurementSchemas,
+ final TimeValuePair[] timeValuePairs) {
+ updateLastCacheIfExists(
+ database, deviceId, measurements, measurementSchemas, timeValuePairs,
false);
+ }
+
+ public void updateLastCacheIfExists(
+ final String database,
+ final IDeviceID deviceId,
+ final String[] measurements,
+ final @Nullable IMeasurementSchema[] measurementSchemas,
+ final TimeValuePair[] timeValuePairs,
+ boolean invalidateNull) {
dualKeyCache.update(
new TableId(database, deviceId.getTableName()),
deviceId,
null,
- entry -> entry.tryUpdateLastCache(measurements, timeValuePairs,
invalidateNull),
+ entry ->
+ entry.tryUpdateLastCache(
+ measurements, measurementSchemas, timeValuePairs,
invalidateNull),
false);
}
@@ -447,7 +469,7 @@ public class TableDeviceSchemaCache {
: entry ->
entry.setMeasurementSchema(
database2Use, isAligned, measurements,
measurementSchemas)
- + entry.tryUpdateLastCache(measurements, timeValuePairs),
+ + entry.tryUpdateLastCache(measurements,
measurementSchemas, timeValuePairs),
Objects.isNull(timeValuePairs));
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TreeDeviceNormalSchema.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TreeDeviceNormalSchema.java
index a030946034a..b9337974a67 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TreeDeviceNormalSchema.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TreeDeviceNormalSchema.java
@@ -66,13 +66,18 @@ public class TreeDeviceNormalSchema implements
IDeviceSchema {
final int length = measurements.length;
for (int i = 0; i < length; ++i) {
+ final String inputMeasurement = measurements[i];
+ if (Objects.isNull(inputMeasurement)) {
+ continue;
+ }
+ final IMeasurementSchema schema = i < schemas.length ? schemas[i] : null;
+ final String measurement =
+ Objects.nonNull(schema) ? schema.getMeasurementName() :
inputMeasurement;
// Skip this to avoid instance creation/gc for writing performance
- if (measurements[i] == null
- || schemas[i] == null
- || measurementMap.containsKey(measurements[i])) {
+ if (schema == null || measurementMap.containsKey(measurement)) {
continue;
}
- diff += putEntry(measurements[i], schemas[i], null);
+ diff += putEntry(measurement, schema, null);
}
return diff;
}
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/cache/TreeDeviceSchemaCacheManagerTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/cache/TreeDeviceSchemaCacheManagerTest.java
index cd5ca74661e..f9188aea9af 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/cache/TreeDeviceSchemaCacheManagerTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/cache/TreeDeviceSchemaCacheManagerTest.java
@@ -22,9 +22,11 @@ package org.apache.iotdb.db.metadata.cache;
import org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.path.MeasurementPath;
import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.queryengine.plan.planner.plan.node.PlanNodeId;
import org.apache.iotdb.commons.schema.template.Template;
import org.apache.iotdb.db.queryengine.common.schematree.ClusterSchemaTree;
import org.apache.iotdb.db.queryengine.common.schematree.ISchemaTree;
+import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowNode;
import
org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.SchemaCacheEntry;
import
org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.TableDeviceSchemaCache;
import
org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.TreeDeviceSchemaCacheManager;
@@ -272,6 +274,43 @@ public class TreeDeviceSchemaCacheManagerTest {
Assert.assertEquals(0,
TableDeviceSchemaCache.getInstance().getMemoryUsage());
}
+ @Test
+ public void testUpdateLastCacheWithAliasDoesNotCopyMeasurements() throws
IllegalPathException {
+ final String database = "root.db";
+ final PartialPath device = new PartialPath("root.db.d_alias");
+ final MeasurementSchema s1 = new MeasurementSchema("s1", TSDataType.INT32);
+ final MeasurementPath s1Path = new
MeasurementPath(device.concatNode("s1"), s1);
+
+ treeDeviceSchemaCacheManager.declareLastCache(database, s1Path);
+
+ final InsertRowNode insertRowNode =
+ new InsertRowNode(
+ new
PlanNodeId("testUpdateLastCacheWithAliasDoesNotCopyMeasurements"),
+ device,
+ false,
+ new String[] {"alias"},
+ new TSDataType[] {TSDataType.INT32},
+ new MeasurementSchema[] {s1},
+ 1L,
+ new Object[] {1},
+ false) {
+ @Override
+ public String[] getRawMeasurements() {
+ throw new AssertionError("Last cache update should not copy raw
measurements");
+ }
+ };
+
+ insertRowNode.updateLastCache(database);
+
+ Assert.assertEquals(
+ new TimeValuePair(1L, new TsPrimitiveType.TsInt(1)),
+ treeDeviceSchemaCacheManager.getLastCache(
+ new MeasurementPath(device.getIDeviceID(), "s1")));
+ Assert.assertNull(
+ treeDeviceSchemaCacheManager.getLastCache(
+ new MeasurementPath(device.getIDeviceID(), "alias")));
+ }
+
@Test
public void testInvalidateLastCacheByWildcardDevicePath() throws
IllegalPathException {
final MeasurementSchema s0 = new MeasurementSchema("s0", TSDataType.INT32);
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertNodeIsMeasurementFailedTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertNodeIsMeasurementFailedTest.java
index 082156e134e..6acc174a2b3 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertNodeIsMeasurementFailedTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertNodeIsMeasurementFailedTest.java
@@ -35,7 +35,9 @@ import java.nio.charset.StandardCharsets;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
/**
@@ -120,6 +122,26 @@ public class InsertNodeIsMeasurementFailedTest {
assertTrue(node.allMeasurementFailed());
}
+ @Test
+ public void testGetRawMeasurementsReusesMeasurementsWhenSchemaNamesMatch()
+ throws IllegalPathException {
+ InsertRowNode node = buildInsertRowNode(new String[] {"s0", "s1"});
+
+ assertSame(node.getMeasurements(), node.getRawMeasurements());
+ }
+
+ @Test
+ public void testGetRawMeasurementsCopiesOnlyWhenSchemaNameDiffers() throws
IllegalPathException {
+ InsertRowNode node = buildInsertRowNode(new String[] {"alias", "s1"});
+ node.getMeasurementSchemas()[0] = new MeasurementSchema("s0",
TSDataType.INT32);
+
+ String[] rawMeasurements = node.getRawMeasurements();
+
+ assertNotSame(node.getMeasurements(), rawMeasurements);
+ assertArrayEquals(new String[] {"s0", "s1"}, rawMeasurements);
+ assertArrayEquals(new String[] {"alias", "s1"}, node.getMeasurements());
+ }
+
@Test
public void
testRelationalInsertRowNode_nonFieldColumnsDoNotComposeLastCacheValue()
throws IllegalPathException {