diff --git a/.mvn/modernizer/violations.xml b/.mvn/modernizer/violations.xml index 060379962a39..f9f25afda8de 100644 --- a/.mvn/modernizer/violations.xml +++ b/.mvn/modernizer/violations.xml @@ -313,4 +313,16 @@ 1.8 Prefer org.testng.annotations.AfterClass + + + com/fasterxml/jackson/core/JsonFactory."<init>":()V + 1.8 + Use io.trino.plugin.base.util.JsonUtils.jsonFactory() + + + + com/fasterxml/jackson/core/JsonFactoryBuilder."<init>":()V + 1.8 + Use io.trino.plugin.base.util.JsonUtils.jsonFactoryBuilder() instead + diff --git a/client/trino-cli/src/main/java/io/trino/cli/JsonPrinter.java b/client/trino-cli/src/main/java/io/trino/cli/JsonPrinter.java index 6b6e69a4614c..ff7e4aba0eda 100644 --- a/client/trino-cli/src/main/java/io/trino/cli/JsonPrinter.java +++ b/client/trino-cli/src/main/java/io/trino/cli/JsonPrinter.java @@ -14,8 +14,11 @@ package io.trino.cli; import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonFactoryBuilder; import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.StreamReadConstraints; import com.google.common.collect.ImmutableList; +import org.gaul.modernizer_maven_annotations.SuppressModernizer; import java.io.IOException; import java.io.Writer; @@ -40,7 +43,7 @@ public JsonPrinter(List fieldNames, Writer writer) public void printRows(List> rows, boolean complete) throws IOException { - JsonFactory jsonFactory = new JsonFactory().configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false); + JsonFactory jsonFactory = jsonFactory(); try (JsonGenerator jsonGenerator = jsonFactory.createGenerator(writer)) { jsonGenerator.setRootValueSeparator(null); for (List row : rows) { @@ -70,4 +73,18 @@ private static Object formatValue(Object o) } return o; } + + @SuppressModernizer + // JsonFactoryBuilder usage is intentional as we don't want to bring additional dependency on plugin-toolkit module + private static JsonFactory jsonFactory() + { + return new JsonFactoryBuilder() + .streamReadConstraints(StreamReadConstraints.builder() + .maxNumberLength(Integer.MAX_VALUE) + .maxNestingDepth(Integer.MAX_VALUE) + .maxStringLength(Integer.MAX_VALUE) + .build()) + .build() + .configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false); + } } diff --git a/core/trino-main/src/main/java/io/trino/operator/scalar/JsonExtract.java b/core/trino-main/src/main/java/io/trino/operator/scalar/JsonExtract.java index b65e12129007..7aa3d1885f30 100644 --- a/core/trino-main/src/main/java/io/trino/operator/scalar/JsonExtract.java +++ b/core/trino-main/src/main/java/io/trino/operator/scalar/JsonExtract.java @@ -14,7 +14,6 @@ package io.trino.operator.scalar; import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonFactoryBuilder; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; @@ -36,6 +35,7 @@ import static com.fasterxml.jackson.core.JsonToken.START_OBJECT; import static com.fasterxml.jackson.core.JsonToken.VALUE_NULL; import static io.airlift.slice.Slices.utf8Slice; +import static io.trino.plugin.base.util.JsonUtils.jsonFactoryBuilder; import static io.trino.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static io.trino.util.JsonUtil.createJsonGenerator; import static io.trino.util.JsonUtil.createJsonParser; @@ -118,7 +118,7 @@ public final class JsonExtract { private static final int ESTIMATED_JSON_OUTPUT_SIZE = 512; - private static final JsonFactory JSON_FACTORY = new JsonFactoryBuilder() + private static final JsonFactory JSON_FACTORY = jsonFactoryBuilder() .disable(CANONICALIZE_FIELD_NAMES) .build(); diff --git a/core/trino-main/src/main/java/io/trino/operator/scalar/JsonFunctions.java b/core/trino-main/src/main/java/io/trino/operator/scalar/JsonFunctions.java index 0e33c6b9e205..0bcda5aa9254 100644 --- a/core/trino-main/src/main/java/io/trino/operator/scalar/JsonFunctions.java +++ b/core/trino-main/src/main/java/io/trino/operator/scalar/JsonFunctions.java @@ -14,7 +14,6 @@ package io.trino.operator.scalar; import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonFactoryBuilder; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.MappingJsonFactory; @@ -47,6 +46,7 @@ import static com.fasterxml.jackson.core.JsonToken.VALUE_STRING; import static com.fasterxml.jackson.core.JsonToken.VALUE_TRUE; import static io.airlift.slice.Slices.utf8Slice; +import static io.trino.plugin.base.util.JsonUtils.jsonFactoryBuilder; import static io.trino.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static io.trino.spi.type.Chars.padSpaces; import static io.trino.util.JsonUtil.createJsonParser; @@ -54,7 +54,7 @@ public final class JsonFunctions { - private static final JsonFactory JSON_FACTORY = new JsonFactoryBuilder() + private static final JsonFactory JSON_FACTORY = jsonFactoryBuilder() .disable(CANONICALIZE_FIELD_NAMES) .build(); diff --git a/core/trino-main/src/main/java/io/trino/util/JsonUtil.java b/core/trino-main/src/main/java/io/trino/util/JsonUtil.java index b8b4156a653e..2449665235cb 100644 --- a/core/trino-main/src/main/java/io/trino/util/JsonUtil.java +++ b/core/trino-main/src/main/java/io/trino/util/JsonUtil.java @@ -14,7 +14,6 @@ package io.trino.util; import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonFactoryBuilder; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; @@ -77,6 +76,7 @@ import static com.fasterxml.jackson.core.JsonToken.START_ARRAY; import static com.fasterxml.jackson.core.JsonToken.START_OBJECT; import static com.google.common.base.Verify.verify; +import static io.trino.plugin.base.util.JsonUtils.jsonFactoryBuilder; import static io.trino.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; import static io.trino.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static io.trino.spi.type.BigintType.BIGINT; @@ -114,7 +114,7 @@ private JsonUtil() {} // Note: JsonFactory is mutable, instances cannot be shared openly. public static JsonFactory createJsonFactory() { - return new JsonFactoryBuilder().disable(CANONICALIZE_FIELD_NAMES).build(); + return jsonFactoryBuilder().disable(CANONICALIZE_FIELD_NAMES).build(); } public static JsonParser createJsonParser(JsonFactory factory, Slice json) diff --git a/core/trino-main/src/test/java/io/trino/operator/scalar/TestJsonExtract.java b/core/trino-main/src/test/java/io/trino/operator/scalar/TestJsonExtract.java index e6c261d3f6d3..6a96d0ed1dab 100644 --- a/core/trino-main/src/test/java/io/trino/operator/scalar/TestJsonExtract.java +++ b/core/trino-main/src/test/java/io/trino/operator/scalar/TestJsonExtract.java @@ -30,6 +30,7 @@ import static io.trino.operator.scalar.JsonExtract.ObjectFieldJsonExtractor; import static io.trino.operator.scalar.JsonExtract.ScalarValueJsonExtractor; import static io.trino.operator.scalar.JsonExtract.generateExtractor; +import static io.trino.plugin.base.util.JsonUtils.jsonFactory; import static io.trino.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.testing.assertions.TrinoExceptionAssert.assertTrinoExceptionThrownBy; @@ -341,7 +342,7 @@ public void testNoAutomaticEncodingDetection() private static String doExtract(JsonExtractor jsonExtractor, String json) throws IOException { - JsonFactory jsonFactory = new JsonFactory(); + JsonFactory jsonFactory = jsonFactory(); JsonParser jsonParser = jsonFactory.createParser(json); jsonParser.nextToken(); // Advance to the first token Slice extract = jsonExtractor.extract(jsonParser); diff --git a/lib/trino-hive-formats/src/main/java/io/trino/hive/formats/line/json/JsonDeserializer.java b/lib/trino-hive-formats/src/main/java/io/trino/hive/formats/line/json/JsonDeserializer.java index 17f4f21a2ea1..e408082b4edc 100644 --- a/lib/trino-hive-formats/src/main/java/io/trino/hive/formats/line/json/JsonDeserializer.java +++ b/lib/trino-hive-formats/src/main/java/io/trino/hive/formats/line/json/JsonDeserializer.java @@ -14,7 +14,6 @@ package io.trino.hive.formats.line.json; import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonFactoryBuilder; import com.fasterxml.jackson.core.JsonLocation; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; @@ -68,6 +67,7 @@ import static io.trino.hive.formats.HiveFormatUtils.parseHiveDate; import static io.trino.hive.formats.HiveFormatUtils.writeDecimal; import static io.trino.plugin.base.type.TrinoTimestampEncoderFactory.createTimestampEncoder; +import static io.trino.plugin.base.util.JsonUtils.jsonFactoryBuilder; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.BooleanType.BOOLEAN; import static io.trino.spi.type.Chars.truncateToLengthAndTrimSpaces; @@ -107,7 +107,7 @@ public class JsonDeserializer implements LineDeserializer { - private static final JsonFactory JSON_FACTORY = new JsonFactoryBuilder() + private static final JsonFactory JSON_FACTORY = jsonFactoryBuilder() .disable(INTERN_FIELD_NAMES) .build(); diff --git a/lib/trino-hive-formats/src/main/java/io/trino/hive/formats/line/json/JsonSerializer.java b/lib/trino-hive-formats/src/main/java/io/trino/hive/formats/line/json/JsonSerializer.java index f6994e1d67a2..803e60560d0e 100644 --- a/lib/trino-hive-formats/src/main/java/io/trino/hive/formats/line/json/JsonSerializer.java +++ b/lib/trino-hive-formats/src/main/java/io/trino/hive/formats/line/json/JsonSerializer.java @@ -41,6 +41,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.ImmutableList.toImmutableList; +import static io.trino.plugin.base.util.JsonUtils.jsonFactory; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.BooleanType.BOOLEAN; import static io.trino.spi.type.DateType.DATE; @@ -67,7 +68,7 @@ public JsonSerializer(List columns) .map(column -> field(column.name().toLowerCase(Locale.ROOT), column.type())) .collect(toImmutableList())); - jsonFactory = new JsonFactory(); + jsonFactory = jsonFactory(); } @Override diff --git a/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/util/JsonTypeUtil.java b/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/util/JsonTypeUtil.java index 92286a81b098..46150e5975df 100644 --- a/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/util/JsonTypeUtil.java +++ b/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/util/JsonTypeUtil.java @@ -14,7 +14,6 @@ package io.trino.plugin.base.util; import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonFactoryBuilder; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.ObjectMapper; import io.airlift.json.ObjectMapperProvider; @@ -31,13 +30,14 @@ import static com.fasterxml.jackson.core.JsonFactory.Feature.CANONICALIZE_FIELD_NAMES; import static com.fasterxml.jackson.databind.SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS; import static com.google.common.base.Preconditions.checkState; +import static io.trino.plugin.base.util.JsonUtils.jsonFactoryBuilder; import static io.trino.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static java.lang.String.format; import static java.nio.charset.StandardCharsets.UTF_8; public final class JsonTypeUtil { - private static final JsonFactory JSON_FACTORY = new JsonFactoryBuilder().disable(CANONICALIZE_FIELD_NAMES).build(); + private static final JsonFactory JSON_FACTORY = jsonFactoryBuilder().disable(CANONICALIZE_FIELD_NAMES).build(); private static final ObjectMapper SORTED_MAPPER = new ObjectMapperProvider().get().configure(ORDER_MAP_ENTRIES_BY_KEYS, true); private JsonTypeUtil() {} diff --git a/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/util/JsonUtils.java b/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/util/JsonUtils.java index 41696f5f6b83..e5e2fb40a36d 100644 --- a/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/util/JsonUtils.java +++ b/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/util/JsonUtils.java @@ -13,13 +13,17 @@ */ package io.trino.plugin.base.util; +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonFactoryBuilder; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.StreamReadConstraints; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; import io.airlift.json.ObjectMapperProvider; +import org.gaul.modernizer_maven_annotations.SuppressModernizer; import java.io.IOException; import java.io.InputStream; @@ -144,6 +148,24 @@ private static T parseJson(JsonNode node, String jsonPointer, Class javaT return jsonTreeToValue(mappingsNode, javaType); } + public static JsonFactory jsonFactory() + { + return jsonFactoryBuilder().build(); + } + + @SuppressModernizer + // JsonFactoryBuilder usage is intentional as we need to disable read constraints + // due to the limits introduced by Jackson 2.15 + public static JsonFactoryBuilder jsonFactoryBuilder() + { + return new JsonFactoryBuilder() + .streamReadConstraints(StreamReadConstraints.builder() + .maxStringLength(Integer.MAX_VALUE) + .maxNestingDepth(Integer.MAX_VALUE) + .maxNumberLength(Integer.MAX_VALUE) + .build()); + } + private interface ParserConstructor { JsonParser createParser(ObjectMapper mapper, I input) diff --git a/lib/trino-plugin-toolkit/src/test/java/io/trino/plugin/base/util/TestJsonUtils.java b/lib/trino-plugin-toolkit/src/test/java/io/trino/plugin/base/util/TestJsonUtils.java index 47e32eed38bc..8aded8864c92 100644 --- a/lib/trino-plugin-toolkit/src/test/java/io/trino/plugin/base/util/TestJsonUtils.java +++ b/lib/trino-plugin-toolkit/src/test/java/io/trino/plugin/base/util/TestJsonUtils.java @@ -14,12 +14,15 @@ package io.trino.plugin.base.util; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.StreamReadConstraints; import com.fasterxml.jackson.databind.JsonNode; import org.testng.annotations.Test; import java.io.IOException; import java.io.UncheckedIOException; +import static io.trino.plugin.base.util.JsonUtils.jsonFactory; +import static io.trino.plugin.base.util.JsonUtils.jsonFactoryBuilder; import static io.trino.plugin.base.util.JsonUtils.parseJson; import static io.trino.plugin.base.util.TestJsonUtils.TestEnum.OPTION_A; import static java.nio.charset.StandardCharsets.US_ASCII; @@ -70,4 +73,28 @@ public void testTrailingContent() .hasMessage("Could not parse JSON") .hasStackTraceContaining("Unrecognized token 'not': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')"); } + + @Test + public void testFactoryHasNoReadContraints() + { + assertReadConstraints(jsonFactory().streamReadConstraints()); + assertReadConstraints(jsonFactoryBuilder().build().streamReadConstraints()); + } + + @Test + public void testBuilderHasNoReadConstraints() + { + assertReadConstraints(jsonFactoryBuilder().build().streamReadConstraints()); + } + + private static void assertReadConstraints(StreamReadConstraints constraints) + { + // Jackson 2.15 introduced read constraints limit that are too strict for + // Trino use-cases. Ensure that those limits are no longer present for JsonFactories. + // + // https://github.com/trinodb/trino/issues/17843 + assertThat(constraints.getMaxStringLength()).isEqualTo(Integer.MAX_VALUE); + assertThat(constraints.getMaxNestingDepth()).isEqualTo(Integer.MAX_VALUE); + assertThat(constraints.getMaxNumberLength()).isEqualTo(Integer.MAX_VALUE); + } } diff --git a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/PartitionData.java b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/PartitionData.java index b4e3b315ed84..b1e1fbbb818f 100644 --- a/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/PartitionData.java +++ b/plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/PartitionData.java @@ -28,6 +28,7 @@ import java.nio.ByteBuffer; import java.util.UUID; +import static io.trino.plugin.base.util.JsonUtils.jsonFactory; import static io.trino.spi.type.DecimalType.createDecimalType; import static io.trino.spi.type.Decimals.rescale; import static java.lang.String.format; @@ -37,7 +38,7 @@ public class PartitionData implements StructLike { private static final String PARTITION_VALUES_FIELD = "partitionValues"; - private static final JsonFactory FACTORY = new JsonFactory(); + private static final JsonFactory FACTORY = jsonFactory(); private static final ObjectMapper MAPPER = new ObjectMapper(FACTORY) .configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true); diff --git a/plugin/trino-prometheus/src/main/java/io/trino/plugin/prometheus/PrometheusQueryResponseParse.java b/plugin/trino-prometheus/src/main/java/io/trino/plugin/prometheus/PrometheusQueryResponseParse.java index 86ab33b9c630..a6a785ddd6d7 100644 --- a/plugin/trino-prometheus/src/main/java/io/trino/plugin/prometheus/PrometheusQueryResponseParse.java +++ b/plugin/trino-prometheus/src/main/java/io/trino/plugin/prometheus/PrometheusQueryResponseParse.java @@ -13,7 +13,6 @@ */ package io.trino.plugin.prometheus; -import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.core.type.TypeReference; @@ -28,6 +27,7 @@ import java.util.List; import java.util.Map; +import static io.trino.plugin.base.util.JsonUtils.jsonFactory; import static io.trino.plugin.prometheus.PrometheusErrorCode.PROMETHEUS_PARSE_ERROR; import static java.util.Collections.singletonList; @@ -46,7 +46,7 @@ public PrometheusQueryResponseParse(InputStream response) { ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JavaTimeModule()); - JsonParser parser = new JsonFactory().createParser(response); + JsonParser parser = jsonFactory().createParser(response); while (!parser.isClosed()) { JsonToken jsonToken = parser.nextToken(); if (JsonToken.FIELD_NAME.equals(jsonToken)) { diff --git a/service/trino-proxy/pom.xml b/service/trino-proxy/pom.xml index 53853be2d662..2f5a332a9935 100644 --- a/service/trino-proxy/pom.xml +++ b/service/trino-proxy/pom.xml @@ -18,6 +18,11 @@ + + io.trino + trino-plugin-toolkit + + io.airlift bootstrap diff --git a/service/trino-proxy/src/main/java/io/trino/proxy/ProxyResource.java b/service/trino-proxy/src/main/java/io/trino/proxy/ProxyResource.java index d065c5394c41..0c6708676fc4 100644 --- a/service/trino-proxy/src/main/java/io/trino/proxy/ProxyResource.java +++ b/service/trino-proxy/src/main/java/io/trino/proxy/ProxyResource.java @@ -14,7 +14,6 @@ package io.trino.proxy; import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonFactoryBuilder; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; @@ -72,6 +71,7 @@ import static io.airlift.http.client.Request.Builder.preparePost; import static io.airlift.http.client.StaticBodyGenerator.createStaticBodyGenerator; import static io.airlift.jaxrs.AsyncResponseHandler.bindAsyncResponse; +import static io.trino.plugin.base.util.JsonUtils.jsonFactoryBuilder; import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; import static jakarta.ws.rs.core.MediaType.TEXT_PLAIN_TYPE; import static jakarta.ws.rs.core.Response.Status.BAD_GATEWAY; @@ -93,7 +93,7 @@ public class ProxyResource private static final String X509_ATTRIBUTE = "jakarta.servlet.request.X509Certificate"; private static final Duration ASYNC_TIMEOUT = new Duration(2, MINUTES); - private static final JsonFactory JSON_FACTORY = new JsonFactoryBuilder().disable(CANONICALIZE_FIELD_NAMES).build(); + private static final JsonFactory JSON_FACTORY = jsonFactoryBuilder().disable(CANONICALIZE_FIELD_NAMES).build(); private final ExecutorService executor = newCachedThreadPool(daemonThreadsNamed("proxy-%s")); private final HttpClient httpClient; diff --git a/service/trino-verifier/pom.xml b/service/trino-verifier/pom.xml index c91462f926d6..77a3d4222910 100644 --- a/service/trino-verifier/pom.xml +++ b/service/trino-verifier/pom.xml @@ -28,6 +28,11 @@ trino-parser + + io.trino + trino-plugin-toolkit + + io.trino trino-spi diff --git a/service/trino-verifier/src/main/java/io/trino/verifier/JsonEventClient.java b/service/trino-verifier/src/main/java/io/trino/verifier/JsonEventClient.java index 121c570da325..243c9451e7d4 100644 --- a/service/trino-verifier/src/main/java/io/trino/verifier/JsonEventClient.java +++ b/service/trino-verifier/src/main/java/io/trino/verifier/JsonEventClient.java @@ -26,6 +26,7 @@ import java.io.PrintStream; import java.io.UncheckedIOException; +import static io.trino.plugin.base.util.JsonUtils.jsonFactory; import static java.nio.charset.Charset.defaultCharset; import static java.util.Objects.requireNonNull; @@ -34,7 +35,7 @@ public class JsonEventClient { // TODO we should use JsonEventWriter instead private final JsonEventSerializer serializer = new JsonEventSerializer(VerifierQueryEvent.class); - private final JsonFactory factory = new JsonFactory(); + private final JsonFactory factory = jsonFactory(); private final PrintStream out; @Inject diff --git a/testing/trino-benchmark/pom.xml b/testing/trino-benchmark/pom.xml index 945813234f0f..dbb71318e75a 100644 --- a/testing/trino-benchmark/pom.xml +++ b/testing/trino-benchmark/pom.xml @@ -27,6 +27,11 @@ trino-parser + + io.trino + trino-plugin-toolkit + + io.trino trino-spi diff --git a/testing/trino-benchmark/src/main/java/io/trino/benchmark/JsonBenchmarkResultWriter.java b/testing/trino-benchmark/src/main/java/io/trino/benchmark/JsonBenchmarkResultWriter.java index 0b9fca6034a8..c54cc896b112 100644 --- a/testing/trino-benchmark/src/main/java/io/trino/benchmark/JsonBenchmarkResultWriter.java +++ b/testing/trino-benchmark/src/main/java/io/trino/benchmark/JsonBenchmarkResultWriter.java @@ -14,7 +14,6 @@ package io.trino.benchmark; import com.fasterxml.jackson.core.JsonEncoding; -import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; import java.io.IOException; @@ -22,6 +21,7 @@ import java.io.UncheckedIOException; import java.util.Map; +import static io.trino.plugin.base.util.JsonUtils.jsonFactory; import static java.util.Objects.requireNonNull; public class JsonBenchmarkResultWriter @@ -33,7 +33,7 @@ public JsonBenchmarkResultWriter(OutputStream outputStream) { requireNonNull(outputStream, "outputStream is null"); try { - jsonGenerator = new JsonFactory().createGenerator(outputStream, JsonEncoding.UTF8); + jsonGenerator = jsonFactory().createGenerator(outputStream, JsonEncoding.UTF8); jsonGenerator.writeStartObject(); jsonGenerator.writeArrayFieldStart("samples"); } diff --git a/testing/trino-benchmark/src/main/java/io/trino/benchmark/OdsBenchmarkResultWriter.java b/testing/trino-benchmark/src/main/java/io/trino/benchmark/OdsBenchmarkResultWriter.java index 949aea6ec9c3..6730e02bd8ea 100644 --- a/testing/trino-benchmark/src/main/java/io/trino/benchmark/OdsBenchmarkResultWriter.java +++ b/testing/trino-benchmark/src/main/java/io/trino/benchmark/OdsBenchmarkResultWriter.java @@ -14,7 +14,6 @@ package io.trino.benchmark; import com.fasterxml.jackson.core.JsonEncoding; -import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; import java.io.IOException; @@ -22,6 +21,7 @@ import java.io.UncheckedIOException; import java.util.Map; +import static io.trino.plugin.base.util.JsonUtils.jsonFactory; import static java.util.Objects.requireNonNull; public class OdsBenchmarkResultWriter @@ -36,7 +36,7 @@ public OdsBenchmarkResultWriter(String entity, OutputStream outputStream) requireNonNull(outputStream, "outputStream is null"); this.entity = entity; try { - jsonGenerator = new JsonFactory().createGenerator(outputStream, JsonEncoding.UTF8); + jsonGenerator = jsonFactory().createGenerator(outputStream, JsonEncoding.UTF8); jsonGenerator.writeStartArray(); } catch (IOException e) {