This is an automated email from the ASF dual-hosted git repository.

HTHou 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 dfbe8db321d Fix MQTT measurement validation (#18215)
dfbe8db321d is described below

commit dfbe8db321d52ebe7409ecd88b94633d0c75ca22
Author: Jiang Tian <[email protected]>
AuthorDate: Wed Jul 15 19:00:58 2026 +0800

    Fix MQTT measurement validation (#18215)
---
 .../org/apache/iotdb/mqtt/MPPPublishHandler.java   |  5 ++-
 .../iotdb/db/it/mqtt/IoTDBMQTTServiceJsonIT.java   | 41 ++++++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)

diff --git 
a/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/MPPPublishHandler.java
 
b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/MPPPublishHandler.java
index 72bf4c12600..a99c875fa23 100644
--- 
a/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/MPPPublishHandler.java
+++ 
b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/MPPPublishHandler.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.queryengine.common.SqlDialect;
 import org.apache.iotdb.commons.queryengine.utils.TimestampPrecisionUtils;
 import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
+import org.apache.iotdb.commons.utils.PathUtils;
 import org.apache.iotdb.db.auth.AuthorityChecker;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
@@ -274,7 +275,9 @@ public class MPPPublishHandler extends 
AbstractInterceptHandler {
           
DataNodeDevicePathCache.getInstance().getPartialPath(message.getDevice()));
       TimestampPrecisionUtils.checkTimestampPrecision(message.getTimestamp());
       statement.setTime(message.getTimestamp());
-      statement.setMeasurements(message.getMeasurements().toArray(new 
String[0]));
+      statement.setMeasurements(
+          
PathUtils.checkIsLegalSingleMeasurementsAndUpdate(message.getMeasurements())
+              .toArray(new String[0]));
       if (message.getDataTypes() == null) {
         statement.setDataTypes(new 
TSDataType[message.getMeasurements().size()]);
         statement.setValues(message.getValues().toArray(new Object[0]));
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/mqtt/IoTDBMQTTServiceJsonIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/mqtt/IoTDBMQTTServiceJsonIT.java
index 0b52759ad27..8d372c1d810 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/mqtt/IoTDBMQTTServiceJsonIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/mqtt/IoTDBMQTTServiceJsonIT.java
@@ -51,6 +51,7 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -481,4 +482,44 @@ public class IoTDBMQTTServiceJsonIT {
       }
     }
   }
+
+  @Test
+  public void testIllegalMeasurementIsRejected() throws Exception {
+    try (final ISession session = EnvFactory.getEnv().getSessionConnection()) {
+      String payload =
+          "["
+              + 
"{\"device\":\"root.sg.invalid\",\"timestamp\":1,\"measurements\":[\"a.b\"],\"values\":[1]},"
+              + 
"{\"device\":\"root.sg.invalid\",\"timestamp\":2,\"measurements\":[\"valid\"],\"values\":[2]}"
+              + "]";
+
+      Awaitility.await()
+          .atMost(3, TimeUnit.MINUTES)
+          .pollInterval(1, TimeUnit.SECONDS)
+          .until(
+              () -> {
+                connection.publish("root.sg.invalid", payload.getBytes(), 
QoS.AT_LEAST_ONCE, false);
+                try (final SessionDataSet dataSet =
+                    session.executeQueryStatement(
+                        "select valid from root.sg.invalid where time = 2")) {
+                  return dataSet.hasNext();
+                } catch (StatementExecutionException e) {
+                  if (e.getMessage() != null && e.getMessage().contains("does 
not exist")) {
+                    return false;
+                  }
+                  throw e;
+                }
+              });
+
+      int timeseriesCount = 0;
+      try (final SessionDataSet dataSet =
+          session.executeQueryStatement("show timeseries root.sg.invalid.**")) 
{
+        while (dataSet.hasNext()) {
+          dataSet.next();
+          timeseriesCount++;
+        }
+      }
+      assertEquals(1, timeseriesCount);
+      assertFalse(session.checkTimeseriesExists("root.sg.invalid.a.b"));
+    }
+  }
 }

Reply via email to