fix: tags with commas by karel-rehor · Pull Request #862 · influxdata/influxdb-client-java
Parser is safe and robust. GTG with CHANGELOG entry and if checks pass.
I tried edge cases tests (see bellow, for your consideration whether to add or not), they pass OK.
diff --git a/client/src/test/java/com/influxdb/client/internal/InfluxQLQueryApiImplTest.java b/client/src/test/java/com/influxdb/client/internal/InfluxQLQueryApiImplTest.java
index ca587ab7c0..9cc8fbe05a 100644
--- a/client/src/test/java/com/influxdb/client/internal/InfluxQLQueryApiImplTest.java
+++ b/client/src/test/java/com/influxdb/client/internal/InfluxQLQueryApiImplTest.java
@@ -63,6 +63,38 @@ class InfluxQLQueryApiImplTest {
return map;
}
+ private static void assertParsedTags(
+ @Nonnull final String rawTags,
+ @Nonnull final Map<String, String> expectedTags
+ ) throws IOException {
+
+ StringReader reader = new StringReader(
+ "name,tags,time,value\n" +
+ "m,\"" + rawTags + "\",1,1\n"
+ );
+ InfluxQLQueryResult result = InfluxQLQueryApiImpl.readInfluxQLResult(reader, NO_CANCELLING, null);
+
+ Assertions.assertThat(result.getResults()).hasSize(1);
+ Assertions.assertThat(result.getResults().get(0).getSeries()).hasSize(1);
+ Assertions.assertThat(result.getResults().get(0).getSeries().get(0).getTags()).isEqualTo(expectedTags);
+ }
+
+ @Test
+ void readInfluxQLResultWithMalformedAndBoundaryTagCases() throws IOException {
+ assertParsedTags("", mapOf());
+ assertParsedTags("host=", mapOf("host", ""));
+ assertParsedTags("host=a,host=b", mapOf("host", "b"));
+ assertParsedTags("host=a,broken", mapOf("host", "a"));
+ assertParsedTags("=a,host=b", mapOf("host", "b"));
+ assertParsedTags("host=a,", mapOf("host", "a"));
+ assertParsedTags(",host=a", mapOf(",host", "a"));
+ assertParsedTags("a=1,,b=2", mapOf("a", "1", ",b", "2"));
+ assertParsedTags("a=foo\\", mapOf("a", "foo\\"));
+ assertParsedTags("k\\==v\\=1", mapOf("k\\=", "v\\=1"));
+ assertParsedTags("k\\,x=v\\,y,b=2", mapOf("k\\,x", "v\\,y", "b", "2"));
+ assertParsedTags("k\\=x", mapOf());
+ }
+
@Test
void readInfluxQLResultWithTagCommas() throws IOException {
InfluxQLQueryResult.Series.ValueExtractor extractValue = (columnName, rawValue, resultIndex, seriesName) -> {